Tema 3 - OCW
Tema 3 - OCW
Tema 3 - OCW
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
Metodología y Tecnología de la<br />
Programación<br />
<strong>Tema</strong>rio<br />
Curso 2008/09<br />
<strong>Tema</strong> 3. Elementos Básicos de la<br />
Programación Imperativa<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
2<br />
1
Introducción<br />
• PROGRAMACIÓN IMPERATIVA<br />
• Programa: lista de instrucciones<br />
u órdenes elementales que han<br />
de ejecutarse una tras otra en el<br />
mismo orden <br />
• Modelo de máquina de von Neumann:<br />
– Procesador (elemento de control)<br />
– Memoria (almacenamiento: instrucciones y datos)<br />
<strong>Tema</strong>rio<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3<br />
4<br />
2
<strong>Tema</strong>rio<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
Pascal<br />
Modula-2<br />
Java<br />
Lenguaje de Especificación de<br />
Algoritmos en Pseudocódigo<br />
Basic<br />
EAP<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables,<br />
Expresiones<br />
3.1.1 Identificadores<br />
Un identificador es un nombre que se le da a un objeto en una especificación. El nombre<br />
puede ser simbólico (símbolos especiales predefinidos en el lenguaje, por ejemplo +) o<br />
alfanumérico (formado por letras y dígitos) y éste a su vez puede ser predefinido por el<br />
lenguaje (por ejemplo DIV), o definido por el usuario, debiendo comenzar siempre por una<br />
letra.<br />
Ejemplo 3.1 Identificadores válidos y no válidos<br />
Identificadores válidos: nombre, DIV, año2002, AsignaturasMatriculadas<br />
Identificadores no válidos: 4curso, ?comprobado, 2002, Dia del Mes<br />
Podemos definir un identificador como la terna I = < N, T, V >, donde N es el nombre del<br />
identificador, T su tipo de dato, y V el valor que tiene.<br />
Ejemplo 3.2 Identificador expresado por medio de su terna<br />
I = < X, Entero, 7 > es el identificador X, de tipo Entero, con el valor 7<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
C<br />
5<br />
6<br />
3
3.1 Identificadores, Constantes, Variables,<br />
Expresiones<br />
3.1.2 Constantes<br />
Una constante es un caso especial de identificador cuyo valor no varía, es decir, es un<br />
literal. La sintaxis de declaración de constante es:<br />
Constantes<br />
∈ ← <br />
Ejemplo 3.3 Declaración y asignación del valor 2002 a la constante del año actual<br />
Constantes<br />
añoActual ∈ Entero ← 2002<br />
Podemos adelantar que una constante pertenecerá a un cierto de tipo de dato concreto, en<br />
particular, a aquel que lo represente de manera total usando la menor especificación posible<br />
de tipo de dato por parte del lenguaje de programación empleado a no ser que se establezca<br />
otro de manera explícita.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables,<br />
Expresiones<br />
3.1.3 Variables (I)<br />
El concepto de variable está directamente asociado a la memoria del computador. Una<br />
variable es un caso especial de identificador cuyo valor puede variar.<br />
Es decir, representará un valor almacenado en memoria que se puede modificar en cualquier<br />
momento (y que será el nuevo valor que estará almacenado en ella a partir de ese momento)<br />
o conservar para ser usado tantas veces como se desee. La sintaxis de declaración de variable<br />
es:<br />
Variables<br />
∈ <br />
El tipo de dato asociado a una variable limita el conjunto de datos que puede almacenar así<br />
como las operaciones aplicables sobre esa variable. Así, una variable que pertenece a un tipo<br />
de dato ENTERO no podrá almacenar datos de tipo REAL ni le sería aplicable una operación<br />
conducente a calcular cuál es su parte decimal.<br />
Todas las variables han de ser declaradas en el programa antes de ser utilizadas. Varias<br />
variables de un mismo tipo pueden ser declaradas en la misma instrucción de declaración.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
7<br />
8<br />
4
3.1 Identificadores, Constantes, Variables,<br />
Expresiones<br />
3.1.3 Variables (II)<br />
Ejemplo 3.4 Declaración de variables y sus tipos de datos asociados<br />
Variables<br />
edad ∈ ENTERO<br />
altura, anchura, profundidad ∈ REAL<br />
Asimismo, toda variable ha de ser inicializada antes de poder hacer uso de ella, lo que<br />
significa darle un cierto valor por primera vez. Esto es necesario, por ejemplo, cuando una<br />
variable aparece como operando en la parte derecha de una expresión de asignación.<br />
Ejemplo 3.5 Declaración e Inicialización de variables (con errores)<br />
Constantes<br />
Pi ∈ REAL ← 3.14<br />
Variables<br />
radio ∈ NATURAL<br />
Acciones<br />
area ← Pi * radio 2<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables,<br />
Expresiones<br />
3.1.4 Expresiones (I)<br />
Una expresión es cualquier combinación válida de operandos y operadores permitidos en el<br />
lenguaje. La situación típica de aparición de expresiones será en la sentencia de asignación.<br />
Su sintaxis es:<br />
Acciones<br />
← <br />
Ejemplo 3.6 Sentencia de asignación de una expresión a una variable<br />
Acciones<br />
Resultado ← 34 * 6 + 13 / 7<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
9<br />
10<br />
5
3.1 Identificadores, Constantes, Variables,<br />
Expresiones<br />
3.1.4 Expresiones (II)<br />
Un caso especial de asignación será aquel en el que aparece la misma variable tanto en la<br />
parte izquierda como en la parte derecha de una sentencia de asignación. La sentencia no ha<br />
de ser tomada como una ecuación matemática al uso, sino que, la parte derecha, donde la<br />
variable (NumDias) aparece como operando, ha de ser evaluada en primer lugar y, una vez<br />
hallado su valor, éste se asignará a la posición de memoria que representa la variable que<br />
aparece también en la parte izquierda de la misma:<br />
NumDias ← NumDias + 31<br />
Es importante que a la hora de evaluar expresiones nos fijemos en la compatibilidad de los<br />
tipos de datos que aparecen en la misma. Esta compatibilidad nos dice, de manera general,<br />
que sólo pueden ser operadas entre sí variables pertenecientes a un mismo tipo de dato. Así<br />
la expresión siguiente (recordar ejemplo 3.5) sufre incompatibilidad de tipos :<br />
area ← Pi * radio 2<br />
<strong>Tema</strong>rio<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
11<br />
12<br />
6
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
Introducción (I)<br />
Los algoritmos que vamos a ver a lo largo del curso manipulan valores que pertenecen a un<br />
conjunto o clase de valores identificados mediante lo que se llama un tipo de dato. Por tanto,<br />
un tipo de dato es la explicitación de un conjunto de valores, denominado dominio, sobre el<br />
cual se pueden realizar un conjunto de operaciones.<br />
Ejemplo 3.7 Tipo de Dato<br />
El tipo de dato edad podría estar representado por los valores pertenecientes a un<br />
subconjunto de los valores de tipo natural. Las operaciones aplicables sobre edad podrían ser<br />
las de MOSTRAR, INCREMENTAR e INTERVALO (entre dos edades), etc.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
Introducción (II)<br />
Para poder tratar con un tipo de dato es necesario explicitar su dominio y sus operaciones<br />
aplicables. En el caso de que el dominio sea pequeño podemos definirlo por extensión<br />
(enumeración), en caso contrario lo definiremos por comprensión (las propiedades del<br />
conjunto de valores del dominio).<br />
Ejemplo 3.8 Tipo de Dato Paleta de Colores<br />
El dominio del tipo de dato PaletaColores puede estar definido por el conjunto {blanco,<br />
amarillo, naranja, rojo, violeta, azul, verde, negro}, que sería por extensión.<br />
Ejemplo 3.9 Tipo de Dato Secuencia de Caracteres<br />
El dominio del tipo de dato SecuenciaCaracteres puede estar definido de manera recursiva<br />
como:<br />
::= ⏐ <br />
::= a ⏐ b ⏐ ... ⏐ z ⏐ A ⏐ B... ⏐ Z<br />
que sería por comprensión.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
13<br />
14<br />
7
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
Introducción (III)<br />
En cualquier lenguaje de programación, así como en un lenguaje de especificación de<br />
algoritmos como es EAP, se parte de un conjunto de tipos de datos predefinidos, a partir de<br />
los cuales, se pueden crear nuevos tipos de datos. Los tipos de datos predefinidos en el<br />
lenguaje EAP son:<br />
Natural<br />
Entero<br />
Real<br />
Carácter<br />
Booleano<br />
Todos ellos son de tipo escalar; un tipo de dato escalar es aquel cuyo dominio presenta una<br />
propiedad de orden, un mínimo y un máximo.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
3.2.1 Tipos Natural y Entero (I)<br />
El tipo Entero representa el conjunto de los números enteros, incluyendo los límites de<br />
infinito negativo y positivo: -∞, ..., -1, 0, 1, ..., ∞. El tipo Natural representa el conjunto de<br />
los enteros positivos: 0, 1, ..., ∞.<br />
Las operaciones aplicables sobre Entero y Natural son las principales del cálculo aritmético y<br />
relacional de los números enteros y las podemos clasificar en:<br />
• Operaciones Unarias. Las operaciones unarias de los enteros son la explicitación de<br />
signo, sólo aplicable a Entero, el sucesor de un entero (Suc) y su predecesor (Pred). Su<br />
sintaxis es:<br />
::= <br />
::= ⏐ Suc ⏐ Pred<br />
::= - ⏐ +<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
15<br />
16<br />
8
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
3.2.1 Tipos Natural y Entero (II)<br />
• Operaciones Binarias. Las operaciones binarias aplicables a los enteros<br />
están agrupadas en aritméticas y relacionales. Las aritméticas son la<br />
adición (+), substracción (-), multiplicación (*), cociente de la división<br />
(div) y resto de la división (mod); las relacionales son la igualdad (=),<br />
desigualdad ( ó ≠), mayor que (>), menor que (= ó ≥) y menor o igual que ( ⏐ < ⏐ >= ⏐
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
3.2.2 Tipo Real (II)<br />
• Operaciones Binarias. Las operaciones binarias aplicables a los reales están<br />
agrupadas en aritméticas y relacionales. Las aritméticas son la adición (+),<br />
substracción (-), multiplicación (*) y división (/); las relacionales son la<br />
igualdad (=), desigualdad (), mayor que (>), menor que (=) y menor o igual que ( ⏐ < ⏐ >= ⏐
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
3.2.3 Tipo Carácter (II)<br />
.<br />
Las operaciones aplicables sobre Carácter son:<br />
• Operaciones Unarias. Son operaciones de transferencia (conversión). Su<br />
sintaxis es:<br />
Ord(car). Devuelve el código numérico asignado al carácter.<br />
Chr(num). Devuelve el carácter asociado el código numérico.<br />
• Operaciones Binarias. Las operaciones binarias aplicables a los Carácter son<br />
las operaciones relacionales aplicables a los enteros, previamente obtenidos<br />
los códigos numéricos de los operandos.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
3.2.4 Tipo Booleano (I)<br />
El tipo Booleano o Lógico corresponde a los valores del álgebra de Boole, es decir, una<br />
estructura algebraica del tipo que cumple las leyes conmutativa, de identidad e inversa. En la<br />
Tabla 3.1 se muestran dichas leyes. A partir de las leyes principales se derivan otras como<br />
son la asociativa en la intersección y disyunción, la de absorción, dominación, de doble<br />
complementario y la de De Morgan.<br />
Conmutativas x ∨ y = y ∨ x<br />
x ∧ y = y ∧ x<br />
Distributivas x ∧ ( y ∨ z)<br />
= ( x ∧ y)<br />
∨ ( x ∧ z)<br />
x ∨ ( y ∧ z)<br />
= ( x ∨ y)<br />
∧ ( x ∨ z)<br />
de Identidad x ∨ 0 = x<br />
x ∧1 = x<br />
Inversas x ∨ ¬ x = 1<br />
x<br />
∧ ¬ x = 0<br />
Tabla 3.1: Propiedades del álgebra de Boole.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
21<br />
22<br />
11
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
3.2.4 Tipo Booleano (II)<br />
El dominio del tipo Booleano es el conjunto ordenado de las constantes lógicas Verdadero y<br />
Falso, siendo Min(Lógico)=Falso y Max(Lógico)=Verdadero. Las operaciones aplicables<br />
sobre Booleano son las mismas del cálculo del álgebra de Boole:<br />
• Operaciones Unarias. La negación es la única operación unaria aplicable a Booleano.<br />
Su sintaxis es:<br />
::= <br />
::= ¬<br />
• Operaciones Binarias. Las operaciones binarias aplicables a los Booleano son la<br />
conjunción (∧) y la disyunción (∨).<br />
::= ⏐<br />
<br />
::= ∧⏐ ∨<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.2 Tipos de Datos Simples: Natural, Entero,<br />
Real, Carácter, Booleano<br />
Ejercicio: Tipos de Datos Simples<br />
Elegir los tipos de datos adecuados para identificar un producto comercial para el<br />
cual hay que indicar las siguientes características<br />
• Año de fabricación<br />
• Precio en pesetas<br />
• Precio en euros<br />
• Indicación de si el producto está agotado<br />
• Departamento al que pertenece (C: Congelados; T: Textil; F: Ferretería)<br />
A continuación dar valores iniciales a cada una de dichas características. Para<br />
conocer el precio en euros habrá que calcularlo necesariamente a partir de su<br />
precio en pesetas usando el tipo de cambio oficial.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
23<br />
24<br />
12
<strong>Tema</strong>rio<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
Cadena, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango,<br />
Registro, Vector, Cadena, Matriz, Secuencia, Fichero<br />
Introducción (I)<br />
Partiendo de los tipos de datos simple y una serie de estructuras se pueden crear nuevos tipos<br />
de datos, algunos de tipo escalar y otros estructurados. Los tipos de datos estructurados son<br />
aquellos que se definen mediante composición de tipos de datos simples.<br />
Para poder llegar a definir tipos de datos estructurados se puede utilizar una definición de<br />
tipo, que es un identificador que representa un nuevo tipo de dato que posteriormente puede<br />
particularizarse. Su sintaxis es la siguiente:<br />
Tipos<br />
= <br />
El nombre de tipo es un identificador o un identificador seguido de varias variables de tipo<br />
(separadas por comas, encerradas en paréntesis).<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
25<br />
26<br />
13
3.3 Tipos de Datos Estructurados: Enumerado, Subrango,<br />
Registro, Vector, Cadena, Matriz, Secuencia, Fichero<br />
Introducción (II)<br />
La definición de tipo más sencilla que podemos encontrar sería la propia redefinición de un tipo<br />
de dato simple, también conocido como tipo Sinónimo, ya que sencillamente trata de dar un<br />
nombre distinto a uno ya existente. El nuevo tipo tendrá el mismo conjunto de valores y de<br />
operaciones aplicables que el tipo original. Su sintaxis es:<br />
Tipos<br />
= <br />
Ejemplo 3.11 Declaración de un tipo Sinónimo<br />
Tipos<br />
Edad = Entero<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango,<br />
Registro, Vector, Cadena, Matriz, Secuencia, Fichero<br />
Introducción (III)<br />
3.3.1 Tipo Enumerado<br />
3.3.2 Tipo Subrango<br />
3.3.3 Tipo Registro<br />
3.3.4 Tipo Vector<br />
3.3.5 Tipo Cadena<br />
3.3.6 Tipo Matriz<br />
3.3.7 Tipo Secuencia<br />
3.3.8 Tipo Fichero<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
27<br />
28<br />
14
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.1 Tipo Enumerado<br />
El tipo de dato Enumerado es una colección de elementos del mismo tipo en el cual sus<br />
elementos son constantes, y una variable de este tipo sólo puede tomar en un momento dado<br />
un valor de entre ellos. Su sintaxis es:<br />
Tipos<br />
= ⏐ ... ⏐ <br />
El tipo de dato Enumerado dispone de orden relativo de sus elementos, pudiéndose utilizar<br />
sobre ellos las operaciones Suc, Pred y Ord (que obtienen el elemento siguiente, anterior y<br />
la posición del elemento en la secuencia, respectivamente).<br />
Ejemplo 3.12 Declaración del tipo Día de la Semana<br />
Tipos<br />
DiaSemana = Lunes ⏐ Martes ⏐ Miércoles ⏐ Jueves ⏐ Viernes ⏐ Sábado ⏐ Domingo<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.2 Tipo Subrango<br />
El tipo de dato Subrango es un caso especial del tipo Sinónimo, pero que limita la<br />
declaración a un subconjunto de valores del tipo original. El tipo de dato Subrango<br />
contiene los valores consecutivos de un tipo Enumerado o Entero comprendidos entre su<br />
valor inferior y el superior, ambos incluidos. Su sintaxis es:<br />
Tipos<br />
= .. <br />
Ejemplo 3.13 Declaración del tipo de dato Dígito<br />
Tipos<br />
Dígito = 0..9<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
29<br />
30<br />
15
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.3 Tipo Registro (I)<br />
El tipo de dato Registro es una colección de un número fijo de componentes que pueden<br />
ser de distinto tipo en los que cada componente, denominado campo, está representado con<br />
un identificador y un tipo base. Su sintaxis es:<br />
Tipos<br />
= [ ∈ ,<br />
...,<br />
∈ ]<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.3 Tipo Registro (II)<br />
Ejemplo 3.14 Declaración del registro Fecha<br />
Tipos<br />
Fecha = [Dia ∈ 1..31,<br />
Mes ∈ 1..12,<br />
Año ∈ 1900..2100]<br />
Para acceder a cada campo del registro se utilizará el identificador del tipo seguido de un<br />
punto y el nombre del campo en cuestión.<br />
Por ejemplo, para acceder a los diferentes campos del registro Fecha se utilizan las<br />
notaciones f.Dia, f.Mes y f.Año, respectivamente, donde f es una variable de tipo Fecha.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
31<br />
32<br />
16
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.4 Tipo Vector<br />
El tipo de dato Vector permite definir un número fijo de elementos, todos ellos del mismo<br />
tipo base, a los cuales se accede mediante un índice (el identificador de su posición en la<br />
secuencia). Su sintaxis es:<br />
Tipos<br />
= Vector [] ∈ <br />
::= ⏐ Entero<br />
Ejemplo 3.15 Declaración de un vector de las facturaciones de los meses del año<br />
Tipos<br />
Facturaciones = Vector [1..12] ∈ Entero<br />
Para acceder a cada elemento del vector se utilizará el identificador del vector seguido del<br />
índice del elemento en cuestión entre corchetes.<br />
Por ejemplo, para acceder al octavo elemento del vector Facturaciones se utiliza la notación<br />
fac[8] donde fac es una variable de tipo Facturaciones.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.5 Tipo Cadena (I)<br />
Un String o Cadena es una clase especial de Vector cuyos elementos que lo componen<br />
son siempre caracteres. El dominio del tipo de dato Cadena está formado por todas las<br />
posibles secuencias de caracteres con longitud igual o menor a la longitud del vector de<br />
caracteres definido. Su sintaxis es:<br />
Tipos<br />
= Vector [] ∈ Caracter<br />
::= ⏐ Entero<br />
Ejemplo 3.16 Declaración de un string Palabra<br />
Tipos<br />
Palabra = Vector [1..20] ∈ Caracter<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
33<br />
34<br />
17
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.5 Tipo Cadena (II)<br />
El tipo String goza de una serie de operaciones particulares entre las que destacan las<br />
siguientes:<br />
• Concatenar(Cadena1,Cadena2). La operación de concatenación, devuelve una cadena<br />
nueva, formada por todos los elementos de la cadena Cadena1 y los de la cadena Cadena2.<br />
• SubCadena(Cadena,PosInicial,PosFinal). La operación SubCadena obtiene la cadena<br />
encerrada entre las posiciones PosInicial y PosFinal. Ejemplo: SubCadena([a b c d e], 0, 2)<br />
obtiene la subcadena [a b c].<br />
• Insertar(Cadena1,Cadena2,PosInicial). La operación de insertar inserta la cadena Cadena2<br />
en la cadena Cadena1 a partir de la posición PosInicial. Ejemplo: Insertar([a b c d e], [f g], 1)<br />
obtiene la cadena [a f g b c d e].<br />
• Longitud(Cadena). La operación longitud obtiene el número de elementos de la secuencia<br />
Cadena. Ejemplo: Longitud([a b c d e]) devuelve 5.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.6 Tipo Matriz<br />
El tipo de datos Matriz es la versión multidimensional del tipo de dato Vector. Su sintaxis<br />
es:<br />
Tipos<br />
= Matriz [, ..., ] ∈ <br />
::= ⏐ Entero<br />
Ejemplo 3.17 Declaración de los estados del juego Tres en Raya<br />
Tipos<br />
EstadoCasilla = Cruz ⏐ Círculo ⏐ Vacío<br />
Tablero = Matriz [1..3, 1..3] ∈ EstadoCasilla<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
35<br />
36<br />
18
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
3.3.7 Tipo Secuencia<br />
Una Secuencia es una lista de elementos donde el orden de los elementos tiene<br />
importancia. El tipo de dato Secuencia es aquel cuyo dominio es el formado por todas las<br />
posibles combinaciones que se pueden formar a partir de los elementos que constituyen la<br />
secuencia.<br />
Ejemplo: Una secuencia se especifica como una lista de elementos encerrados por un<br />
paréntesis. Por ejemplo: (a b c d e). [LISP]<br />
3.3.8 Tipo Fichero<br />
Los Ficheros son estructuras de datos almacenadas en memoria externa que pueden ser<br />
manipulados desde un programa, estableciendo una conexión entre dichos ficheros y las<br />
variables de tipo fichero definidas en el programa.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
Ejercicio: Tipos de Datos Estructurados<br />
Diseñar los Tipos de Datos adecuados para la siguiente aplicación:<br />
Se desea tener un registro de la actividad de una Clínica Veterinaria.<br />
Necesitamos almacenar, para cada mascota que visite la clínica, la<br />
siguiente información: código, nombre, tipo de animal (doméstico, salvaje,<br />
exótico) y número de visitas realizadas a la clínica. Se calcula que dicha<br />
clínica manejará un promedio de unos 100 animales. En ocasiones será<br />
interesante ordenar esta información de acuerdo a alguna característica<br />
propia de las mascotas (código o tipo de animal, por ejemplo).<br />
Realizar además las instrucciones necesarias para:<br />
- Contabilizar una nueva visita de una mascota<br />
- Recuperar el nombre de una cierta mascota<br />
- Recuperar la inicial del nombre de una cierta mascota<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
37<br />
38<br />
19
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro,<br />
Vector, Cadena, Matriz, Secuencia, Fichero<br />
Ejercicios: Tipos de Datos Simples y Estructurados<br />
• Diseñar un Tipo de Dato adecuado para representar los 49 números de la Lotería<br />
Primitiva con la indicación de si están marcados o no.<br />
• Diseñar un Tipo de Dato adecuado para representar una colección de Números<br />
Racionales. A continuación realizar la operación Suma de Racionales.<br />
• Diseñar el Tipo de Dato HoraActual compuesto de los elementos horas, minutos y<br />
segundos. Convertir una variable del tipo HoraActual a segundos y viceversa.<br />
• Diseñar el tablero para competir en red al Juego de los Barcos.<br />
• Diseñar el Tipo de Dato NumeroBinario y convertir una variable de tipo<br />
NumeroBinario a Decimal y viceversa.<br />
<strong>Tema</strong>rio<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
39<br />
40<br />
20
3.4 Estructura Secuencial<br />
Estructuras básicas de la programación imperativa.<br />
La estructura secuencial es la estructura más sencilla para representar las acciones de un<br />
algoritmo. Dichas acciones se describen y se ejecutan de forma sucesiva y en el mismo<br />
orden en el que aparecen.<br />
Su sintaxis es:<br />
Inicio<br />
Fin<br />
<br />
...<br />
<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.4 Estructura Secuencial<br />
Ejemplo 3.18 Estructura secuencial de un programa<br />
Constantes<br />
∅<br />
Tipos<br />
∅<br />
Variables<br />
area, base, altura ∈ Real<br />
Acciones<br />
base ← 2.5<br />
altura ← 5.0<br />
area ← (base * altura) / 2<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
41<br />
42<br />
21
3.5 Estructuras de Control de Flujo<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
La Programación Estructurada es una metodología que fundamentalmente trata<br />
de construir programas que sean fácilmente comprensibles. Un programa no sólo<br />
debe funcionar correctamente sino que además debe estar escrito de manera que<br />
se facilite su comprensión posterior.<br />
La Programación Estructurada sugiere el uso de tres esquemas generales<br />
denominados secuencial (visto en el apartado anterior), iterativo y condicional,<br />
con los cuales se puede llegar a desarrollar de forma comprensible un programa tan<br />
complicado como sea necesario.<br />
SECUENCIAL + ITERATIVO + CONDICIONAL<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.5 Estructuras de Control de Flujo<br />
3.5.1 Estructura de Control Iterativa<br />
Una estructura iterativa (también denominada bucle) engloba una<br />
secuencia de acciones que se describen una sola vez, pero que se pueden<br />
ejecutar varias veces. Las acciones englobadas se llaman CUERPO del<br />
bucle y cada ejecución del cuerpo se denomina ITERACIÓN.<br />
Las estructuras iterativas son:<br />
MIENTRAS REPETIR PARA<br />
while repeat for<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
43<br />
44<br />
22
3.5 Estructuras de Control de Flujo<br />
3.5.1.1 Estructura Iterativa Mientras<br />
Mientras Hacer<br />
<br />
Fin Mientras<br />
3.5.1.3 Estructura Iterativa Para<br />
3.5.1.2 Estructura Iterativa Repetir<br />
Repetir<br />
<br />
Hasta <br />
Para ← .. Hacer<br />
<br />
Fin Para<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.5 Estructuras de Control de Flujo<br />
3.5.1.1 Estructura Iterativa Mientras<br />
n ← 1<br />
Mientras n ≤ 10 Hacer<br />
n ← n + 1<br />
Fin Mientras<br />
3.5.1.3 Estructura Iterativa Para<br />
Para i ← 1 .. 10 Hacer<br />
Imprimir(i)<br />
Fin Para<br />
3.5.1.2 Estructura Iterativa Repetir<br />
n ← 1<br />
Repetir<br />
n ← n + 1<br />
Hasta n ≥ 10<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
45<br />
46<br />
23
3.5 Estructuras de Control de Flujo<br />
3.5.1 Estructura de Control Iterativa<br />
condición<br />
Sí<br />
cuerpo<br />
No<br />
cuerpo<br />
condición<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
No Sí<br />
Figura 3.1 Estructura Iterativa Mientras Figura 3.2 Estructura Iterativa Repetir<br />
3.5 Estructuras de Control de Flujo<br />
Ejemplo 3.19 Factorial de un número entero (Numero) mediante la estructura iterativa Para<br />
Variables<br />
Numero, Resultado, I ∈ Entero<br />
Acciones<br />
Resultado ← 1<br />
Para I ← 2..Numero Hacer<br />
Resultado ← Resultado * I<br />
Fin Para<br />
Ejemplo 3.20 Factorial de un número entero (Numero) mediante la estructura iterativa Mientras<br />
Variables<br />
Numero, Resultado, I ∈ Entero<br />
Acciones<br />
Resultado ← 1<br />
I ← 2<br />
Mientras I ≤ Numero Hacer<br />
Resultado ← Resultado * I<br />
I ← I + 1<br />
Fin Mientras<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
47<br />
48<br />
24
3.5 Estructuras de Control de Flujo<br />
Ejemplo 3.21 Sumar de los elementos de un vector mediante la estructura iterativa Para<br />
Tipos<br />
VectorEnteros = Vector[1..N] ∈ Entero<br />
Variables<br />
I ∈ 1..N<br />
Acciones<br />
Resultado ← 0<br />
Para I ← 1..N Hacer<br />
Resultado ← Resultado + V[I]<br />
Fin Para<br />
Ejemplo 3.22 Elevar al cuadrado los elementos de un vector mediante la estructura iterativa Para<br />
Variables<br />
I ∈ Entero<br />
Acciones<br />
Para I ← 1..N Hacer<br />
Vector[I] ← Vector[I] * Vector[I]<br />
Fin Para<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.5 Estructuras de Control de Flujo<br />
3.5.2 Estructura de Control Condicional<br />
Una estructura condicional (o de selección) consiste en ejecutar una<br />
acción u otra dependiendo de una determinada condición que se analiza<br />
a la entrada de la estructura. La condicional es una de las expresiones más<br />
importantes para el control de un algoritmo. Las dos estructuras de control<br />
condicional más importantes son Si y Según.<br />
Las estructuras condicionales son:<br />
SI SEGÚN<br />
if case<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
49<br />
50<br />
25
3.5 Estructuras de Control de Flujo<br />
3.5.2.1 Estructura Condicional Si<br />
Si Entonces<br />
<br />
Sino<br />
<br />
Fin Si<br />
La expresión unicondicional es un caso particular de la (bi)condicional, en la que<br />
el segundo grupo de acciones es vacío:<br />
Si Entonces Si Entonces<br />
⇒ <br />
Sino Fin Si<br />
∅<br />
Fin Si<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.5 Estructuras de Control de Flujo<br />
3.5.2.2 Estructura Condicional Según<br />
Según Hacer<br />
{ → }<br />
Sí<br />
{ → }<br />
{ → }<br />
En Otro Caso <br />
Fin Según Acción A<br />
condición<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
No<br />
Acción B<br />
Figura 3.3 Estructura Condicional Si<br />
51<br />
52<br />
26
3.5 Estructuras de Control de Flujo<br />
Ejemplo 3.24 Determinación de los días de un mes mediante la estructura condicional Según<br />
Variables<br />
Mes ∈ String<br />
NumDias ∈ Natural<br />
Acciones<br />
Según Mes Hacer<br />
Febrero → NumDias ← 28<br />
Abril → NumDias ← 30<br />
Junio → NumDias ← 30<br />
Septiembre → NumDias ← 30<br />
Noviembre → NumDias ← 30<br />
En Otro Caso<br />
NumDias ← 31<br />
Fin Según<br />
<strong>Tema</strong>rio<br />
Ejemplo 3.23 Calcular si un número es par<br />
mediante la estructura condicional Si<br />
Variables<br />
Numero ∈ Natural<br />
Acciones<br />
Si (Numero Mod 2) = 0 Entonces<br />
{El número es par}<br />
Sino<br />
{El número no es par}<br />
Fin Si<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
53<br />
54<br />
27
3.6 Procedimientos y Funciones<br />
• Un PROCEDIMIENTO está formado por un conjunto de sentencias a<br />
las que se asocia un identificador, y que realizan una acción que se<br />
reconoce por los cambios que se producen en un conjunto de variables o<br />
por realizar alguna operación de entrada/salida.<br />
• Una FUNCIÓN está constituida por un conjunto de sentencias a las que<br />
se asocia un identificador y cuyo efecto se manifiesta porque producen<br />
un valor que es asignado al nombre de la función.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.6 Procedimientos y Funciones<br />
Para realizar su acción, el procedimiento o función puede recibir<br />
una serie de valores a través de un conjunto de variables parámetros<br />
que acompañan a su definición.<br />
Una vez definida una función o procedimiento, podemos usarlo en<br />
cualquier parte del programa donde necesitemos realizar la acción<br />
que desarrolla con tan solo invocarlo mediante su nombre.<br />
Dos posibles formas de entender los Procedimientos y Funciones:<br />
• Abstracción operacional …<br />
• Transferencia de control …<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
55<br />
56<br />
28
3.6 Procedimientos y Funciones<br />
• Abstracción operacional:<br />
El programa le pasa unos valores de entrada y el procedimiento realiza una acción<br />
que consiste en modificar el estado de ciertas variables o, en el caso de las<br />
funciones, que consiste en devolver un valor.<br />
e1 e2<br />
s1<br />
Procedimiento<br />
P<br />
s2<br />
...<br />
...<br />
en<br />
sm<br />
e1 e2 ...<br />
Función<br />
F<br />
Figura 3.5 Procedimientos y Funciones como Abstracciones Operacionales<br />
Para usarlos solo es necesario conocer qué valores es necesario suministrarle y qué<br />
variables modifica. Pero no nos interesa cómo hace la operación.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.6 Procedimientos y Funciones<br />
• Visión de transferencia de control:<br />
Cuando la ejecución de un programa llega a una sentencia de invocación de un<br />
procedimiento (o función), el control se transfiere hacia la primera sentencia de<br />
éste. Cuando el procedimiento llega a su final, el control se transfiere a la<br />
sentencia que sigue a aquella donde se produjo la invocación.<br />
Programa PruebaPotencia<br />
Tipos de Datos<br />
...<br />
Variables<br />
...<br />
Acciones<br />
...<br />
...<br />
Potencia(3,4)<br />
...<br />
Fin<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
s<br />
en<br />
Procedimiento Potencia (x,y)<br />
Variables<br />
...<br />
Acciones<br />
...<br />
...<br />
Fin<br />
Figura 3.5 Procedimientos y Funciones como Transferencia de Control<br />
57<br />
58<br />
29
3.6 Procedimientos y Funciones<br />
Los PROCEDIMIENTOS y FUNCIONES constan de cuatro elementos básicos:<br />
1 Identificador. Nombre que sirve para invocarlo desde cualquier parte del programa. Las<br />
funciones tendrán que ser invocadas desde una expresión ya que devuelven un valor.<br />
2 Lista de parámetros. Los parámetros son una lista de cero o varias variables que<br />
permiten la comunicación entre un procedimiento y el programa que lo usa. Cuando son<br />
declarados se especifica esta lista y cuando son invocados, es necesario que una lista de<br />
argumentos acompañe al nombre. Se realiza una correspondencia uno a uno entre<br />
parámetro y argumento, son expresiones del mismo tipo y aparecen en la misma<br />
posición.<br />
3 Cuerpo. El cuerpo es el conjunto de sentencias que corresponden a la especificación de<br />
la operación. En el caso de una función, en el cuerpo tendrá que aparecer, por lo menos<br />
una vez, el nombre de la función en la parte izquierda de una asignación. Si no sucede<br />
esto significa que la función no devuelve ningún valor.<br />
4 Entorno. Es el conjunto de variables externas al procedimiento que son accesibles y<br />
pueden ser modificadas o simplemente usadas.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.6 Procedimientos y Funciones<br />
• Cabecera de la especificación de un procedimiento:<br />
Procedimiento ( ∈ , ..., ∈ )<br />
• Cabecera de la especificación de una función:<br />
Función ( ∈ , ..., ∈ ) → <br />
Procedimiento Intercambio (↑↓a ∈ Entero, ↑↓b ∈ Entero)<br />
Variables<br />
Función Max (a ∈ Entero, b ∈ Entero) → Entero<br />
temp ∈ Entero<br />
Variables<br />
Acciones<br />
∅<br />
temp ← a<br />
Acciones<br />
a ← b<br />
Si a > b Entonces<br />
b ← temp<br />
Max ← a<br />
Sino<br />
Max ← b<br />
FinSi<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
59<br />
60<br />
30
3.6 Procedimientos y Funciones<br />
Ejercicios: Procedimientos y Funciones<br />
• Diseñar una función que calcule el mayor de tres números<br />
• Diseñar un procedimiento que imprima los elementos impares<br />
de un vector<br />
• Diseñar una función ElevaCuadrado que eleve un elemento al<br />
cuadrado<br />
• Diseñar un procedimiento que eleve al cuadrado los elementos<br />
de un vector haciendo uso de la función ElevaCuadrado<br />
<strong>Tema</strong>rio<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
61<br />
62<br />
31
3.7 Paso de Parámetros<br />
• Los parámetros son variables que permiten la comunicación entre un<br />
procedimiento o función y el código que lo utiliza, entendiendo por comunicación<br />
el intercambio en ambas direcciones.<br />
• Cada parámetro actual (parámetro con que el procedimiento es invocado), o<br />
argumento, es asociado a uno formal (parámetro con que el procedimiento es<br />
definido o declarado).<br />
Programa PruebaPotencia<br />
Tipos de Datos<br />
...<br />
Variables<br />
...<br />
Acciones<br />
...<br />
...<br />
Potencia(3,4)<br />
...<br />
Fin Parámetro actual<br />
Procedimiento Potencia (x,y)<br />
Variables<br />
...<br />
Parámetro formal<br />
Acciones<br />
...<br />
...<br />
Fin<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.7 Paso de Parámetros<br />
• Cuando hablamos de paso de parámetros nos referimos a la manera en que los<br />
valores de los argumentos son ligados a los parámetros del procedimiento. Las<br />
cuatro formas principales son:<br />
POR REFERENCIA POR VALOR<br />
POR VALOR-RESULTADO POR NOMBRE<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
63<br />
64<br />
32
3.7 Paso de Parámetros<br />
3.7.1 Paso por Valor<br />
En el paso de parámetro modo por valor (o paso por valor, representado en EAP<br />
como ↓), en el momento de la invocación del procedimiento o función se evalúa el<br />
argumento y el valor obtenido se asigna al espacio de memoria ligado al<br />
correspondiente parámetro. El procedimiento o función maneja el parámetro y los<br />
cambios realizados no son reconocidos fuera del ámbito local.<br />
Variables<br />
A ∈ Entero<br />
Procedimiento Test1(↓B ∈ Entero)<br />
Constantes<br />
∅<br />
Variables<br />
∅<br />
Acciones<br />
B ← B * B<br />
Inicio<br />
A ← 2<br />
Test1(A)<br />
Fin<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.7 Paso de Parámetros<br />
3.7.2 Paso por Referencia<br />
• Los parámetros son sólo de entrada<br />
• Cualquier cambio realizado en los<br />
valores de los parámetros formales<br />
durante la ejecución del<br />
subprograma se destruye cuando se<br />
termina el subprograma<br />
El modo por referencia (representado en EAP como ↓↑), también conocido como<br />
paso por variable, cada parámetro comparte el espacio de memoria con su<br />
correspondiente argumento. De esta manera los cambios realizados en el código<br />
son asignados a la variable.<br />
Variables<br />
A ∈ Entero<br />
Procedimiento Test2(↓↑B ∈ Entero)<br />
Constantes<br />
∅<br />
Variables<br />
∅<br />
Acciones<br />
B ← B * B<br />
Inicio<br />
A ← 2<br />
Test2(A)<br />
Fin<br />
• Se produce un ahorro de memoria,<br />
ya que los parámetros no necesitan<br />
memoria adicional, sino que utiliza<br />
la asignada a los argumentos<br />
• Los argumentos deben ser variables<br />
y no pueden ser expresiones<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
65<br />
66<br />
33
3.7 Paso de Parámetros<br />
• Ejemplo 3.32 Disponemos de la siguiente definición:<br />
Programa Ejemplo<br />
Variables<br />
i ∈ Entero<br />
a ∈ Vector [1..3] ∈ Entero<br />
Procedimiento Test (f, g ∈ Entero)<br />
Acciones<br />
g ← g+1<br />
f ← 5*i<br />
Acciones<br />
Para i ← 1 ..3 Hacer<br />
a[i] ← i<br />
Fin Para<br />
i ← 2<br />
Test(a[i],i)<br />
Escribir(a[1],a[2],a[3],i)<br />
<strong>Tema</strong>rio<br />
Lo que escribe la sentencia Escribir suponiendo cada<br />
tipo de paso de parámetro es:<br />
• Por valor: 1 2 3 2<br />
• Por referencia: 1 15 3 3<br />
• Por valor-resultado: 1 10 3 3<br />
• Por nombre: 1 2 15 3<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
67<br />
68<br />
34
3.8 Ámbito y Extensión<br />
• Los identificadores que utilizamos en los programas y sus subprogramas<br />
(procedimientos y funciones) se clasifican en dos tipos:<br />
• identificadores locales<br />
• identificadores globales<br />
• Un identificador local es aquel que está declarado y definido dentro de un<br />
subprograma, en el sentido de que está dentro de ese subprograma y es distinto de<br />
los identificadores con el mismo nombre declarados en cualquier parte del<br />
programa principal u otro subprograma. Se dice que tales identificadores son<br />
locales al subprograma en el que están declarados.<br />
• Un identificador global es aquel que está declarado para el programa o algoritmo<br />
principal, del que dependen todos los subprogramas.<br />
• La parte de programa/algoritmo en la que un identificador se define se conoce<br />
como ámbito.<br />
3.8 Ámbito y Extensión<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
• El uso de variables locales tiene muchas<br />
ventajas. En particular, hace a los<br />
subprogramas independientes, con la<br />
comunicación entre el programa<br />
principal y los subprogramas<br />
manipulados estructuralmente a través de<br />
la lista de parámetros del subprograma.<br />
• Para utilizar un procedimiento sólo<br />
necesitamos conocer lo que hace y no<br />
tenemos que estar preocupados de su<br />
diseño, es decir, de cómo está<br />
programado.<br />
• Por el contrario, las variables globales<br />
tienen la ventaja de compartir<br />
información de diferentes subprogramas<br />
sin una correspondiente entrada en la<br />
lista de parámetros.<br />
Programa demo<br />
Tipos<br />
x1 = …<br />
x2 = …<br />
Procedimiento A<br />
Tipos<br />
y1 = …<br />
y2 = …<br />
Procedimiento B<br />
Tipos<br />
z1 = …<br />
z2 = …<br />
Acciones<br />
…<br />
Acciones<br />
…<br />
Procedimiento C<br />
Variables<br />
w1 ∈ …<br />
w2 ∈ …<br />
Acciones<br />
…<br />
Acciones<br />
…<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
69<br />
70<br />
35
3.8 Ámbito y Extensión<br />
• El ámbito de un identificador es la parte de programa dónde se conoce el<br />
identificador. Si un procedimiento está definido localmente a otro procedimiento,<br />
tendrá significado sólo dentro del ámbito de ese procedimiento.<br />
A<br />
B<br />
D E<br />
C<br />
F<br />
G<br />
3.8 Ámbito y Extensión<br />
Programa demos<br />
Variables<br />
a, x, y ∈ Entero<br />
Función f(n ∈ Entero) → Entero<br />
Variables<br />
x ∈ Entero<br />
Acciones<br />
a ← 5<br />
x ← 12<br />
f ← n+a<br />
Acciones<br />
x ← 5<br />
a ← 10<br />
y ← f(x)<br />
Escribir(x,a,y)<br />
Variables Accesibles<br />
definidas en desde<br />
A A,B,C,D,E,F,G<br />
B B,C<br />
C C<br />
D D,E,F,G<br />
E E,F,G<br />
F F<br />
G G<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
• Los identificadores definidos en<br />
un ámbito son accesibles en el<br />
mismo, es decir, en todos los<br />
procedimientos interiores.<br />
• A la variable global a se puede<br />
acceder desde el programa y<br />
desde la función. Sin embargo, x<br />
identifica a dos variables<br />
distintas: una global al programa<br />
accesible desde todo él y otra<br />
local a la función.<br />
• Se escribirá la línea:<br />
5 5 10<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
71<br />
72<br />
36
3.8 Ámbito y Extensión<br />
• La extensión de una variable es el intervalo de tiempo durante el cual la variable<br />
existe, ocupa almacenamiento y es accesible.<br />
• Una variable puede existir fuera del ámbito de su declaración. En el caso del<br />
siguiente ejemplo la extensión de x p es el tiempo que dura la ejecución del<br />
programa P. Mientras que la extensión de v y x a es el intervalo de tiempo en que se<br />
ejecuta el procedimiento A.<br />
Programa P<br />
Variables<br />
x ∈ Vector [1..5] ∈ Real<br />
Acciones<br />
...<br />
A<br />
...<br />
3.8 Ámbito y Extensión<br />
Procedimiento A<br />
Variables<br />
v, x ∈ Entero<br />
Acciones<br />
...<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
• En general, se define la siguiente regla para decidir cuál es el ámbito de<br />
una declaración en un lenguaje estructurado:<br />
“El ámbito de una declaración de un identificador es todo el bloque en<br />
el que está definido, incluyendo aquellos bloques contenidos en ese<br />
bloque, excepto si el identificador es redefinido en el bloque<br />
subordinado o anidado, entendiendo bloque como la unidad de<br />
programa dónde se puede definir objetos locales que solo tienen<br />
significado dentro de ese texto.”<br />
• Normalmente, en la mayoría de lenguajes imperativos el bloque es el<br />
procedimiento o función.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
73<br />
74<br />
37
3.8 Ámbito y Extensión<br />
Ejercicio Paso Por Valor/Referencia y Ámbito: Calcular los valores finales de i, j, k, l suponiendo que<br />
los parámetros del procedimiento Test son: a) pasados en modo por valor; b) pasados en modo por<br />
referencia.<br />
Variables<br />
i, j, k, l ∈ Entero<br />
Procedimiento Test (m, n ∈ Entero)<br />
Variables<br />
l ∈ Entero<br />
Acciones<br />
m ← m + 2<br />
n ← n - 2<br />
k ← n - m<br />
l ← m + n + j + k<br />
Acciones<br />
i ← 4<br />
j ← i * 3<br />
k ← j - 1<br />
l ← k + 2<br />
Test (i, j)<br />
<strong>Tema</strong>rio<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
75<br />
76<br />
38
3.9 Gestión de Memoria<br />
• La memoria se organiza en dos zonas. Una<br />
corresponde al código del programa y la otra a los<br />
datos. Ésta a su vez está dividida en tres zonas:<br />
1. Estática: Área de memoria cuyas posiciones son<br />
asignadas a las variables globales del programa.<br />
2. Pila (stack): Empleada para gestionar el uso de<br />
los procedimientos.<br />
3. Montón (heap): Área de memoria cuyas<br />
posiciones son asignadas a las variables<br />
dinámicas.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.9 Gestión de Memoria<br />
3.9.1 Administración de Memoria Estática<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
C Ó D I G O<br />
D<br />
A<br />
T<br />
O<br />
S<br />
Memoria<br />
Estática<br />
Pila<br />
(Stack)<br />
Montón<br />
(Heap)<br />
• Cuando a una variable, al comenzar la ejecución del programa se le asigna espacio<br />
de almacenamiento y mientras dura la ejecución dicho espacio está ligado a esa<br />
variable, decimos que se trata de una variable estática.<br />
• En ciertos lenguajes de programación (Fortran o Cobol, por ejemplo) todas las<br />
variables que intervienen en el programa son estáticas, de manera que durante la<br />
ejecución del programa coexistirán en memoria las variables globales junto con las<br />
variables y datos de los procedimientos y funciones del programa.<br />
• En los lenguajes de programación imperativos las variables globales son estáticas,<br />
es decir, su extensión es la duración del programa que las declara. Pero cada<br />
procedimiento no tiene su propia área de datos, sino que existe la administración<br />
con pila propia de los lenguajes estructurados en bloques (los procedimientos y<br />
funciones).<br />
77<br />
78<br />
39
3.9 Gestión de Memoria<br />
3.9.2 Administración de Memoria basada en Pila<br />
• Por pila nos vamos a referir a la zona de la memoria<br />
que está implicada en el uso de los procedimientos,<br />
cuyo espacio se asigna y libera, como veremos,<br />
mediante operaciones de apilar y desapilar (push y<br />
pop).<br />
• Cada vez que se activa un bloque, es decir, se invoca un procedimiento o función, se<br />
añade a la pila su registro de activación (RA) y cuando acaba su ejecución, se elimina<br />
de la pila su RA.<br />
• Por RA entendemos el conjunto de información que necesita un procedimiento para<br />
su ejecución (objetos locales y parámetros) y la dirección de la instrucción donde<br />
continuará la ejecución del programa cuando finalice el procedimiento o función.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.9 Gestión de Memoria<br />
3.9.2 Administración de Memoria basada en Pila<br />
• Luego una llamada a un procedimiento P implica:<br />
1. Crear su RA<br />
2. Apilar su RA<br />
3. Transferir el control a la primera sentencia de P<br />
…y la terminación de P implica:<br />
1 Recuperar dirección de retorno (dir_ret) del RA.<br />
2 Desapilar su RA<br />
3 Transferir el control a dir_ret<br />
parám var_loc<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
Apilar Desapilar<br />
dir_ret<br />
79<br />
80<br />
40
3.9 Gestión de Memoria<br />
Ejemplo: evolución de la pila durante la<br />
ejecución de un programa<br />
parám var_loc dir_ret<br />
RA(Sub1) = a d <br />
RA(Sub2) = c d <br />
Procedimientos<br />
Recursivos<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
Programa M<br />
Variables<br />
a, b, c ∈ Real<br />
Procedimiento Sub1 (↓a∈Real)<br />
Variables<br />
d ∈Real<br />
Procedimiento Sub2 (↓c∈Real)<br />
Variables<br />
d∈Real<br />
Acciones<br />
c←c+b<br />
Acciones<br />
Sub2(b)<br />
<br />
Acciones<br />
Sub1(a)<br />
<br />
Pila Vacía → RA(Sub1) →<br />
RA(Sub2)<br />
RA(Sub1) → RA(Sub1) → Pila Vacía<br />
3.9 Gestión de Memoria<br />
3.9.1 Administración de la Memoria Montón<br />
• En algunos lenguajes se incluyen variables dinámicas, que pueden ser creadas y<br />
destruidas en cualquier momento durante la ejecución del programa. Esto quiere<br />
decir que se le asigna almacenamiento cuando surge la necesidad de usar esa<br />
variable, y además, se puede liberar ese almacenamiento cuando ya no sea<br />
necesario el uso de la variable.<br />
• Un montón es un segmento de memoria que es<br />
utilizado como un almacén de palabras de memoria de<br />
dónde se le asigna espacio de almacenamiento a las<br />
variables dinámicas.<br />
• El estado del montón en un determinado momento de<br />
la ejecución está constituido por un conjunto de áreas<br />
asignadas con bloques libres o huecos entre ellas:<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
Libre<br />
Libre<br />
Libre<br />
Libre<br />
81<br />
82<br />
41
<strong>Tema</strong>rio<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
3.1 Identificadores, Constantes, Variables, Expresiones<br />
3.2 Tipos de Datos Simples: Natural, Entero, Real, Carácter, Booleano<br />
3.3 Tipos de Datos Estructurados: Enumerado, Subrango, Registro, Vector,<br />
String, Matriz, Secuencia, Fichero<br />
3.4 Estructura Secuencial<br />
3.5 Estructuras de Control de Flujo: Programación Estructurada<br />
3.6 Procedimientos y Funciones<br />
3.7 Paso de Parámetros<br />
3.8 Ámbito y Extensión<br />
3.9 Gestión de Memoria<br />
3.10 Entrada/Salida<br />
3.10 Entrada/Salida<br />
• 2 operaciones básicas<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
• Leer (fichero, lista de variables de entrada)<br />
• Escribir (fichero, lista de variables de salida)<br />
donde<br />
• lista de variables de entrada/salida: donde se almacenará los valores leídos (operación<br />
de lectura) o se escribirán en el dispositivo de salida (operación de escritura).<br />
• fichero: Es la variable de tipo fichero asociada al dispositivo<br />
• Entrada estándar / Salida estándar<br />
• Los dispositivos de entrada/salida suelen ser mucho más lentos que el procesador:<br />
las lecturas y escrituras de información se hacen por bloques<br />
cada línea se almacena en un buffer de entrada o de salida, de modo que las operaciones<br />
de lectura y escritura se realizarán sobre los buffers asociados a los ficheros<br />
correspondientes.<br />
Metodología y Tecnología de la Programación<br />
<strong>Tema</strong> 3. Elementos Básicos de la Programación Imperativa<br />
83<br />
84<br />
42