2015-09-16 9 views
6

Sto lavorando a un esercizio in cui un piccolo pezzo di codice basato su un ciclo for viene convertito per eseguire la stessa operazione con un ciclo while. La conversione è sbagliato per destinazione, e si presenta così:Conversione di un ciclo for con istruzione continue su ciclo while

int sum = 0; 

    for (int i = 0; i < 4; i++) { 
     if (i % 3 == 0) continue; 
     sum += i; 
    } 
System.out.println(sum); // prints 3 

Questo viene convertito in:

int i = 0, sum = 0; 

     while (i < 4) { 
      if (i % 3 == 0) continue; 
      sum += i; 
      i++;  
     } 
System.out.println(sum); // will not print 

Nell'esercizio, mi viene chiesto di spiegare il motivo per cui la conversione è sbagliato e quindi risolvere il problema. I miei pensieri sono:

  1. Con il valore iniziale di i = 0, questo innescherà continuano immediatamente dopo aver inserito il ciclo volontà, dal momento che (0% 3 == 0) farà la if-statement true. Finché il valore iniziale è 0, questo eseguirà il ciclo, in modo da saltare una quantità infinita di volte. Ho provato a modificare il valore iniziale di i = 1, ma non viene stampato alcun importo. Poi ho provato ad incrementare i prima di eseguire la if-statement, e il programma stampa ora la somma 7. La domanda qui è; perché il programma non verrà stampato se ho incrementato dopo l'istruzione if, anche se il valore iniziale di i = 1 suggerisce (nella mia testa) che il programma debba funzionare correttamente?

  2. Ho creato una tabella per ciascun programma per confrontare la somma.

La versione for-loop:

i = 0, sum + = i non preformato (continua), i ++

i = 1, sum = 1, i ++

i = 2, sum = 3, i ++

i = 3, sum + = i non preformato (continua), i ++

i = 4, i < 4 falso, cappio fermato

Il ciclo while versione:

i = 0, i ++, somma = 1

i = 1, i ++, sum = 3

i = 2, i ++, sum + = i non preformato (continuo)

i = 3, i ++, somma = 7

i = 4, i < 4 falso, cappio fermato

Nel ciclo while, sum + = i è preformato una volta in più rispetto al ciclo for . È questo il modo giusto per convertire il ciclo per il ciclo in un ciclo ?

int i = 0, sum = 0; 

     while (i < 3) { 
      i++; 
      if (i % 3 == 0) continue; 
      sum += i;   
     } 

     System.out.println(sum); 
+0

per 1. '3% 3' è zero –

+0

A rigor di termini c'è un'altra differenza:' i' è ora visibile dal resto del blocco. Un equivalente di un costrutto 'for (int i = 0; ....) {}' è '{int i = 0; while (...) {}} '(si noti la coppia extra di parentesi graffe che racchiude sia la dichiarazione della variabile che il ciclo). – biziclop

risposta

3

Il for-loop in questione se convertito in pianura inglese, significa riassumere da 0 a 3 ed escludere tutti multipli di 3. (0 + 1 + 2 = 3)

for (int i = 0; i < 4; i++) { 
     if (i % 3 == 0) continue; 
     sum += i; 
    } 

Così ora, ci chiediamo come possiamo riassumere 0 a x e assumiamo multipli di 3 con un ciclo while. Lo faremo senza guardare all'originale per il ciclo. (A volte è più facile farlo in questo modo in quanto sappiamo già l'intenzione del ciclo for)

Per riassumere un numero da 0 a 3:

int i = 0; 
while(i < 4){ 
    sum += i; 
    i++; 
} 

Riassumendo un numero da 0 a 3, escluse multipli di 3:

int i = 0; 
while(i < 4){ 
    if(i % 3 != 0) 
     sum += i; 
    i++; 
} 

sommare un numero da 0 a 3, escluse multipli di 3 (utilizzando continua):

int i = 0; 
while(i < 4){ 
    if(i % 3 == 0){ 
     i++;  //Remember to increase i before continue 
     continue; 
    } 
    else 
     sum += i; 
    i++; 
} 

Dal momento che dopo la continue, tutte le dichiarazioni di sotto di esso saranno saltati, si deve ricordare di fare un incremento i++ prima di chiamare continue. Ci sarà un altro i++ poiché ti dirigi in 2 condizioni.

5

tuo 1 sta concentrando su di esso è il valore iniziale, ma non è questo il punto. Il punto è che i non viene mai incrementato quando i % 3 == 0 è vero, non che 0 è il valore iniziale. Quindi il loop while loop per sempre.

Il tuo 2 non ha alcun senso: la versione while verrà interrotta per sempre, mai sommando nulla.

È questo il modo giusto per convertire il ciclo for in un ciclo while?

No, si sta incrementando i nel momento sbagliato.

Pensate bout come funziona un ciclo for:

  1. inizializzazione - In primo luogo imposta le variabili ai valori della prima espressione.

  2. Test - Quindi verifica i valori utilizzando la seconda espressione.

  3. Execute - Se il valore è true, esegue il corpo del loop.

  4. Incremento - Quando il corpo del ciclo è completo, esegue la terza espressione (incremento). Si noti che questo è dopo il il corpo del loop.

Fai il ciclo while fare ciò che il ciclo for sta facendo. (Sono intenzionalmente non non farlo per voi, questo è un esercizio di apprendimento.Sarò notare che il modo migliore per convertire il ciclo for non utilizzerà continue, tuttavia. "Migliore," ovviamente, è soggettivo.)

1

Secondo la logica del ciclo while, l'incremento della variabile i è condizionale, mentre per il ciclo for è incondizionato. Per rendere uniforme la logica di incremento, è necessario incrementare in entrambi i casi.

Penso che la corretta conversione sarebbe -

int i = 0, sum = 0; 

while (i < 4) { 
    if (i % 3 == 0) {i++;continue;} 
    sum += i; 
    i++; 
} 
System.out.println(sum); 
+0

Questo potrebbe essere semplificato, stai aumentando dentro e fuori il 'if' perché non sempre incrementare? Il 'continue' semplicemente non ha nulla da fare qui. –

+0

Hay @ Jean-FrançoisSavard, sì possiamo solo una cosa che rompere l'uniformità di conversione –

5

Nell'esercizio, mi viene chiesto di spiegare perché la conversione è sbagliato e poi fissarlo

La conversione è sbagliato semplicemente perché quando si raggiunge il valore i che il modulo 3 è uguale a 0 (la prima iterazione in quel caso), si salta alla successiva iterazione e si ri-convalida. Tuttavia, poiché si salta direttamente senza incrementare i, si convaliderà nuovamente la stessa condizione e verrà nuovamente convalidata ad-infinitum.

Si potrebbe risolvere il problema facilmente sbarazzarsi del continue e negando la condizione:

while (i < 4) { 
    if (i % 3 != 0) 
     sum += i; 

    i++;  
} 
0

Normalmente l'incremento sarebbe stata l'ultima riga di un ciclo while. Tuttavia, in questo "disastro che aspetta di accadere" codice, c'è una condizione per saltare alla fine del blocco while senza incrementare i. Se stai facendo affidamento su i per incrementare, assicurati che sia sempre eseguito su qualsiasi iterazione. E anche, alla fine, perché vuoi farlo scorrere la prima volta.

while (i < 4) { 
     if (i % 3 == 0) { 
      // skip! 
     } else { 
      sum += i; 
     } 
     i++;  
    }