Programarea Calculatoarelor 2 - Laborator 9

Implementați programul sort care sortează liniile unui text citit de la intrarea standard afișând rezultatul la ieșirea standard.
Opțional, se pot da în orice ordine pe linia de comandă argumentele: De exemplu, dacă liniile de la intrare au conținutul: Prenume,Nume,Media atunci sort -t, -k2 va sorta liniile alfabetic după nume.
Programul nu va limita nici numărul de linii de sortat, nici lungimea acestora.

Indicații: Folosiți funcția standard qsort (declarată în stdlib.h), pentru care scrieți funcțiile de comparație necesare.
Pentru despărțirea în câmpuri puteți folosi repetat funcția strchr (declarată în string.h).
La sortare, puteți considera că sfărșitul de linie (caracterul '\n') face parte din linie sau nu. (Interpretarea în standarde variază).
Programul va citi în memorie întregul conținut de sortat, până la EOF. Tabloul conținând pointeri la liniile de text va fi alocat dinamic, crescând dimensiunea la nevoie prin realocare (vezi exemplul din curs pentru sortarea unui tablou de întregi). Puteți folosi funcția getline care citește o linie de lungime nelimitată, alocând dinamic memorie (scrisă la curs, sau în altă implementare).

Considerații opționale
Există și o funcție (nestandard) getline implementată ca extensie în bibliotecile GNU, dar cu alți parametri, vezi pagina de manual.

Alternativ, puteți citi fișierul cu fread (de ex. pe blocuri multipli de un sector), și apoi să-i parcurgeți conținutul în memorie pentru a determina pozițiile de sfârșit de linie. (Acestea ar putea fi înlocuite în memorie cu '\0', mai ales dacă programul nu consideră '\n' ca fiind parte din linie la sortare).

Pentru a evita prelucrarea unei linii de fiecare dată când ea este comparată (de ex. căutarea câmpului) se poate încerca prelucrarea prealabilă a fiecărei linii, după opțiunile date pe linia de comandă. Pentru aceasta, s-ar putea reține pentru fiecare linie o structură care conține un pointer la linie și informații despre câmpul de sortare (de exemplu pointerul de început și lungimea). Funcțiile de comparare ar lucra cu structurile astfel definite.

Implementați și sortarea după un câmp cu valoare numerică. Citiți cu info sort documentația detaliată pentru opțiunile -g și -n și eficiența conversiei numerice. Implementați o funcție care compară două numere (întregi sau reale) fără conversie, folosind reprezentarea lor externă ca șiruri, inclusiv pentru "numere lungi", care depășesc precizia de memorare a tipurilor numerice standard.


Marius Minea
Last modified: Wed Dec 1 18:47:05 EET 2004