This shows you the differences between two versions of the page.
programare:laboratoare:lab12cb [2014/01/12 15:41] bogdan.nicula [Enuntul laboratorului] |
programare:laboratoare:lab12cb [2014/01/13 20:38] (current) bogdan.nicula [Tools] |
||
---|---|---|---|
Line 48: | Line 48: | ||
- | ---- | ||
- | ==== 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 62: | 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 81: | 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: | ||
- | {{:programare:laboratoare:structura.png?nolink|}} | + | (am notat: a3-vect_analize, a1-vect_pers, aa-analize) |
+ | {{:programare:laboratoare:structura2.png?nolink|}} | ||
- | === Tools === | + | ==== Tools ==== |
+ | |||
+ | ---- | ||
Aveti deja implementate urmatoarele functii: | Aveti deja implementate urmatoarele functii: | ||
Line 112: | 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 128: | Line 131: | ||
</code> | </code> | ||
+ | De aici {{:programare:laboratoare:lab12_schelet.zip|}} puteti descarca scheletul laboratorului. | ||
- | ---- | + | El contine fisierele: |
+ | * main.c : Fisierul principal, in care veti face modificari. | ||
+ | * utils.c : Fisierul cu functii utile(alocare, eliberare si afisare) | ||
+ | * database.h: Header | ||
+ | * in.txt : Fisier text de test | ||
+ | * in.bin : Fisier binar de test | ||
+ | * Makefile | ||
+ | <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 === | ||
- | - [2.5p] Scrieti functiile: | ||
- | <code c> | + | |
+ | |||
+ | ===== 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. | ||
+ | - [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 142: | Line 157: | ||
/* Scrie intr-un fisier text baza de date salvata la adresa ag. */ | /* Scrie intr-un fisier text baza de date salvata la adresa ag. */ | ||
int writeToText(char *filename, DB *ag) | int writeToText(char *filename, DB *ag) | ||
- | </code> | + | </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. |
+ | - [2p] Modificati functia main astfel incat programul vostru sa poata fi apelat astfel:<code> | ||
- | <note> | + | ./executabil nume_fis_intrare nume_fis_iesire |
- | Folositi ca modele functiile **writeToBinary**, respectiv **readFromText**. | + | </code> Programul va extrage baza de date din fisierul de intrare si o va salva in fisierul de iesire tinand cont de formatul numelui celor 2 fisiere.(Se presupune ca va fi testat doar pe fisiere cu extensie ".txt", pentu text, ".bin" pentru binar). Spre exemplu, pentru apelul:<code> |
- | 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. | + | ./executabil in.txt out.bin |
- | </note> | + | </code> Programul va citi baza de date dintr-un fisier text si o va salva intr-un fisier binar. |
+ | - [2p] Scrieti functia:<code c> | ||
- | - [2.5p] Modificati functia main astfel incat programul vostru sa poata fi apelat astfel: | + | int insertUser(DB *ag) |
- | <code> | + | </code> Aceasta va verifica daca se mai poate introduce o persoana in baza de date(nc < max_size). Daca da, va prelua de la stdin(tastatura) credentialele acelei persoane si le va introduce in baza de date. Daca nu, va afisa un mesaj. |
- | ./executabil nume_fis_intrare nume_fis_iesire | + | |
+ | ===== Bonus ===== | ||
+ | |||
+ | |||
+ | |||
+ | - [2p] Scrieti o functie care va unifica 2 baze de date, le va sorta dupa nume si le va salva intr-un fisier. | ||
+ | <code c> | ||
+ | |||
+ | int mergeDB(DB *a, DB *b, char *filename) | ||
</code> | </code> | ||
- | Programul va extrage baza de date din fisierul de intrare si o va salva in fisierul de iesire tinand cont de formatul celor 2 fisiere. | + | <note>**filename** poate specifica un fisier binar, sau un fisier text.</note> |
- | Spre exemplu: | + |