Salve ragazzi sto gestendo una lista a puntatori che ha i seguenti campi nome cognome e un campo float per un prezzo questa lista può avere anche più volte lo stesso nome e cognome se è così la persona è la stessa io devo fare il conteggio del campo float stando quindi attendo ad escludere le persone già precedentemente conteggiate esempio:
nome 1 nome2 nome3 nome1
cognome1 cognome2 cognome3 cognome1
euro 10.00 15.00 7.10 20.00
questa lista deve stampare
nome 1 nome2 nome3
cognome1 cognome2 cognome3
euro 30 euro 15 7.10
avevo pensato di gestire un vettore parallelo sotto mettendo 1 in corrispondenza dei nodi già conteggiati in modo da non conteggiarli più in questo modo
nome 1 nome2 nome3 nome1
cognome1 cognome2 cognome3 cognome1
euro 10.00 15.00 7.10 20.00
| 1 | | 0 | | 0 | | 1 |
e creando man mano dei nodi che salvano solo una volta ogni persona con il totale. ma secondo me ho combinato un mezzo casino xd vi posto il sorgente molto lungo (350 righe) se volete darmi 1 suggerimento anche senza correggere il codice ben venga
// gestione di un database di un parrucchiere
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct parrucchiere
{
char *nome_cliente;
char *cognome_cliente;
float prezzo_taglio;
char *nome_taglio;
struct parrucchiere *next;
};
struct parrucchiere *inizializza(struct parrucchiere* barbiere);
struct parrucchiere* inserisci(struct parrucchiere *barbiere,char*nome,char*cognome,float prezzo,char*taglio);
struct parrucchiere*creanodo(char*nome,char*cognome,float prezzo,char *taglio);
void stampa(struct parrucchiere*barbiere);
int conta(struct parrucchiere*barbiere);
void trasferisci_nel_vettore(struct parrucchiere *barbiere);
void crea_vettore_parallelo(struct parrucchiere *vet,int size);
void totale_prezzo_per_ogni_cliente(int*vet_paralelo,struct parrucchiere *vet,int size);
float totale_cliente(int *Vet_parallelo,struct parrucchiere *vet,int size,int j,struct parrucchiere*);
void stampa_totale_clienti(struct parrucchiere*vet,float*prezzi_clienti);
void inizializza_nome_cognome_taglio(char *nome,char*cognome,char*taglio);
int main(void)
{
struct parrucchiere *barbiere = NULL;
int scelta;
char *nome = NULL,*cognome=NULL,*taglio=NULL;
float prezzo=0;
barbiere=inizializza(barbiere);
nome=(char*)malloc(sizeof(char));
cognome=(char*)malloc(sizeof(char));
taglio=(char*)malloc(sizeof(char));
do{
printf("1: acquisisci \n");
printf("2:stampa\n");
printf("3:stampa totale\n");
printf("4:esci\n");
scanf("%d",&scelta);
switch(scelta)
{
case 1:
printf("inserisci il nome\n");
scanf("%s",nome);
printf("inserisci il cognome\n");
scanf("%s",cognome);
printf("inserisci il nome del taglio\n");
scanf("%s",taglio);
printf("inserisci il costo\n");
scanf("%f",&prezzo);
barbiere=inserisci(barbiere,nome,cognome,prezzo,taglio);
break;
case 2:
stampa(barbiere);
break;
case 3:
trasferisci_nel_vettore(barbiere);
break;
case 4:
printf("arrivederci\n");
break;
default: printf("scelta errata\n");
}
}while(scelta!=4);
}
struct parrucchiere *inizializza(struct parrucchiere *barbiere)
{
barbiere=(struct parrucchiere*)malloc(sizeof(struct parrucchiere));
barbiere->nome_cliente=(char*)malloc(sizeof(char));
barbiere->cognome_cliente=(char*)malloc(sizeof(char));
barbiere->nome_taglio=(char*)malloc(sizeof(char));
strcpy(barbiere->nome_cliente,"vuoto");
strcpy(barbiere->cognome_cliente,"vuoto");
strcpy(barbiere->nome_taglio,"vuoto");
barbiere->prezzo_taglio=0.00;
barbiere->next=NULL;
return barbiere;
}
struct parrucchiere*creanodo(char *nome,char*cognome,float prezzo,char*taglio)
{
struct parrucchiere *app = NULL;
app=inizializza(app);
strcpy(app->nome_cliente,nome);
strcpy(app->cognome_cliente,cognome);
strcpy(app->nome_taglio,taglio);
app->prezzo_taglio=prezzo;
//app->next=NULL gia fatto quando chiamo inizializza;
return app;
}
struct parrucchiere* inserisci(struct parrucchiere *barbiere,char*nome,char*cognome,float prezzo,char*taglio)
{
struct parrucchiere *copia,*app=NULL;
copia=barbiere;
app=creanodo(nome,cognome,prezzo,taglio);
while(copia->next!=NULL)
{
copia=copia->next;
}
copia->next=app;
return barbiere;
}
void stampa(struct parrucchiere *barbiere)
{
struct parrucchiere *copia;
copia=barbiere;
copia=copia->next;// primo nodo è fasullo
while(copia!=NULL)
{
printf("Nome : %s \n",copia->nome_cliente);
printf("Cognome : %s \n",copia->cognome_cliente);
printf("Tipo taglio : %s\n",copia->nome_taglio);
printf("Costo : %g\n",copia->prezzo_taglio);
printf("________________________________\n");
copia=copia->next;
}
}
int conta(struct parrucchiere *barbiere)
{
int cont=0;
struct parrucchiere * copia;
copia=barbiere;
while(copia!=NULL)
{
cont++;
copia=copia->next;
}
return cont;
}
void trasferisci_nel_vettore(struct parrucchiere *barbiere)
{
int size,i;
struct parrucchiere *vet,*copia;
size=conta(barbiere);
vet=(struct parrucchiere*)malloc(size*sizeof(struct parrucchiere));
i=0;
copia=barbiere;
while(copia!=NULL)
{
vet[i].nome_cliente=(char*)malloc(sizeof(char));
strcpy(vet[i].nome_cliente,copia->nome_cliente);
vet[i].cognome_cliente=(char*)malloc(sizeof(char));
strcpy(vet[i].cognome_cliente,copia->cognome_cliente);
vet[i].nome_taglio=(char*)malloc(sizeof(char));
strcpy(vet[i].nome_taglio,copia->nome_taglio);
vet[i].prezzo_taglio=copia->prezzo_taglio;
i++;
copia=copia->next;
}
crea_vettore_parallelo(vet,size);
}
void crea_vettore_parallelo(struct parrucchiere *vet,int size)
{
int *vet_parallelo;
int i;
vet_parallelo=(int *)malloc(size*sizeof(int));
for(i=0;i<size;i++)
{
vet_parallelo[i]=0; // vettore parallelo tutti elementi uguali a 0 servira al prossimo sottoprogramma
}
totale_prezzo_per_ogni_cliente(vet_parallelo,vet,size);
}
void totale_prezzo_per_ogni_cliente(int *vet_parallelo,struct parrucchiere *vet,int size)
{
float *prezzi_cliente;
int i,j;
struct parrucchiere *nuova_lista = NULL;
nuova_lista=inizializza(nuova_lista);
prezzi_cliente=(float*)malloc(size*sizeof(prezzi_cliente));
// le caselle che avranno 1 vuol dire che sono state già conteggiate;
j=0;
for(i=0;i<size;i++)
{
if(vet_parallelo[j]==0)
{ // cella mai controllata prima d'ora
prezzi_cliente[j]=totale_cliente(vet_parallelo,vet,size,j,nuova_lista);
j++;// la j mi servirà successivamente per capire la nuova lunghezza del vettore
}
}
stampa_totale_clienti(nuova_lista,prezzi_cliente);
}
float totale_cliente(int *vet_parallelo,struct parrucchiere *vet,int size,int j,struct parrucchiere *nuova_lista )
{
float conteggio;
int copia_j;
copia_j=j; // copia j avanzerà mentre j è di riferimento , se copia j trova una cella con nome e cognome uguale a j il prezzo verrà sommato e vet_parallelo[copia_j]=1; // elemento controllato
conteggio=vet[j].prezzo_taglio;
copia_j++;
while(copia_j<size)
{
if((strcmp(vet[j].nome_cliente,vet[copia_j].nome_cliente)==0)&&(strcmp(vet[j].cognome_cliente,vet[copia_j].cognome_cliente)==0))// nome e cognome coincidono sono la stessa persona sommo quando ha speso in giorni differenti
{
conteggio=conteggio+vet[copia_j].prezzo_taglio;
vet_parallelo[copia_j]=1;
nuova_lista=inserisci(nuova_lista,vet[j].nome_cliente,vet[j].cognome_cliente,conteggio,"null");
}
copia_j++;
}
return conteggio;
}
void stampa_totale_clienti(struct parrucchiere *nuova_lista,float*prezzi_cliente)
{
nuova_lista=nuova_lista->next;
while(nuova_lista!=NULL){
printf("nome: %s\n",nuova_lista->nome_cliente);
printf("cognome: %s\n",nuova_lista->cognome_cliente);
printf("totale: %g\n",nuova_lista->prezzo_taglio);
printf("___________________________\n");
nuova_lista=nuova_lista->next;
}
}