You are on page 1of 19

ESTRUCTURAS REPETITIVAS

Se llaman problemas repetitivos o cclicos a aquellos en cuya solucin es necesario utilizar un mismo conjunto de acciones que se puedan ejecutar una cantidad especfica de veces. Esta cantidad puede ser fija (previamente determinada por el programador) o puede ser variable (estar en funcin de algn dato dentro del programa). En PASCAL existen tres estructuras de repeticin que son las estructuras: FOR DO, REPEAT - UNTIL, Y WHILE - DO. La primera de ellas, la estructura FOR - DO, tiene la siguiente sintaxis: FOR contador := principio TO final DO STEP incremento BEGIN instruccin_1; instruccin_2; END; donde contador es una variable que puede almacenar un dato ordinal, principio es el valor que se le asigna a esa variable antes de realizar la accin, final es el valor mximo que puede alcanzar la variable contador antes de finalizar la accin. La variable incremento es el valor que se va a suma a la variable contador cada vez que se entra al ciclo. Si se va a ejecutar una sola instruccin dentro de la estructura, se puede omitir las instrucciones BEGIN y END; si el contador es entero y se desea incrementar de uno en uno, entonces se puede omitir la sentencia STEP y la variable de incremento. Existe tambin la opcin equivalente FOR identificador := principio DOWNTO final DO BEGIN instruccin _1; instruccin _2;

ESTRUCTURAS REPETITIVAS

END; en la que el valor del identificador se decrementa en uno cada vez que se realiza la accin. La limitacin bsica de la estructura For-Do es que la accin que implcitamente se realiza cada vez es simplemente el aumento o decremento de una variable ordinal. No obstante, hay que tener presente que las variables ordinales no son solamente los Integer. La variable que se utiliza como contador en la estructura For-Do puede modificarse tambin en la accin que se repite, pero hay que ser extremadamente cuidadoso porque de lo contrario se puede generar un bucle infinito. Una estructura muy similar a la FOR - DO pero ms verstil es la REPEAT UNTIL. Su sintaxis es: REPEAT instruccin_1 instruccin_2; UNTIL (condicin) En esta estructura se especifica que se repita el conjunto de acciones situado entre el REPEAT y el UNTIL mientras que no sea verdadero el valor de la condicin. Las acciones se realizan al menos una vez porque la verificacin de la condicin se hace despus que las acciones. Sin embargo, en la estructura WHILE - DO se realiza la comprobacin de la condicin que ha de finalizar la repeticin antes de ejecutarse la accin. Su sintaxis es: WHILE (condicin) DO BEGIN instruccin_1 instruccin_2; END; donde la condicin es una expresin cuyo resultado es un dato Boolean, y las instrucciones se repetirn mientras la condicin se evale verdadera.

ESTRUCTURAS REPETITIVAS

Cuando se ha de programar un procedimiento repetitivo, la eleccin de una de las tres estructuras se har siempre considerando la claridad y facilidad de programacin. En PASCAL tambin existe la sentencia de control no estructurado GOTO, pero no se considerar pues en este curso se pretende que el alumno ejercite la programacin estructurada. Sin embargo, si se considerar la funcin EXIT cuyo efecto es interrumpir la ejecucin del bloque en el que se encuentra. Si se trata del programa principal, producir la interrupcin de la ejecucin del programa. Bucles controlados por condicin 1. Solicitar al usuario la continuacin del bucle: este mtodo consiste simplemente en pedir al usuario si existena ms entradas. Suma := 0; Writeln ( Existen ms nmeros en la lista (s / n) ? ); Readln ( Resp ); while ( ( Resp = s ) or ( Resp = S ) ) do begin Writeln ( Introduzca un nmero: ); Readln ( Numero ); Suma := Suma + Numero; Writeln ( Existen ms nmeros (s / n) ? ); Readln ( Resp ) end; 2. Valor Centinela: un centinela es un valor especial utilizado para sealar el final de una lista de datos. El valor elegido debe ser totalmente distinto de los posibles valores de la lista para que se pueda utilizar para sealar el final de la lista. Suma := 0; Read ( Numero ); While Numero >= 0 do begin Suma := Suma + Numero; Read ( Numero ) end 3. Uso de banderas o interruptores: una bandera o interruptor (flag) es una variable lgica que se utiliza para conservar el

