Вы находитесь на странице: 1из 100

Introducción al lenguaje

Pascal
Autor: emarinch@racsa.co.cr
1. Introducción
Pascal y Turbo Pascal

Pascal es un lenguaje de alto nivel y de propósito


general (es aplicable a un gran número de
aplicaciones diversas) desarrollado por el profesor
suizo Niklaus Wirth como un lenguaje para enseñar la
programación con un método disciplinado y
sistemático. Wirth trató de eliminar las
inconsistencias de otros lenguajes de programación
de su época y además que sirviera para enseñar las
técnicas de programación a sus alumnos.

Una versión preliminar del lenguaje apareció en 1968


y a finales de 1970 apareció el primero compilador
totalmente completo.

Las diferentes versiones ofrecían interpretaciones


ligeramente diferentes que impedían la compatibilidad
entre ellas. Por estas razones, mediante diferentes
proyectos, se logró la estandarización bajo las normas
ISO (International Standards Organization), ANSI
(American National Standards Institute) y IEEE
(Institute of Electrical and Electronics Engineers). Sin
embargo, las versiones más populares conocidas
como UCSD (Construida por Regents) y Turbo Pascal
(de Borland) no están estandarizadas. Esta última es
la más conocida y la más utilizada.

Características principales
- Excelente para el aprendizaje de la información.

- Lenguaje de propósito general.

- Lenguaje procedimental (orientado a órdenes).

- Lenguaje estructurado
(Permite while, for y repeat y no necesita el goto).

- Lenguaje recursivo (Puede llamarse a sí mismo


una función o procedimiento).

- Riqueza en los tipos de datos.

Turbo Pascal

Fue lanzado por la firma Borland International en


1983 a modo experimental. Fue todo un éxito, pues
además de funcionar, compilaba y corría los
programas más rápido.

Las versiones han evolucionado de la 1.0 hasta la 7.0


que cuenta con una biblioteca de objetos denominada
Turbo Visión.

2. Programación descendente (“Top -


Down”)
La programación descendente o "Top - Down" es el
proceso mediante el cual un problema se descompone
en una serie de niveles o pasos sucesivos de
refinamiento (stepwise). La metodología descendente
consiste en efectuar una relación entre las sucesivas
etapas de estructuración de modo que exista una
relación entre ellas mediante entradas y salidas de
información. El problema se descompone en varias
estructuras jerárquicas, de forma que se pueda
considerar cada estructura desde dos puntos de vista:
¿qué hace? y ¿cómo lo hace?
Las estructuras desde los dos puntos de vista se
representan de la siguiente forma:

El diseño descendente se representa así:

3. Programación modular
La programación modular es uno de los métodos de
diseño más flexibles y potentes para mejorar la
productividad de un programa. En programación
modular el programa se divide en módulos (partes
independientes), cada una de las cuales ejecuta una
única función o actividad y se codifican
independientemente de otros módulos. Cada uno de
estos módulos se analiza, codifica y pone a punto por
separado.

Cada programa contiene un módulo denominado


programa principal que controla todo lo que sucede;
se transfiere el control a los submódulos o
subprogramas. Estos ejecutan su función y una vez
completada su tarea, devuelven el control al módulo
principal.

Cada submódulo se puede descomponer en otros


submódulos, dependiendo de la complejidad de la
tarea a realizar y la subdivisión continúa hasta que
cada módulo tenga una sola tarea para ejecutar..
Un submódulo puede realizar tareas de distinta
naturaleza como: entrada, salida, manipulación de
datos, control de otros módulos o una combinación de
éstos. Un módulo puede transferir temporalmente
(bifurcar) el control a otro módulo; sin embargo, cada
módulo debe eventualmente devolver el control al
módulo del cual recibió originalmente el control.

4. Conceptos básicos de Pascal: datos y


tipos de datos
Concepto de dato

Los diferentes objetos de información con los que


trabaja un programa en Pascal se conocen como
datos. Todos los datos tienen un tipo asociado con
ellos. Pueden ser de tipo carácter, entero, un número
real, etc.

La asignación de tipos a los datos persigue dos


objetivos:

- Detectar errores de operaciones en


programas.

- Determinar cómo ejecutar las operaciones.


Clasificación de los tipos de datos

Tipos de datos enteros

Turbo Pascal dispone de cinco tipos predefinidos (no


necesitan una nueva definición de parte del
programador pues cada tipo tiene un límite) que
permiten representar valores enteros.

Si se asigna un valor fuera del límite de cada tipo,


producirá un mensaje de error:

Error 76: Constant out of range

Byte: Son los datos comprendidos entre 0 y 255.

Integer: Enteros que están entre -32.768 y 32.767.

Longint: A partir de la versión 4.0 se amplía el rango


de los enteros. Van desde -2.147,483.647 hasta
2.147,483.647.

Shortint: Son datos enteros comprendidos entre -128


y 127. Son utilizados cuando se debe trabajar con
valores pequeños y se desea economizar memoria.
Ocupan 1 byte de memoria.
Word: Se utiliza cuando se desea representar
únicamente valores positivos. Ocupan dos bytes de
memoria y van de 0 a 65.535.

5. Identificadores y expresiones
Identificadores

Representan los objetos de un programa (constantes,


variables, tipos de datos, procedimientos, funciones,
unidades, programas y campos de registros). Un
identificador es una secuencia de caracteres de
cualquier longitud, pero el límite significativo es de 63
caracteres.

Existen tres reglas básicas para nombrar los


identificadores:

Debe comenzar con una letra (A a Z, mayúsculas o


minúsculas). No puede contener blancos.

Los caracteres permitidos después del primer carácter


son letras, dígitos y el carácter de subrayado ( _ ).

No se puede utilizar una palabra reservada como


identificador. Las palabras reservadas son aquellos
términos que tienen un significado especial para
Pascal y no se pueden utilizar para otros propósitos.

Algunas palabras reservadas son: absolute, and,


array, begin, const, div, do, downto, else, if,
in,label,mod,not,of, packed, procedure, record, set,
shr, then,to, unit, uses, var, while, xor.

Expresiones
Una expresión es un conjunto de datos o funciones
unidos por operadores aritméticos.

Pascal soporta los siguientes operadores:

Reglas para la evaluación de expresiones

Todas las subexpresiones entre paréntesis se evalúan


primero. Cuando existan subexpresiones con
paréntesis anidados se evalúan de dentro hacia fuera.
El paréntesis más interno se evalúa primero.

Prioridad de operaciones. Dentro de una misma


expresión o subexpresión, los operadores se evalúan
en el siguiente orden:

1º *,/, div, mod

2º +, -

Regla asociativa izquierda. Los operadores en una


misma expresión o subexpresión con igual nivel de
prioridad ( *, / ) se evalúan de izquierda a derecha.

Ejemplos:

a. 4+2*5 (primero la multiplicación,


luego la suma)

4+ 10

14

b. 23 * 2 div 5 (de izquierda a derecha,


primero * y luego div)
46 div 5

Práctica

Evalúe las siguientes expresiones:

8 * 5 * (7+2 - (4 + 4)) R/
40

(1 + 6) * 5 div 7 mod 4 + 1 R/
2

3 + 4 - 14 /2 R/
0

2 * (2 + 6 * 4)
R/ 52

Especifique el orden de desarrollo de la siguiente


operación:

a - (b + c div d) + e * f

6. Concepto de sentencia
Las sentencias son pasos que describen las acciones
algorítmicas que pueden ser ejecutadas. Se clasifican
según su operatividad en ejecutables y no
ejecutables. Las ejecutables son aquellas que
especifican operaciones de cálculos aritméticos y
entradas/salidas de datos y no ejecutables son las
que no realizan ninguna acción concreta, sino que
ayudan a la legibilidad el programa sin afectar su
ejecución. Las sentencias ejecutables son aquellas
que aparecen en el cuerpo del programa luego de la
palabra begin.

Estructura de un programa en Pascal


Program Nombre;

Uses

Crt,Printer;

Var

Cedula: String[16];

Apellido1: String[15];

Apellido2: String[15];

Nombre: String[20];

Edad: Integer; Begin

Clrscr;

Write (`Digite la cédula: `);

Readln (Cedula);

