Axenti Alina SDA Raport 7 [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

Ministerul Educaţiei al Republicii Moldova Universitatea Tehnică a Moldovei Catedra Calculatoare și Rețele

RAPORT despre lucrarea de laborator Nr. 7 la Structuri de date şi algoritmi 

Tema: Implementarea tipului abstract de date „Tablou de structuri” în limbajul C

A efectuat: st. gr. CR-191

Axenti Alina

A verificat: Lector univ.

Munteanu Silvia

Chişinău – 2021

Scopul lucrării: Obținerea deprinderilor practice de implementare și de utilizare a tipului abstract de date (TAD) “Tablou de structuri” în limbajul C

Sarcina (conform variantelor) : Să se scrie trei fișiere-text în limbajul C pentru implementarea și utilizarea TAD “Tablou de structuri”: 1. Fişier antet cu extensia .h, care conține specificarea structurii de date a elementului tabloului (conform variantelor) şi prototipurile funcţiilor de prelucrare a tabloului de structuri. 2. Fişier cu extensia .cpp sau .c, care conține implementările (codurile) funcţiilor, declarate în fişierul antet. 3. Fişier al utilizatorului, funcţia mаin() pentru prelucrarea tabloului de structuri cu afişarea la ecran a următorului meniu de opţiuni: 1. Alocarea dinamică a memoriei pentru tablou. 2. Introducerea informației despre elementele tabloului de la tastatură. 3. Afişarea informației despre elementele tabloului la ecran. 4. Căutarea elementului în tablou. 5. Modificarea câmpurilor a unui element din tablou. 6. Înterschimbarea a două elemente indicate din tablou. 7. Sortarea tabloului. 8. Adăugarea unui element nou la sfârșitul tabloului. 9. Adăugarea unui element nou la înciputul tabloului. 10. Inserarea unui element nou după elementul indicat al tabloului. 11. Inserarea unui element nou înainte elementul indicat al tabloului. 12. Ştergerea elementului indicat al tabloului. 13. Salvarea informației despre elementele tabloului în fişier. 14. Citirea informației despre elementele tabloului din fişier. 15. Eliberarea memoriei alocate pentru tablou. 0. Ieşire din program. Varianta 2. Structura Film cu câmpurile: denumirea, ţara, regizorul, genul filmului, anul.

Mersul lucrării: Noțiuni teoretice: •Biblioteca stdio.h conține funcții speciale pentru citirea și afișarea datelor – prin urmare instrucțiunea de includere a acesteia va fi practic prezentă în orice program. #include ; •Int-variabila simpla de tip integer(intreg); •While-execută un bloc de instrucţiuni atâta timp cât o anumită condiţie este adevărată; •Printf-pentru afișarea datelor; •Scanf-pentru citirea datelor; •If,-instrucțiune; •Malloc-funcție de alocare are ca rezultat adresa zonei de memorie alocate (de tip void*);

Codul programului în C Main.c #include #include #include #include "film.h" int main (void) { int n, a = 1, asort = 1, is, dt = 0; int a1, a2; film * c; char smodel[30]; while (a) { printf ("\tMENIU"); printf ("\n1.Alocarea dinamica a memoriei"); printf ("\n2.Introducerea elementelor de la tastatura "); printf ("\n3.Cautarea elemantului tabloului"); printf ("\n4.Sortarea tabloului"); printf ("\n5.Redactarea elementului a tabloului"); printf ("\n6.Adaugarea unui element nou la sfarsit"); printf ("\n7.Eliminarea elementului indicat din tablou"); printf ("\n8.Inserarea unui element nou"); printf ("\n9.Salvarea elementelor tabloului in fisier"); printf ("\n10.Citirea elementelor tabloului din fisier"); printf ("\n11.Extragerea elementelor tabloului la ecran"); printf ("\n12.Eliberarea memoriei alocate pentru tablou "); printf ("\n13.Interschimbarea a doua elemente indicate din tablou"); printf ("\n14.Adaugarea unui element nou la inceputul tabloului"); printf ("\n15.Inserarea unui element nou inainte elementului indicat al tabloului"); printf ("\n 0.Ierie din program\n"); printf ("\nAlegeti un punct din meniu\n\t"); fflush(stdin); scanf ("%d", &a); if (a == 0) printf("\n\n\tAti esit din program!\n"); switch (a) { //alocarea case 1: printf ("Introduceti numarul de filme:\n"); fflush(stdin); scanf ("%d", &n);

c = alocMemory(n); printf ("\nMemoria a fost alocata\n"); break; //introducerea case 2: printf ("\nIntroduceti elementele de la tastatura "); readB(c, n); printf ("\n\t\t***Introducerea elementelor este finisata***\n"); break; //cautarea case 3: printf ("\nIntroduceti denumirea filmului pe care il cautati: "); fflush(stdin); scanf("%s", &smodel); is = 0; is = searchB(c, n, smodel); if (is >= 0) { printf ("\n\tFilm nr.%d", is + 1); printf ("\nDenumirea: %s\tTara: %s\tRegizorul: %s\tGenul: %s\tAnul: %d\n", c[is].name, c[is].country, c[is].regizor, c[is].gen, c[is].year); } else printf ("\nModelul introdus nu a fost gasit"); break; //sortarea case 4: printf("\t\tMENIU de sortare"); printf("\n\t1.Sortarea dupa anul crescator"); printf("\n\t2.Sortarea dupa anul descrescator"); printf("\n\t0.Iesirea din MENIU de sortare\n\n\t"); fflush(stdin); scanf("%d", &asort); if (!asort) printf("\nAti esit dim meniu de sortare\n"); switch(asort) {

//sortarea crescator case 1: sortByYearCresc(c, n); printf("\nSortarea a fost cu succes\n"); break; //sortarea descrescator case 2: sortByYearDesc(c, n); printf("\nSortarea a fost cu succes\n"); break; default: printf("\nAti esit dim meniu de sortare\n"); break; } break; // redactarea a elementelor a tabloului case 5: printf("\nIntroduceti nr-l a elementului pe care doriti sa redactati\n"); fflush(stdin); scanf("%d", &is); fflush(stdin); redact(c, is); break; //adaugarea unui element la sfarsit case 6: c = appElement(c,&n); break; //Eliminarea elementului indicat din tablou case 7: printf("\nIntroduceti nr.filmului pe care doriti sa eliminati\n" ); fflush(stdin); scanf("%d", &is); fflush(stdin); c = elim(c,is,&n); printf("\nFilmul a fost eliminata\n"); break; //Inserarea unui element case 8:

printf("\nIntroduceti nr.filmului de inserare\n" ); fflush(stdin); scanf("%d", &is); c = inser(c,is,&n); printf("\nFilmul a fost inserata\n"); break; //write struct in file case 9: if (writeStructInFile (c, n) == 1) printf("\nSalvarea a elemetelor a fost cu succes\n"); else printf("\nError\n"); break; //read struct in file case 10: if (!readStructFromFile(&n)) { printf("\n\n\t***Error***\n"); break; } else { c = readStructFromFile(&n); printf("\nCitirea a elemetelor a fost cu succes\n"); } break; //afisarea case 11: printf ("\n\n\nElementele structurei :\n"); showB(c, n); printf ("\n\n"); break; //eliberarea memoriei case 12: c = NULL; if (!c) printf("\nMemoria a fost eliberata\n"); else printf("\n\n\t***Error***\n"); break;

case 13: printf("\nIntroduceti nr. elementului unu : "); fflush(stdin); scanf("%d", &a1); printf("\nIntroduceti nr. elementului doi : "); fflush(stdin); scanf("%d", &a2); swap (c, a1, a2); printf("\nInterschimbul a fost cu succes!"); break; case 14: c = addFirstElement(c, &n); printf("\nElementul a fost adaugat la inceput\n"); break; case 15: printf("\nIntroduceti nr.filmului inaintea carui va fi inserarea\n" ); fflush(stdin); scanf("%d", &is); is--; c = inser(c,is,&n); printf("\nFilmul a fost inserat\n"); break; default: printf("\n\n\t***Ati esit din program***\n"); a = 0; break; } } getch(); return 0; }