ESTRUCTURAS REPETITIVAS

estado (verdadero o falso) de una condicin. El valor del interruptor debe inicializarse antes de comenzar el bucle y debe cambiar su estado (Valor) dentro del cuerpo del bucle para preparar la siguiente iteracin.

ESTRUCTURAS REPETITIVAS

Positivo := false; while not Positivo do begin Write ( Introduzca un entero mayor que cero ); Readln ( N ); if N > 0 then Positivo := true end Ejercicios prcticos de tipo repetitivo. 1.Escribir un programa en Pascal que calcula el equivalente en grados Fahrenheit o Celsius de las siguientes temperaturas. Temperatura 1 = 32 Fahrenheit Temperatura 2 = 10 Celsius {Regla de 3: Celsius / 5 = (Fahrenheit 32) 9} PROGRAM EJER1; USES CRT; VAR Fahrenheit, Celsius:REAL; T1C,T2F:REAL; respuesta:CHAR; BEGIN CLRSCR; REPEAT BEGIN WRITE ('DESEA PASARLO A FAHRENHEIT O CELSIUS? F/C: '); READLN (respuesta); WRITELN (''); END; UNTIL (respuesta='C') OR (respuesta='F') OR (respuesta='c') OR (respuesta='f'); IF UPCASE(respuesta)='F' THEN BEGIN WRITELN ('Introduzca los grados para pasar a Fahrenheit: '); WRITE ('Celsius: '); READLN (Celsius); Fahrenheit:= ((9 * Celsius) / 5) + 32; WRITE (Fahrenheit:5:2,' grados Fahrenheit.'); WRITELN (' ');

ESTRUCTURAS REPETITIVAS

END ELSE IF UPCASE (respuesta)='C' THEN BEGIN WRITELN ('Introduzca los grados para pasar a Celsius: '); WRITE ('Fahrenheit: '); READLN (Fahrenheit); Celsius:= ((Fahrenheit - 32) / 9) * 5; WRITE (Celsius:5:2,' grados Celsius.'); END; READKEY; END. 2.Escribir un programa en Pascal que realice un bucle con WHILE y muestre en pantalla del 1 al 10. PROGRAM EJER2; USES CRT; VAR x:INTEGER; BEGIN CLRSCR; x:=0; WHILE X <= 10 DO BEGIN WRITELN (x); x:=x+1; END; READKEY; END. 3.Escribir un programa en Pascal que realice un bucle con Repeat y muestre en pantalla del 1 al 10. PROGRAM EJER3; USES CRT; VAR x:INTEGER; BEGIN CLRSCR; x:=0; REPEAT WRITELN (x);

ESTRUCTURAS REPETITIVAS

x:=x+1; UNTIL x=10; READKEY; END. 4.Escribir un programa en Pascal que realice un bucle con FOR y muestre en pantalla del 1 al 10. PROGRAM EJER4; USES CRT; VAR x:INTEGER; BEGIN CLRSCR; FOR x:=0 TO 10 DO WRITELN(x); READKEY; END. 5.Escribir un programa en Pascal que visualice en pantalla los nmeros pares entre 1 y 25. PROGRAM EJER5; USES CRT; VAR num:INTEGER; BEGIN CLRSCR; num:=2; REPEAT WRITELN (num); num:= num + 2; UNTIL num= 26; READKEY; END. PROGRAM EJER5B; USES

ESTRUCTURAS REPETITIVAS

