Documente Academic
Documente Profesional
Documente Cultură
Catedra:Atumatica si Informatica
RAPORT
Lucrarea de laborator Nr.7
La Programarea Calculatoarelor
Trofim Petru
Kulev Mihail
Chiinu 2016
Lucrare de laborator Nr.7
Varianta 5:
Mersul lucrrii:
Structuri:
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:
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.
s1.nm = 9.5;
s[i].nm = 8.5;
n cazul pointerilor:
p = &s1;
p->nm = 9.5;
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.
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:
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.
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.
+ - 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:
Meniul Principal...
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main()
{
int n;
ruta*R;
int k,f,k1,k2;
ruta ad;
char num [50];
int durata ;
char tara[50];
char compania[50];
int an;
int nm;
ruta*B;
while (1)
{
puts ("\t. **********Meniu************* :\n");
puts ("1. Alocare dinamica a tabloului:");
puts ("2. Introduce info despre ruta:");
puts ("3. Afisarea tabloului:");
puts ("4. Cautarea rutei dupa nume:");
puts ("5. Sortarea tabloului:");
puts ("6. Modificarea rutei indicata:");
puts ("7. Adaugarea la inceput:");
puts ("8. Adaugarea la sfirsit:");
puts ("9. Inserarea:");
puts ("10. Sterge ruta:");
puts ("11. Interschimbarea:");
puts ("12. Eliberarea memoriei:");
puts ("0. Iesirea din program");
printf ("Alege obtiunea:");
scanf ("%d", &nm);
switch (nm)
{ case 1:
printf ("Dati n:");
scanf ("%d", &n);
R=(ruta*) malloc (n*sizeof (*R));
if (R==NULL)
{puts("Memoria nu a fost alocata");
exit (1);}
puts ("Memoria a fost alocata");
puts ("Pentru a continua apasati Enter");
getch ();
break ;
case 2:
reads (R,n);
puts("\nTastati Enter pentru a contiuna");
getch ();
break;
case 3:
shows (R,n);
puts("\nTastati Enter pentru a contiuna");
getch ();
break;
case 4:
puts ("Dati numele rutei de cautat:");
fflush (stdin);
gets (num);
k= searchs (R,n,num);
if(k==-1)
{puts ("Ruta nu a fost gasita");}
else
scanf ("%d", &f);
if (f)
{puts ("Info despre ruta cautata: ");
printf ("%d.num :%d tara:%s an:%d compania:%s durata:
%.2f\n",k+1,R[k].num,R[k].tara,R[k].an,R[k].compania,R[k].durata);}
getch();
break ;
case 5:
sorts (R,n);
puts("De afisat info sortata?(1/0)");
scanf ("%d",&f);
if(f)
{shows (R,n);}
getch();
break;
case 6:
printf ("Dati numarul de ordine al rutei de modificat:");
scanf ("%d",&k);
modifys (R, k-1);
getch ();
break;
case 7:
printf("Dati informatie despre ruta de adaugat la inceput:\n");
printf("Nume:");
fflush (stdin);
gets (ad.num);
printf("Tara:");
fflush(stdin);
gets (ad.tara);
printf("An fond:");
scanf ("%d",&ad.an );
printf ("compania:");
fflush(stdin);
gets (ad.compania);
printf("Durata zb:");
scanf ("%d", &ad.durata);
B=appends (R,&n,ad);
if(!B)
{
case 8:
printf("Dati info despre ruta de adaugat la sfirsit:\n");
printf("Nume:");
fflush (stdin);
gets (ad.num);
printf("Tara:");
fflush(stdin);
gets (ad.tara);
printf("An fond:");
scanf ("%d",& ad.an );
printf ("compania:");
fflush(stdin);
gets (ad.compania);
printf("Durata zb:");
scanf ("%d", & ad.durata);
B=prepends (R,&n,ad);
if(B==NULL)
{
case 9:
printf ("Dati info despre ruta de inserat:\n");
printf ("Nume:");
fflush(stdin);
gets (ad.num);
printf ("Tara:");
fflush(stdin);
gets (ad.tara);
printf ("An fond:");
scanf ("%d", &ad.an);
printf ("compania:");
fflush(stdin);
gets (ad.compania);
printf ("Durata zb:");
scanf ("%d", &ad.durata);
printf("Dati locul de adaugat");
scanf ("%d",&k);
B=inserts(R,&n,ad,k-1);
if(B==NULL)
{
case 11:
printf ("Dati numerele de ordine ale elmentelor de interschimbat");
scanf ("%d%d",&k1,&k2);
swaps (R,k1-1,k2-1);
getch();
break;
case 12:
printf ("Doriti sa eliberati memoria dinamica? (1/0):");
scanf ("%d",&f);
if(f)
{ free(R);
R=NULL;
}
getch();
break;
case 13:
printf ("Doriti sa iesiti din program? (1/0):");
scanf ("%d",&f);
if(f)
{ free (R);
return 0;
default:
puts ("Alegerea obtiunea corecta");
getch();
break;
}
case 14:
puts("Dati numele fisierului: ");
fflush(stdin);
gets(filename);
saver(R, n, filename);
puts("Fisierul dumneavoastra a fos salvat cu succes!");
puts("\nTastati Enter pentru a contiuna");
getch(); break;
case 15:
puts ("Dati numele fisierului: ");
fflush(stdin);
gets(filename);
loadr(R, n, filename);
if(!f)
{
puts("Fisierul nu a fost deschis");
}
else
{
puts("Tabloul a fost citit");
}
puts("\nTastati Enter pentru a contiuna");
getch(); break;
}
}
}
}
void reads (ruta*R, int n)
{
int i;
{ puts ("Dati info despre ruta:");
for(i=0;i<n;i++)
{ printf ("ruta %d:",i+1);
printf ("Nume?:");
fflush (stdin);
gets (R[i].num);
printf ("Tara?:");
fflush (stdin);
gets (R[i].tara);
printf ("An fond?:");
scanf("%d",&R[i].an );
printf ("compania?:");
fflush (stdin);
gets (R[i].compania);
printf ("Durata zb?:");
scanf ("%d",&R[i].durata );
}
return ;
}
}
void shows (ruta*R, int n)
{ int i;
puts ("Info despre ruta");
for (i=0;i<n;i++)
{ printf ("%d.num:%s, tara:%s,an:%d,compania:%s,durata:%d\n",
i+1,R[i].num,R[i].tara,R[i].an,R[i].compania,R[i].durata);
}
return ;
}
return -1;
}
{ int i,k;
ruta t;
for (i=0;i<n;i++)
{ for (k=0;k<n-1;k++)
{ if(strcmp(R[k].num,R[k+1].num)>0)
{ t=R[k];
R[k]=R[k+1];
R[k+1]=t;
}
}
}
return ;
}
//Deschiderea
int loadr(ruta *R, int n, char *filename)
{
FILE*fp;
int i;
fp=fopen(filename,"rb");
if(!fp) return 0;
fread(R,sizeof(*R),n,fp);
fclose(fp);
return 1;
}
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:
Bibliografie:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int an ;
int durata;
} ruta;
int n;
ruta*R;
int k,f,k1,k2;
ruta ad;
int durata ;
char tara[50];
char compania[50];
int an;
int nm;
ruta*B;
char filename[15];
while (1)
switch (nm)
{ case 1:
if (R==NULL)
exit (1);}
getch ();
break ;
case 2:
reads (R,n);
getch ();
break;
case 3:
shows (R,n);
getch ();
break;
case 4:
fflush (stdin);
gets (num);
k= searchs (R,n,num);
if(k==-1)
else
if (f)
getch();
break ;
case 5:
sorts (R,n);
scanf ("%d",&f);
if(f)
{shows (R,n);}
getch();
break;
case 6:
scanf ("%d",&k);
getch ();
break;
case 7:
printf("Nume:");
fflush (stdin);
gets (ad.num);
printf("Tara:");
fflush(stdin);
gets (ad.tara);
printf("An fond:");
scanf ("%d",&ad.an );
printf ("compania:");
fflush(stdin);
gets (ad.compania);
printf("Durata zb:");
B=appends (R,&n,ad);
if(!B)
getch(); break;
else
R=B;
getch();
break;
case 8:
printf("Nume:");
fflush (stdin);
gets (ad.num);
printf("Tara:");
fflush(stdin);
gets (ad.tara);
printf("An fond:");
printf ("compania:");
fflush(stdin);
gets (ad.compania);
printf("Durata zb:");
B=prepends (R,&n,ad);
if(B==NULL)
getch(); break;
else
R=B;
getch();
break;
case 9:
printf ("Nume:");
fflush(stdin);
gets (ad.num);
printf ("Tara:");
fflush(stdin);
gets (ad.tara);
printf ("An fond:");
printf ("compania:");
fflush(stdin);
gets (ad.compania);
scanf ("%d",&k);
B=inserts(R,&n,ad,k-1);
if(B==NULL)
getch(); break;
else
R=B;
getch();
break;
case 10:
printf("Dati numarul rutei de sters:");
scanf ("%d",&k);
B=deletes(R,&n,k-1);
if(B==NULL)
else
{R=B;}
getch();
break;
case 11:
scanf ("%d%d",&k1,&k2);
swaps (R,k1-1,k2-1);
getch();
break;
case 12:
scanf ("%d",&f);
if(f)
{ free(R);
R=NULL;
getch();
break;
case 13:
scanf ("%d",&f);
if(f)
{ free (R);
return 0;
default:
getch();
break;
case 14:
fflush(stdin);
gets(filename);
saver(R, n, filename);
getch(); break;
case 15:
fflush(stdin);
gets(filename);
loadr(R, n, filename);
if(!f)
{
puts("Fisierul nu a fost deschis");
else
getch(); break;
int i;
for(i=0;i<n;i++)
printf ("Nume?:");
fflush (stdin);
gets (R[i].num);
printf ("Tara?:");
fflush (stdin);
gets (R[i].tara);
scanf("%d",&R[i].an );
printf ("compania?:");
fflush (stdin);
gets (R[i].compania);
scanf ("%d",&R[i].durata );
return ;
{ int i;
for (i=0;i<n;i++)
return ;
{ int i;
for (i=0;i<n;i++)
{ if (stricmp(R[i].num,num)==0)
{ return i;}
}
return -1;
{ int i,k;
ruta t;
for (i=0;i<n;i++)
{ for (k=0;k<n-1;k++)
{ if(strcmp(R[k].num,R[k+1].num)>0)
{ t=R[k];
R[k]=R[k+1];
R[k+1]=t;
return ;
{ int f;
scanf ("%d",&f);
if (f)
{ printf ("Nume?:");
fflush(stdin);
gets (R[k].num);
scanf ("%d",&f);
{ printf ("Tara?:");
fflush (stdin);
gets(R[k].tara);
scanf ("%f",&f);
if (f)
scanf ("%d",&R[k].an);
scanf ("%d",&f);
if (f)
{ printf ("compania?:");
fflush (stdin);
gets (R[k].compania);
if (f)
scanf ("%d",&R[k].durata);
return;
}
ruta*appends (ruta*R, int*n, ruta ad)
{ ruta*B;
B[*n]=ad;
*n=*n+1;
return B;
{ ruta*B;
int i;
R=(ruta*)realloc(R,(*n+1)*sizeof(*B));
for (i=*n;i>0;i--)
{ B[i]=B[i-1];}
B[0]=ad;
*n=*n+1;
return B;
{ ruta*B;
int i;
B=(ruta*)realloc(R,(*n+1)*sizeof(*B));
{ B[i]=B[i-1];}
B[k]=ad;
*n=*n+1;
return B;
{ ruta*B;
int i;
for (i=k;i<*n;i++)
{ R[i]=R[i+1];}
B=(ruta*)realloc(R,(*n-1)*sizeof(*B));
*n=*n-1;
return B;
{ ruta t;
t=R[k1];
R[k1]=R[k2];
R[k2]=t;
return;
FILE*fp;
int i;
fp=fopen(filename,"wb");
for(i=0;i<n;i++)
fprintf(fp,"%s",R[i].num);
fclose(fp);
//Deschiderea
FILE*fp;
int i;
fp=fopen(filename,"rb");
if(!fp) return 0;
fread(R,sizeof(*R),n,fp);
fclose(fp);
return 1;