Film.c #include #include #include

#include "film.h" film * alocMemory(int n) { film * A = NULL; A = (film *) malloc (n * sizeof(film)); if (A == NULL) { printf ("\n\tMEMORIA NU A FOST ALOCATA\n"); return NULL; } return A; } void readB(film * c, int n) { int i; for (i = 0; i < n; i++) { fflush(stdin); printf ("\n\tFilm nr.%d", i+1); printf ("\nDenumirea: "); gets (c[i].name); printf ("Tara: "); gets (c[i].country); printf ("Regizorul: "); gets (c[i].regizor); printf ("Genul: "); gets (c[i].gen); printf ("Anul : "); scanf ("%d", &c[i].year); } return; } void showB(film * c, int n) { int i; for (i = 0; i < n; i++) { printf ("\n\tFilm nr.%d", i + 1); printf ("\nDenumirea: %s\tTara: %s\tRegizorul: %s\tGenul: %s\tAnul: %d\n", c[i].name, c[i].country, c[i].regizor, c[i].gen, c[i].year); } return; } int searchB (film * c, int n, char * smodel) {

int i; for (i = 0; i < n; i++) { if (stricmp(c[i].name, smodel) == 0) return i; } return -1; } void sortByYearCresc(film *c, int n) { int i, k; film t; for (i = 0; i < n-1; i++) { for (k = 0; k < n-1-i; k++ ) { if (c[k].year > c[k+1].year) { t = c[k+1]; c[k+1] = c[k]; c[k] = t; } } } return; } void sortByYearDesc(film *c, int n) { int i, k; film t; for (i = 0; i < n-1; i++) { for (k = 0; k < n-1-i; k++ ) { if (c[k].year < c[k+1].year) { t = c[k+1]; c[k+1] = c[k]; c[k] = t; } } } return;

} void redact(film *c, int i) { int a = 1; i--; printf("\t\tMENIU de redactare"); printf("\n\t1.Redactarea denumirei"); printf("\n\t2.Redactarea tarii"); printf("\n\t3.Redactarea regizorului"); printf("\n\t4.Redactarea genului"); printf("\n\t5.Redactarea anului"); printf("\n\t0.Iesirea din MENIU de redactare\n\n\t"); while(a) { printf("\n\tAlegeti un punct din submeniu\n\t"); fflush(stdin); scanf("%d",&a); switch(a) { case 1: printf("\tIntroduceti denumirea:\t"); fflush(stdin); gets (c[i].name); printf("\tDenumirea a fost modificata\n"); break; case 2: printf("\tIntroduceti tara:\t"); fflush(stdin); gets (c[i].country); printf("\tTara a fost modificata\n"); break; case 3: printf("\tIntroduceti regizorul:\t"); fflush(stdin); gets (c[i].regizor); printf("\tRegizorul a fost modificat\n"); break; case 4: printf("\tIntroduceti genul:\t"); fflush(stdin); gets (c[i].gen); printf("\tGenul a fost modificat\n"); break;

case 5: printf("\tIntroduceti anul:\t"); fflush(stdin); scanf ("%d", &c[i].year); printf("\tAnul a fost modificat\n"); break; default: printf("\n\t\tAti iesit din submeniul de redactre\n"); a = 0; return; break; } } return; } film * appElement(film *c, int *pn) { film temp; film *b; printf("\nIntroduceti un element nou:\n"); fflush(stdin); printf ("\n\tFilm nr.%d", *pn+1); printf ("\nDenumirea: "); gets (temp.name); printf ("Tara: "); gets (temp.country); printf ("Regizorul: "); gets (temp.regizor); printf ("Genul: "); gets (temp.gen); printf ("Anul : "); scanf ("%d", &temp.year); b = (film*) realloc (c,(*pn+1)*sizeof(*b)); if (b == NULL) {return b;} b[*pn] = temp; *pn = *pn +1; return b; } film * elim(film *c, int el, int *n) { int i;

film *b; film t; for (i = el - 1; i < *n -1; i++) { t = c[i]; c[i] = c[i+1]; c[i+1] = t; } b = (film*) realloc (c,(*n-1)*sizeof(*b)); if (b == NULL) {return b;} *n = *n - 1; return b; } film * inser(film *c, int el, int * n) { int i; film *b; film temp; printf("\nIntroduceti un element nou:\n"); fflush(stdin); printf ("\n\tFilm nr.%d", el); printf ("\nDenumirea: "); gets (temp.name); printf ("Tara: "); gets (temp.country); printf ("Regizorul: "); gets (temp.regizor); printf ("Genul: "); gets (temp.gen); printf ("Anul : "); scanf ("%d", &temp.year); b = (film*) realloc (c,(*n+1)*sizeof(*b)); if (b == NULL) {return b;} for (i = *n; i > el - 1; --i) b[i] = b[i - 1]; b[el-1] = temp; *n = *n + 1; return b; }