CRT; VAR sem:INTEGER; BEGIN CLRSCR; sem:=1; WHILE sem <= 25 DO BEGIN IF sem mod 2=0 THEN WRITELN(sem); sem:=sem + 1; END; READKEY; END. 6.Escribir un programa en Pascal que visualice en pantalla los nmeros mltiplos de 5 comprendidos entre 1 y 100. PROGRAM EJER6; USES CRT; VAR num:INTEGER; BEGIN CLRSCR; num:= 5; WHILE num <= 100 DO BEGIN WRITELN (num); num:= num + 5; END; READKEY; END. PROGRAM EJER6B; USES CRT; VAR sem:INTEGER; BEGIN CLRSCR; FOR sem:= 1 TO 100 DO BEGIN

ESTRUCTURAS REPETITIVAS

IF sem mod 5=0 THEN WRITELN(sem); END; READKEY; END. 7.y 10. Escribir un programa en Pascal que sume los nmeros comprendidos entre 1

PROGRAM EJER7; USES CRT; VAR num, x:INTEGER; BEGIN CLRSCR; num:=1; x:=1; WHILE num <= 10 DO BEGIN WRITELN (x); num:= num + 1; x:= x + num; END; READKEY; END. 8.Escribir un programa en Pascal que genere la tabla de multiplicar de un nmero introducido por el teclado. PROGRAM EJER8; USES CRT; VAR tabla, x, num:INTEGER; BEGIN CLRSCR; WRITE ('Introduzca un numero para hacer su tabla de multiplicar: '); READLN (num); WRITELN (''); REPEAT WRITELN (tabla); x:= x + 1; tabla:= num * x;

ESTRUCTURAS REPETITIVAS

10

UNTIL x=11; READKEY; END. PROGRAM EJER8B; USES CRT; VAR num,sem:INTEGER; BEGIN CLRSCR; WRITE('Introduzca un numero entero: '); READLN(num); FOR sem:=1 TO 10 DO BEGIN WRITE(num); WRITE(' * '); WRITE(sem); WRITE(' = '); WRITELN(num*sem); END; READKEY; END. 9.Escribir un programa en Pascal que realice la pregunta Desea continuar S/N? y que no deje de hacerla hasta que el usuario teclee N. PROGRAM EJER9; USES CRT; VAR respuesta:CHAR; BEGIN CLRSCR; REPEAT WRITELN ('DESEA CONTINUAR: S/N '); READLN (respuesta); UNTIL respuesta='N'; {Pascal distingue entre N y n} READKEY; END. PROGRAM EJER9B; USES CRT; VAR respuesta:STRING; BEGIN

ESTRUCTURAS REPETITIVAS

11

CLRSCR; REPEAT WRITELN ('DESEA CONTINUAR: SI/NO '); READLN (respuesta); UNTIL respuesta='NO'; READKEY; END. PROGRAM EJER9C; USES CRT; VAR resp:CHAR; BEGIN CLRSCR; resp:='S'; WHILE UPCASE(resp)='S' DO BEGIN WRITE('Desea continuar? '); READLN(resp); END; READKEY; END. 10.- Escribir un programa en Pascal que calcule cuantos aos tarda en duplicarse un capital depositado al 5% de inters anual PROGRAM EJER10; USES CRT; VAR tiempo:REAL; cap_ini,cap_fin:REAL; CONST interes = 0.05; BEGIN CLRSCR; WRITE ('Intruduzca el capital para calcular cuanto tardara '); WRITE ('en duplicarse, con un interes del 5%: '); READLN (cap_ini); WRITELN (''); IF cap_ini < 0 THEN BEGIN WRITE ('No se puede incluir un capital negativo'); EXIT;

ESTRUCTURAS REPETITIVAS

12

