Title: Pascal, un lenguaje de programaci
1(No Transcript)
2Pascal, 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)
3Forma 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 sen
tenciaK end.
Datos deentrada
Sección de declaración de datos
Algoritmo
Datos desalida
Sección de código(programa principal)
4Forma 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
5Forma básica de un programa 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.
6Uso 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ínea y
tabuladores - 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!
7Uso 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,centreal 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?
8Datos 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
9Identificadores 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 _
10Identificadores 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
11Identificadores en Pascal
- Los siguientes son identificadores válidos en
Pascal? - pulgadas cent valido
- 2veces salu2 duda?
- x x_ x_a
Explicación en PIZARRA
12Constantes
- 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
- ...
13Sintaxis 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
14Constantes
- 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
15Variables
- 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
-
16Sintaxis 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
17Situación de constantes y variables en memoria
- program conversion
- const
- centPorPulg 2.54
- var
- pulgadas, cent real
- begin
- ...
- end.
Explicación en PIZARRA
18Representació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
0s y 1s! - Asignar un tipo a un dato es una manera de
indicar - Cuál es la interpretación correcta de las cadenas
de 0s y 1s - 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
19Ejemplo La codificación ASCII para caracteres
textuales
20Tipo 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
21Tipos 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
22Tipos 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)
23El 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 -
24Operadores para datos enteros
- Aridad Posición Operandos
Resultado Operació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
25Expresiones 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
26Evaluació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
27Evaluació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
28Evaluació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 vs 4 6 3 div 5
- (4 6) (10 - 5) mod 2 vs 4 6 (10 -
5) mod 2 - 10 mod ((4 2) - (3 2)) vs 10 mod (4
2) - (3 2)
Explicación en PIZARRA
29Funciones 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))
30Otras operaciones con enteros
- Operadores relacionales (binarios)
- gt lt gt lt ltgt
- 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
31El 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 -
32Operadores para datos reales
- Aridad Posición Operandos
Resultado Operació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
33Funciones 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
34Otras operaciones con datos reales
- Operadores relacionales (binarios)
- gt lt gt lt ltgt
- 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
35El 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
36El tipo Char de Pascal
- Internamente cada carácter del juego de
caracteres está representado por un código
numérico - ord (x) --gt Obtención del código numérico
asociado al carácter x - chr (x) --gt 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
37El 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)
- gt lt gt lt ltgt
- 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)
38El 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 lt 0 x y gt y - z cos (r) 5 ltgt valor
x
39El 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
- lt lt gt gt ltgt
Orden de aplicación
40El 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
41El 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 gt 5
- A B C
- (C 20) or (A gt 5) and (B gt C)
- (C 20) and (A gt 5) or (B gt C)
- not (A gt 5) or ((C 20) or (A gt 5)) and (B gt C)
Explicación en PIZARRA
42La 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
43Ejemplos 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
44Ejemplos de asignaciones
- Si x5, y10, z20 Cuál es valor de x después de
recibir las siguientes asignaciones? - x y
- x 5y
- x 5
- x xx
- x x div x
- x succ(y) succ(z) - z
Explicación en PIZARRA
45Ejemplos 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) ltgt 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
46Salida 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.
47Salida 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.
48Salida 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
49Salida 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.ddddddddddE?xx ó -e.ddddddddddE?xx
50Entrada 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 cursor en la
ventana/consola del usuario que permite escribir
más
51Entrada por consola
- La sentencia read de Pascal
- Lectura de información desde el almacén de
caracteres - read (lista-de-variables)
-
- variables destino separadas por comas
- Lee los caracteres necesarios para formar cada
dato(un sólo carácter si debe leer un dato de
tipo char, varios si debe leer un dato de tipo
integer formado con varios dígitos)y borra sólo
esos caracteres leídos - Ejemplo
- var letra char
- begin
- writeln(Letra favorita?)
- read(letra)
- ...
- end.
2.50
52Entrada por consola
- La sentencia readln de Pascal
- Lectura de información desde el almacén de
caracteres - readln (lista-de-variables) o readln
- variables destino separadas por comas
- Lee los caracteres necesarios para formar cada
dato(un sólo carácter si debe leer un dato de
tipo char, varios si debe leer un dato de tipo
integer formado con varios dígitos)y borra
todos los del almacén (fin de línea incluido) - Ejemplo
- var pulgadas real
- begin
- writeln(Longitud?)
- readln(pulgadas)
- ...
- end.
2.51
53Entrada por consola
- La sentencia eoln de Pascal
- Comprobación de fin de línea inminente en el
almacén de caracteres - eoln
- Si el primer carácter del almacén (el siguiente a
leer) es un fin de línea devuelve cierto,
devolviendo falso en caso contrario pero no
borra ningún carácter del almacén! - Ejemplo
- var final boolean
- begin
- final eoln
- writeln(final)
- ...
- end.
2.52
54Críticas, dudas, sugerencias
Federico Peinadowww.federicopeinado.es