Unsigned int per variabile counter in iterazione con flag

di il
10 risposte

Unsigned int per variabile counter in iterazione con flag

Ciao a tutti, mi sono appena registrato dopo aver cercato nei post del forum per evitare il crossposting.

Tenterò di essere breve, sto studiando il C su testo Paul Harvey Daitel, mi è poco chiaro l'utilizzo di unsigned int in merito alla dichiarazione della variabile COUNTER in un programmino che calcola la media dei voti disciplinato da iterazione controllata da sentinella o flag value.
Serve affinchè vengano accettati solo valori non negativi 0 e oltre, la mia perplessità è perchè utilizzarlo per contare ( variabile COUNTER ) e non per la variabile GRADE cioè la variabile assegnata ai voti che l'utente inserisce ?

Ne consegue una confusione circa la fase di inizializzazione con flag value di COUNTER e TOTAL partono da 0 mentre nell'iterazione controllata da contatore TOTAL = 0 e COUNTER = 1

Spero di risultare abbastanza comprensibile, sono conscio che si tratta un concetto basico, ma voglio escludere dubbi per non minare solide basi per imparare, grazie a tutti per l'attenzione.

10 Risposte

  • Re: Unsigned int per variabile counter in iterazione con flag

    Una variabile unisgned non tiene conto del segno, quindi verrà considerata come positiva, si utilizza nel contatore quindi poichè' lui può solo incrementare e mai essere negativo, proprio per questo non abbiamo bisogno di considerare il segno. Non so se il tuo dubbio fosse legato a ciò casomai prova a spiegarti meglio.
  • Re: Unsigned int per variabile counter in iterazione con flag

    Sarebbe più comodo se postassi l'esempio.
    Usare unsigned per il contatore permette di raggiungere valori più alti, in quanto tutto il range di valori che può assumere è riservato ai positivi.
    Per i voti penso che abbia usato int così può controllare se l'utente sbagli ad inserire.
    Se hai un codice del tipo
    
    unsigned int voto;
    scanf("%u",&voto);
    if(voto < 0) 
        printf("Errore, deve essere maggiore di 0\n");
    printf("%u",voto);
    
    L'inserimento di voti negativi viene implicitamente interpretato come positivo e non darà alcun errore, ad esempio -5 viene visto come 4294967291 (può differire a seconda dell'architettura e del compilatore). Provare per credere.
  • Re: Unsigned int per variabile counter in iterazione con flag

    In effetti Alexv è così ...
    esempio FFFF = 255 ... quando invece con signed hai -1 ...
  • Re: Unsigned int per variabile counter in iterazione con flag

    No FFFF non è 255.

    Comunque MOS6510 (che nick impegnativo! Quanti ricordi...) la questione è se serve testare il segno (no nel caso del contatore, sì nel caso del voto).
  • Re: Unsigned int per variabile counter in iterazione con flag

    Innanzitutto grazie per la celerità delle risposte, qui di seguito il codice che mi avete chiesto circa l'iterazione controllata da sentinella, si nota l'inizializzazione del counter a 0 mentre nell'iterazione definita o controllata da contatore, il counter è inizializzato a 1 questa discrepanza non mi è chiara, grazie mille \(^__^)

    #include <stdio.h>
    // media di una classe con iterazione controllata da sentinella ( flag value )

    int main(void){
    unsigned int counter;
    int grade;
    int total;
    float average;

    total = 0;
    counter = 0;

    printf( "%s", "Enter your grade : -1 to end" );
    scanf( "%d", &grade );

    // ripetizione fino a quando non viene letto il valore sentinella o flag value

    while ( grade != -1){
    total = total + grade;
    counter = counter + 1;

    // riceve il voto successivo dall'utente

    printf( "%s", "Enter your grade, -1 to end: " ); // prompt per l'imput
    scanf( "%d", &grade ); // legge il prossimo voto

    } // fine di while

    // fase di chiusura
    // se l'utente ha inserito almeno un voto

    if ( counter != 0){

    // calcola la media di tutti i voti inseriti
    average = ( float ) total / counter;

    // stampa la media con la precisione di due cifre

    printf( "Class average is %.2f\n", average );
    } // fine di if

    else { // se non stati inseriti voti, stampa un messaggio
    puts( "No grades were entered" );

    } // fine di else

    } // fine della funzione main
  • Re: Unsigned int per variabile counter in iterazione con flag

    Usa i tag CODE (pulsante < / >)

    Non è inizializzato a uno counter. Leggi bene il codice

    Comunque sì, il codice è scritto in maniera svogliata, ad esempio potrei inserire -2 senza obiezioni.

    Prova tu a scriverlo in maniera esaustiva, magari controllando il return value di scanf()
  • Re: Unsigned int per variabile counter in iterazione con flag

    Che cosa intendi per scritto in maniera svogliata ?
    Lo so che è a 0 , è previsto così per l'iterazione controllata da sentinella o flag che dir si voglia, infatti risulta a uno quando si utilizza un'iterazione definita come questo :
    
    #include <stdio.h>
    
    int main( void )
    {
        unsigned int counter;
        int grade;
        int average;
        int total;
    
        total = 0;
        counter = 1;
        
        // fase di elaborazione
    
        while ( counter <= 10 ) {
            printf( "%s", "Enter grade : " );
            scanf( "%d", &grade );
            total = total + grade;
            counter = counter +1;
        }
        average = total / 10;
        printf( "Class average is %d\n", average );
        return 0;
    
    }
    
  • Re: Unsigned int per variabile counter in iterazione con flag

    Guarda che i codici non sono equivalenti.

    Nel primo puoi anche non inserire alcun voto, nel secondo no
  • Re: Unsigned int per variabile counter in iterazione con flag

    MOS6510 ha scritto:


    Che cosa intendi per scritto in maniera svogliata ?
    Che non controlla tutti gli errori che potrebbe fare l'utente e che usa il counter come signed int quando si sarebbe potuto fare diversamente
    Lo so che è a 0 , è previsto così per l'iterazione controllata da sentinella o flag che dir si voglia, infatti risulta a uno quando si utilizza un'iterazione definita come questo :
    
    #include <stdio.h>
    
    int main( void )
    {
        unsigned int counter;
        int grade;
        int average;
        int total;
    
        total = 0;
        counter = 1;
        
        // fase di elaborazione
    
        while ( counter <= 10 ) {
            printf( "%s", "Enter grade : " );
            scanf( "%d", &grade );
            total = total + grade;
            counter = counter +1;
        }
        average = total / 10;
        printf( "Class average is %d\n", average );
        return 0;
    
    }
    
    Ma scusa che obiezione sarebbe?
    A parte che non puoi fermarti subito come ha detto Oregon, non puoi nemmeno inserire un totale diverso da dieci.

    E poi cosa importa il valore iniziale di counter nel tuo codice? Potresti scrivere
    
        counter = 101;
    
        while ( counter <= 110 ) {
            printf( "%s", "Enter grade : " );
            scanf( "%d", &grade );
            total = total + grade;
            counter = counter +1;
        }
    
    oppure
    
        counter = 10;
    
        while ( counter ) {
            printf( "%s", "Enter grade : " );
            scanf( "%d", &grade );
            total = total + grade;
            counter = counter -1;
        }
    
  • Re: Unsigned int per variabile counter in iterazione con flag

    Ciao a tutti, vi ringrazio per le risposte, probabilmente sono stato un pò confusionario, lo so che non sono codici equivalenti, nel capitolo che stavo studiando c'erano i controlli degli algoritmi con l'iterazione definita e quella regolata dal valore sentinella o flag.
    Questi semplici codici fungevano da esempio, ciò che avevo notato e che non riuscivo a spiegarmi era solo differenza di inizializzazione della variabile COUNTER che nell'iterazione definita da contatore è inizializzata a 1 come nel codice che avevo mostrato nei post precedenti, mentre in quella controllata da sentinella o flag value è inizializzata a 0.
    Sono un principiante, forse dovrei andare avanti con lo studio degli altri capitoli, semmai ampliando la conoscenza ritornerò su questo argomento con una consapevolezza diversa ed una visione d'insieme maggiore.
    Continuerò a fare esercizi, grazie a tutti.
Devi accedere o registrarti per scrivere nel forum
10 risposte