Sunteți pe pagina 1din 12

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra:Informatica Aplicata

RAPORT
Lucrarea de laborator Nr.7
La Programarea Calculatoarelor

A efectuat:

st. Gr. SI-162


Morcotilo Nichita

A verificat:

dr., conf.univ.
M. Kulev

Chiinu 2016

Lucrare de laborator Nr.6


Tema: Prelucrarea tabloului de structuri in limbajul C.
[1] Scopul lucrarii: Studierea regulilor de definire si utilizare a structurilor de date;Crearea
variabilelor de tip structura,accesarea componentelor unei structuri;Scriere si utilizarea funciilor
pentru prelucrarea structurilor si a tabloului de structuri; Alctuirea programului cu mai multe
functii cu afiarea menu-ului de opiuni pe ecran.
Sarcina de lucru: Sarcina: De eloborat un program pentru prelucrarea unui tablou de
structuri (dupa varianta), utilizind cel putin 5 cimpuri (membrii structure) cu afisarea meniu-ului
de optiuni pe ecran.
Varianta 9:
Mersul lucrrii:
Notiuni principale din teorie i metode folosite:[2]
Structuri:
In C, un sir de caractere poate fi definit ca un vector de caractere, in doua moduri:
Structurile sunt o facilitate oferit de limbajul C pentru a organiza mai bine datele cu care lucreaz
programele. Dac funciile ne permit s organizm mai bine codul, structurile ne permit s
organizm mai bine datele.

Structura este o mulime de date grupate, conform unei ierarhii, de obicei de tipuri diferite.
Structura poate fi comparat cu tabloul, ns tabloul conine date de un acelai tip, iar elementele
tabloului se acceseaz cu ajutorul indicilor, pe cnd accesarea componentelor structurii are o
form specific. Structura reprezint un tip de date definit de utilizator prin utilizarea tipurilor
deja existente.
Ex.: Utilizind instructiunea typedef si specificator de structura struct putem defeni structura si un
nou tip de date student:
typedef struct student
{ // definirea cimpurilor (membrilor) structurii
char nume[50];
int nr;
float nm;
} student;
Elementele structurii pot fi de tip predefinit sau definit de utilizator, excepie fiind tipul structurii
date. Pentru definirea variabilelor este suficient utilizarea numelui de structur la fel ca tipurile
predefinite: student s1, s2, s[10], *p;

n acest caz s-au definit dou variabile de tip carte, un tablou din 10 cri i un pointer spre
student.
Referirea la componentele unei structuri se face utiliznd att numele structurii ct i a
componentei respective. Aceasta se realizeaz printr-o construcie de forma:
s1.nm = 9.5;
s[i].nm = 8.5;
n cazul pointerilor:
p = &s1;
p->nm = 9.5;
O variabil structur poate fi iniializat la declarare prin precizarea ntre {} a valorilor
cmpurilor; cele neprecizate sunt implicit 0.De asemenea,o varibila structura poate fi transmisa
ca argument efectiv la apelarea unei funcii sau poate fi primita ca rezultat al unei funcii, ntr-o
instruciune return.
Un avantaj important al utilizrii structurilor este c atunci cnd atribuim o variabil de tip
structur unei alte variabile de acelai tip, se copiaz automat toate cmpurile structurii.
n limbajul C putem specifica pentru cmpurile de tip int sau char dimensiunea n bii pe care
s o ocupe. Dimensiunea n bii se specific plasnd imediat dup definirea cmpului
caracterul : urmat de numrul de bii pe care dorim s l ocupe cmpul.
Exemplu:
struct data_biti
{
unsigned int zi : 5;
unsigned int luna : 4;
int an : 15;
};

Dac urmrim (cu ajutorul operatorului sizeof) dimensiunea ocupat de structura redefinit astfel,
vom vedea c este ntradevr de 3 octei.
Principalele avantaje ale utilizrii unor tipuri structur sunt:

Programele devin mai explicite dac se folosesc structuri n locul unor variabile separate.
Se pot defini tipuri de date specifice aplicaiei iar programul reflect mai bine universul
aplicaiei.

Se poate reduce numrul de parametri al unor funcii prin gruparea lor n parametri de
tipuri structur i deci se simplific utilizarea acelor funcii.

Se pot utiliza structuri de date extensibile, formate din variabile structur alocate dinamic
i legate ntre ele prin pointeri (liste nlnuite, arbori .a).

Uniuni:
O uniune este o variabil ce poate stoca la momente diferite obiecte de tipuri i dimensiuni
diferite. Mai explicit, la un moment dat poate fi utilizat (citit, scris, copiat) doar unul din
cmpurile uniunii.
union tip_var{
int i;
float f;
char *s;
} valoare;

