UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. 6. Ejemplos resueltos 6.1. Empleo de alternativa. a) Uso de condicional. Se tienen 3 números enteros, si el primero de ellos es negativo (menor que 0), entonces debe obtenerse el producto de los 3 números y escribirlo; en caso contrario debe escribirse 0. Solución: Sean NUM1, NUM2 Y NUM3 los 3 enteros: PRODUCTO:=0; IF (NUM1<0) THEN PRODUCTO:=NUM1*NUM2*NUM3; WRITE('PRODUCTO ES',PRODUCTO); De acuerdo al esquema dado en el punto 3.6, se tiene que NUM1<0 corresponde a la condición C. Si C se cumple , se efectúa el producto de los 3 enteros (acción A). b) Si el primer entero (NUM1) es negativo se debe realizar el producto de los 3 enteros (igual al ejemplo anterior), pero ahora si NUM1 es positivo debe obtenerse la suma de los 3 enteros: Solución: IF NUM1<0 THEN PRODUCTO:=NUM1*NUM2*NUM3 ELSE SUMA:=NUM1+NUM2+NUM3; Del algoritmo se desprende que es indispensable el uso de a lo menos 5 variables: (NUM1, NUM2, NUM3, PRODUCTO Y SUMA). PROGRAM PDTOSUMA(INPUT,OUTPUT); (* Se leen 3 enteros e imprime su producto si el primero de ellos es negativo; en caso contrario imprime la suma *) VAR NUM1, NUM2, NUM3, PRODUCTO, SUMA: INTEGER; BEGIN (*PROGRAMA*) READ(NUM1,NUM2,NUM3);(*lee variables*) IF NUM1<0 Prof. Leopoldo Silva Bijit. 07-07-2003 46 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. THEN BEGIN PRODUCTO:=NUM1*NUM2*NUM3; WRITELN('PRODUCTO = ',PRODUCTO) END ELSE BEGIN SUMA:=NUM1+NUM2+NUM3; (*calcula suma *) (* ^ comentario superfluo*) WRITELN('SUMA = ',SUMA) END END. (*PROGRAMA*) Debe notarse el uso de comentarios y la forma de indentación. 6.2. Lectura de booleanos. La sentencia read en lenguaje Pascal no acepta leer variables booleanas. Se desea leer datos booleanos como caracteres y asignarlos a una variable booleana. Solución: Espacio de trabajo: CONST verdadero = 'V', falso = 'F'; VAR estado : BOOLEAN; Algoritmo: -Leer caracter -If caracter='V' then estado = true else If caracter='F' then estado := False else write('Error') A continuación se codifican en Pascal, las ideas anteriores. PROGRAM leeboolean(INPUT,OUTPUT); CONST VERDADERO='V'; FALSO='F'; MENSAJE='ERROR EN FORMATO'; VAR ESTADO: BOOLEAN; Prof. Leopoldo Silva Bijit. 07-07-2003 47 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. CARACTER: CHAR; BEGIN (*PROGRAMA*) READ(CARACTER); IF CARACTER=VERDADERO THEN ESTADO:=TRUE ELSE IF CARACTER=FALSO THEN ESTADO:=FALSE ELSE WRITELN(MENSAJE); IF ESTADO THEN WRITELN('ES VERDADERO') ELSE WRITELN('ES FALSO') END. (*PROGRAMA*) Observaciones: ¿Qué pasa si el carácter leído no es ni 'V' ni 'F'? 6.3. Decisión entre múltiples alternativas. - Se reciben 3 datos de entrada A, B y C. Estos corresponden a las dimensiones de los lados de un triángulo. - El programa debe detectar con sentencias IF -THEN-ELSE el tipo de triángulo. Solución: - Si se cumple Pitágoras entonces es triángulo rectángulo Si sólo dos lados del triángulo son iguales entonces es isósceles. Si los 3 lados son iguales entonces es equilátero. Si no se cumple ninguna de las condiciones anteriores, es escaleno. if A*A = B*B + C*C then triángulo=”Rectángulo” else if B*B=A*A + C*C then triángulo=”Rectángulo” else if C*C=A*A + B*B then triángulo=”Rectángulo” else if A = B then if A = C then triángulo=”Equilátero” else triángulo=”Isósceles” else if A = C then triángulo=”Isósceles” else if B=C then triángulo=”Isósceles” else triángulo=”Escaleno” Prof. Leopoldo Silva Bijit. 07-07-2003 48 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. Nota: Cuando los números son reales, no conviene probar la igualdad de dos números. Es preferible determinar que difieran a lo más en una cantidad pequeña; por ejemplo, que difieran en la cuarta cifra significativa. Modificar el algoritmo de acuerdo a lo recién planteado. 6.4 Algoritmo de Euclides. Si x e y son enteros, no ambos ceros, su máximo común divisor, que anotaremos mcd(x,y), es el mayor entero que los divide a ambos exactamente; es decir, sin resto. Ejemplo: mcd( 7,11) = 1 mcd(16,28) = 4 Puede comprobarse que: mcd( x,0) = |x| mcd( x,y) = mcd(y,x) mcd(-x,y) = mcd(x,y) Por lo tanto interesa obtener un algoritmo para el mcd de enteros no negativos. El conocimiento matemático que se necesita, para resolver este problema es el siguiente: a) Si x es igual a y; x (ó y) es el resultado. b)Si se reemplaza el número mayor por la diferencia del mayor menos el menor, no cambia el máximo común divisor. En términos matemáticos: a) mcd(x,x) = x b) Si x > y se tiene mcd(x,y) = mcd(x-y,y) Entonces para enteros mayores que cero: Mientras los números sean diferentes: Deje el menor, y forme otro restando el menor al mayor. Si los números son x e y, el algoritmo queda: While x<>y do if x>y then x:=x-y else y:=y-x Un programa que desarrolla la idea anterior es: Prof. Leopoldo Silva Bijit. 07-07-2003 49 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. Program mcd; var x,y:integer; begin write('máximo común divisor de enteros mayores que cero'); writeln; write('x=');read(x);readln;writeln; write('y=');read(y);readln;writeln; write('mcd(',x,',',y,')='); while x<>y do if x>y then x:=x-y else y:=y-x; write(x); writeln end. Una variante del algoritmo de Euclides es la siguiente: Puede comprobarse que: mcd(x,y) = mcd(y,x mod y) El que muestra cómo reducir uno de los números, manteniendo en el primer lugar al mayor. La transformación debe repetirse hasta que el menor de los números sea igual a cero. El cambio de posición de los números requiere una variable temporal que denominaremos resto. Entonces: ... read(x); read(y); while y<>0 do begin resto:=x mod y; x:=y; y:=resto end; write(x); ... Otra forma del Algoritmo de Euclides es la siguiente: ... read(x);read(y); {x>0 e y>0} repeat Prof. Leopoldo Silva Bijit. 07-07-2003 50 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. while x>y do x:=x-y; while y>x do y:=y-x until x=y; write(x); ... Los ejemplos anteriores muestran que nunca existe una sola solución para un problema determinado. Unas pueden ser más simples que otras; o más rápidas; o más fáciles de leer. Existen técnicas especiales que permiten evaluar la complejidad de un algoritmo tanto en uso del espacio como en tiempo de ejecución. Por las razones anteriores siempre es conveniente, una vez desarrollado un algoritmo, analizar si pueden efectuarse modificaciones que lo simplifiquen o lo hagan más eficiente. 6.5 Repeticiones Anidadas. Triángulo de números. Se desea imprimir un triángulo de números consecutivos. Tal que en la primera línea se tenga un número, dos en al segunda y así sucesivamente, hasta imprimir la línea n-ava, con n números. Puede plantearse: repetir ponerse al principio de la línea escribir una línea hasta llegar a la línea final Escribir una línea puede concebirse: repetir escribir un número incrementar número avanzar a la siguiente columna hasta que la columna tenga el mismo valor que la línea actual Definiendo la variables número, línea y columna, es posible seguir descendiendo en el nivel de detalle: ... línea:=1;numero:=1; repeat Prof. Leopoldo Silva Bijit. 07-07-2003 51 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. writeln;columna:=1; repeat write(numero); numero:=numero+1; columna:=columna+1 until columna> línea; línea:=línea+1 until línea>n+1; ... Se denomina anidamiento al hecho de que un bloque esté dentro (en el nido ) de otro. Gráficamente: A B Se dice que B está anidado (nested) en A. Debido a la estructura de Pascal, todas las construcciones repetitivas que están dentro de otras, quedan naturalmente anidadas. En lenguajes que usan saltos como instrucciones para controlar la secuencia, pueden escribirse bloques repetitivos no anidados, lo que generalmente es causa de errores, y complica su análisis. 6.6. Efectuar traza. En sentencia while. Determinar qué escribe el segmento: .... n:=15; while n>0 do begin n:=(n-1) div 2; write(n+1) end; .... Solución: Iteracíon n (n-1) div 2 n+1 1 15 7 8 Prof. Leopoldo Silva Bijit. 07-07-2003 52 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. 2 Iteracíon 3 4 7 n 3 1 3 (n-1) div 2 1 0 4 n+1 2 1 Cuando n=0 sale del lazo. Y escribe: 8 4 2 1 6.7. Uso de while. Potencia de dos. Dado un límite, determinar cuál es la potencia de 2 más cercana al límite (use sentencia While-Do). Solución: PROGRAM POTENCIADOS(INPUT,OUTPUT); VAR LIMITE, POTENCIA, EXPONENTE, RESTA1, RESTA2: INTEGER; BEGIN (*PROGRAMA*) READ(LIMITE); POTENCIA:=1; EXPONENTE:=0; WHILE POTENCIA<LIMITE DO BEGIN (*WHILE*) EXPONENTE:=EXPONENTE+1; POTENCIA:=POTENCIA*2 END; (*WHILE*) (*al salir del lazo potencia será mayor que límite*) RESTA1:=POTENCIA-LIMITE; RESTA2:=LIMITE-(POTENCIA DIV 2); IF RESTA1>RESTA2 THEN WRITE('2 ELEVADO A',EXPONENTE-1,'ES POTENCIA DE 2 MAS CERCANA A',LIMITE) ELSE WRITE('2 ELEVADO A',EXPONENTE,'ES POTENCIA DE 2 MAS CERCANA A',LIMITE) END. (*PROGRAMA*) LA LA 6.8. Efectuar traza. En sentencia repeat. Prof. Leopoldo Silva Bijit. 07-07-2003 53 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. Determinar qué escribe el segmento. .... n:=0; repeat j:=n+1; n:=3*n+j; j:=n+1; writeln(j,n) until j>17; .... Solución: Iteración 1 2 3 n j=n+1 n=3*n+j j=n+1 j 0 1 1 2 2 1 2 5 6 6 5 6 21 22 22 n 1 5 21 Sale del lazo con j=22. Escribe: 2 1 6 5 22 21 6.9. Efectuar traza. En repeat forever. Determinar qué escribe el segmento. ...... n:=1; repeat n:=2*n+2;write(2*n+2) until n=48; ...... Solución: Iteración 1 2 3 4 n 1 4 10 22 n=2*n+2 2*n+2 4 10 10 22 22 46 46 94 Se repite hasta el overflow. Escribe: 10 22 46 94 ..... Prof. Leopoldo Silva Bijit. 07-07-2003 54 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. 6.10. Generar Secuencia. Escribir programa en Pascal, que genere la secuencia de recurrencia: definida por la siguiente relación f(i+2) = f(i)+2*f(i-1)+f(i+1) para i>0 f(0)=1; f(1)=2; f(2)=1 Solución: PROGRAM PRUEBA; VAR FIMEM,FI,FIMAS,FIDOS,I,J:INTEGER; BEGIN (*PROGRAMA*) WRITE('GENERA HASTA F(I). I='); READLN(I);WRITELN; FIMEN:=1; WRITELN(' F(0)=1'); FI :=2; WRITELN(' F(1)=2'); FIMAS:=1; WRITELN(' F(2)=1'); J:=2; REPEAT { ITERA HASTA J=I} FIDOS:=FI+2*FIMEN+FIMAS; {FUNCION} FIMEN:=FI; FI:=FIMAS; {SALVA VALORES PARA PROX. ITERACION} FIMAS:=FIDOS; J:=J+1; WRITELN('F(',J,')=',FIDOS) UNTIL J=I END. {PROGRAMA} 6.11. Cálculo de serie. Sumar los primeros diez términos de la serie. Escribir la relación de recurrencia. -4/3 + 8/15 - 12/35 + - ...... Solución: n f(n)=(-1) 4n/((2n-1)(2n+1)) ; para n = 1,2,.... Prof. Leopoldo Silva Bijit. 07-07-2003 55 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. PROGRAM SERIE; VAR SUMA:REAL; {para acumular las fracciones} SGN,N:INTEGER; BEGIN { OTRO } SUMA:=0; SGN:=-1; FOR N:=1 TO 10 DO {SUMA DESDE F(1) HASTA F(10)} BEGIN { FOR } SUMA:=SUMA+(SGN*(4*N))/((2*N-1)*(2*N+1)); SGN:= -SGN; {ALTERNA SIGNO} END; { FOR } WRITELN('SUMA = ',SUMA) END. { OTRO } 6.12. Desarrollo Operación Mod. Determinar un algoritmo que evalúe el resto de la división entera de n y d. Es decir, se desea implementar el operador mod empleando operaciones más básicas. r:= n mod d Solución: Basada en la definición de mod. ..... if n = d then r:=0 else begin r:=n; while r>d do r:=r-d end ..... El algoritmo es lento, pues si n>>d debe realizar n div d veces el lazo de repetición. Puede decirse que el algoritmo es lineal, en el sentido que las veces que se repite la resta es proporcional al número de veces que d cabe en n. Prof. Leopoldo Silva Bijit. 07-07-2003 56 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. Un algoritmo más eficiente, y que dará que el número de veces que se repite el bloque sea proporcional al logaritmo en base dos de n div d es el siguiente: .... r:=n ;dd:= d; while dd<=r do dd:=2*dd; while dd<>d do begin dd:=dd div 2; if dd<=r then r:=r-dd end; .... En este algoritmo se emplean multiplicaciones y divisiones por 2, además de sumas y restas. Todas operaciones existentes en el repertorio de máquina de cualquier computador. Una variante del algoritmo anterior permite obtener el cuociente y el resto de la división entera entre n y d: r:= n mod d q:= n div d Esto considerando que: n:= q*d + r .... r:=n ;dd:= d; q:= 0; while dd<=r do dd:=2*dd; while dd<>d do begin dd:=dd div 2; q:= q*2; if dd<=r then begin r:=r-dd; q:= q+1 end end; .... 6.13. Diagrama de flujo Estructurado. Mediante la introducción de una variable booleana, modificar el siguiente diagrama de flujo a un diagrama de flujo estructurado. Escribir el segmento empleando Pascal, sin usar goto. Prof. Leopoldo Silva Bijit. 07-07-2003 57 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. C1 y C2 son predicados en general y pueden o no ser modificados por la acción A. V F C1 A F V C2 Sea C3 la variable booleana a introducir. Una solución posible es: C3:=TRUE El diagrama de flujo estructurado: C3:=TRUE C3 C1 V F A C3:=FALSE V C2 F C3:=FALSE El segmento asociado es: ... C3:=TRUE; WHILE C3 DO {la acción a repetir no necesita} IF C1 {Begin .. End ; ya que es una alternativa} THEN Prof. Leopoldo Silva Bijit. 07-07-2003 58 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. BEGIN A; IF NOT C2 THEN C3:=FALSE END ELSE C3:=FALSE ; ..... Otra solución, más simple, puede ser: C1 V F A not (C1 and C2) El segmento asociado es: ... REPEAT IF C1 THEN A UNTIL NOT (C1 AND C2) ... 6.14. Serie con números reales. Se tiene la siguiente serie: Si = 1 − x3 x5 + + .... 3! 5! a) Determinar la relación de recurrencia. b) Escribir un programa para obtener la suma de los términos. La suma debe detenerse cuando el término general sea menor que el valor epsilon; que debe leerse desde el terminal. Solución: x3 x5 x 2*i −1 i +1 Si = 1 − + − +.... + ( −1) 3! 5! (2* i − 1)! Prof. Leopoldo Silva Bijit. 07-07-2003 59 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. Dividiendo el último por el antepenúltimo se logra: Tj = −T j−1 ∗ x2 , j > 0,T 0 = x (2* j − 2)(2* j − 1) Pero no puede emplearse pues para j=1 se tendrá denominador cero. j =i Puede plantearse: Si = x + ∑T j j= 2 Ahora la relación queda: x2 Tj = −T j−1 ∗ , j > 1, T 1 = x (2* j − 2)(2* j − 1) Prof. Leopoldo Silva Bijit. 07-07-2003 60 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. Program seno; var x, s, t, epsilon: real; j: integer; begin read(x); read(epsilon); t:=x;s:=t;j:= 2; while abs(t)>epsilon do begin t:=-t*x*x/((2*j-1)*(2*j-2)); s:=s+t; j:=j+1 end; writeln(s) end. 6.15. Bloques de repetición. Procedimientos. Leer un número entero menor que un millón; y escribir la cantidad de billetes y monedas que representan el valor. El ejemplo ilustra como pueden definirse procedimientos cuando se detectan bloques repetitivos de código en un programa. Solución: Program cajero; var m:integer; begin read(m); if m<1000000 then begin writeln(m div 5000,' de a 5000'); m:=m mod 5000; writeln(m div 1000,' de a 1000'); m:=m mod 1000; writeln(m div 500,' de a 500'); m:=m mod 500; writeln(m div 100,' de a 100'); m:=m mod 100; Prof. Leopoldo Silva Bijit. 07-07-2003 61 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. writeln(m div 50,' de a 50'); m:=m mod 50; writeln(m div 10,' de a 10'); m:=m mod 10; writeln(m div 5,' de a 5'); m:=m mod 5; writeln(m, 'de a 1') end else writeln('solo acepto valores menores que un millon') end. Se detecta grupo de repetición, que se agrupa bajo el nombre tantosdea. El Programa queda: program cajero2; var m,p:integer; procedure tantosdea; begin writeln(m div p,' de a',p); m:=m mod p end; {tantosdea} begin {programa} read(m); if m<1000000 then begin p:=5000; tantosdea; p:=1000; tantosdea; p:= 500; tantosdea; p:= 100; tantosdea; p:= 50; tantosdea; p:= 10; tantosdea; p:= 5; tantosdea; p:= 1; tantosdea end else writeln('solo acepto valores menores que un millon') end. Aún se aprecia una repetición, que permite definir un procedimiento llamado grupo. La versión se muestra a continuación. Prof. Leopoldo Silva Bijit. 07-07-2003 62 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. program cajero3; var m,p:integer; procedure tantosdea; begin writeln(m div p,'de a',p); m:=m mod p end; {tantosdea} procedure grupo; begin repeat tantosdea; p:=p div 5; tantosdea; p:=p div 2 until p=0 end; {grupo} begin {programa} read(m); if m<1000000 then begin p:=5000; grupo end else writeln('solo acepto menores que un millon') end. 6.16. Multiplicación como suma repetitiva. Se tiene el siguiente programa: Program multiplica; var x,y,t,s:integer; begin read(x); read(y); s:=0; while x<>0 do begin t:=0; while t<>y do begin s:=s+1; t:=t+1 end; Prof. Leopoldo Silva Bijit. 07-07-2003 63 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. x:=x-1 end; write(s) end. a) Explicar qué hace el programa. b) Describir el algoritmo en forma top-down. c) Restricciones de la entrada para no tener lazos infinitos. d) Para que se emplean las variables s y t. e) Efectuar traza para x=3 e y=4. Solución: a) Se efectúa la multiplicación de dos enteros positivos. Se repite y veces la acción de incrementar en uno un contador s; y lo anterior se repite x veces. Es decir se repite x por y veces el incremento en uno de la variable s. b) 1. Multiplicar dos enteros x e y 1.1 Leer enteros x e y 1.2 Multiplicarlos dejando el producto en s 1.3 Escribir el resultado s. No es necesario expandir los pasos 1.1 y 1.3 pues pueden implementarse directamente por instrucciones del repertorio. La siguiente secuencia es una refinación de 1.2 1.2.1 Hacer cero el producto 1.2.2 repetir x veces 1.2.3 repetir y veces: sumar uno al producto. Se estima suficiente el grado de descripción de la multiplicación. El descenso al código es casi inmediato, falta sólo definir la necesidad de la variable t. c) x e y no pueden ser negativos. En caso de serlo (cualquiera de ellos) el respectivo lazo se repetiría infinitas veces. Prof. Leopoldo Silva Bijit. 07-07-2003 64 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. c1) Si se inicia x con valor negativo, en cada repetición se hará más negativo el valor de x. Y nunca será x=0, que es la condición para terminar el lazo externo. Cuestión similar ocurre para un valor inicial negativo de y. c2) Sin embargo una o ambas variables pueden ser cero; y el correcto para el producto. algoritmo da el resultado d) La variable s se emplea para acumular el producto. La variable t se emplea para contar y veces; esto es necesario pues no debe destruirse el valor de y. Ambas variables se emplean como contadores ascendentes módulo 1. e) Numeración de pasos. 1) read(x); read(y); s:=0; 2) while x<>0 do begin 3) t:=0; 4) while t<>y do begin s:=s+1; t:=t+1 end 5) x:=x+1 end; 6) write(s) Traza. 1 2.1 3.1 4.1 4.2 4.3 4.4 5.1 2.2 3.2 4.1 4.2 4.3 4.4 5.2 x 3 y 4 s 0 t - 1 2 3 4 0 1 2 3 4 5 6 7 8 0 1 2 3 4 2 1 Prof. Leopoldo Silva Bijit. 07-07-2003 65 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. 2.3 3.3 4.1 4.2 4.3 4.4 5.3 9 10 11 12 0 1 2 3 4 0 6. Se escribe 12. 6.17. Lectura de caracter con confirmación. Leer un caracter diferente de espacio, sujeto a confirmación : repeat write('Entre caracter : '); while ch=' ' do readln(ch); write('Esta seguro? Seguro=s Repita=<otro caracter> '); readln(verificacion) until verificacion='s' 6.18. Reducción de fracciones. program fraccion(input,output); const pleca = '/'; var num,den,nn,nd : integer; begin writeln('Entre una fraccion, sin espacios : '); read(num);write(pleca);readln(den); nn:=num;nd:=den; {obtiene mcd(nn,nd) } while nn<>nd do if nn>nd then nn:=nn-nd else nd:=nd-nn; {al salir mcd=nn=nd} write (num:3,pleca,den:3,'='); writeln(num div nn:3,pleca,den div nd:3) end. Prof. Leopoldo Silva Bijit. 07-07-2003 66 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. 6.19. Ejercicios. 6.19.1. Equivalencia sintáctica. Se tienen : a) if c >= 0 then a1 else a2; b) if c < 0 then a2 else a1; Determinar si son sintácticamente equivalentes, en qué condiciones; y cuál es la ventaja de usar una u otra. 6.19.2. Uso de paréntesis. Comprobar que las expresiones a la izquierda son equivalentes con las de las de la derecha. -2 mod k i - k div j x/j/z x*y*z (-2) mod k i-(k div j) (x/j)/z (x*y)*z 6.19.3. Orden de evaluación. Comprobar que el siguiente diagrama ilustra el orden en que se evalúa una expresión; el número al lado del operador refleja el orden. z - ( a + b div c ) + d * y 1 div 2 - Prof. Leopoldo Silva Bijit. * 3 + 4 +07-07-2003 5 67 UNIVERSIDAD TECNICA FEDERICO SANTA MARIA DEPARTAMENTO DE ELECTRONICA Programación en Pascal Capítulo 6. Ejemplos Resueltos. 6.19.4. Nombres sugerentes. Siempre es conveniente identificar las variables con nombres que sean sugerentes. Se tienen : a) for contadordellazo:=inicial to final do a[contadordellazo]:=0; b) for i:=inicial to final do a[i]:=0; Analizar, en general, cuando conviene usar nombres largos para las variables. En el ejemplo ilustrado se emplean arreglos y la instrucción for, que se verán más adelante. Para el caso mostrado es mejor la forma b). 6.19.5. Sumatoria. Comprobar que el siguiente segmento, calcula : i =n suma = ∑ X i i =1 .. suma:=0; for i:=1 to n do begin readln(x); suma:=suma + x end; writeln(suma); .. 6.19.6 Lazos infinitos. Condición de término. Verificar que el siguiente segmento produce un lazo infinito: .. x:=0; repeat x:=x+0.01; write(x:5:1) until x=1.0; .. Explicar a qué se debe. Prof. Leopoldo Silva Bijit. 07-07-2003 68