END; tiempo:=0; cap_fin:= cap_ini; REPEAT cap_fin:=cap_fin + (cap_fin * interes); tiempo:= tiempo + 1; UNTIL cap_fin > (cap_ini * 2); WRITELN ('Tardara',tiempo:3:0,' aos en duplicarse'); WRITELN ('Capital final: ',cap_fin:5:2,' pts'); READKEY; END. PROGRAM EJER10B; USES CRT; VAR cap_ini,cap_fin:REAL; num_year:INTEGER; CONST INTERES=0.05; BEGIN CLRSCR; num_year:=0; WRITE('Capital inicial -----: '); READLN(cap_ini); cap_fin:=cap_ini; WHILE cap_fin < (cap_ini*2) DO BEGIN cap_fin:=cap_fin+(cap_fin*interes); num_year:=num_year + 1; END; WRITE('Capital inicial -----: '); WRITELN(cap_ini:5:2); WRITE('Capital final -------: '); WRITELN(cap_fin:5:2); WRITE('Capital duplicado en '); WRITE(num_year); WRITE(' aos'); READKEY; END. 11.- Escribir un programa que calcule la suma de los nmeros hasta un nmero dado (introducido por el usuario). PROGRAM EJER11; USES CRT; VAR

ESTRUCTURAS REPETITIVAS

13

x, y, num:INTEGER; BEGIN CLRSCR; WRITE ('Este programa calcula la suma de los numeros hasta uno '); WRITE ('introducido por el usuario: '); READLN (num); WRITELN (''); x:=0; WHILE num >= 0 DO BEGIN WRITELN (x); x:= x + num; num:=num - 1; END; READKEY; END. PROGRAM EJER11B; USES CRT; VAR i,num:INTEGER; suma:LONGINT; BEGIN CLRSCR; WRITE('Introduzca un numero -> '); READLN(num); FOR i:=0 TO num DO suma:=suma+ i; WRITE('Suma '); WRITE('0-'); WRITE(num); WRITE('---->'); WRITE(suma); READKEY; END. 12.- Escribir un programa que pida un nmero y si el que se introduce por el teclado es menor de 100 que vuelva a solicitarlo. PROGRAM EJER12; USES CRT; VAR num:INTEGER; BEGIN {Este programa no finaliza hasta que se escribe un numero mayor a 100} CLRSCR;

ESTRUCTURAS REPETITIVAS

14

REPEAT WRITELN ('Introduzca un numero: '); READLN (num); UNTIL num > 100; READKEY; END. PROGRAM EJER12B; USES CRT; VAR num:INTEGER; BEGIN CLRSCR; WRITE('Introduzca un numero -> '); READLN(num); WHILE num<=100 DO BEGIN WRITE('Introduzca un numero -> '); READLN(num); END; READKEY; END. 13.Escribir un programa en Pascal que calcule el factorial de un nmero.

PROGRAM EJER13; {Este programa hace el factorial de un numero} USES CRT; VAR factorial, x, num, y:REAL; BEGIN CLRSCR; WRITE ('Introduzca un numero para hacer su factorial: '); READLN (num); WRITELN (''); x:=1; WHILE num > 1 DO BEGIN x:=x * num; num:=num - 1; WRITELN (x); END; READKEY; END.

ESTRUCTURAS REPETITIVAS

15

PROGRAM EJER13B; USES CRT; VAR temp,num,fac:LONGINT; BEGIN CLRSCR; fac:=1; temp:=num; WRITE('Introduzca un numero -> '); READLN(num); temp:=num; WHILE num>=1 DO BEGIN fac:=fac*num; num:=num-1; END; WRITE('El factorial de '); WRITE(temp); WRITE(' es '); WRITE(fac); READKEY; END. 14.- Escribir un programa en Pascal que calcule la media de 5 nmeros introducidos por el teclado. PROGRAM EJER14; USES CRT; VAR i:INTEGER; num,suma:REAL; BEGIN CLRSCR; i:=0; REPEAT WRITE('Introduzca un numero: '); READLN(num); suma:=suma+num; i:=i+1; UNTIL i=5; WRITE('La media es: '); WRITELN(suma/i:5:2); READKEY; END. 15.- Escribir un programa en Pascal que detecte si un nmero es primo o no. Un nmero es primo si slo es divisible por s mismo y por la unidad.