Write (`Digite el primer apellido: ´);

Readln (Apellido1);

Write (`Digite el segundo apellido: `);

Readln (Apellido2);

Write (`Digite el nombre: `);

Readln (Nombre);

Write (`Digite la edad: `);

Readln (Edad);

Write (`El empleado se llama `,Apellido1,´


`,Apellido2,´ `,Nombre,´ `,´y tiene `,Edad,
` `,´años´);

End.

7. Sentencias simples y sentencias


compuestas
2.3.1Sentencias simples

Es una sentencia que no contiene ninguna otra


sentencia. Se clasifican en: asignación y procedure.

2.3.1.1 Sentencia de asignación

La sentencia de asignación se utiliza para asignar


(almacenar) valores o variables. La asignación es una
operación que sitúa un valor determinado en una
posición de memoria. La operación de asignación
puede representar en un pseudocódigo con el símbolo
`?´, para denotar que el valor situado a su derecha
se almacena en la variable a la izquierda.

Formato

Variable ? expresión

En Pascal el operador `?´ se sustituye por el


símbolo :=, que se denomina carácter de asignación.

Ejemplos:

A := 16 (Se le asigna 16 a la variable A)

Inicial := `LJ´ (Se asigna el texto LJ a la variable


Inicial)

N1 := N2 (El valor de la variable N1 se cambia por el


valor de la variable N2).
N1 := N1 + 5 (El valor de N1 se modifica
incrementándose en 5).

2.3.1.2 Sentencia procedure

Un procedure o procedimiento es un subprograma


que realiza una tarea específica. Estos son ejecutados
cuando Pascal encuentra el nombre del
procedimiento. Deben estar declarados antes de ser
referenciados dentro del programa.

Ejemplo:

Program Calcula;

Var

Valor1: Integer;

Valor2: Integer;

Procedure Elmayor;

Begin

If Valor1> Valor2 then

Begin

Write (`El mayor es: `,Valor1);

Readln

End

Else

If Valor1< Valor2 then

Begin
Write (`El mayor es: `,Valor2);

Readln

End

Else

Begin

Write (`Son iguales´);

Readln

End

End;

Begin

Write (`Digite un valor: `);

Readln (Valor1);

Write (`Digite otro valor: `);

Readln (Valor2);

Elmayor

End.

2.3.2 Sentencias compuestas

En numerosas ocasiones, en vez de realizar sólo una


acción, cuando se cumpla o no se cumpla una
determinada condición, se deben realizar diferentes
acciones. Esto es posible gracias a las sentencias
compuestas. Una sentencia compuesta es un conjunto
de sentencias separadas por puntos y comas y
encerradas entre las palabras beginy end.
Ejemplo:

Begin

Readln (Numero);

Numero:= Numero+1;

Write (`El número es `,Numero)

End.

8. Entradas y salidas de información


2.4.1 Concepto de entrada

Una entrada de datos o valores es equivalente al


término lectura. La entrada o lectura de datos se
refiere a la recepción de valores provenientes de un
dispositivo periférico de entrada como un teclado, una
unidad de disco, un escáner, etc. y su
direccionamiento hacia zonas de memoria de la
computadora.

Es la entrada la operación que nos permite


proporcionar datos durante la ejecución de un
programa. Los datos que se pueden leer son: enteros,
reales, caracteres o cadenas. NO se puede leer un
boolean por tener valores preestablecidos (V o F).

Los datos estructurados como arrays, registros o


conjuntos, no se pueden leer globalmente y se suele
recurrir a diseñar procedimientos específicos.

Los procedimientos de lectura son: Read y ReadLn.


Estos esperan a que se pulse la tecla ENTER antes de
asignar un valor a la variable.

2.4.1.1 Ejemplo
Program Suma;

Uses

Crt;

Var i,j : integer; Begin

Clrscr;

Write (`Introduzca el primer número: `);

Readln (i);

Write (`Introduzca el segundo número: `);

Readln (j);

WriteLn (`La suma es `,i+j);

End.

2.4.2 Concepto de salida

Los programas para ser útiles deben proporcionar


información de salida (resultados). Esta salida toma
información de la memoria y la sitúa o almacena en:
la pantalla, en un dispositivo de almacenamiento
(disco duro o flexible), o en un puerto de E/S
(puertos serie para comunicaciones o impresoras).

El procedimiento que se utiliza para visualizar o


escribir la información es el Write o el WriteLn.
Tanto el Write como el WriteLn cumplen la misma
función, o sea desplegar información. La diferencia es
que el WriteLn despliega la información y salta a la
línea siguiente.

2.4.2.1 Ejemplo

Program Resultado;
Uses

Crt;

Var Nombre : String[30]; Begin

Clrscr;

Nombre := `Pedro Picapiedra´;

WriteLn (`Nuestro personaje se llama


`,Nombre);

End.

9. Práctica
1. Hacer un programa que lea su cédula, su
nombre y su teléfono y los imprima en pantalla.

2. Hacer un programa que lea tres números, que


calcule el mayor y el menor de esos números y los
imprima.

3. Hacer un programa que lea un código de


producto, su descripción, su precio unitario, las
unidades compradas y el precio total a pagar e
imprima el resultado.

4. Hacer un programa que lea dos números y que


imprima el resultado de su suma, su resta, su
multiplicación y su división.

5. Hacer un programa que lea la cédula de un


trabajador, su nombre y su salario. Debe calcular el
8% correspondiente al rebajo de la CCSS y el 1% del
Banco Popular, el total de deducciones y el salario
neto.
Al final debe imprimir lo siguiente: "Estimado
empleado: (nombre). En este mes su salario se
desglosa así:

Salario bruto: (Salario)

8% CCSS: (CCSS)

1% Banco Popular: (BP)

Total de deducciones: (Totded)

Salario Neto: (Salneto)

6. Escriba un programa que lea tres números para


tres variables a, b y c. Con base en los valores
almacenados, calcule la expresión ((a+7*c)/(b+2-a)
+2*b).

10. Estructuras de control


3.1.1 Expresiones lógicas

Son acciones alternativas o decisiones que


determinan el cumplimiento o no de una determinada
condición.

Por ejemplo, supongamos que se desea diseñar un


programa para calcular el salario semanal de un
empleado que trabaja por horas; la empresa paga un
1.5% adicional por todas las horas trabajadas
superiores a 40. El algoritmo de cálculo de pago sería
el siguiente:

Leer HorasTrabajadas

Si HorasTrabajadas>40 entonces

Adicional ?(HorasTrabajadas-
40)*SalarioHora*1.5%
Si no

Adicional ?(HorasTrabajadas * SalarioHora)

Fin_Si

3.1.2 Operadores de relación

Se utilizan para expresar condiciones y describen una


relación entre dos valores.

Es importante recordar aquí el orden de evaluación de


expresiones aritméticas:

3.1.3 Operadores lógicos

Las expresiones lógicas pueden combinarse para


formar expresiones más complejas. Esto se logra
utilizando los operadores lógicos: and, or y not.

La operación and (y) combina dos condiciones


simples y produce un resultado verdadero sí y sólo sí
los dos operandos de la expresión son verdaderos.

La operación or (o) es verdadera si uno de los dos


operandos es verdadero.

La operación not (no) actúa sobre una sola condición


simple u operando y simplemente niega o invierte su
valor.

Esto se puede demostrar más fácilmente mediante las


tabla de verdad para cada operador.
3.1.3.1 Operador and

3.1.3.2 Operador or

3.1.3.3 Operador not

11. Selección de acciones alternativas


3.2.1 La sentencia IF

Puesto que las expresiones lógicas toman el valor


verdadero o falso, se necesita una sentencia de
control que indique a la computadora que ejecute una
sentencia en caso de que la expresión sea verdadera
y otra sentencia en el caso de que sea falsa. Esto se
logra mediante la sentencia IF. El siguiente ejemplo
describe su utilidad.

Ejemplo:

Program Numeros;

Var

Numero : Real;

Begin

Writeln (`Introduzca un número `);

Read (Numero);
If Numero > 0.0 Then

Begin

Writeln (`El número introducido es


positivo´);

Readln

End Else Begin

Writeln (`El número introducido es


negativo´);

Readln

End;

End.

3.2.1 Sentencias IF anidadas

La sentencia que sigue a la palabra


reservada then o else puede ser cualquiera, incluso
otra sentencia if - then - else. Cuando existe una
sentencia if - then - else dentro de otra sentencia if -
then - else, se dice que dichas sentencias están
anidadas.

Ejemplo:

Program Mayor;

Uses

Wincrt;

Var

A,B,C : Integer;
Elmayor : Integer;

Begin

Writeln (`Digite tres números enteros `);

Readln (A,B,C);

If A > B Then

If A > C Then

Elmayor := A

Else

Elmayor := C

Else

If B > C Then

Elmayor := B

Else

Elmayor := C;

Writeln (`El número mayor es: `,Elmayor)

End.

3.2.2 La sentencia CASE

La sentencia CASE se utiliza para elegir entre


diferentes alternativas. Una sentencia CASE se
compone de varias sentencias simples. Cuando
un CASE se ejecuta, una y sólo una de las sentencias
simples se selecciona y se ejecuta.

Ejemplo:
Program Cursor;

(* Este programa mueve el cursor a través de la


pantalla mediante las teclas predefinidas, cuando se
presiona otra tecla, emite un pitido de advertencia*)

Uses

Wincrt;

Var

X,Y : Integer;

C : Char;

Begin

Clrscr;

X := 40;

Y := 10;

GotoXY (X,Y);

Write (`*´);

Repeat

C := Readkey;

GotoXY (X,Y);

Write (` `);

Case C of

`S´ : Y := Y - 1;

`B´ : Y := Y + 1;
`D´ : X := X + 1;

`I´ : X := X - 1;

`P´ : Exit

Else

Write (Chr(7)

End;

GotoXY (X,Y);

Write (`*´)

Until C = `P´

End.

12. Condiciones compuestas


En numerosas ocasiones las expresiones de control de
un ciclo pueden ser condiciones lógicas compuestas,
como las siguientes:

While (Datos >= 100) and (Datos >=


1000) do

While not (A <= 5) do

While (A <> B) and not Eof (input) do

Ejemplo:

Diseñar un programa que verifique si un número es


primo.

Program Primos;

Var
Primo : bolean;

Número : Integer;

Begin

Primo: = True;

Divisor := 2;

WriteLn (`Introduzca un entero positivo:


`);

ReadLn (Numero);

While (Divisor < Numero) and Primo do

Begin

If Numero mod Divisor = 0 then

Primo := False;

Divisor := Divisor + 1

End;

If primo = True then

Writeln (Numero,` ` , ` es primo´)

Else

Writeln (Numero,` ` , ` no es primo´)

End.

13. Ciclos
Es una estructura de control que permite la repetición
de una serie determinada de sentencias. Se le llama
también bucle o lazo.

El cuerpo del ciclo o bucle contiene las sentencias que


se repiten. Pascal proporciona tres estructuras o
sentencias de control para especificar la
repetición: while, repeat, for.

Nos ocuparemos de estudiar el ciclo FOR y el ciclo


REPEAT.

3.4.1 La sentencia FOR

En numerosas ocasiones se puede desear un bucle


que se ejecute un número determinado de veces, y
cuyo número se conozca por anticipado. Para
aplicaciones de este tipo se utiliza la sentenciaFOR.

La sentencia FOR requiere que conozcamos por


anticipado el número de veces que se ejecutan las
sentencias que se encuentran dentro del ciclo. El
ciclo for se incremente automáticamente.

Sintaxis:

For variable := valor inicial to valor final do

Sentencia;

Ejemplos:

1.

For c := 1 to 5 do

Begin

Write (`aa´);
Write (`BB´)

End;

Al ejecutarse, visualiza:

AaBBaaBBaaBBaaBBaaBB

For Caracter := `A´ to `Z´ do

WriteLn (Caracter);

3. 4. 1. 1 Decremento del contador FOR


(Downto)

El contador del ciclo se puede decrementar de uno en


uno en lugar de incrementar. La sintaxis es la
siguiente:

For variable := valor inicial downto valor final do

Sentencia;

Ejemplos:

For C := 5 downto 1 do

Begin

Write (`C´);

Writeln

End;

Lo anterior produce la siguiente salida:

3
2

También podemos encontrar ciclos FOR anidados:

For m := 1 to 10 do

begin

For n := 10 downto 2 do

WriteLn (m,n)

end;

3.4.2 La sentencia REPEAT

Es una variante de la sentencia while. La


sentencia REPEATespecifica un ciclo condicional que
se repite hasta que la condición se hace verdadera.

El diagrama de flujo se representa de la siguiente


manera:

El seudocódigo se representa así:

Repetir

Sentencias
Hasta_que condición

Sintaxis:

Repeat

Begin

Sentencia 1;

Sentencia 2;

...

...

...

Sentencia n;

End;

Until expresion lógica

Ejemplo:

(* El siguiente programa imprime las secuencias de


caracteres hasta que se presione cualquier tecla *)

Uses wincrt;

Var m : char;

n : integer;

Begin

Repeat

Begin

Write ('a e i o u');


Write ('1 2 3 4 5');

End;

Until keypressed

End.

14. Práctica
1. Los patos de un granjero se venden a precios
especiales si son grandes pero no demasiado. Diseñe
un programa que lea el número de patos que posee el
granjero y el peso de cada ave. Al final debe
especificar cuántos patos pesan entre 1.5 kilos y 2
kilos inclusive.

2. Diseñe un programa para calcular e imprimir los


primeros 2000 números enteros positivos.

3. Leer las notas de 50 exámenes e imprimir cuántos


de ellos tienen nota mayor o igual a 70.

4. Hacer un programa que lea los montos de las N


ventas hechas por una tienda en un día y que
imprima el monto total de ventas y el monto
promedio.

5. Hacer un programa que lea 10 valores numéricos


(positivos y negativos). Debe imprimir el número de
valores negativos, el número de valores iguales a
cero y el promedio de valores positivos.

6. Encuentre la suma de los primeros 50 números


enteros pares.

7. El interés simple se calcula mediante la fórmula


A=P(1+i*n), donde A=Monto de Interés, P=Capital,
N=Número de años e i=tasa de interés.
8. Hacer un programa que lea: P, i, y N e imprima el
monto de interés a través del número de años leído.

9. Diseñe un programa para calcular la nómina


semanal de una compañía con N empleados. Por cada
empleado, se debe leer: Nº de empleado, salario por
hora y número de horas trabajadas. Por cada
empleado se debe imprimir: Nº de empleado, salario
bruto, impuesto federal, impuesto estatal, cuota del
seguro social y salario neto. Los impuestos federales
son el 15% del salario bruto, los estatales el 6% y el
seguro social el 7%. El salario se calcula de la
siguiente manera: Por las primeras 40 horas o menos
se paga el salario normal por hora. Por las horas
extra (más de 40) se paga 1.5% adicional por hora.

10. Diseñe un programa para calcular cuántas veces


se puede dividir un número X entre un número Y de
tal manera que el resultado de la división sea un
número entero.

15. Subprogramas: Funciones y


Procedimientos
4.1 Procedimientos

4.1.1 Concepto

Un procedimiento es un programa que realiza una


tarea específica. Puede recibir cero o más valores del
programa que llama y devolver cero o más valores al
programa que realizó la llamada. Un procedimiento
está compuesto de un grupo de sentencias a las que
se asigna un nombre (identificador) y constituye una
unidad de programa. La tarea asignada al
procedimiento se ejecuta siempre que Pascal
encuentra el nombre del procedimiento.
Los procedimientos es obligatorio declararlos y deben
ser declarados antes de que puedan ser referenciados
en el cuerpo del programa. En Pascal reciben el
nombre de PROCEDURE.

4.1.2 Declaración de un procedimiento

Al igual que los identificadores, los procedimientos


deben declararse dentro del cuerpo del programa. La
declaración de un procedimientoNO indica a la
computadora que ejecute las instrucciones dadas,
sino que indica a la computadora cuáles son estas
instrucciones y dónde están localizadas cuando sea
necesario.

El formato del procedimiento es el siguiente:

Procedure nombreproc;

Declaraciones locales

Begin

Cuerpo del procedimiento

End;

A las variables que se encuentran dentro de un


procedimiento se les llaman Variables Locales y a las
que se ubican en el cuerpo principal, fuera de los
procedimientos, se les llama Variables Globales.

En resumen, un procedimiento, al igual que un


programa, consta de tres partes:

Una cabecera del procedimiento que proporciona el


nombre del mismo y, en caso de existir, una lista de
parámetros formales.
Una sección de declaración que puede contener
constantes, variables e incluso otros procedimientos.

Una sección ejecutable: el cuerpo del procedimiento.

Ejemplo:

Program Recuadro;

Var I : Integer;

Procedure Estrellas;

(* Este procedimiento visualiza 15 asteriscos *)

Begin

For I := 1 to 15 do

Write (`*´)

End;

Begin

Estrellas; (* Llamado del procedure *);

Write (`Mensajes´);

Estrellas; (* Nuevo llamado del procedure *);

End.

4.1.3 Ventajas de utilizar procedimientos

La organización de un programa en procedimientos lo


hace más fácil de escribir y depurar. Los
procedimientos no deben exceder de 25 líneas.

Las ventajas de utilizar procedimientos son:

Facilita el diseño descendente.


Los procedimientos se pueden ejecutar más de una
vez en un programa y/o en diferentes programas,
ahorrando tiempo de programación.

El uso de procedimientos facilita la división de las


tareas entre un equipo de programadores y se
pueden comprobar individualmente.

16. Parámetros
4.2.1 Concepto

Un parámetro es un método para pasar información


(valores a variables) del programa principal a un
procedimiento y viceversa.

Un parámetro es, prácticamente, una variable cuyo


valor debe ser ya sea proporcionado por el programa
principal al procedimiento o ser devuelto desde el
procedimiento hasta el programa principal. Por
consiguiente, existen dos tipos de parámetros:

- Parámetros de entrada: Sus valores deben ser


proporcionados por el programa principal.

- Parámetros de salida: Son parámetros cuyos


valores se calcularán en el procedimiento y se deben
devolver al programa principal para su proceso
posterior.

4.2.2 Transferencia de información desde y/o hasta


los procedimientos

Existen dos tipos de procedimientos:

- Procedimientos sin parámetros: No existe


comunicación entre el programa principal y los
procedimientos ni viceversa.
- Procedimientos con parámetros: Existe
comunicación entre el programa principal y los
procedimientos o entre dos procedimientos.

Ejemplo 1:

(Parámetros de entrada)

Procedure RecuadroDos (N : Integer);

Var

J : Integer;

Begin

For J := 1 to N do

Write(`*´)

End;

Ejemplo 2:

(Parámetros de entrada/salida)

El procedimiento Geometria recibe la longitud y


anchura de un rectángulo, calcula el área y perímetro
del rectángulo y devuelve los valores obtenidos al
programa principal.

Procedure Geometria (Longitud, Anchura :


Real; Var Area, Perímetro : Real);

Begin

Area := Longitud * Anchura;

Perimetro := 2 * (Longitud + Anchura)

End;
4.2.3 Parámetros actuales y formales

Las sentencias llamadas a procedimientos constan de


dos partes: un nombre de procedimiento y una lista
de parámetros llamados actuales:

Nombreproc (pa1,pa2, pa3,...);

Los parámetros actuales pa1, pa2, pa3, ... deben


tener unos valores que se pasan al procedimiento
nombreproc.

En la declaración de un procedimiento cuando se


incluyen parámetros, éstos se denominan parámetros
formales o ficticios (pf1, pf2, pf3, ...). Ellos sirven
para contener los valores de los parámetros actuales
cuando se invoca el procedimiento.

Procedure nombreproc (pf1, pf2, pf3, ...)

El valor de los parámetros actuales no se conoce


cuando se declara el procedimiento, sin embargo,
cuando se ejecuta la sentencia de llamada al
procedimiento es preciso que tengan valores
asignados, ya que en caso contrario se producirá un
error.

Program Correspondencia;

Uses Wincrt;

Var

X,Y,A,P : real;

Procedure Geometria (Longitud, Anchura : Real; Var


Area, Perimetro : Real);

Begin (* Geometría *)
Area := Longitud * Anchura;

Perimetro := 2 * (Longitud + Anchura)

End;

Begin

WriteLn ('Introducir longitud: ');

Readln (X);

WriteLn ('Introducir anchura: ');

Readln (Y);

Geometria (X,Y,A,P); (* Llamada al


procedimiento *)

WriteLn ('El área es: ', A:6:2);

WriteLn ('El perímetro es: ', P:6:2)

End.

17. Parámetros valor y parámetros


variable
4.2.4.1 Parámetros valor

Son parámetros unidireccionales que se utilizan para


proporcionar información a un procedimiento, pero no
pueden devolver valores. Si la palabra var no aparece
delante del parámetro formal en un procedimiento, la
computadora supone que el parámetro formal es un
parámetro valor. En la llamada al procedimiento el
valor del parámetro actual se pasa a la variable que
represente el parámetro actual. Este valor puede ser
modificado dentro del programa, pero su valor no se
puede devolver al programa o procedimiento
llamante.

4.2.4.2 Parámetros variable

En la declaración de un procedimiento, los nombres


de los parámetros variables están precedidos con la
palabra var. Los parámetros variable se utilizan tanto
para recibir como para transmitir valores entre el
subprograma y el programa llamante. Estos
parámetros pueden actuar como parámetros de salida
o de entrada/salida.

El siguiente ejemplo ilustra la diferencia entre


parámetros valor y variable en Pascal y la
correspondencia entre ellos.

Program EjemploParametros;

Uses Wincrt;

Var

A,B,C : Integer;

Procedure Imprimir (D, E, F : Integer);

Begin

WriteLn ('A = ', D:1, ' ':5,'B = ', E:1,' ':5,'C =


', F:1)

End;

Procedure Pasar (D,E : Integer; Var F : Integer);

Begin

Writeln ('Entrada al procedimiento Pasar');

Imprimir (D, E, F);


F := D * E;

WriteLn ('Salida del procedimiento Pasar');

Imprimir (D, E, F)

End;

Begin

A := 2;

B := 3;

C := 4;

WriteLn ('Antes de llamar al procedimiento


Pasar');

Imprimir (A, B, C);

Pasar(A, B, C);

WriteLn ('Después de llamar al procedimiento


Pasar');

Imprimir (A, B, C);

End.

La salida de este programa es:

Antes de llamar al procedimiento Pasar

a=2 b=3 c=4

Entrada al procedimiento Pasar

a=2 b=3 c=4

Salida del procedimiento Pasar


a=2 b=3 c=6

Después del retorno del procedimiento Pasar

a=2 b=3 c=6

18. Subprogramas: Funciones y


Procedimientos
4.2 Paso de parámetros (repaso...)

4.2.1 Ejemplo

En este ejemplo los parámetros formales a y b


recibe, cuando son llamados, los valores contenidos
en los parámetros actuales de x e y.

Program Calculo;

Uses wincrt;

Var

x,y : real;

Procedure mayor (a,b : real);

Var

max : real;

Begin

if a > b then

max := a

else

max := b;
writeln ('El mayor de los dos números es
',max:4:2);

End;

Begin

repeat

write ('Introduzca dos números ');

readln (x,y);

mayor (x,y)

until x = 0

End.

4.2.2 Ejemplo

El siguiente ejemplo muestra un intercambio de


valores de dos variables con un procedimiento.

Program Intercambio;

Uses wincrt;

Var

x,y : real;

resp : char;

Procedure cambio (var a,b : real);

Var

aux : real;

Begin
aux := a;

a := b;

b := aux;

writeln ('Ahora el valor de a es ',a:5:2,' y el valor


de b es ',b:5:2);

End;

Begin

repeat

clrscr;

write ('Introduzca el valor para x ');

readln (x);

write ('Introduzca el valor para y ');

readln (y);

cambio(x,y);

writeln;

write ('Desea continuar (S/N)?');

readln (resp);

until (resp = 'N') or (resp = 'n')

End.

19. Funciones en Turbo Pascal


Una función es un subprograma que recibe como
argumentos o parámetros datos de un tipo numérico
o no numérico (char, string, bolean u otros) y
devuelve un resultado. Esta característica le
diferencia de un procedimiento.

El pseudocódigo es el siguiente:

Nombre_función (argumento1,argumento2,...);

Los argumentos es lo que se conoce en Pascal como


parámetros. Para poder calcular el valor o resultado
de la función, todo lo que se necesita conocer es el
valor o valores de los parámetros respectivos.

4.3.1 Funciones aritméticas o matemáticas

4.3.2 Funciones definidas por el usuario

Además de las funciones predefinidas citadas


anteriormente, es posible que el usuario pueda
declarar sus propias funciones de igual modo que
declara sus procedimientos.

Una función es un subprograma que devuelve un


único resultado al programa o subprograma que le
llamó. La sintaxis es muy similar a la de un
procedimiento.

Function nombre (parámetros): tipo

(declaración de variables locales)

begin
<cuerpo de la función>

nombre de la función := valor de la función

end;

Comparación entre funciones y procedimientos

En vez de la palabra procedure se debe utilizar la


palabra function

Al igual que en los procedimientos, el nombre de una


función es un identificador. Sin embargo, el nombre
de la función se refiere a la posición de memoria que
contiene el valor devuelto por la función.

La lista de los parámetros formales son los


identificadores utilizados para recibir valores del
programa.

El tipo de datos del resultado coincide con el tipo


expresado en la cabecera de la función.

En el cuerpo de la función tiene que existir una


sentencia de asignación como la siguiente:

Nombre_función := valor_función

La función sólo devuelve un valor, el procedimiento


puede devolver cero, uno o varios valores.

El tipo de dato del resultado de la función debe estar


indicado en la cabecera y puede ser tipo char,
integer, real o bolean.

Ejemplo:

Program Cubo;

Uses
Wincrt;

Var

Num,valor : integer;

Function El_cubo (Numero: integer):integer;

Begin

valor := Num*Num*Num;

End;

Begin

Write ('Digite un número entero: ');

Readln (Num);

El_cubo(Num);

Write ('El cubo de ',Num,' es ',valor);

End.

20. Práctica general


1. Hacer un programa que calcule lea el Id. del
empleado, el nombre del empleado y el salario bruto.

Debe utilizar un procedimiento de cálculo tomando


como parámetro el salario bruto (utilice una variable
diferente al del programa principal). Finalmente, debe
calcular la deducción de la Caja y del Banco Popular
y el salario neto.

La salida del programa debe ser la siguiente:

El empleado (nombre), cédula No.


(id_empleado), obtuvo un salario neto de...
Sus deducciones suman ....

Hacer un programa de funciones aritméticas que lea


un número real y mediante un menú y utilizando
procedimientos para cada función calcule:

- El seno de ese número

- El cuadrado de ese número

- La raíz cuadrada de ese número

- La parte decimal del número

- La parte entera del número

Diseñe un programa que mediante una función


calcule la suma de los números que están en un
rango establecido. (Por ejemplo de 1 a 100). Pruebe
con varios rangos.

Escribir un programa que, mediante una función


devuelva el valor del día de la semana en respuesta a
la entrada de la letra inicial de dicho día.

Mediante una función, determinar el número de días


de un mes dado.

Escriba un programa que mediante una función


determine si un número es primo.

21. Respuestas
Respuesta No 1.

Program Salario;

Uses wincrt;

Var
id_empleado,i,n : integer;

nom_empleado : string [40];

sal_bruto,salario_neto,tod_ded: real;

resp : char;

Procedure calcula (var sal_brut : real);

Var

cc_ss,b_p : real;

Begin

cc_ss := sal_brut * 0.08;

b_p := sal_brut * 0.01;

tod_ded := cc_ss + b_p;

salario_neto := sal_brut - tod_ded

End;

Begin

i:=1;

Write ('Digite el número de empleados a


procesar: ');

readln (n);

While i <= n do

begin

clrscr;

write ('Id. del empleado ',i,' de ',n,' : ');


readln (id_empleado);

write ('Nombre: ');

readln (nom_empleado);

write ('Salario bruto: ');

readln (sal_bruto);

writeln;

calcula(sal_bruto);

writeln;

writeln ('El salario neto de ',nom_empleado,' es


',salario_neto:10:2);

writeln ('Sus deducciones fueron


',tod_ded:10:2);

writeln;

writeln ('Presione enter para continuar...');

readln;

i := i+1;

end;

End.
Respuesta No. 3.

Program sumas;

Uses wincrt;

Var i,n:integer;

Function Sumar (N : integer) : integer;


Var suma : integer;

Begin

Suma := 0;

For i:= 1 to N do

suma := suma + i;

Sumar := Suma;

Write ('La suma de los números del 1',' al ',n, ' es:
',suma);

Readln;

End;

Begin

Write ('Digite el número máximo: ');

Readln (N);

Sumar (N);

End.

Respuesta No. 6.

Program TestPrimos;

Uses Wincrt;

Var

N : integer;

Function Primo (Q : integer) : boolean;

Var
D : integer;

P : boolean;

Begin

If Q < 4 then

Primo := True

Else

Begin

P:= True;

D := 2;

While P and (D<=Q div 2) do

Begin

P := Q mod D <> 0;

D := D + 1

End;

Primo := P

End

End;

Begin

Writeln ('Introduzca un entero positivo o cero


para terminar: ');

Readln (N);

While N > 0 do
Begin

If Primo (N) then

Writeln (N,' es primo')

Else

Writeln (N,' no es primo');

Writeln ('Introduzca otro


entero');

Readln (N);

End;

Writeln

End.

"AÚN EN LA ADVERSIDAD, PUEDES MANEJAR


TUS PROPIAS CONDICIONES CON GARRA Y
FORTALEZA. HAZLO CON LA CONVICCIÓN FIRME
DEL LEÓN Y CON LA ELEGANCIA DEL ÁGUILA EN
LAS ALTURAS.

22. Arreglos
Introducción

Primero que todo, es importante conocer el concepto


de estructura de datos. Una estructura de datos es
"una colección de datos organizados de un modo
particular." Las estructuras de datos pueden ser de
dos tipos: estáticas y dinámicas.

Las estructuras de datos estáticas son aquellas a las


que se le asigna una cantidad fija de memoria cuando
se declara la variable. Las estructuras de
datos dinámicas son aquellas cuya ocupación de
memoria puede aumentar o disminuir durante el
tiempo de ejecución. Entre las estructuras de datos
estáticas podemos encontrar los vectores y los
arreglos, tema que estudiaremos a continuación.

5.0 Concepto

Un array (se suele traducir como arreglo) es una


estructura de datos en la que se almacena una
colección de datos del mismo tipo, por ejemplo, los
salarios de los empleados de una empresa.

Un array es una lista de un número determinado de


elementos del mismo tipo. Se caracteriza por:
- Almacenar los elementos del array en
posiciones de memoria continua.

- Tener un único nombre de variable (por


ejemplo salarios) que represente a todos los
elementos. Éstos a su vez se diferencian por un índice
o subíndice.

- Se puede accesar directa o aleatoriamente los


elementos del array.

23. Arrays unidimensionales: Los


vectores
Un array de una dimensión (unidimensional), también
llamado vectoro fila, es un tipo de datos estructurado
compuesto de un número determinado de elementos,
de tamaño fijo y elementos homogéneos (del mismo
tipo). La característica de tamaño fijo se refiere a que
el tamaño del array debe ser conocido en tiempo de
compilación.
Por ejemplo, si deseamos conservar las puntuaciones
de los 50 estudiantes de un examen de informática,
se necesita reservar cincuenta posiciones de
memoria, dar un nombre al arreglo y a cada uno de
los 50 estudiantes asignarles una posición o índice del
arreglo.

5.1.1 Declaración de un array o vector

Siempre se deben declarar luego de las constantes (si


existen). Un array o vector se declara por medio del
tipo de array. La sintaxis es la siguiente:

Type

Nombre_array = array [rango del


subíndice] of tipo;

Nombre_array: Se refiere a un nombre de


identificador válido.
Tipo_subíndice: Puede ser boolean, char o un rango
de tipo enumerado.

Tipo: Se refiere al tipo de los elementos del vector.


Todos los elementos deben ser del mismo tipo.

Ejemplos:

Type

X = array [1..8] of real;

Type

Luces = (Rojo, Verde, Ámbar);

Type

DiasDeSemana=(Lunes, Martes, Miércoles, Jueves,


Viernes, Sabado, Domingo);

ConjuntoDias = array

Type

Salarios = array [A..Z] of real;

(En este caso es de tipo real porque el salario es de


ese tipo. El subíndice indica que los salarios van de
los empleados cuya inicial es A hasta la Z).

Las declaraciones de tipo array no crea ninguna


variable específica de tipo array, sino que proporciona
información del array como un todo.

Para declarar una variable tipo array, se utiliza la


siguiente sintaxis:

Type

Valores = array [1..10] of real;


Var

Precios : Valores;

Primeramente se crea el tipo del array y luego se


declara la o las variables referenciadas al array.

Otro ejemplo de aplicación puede ser el siguiente:

Const

Max = 500;

Type

Texto = array [1..Max] of char;

Var

Palabras, Letras: Texto;

En este ejemplo se crean dos variables arrays:


Palabras y Letras. Las posiciones del array van de 1 a
500 y contendrán un valor tipo caracter.

5.1.2 Lectura y escritura de un vector

5.1.2.1 Lectura

Para leer un vector se debe hacer elemento a


elemento y se requiere de alguna estructura
repetitiva, ya sea un while, repeat o for.

Ejemplos:

I := 1; I :=
1; For I:= 1 to n do

While I <= 100 do


Repeat Readln(Notas[I]);
Begin Read
(Notas[I]);

Read (Notas [I]); I :=


I+1

I := I+1 Until I >


100

End;

5.1.2.1 Escritura

Para visualizar un vector, igualmente, es necesario


situarlo dentro de una estructura repetitiva.

For I := 1 to Numero do

Writeln (Notas [I]:3);

Writeln; (* Evita que todas las salidas del vector


aparezca en la misma línea *)

24. Arrays bidimensionales: Tablas o


matrices
Un array bidimensional (también llamado tabla o
matriz) es un array con dos índices. Al igual que los
vectores deben ser ordinales. Se declaran de igual
manera que los arrays de una dimensión.

5.2.1 Declaración de un array bidimensional

Al igual que en los arrays unidimensionales o


vectores, se crean con declaraciones type y var y
deben ser de tipo ordinales o subrango. Se deben
indicar:

- El nombre del array


- Tipo del array

- Rango permitido

Ejemplo:

Type

Tabla = array [1..25,1..4] of real;

Var

Grados : Tabla;

Para localizar o almacenar un valor en el array se


deben especificar dos posiciones o subíndices, uno
para la fila y otro para la columna.

5.2.2 Escritura de una matriz

Para escribir un vector, se debe hacer referencia


tanto a la fila como a la columna. Así:

For fila := 1 to 3 do

Begin

For Columna := 1 to 4 do

Write (A[Fila, Columna]:4);

End;

Ejemplo:

Calcular el promedio de cada estudiante de una lista


de veinticinco alumnos de una clase de informática
con notas en cuatro asignaturas.

Program Promedio;
Var

Notas : Array [1..25,1..4] of real;

I,J : Integer;

Suma,Prom: Real;

Begin

For I := 1 to 25 do

Begin

Write (`Notas del estudiante: ´,I:1);

Writeln (`En una misma línea digite todas


las notas´);

Suma := 0;

For J := 1 to 4 do

Begin

Read (Notas[I,J]);

Suma := Suma + Notas[I,J]

End;

Readln;

Prom := Suma/4;

Writeln (`La nota promedio del estudiante


`,I:1,´ es `,Prom:1:1)

End

End.
25. Práctica
Escriba un programa que almacene en un vector los
días de la semana.

Escriba un programa que almacene en un vector su


nombre.

Escriba un programa que almacene en un vector los


números pares del 1 al 10.

Escriba un programa que lea diez números enteros y


los invierta.

Escriba un programa que lea las dimensiones de una


matriz, las lea, visualice la matriz y que encuentre el
menor y mayor elemento de esa matriz y sus
posiciones.

Escriba un programa que encripte un password de


siete letras debe contener consonantes y vocales. El
algoritmo de encriptación será sustituir cada vocal por
el número que le corresponde. (A=1,
E=2,O=3,I=4,U=5).

Escribir un programa que en una matriz almacene los


números primos del 1 al 100.

Escriba un programa que capture e imprima la


siguiente tabla:

Distrito Candidato A Candidato


B Candidato C

1 194
48 206

2 180
20 320
3 221
90 821

4 432
50 946

Escriba un programa que almacene en una matriz los


números pares del 1 al 40 y los imprima.

" CUANDO EL DOLOR LLEGUE A TU VIDA PARA


AGOBIARTE, NO TE DES POR VENCIDO. LA
AFLICCIÓN TE HACE MÁS HOMBRE O MÁS
MUJER, SI LA SABES VENCER CON
DIGNIDAD. TE SANTIFICA. TE MADURA. TE
ENGRANDECE."

26. Cadenas (“Strings”)


6.1 Definición

Pascal, como cualquier otro lenguaje, debe tener la


capacidad de procesar frases como "Presione ENTER
para continuar", "Calculando...", "Proceso terminado",
etc.

Los datos tipo char y string permiten la manipulación


de datos no numéricos.

Una cadena de caracteres o string es una serie de


caracteres cuya longitud (número de caracteres que
contiene) puede variar de 1 hasta 255 caracteres.
Turbo Pascal tiene el tipo de dato string que almacena
información de texto. Este dato se puede almacenar
en constantes y en variables de cadena. Una variable
de cadena está declarada para la palabra string
seguida de la longitud máxima de la cadena
encerrada entre corchetes.

6.1.1 Declaración de una variable tipo string


Las variables de cadena se pueden declarar las de
cualquier otro tipo, ya sea en la sección var o
en type.

Si se declara como var, se hace de la siguiente


manera:

Var

Mensaje : string [80];

Nombre : string [40];

Si la cadena es declarada como type, haríamos la


declaración así:

Type

Cadena80 = string [80];

Cadena40 = string [40];

Var

Mensaje : Cadena80;

Nombre : Cadena40;

Es importante recordar que si se declara como Type


inmediatamente después, dentro de las variables, se
debe declarar una variable que haga referencia al
Type.

Una vez declaradas las variables de cadena se pueden


realizar asignaciones o bien operaciones de lectura /
escritura en los programas.

Por ejemplo:

Program Ejemplo;
Var

Mensaje = string[40];

Begin

Mensaje := `Hola mis amigos, por favor estudien


bastante´;

Write (`Mi mensaje de hoy para ustedes es:


`),Mensaje;

Writeln;

Write (`Presione enter...´);

Readln

End.

6.1.2 Longitud de una cadena

Una cadena físicamente es una estructura de una


secuencia de 0 hasta 255 caracteres de longitud. Sin
embargo, la ocupación en memoria de una cadena es
un número de bytes igual al de caracteres de la
cadena más uno. Así la cadena:

`Programador´

tiene una longitud de 11 caracteres, entonces


ocupará en memoria 12 bytes. Esto se debe a que el
primer byte en una cadena, contiene la longitud de la
cadena actualmente almacenada en memoria.

Supongamos que esta palabra corresponde a un dato


almacenado en la variable PUESTO que fue definida
de la siguiente manera:
Var

Puesto : String[20];

Sucede que, entonces, la longitud lógica de la


variable será de 11 bytes pero la longitud física será
de 20 bytes pues así fue definida.

6.1.3 Asignación de cadenas

A las variables de cadena, como se ha visto, se


pueden dar valores con una sentencia de asignación o
con una sentencia de lectura (read). Ambas
situaciones se pueden describir con la ecuación:

Destino fuente

Donde destino es la cadena a la que se da un valor y


fuente es la expresión de cadena que contiene el
correspondiente valor. Esta ecuación actúa como la
sentencia de asignación que evalúa la cadena fuente
y se almacena en la variable de la cadena destino.

Dependiendo del tamaño (longitud de la cadena) de


las cadenas fuente y destino se pueden presentar tres
casos diferentes que analizaremos a partir de la
siguiente declaración de variables de cadena.

Var

Cad1 : String [8];

Cad2 : String [11];

Cad3 : String [15];

Cad4 : String [11];

6.1.3.1 Caso I. Las longitudes de la cadena destino y


fuente son iguales
Supongamos que se ejecuta la sentencia

Cad2 := `informatica´;

Este caso no presenta problemas, pues cada posición


de cad2 se rellena con un carácter.

Cad2 I N F O R
M A T I C A

1 2 3 4
5 6 7 8 9 10 11

Lo mismo sucede si se ejecuta la sentencia

Cad4 := Cad2;

6.1.3.2 Caso II. La longitud de la cadena destino es


mayor que la cadena fuente

Supongamos que ahora se ejecuta la sentencia

Cad3 := Cad2;

Resultará que Cad3 tiene 15 caracteres y sólo hay 11


caracteres en cad2. La cadena Cad3 seguirá teniendo
una longitud máxima de 15 caracteres, pero sólo se
almacenan en ella ahora 11 caracteres y su longitud
actual será de 11.

Cad3 I NFORM ATI C


A longitud actual = 11

1 2 3 4 5 6 7 8 9 10 11 12 13
14 15 longitud máxima = 15

6.1.3.3 Caso II. La longitud de la cadena destino es


mayor que la cadena fuente

Supongamos que se trata de ejecutar ahora


Cad1 := Cad2;

En este caso, como Cad1 tiene una longitud de ocho


caracteres, la cadena destino no se puede almacenar
totalmente. En este caso se trunca la cadena destino
y se almacenan en Cad1 los primeros ocho caracteres
(de izquierda a derecha) de Cad2.

Cad1 I NFORM AT
longitud actual =
11

123 4 56 78
longitud máxima
=8

27. Operaciones con strings


Las operaciones básicas con strings
son: asignación, comparación yconcatenación.

6.2.1 Asignación

Es posible asignar una cadena a otra cadena, incluso


aunque esta última sea de longitud física más
pequeña. En este caso, no se produce ningún error en
tiempo de compilación ni en tiempo de ejecución. Se
producirá un truncamiento de los datos de la cadena
mayor a la longitud física máxima de la cadena más
pequeña.

Ejemplo:

Var

Cad1 : string[15];

Begin

Cad1 := `Hola Margarita, cómo estás?´


End.

En este caso se asignará a Cad1 la cadena `Hola


Margarita,´. Se producirá un truncamiento de los
datos de la cadena mayor a la longitud física máxima
de la cadena más pequeña.

6.2.2 Comparaciones

Las comparaciones de cadenas de caracteres se


hacen según el orden de los caracteres en el código
ASCII y con los operadores de relación.

`0´ < `1´ `1´ < `2´


`8´ < `9´

`A´ < `B´ `C´ < `D´ `M


´ > `B´

`a´ < `h´ `m´ > `b´


`p´ < `r´

6.2.3 Concatenación

Otra operación básica que se pueda realizar con


cadenas es la concatenación. La operación de
concatenación. La concatenación es el proceso de
combinar dos o más cadenas en una sola cadena.
Turbo Pascal proporciona dos métodos independientes
para realizar la concatenación.

a. Mediante el operador de concatenación (+)

Frase := `Perro que ladra´ + `no muerde, ´ +


´mientras esté ladrando´

produciría una sola cadena almacenada en la


variable Frase:
`Perro que ladra no muerde, mientras esté
ladrando´

b. Mediante la función concat

Program union;

Var

Cad1,Cad2,Cad3 : string [40];

Begin

Cad1 := `Programa´;

Cad2 := ` de computadora´;

Cad3 := Concat (Cad1,Cad2);

Write (`La frase completa es `,Cad3);

End.

6.2.4 Otras funciones y procedimientos con cadenas

Las cadenas permiten otras operaciones como las


siguientes:

- Función Lenght : Proporciona la longitud lógica


de una cadena de caracteres y devuelve un valor
entero. La sintaxis es:

Lenght (cadena)

Ejemplo:

Lenght (`Esto es una prueba´);

Esta instrucción devolvería el valor de 16.


- Función Delete : Borra o elimina una
subcadena de una cadena. Una subcadena es una
cadena contenida dentro de otra de mayor longitud.
La sintaxis es:

Delete (cadena,posición,número)

Cadena : Representa la cadena


original o fuente

Posición : Representa la posición del


primer carácter a suprimir

Número: Es la cantidad de caracteres que se borrarán


(debe ser un valor entero)

- Función Insert: Inserta una subcadena en una


cadena. La sintaxis es la siguiente:

Insert (Cad1,cadena,posición)

Cad1: Cadena a insertar

Cadena : Cadena donde se insertará

Posición: Carácter a partir del cual se


insertará Cad1

Si una vez insertada la nueva cadena el tamaño total


excede al límite de la variable, se truncará la cadena
hasta su longitud máxima.

- Función Pos (Posición): Esta función permite


determinar si una cadena está contenida en otra. En
este caso, la función devuelve la posición donde
comienza la cadena buscada en la cadena fuente. Si
la cadena no existe, se devuelve un resultado de 0.
Utiliza la siguiente sintaxis:
Pos (Cadena buscada, Cadena
fuente)

- Función Copy (Copiar): Esta función devuelve


una cadena de caracteres (subcadena) extraída de
una cadena.

Copy (Cadena,Posición, Número)

Cadena : Expresión tipo cadena


(fuente)

Posición : Primer caracter a extraer


(tipo entero)

Número : Total de caracteres a


extraer (tipo entero)

Si la posición es mayor que la longitud de "Cadena",


se devuelve una cadena vacía; si el número especifica
más caracteres que los indicados desde posición, sólo
se devuelve el resto de la cadena.

Ejemplo:

Ch := `Esto es una cadena muy larga´;

Ch2 := Copy (Ch,1,18);

Write (Ch2)

Esto produciría la cadena `Esto es una cadena´.

- Función de conversión a mayúsculas (Upcase)

La función Upcase toma un argumento de tipo char y


devuelve la correspondiente equivalencia de la
expresión en mayúscula. Si la expresión ya está en
mayúscula o no tiene ningún carácter equivalente en
mayúscula, se devuelve el carácter sin modificar.
Sintaxis: Upcase (Letra)

Letra es de tipo char. Por ejemplo: Upcase (`a´)


devuelve `A´.

- Acceso a posiciones individuales en una


cadena

Como las cadenas son arrays, se puede acceder a sus


elementos en forma individual. Ejemplo:

Nombre := ´Picapiedra´

Entonces:

Nombre[1] P

Nombre[2] i

Nombre[3] c

Nombre[4] a

Nombre[5] p

Nombre[6] i

Nombre[7] e

Nombre[8] d

Nombre[9] r

Nombre[10] a

28. Práctica para el examen


1. Escriba un programa que almacene en una
cadena su nombre y lo invierta.
2. Escriba un programa que almacene en un
vector los números pares del 1 al 10.

3. Escribir un programa que en una matriz


almacene los números primos del 1 al 100 y que al
final del programa, en una variable proporcione la
suma.

4. Escriba un programa que lea diez números


enteros y los invierta.

5. Escriba un programa que cuente las vocales de


una palabra.

6. Escriba un programa que lea una cadena de


caracteres en minúscula y la convierta a mayúscula.
Utilice procedimientos.

7. Escriba un programa para almacenar la


siguiente tabla, que cuente los votos e imprima el
candidato ganador.

Distrito Candidato A Candidato


B Candidato C

1 194
48 206

2 180
20 320

3 221
90 140

4 432
50 821

8. Hacer un programa que lea una cadena de


caracteres, que imprima la longitud de la cadena y
contar el número de vocales que tiene la palabra o
frase.

29. Punteros
Introducción

Como vimos anteriormente en la lección número 5,


las estructuras de datos dinámicas son aquellas cuya
ocupación de memoria puede aumentar o disminuir
durante el tiempo de ejecución. Mediante los
punteros, tema que estudiaremos a continuación,
podemos crear estructuras de datos dinámicas que
tienen capacidad de variar en tamaño y ocupar tanta
memoria como realmente requieran. Estas
estructuras son llamadas punteros.

7.1 Concepto

Los punteros son también llamados apuntadores. Son


tipos de datos que permiten crear estructuras de
datos dinámicas, las cuales pueden variar en tamaño
y memoria requerida. Las variables que se crean y se
destruyen durante la ejecución se llaman variables
dinámicas o anónimas. Así, durante la ejecución de
un programa, puede haber una posición de memoria
específica asociada con una variable dinámica y
posteriormente puede no existir ninguna posición de
memoria asociada con ella.

Una estructura de datos dinámica es una colección de


elementos llamados nodos de la estructura -
normalmente tipo registro- que se enlazan o
encadenan juntos. Este enlace se establece asociando
con cada nodo un puntero que apunta al nodo
siguiente de la estructura.
Las estructuras de datos dinámicas son útiles para
almacenar y procesar conjuntos de datos cuyos
tamaños cambian durante la ejecución del programa,
por ejemplo, el conjunto de trabajos que se han
introducido en una computadora y están esperando
su ejecución o el conjunto de nombres de pasajeros y
asignación o el conjunto de nombres de pasajeros y
asignación respectiva de asientos de un vuelo de
avión determinado.

Pascal proporciona los métodos para asignar y liberar


espacio de memoria utilizando punteros y los
procedimientos new y dispose.

El tipo de datos puntero es de tipo simple pues no se


puede romper en otros componentes más pequeños,
como sí sucede con el array o el registro.
Los punteros son variables que se utilizan para
almacenar la dirección de memoria de otra variable.
Las variables que se utilizan para almacenar
direcciones son llamadas variables puntero o
simplemente puntero.

Gráficamente se representa así

Al definir un puntero se debe indicar el tipo de valores


que se almacenarán en las posiciones designadas por
los punteros. Esto se debe a que los diferentes tipos
de datos requieren distintas cantidades de memoria
para almacenar sus constantes, una variable puntero
puede contener una dirección de una posición de
memoria adecuada sólo para un tipo dado.
Por esta razón se dice que un puntero apunta a una
variable particular, es decir, a otra posición de
memoria.

Una variable tipo puntero contiene la dirección de la


posición de otra variable.

7.1.1 Declaración de punteros

Se puede declarar un puntero a una variable carácter,


a un array de enteros, a un registro, o a cualquier
otro tipo de dato. Y se pueden declarar como Var o
Type.

La sintaxis para la declaración de un puntero es la


siguiente:

Var

Nombre-variable : ^ identificador - tipo

Ejemplo:

Var

Ptr : ^Real

La variable Ptr apunta a un tipo de


dato TipoElemento.

Un ejemplo gráfico es el siguiente, donde la variable P


contiene 059164 que es la dirección de memoria
donde está la variable entera apuntada 345:

30. Operaciones con punteros


Como se dijo anteriormente, los punteros se crean
con las declaraciones:

Type

PuntX = ^Real;

Var

P : PuntX;

P es una variable puntero de tipo PuntX que apunta a


posiciones que contienen valores de tipo real. La
posición de memoria designada por el valor de la
variable puntero P se representa por P^. Se pueden
asignar valores a P^ y utilizar valores de P^ en
expresiones tal como cualquier otra variable. Si P
apunta a posiciones que contiene reales, P^ es una
variable real.

Ejemplo:

P^ := 1000 El valor de P^ es 1000

3 * P^ + 500 El valor de P^ es 3500

Sin embargo, estas operaciones no se pueden realizar


directamente luego de la declaración, debido a que el
objeto o dirección P^ no existe. Antes de que un
programa utilice un puntero, se requiere abrir espacio
para el tipo de datos objeto de la dirección del
puntero. Para iniciar un puntero se debe utilizar el
procedimiento NEW.

7.2.1 New

La declaración de un puntero P no crea una celda de


memoria para apuntar a ella. El procedimiento
(sentencia) New se utiliza para crear la celda de
memoria P; es decir, el procedimiento New crea una
variable dinámica y establece que una variable
puntero apunte a ella.

Sintaxis:

New (P)

P representa la variable puntero.

La sentencia New (P); llama al procedimiento New


que asigna almacenamiento para un valor
determinado y sitúa la dirección de esta celda de
memoria en la variable puntero P. Una vez que se
asigna almacenamiento para un valor de tipo
determinado al que está apuntando P, se puede
almacenar un valor en esa celda de memoria y
manipularlo.

Ejemplo:

New (Ptr);

Ptr^ := `Mckenna´;

La sentencia New (Ptr) crea una celda vacía de


memoria a la que apunta Ptr. La segunda sentencia
sitúa el valor `Mckenna´ en esa celda de memoria.

Gráficamente se representaría así:

7.2.2 Dispose

El procedimiento Dispose libera la posición de


memoria ocupada por una variable dinámica.

Sintaxis:
Dispose (P) (* P es una variable tipo puntero *)

Gráficamente se representa así:

Dispose destruye la variable referenciada por P y


devuelve su zona de memoria

7.2.2.1 Constante nil

Pascal proporciona una constante predefinida, nil


(nulo. La constantenil se utiliza para dar un valor a
una variable puntero que no apunta a ninguna
posición, nil puede ser asignad a un puntero de
cualquier tipo.

P:= nil;

P:=5

Ejemplo:

Var

P,Q : ^Integer;

Begin

New (P);

P^ :=8;

Q^ :=P;

Q^ :=5;

Dispose (P)
End.

7.2.3 Assigned

Determina si un puntero o variable de tipo


procedimiento es nil. Especifica si el argumento es nil
o e el argumento tiene un valor. Su sintaxis es:

Function Assigned (Var P) : Bolean;

P debe ser una referencia de un puntero o tipo


procedimiento. La función devuelve verdadero (true)
si P no es nil o falso (false) si es nil. Una posible
aplicación puede ser la siguiente:

Var P : Pointer;

Begin

P : nil;

If Assigned (P) then

Writeln (`Prueba Uno´);

P := @P;

If Assigned (P) then

Writeln (`Prueba Dos´);

End.

La llamada Assigned(P) correspondiente a la


evaluación de P <> nil para una variable puntero,
mientras @P <> nil se corresponde a una variable por
procedimiento.

31. Archivos y registros


Concepto de registro
Un registro (record) es un tipo de datos estructurado
(denominado dato record) que consta de un conjunto
de elementos que pueden ser del mismo tipo o de
tipos diferentes.

Los componentes de un registro se


denominan campos. Cada campo tiene un nombre
llamado identificador de campo, que es algún
identificador elegido por el programador cuando se
declara el tipo de registro y un tipo que se especifica
cuando se declara el tipo de datorecord.

32. Declaración de datos tipo registro


La sintaxis para declarar un registro es la siguiente:

Type

Nombre_reg = record

Lista id1 : Tipo1;

Lista id2 : Tipo2;

Lista id3 : Tipo3;

Lista idN : TipoN;

End;

Nombre_reg: Nombre de la estructura o registro.

Lista id: Lista de uno o más nombres de campos que


componen el registro.
Tipo: Puede ser cualquier tipo de dato estándar o
definido por el usuario.

Un registro se suele representar gráficamente en


función de sus campos:

Empleado

Tipo cadena Tipo Entero Tipo cadena Tipo real

Ejemplo:

Type

Empleado = record

Nombre : String[30];

Edad : Integer;

Domicilio : String[40];

Salario : Real;

End;

33. Manipulación de datos tipo registro


8.2.1 Acceso a los campos de un registro

Se puede acceder a cada campo de un registro


directamente utilizando un designador o selector de
campo de la forma:

NombreReg.NombreCampo

Los datos mostrados anteriormente en Empleado


mediante una secuencia de sentencias de
asignación:
Empleado.Nombre := `Chi-ki-tico´;

Empleado.Edad := 34;

Empleado.Domicilio := `Calle El Último Grito


´;

Empleado.Salario := 245320;

Una vez que los datos están almacenados en un


registro, se pueden manipular de igual forma que
otros datos en memoria.

Write (Empleado.Nombre); (* Visualiza Chi-


ki-tico *)

8.2.2 Operaciones sobre registros

Los procedimientos de lectura y escritura permiten


únicamente números caracteres o cadenas. Un
registro al ser una estructura compuesta (distintos
tipos de datos) es preciso efectuar las operaciones de
lectura y escritura individualmente.

Otra operación que se puede realizar entre registros


es la asignación (copia del contenido de un registro
en otro del mismo tipo). Si A y D son variables
registro del mismo tipo, la sentencia:

A := D

copia todos los valores asociados con el registro D al


registro A.

Ejemplo:

Type

Stock = record
Numeros : Integer;

Nombre : String[20];

Precio : Real;

end;

Var

Articulo : Stock

8.2.3 La sentencia WITH

La tarea de escribir el selector de campo completo


cada vez que se referencia un campo de un registro
es tediosa, sobre todo si el números es grande. La
sentencia WITH permite referenciar el nombre del
registro en su cabecera y posteriormente para llamar
a algún campo sólo se necesita el nombre del campo
y no el selector de campo completo, con el nombre
del registro (por ejemplo, Edad en vez de
Cliente.Edad).

Sintaxis:

With Camporegistro do

Begin

(* Sentencias que hacen referencia a campos


de Camporegistro *)

End;

Camporegistro: Nombre o nombres de registros.

Sentencias: Relacionadas con los campos.

Ejemplo:
Program Ejemplo;

Type

Empleado = record

Nombre : String [20];

Edad : Integer;

Empresa : String [30];

End;

Var

Socio : Empleado;

Deducciones : Real;

Begin

With Socio do

Begin

Readln (Nombre);

Neto := Salario - Deducciones;

Writeln (Empresa);

End;

End.

34. Archivos tipificados o aleatorios


Son archivos que pueden contener datos tipo integer,
real o record. Para declarar un archivo se procede de
la siguiente manera:
Type

Nombrearchivo = file oftipo de datos

Ejemplo:

Type

Nombres = file of string[60];

Var

Nom: Nombres;

8.3.1 Creación de un archivo tipificado

Para crear un archivo se utilizan las


sentencias Assign la cual crea el archivo
y Rewrite para abrir el archivo.

La sintaxis es la siguiente:

Assign (f,nombre);

f: Nombre interno del archivo dentro del programa.

nombre: Nombre externo con el que se conoce al


archivo por el sistema operativo.

La operación Assign establece una correspondencia


entre la variable tipo archivo con un archivo externo
situado en disco.

8.3.1 Apertura de un archivo

Luego de haber sido asignado, el archivo debe ser


abierto. Esta operación se realiza por medio de uno
de los dos procedimientos
predefinidos: rewrite y reset.

8.3.1.1 Reset
Abre un nuevo archivo existente para una operación
de lectura. Si se intenta llamar a Reset y el archivo
especificado no existe, se producirá un error de E/S
(entrada/salida).

Sintaxis:

Reset (NombreArch);

8.3.1.2 Rewrite

Crea y abre un nuevo archivo. Si el archivo ya


existe, Rewrite borra su contenido; en caso contrario,
el archivo queda abierto para una operación de
escritura.

Sintaxis:

Rewrite (f);

Existen algunos aspectos importantes que se deben


tomar en cuenta al utilizar la sentencia Rewrite:

- Si al abrir el archivo de texto, con assign y


reset, ya existe en el disco, la sentencia Rewrite lo
rescribirá, en otras palabras, "se perderT el archivo
contiguo.

- Por el contrario, las


sentencias assign y rewrite suponen la existencia del
archivo llamado en el disco. Si este archivo no existe,
las sentencias anteriores producirán errores de
ejecución.

El siguiente programa define un tipo registro (cliente)


y a continuación rellena (pone valores en los campos)
en la variable correspondiente. Otra variable del
mismo tipo se asigna a la primera variable y los
campos de la segunda variable se imprimen uno a
uno.

Program Visualiza_Registros;

Type

Datos = record

Nombre : String [80];

Direccion : String [80];

Edad : Integer;

Saldo : Real

End;

Var

Aux, Cliente : Datos;

Begin

Write (`Digite el nombre del cliente: `);

Readln (Cliente.Nombre);

Cliente.Dirección := `Calle El Último Grito´;

Write (`Digite la edad del cliente: `);

Readln (Cliente.Edad);

Cliente.Saldo := 245320;

Aux := Cliente; (* Transfiere los datos al registro


Aux *)

(* Visualización de los campos de Aux *)


Writeln (`Nombre: `, Aux.Nombre);

Writeln (`Dirección: `, Aux.Direccion);

Writeln (`Edad: `, Aux.Edad:1);

Writeln (`Saldo: `, Aux.Saldo:1:1);

End.

Este método de lectura/escritura campo a campo es


engorroso. Pascal proporciona la sentencia with que
facilitará el proceso de lectura/escritura de los
registros.

8.3.2 - 8.3.3 Manipulación de archivos tipificados y


funciones

8.3.2.1 Escritura de un archivo

Una vez que se ha abierto el archivo para escritura,


las sentenciaswrite y writeln sirven para escribir datos
en el nuevo archivo.

Sintaxis:

Write (f,v1,v2,...);

f es una variable tipo archivo.

v1,v2,... son variables del tipo de datos.

Ejemplos:

1. Write (demo,´Esto es una prueba de escritura´);

Writeln (demo,´y esta es la siguiente prueba´);

2. Var NombreArch : string[60];

archtex : text;
...

...

Write (`Nombre de archivo´);

Readln (NombreArch);

Assign (Archtex,NombreArch);

Reset (Archtex);

8.3.2.2 Lectura de un archivo

La lectura de un archivo se efectúa mediante las


sentencias read oreadln.

Sintaxis:

Read (f,v1,v2,...);

f es una variable tipo archivo.

v1,v2,... son variables del tipo de datos.

Ejemplo:

Var

Horas : Real;

Archivo : Text;

Mensaje : string [30];

Begin

Assign (Archivo,´Demo´);

Reset (Archivo);

...
...

Readln (Archivo,Mensaje,Horas);

End.

8.3.2.3 Cierre de un archivo

Para cerrar un archivo se utiliza la siguiente sintaxis:

Close (Nombrearchivo);

35. Archivos de texto


Un archivo de texto es un tipo estándar, como se ha
comentado anteriormente. Consta de una serie de
líneas separadas por una marca de fin de línea (eoln,
"end of line"). La marca de fin de línea se obtiene
pulsando la tecla Enter o bien la combinación de
teclasCTRL M.

8.4.1 Declaración de un archivo texto

El formato general para declarar una variable tipo


text es:

Var

NombreVariable : Text;

Nombrevariable es cualquier nombre válido de


variable.

La longitud de una variable tipo text NO se indica.

8.4.2 Manipulación de archivos de texto

Las operaciones de Assign, Rewrite y Reset se utilizan


de igual forma que en los archivos tipificados.
El procedimiento Append abre un archivo existente
para añadir datos al final del mismo.

La sintaxis es:

Append (f)

8.4.3 Funciones

Algunas funciones son: Append, Read, Readln, Write


y Writeln, Eoln y Eof.

8.4.3.1 Eoln

Devuelve el estado de fin de línea de un archivo. Es


una función tipo lógico.

La sintaxis es:

Eoln (var f: text);

f es una variable de archivo de texto. Para llamar a la


función se procede así:

eoln (f)

Devuelve true si en la posición actual del archivo está


la marca de fin de línea o si eof (f) es true; caso
contrario devuelve false.

8.4.3.2 Eof (End of file)

Devuelve el estado de un archivo de texto. Es de tipo


lógico e indica si el fin de archivo se ha almacenado
mediante true, caso contrario devuelve false. La
sintaxis es la siguiente:

Eof
(var:text);
eoln(f)llamada a la función
Práctica

1. Cree un archivo con sus datos personales:


Cédula, nombre, dirección, teléfono,email.

2. Abra el archivo creado y agréguele cuatro


registros más con otros datos.

3. Cree un archivo de números enteros de 1 a 100,


léalo y visualícelo en pantalla.

" AMA COMO SI NUNCA TE HUBIESEN HERIDO


TRABAJA COMO SI NO NECESITARAS EL DINERO
BAILA COMO SI NADIE TE ESTUVIERA MIRANDO Y
VIVE CADA DÍA COMO SI FUERA EL ÚLTIMO DE TU
VIDA."

36. Unidades en Turbo Pascal


Introducción

9.1.1 Concepto

Una unidad es un conjunto de constantes, tipos de


datos variables, procedimientos y funciones. Cada
unidad es como un programa independiente Pascal o
bien una librería de declaraciones que se pueden
poner en un programa y que permiten que éste se
pueda dividir y compilar independientemente. Una
unidad puede utilizar otras unidades y posee una
parte que puede contener instrucciones de iniciación.

Una unidad contiene uno o más procedimientos,


funciones constantes definidas y a veces otros
elementos. Se puede compilar, probar y depurar una
unidad independientemente de un programa principal.
Una vez que una unidad ha sido compilada y
depurada, no necesita compilarse más veces, Turbo
Pascal se encarga de enlazar la unidad al programa
que utiliza esa unidad, empleando siempre en esta
tarea menor tiempo que en la propia compilación. Los
procedimientos, funciones y constantes que se
definen en una unidad pueden ser utilizados por
cualquier futuro programa que escriba sin tener que
ser declarados en el programa.

Las unidades tienen una estructura similar a los


programas y en consecuencia requieren un formato
estricto, y es preciso declararlas por el usuario como
si se tratara de un programa o subprograma.

Turbo Pascal proporciona siete unidades estándar


para el uso del
programador: System, Graph, DOS, Crt,
Printer, Turbo3 y Graph3. Las cinco primeras sirven
para escribir sus programas y las dos últimas para
mantener compatibilidad con programas y archivos de
datos creados con la versión 3.0 de Turbo Pascal. Las
siete unidades están almacenadas en el
archivo TURBO/.TPL (librería de programas residente
propia del programa Turbo Pascal). La versión 7.0
introdujo dos nuevas unidades WinDos y Strings.

9.1.2 Estructura de una unidad

Una unidad está constituida de cuatro


partes: cabecera de la unidad,sección de interface
(interfaz), sección implementation
(implementación) y sección initialization
(inicialización).

Formato:

Unit <identificador>

Interface

Uses <lista de unidades>; (* opcional *)


(* declaraciones públicas de objetos *)

Implementation

(* declaraciones privadas *)

(* definición de procedimientos y funciones


públicos *)

begin

(* código de inicialización *) (* opcional *)

end

9.1.2.1 Cabecera de la unidad

La cabecera de la unidad comienza con la palabra


reservada unit, seguida por el nombre de la unidad
(identificador válido). Es similar a una cabecera de
programa, donde la palabra reservada unitreemplaza
a la palabra reservada program. Por ejemplo para
crear una unidad denominada MiUnidad se ha de
utilizar la cabecera de la unidad, así:

Unit MiUnidad;

El nombre de la unidad es arbitrario, pero debe


coincidir con el nombre del archivo que contiene. Por
ejemplo, si la unidad se denomina Test

Unit Test;

El archivo que contiene el programa fuente de la


unidad se debe llamar Test.PAS. Cuando turbo Pascal
combina la unidad, le asigna la extensión TPU (Turbo
Pascal Unit). Si el nombre de la unidad es diferente
del nombre del archivo, el programa principal no
podrá encontrar el archivo TPU (Turbo Pascal Unit). Si
el nombre de la unidad es diferente del nombre del
archivo, el programa principal no podrá encontrar el
archivo TPU.

Una unidad creada por el usuario puede utilizar otras


unidades, siempre que se incluyan en la
cláusula uses que aparece inmediatamente después
de la palabra interface, y separadas por comas.

9.1.2.2 Sección de interfaz

La sección de interface (interfaz) es la parte de la


unidad que sirve para conectar dicha unidad con otras
unidades y programas. Esta sección se conoce como
"la parte pública" de la unidad, ya que todos los
objetos que figuren en esta sección son visibles desde
el exterior o exportables. Las restantes unidades y
programas tienen acceso a la información contenida
en la sección de interface.

En la interfaz de la unidad se pueden declarar


constantes, tipos de datos, variables y
procedimientos. Los procedimientos y funciones
visibles a cualquier programa que utilice la unidad se
declaran aquí, pero sus cuerpos, reales -
implementaciones- se encuentran en la sección de
implementación. La sección de interfaz indica a un
programador cuáles procedimientos y funciones se
pueden utilizar en un programa. La sección de
implementación indica al compilador cómo
implementarlos.

Ejemplo de declaración

Unit Rayo;

Interface

Uses
DOS, Graph, Crt; (* se utilizan las unidades
DOS, Graph y Crt *)

Var

a, b, c : integer;

Function Exponencial (a, b : integer) : real;

Procedure Dividir (x, y : integer; var cociente :


integer);

9.1.2.3 Sección de implementación

La sección de implementación es estrictamente


privada; su contenido no es exportable. Sólo los
procedimientos o funciones que aparecen en la
sección interface pueden ser invocados desde el
exterior de la unidad. Esta sección contiene el cuerpo
de los procedimientos y funciones declarados en la
sección de interface.

Unit Rayo;

Interface

Function Exponencial (A, B : Integer) : Real;

Procedure Dividir (X, Y :


Integer; Var Cociente : Integer);

Implementation Function Exponencial (A, B :


Integer) : Real; Var

P, I : Integer;

Begin

P := 1;

For I := 1 to B do
P := P * ;

Exponencial := P

End;

Procedure Dividir (X, Y :


Integer; Var Cociente : Integer);

Begin

Cociente := X div Y

End;

End.

Nótese que la declaración de una unidad está


terminada por la palabra reservada End y un punto.

9.1.2.3 Sección de iniciación

La sección de iniciación puede contener instrucciones


pero también puede estar vacía. Estas instrucciones
sirven, por ejemplo, para iniciar variables. La
ejecución de estas instrucciones se efectúa en el
momento del lanzamiento o ejecución de un
programa que utiliza la unidad antes de la ejecución
de la primera instrucción del cuerpo del programa.

En la sección de iniciación se inicializa cualquier


estructura de datos (variables) que utilice la unidad y
las hace disponibles (a través del interface) al
programa que las utiliza. Comienza con la palabra
reservada begin seguida por una secuencia de
sentencias y termina con "end. ".

La sección de iniciación debe llamarse antes de que el


cuerpo del programa se ejecute.
37. Aplicación
Una unidad tiene una estructura muy similar a la de
un programa.

La cláusula uses de la parte de interface sólo es


necesaria cuando la unidad actual llame a otras
unidades. Todos los procedimientos y funciones en la
sección de interface deben ser definidos en la sección
de implementación.

La cabecera de los procedimientos y funciones


declarados en la parte de interface deben ser
idénticos a la cabecera de las mismas funciones
definidas en la parte de implementación; sin
embargo, es posible escribir la cabecera en forma
abreviada en la sección de implementación.
Unit utilidad; (* este nombre de la unidad debe coincidir con el nombre
del

archivo de programa *)
Interface

Uses

Wincrt, Printer;

Procedure Frase (Texto : String);

Implementation

Uses

Printer;

Var

MiVar : Integer

Procedure Frase;

Begin
Clrscr;

GotoXY ((80-Lenght (Texto)) div 2,1)

Write (texto);

End.

Begin

MiVar := 0

End.

Una vez que se dispone el código fuente de una


unidad, se compila de igual forma que un programa,
pero el archivo obtenido no es ejecutable
directamente. Tiene la extensión TPU (Turbo Pascal
Unit).

Para utilizar esa unidad dentro de un programa, debe


incluir una sentencia uses para indiciar al compilador
que está utilizando esa unidad.

ProgramPrueba;

Uses Utilidad;

Ejemplo:

Escribir una unidad que conste a su vez de un


procedimiento para intercambiar los valores de dos
variables, así como calcular su valor máximo.

Unit Demo1;

Interface

Procedure Intercambio (Var I,J : Integer);

Function Máximo (I, J : Integer) : Integer;


Implementation

Procedure Intercambio;

Var

Aux : Integer;

Begin

Aux := I;

I := J;

J := Aux

End;

Function Máximo;

Begin

If I>J then

Maximo := I

Else

Maximo :=J

End;

End.

Una vez que lo haya escrito, guárdelo en disco con el


nombre de Demo1.PAS, a continuación, compílelo
hacia el disco. El código objeto se llamará
Demo1.TPU. Esta unidad la utilizaremos en el
siguiente programa:

Program Prueba;
Uses

Demo1;

Var

X,Y : Integer;

Begin

Write (`Introducir dos números enteros: `);

Readln (X,Y);

Intercambio (X,Y);

Writeln (X,´ `,Y);

Writeln (`El valor máximo es: `, Máximo (X,Y));

End.

38. Aplicaciones
9. 3. 1 Utilización de unidades estándar

El archivo TURBO.TPL que contiene todas las unidades


estándar se carga en memoria central a la vez que el
propio compilador y está disponible en cualquier
momento, con la ayuda de la cláusula uses.

Como se ha visto anteriormente, un programa debe


contener la cláusula uses, situada inmediatamente
después de la cabecera.

9. 3. 1. 1 Unidad System

Esta unidad contiene todos los procedimientos y


funciones estándar de Turbo Pascal relativas a
entradas/salidas, cadena de caracteres, gestión de
memoria, etc.
9. 3. 1. 2 Unidad Wincrt

Esta unidad proporciona un conjunto específico de


declaraciones para entrada y salida: constantes,
variables, procedimientos y funciones, que permiten
el acceso al control de los modos de pantalla, al
teclado, a los colores, al posicionamiento del cursor,
etc.

La mayoría de los programas de Pascal que hacen uso


de la pantalla para representar salidas recurren a la
unidad Wincrt. Algunos procedimientos que necesitan
de esta unidad son:

Clrscr: Limpia la pantalla

KeyPressed: Detecta la pulsación de


una tecla

Sound: Hace sonar el altavoz interno

Window: Define una ventana de


texto en la pantalla

9. 3. 1. 3 Unidad WinDos

Esta unidad contiene declaraciones, constantes, tipos,


variables, procedimientos y funciones relacionadas
con el sistema operativo DOS y la gestión de
archivos. Los subprogramas que constituyen esta
unidad no existen en Pascal estándar. Esta unidad no
necesita ninguna otra unidad en su declaración.

Algunos procedimientos importantes son: GetTime,


SetTime, DiskSize, GetAttr.

Ejemplo:
Visualizar la hora en la esquina superior derecha de la
pantalla.

Program Hora;

Uses

Wincrt,Windos;

Var

Horas, Minutos, Segundos, Centesimas : Word;

Begin

Clrscr;

While not keypressed do

Begin

Gotoxy (64,1);

GetTime(Horas, Minutos, Segundos,


Centesimas);

(* Hora reloj interno *)

Writeln (Horas:2, `;´, minutos:2,`:´,


Segundos:2,´:´,Centesimas:2)

End

End.

Вам также может понравиться