This shows you the differences between two versions of the page.
programare:teme_2018:tema1_2018_ca [2018/10/15 22:51] teodora.serbanescu |
programare:teme_2018:tema1_2018_ca [2018/10/30 20:49] (current) teodora.serbanescu |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | <hidden> | ||
====== Tema de casă 1 - Data Analysis On The Fly ====== | ====== Tema de casă 1 - Data Analysis On The Fly ====== | ||
Line 5: | Line 4: | ||
**Termen de predare**: 05.11.2018, ora 23:55 | **Termen de predare**: 05.11.2018, ora 23:55 | ||
+ | |||
+ | <note> | ||
+ | **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 | ||
+ | </note> | ||
===== Obiectivele temei ===== | ===== Obiectivele temei ===== | ||
Line 16: | Line 27: | ||
* tema va fi realizată doar cu materia prezentată la curs până în săptămâna a patra inclusiv | * tema va fi realizată doar cu materia prezentată la curs până în săptămâna a patra inclusiv | ||
- | * nu este permisă utilizarea variabilelor globale în rezolvarea temei | + | * tema se va rezolva fără variabile globale |
===== Ce învăț din această tema? ===== | ===== Ce învăț din această tema? ===== | ||
Line 52: | Line 63: | ||
| | ||
| | ||
- | Fiecare rând al histogramei conține 10 niveluri, ceea ce înseamna că datele trebuie 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. Rândurile din fișierul de intrare pot fi date în orice ordine, dar histograma finală trebuie să conțină serialele în ordine crescătoare după codificarea acestora. | + | 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:** | **Exemplu:** | ||
Line 63: | Line 74: | ||
2 10 32 | 2 10 32 | ||
| | ||
- | Histograma realizată de programul scris de student arată astfel (numerele reprezinta codificările serialelor): | + | Histograma realizată de programul scris de student arată astfel (numerele reprezintă codificările serialelor): |
1 * * * * . . . . . . | 1 * * * * . . . . . . | ||
2 * * * . . . . . . . | 2 * * * . . . . . . . | ||
Line 69: | Line 80: | ||
6 * * * * * * * * . . | 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 trebuie afișată pe ecran (stdout) și ar arata astfel: | + | 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: |
- | {{ :programare:teme_2018:histograma.png?200x400 }} | + | . . . . |
+ | . . . . | ||
+ | . . * * | ||
+ | . . * * | ||
+ | . . * * | ||
+ | . . * * | ||
+ | * . * * | ||
+ | * * * * | ||
+ | * * * * | ||
+ | * * * * | ||
+ | 1 2 4 6 | ||
===== Problema 2 - Vampirul componetelor electronice ===== | ===== Problema 2 - Vampirul componetelor electronice ===== | ||
Line 78: | Line 99: | ||
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. | 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 trebuie să calculați media aritmetică, geometrică, armonică și media pătratică, dar și abaterea standard a datelor, având în vedere formulele: | + | 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: |
- | {{ :programare:teme_2018:formule1.png?400x600 }} | + | \begin{eqnarray*} |
+ | & & m_{aritmetica} = \frac{p_1 + p_2 + ... + p_n}{n} | ||
+ | \end{eqnarray*} | ||
- | Aceste 5 valori se vor afișa pe ecran cu 4 zecimale, fiecare pe câte un rând separat. În timp ce calculați aceste formule, aveți grijă la condițiile de existență, astfel că dacă radicalul este de ordin par și argumentul său este negativ, rezultatul va fi imaginar, deci va trebui afișat caracterul ‘i’ alături de rezultatul radicalului. Se consideră că valorile citite nu vor fi niciodată fix 0, deci nu trebuie să vă faceți griji de împărțirea la 0. | + | \begin{eqnarray*} |
- | De asemenea, studentul dorește să știe acuratețea cu care fotorezistențele citesc datele. Astfel, trebuie să afle minimul și maximul din valorile citite și de câte ori apare fiecare, dar și cel mai lung subșir crescător (nu neapărat strict crescător), 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 trebuie afișate pe ecran, pe trei rânduri diferite, separate printr-un spațiu, de forma: | + | & & 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 | minim nr_minim | ||
maxim nr_maxim | maxim nr_maxim | ||
Line 90: | Line 132: | ||
//Date de intrare:// | //Date de intrare:// | ||
- | 6 | + | 8 |
-15.2 | -15.2 | ||
- | 27.5 | + | 27.5 |
+ | -121.2 | ||
112.3 | 112.3 | ||
-121.2 | -121.2 | ||
+ | 1000 | ||
1000 | 1000 | ||
82.13 | 82.13 | ||
- | //Date de ieșire// | + | //Date de ieșire:// |
- | 180.9216 | + | 245.5412 |
- | 88.0900 | + | - |
- | −384.7109 | + | -350.1560 |
- | 415.2451 | + | 506.1772 |
- | 409.5454 | + | 442.6340 |
- | -121.2 1 | + | -121.2000 2 |
- | 1000 1 | + | 1000.0000 2 |
3 | 3 | ||
- | + | ||
- | + | ||
**Explicatie:** | **Explicatie:** | ||
- | Pentru datele de intrare, prima valoare reprezintă 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 celui mai lung subșir crescător. | + | 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. |
- | + | ||
+ | <note> | ||
+ | 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). | ||
+ | </note> | ||
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ț. | 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 ===== | ===== Precizările legate de implementare ===== | ||
- | * Implementarea se va face in limbajul C | ||
- | * Tema va fi compilată şi testată DOAR într-un mediu LINUX. | ||
- | * Fișierul de implementare a temei se va numi histograma.c pentru Problema 1 și statistici.c pentru Problema 2, iar în cadrul testării vor fi două executabile diferite verificate | ||
- | * Deși programul vostru va trebui să citească direct de la tastatura și să afișeze pe ecran (folosind, de exemplu, scanf și printf), puteți sa citiți datele și să le scrieți în fișiere, folosind redirectările din consolă, fără sa modificați programul. Pentru mediul Windows, dacă fișierul de intrare este in.txt, și cel de ieșire este out.txt, iar programul vostru se numește tema1.exe, veți tipări la consolă: | + | <note> |
- | <code>tema1.exe < in.txt > out.txt</code> | + | Regulamentul general se găsește [[programare:regulament-ca|aici]]. |
- | * Pentru Linux, comanda este similară: | + | </note> |
- | <code>./tema1 < in1 > out1</code> | + | |
+ | * Implementarea se va face in limbajul C, iar tema va fi compilată şi testată DOAR într-un mediu LINUX. Nerespectarea acestor reguli aduce un punctaj NUL. | ||
+ | * Fișierul de implementare a temei se va numi histograma.c pentru Problema 1 și statistici.c pentru Problema 2, iar în cadrul testării vor fi două executabile diferite verificate. | ||
+ | * Deși programul vostru va trebui să citească direct de la tastatura și să afișeze pe ecran (folosind, de exemplu, scanf și printf), puteți sa citiți datele și să le scrieți în fișiere, folosind redirectările din consolă, fără sa modificați programul. Pentru Linux, comanda este: | ||
+ | <code>./tema1 < in1 > out1 </code> | ||
+ | |||
+ | ===== Testarea si trimiterea temei ===== | ||
* Fișierele temei trebuie OBLIGATORIU împachetate într-o arhiva de tip '.zip', cu numele 'Grupa_NumePrenume_Tema1.zip'. Această arhivă va conține: | * Fișierele temei trebuie OBLIGATORIU împachetate într-o arhiva de tip '.zip', cu numele 'Grupa_NumePrenume_Tema1.zip'. Această arhivă va conține: | ||
- | * Codul sursă al programului vostru. | + | - Codul sursă al programului vostru (două fișiere .c si, eventual, .h) |
- | * Un fişier ''Makefile'' care să conţină regulile ''build'' şi ''clean''. Regula ''build'' va compila programul într-un executabil cu numele **''tema1''**. Regula ''clean'' va şterge executabilul şi eventual toate binarele intermediare (fişiere obiect) generate de voi. | + | - Un fişier ''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. |
- | * Un fişier ''README'' care să conţină explicații privitoare la modul de rezolvare; | + | - Un fişier ''README'' care să conţină explicații privitoare la modul de rezolvare. |
- | * Arhiva temei NU va conține fișiere binare; | + | - Arhiva temei NU va conține fișiere binare. |
- | * Arhiva va fi trimisă atât pe [[https://elf.cs.pub.ro/vmchecker/|vmchecker]] cât și pe [[http://cs.curs.pub.ro|moodle]]. | + | * Lipsa codului sursă și/sau a Makefile-ului aduce un punctaj NUL. |
+ | * Arhiva va fi trimisă pe [[https://elf.cs.pub.ro/vmchecker/|vmchecker]]. | ||
* O temă care nu compilează nu va fi punctată. | * O temă care nu compilează nu va fi punctată. | ||
+ | * O temă care compilează, dar care nu trece niciun test, nu va fi punctată. | ||
+ | |||
+ | ===== Checker ===== | ||
+ | |||
+ | **Checkerul** poate fi descărcat de aici: {{ :programare:teme_2018:tema01_ca2018_checker-v7.zip }} | ||
+ | <note> | ||
+ | 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 [[programare:coding-style|coding style]] de pe ocw. | ||
+ | </note> | ||
+ | |||
+ | <note> | ||
+ | Î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 <code> chmod u+x cs.py </code> în folderul cu fișierul cs.py. | ||
+ | </note> | ||
+ | {{ :programare:teme_2018:eroare-cs.jpg?800X200 }} | ||
+ | |||
+ | * În lipsa Makefile-ului, sau dacă sursele au erori de compilare, checker-ul nu va putea rula și nu va verifica tema. Punctajul aferent este 0 în acest caz. Veți vedea mesajul de mai jos: | ||
+ | {{ :programare:teme_2018:makefile.png?800X200 }} | ||
+ | * Fișierul README valorează 5 puncte. Acestea nu se primesc daca fișierul lipsește sau e gol. Mesajele afișate sunt cele de mai jos: | ||
+ | {{ :programare:teme_2018:noreadme.png?800X200 }} | ||
+ | {{ :programare:teme_2018:emptyreadme.png?800X200 }} | ||
+ | * Odată cu rularea testelor este verificat și coding style-ul. Dacă apar erori de coding style, checkerul va scădea 15 puncte din punctajul obținut. Mesajul arătat este găsit mai jos. De asemenea, checkerul menționează unde sunt erorile pentru a fi corectate. | ||
+ | {{ :programare:teme_2018:cs.png?800X300 }} | ||
+ | * Sfat: <code> cat -e nume_fișier </code> 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. | ||
+ | * Makefile: | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | |||
+ | <note> | ||
+ | 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. | ||
+ | </note> | ||
+ | |||
- | ===== Testarea si trimiterea temei ===== | ||
- | Mai multe detalii în cursul zilei de miercuri. | ||
<note warning> | <note warning> | ||
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. | 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. | ||
</note> | </note> | ||
- | |||
- | </hidden> |