This shows you the differences between two versions of the page.
programare:teme_2019:tema4_2019_cbd [2019/11/02 22:56] marius.vintila Adaugat diacritice |
programare:teme_2019:tema4_2019_cbd [2020/01/04 00:24] (current) marius.vintila [Task 1 (5p)] |
||
---|---|---|---|
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 însușească cunoștințele necesare pentru examen | * să se însușească cunoștințele necesare pentru examen | ||
- | * sa se înțeleagă si sa se utilizeze operații cu vectori de referințe | + | * 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 se pregătească pentru examenul de la materia Programarea Calculatoarelor așa ca a intrat pe drive-ul seriei si si-a ales un subiect de acolo. După ce a citit subiectul, si-a dat seama ca ar trebuie sa se încălzească cu niște exerciții mai simple înainte de a trece la rezolvarea lui si treaba voastră este sa-l ajutați 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. |
====== Cerința ====== | ====== Cerința ====== | ||
- | <note warning>**TOATE** modificările de cod se vor realiza **DOAR** in fișiere **project.c** si **project.h**. Modificarea oricărui alt fișier 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. |
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> | 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 ===== | ===== Încălzire ===== | ||
==== Task 1 (5p) ==== | ==== Task 1 (5p) ==== | ||
- | Se da un vector cu n elemente numere întregi. Afișați produsul elementelor, mai puțin al elementului de pe poziția i, pe aceeași linie, separate prin spațiu într-un fișier text deja deschis pentru scriere. La final, treceți pe următorul rând. | + | 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>Veți completa funcția arrayProduct din fișierul project.c</note> | <note>Veți completa funcția arrayProduct din fișierul project.c</note> | ||
Exemplu: | Exemplu: | ||
Line 25: | Line 39: | ||
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 pătratica cu numere întregi. Sa se rotească matricea cu 90 grade la stânga si sa se întoarcă 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>Veți completa funcția rotateMatrix din fișierul project.c</note> | <note>Veți completa funcția rotateMatrix din fișierul project.c</note> | ||
Exemplu: | Exemplu: | ||
Line 38: | Line 53: | ||
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 întregi si k query-uri de forma <x1, y1, x2, y2>, unde x1, y1, x2, y2 sunt numere întregi, si reprezintă coordonate ale matricei. Se cere calcularea sumei elementelor dintre cele doua coordonate pentru fiecare query, si afișarea lor pe aceeași 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>Veți completa funcția subMatrixesSums din fișierul 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 îl alege, are de implementat o parte din sistemul dezvoltat de către 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 următoarele structuri: | Pentru a implementa acest sistem, Gigel trebuie sa declare următoarele structuri: | ||
- | * Structura Șofer ce va avea următoarele câmpuri: | + | * Structura pentru sofer, ce va conține următoarele câmpuri: |
- | * nume, reprezentat ca sir de caractere ce va conține maxim 20 de caractere utile; | + | * nume, reprezentat ca șir de caractere ce va conține maxim 20 de caractere utile; |
- | * număr mașină, sir de caractere format din 8 caractere utile(de forma JJNNNLLL; J - Județ, N - Număr, L - Litera); | + | * număr mașină, șir de caractere format din 8 caractere utile (de forma JJNNNLLL; J - Județ, N - Număr, L - Litera); |
- | * locația curenta pe harta, salvata ca doua numere reale cu precizie dubla; | + | * 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; | * numărul de curse efectuate de către șofer, întreg fără semn; | ||
- | * informații despre toate cursele efectuate, vector de referințe pe structura de mai jos. | + | * informații despre toate cursele efectuate, vector de adrese pe structura de mai jos. |
- | * Structura Curse ce va avea următoarele câmpuri: | + | * Structura pentru cursa, ce va avea următoarele câmpuri: |
- | * locație început 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 desfășurare, număr 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>Veți completa structurile din fișierul project.h</note> | <note>Veți completa structurile din fișierul project.h</note> | ||
=== Alocarea structurilor === | === Alocarea structurilor === | ||
Line 89: | Line 107: | ||
==== Task 5 (5p) ==== | ==== Task 5 (5p) ==== | ||
=== Citirea datelor === | === Citirea datelor === | ||
- | Pentru a-si putea pune in practica sistemul, Gigel trebuie sa citească datele șoferilor, însă acestea, din cauza sistemului, sunt salvate in fișiere binare. Astfel, el are de completat o funcție care primește un fișier binar deja deschis pentru citire si trebuie sa citească, 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 întreg, reprezentând numărul de șoferi; | * un întreg, reprezentând numărul de șoferi; | ||
- | * un vector de numere întregi, de lungimea numărului de șoferi, reprezentând numărul de curse pentru fiecare șofer; | + | * 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: | * apoi datele fiecărui șofer: | ||
* numele; | * numele; | ||
* numărul mașinii; | * numărul mașinii; | ||
- | * locația curenta pe harta; | + | * locația curentă pe hartă; |
- | * si detaliile pentru fiecare cursa a acestuia: | + | * si detaliile pentru fiecare cursă a acestuia: |
* locația de start; | * locația de start; | ||
* starea. | * starea. | ||
Funcția va returna vectorul de șoferi, iar numărul de șoferi 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. | ||
=== Afișarea datelor === | === Afișarea datelor === | ||
- | Din motive de verificare ale datelor, Gigel are de implementat si o funcție pentru afișarea unui vector de șoferi. Acesta va trebui sa afișeze într-un fișier binar deschis pentru scriere toate datele șoferilor, in aceeași 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; | ||
* numărul mașinii; | * numărul mașinii; | ||
- | * locația curenta pe harta; | + | * locația curentă pe hartă; |
- | * si detaliile pentru fiecare cursa a acestuia: | + | * si detaliile pentru fiecare cursă a acestuia: |
* locația de start; | * locația de start; | ||
* starea. | * starea. | ||
<note>Veți completa funcțiile readDrivers si printDrivers din fișierul 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 puțin curios, dorește sa vadă care este angajatul cu cel mai bun rating mediu(suma număr stele / (număr curse total - anulate - in desfășurare). Așa ca el are de implementat o funcție care primește vectorul de șoferi si întoarce numele șoferului 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>Veți completa funcția maxRatingDriverName din fișierul 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 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 ca voi îl veți ajuta sa completeze aceasta funcție, care primește vectorul de șoferi, locația de start, si numărul de șoferi care vor fi căutați, 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>Veți completa funcția getClosestDrivers din fișierul 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 șoferilor din memorie, astfel încât el are de implementat doua funcții: o funcție care eliberează memoria ocupata de către un șofer, iar alta care eliberează memoria ocupata de un vector de șoferi. | + | 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> | <note>Veți completa funcțiile freeDriver si freeDrivers din fișierul project.c</note> | ||