Differences

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

Link to this comparison view

programare:teme_2019:tema4_2019_cbd [2019/11/01 22:56]
marius.vintila Created page; Added template; Added homework tasks
programare:teme_2019:tema4_2019_cbd [2020/01/04 00:24] (current)
marius.vintila [Task 1 (5p)]
Line 1: Line 1:
-====== Tema 4 – Pregatire ​Examen ======+====== Tema 4 – Pregătire ​Examen ======
 ====== Responsabili ====== ====== Responsabili ======
   * [[vintila.mariusm@gmail.com|Marius Vintila]]   * [[vintila.mariusm@gmail.com|Marius Vintila]]
-  * [[murarugeorgec@gmail.com|George Muraru]] 
   * [[i.marius99@gmail.com|Marius Iftimie]]   * [[i.marius99@gmail.com|Marius Iftimie]]
 +  * [[murarugeorgec@gmail.com|George Muraru]]
  
-  * Data publicare: **5 Noiembrie 2019** +  * Data publicare: **5 Noiembrie 2019, ora 22:20** 
-  * Deadline: **Ianuarie 2020, ora 23:55** +  * Deadline: **Ianuarie 2020, ora 23:55**
-====== Obiective ======+
  
 +==Depunctări==
 +Deadline-ul hard coincide cu cel soft. \\
 +În consecință,​ [[http://​ocw.cs.pub.ro/​courses/​programare/​regulament-cb-cd#​temele_de_casa|deadline-ul hard]] este **06.01.2020,​ ora 23:55**.
 +
 +==Întrebări==
 +Dacă aveți nelămuriri,​ puteți să ne contactați pe forumul dedicat [[https://​acs.curs.pub.ro/​2019/​mod/​forum/​view.php?​id=6890|temei de casă nr. 4]].\\
 +La orice întrebare vom răspunde în maxim 24 de ore.\\
 +Nu se acceptă întrebări în ultimele 24 de ore înainte de deadline.
 +
 +==Updates==
 +  * 15.12.2019: Update teste
 +  * 3.1.2020: Update teste v2
 +====== Obiective ======
 +  * să se respecte formate stricte de intrare/​ieșire
 +  * să se însușească cunoștințele necesare pentru examen
 +  * sa se înțeleagă si sa se utilizeze operații cu array-uri de pointeri
 +  * sa se inteleaga si sa se utilizeze scrierea si citirea din fisiere binare
 ====== Introducere ====== ====== Introducere ======
-Gigel vrea sa sa se pregateasca ​pentru examenul de la materia Programarea Calculatoarelor ​asa ca a intrat pe drive-ul seriei ​si si-a ales un subiect de acolo. ​Dupa ce a citit subiectul, ​si-a dat seama ca ar trebuie sa se incalzeasca ​cu niste exercitii ​mai simple ​inainte ​de a trece la rezolvarea lui si treaba ​voastra ​este sa-l ajutati in rezolvarea ​acestor task-uri+Gigel vrea să se pregătească ​pentru examenul de la materia Programarea Calculatoarelor ​așa că a intrat pe drive-ul seriei ​și a ales un subiect de acolo. ​După ce a citit subiectul, ​și-a dat seama că ar trebui să se încălzească ​cu niște exerciții ​mai simple ​înainte ​de a trece la rezolvarea lui, iar treaba ​voastră ​este -l ajutați în rezolvarea ​acestora
-====== ​Cerinta ​====== +====== ​Cerința ​====== 
-<note warning>​**TOATE** ​modificarile ​de cod se vor realiza **DOAR** in fisierul ​**project.c**. Modificarea ​oricarui ​alt fisier ​nu va fi luata in considerare.</​note>​ +<note warning>​**TOATE** ​modificările ​de cod se vor realiza **DOAR** in fișierele ​**project.c** si **project.h**. Modificarea ​oricărui ​alt fișier ​nu va fi luata in considerare
-===== Incalzire ​=====+ 
 +Urmăriți indicațiile din fișierul **project.h** si completați funcțiile notate cu **TODO**. In fișierul **project.c** se pot implementa si funcții adiționale.</​note>​ 
 +===== Încălzire ​=====
 ==== Task 1 (5p) ==== ==== Task 1 (5p) ====
-Se da un vector cu n elemente numere ​intregiAfisati ​produsul elementelor, ​mai putin al elementului de pe pozitia ​i, pe aceeasi linie, separate prin spatiu intr-un fisier text deja deschis pentru scriere. La final, treceti pe urmatorul rand+Se dă un vector cu n elemente numere ​întregi Se cere întoarcerea unui nou vector, alocat dinamic, care să aibă pe poziția i produsul ​tuturor ​elementelor ​din vectorul primitcu excepția ​elementului de pe poziția ​i. 
-<​note>​Veti completa ​functia ​arrayProduct din fisierul ​project.c</​note>​+<​note>​Veți completa ​funcția ​arrayProduct din fișierul ​project.c</​note>​
 Exemplu: ​ Exemplu: ​
  
 Input: Input:
 <​code>​ <​code>​
 +4
 1 2 3 4 1 2 3 4
 </​code>​ </​code>​
Line 28: Line 47:
 </​code>​ </​code>​
 ==== Task 2 (5p) ==== ==== Task 2 (5p) ====
-Se da o matrice ​patratica ​cu numere ​intregiSa se roteasca ​matricea cu 90 grade la stanga si sa se intoarca ​noua matrice. +Se dă o matrice ​pătratică ​cu numere ​întregiSă se rotească ​matricea cu 90 grade la stânga și să se întoarcă ​noua matrice, alocată dinamic
-<​note>​Veti completa ​functia ​rotateMatrix din fisierul ​project.c</​note>​+<​note>​Veți completa ​funcția ​rotateMatrix din fișierul ​project.c</​note>​
 Exemplu: Exemplu:
  
 Input: Input:
 <​code>​ <​code>​
 +3
 1 2 3 1 2 3
 4 5 6 4 5 6
Line 45: Line 65:
 </​code>​ </​code>​
 ==== Task 3 (5p) ==== ==== Task 3 (5p) ====
-Se da o matrice ​de dimensiune ​si m cu elemente ​intregi si k query-uri de forma <x1, y1, x2, y2>, unde x1, y1, x2, y2 sunt numere ​intregi, si reprezinta ​coordonate ale matricii. Se cere calcularea sumei elementelor ​dintre ​cele doua coordonate ​pentru fiecare query, si afisarea lor pe aceeasi linie+Se dă o matrice ​având dimensiunile ​și mcu elemente ​întregi și k query-uri de forma <x1, y1, x2, y2>, unde x1, y1, x2, y2 sunt numere ​întregi ce reprezintă ​coordonate ale matricei. Se cere calcularea sumei elementelor ​din submatricea definita de cele coordonate. 
-<​note>​Veti completa ​functia *placeholder* ​din fisierul ​project.c</​note>​+<​note>​Veți completa ​funcția subMatrixesSums ​din fișierul ​project.c
 + 
 +0 <= x1, x2 < nrLinii; 0 <= y1, y2 < nrColoane</​note>​
 Exemplu: Exemplu:
  
Line 57: Line 79:
 3 3
 1 2 2 2 1 2 2 2
-2 2 2+2 2 2 3
 0 0 2 2 0 0 2 2
 </​code>​ </​code>​
 Output: Output:
 <​code>​ <​code>​
-13 33 54+18 23 54
 </​code>​ </​code>​
 ===== Rezolvarea Subiectului ===== ===== Rezolvarea Subiectului =====
 +Pentru subiectul pe care l-a ales, Gigel are de implementat o parte din sistemul dezvoltat de către compania de transport Uber.
 +==== Task 4 (5p) ====
 +=== Structuri ===
 +Pentru a implementa acest sistem, Gigel trebuie sa declare următoarele structuri:
 +  * Structura pentru sofer, ce va conține următoarele câmpuri:
 +    * nume, reprezentat ca șir de caractere ce va conține maxim 20 de caractere utile;
 +    * număr mașină, șir de caractere format din 8 caractere utile (de forma JJNNNLLL; J - Județ, N - Număr, L - Litera);
 +    * locația curentă pe hartă, salvată ca două numere reale cu precizie dublă;
 +    * numărul de curse efectuate de către șofer, întreg fără semn;
 +    * informații despre toate cursele efectuate, vector de adrese pe structura de mai jos.
 +  * Structura pentru cursa, ce va avea următoarele câmpuri:
 +    * locația de la începutul cursei, salvată ca două numere reale cu precizie dublă;
 +    * starea cursei reprezentată pe un byte, în care se retine: cursă anulată, cursă în desfășurare,​ număr stele (0->5)
 +<​note>​Veți completa structurile din fișierul project.h</​note>​
 +=== Alocarea structurilor ===
 +Mai departe, el trebuie sa implementeze doua funcții pentru alocarea dinamica a structurilor,​ una pentru alocarea unui șofer ce primește un număr de curse, iar cealaltă pentru alocarea unui vector de șoferi ce primește numărul de șoferi si numărul de curse pentru fiecare șofer într-un vector.
 +<​note>​Veți completa funcțiile allocDriver si allocDrivers din fișierul project.c</​note>​
 +<note warning>​**ATENTIE!** Atât vectorul de șoferi cat si vectorul de curse al fiecărui șofer sunt **vectori de referințe**!!!</​note>​
 +==== Task 5 (5p) ====
 +=== Citirea datelor ===
 +Pentru a-și putea pune în practică sistemul, Gigel trebuie să citească datele șoferilor, ce sunt salvate în fișiere binare. Astfel, el are de completat o funcție care primește un fișier binar deja deschis pentru citire și din care trebuie sa citească, ​ respectând următoarea ordine: ​
 +  * un întreg, reprezentând numărul de șoferi;
 +  * un vector de numere întregi, având lungimea numărului de șoferi și reprezentând numărul de curse pentru fiecare șofer;
 +  * apoi datele fiecărui șofer:
 +    * numele;
 +    * numărul mașinii;
 +    * locația curentă pe hartă;
 +    * si detaliile pentru fiecare cursă a acestuia:
 +      * locația de start;
 +      * starea.
 +Funcția va returna vectorul de șoferi, iar numărul de șoferi va fi returnat prin intermediul unui parametru.
 +=== Afișarea datelor ===
 +Din motive de verificare ale datelor, Gigel are de implementat și o funcție pentru afișarea unui vector de șoferi. Acesta va trebui să afișeze într-un fișier binar deschis pentru scriere toate datele șoferilor, în aceeași ordine ca și în cazul citirii:
 +  * numele;
 +  * numărul mașinii;
 +  * locația curentă pe hartă;
 +  * si detaliile pentru fiecare cursă a acestuia:
 +    * locația de start;
 +    * starea.
 +<​note>​Veți completa funcțiile readDrivers si printDrivers din fișierul project.c</​note>​
 +==== Task 6 (5p) ====
 +În acest moment, Gigel, fiind puțin curios, dorește să vadă care este angajatul cu cel mai bun rating mediu (sumă număr stele / (număr curse total - anulate - în desfășurare)). Pentru acest lucru, el are de implementat o funcție care primește vectorul de șoferi și întoarce numele șoferului cu cel mai bun rating.
 +<​note>​Veți completa funcția maxRatingDriverName din fișierul project.c</​note>​
 +==== Task 7 (5p) ====
 +În acest moment, lui Gigel îi mai lipsește un singur lucru de la soluția lui:  algoritmul de găsire al celor mai apropiați șoferi de o locație de start, așa că voi îl veți ajuta să completeze aceasta funcție. Funcția primește vectorul de șoferi, locația de start și numărul de șoferi care vor fi căutați, prin comparare cu distanța euclidiană.
 +<​note>​Veți completa funcția getClosestDrivers din fișierul project.c</​note>​
 +==== Task 8 (5p) ====
 +Pentru a-și finaliza acest proiect, Gigel trebuie să elimine datele șoferilor din memorie, astfel încât el are de implementat două funcții: o funcție care eliberează memoria ocupată de către un șofer, iar alta care eliberează memoria ocupată de un vector de șoferi.
 +<​note>​Veți completa funcțiile freeDriver si freeDrivers din fișierul project.c</​note>​
 +
 +====== Punctaj ======
 +  * **[40p]** Teste
 +  * **[5p]** Fișier README în care să se descrie implementarea
 +  * **[5p]** [[programare:​coding-style|Coding Style]].
 +
 +TOTAL: **50p**
 +
 +====== Listă depunctări ======
 +  * o temă care nu compilează și nu a rulat pe **[[https://​v2.vmchecker.cs.pub.ro|v2.vmchecker]]** nu va fi luată în considerare
 +  * o temă care nu rezolvă cerința și trece testele prin alte mijloace nu va fi luată în considerare
 +  * [-1.0]: warning-uri la compilare (este obligatorie folosirea în fișierul **Makefile** a flag-ului de compilare **-Wall** pentru regula **build**)
 +  * [-1.0]: linii mai lungi de 80 de caractere
 +  * [-1.0]: funcții mai lungi de 100 de linii
 +  * [-0.5]: folosirea de [[https://​en.wikipedia.org/​wiki/​Magic_number_(programming)|magic numbers]]
 +  * [-0.5]: numele variabilelor nu sunt sugestive
 +  * [-0.5]: cod comentat
 +  * [-0.5]: trailing whitespaces
 +    * în cadrul cursului de programare nu avem ca obiectiv rezolvarea în cel mai eficient mod posibil a programelor;​ totuși, ne dorim ca abordarea să nu fie una ineficientă,​ de genul să nu folosiți instrucțiuni repetitive acolo unde clar era cazul, etc.
 +
 +====== Trimitere temă ======
 +Tema va fi trimisă folosind [[https://​v2.vmchecker.cs.pub.ro/​homepage/​|V2.vmchecker]],​ cursul **Programarea Calculatoarelor (CB & CD)**. \\
 +
 +Găsiți arhiva cu checker-ul si scheletul temei {{:​programare:​teme_2019:​pc_tema_4.zip|aici}}.
 +
 +Formatul arhivei care va fi încărcata pe platforma de testare a temelor va fi următorul:
 + - fișierele ''​project.c'',​ ''​include/​project.h''​.
 + - Un fișier [[https://​en.wikipedia.org/​wiki/​README|README]] în care vă descrieți rezolvarea fiecărui task.
 +
 +<note warning>
 +  - Arhiva trebuie să fie de tipul **ZIP** si sa conțină toate fișierele menționate **IN RADACINA ARHIVEI**.
 +</​note>​
 +
programare/teme_2019/tema4_2019_cbd.1572641804.txt.gz · Last modified: 2019/11/01 22:56 by marius.vintila
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