Sunteți pe pagina 1din 15

Ministerul Educaiei i Tineretului al Republicii Moldova

Universitatea Tehnic a Moldovei

Catedra: Automatic i tehnologii informaionale

RAPORT
Lucrare de laborator Nr.1
la structuri de date i algoritm

A efectuat:

St. gr. TI-144


Olaru C.

A verificat:

dr., conf.univ., catedra IA

Kulev M.

Chiinu 2015

Lucrare de laborator Nr.1


Tema: Emplementarea tipurilor abstracte de date. Tablouri de structuri n C.
Scopul lucrrii: De alcatuit 3 fiiere n limbajul C pentru emplementarea i utilizarea
tipului abstract de date.
Formularea problemei
De format:
1.Un fiier cu extensia .h unde se afla descrierea structurii elementelor tabloului
i prototipurile funciilor care utilizeaz operaiuni asupra tabloului dat.
2. Un fisier cu extensia .cpp unde se afla codul funciilor declarate n fiierul 1.
3.Un fiier a utilizatorului cu extensia .cpp unde se afla funcia main pentru
precesarea bazei de date n forma tabloului de structuri.
Tipul abstract de date reprezinta un model matematic al structurii de date studiate si
operatiuni asupra datelor. Etapele implementarii TDA in limbajul C:1.Crearea fisierului
cu extensia (.h) care contine:descrierea proprietatilor SD 2.prototipurile functiilor pentru
operatiuni asupra datelor 3.Crearea fisierului cu extensia (.cpp) care contine main-ul.
Un TDA poate fi conceput ca un model matematic cruia i se asociaz o colecie de
operatori specifici. Vom realiza o paralel cu conceptul de procedur. Procedura
generalizeaz noiunea de operator. n loc de a fi limitat la utilizarea exclusiv a
operatorilor definii n cadrul limbajului de programare ("built-in" operators),
folosind procedurile, programatorul este liber s-i defineasc proprii si operatori,
pe care ulterior s-i aplice asupra unor operanzi care nu e necesar s aparin
tipurilor de baz (primitive) ale limbajului utilizat. Un exemplu de procedur utilizat
n aceast manier este spre exemplu, rutina de nmulire a dou matrici.Procedurile
ncapsuleaz anumite pri ale unui algoritm prin "localizare" Aceasta nseamn plasarea
ntr-o singur seciune a programului a tuturor instruciunilor relevante
Textul programului in limbajul C
Struc.h
typedef struct{
char num[40]; //numele studentului
char pre[40]; //prenumele studentului
char spec[40]; //specialitatea aleasa
int anu;
//anul inmatricularii
float med;
//media de intrare
}student;
student* reloc(student *a,int n);
void intro1(student *a,int n);
student* intro2(char *fname,int *n);
void afisare (student *a,int n);
void afis_an(student *a, int n,int an);
void add_std(student *a,int *n,int nr);
void del_std(student *a,int *n,int nd);
void save(student *a,int n,char *fname);
void ord_cr(student *a,int n);
void std_m(student *a,int nm);
1

