[...]la sentinella deve essere distinta dai dati regolari [...]

di il
11 risposte

[...]la sentinella deve essere distinta dai dati regolari [...]

[...] nel ciclo di iterazione controllata da sentinella la sentinella deve essere distanta dai dati regolari [...]

Salve a tutti,
vorrei chiedere, cortesemente, se qualcuno potrebbe farmi un pò di chiarezza su questa definizione. Se, per esempio, devo scrivere un semplicissimo codice sorgente dove c'è un ciclo di iterazione controllata da sentinella ( -999 per esempio ) e le condizioni delle due dell'istruzione while {} sono:

#include <stdio.h>
int main( void )
{
		int numeroIntero;
		while ( numeroIntero != -999 ) {
		
			while ( numeroIntero >= 100 ) {
				puts( "sei magnifico! Inserisci un altro numero intero (-999 per terminare)."  );
				scanf( "%d", &numeroIntero );
			}
			while ( numeroIntero < 100 ) {
				puts( "sei fantastico! Inserisci un altro numero intero (-999 per terminare)."  );
				scanf( "%d", &numeroIntero );
			}
		}
}
	
Come mai non riesco a terminare l'esecuzione con la sentinella -999 ??... Forse perchè viene confuso con un numero intero < di 100?? Devo forse usare la tipologia di variabile ___int unsigned numeroIntero___ in modo da essere distinta dai dati regolari????

Grazie.

