Limbaje de programare: Laborator 12
La intrarea în laborator trebuie predată tema 12.
Structuri
- Definiți un tip structură pentru o dată calendaristică
(zi, lună, an, cu luna în format numeric). Scrieți:
- o funcție care ia ca parametru o dată și returnează câte zile
au trecut de la începutul anului (pentru 1 ianuarie: 1 zi)
- o funcție care ia ca parametru două date și returnează numărul de zile dintre ele (zero pentru date identice)
- o funcție care ia ca parametru o dată și un număr și returnează data aflată la acel număr de zile distanță (în trecut pentru număr negativ)
În toate funcțiile țineți cont de ani bisecți.
- Scrieți un program care prelucrează un fișier în care
informația din fiecare linie de text e structurată în câmpuri reprezentate pe un număr fix de caractere.
Programul va prelucra rezultatele unei curse de alergare1 . După cum indică antetul, ele conțin:
- locul în clasament, de la caracterul 0 al liniei
- numele complet, de la caracterul 8, pana la max. 31
- numele echipei, de la caracterul 32 pana la max. 47
- timpul obținut, de la caracterul 48, in format mm:ss
- eventual un comentariu până la sfârșitul liniei (poate fi ignorat)
Definiți o structură cu aceste 4 câmpuri, și citiți din fișier rezultatele într-un tabel de structuri (se poate citi până la o limită, de exemplu 100 de participanți, sau pentru o soluție completă, se poate realoca dinamic tabloul). După citire, realizați una din următoarele prelucrări (fiecare ia ca parametru tabloul de structuri și lungimea lui):
- Afișați clasamentul, indicând pentru fiecare participant și diferența de timp față de primul și/sau față de cel anterior
- Pentru echipele cu cel puțin trei participanți, afișați media timpilor primilor trei clasați din echipă.
- Fiind dat un nume de echipă, creați prin alocare dinamică un tablou cu adresele structurilor tuturor participanților din echipă, încheiat cu adresa NULL. Scrieți o funcție care afișează media timpilor dintr-un astfel de tabel.
- Scrieți un program care prelucrează un fișier text
reprezentând un graf
în format DOT.
În cazul cel mai simplu, pentru un graf orientat, fișierul începe cu cuvândul cheie digraph urmat de un nume pentru graf, și descrierea lui între acolade { } .
Fiecare linie conține o muchie, reprezentată prin nodul sursă și nodul destinație, în formatul nod1->nod2.
Pentru simplificare, presupunem ca numele grafului e chiar numărul N de noduri, și nodurile sunt denumite de la 0 la N-1. Atunci, descrierea
digraph 5 {
0 -> 1
1 -> 2
2 -> 3
3 -> 1
2 -> 4
}
reprezintă graful din figură.
Programul va citi un fișier în format DOT cu numele dat pe linia de comandă, va memora legăturile dintre noduri, și apoi va afișa graful, indicând pentru fiecare nod acele noduri în care se poate ajunge parcurgând o muchie.
Pentru graful din exemplu, se va tipări:
0: 1
1: 2
2: 3 4
3: 1
4:
Programul va memora pentru fiecare nod o listă de adiacență a nodurilor care sunt destinație a unei muchii pornind din el.
Fiecare element al listei conține un nod (reprezentat printr-un întreg) și un pointer la următorul element al listei (sau NULL, dacă nu mai există). Putem defini tipul:
struct elem {
int dest; // destinatia muchiei
struct elem *nxt; // pointer la următorul element
};
Programul va folosi un tablou de N pointeri reprezentând listele de
adiacență pentru fiecare din noduri; inițial, fiecare listă
e vidă, reprezentată prin pointerul NULL. La citirea fiecărei
muchii de forma src->dest, se va crea un nou
element pentru nodul dest în lista de adiacență a
nodului src. Cum ordinea elementelor din listă nu schimbă
structura grafului, noul element poate fi inserat la început: adresa
din tablou va indica noul element, iar câmpul legătură din
acesta va indica vechea listă:
nou_elem->nxt = tab[src];
tab[src] = nou_elem;
Prelucrarea se termină când nu mai poate fi citit un număr de nod indicând sursa unei noi muchii, și s-a ajuns la acolada de sfârșit } a descrierii.
Tipărirea se face parcurgând cu un pointer (atât timp cât e nenul) fiecare listă de adiacență, urmărind pointerul legătură din câmpul nxt.
1 Clasament preluat de aici, caracterele tab au fost expandate în spații. Puteți prelucra și direct sursa, ținând cont că un tab sare la următoarea poziție multiplu de 8 (pozițiile se numără de la 0).
Marius Minea
Last modified: Tue Dec 11 14:40:00 EET 2012