M3 - Programació estructurada / Continguts UF1: La sentència do/while

De wikiserver
Dreceres ràpides: navegació, cerca

Tot i que la sentència while és més que suficient per dur a terme pràcticament qualsevol estructura de repetició, n’hi ha d’altres que s’adapten millor a certs casos molt concrets.

La seva aportació consisteix exclusivament a facilitar la lectura del codi o permetre dur a terme algunes tasques de manera automàtica.

La sentència do/while permet repetir l’execució del bucle mentre es verifiqui la condició lògica. A diferència de la sentència while, la condició es verifica al final de cada iteració. Per tant, independentment de com avaluï la condició, com a mínim sempre es durà a terme la primera iteració.

Al contrari que la sentència while, la sentència do/while no és tan comuna en els llenguatges de programació.

Sintaxi i estructura

Per dur a terme aquest tipus de control sobre les iteracions d’un bucle, la sintaxi d’aquesta sentència en llenguatge Java és la següent:

do {
     Instruccions per executar dins del bucle
   } while (expressió booleana);

Com podeu veure, és molt semblant a la sentència while, però invertint el lloc on apareix la condició lògica. Per poder distingir clarament on comença el bucle s’usa la paraula clau do. Les instruccions del bucle continuen encerclades entre claus, {...}.

La figura següent mostra un diagrama del flux de control d’aquesta sentència i estableix també l’ordre sota el qual s’avalua l’expressió que representa la condició lògica, en aquest cas al final, amb vista a decidir si cal executar o no una nova iteració del bucle.

Exemple: control d’entrada per teclat

En un exemple anterior ja s’ha vist la utilitat de les estructures de repetició a l’hora de preguntar dades a l’usuari. Ara bé, un àmbit en què encara és més útil i més freqüent usar-la és el de controlar si la dada es correspon amb algun dels valors esperats abans de donar-la per bona i usar-la. Amb el que heu vist fins al moment, si l’usuari s’equivoca i escriu alguna dada errònia (per exemple, fora del rang esperat), sou capaços de detectar-ho i mitjançant una estructura de selecció avisar l’usuari, però llavors el programa acaba. Això no té gaire sentit; seria molt més còmode simplement tornar-li a preguntar repetidament fins que introdueixi un valor que s’adeqüi als valors esperats.

Tot i que amb un ús assenyat de la sentència while és pot dur a terme aquesta tasca, reemplaçar-la per la sentència do/while pot ser especialment còmode. El motiu principal és que en aquests casos, abans d’avaluar si la dada és correcta o no, primer cal haver-la llegit. Per tant, és més intuïtiu avaluar la condició lògica al final i no al principi del bucle, un cop realment ja es disposa de la dada.Normalment, en usar aquesta sentència, la condició lògica avalua directament el valor que es vol controlar, per veure si compleix els requisits establerts. La dada llegida mateixa fa les funcions de semàfor.

Per exemple, proveu el programa següent, que garanteix que qualsevol valor introduït estarà entre 0 i 10 (com és el cas del que s’espera en l’exemple anterior d’endevinar un nombre).

import java.util.Scanner;

//Anem a llegir un enter entre 0 i 10.

public class ValorFitat {

  public static void main(String[] args) {
   
    Scanner lector = new Scanner(System.in);
    int valorUsuari = 0;
    do {
      System.out.print("Introdueix un valor enter entre 0 i 10: ");
      valorUsuari = lector.nextInt();
    } while ((valorUsuari < 0) || (valorUsuari > 10));
    System.out.println("Dada correcta. Has escrit " + valorUsuari);
  }
}