funct.cpp
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "struc.h"
//alocarea si realocarea memoriei
student* reloc(student *a,int n){
a=(student*)realloc(a,n*sizeof(student));
if(!a){
printf("\a\nNu sa alocat memorie!\n");
system("pause");
exit(1);
}
return a;
}
//Versiunea 1 de citire Manual
void intro1(student *a,int n){
int i;
for(i=0;i<n;i++){
printf("\n****************************************\n\n");
printf("Introdu datele studentului %d\n",i+1);
printf("Numele: ");
scanf("%s",&a[i].num);
printf("Prenumele: ");
scanf("%s",&a[i].pre);
printf("Specialitatea: ");
scanf("%s",&a[i].spec);
printf("Anul de inmatriculare: ");
scanf("%d",&a[i].anu);
printf("Media de intrare: ");
scanf("%f",&a[i].med);
}
}
//Versiunea 2 de citire(Fisier)
student* intro2(char *fname,int *n){
int i=0,m=0;
student *a=NULL;
FILE *demo=fopen(fname,"r"); //deschiderea fisierului din aceeasi mapa, "r" read ,"t"
text
if(!demo){
printf("\aFisierul nu exista!\n");
system("pause");
exit(1);
}
while(!feof(demo)){
m++;
a=reloc(a,m);
2

fscanf(demo,"%s%s%s%d%f",&a[i].num,&a[i].pre,&a[i].spec,&a[i].anu,&a[i].med);
i++;
}
*n=m;
fclose(demo);
return a;
}
//Afisare simpla a datelor
void afisare (student *a,int n){
int i;
for(i=0;i<n;i++){
printf("****************************************\n\n");
printf("Datele studentului:
%d\n",i+1);
printf("Numele:
%s\n",a[i].num);
printf("Prenumele:
%s\n",a[i].pre);
printf("Specialitatea:
%s\n",a[i].spec);
printf("Anul de inmatriculare: %d\n",a[i].anu);
printf("Media de intrare:
%.2f\n\n",a[i].med);
}
}
//Afisare dupa anul introdus(cautare dupa an)
void afis_an(student *a, int n,int an){
int i,j=0;
printf("Studentii anului:
%d\n\n",an);
for(i=0;i<n;i++){
if(a[i].anu==an){
printf("****************************************\n\n");
printf("Nr. de ordine:
%d\n",i+1);
printf("Numele:
%s\n",a[i].num);
printf("Prenumele:
%s\n",a[i].pre);
printf("Specialitatea:
%s\n",a[i].spec);
printf("Anul de inmatriculare: %d\n",a[i].anu);
printf("Media de intrare:
%.2f\n\n",a[i].med);
j++;
}
}
if(!j){
system("cls");
printf("Nu s-au gasit studenti din anul %d\n\n",an);
}
}
//Functia pentru adaugarea studentilor
void add_std(student *a,int *n,int nr){
int i;
a=reloc(a,*n+nr);
for(i=*n;i<*n+nr;i++){
printf("\n****************************************\n\n");
printf("Introdu datele studentului %d\n",i+1);
printf("Numele: ");
3

scanf("%s",&a[i].num);
printf("Prenumele: ");
scanf("%s",&a[i].pre);
printf("Specialitatea: ");
scanf("%s",&a[i].spec);
printf("Anul de inmatriculare: ");
scanf("%d",&a[i].anu);
printf("Media de intrare: ");
scanf("%f",&a[i].med);
}
*n=*n+nr;
}
//functia pentru stergere
void del_std(student *a,int *n,int nd){
int i;
*n=*n-1;
if(*n>0){
for(i=nd;i<*n;i++){
a[i]=a[i+1];
}
}else
printf("\nNu mai sunt studenti!\a\n");
a=reloc(a,*n);
}
//functia de salvare
void save(student *a,int n,char *fname){
int i;
FILE *demo=fopen(fname,"wt");
for(i=0;i<n;i++){
fprintf(demo,"%s %s %s %d %.2f",a[i].num,a[i].pre,a[i].spec,a[i].anu,a[i].med);
if(i<n-1)
fprintf(demo,"\n");
}
fclose(demo);
}
//afisarea studentilor in ordine descrescatoare dupa medie
void ord_cr(student *a,int n){
int i,j;
student t;
for(i=0;i<n-1;i++){
for(j=i+1;j<n;j++){
if(a[i].med<a[j].med){
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
}
afisare(a,n);
4

}
//modificarea datelor
void std_m(student *a,int nm){
nm=nm-1;
printf("\n****************************************\n\n");
printf("Nr. de ordine:
%d\n",nm+1);
printf("Numele:
%s\n",a[nm].num);
printf("Prenumele:
%s\n",a[nm].pre);
printf("Specialitatea:
%s\n",a[nm].spec);
printf("Anul de inmatriculare: %d\n",a[nm].anu);
printf("Media de intrare:
%.2f\n\n",a[nm].med);
printf("****************************************\n\n");
printf("Introdu datele studentului pentru modificare:\n");
printf("Numele: ");
scanf("%s",&a[nm].num);
printf("Prenumele: ");
scanf("%s",&a[nm].pre);
printf("Specialitatea: ");
scanf("%s",&a[nm].spec);
printf("Anul de inmatriculare: ");
scanf("%d",&a[nm].anu);
printf("Media de intrare: ");
scanf("%f",&a[nm].med);
}

main.cpp
#include "funct.cpp"
int main(){
student *a=NULL;
int n=0,an,nr,nd,nm;
int com,com1,m;
char fname[20],y;
while(1){
while(m){ m=0;
system("cls");
printf("Introduceti datele studentilor |\n-------------------------------\n");
printf("\n[ 1 ] Manual\n[ 2 ] Fisier\n\n[ 0 ] Exit\n\nComanda << ");
scanf("%d",&com);
system("cls");
switch(com){
case 0:
if(a)
free(a);
exit(0);
break;
case 1:
printf("Introdu numarul de studenti: ");
scanf("%d",&n);
5

a=reloc(a,n);
intro1(a,n);
break;
case 2:
printf("Introdu numele fisierului pentru citire:\n");
scanf("%s",&fname);
strcat(fname,".txt");
a=intro2(fname,&n);
break;
default:
printf("\aAti introdus o comanda gresita!\n");
system("pause");
m=1;
break;
}
save(a,n,"temp.demo");
}
system("cls");
printf("Lista comenzilor |\n-----------------");
printf("\n\n -------------------------\n | Comenzi pentru afisarea |\n
-------------------------\n");
printf("\n[ 1 ] Lista cu studenti");
printf("\n[ 2 ] Lista cu studenti din anul dorit");
printf("\n[ 3 ] Lista in ordine descrescatoare dupa medie");
printf("\n\n ---------------------------\n | Comenzi pentru modificare |\n
---------------------------\n");
printf("\n[ 4 ] Adauga studenti");
printf("\n[ 5 ] Sterge studentul");
printf("\n[ 6 ] Modifica datele studentul");
printf("\n\n ------------------------\n | Comenzi pentru salvare |\n ------------------------\n");
printf("\n[ 7 ] Salveaza schimbarile in fisier");
printf("\n[ 8 ] Starea initiala a datelor");
printf("\n\n -------------------------\n | Comenzi pentru navigare |\n
-------------------------\n");
printf("\n[ 9 ] Meniu precedent");
printf("\n[ 0 ] Exit");
printf("\n\nComanda << ");
scanf("%d",&com1);
system("cls");
switch(com1){
case 0:
free(a);
exit(0);
break;
case 1:
afisare(a,n);
break;
case 2:
printf("Introduceti anul dorit: ");
6

scanf("%d",&an);
if(an>=1964 && an<=2013){
system("cls");
afis_an(a,n,an);
} else {
system("cls");
printf("Anul introdus nu este corect!\a\n");
}
break;
case 3:
printf("Lista in ordine descrescatoare dupa medie: \n");
ord_cr(a,n);
a=intro2("temp.demo",&n);
break;
case 4:
jkl:printf("Introdu numarul de studenti pentru adaugare: ");
scanf("%d",&nr);
if(nr<0){
printf("\a\nNumarul introdus este un numar negativ { %d }\n",nr);
system("pause");
system("cls");
goto jkl;
} else {
add_std(a,&n,nr);
}
break;
case 5:
dt:
printf("Introdu numarul de ordine a studentului pentru stergere: ");
scanf("%d",&nd);
if(nd<1 || nd>n){
system("cls");
printf("\aAti introdus un numar de ordine care nu exista!\nIncercati din
nou.\n");
system("pause");
system("cls");
goto dt;
} else {
nd=nd-1;
printf("\n\n****************************************\n\n");
printf("Nr. de ordine:
%d\n",nd+1);
printf("Numele:
%s\n",a[nd].num);
printf("Prenumele:
%s\n",a[nd].pre);
printf("Specialitatea:
%s\n",a[nd].spec);
printf("Anul de inmatriculare: %d\n",a[nd].anu);
printf("Media de intrare:
%.2f\n\n",a[nd].med);
printf("****************************************\n\n");
printf("Doriti sa stergeti aceasta inregistrare? y/n\n");
scanf("%s",&y);
if(y=='y'){
7

del_std(a,&n,nd);
} else
if(y=='n'){
break;
} else{
printf("\n\aAti introdus o comanda gresita!\n");
system("pause");
system("cls");
goto dt;
}
}
break;
case 6:
printf("Introdu numarul de ordine a studentului: ");
scanf("%d",&nm);
if(nm<=n && nm>=1)
std_m(a,nm);
else
printf("\nNu exista student cu asa numar de ordine\a\n");
break;
case 7:
printf("Introdu numele fisierului pentru salvare: ");
scanf("%s",&fname);
strcat(fname,".txt");
save(a,n,fname);
printf("\nSalvare a avut loc cu succes!\a\n\n");
break;
case 8:
a=intro2("temp.demo",&n);
printf("Reinoirea datelor sa efectuat cu succes!\n");
break;
case 9:
m=1;
break;
default:
printf("\aAti introdus o comanda gresita!\n");
break;
}
system("pause");
}
return 0;
}

10

11

12

Bibliografie:

http://programmersclub.ru/01/

TOTUL DESPRE C SI C++ (MANUALUL FUNDAMENTAL DE


PROGRAMARE IN C SI C++)[RO][Kris Jamsa][Lars Kland]

Limbajul C pentru clasa a-IX-a

http://www.scribd.com/doc/41293824/Negrescu-Liviu-Limbajele-C-si-Cpentru-incepatori-vol-1

http://devcentral.iftech.com/learning/tutorials/c-cpp/c
13

14

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