Table of Contents

Tema de casă 1 - Data Analysis On The Fly

Responsabili: Carmen Popa Valentin Ioniță

Termen de predare: 05.11.2018, ora 23:55

Update

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

Obiectivele temei

Limitările temei

Ce învăț din această tema?

Finalitățile temei

Problema 1 - Histograma

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

Problema 2 - Vampirul componetelor electronice

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.

Checkerul verifică datele cu o precizie de exact 4 zecimale. De exemplu, afișarea numărului 1 ca 1.000 sau 1.00000 (cu 3 sau cu 5 zecimale) nu va fi punctată, deoarece checkerul este construit să acorde punctajul doar pentru numere de forma 1.0000 (4 zecimale).

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ț.

Precizările legate de implementare

Regulamentul general se găsește aici.

./tema1 < in1 > out1 

Testarea si trimiterea temei

Checker

Checkerul poate fi descărcat de aici: tema01_ca2018_checker-v7.zip

Tema va fi verificată automat cu un script. În caz că aveți erori, checkerul va penaliza cu 15p din punctajul total obținut (conform regulamentului). Pentru a sti cum sa preveniți aceste probleme, vă rugam să parcurgeți pagina de coding style de pe ocw.

În cazul în care fișierul cs.py (cel care verifică coding style-ul) nu e executabil, atunci va apărea urmatoarea eroare (poza de mai jos). Acest lucru se rezolvă prin rularea comenzii

 chmod u+x cs.py 

în folderul cu fișierul cs.py.

eroare-cs.jpg

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

Regula de build din makefile conține niște argumente noi, care permit declararea variabilelor în cadrul for-urilor. Ca să vă asigurați că tema va fi rulată corect pe vmchecker, e recomandat să modificați makefile-ul ca mai sus.

Copierea parţială sau totală a unei rezolvări din altă sursă va atrage după sine anularea punctajelor pentru toate temele de casă, atât pentru cel care a copiat, cât şi pentru sursa acestuia.