






Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Prepara tus exámenes
Prepara tus exámenes y mejora tus resultados gracias a la gran cantidad de recursos disponibles en Docsity
Prepara tus exámenes con los documentos que comparten otros estudiantes como tú en Docsity
Encuentra los documentos específicos para los exámenes de tu universidad
Estudia con lecciones y exámenes resueltos basados en los programas académicos de las mejores universidades
Responde a preguntas de exámenes reales y pon a prueba tu preparación
Consigue puntos base para descargar
Gana puntos ayudando a otros estudiantes o consíguelos activando un Plan Premium
Comunidad
Pide ayuda a la comunidad y resuelve tus dudas de estudio
Ebooks gratuitos
Descarga nuestras guías gratuitas sobre técnicas de estudio, métodos para controlar la ansiedad y consejos para la tesis preparadas por los tutores de Docsity
Asignatura: Introducción a la Programación, Profesor: , Carrera: Ingeniería Informática, Universidad: UCM
Tipo: Apuntes
1 / 12
Esta página no es visible en la vista previa
¡No te pierdas las partes importantes!







4.1. Estructura global de un programa:
4.2. La secuencia:
4.3. Esquemas de selección. Instrucciones IF y CASE:
Estructura de selección:
Una estructura de selección hace posible la selección de una de varias acciones alternativas, dependiendo del valor de una expresión booleana
4.3.1. La instrucción IF:
Objetivo: si la expresión booleana es cierta se ejecuta la instrucción definida a continuación del THEN, si es falsa y existe la cláusula ELSE, se ejecuta la instrucción definida a continuación del ELSE. Detrás de ELSE y de THEN, solo 1 instrucción.
Ej: writeln(‘¿Quiere que diga algo?’); readln(‘Respuesta’); IF(respuesta =’s’) or (respuesta=’S’) THEN writeln(‘Hola’);
Ej(2): IF mes=2 THEN IF esBisiesto THEN diasEnMes:= ELSE diasEnMes:= ELSE IF (mes=4) or (mes=6) or (mes=9) or (mes=11) THEN diasEnMes:= ELSE diasEnMes:=
La cláusula ELSE se asocia con el IF más cercano, al igual que el END, se refiere al BEGIN más cercano tb, siempre y cuando no haya otro ELSE o END en medio.
Ej(3): ¿El año es bisiesto? writeln(‘¿Quiere saber si un anno es bisiesto?(s/n)’); readln(respuesta);
IF Exp. booleana^ THEN Instrucción ELSE Instrucció n
Se dan clases particulares de IP FC EDI POO ATC y Estadística 686810826 (Garci) [email protected]
IF(respuesta =’s’) or (respuesta=’S’) THEN IF (anno mod4=0)AND((anno mod100<>0)OR(anno mod400=0)) THEN writeln(‘Es bisiesto’); ELSE writeln(‘No es bisiesto’);
NOTA: no es necesario especificar que pasa si el usuario contesta otra cosa, simplemente el programa no hace nada. NOTA 2: Antes de END (cuando no es necesario), puedes poner ‘;’, pero antes de ELSE nunca!!.
4.3.2. La instrucción CASE:
Es una estructura de selección múltiple.
Limitaciones:
· Alternativas disjuntas: CASE x OF 3 ,5,7: writeln(‘Hola’) 3 ,9,12: write(‘Adios’) END No puede aparecer lo mismo en dos alternativas. · La expresión (selector) debe ser de tipo ordinal (integer, boolean, char, subrango o enumerado, no real, o string) · Algunas implementaciones de PASCAL permiten que el valor del selector figure como constante. En este caso la ejecución de la instrucción no tiene efecto. · Algunas implementaciones permiten usar la cláusula ELSE o OTHERWISE para especificar la acción a ejecutar si el selector no está en el rango. · Si el valor introducido no está en la lista de alternativas: depende el compilador:
Ejemplo: CASE X OF 2,3,5: write-------- 7,9: write-------- ELSE write-------- END
CASE (^) Expresión OF
Constante
Instrucciones ;
;
Ej: Un bucle que repita 5 veces algo:
FOR i=1 TO 5 DO writeln(‘Hola’); writeln(‘Adios’):
Ej(2): Suma de 10 números:
acum:= FOR i=1 TO 10 DO BEGIN writeln(‘Introduzca número’); readln(x); acum:=acum+x; END writeln(‘La media es’,acum/10);
Ej(3): Tabla de cuadrados:
writeln(‘Introduzca dos números’); readln(inicial,final); FOR i=inicial TO final DO writeln(‘El cuadrado de’,i,’es’,sqr(i))
Si vemos un bucle FOR en diagrama de flujos:
cierto
incrementa
Diagrama para un bucle FOR:
x:= Comparación FOR i:=1 TO x DO BEGIN writeln(x); Falso x:=x*3; END; Cierto
i x Por pantalla: 5 1 5 5 15 2 15 5 15 45 3 45
Habrá 5 iteraciones ya que x:=5. Hay que decir cuantas veces antes de empezar.
Los límites del FOR se calculan antes de comenzar el bucle.
FOR i:=5 TO 8 DO writeln(i); writeln(i);
Por pantalla sale:
5 6 7 8 ? El valor que tenga después no lo sabes.
FOR c:=’a’ TO ‘z’ DO writeln(‘El código ASCII de’,c,’es’,prd(c));
Limitaciones: · La variable de control, el valor inicial y el valor final deben ser los tres del mismo tipo. · El tipo de la variable de control debe ser: integer, char, boolean, un subrango o un tipo enumerado. · En el bucle FOR-TO si el valor inicial es mayor que el valor final el cuerpo del bucle no se ejecuta. · En el bucle FOR-DOWNTO si el valor inicial es menor que el valor final el
i:=
i:=i+
i<=
Ej(2): simular con un while un bucle FOR:
FOR i:=1 TO 10 DO writeln(‘El cuadrado de’,i,’es’,sqr(i));
i:= WHILE i<=10 DO BEGIN writeln(‘El cuadrado de’,i,’es’,sqr(i)); i:=i+1; END
Ej(3): si queremos los cuadrados de los pares:
FOR i:=1 TO 10 DO writeln(‘El cuadrado de’,2i,’es’,sqr(2i));
i:= WHILE i<=10 DO BEGIN writeln(‘El cuadrado de’,i,’es’,sqr(i)); i:=i+2; END
En el bucle while sabemos el valor final de la i.
Ej(4): multiplicar un nº por 3:
x:= FOR i:=1 TO x DO BEGIN writeln(x); x:=x*3; END
x:=5; i:=1; WHILE i<=x DO BEGIN Este programa está mal, no acaba nunca, ya que el valor writeln(x); de la x cambia dentro del bucle, en este programa, nunca x:=x3; i>x. Solución: i:=i+1; x:=5; y:=x; END i:=1; WHILE i<=y DO BEGIN writeln(x); x:=x3; i:=i+1; END
Ej(5): División entera: Dados x e y, queremos obtener x div y, x mod y, pero no tenemos mod ni div.
c:=0; x y c r r:=x; 34 4 0 34 WHILE r>=y DO 34 4 1 30 BEGIN 34 4 2 26 r:=r-y; 34 4 3 22 c:=c+1; 34 4 4 18 END 34 4 5 14 34 4 6 10 34 4 7 6 34 4 8 2 PRE={x>0,y>0,r=x,c=0} I={x=cy+r,r>0} POST={x=cy+r ^ 0<=r<y}
Invariante: propiedad que se cumple en todas las iteraciones del bucle. Cota (nº de iteraciones)= r-y+
¿Cómo se demuestra que un bucle es correcto y termina? 1- Se cumple el invariante? (PRE -> I) 2- {I ^ cond} S {I} ( {I ^ cond} S {I} ) (precondición) (instrucción) (postcondición) 3- I ^ ¬ cond -> Post -> Si termina será correcto 4- I ^ Cond -> cota > 0 5- {I ^ cond ^ cota =C} S {cota < C}
Demostramos que es verdadero: 1- x=cy+r -> x=(c+1)y+(r-y) -> x=cy+y+r-y -> x=cy+r 2- 3- Solo hay que demostrar r<y. No cond: ¬Cond = r<y 4- Si cota <= 0 -> el bucle se acaba. I ^ Cond -> Cota > 0 Cond: r >= y Cota: r-y+1 (r-y>0) 5- Cota se decrementa en cada iteración. Cota: r-y+1 -> (r-y)-y+1 (y<0) -> r-2y-
Ej (6): mcd de 2 nos^ enteros. Algoritmo de Euclides:
{x=X,y=Y,x>0,y>0} while (x>0) and (y>0) DO IF x>y THEN x:=x mod y ELSE y:=y mod x IF x=0 THEN z:=x
4.4.3. Instrucción REPEAT:
Se ejecutan las instrucciones especificadas y después se evalúa la expresión booleana, si es falsa se repite el proceso, si es cierta se finaliza la instrucción.
Diferencias entre el while y el repeat:
Ej:
REPEAT write(‘Positivo’); readln(x); UNTIL x>=0;
Diagramas de flujo:
Cierta
Falsa
Traducir de uno a otro:
REPEAT (^) Instrucción UNTIL Expresión booleana
Instrucciones
Condición
IF condición THEN WHILE condición DO REPEAT I 1 ; I 1 ; I 2 ; I 2 ; ... ... In; In; UNTIL not condición
Ej: menú repetido
REPEAT writeln(‘1-Mcd’); writeln(‘2-¿Es primo?’); writeln(‘3-Factorizar’); ... writeln(‘8-Dibuja triángulo’); writeln(‘9-Salir’); writeln(‘Introduzca su elección:’); readln(‘opción’); CASE opción OF 1: algoritmoDeEuclides 2: progParaPrimos ... 8: dibujoTriangulo 9: writln(‘chao’); ELSE writeln(‘Te has equivocado, entre el 1 y el 9 por favor’) END UNTIL opción=
4.5. Resumen de bucles:
Bucles controlados por centinela:
Bucles controlados por un indicador lógico: