21/03/2016 Hablar conmigo al final de la clase Dra. Jessica Andrea Carballido jac@cs.uns.edu.ar Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR Variables y Constantes Ciclo de programación Editar código fuente Los datos de un programa están representados por variables o constantes y tienen asociado un tipo. Compilar OK? Un tipo de dato determina el conjunto de valores y el conjunto de operadores que se aplican sobre estos valores. NO Sí Ejecutar (test) OK? NO (no da el resultado esperado) Integer Real Char Boolean El tipo de dato permite realizar controles para prevenir algunos errores. Si en una expresión, un operador está asociado con operandos que no son compatibles con su tipo, el compilador reporta un error. Sí Constantes Constantes Queda ligada a un identificador mediante una declaración. Queda ligada a un identificador mediante una declaración. const PI = 3.1415; fin_texto = ’.’; cartel = ‘El radio es: ’; … begin x:= 2 * PI write (cartel); Ch:=‘*’; fin:= (Ch = fin_texto) … NO!! PI:=10 1 21/03/2016 TIPOS El tipo integer Variables Una computadora puede representar un conjunto finito de valores. El tipo integer brinda un subconjunto de los números enteros y un conjunto de operaciones definidas para este subconjunto de valores. En la declaración de una variable se establece: •Nombre: cualquier identificador no reservado. •Tipo: determina el conjunto de valores que puede tomar y en qué operaciones puede usarse. El subconjunto está definido por el rango –MaxInt y MaxInt, donde MaxInt es una constante predefinida. Algunos operadores predefinidos del tipo integer son: En ejecución una variable tendrá: + - * div mod sqr abs sqrt •Valor: contenido en el conjunto establecido por el tipo. •Locación: lugar en memoria en el cual se almacena el valor. TIPOS El tipo integer TIPOS El tipo real El tipo real incluye a un subconjunto de los números reales; aquellos que están dentro de un rango dado y con cierta precisión. Dadas las declaraciones var x, y, M, N: integer; Son válidas las expresiones: Algunos de los operadores predefinidos del tipo real son: 2+x*y M mod N + - * / abs sqr sin cos sqrt sqr(x) div 2 Computan un valor de tipo real al aplicarse sobre un operando de tipo real. abs(M) trunc round Se aplican sobre un argumento de tipo real y computan un número entero TIPOS El tipo real El tipo boolean Dadas las declaraciones var v1, v2: real; Son válidas las expresiones: 2.1 + v1/v2 sqr(v1) abs(v2-v1) sqrt(v1) + sqrt(v2*v2) sin (v1) El tipo boolean incluye solo a dos valores que son las constantes predefinidas true y false, y los tres operadores lógicos or, and y not. El valor de las variables booleanas se puede imprimir pero no leer. Los operadores relacionales <, >, =, <>, <=, >= se aplican a operandos de tipo integer, real o char y computan un valor de tipo boolean TIPOS 2 21/03/2016 El tipo boolean TIPOS El tipo char const minimo = 10; El tipo char permite representar el conjunto de 256 letras mayúsculas y minúsculas, dígitos y otros caracteres. Cada caracter está representado internamente como un número entero denotando su código ASCII. maximo = 20; var temp : integer; seSuspende : boolean; … seSuspende := (temp < minimo) or (temp > maximo); Pascal no entiende: Los literales de tipo de caracter se denotan entre apóstrofes, e.g. 'A', 'B', …, 'a', 'b', 'c', …, '''', '@', …, '0', '1', '2', … minimo < temp < maximo TIPOS TIPOS El tipo char American Standard Code for Information Interchange Está formado por 256 símbolos, aquí se muestran algunos: 32 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 ii 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 ¦ 128 Ç 129 ü Las estructuras de control condicionales permiten modelar situaciones en las cuales la ejecución de una instrucción o de un bloque de instrucciones depende de una condición. Utilizamos el condicional cuando: • una instrucción o bloque depende de una condición. • dos instrucciones o bloques son mutuamente excluyentes según una condición TIPOS El tipo char Los operadores pred y succ aplicados a un operando de tipo char computan un valor de tipo char. El operador chr aplicado sobre un operando de tipo entero computa un valor de tipo char. El operador ord aplicado sobre un operando de tipo char computa un valor de tipo integer pred(‘z’)=‘y’ succ(‘C’)=‘D’ chr(35)=‘#’ ord(‘M’)=77 Leer dos números y mostrar el máximo entre los dos. Si son iguales, mostrar cualquiera. program maximo; var x, y: integer; begin write (‘Ingrese dos números: ’); readln (x, y); write (‘El maximo es ´); if (x>y) then writeln (x) else writeln (y); end. Máximo • dos instrucciones o bloques son mutuamente excluyentes según una condición 3 21/03/2016 La instrucción if evalúa una expresión lógica. Esta expresión le permite al programador establecer una condición. Si la expresión lógica computa true la condición se satisface y se ejecutan la instrucciones que siguen a la palabra reservada then. Si la condición es false se ejecutan las instrucciones que siguen a la palabra reservada else. Dados dos números x e y, si el 1ro es menor que el 2do intercambiarlos. Mostrar luego x e y. Proponga casos de prueba adecuados para verificar la solución. Debemos verificar por lo menos con dos valores: uno con el que la condición se evalúe a true y el otro que evalúe a false. program menorElPrimero; var x, y, temp : real; begin write (´Ingrese dos números´); readln(x, y); if (x<y) then {Intercambiar los valores} begin temp := x ; • una instrucción o bloque depende x := y; de una condición. y := temp; end; writeln (‘x es: ‘, x, ‘ y es: ‘, y); end. La indentación adecuada favorece la legibilidad. Leer los límites de un intervalo cerrado [a,b] y un número x y determinar si x está en el intervalo. x está en el intervalo [a, b] si a <= x <= b Pascal no admite una expresión como a <= x <= b (x >= a) and (x <= b) En este caso si la expresión lógica computa true se ejecutan tres instrucciones. Todo bloque de dos o más instrucciones se encierra entre las palabras reservadas begin end. Si la condición (x<y) es false no se ejecuta ninguna instrucción dependiente del condicional. Notemos que el else es opcional. Incluimos un comentario que describe el significado del bloque asociado al then. • una instrucción o bloque depende de una condición. Leer los límites de un intervalo cerrado [a, b] y un número x y determinar si x está en el intervalo. ¿Cuáles son los datos de entrada? ¿Cuáles son los datos de salida? ¿Cuáles pueden ser los casos de prueba? (a <= x) and (x <= b) 4 21/03/2016 program intervalo; var a, b: real; x: real; pertenece: boolean; begin writeln (‘Ingrese los límites del intervalo ’); Un comercio aplica un descuento del 10% a las ventas que superan los $250. Escribir un programa que lea el monto bruto de una venta y muestre el monto luego de aplicar el descuento correspondiente. readln (a, b); writeln (‘Ingrese el valor de x: ‘); Monto Bruto Monto final (neto) pertenece:= (a<=x) and (x<=b); <= 250 Monto Bruto if (pertenece = true) pertenece > 250 90% de Monto Bruto readln (x); then writeln (‘x pertenece al intervalo’) else writeln (‘x no pertenece al intervalo’); end. ¿Cuáles son los datos de entrada? ¿Cuáles son los datos de salida? Versión 1 program venta; var monto: real; Y el dato de salida? begin write (´Ingrese el Monto Bruto: ´); readln (monto); write (‘El Monto final es ´); if (monto <=250) then writeln (monto) else writeln (monto*0.90); end. Escribir un programa que lea el monto de un crédito y la cantidad de cuotas y calcule el monto de cada cuota. program cuotas; Datos de entrada y de salida? var credito: real; cantCuotas: integer; begin write (‘Ingrese el monto del crédito ‘); readln (credito); write (‘Ingrese la cantidad de cuotas ‘); readln (cantCuotas); write (‘El monto de la cuota es ´, credito/cantCuotas); end. Versión 2 program venta; const porc = 0.9; var bruto, neto: real; // el neto es el bruto * porcentaje begin write (´Ingrese el Monto Bruto: ´); readln (bruto); if (bruto <=250) then neto := bruto else neto := bruto * porc; writeln (´El monto neto es´, neto); end. Escribir una nueva versión donde quede almacenado en el dato “monto” el valor del dato de salida. program cuotas; var credito: real; cantCuotas: integer; begin ... write (‘El monto de la cuota es ´, credito/cantCuotas); if (cantCuotas <= 0) Evitamos then la writeln (‘La cantidad de cuotas debe ser mayor a cero’) posibilidad de que else surja un error en write (‘El monto de la cuota es ‘, credito/cantCuotas); ejecución! end. Es importante validar los datos de entrada para prevenir errores. 5 21/03/2016 Se utiliza cuando una o varias instrucciones mutuamente excluyentes dependen de una expresión de un tipo escalar. Se evalúa una expresión escalar y de acuerdo al valor computado se selecciona la instrucción que se va a ejecutar. Escalar: es un tipo no estructurado en el que está definida una relación de orden. read(nota); case nota of 0: writeln(‘Malo’); 1,2,3: writeln(‘Regular’); 4,5,6 : writeln(‘Bueno’); 7,8,9: writeln(‘Muy Bueno’); 10: writeln(‘Excelente’); end; Integer y char son escalares. Escribir un programa que lea una expresión aritmética binaria en notación prefija y la compute. En la notación binaria el operador +, -, * o / precede a sus operandos. ¿Cuáles son los datos de entrada? program evaluaExpresion; var x, y, sol : integer; op : char; … ¿Cuáles son los datos de salida? ¿Cuáles pueden ser los casos de prueba? + 31 8 write (‘Ingrese operador operando operando’); readln(op, x, y); if (op <> ´+´) and (op <> ‘-’) and (op <> ‘*’) and (op <> ´/´) then writeln (‘El operador no existe’) else begin ... end …begin write ('Ingrese operador operando operando '); readln(op, x, y); if (op<>'+') and (op<>'-') and (op<>'*') and (op<>'/') then writeln ('El operador no existe') else begin case op of '+': sol := x+y; '-': sol := x-y; '*': sol := x*y; '/': sol := x div y; end; writeln ('La solucion es ',sol); end; end. 6 21/03/2016 Claridad en los algoritmos Es importante que un algoritmo sea claro, y que no presente ambigüedades para quien lo lea. Para lograr esto hay que tener en cuenta una serie de pautas de “buen estilo” para la realización de algoritmos: – Indentación – Líneas para agrupar en bloques – Uso de nombres representativos CHAU! Hasta la próxima clase 7