Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:teme_2018:tema1_2018_ca [2018/10/16 17:12]
teodora.serbanescu
programare:teme_2018:tema1_2018_ca [2018/10/30 20:49] (current)
teodora.serbanescu
Line 4: 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 15: 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 51: Line 63:
   ​   ​
   ​   ​
-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. Rândurile din fișierul ​de intrare pot fi date în orice ordine, dar histograma finală va conține 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 62: 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 108: Line 120:
 \end{eqnarray*} \end{eqnarray*}
  
-Aceste 5 valori se vor afișa pe ecran cu 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 '​-'​.+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 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.+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ă minim si maxim nu sunt numere întregiafisate ​cu patru zecimale:+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 realedeci se vor afișa ​cu exact 4 zecimale:
   minim nr_minim   minim nr_minim
   maxim nr_maxim   maxim nr_maxim
Line 130: Line 142:
   82.13   82.13
  
-//Date de ieșire//+//Date de ieșire://
   245.5412   245.5412
   -   -
Line 139: Line 151:
   1000.0000 2   1000.0000 2
   3   3
-  ​ 
-<​note> ​ 
-Atentie la compararea datelor de tip float. Ne intereseaza o precizie de exact 4 zecimale. ​ 
-</​note>​ 
  
 **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 
-  * Pentru Problema 1, numărul de seriale per test va fi între 1 și 10. 
-  * Pentru Problema 2, numărul de citiri ale senzorului per test va fi între 5 și 2000. 
  
-  * 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 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 ''​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 miercuri, 17.10.2018. ​ 
  
 <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>​
- 
programare/teme_2018/tema1_2018_ca.1539699136.txt.gz · Last modified: 2018/10/16 17:12 by teodora.serbanescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0