Laborator 3

Problema 1

Se da un fisier continand date despre optiunile unor studenti cu privire la un set de materii optionale. Acest fisier poate fi vizualizat aici. Fisierul contine 10.000 de linii, fiecarui elev revenindu-i 2 linii consecutive din fisier. Pe prima linie din cele doua se afla numele studentului iar pe cea de a doua se aflao serie de 4 coduri reprezentand tot atatea optiuni. Cunoscand ca sunt in total 5.000 de studenti si ca numele nici unui student nu ocupa mai mult de 35 de caractere, se cere:

· Sa se citeasca datele din fisier intr-un tablou de 5.000 de elemente de forma < nume , optional1, optional2, opptional3, optional4 >

· Utilizand algoritmul de sortare prin amestecare (ShakerSort), sa se afiseze studentii alfabetic si apoi invers, si sa se contorizeze comparatiile siatribuirile care se fac in timpul sortarii

· Utilizand algoritmul de sortare prin insertie (InsertSort), sa se afiseze optionalele unui student in ordinea alfabetica a acestora.

Problema 2

Se da un fisier continand date despre rezultatele unor elevi la admiterea in liceu. Acest fisier poate fi descarcat aici. Fisierul contine 10.000 de linii, fiecarui elev revenindu-i 2 linii consecutive din fisier. Pe prima linie din cele doua se afla numele elevului iar pe cea de a doua se afla media de intrare sub forma unui numar real intre 1.0 si 10.0. Cunoscand ca sunt in total 5.000 de elevi si ca numele nici unui elev nu ocupa mai mult de 35 de caractere, se cere:

Sa se citeasca datele din fisier intr-un tablou de 5.000 de elemente de forma < nume , medie >

Utilizand algoritmul de sortare prin selectie (SelSort), sa se afiseze elevii crescator si apoi descrescator, in ordinea mediilor si sa se contorizeze comparatiile si atribuirile care se fac in timpul sortarii.

Utilizand algoritmul de sortare prin interschimbare (BubbleSort), sa se afiseze elevii crescator si apoi descrescator, in ordinea numelor si sa se contorizeze comparatiile si atribuirile care se fac in timpul sortarii.

Rezolvare Problema 1

#include <stdio.h>

#include <stdlib.h>

#define stud_max 5000

int cmp=0,atrib=0;

char optional[stud_max][4][3];

struct student

{

char nume[36];

char op1[3];

char op2[3];

char op3[3];

char op4[3];

}s[stud_max];

void citire()

{

FILE *f;

f=fopen("studenti_A1.txt","r");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului de intrare");

exit(1);

}

int i;

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

{

fgets(s[i].nume,35,f);

strtok(s[i].nume,"\n");

fscanf(f,"%s %s %s %s\n",&s[i].op1,&s[i].op2,&s[i].op3,&s[i].op4);

}

fclose(f);

}

void afisare(char mesaj[])

{

int i;

FILE *g;

g=fopen(mesaj,"w");

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

fprintf(g,"%s\n%s %s %s %s\n",s[i].nume,s[i].op1,s[i].op2,s[i].op3,s[i].op4);

fclose(g);

}

void afisare_inversa(char mesaj[])

{

int i;

FILE *h;

h=fopen(mesaj,"w");

for(i=stud_max-1;i>=0;i--)

fprintf(h,"%s\n%s %s %s %s\n",s[i].nume,s[i].op1,s[i].op2,s[i].op3,s[i].op4);

fclose(h);

}

void shakersort()

{

int j,ultim,sus,jos;

char temp[36];

sus=1; jos=stud_max-1; ultim=stud_max-1;

do{

for(j=jos;j>=sus;j--)

if (strcmp(s[j-1].nume,s[j].nume)>0)

{ cmp++;

strcpy(temp,s[j-1].nume); strcpy(s[j-1].nume,s[j].nume); strcpy(s[j].nume,temp);

strcpy(temp,s[j-1].op1); strcpy(s[j-1].op1,s[j].op1); strcpy(s[j].op1,temp);

strcpy(temp,s[j-1].op2); strcpy(s[j-1].op2,s[j].op2); strcpy(s[j].op2,temp);

strcpy(temp,s[j-1].op3); strcpy(s[j-1].op3,s[j].op3); strcpy(s[j].op3,temp);

strcpy(temp,s[j-1].op4); strcpy(s[j-1].op4,s[j].op4); strcpy(s[j].op4,temp);

ultim=j;

atrib=atrib+16;

}

sus=ultim+1;atrib++;

for(j=sus;j<=jos;j++)

if(strcmp(s[j-1].nume,s[j].nume)>0)

{ cmp++;

strcpy(temp,s[j-1].nume); strcpy(s[j-1].nume,s[j].nume); strcpy(s[j].nume,temp);

strcpy(temp,s[j-1].op1); strcpy(s[j-1].op1,s[j].op1); strcpy(s[j].op1,temp);

strcpy(temp,s[j-1].op2); strcpy(s[j-1].op2,s[j].op2); strcpy(s[j].op2,temp);

strcpy(temp,s[j-1].op3); strcpy(s[j-1].op3,s[j].op3); strcpy(s[j].op3,temp);

strcpy(temp,s[j-1].op4); strcpy(s[j-1].op4,s[j].op4); strcpy(s[j].op4,temp);

ultim=j;

atrib=atrib+16;

}

jos=ultim-1; atrib++;

} while (!(sus>jos));

}

