Sunteți pe pagina 1din 36

Ministerul Educaiei al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra:Atumatica si Informatica

RAPORT
Lucrarea de laborator Nr.7
La Programarea Calculatoarelor

A efectuat: st. Gr. Ai-161

Trofim Petru

A verificat: dr., conf.univ.

Kulev Mihail

Chiinu 2016
Lucrare de laborator Nr.7

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 5:

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:

Meniul Principal...

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

typedef struct ruta


{ char num [50];
char tara [50];
int an ;
char compania [50];
int durata;
} ruta;

void reads (ruta*R, int n);


void shows (ruta*R, int n);
int searchs (ruta*R, int n, char*num);
void sorts (ruta*R, int n);
void modifys (ruta*R, int k);
ruta*appends (ruta*R, int*n, ruta ad);
ruta*prepends (ruta*R, int*n, ruta ad);
ruta*inserts (ruta*R, int*n, ruta ad, int k);
ruta*deletes (ruta*R, int*n, int k);
void swaps (ruta*R, int k1, int k2);

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)
{

puts("Adaugarea nu a fost efectauata");


puts("\nTastati Enter pentru a contiuna");
getch(); break;
}
else
{
puts("Operatiunea a fost efectuata cu succes!");
R=B;
puts("\nTastati Enter pentru a contiuna");
getch();
break;
}

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)
{

puts("Adaugarea nu a fost efectauata");


puts("\nTastati Enter pentru a contiuna");
getch(); break;
}
else
{
puts("Operatiunea a fost efectuata cu succes!");
R=B;
puts("\nTastati Enter pentru a contiuna");
getch();
break;
}

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)
{

puts("Adaugarea nu a fost efectauata");


puts("\nTastati Enter pentru a contiuna");
getch(); break;
}
else
{
puts("Operatiunea a fost efectuata cu succes!");
R=B;
puts("\nTastati Enter pentru a contiuna");
getch();
break;
}
case 10:
printf("Dati numarul rutei de sters:");
scanf ("%d",&k);
B=deletes(R,&n,k-1);
if(B==NULL)
{puts ("Memoria nu a fost alocata");}
else
{R=B;}
getch();
break;

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 ;

int searchs (ruta*R, int n, char*num)


{ int i;
for (i=0;i<n;i++)
{ if (stricmp(R[i].num,num)==0)
{ return i;}

}
return -1;
}

void sorts (ruta*R, int n)

{ 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 ;
}

void modifys (ruta*R, int k)


{ int f;
printf ("De schimbat numele rutei?(1/0):");
scanf ("%d",&f);
if (f)
{ printf ("Nume?:");
fflush(stdin);
gets (R[k].num);
}
printf ("De schimbat numele tarii?(1/0):");
scanf ("%d",&f);
{ printf ("Tara?:");
fflush (stdin);
gets(R[k].tara);
}
printf("De schimbat anul fondarii?(1/0):");
scanf ("%f",&f);
if (f)
{ printf ("An fond?:");
scanf ("%d",&R[k].an);
}
printf ("De schimbat numele companiaaniei?(1/0):");
scanf ("%d",&f);
if (f)
{ printf ("compania?:");
fflush (stdin);
gets (R[k].compania);
}
printf ("De schimbat durata de zbor?(1/0):");
scanf ("%f", &f);
if (f)
{ printf ("Durata zb?:");
scanf ("%d",&R[k].durata);
}
return;
}

ruta*appends (ruta*R, int*n, ruta ad)


{ ruta*B;
R=(ruta*) realloc (R,(*n+1)*sizeof(*B));
if(!B) {return B;}
B[*n]=ad;
*n=*n+1;
return B;
}

ruta*prepends(ruta*R, int*n , ruta ad)


{ ruta*B;
int i;
R=(ruta*)realloc(R,(*n+1)*sizeof(*B));
if(!B); {return B;}
for (i=*n;i>0;i--)
{ B[i]=B[i-1];}
B[0]=ad;
*n=*n+1;
return B;
}

ruta *inserts (ruta*R, int*n, ruta ad, int k)


{ ruta*B;
int i;
B=(ruta*)realloc(R,(*n+1)*sizeof(*B));
if(!B) {return B;}
for (i=*n;i>k;i--)
{ B[i]=B[i-1];}
B[k]=ad;
*n=*n+1;
return B;
}

ruta*deletes (ruta*R, int*n, int k)


{ 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;
}

void swaps (ruta*R, int k1, int k2)


{ ruta t;
t=R[k1];
R[k1]=R[k2];
R[k2]=t;
return;
}
void saver(ruta *R, int n, char *filename)
{
FILE*fp;
int i;
fp=fopen(filename,"wb");
for(i=0;i<n;i++)
{
fprintf(fp,"%s",R[i].num);
}
fclose(fp);
}

