Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    13

    [C] Esercizio su creazione lista

    Salve a tutti,
    sono alle primissime armi, ho fatto un esercizio che funziona in tutti i suoi quesiti richiesti meno l'ultimo (anche se sicuramente anche dove funziona non è il massimo nella risoluzione, ma ripeto sono alle primissime armi)
    Ecco il testo:


    ******************************
    Negozio dei cellulari

    Si consideri un archivio dei cellulari contenente 100 modelli conservato in un archivio S:
    Codice numerico del modello (progressivo univoco da 1 a 100)
    Durata batteria
    Peso
    Prezzo acquisto
    Numero totale di pezzi

    Esistano 2 negozi, ognuno con il suo archivio del magazzino (rispettivamente N1, N2 di MAX 1.000 elementi l'uno) dei cellulari arrivati:
    Codice numerico del modello (lo stesso dell'archivio S)
    Prezzo di vendita unitario
    Numero pezzi arrivati di questo modelli

    N.B.: di un modello possono arrivare anche 2 stock con differente numero di pezzi

    ESERCIZIO BASE

    Scrivere in C un programma che:
    1) Legge da tastiera le informazioni relative ai 100 modelli di cellulari mettendo il numero totale a 0.
    2) Legge da tastiera il nome del negozio e chiama una funzione "magazzino" che legge da tastiera, in ordine casuale, ed inserisce nell'archivio gli arrivi.
    3) Chiama una funzione "aggiorna" S che aggiorna il numero totale di pezzi arrivati nel negozio precedente nell'archivio dei cellulari S.
    4) Chiama una funzione "ordina" che ordina gli archivi N1 ed N2 in base al Prezzo di vendita unitario e rende il valore totale dei cellulari presenti in quel magazzino.


    ESERCIZIO 1

    Inserire nel programma una funzione “Merce” che crea un vettore ordinato in base al prezzo di vendita unitario in cui sono presenti gli articoli di entrambi i negozi.

    ESERCIZIO 2

    Scrivere una funzione che costruisce 2 liste (L1 ed L2) contenenti rispettivamente tutti cellulari presenti nel magazzino N1 con peso superiore a 100 e minore di 100.

    NB: le variabili usate devono essere locali e non è necessario controllare la correttezza dei dati in input.
    ************************************************** ***********

    ecco come ho risolto l'ultimo quesito, inizialmente le definizioni delle SD:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
            int codice_modello;
            int durata_batteria;
            int peso;
            float prezzo_acquisto;
            int tot_pezzi_modello;} scheda_cellulare;
            
    typedef struct {
            scheda_cellulare c;
            float prezzo_vendita;
            int pezzi_arrivati_modello;} scheda_magazzino;
            
    #define Smax 100
    #define Nmax 1000
    
    typedef scheda_cellulare S[Smax];
    typedef scheda_magazzino N[Nmax];
    
    
    struct nodo{
            scheda_magazzino cellulare;
            struct nodo *next;};
    
    void crealista(N Neg, int numero_arrivi)  {
         struct nodo *testaL1;
         struct nodo *nuovoElementoL1;         
         testaL1=NULL;
         struct nodo *testaL2;
         struct nodo *nuovoElementoL2;         
         testaL2=NULL;
         int i;
         for(i=0;i<numero_arrivi;i++)  {
             if(Neg[i].c.peso>100) 
             {
                nuovoElementoL1=(struct nodo*)malloc(sizeof(struct nodo));
                nuovoElementoL1->cellulare=Neg[i];
                nuovoElementoL1->next=testaL1; 
                testaL1=nuovoElementoL1;
             }
             else if(Neg[i].c.peso<100)  
             {
                nuovoElementoL2=(struct nodo*)malloc(sizeof(struct nodo));
                nuovoElementoL2->cellulare=Neg[i];
                nuovoElementoL2->next=testaL2; 
                testaL2=nuovoElementoL2;
             } 
         }   
         struct nodo *tmp;  //stampa della lista
         tmp=testaL1;
         while(tmp!=NULL)
         {          
          printf("%d ",tmp->cellulare.c.codice_modello);
          tmp=tmp->next;  
         }
    }

    Credo che ci sia un errore negli if , ma non sono riuscito a trovarlo.

    Grazie mille

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Puoi dire precisamente che errori ti da?

    P.s. la deallocazione della memoria ( free(pointer); ) non è opzionale...
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    13
    Originariamente inviato da Scara95
    Puoi dire precisamente che errori ti da?

    P.s. la deallocazione della memoria ( free(pointer); ) non è opzionale...
    Grazie per la risposta, vero mi devo ricordare di deallocare la memoria.
    Comunque non mi da nessun errore in compilazione, semplicemente è come se quella funzione non la eseguisse, credo che gli errori siano nell'if, senza gli if le liste vengono create, ma ovviamente non si risolve correttamente l'esercizio.
    Sotto ho scritto il minimo di codice che basta per fare una prova (se hai tempo).
    Grazie ciao


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
            int codice_modello;
            int durata_batteria;
            int peso;
            float prezzo_acquisto;
            int tot_pezzi_modello;} scheda_cellulare;
            
    typedef struct {
            scheda_cellulare c;
            float prezzo_vendita;
            int pezzi_arrivati_modello;} scheda_magazzino;
            
    #define Smax 3
    #define Nmax 5
    
    typedef scheda_cellulare S[Smax];
    typedef scheda_magazzino N[Nmax];
    
    void leggi(S S1);
    int magazzino(N Neg);
    void aggiorna(S S1,N Neg,int pezzi_arrivati_modello );
    
    void crealista(N Neg, int numero_arrivi);
    
    int main() {
        S S1={0};
        N N1={0};
        int numero_arriviN1=0;
        leggi(S1);
        numero_arriviN1=magazzino(N1);
        crealista(N1, numero_arriviN1);
        system("PAUSE");
        return 0;
    }     
    
    
    void leggi(S S1) {
         int i;
         for(i=0;i<Smax;i++) {
             S1[i].codice_modello=i+1;
             printf("Inserire la durata batteria del modello cell %d\n",i+1); 
             scanf("%d",&S1[i].durata_batteria);
             printf("Inserire il peso del modello cell %d\n",i+1);
             scanf("%d",&S1[i].peso);
             printf("Inserire il prezzo di acquisto del modello cell %d\n",i+1);
             scanf("%f",&S1[i].prezzo_acquisto);}
    }
    
    int magazzino(N Neg) {
        int i;
        int numero_arrivi=0;
        for(i=0;i<Nmax;i++) {     
                       printf("Inserire codice numerico dell'arrivo Nro %d\n",i+1); 
                       scanf("%d",&Neg[i].c.codice_modello); 
                       printf("Inserire il prezzo di vendita dell'arrivo Nro %d\n",i+1); 
                       scanf("%f",&Neg[i].prezzo_vendita);                 
                       printf("Inserire il num di pezzi arrivati dell'arrivo Nro %d\n",i+1); 
                       scanf("%d",&Neg[i].pezzi_arrivati_modello);
                       numero_arrivi++;
                       }
        return numero_arrivi; 
    }                    
    
    
    struct nodo{
            scheda_magazzino cellulare;
            struct nodo *next;};
    
    
    void crealista(N Neg, int numero_arrivi)  {
         struct nodo *testaL1;
         struct nodo *nuovoElementoL1;         
         testaL1=NULL;
         struct nodo *testaL2;
         struct nodo *nuovoElementoL2;         
         testaL2=NULL;
         int i;
         for(i=0;i<numero_arrivi;i++)  {
             if(Neg[i].c.peso>100) 
             {
                nuovoElementoL1=(struct nodo*)malloc(sizeof(struct nodo));
                nuovoElementoL1->cellulare=Neg[i];
                nuovoElementoL1->next=testaL1; 
                testaL1=nuovoElementoL1;
             }
             else if(Neg[i].c.peso<100)  
             {
                nuovoElementoL2=(struct nodo*)malloc(sizeof(struct nodo));
                nuovoElementoL2->cellulare=Neg[i];
                nuovoElementoL2->next=testaL2; 
                testaL2=nuovoElementoL2;
             } 
         }   
         struct nodo *tmp;
         tmp=testaL1;
         while(tmp!=NULL)
         {          
          printf("%d ",tmp->cellulare.c.codice_modello);
          tmp=tmp->next;  
         }
    }

  4. #4
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    ciao , ho guardato un po i messaggi che hai scritto ,

    Credo che il problema sia , S1 e N1 sono due array distinti e non hanno nulla in comune !
    S1 non è contenuto in N1 !
    Tu inseristi i dati in S1 , ma la struct scheda_cellulare di N1 non è mai inizializzata

    da cui i valori dei vari campi sono del tutto casuali .

    quando nella funzione crea lista , poni queste condizioni

    if(Neg[i].c.peso>100) , fai un confronto su campi che non sono mai stati inizializzati.

    i dati le devi inserire nella struct Neg[i].c , e non in S1 .

    codice:
    
    main....
     leggi(N1);
    
    -------------------------
    void leggi(N S1) {
         int i;
         for(i=0;i<Smax;i++) {
             S1[i].c.codice_modello=i+1;
             printf("Inserire la durata batteria del modello cell %d\n",i+1); 
             scanf("%d",&S1[i].c.durata_batteria);
       .....
       .....
       .....
    oltretutto , puoi stampare solo se il peso del cellulare è superiore a 100
    visto che stampi solo tmp=testaL1; , se crei la lista testal2 non stamperebbe niente comunque
    Tecnologia

  5. #5
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    13

    Re: ciao

    Originariamente inviato da torn24
    ciao , ho guardato un po i messaggi che hai scritto ,

    Credo che il problema sia , S1 e N1 sono due array distinti e non hanno nulla in comune !
    S1 non è contenuto in N1 !
    Tu inseristi i dati in S1 , ma la struct scheda_cellulare di N1 non è mai inizializzata
    si, hai perfettamente ragione.

    Quindi il problema è a monte.
    Riposto il testo per praticità

    **************************
    Negozio dei cellulari

    Si consideri un archivio dei cellulari contenente 100 modelli conservato in un archivio S:
    Codice numerico del modello (progressivo univoco da 1 a 100)
    Durata batteria
    Peso
    Prezzo acquisto
    Numero totale di pezzi

    Esistano 2 negozi, ognuno con il suo archivio del magazzino (rispettivamente N1, N2 di MAX 1.000 elementi l'uno) dei cellulari arrivati:
    Codice numerico del modello (lo stesso dell'archivio S)
    Prezzo di vendita unitario
    Numero pezzi arrivati di questo modelli

    N.B.: di un modello possono arrivare anche 2 stock con differente numero di pezzi

    ESERCIZIO BASE

    Scrivere in C un programma che:
    1) Legge da tastiera le informazioni relative ai 100 modelli di cellulari mettendo il numero totale a 0.
    2) Legge da tastiera il nome del negozio e chiama una funzione "magazzino" che legge da tastiera, in ordine casuale, ed inserisce nell'archivio gli arrivi.
    3) Chiama una funzione "aggiorna" S che aggiorna il numero totale di pezzi arrivati nel negozio precedente nell'archivio dei cellulari S.
    4) Chiama una funzione "ordina" che ordina gli archivi N1 ed N2 in base al Prezzo di vendita unitario e rende il valore totale dei cellulari presenti in quel magazzino.

    ESERCIZIO 1

    Inserire nel programma una funzione “Merce” che crea un vettore ordinato in base al prezzo di vendita unitario in cui sono presenti gli articoli di entrambi i negozi.

    ESERCIZIO 2

    Scrivere una funzione che costruisce 2 liste (L1 ed L2) contenenti rispettivamente tutti cellulari presenti nel magazzino N1 con peso superiore a 100 e minore di 100.
    ******************************************

    io avevo scritto la funzione "leggi" come sotto

    codice:
    typedef struct {
            int codice_modello;
            int durata_batteria;
            int peso;
            float prezzo_acquisto;
            int tot_pezzi_modello;} scheda_cellulare;
            
    typedef struct {
            scheda_cellulare c;
            float prezzo_vendita;
            int pezzi_arrivati_modello;} scheda_magazzino;
            
    #define Smax 100
    #define Nmax 1000
    
    typedef scheda_cellulare S[Smax];
    typedef scheda_magazzino N[Nmax];
    
    
    void leggi(S S1) {
         int i;
         for(i=0;i<Smax;i++) {
             S1[i].codice_modello=i+1;
             printf("Inserire la durata batteria del modello cell %d\n",i+1); 
             scanf("%d",&S1[i].durata_batteria);
             printf("Inserire il peso del modello cell %d\n",i+1);
             scanf("%d",&S1[i].peso);
             printf("Inserire il prezzo di acquisto del modello cell %d\n",i+1);
             scanf("%f",&S1[i].prezzo_acquisto);}
    }
    probabilmente "leggi" andrebbe riscritta sostituendo al posto di S1[i] , N1[i].c e il prototipo sarebbe quindi:
    void leggi(N N1);

    Che ne dici? pensi che tutto l'esercizio andrebbe risolto in quest'ottica? il effetti inserire i dati in S1 non è che abbia molto senso.
    Bisogna capire se come ho defito le SD può andar bene per come è definito l'esercizio.
    Grazie

  6. #6
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    ciao

    I mie suggerimenti riguardavano il sorgente NON l'esercizio "di cui non sapevo tra l'altro niente".

    Nel sorgente postato , usi dati inseriti in S1 , come fossero inseriti in N1 , che invece non è inizializzata . unico modo perchè i dati siano presenti in N1 è inserirli o copiarli in quest'ultimo.

    Quindi mi riferivo a un errore di programmazione .
    ------------------------------

    Mentre dalla traccia dell'esercizio è chiaro che vi debba essere S .

    Su l'esercizio non ti potrei aiutare neanche volendo , veramente mi è poco chiaro cosa chiede effettivamente , e il problema non è tanto fare quello che chiede , ma capire quello che chiede di fare . che credo sia anche il tuo solo problema !

    poi dovrei inserire i dati di 100 modelli da tastiera ?? non bastavano 5 modelli per un esercizio
    Tecnologia

  7. #7
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    551

    Ciao

    Io ho dato una mia interpretazione all'esercizio , ma non so se ho capito bene ,
    essenzialmente codice modello lo stesso dell'archivio S !? cosa vuol dire ?

    io avrei risolto in questo modo , modificando il codice che hai postato , ma poi se è corretto , se è interpretato il problema nel modo giusto , non SAPREI



    codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    typedef struct {
            int codice_modello;
            int durata_batteria;
            int peso;
            float prezzo_acquisto;
            int tot_pezzi_modello;} scheda_cellulare;
            
    typedef struct {
            int codice_modello; //DICE DI INSERIRE LO STESSO CODICE 
            float prezzo_vendita;
            int pezzi_arrivati_modello;} scheda_magazzino;
            
    #define Smax 3
    #define Nmax 5
    
    typedef scheda_cellulare S[Smax];
    typedef scheda_magazzino N[Nmax];
    
    void leggi(S S1);
    int magazzino(N Neg);
    void aggiorna(S S1,N Neg,int pezzi_arrivati_modello );
    int Return_peso(S S1, int codice);
    void crealista(N Neg,S S1, int numero_arrivi);
    
    int main() {
        S S1={0};
        N N1={0};
        int numero_arriviN1=0;
        leggi(S1);
        numero_arriviN1=magazzino(N1);
        crealista(N1,S1, numero_arriviN1);
        system("PAUSE");
        return 0;
    }     
    
    
    void leggi(S S1) {
         int i;
         for(i=0;i<Smax;i++) {
             S1[i].codice_modello=i+1;
             printf("Inserire la durata batteria del modello cell %d\n",i+1); 
             scanf("%d",&S1[i].durata_batteria);
             printf("Inserire il peso del modello cell %d\n",i+1);
             scanf("%d",&S1[i].peso);
             printf("Inserire il prezzo di acquisto del modello cell %d\n",i+1);
             scanf("%f",&S1[i].prezzo_acquisto);}
    }
    
    int magazzino(N Neg) {
        int i;
        int numero_arrivi=0;
        for(i=0;i<Nmax;i++) {     
                       printf("Inserire codice numerico dell'arrivo Nro %d\n",i+1); 
                       scanf("%d",&Neg[i].codice_modello); 
                       printf("Inserire il prezzo di vendita dell'arrivo Nro %d\n",i+1); 
                       scanf("%f",&Neg[i].prezzo_vendita);                 
                       printf("Inserire il num di pezzi arrivati dell'arrivo Nro %d\n",i+1); 
                       scanf("%d",&Neg[i].pezzi_arrivati_modello);
                       numero_arrivi++;
                       }
        return numero_arrivi; 
    }                    
    struct nodo{
            scheda_magazzino cellulare;
            struct nodo *next;};
    int Return_peso(S S1, int codice)// FUNZIONE SECONDARIA DI APPOGGIO 
    {
        int i;
        for(i=0;i<Smax;i++)
            if(S1[i].codice_modello==codice)
                return S1[i].peso;
        
        return 0;
        
        }
    
    void crealista(N Neg,S S1, int numero_arrivi)  {
         struct nodo *testaL1;
         struct nodo *nuovoElementoL1;         
         testaL1=NULL;
         struct nodo *testaL2;
         struct nodo *nuovoElementoL2;         
         testaL2=NULL;
         int i;
         for(i=0;i<numero_arrivi;i++)  {
             if( Return_peso(S1,Neg[i].codice_modello)>100) 
             {
                nuovoElementoL1=(struct nodo*)malloc(sizeof(struct nodo));
                nuovoElementoL1->cellulare=Neg[i];
                nuovoElementoL1->next=testaL1; 
                testaL1=nuovoElementoL1;
             }
             else if(Return_peso(S1,Neg[i].codice_modello)<100)  
             {
                nuovoElementoL2=(struct nodo*)malloc(sizeof(struct nodo));
                nuovoElementoL2->cellulare=Neg[i];
                nuovoElementoL2->next=testaL2; 
                testaL2=nuovoElementoL2;
             } 
         }   
         struct nodo *tmp;
         tmp=testaL1;
         while(tmp!=NULL)
         {          
          printf("%d ",tmp->cellulare.codice_modello);
          tmp=tmp->next;  
         }
    }
    Tecnologia

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2012
    Messaggi
    13

    Re: Ciao

    Originariamente inviato da torn24
    Io ho dato una mia interpretazione all'esercizio , ma non so se ho capito bene ,
    essenzialmente codice modello lo stesso dell'archivio S !? cosa vuol dire ?

    io avrei risolto in questo modo , modificando il codice che hai postato , ma poi se è corretto , se è interpretato il problema nel modo giusto , non SAPREI



    codice:
    
    
    int Return_peso(S S1, int codice)// FUNZIONE SECONDARIA DI APPOGGIO 
    {
        int i;
        for(i=0;i<Smax;i++)
            if(S1[i].codice_modello==codice)
                return S1[i].peso;
        
        return 0;
        
        }
    
    
             if( Return_peso(S1,Neg[i].codice_modello)>100)

    ciao,
    si in effetti non ha senso inizializzare il vettore Neg[i] nei campi peso, durata_batteria ecc, questi valori sono già stati inseriti nel vettore S[i] e si possono utilizzare facendo riferimento al codice_modello.
    Ho capito la tua soluzione e la condivido.
    Grazie mille per l'aiuto

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.