void convert()

{

int i;

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

{

strcpy(optional[i][0],s[i].op1);

strcpy(optional[i][1],s[i].op2);

strcpy(optional[i][2],s[i].op3);

strcpy(optional[i][3],s[i].op4);

}

}

void convert_back()

{

int i;

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

{

strcpy(s[i].op1,optional[i][0]);

strcpy(s[i].op2,optional[i][1]);

strcpy(s[i].op3,optional[i][2]);

strcpy(s[i].op4,optional[i][3]);

}

}

void insertionSort()

{

int i,j,k;

char key[3];

for(k=0;k<stud_max;k++)

for(i=1;i<4;i++)

{

strcpy(key,optional[k][i]);

j=i-1;

while(j>=0&&strcmp(optional[k][j],key)>0)

{

strcpy(optional[k][j+1],optional[k][j]);

j=j-1;

}

strcpy(optional[k][j+1],key);

}

}

int main()

{

printf("Hello world!\n");

citire();

shakersort();

afisare("Ord_alfabetic.txt");

afisare_inversa("Ord_invers_alfabatic.txt");

printf("ShakerSort:\nNumar comparatii: %d\nNumar atribuiri: %d",cmp,atrib);

convert();

insertionSort();

convert_back();

afisare("Ord_opt_alfabetic.txt");

return 0;

}

Rezolvare Problema 2

#include <stdio.h>

#include <stdlib.h>

#define stud_max 5000

int cmp=0,atrib=0;

struct student

{

char nume[36];

float media;

}s[stud_max];

void citire()

{

FILE *f;

f=fopen("studenti_a2.txt","r");

if(f==NULL)

{

printf("Eroare la deschiderea fisierului de intrare");

exit(1);

}

int i;

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

{

fgets(s[i].nume,35,f);

strtok(s[i].nume,"\n");

fscanf(f,"%f\n",&s[i].media);

}

fclose(f);

}

void select_sort()

{

int i,j,temp;

cmp=0; atrib=0;

for(j=0;j<stud_max-1;j++)

{

int iMin=j;

for(i=j+1;i<stud_max;i++)

if(s[i].media<s[iMin].media)

{

iMin=i;

cmp++;

atrib++;

}

if(iMin!=j)

{

temp=s[j].media;

s[j].media=s[iMin].media;

s[iMin].media=temp;

cmp++;

atrib=atrib+3;

}

}

}

void bubbleSort()

{

int i,j;

char aux[36];

cmp=0;

atrib=0;

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

{

for(j=0;j<stud_max-i-1;j++)

{

if (strcmp(s[j].nume,s[j+1].nume)>0)

{

strcpy(aux,s[j].nume);

strcpy(s[j].nume,s[j+1].nume);

strcpy(s[j+1].nume,aux);

cmp++;

atrib=atrib+3;

}

}

}

}

void afisare(char mesaj[])

{

int i;

FILE *g;

g=fopen(mesaj,"w");

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

fprintf(g,"%s\n%f\n",s[i].nume,s[i].media);

fclose(g);

}

void afisare_inversa(char mesaj[])

{

int i;

FILE *h;

h=fopen(mesaj,"w");

for(i=stud_max-1;i>=0;i--)

fprintf(h,"%s\n%f\n",s[i].nume,s[i].media);

fclose(h);

}

int main()

{

printf("Hello world!\n");

citire();

select_sort();

printf("Selection Sort:\nComparatii: %d\nAtribuiri: %d\n",cmp,atrib);

afisare("Ord_medie.txt");

afisare_inversa("Ord_medie_inversa.txt");

bubbleSort();

printf("Bubble Sort:\nComparatii: %d\nAtribuiri: %d\n",cmp,atrib);

afisare("Ord_nume.txt");

afisare_inversa("Ord_nume_inversa.txt");

return 0;

}