//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;
}

Analiza rezultatelor si concluzii:


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 ;

4. Conspectul prelegerilor cursului Programarea Calculatoarelor pentru studeni gr.,


SI-162. Lector: dr., conf. univ. M.Kulev. Chiinu, UTM,2016
Anexa 1

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

typedef struct ruta

{ char num [50];

char tara [50];

int an ;

char compania [50];

int durata;

} ruta;

void reads (ruta*R, int n);

void shows (ruta*R, int n);

int searchs (ruta*R, int n, char*num);

void sorts (ruta*R, int n);

void modifys (ruta*R, int k);

ruta*appends (ruta*R, int*n, ruta ad);

ruta*prepends (ruta*R, int*n, ruta ad);

ruta*inserts (ruta*R, int*n, ruta ad, int k);

ruta*deletes (ruta*R, int*n, int k);

void swaps (ruta*R, int k1, int k2);

int loadr(ruta *R, int n, char *filename);

void saver(ruta *R, int n, char *filename);


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;

char filename[15];

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 ("13. Iesirea din program");

puts ("14. salvarea bazei");

puts ("15. deschiderea fisierului");

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\t",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)

puts("Adaugarea nu a fost efectauata");

puts("\nTastati Enter pentru a contiuna");

getch(); break;

else

puts("Operatiunea a fost efectuata cu succes!");

R=B;

puts("\nTastati Enter pentru a contiuna");

getch();

break;

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)

puts("Adaugarea nu a fost efectauata");

puts("\nTastati Enter pentru a contiuna");

getch(); break;

else

puts("Operatiunea a fost efectuata cu succes!");

R=B;

puts("\nTastati Enter pentru a contiuna");

getch();

break;

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)

puts("Adaugarea nu a fost efectauata");

puts("\nTastati Enter pentru a contiuna");

getch(); break;

else

puts("Operatiunea a fost efectuata cu succes!");

R=B;

puts("\nTastati Enter pentru a contiuna");

getch();

break;

case 10:
printf("Dati numarul rutei de sters:");

scanf ("%d",&k);

B=deletes(R,&n,k-1);

if(B==NULL)

{puts ("Memoria nu a fost alocata");}

else

{R=B;}

getch();

break;

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 ;

int searchs (ruta*R, int n, char*num)

{ int i;

for (i=0;i<n;i++)

{ if (stricmp(R[i].num,num)==0)

{ return i;}

}
return -1;

void sorts (ruta*R, int n)

{ 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 ;

void modifys (ruta*R, int k)

{ int f;

printf ("De schimbat numele rutei?(1/0):");

scanf ("%d",&f);

if (f)

{ printf ("Nume?:");

fflush(stdin);
gets (R[k].num);

printf ("De schimbat numele tarii?(1/0):");

scanf ("%d",&f);

{ printf ("Tara?:");

fflush (stdin);

gets(R[k].tara);

printf("De schimbat anul fondarii?(1/0):");

scanf ("%f",&f);

if (f)

{ printf ("An fond?:");

scanf ("%d",&R[k].an);

printf ("De schimbat numele companiaaniei?(1/0):");

scanf ("%d",&f);

if (f)

{ printf ("compania?:");

fflush (stdin);

gets (R[k].compania);

printf ("De schimbat durata de zbor?(1/0):");

scanf ("%f", &f);

if (f)

{ printf ("Durata zb?:");

scanf ("%d",&R[k].durata);

return;

}
ruta*appends (ruta*R, int*n, ruta ad)

{ ruta*B;

R=(ruta*) realloc (R,(*n+1)*sizeof(*B));

if(!B) {return B;}

B[*n]=ad;

*n=*n+1;

return B;

ruta*prepends(ruta*R, int*n , ruta ad)

{ ruta*B;

int i;

R=(ruta*)realloc(R,(*n+1)*sizeof(*B));

if(!B); {return B;}

for (i=*n;i>0;i--)

{ B[i]=B[i-1];}

B[0]=ad;

*n=*n+1;

return B;

ruta *inserts (ruta*R, int*n, ruta ad, int k)

{ ruta*B;

int i;

B=(ruta*)realloc(R,(*n+1)*sizeof(*B));

if(!B) {return B;}


for (i=*n;i>k;i--)

{ B[i]=B[i-1];}

B[k]=ad;

*n=*n+1;

return B;

ruta*deletes (ruta*R, int*n, int k)

{ 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;

void swaps (ruta*R, int k1, int k2)

{ ruta t;

t=R[k1];

R[k1]=R[k2];

R[k2]=t;

return;

void saver(ruta *R, int n, char *filename)

FILE*fp;

int i;
fp=fopen(filename,"wb");

for(i=0;i<n;i++)

fprintf(fp,"%s",R[i].num);

fclose(fp);

//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;