ESTRUCTURAS REPETITIVAS

16

Ejemplo: 2,3,4,7,11,17,19 son nmeros primos 9 no es nmero primo, es divisible por 1, 9, 3 El algoritmo para resolver este problema pasa por dividir sucesivamente el nmero estudiado por 2,3,4, etc., hasta el propio nmero. Program primo15 (INPUT,OUTPUT); USES Crt; Var num: Word; {Los numeros primos son enteros mayores que 1 sin divisores enteros positivos, exceptuando el 1 y ellos mismos. Todos los primos son impares, excepto el 2. Solo es necesario comprobar la divisibilidad por numeros superiores a la raiz cuadrada del numero.} raiznum: Integer; {Guardamos el valor de la raiz del numero} noesprimo: Boolean; {Variable para decir que un numero no es primo} par: Boolean; {Nos sirve para marcar los numeros que son pares} i: Byte; {Variable que usamos dentro del bucle} BEGIN {p.p} CLRSCR; Repeat Write('Introduzca un numero entero para ver si es primo: '); Read(num); Writeln; UNTIL num > 1; {Pedimos un numero y no lo aceptamos hasta que sea > 1} par := num mod 2 = 0; {par va a ser True cuando el numero sea par} If num = 2 THEN Write('El 2 es primo, es el unico numero par que lo es.') Else if par THEN Write('Todo numero par no es primo, excepto el 2.') Else BEGIN raiznum := round(sqrt(num)); {Almacenamos la raiz del numero, redondeada} FOR i := raiznum To (num - 1) DO BEGIN If (num mod i) = 0 THEN noesprimo := true END; {Comprobamos la divisibilidad de los numeros superiores a la raiz cuadrada del numero introducido. Si algun numero divide al numero, noesprimo toma el valor true.}

ESTRUCTURAS REPETITIVAS

17

If noesprimo THEN Write(num,' no es un numero primo') Else Write(num,' es un numero primo'); {Mostramos por pantalla si el numero es primo o no} END; READKEY; END. {p.p} PROGRAM EJER15B; USES CRT; VAR i,num,flag:INTEGER; BEGIN CLRSCR; flag:=0; WRITE('Introduzca un numero -> '); READLN(num); FOR i:=2 TO (num-1) DO BEGIN IF (num mod i)=0 THEN flag:=1; END; IF flag=1 THEN BEGIN WRITE(num); WRITE(' no es un numero primo'); END ELSE BEGIN WRITE(num); WRITE(' es un numero primo'); END; READKEY; END.

PROBLEMAS PROPUESTOS

18

EJERCICIOS PROPUESTOS. 1.- Leer 100 nmeros enteros y posteriormente calcule y muestre lo siguiente: Cantidad de nmeros positivos. Promedio de los nmeros pares. Mayor numero positivo. Menor numero negativo. 2.- Se tiene la siguiente informacin de los empleados de una compaa: # de empleados, nombre del empleado, salario bsico por hora, horas trabajadas, deducciones. Se desea calcular e imprimir al final, el total de salarios pagados a todos los empleados y el promedio salarial por empleado. 3.- Una persona guarda en el banco 120.000 Bs. Si gana el 45% de inters anual. Calcule cunto tendr a los 5 aos. 4.- Utilizando ciclos anidados generar las siguientes parejas de enteros 0 1 1 1 2 2 3 2 4 3 5 3 6 4 7 4 8 5 9 5

