Limbaje de programare: Laborator 12

La intrarea în laborator trebuie predată tema 12.

Structuri

  1. Definiți un tip structură pentru o dată calendaristică (zi, lună, an, cu luna în format numeric). Scrieți: În toate funcțiile țineți cont de ani bisecți.
  2. 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: 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):
  3. 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