Foros del Web » Programación para mayores de 30 ;) » Programación General »

Comenzando a programar: 8a - Repetición condicional con WHILE...DO

Estas en el tema de Comenzando a programar: 8a - Repetición condicional con WHILE...DO en el foro de Programación General en Foros del Web. LECCIÓN 8: Repetición condicional con WHILE...DO Hemos visto la sentencia FOR, la cual sirve para repetir bloques de código un número específico de veces. Resultará ...
  #1 (permalink)  
Antiguo 15/11/2011, 09:08
 
Fecha de Ingreso: enero-2011
Mensajes: 51
Antigüedad: 13 años, 3 meses
Puntos: 21
Comenzando a programar: 8a - Repetición condicional con WHILE...DO

LECCIÓN 8: Repetición condicional con WHILE...DO

Hemos visto la sentencia FOR, la cual sirve para repetir bloques de código un número específico de veces. Resultará muy útil para ciertas tareas, sin embargo, sabemos que no siempre servirá. En la lección anterior les di el ejemplo del PIN de un celular.

Como ejemplo más sencillo podríamos imaginar un programa que nos haga adivinar un número en diez intentos. Nosotros ingresamos un número y el programa nos dice si acertamos o no. En caso de acertar ganamos el juego y el programa termina, sino acertamos seguimos intentando hasta gastar nuestros diez intentos, en cuyo caso perdemos.

Un programa como este puede finalizar por dos condiciones:

**Acertamos el número.
**Gastamos el número de intentos sin lograr acertar.

Claramente un FOR no serviría para algo como esto porque iteraría 10 veces, acertemos o no. Entonces ¿cómo hacemos para decirle al programa que repita algo mientras se den ciertas condiciones y que se detenga si estas no se dan?

Aquí entra la sentencia WHILE de la que hablaremos en esta lección. Sin embargo, antes de abordar ese tema veremos como obtener números aleatorios en Pascal ya que eso resultará útil para muchas cosas.

-------------------------------------------------------------------------------------

Generar números aleatorios:

Para obtener un número al azar se utiliza la función random. Su sintaxis es la siguiente:

Random(x)

donde X es un entero (integer) que marca el número máximo que se puede generar. Random(x) devolverá un número aleatorio entre 0 y X-1. Por ejemplo, si escribimos random(50) obtendremos un número al azar entre 0 y 49 inclusive.

Si nosotros queremos obtener un número entre 1 y X, entonces tenemos que ser sutiles:

Código:
WriteLn(Random(10));
nos mostrará en pantalla un número entre 0 y 9.

Código:
WriteLn(Random(10) + 1);
nos mostrará en pantalla un número entre 1 y 10.
Explicaré esto a continuación.

Veamos un ejemplo sencillo en el que el usuario ingresa cuál es el tope y el programa le devolverá un número aleatorio entre 1 y el número ingresado. Asumimos que el usuario ingresará un entero mayor que 1:

Código Pascal:
Ver original
  1. PROGRAM funcion_random;
  2.  
  3. Var
  4.      x, valor_aleatorio: integer;
  5.  
  6. BEGIN
  7.   randomize;
  8.  
  9.   write('Ingrese un valor: ');
  10.   readln(x);
  11.  
  12.   valor_aleatorio:= random(x) + 1;
  13.   writeln('El número obtenido entre 1 y ',x,' es: ',valor_aleatorio);
  14. END.

Bien, este programa es bien sencillo de entender. Tenemos dos variables, x y valor_aleatorio. La primera será leída desde la entrada estándar y guardará el valor ingresado por el usuario. La segunda guardará el número al azar obtenido por la función random.
Lo primero a notar es que en la línea 7 hacemos una llamada al procedimiento randomize. Este no lleva parámetro alguno, simplemente indica que luego en algún momento del programa será utilizada la función random.
Si no hacen esto no podrán usar esta función y tendrán un error en tiempo de compilación.

En la línea 10 obtenemos el valor de X. En la línea 12 asignamos a valor_aleatorio el valor obtenido por random(x) más 1. ¿Por qué más 1? Si random(x) genera un número aleatorio entre 0 y X-1 pero nosotros queremos uno entre 1 y X solo basta sumar 1 al resultado. Por ejemplo, si hiciéramos random(10) podríamos obtener los números 0, 1, 2, 3, 4, 5, 6, 7, 8 o 9. Si quisiéramos un número entre 1 y 10 basta sumar 1 al valor sorteado. Si sale el 0, al sumar 1 obtenemos el 1. Si sale 9, al sumar 1 obtenemos el 10, o sea, corremos todo el intervalo un lugar a la derecha.

