Sunteți pe pagina 1din 19

Ministerul Educaţiei și Cercetării al Republicii Moldova

Universitatea Tehnică a Moldovei

Departamentul Informatică și Ingineria Sistemelor

Raport
Lucrarea de laborator nr.4
la Programarea Calculatoarelor

A efectuat:
st. gr. CR-211 Cobzac Daniel

A verificat:
dr., conf. univ. Mihail Kulev

Chişinău -2021
Теmа: Prelucrarea tabloului de structuri şi utilizarea fişierelor în limbajul C
Scopul lucrării : Programarea algoritmilor pentru prelucrarea tabloului de structuri prin
utilizarea funcţiilor, pointerilor, alocării dinamice a memoriei şi a fişierelor în limbajul C
Sarcină (cоnform variantelor): Pentru tabloul unidimensional dat cu elemente de tip
structură (conform variantelor) să se afişeze la ecran următorul meniu de opţiuni:
1. Alocarea dinamică a memoriei pentru tabloul de structuri.
2. Introducerea elementelor tabloului de la tastatură.
3. Căutarea elementului tabloului.
4. Sortarea tabloului.
5. Redactarea elementului tabloului.
6. Adăugarea unui element nou la sfârşit.
7. Eliminarea elementului indicat din tablou.
8. Inserarea unui element nou.
9. Salvarea elementelor tabloului în fişier.
10. Citirea elementelor tabloului din fişier.
11. Extragerea elementelor tabloului la ecran.
12. Eliberarea memoriei alocate pentru tablou.
0. Ieșire din program.
Să se elaboreze funcţiile pentru implementarea opţiunilor meniului.
Varianta 5:
Structura Marfă cu câmpurile: denumirea, ţara, producătorul, articolul, preţul.

Mersul lucrarii :
Structurile sunt o facilitate oferită de limbajul C pentru a organiza mai bine datele cu care
lucrează programele. Dacăfuncțiilene permit să organizăm mai binecodul,structurilene
permit să organizăm mai binedatele.Structura– este o mulţime de date grupate, conform unei
ierarhii, de obicei de tipuri diferite. Structura poate fi comparată cu tabloul, însă tabloul
conţine date de un acelaşi tip, iar elementele tabloului se accesează cu ajutorul indicilor, pe
cînd 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 defini structura si un nou tip de date student:
typedef struct marfa
{ // definirea cimpurilor (membrilor)
Structurii char nume[50];int nr;float nm;}
marfa;

Descrierea variabilelor:
typedef -pentru a da un nume și tipurilor de date definite de utilizator. De exemplu, puteți utiliza typedef cu
structură pentru a defini un nou tip de date și apoi utilizați acel tip de date pentru a defini direct

int - Int este prescurtarea de la „întreg“. Este folosit pentru a defini variabilele numerice care dețin


numere întregi. Numai numere întregi negative și pozitive pot fi stocate în variabile int. 
null - Un int are același permite NULL intervalul de valori int, dar poate stoca nul , în plus față
de numere întregi.

Codul programului in limbajul C:

#include <stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct marfa
{
char denumire[50];
char tara[50];
char producatorul[50];
int articolul;
float pret;
}marfa;
typedef struct
{
char denumirea[50];
char capitala[25];
int populatia;
int i;
}
tara;
void aloc_mem(marfa**arr,int n)
{
*arr=(marfa*)malloc(n*sizeof(marfa));
}
void scrie_marfa(marfa *arr,int n)
{
for (int i=0;i<n;i++)
{

printf("Numarul marfei:%d\n",i+1);
printf("Denumirea:");
scanf ("%s",arr[i]. denumire);
fflush(stdin);
printf("Tara:");
scanf("%s",arr[i].tara);
fflush(stdin);
printf ("Producatorul:");
printf("%s",arr[i]. producatorul);
fflush(stdin);
printf("Articolul:");
scanf("%d",&arr[i].articolul);
fflush(stdin);
printf("Pretul:");
scanf("%f",&arr[i].pret);
printf("\n");
fflush(stdin);
}
return;
}
void afisare_marfa(marfa *arr,int n)
{
for (int i=0;i<n;i++){
printf("Numarul marfei:%d\n",i+1);
printf("Denumirea:%s\n",arr[i].denumire);
printf("Tara%s\n",arr[i].tara);
printf("Producatorul:%s\n",arr[i].producatorul);
printf("Articolul:%s\n",arr[i].articolul);
printf("Pretul:%2f\n",arr[i].pret);

}
return;
}
void add_marfa(tara *arr1,int n)
{
FILE *fp1;
fp1=fopen("marfa.bin","rb");
int ch = getc(fp1);
while(ch!=EOF);
{
putchar(ch);
ch=getc(fp1);
for(int i=0;i<n;i++){
printf("Numarul tarei:%d\n",i+1);
printf("Denumirea:");
scanf ("%s",arr1[i].denumirea );
fflush(stdin);
printf("Capitala:");
scanf ("%s",arr1[i].capitala);
fflush(stdin);
printf("Populatia:");
scanf ("%d",&arr1[i].populatia);
fflush(stdin);
printf("\n");
fflush(stdin);
}
}

return;
}
void modificare_date(marfa *arr,int n)

