This is an old revision of the document!


Tema 4 – Pregatire Examen

Responsabili

  • Data publicare: 5 Noiembrie 2019
  • Deadline: 6 Ianuarie 2020, ora 23:55

Obiective

  • să se respecte formate stricte de intrare/ieşire
  • să se insuseasca cunostintele necesare pentru examen
  • sa se inteleaga si sa se utilizeze operatii cu vectori de referinte

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.

Cerinta

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.

Urmariti indicatiile din fisierul project.h si completati functiile notate cu TODO. In fisierul project.c se pot implementa si functii aditionale.

Incalzire

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.

Veti completa functia arrayProduct din fisierul project.c

Exemplu:

Input:

1 2 3 4

Output:

24 12 8 6

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.

Veti completa functia rotateMatrix din fisierul project.c

Exemplu:

Input:

1 2 3
4 5 6
7 8 9

Output:

3 6 9
2 5 8
1 4 7

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.

Veti completa functia subMatrixesSums din fisierul project.c

Exemplu:

Input:

3 4
1 2 3 4
5 6 7 8
9 10 11 12
3
1 2 2 2
2 2 3 2
0 0 2 2

Output:

13 33 54

Rezolvarea Subiectului

Pentru subiectul pe care Gigel il alege, are de implementat o parte din sistemul dezvoltat de catre compania de transport Uber.

Task 4 (5p)

Structuri

Pentru a implementa acest sistem, Gigel trebuie sa declare urmatoarele structuri:

  • Structura Sofer ce va avea urmatoarele campuri:
    • nume, reprezentat ca sir de caractere ce va contine maxim 20 de caractere utile;
    • numar masina, sir de caractere format din 8 caractere utile(de forma JJNNNLLL; J - Judet, N - Numar, L - Litera);
    • locatia curenta pe harta, salvata ca doua numere reale cu precizie dubla;
    • numarul de curse efectuate de catre sofer, intreg fara semn;
    • informatii despre toate cursele efectuate, vector de referinte pe structura de mai jos.
  • Structura Curse ce va avea urmatoarele campuri:
    • locatie inceput cursa, salvata ca doua numere reale cu precizie dubla;
    • starea cursei reprezentata pe un byte, in care se retine: cursa anulata, cursa in desfasurare, numar stele(0→5)

Veti completa structurile din fisierul project.h

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.

Veti completa functiile allocDriver si allocDrivers din fisierul project.c

ATENTIE! Atat vectorul de soferi cat si vectorul de curse al fiecarui sofer sunt vectori de referinte!!!

Task 5 (5p)

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:

  • un intreg, reprezentand numarul de soferi;
  • un vector de numere intregi, de lungimea numarului de soferi, reprezentand numarul de curse pentru fiecare sofer;
  • apoi datele fiecarui sofer:
    • numele;
    • numarul masinii;
    • locatia curenta pe harta;
    • si detaliile pentru fiecare cursa a acestuia:
      • locatia de start;
      • starea.

Functia va returna vectorul de soferi, iar numarul de soferi va fi returnat prin intermediul unui parametru.

Afisarea 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:

  • numele;
  • numarul masinii;
  • locatia curenta pe harta;
  • si detaliile pentru fiecare cursa a acestuia:
    • locatia de start;
    • starea.

Veti completa functiile readDrivers si printDrivers din fisierul project.c

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.

Veti completa functia maxRatingDriverName din fisierul project.c

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.

Veti completa functia getClosestDrivers din fisierul project.c

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.

Veti completa functiile freeDriver si freeDrivers din fisierul project.c

Punctaj

  • [40p] Teste
  • [5p] Fișier README în care să se descrie implementarea

TOTAL: 50p

Listă depunctări

  • o temă care nu compilează și nu a rulat pe 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]: functii mai lungi de 100 de linii
  • [-0.5]: folosirea de 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 V2.vmchecker, cursul Programarea Calculatoarelor (CB & CD).

Găsiți arhiva cu checker-ul si scheletul temei aici.

Formatul arhivei care va fi incarcata pe platforma de testare a temelor va fi următorul:

  1. fișierele project.c, include/project.h.
  2. Un fișier README în care vă descrieți rezolvarea fiecărui task.

  1. Arhiva trebuie să fie de tipul ZIP si sa contina toate fisierele mentionate IN RADACINA ARHIVEI.

programare/teme_2019/tema4_2019_cbd.1572727582.txt.gz · Last modified: 2019/11/02 22:46 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