11 Risposte

  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    In altre parole, per capire, tu devi inserire dei valori compresi tra ? e ? e concluder con -999

    Ma i valori accettati quali sono?
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    Be', -999 è effettivamente minore di 100, quindi entri nel secondo ciclo while dal quale non esci certo ribadendo che -999 è minore di 100...
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    E quale potrebbe essere una sentinella utile per questo ciclo di iterazione?? ...
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    Quella che vuoi, ma puoi banalmente mettere un break
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    oregon ha scritto:


    In altre parole, per capire, tu devi inserire dei valori compresi tra ? e ? e concludere con -999

    Ma i valori accettati quali sono?
    Ecco perchè mi chiedevo se fosse il caso di usare come variabile un "unsigned int numeroIntero" ma non credo che il discorso cambi....

    Si può usare come sentinella una PAROLA, per esempio END per terminare, ma bisognerebbe definire una variabile apposita.
    Scusate ma non sono molto avanti con il programma di studio... Non posso usare i numeri (-1 etc... perchè si tratta di un programmino per convertire un numero binario da una a 5 cifre in un numero decimale) ...

    Ciao...
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    +m2+ ha scritto:


    Quella che vuoi, ma puoi banalmente mettere un break

    Ok, "break" è nel capitolo che sto studiando ora... Capitolo 4 - controllo nei programmi in C.

    Grazie e spero che il libro possa spiegarmi
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    Forse non hai capito la mia domanda.

    Tu quali valori validi devi inserire nel tuo programma? Devi inserire un numero binario da 1 a 5 cifre? Per farlo usi una variabile numerica intera o una stringa?

    In base alle risposte, decidi tutto il resto.
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    Ti riporto un altro esempio... sempre sulla sentinella. Se uso -1 e l'esercizio è questo:

    http://prntscr.com/fq1gh

    Il codice sorgente è questo:
    
    // Stampare i numeri da 1 a 10 con un ciclo do...while.
    
    #include <stdio.h>
    int main( void )
    {
        int numeroPartenza;
        int numeroFine;
        
        puts( "Inserire numero iniziale (numero iniziale < numero finale). -1 per terminare." );
        scanf( "%d", &numeroPartenza );
        
        while ( numeroPartenza != -1 ) {    
            puts( "Inserire numero finale (numero finale > numero iniziale)." );
            scanf( "%d", &numeroFine );
      
            while ( numeroFine < numeroPartenza ) {
                puts( "Deve essere numero finale > numero iniziale.\n" );
                puts( "Inserire numero iniziale (numero iniziale < numero finale). -1 per terminare." );
                scanf( "%d", &numeroPartenza );
                
                while ( numeroPartenza != -1 ) {  
                    puts( "Inserire numero finale (numero finale > numero iniziale)." );
                    scanf( "%d", &numeroFine );
                }
            }
            
            printf( "Numeri da %d a %d\n\n", numeroPartenza, numeroFine );
    
            do {
                printf( "%d\t", numeroPartenza );
                ++numeroPartenza;
                
            } while ( numeroPartenza <= numeroFine );
        
              
            puts( "\n\nInserire numero iniziale (numero iniziale < numero finale). -1 per terminare." );
            scanf( "%d", &numeroPartenza );
        }
    }
    
    Qui in questo esercizio, dopo aver inserito volutamente un numero finale < numero iniziale ho voluto terminare l'esecuzione del programma con la sentinella -1 ma il compilatore ha inteso -1 come numero iniziale < numero finale e non ha terminato il programma....

    La domanda è dunque.... quale sentinella potrei utilizzare in questo caso? perchè se uso EOF cioè <Ctrl>z esce una virgoletta destra rossa ma non termina il programma!!!..... come si può vedere nel printscreen: http://prntscr.com/fq1ka avendo modificato la sentinella nel sorgente... So che è una domanda stupida ma se con EOF concludessi potrei risolvere il problema.
    Questo è lo stesso sorgente con EOF.
    
    // Stampare i numeri da 1 a 10 con un ciclo do...while.
    
    #include <stdio.h>
    int main( void )
    {
        int numeroPartenza;
        int numeroFine;
        
        puts( "Inserire numero iniziale (numero iniziale < numero finale). EOF per terminare." );
        scanf( "%d", &numeroPartenza );
        
        while ( numeroPartenza != EOF ) {    
            puts( "Inserire numero finale (numero finale > numero iniziale)." );
            scanf( "%d", &numeroFine );
      
            while ( numeroFine < numeroPartenza ) {
                puts( "Deve essere numero finale > numero iniziale.\n" );
                puts( "Inserire numero iniziale (numero iniziale < numero finale). EOF per terminare." );
                scanf( "%d", &numeroPartenza );
                
                while ( numeroPartenza != EOF ) {  
                    puts( "Inserire numero finale (numero finale > numero iniziale)." );
                    scanf( "%d", &numeroFine );
                }
            }
            
            printf( "Numeri da %d a %d\n\n", numeroPartenza, numeroFine );
    
            do {
                printf( "%d\t", numeroPartenza );
                ++numeroPartenza;
                
            } while ( numeroPartenza <= numeroFine );
        
              
            puts( "\n\nInserire numero iniziale (numero iniziale < numero finale). EOF per terminare." );
            scanf( "%d", &numeroPartenza );
        }
    }
    
    Grazie.
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    Scusami ... perché tutti questi post?

    Il modo di operare è semplice.

    1) Prima di tutto devi identificare con chiarezza i LIMITI dei valori possibili in input (da un MINIMO ad un MASSIMO)

    2) Poi utilizzi come "tappo" un qualsiasi valore NON compreso nell'intervallo
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    Ok...ma se i numeri sono tutti quelli nel campo reale, una variabile di tipo int, per esempio... che valori potrei usare??? le stringhe non le ho ancora trattate ma se serve una stringa basta che qualcuno me lo accenni, passo oltre, ci ritono dopo...grazie e scusa per i post... visto che ti sei lamentato. ciao

    P.S. come mai con EOF non funziona? Da quello che ho capito io EOF (End of File che è nel file di intestazione <stdio.h>) si fa con <Ctrl>z cioè premere contemporaneamente Ctrl e z. Ma il programma non termina....
  • Re: [...]la sentinella deve essere distinta dai dati regolari [...]

    Non mi sono "lamentato" ... semplicemente non vedo perché non riesci ad arrivare a soluzione dopo tanto tempo ...

    Hai provato
    Ctrl Z e Return

    ?
Devi accedere o registrarti per scrivere nel forum
11 risposte