This shows you the differences between two versions of the page.
programare:teme_2019:tema4_2019_cbd [2019/11/02 22:46] marius.vintila Added second part of homework; Completed template |
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]] | ||
Line 5: | Line 5: | ||
* [[murarugeorgec@gmail.com|George Muraru]] | * [[murarugeorgec@gmail.com|George Muraru]] | ||
- | * Data publicare: **5 Noiembrie 2019** | + | * Data publicare: **5 Noiembrie 2019, ora 22:20** |
* Deadline: **6 Ianuarie 2020, ora 23:55** | * Deadline: **6 Ianuarie 2020, ora 23:55** | ||
+ | |||
+ | ==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 ====== | ====== Obiective ====== | ||
- | * să se respecte formate stricte de intrare/ieşire | + | * să se respecte formate stricte de intrare/ieșire |
- | * să se insuseasca cunostintele necesare pentru examen | + | * să se însușească cunoștințele necesare pentru examen |
- | * sa se inteleaga si sa se utilizeze operatii cu vectori de referinte | + | * 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 să-l ajutați în rezolvarea acestora. |
- | ====== Cerinta ====== | + | ====== Cerința ====== |
- | <note warning>**TOATE** modificarile de cod se vor realiza **DOAR** in fisiere **project.c** si **project.h**. Modificarea oricarui alt fisier nu va fi luata in considerare. | + | <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. |
- | Urmariti indicatiile din fisierul **project.h** si completati functiile notate cu **TODO**. In fisierul **project.c** se pot implementa si functii aditionale.</note> | + | 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> |
- | ===== Incalzire ===== | + | ===== Încălzire ===== |
==== Task 1 (5p) ==== | ==== Task 1 (5p) ==== | ||
- | Se da un vector cu n elemente numere intregi. Afisati 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 primit, cu 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 32: | Line 47: | ||
</code> | </code> | ||
==== Task 2 (5p) ==== | ==== Task 2 (5p) ==== | ||
- | Se da o matrice patratica cu numere intregi. Sa se roteasca matricea cu 90 grade la stanga si sa se intoarca noua matrice. | + | Se dă o matrice pătratică cu numere întregi. Să 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 49: | Line 65: | ||
</code> | </code> | ||
==== Task 3 (5p) ==== | ==== Task 3 (5p) ==== | ||
- | Se da o matrice de dimensiune n 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 n și m, cu 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 2 coordonate. |
- | <note>Veti completa functia subMatrixesSums 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 61: | Line 79: | ||
3 | 3 | ||
1 2 2 2 | 1 2 2 2 | ||
- | 2 2 3 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 Gigel il alege, are de implementat o parte din sistemul dezvoltat de catre compania de transport Uber. | + | 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) ==== | ==== Task 4 (5p) ==== | ||
=== Structuri === | === Structuri === | ||
- | Pentru a implementa acest sistem, Gigel trebuie sa declare urmatoarele structuri: | + | Pentru a implementa acest sistem, Gigel trebuie sa declare următoarele structuri: |
- | * Structura Sofer ce va avea urmatoarele campuri: | + | * Structura pentru sofer, ce va conține următoarele câmpuri: |
- | * nume, reprezentat ca sir de caractere ce va contine maxim 20 de caractere utile; | + | * nume, reprezentat ca șir de caractere ce va conține maxim 20 de caractere utile; |
- | * numar masina, sir de caractere format din 8 caractere utile(de forma JJNNNLLL; J - Judet, N - Numar, L - Litera); | + | * număr mașină, șir de caractere format din 8 caractere utile (de forma JJNNNLLL; J - Județ, N - Număr, L - Litera); |
- | * locatia curenta pe harta, salvata ca doua numere reale cu precizie dubla; | + | * locația curentă pe hartă, salvată ca două numere reale cu precizie dublă; |
- | * numarul de curse efectuate de catre sofer, intreg fara semn; | + | * numărul de curse efectuate de către șofer, întreg fără semn; |
- | * informatii despre toate cursele efectuate, vector de referinte pe structura de mai jos. | + | * informații despre toate cursele efectuate, vector de adrese pe structura de mai jos. |
- | * Structura Curse ce va avea urmatoarele campuri: | + | * Structura pentru cursa, ce va avea următoarele câmpuri: |
- | * locatie inceput cursa, salvata ca doua numere reale cu precizie dubla; | + | * locația de la începutul cursei, salvată ca două numere reale cu precizie dublă; |
- | * starea cursei reprezentata pe un byte, in care se retine: cursa anulata, cursa in desfasurare, numar stele(0->5) | + | * starea cursei reprezentată pe un byte, în care se retine: cursă anulată, cursă în desfășurare, număr stele (0->5) |
- | <note>Veti completa structurile din fisierul project.h</note> | + | <note>Veți completa structurile din fișierul project.h</note> |
=== Alocarea structurilor === | === Alocarea structurilor === | ||
- | Mai departe, el trebuie sa implementeze doua functii pentru alocarea dinamica a structurilor, una pentru alocarea unui sofer ce primeste un numar de curse, iar cealalta pentru alocarea unui vector de soferi ce primeste numarul de soferi si numarul de curse pentru fiecare sofer intr-un vector. | + | 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>Veti completa functiile allocDriver si allocDrivers din fisierul project.c</note> | + | <note>Veți completa funcțiile allocDriver si allocDrivers din fișierul project.c</note> |
- | <note warning>**ATENTIE!** Atat vectorul de soferi cat si vectorul de curse al fiecarui sofer sunt **vectori de referinte**!!!</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) ==== | ==== Task 5 (5p) ==== | ||
=== Citirea datelor === | === Citirea datelor === | ||
- | Pentru a-si putea pune in practica sistemul, Gigel trebuie sa citeasca datele soferilor, insa acestea, din cauza sistemului, sunt salvate in fisiere binare. Astfel, el are de completat o functie care primeste un fisier binar deja deschis pentru citire si trebuie sa citeasca, in ordine: | + | 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 intreg, reprezentand numarul de soferi; | + | * un întreg, reprezentând numărul de șoferi; |
- | * un vector de numere intregi, de lungimea numarului de soferi, reprezentand numarul de curse pentru fiecare sofer; | + | * un vector de numere întregi, având lungimea numărului de șoferi și reprezentând numărul de curse pentru fiecare șofer; |
- | * apoi datele fiecarui sofer: | + | * apoi datele fiecărui șofer: |
* numele; | * numele; | ||
- | * numarul masinii; | + | * numărul mașinii; |
- | * locatia curenta pe harta; | + | * locația curentă pe hartă; |
- | * si detaliile pentru fiecare cursa a acestuia: | + | * si detaliile pentru fiecare cursă a acestuia: |
- | * locatia de start; | + | * locația de start; |
* starea. | * starea. | ||
- | Functia va returna vectorul de soferi, iar numarul de soferi va fi returnat prin intermediul unui parametru. | + | Funcția va returna vectorul de șoferi, iar numărul de șoferi va fi returnat prin intermediul unui parametru. |
- | === Afisarea datelor === | + | === Afișarea datelor === |
- | Din motive de verificare ale datelor, Gigel are de implementat si o functie pentru afisarea unui vector de soferi. Acesta va trebui sa afiseze intr-un fisier binar deschis pentru scriere toate datele soferilor, in aceeasi ordine ca si citirea: | + | 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; | * numele; | ||
- | * numarul masinii; | + | * numărul mașinii; |
- | * locatia curenta pe harta; | + | * locația curentă pe hartă; |
- | * si detaliile pentru fiecare cursa a acestuia: | + | * si detaliile pentru fiecare cursă a acestuia: |
- | * locatia de start; | + | * locația de start; |
* starea. | * starea. | ||
- | <note>Veti completa functiile readDrivers si printDrivers din fisierul project.c</note> | + | <note>Veți completa funcțiile readDrivers si printDrivers din fișierul project.c</note> |
==== Task 6 (5p) ==== | ==== Task 6 (5p) ==== | ||
- | In acest moment, Gigel, fiind putin curios, doreste sa vada care este angajatul cu cel mai bun rating mediu(suma numar stele / (numar curse total - anulate - in desfasurare). Asa ca el are de implementat o functie care primeste vectorul de soferi si intoarce numele soferului cu cel mai bun rating. | + | Î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>Veti completa functia maxRatingDriverName din fisierul project.c</note> | + | <note>Veți completa funcția maxRatingDriverName din fișierul project.c</note> |
==== Task 7 (5p) ==== | ==== Task 7 (5p) ==== | ||
- | In acest moment, lui Gigel ii mai lipseste un singur lucru de la solutia lui: algoritmul de gasire al celor mai apropiati soferi de o locatie de start, asa ca voi il veti ajuta sa completeze aceasta functie, care primeste vectorul de soferi, locatia de start, si numarul de soferi care vor fi cautati, prin comparare cu distanta euclidiana. | + | Î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>Veti completa functia getClosestDrivers din fisierul project.c</note> | + | <note>Veți completa funcția getClosestDrivers din fișierul project.c</note> |
==== Task 8 (5p) ==== | ==== Task 8 (5p) ==== | ||
- | Pentru a-si finaliza acest proiect, Gigel trebuie sa elimine datele soferilor din memorie, astfel incat el are de implementat doua functii: o functie care elibereaza memoria ocupata de catre un sofer, iar alta care elibereaza memoria ocupata de un vector de soferi. | + | 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>Veti completa functiile freeDriver si freeDrivers din fisierul project.c</note> | + | <note>Veți completa funcțiile freeDriver si freeDrivers din fișierul project.c</note> |
====== Punctaj ====== | ====== Punctaj ====== | ||
Line 131: | Line 149: | ||
* [-1.0]: warning-uri la compilare (este obligatorie folosirea în fișierul **Makefile** a flag-ului de compilare **-Wall** pentru regula **build**) | * [-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]: linii mai lungi de 80 de caractere | ||
- | * [-1.0]: functii mai lungi de 100 de linii | + | * [-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]: folosirea de [[https://en.wikipedia.org/wiki/Magic_number_(programming)|magic numbers]] | ||
* [-0.5]: numele variabilelor nu sunt sugestive | * [-0.5]: numele variabilelor nu sunt sugestive | ||
Line 143: | Line 161: | ||
Găsiți arhiva cu checker-ul si scheletul temei {{:programare:teme_2019:pc_tema_4.zip|aici}}. | Găsiți arhiva cu checker-ul si scheletul temei {{:programare:teme_2019:pc_tema_4.zip|aici}}. | ||
- | Formatul arhivei care va fi incarcata pe platforma de testare a temelor va fi următorul: | + | Formatul arhivei care va fi încărcata pe platforma de testare a temelor va fi următorul: |
- fișierele ''project.c'', ''include/project.h''. | - 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. | - Un fișier [[https://en.wikipedia.org/wiki/README|README]] în care vă descrieți rezolvarea fiecărui task. | ||
<note warning> | <note warning> | ||
- | - Arhiva trebuie să fie de tipul **ZIP** si sa contina toate fisierele mentionate **IN RADACINA ARHIVEI**. | + | - Arhiva trebuie să fie de tipul **ZIP** si sa conțină toate fișierele menționate **IN RADACINA ARHIVEI**. |
</note> | </note> | ||
+ |