-------------------------------------------------------------------------------------

Secuencia de repetición WHILE…DO:

Comencemos entonces con WHILE. Esta instrucción nos permitirá definir las condiciones que harán que un bloque de código se repita. Por lo tanto estas repeticiones serán distintas en cada ejecución del programa, no como sucede con FOR.

WHILE...DO significa MIENTRAS…HAS.

Veamos antes que nada su sintaxis general:

Código:
While condicion do
   Instrucción;
Esto significa, mientras se cumpla la condición ejecuta tu instrucción. Una vez hecha la instrucción, WHILE regresará a su encabezado y volverá a verificar la condición. Si esta sigue siendo verdadera volverá a ejecutarse. En caso contrario salteará la instrucción y el programa continuará su curso. No está de más decir que la condición puede ser compuesta y que la instrucción puede ser un bloque de instrucciones delimitado por BEGIN y END. De este modo la forma más genérica de WHILE sería así

Código Pascal:
Ver original
  1. WHILE condicion DO
  2. BEGIN
  3.    Intruccion1;
  4.    Instruccion2;
  5.      .  .  .
  6.    InstruccionN;
  7. END;

Veremos primero el ejemplo del que hablé hace poco, un programa que nos hará adivinar un número. Generaremos un número al azar entre 1 y 30 y tendremos 10 intentos para adivinarlo. Aquí usaremos RANDOM.

Código Pascal:
Ver original
  1. PROGRAM AdivinadorSimple;
  2.  
  3. CONST
  4.    MAX_INTENTOS= 10; //El número máximo de intentos.
  5.    TOPE= 30; //El número más alto que se puede generar.
  6.  
  7. VAR
  8.    numero_a_adivinar, numero_leido: INTEGER;
  9.    adivinado: BOOLEAN;
  10.    (*La variable adivinado será TRUE cuando el usuario acierte, y FALSE
  11.    mientras esto no suceda.*)
  12.    intento_actual: INTEGER; //Un contador que nos dirá en qué intento vamos.
  13.  
  14. BEGIN
  15.    randomize; //Decimos al programa que utilizaremos random en algún lado.
  16.    numero_a_adivinar:= Random(TOPE) + 1;
  17.  
  18.    adivinado:= FALSE; //La inicializamos en FALSE porque aún no adivinamos nada.
  19.  
  20.    intento_actual:= 0; //Aún no hemos intentado adivinar nada.
  21.  
  22.    WriteLn('Ingrese números para intentar adivinar:');
  23.    WriteLn;
  24.  
  25.    WHILE (NOT adivinado) AND (intento_actual< MAX_INTENTOS) DO
  26.    (*Vean este encabezado. El WHILE se repetirá mientras la variable adivinado
  27.    sea FALSE porque tiene el operador NOT, y mientras a su vez el número de
  28.    intentos sea menor que el máximo de intentos posibles. Si estas condiciones
  29.    no se cumplen ambas a la vez, la condición AND vale FALSE y el WHILE termina.*)
  30.    BEGIN
  31.       intento_actual:= intento_actual + 1; //Sumamos 1 al número de intentos.
  32.       Write(intento_actual,' --> ');  //Mostramos el intento actual.
  33.       ReadLn(numero_leido);  //Leemos el número que el usuario ingresa.
  34.  
  35.       (*Si el número es correcto, la variable adivinado se vuelve TRUE, en caso
  36.       contrario seguirá valiendo FALSE tal como al inicio.*)
  37.       IF numero_leido= numero_a_adivinar THEN
  38.          adivinado:= TRUE;
  39.    END;
  40.  
  41.    (*El WHILE puede haber terminado por dos cosas, o adivinamos o perdimos.
  42.    Si adivinamos entonces la variable adivinado será TRUE, en caso contrario
  43.    será FALSE. Usamos eso para distinguir qué mensajes mostrar al usuario.*)
  44.    IF adivinado THEN
  45.       WriteLn('Felicitaciones ¡¡¡GANASTE!!!')
  46.    ELSE
  47.      WriteLn('Lamentablemente has perdido.');
  48.  
  49.    ReadLn; //Simplemente para visualizar lo que el programa nos muestra.
  50. END.

Continuamos en la parte b.

Última edición por Kyshuo; 17/11/2011 a las 10:57 Razón: Mejorar las vistas de código fuente

Etiquetas: condicional, entrada, java, programa, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:17.