Download 1 - Amazon S3

Document related concepts
no text concepts found
Transcript
3
ESTRUCTURAS REPETITIVAS
Se llaman problemas repetitivos o cíclicos a aquellos en cuya solución es necesario
utilizar un mismo conjunto de acciones que se puedan ejecutar una cantidad
específica de veces. Esta cantidad puede ser fija (previamente determinada por el
programador) o puede ser variable (estar en función de algún dato dentro del
programa).
En PASCAL existen tres estructuras de repetición 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
instrucción_1;
instrucción_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 acción, “final” es el valor
máximo que puede alcanzar la variable “contador” antes de finalizar la acción. 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 instrucción 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 también la opción equivalente
FOR identificador := principio DOWNTO final DO
BEGIN
instrucción _1;
instrucción _2;
…
END;
ESTRUCTURAS REPETITIVAS
2
en la que el valor del identificador se decrementa en uno cada vez que se realiza la
acción.
La limitación básica de la estructura For-Do es que la acción que implícitamente 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
también en la acción 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 más versátil es la REPEAT UNTIL. Su sintaxis es:
REPEAT
instrucción_1
instrucción_2;
…
UNTIL (condición)
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 condición. Las
acciones se realizan al menos una vez porque la verificación de la condición se hace
después que las acciones.
Sin embargo, en la estructura WHILE - DO se realiza la comprobación de la
condición que ha de finalizar la repetición antes de ejecutarse la acción.
Su sintaxis es:
WHILE (condición) DO
BEGIN
instrucción_1
instrucción_2;
…
END;
donde la condición es una expresión cuyo resultado es un dato Boolean, y las
instrucciones se repetirán mientras la condición se evalúe verdadera.
Cuando se ha de programar un procedimiento repetitivo, la elección de una de las tres
estructuras se hará siempre considerando la claridad y facilidad de programación.
ESTRUCTURAS REPETITIVAS
3
En PASCAL también existe la sentencia de control no estructurado GOTO, pero no
se considerará pues en este curso se pretende que el alumno ejercite la programación
estructurada. Sin embargo, si se considerará la función EXIT cuyo efecto es
interrumpir la ejecución del bloque en el que se encuentra. Si se trata del programa
principal, producirá la interrupción de la ejecución del programa.
 Bucles controlados por condición
1. Solicitar al usuario la continuación del bucle: este método consiste
simplemente en pedir al usuario si existena más entradas.
Suma := 0;
Writeln ( ‘¿ Existen más números en la lista (s / n) ? ’ );
Readln ( Resp );
while ( ( Resp = ‘s’ ) or ( Resp = ‘S’ ) ) do
begin
Writeln ( ‘ Introduzca un número: ‘ );
Readln ( Numero );
Suma := Suma + Numero;
Writeln ( ‘ ¿ Existen más números (s / n) ? ’ );
Readln ( Resp )
end;
2. Valor Centinela: un centinela es un valor especial utilizado para señalar
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 señalar
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 lógica que se utiliza para conservar el estado (verdadero o
falso) de una condición. El valor del interruptor debe inicializarse antes de
ESTRUCTURAS REPETITIVAS
4
comenzar el bucle y debe cambiar su estado (Valor) dentro del cuerpo del
bucle para preparar la siguiente iteración.
ESTRUCTURAS REPETITIVAS
5
Positivo := false;
while not Positivo do
begin
Write ( ‘ Introduzca un entero mayor que cero ‘ );
Readln ( N );
if N > 0
then Positivo := true
end
Ejercicios prácticos 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
6
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
7
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 números 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
8
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 números
múltiplos 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
9
IF sem mod 5=0 THEN
WRITELN(sem);
END;
READKEY;
END.
7.y 10.
Escribir un programa en Pascal que sume los números 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
número 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 años tarda en duplicarse
un capital depositado al 5% de interés 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,' años 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(' años');
READKEY;
END.
11.- Escribir un programa que calcule la suma de los números hasta un número
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 número 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
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 número.
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.
14
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 números
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 número es primo o no. Un
número es primo si sólo es divisible por sí mismo y por la unidad.
ESTRUCTURAS REPETITIVAS
16
Ejemplo: 2,3,4,7,11,17,19 son números primos
9 no es número primo, es divisible por 1, 9, 3
El algoritmo para resolver este problema pasa por dividir sucesivamente el
número estudiado por 2,3,4, etc., hasta el propio número.
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
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.
17
PROBLEMAS PROPUESTOS
18
EJERCICIOS PROPUESTOS.
1.- Leer 100 números enteros y posteriormente calcule y muestre lo siguiente:
 Cantidad de números positivos.
 Promedio de los números pares.
 Mayor numero positivo.
 Menor numero negativo.