Variabilei var_u i se va aloca suficient memorie pentru a putea stoca cel mai voluminos cmp
al su. Este responsabilitatea programatorului s urmreasc ce cmp este stocat n uniune la
momentul curent. Acest lucru se face prin intermediul unei variabile auxiliare, care de regul
formeaz o structur mpreun cu uniunea.
Accesul la cmpurile unei uniuni (citire, atribuire, etc) se face la fel ca i n cazul
structurilor: var_u.f sau ptr_u->f n cazul unui pointer la uniune.
Asupra unei uniuni se pot efectua aceleai operaii ca i asupra unei structuri.
Iniializarea uniunii se va face ntotdeauna cu o valoare de tipul primului su membru.
Fisiere:
Un fiier este o structur dinamic, situat n memoria secundar (pe disk-uri). Limbajul C
permite operarea cu fiiere:

de tip text - un astfel de fiier conine o succesiune de linii, separate prin NL ('\n')
de tip binar - un astfel de fiier conine o succesiune de octeti, fr nici o structur.

Prelucrarea unui fiier presupune asocierea acestuia cu un canal de I/E (numit flux sau stream).
Exist trei canale predefinite, care se deschid automat la lansarea unui program:
stdin - fiier de intrare, text, este intrarea standard - tastatura
stdout - fiier de iesire, text, este ieirea standard - ecranul monitorului.
stderr fiier de iesire, text, este ieirea standard unde sunt scris mesajele de eroare

ecran.
Pentru a prelucra un fiier, trebuie parcurse urmtoarele etape:

se definete o variabil de tip FILE * pentru accesarea fiierului; FILE * este un tip

structur definit n stdio.h, care conine informaii referitoare la fiier i la tamponul de


transfer de date ntre memoria central i fiier (adresa, lungimea tamponului, modul de
utilizare a fiierului, indicator de sfrsit, de poziie n fiier)
se deschide fiierul pentru un anumit mod de acces, folosind funcia de bibliotec fopen,
care realizeaz i asocierea ntre variabila fiier i numele extern al fiierului
se prelucreaz fiierul n citire/scriere cu funciile specifice

se inchide fiierul folosind funcia de bibliotec fclose.

FILE *fopen(const char *nume_fis, const char *mod);

Returneaz pointer la fiier sau NULL dac fiierul nu poate fi deschis; valoarea returnat
este memorat n variabila fiier, care a fost declarat pentru accesarea lui.

Modul de deschidere poate fi:


r - readonly , este permis doar citirea dintr-un fiier existent
w - write, creaz un nou fiier, sau dac exist deja, distruge vechiul continut
a - append, deschide pentru scriere un fiier existent ( scrierea se va face n continuarea
informaiei deja existente n fiier, deci pointerul de acces se plaseaz la sfritul fiierului )

+ - permite scrierea i citirea - actualizare (ex: r+, w+, a+). O citire nu poate fi

direct urmat
de o scriere i reciproc. nti trebuie repoziionat cursorul de acces printr-un apel la fseek.

Analiza functiilor:
void addrecord(FILE *f):
a)Parametrii de apel :
f-pointer la fisier;
b)Valoarea returnata:
Nu este returnata nici o valoare.
Functia adauga o inregistrare noua dupa idul dorit la sfirsitul fisierului.In cazul in care idul
exista,ne afiseaza avertizare.

void deleterecord(FILE *f):


a)Parametrii de apel:
f-pointer la fisier;
b)Valoarea returnata:
Nu este returnata nici o valoare.
Functia sterge o inregestriare dupa idul dorit,transformind inregistrea intro inregistrare de tip
blank: imobil imobilblank={0,"","","",0,0}; In cazul in care idul nu exista(este introdus ID
0),functia ne afiseaza o avertizare.

void exportbd(FILE *file)


a)Parametrii de apel:
f-pointer la fisier;
b)Valoarea returnata:
Nu este returnata nici o valoare.
Functia exporteaza toata baza de date intr-un fisier de tip txt,citibil pentru utlizator.
FILE* saveData(FILE *f)
a)Parametrii de apel:
f-pointer la fisier;
b)Valoarea returnata:
pointer la fisier;
Functia rederectioneaza streamul deschis la un alt fisier,pentru a salva datele introduse prin
functia : freopen;
int main():
a)date intermediare:
f-pointer la fisier;
nm-variabila de tip integer,optiunea a meniului.

Textul programului in limbajul C:[3]


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define bd "bd.dat"
typedef struct imobil
{ int id;
char denumirea[40];
char adresa[40];
char proprietar[40];
int nrcamere;
float cost;
}imobil;