int writeStructInFile (film *c, int n) { FILE * f; int i; f = fopen ("film.txt", "w"); if (!f) return 0; fwrite (&n, sizeof(int), 1, f); for (i = 0; i < n; i++) fwrite (&c[i], sizeof(film), 1, f); fclose (f); return 1; } film * readStructFromFile(int *n) { FILE * f; int i = 0, pn; film temp; film * b = NULL; f = fopen ("film.txt", "r"); if (!f){return NULL;} fread(&pn, sizeof(int), 1, f); b = (film *) malloc ((pn)* sizeof(film)); if (b == NULL) return NULL; i = 0; while (fread(&temp, sizeof(film), 1, f)) { b[i] = temp; i++; } fclose (f); *n = pn; return b; } //lucr 7

void swap(film * c, int a, int b) { film t; t = c [a-1]; c[a-1] = c [b-1]; c [b-1] = t; return; } film * addFirstElement(film *c, int *n) { int i; film *b; film temp; printf("\nIntroduceti un element nou:\n"); fflush(stdin); printf ("\n\tFilm nr.%d", 1); printf ("\nDenumirea: "); gets (temp.name); printf ("Tara: "); gets (temp.country); printf ("Regizorul: "); gets (temp.regizor); printf ("Genul: "); gets (temp.gen); printf ("Anul : "); scanf ("%d", &temp.year); b = (film*) realloc (c,(*n+1)*sizeof(*b)); if (b == NULL) {return b;} for (i = *n; i > 0; --i) b[i] = b[i - 1]; b[0] = temp; *n = *n + 1; return b; } Film.h typedef struct Film { char name[30]; char country[30];

char regizor[30]; char gen[30]; int year; }film; film * alocMemory(int n); void readF(film * c, int n); void showF(film * c, int n); int searchF (film * c, int n, char * smodel); void sortByYearCresc(film *c, int n); void sortByYaerDesc(film *c, int n); void redact(film *c, int i); film * appElement(film *c, int *pn); film * elim(film *c, int el, int *n); film * inser(film *c, int el, int * n); int writeStructInFile (film *c, int n); film * readStructFromFile(int *n); //lucr 7 void swap(film *c, int a1, int a2); film * addFirstElement(film *c, int *pn);

Rezultate :

Concluzie: În lucrarea de laborator nr.7 am alcatuit un fişier antet cu extensia .c, care conține specificarea structurii de date a elementului tabloului(casa)şi prototipurile funcţiilor de prelucrare a tabloului de structure,alt fişier cu extensia .c, care conține implementările (codurile) funcţiilor, declarate în fişierul antet și fişier al utilizatorului, funcţia mаin() pentru prelucrarea tabloului de structuri cu afişarea la ecran a următorului meniu de opţiuni: alocarea dinamica a informației,implementarea informatiei,sortarea,adaugarea altui element,inserarea unui element nou,salvarea,citirea si ieșire.Acest program permite de a afla detalii unui lucru.