Salve, vorrei aggiungere una funzione, ovvero poter modificare un prezzo di un prodotto. Non so dove mettere mano.
Qui sotto c'è l'intero programma
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
typedef struct A{
char codice[8];
char nome_prodotto[64];
char genere_alimentare[16];
float prezzo;
int quantita;
}tipoArticolo;
typedef struct n1{
tipoArticolo info;
struct n1 *next;
}nodoListaArticoli, *listaArticoli;
void initListaArticoli(listaArticoli *pl){
*pl = NULL;
}
int inserisciInTesta(listaArticoli *pl, tipoArticolo elem){
listaArticoli aux;
aux = (listaArticoli)malloc(sizeof(nodoListaArticoli));
if (aux == NULL){
return 0;
}
else{
aux->info = elem;
aux->next = *pl;
*pl = aux;
return 1;
}
}
int inserisciInOrdine(listaArticoli *pl, tipoArticolo elem){
if ((*pl) == NULL){
return inserisciInTesta(pl, elem);
}
if (strcmp((*pl)->info.codice, elem.codice) > 0){
return inserisciInTesta(pl, elem);
}
if (strcmp((*pl)->info.codice, elem.codice) == 0){
return 0;
}
return inserisciInOrdine(&(*pl)->next, elem);
}
int ugualeArticolo(tipoArticolo articolo1, tipoArticolo articolo2){
if (strcmp(articolo1.codice, articolo2.codice) == 0 &&
strcmp(articolo1.genere_alimentare, articolo2.genere_alimentare) == 0){
return 1;
}
else{
return 0;
}
}
int cancellaLista(listaArticoli *pl, tipoArticolo elem){
listaArticoli aux;
if (*pl == NULL){
return 0;
}
else{
if (strcmp((*pl)->info.codice, elem.codice) == 0){
if (ugualeArticolo((*pl)->info, elem)){
aux = *pl;
*pl = (*pl)->next;
free(aux);
return 1;
};
if (strcmp((*pl)->info.codice, elem.codice) < 0){
return cancellaLista(&((*pl)->next), elem);
}
}
}
return 0;
}
typedef struct e2{
char genere_alim[16];
int numero_prodotti;
listaArticoli elencoArticoli;
}tipoElementoGeneriAlim;
typedef struct n2{
tipoElementoGeneriAlim info;
struct n2 *next;
}tipoNodoGeneriAlim, *Generi_Alimentari;
void initListaGeneri(Generi_Alimentari *pg){
*pg = NULL;
}
int menu(){
int i = 0;
printf("0) Esci dal programma\n");
printf("1) Carica lista articoli\n");
printf("2) modifica prezzo di un prodotto\n");
printf("3) elimina un prodotto della lista\n");
printf("4) copia prodotti in lista\n");
printf("5) prezzo medio\n");
printf("6) visualizza articoli in fascia di prezzo\n");
printf("7) visualizza contenuto dell'intera lista dei generi alim\n");
scanf("%d", &i);
return i;
}
void visita_prodotti(listaArticoli l) {
while (l != NULL) {
printf("\n******************\nPRODOTTO codice %s\nNOME PRODOTTO %s\nDESCR -%s-\nCOSTO %d\nQUANTITA %f\n\n", l->info.codice, l->info.nome_prodotto, l->info.genere_alimentare, l->info.prezzo, l->info.quantita);
l = l->next;
}
}
void visita_GeneriAlimentari(Generi_Alimentari g){
while (g != NULL){
printf("\n---------------------------\nCATEGORIA: %s\n NUMERO PROD: %d---------------------------", g->info.genere_alim, g->info.numero_prodotti);
visita_prodotti(g->info.elencoArticoli);
g = g->next;
}
}
int caricaLista(char* nomefile, listaArticoli *pl){
int numeroArticoli = 0;
FILE *f;
tipoArticolo a;
f = fopen(nomefile, "r");
if (f == NULL){
printf("errore");
return numeroArticoli;
}
int ncampi_letti = 0;
ncampi_letti += fscanf(f, "%s\n", a.codice);
if (fgets(a.nome_prodotto, 63, f)) {
ncampi_letti++;
}
ncampi_letti += fscanf(f, "%s\n", a.genere_alimentare);
ncampi_letti += fscanf(f, "%f %d\n", &a.prezzo, &a.quantita);
while (ncampi_letti == 5){
numeroArticoli += inserisciInOrdine(pl, a);
ncampi_letti = 0;
ncampi_letti += fscanf(f, "%s\n", a.codice);
if (fgets(a.nome_prodotto, 63, f)){
ncampi_letti++;
}
ncampi_letti += fscanf(f, "%s\n%f %d\n", a.genere_alimentare, &a.prezzo, &a.quantita);
}
fclose(f);
printf("\nLOAD COMPLETE\n");
return numeroArticoli;
}
int inserisciInTestaG(Generi_Alimentari *pg, tipoArticolo a){
Generi_Alimentari aux;
aux = (Generi_Alimentari)malloc(sizeof(tipoNodoGeneriAlim));
if (aux == NULL){
return 0;
}
else{
strcpy(aux->info.genere_alim, a.genere_alimentare);
initListaArticoli(&aux->info.elencoArticoli);
int result = inserisciInOrdine(&aux->info.elencoArticoli, a);
aux->next = *pg;
*pg = aux;
return 1;
}
}
void inserisciGeneriAlim(Generi_Alimentari *pg, tipoArticolo a){
Generi_Alimentari aux = *pg;
int genere_trovato = 0;
while (aux != NULL && !genere_trovato){
if (strcmp(aux->info.genere_alim, a.genere_alimentare) == 0){
inserisciInOrdine(&(aux->info.elencoArticoli), a);
genere_trovato = 1;
}
else{
aux = aux->next;
}
}
//caso 3: uscita while per non trovato genere
if (aux == NULL){
inserisciInTestaG(pg, a);
}
}
int cancella_da_GeneriAlim(Generi_Alimentari *pg, tipoArticolo a){
Generi_Alimentari aux = *pg;
while (aux != NULL){
if (strcmp(aux->info.genere_alim, a.genere_alimentare) == 0){
if (cancellaLista(&(aux->info.elencoArticoli), a) == 1){
return 1;
}
else
{
return 0;
}
}
aux = aux->next;
}
return 0;
}
void copia(listaArticoli l, Generi_Alimentari *pg){
while (l != NULL){
inserisciGeneriAlim(pg, l->info);
l = l->next;
}
}
void calcola(Generi_Alimentari pg, char* gen){
Generi_Alimentari aux = pg;
listaArticoli l = NULL;
float prezzomedio = 0.0;
int quantitamedia = 0;
int totale = 0;
while (aux != NULL && !totale){
if (strcmp(aux->info.genere_alim, gen) == 0){
l = aux->info.elencoArticoli;
while (l != NULL){
prezzomedio = prezzomedio + l->info.prezzo;
quantitamedia = quantitamedia + l->info.quantita;
totale++;
l = l->next;
}
printf("\nPer il Genere %s il prezzo medio dei prodotti è %f\n con una giacenza media di %d", gen, prezzomedio / totale, quantitamedia / totale);
}
else aux = aux->next;
}
if (!totale){
printf("\n Gen non trovata o priva di prodotti");
}
}
int main(){
char nomefile[20];
listaArticoli L;
Generi_Alimentari G;
tipoArticolo a;
int scelta;
initListaArticoli(&L);
initListaGeneri(&G);
do{
scelta = menu();
switch (scelta){
case 0: break;
case 1: {
printf("inserire nome file: \n");
scanf("%s", nomefile);
printf("elementi caricati: %d\n", caricaLista(nomefile, &L));
break;
}
case 2: {
//modifica prezzo
break;
}
case 3: {
printf("inserire codice prodotto: \n");
scanf("%s", a.codice);
printf("inserisci codice genere: \n");
if (cancellaLista(&L, a) == 1){
printf("cancellazione eseguita\n");
}
else{
printf("cancellazione non eseguita\n");
}
break;
}
case 4:{
copia(L, &G);
printf("creazione completata\n");
break;
}
case 5:{
printf("inserisci codice genere");
scanf("%s", a.genere_alimentare);
calcola(G, a.genere_alimentare);
break;
}
case 6:{
break;
}
case 7:{
visita_GeneriAlimentari(G);
break;
}
}
} while (scelta != 0);
}