2.- Se tiene la siguiente información de los empleados de una compañía: # de
empleados, nombre del empleado, salario básico 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 interés anual.
Calcule cuánto tendrá a los 5 años.
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 números enteros que se encuentran dentro del intervalo formado por
dos números positivos, teniendo en cuenta lo siguiente:
 Los números positivos deben ser datos de entrada (no importa el orden).
 Los números a imprimir no deben ser más de veinte.
 Debe existir por lo menos un número entre los dos valores dados.
7.- Generar la tabla de multiplicar del 1 hasta el 10.
8.- Dado cualquier número entero positivo X, encontrar si su cuadrado termina en las
mismas cifras que el número 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 número entero positivo. Se entiende por valor
reflejo la escritura invertida del número; por ejemplo, el valor reflejo de 753 es 357,
el de 7 es 7.
10.- Suponga una computadora que no “sabe” multiplicar. Dado dos números
naturales A y B hallar el producto A x B utilizando sumas Sucesivas.
DESGLOSE DE DIGITOS.
11.- Leer dos números y mostrar todos los números terminados en 4 comprendidos
entre ellos.
12.- Leer un número entero de tres dígitos y mostrar todos los enteros comprendidos
entre 1 y cada uno de los dígitos.
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 números terminados en 6 comprendidos entre 25 y
205.
16.- Leer un número entero y determinar a cuánto es igual la suma de todos los
enteros comprendidos entre 1 y el número leído.
17.- Leer un número entero de dos dígitos y mostrar en pantalla todos los enteros
comprendidos entre un dígito y otro.
18.- Leer un número entero de 3 dígitos y determinar si tiene el dígito 1.
19.- Leer un entero y mostrar todos los múltiplos de 5 comprendidos entre 1 y el
número leído.
20.- Mostrar en pantalla los primeros 20 múltiplos de 3.
21.- Leer un número entero de dos dígitos menor que 20 y determinar si es primo.
22.- Leer un número entero de dos dígitos y determinar si sus dos dígitos son primos.
23.- Leer un número entero de tres dígitos y determinar cuántos dígitos primos tiene.
24.- Leer dos números enteros y determinar si la diferencia entre los dos es un
número primo.
25.- Leer un número entero y si es múltiplo de 4 determinar si su último dígito es
primo.
26.- Escribir en pantalla el resultado de sumar los primeros 20 múltiplos de 3.
27.- Mostrar en pantalla el promedio entero de los n primeros múltiplos de 3 para un
número n leído.
28.- Promediar los x primeros múltiplos de 2 y determinar si ese promedio es mayor
que los y primeros múltiplos de 5 para valores de x y y leídos.
29.- Leer dos números entero y mostrar todos los múltiplos de 5 comprendidos entre
el menor y el mayor.
30.- Leer un número entero y determinar a cuánto es igual la suma de sus dígitos
pares.
31.- Leer un número entero y determinar a cuánto es igual el promedio entero de sus
dígitos.
32.- Leer un número entero y determinar cuál es el mayor de sus dígitos.
33.- Leer 2 números enteros y determinar cuál de los dos tiene mayor cantidad de
dígitos.
34.- Leer 2 números enteros y determinar cual de los dos tiene mayor cantidad de
dígitos primos.
35.- Leer un número entero y determinar a cuánto es igual el primero de sus dígitos.
36.- Leer un número entero y mostrar todos sus componentes numéricos o sea
aquellos para quienes el sea un múltiplo.
37.- Leer números hasta que digiten 0 y determinar a cuánto es igual el promedio de
los números terminados en 5.
38.- Leer números hasta que digiten 0 y determinar a cuanto es igual el promedio
entero de los número primos leídos.
39.- Si 32768 es el tope superior para los números entero cortos, determinar cuál es el
número primo más cercano por debajo de él.
40.- Leer un número de dos dígitos y determinar si pertenece a la serie de Fibonacci.