5.- Determinar el promedio de n valores. 6.- Mostrar los nmeros enteros que se encuentran dentro del intervalo formado por dos nmeros positivos, teniendo en cuenta lo siguiente: Los nmeros positivos deben ser datos de entrada (no importa el orden). Los nmeros a imprimir no deben ser ms de veinte. Debe existir por lo menos un nmero entre los dos valores dados. 7.- Generar la tabla de multiplicar del 1 hasta el 10. 8.- Dado cualquier nmero entero positivo X, encontrar si su cuadrado termina en las mismas cifras que el nmero X. Por ejemplo: X = 5; su cuadrado es 25, termina en 5 como X. Otro ejemplo: X = 25; su cuadrado es 625. termina en 25 como X. 9.- Determinar el valor reflejo de un nmero entero positivo. Se entiende por valor reflejo la escritura invertida del nmero; por ejemplo, el valor reflejo de 753 es 357, el de 7 es 7. 10.- Suponga una computadora que no sabe multiplicar. Dado dos nmeros naturales A y B hallar el producto A x B utilizando sumas Sucesivas. DESGLOSE DE DIGITOS. 11.- Leer dos nmeros y mostrar todos los nmeros terminados en 4 comprendidos entre ellos. 12.- Leer un nmero entero de tres dgitos y mostrar todos los enteros comprendidos entre 1 y cada uno de los dgitos. 13.- Mostrar en pantalla todos los enteros comprendidos entre 1 y 100. 14.- Mostrar en pantalla todos los pares comprendidos entre 20 y 200.

PROBLEMAS PROPUESTOS

19

15.- Mostrar en pantalla todos los nmeros terminados en 6 comprendidos entre 25 y 205. 16.- Leer un nmero entero y determinar a cunto es igual la suma de todos los enteros comprendidos entre 1 y el nmero ledo. 17.- Leer un nmero entero de dos dgitos y mostrar en pantalla todos los enteros comprendidos entre un dgito y otro. 18.- Leer un nmero entero de 3 dgitos y determinar si tiene el dgito 1. 19.- Leer un entero y mostrar todos los mltiplos de 5 comprendidos entre 1 y el nmero ledo. 20.- Mostrar en pantalla los primeros 20 mltiplos de 3. 21.- Leer un nmero entero de dos dgitos menor que 20 y determinar si es primo. 22.- Leer un nmero entero de dos dgitos y determinar si sus dos dgitos son primos. 23.- Leer un nmero entero de tres dgitos y determinar cuntos dgitos primos tiene. 24.- Leer dos nmeros enteros y determinar si la diferencia entre los dos es un nmero primo. 25.- Leer un nmero entero y si es mltiplo de 4 determinar si su ltimo dgito es primo. 26.- Escribir en pantalla el resultado de sumar los primeros 20 mltiplos de 3. 27.- Mostrar en pantalla el promedio entero de los n primeros mltiplos de 3 para un nmero n ledo. 28.- Promediar los x primeros mltiplos de 2 y determinar si ese promedio es mayor que los y primeros mltiplos de 5 para valores de x y y ledos. 29.- Leer dos nmeros entero y mostrar todos los mltiplos de 5 comprendidos entre el menor y el mayor. 30.- Leer un nmero entero y determinar a cunto es igual la suma de sus dgitos pares. 31.- Leer un nmero entero y determinar a cunto es igual el promedio entero de sus dgitos. 32.- Leer un nmero entero y determinar cul es el mayor de sus dgitos. 33.- Leer 2 nmeros enteros y determinar cul de los dos tiene mayor cantidad de dgitos. 34.- Leer 2 nmeros enteros y determinar cual de los dos tiene mayor cantidad de dgitos primos. 35.- Leer un nmero entero y determinar a cunto es igual el primero de sus dgitos. 36.- Leer un nmero entero y mostrar todos sus componentes numricos o sea aquellos para quienes el sea un mltiplo. 37.- Leer nmeros hasta que digiten 0 y determinar a cunto es igual el promedio de los nmeros terminados en 5. 38.- Leer nmeros hasta que digiten 0 y determinar a cuanto es igual el promedio entero de los nmero primos ledos. 39.- Si 32768 es el tope superior para los nmeros entero cortos, determinar cul es el nmero primo ms cercano por debajo de l. 40.- Leer un nmero de dos dgitos y determinar si pertenece a la serie de Fibonacci.

You might also like