2015-10-17 10 views
8

Il mio compito è sommare una serie di numeri usando un ciclo, e quel ciclo richiede che il valore sentinella di 0 si fermi. Dovrebbe quindi visualizzare i numeri totali aggiunti. Finora, il mio codice è:Aggiungi numeri ed esci con una sentinella

total = 0 
print("Enter a number or 0 to quit: ") 
while True: 
    number = int(input("Enter a number or 0 to quit: ")) 
    print("Enter a number or 0 to quit: ") 
    if number == 0: 
     break 
     total = total + number 
     print ("The total number is", total) 

Eppure, quando l'eseguo, non stampa il numero totale dopo che entro 0. Stampa solo "Enter a number or 0 to quit", sebbene non sia un ciclo infinito.

risposta

5

Il motivo principale per il codice non funziona è perché break finisce il ciclo più interno (in questo caso il ciclo while) immediatamente, e quindi la vostra le righe di codice dopo l'interruzione non verranno eseguite. Questo può essere facilmente risolto usando i metodi che altri hanno indicato, ma mi piacerebbe suggerire di cambiare la struttura del loop while un po '. Attualmente si sta utilizzando:

while True: 
    if <condition>: 
     break 

Piuttosto che:

while <opposite condition>: 

si potrebbe avere una ragione per questo, ma non è visibile dal codice che ci hai fornito. Se cambiamo il codice per usare la seconda struttura, solo questo semplificherebbe il programma e risolverebbe il problema principale. Si stampa anche "Enter a number or 0 to quit:" più volte, che non è necessario. Basta passarlo allo input e basta.

total = 0 
number = None 
while number != 0: 
    number = int(input("Enter a number or 0 to quit: ")) 
    total += number # Same as: total = total + number 
print("The total number is", total) 

L'unico "inconveniente" (solo cosmetici) è che abbiamo bisogno di definire number prima del ciclo.

Si noti inoltre che vogliamo stampare il numero total dopo la intero ciclo è finito, così la stampa alla fine è unindented e non verrà eseguito su ogni ciclo del ciclo while.

+3

Questa e le altre risposte sfruttano il fatto che il valore sentinella è 0 e quindi è sicuro di aggiungere incondizionatamente il numero di input al totale e controllare in seguito se il ciclo deve uscire. Funziona, ma è forse un po 'troppo intelligente - se un giorno il valore sentinella dovesse cambiare, diciamo -1, sarebbe facile perdere che dovremmo non solo cambiare il 'numero! = 0' del test 'numero! = -1', ma in realtà cambia l'intera struttura del ciclo. –

+0

Grazie, ha funzionato! –

2
total = 0 
while True: 
    number = int(input("Enter a number or 0 to quit: ")) 
    if number == 0: 
     break 

    total = total + number 

print("The total number is", total) 

Se mettete break prima altro codice, allora il ciclo sarà concluso e il tuo codice dopo che break non verrà eseguito.

E, a proposito, è possibile utilizzare try...except per catturare l'errore se l'utente non è entrato un numero:

total = 0 
while True: 
    try: 
     number = int(input("Enter a number or 0 to quit: ")) 
    except ValueError: 
     print('Please enter a number') 
     continue 

    if number == 0: 
     break 

    total = total + number 

print("The total number is", total) 
+0

È anche possibile inserire la stampa fuori dal ciclo 'while' ... –

+0

@ PM2Ring Ma non importa, giusto? :) –

+1

corretto. Non importa. Ma alcuni potrebbero considerare lo stile migliore per fare la stampa al di fuori del ciclo di elaborazione dell'input. Un altro miglioramento minore è fare l'aggiunta dopo il test "if". Certo, aggiungere zero non cambia nulla ed è solo una delle istruzioni sprecate, ma è meglio evitare di fare cose inutili quando è facile evitarlo ordinando il codice in modo diverso. –

2

Se il numero è 0, la prima cosa che si sta facendo è break, che sarà Termina il ciclo.

Non stai aggiungendo il numero al totale a meno che non sia 0, che non è quello che stai cercando.

while True: 
    number = int(input("Enter a number or 0 to quit: ")) 
    total = total + number 
    if number == 0: 
     break 
print ("The total number is", total)  
3

Si dovrebbe sommare i numeri all'interno del ciclo, anche se non sono zeri, ma stampare il totale dopo il ciclo è finito, non è al suo interno:

total = 0 
while True: 
    number = int(input("Enter a number or 0 to quit: ")) 
    total = total + number 
    if number == 0: 
     break 

print ("The total number is", total) 
2

Sei stato molto vicino, ma hai avuto qualche problema di indentazione.

In primo luogo, perché tutte queste dichiarazioni print? Immagino tu stia cercando di stamparlo prima di prendere input. Per questo, la riga sottostante sarà sufficiente.

number = int(input("Enter a number or 0 to quit: ")) 

In secondo luogo, distinguere tra ciò che si vuole fare, quando solo il number==0 e cosa fare in ogni iterazione.

Si desidera utilizzare le istruzioni riportate di seguito in ogni iterazione in quanto si desidera aggiungere ogni numero con total. Quindi, tienilo fuori dal blocco if.

total = total + number 

E quando number==0, per prima cosa vuole print qualcosa e poi break il ciclo.

if number == 0: 
     print ("The total number is", total) 
     break 

Assicurarsi che si sta aggiungendo con total e poi controllando la condizione if, perché una volta che si interrompe il ciclo, semplicemente non è possibile aggiungere il numero totale tardi.

Quindi, la soluzione potrebbe essere così,

total = 0 
while True: 
    number = int(input("Enter a number or 0 to quit: ")) 
    total = total + number 
    if number == 0: 
     print ("The total number is", total) 
     break 
+0

@ PM2Ring, grazie, risolto. –