INSFERPED-DAW


Bucles

Un bucle é 'algo' que se repite un número determinado de veces, ou namentres se dean unha serie de condicións. Utilízanse para accións nas que se necesita realizar 'o mesmo proceso' varias veces.

Por exemplo, imaxinemos que queremos perdir por teclado o nome de 10 persoas. Temos dous xeitos de facelo.

  • Pedir, literalmente, dez veces o nome, que utilizando pseudocódigo(inventado :) sería algo como:

    pintar "Introduza o nome 1: "
    nome = ler-nome-por-teclado
    pintar "O nome introducido foi: "+nome

    pintar "Introduza o nome 2: "
    nome = ler-nome-por-teclado
    pintar "O nome introducido foi: "+nome

          ……………..
          ……………..
          ……………..

    pintar "Introduza o nome 9: "
    nome = ler-nome-por-teclado
    pintar "O nome introducido foi: "+nome

    pintar "Introduza o nome 10: "
    nome = ler-nome-por-teclado
    pintar "O nome introducido foi: "+nome

    En resumo: dez nomes == dez veces repetindo case o mesmo (varía o número de nome a introducir).

    NOTA: Imaxinemos se tivéramos que pedir 100 nomes.. ou 10000. Non soamente é que se repita o código unha e outra vez, ou que teñamos que teclear un case número infinito de liñas de código repetido, senon que se nalgún intre da vida do programa necesítase introducir un número maior de nomes, habería que modificar o código do programa!!.

  • Utilizar un sistema que permita automatizar ese proceso para que se repita 10 veces ou, por exemplo, ata que o usuario introduza un nome en branco. Tamén co pseudocódigo(inventado) sería:

    Para 10 nomes:

    REPITE 10 veces DENDE 1 ATA 10 onde CONTADOR é o número de repetición actual:
        pintar "Introduza o nome CONTADOR: "
        nome = ler-nome-por-teclado
        pintar "O nome introducido foi: "+nome

    Para n nomes; finalizando co nome en branco:

    pintar "Introduza o nome: "
    nome = ler-nome-por-teclado
    NAMENTRES nome DISTINTO de "" FAI:
        pintar "O nome introducido foi: "+nome
        pintar "Introduza o nome: "
        nome = ler-nome-por-teclado

En Java temos tres tipos básicos de bucles: for, while, do-while

Cos tres tipos de bucles pódese facer o mesmo, mais segundo o caso é mellor utilizar un ou outro.

FOR

O bucle for úsase cando se repite a acción do bucle un 'determinado' número de veces, ou cando necesitamos utilizar números en orde. Vexamos un exemplo de cada caso:

Introducir o nome de 10 persoas:

import java.util.Scanner;

Scanner teclado = new Scanner(System.in);
String nome;

// Este bucle 'for' repítese 10 veces; namentres a variable 'i'(chamémoslle
// _contador_) sexa menor ou igual que 10 comezando no número 1. En cada
// repetición do bucle o _contador_ increméntase nunha unidade.
for (int i = 1; i <= 10; i++) {
    //    ^        ^      ^.. Incremento ou decremento do contador 'i'
    //    .        .          en cada repetición do bucle. Neste caso
    //    .        .          increméntase nunha unidade.
    //    .        .
    //    .        .. Condición para que remate o bucle de executarse.
    //    .           Neste caso, o bucle executarase namentres o valor
    //    .           do contador 'i' sexa igual ou menor(<=) que 10.
    //    .           Unha vez sexa maior de 10, o bucle rematará de
    //    .           executarse e continuará na seguinte instrucción
    //    .           fora do bucle.
    //    .
    //    .. Inicialización do contador. Esta parte do código é executada
    //       a primeira vez que é executado o bucle, e indica o estado
    //       inicial do contador; é dicir, en que número comeza o bucle.
    System.out.println("Introduza o nome "+i+": ");
    nome = teclado.nextLine();
    System.out.println("O nome introducido foi "+nome);
}

Amosar que múltiplos do número 3, do 1 ó 100, son pares

Este exercizo pódese facer utilizando o bucle for de dous xeitos:

  • Contando do 1 ó 100 co contador do bucle.
// Ca axuda do *for* imos contando do 1 ó 100 incrementando en cada
// repetición do bucle o contador 'n' en 1.
// 
// Logo utilizamos unha condición *if* para averiguar se 'n' é
// múltiplo de 3 'n%3 == 0' e tamén de 2 'n%2 == 0'; aquí usamos o
// operador módulo '%', que devolve o resto dunha división enteira,
// e se o resto é '0' é divisible.

for (int n = 1; n <= 100; n++) {
    if (n%3 == 0 && n%2 == 0) {
        System.out.println(n+" é múltiplo de 3 e par.");
    }
}
  • Contando de 3 en 3 co contador do bucle.
// Na vez de ir incrementando o valor do contador 'n' de 1 en 1,
// incremetámolo de 3 en 3.
//
// Ó tomar o contador 'n' valores de 3 entre 3 xa non é necesario,
// na codición 'if', saber se 'n' é múltiplo de 3. Utilizamos o
// operador módulo para averiguar se é par ou non.

for (int n = 3; n <= 100; n+=3) {
    //     ^               ^.. Incremento de 3 en cada repetición.
    //     .
    //     .. Inicialízase o contador 'n' a 3, pois un número menor
    //        de 3 non é divisible por 3.
    if (n%2 == 0) {
        System.out.println(n+" é múltiplo de 3 e par.");
    }
}

WHILE

O while é utilizado cando o bucle debe repetirse namentres o seu predicado sexa verdadeiro, é dicir, namentres a/s 'condición/s' do predicado sexan verdadeiras.

Indicar se un número é par ou impar

O programa pide números por teclado á usuaria ata que ésta introduza o '0' e remate o programa.

import java.util.Scanner;

Scanner teclado = new Scanner(System.in);
int numero;

System.out.println("Introduza número: ");
numero = teclado.nextInt();

while(numero != 0) {
    //       ^.. Condición do bucle. Nametres o valor de número sexa
    //           distinto de 0 executarase o código no interior do
    //           do bucle.
    if (numero % 2 == 0) {
        System.out.println("O número "+numero+" é par.");
    } else {
        System.out.println("O número "+numero+" é impar.");
    }

    System.out.println("Introduza número: ");
    numero = teclado.nextInt();
    //        ^.. Aquí pídese novamente á usuaria que introduza un
    //            número. 'numero', neste bucle, é quen determina
    //            se o bucle repetirase unha vez máis; Se non o
    //            fixéramos así, o bucle executaríase 'eternamente'
    //            pois o valor de 'numero' sería sempre o mesmo e,
    //            polo tanto, a condición do bucle sempre verdadeira.
}

DO-WHILE

O bucle de tipo do-while é como o while pero ca diferencia de que o predicado que controla o bucle vai ó final. Éste cambio, con respecto ó while, implica que o corpo do bucle executarase polo menos unha vez.

Pedir idade por teclado

Pídese a idade dunha persoa por teclado. Se a idade é introducida correctamente, é dicir, o número introducido é maior que 0 e menor 120, o programa rematará, noutro caso voltará a pedir a idade unha e outra vez ata que ésta sexa correcta.

import java.util.Scanner;

Scanner teclado = new Scanner(System.in);
int idade;

do {
    System.out.println("Introduza a idade(1..120): ");
    idade = teclado.nextInt();
} while((idade < 1) || (idade > 120));
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^.. Condición do bucle que utiliza
//                                    un operador lóxico OR (||); o
//                                    bucle remata cando ámbalas dúas
//                                    condicións son falsas.


System.out.println("Idade introducida: "+ idade);