Loop indefiniti dove la prima volta è diverso

3

Questo non è un problema serio o qualcosa che qualcuno mi ha chiesto di fare, solo una cosa apparentemente semplice che mi è venuta in mente come esercizio mentale ma che mi ha messo a tacere e che sento di dover già conoscere la risposta. Potrebbe esserci un duplicato ma non sono riuscito a trovarne uno.

Supponiamo che qualcuno ti abbia chiesto di scrivere una parte di codice che chiede all'utente di inserire un numero e, ogni volta che il numero inserito non è zero, dice "Errore" e chiede di nuovo. Quando entrano nello zero si ferma.

In altre parole, il codice continua a chiedere un numero e si ripete finché non viene inserito zero. In ogni iterazione tranne il primo stampa anche "Errore".

Il modo più semplice a cui posso pensare è qualcosa di simile allo pseudocodice seguente:

int number = 0;
do
{
    if(number != 0)
    {
        print("Error");
    }
    print("Enter number");
    number = getInput();
}while(number != 0);

Mentre ciò fa ciò che è previsto, personalmente non mi piace che ci sia codice ripetuto (testare il numero! = 0 due volte), qualcosa che generalmente dovrebbe essere evitato. Un modo per evitare questo sarebbe qualcosa di simile:

int number = 0;
while(true)
{
    print("Enter number");
    number = getInput();
    if(number == 0)
    {
        break;
    }
    else
    {
        print("Error");
    }
}

Ma quello che non mi piace in questo è "while (true)", un'altra cosa da evitare.

L'unico altro modo in cui posso pensare include un'altra cosa da evitare: etichette e goto s:

    int number = 0;
    goto question;
error:
    print("Error");
question:
    print("Enter number");
    number = getInput();
    if(number != 0)
    {
        goto error;
    }

Un'altra soluzione sarebbe avere una variabile extra per testare se dovresti dire "Errore" o meno, ma questa è una memoria sprecata.

C'è un modo per farlo senza fare qualcosa che è generalmente considerato una cattiva pratica (codice ripetuto, un ciclo teoricamente infinito o l'uso di goto )?

Capisco che qualcosa del genere non sarebbe mai abbastanza complessa che il primo modo sarebbe un problema (in genere si chiama una funzione per convalidare l'input) ma sono curioso di sapere se c'è un modo in cui non ho pensato di.

    
posta George T 09.06.2014 - 16:29
fonte

4 risposte

5

La seguente soluzione evita la ripetizione e separa le preoccupazioni di ottenere l'input e di convalidarlo:

do
{
  print "Enter number"
  number = getInput()
} while(!numberValid(number))

bool numberValid(number) {
  if (number == 0) { 
    return true
  } else {
    print "Error!"
    return false
  }
}
    
risposta data 09.06.2014 - 16:54
fonte
0

In Ruby considererei questa clausola di guardia e la scriverò come:

do_something if condition

o

do_something unless condition

Li uso con parsimonia però. Se c'è molto codice (più di 2 affermazioni o linee dicono) preferisco il tradizionale costrutto if then else .

L'ora principale che uso è per le condizioni brevi, così posso scrivere la singola riga:

procA if x=1

invece delle 3 righe:

if x=1 then
  procA
end
    
risposta data 09.06.2014 - 17:22
fonte
0

Separerei i due comportamenti Il primo è ottenere un numero per l'utente, il secondo è convalidarlo e infine richiederlo Quindi andrei così %codice% Forse non ti piaceva la doppia linea di input, ma penso che sia un bel compromesso

    
risposta data 09.06.2014 - 21:11
fonte
0

Potresti fare qualcosa del tipo:

int number;
while((number = solicitNumber()) != 0) {
    print("Error!");
}

...

int solicitNumber() {
    print("Enter number");
    return getInput();
}
    
risposta data 10.06.2014 - 17:55
fonte

Leggi altre domande sui tag