FILE* saveData(FILE *f){


FILE *r;
r = freopen(bd, "rb+", f);
return r;
}
void afisaremmenu(){
puts("Retea de imobile Chisinau BD:");
puts("Selectati optiunea dorita:");
puts("(1) Afiseaza toate apartamente pentru vinzare:");
puts("(2) Adauga apartament pentru vinzare:");
puts("(3) Sterge apartament din vinzare:");
puts("(4) Export BD in txt");
puts(" (0) pentru a iesi din aplicatie");
}
void exportbd(FILE *file){
FILE *write;
imobil imobilprint;
write=fopen("bazaimobil.txt","w");
rewind(file);
fprintf(write,"%-6s%-12s%-12s%-12s%-15s%-12s\n","ID"," Denumirea Complexului","
Adresa"," Proprietar"," Numar Camere"," Cost");
fread(&imobilprint,sizeof(imobil),1,file);
while(!feof(file)){
if(imobilprint.id!=0){
fprintf(write,"%-7d%-12s%-12s%-14s%-15d%20.2f\n",imobilprint.id,imobilprint.denumirea,imobilprint.adresa,imobilprint.proprietar,
imobilprint.nrcamere,
imobilprint.cost);}
fread(&imobilprint,sizeof(imobil),1,file);
}
fclose(write);

void afisarebd(FILE *f){


imobil imobilprint;
//printf("%-6d%-12s%-12s%-12s%-6d%-6.2f")

printf("%-6s%-12s%-12s%-12s%-15s%-12s\n","ID"," Denumirea Complexului"," Adresa","


Proprietar"," Numar Camere"," Cost");
fread(&imobilprint,sizeof(imobil),1,f);
while(!feof(f)){
if(imobilprint.id!=0)
printf("%-7d%-12s%-12s%-14s%-15d%20.2f\n",imobilprint.id,imobilprint.denumirea,imobilprint.adresa,imobilprint.proprietar,
imobilprint.nrcamere,
imobilprint.cost);
fread(&imobilprint,sizeof(imobil),1,f);
}
rewind(f);
}
void deleterecord(FILE *f){
imobil imobildel;
imobil imobilblank={0,"","","",0,0};
int aNum;
printf("Dati id pentru stergere\n");
scanf("%d",&aNum);
fseek(f,(aNum-1)*sizeof(imobil),SEEK_SET);
fread(&imobildel,sizeof(imobil),1,f);
if(imobildel.id==0){
printf("aceasta inscriere nuu exista");
return;
}else{
fseek(f,(aNum-1)*sizeof(imobil),SEEK_SET);
fwrite(&imobilblank,sizeof(imobil),1,f);
printf("Stergere realizata cu succes!");
}
return ;
}

void addrecord(FILE *f){


imobil imobiladd;
int idd;
int choice=0;
while(choice==0){
printf("dati id care doriti sa introduceti");
scanf("%d",&idd);
fseek(f,(idd-1)*sizeof(imobil),SEEK_SET);
fread(&imobiladd,sizeof(imobil),1,f);
if(imobiladd.id==idd){

printf("nu putem adauga acest user\n");


getchar();
return ;
}else{
printf("Dati denumirea,adresa,proprietarul,nrcamere si costul\n");
scanf("%s%s%s%d
%f",&imobiladd.denumirea,&imobiladd.adresa,&imobiladd.proprietar,&imobiladd.nrcamere,&i
mobiladd.cost);
imobiladd.id=idd;
fseek(f,(idd-1)*sizeof(imobil),SEEK_SET);
fwrite(&imobiladd,sizeof(imobil),1,f);
printf("Doriti sa stopati adaugarea?tastati 1");
scanf("%d",&choice);
}

}
}
int main()
{
FILE *f;
int nm=10;
f=fopen(bd,"rb+");
if(f==NULL){
printf("Fisierul nu poate fi deschis...");
return 1;
}
while(nm!=0)
{
afisaremmenu();
scanf("%d",&nm);
switch(nm){
case 1:
afisarebd(f);
f=saveData(f);
break;
case 2:
addrecord(f);
f=saveData(f);
break;
case 3:
deleterecord(f);
f=saveData(f);
break;
case 4:

exportbd(f);
break;
case 0:
puts("va multumim ca ati folosit aplicatia noastra!");
}

}
}

Analiza rezultatelor si concluzii:[3]


1. Verificarea ne arata ca rezultatele obtinute sunt corecte si programul lucreaza corect.
2. Au fost obtinute primele deprinderi pentru scrierea unui program de prelucrare
structurilor de date si lucru cu fisiere
3. Am aplicat cunostintele obtinute anterior pentru a elabora un program mult mai complex.
4. Am importat /exportat datele din fisiere pentru a salva rezultatele.
AVANTAJE:
1. Introducerea structurilor de date este limitata doar de memoria disponibila a HDD.
2. Programul contine functii,ceea ce ne va permite sa modificam programul mai usor dupa
dorinta sau sa adaugam alte functii pentru modificarea bazai de date.
3. Toate inregistrarile sunt pastrate in fisier,ceea ce ne permite sa nu mai introducem date
din nou.

DEZAVANTAJE:

1. Pot aparea exceptii in urma introducerii stringurilor cu whitespace.


2. Nu exista import din fisier txt in fisier binar.
3. In cazul stergerii unei inregistrati din mijloc,celelalte isi pastreaza ordinea si nu isi
schimba indicile cu i-1.

Bibliografie:
1. Culegerea de probleme pentru laborator.
2 The C Programming Language, Brian Kernighan and Dennis R ;
3. Conspectul prelegerilor cursului Programarea Calculatoarelor pentru studeni gr.,
SI-162. Lector: dr., conf. univ. M.Kulev. Chiinu, UTM,2016

S-ar putea să vă placă și