Differences

This shows you the differences between two versions of the page.

Link to this comparison view

programare:laboratoare:lab12cb [2014/01/12 15:59]
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 ncna, *a3+    int nr_pers_curentnr_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 ===
 + 
 +----
  
 Aveti deja implementate urmatoarele functii: Aveti deja implementate urmatoarele functii:
Line 111: 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 127: 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 === 
  
-  - [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>+===== 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 144: 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>​ +
-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.  +
-</​note>​ +
- +
-  - [3.5p] 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
-</​code>​ +</​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>​
- +
-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>​ +
 ./​executabil in.txt out.bin ./​executabil in.txt out.bin
-</​code>​+</code> Programul va citi baza de date dintr-un fisier text si o va salva intr-un fisier binar. 
 +  - [2p] Scrieti functia:<​code c>
  
-Programul va citi baza de date dintr-un fisier text si o va salva intr-un fisier binar.+int insertUser(DB *ag)
  
-  - [2p] Scrieti functia: +</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.
-<​code ​c>+
  
-int insertUser(DB *ag) 
  
-</​code>​+===== Bonus =====
  
-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. 
  
  
-== 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.
 <code c> <code c>
programare/laboratoare/lab12cb.1389535175.txt.gz · Last modified: 2014/01/12 15:59 by bogdan.nicula
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0