590 likes | 935 Views
Pascal, un lenguaje de programación. En este tema estudiamos aspectos comunes a muchos lenguajes de programación Prácticamente todos los lenguajes que siguen el paradigma imperativo (= dar órdenes al ordenador)
E N D
Pascal, un lenguaje de programación • En este tema estudiamos aspectos comunes a muchos lenguajes de programación • Prácticamente todos los lenguajes que siguen el paradigma imperativo (= dar órdenes al ordenador) • Por estudiar un lenguaje concreto usaremos Pascal que, como dijimos, es un lenguaje apropiado para aprender • ¿Cómo podemos explicar Pascal? • De manera informal (lo habitual al principio) • De manera formal (usando BNF, EBNF o diagramas sintácticos para describir la sintaxis del lenguaje, por ejemplo)
Forma básica de un programa en Pascal program nombre-programa; const idCte1 = valor1; ... idCteN = valorN; var lista-variables1 : tipo1; ... lista-variablesM : tipoM; begin sentencia1; ... sentenciaK-1; sentenciaK end. Datos deentrada Sección de declaración de datos Algoritmo Datos desalida Sección de código(programa principal)
Forma básica de un programa en Pascal • Ej: Programa que convierte un valor expresado en pulgadas, proporcionado por el usuario a través de teclado, en el equivalente expresado en centímetros y lo muestra por pantalla • Implementación del algoritmo en Pascal program conversion; const centPorPulg = 2.54; var pulgadas, cent: real; begin writeln('¿Longitud?'); readln(pulgadas); cent:= pulgadas * centPorPulg; writeln('En cms:', cent) end. • Datos de entrada • Pulgadas • Datos de salida • Centímetros • Algoritmo • Obtención del valor expresado en pulgadas • Conversión al valor equivalente • Visualización del valor equivalente
program conversion; const centPorPulg = 2.54 ; var pulgadas , cent : real ; begin writeln ( '¿Longitud?' ); readln ( pulgadas ); cent:= pulgadas * centPorPulg; writeln ( 'En cms:' , cent ) end. Identificadoresnormales Palabrasreservadas Identificadorespredefinidos Literales Identificadorespredefinidos Forma básica de un programa en Pascal
Uso del espacio “en blanco” y de los comentarios • Los elementos léxicos (que marcábamos con colores antes) pueden separarse por un número cualquiera de espacios en blanco,saltos de líneaytabuladores • El espacio dejado a la izquierda de cada línea (indentación) no tiene significado para la máquina • El objetivo de estos “arreglos en el formato” es simplemente hacer más legibles los programas para otros programadores • En cualquier parte del programa el programador puede escribir comentarios para explicar su código • Si son de una sola línea basta con comenzarlos por // • Si son varias líneas deben ir entre(* y *) necesariamente // Conversor PulgCent, por Federico Peinado.(* Este programa convierte un número de pulgadas a su equivalente en centímetros. Ha sido escrito por Federico Peinado. *) • ¡Los comentarios ayudan a documentar bien nuestro trabajo!
Uso del espacio “en blanco” y de los comentarios • (********************************** Este programa convierte pulgadas a centímetros. Por Federico Peinado **********************************)program conversion; const centPorPulg = 2.54; var pulgadas, cent: real; begin writeln('¿Longitud?'); readln(pulgadas); cent:= pulgadas * centPorPulg; writeln('En cms:', cent) end. program conversion; const centPorPulg = 2.54; var pulgadas,cent:real; begin writeln('¿Longitud?');readln(pulgadas); cent:= pulgadas * centPorPulg; writeln('En cms:', cent) end. Mismo programa, pero... ¿qué formato es más cómodo de leer?
Datos de un programa • Todos los datos tienen: • Identificador • Nombre simbólico que se usa para representar el dato • Identifica de forma legible las celdas de memoria donde está guardado el dato • Tipo • El tipo de los valores que puede tener el dato • Ej: Números enteros, números reales, cadenas de texto… • Clasificación como Constante o Variable • Constante, si el valor del dato no cambia nunca en ningún momento de la ejecución del programa • Variable, si el valor del dato cambia o puede cambiar en algún momento de la ejecución del programa
Identificadores en Pascal • Un identificador es un nombre para un dato concreto • Si el valor de ese dato no cambia nunca, el identificador es una constante • Si el valor de ese dato puede cambiar durante la ejecución del programa, el identificador será una variable • Los identificadores deben ser autoexplicativos • Ej: numero_alumnos está bastante claro • Ej: nx6 no hay quien lo entienda • Sintaxis en EBNF: Identificador ::= Letra {[Subrayado] Letra | Dígito} Letra ::= “a” | “b”| ... | “z” | “A” | “B”| ... | “Z” Dígito ::= “0” | “1” | ... | “9” Subrayado ::= “_”
Identificadores en Pascal • Resumen informal de la sintaxis de un identificador de Pascal: • No puede ser un número solo • Ha de empezar necesariamente por una letra • La ñ no es una letra válida, ni las vocales con tildes o con diéresis (se usa solamente el alfabeto inglés) • No puede acabar en subrayado (_), ni puede haber dos subrayados seguidos (__) • Y por supuesto… ¡no puede ser una palabra reservada! • Identificadores predefinidos en Pascal, por ejemplo program • La longitud de los identificadores en teoría no tiene límite • Pascal no distingue entre letras mayúsculas y minúsculas NUMEntero, numEntero, numENTERO... ¡todos hacen referencia exactamente al mismo dato! • No puede haber identificadores con nombres repetidos dentro de un mismo bloque de programa, para evitar confusiones
Identificadores en Pascal • ¿Los siguientes son identificadores válidos en Pascal? pulgadas cent valido 2veces salu2 duda? x x_ x_a Explicación en PIZARRA
Constantes • Datos cuyo valor no cambia a lo largo de la ejecución del programa • Tipos de constantes en Pascal • Literales: se usan “a pelo” en el programa, sin identificador ‘Longitud’ 2.54 ‘a’ true • Constantes con nombre: llevan un identificadorpi = 3.1416 • La sentencia const de Pascal anuncia que se van a declarar e inicializar las constantes con nombre del programa program conversion; const centPorPulg = 2.54; ...
Sintaxis de la sección de declaración de constantes en Pascal SeccionConstantes ::= [ “const” DefCte “;” { DefCte “;” }] DefCte ::= Identificador “=” Valor Identificador ::= No terminal que ya hemos descrito antes… Valor ::= Ventero | Vreal | Vcaracter | Vbooleano | Cadena | [Signo] Identificador Ventero ::= [Signo] Digito {Digito} Signo ::= “+” | “-” Vreal ::= Fnormal | Fcientifico Fnormal ::= [Signo] Pentera “.” Pdecimal Pentera ::= Digito {Digito} Pdecimal ::= {Digito} Fcientifico ::= Fnormal “E” Signo Pentera Vbooleano ::= “true” | “false” Vcaracter ::= “ ’ ” Car “ ’ ” Car ::= “a” | “b”| ... | “z” | “A” | “B”| ... | “Z” | “ ” | “?” | ... Cadena ::= “ ’ ” {Car} “ ’ ”
Constantes • ¿Este es un ejemplo válido de declaración de constantes? const pi = 3.1416; centPorPulg = 2.54; iva = 0.16; dolar = ‘$’; cinco = 5; max = 100; min = -max; mensaje = ‘Error’; • El tipo de una constante se decide de manera automática al inicializarse, según el tipo del dato que reciba • Por ejemplo cinco será de tipo entero e iva será de tipo real Explicación en PIZARRA
Variables • Datos cuyo valor cambia o puede cambiar a lo largo de la ejecución del programa • La sentencia var de Pascal anuncia que se van a declarar las variables del programa program conversion; const centPorPulg = 2.54; var pulgadas, cent: real; …
Lo explicaremos en el Tema 5 Sintaxis de la sección de declaración de variables en Pascal SeccionVariables ::= [ “var” DefVar “;” {DefVar “;”}] DefVar ::= Identificador { “,” Identificador} “:” Tipo Identificador ::= No terminal que ya hemos descrito antes… Tipo ::= “integer” | “real” | “char” | “boolean” | DefinidoPorUsuario var pulgadas, cent: real; letra: char; valido: boolean; base: integer; altura: integer;
Situación de constantes y variables en memoria program conversion; const centPorPulg = 2.54; var pulgadas, cent: real; begin ... end. Explicación en PIZARRA
Representación interna de los datos en memoria • La cadena 01110010 puede ser... • ... un número entero (¿el primer bit representa el signo?) • ... un número real (¿dónde estaría la coma y la parte decimal?) • ... un carácter textual (¿en que tipo de codificación?) • ... un valor booleano (¿sólo es significativo el último bit?) • ¡Para programar hay que saber qué significan esos 0’s y 1’s! • Asignar un tipo a un dato es una manera de indicar: • Cuál es la interpretación correcta de las cadenas de 0’s y 1’s • Qué rango de posibles valores puede tomar el dato • Cuáles son las operaciones posibles sobre dicho dato • Los lenguajes de alto nivel, como Pascal, tienen una fuerte comprobación de tipos para evitar que el programador use los datos de manera incorrecta, sin tener en cuenta sus tipos • Ej: No te deja multiplicar un número entero por un carácter textual
Tipo de Datos • Conjunto de valores posibles que pueden tomar unos datos junto con las operaciones que se pueden realizar sobre ellos • Tipos básicos (o predefinidos) en Pascal • Integer • Real • Char • Boolean Integer y Real son tipos numéricos Todos son tipos simples
Tipos de datos en Pascal • Integer (números enteros): • El rango de valores representable depende del entorno de desarrollo y la máquina que usemos • Ej: En Turbo Pascal, se reservan 2 bytes para almacenar cada entero en complemento a 2, con lo que el rango va: desde -215 = -32768 hasta (215-1) = 32767 • Otros tipos enteros en Turbo Pascal: • ShortInt -128..127 • LongInt (4 bytes) –2147483648..2147483647 • Byte 0..255 • Word 0..65535 • De momento utilizaremos solo el tipo Integer
Tipos de datos en Pascal • Real (números reales): • Rango de valores representable: usando 6 Bytes para almacenar los datos de tipo real, el rango va desde 2.9 x 10-38 hasta 1.7 x 1038. También tiene otra serie de tipos adicionales relacionados • Char (Caracteres): • Cualquier carácter de los 256 que forman la tabla ASCII • Boolean (Valores booleanos o lógicos): • Sólo pueden ser :Verdadero (TRUE) o Falso (FALSE)
El tipo Integer de Pascal • Tipo ordinal(sus elementos pueden organizarse de menor a mayor y hay una manera obvia de pasar al siguiente) • Sintaxis de los números enteros en EBNF: V-entera ::= [“+” | “-”] Digito {Digito} Digito ::= “0” | “1” | ... | “9” • Constantes predefinidas en Pascal • maxint: Valor máximo para números enteros • minint: Valor mínimo para números enteros • Ej: En Turbo Pascal son 32767 y -32768, respectivamente
Operadores para datos enteros AridadPosiciónOperandosResultadoOperación(num. Operandos) - 1 prefijo entero entero cambio de signo(operador por delante) + 2 infijo entero entero suma(operador entre medias) - 2 infijo enteros entero resta *2 infijo enteros entero multiplicación div 2 infijo enteros entero cociente de la división entera mod 2 infijo enteros entero resto de la división entera
Expresiones aritméticas enteras • Ejemplos var x: integer; ... 4 + 5 -17 * x 5 + 2 * 7 5 - 6 - 7 • ¿Cómo interpretar una expresión como 5 + 2 * 7? ¿Y 5 - 6 - 7? • La resolución de ambigüedades producidas por el uso de operadores infijos se lleva a cabo asociando a cada operador • Una prioridad o precedencia • Una asociatividad • Los paréntesis sirve normalmente para “llevar la contraria” a dichas prioridades y asociatividades, ya que las expresiones entre paréntesis siempre se evalúan primero
Evaluación de expresiones • Prioridad • Un operador tiene prioridad sobre otro operador si, ante dos interpretaciones posibles de una expresión, se elige siempre aquélla que supone aplicar primero • Prioridad de los operadores aritméticos en Pascal -(cambio de signo) * div mod + - (resta) • ¿Cómo se interpreta 5 + 2 * 7? • ¿Qué podemos usar si se desea otra interpretación? Orden de aplicación Explicación en PIZARRA
Evaluación de expresiones • Asociatividad • La expresión 5 - 6 - 7 sigue siendo ambigua porque estamos usando el mismo operador • Las reglas de asociatividad solucionan estas ambigüedades • Si un operador cualquiera (llamémosle ) asocia a izquierdas, entonces a b c se interpreta como (a b) c • Si un operador cualquiera (llamémosle ) asocia a derechas, entonces a b c se interpreta como a (b c) • En Pascal todos los operadores aritméticos infijos binarios asocian a izquierdas • ¿Cómo se interpreta 5 - 6 - 7? • ¿Qué podemos usar si se desea otra interpretación? Explicación en PIZARRA
Evaluación de expresiones • Reglas para evaluar expresiones (en este orden): • Las subexpresiones entre paréntesis se evalúan primero. Si hay subexpresiones parentizadas anidadas (paréntesis dentro de paréntesis, etc.) se evalúan de dentro hacia fuera • Dentro de una expresión, los operadores se evalúan según su prioridad • Los operadores con igual prioridad que estén en una misma subexpresión se evalúan según la asociatividad de Pascal (siempre de izquierda a derecha) • Ejemplos (4 + 6) * 3 div 5 vs4 + 6 * 3 div 5 (4 + 6) * (10 - 5) mod 2vs4 + 6 * (10 - 5) mod 2 10 mod ((4 + 2) - (3 * 2))vs10 mod (4 + 2) - (3 * 2) Explicación en PIZARRA
Funciones sobre datos enteros • Funciones aritméticas predefinidas en Pascal • abs (x) Valor absoluto. Resultado entero • cos (x) Coseno de x (en radianes). Resultado real • sin (x) Seno de x (en radianes). Resultado real • exp (x) ex. Resultado real • ln (x) Logaritmo neperiano de x. Resultado real • sqr (x) x2. Resultado entero • sqrt (x) x. Resultado real donde x es constante, variable o expresión entera • Ejemplos var num: integer; ... sqrt (4 * num) exp (num * 4 + 3) cos (5 * abs (-2)) ln (num * (4 + 3))
Otras operaciones con enteros • Operadores relacionales (binarios) • > < >= <= = <> • Los operandos son constantes, variables o expresiones enteras • El resultado es un valor booleano (verdadero o falso) • Función Impar • odd (x) donde x es constante, variable o expresión entera; el resultado es un valor booleano (verdadero si x es impar) • Predecesor y sucesor • pred (x) • succ (x) donde x es constante, variable o expresión entera; el resultado es el número entero anterior y el siguiente, respectivamente
El tipo Real de Pascal • Tipo ordenado (sus elementos pueden organizarse de menor a mayor) • Sintaxis de los números reales en EBNF: Vreal ::= Fnormal | Fcientifico Fnormal ::= [Signo] Pentera “.” Pdecimal Pentera ::= Digito {Digito} Pdecimal ::= {Digito} Fcientifico ::= Fnormal “E” Signo Pentera Digito ::= “0” | “1” | ... | “9” Signo ::= “+” | “-”
Operadores para datos reales AridadPosiciónOperandosResultadoOperación - 1 prefijo real real cambio de signo + 2 infijo reales real suma - 2 infijo reales real resta *2 infijo reales real multiplicación / 2 infijo reales real cociente de la división real
Funciones sobre datos reales • Funciones aritméticas predefinidas • abs (x) Valor absoluto. Resultado real • cos (x) Coseno de x (en radianes). Resultado real • sin (x) Seno de x (en radianes). Resultado real • exp (x) ex. Resultado real • ln (x) Logaritmo neperiano de x. Resultado real • sqr (x) x2. Resultado real • sqrt (x) x. Resultado real donde x es constante, variable o expresión real
Otras operaciones con datos reales • Operadores relacionales (binarios) • > < >= <= = <> • Los operandos son constantes, variables o expresiones reales • El resultado es un valor booleano • Conversión explícita de tipo (de real a entero) • round (x) redondea al número entero más próximo • trunc (x) directamente elimina la parte decimal donde x es constante, variable o expresión real • Ejemplos: round (8.8) round (-8.7) trunc (8 + 0.8) trunc (-2.4) round (9 - 0.5) Explicación en PIZARRA Por defecto en Pascal se redondea “al alza”
El tipo Char de Pascal • Tipo ordinal • El juego de caracteres varía de un estándar a otro • Dos estándares de uso común son ASCII y EBCDIC • Los juegos de caracteres incluyen dos clases de caracteres • Visibles: pueden editarse e imprimirsePor ejemplo: los dígitos, las letras, los símbolos de puntuación… • Invisibles (también llamados caracteres de control)Por ejemplo: el salto de línea, el fin de línea, el tabulador…
El tipo Char de Pascal • Internamente cada carácter del juego de caracteres está representado por un código numérico • ord (x) --> Obtención del código numérico asociado al carácter x • chr (x) --> Convierte el código numérico x en el carácter correspondiente según el juego de caracters Por ejemplo, en el juego de caracteres ASCII, el código numérico del carácter ‘A’ es 65. Es decir, el 65 es el código ASCII del carácter ‘A’
El tipo Char de Pascal • Predecesor y sucesor • pred (x) • succ (x) donde x es una constante o una variable de tipo carácter • Operadores relacionales (binarios) • > < >= <= = <> • Los operandos son constantes o variables de tipo carácter • El resultado es un valor booleano • ¡Ojo! Lo que realmente se compara son los códigos numéricos de los caracteres comparados (gracias a esto es Char es un tipo ordenado)
El tipo Boolean de Pascal • Tipo ordinal • Dos únicos valores: true y false • ord (false) es 0; ord(true) es 1 • Expresiones booleanas simples • Operador relacional cuyos operandos son dos constantes, variables o expresiones del mismo tipo (o compatibles a nivel de comparación, es decir, que se pueden comparar) x <= 0 x + y >= y - z cos (r) * 5 <> valor * x
El tipo Boolean de Pascal • Expresiones booleanas compuestas • Operadores lógicos binarios: and (y-lógica) y or (o-lógica) • Operador lógico unario: not (negación lógica) • Prioridad de los operadores en Pascal (añadiendo los operadores lógicos y relacionales) - (unario) not * div mod / and + - (binario) or < <= > >= = <> Orden de aplicación
El tipo Boolean de Pascal • Ejemplo Escribe expresiones booleanas para representar las siguientes condiciones • Alguno de estos tres valores enteros i, j o k es par • Un valor entero j está en el intervalo [0, 100] Explicación en PIZARRA
El tipo Boolean de Pascal • Ejemplo: Supón tres variables enteras A, B y C que tienen los valores 10, 15 y 20, respectivamente. Evalúa, si es posible, las siguientes expresiones booleanas A > 5 A + B = C (C= 20) or (A > 5) and (B > C) (C= 20) and (A > 5) or (B > C) not (A > 5) or ((C = 20) or (A > 5)) and (B > C) Explicación en PIZARRA
La asignación • Instrucción básica de la programación imperativa para cambiar el estado en un programa • Sirve para cambiar el valor de una variable • El valor asignado debe ser compatible con el tipo de la variable • No se debe acceder a una variable antes de que se le haya asignado un valor ¡Prohibido usar variables con “basura”! • Sintaxis en diagrama sintáctico: Constante Asignación := Variable Variable Expresión
Ejemplos de asignaciones • Ejemplo var x: integer; begin ... x:= 1; x:= x + 3; ... end. • Explicación de lo que ocurre en memoria… Explicación en PIZARRA
Ejemplos de asignaciones • Si x=5, y=10, z=20 ¿Cuál es valor de x después de recibir las siguientes asignaciones? x := y; x := 5*y; x := 5; x := x*x; x := x div x; x := succ(y) + succ(z) - z; Explicación en PIZARRA
Ejemplos de asignaciones • Dadas las siguientes declaraciones const blanco = ‘’; var p, q: integer; x, y: real; a, b: boolean; c1: char; indica si las siguientes sentencias son válidas p:= trunc (y) + x; a:= p + q; a:= b and (ord (c1) <> ‘A’); x:= x – trunc (x); x:= y div p; a:= odd (p-1); p:= round (q / (10 div p)); p:= 100 div (4 div 5); z:= succ (c1); Explicación en PIZARRA
Salida por consola • La sentencia write de Pascal • Visualización/Impresión de información en la pantalla de la consola/ventana del usuario, durante la ejecución del programa • write (lista-de-salidas) Elementos a visualizar separados por comas (Se visualizan todos en la misma línea en pantalla) • Ejemplo: var cent: real; begin ... write(‘En cms:’, cent) end.
Salida por consola • La sentencia writeln de Pascal • Visualización/Impresión de información en la pantalla de la consola/ventana del usuario, durante la ejecución del programa • writeln (lista-de-salidas) ó writeln Elementos a visualizar separados por comas (Se visualizan todos en la misma línea en pantalla y luego se salta de línea; o sólo se salta de línea, con writeln a secas) • Ejemplo: var cent: real; begin writeln(‘¿Longitud?’); ... writeln(‘En cms:’, cent) end.
Salida por consola • Enteros y caracteres • Por defecto, se usan tantas posiciones como dígitos tenga el número o una sóla posición si es un carácter Elemento : numeroPosiciones(Significa que se usan tantas posiciones como indica numeroPosiciones) • Ejemplo: var x, y: integer; writeln (‘Resultado:’ , x * y: 5); Explicación en PIZARRA
Salida por consola • Reales Elemento : longitudTotal : numeroDecimales (Significa que se usa la notación habitual con longitudTotal indicando las posiciones que se usan -incluyendo punto decimal y signo si lo hay- de las cuales numeroDecimales se reservan para los decimales -redondeando si es necesario-) Elemento : longitudTotal (Significa que se usa la notación científica con longitudTotal indicando las posiciones totales que se usan) • Notación científica por defecto: e.ddddddddddExx ó -e.ddddddddddExx
Entrada por consola • La entrada por consola funciona de una manera peculiar: • Hay un almacén de caracteres para ir guardando todos los caracteres (visibles o invisibles) que escriba el usuario • Ej. Al pulsar la tecla F introducimos el carácter ‘F’ pero si luego pulsamos la tecla Enter introducimos además dos caracteres invisibles: un salto de línea y un fin de línea • A continuación veremos sentencias que “leen” caracteres de ese almacén y, generalmente, borran todos los que han leído • Ej: read, readln y eoln • Si una de estas instrucciones se encuentra el almacén vacío, la ejecución del programa se detendrá y aparecerá un cursoren la ventana/consola del usuario que permite escribir más