// 1.
Să se elaboreze un program ce va aloca static un tablou unidimensional de
structuri și va realiza următoarele funcții:
// citirea de la tastatură a elementelor tabloului;
// afișarea la consolă a elementelor tabloului;
// căutarea unui element după o valoare a unui cîmp din structură și returnarea
poziției unde se află primul element găsit.
#include <stdio.h>
#include <string.h>
#define MAX_SIZE 100
// Definirea structurii
typedef struct {
int id;
char nume[50];
float pret;
} Produs;
// Funcția pentru citirea elementelor tabloului
void citesteProduse(Produs produse[], int n) {
for (int i = 0; i < n; i++) {
printf("Introduceti datele pentru produsul %d:\n", i + 1);
printf("ID: ");
scanf("%d", &produse[i].id);
printf("Nume: ");
scanf("%s", produse[i].nume);
printf("Pret: ");
scanf("%f", &produse[i].pret);
}
}
// Funcția pentru afișarea elementelor tabloului
void afiseazaProduse(Produs produse[], int n) {
printf("\nProdusele introduse sunt:\n");
for (int i = 0; i < n; i++) {
printf("Produs %d: ID = %d, Nume = %s, Pret = %.2f\n", i + 1,
produse[i].id, produse[i].nume, produse[i].pret);
}
}
// Funcția pentru căutarea unui element după valoarea unui câmp
int cautaDupaNume(Produs produse[], int n, const char *nume) {
for (int i = 0; i < n; i++) {
if (strcmp(produse[i].nume, nume) == 0) {
return i; // Returnează poziția primului element găsit
}
}
return -1; // Returnează -1 dacă nu s-a găsit niciun element
}
int main() {
Produs produse[MAX_SIZE];
int n;
printf("Introduceti numarul de produse: ");
scanf("%d", &n);
if (n > MAX_SIZE) {
printf("Numarul de produse depaseste dimensiunea maxima.\n");
return 1;
}
citesteProduse(produse, n);
afiseazaProduse(produse, n);
char numeCautat[50];
printf("\nIntroduceti numele produsului cautat: ");
scanf("%s", numeCautat);
int pozitie = cautaDupaNume(produse, n, numeCautat);
if (pozitie != -1) {
printf("Produsul cu numele \"%s\" a fost gasit la pozitia %d.\n",
numeCautat, pozitie + 1);
} else { printf("Produsul cu numele \"%s\" nu a fost gasit.\n", numeCautat); }
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Definirea structurii
typedef struct {
int id;
char nume[50];
float pret;
} Produs;
// Funcție pentru citirea unui singur produs
void citesteUnProdus(Produs *produs) {
printf("Introduceti datele pentru noul produs:\n");
printf("ID: ");
scanf("%d", &produs->id);
printf("Nume: ");
while ((getchar())!= '\n' && getchar()!= EOF); // Curăță bufferul pentru a
preveni probleme la fgets
fgets(produs->nume, sizeof(produs->nume), stdin);
produs->nume[strcspn(produs->nume, "\n")] = '\0'; // Elimină '\n'
printf("Pret: ");
scanf("%f", &produs->pret);
}
// Funcția pentru citirea produselor
Produs* citesteProduse(int *n) {
printf("Introduceti numarul de produse: ");
scanf("%d", n);
Produs *produse = (Produs*)malloc(*n * sizeof(Produs));
if (!produse) {
printf("Eroare la alocarea memoriei!\n");
exit(1);
}
for (int i = 0; i < *n; i++) {
printf("Produs %d:\n", i + 1);
citesteUnProdus(&produse[i]);
}
return produse;
}
// Funcția pentru afișarea produselor
void afiseazaProduse(Produs *produse, int n) {
printf("\nProdusele sunt:\n");
for (int i = 0; i < n; i++) {
printf("Produs %d: ID = %d, Nume = %s, Pret = %.2f\n", i + 1,
produse[i].id, produse[i].nume, produse[i].pret);
}
}
// Funcția pentru căutarea unui produs după nume
int cautaDupaNume(Produs *produse, int n, const char *nume) {
for (int i = 0; i < n; i++) {
if (strcmp(produse[i].nume, nume) == 0) {
return i;
}
}
return -1;
}
// Funcția de comparare pentru sortare
int comparaProduse(const void *a, const void *b) {
return ((Produs*)a)->pret > ((Produs*)b)->pret ? 1 : -1;
}
// Funcția de sortare
void sorteazaDupaPret(Produs *produse, int n) {
qsort(produse, n, sizeof(Produs), comparaProduse);
}
// Funcția generală pentru inserare la orice poziție
Produs* insereazaProdus(Produs *produse, int *n, int pozitie) {
if (pozitie < 0 || pozitie > *n) {
printf("Pozitie invalida!\n");
return produse;
}
Produs *temp = (Produs*)realloc(produse, (*n + 1) * sizeof(Produs));
if (!temp) {
printf("Eroare la realocare!\n");
return produse;
}
produse = temp;
for (int i = *n; i > pozitie; i--) {
produse[i] = produse[i - 1];
}
citesteUnProdus(&produse[pozitie]);
(*n)++;
return produse;
}
// Funcția pentru ștergerea unui element de pe o poziție X
Produs* stergeDeLaPozitie(Produs *produse, int *n, int pozitie) {
if (pozitie < 0 || pozitie >= *n) {
printf("Pozitie invalida!\n");
return produse;
}
for (int i = pozitie; i < *n - 1; i++) {
produse[i] = produse[i + 1];
}
Produs *temp = (Produs*)realloc(produse, (*n - 1) * sizeof(Produs));
if (!temp && *n - 1 > 0) {
printf("Eroare la realocare!\n");
return produse;
}
produse = temp;
(*n)--;
return produse;
}
// Funcția pentru eliberarea memoriei
void elibereazaMemorie(Produs **produse) {
free(*produse);
*produse = NULL;
}
// Funcția pentru afișarea meniului
void afiseazaMeniu() {
printf("\n--- Meniu ---\n");
printf("1. Citeste produse\n");
printf("2. Afiseaza produse\n");
printf("3. Cauta produs dupa nume\n");
printf("4. Sorteaza produse dupa pret\n");
printf("5. Inserare produs la sfarsit\n");
printf("6. Inserare produs la inceput\n");
printf("7. Inserare produs la pozitie X\n");
printf("8. Sterge produs de la pozitie X\n");
printf("9. Iesire\n");
}
int main() {
Produs *produse = NULL;
int n = 0, optiune, pozitie;
char numeCautat[50];
do {
afiseazaMeniu();
printf("Introduceti optiunea: ");
scanf("%d", &optiune);
switch (optiune) {
case 1:
produse = citesteProduse(&n);
break;
case 2:
afiseazaProduse(produse, n);
break;
case 3:
printf("Introduceti numele produsului cautat: ");
while ((getchar())!= '\n' && getchar()!= EOF); // Curăță bufferul
fgets(numeCautat, sizeof(numeCautat), stdin);
numeCautat[strcspn(numeCautat, "\n")] = '\0';
pozitie = cautaDupaNume(produse, n, numeCautat);
if (pozitie != -1) {
printf("Produsul \"%s\" a fost gasit la pozitia %d.\n",
numeCautat, pozitie + 1);
} else {
printf("Produsul \"%s\" nu a fost gasit.\n", numeCautat);
}
break;
case 4:
sorteazaDupaPret(produse, n);
printf("Produsele au fost sortate dupa pret.\n");
break;
case 5:
produse = insereazaProdus(produse, &n, n);
break;
case 6:
produse = insereazaProdus(produse, &n, 0);
break;
case 7:
printf("Introduceti pozitia pentru inserare: ");
scanf("%d", &pozitie);
produse = insereazaProdus(produse, &n, pozitie);
break;
case 8:
printf("Introduceti pozitia pentru stergere: ");
scanf("%d", &pozitie);
produse = stergeDeLaPozitie(produse, &n, pozitie);
break;
case 9:
elibereazaMemorie(&produse);
printf("Memorie eliberata. Iesire...\n");
break;
default:
printf("Optiune invalida!\n");
}
} while (optiune != 9);
return 0;
}