Gestione lista a puntatori conteggio dei float

di il
3 risposte

Gestione lista a puntatori conteggio dei float

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


}








3 Risposte

  • Re: Gestione lista a puntatori conteggio dei float

    Perché hai pensato a quel vettore ?

    La lista va esaminata una sola volta, dall'inizio alla fine.
    Quindi, dato che passi solo una volta da ogni nodo, a che serve un vettore per indicare che già sei passato?

    Soprattutto mi chiedo, qual è la tua strategia per accumulare i valori in base alla similitudine del cognome/nome ?
  • Re: Gestione lista a puntatori conteggio dei float

    Metti caso la mia lista contiene come nomi a b c a b z comincio il conteggio di a e scopro che a paga un prezzo x poi faccio b poi c a questo punto se non mi accorgo che i soldi di a già li ho conteggiati riconteggerei solamente la seconda a avendo come soldi per la prima a il valore x e per la seconda a un altro valore per il conteggio avevo pensato ad un vettore di float sempre in parallelo che per ogni cella è associata una persona
  • Re: Gestione lista a puntatori conteggio dei float

    Analizzando la lista, nodo per nodo, devi

    1) estrarre il nome

    2) cercarlo all'interno di una seconda lista

    3a) se trovi il nome nella seconda lista, aggiungi il valore del nodo della prima al valore del nodo trovato nella seconda

    3b) se non trovi il nome nella seconda lista, aggiungi questo nome e il valore in coda

    4) visualizzi tutta la seconda lista
Devi accedere o registrarti per scrivere nel forum
3 risposte