Esercizio in C. Crasha.

di il
12 risposte

Esercizio in C. Crasha.

Ho fatto il seguente esercizio:
Un allevamento di bestiame vuole archiviare i propri armenti in modo da conoscere
per ogni capo di bestiame il tipo (ovino, bovino caprino), l’età e il peso.
Il programma deve:
-stampare il capo con età massima
-stampare il peso medio di tutti i capi di bestiame di un certo tipo
-stampare il numero di tutti i capi di bestiame per ogni tipo


#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <errno.h>
#include <float.h>
#include <math.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <conio.h>


main() {
    //DICHIARAZIONE DELLE VARIABILI
    
    int n;
    int ovino=0, bovino=0, caprino=0;
    int eta=0;
    int etamaxo=0, etamaxb=0, etamaxc=0;
    int peso=0, pesoo=0, pesob=0, pesoc=0;
    int pesomo=0, pesomb=0, pesomc=0;
    char tipo;
    int i;     
    //CORPO DEL PROGRAMMA
    printf("Inserisci quanti capi di bestiame hai.\n");
    scanf("%d", &n);
    
    for(i=0; i<=n-1; i++){    
                          
                          printf("Inserisci il tipo di animale.\n-Se ovino digita 'o'.\n-Se bovino digita 'b'.\n-Se caprino digita 'c'.\n");
                          scanf("%c", &tipo);
                          while(getchar()!='\n');
                          printf("\nInsercisci l'eta'.\n");
                          scanf("%d", &eta);
                          printf("\nInserisci il peso.\n");
                          scanf("%d", &peso);
                          printf("\n-----------------------------------------------------\n\n");
                          
                          if (tipo == 'o') {
                                            ovino++; //incrementa ovino
                                            
                                            pesoo+=peso; //somma dei pesi ovini
                                            //eta massima ovino
                                            if (eta>etamaxo) {
                                                etamaxo=eta;
                                                }
                                            } 
                          else if (tipo == 'b') {
                                            bovino++; //incrementa bovino
                                            
                                            pesob+=peso; //somma dei pesi bovini
                                            //eta massima bovino
                                            if (eta>etamaxb) {
                                                etamaxb=eta;
                                                }
                                            }
                          else if (tipo == 'c') {
                                            caprino++; //incrementa caprino
                                            
                                            pesoc+=peso; //somma dei pesi caprino
                                            //eta massima caprino
                                            if (eta>etamaxc) {
                                                etamaxc=eta;
                                                }
                                            }                      
                                       
    } //END for
    
    //peso medio
    pesomo=pesoo/ovino;
    pesomb=pesob/bovino;
    pesomc=pesoc/caprino;
    
    
     printf("Il capo di tipo ovino piu' pesante, pesa: %d.\n",pesoo);
     printf("Il capo di tipo bovino piu' pesante, pesa: %d.\n",pesob);
     printf("Il capo di tipo caprino piu' pesante, pesa: %d.\n",pesoc);
     printf("\n-----------------------------------------------------\n\n");
     printf("Il peso medio di tutti i capi di tipo ovino e': %d.\n",pesomo);
     printf("Il peso medio di tutti i capi di tipo bovino e': %d.\n",pesomb);
     printf("Il peso medio di tutti i capi di tipo caprino e': %d.\n",pesomc);
     printf("\n-----------------------------------------------------\n\n");
     printf("I capi di bestiame di tipo ovino sono: %d.\n",ovino);
     printf("I capi di bestiame di tipo bovino sono: %d.\n",bovino);
     printf("I capi di bestiame di tipo caprino sono: %d.\n",caprino);
     
    
    getch();
    return 0;
} 
Mi sembra scritto giusto, ma crasha dopo tutti gli input.
Cosa potrebbe essere?

