Table of Contents

Tema 4 – Pregătire Examen

Responsabili

Depunctări

Deadline-ul hard coincide cu cel soft.
În consecință, 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 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

Obiective

Introducere

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

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.

Încălzire

Task 1 (5p)

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.

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

Exemplu:

Input:

4
1 2 3 4

Output:

24 12 8 6

Task 2 (5p)

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.

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

Exemplu:

Input:

3
1 2 3
4 5 6
7 8 9

Output:

3 6 9
2 5 8
1 4 7

Task 3 (5p)

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.

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

0 ⇐ x1, x2 < nrLinii; 0 ⇐ y1, y2 < nrColoane

Exemplu:

Input:

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

Output:

18 23 54

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:

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

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:

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

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.

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

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ă.

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

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.

Veți completa funcțiile freeDriver si freeDrivers din fișierul project.c

Punctaj

TOTAL: 50p

Listă depunctări

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.