This shows you the differences between two versions of the page.
programare:laboratoare:lab12cb [2014/01/12 16:31] bogdan.nicula [Parametrii liniei de comandă] |
programare:laboratoare:lab12cb [2014/01/13 20:38] (current) bogdan.nicula [Tools] |
||
---|---|---|---|
Line 50: | Line 50: | ||
- | ==== Enuntul laboratorului ==== | + | ===== Enuntul laboratorului ===== |
- | + | ||
- | ---- | + | |
Vom simula baza de date a unui laborator de analize. O parte din aceasta va fi deja implementata, iar voi trebuie doar sa aduceti imbunatatiri codului deja-existent. | Vom simula baza de date a unui laborator de analize. O parte din aceasta va fi deja implementata, iar voi trebuie doar sa aduceti imbunatatiri codului deja-existent. | ||
- | === Structura bazei de date === | ||
- | ---- | + | Baza de date va avea urmatoarea structura: |
Se dau urmatoarele 2 tipuri: | Se dau urmatoarele 2 tipuri: | ||
Line 65: | Line 63: | ||
Reprezinta un pacient. Campurile acestei structuri sunt: | Reprezinta un pacient. Campurile acestei structuri sunt: | ||
- | * id - sir de forma Nume, Prenume (de ex. Ion,Ion), alocat static (31 octeti) | + | * nume - sir de forma Nume, Prenume (de ex. Ion,Ion), alocat static (31 octeti) |
- | * ocup – reprezinta ocupatia persoanei (de ex. muncitor | student | casnica etc.), alocat static(21 octeti) | + | * ocupatie – reprezinta ocupatia persoanei (de ex. muncitor | student | casnica etc.), alocat static(21 octeti) |
- | * cj – sir de 15 caractere : primele 13 - cnp, ultimele 2 – judetul de domiciliu (de ex. 1870120400423BV), alocat static | + | * cod_identif – sir de 15 caractere : primele 13 - cnp, ultimele 2 – judetul de domiciliu (de ex. 1870120400423BV), alocat static |
- | * gs – grupa sanguina | + | * grupa_sanguina – grupa sanguina |
- | * aa – adresa la care se vor memora valori intregi reprezentand rezultate analize medicale standard (este initializata de functia de alocare spatiu) | + | * analize – adresa la care se vor memora valori intregi reprezentand rezultate analize medicale standard (este initializata de functia de alocare spatiu) |
<code c> | <code c> | ||
typedef struct | typedef struct | ||
- | { char id[30], ocup[21], cj[17]; | + | { char nume[30], ocupatie[14], cod_identif[16]; |
- | int gs, *aa; /* adresa vector rez.analize */ | + | int grupa_sanguina, *analize; /* adresa vector rez.analize */ |
- | } Pers, *APers; | + | } Pers; |
</code> | </code> | ||
Line 84: | Line 82: | ||
Reprezinta baza de date. Campurile acestei structuri sunt: | Reprezinta baza de date. Campurile acestei structuri sunt: | ||
- | * a1 – adresa vector de elemente de tip Pers, alocat dinamic initial | + | * vect_pers – adresa vector de elemente de tip Pers, alocat dinamic initial |
- | * a2 – adresa de sfarsit a spatiului alocat pt.vector | + | * nr_pers_curent – numar curent persoane (<= cu nr.maxim de persoane ce pot exista in vector) |
- | * nc – numar curent persoane (<= cu nr.maxim de persoane ce pot exista in vector) | + | * nr_analize – numar de analize medicale |
- | * na – numar de analize medicale | + | * nr_pers_max - numar maxim de persoane |
- | * max_size - numar maxim de persoane | + | * vect_analize – adresa unui vector in care sunt pastrate valorile intregi reprezentand rezultatele analizelor medicale standard pentru numarul maxim de persoane din grup |
- | * a3 – adresa unui vector in care sunt pastrate valorile intregi reprezentand rezultatele analizelor medicale standard pentru numarul maxim de persoane din grup | + | |
- | <note>adresa la care se gasesc analizele persoanei cu indice i (i >= 0) din grupul cu adresa x este (x->a3 + i * x->na)</note> | + | <note>adresa la care se gasesc analizele persoanei cu indice i (i >= 0) din DB-ul cu adresa x este (x->vect_analize + i * x->nr_analize)</note> |
<code c> | <code c> | ||
typedef struct | typedef struct | ||
- | { Pers *a1, *a2; /* adrese vector pers */ | + | { Pers *vect_pers; /* adrese vector pers */ |
- | int nc, na, *a3; | + | int nr_pers_curent, nr_analize, *vect_analize; |
- | int max_size; | + | int nr_pers_max; |
- | } DB, *ADB; | + | } DB, *ADB; |
</code> | </code> | ||
+ | <note> ADB este echivalent cu *DB </note> | ||
Aici aveti o imagine a structurii bazei de date: | Aici aveti o imagine a structurii bazei de date: | ||
+ | |||
+ | (am notat: a3-vect_analize, a1-vect_pers, aa-analize) | ||
{{:programare:laboratoare:structura2.png?nolink|}} | {{:programare:laboratoare:structura2.png?nolink|}} | ||
- | === Tools === | + | ==== Tools ==== |
---- | ---- | ||
Line 116: | Line 115: | ||
<code c> | <code c> | ||
/* Elibereaza spatiul alocat pentru baza de date aflata la adresa aag.*/ | /* Elibereaza spatiul alocat pentru baza de date aflata la adresa aag.*/ | ||
- | void Elib(ADB* aag); | + | void elibereaza(ADB* aag); |
/* Afiseaza baza de date aflata la adresa ag */ | /* Afiseaza baza de date aflata la adresa ag */ | ||
- | void Afi(DB *ag); | + | void afiseaza(DB *ag); |
/* Aloca spatiu pentru o baza de date cu maximum MP persoane si NA analize. */ | /* Aloca spatiu pentru o baza de date cu maximum MP persoane si NA analize. */ | ||
- | ADB Aloc(int MP, int NA); | + | ADB aloca(int MP, int NA); |
/* Scrie baza de date aflata la adresa ag in fisierul binar filename. */ | /* Scrie baza de date aflata la adresa ag in fisierul binar filename. */ | ||
Line 132: | Line 131: | ||
</code> | </code> | ||
- | De aici {{:programare:laboratoare:lab12cb.zip|}} puteti descarca scheletul laboratorului. | + | De aici {{:programare:laboratoare:lab12_schelet.zip|}} puteti descarca scheletul laboratorului. |
El contine fisierele: | El contine fisierele: | ||
Line 140: | Line 139: | ||
* in.txt : Fisier text de test | * in.txt : Fisier text de test | ||
* in.bin : Fisier binar de test | * in.bin : Fisier binar de test | ||
+ | * Makefile | ||
- | <note>Este suficient sa compilati fisierul main.c </note> | + | <note>Pentru compilare puteti rula make build. In urma acesteia va rezulta executabilul lab12. Acesta il puteti testa cu fisierul text in.txt: "./lab12 in.txt"</note> |
- | === Cerinte Laborator === | + | ===== Cerinte Laborator ===== |
- | ---- | ||
- [2p] Scrieti o functie de afisare selectiva a coloanelor din baza de date. Aceasta va interoga userul(stdin) cu privire la coloanele care trebuiesc afisate si ordinea lor, si apoi le va afisa doar pe acestea, in ordinea specificata. | - [2p] Scrieti o functie de afisare selectiva a coloanelor din baza de date. Aceasta va interoga userul(stdin) cu privire la coloanele care trebuiesc afisate si ordinea lor, si apoi le va afisa doar pe acestea, in ordinea specificata. | ||
- | - [2.5p] Scrieti functiile: <code c> | + | - [4p] Scrieti functiile: <code c> |
/*Citeste o baza de date dintr-un fisier binar. | /*Citeste o baza de date dintr-un fisier binar. | ||
Se ocupa si de alocarea spatiului pentru baza de date si vectorii de persoane si de analize. */ | Se ocupa si de alocarea spatiului pentru baza de date si vectorii de persoane si de analize. */ | ||
Line 159: | Line 158: | ||
int writeToText(char *filename, DB *ag) | int writeToText(char *filename, DB *ag) | ||
</code>Folositi ca modele functiile **writeToBinary**, respectiv **readFromText**. Pentru functia **readFromBinary** tineti cont de faptul ca pentru fiecare persoana vectorul de analize(aa) va trebui sa pointeze catre o zona din vectorul a3 al bazei de date. | </code>Folositi ca modele functiile **writeToBinary**, respectiv **readFromText**. Pentru functia **readFromBinary** tineti cont de faptul ca pentru fiecare persoana vectorul de analize(aa) va trebui sa pointeze catre o zona din vectorul a3 al bazei de date. | ||
- | - [3.5p] Modificati functia main astfel incat programul vostru sa poata fi apelat astfel:<code> | + | - [2p] Modificati functia main astfel incat programul vostru sa poata fi apelat astfel:<code> |
./executabil nume_fis_intrare nume_fis_iesire | ./executabil nume_fis_intrare nume_fis_iesire | ||
Line 172: | Line 171: | ||
- | == Bonus == | + | ===== Bonus ===== |
- | ---- | ||
- [2p] Scrieti o functie care va unifica 2 baze de date, le va sorta dupa nume si le va salva intr-un fisier. | - [2p] Scrieti o functie care va unifica 2 baze de date, le va sorta dupa nume si le va salva intr-un fisier. |