12 Risposte

  • Re: Esercizio in C. Crasha.

    Una dritta per capire il tuo problema ... ricorda che le "divisioni per zero" non sono consentite e, se può capitare, va controllato prima di fare la divisione.
  • Re: Esercizio in C. Crasha.

    oregon ha scritto:


    Una dritta per capire il tuo problema ... ricorda che le "divisioni per zero" non sono consentite e, se può capitare, va controllato prima di fare la divisione.
    Grazie per la dritta, ma non credo,nella mia ignoranza, che sia questo il problema per cui crasha..
    Poi non so..
  • Re: Esercizio in C. Crasha.

    Quindi non credi che ti abbia dato una indicazione corretta ...

    Ma cosa ti dà questa certezza ?
  • Re: Esercizio in C. Crasha.

    oregon ha scritto:


    Quindi non credi che ti abbia dato una indicazione corretta ...

    Ma cosa ti dà questa certezza ?
    Non e' una certezza, più che altro intuito.. se fosse stato per questo problema come dici tu delle divisioni per zero, doveva crashare solo se uno dei tre tipi di bestiame non si incrementava, ma dato che li faccio incrementare tutti e 3, non ci sono divisione per 0..
    Almeno, credo.

    Comunque sia, se fosse come dici, non saprei come risolvere il problema..
  • Re: Esercizio in C. Crasha.

    Il problema "diretto" sono le divisioni, dato che il valore dei tre denominatori è sempre zero.

    Il perché sia sempre zero, quindi la causa indiretta del crash, dipende dal fatto che l'input della variabile tipo viene influenzato dalla scanf precedenti dopo le quali non pulisci il buffer come fai in altri casi.
  • Re: Esercizio in C. Crasha.

    oregon ha scritto:


    Il problema "diretto" sono le divisioni, dato che il valore dei tre denominatori è sempre zero.

    Il perché sia sempre zero, quindi la causa indiretta del crash, dipende dal fatto che l'input della variabile tipo viene influenzato dalla scanf precedenti dopo le quali non pulisci il buffer come fai in altri casi.
    Quindi devo mettere:
    while(getchar()!='\n');
    dopo ogni scanf?
    Ho provato, no funziona lo stesso..
  • Re: Esercizio in C. Crasha.

    Ho provato, no funziona lo stesso..
    Sicuro?

    Mostra il codice con le modifiche ...
  • Re: Esercizio in C. Crasha.

    
    #include <stdio.h>
    #include <assert.h>
    #include <ctype.h>
    #include <errno.h>
    #include <float.h>
    #include <math.h>
    #include <stddef.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
    #include <conio.h>
    
    
    main() {
        //DICHIARAZIONE DELLE VARIABILI
        
        int n;
        int ovino=0, bovino=0, caprino=0;
        int eta=0;
        int etamaxo=0, etamaxb=0, etamaxc=0;
        int peso=0, pesoo=0, pesob=0, pesoc=0;
        int pesomo=0, pesomb=0, pesomc=0;
        char tipo;
        int i;     
        //CORPO DEL PROGRAMMA
        printf("Inserisci quanti capi di bestiame hai.\n");
        scanf("%d", &n);
        
        for(i=1; i<=n; i++){    
                              
                              printf("Inserisci il tipo di animale.\n-Se ovino digita 'o'.\n-Se bovino digita 'b'.\n-Se caprino digita 'c'.\n");
                              scanf("%c", &tipo);
                              while(getchar()!='\n');
                              printf("\nInsercisci l'eta'.\n");
                              scanf("%d", &eta);
                              while(getchar()!='\n');
                              printf("\nInserisci il peso.\n");
                              scanf("%d", &peso);
                              while(getchar()!='\n');
                              printf("\n-----------------------------------------------------\n\n");
                              
                              if (tipo == 'o') {
                                                ovino++; //incrementa ovino
                                                
                                                pesoo=pesoo+peso; //somma dei pesi ovini
                                                //eta massima ovino
                                                if (eta>etamaxo) {
                                                    etamaxo=eta;
                                                    }
                                                } 
                              else if (tipo == 'b') {
                                                bovino++; //incrementa bovino
                                                
                                                pesob=pesob+peso; //somma dei pesi bovini
                                                //eta massima bovino
                                                if (eta>etamaxb) {
                                                    etamaxb=eta;
                                                    }
                                                }
                              else if (tipo == 'c') {
                                                caprino++; //incrementa caprino
                                                
                                                pesoc=pesoc+peso; //somma dei pesi caprino
                                                //eta massima caprino
                                                if (eta>etamaxc) {
                                                    etamaxc=eta;
                                                    }
                                                }                      
                                           
        } //END for
        
        //peso medio
        pesomo=pesoo/ovino;
        pesomb=pesob/bovino;
        pesomc=pesoc/caprino;
        
        
         printf("Il capo di tipo ovino piu' pesante, pesa: %d.\n",pesoo);
         printf("Il capo di tipo bovino piu' pesante, pesa: %d.\n",pesob);
         printf("Il capo di tipo caprino piu' pesante, pesa: %d.\n",pesoc);
         printf("\n-----------------------------------------------------\n\n");
         printf("Il peso medio di tutti i capi di tipo ovino e': %d.\n",pesomo);
         printf("Il peso medio di tutti i capi di tipo bovino e': %d.\n",pesomb);
         printf("Il peso medio di tutti i capi di tipo caprino e': %d.\n",pesomc);
         printf("\n-----------------------------------------------------\n\n");
         printf("I capi di bestiame di tipo ovino sono: %d.\n",ovino);
         printf("I capi di bestiame di tipo bovino sono: %d.\n",bovino);
         printf("I capi di bestiame di tipo caprino sono: %d.\n",caprino);
         
        
        getch();
        return 0;
  • Re: Esercizio in C. Crasha.

    Non lo hai aggiunto a *tutte* le scanf ...
  • Re: Esercizio in C. Crasha.

    oregon ha scritto:


    Non lo hai aggiunto a *tutte* le scanf ...
    Hai ragione.. la mia distrazione non ha limiti
    Ma adesso mi sorge una domanda.
    Io sono venuto a conoscenza di questo "while(getchar()!='\n');" solamente oggi.
    Perché tutti gli esercizi precedenti ad oggi mi funzionavano tutti,senza problemi?

    Re-Edit.
    Forse perché è la prima volta che lavoro con IF con CHAR.
  • Re: Esercizio in C. Crasha.

    saylar36 ha scritto:


    oregon ha scritto:


    Non lo hai aggiunto a *tutte* le scanf ...
    Hai ragione.. la mia distrazione non ha limiti
    Come darti torto ...
    Perché tutti gli esercizi precedenti ad oggi mi funzionavano tutti,senza problemi?
    Perché non hai gestito input di char con una scanf.

    Qualche altro consiglio ... inserisci la while in una funzione del tipo
    
    void clrinp()
    {
       while(getchar() != '\n') ;
    }
    
    e richiamala nel main con

    clrinp();

    dove ti serve al posto di riscrivere la while.

    In ogni caso fai il controllo del denominatore nelle divisioni perché, altrimenti, se il denominatore sarà zero avrai il crash.
  • Re: Esercizio in C. Crasha.

    Grazie, ho risolto tutto!
    Ho fatto come hai detto tu..
    Ho messo un IF di controllo del denominatore e adesso funziona alla grande!

    Al prossimo esercizio!
Devi accedere o registrarti per scrivere nel forum
12 risposte