Laboratorio Programación II 2010 Laboratorio Programación Imperativa Práctica 2 Prof. Responsables: Federico Severino Guimpel, Natalia Colussi Auxiliares: Pablo Rodriguez Monetti, Santiago Beltramone Arreglos. Tipos Subrango. Definición de nuevos tipos. Estructura de Repetición: Ciclos while-do. 1. Dado el siguiente programa en PASCAL responda a las preguntas que se indican mas a bajo. Para cada una de ellas deberá transcribir el programa compilarlo y observar el comportamiento. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 Program LeerPalabra ; (* El siguiente programa realiza .... *) uses crt ; const fin = ’* ’; (* fin del ingreso *) var cch : Char ; (* caracter leido *) icount : Integer ; (* contador de caracteres *) begin clrscr ; (* inicialización de variables *) icount :=0; (* lectura del primer caracter *) write ( ’ Ingrese una palabra (* para finalizar ) : ’) ; read ( cch ) ; (* ciclo de lectura *) while cch <> fin do begin icount := icount +1; read ( cch ) ; end ; (* muestra la cantidad de caracteres leidos *) writeln ( ’ La cantidad de caracteres de su palabra es : ’ , icount ) ; readkey ; end . a) Analice el código y complete el comentario inicial indicando lo que realiza. Transcriba y ejecute el programa. b) ¿Qué modificaciones deberı́a realizar si la condición para dar fin a la palabra ingresada fuera #? ¿y si fuera espacio en blanco?. Modifique el programa anterior para que satisfaga este cambio en el requerimiento. c) Modifique el programa para que ahora lea frases (String) y finalice cuando el usuario haya ingresado la frase vacı́a, indicando la cantidad de frases ingresadas. 2. Crea un programa que pida números positivos al usuario calcule la suma de todos ellos. El programa terminará cuando se teclea un número negativo o cero. El programa mostrará la suma de todos los números. 1 Laboratorio Programación II 2010 3. Crea un programa que pida al usuario su nik y su contraseña dándole tres oportunidades para ingresar el nombre y la contraseña esperadas. Defina el nik y la contraseña válidas como constantes asociándoles los valores: mafalda, mUnD0 respectivamente. 4. Dado la siguiente especificación y su correspondiente programa en PASCAL responda a las preguntas que se indican más a bajo. |[ var x, y, q, r : Integer {Q: x ≥ 0 ∧ y > 0} q, r := 0, x {Inv P: r ≥ 0 ∧ y > 0 ∧ q × y + r = x} {Cota T: r} do r ≥ y → r, q := r − y, q + 1 od {R: 0 ≤ r < y ∧ q × y + r = x} ]| 1 2 3 4 5 6 7 8 Program DivisionEntera ; (* Este programa realiza la división entera de dos valores ingresados *) (* indicando el cociente y el resto de tal operación *) uses crt ; type PosInt = 1 .. maxint ; (* Tipo Enteros Positivos *) NoNegInt = 0 .. maxint ; (* Tipo Enteros No Negativos *) 9 10 11 12 13 14 15 var ivalorY : PosInt ; ivalorX , iresto , icociente : NoNegInt ; (* alamcenará (* alamcenará (* alamcenará (* alamcenará el el el el valor valor valor valor del del del del divisor *) dividendo *) dividendo *) divisor *) 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 begin clrscr ; (* Lectura de los valores X e Y *) write ( ’x = ’) ; readln ( ivalorX ) ; writeln ; write ( ’y = ’) ; readln ( ivalorY ) ; writeln ; { x >=0 /\ y >0 } (* Inicialización de variables *) icociente := 0; iresto := ivalorX ; { inv P : 0= < r /\ 0 < y /\ q * y + r = x } { cota T : r } while iresto >= ivalorY do begin iresto := iresto - ivalorY ; icociente := icociente +1; end ; { R : 0= <r < y /\ 0 < y /\ q * y + r = x } 34 35 36 37 38 (* Muestro el resultado de la operación *) writeln ( ivalorX :1 , ’ dividido por ’ , ivalorY :1 , ’ es igual a ’ , icociente :1 , ’ con resto ’ , iresto :1) ; readkey ; end . 2 Laboratorio Programación II 2010 a) Analice la especificación y el código asociado. Transcriba y ejecute el programa. b) ¿Qué modificaciones deberı́a realizar si en lugar de usar tipos subrango para las variables el mismo utilizará tipo Integer. Modifique el programa anterior para que cumpla este cambio que el programador desea realizar y siga satisfaciendo la especificación. 5. Diseñe un programa en PASCAL correspondiente a las siguientes especificaciones ya verificadas en la practica. b) |[ a) |[ var x, y, n : Integer {Q: n ≥ 0} x, y := 0, 1 {Inv P:x ≤ n ∧ y = 2x } {Cota T:n − x} do x 6= n → x, y := x + 1, y + y od {R: y = 2n } ]| c) |[ var x, y, n : Integer {Q: n ≥ 0} x, y := 0, 0 {Inv P:x ≥ 0 ∧ y ≤ n} {Cota T:x + 2 × (n − y)} do x 6= 0 → x := x − 1 [] y 6= n → x, y := x + 1, y + 1 od {R: x = 0 ∧ y = n} ]| var k, b, c : Integer; {Q: n > 0} k, b, c := 1, 0, 1 {Inv P:P : 1 ≤ k ≤ n ∧ b = f ib.(k − 1) ∧ c = f ib.k} {Cota T:n − k} do k 6= n → k, b, c := k + 1, c, b + c od {R: c = f ib.n} ]| 6. Dada la siguiente especificación de un ciclo, a) |[ var x, suma, i : Integer {Q: x ≥ 0} suma, i := 0, 0 {Inv P:0 ≤ i ≤ x ∧ suma = (Σj : 0 ≤ j ≤ i : j)} {Cota T:x − i} do i < x → i := i + 1; suma := suma + i; od {R: suma = (Σj : 0 ≤ j ≤ x : j) ∧ i = x} ]| se pide: verifique que la misma es correcta y codifique dicho ciclo en PASCAL. modifique la especificación y el ciclo anterior para que ahora verifique la siguiente especificación parcial de un ciclo que realiza la multiplicación de los números comprendidos entre 1 . . . x en lugar de la suma. Verifique su diseño y transcriba su ciclo en programa PASCAL. 3 Laboratorio Programación II b) |[ 2010 var x, prod, i : Integer {Q: x ≥ 1} prod, i := 1, 1 {Inv P:1 ≤ i ≤ x + 1 ∧ prod =?} {Cota T:(x − 1) − i} do i < x → i := i + 1; prod :=?; od {R: prod = (Πj : 1 ≤ j ≤ x : j) ∧ i = x} ]| 7. Dado el siguiente programa en anotado en PASCAL responda a las preguntas que se indican mas a bajo. 1 2 3 4 Program SumaArreglo ; (* El siguiente suma los valores de un arreglo de 5 elementos *) uses crt ; 5 6 7 8 9 10 var bs : array [1..5] of Integer ; (* lista de 5 elementos *) i , (* contador de los ciclos *) isuma (* suma de los elementos del arreglo *) : Integer ; 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 begin clrscr ; writeln ( ’ Ingrese los 5 valores del arreglo ’) ; (* Inicialización de variables *) i :=1; (* Lectura de los valores del arreglo *) while i <= 5 do begin write ( ’ bs [ ’ ,i , ’ ]: ’) ; readln ( bs [ i ]) ; i := i +1; end ; isuma := 0; i :=1; { inv P : 1= <i <=6 /\ isuma = (+ j : 1 <= j <i : bs [ i ]) } { cota T : 5 - i } while i <= 5 do begin isuma := isuma + bs [ i ]; i := i +1; end ; { R : isuma = (+ j : 1 <= j <6 : bs [ i ]) /\ i = 6) } 32 33 34 35 36 (* Muestro el resultado de la operación *) writeln ( ’ La suma de todos los elementos del arreglo es : ’ , isuma :1) ; readkey ; end . a) Transcriba y ejecute el programa. Analice el código en relación a las anotaciones que lo acompañan. b) Modifique el programa anterior y las anotaciones correspondientes para que: 1) Sume un arreglo de cinco reales. 4 Laboratorio Programación II 2010 2) Sume la longitud de cinco palabras. 3) Sume un arreglo de cinco enteros cuyos elementos son pares. 4) Sume un arreglo de cinco enteros cuyos elementos son todos positivos. En este caso realice dos versiones, una donde defina un tipo nuevo y otra donde no sea necesario. 8. Dadas las siguientes especificaciones de ciclos ya verificadas en la practica obtener los programas en PASCAL correspondientes. a) |[ const n : Integer; var i, x : Integer; b : array[0 . . . n] of Integer; {Q: n ≥ 0} i := 0 {Inv P: 0 ≤ i ≤ n + 1 ∧ ¬(∃ j : 0 ≤ j < i : x = b[j])} {Cota T: n − i} do i ≤ n ∧ x 6= b[i] → i := i + 1 od {R: (0 ≤ i ≤ n ∧ x = b[i]) ∨ (i = n + 1 ∧ ¬(∃ j : 0 ≤ j ≤ n : x = b[j]))} ]| b) |[ var i, s : Integer; b : array[0 . . . 10] of Integer; {Q: (∀i : 0 ≤ i < 10 : b[i] >= 0)} i, s := 10, 0 {Inv P: 0 ≤ i ≤ 10 ∧ s = (+k : i + 1 ≤ k ≤ 10 : b[k])} {Cota T: i} do i > 0 → i, s := i − 1, s + b[i] od {R:s = (+k : 0 ≤ i ≤ 10 : b[i])} ]| 9. Especifique, verifique y codifique un programa que realice las siguientes tareas: a) calcula el promedio de los elementos. b) suma los elementos impares de un arreglo de siete elementos. c) suma los elementos impares de un arreglo de siete elementos y le reste los pares. d ) suma los elementos en las posiciones impares. e) suma los elementos en las posiciones impares y le reste los elementos en las posiciones impares. 5