{
FILE *fp1;
FILE *fp2;
fp1=fopen("marfa.bin","rb");
fp2=fopen("marfa2.bin","wb");
int nr=0;
printf("Introduceti numarul marfei pe care doriti sa o modificati:");
fflush(stdin);
scanf("%d",&nr);
marfa mag;
for(int i=1;i<=n;i++){
fread(&mag,sizeof(mag),1,fp1);
if(i!=nr);
{
fwrite(&mag,sizeof(mag),1,fp2);
}
}
fclose(fp2);
fclose(fp1);
fp2=fopen("marfa2.bin","rb");
fp1=fopen("marfa.bin","wb");
}
void cautare (marfa *arr,int index1,int index2,char *producatorul)

{
if(index1>index2);
{
int temp;
temp=index1;
index1=index2;
index2=temp;
}
for(int i=index1;i<=index2;i++){
if(strcmp(arr[i].producatorul,producatorul)==0)
arr[i].producatorul;
}
getchar();
}
void sortare(marfa *arr,int n)
{
marfa aux;
int i,k;
for(k=0;k<n-1;k++);
for(int i=0;i<n-1-k;i++);
{
if(arr[i].pret>arr[i+1].pret)
{
aux=arr[i];
arr[i]=arr[i+1];
arr[i+1]=aux;
}
}
}
void eliminare(marfa *arr,int n)
{
FILE *fp1;
FILE *fp2;
fp1=fopen("marfa.bin","rb");
fp2=fopen("marfa2.bin","wb");
int nr=0;
printf("Introduceti numarul marfei pe care doriti sa o eliminati:");
fflush(stdin);
scanf("%d",&nr);
marfa mag;
for(int i=1;i<n;i++){
fread(&mag,sizeof(mag),1,fp1);
if(i!=nr){
fwrite(&mag,sizeof(mag),1,fp2);
}
}
fclose(fp2);
fclose(fp1);
fp2=fopen("marfa2.bin","rb");
fp1=fopen("marfa.bin","wb");
while(fread(&mag,sizeof(mag),1,fp2)){
fwrite(&mag,sizeof(mag),1,fp1);
}
n--;
fclose(fp2);
fclose(fp1);
printf("\n***Eliminat cu succes***\n");
}
void eliberare(marfa *arr,int n)
{
free(arr);

}
void meniu(marfa *arr,int n){
int aleg =0, mem=0;
int complet=0;

printf("------------\n");
printf("Meniul\n");
printf("-------------\n");
do{
printf("\n1.Alocarea dinamică a memoriei pentru tabloul de structuri");
printf("\n2.Introducerea elementelor tabloului de la tastatură. ");
printf("\n3.Căutarea elementului tabloului. ");
printf("\n4.Sortarea tabloului. ");
printf("\n5.Redactarea elementului tabloului.");
printf("\n6.Adăugarea unui element nou la sfârşit. ");
printf("\n7.Eliminarea elementului indicat din tablou.");
printf("\n8.Inserarea unui element nou");
printf("\n9.Salvarea elementelor tabloului în fişier");
printf("\n10.Citirea elementelor tabloului din fişier.");
printf("\n11.Extragerea elementelor tabloului la ecran");
printf("\n12.Eliberarea memoriei alocate pentru tablou.");
printf("\n0. Ieșire din program.");
printf("\n\n\nAlegeti optiunea:");
scanf("%d",&aleg);
printf("--------------------\n");
switch(aleg){
case 1:
//alocarea dinamica a memoriei

printf("Introduceti numarul de marfuri:");


scanf("%d",&n);
if(n<=0){
printf("Introduceti un numar mai mare ca 0.\nIntrodu numarul:");
scanf("%d",&n);
}
aloc_mem(&arr,n);
if(arr==NULL){
printf("Eroare de alocare a memoriei!\n");
}
else{
printf("Memoria sa alocat cu succes\n");
}
mem=1;
printf("n\n----------------\n");
break;

//introducerea datelor in structura


case 2:

if(mem==1)
{
printf("Puteti introduce datele despre marfuri:\n");
scrie_marfa (*&arr,n);
complet=1;
printf("-------------------\n");

}
else{

system("cls");
printf("Nu ati alocat memoria pentru tablou\nAccesati punctul'1'
pentru a efectua introducerea in tablou\n\n");
printf("----------------\n");

}
break;

//afisarea datelor
case 3:
if(!mem){
system("cls");
printf("Nu ati introdus datele despre marfa \n");
printf("Te rugam sa accesezi punctul '1' din meniu apoi punctul '2'\
n");
printf("-------------\n");

}
else{
afisare_marfa(*&arr,n);
printf("-------------\n");
}
break;

case 4:
if(mem==1){
printf("Puteti introduce datele structurii noi:\n");
add_marfa(tara *arr,n);
complet=1;
printf("--------------\n");

}
else{
system("cls");

printf("Nu ati alocat memorie pentru tablou\nAcesati punctul'1'


pentru a efectua introducerea in tablou\n\n");
printf("------------------\n");
}
break;

case 5:
//modificare

break;
case 6:
if(!mem){
system("cls");
printf("Nu ati alocat memorie pentru tablou\n");
}
else if(!complet){
system("cls");
printf("Nu ati introdus campul care doriti sa-l cautati\n");
printf("Te rugam sa accesezi punctul '1' din meniu apoi puncul '2'\n");
printf("-----------------\n");
}
break;

case 7:

if(!mem){
system("cls");
printf("Nu ati alocat memorie pentru tablou\n");
}
else if(!complet){
system("cls");
printf("Nu s-a efectuat sortarea\n");
printf("Te rugam sa accesezi punctul '1' din meniu apoi puncul '2'\n");
printf("--------------\n");
}
else{
sortare(*&arr,n);
printf("--------------\n");
}
break;
case 8:
if(!mem){
system("cls");
printf("Nu ati alocat memorie pentru tablou\n");

}
else{
eliminare(*&arr,n);
printf("---------------\n");

}
break;
case 9:

eliberare(*&arr,n);
if(arr==NULL){
printf("Eroare de eliberare a memoriei!\n");

}
else{
printf("Memoria sa eliberat cu succes\n");
}
mem=1;
printf("\n\n-------------------\n");
break;

break;
case 0:
printf("\nProgramul a fost oprit.");

break;

default:
system("cls");
printf("\nError nu avem asa optiune in meniu");
printf("-----------------");

}
}
while(aleg!=0);
}
int main (void)
{
int n;
marfa* arr[2];
FILE *fp1;
FILE *fp2;
fp1=fopen("marfa.bin","wb");
fp2=fopen("marfa2.bin","rb");
if(!fp1){
return printf("Eroare!");

}
else{
meniu(arr,n);
}
fclose(fp1);
fclose(fp2);
return 0;
}

Rezulatul testarii si functionarii programului in limbajul C


Analiza rezultatelor și concluzii:
1. Au fost obţinute deprinderi de elaborare, compilare, rulare
și testare a unui program care contine mai multe functii
inclusive functia principal main;
2. Totodata au fost obtinute deprinderi de lucrare cu tablouri
bidimensionale de tip pointer spre float;
3. In programul dat scopul principal era de a sorta coloanele
tabloului în ordine descendentă cu ajutorul metodei de
sortare prin selecţie şi schimb;
4. In program a fost declarant un toblou bidimensional de tip
pointer spre float la care se transmite adresa de inceput de
linie si coloana a tabloului;
Bibliografie:
1. Mihail Kulev, Liudmila Luchianova, Lucia Stadler, Vasile Moraru : Sarcini pentru
lucrări de laborator. Chișinău: UTM, 2019.

2. Conspectul prelegerilor offline al cursului Programarea Calculatoarelor pentru


studenții gr. RM-211, CR-211, CR-212, CR-213, MN-211, IBM-211, EA-211
(lector: dr., conf. univ. M. Kulev). Chișinău, UTM, FCIM, 2021.

3. http://labs.cs.upt.ro/labs/pc/html/node57.html

4. https://ocw.cs.pub.ro/courses/programare/laboratoare/lab08

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