Sunteți pe pagina 1din 25

MINISTERUL EDUCAȚIEI, CULTURII ȘI CERCETĂRII

AL REPUBLICII MOLDOVA
Universitatea Tehnică a Moldovei
Facultatea Calculatoare, Informatică şi Microelectronică
Departamentul Informatică şi Ingineria Sistemelor

Raport
pentru lucrarea de laborator Nr.5

la cursul de “Structuri de date și algoritmi”

Verificat:
Guțu Maria lect. univ.
Departamentul Informatică şi IS,
Facultatea FCIM, UTM

Chișinău – 2021
Sarcina: Pentru fișierele binare cu elemente de tip structură (conform variantelor) să se
afișeze la ecran următorul meniu de opțiuni:

1. Crearea unui fișier binar nou, introducerea câmpurilor structurilor de la tastatură și


înscrierea lor

în acest fișier.

2. Afișarea elementelor fișierului binar la ecran.

3. Adăugarea unei structuri noi la sfârșit de fișier.

4. Modificarea unei structuri a fișierului.

5. Căutarea după un câmp al structurii în fișier.

6. Sortarea structurilor fișierului după un careva câmp.

7. Eliminarea unei structuri din fișier.

8. Ștergerea fișierului de pe disc (la dorință)

0. Ieșire din program.

Să se elaboreze funcțiile pentru implementarea opțiunilor meniului.

5. Structura Marfă cu câmpurile: denumirea, țara, producătorul, articolul, prețul.

#include <stdio.h>

#include <stdlib.h>

#include<string.h>

typedef struct

char denumire[50];

char tara[50];

char producatorul[50];
int articolul;

float pret;

}marfa;

typedef struct

char denumirea[50];

char capitala[25];

int populatia;

}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:");

scanf("%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:%d\n",arr[i].articolul);

printf("Pretul:%.2f\n",arr[i].pret);

}
}

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;

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

if (strcmp(&arr[i].pret,&arr[i+1].pret)<0){
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 dinamica a memoriei pentru tabloul de structuri.");

printf("\n2. Introducerea elementelor de la tastatura.");

printf("\n3. Afisarea elementelor tabloului la ecran");

printf("\n4. Adaugarea unui element nou la sfarsit..");

printf("\n5. Modificarea elementelor tabloului.");

printf("\n6. Cautarea elementului tabloului");

printf("\n7. Sortarea tabloului.");

printf("\n8. Eliminarea elementului din tablou.");

printf("\n9. Eliberarea memoriei alocate.");

printf("\n0. Iesire din program.");

printf("\n\n\nAlgeti 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 memorie 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 alocat memorie pentru tablou\n");

else if(!complet){

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(&arr,n);

complet=1;

printf("--------------------------\n");

else{

system("cls");

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

printf("--------------------------\n");

break;

case 5:

//modificarea

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 punctul '2'\n");

printf("--------------------------\n");

else{

cautare(&arr,index1,index2,producatorul);

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 punctul '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 if(!complet){

system("cls");

printf("Nu s-a eliminat nici-o structura\n");

printf("Te rugam sa accesezi punctul '1' din meniu apoi punctul '2'\n");

printf("--------------------------\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 elibirat1 cu succes\n");

mem=1;

printf("\n\n--------------------------\n");

break;

break;

case 0:

printf("\nProgramul a fost oprit.");

break;

default:

system("cls");

printf("\n\nError Nu avem asa optiune in meniu\n\n");

printf("--------------------------\n");

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

}
Figura 1 – Optiunea 1

Figura 2 – Opțiunea 2
Figura 3 – Opțiunea 3

Se consideră un vector arr[1..n] de numere întregi. Să se scrie un program care determină


lungimea celei mai lungi secvențe de elemente ordonate crescător și o afișează în consolă. Pentru
secvențele ordonate crescător se va aloca/realoca spațiu dinamic de memorie.

#include <stdio.h>

#include <stdlib.h>

int *array;

void WriteArray(int *a, int n)

srand(time(0));

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

a[i] = rand()%10;
}

void showArray(int *a, int n)

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

if(i < n-1) printf("%d, ",a[i]);

else printf("%d;\n",a[i]);

void Cautare(int *a, int n)

int i,j,schimb;

printf("Vectorul sortat crescator este:\n");

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

for(j=i+1;j<=n-1;j++)

if(a[i]>a[j])

schimb=a[i];

a[i]=a[j];
a[j]=schimb;

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

printf("%d ", a[i]);

array = malloc(schimb*sizeof(int));

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

array[i] = a[i];

int main()

int n;

printf("Introduceti lungimea array-ului : ");

scanf("%d",&n);

int a[n];

WriteArray(a,n);

showArray(a,n);

Cautare(a, n);
return 0;

Se dă o structură Carte cu următoarele câmpuri: numele autorului, prenumele autorului,


denumirea cărții, anul ediției, numărul de pagini, prețul. Să se scrie un program care va citi dintr-
un fișier datele acestei structuri, va ordona lexicografic (Selection Sort) această structură după
câmpul denumirea cărții și va afișa structura ordonată în același fișier.
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

typedef struct {

char nume[25];

char prenume[25];

char denumirea_carte[30];

int anul, nr_pagini;

float pret;

} carte;

void citire(carte *carti,int n)

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

printf("Cartea :%d\n",i+1);

printf("Numele autorului:");
scanf("%s",carti[i].nume);

fflush(stdin);

printf("Prenume autorului:");

scanf("%s",carti[i].prenume);

fflush(stdin);

printf("Denumirea cartii:");

scanf("%s",carti[i].denumirea_carte);

fflush(stdin);

printf("Anul editiei:");

scanf("%d",&carti[i].anul);

fflush(stdin);

printf("Numarul de pagini:");

scanf("%d",&carti[i].nr_pagini);

fflush(stdin);

printf("Pretul:");

scanf("%f",&carti[i].pret);

printf("\n");

fflush(stdin);

return;

void afisare(carte *carti,int n)

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

printf("Cartea:%d\n",i+1);

printf("Numele autorului: %s\n",carti[i].nume);

printf("Prenumele autorului: %s\n",carti[i].prenume);

printf("Denumirea cartii:%s\n",carti[i].denumirea_carte);

printf("Anul editiei:%d\n",carti[i].anul);

printf("Numarul de pagini:%d\n",carti[i].nr_pagini);

printf("Pretul:%.2f\n",carti[i].pret);

void Sort(carte *carti,int n) {

for (int i = 0; i < n - 1; i++){

int min_idx = i;

for (int j = i + 1; j < n; j++)

if (strcmp((carti+j)->denumirea_carte,(carti+min_idx)->denumirea_carte ) > 0) min_idx = j;

carte temp = *(carti+min_idx);

*(carti+min_idx)= *(carti+i);

*(carti+i) = temp;

int main (){


FILE *fisier;

if ((fisier = fopen("fisier.bin", "rb") ) == NULL) {

printf("Fisierul nu poate fi deschis!\n");

return 1;

else {

carte *carti;

unsigned int n;

scanf("%u",&n);

carti = calloc(n, sizeof(carte));

fread(&carti, sizeof(carte), n, fisier );

citire(carti,n);

afisare(carti,n);

Sort(carti,n);

fclose(fisier);

return 0;

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