Responsabili: Carmen Popa Valentin Ioniță
Termen de predare: 05.11.2018, ora 23:55
19.10.2018 - Corectare checker (again)
25.10.2018 - Updatare checker de coding style; informatii despre checker
26.10.2018 - Updatare checker
30.10.2018 - Modificare checker + adăugare pe vmchecker
O histogramă (bar graph) este un grafic care reprezintă datele sub forma de bare verticale/orizontale (dreptunghiuri). Într-o histogramă, pe una dintre axe sunt reprezentate denumirile datelor (de exemplu, Ianuarie, Februarie etc.), iar pe cealaltă axa sunt reprezentate valorile frecvențelor corespunzătoare datelor (numărul de intrări care corespund lunii Ianuarie, lunii Februarie etc.).
Un student vrea să țină evidența serialelor la care s-a uitat în sesiune și dorește să facă un program care să îi afișeze o histogramă cu numărul de episoade pentru fiecare serial. Acesta ia în calcul maxim 10 seriale, codificate astfel:
Black Mirror - 0 Doctor Who - 1 Doctor House - 2 Rick & Morty - 3 Breaking Bad - 4 Mr. Robot - 5 Game of Thrones - 6 Grey’s Anatomy - 7 Fullmetal Alchemist: Brotherhood - 8 Vikings - 9
Datele de intrare se citesc de la stdin. Mai întai va fi citit un numar natural n care arată numărul de seriale ce vor fi luate în calcul pentru fiecare test în parte. Apoi urmează n intrări de forma [codificare serial] [număr episoade văzute] [număr total de episoade], care corespund serialelor menționate mai sus. Histograma va conține 2 caractere:
'*' pentru a marca umplerea unui nivel '.' pentru fundal
Fiecare rând al histogramei conține 10 niveluri, ceea ce înseamna că datele vor fi scalate și apoi rotunjite: dacă un serial are 30 de episoade, din care au fost văzute 10, se face regula de trei simplă pentru a scala la 10 și astfel se obține (10 / 30) * 10 = 3.33 care e rotunjit la 3 (adică histograma va conține 3 steluțe și restul de 7 puncte). Similar, valorile 3.70 sau 3.50, de exemplu, se vor rotunji la 4. În cadrul datelor de intrare, codificările pot apărea în orice ordine, dar histograma finală va conține serialele în ordine crescătoare după codificarea acestora.
Exemplu:
Studentul a numărat că a văzut 22/55 episoade din Doctor Who, 40/50 din Game of Thrones, 16/19 Breaking Bad și 10/32 din Doctor House. Un exemplu de date de intrare ar arăta astfel:
4 1 22 55 6 40 50 4 16 19 2 10 32
Histograma realizată de programul scris de student arată astfel (numerele reprezintă codificările serialelor):
1 * * * * . . . . . . 2 * * * . . . . . . . 4 * * * * * * * * . . 6 * * * * * * * * . .
Dar realizarea histogramei pe orizontală a fost prea simpla. Acum, studentul este în căutarea unei noi provocări până apare următorul sezon, asa că decide să afișeze histograma vertical. Aceasta va avea 11 rânduri (10 pentru nivelul episoadelor și ultimul, cel de jos, pentru codificarea serialului). Caracterele de pe un rând sunt separate printr-un singur spațiu. Histograma va fi afișată pe ecran (stdout) și ar arata astfel:
. . . . . . . . . . * * . . * * . . * * . . * * * . * * * * * * * * * * * * * * 1 2 4 6
Un fotorezistor este o componentă electronică care iși modifică valoarea în funcție de cantitatea de lumină primită. Acesta are rezistentă mare la întuneric și mai scăzută la lumină. Cu cât valoarea este mai mică, cu atât este mai întunecată camera.
Odată mutat la cămin, studentul observă ca noaptea îi dispare mâncarea din frigider. Acesta cumpără o plăcuță Arduino, niște fotorezistențe și cabluri și scrie un progrămel care să măsoare cantitatea de lumină primita de fotorezistențe în timpul nopții. Astfel, își va putea da seama dacă cineva îi fură mâncarea cu adevărat.
Plăcuța Arduino pe care a cumpărat-o nu are suficientă memorie încât să rețină toate valorile citite de fotorezistențe, asa ca programul efectuează calculele pe măsură ce primește valorile. Pe baza inputului dat, voi calculați media aritmetică, geometrică, armonică și media pătratică, dar și abaterea standard a datelor, având în vedere formulele: \begin{eqnarray*} & & m_{aritmetica} = \frac{p_1 + p_2 + ... + p_n}{n} \end{eqnarray*}
\begin{eqnarray*} & & m_{geometrica} = \sqrt[n]{p_1 \cdot p_2 \cdot p_3 \cdot ... \cdot p_n} \end{eqnarray*}
\begin{eqnarray*} & & m_{armonica} = \frac{n}{\frac{1}{p_1} + \frac{1}{p_2} + ... + \frac{1}{p_n}} \end{eqnarray*}
\begin{eqnarray*} & & m_{patratica} = \sqrt{\frac{p_1^2 + p_2^2 + ... + p_n^2}{n}} \end{eqnarray*}
\begin{eqnarray*} & & stdev = \sqrt{\frac{1}{n}\sum_{k=1}^n (p_k - m_{aritmetica})^2} \end{eqnarray*}
Aceste 5 valori se vor afișa pe ecran cu exact 4 zecimale, fiecare pe câte un rând separat. Se consideră că valorile citite nu vor fi niciodată fix 0, deci nu vă faceți griji de împărțirea la 0. Mai mult, media geometrică nu se poate calcula dacă un termen al seriei este negativ, caz în care la ieșire se va afișa caracterul '-'.
De asemenea, studentul dorește să știe acuratețea cu care fotorezistențele citesc datele. Astfel, se va afla minimul și maximul din valorile citite și de câte ori apare fiecare, dar și cea mai lungă secvență crescătoare (nu neapărat strict crescătoare), pentru a vedea dacă lumina a fost cu adevărat aprinsă pentru câteva secunde, sau dacă a fost doar o eroare de citire.
Aceste rezultate se vor afișa pe ecran, pe trei rânduri diferite, separate printr-un spațiu, ca în exemplul de mai jos. De remarcat faptul că și minim si maxim sunt numerele reale, deci se vor afișa cu exact 4 zecimale:
minim nr_minim maxim nr_maxim lungime
Exemplu:
Date de intrare:
8 -15.2 27.5 -121.2 112.3 -121.2 1000 1000 82.13
Date de ieșire:
245.5412 - -350.1560 506.1772 442.6340 -121.2000 2 1000.0000 2 3
Explicatie:
Pentru datele de intrare, prima valoare reprezintă N, adică numărul de valori înregistrate de fotorezistență, iar următoarele N numere reprezintă valorile efective înregistrate. Pentru datele de ieșire, primele 5 rânduri sunt pentru: media aritmetică, media geometrică, media armonică, media pătratică și abaterea standard. Următoarele două rânduri sunt pentru minim și maxim și numărul de apariții, iar ultimul rând arată lungimea celei mai lungi secvențe crescătoare.
Ajutați studentul să scrie acest program pentru a vedea dacă cineva deschide frigiderul său în timpul nopții. În viitor, va adăuga și un buzzer care sa facă zgomot atunci când frigiderul e deschis și o cameră de filmat pentru a îl prinde pe hoț.
./tema1 < in1 > out1
Makefile
care să conţină regulile build
şi clean
. Regula build
va compila programele în două executabile cu numele hist
și stats
. Regula clean
va şterge executabilele şi eventual toate binarele intermediare (fişiere obiect) generate de voi.README
care să conţină explicații privitoare la modul de rezolvare.Checkerul poate fi descărcat de aici: tema01_ca2018_checker-v7.zip
chmod u+x cs.py
în folderul cu fișierul cs.py.
cat -e nume_fișier
afișează conținutul fișierului și caracterele albe (spațiu, new line, tab etc). Este util pentru a vedea de ce nu trec anumite teste.
build: gcc -std==c99 -Wall -Wextra nume_sursa_1 -o nume_executabil_1 -lm gcc -std==c99 -Wall -Wextra nume_sursa_2 -o nume_executabil_2 -lm clean: rm -rf nume_executabil_1 nume_executabil_2