This is an old revision of the document!


Tema 4 – Pregătire 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 însușească cunoștințele necesare pentru examen
  • sa se înțeleagă si sa se utilizeze operații cu vectori de referințe

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.

Cerința

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.

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.

Încălzire

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.

Veți completa funcția arrayProduct din fișierul project.c

Exemplu:

Input:

1 2 3 4

Output:

24 12 8 6

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.

Veți completa funcția rotateMatrix din fișierul 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 î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.

Veți completa funcția subMatrixesSums din fișierul 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 îl alege, 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 Șofer ce va avea următoarele câmpuri:
    • nume, reprezentat ca sir 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);
    • locația curenta pe harta, salvata ca doua numere reale cu precizie dubla;
    • 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.
  • Structura Curse ce va avea următoarele câmpuri:
    • locație început cursa, salvata ca doua numere reale cu precizie dubla;
    • starea cursei reprezentata pe un byte, in care se retine: cursa anulata, cursa in desfășurare, număr stele(0→5)

Veți completa structurile din fișierul project.h

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.

Veți completa funcțiile allocDriver si allocDrivers din fișierul project.c

ATENTIE! Atât vectorul de șoferi cat si vectorul de curse al fiecărui șofer sunt vectori de referințe!!!

Task 5 (5p)

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:

  • 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;
  • apoi datele fiecărui șofer:
    • numele;
    • numărul mașinii;
    • locația curenta pe harta;
    • si detaliile pentru fiecare cursa 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 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:

  • numele;
  • numărul mașinii;
  • locația curenta pe harta;
  • si detaliile pentru fiecare cursa a acestuia:
    • locația de start;
    • starea.

Veți completa funcțiile readDrivers si printDrivers din fișierul project.c

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.

Veți completa funcția maxRatingDriverName din fișierul project.c

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.

Veți completa funcția getClosestDrivers din fișierul project.c

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.

Veți completa funcțiile freeDriver si freeDrivers din fișierul 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]: funcții 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 încărcata 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 conțină toate fișierele menționate IN RADACINA ARHIVEI.

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