Está en la página 1de 559

CONSULTORES EDITORIALES

REA DE INFORMTICA Y COMPUTACIN


Antonio Vaquero Snchez
Catedrtico de Lenguajes y Sistemas Informticos
Escuela Superior de Informtica
Universidad Complutense de Madrid
ESPAA

Programacin en
Turbo/Borland Pascal 7
3.a edicin

Gerardo Quiroz Vieyra


Ingeniero en Comunicaciones y Electrnica
por la ESIME del Instituto Politcnico Nacional
Profesor de la Universidad A u t n o m a Metropolitana
Unidad Xochimilco
MXICO

Luis Joyanes Aguilar


Director del Departamento de Lenguajes
y Sistemas Informticos
Facultad de Informtica/Escuela Universitaria de Informtica
Universidad Pontificia de Salamanca en Madrid

Osbor ne/McGraw-Hill
MADRID . BUENOS AIRES . CARACAS . GUATEMALA . LISBOA . MXICO
NUEVA YORK . PANAM . SAN JUAN . SANTAF DE BOGOT . SANTIAGO . SAO PAULO
AUCKLAND HAMBURGO LONDRES MILN MONTREAL . NUEVA DELHI . PARIS
SAN FRANCISCO . SIDNEY SINGAPUR . ST. LOUIS TOKIO TORONTO

A mi hijo Luis, mi otra gran pasin

PROGRAMACIN EN TURBO/BORLAND PASCAL 7. 3.a Edicin


No est permitida la reproduccin total o parcial de este libro, ni su tratamiento
informtico, ni la transmisin de ninguna forma o por cualquier medio, ya sea
electrnico, mecnico, por fotocopia, por registro u otros mtodos, sin el permiso
previo y por escrito de los titulares del Copyright.
DERECHOS RESERVADOS 1998, respecto a la primera edicin en espaol por
McGRAW-HILL/INTERAMERICANA DE ESPAA, S. A. U.
Edificio Valrealty, 1.a planta
Basauri, 17
28023 Aravaca (Madrid)
ISBN: 84-481-1075-7
Depsito legal: M. 3.591-1999
Editor: Carmelo Snchez Gonzlez
Diseo de cubierta: Luis Sanz Cantero
Compuesto en FER Fotocomposicin, S. A.
Impreso en Impresos y Revistas, S. A. (IMPRESA)
IMPRESO EN ESPAA - PRINTED IN SPAIN

CONTENIDO

Prlogo a la primera, segunda y tercera edicin


Captulo 1.

Introduccin a la ciencia de las computadoras y a la programacin

1.1. Qu es una computadora?


1.2. Organizacin fsica de una computadora (hardware)
1.3. El software (los programas)
1.4. Los lenguajes de programacin
1.5. La resolucin de problemas con computadora
1.6. Programacin modular
1.7. Programacin estructurada
1.8. Los lenguajes Pascal y Turbo Pascal
Resumen
Ejercicios
Captulo 2.

El entorno de programacin Turbo Pascal: Comenzando la programacin . .

2.1. El programa Turbo Pascal (versin 7.0)


2.2. Qu es un entorno de programacin?
2.3. El Entorno Integrado de Desarrollo (EID)
2.4. Instalacin de Turbo Pascal
2.5. El entorno de programacin de Turbo Pascal
2.6. Componentes del EID Turbo Pascal 7.0
2.7. Los mens
2.8. Creacin de programas: 1a edicin
2.9. Conservacin (grabacin) de programas en discos
2.10. Compilacin
2.11. Ejecucin (Run)
2.12. Tratamiento de archivos en la ventana de edicin
2.13. El depurador integrado
Resumen
^ Captulo 3.
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.
3.7.

xv
1
2
2
10
11
13
24
25
28
29
30
32
33
35
35
36
37
41
45
48
48
49
50
51
52
52

Introduccin a Pascal

54

La estructura de un programa en Pascal


Objetos de un programa
Diagramas de sintaxis
Tipos de datos
Constantes
Variables
Sentencias

55
58
61
62
71
73
75

vi i

"

Programacin en Turbo/Borland Pascal 7


3.8. La sentencia de asignacin
3.9. Expresiones y operaciones aritmticas
3.10. Operaciones Entrada/Salida
3.11. Operaciones bsicas de utilidad
3.12. Programacin interactiva
3.13. El estilo de programacin
3.14. Puesta a punto de programas
Resumen
Ejercicios
Problemas

Captulo 4

77
79
83
90
94
95
99
103
103
107

Estructuras de control selectivas

109

4.1. Expresiones lgicas


4.2. La sentencia i f
4.3. Sentencias i f anidadas
4.4. Programacin con expresiones lgicas
4.5. La sentencia case
4.6. Comparacin de sentencias i f anidadas y c a s e
4.7. Puesta a punto de programas
Resumen
Problemas resueltos
Ejercicios
Problemas
Captulo 5.

Estructuras de control repetitivas

5.1. El concepto de bucle . \


5.2. La sentencia wh i l e
5.3. Diseo de bucles
5.4. Terminacin d l o s bucles
5.5. La sentencia r e p e a t
5.6. Comparacin de los bucles w h i l e y r e p e a t
5.7. La sentencia f o r
5.8. Bucles anidados
5.9. Sentencias d t control incondicional
5.10. Eleccin de la estructura repetitiva adecuada
5.11. Optimizacin de bucles
5.12. Puesta a punto de programas
Resumen
Problemas resueltos
Ejercicios
Problemas
Captulo 6.
6.1.
6.2.
6.3.
6.4.
6.5.
6.6.
6.7.
6.8.

109
117
122
126
131
134
136
141
141
143
145
148

."

148
150
152
154
161
163
165
171
174
177
179
180
183
185
191
192

La programacin modular

195

El diseo descendente: los subprogramas


El diseo modular: los mdulos
Procedimientos
Transferencia de informacin a/desde procedimientos: los parmetros . . . .
Variables locales y globales
Efectos laterales
Ambito de un identificador
La declaracin forward

195
198
199
206
218
221
222
230

6.9. Diseo descendente y programacin modular


6.10. Incluir archivos en programas (creacin de libreras)
6.11. Puesta a p u n t o de programas
Resumen
Ejercicios
Problemas
x

Contenido

x
232
239
241
243
243
247

Captulo 7.

Funciones estndar y definidas por el usuario

249

7.1.
7.2.
7.3.
7.4.
7.5.
7.6.
7.7.
7.8.
7.9.
7.10.

Las funciones de T u r b o Pascal


Las funciones predefinidas en T u r b o Pascal
Funciones matemticas
Funciones trigonomtricas
Funciones ordinales
Funciones especiales
Funciones especiales (bajo nivel): H I / W s w a p
Incremento y decremento: inc/Dec
Nmeros aleatorios
Funciones definidas por el usuario

250
250
251
257
261
264
265
267
269
273

7.11.

El t i p o p r o c e d i m e n t a l (PROCEDURE FUNCTION)

7.12. Puesta a p u n t o de programas


Resumen
Problemas resueltos
Ejercicios
Problemas
- Captulo 8.

278

281
281
282
285
288

Tipos de datos definidos por el usuario y conjuntos

290

8.1. Definiciones de tipos


8.2. Tipos de datos ordinales
8.3. Tipos de datos subrango
8.4. Tipos definidos por el usuario: enumerados
8.5. Las funciones ordinales: ord, Pred y succ
8.6. Compatibilidad de tipos y compatibilidad de asignacin
8.7. C o n j u n t o s
8.8. Operaciones con c o n j u n t o s . . .
8.9. Recapitulacin sobre conjuntos: conceptos y operaciones
8.10. Procedimientos especiales de conjuntos
8.11. Puesta a p u n t o de programas
Resumen
Ejercicios
.
Problemas
.'

290
291
294
297
304
308
309
313
323
326
328
329
329
330

Captulo 9.
9.1.
9.2.
9.3.
9.4.
9.5.
9.6.
9.7.
9.8.
9.9.

Introduccin a las estructuras de datos: arrays

332

Concepto de estructuras de datos


Qu es un array?
Arrays unidimensionales: los vectores
Operaciones con arrays (vectores)
Arrays c o m o parmetros
Valores m n i m o y m x i m o de un vector
La directiva del compilador R
Arrays paralelos
Arrays multidimensionales

333
333
334
341
345
348
349
350
351

Contenido

Programacin en Turbo/Borio, id Pascal 7


9.10. Arrays bidimensionales (tablas)
9.11. Tratamiento de arrays multidimensionales
9.12. Compatibilidad y conversin de tipos
9.13. Constantes de tipo array (tipeadas)
9.14. Arrays abiertos
9.15. Puesta a punto de programas
Resumen
Problemas resueltos
Ejercicios
Problemas

Capitulo 10.

Tratamiento de cadenas de caracteres

10.1. Concepto de cadena de caracteres ( s t r i n g )


10.2. Longitud de una cadena
10.3. Operaciones entre cadenas
10.4. Procedimientos y funciones de cadena internos
10.5. Otras propiedades de las cadenas
10.6. Parmetros array abierto de tipo CHAR
10.7. Parmetros cadena abierta
10.8. Cadenas terminadas en nulo
10.9. La unidad s t r i n g s : funciones
Resumen
Ejercicios
Problemas
Captulo 11.
11.1.
11.2.
11.3.
11.4.
11.5.
11.6.
11.7.
11.8.
11.9.
Captulo 12.
12.1.
12.2.
12.3.
12.4.
12.5.
12.6.
12.7.
12.8.
12.9.
12.10.
12.11.
12.12.
12.13.
12.14.

352
361
364
365
366
369
370
370
374
377

Captulo 13.

380

Captulo 14.

380
381
385
386
394
398
399
401
402
407
409
412

14.1.
14.2.
14.3.
14.4.
14.5.
14.6.
14.7.
14.8.
14.9.
14.10.
14.11.

El control de la pantalla y del teclado

414

La unidad c r t
Las variables c r t
Rutinas de control de pantalla
Pantallas versus ventanas
Pantalla de texto
Coordenadas de pantalla: posicin del cursor
Reglas prcticas para el control de la pantalla
El control del teclado
El control del tiempo y de sonidos

414
417
419
423
424
426
428
430
434

Ingeniera de software: introduccin a la medotologa de construccin de


grandes programas

438

La complejidad inherente al software


La crisis del software
Factores en la calidad del software
El ciclo de vida del software
La documentacin
Mtodos formales de verificacin de programas
Principios de diseo de sistemas
Estilo de programacin
Diseo de algoritmos
Codificacin
Prueba (Testing)
Depuracin
Eficiencia
Transportabilidad (Portabilidad)

438
440
442
443
449
451
458
463
473
474
474
475
478
481

13.1.
13.2.
13.3.
13.4.
13.5.
13.6.
13.7.
13.8.
13.9.

Captulo 15.
15.1.
15.2.
15.3.
15.4.
15.5.
15.6.
15.7.
15.8.
15.9.
15.10.
15.11.
15.12.
15.13.
15.14.
15.15.
15.16.
15.17.
15.18.
15.19.
15.20.
Captulo 16.
16.1.
16.2.

16.3
16.4

Ordenacin, bsqueda y mezcla

484

Introduccin
Ordenacin
Ordenacin por burbuja
Ordenacin por seleccin
Ordenacin por insercin
Ordenacin Shell
Bsqueda lineal
Bsqueda binaria
Mezcla

484
485
486
493
495
498
501
505
509

Registros

515

El tipo de datos registro


La sentencia with
Registros jerrquicos (anidados)
Los registros como parmetros
Arravs de registros
Registros variantes
Constantes de tipo registro (tipeadas)
Bsqueda en un array de registros
Bsqueda por conversin de claves (hashing)
Ordenacin de un array de registros
Puesta a punto de programas

516
520
521
527
531
534
543
544
547
552
556

Archivos

564

Introduccin a los archivos


Los archivos en Turbo Pascal
Los archivos de texto (secuenciales)
Tratamiento de archivos de texto
Redirecciones de las entradas/salidas estndar
Los archivos de acceso aleatorio (con tipos)
Tratamiento de archivos de acceso aleatorio
Mantenimiento de archivos aleatorios
Deteccin de errores de Entrada/Salida (E/S)
Errores de E/S bajo MS-DOS
Tratamiento completo de archivos aleatorios
Archivos sin tipos
Borrar y renombrar archivos
Dispositivos en Turbo Pascal
Escritura en impresora
Archivos de texto asociados a unidades lgicas
Los archivos como parmetros de procedimientos
Ordenacin de archivos
Mezcla de archivos
Puesta a punto de programas

565
566
570
572
579
582
584
586
593
595
595
604
606
608
609
610
611
611
612
616

La recursividad

620

La naturaleza de la recursividad
El seguimiento de la recursividad
Pilas
Subprogramas recursivos con parmetros tipo array

620
629
631
633

Programacin en Turbo/Borland Pascal 7


16.5.
16.6.
16.7.
16.8.
16.9.
16.10.
16.11.
16.12.
16.13.

Captulo 17.
17.1.
17.2.
17.3.
17.4.
17.5.
17.6.
17.7.
Captulo 18.
18.1.
18.2.
18.3.
18.4.
18.5.
18.6.
18.7.
18.8.
18.9.
18.10.
18.11.
18.12.
18.13.
Captulo 19.
19.1.
19.2.
19.3.
19.4.
19.5.
19.6.
19.7.
Captulo 20.
20.1.
20.2.
20.3.
20.4.
20.5.

Contenido

La eficiencia (iteracin versus recursividad)


Recursividad indirecta: declaracin Forward
Bsqueda binaria recursiva
Ordenacin rpida (qttteksorf)
Ordenacin por mezclir(ordeacin externa)
El problema de las Torres de H a n o i
Recursin m u t u a
La recursividad, pros y contras (sntesis)
Puesta a punto de programas

635
637
639
642
646
650
653
654
655

Pilas y colas

660

Introduccin
Qu es una pila?
Realizacin de pilas con arrays (vectores) y registros
Qu es una cola?
Aplicaciones de las colas
'.
Realizacin de una cola con arrays y registros
Puesta a punto de programas

660
661
664
670
671
671
676

Estructuras dinmicas de datos: punteros y listas enlazadas

680

Estructuras de datos dinmicas


Punteros
Operaciones con variables puntero: los procedimientos New y Dispose
El tipo genrico puntero (pointer)
La funcin assigned
La asignacin de m e m o r i a en T u r b o Pascal
Listas enlazadas
Operaciones en una lista enlazada
Listas circulares
Listas doblemente enlazadas
Diseo de pilas con listas enlazadas
Diseo de colas con listas enlazadas
Puesta a punto de programas

680
682
685
700
701
701
706
710
721
723
725
727
729

...

Arboles

733

Concepto de rbol
Arboles binarios
Arboles de expresin
Construccin de un rbol binario
Recorrido de un rbol
Arbol binario de bsqueda
Operaciones en rboles binarios de bsqueda

733
736
742
745
747
751
760

Construccin de grandes programas (las unidades y la compilacin independiente)


Concepto de unidad
Estructura de una unidad
Creacin de unidades
Utilizacin de unidad estndar
Situacin de las unidades en sus discos: Dnde busca T u r b o Pascal las unidades?

20.6.
20.7.
20.8.

Captulo 21.

771
771
774
782
786

Identificadores idnticos en diferentes unidades


Sntesis de unidades
Otros mtodos de estructurar programas: inclusin, solapamientos y encadenamiento

788
789
791

Unidades estndar

805

Las unidades estndar


La unidad System
La unidad Printer
La unidad Dos
Procedimientos y funciones de la unidad Dos
La unidad Crt
La unidad Strings: Funciones
La unidad Turbo3

805
806
806
808
811
819
825
829

Captulo 22.
22.1.
22.2.
22.3.
22.4.
22.5.
22.6.
22.7.
22.8.
22.9.
22.10.
22.11.
22.12.
22.13.

Tipos abstractos de datos y objetos


El Papel (el Rol) de la abstraccin
U n nuevo paradigma de programacin
Modularidad
Diseo de mdulos
Tipos de datos
Abstraccin en lenguajes de programacin
Tipos abstractos de datos
Tipos abstractos de datos en T u r b o Pascal
Orientacin a objetos
Reutilizacin de software
Lenguajes de programacin orientados a objetos
Desarrollo tradicional frente a orientado a objetos
Beneficios de las tecnologas de objetos

834
835
838
840
843
845
846
849
851
854
838
859
863
864

Captulo 23.

Programacin orientada a objetos

868

Programacin estructurada
Qu es programacin orientada a objetos?
U n m u n d o de objetos: notaciones grficas
Comunicaciones entre objetos: los mensajes
Estructura interna de un objeto
Estructura interna de una clase
Herencia
Anulacin/Sustitucin
Sobrecarga
Ligadura dinmica

869
871
877
883
886
888
890
897
898
899

21.1.
21.2.
21.3.
21.4.
21.5.
21.6.
21.7.
21.8.

23.1.
23.2.
23.3.
23.4.
23.5.
23.6.
23.7.
23.8.
23.9.
23.10.
Captulo 24.

770

xiii

24.1.
24.2.
24.3.
24.4.
24.5.
24.6.
24.7.
24.8.

Programacin orientada a objetos con Turbo Pascal 7

904

La estructura de los objetos: sintaxis


Secciones pblica y privada
Definicin de objetos mediante unidades
La herencia
Los mtodos
Objetos dinmicos
Polimorfismo
Constructores y destructores

905
912
915
917
925
926
935
942

XV

Programacin en Turbo/Borland Pascal 7


24.9.
24.10.

Los procedimientos new y d i s p o s e en programacin orientada a objetos . .


Mejoras en programacin orientada a objetos

945
946

Apndice
A.
B.
C.
D.
E.
F.
G.
H.
I.
J.
K.
L.

Cdigos de referencia
Palabras reservadas
El editor de Turbo Pascal 7.0
El entorno integrado de desarrollo T u r b o Pascal 7.0
Operaciones ms ususales con T u r b o Pascal 7
Directivas de compilacin
Depuracin de sus programas en T u r b o Pascal
Mensajes y cdigos de error
G u a de referencia T u r b o Pascal 7.0, 6.0 y 5.5
Diagramas de sintaxis T u r b o Pascal 7.0, 6.0 y 5.5
Gua del usuario ISO/ANSI Pascal estndar
Pascal estndar (ANSI Pascal) versus T u r b o Pascal 5.5 a 7.0

95
957
959
963
980
983
998
1011
1019
1044
1059
1081

Bibliografa

1084

Indice

1086

PRLOGO A LA PRIMERA,
SEGUNDA Y TERCERA EDICIN

Una historia breve de Pascal y Turbo Pascal


A principio de los aos setenta, y tras los estudios efectuados en la dcada anterior en
la realizacin del lenguaje ALGOL-68, Niklaus Wirth, un profesor de Eidgenssiche
Technische Hochschule (Instituto Tecnolgico) de Zurich (Suiza), dise Pascal, un lenguaje concebido para la enseanza de tcnicas de programacin a estudiantes universitarios, que con el correr de los tiempos se ha convertido en estndar del m u n d o de la
programacin.
El objetivo fundamental ya comentado anteriormente de su creador fue desarrollar un lenguaje que permitiera ensear programacin como una disciplina sistemtica
basada en determinados conceptos fundamentales. Estos conceptos se reflejan de modo
claro y natural en el lenguaje. El libro Pascal User Manual and Report, escrito por Wirth
y K. Jensen, publicado en 1974, sirvi como definicin bsica del lenguaje Pascal. A medida que su uso creci en las comunidades educativa y profesional, aparecieron diferentes implementaciones; para asegurar que los programas Pascal escritos en un sistema
puedan ser ejecutados en otros, se han diseado diferentes estndar: IEEE e ISO, entre
los que destacaba el U C S D Pascal en ambientes universitarios americanos ha gozado
de buena aceptacin. Sin embargo, en la mitad de la dcada de los ochenta, Pascal era
un lenguaje cuya difusin se reduca a ambientes y cenculos universitarios y de investigacin. Tal vez, la razn esencial resida en el elevado precio de los compiladores y de
las herramientas complementarias necesarias: editores y depuradores.
En 1983 aparece en el mercado norteamericano comercializado por Borland International, Inc. un compilador de Pascal denominado Turbo Pascal; la caracterstica
ms notable, su reducido precio: 49,95 dlares. Los programadores profesionales lo compraron masivamente, pues no slo f u n c i o n a b a sino que compilaba y corra ejecutaba programas ms rpidamente que cualquier otro compilador del mercado. En aos
sucesivos aparecieron las versiones 2.0 (todava conservo mi vieja copia, regalo de un
amigo como recuerdo de un viaje a Estados Unidos), 3.0, 3.1 y 3.2. Su xito se deba
a la facilidad de edicin, compilacin y ejecucin; constitua por s mismo un entorno
de programacin: editor, compilador y depurador integrados; tena una limitacin de
64 Kbytes en el tamao de los programas. Por aquella poca, Apple comercializaba sus
programas basados en mens desplegables que presentaban las rdenes visualmente
al programador y para cuya ejecucin bastaba solamente la pulsacin de una tecla; ello
evitaba la tediosa tarea de escritura de las rdenes.
Y\/

xvi

Programacin en Turbo/Borland Pascal 7

La versin 4.0 super con creces a las versiones anteriores y elimin la barrera de los
64 K incorporando a su vez los mens desplegables. Adems, ofreca un gran nmero de
mejoras y novedades en lo que concierne al confort y al entorno de programacin:
Compilador con editor incorporado similar a las versiones anteriores, pero renovado (mens desplegables, funciones especiales, etc.).
Facilidad para construccin de bibliotecas.
Compilador de tipo clsico que puede ser utilizado en batch (procesos por lotes).
La gran novedad fue la posibilidad de superar la barrera de los 64 K para la creacin
de programas. Esto se consegua mediante mdulos que se diseaban con unidades (unit).
Cada unidad puede ser compilada separadamente.
A finales de 1988 aparece en Estados Unidos la versin 5.0 que, entre otras novedades, ofreca un entorno de desarrollo. Entrado el ao 1989 aparece la versin 5.5, idntica a la 5.0, con una importante excepcin: incorpora facilidades para realizar programacin orientada a objetos (OOP, Object Oriented Programming), metodologa de
programacin clsica, pero poco utilizada, que, sin duda, ser clave en el desarrollo
de la ingeniera del software en la dcada de los noventa.
En el ao 1991, Borland lanz Turbo Pascal 6.0, que mejoraba el entorno de la versin 5.5 y, sobre todo, aada nuevas herramientas de programacin orientada a objetos: Turbo Vision. A finales del ao 1992, dos nuevos productos se lanzaron por la casa
Borland: Turbo Pascal 7.0 y Borland Pascal 7.0,
En la actualidad, Turbo Pascal es, seguramente, el compilador ms vendido del
mundo. Combina los beneficios de la programacin estructurada en Pascal, con un amplio conjunto de herramientas adicionales, entre otras, programacin orientada a objetos
y Turbo Visin. Turbo Pascal y Borland Pascal es un sistema de desarrollo profesional
para crear programas que corren en entornos DOS o Windows y en modos de memoria
real o protegido.
Turbo Pascal proporciona un entorno de programacin muy potente y es una implementacin muy slida de Pascal. El entorno integra muchos recursos importantes para
crear y comprobar programas. Algunos de estos recursos son: un editor de fcil uso, un
compilador, un depurador, numerosas ventanas y diferentes extensiones de ayuda en
lnea.
Hoy da Turbo Pascal que corre sobre computadoras PC y Mac, tanto en los procesadores Pentium como en Pentium II es una herramienta de programacin muy potente que tiene adems la virtud de su fcil aprendizaje. Por esta razn, sirve indistintamente en el campo de la educacin y en el profesional. Desde institutos y liceos hasta
escuelas y facultades universitarias, Turbo/Borland Pascal es, sin gnero de dudas, uno
de los lenguajes y herramientas de programacin ms utilizado.

Objetivos del libro


Aunque este libro proporciona una visin completa de Turbo/Borland Pascal de la versin 7.0, es sobre todo, un manual para aprender a programar en Pascal con una herramienta llamada Turbo.
Refleja una opinin muy extendida, de que la principal razn para aprender un lenguaje de programacin es utilizar una computadora para resolver problemas. Las etapas

Prlogo a la primera, segunda y tercera edicin

xvii

fundamentales en la resolucin de problemas ayudados por computadora se examinan e


ilustran en el texto: 1) anlisis del problema y diseo del algoritmo/ 2) transformacin
del algoritmo en un programa: codificacin; 3) ejecucin y prueba/validacin del programa.
El texto se ha diseado como un curso de programacin en Pascal en las versiones 5.0/5.5, 6.0 y 7.0 de Turbo Pascal. Asimismo, puede ser utilizado con la nueva versin Borland Pascal 7.0 corriendo bajo el sistema operativo DOS. Busca conseguir dos
objetivos complementarios: ensear a programar con un estilo depurado y ensear las
nuevas tcnicas de Turbo Pascal.

Organizacin del libro


Este libro est concebido como primer curso de programacin del curriculum en Ciencias de la Computacin/Informtica, as como de Facultades de Ciencias e Ingeniera; o
bien, como curso de programacin para cursos no reglados o aprendizaje libre de lectores con inters por la programacin. Su contenido se complementa en los planes de estudio citados con asignaturas de anlisis y diseo de algoritmos (se la suele conocer como
Metodologa, Introduccin o Fundamentos de la Programacin). Asimismo, cubre parte
de los programas de asignaturas tales como Estructura de datos o Algoritmos y Estructuras de datos y de curriculum similares, como es el caso de los programas CS1, CS2 de
ACM (Association for Computing Machinery) de Estados Unidos.
El libro est concebido para un curso de dos cuatrimestres o dos semestres, y adems
de contener los conceptos fundamentales de Turbo Pascal, cubre los programas tpicos
de las asignaturas citadas. Los Captulos 1 al 11 se corresponden con el primer cuatrimestre/semestre (CS1), y los Captulos 12 al 21 con el segundo cuatrimestre/semestre
(CS2); el Captulo 12 queda como puente entre ambos cuatrimestres (o semestres),
dependiendo de la decisin del profesor o de los avances del lector. El Captulo 22 incluye las nuevas caractersticas incorporadas a la versin Turbo Pascal 7.0 y Borland
Pascal 7.0.
Para aquellos lectores que procedan de Pascal estndar o de cursos elementales de
programacin, el orden lgico de estudio se corresponde con el orden natural de los captulos. Si posee experiencia en Pascal, puede modularizar el estudio como crea ms
conveniente, ya que su diseo permite cambiar el orden de estudio o lectura de los
captulos.

Ingeniera del software


La produccin de un programa se puede definir en diferentes etapas: anlisis, diseo,
pruebas y mantenimiento. Estas fases se conocen como ciclo de vida del software, y constituyen los principios bsicos en los que se sustenta la ingeniera del software. Aunque
este libro se dedica esencialmente a la tercera etapa, es necesario considerar siempre las
restantes etapas en el proceso de creacin de programas, dado que el diseo y pruebas
tienen una relacin muy estrecha con la implementacin o codificacin.
El Captulo 12 es una amplia introduccin a la ingeniera de software, como ciencia
para la creacin y produccin de programas a gran escala.

XVii

Programacin

en Turbo/Borland

Prlogo a la primera, segunda

Pascal 7

Programacin orientada a objetos


La Programacin orientada a objetos, POO (OOP, Object-Oriented Programming), forma
parte de una tecnologa que se lleva experimentando en las dos ltimas dcadas y que
hasta la aparicin de Turbo Pascal 5.5 se vena implementando en lenguajes como Smaltalk/Objective-C y C++. Las versiones 6.0 y 7.0 han aadido nuevas propiedades a las
ya incorporadas a la versin 6.0, aunque sus mayores aportaciones son las nuevas palabras reservadas public, prvate e inherited, as como un nuevo depurador orientado a
objetos, y sobre todo, y esencialmente, una nueva herramienta de programacin Turbo
Vision, que permite la programacin profesional con enfoque orientado a objetos.
La historia de las tecnologas orientadas a objetos (TO) es breve, aunque proviene de
la dcada de los sesenta, en la que se producen las grandes convulsiones estudiantiles como
fue la revolucin de mayo del 68 francs. Su crecimiento, sin embargo, ha sido exponencial en la dcada actual. La tecnologa de objetos es inevitable, y la revolucin del
software se est produciendo estos aos y se producir la explosin al principio del tercer
milenio, aunque ya en el ao 1997 es una autntica realidad.
El paradigma orientado a objetos se basa en el concepto de abstraccin de datos, de
soporte fundamental a los tipos abstractos de datos y su extensin, los objetos. Las propiedades fundamentales en que se apoya el modelo objeto (tipo de dato objeto) son: abstraccin, encapsidamiento, ocultacin de la informacin, herencia y polimorfismo.
Todas las versiones de Turbo y Borland Pascal permiten trabajar en POO y estn
diseadas como herramientas de desarrollo de programas.

Ayudas pedaggicas
Para llegar a conseguir los objetivos de este libro se han incluido en todos los captulos:
Numerosos ejemplos de tipo didctico.
Resolucin de pequeas aplicaciones.
Notas, reglas y precauciones que se aconsejan al lector sobre problemas que suelen
surgir en la prctica de la programacin.
Ejercicios y problemas propuestos (cuya realizacin se recomienda).
En varios captulos se incluyen tambin como ayuda complementaria:
Problemas resueltos sobre aplicaciones especficas.
Puesta a punto de programas que incluyen tcnicas y errores tpicos de programacin.

Aportaciones de la tercera edicin


Esta tercera edicin ha ampliado considerablemente el contenido de las ediciones anteriores. De modo formal se han aadido dos captulos ms, para conformar un total de
veinticuatro, pero de modo prctico se han reestructurado y organizado con un orden
distinto, muchos de los captulos, en base a la experiencia acumulada en los nueve aos
de vida del libro.

y tercera edicin

xix

As, hemos de destacar especialmente, los captulos dedicados a estructura de datos,


programacin orientada a objetos e ingeniera de software.
Aunque ya en las ediciones anteriores se trataron estos temas, el avance de las tcnicas de programacin en estos ltimos aos, junto con el mayor conocimiento que de
ellas tienen los estudiantes universitarios, de formacin profesional y politcnica, nos ha
llevado a ampliar todo lo posible prcticamente todos los temas, y e n especial, los importantes temas citados. Por estas causas hemos dedicado cuatro captulos a tratar las
estructuras dinmicas de datos, pilas, colas, listas enlazadas y rboles, adems de los captulos dedicados a arrays (arreglos, vectores o matrices), cadenas y unidades. Por igual
razn, se ha dedicado un captulo totalmente nuevo a los tipos abstractos de datos, y
otro, a tratar todas las propiedades del modelado de objetos y un tercer captulo a la programacin orientada a objetos en Turbo Pascal. Por ltimo, se ha dedicado un captulo
especfico a la introduccin en el arte y ciencia de la ingeniera del software.

Contenido
Esta nueva edicin se han organizado en 24 captulos y 12 apndices, cuya estructura,
aunque no formalmente, se divide en los siguientes grandes bloques: sintaxis y programacin en Turbo/Borland Pascal, estructuras de datos (estticas y dinmicas), mtodos
de ordenacin y bsqueda, abstraccin de datos y programacin orientada a objetos e
ingeniera del software.
El Captulo 1 describe una introduccin a la ciencia de las computadoras y a la programacin. Describe los elementos fundamentales de una computadora: el hardware y
el software, as como los diferentes tipos de programacin tradicionales en la actualidad:
estructurada y modular.
El entorno de programacin del compilador Turbo y Borland Pascal se describe en
el Captulo 2.
El Captulo 3 realiza una introduccin al lenguaje Pascal, as como la sintaxis y elementos bsicos de un programa en Pascal; junto con las instrucciones bsicas de Entrada
y Salida.
Las estructuras de control selectivas que muestran el flujo de control condicional de
un programa. Se describe el concepto y funcionamiento de las sentencias condicionales
o selectivas if y case, en el Captulo 4.
El Captulo 5 explica las importantes estructuras de control repetitivas: los bucles,
lazos o ciclos. Se estudian las sentencias repetitivas for, while y repeat, junto con la sentencia de control incondicional goto, que si bien no es recomendable su uso, puede
haber circunstancias en un programa que lo aconsejen.
La estrategia clsica de resolucin de problemas con computadoras se ha desarrollado tradicionalmente con la programacin modular. El Captulo 6 analiza y estudia el
componente fundamental de la programacin modular: el mdulo, y en particular, el
procedimiento.
El Captulo 7 describe otro tipo de mdulo: la funcin. Se describen y analizan las
funciones estndar o implcitas al usuario y las funciones definidas por el usuario.
El Captulo 8 analiza los tipos de datos definidos por el usuario y un tipo de dato
estructurado denominado conjunto. Las operaciones usuales con conjuntos es otro de los
temas importantes tratados en este captulo.

XX

Programacin en Turbo/Borland Pascal 7

El Captulo 9 trata el importante tema de la estructura de datos: colecciones de elementos dato organizados de un m o d o especfico. Se describen y analizan los arrays
(arreglos, en Hispanoamrica), tablas, matrices o vectores: su concepto bsico, operaciones y tratamiento.
El tipo de dato cadena (string) es u n o de los elementos clave en cualquier programa.
Su concepto, tratamiento y operaciones diversas se describen en el Captulo 10. Las cadenas son, en realidad, arrays de caracteres, pero al contrario que en el caso de Pascal
estndar, en Turbo/Borland Pascal se puede definir con datos tipo string.
El Captulo 11 trata sobre los mtodos para controlar la pantalla y el teclado, es decir,
las tcnicas necesarias para disear e implementar interfaces al usuario.
La primera parte del libro termina con el Captulo 12, Ingeniera de software: introduccin a la metodologa de construccin de grandes programas. Se estudian en este captulo las diferentes fases o etapas de la produccin de un programa: anlisis, diseo,
codificacin, pruebas y mantenimiento.
El Captulo 13 expone el importante tema de ordenacin, bsqueda y mezcla de datos en listas, vectores y tablas. Los mtodos ms importantes se analizan en este captulo.
El registro es un nuevo tipo de dato introducido en Pascal y que permite almacenar
una variedad de informacin sobre entidades de todo tipo. Cada elemento se almacena
en un campo del registro independiente y se puede referenciar cada elemento almacenado en un campo por su nombre. El Captulo 14 analiza el tipo de dato registro.
El Captulo 15 se dedica al importante tema del almacenamiento de datos permanentes en archivos. Este tipo de datos es una estructura de dato constituida por colecciones
de datos que se pueden guardar (grabar) para uso posterior mediante la ejecucin de programas adecuados.
La recursividad o recursin es una alternativa a la iteracin o repeticin, y constituye
una herramienta conceptual muy potente y til para la resolucin de problemas que tengan naturaleza recursiva. El Captulo 16 considera el concepto de recursividad y su tratamiento para conseguir la mayor eficacia dentro de un algoritmo, as como la tcnica
para resolver problemas mediante algoritmos recursivos.
El Captulo 17 considera las estructuras de datos ms usuales en todo tipo de algoritmos: pilas y colas. En este captulo las estructuras se implementan mediante vectores
(arrays).
Las estructuras dinmicas de datos son, probablemente, las estructuras ms utilizadas junto con los arrays. El concepto de puntero y de lista enlazada, se describe en el
Captulo 18.
Otra estructura de datos dinmica es el rbol, muy extendida y utilizada en numerosas aplicaciones; se definen en el Captulo 19 los rboles genricos, los binarios y binarios de bsqueda.
Los programas que se construyen en la actualidad cada vez presentan mayor complejidad; por esta circunstancia, los programadores requieren de tcnicas que permitan
afrontar la implementacin de dichos programas con la mayor eficacia y eficiencia posibles. El Captulo 20 ensea al lector el concepto de unidad y el modo de utilizarlo como
herramienta clave para el desarrollo de grandes programas.
El Captulo 21 describe la estructura de las unidades fundamentales que se incluyen
en los compiladores de Turbo y Borland Pascal.
El concepto de abstraccin es una de las ideas claves en el desarrollo de las modernas
tcnicas de programacin orientada a objetos, y el tipo abstracto de datos (TAD) la re-

Prlogo a la primera, segunda y tercera edicin

xxi

presentacin ms fiel del m o d o de implementacin de dicho concepto. El Captulo 22


explica el diseo y construccin de tipos abstractos de datos, j u n t o con los conceptos
fundamentales de orientacin a objetos, sus beneficios en el desarrollo de software y cules son los lenguajes ms utilizados en programacin orientada a objetos.
La Programacin Orientada a Objetos (POO) es, sin gnero de dudas, el tipo de programacin que p r e d o m i n a en la segunda m i t a d de la dcada de los n o v e n t a y que,
probablemente, prevalecer en el tercer milenio. El Captulo 23 se dedica al estudio
de los POO con el objeto de llegar a entender sus propiedades fundamentales: herencia,
polimorfismo, etc.
El Captulo 24 muestra las caractersticas orientadas a objetos de Turbo/Borland Pascal, j u n t o con la sintaxis y las tcnicas de implementacin de las propiedades de objetos
en este lenguaje.
El libro se complementa con una serie de apndices que hemos considerado pueden
ayudar al lector para consulta y referencia de los entornos integrados de desarrollo. As,
se han conservado algunos apndices de las versiones anteriores, cuya finalidad hemos
podido contrastar con estudiantes y profesores que han seguido este libro como referencia en sus clases. Adems, se han modificado y aadido otros apndices.
Los apndices tratan los siguientes temas. A: El cdigo de referencia (ASCII); B: Palabras reservadas de Turbo/Borland Pascal; C: El editor de Turbo Pascal 7.0; D: El Entorno Integrado de Desarrollo (los diferentes mens y sus sucesivas opciones); E: Operaciones ms usuales con Turbo Pascal 7.0; F: Directivas de compilacin; G: Depuracin
de programas en T u r b o Pascal; H: Mensajes y cdigos de error que se producen en el
desarrollo real de programas; I: U n a gua de referencia del lenguaje Turbo Pascal; J: Los
diagramas de sintaxis de los elementos de un programa en Turbo Pascal; K: Gua del
usuario ISO/ANSI Pascal estndar; L: Diferencias entre Pascal estndar y Turbo Pascal.

Agradecimientos en la primera edicin


Muchas personas han intervenido en el desarrollo de este libro y a muchas de ellas les
debo mi reconocimiento ms sincero por la ayuda y colaboracin prestada.
Los profesores Ignacio Zahonero, Rubn Garca y Paloma Centenera del Depart a m e n t o de Lenguajes y Sistemas Informticos del Centro Superior de Estudios de Informtica (CESIES) de la Universidad Pontificia de Salamanca en Madrid me han
revisado algunas partes del libro, dndome sugerencias y detectando erratas. Especial relevancia han tenido en esta obra los siguientes profesores del Departamento citado anteriormente: Jos Luis Andrs Garca (la lectura detallada de la mitad del primer manuscrito, sus sugerencias, un par de programas cedidos de sus clases y su apoyo personal
han contribuido notablemente a los quince primeros captulos de la obra) y Angel Hermoso (su labor es de un valor inapreciable para m ya que ha ledo y depurado en
algn caso la mayora de los segmentos, subprogramas y programas del libro; mi reconocimiento ms sincero). A ambos compaeros y, sin embargo, amigos, mi gratitud.
El profesor Carlos de la Fuente Chacn, experto en WordPerfect, me ha ayudado en la
adaptacin de los listados de Turbo Pascal a WordPerfect para su mejor impresin en
papel. A Lourdes y Cristina por su excelente trabajo de mecanografiado.
Finalmente deseo agradecer al equipo editor de la Divisin Profesinoal de McGrawHill: Jorge Piernavieja y Eduardo Susanna, su apoyo constante a la obra; en especial de-

XXi

Programacin

en Turbo/Borland

Pascal 7

seo reconocer las facilidades y la ayuda material que Eduardo Susanna, mi editor y amigo,
me ha proporcionado en la materializacin prctica de la impresin de los numerosos
listados de la obra, a fin de conseguir una mejor legibilidad de los mismos por el lector.

Agradecimientos en la segunda edicin


En esta segunda edicin hemos de agradecer, de modo especial, la contribucin prestada
por la profesora de la Universidad Pontificia de Salamanca en Madrid, Matilde Fernndez Azuela. Ha revisado el manuscrito completo de la primera edicin, as como los
nuevos captulos introducidos en esta edicin. Sus sabios consejos, junto con la depuracin de programas, han hecho que su experiencia docente en la Facultad y Escuela Universitaria de nuestra Universidad se haya transmitido en esta obra. Mi agradecimiento
eterno, compaera y sin embargo amiga.
Muchas otras personas han contribuido en esta nueva edicin con sus ideas, sugerencias, crticas, aportaciones... Por suerte para el autor, esta contribucin ha venido de uno
y otro lado del Atlntaico, donde numerosos profesores y alumnos han tenido la amabilidad de impartir o seguir sus cursos de programacin con la primera edicin. Para m
ha sido uno honor recibir ayuda material y aliento, as como crticas, de numerosos colegas, alumnos, estudiosos, aficionados... Mi agradecimiento ms sincero para todas ellas
y confo que esta nueva edicin recoja todo su apoyo que para m ha sido un gran estmulo y de un valor inapreciable.
Eran obligados los prrafos anteriores, pues nobleza obliga, pero como correra el grave
riesgo de dejar en el tintero nombres o instituciones, he preferido centrarme en aquellos
profesores que dentro de mi Universidad han utilizado, consultado o simplemente criticado la primera edicin, reiterando de nuevo mi agradecimiento a todas esas personas
no citadas, pero a las cuales tanto debo.
As, deseo expresar pblicamente mi reconocimiento a los siguientes profesores de la
Facultad y Escuela Universitaria de Infortica y por suerte para m, sin embargo, amigos de la Universidad Pontificia de Salamanca en el campus de Madrid: Lucas Snchez, Joaqun Abeger, Antonio Muoz, Luis Villar, Luis Rodrguez, Matilde Fernndez,
Isabel Tokrralvo, M. a Mar Garca, Angela Carrasco, Ignacio Zahonero, Juan I. Prez,
Angel Hermoso, Juan A. Riesco, Rubn Garca, Miguel Snchez, Jess Cobo, Francisco
Navarro, Mercedes Vargas, Jess Prez, Paloma Centenera, Francisco Oliva, Antonio
Reus, Rafael Ojeda, Jos Luis Andrs, Julin Margolles, Vctor Garca y Manuel Riquelme. Todos ellos, y seguramente alguno ms que en este momento no me viene a la
cabeza -y a quien pido disculpas por su ausencia no deseada por m, han utilizado
la obra y en una u otra forma han contribuido a que esta segunda edicin vea la luz.
Como en muchas otras ocasiones mi buen amigo y a la vez editor, Jorge Piernavieja,
me ha apoyado y aconsejado en las sucesivas fases de la produccin y especialmente en
las sucesivas revisiones. Gracias, amigo Jorge.
Majadahonda (Madrid), mayo de 1993

AGRADECIMIENTOS
EN LA TERCERA EDICIN

Muchas seran las personas a las que debera agradecer la existencia de esta tercera edicin. Profesores y estudiantes de Espaa y Latinoamrica han utilizado y estudiado con
las ediciones anteriores y nos han dado ideas, consejos y corregido erratas de todo tipo.
Estas personas son, esencialmente, a quienes mayor agradecimiento debo y, por eso, deseo reconocerlo en primer lugar, y he de reconocer, de nuevo, el honor que para m ha
supuesto recibir la ayuda material, el aliento y las crticas de numerosos colegas, alumnos, profesionales y autodidactas. Reitero mi agradecimiento eterno a toda esta inmensa
cantidad de personas que han confiado en mis ediciones anteriores. Espero responder a
esa confianza depositada en mis obras y que esta nueva edicin contemple todo el apoyo
y estmulo que he recibido desde el ao 1990 en que apareci la primera edicin.
De modo especial quiero agradecer, expresamente, la ayuda prestada en la revisin
de las pruebas de esta tercera edicin de los siguientes profesores y sin embargo amigos de la Facultad de Informtica y Escuela Universitaria de Informtica de la Universidad Pontificia de Salamanca en Madrid: Matilde Fernndez Azuela, Antonio Muoz Clemente, Luis Villar Pizarro, ngela Carrasco, Isabel Torralba, M. a del Mar Garca,
Francisco Mata, Hctor Castn, Miguel ngel Sicilia, Rosa Pernndez, Salvador Snchez, Francisco Agueva, Miguel Snchez, Jess Prez, Ignacio Zahonero, Paloma Centenera y ngel Hermoso. Adems, de modo muy particular, al gran nmero de profesores de universidades espaolas y latinoamericanas que han utilizado como referencia
este libro en sus dos primeras ediciones en sus clases de algoritmos, programacin y estructura de datos.
Asimismo, y como siempre sucede en mi caso el equipo editorial de McGrawHill me ha prestado todo su apoyo para que esta tercera edicin vea la luz. De modo
especial deseo expresar mi agradecimiento al editor y sin embargo amigo Carmelo
Snchez Gonzlez, por su comprensin, paciencia y ayuda material en la edicin de la
obra.
Por ltimo, quiero terminar con mi agradecimiento eterno a mis alumnos, pasados,
presentes y futuros, que son la mayor fuente de inspiracin que tengo. A ellos debo, en
gran parte, que esta obra vea de nuevo la luz, ya que de ellos he aprendido, y seguir
aprendiendo, la ciencia de la comprensin, el entendimiento y el agradecimiento. Como
dice ese viejo refrn espaol: De bien nacido es ser agradecido, y ese es mi reconocimiento a mis alumnos.
Majadahonda (Madrid), octubre de 1997

CAPITULO l

INTRODUCCION A LA CIENCIA
DE LAS COMPUTADORAS
Y A LA PROGRAMACION

CONTENIDO
1.1.
1.2.
1.3.
1.4.
1.5.
1.6.
1.7.
1.8.

Qu es una computadora?
Organizacin fsica de una c o m p u t a d o r a (hardware)
El software (ios programas)
Los lenguajes de programacin
La resolucin de problemas con c o m p u t a d o r a
Programacin modular
Programacin estructurada
Los lenguajes Pascal y Turbo Pascal

RESUMEN
EJERCICIOS

Las c o m p u t a d o r a s electrnicas m o d e r n a s son uno de los productos


m s importantes del siglo xx y especialmente de las d o s ltimas
d c a d a s . Son una herramienta esencial en m u c h a s reas: industria,
gobierno, ciencia, educacin,..., en realidad en casi t o d o s ios camp o s de n u e s t r a s vidas. El papel de los programas de c o m p u t a d o r a s
e s esencial; sin una lista de instrucciones a seguir, la computadora e s
virtualmente intil. Los lenguajes de programacin nos permiten escribir e s o s p r o g r a m a s y por consiguiente c o m u n i c a m o s con las
computadoras.
En esta obra, u s te d comenzar a estudiar la ciencia de las comput a d o r a s o informtica a t r a v s de uno de los lenguajes de programacin m s verstiles disponibles hoy da: el lenguaje Pascal, y en particular profundizar en una de sus versiones, s e g u r a m e n t e la m s pot e n t e y eficiente: Turbo y Borland Pascal.
Este captulo le introduce a la computadora y sus c o m p o n e n t e s ,
as c o m o a los lenguajes de programacin, y a la metodologa a
seguir para la resolucin de problemas con c o m p u t a d o r a s y con una
herramienta denominada Turbo Pascal.

Programacin en Turbo/Borland Pascal 7

1.1.

Introduccin a la ciencia de las computadoras

QUE ES UNA COMPUTADORA?

y a la programacin

UCP (Procesador)

Una computadora1 o computador es un dispositivo electrnico utilizado para procesar


informacin y obtener resultados. Los datos y la informacin se pueden introducir en la
c o m p u t a d o r a c o m o entrada ( i n p u t ) y a continuacin se procesan para producir u n a
salida (output, resultados), como se observa en la Figura 1.1.

Unidad de
control

COMPUTADORA

Dispositivos
de
entrada

Programa

Datos
de
entrada

Datos
de
salida

Memoria
central

Dispositivos
de
salida

Unidad
lgica y
aritmtica

Memoria
externa
(almacenamiento
permanente)

Figura 1 . 1 . P r o c e s o de informacin en una c o m p u t a d o r a .

Los componentes fsicos que constituyen la computadora, j u n t o con los dispositivos


que realizan las tareas de entrada y salida, se conocen con el trmino hardware (traducido en ocasiones por material). El conjunto de instrucciones que hacen funcionar a la
computadora se denomina programa; a la persona que escribe programas se llama programador y al conjunto de programas escritos para una computadora se llama software
(traducido en ocasiones por logical). Este libro se dedicar casi exclusivamente al software, pero se har una breve revisin del hardware como recordatorio o introduccin segn
sean los conocimientos del lector en esta materia.

1.2.

ORGANIZACION FISICA DE UNA COMPUTADORA


(HARDWARE)

La mayora de las computadoras, grandes o pequeas, estn organizadas como se muestra en la Figura 1.2. Ellas constan de cinco componentes principales: dispositivos de
entrada, dispositivos de salida, unidad central de proceso (UCP) o procesador, memoria
interna y memoria externa.

1.2.1.

Dispositivos de Entrada/Salida (E/S)

Los dispositivos de Entrada/Salida


(E/S) [Input/Output
comunicacin entre la computadora y el usuario.

(I/O), en ingls] permiten la

' En Espaa est muy extendido el trmino ordenador para referirse a la traduccin de la palabra inglesa
computer.

Figura 1 . 2 . Organizacin fsica d e una c o m p u t a d o r a .

Los dispositivos de entrada, como su nombre indica, sirven para introducir datos
(informacin) en la computadora para su proceso. Los datos se leen de los dispositivos
de entrada y se almacenan en la memoria central o interna. Los dispositivos de entrada
convierten la informacin de entrada en seales elctricas que se almacenan en la memoria central. Dispositivos de entrada tpicos son los teclados; otros son: lectores de
tarjetas ya casi en desuso, lpices pticos, palancas de mando (joystick), lectores de
cdigos de barras, etc. Hoy da es muy frecuente que el usuario utilice un dispositivo de
entrada llamado ratn que mueve un puntero electrnico sobre la pantalla que facilita la
interaccin usuario-mquina.
Los dispositivos de salida permiten representar los resultados (salida) del proceso de
los datos. El dispositivo de salida tpico es la pantalla (CRT) 2 o monitor. Otros dispositivos de salida son: impresoras (imprimen resultados en papel), trazadores grficos [plotters), reconocedores de voz, etc.
El teclado y la pantalla constituyen en muchas ocasiones un nico dispositivo,
denominado terminal. Un teclado de terminal es similar al teclado de una mquina de
escribir moderna con la diferencia de algunas teclas extras que tiene el terminal para
funciones especiales. Si est utilizando una computadora personal, el teclado y el monitor son dispositivos independientes conectados a la computadora por cables. En ocasiones a la impresora se la conoce como dispositivo de copia dura ("hard copy"), debido a
2

Cathode Ray Tube: Tubo de rayos catdicos.

Introduccin a la ciencia de las computadoras

Programacin en Turbo/Borland Pascal 7

1.2.2.

y a la programacin

La memoria central (interna)

La memoria central o simplemente memoria (interna o principal) se utiliza para almacenar informacin. En general, la informacin almacenada en memoria puede ser de dos
tipos: las instrucciones de un programa y los datos con los que operan las instrucciones.
Por ejemplo, para que un programa se pueda ejecutar (correr, rodar, funcionar,..., en
ingls run), debe ser situado en la memoria, en una operacin denominada carga (load)
del programa. Despus, cuando se ejecuta el programa, cualquier dato a procesar por el
programa se debe llevar a la memoria mediante las instrucciones del programa.
La memoria central de una computadora es una zona de almacenamiento organizada en centenares o millares de unidades de almacenamiento individual o celdas.

Figura 1 . 3 .

C o m p u t a d o r a personal profesional m o d e l o Pentium 2 0 0 MMX con dispositivos


d e entrada (teclado y ratn), un dispositivo de salida (monitor) y d i s p o s i t i v o s d e
e n t r a d a / s a l i d a (unidades d e d i s c o m a g n t i c o y CD-ROM).

que la escritura en la impresora es una copia permanente (dura) de la salida, y a la


pantalla se le denomina en contraste: dispositivo de copia blanda ("soft copy"), ya que se
pierde la pantalla actual cuando se visualiza la siguiente.

Figura 1 . 5 .

Figura 1 . 4 . Dispositivo d e salida (impresora).

C o m p u t a d o r a porttil digital.

La unidad elemental de memona se llama byte (octeto). Un byte tiene la capacidad


de almacenar un carcter de informacin, y est formado por un conjunto de unidades
ms pequeas de almacenamiento denominadas bits, que son dgitos binarios (0 o 1).
Generalmente se acepta que un byte contiene ocho bits. Por consiguiente, si se desea
almacenar la frase
Hola Mortimer todo va b i e n .

Los dispositivos de entrada/salida y los dispositivos de almacenamiento secundario o


auxiliar (memoria externa) se conocen tambin con el nombre de dispositivos perifricos
o simplemente perifricos ya que, normalmente, son externos a la computadora.
Algunos terminales (PC,s) estn equipados con caractersticas grficas (Fig. 1.5), los
cuales permiten que la salida se visualice en un grfico o dibujo de dos dimensiones.

la computadora utilizar exactamente 27 bytes consecutivos de memoria. Obsrvese


que, adems de las letras, existen cuatro espacios en blanco y un punto (un espacio es un
carcter que emplea tambin un byte). De modo similar, el nmero del pasaporte
P57487891

Programacin en Turbo/Borland Pascal 7

Introduccin a la ciencia de las computadoras

y a la programacin

En la actualidad las computadoras personales tipo PC tienen memorias centrales de


512 o 640 k, aunque ya es muy frecuente ver PC,s con memorias de 1,2, etc., Mb.

ocupar 9 bvtes, pero si se almacena como


P5-748-7891

ocupar 11. Estos datos se llaman alfanumricos, y pueden constar del alfabeto, dgitos o
incluso caracteres especiales (smbolos: $, # , *, etc.).
Mientras que cada carcter de un dato alfariumrico se almacena en un byte, la
informacin numrica se almacena de un modo diferente. Los datos numricos ocupan
2, 4 e incluso 8 bvtes consecutivos, dependiendo del tipo de dato numrico (se ver en el
Captulo 3).
Existen dos conceptos importantes asociados a cada byte o posicin de memoria: su
direccin y su contenido. Cada celda o byte tiene asociada una nica direccin que indica
su posicin relativa en memoria y mediante la cual se puede acceder a la posicin para
almacenar o recuperar informacin. La informacin almacenada en una posicin de
memoria es su contenido. La Figura 1.6 muestra una memoria de computadora que
consta de 1.000 posiciones en memoria con direcciones de 0 a 999. El contenido de estas
direcciones o posiciones de memoria se llaman palabras, de modo que existen palabras
de 8, 16, 32 y 64 bits. Por consiguiente, si trabaja con una mquina de 32 bits, significa
que en cada posicin de memoria de su computadora puede alojar 32 bits, es decir, 32
dgitos, bien ceros o unos.
Siempre que una nueva informacin se almacena en una posicin, se destruye (desaparece) cualquier informacin que en ella hubiera y no se puede recuperar. La direccin
es permanente y nica, el contenido, puede cambiar mientras se ejecuta un programa.
La memoria central de una computadora puede tener desde unos centenares de
millares de bvtes hasta millones de bvtes. Como el byte es una unidad elemental de
almacenamiento, se utilizan mltiplos para definir el tamao de la memoria central:
Kilo-byte (KB o Kb) igual a 1.024 bvtes (210) prcticamente se toman 1.000 y Megabvte (MB o Mb) igual a 1.024 x 1.024 bvtes (220) prcticamente se considera un
1 ".000.000.

direcciones 999
998
997

325

Contenido de la direccin 997

1.2.3.

La Unidad Central de Proceso (UCP)

La Unidad Central de Proceso, UCP (Central Processing Unit, CPU, en ingls), dirige y
controla el proceso de informacin realizado por.la computadora. La UCP procesa o
manipula la informacin almacenada en memoria; puede recuperar informacin desde
memoria (esta informacin son datos o instrucciones: programas). Tambin puede almacenar los resultados de estos procesos en memoria para su uso posterior.
La UCP consta de dos componentes: unidad de control (UC) y unidad aritmticolgica (UAL) (Fig. 1.7). La unidad de control (Control Unit, CU) coordina las actividades
de la computadora y determina qu operaciones se deben realizar y en qu orden;
asimismo controla y sincroniza todo el proceso de la computadora.

Unidad Central de Proceso


Unidad lgica
y aritmtica

Memoria
central

Unidad de
control

Programa

Datos de
entrada

Datos de
salida

Figura 1 . 7 , Unidad Central d e P r o c e s o .

La unidad aritmtico-lgica (Arithmetic-Logic Unit, ALU) realiza operaciones aritmticas y lgicas, tales como suma, resta, multiplicacin, divisin y comparaciones.
Los datos en la memoria central se pueden leer (recuperar) o escribir (cambiar) por
la UCP.

1.2.4. Memoria auxiliar (externa)

3
2
1

0
Figura 1 . 6 . Memoria central d e una c o m p u t a d o r a .

Cuando un programa se ejecuta, se debe situar primero en memoria central de igual


modo que los datos. Sin embargo, la informacin almacenada en la memoria se pierde
(borra) cuando se apaga (desconecta de la red elctrica) la computadora, y por otra parte
la memoria central es limitada en capacidad. Por esta razn, para poder disponer de
almacenamiento permanente, tanto para programas como para datos, s necesitan dispositivos de almacenamiento secundario, auxiliar o masivo ("mass storage", o "secondary storage").
Los dispositivos de almacenamiento o memorias auxiliares (externas o secundarias)
ms comnmente utilizados son: cintas magnticas y discos magnticos. Las cintas son

Programacin en Turbo/Borland Pascal 7

utilizadas principalmente por sistemas de computadoras grandes similares a las utilizadas en los equipos de audio. Los discos y disquetes magnticos se utilizan por todas las
computadoras, especialmente las medias y pequeas las computadoras personales.
Los discos pueden ser rgidos o duros (tecnologa Winchester), de gran capacidad de
almacenamiento (10 a centenares de Mb), disquetes o discos flexibles ("floppy disk")
(360 Kb a 1,2 Mb) o microdiscos de naturaleza dura y ms manejables y prcticos que
los discos flexibles (720 Kb y 1,44 Mb). El tamao fsico de los disquetes y por el que son

Introduccin a la ciencia de las computadoras

y a la programacin

conocidos es de 5'A", 3Vi" y 3", siendo las dimensiones estndar 5'A y 3Vi pulgadas, de
capacidades 360 Kb o 1,2 Mb y 720 Kb o 1,44 Mb, respectivamente.
La informacin almacenada en la memoria central es voltil (desaparece cuando se
apaga la computadora) y la informacin almacenada en la memoria auxiliar es permanente.
Esta informacin se organiza en unidades independientes llamadas archivos (ficheros,
file en ingls). Los resultados de los programas se pueden guardar como archivos de
datos y los programas que se escriben se guardan como archivos de programas, ambos en
la memoria auxiliar. Cualquier tipo de archivo se puede transferir fcilmente desde la
memoria auxiliar hasta la memoria central para su proceso posterior.
En el campo de las computadoras es frecuente utilizar la palabra memoria y almacenamiento o memoria externa, indistintamente. En este libro y recomendamos su
uso se utilizar el trmino memoria slo para referirse a la memoria central.
Comparacin de la memoria central y la memoria auxiliar
La memoria central o principal es mucho ms rpida y cara que la memoria auxiliar. Se
deben transferir los datos desde la memoria auxiliar hasta la memoria central, antes de
que puedan ser procesados. Los datos en memoria central son: voltiles y desaparecen
cuando se apaga la computadora. Los datos en memoria auxiliar son permanentes y no
desaparecen cuando se apaga la computadora.

1.2.5. Las computadoras multimedia


Hoy da las computadoras personales profesionales y domsticas tienen prcticamente
en un gran porcentaje incorporadas caractersticas multimedia (CD-ROM, tarjeta
de sonido, altavoces y micrfono) que permiten integrar texto, sonido, grficos e imgenes en movimiento. Las computadoras multimedia pueden leer discos CD-ROM de
gran capacidad de almacenamiento. Esta caracterstica ha hecho que la mayora de los
fabricantes de software comercialicen sus compiladores (programas de traduccin de lenguajes de programacin) en CD-ROM, almacenando en un solo disco lo que antes necesitaba seis, ocho o doce disquetes.

Figura 1 . 8 .

M e m o r i a s auxiliares: a) disco duro d e 3'/2" 3 ; b) unidad y lector ZIP d e 1 0 0 Mb.

pulgada, medida inglesa equivalente a 2,54 cm.

Figura 1 . 9 .

C o m p u t a d o r a multimedia.

10

1.3.

Programacin en Turbo/Borland Pascal 7

EL SOFTWARE (LOS PROGRAMAS)

Las operaciones que debe realizar el hardware son especificadas por una lista de instrucciones, llamadas programas, o software. El software se divide en dos grandes grupos:
software del sistema y software de aplicaciones.
El software del sistema es el conjunto de programas indispensables para que la mquina funcione; se denominan tambin programas del sistema. Estos programas son,
bsicamente, el sistema operativo, los editores de texto, los compiladores/intrpretes (lenguajes de programacin) y los programas de utilidad.
Uno de los programas ms importantes es el sistema operativo, que sirve, esencialmente, para facilitar la escritura y uso de sus propios programas. El sistema operativo
dirige las operaciones globales de la computadora, instruye a la computadora para ejecutar otros programas y controla el almacenamiento y recuperacin de archivos (programas y datos) de cintas y discos. Gracias al sistema operativo es posible que el programador pueda introducir y grabar nuevos programas, as como instruir a la computadora
para que los ejecute. Los sistemas operativos pueden ser: monousuarios (un solo usuario)
y multiusuarios, o tiempo compartido (diferentes usuarios), atendiendo al nmero de
usuarios y monocarga (una sola tarea) o multirea (mltiples tareas) segn las tareas
(procesos) que puede realizar simultneamente. Turbo Pascal corre (funciona) por ahora
en el sistema operativo de disco D O S monousuario, monotarea y Windows 95
multitarea, que soportan las computadoras personales PC, XT, AT y PS/2, computadoras Macintosh de Apple y en el ya clsico UNIX.

Introduccin a la ciencia de las computadoras

y a la programacin

11

Los lenguajes de programacin sirven para escribir programas que permitan la comunicacin usuario/mquina. Unos programas especiales llamados traductores (compiladores e intrpretes) convierten las instrucciones escritas en lenguajes de programacin en
instrucciones escritas en lenguajes mquina (0 y 1, bits) que sta pueda entender.
Los programas de utilidad4 facilitan el uso de la computadora. Un buen ejemplo es
un editor de textos que permite la escritura y edicin de documentos. Este libro ha sido
escrito en un editor de textos o procesador de palabras (" word procesor").
Los programas que realizan tareas concretas, nminas, contabilidad, anlisis estadsticos, etc., es decir, los programas que podr escribir en Turbo Pascal, se denominan
programas de aplicacin. A lo largo del libro se vern pequeos programas de aplicacin
que muestran los principios de una buena programacin de computadora.

Se debe diferenciar entre el acto de crear un programa y la accin de la computadora cuando ejecuta las instrucciones del programa. La creacin de un programa se hace
inicialmente en papel y a continuacin se introduce en la computadora y se convierte en
lenguaje entendible por la computadora. La Figura 1.12 muestra el proceso general de
ejecucin de un programa: aplicacin de una entrada (datos) al programa y obtencin de
una salida (resultados). La entrada puede tener una variedad de formas, tales como
nmeros o caracteres alfabticos. La salida puede tambin tener formas, tales como
datos numricos o caracteres, seales para controlar equipos o robots, etc.
Figura 1 . 1 0 .

Diferentes p r o g r a m a s d e s o f t w a r e .

Utility: programa de utilidad.

12

Introduccin a la ciencia de las computadoras

Programacin en Turbo/Borland Pascal 7

0010
1001

Datos de salida
(resultados)

Datos de
entrada

Figura 1 . 1 2 .

Otros
dispositivos
: externos
Accin de un p r o g r a m a d o r .

La ejecucin de un programa requiere generalmente unos datos como entrada


(Figura 1.13), adems del propio programa, para poder producir una salida.
Memoria
externa

UCP
Sistema
operativo
Programa

Entrada
(Datos)

Programa

Salida
(resultados)

1.4.

Ejecucin d e un p r o g r a m a .

LOS LENGUAJES DE PROGRAMACION

Los lenguajes utilizados para escribir programas de computadoras que puedan ser entendidos por ellas se denominan lenguajes de programacin.
Los lenguajes de programacin se clasifican en tres grandes categoras: mquina, bajo
nivel (ensamblador) y alto nivel.

1.4.1. Lenguaje mquina


Los lenguajes mquina son aquellos cuyas instrucciones son directamente entendibles
por la computadora y no necesitan traduccin posterior para que la U C P pueda comprender y ejecutar el programa. Las instrucciones en lenguaje mquina se expresan en
trminos de la unidad de memoria ms pequea, el bit (dgito binario 0, o bien 1), en

0000
0001

0000
1001

1001
1110

Como se puede observar, estas instrucciones sern fciles de leer por la computadora
y difciles por un programador, y viceversa. Esta razn hace difcil escribir programas en
cdigo o lenguaje a mquina y requiere buscar otro lenguaje para comunicarse con la
computadora, pero que sea ms fcil de escribir y leer por el programador. Para evitar la
tediosa tarea de escribir programas en lenguaje maquina se han diseado otros lenguajes
de programacin que facilitan la escritura y posterior ejecucin de los programas. Estos
lenguajes son los de bajo y alto nivel.

1.4.2. Lenguajes de bajo nivel (ensambladores)


La programacin en lenguaje mquina es difcil, por ello se necesitan lenguajes que
permitan simplificar este proceso. Los lenguajes de bajo nivel han sido diseados para
ese fin.
Estos lenguajes son generalmente dependientes de la mquina, es decir, dependen de
un conjunto de instrucciones especficas de la computadora. Un lenguaje tpico de bajo
nivel es el lenguaje ensamblador. En este lenguaje las instrucciones se escriben en cdigos
alfabticos conocidos como nemotcnicos (abreviaturas de palabras inglesas o espaolas).
As, por ejemplo, nemnicos tpicos son:
ADD
SUB

suma
resta

MPY
DI V

multiplicar
dividir

LDA
ST0

cargar acumulador
almacenar

Las palabras nemotcnicas son mucho ms fciles de recordar que las secuencias de
dgitos 0 y 1. U n a instruccin tpica en ensamblador puede ser:
ADD

Figura 1 . 1 3 .

13

esencia una secuencia de bits que especifican la operacin y las celdas de memoria
implicadas en una operacin. U n a serie de instrucciones en lenguaje mquina son:

UCP

Terminal

Programador

y a la programacin

x,y,z

Esta instruccin significa que se deben sumar los nmeros almacenados en las direcciones x,y, y almacenar el resultado en la direccin z. El programa ensamblador traducir

MOVE
ADD
COMP
BE
MOVE
X, ADD

etc.

A, B
C, A
C, D
X
E, 0
A, E

01010010000000100010010100100110

00100100001000100010011100100101
11000101000000100010011100101000
101011010000000011001101
01010010000000010010100100000000
00100100001000010010010100101001

etc.

a)
Figura 1 . 1 4 .

b)
a) P r o g r a m a en c d i g o mquina, b) P r o g r a m a en e n s a m b l a d o r .

14

la instruccin a cdigo mquina. Por ejemplo ADD se puede traducir a 1110, jc se puede
traducir por 1001, y por 1010, z por 1011. La instruccin traducida seria
1110

1001

1010

1011

(ADD x , y , z )

Despus que un programa ha sido escrito en lenguaje ensamblador se necesita un


programa llamado ensamblador que lo traduzca a cdigo mquina.

1.4.3.

Lenguajes de alto nivel

Los lenguajes de programacin de alto nivel (ADA, BASIC, COBOL, FORTRAN, Modula-2, Pascal, etc.) son aquellos en los que las instrucciones o sentencias a la computadora son escritas con palabras similares a los lenguajes humanos en general lenguaje
ingls, como es el caso de Turbo Pascal, lo que facilita la escritura y la fcil comprensin por el programador.
Por ejemplo, las lneas siguientes son: una lnea de un programa en Turbo Pascal y su
lnea equivalente en pseudocdigo.
IF (x=y) AND (z=w) THEN WRITE ( ' E s t o es una p r u e b a ' ) ;
s i (x=y) y (z=w) entonces ESCRIBIR ( ' E s t o es una p r u e b a ' )

Esta lnea se puede comprender fcilmente conociendo la traduccin de las palabras


inglesas IF (si), T H E N (entonces), WRITE (escribir/imprimir), AND (y) y sin necesidad
de mucha explicacin. Es posible escribir tambin operaciones como
z: =x+y;

la suma x + y se asigna a la variable z

Los lenguajes de programacin son en general transportables5. Esto significa


que un programa escrito en un lenguaje de alto nivel se puede escribir con poca o
ninguna modificacin en diferentes tipos de computadoras. Otra propiedad de estos
lenguajes es que son independientes de la mquina, esto es, las sentencias del programa
no dependen del diseo hardware de una computadora especfica.
Los programas escritos en lenguaje de alto nivel no son entendibles directamente por
la mquina. Necesitan ser traducidos a instrucciones en lenguaje mquina que entiendan las computadoras. Los programas que realizan esta traduccin se llaman compiladores, y los programas escritos en un lenguaje de alto nivel se llaman programas fuente. El
compilador traduce el programa fuente en un programa llamado programa objeto. Este
programa objeto se utiliza en la fase de ejecucin del programa. El proceso de traduccin
de un programa fuente se denomina compilacin y tras la fase de enlace se obtiene un
programa ejecutable directamente por la computadora.

1.5.

Introduccin a la ciencia de las computadoras

Programacin en Turbo/Borland Pascal 7

LA RESOLUCION DE PROBLEMAS CON COMPUTADORA

El proceso de resolucin de un problema con una computadora conduce a la escritura de


un programa y a su ejecucin en la misma. Aunque el proceso de disear programas es
5
Turbo Pascal, es transportable (portable) a Pascal estndar siempre y cuando no se utilicen sentencias
especficas de Turbo Pascal. Vase Apndice L.

y a la programacin

15

esencialmente un proceso creativo, se pueden considerar una serie de fases o pasos


comunes, que generalmente deben seguir todos los programadores.
Las fases de resolucin de un problema con computadoras son:

Anlisis del problema.


Diseo del algoritmo.
Codificacin.,
Compilacin y ejecucin.
Verificacin.
Depuracin.
Documentacin.

Las dos primeras fases conducen a un diseo detallado escrito en forma de algoritmo.
Durante la tercera etapa (codificacin) se implemento6 el algoritmo en un cdigo escrito
en un lenguaje de programacin, reflejando las ideas desarrolladas en las fases de anlisis
y diseo.
La fase de compilacin y ejecucin traduce y ejecuta el programa. En las fases de
verificacin y depuracin el programador busca errores de las etapas anteriores y los
elimina. Comprobar que mientras ms tiempo se gaste en la fase de anlisis y diseo,
menos se gastar en la depuracin del programa. Por ltimo, se debe realizar la documentacin del programa.
Antes de conocer las tareas a realizar en cada fase, vamos a considerar el concepto y
significado de la palabra algoritmo.
La palabra algoritmo se deriva de la traduccin al latn de la palabra rabe Alkhwarizmi7, nombre de un matemtico y astrnomo rabe que escribi un tratado sobre
manipulacin de nmeros y ecuaciones en el siglo IX.
Un algoritmo es un mtodo para resolver un problema mediante una serie de pasos
precisos, definidos y finitos.

Caractersticas de un algoritmo
preciso (indicar el orden de realizacin en cada paso)
definido (si se sigue dos veces, obtiene el mismo resultado cada vez)
jlnito (tiene fin; un nmero determinado de pasos)

Un algoritmo debe producir un resultado en un tiempo finito. Los mtodos que


utilizan algoritmos se denominan mtodos algortmicos, en oposicin a los mtodos que
implican algn juicio o interpretacin que se denominan mtodos heursticos. Los mtodos algortmicos se pueden implementar en computadoras; sin embargo, los procesos
heursticos no han sido convertidos fcilmente en las computadoras. En los ltimos aos
las tcnicas de inteligencia artificial han hecho posible la implementacin del proceso
heurstico en computadoras.
6
En la ltima edicin (21.a) del DRAE (Diccionario de la Real Academia Espaola) se ha aceptado el
trmino implementar. (Informtica) "Poner en funcionamiento, aplicar mtodos, medidas, etc., para llevar
algo a cabo".
7
Escribi un tratado matemtico famoso sobre manipulacin de nmeros y ecuaciones titulado Kitab
al-jabr w'almugabala. La palabra lgebra se deriv, por su semejanza sonora, de al-jabr.

1 6

Introduccin a la ciencia de las computadoras

Programacin en Turbo/Borland Pascal 7

17

coste original
vida til
valor de recuperacin

Ejemplos de algoritmos son: instrucciones para montar en una bicicleta, hacer una
receta de cocina, obtener el mximo comn divisor de dos nmeros, etc. Los algoritmos
se pueden expresar por frmulas, diagramas de flujo o N-S y pseudocdigos. Esta ltima
representacin es la ms utilizada en lenguajes estructurados como Turbo Pascal.

1.5.1.

y a la programacin

depreciacin anual por ao


depreciacin acumulada en cada ao
valor del automvil en cada ao

Anlisis del problema

La primera fase de la resolucin de un problema con computadora es el anlisis del


problema. Esta fase requiere una clara definicin, donde se contemple exactamente lo
que debe hacer el programa y el resultado o solucin deseada.
Dado que se busca una solucin por computadora, se precisan especificaciones detalladas de entrada y salida. La Figura 1.15 muestra los requisitos que se deben definir
en el anlisis.

depreciacin acumulada
clculo de la depreciacin acumulada cada ao
clculo del valor del automvil en cada ao
La tabla siguiente muestra la salida solicitada.

Figura 1 . 1 5 .

Ao

Depreciacin

Depreciacin
acumulada

Valor anual

1 (1988)
2(1989)
3 (1990)
4(1990)
5 (1992)
6 (1993)

280.000
280.000
280.000
280.000
280.000
280.000

280.000
560.000
840.000
1.120.000
1.400.000
1.680.000

1.520.000
1.240.000
960.000
680.000
400.000
120.000

Anlisis del p r o b l e m a .

1.5.2.
Para poder definir bien un problema es conveniente responder a las siguientes preguntas:
Qu entradas se requieren (tipo y cantidad)?
Cul es la salida deseada (tipo y cantidad)?
Qu mtodo produce la salida deseada?
Problema 1.1
Se desea obtener una tabla con las depreciaciones acumuladas y los valores reales de
cada ao, de un automvil comprado en 1.800.000 pesetas en el ao 1988, durante los
seis aos siguientes suponiendo un valor de recuperacin o rescate de 120.000. Realizar
el anlisis del problema, conociendo la frmula de la depreciacin anual constante D
para cada ao de vida til.
D

cose

~ va^or de recuperacin
vida til

Diseo del algoritmo

En la etapa de anlisis del proceso de programacin se determina qu hace el programa.


En la etapa de diseo se determina cmo hace el programa la tarea solicitada. Los
mtodos ms eficaces para el proceso de diseo se basan en el conocido por divide y
vencers. Es decir, la resolucin de un problema complejo se realiza dividiendo el problema en subproblemas y a continuacin dividir estos subproblemas en otros de nivel
ms bajo, hasta que pueda ser implementada una solucin en la computadora. Este
mtodo se conoce tcnicamente como diseo descendente (top-down) o modular. El
proceso de romper el problema en cada etapa y expresar cada paso en forma ms detallada se denomina refinamiento sucesivo.
Cada subproblema es resuelto mediante un mdulo (subprograma) que tiene un solo
punto de entrada y un solo punto de salida.
Cualquier programa bien diseado consta de un programa principal (el mdulo de
nivel ms alto) que llama a subprogramas (mdulos de nivel ms bajo) que a su vez
pueden llamar a otros subprogramas. Los programas estructurados de esta forma se dice
que tienen un diseo modular y el mtodo de romper el programa en mdulos ms
pequeos se llama programacin modular. Los mdulos pueden ser planeados, codificados, comprobados y depurados independientemente (incluso por diferentes programadores) y a continuacin combinarlos entre s. El proceso implica la ejecucin de los siguientes pasos hasta que el programa se termina:

Introduccin a la ciencia de las computadoras

Programacin en Turbo/Borland Pascal 7

18

1.
2.
3.
4.

y a la programacin

19

Programar un mdulo.
Comprobar el mdulo.
Si es necesario, depurar el mdulo.
Combinar el mdulo con los mdulos anteriores.

El proceso que convierte los resultados del anlisis del problema en un diseo modular con refinamientos sucesivos que permitan una posterior traduccin a un lenguaje se
denomina diseo del algoritmo.
El diseo del algoritmo es independiente del lenguaje de programacin en el que se
vaya a codificar posteriormente.

1.5.3.

Herramientas de programacin

Las dos herramientas ms utilizadas comnmente para disear algoritmos son: diagramas de flujo y pseudocdigos.
Diagramas de flujo
Un diagrama de flujo (Jlowchart) es una representacin grfica de un algoritmo. Los smbolos utilizados han sido normalizados por el Instituto Norteamericano de Normalizacin (ANSI), y los ms frecuentemente empleados se muestran en la Figura 1.16, junto
con una plantilla utilizada para el dibujo de los diagramas de flujo (Fig. 1.17). En la Figura 1.18 se representa el diagrama de flujo que resuelve el problema 1.1.

Figura 1 . 1 7 .

Plantilla para dibujo d e d i a g r a m a s d e flujo.

Aunque no existen reglas para escritura del pseudocdigo en espaol, se ha recogido


una notacin estndar que se utilizar en el libro y que ya es muy empleada en los libros
de programacin en espaol 8 . Las palabras reservadas bsicas se representarn en letras
negritas minsculas. Estas palabras son traduccin libre de palabras reservadas de lenguajes como BASIC, Pascal, etc. Ms adelante se indicarn los pseudocdigos fundamentales a utilizar en esta obra.
Pseudocdigo

del programa

1.1:

P r e v i s i o n e s de d e p r e c i a c i n
Introducir coste
vida t i l
v a l o r f i n a l de r e s c a t e ( r e c u p e r a c i n )
imprimir cabeceras
E s t a b l e c e r el v a l o r i n i c i a l del Ao
Calcular depreciacin
m i e n t r a s valor ao = < vida t i l hacer
c a l c u l a r d e p r e c i a c i n acumulada
calcular valor actual
imprimir una l i n e a de la t a b l a
incrementar el v a l o r del ao
f i n de m i e n t r a s

Pseudocdigo
El pseudocdigo es una herramienta de programacin en la que las instrucciones se escriben en palabras similares al ingls o espaol, que facilitan tanto la escritura como la
lectura de programas. En esencia, el pseudocdigo se puede definir como un lenguaje de
especificacin de algoritmos.

Subprograma

Ejemplo 1.1

Calcular la paga neta de un trabajador conociendo el nmero de horas trabajadas, la


tarifa horaria y la tasa de impuestos.
Algoritmo
1. Leer Horas, Tarifa, Tasa
2. Calcular PagaBruta = Horas*Tarifa

Figura 1 . 1 6 .

S m b o l o s m s utilizados en los d i a g r a m a s d e flujo.

8
Para mayor ampliacin sobre el pseudocdigo, puede consultar, entre otras, algunas de estas obras: Fundamentos de programacin, Luis Joyanes, 2.a edicin, McGraw-Hill, 1996, Madrid; Metodologa de la programacin, Luis Joyanes, McGraw-Hill, 1986, Problemas de Metodologa de la programacin. Luis Joyanes,
McGraw-Hill, 1991, as como Introduccin a la programacin, de Clavel y Biondi, Masson, 1987, o bien Introduccin a la programacin y a las estructuras de datos, de Braunstein y Groia, Editorial Eudeba, Buenos Aires,
1986; tambin, Fundamentos de programacin. Libro de problemas, Luis Joyanes, Luis Rodrguez y Matilde
Fernndez, McGraw-Hill, 1996.

20

Introduccin a la ciencia de las computadoras

Programacin en Turbo/Borland Pascal 7

y a la programacin

21

1. Establecer Contador a 1
2. Establecer Suma a 0
3. mientras Contador ^ 100 hacer
Sumar Contador a Suma
Incrementar Contador en 1
fin_mientras
4. Visualizar Suma

1.5.4.

Codificacin de un programa

Codificacin es la escritura en un lenguaje de programacin de la representacin del


algoritmo desarrollada en las etapas precedentes. Dado que el diseo de un algoritmo es
independiente del lenguaje de programacin utilizado para su implementacin, el cdigo
puede ser escrito con igual facilidad en un lenguaje o en otro.
Para realizar la conversin del algoritmo en programa se deben sustituir las palabras
reservadas en espaol por sus homnimos en ingls, y las operaciones/instrucciones
indicadas en lenguaje natural expresarlas en el lenguaje de programacin correspondiente.
El programa correspondiente al problema 1.1 en Turbo Pascal es:

Figura 1 . 1 8 .

Diagrama d e flujo (problema 1.1)

3. Calcular Impuestos = PagaBruta*Tasa


4. Calcular PagaNeta = PagaBruta - Impuestos
5. Visualizar PagaBruta, Impuestos, PagaNeta

Ejemplo 1 . 2
Calcular el valor de la suma 1 + 2 + 3 + + 100.
Algoritmo
Se utiliza una variable contador como un contador que genere los sucesivos nmeros
enteros, y suma para almacenar las sumas parciales 1, 1 + 2, 1 + 2 + 3,...

program Previsiones;
{ Este programa obtiene una tabla de depreciaciones acumuladas
y valores reales de cada ao de un determinado producto }
var
Coste,
Depreciacin,
Valor_Recuperacin,
Valor_Actual,
Acumulada,
Anio, Vida_Util
: integer;
begin
WriteLn ('Introduzca coste, valor recuperacin y vida til');
ReadLn
(Coste, Valor_Recuperacin, Vida_Util);
WriteLn ('Introduzca ao actual');
ReadLn
(Anio);
Valor_Actual := Coste;
Depreciacin := (Coste - Valor_Recuperacion) / Vida_Util;
Acumulada
:= 0;
Write ('Ao' : 7, ' D e p r e c i a c i n 1 5 , 'Dep. A c u m u l a d a 1 7 ) ;
WriteLn ('Valor_Actual':14) ;
while Anio < Vida_Util do
begin
Acumulada
:= Acumulada + Depreciacin;
Valor_Actual := Valor_Actual - Depreciacin;
Write (Anio :8, Depreciacin :11:1, Acumulada:17:1) ;
Writeln(Valor_Actual:17:1) ;
Anio := Anio + 1
end
end.

22

Programacin en Turbo/Borland Pascal 7

Introduccin a la ciencia de las computadoras

y a la programacin

23

Aunque, lgicamente, no comprenda las sentencias Pascal del programa anterior, es


necesario observe las siguientes caractersticas bsicas que ampliaremos en el Captulo 3.
1. Cabecera del programa. Nombre del programa, autor, fecha de creacin, etc.
2. Lista de variables. Es obligatoria su declaracin en Pascal.
3. Legibilidad. Los programas deben ser lo ms legibles posible, por ello el espaciado
y las sangras (mrgenes interiores) se deben utilizar con frecuencia.
4. Diseo modular. Este simple programa slo consta de un mdulo principal.
5. Documentacin. Los programas deben incluir comentarios internos, en forma de
lneas con separadores { } o bien (* *).
Documentacin interna
a)

Como se ver ms tarde, la documentacin de un programa se clasifica en interna y


externa. La documentacin interna es la que se incluye dentro del cdigo del programa
fuente mediante comentarios que ayudan a la comprensin del cdigo. Todas las lneas
de programas que comiencen con un smbolo { o con un smbolo (* son comentarios. El
programa no los necesita y la computadora los ignora. Estas lneas de comentarios slo
sirven para hacer los programas ms fciles de comprender. El objetivo del programador
debe ser escribir cdigos sencillos y limpios.
Debido a que las mquinas actuales soportan grandes memorias (512 K o 640 K de
memoria central mnima en computadoras personales) no es necesario recurrir a tcnicas de ahorro de memoria, por lo que es recomendable incluya el mayor nmero de
comentarios posibles, pero, eso s, que sean significativos.

1.5,5.

Memoria
externa

Compilacin y ejecucin de un programa

Una vez que el algoritmo se ha convertido en un programa fuente, es preciso introducirlo en memoria mediante el teclado y almacenarlo posteriormente en un disco. Esta
operacin se realiza con un programa editor, posteriormente el programa fuente se convierte en un archivo de programa que se guarda (graba) en disco.
El programa fuente debe ser traducido a lenguaje mquina. Este proceso se realiza
con el compilador y el sistema operativo que se encarga prcticamente de la compilacin. Si tras la compilacin se presentan errores (errores de compilacin) en el programa
fuente, es preciso volver a editar el programa, corregir los errores y compilar de nuevo.
Este proceso se repite hasta que no se producen errores, obtenindose el programa objeto
que todava no es ejecutable directamente. Suponiendo que no existen errores en el
programa fuente, se debe instruir al sistema operativo para que realice la fase de montaje
o enlace (link), carga, del programa objeto con las libreras del programa del compilador.
El proceso de montaje produce un programa ejecutable. La Figura 1.19 describe el proceso completo de compilacin/ejecucin de un programa.
Cuando el programa ejecutable se ha creado, se puede ya ejecutar (correr o rodar)
desde el sistema operativo con slo teclear su nombre (en el caso de DOS). Suponiendo
que no existen errores durante la ejecucin (llamados errores en tiempo de ejecucin), se
obtendr la salida de resultados del programa.
Las instrucciones u rdenes para compilar y ejecutar un programa Pascal puede
variar segn el tipo de compilador. As Turbo Pascal compila y ejecuta con una sola

b)
Memoria
externa

c)
Figura 1 . 1 9 .

F a s e s d e la compilacin/ejecucin d e un p r o g r a m a : a) edicin; b) compilacin;


c) m o n t a j e o enlace.

24

Programacin en Turbo/Borland Pascal 7

orden, mientras que los compiladores clsicos de Pascal siguen un proceso similar al
expuesto anteriormente: compilar, enlazar y ejecutar.

1.5.6.

Verificacin y depuracin de un programa

La verificacin o compilacin de un programa es el proceso de ejecucin del programa


con una amplia variedad de datos de entrada, llamados datos de test o prueba, que
determinarn si el programa tiene errores ("bugs"). Para realizar la verificacin se debe
desarrollar una amplia gama de datos de test: valores normales de entrada, valores extremos de entrada que comprueben los lmites del programa y valores de entrada que
comprueben aspectos especiales del programa.
La depuracin es el proceso de encontrar los errores del programa y corregir o eliminar dichos errores.
Cuando se ejecuta un programa, se pueden producir tres tipos de errores:
1. Errores de compilacin. Se producen normalmente por un uso incorrecto de las
reglas del lenguaje de programacin y suelen ser errores de sintaxis. Si existe un
error de sintaxis, la computadora no puede comprender la instruccin, no se
obtendr el programa objeto y el compilador imprimir una lista de todos los
errores encontrados durante la compilacin.
2. Errores de ejecucin. Estos errores se producen por instrucciones que la computadora puede comprender pero no ejecutar. Ejemplos tpicos son: divisin por cero
y races cuadradas de nmeros negativos. En estos casos se detiene la ejecucin del
programa y se imprime un mensaje de error.
3. Errores lgicos. Se producen en la lgica del programa y la fuente del error suele
ser el diseo del algoritmo. Estos errores son los ms difciles de detectar, ya que el
programa puede funcionar y no producir errores de compilacin ni de ejecucin,
y slo puede advertir el error por la obtencin de resultados incorrectos. En este
caso se debe volver a la fase de diseo del algoritmo, modificar el algoritmo,
cambiar el programa fuente y compilar y ejecutar una vez ms.

1.5.7.

Introduccin a la ciencia de las computadoras

1.6.

y a la programacin

25

PROGRAMACION MODULAR

La programacin modular es uno de los mtodos de diseo ms flexibles y potentes para


mejorar la productividad de un programa. En programacin modular el programa se
divide en mdulos (partes independientes), cada una de las cuales ejecuta una nica
actividad o tarea y se codifican independientemente de otros mdulos. Cada uno de
estos mdulos se analizan, codifican y ponen a punto por separado.
Cada programa contiene un mdulo denominado programa principal que controla
todo lo que sucede; se transfiere el control a submdulos (posteriormente se denominarn subprogramas), de modo que ellos puedan ejecutar sus funciones; sin embargo, cada
submdulo devuelve el control al mdulo principal cuando se haya completado su tarea.
Si la tarea asignada a cada submdulo es demasiado compleja, ste deber romperse en
otros mdulos ms pequeos. El proceso sucesivo de subdivisin de mdulos contina
hasta que cada mdulo tenga solamente una tarea especfica que ejecutar. Esta tarea
puede ser entrada, salida, manipulacin de datos, control de otros mdulos o alguna
combinacin de stos. Un mdulo puede transferir temporalmente (bifurcar) el control a
otro mdulo; sin embargo, cada mdulo debe eventualmente devolver el control al
mdulo del cual se recibe originalmente el control.

Documentacin y mantenimiento

La documentacin de un problema consta de las descripciones de los pasos a dar en el


proceso de resolucin de un problema. La importancia de la documentacin debe ser
destacada por su decisiva influencia en el producto final. Programas pobremente documentados son difciles de leer, ms difciles de depurar y casi imposibles de mantener y
modificar.
La documentacin de un programa puede ser interna y externa. La documentacin
interna es la contenida en lneas de comentarios. La documentacin externa incluye
anlisis, diagramas de flujo y/o pseudocdigos, manuales de usuario con instrucciones
para ejecutar el programa y para interpretar los resultados.
La documentacin es vital cuando se desea corregir posibles errores futuros o bien
cambiar el programa. Tales cambios se denomina mantenimiento del programa. Despus de cada cambio la documentacin debe ser actualizada para facilitar cambios posteriores. Es prctica numerar las sucesivas versiones de los programas 1.0,1.1, 2.0, 2.1, etc.
(Si los cambios introducidos son importantes, se vara el primer dgito [1.0, 2.0,...], en
caso de pequeos cambios slo se vara el segundo dgito [2.0, 2.1,...].)

Figura 1 . 2 0 .

P r o g r a m a c i n modular.

Los mdulos son independientes en el sentido en el que ningn mdulo puede tener
acceso directo a cualquier otro mdulo excepto el mdulo al que llama y sus propios
submdulos. Sin embargo, los resultados producidos por un mdulo pueden ser utilizados por cualquier otro mdulo cuando se transfiera a ellos el control.
Dado que los mdulos son independientes, diferentes programadores pueden trabajar simultneamente en diferentes partes del mismo programa. Esto reducir el tiempo
del diseo del algoritmo y posterior codificacin del programa. Adems, un mdulo se
puede modificar radicalmente sin afectar a otros mdulos, incluso sin alterar su funcin
principal.

26

Programacin en Turbo/Borland Pascal 7

La descomposicin de un programa en mdulos independientes ms simples se conoce tambin como el mtodo de "divide y vencers" (divide and conquer). Se disea
cada mdulo con independencia de los dems, y siguiendo un mtodo ascendente o
descendente se llegar hasta la descomposicin final del problema en mdulos en forma
jerrquica.

1.7.

PROGRAMACION ESTRUCTURADA

Los trminos programacin modular, programacin descendente y programacin estructurada se introdujeron en la segunda mitad de la dcada de los sesenta y a menudo sus
trminos se utilizan como sinnimos aunque no significan lo mismo. Las programaciones modular y descendente ya se han examinado anteriormente. La programacin estructurada significa escribir un programa de acuerdo a las siguientes reglas:

Introduccin a Ia ciencia de las computadoras

1.7.2.

y a la programacin

Diseo descendente ("top-down")

El diseo descendente (top-down) es el proceso mediante el cual un problema se descompone en una serie de niveles o pasos sucesivos de refinamiento (stepwise). La metodologa descendente consiste en efectuar una relacin entre las sucesivas etapas de estructuracin de modo que se relacionasen unas con otras mediante entradas y salidas de informacin. Es decir, se descompone el problema en etapas o estructuras jerrquicas, de
forma que se puede considerar cada estructura desde dos puntos de vista: qu hace? y
cmo lo hace?
Si se considera un nivel n de refinamiento, las estructuras se consideran de la siguiente manera:

El programa tiene un diseo modular.


Los mdulos son diseados de modo descendente.
Cada mdulo se codifica utilizando las tres estructuras de control bsicas: secuencia, seleccin y repeticin.
Si est familiarizado con lenguajes como BASIC y FORTRAN, la programacin estructurada significa tambin programacin sin GOTO (Pascal no requiere el uso de la sentencia GOTO).
El trmino programacin estructurada se refiere a un conjunto de tcnicas que han
ido evolucionando desde los primeros trabajos de Edsgar Dijkstra. Estas tcnicas aumentan considerablemente la productividad del programa reduciendo en elevado grado el
tiempo requerido para escribir, verificar, depurar y mantener los programas. La programacin estructurada utiliza un nmero limitado de estructuras de control que minimizan la complejidad de los programas y por consiguiente reducen los errores; hace los
programas ms fciles de escribir, verificar, leer y mantener. Los programas deben estar
dotados de una estructura.
La programacin estructurada es el conjunto de tcnicas que incorporan:
recursos abstractos
diseo descendente (top-down)
estructuras bsicas

1.7.1.

Nivel /7:-desde el exterior


(o que hace?

Nivel n + 7: Vista desde el interior


"cmo Jo hace?"

El diseo descendente se puede ver en la Figura 1.21.

Recursos abstractos

La programacin estructurada se auxilia de los recursos abstractos en lugar de los recursos concretos de que dispone un determinado lenguaje de programacin.
Descomponer un programa en trminos de recursos abstractos segn Dijkstra
consiste en descomponer una determinada accin compleja en trminos de un nmero
de acciones ms simples capaces de ejecutarlas o que constituyan instrucciones de
computadoras disponibles.

2 7

Figura 1 . 2 1 .

Diseo d e s c e n d e n t e .

28

Programacin en Turbo/Borland Pascal 7

1.7.3.

Estructuras de control

Las estructuras de control de un lenguaje de programacin son mtodos de especificar el


orden en que las instrucciones de un algoritmo se ejecutarn. El orden de ejecucin de
las sentencias (lenguaje) o instrucciones determinan el flujo de control. Estas estructuras
de control son por consiguiente fundamentales en los lenguajes de programacin y en los
diseos de algoritmos especialmente los pseudocdigos.
Las tres estructuras de control bsico son:
secuencia
seleccin
repeticin
y se estudian en ios Captulos 4 y 5.
La programacin estructurada hace los programas ms fciles de escribir, verificar,
leer y mantener; utiliza un nmero limitado de estructuras de control que minimizan la
complejidad de los problemas.

1.7.4.

Teorema de la programacin estructurada:


estructuras bsicas

En mayo de 1966, Bhm y Jacopini demostraron que un programa propio puede ser
escrito utilizando solamente tres tipos de estructuras de control.
secuenciales
selectivas
repetitivas
Un programa se define como propio si cumple las siguientes caractersticas:
Posee un solo punto de entrada y uno de salida o fin para control del programa.
Existen caminos desde la entrada hasta la salida que se pueden seguir y que pasan
por todas las partes del programa.
Todas as instrucciones son ejecutables y no existen lazos o-bucles infinitos (sin
fin).
Los Captulos 4 y 5 se dedican al estudio de las estructuras de control selectivas y
repetitivas.
Sntesis de la programacin estructurada y modular
1 .i piogi amanon estiucturada significa.
l-l protLi.ima completo tiene un diseo modular
1 os modulos se ilisenan con metodologa descendente (puede haceise tambin ascen Cada modulo se codifica utilizando las tos estructuras dt> control basicas secuenciaIes. selectivas y repetitivas (ausencia total de sentencias GOTO)
i.\i> vi mniriiiii E mnihliirulii'i son concepto 5 : complementarios KC solapan).

Introduccin a la ciencia de las computadoras

1.8.

y a la programacin

29

LOS LENGUAJES PASCAL Y TURBO PASCAL

El lenguaje de programacin Pascal es un lenguaje de alto nivel y propsito general (es


aplicable a un gran nmero de aplicaciones diversas) desarrollado por el profesor suizo
Niklaus Wirth como un lenguaje para ensear la programacin de modo (con un mtodo) disciplinado sistemtico. Para realizar este lenguaje, Wirth trat de eliminar las
inconsistencias de otros lenguajes de programacin existentes en su poca, y que sirviera
c o m o se ha comentado para ensear las tcnicas de programacin a sus alumnos.
Una versin preliminar del lenguaje apareci en 1968 y el primer compilador totalmente completo apareci a finales de 1970 (en 1971, segn algunos historiadores informticos). Desde entonces muchos compiladores han sido construidos y estn disponibles
para diferentes mquinas. Durante muchos aos, el libro Pascal User Manual and Report (Informe y Manual del usuario, El Ateneo. Buenos Aires), publicado por Wirth y
Kathleen Jensen en 1974, ha servido de facto c o m o estndar de todas las versiones.
Las diferentes versiones ofrecan interpretaciones ligeramente diferentes que impedan la compatibilidad entre ellas. Por estas razones, diferentes proyectos se iniciaron
para producir una definicin estndar del lenguaje y culminaron en dos estndar: uno de
la International Standards Organization (ISO) en 1982 y otro por un comit conjunto
del American National Standards Institute (ANSI) y del Institute ofElectrical and Electronics Engineers (IEEE). Estas dos versiones o definiciones se conocen como ISO
Pascal y ANSI/IEEE Pascal, y difieren en algunos aspectos no especialmente significativos. Sin embargo, dos versiones no estndar se han popularizado considerablemente:
UCSD (construida por Regents of the University of California) y Turbo Pascal (marca
registrada de Borland International, Inc.). De ellas, Turbo Pascal es sin duda la versin
reina y ha sido la que ha contribuido en gran medida a la popularizacin del
lenguaje Pascal, incluso a nivel de enseanza media.

1.8.1.

Pascal

El lenguaje Pascal estndar presenta una-serie de caractersticas que lo hacen idneo


como primero o segundo lenguaje de programacin, desde el punto de vista del aprendizaje y como lenguaje de propsito general para la resolucin de aplicaciones de todo
tipo: gestin, cientficas, ingeniera, etc. Destacamos en este apartado las caractersticas
ms sobresalientes:

Lenguaje excelente para el aprendizaje de la programacin.


Lenguaje de propsito general.
Lenguaje procedimental (imperativo, orientado a rdenes).
Lenguaje estructurado (soporta las estructuras bsicas while, for y repeat; no necesita el uso de la sentencia goto).
Lenguaje recursivo (soporta la recursividad: propiedad de llamarse a s mismo una
funcin o procedimiento).
Gran riqueza de tipos (fuertemente tipeado), con tipos de datos simples y estructurados, as como datos definidos por el usuario.
Produccin por los compiladores de programas ejecutables rpidos y eficientes.
Facilidad para realizar programacin modular debido a la posibilidad de disear
subprogramas o mdulos del tipo procedimiento y funcin.

30

Programacin en Turbo/Borland Pascal 7

1.8.2.

Turbo Pascal

Introduccin a la ciencia de las computadoras

y a la programacin

31

bajo nivel: Ensamblador.


mquina:

Cdigo m q u i n a .

En 1983, la firma Borland International lanz al mercado un compilador de Pascal


denominado Turbo Pascal (versin 1.0) por el notable y reducido precio de $49.95
(dlares USA), y a modo experimental. La versin fue un xito ya que no solamente
funcionaba, sino que compilaba y corra (ejecutaba) los programas ms rpido que cualquier compilador de Pascal existente en el mercado.
La razn fundamental del xito inicial de Turbo Pascal, no slo resida en su bajo
precio, sino que ofreca al mismo tiempo un entorno de programacin (editor/
compilador) y numerosas utilidades inexistentes en otras versiones de Pascal como
grficos, colores, gestionador de archivo, etc. La versin 1.0 prcticamente tuvo una
corta vida y pronto aparecieron las versiones 2.0 y 3.0, esencialmente esta ltima se
populariz notablemente y ha sido el primero o segundo lenguaje de muchos profesionales actuales.
No contento con el xito, Borland lanz a finales de 1987 la versin 4.0, la cual
conservaba todas las peculiaridades de 3.0 con la que era compatible, pero ofreca un
entorno de programacin ms potente y en lneas generales mejoraba considerablemente
el producto. Sin embargo, Borland sigui perfeccionando su compilador, y en 1988
lanz la versin 5.0, durante el ao 1989 la versin 5.5, que sigue las nuevas filosofas del
campo de la programacin: programacin orientada a objetos, y que a decir de los
grandes del mundo informtico es la programacin del futuro. En el ao 1991 comenz
a comercializar la versin 6.0 y a finales del ao 1992 la versin 7.0, que ha consolidado
la orientacin a objetos, una biblioteca de objetos denominada Turbo Visin y nuevas
propiedades del lenguaje Pascal extradas fundamentalmente de los lenguajes Modula-2

El sistema ms idneo para resolver un problema es d e s c o m p o n e r l o en m d u l o s ms sencillos,


y luego, mediante diseos descendentes y r e f i n a m i e n t o sucesivo, llegar a m d u l o s fcilmente
codificables. Estos m d u l o s se deben codificar con las estructuras de control de programacin estructurada:

Turbo Pascal es sin lugar a dudas una herramienta de programacin potente, fcil de
utilizar e idnea para el aprendizaje de profesionales o aficionados a la programacin, ya
que ha aadido a todas las ventajas de Pascal reseadas anteriormente las propias del
entorno de programacin aqu citadas y las que se vern en los siguientes captulos.

1. Secuenciales: las instrucciones se ejecutan sucesivamente u n a despus de otra.


2. Repetitivas: u n a serie de instrucciones se repiten u n a y otra vez hasta q u e se cumple una
cierta condicin.
3. Selectivas: permite elegir entre dos alternativas (dos c o n j u n t o s de instrucciones) dependiendo de una condicin d e t e r m i n a d a .

y c.

RESUMEN

parte fsica de una c o m p u t a d o r a (dispositivos electrnicos).


parte lgica de una c o m p u t a d o r a (programas).

Las c o m p u t a d o r a s se c o m p o n e n de:

compiladores
intrpretes
T u r b o Pascal es u n lenguaje de p r o g r a m a c i n m o d e r n o q u e contiene excelentes caractersticas
c o m o lenguaje para a p r e n d i z a j e de p r o g r a m a c i n y lenguaje profesional de propsito general;
bsicamente es un entorno de programacin
con editor y c o m p i l a d o r incorporado; existen actualmente en el m e r c a d o las versiones 5.0, 5.5, 6.0 y 7.0, a u n q u e actualmente slo suelen comercializarse las versiones de T u r b o y Borland 7.0; este libro trata f u n d a m e n t a l m e n t e de la versin 7.0,
pero puede ser utilizado t a m b i n p o r los usuarios de cualquier versin anterior.
U n m t o d o general p a r a la resolucin de un p r o b l e m a con c o m p u t a d o r a tiene las siguientes
fases:

1. Anlisis del programa.


2. Diseo del algoritmo.
3. Codificacin.
4. Compilacin y ejecucin.
5. Verificacin y mantenimiento.
6. Documentacin y mantenimiento.

EJERCICIOS

U n a c o m p u t a d o r a es una m q u i n a para procesar i n f o r m a c i n y obtener resultados en funcin de


unos datos de entrada.
Hardware:
Software:

Los programas traductores de lenguajes son:

Dispositivos de Entrada/Salida (E/S).


Unidad Central de Proceso ( U n i d a d de Control y U n i d a d Lgica y Aritmtica).
Memoria central.
Dispositivos de a l m a c e n a m i e n t o masivo de i n f o r m a c i n ( m e m o r i a auxiliar o externa).

El software de! sistema c o m p r e n d e , entre otros, el sistema operativo M S - D O S en c o m p u t a d o ras personales y los lenguajes de programacin.
Los lenguajes de programacin se clasifican en:
alto nivel: Pascal, F O R T R A N , BASIC, C, Ada, Modula-2, C + + , Java, etc.

1. Disear una solucin para resolver cada u n o de los siguientes problemas y trate de refinar sus
soluciones m e d i a n t e algoritmos adecuados:
a)
b)
c)
d)

Realizar u n a llamada telefnica desde un telfono pblico.


Cocinar una tortilla.
Arreglar un p i n c h a z o de u n a bicicleta.
Averiguar si u n a palabra introducida desde el teclado es un p a l n d r o m o . U n palndromo es
una palabra q u e se lee de igual m a n e r a en sentido directo y en sentido inverso; por ejemplo,
"radar".
e) Frer un huevo.

2. Escribir un algoritmo para:


a)
b)
c)
d)

S u m a r dos n m e r o s enteros.
Restar dos n m e r o s enteros.
Multiplicar dos n m e r o s enteros.
Dividir un n m e r o entero por otro.

32

Programacin en Turbo/Borland Pascal 7

3. Escribir un algoritmo para determinar el m x i m o c o m n divisor de dos n m e r o s enteros


(mcd) por el algoritmo de Euclides:
Dividir el mayor de los dos enteros positivos por el m s pequeo.
A continuacin dividir el divisor por el resto.
C o n t i n u a r el proceso de dividir el l t i m o divisor por el ltimo resto hasta q u e la divisin sea
exacta.
El ltimo divisor es el mcd.

CAPITULO

EL ENTORNO DE PROGRAMACION
TURBO PASCAL: COMENZANDO
LA PROGRAMACION

4. Disear un algoritmo que lea e i m p r i m a u n a serie de n m e r o s distintos de cero. El algoritmo


debe terminar con un valor cero que no se debe imprimir. Visualizar el n m e r o de valores
ledos.
5. Disear un algoritmo que i m p r i m a y s u m e la serie de n m e r o s 3, 6, 9, 12,..., 99.
6. Escribir un algoritmo que lea cuatro n m e r o s y a continuacin i m p r i m a el m a y o r de los
cuatro.
7. Disear un algoritmo que lea tres n m e r o s y encuentre si u n o de ellos es la s u m a de los otros
dos.
8. Disear un algoritmo para calcular la velocidad (en m/s) de los corredores de la carrera de
1.500 metros. La entrada consistir en parejas de n m e r o s (minutos, segundos) que dan el
t i e m p o del corredor; por cada corredor, el algoritmo debe i mp r i m i r el t i e m p o en m i n u t o s y
segundos, as c o m o la velocidad media.
Ejemplo de entrada de datos: (3,53) (3,40) (3,46) (3,52) (4,0) (0,0); el l t i m o par de datos se
utilizar c o m o fin de entrada de datos.
9. Disear un algoritmo para d e t e r m i n a r si un n m e r o N es primo. (Un n m e r o p r i m o slo
puede ser divisible por l m i s m o y por la unidad.)
10. Escribir un algoritmo que calcule la superficie de un tringulo en funcin de la base y la altura
(S = 1/2 Base x Altura).
11. Calcular y visualizar la longitud de la circunferencia y el rea de un crculo de radio dado.
12. Escribir un algoritmo que encuentre el salario semanal de u n trabajador, d a d a la tarifa horaria
y el n m e r o de horas trabajadas diariamente.

CONTENIDO
2.1.
2.2.
2.3.
2.4.
2.5.
2.6.
2.7.
2.8.
2.9.
2.10.
2.11.
2.12.
2.13.

El p r o g r a m a T u r b o Pascal (versin 7 . 0 )
Qu e s un e n t o r n o d e p r o g r a m a c i n ?
El e n t o r n o i n t e g r a d o d e desarrollo (EID)
Instalacin d e T u r b o Pascal
El e n t o r n o d e p r o g r a m a c i n d e T u r b o P a s c a l
C o m p o n e n t e s del EID
Los m e n s
Creacin d e p r o g r a m a s : La edicin
C o n s e r v a c i n (grabacin) d e p r o g r a m a s e n d i s c o s
Compilacin
Ejecucin (R'un)
T r a t a m i e n t o d e a r c h i v o s en la v e n t a n a d e edicin
El d e p u r a d o r i n t e g r a d o

RESUMEN

13. Escribir un algoritmo que indique si u n a palabra leda del teclado es u n p a l n d r o m o . U n


palndromo (capica) es una palabra que se lee igual en a m b o s sentidos, tal c o m o "radar".
14. Escribir un algoritmo q u e cuente el n m e r o de ocurrencias de cada letra en u n a palabra leda
c o m o entrada. Por ejemplo. " M o r t i m e r " contiene dos " m " , una "o", dos "r", u n a "i", u n a " t "
y una "e".
15. M u c h o s bancos y cajas de ahorro calculan los intereses de las cantidades depositadas p o r los
clientes diariamente en base a las siguientes premisas. U n capital de 1.000 pesetas, con u n a
tasa de inters del 6 por 100. renta un inters en un da de 0,06 multiplicado p o r 1.000 y
dividido por 365. Esta operacin producir 0,16 pesetas de inters y el capital acumulado ser
1.000.16. El inters para el segundo da se calcular multiplicando 0,06 por 1.000 y dividiendo
el resultado por 365. Disear un algoritmo que reciba tres entradas: el capital a depositar, la
tasa de inters y la duracin del depsito en semanas, y calcule el capital total a c u m u l a d o al
final del perodo de tiempo especificado.

Turbo/Borland Pascal 7 . 0 y s u s a n t e r i o r e s v e r s i o n e s 5 . 0 / 5 . 5 y 6 . 0
c o n s t i t u y e n un l e n g u a j e d e p r o g r a m a c i n p r o f e s i o n a l q u e a la vez e s
un e n t o r n o ideal p a r a d e s a r r o l l a r g r a n d e s p r o g r a m a s en P a s c a l . El
p r o g r a m a T u r b o P a s c a l c o n t i e n e las s i g u i e n t e s h e r r a m i e n t a s d e prog r a m a c i n : compilador m u y eficiente d e P a sc a l, biblioteca d e unidades que p r o p o r c i o n a n u m e r o s o s p r o c e d i m i e n t o s y f u n c i o n e s utilizad a s en p r o g r a m a s , un editor de pantalla completo, un depurador
integrado q u e p e r m i t e seguir lnea a lnea la ejecucin del p r o g r a m a ,
y un entorno integrado de desarrollo b a s a d o en m e n s q u e facilita
n o t a b l e m e n t e el p r o c e s o d e t r a t a m i e n t o s d e p r o g r a m a s . Incluye asim i s m o h e r r a m i e n t a s a p r o p i a d a s para realizar p r o g r a m a c i n o r i e n t a d a
a objetos.
En e s t e captulo s e d e s c r i b e el f u n c i o n a m i e n t o b s i c o del e n t o r n o
d e p r o g r a m a c i n , y en los A p n d i c e s F, G, H, I, J y K s e profundiza
en los d i f e r e n t e s m e n s y o p c i o n e s del m i s m o .

33

34

Programacin en Turbo/Borland Pascal 7

2 . 1 . EL PROGRAMA TURBO PASCAL (versin 7 . 0 )


Borland ha creado desde 1983 siete versiones fundamentales de T u r b o Pascal 2, 3, 4.0,
5.0, 5.5, 6.0 y 7.0. Las dos ltimas, 6.0 y 7.0, son el objetivo fundamental de este libro,
a u n q u e dedicaremos un apndice para tratar las diferencias con la versin 5.5 dirigida a
aquellos lectores que, con formacin en T u r b o Pascal, procedan de la misma, todava en
uso por muchos programadores.

Caractersticas comunes a todas las versiones


Facilidad de aprendizaje
Es, sin lugar a dudas, excelente.
Ocupacin en memoria

El entorno de programacin

Turbo Pascal: Comenzando

la programacin

35

Depurador integrado
Es una magnfica herramienta para poner a punto programas.
Entornos
Se puede utilizar T u r b o Pascal en dos formas: como entorno de programacin (mtodo
usual) o slo c o m o compilador.
Moduladad
La introduccin del concepto de unidad (unit) a u m e n t a las posibilidades de una buena
estructuracin de los programas y permite afrontar la realizacin de grandes programas,
as como la descomposicin del trabajo en equipo y la posibilidad de construir libreras o
bibliotecas de programa.
Grficos avanzados

El sistema de desarrollo completo ocupa relativamente poco espacio, habida cuenta de


incorporar un entorno integrado y un editor de calidad. 512 Kbytes de memoria central
en principio son suficientes.

Soporta las tarjetas grficas ms conocidas: CGA, EGA, VGA y SVGA. Las versiones 5.X a 7.0
ofrecen una unidad Graph que proporciona una gran cantidad de rutinas grficas.

Posibilidades grficas

Nuevos tipos de datos

Incorpora un c o n j u n t o de caractersticas grficas muy potentes y no existentes en Pascal


estndar.

Longlnt, S h o r t l n t ,
[extended] y comp).

Word y t i p o s d e c o m a

flotante

I E E E (simple, doble, ampliada

Prestaciones

Soporte de los coprocesadores

La velocidad de compilacin y ejecucin de los programas es m u y elevada.

Permite clculos matemticos complejos con gran precisin.

Entorno integrado de desarrollo


Entorno de programacin que contiene todas las herramientas necesarias para la puesta
a p u n t o de un programa: desde la edicin hasta la depuracin.
Precio
La relacin precio/calidad es excelente.

Caractersticas comunes a las versiones 5.5, 6.0 y 7.0


Adems de estas caractersticas, las versiones 5.5, 6.0 y 7.0 han incorporado nuevas
caractersticas, pensadas esencialmente en la programacin profesional. Destacamos, entre otras, las siguientes:
Archivos

.EXE

matemticos

8087/80287/80387

Otras caractersticas
El compilador T u r b o Pascal que viene en su sistema, realmente son dos compiladores:
un entorno integrado de desarrollo y un compilador orientado a rdenes. El entorno
Borland n o r m a l m e n t e utilizado combina un editor de textos y un compilador;
proporciona mens desplegables, ventanas, cuadros de dilogo, control de configuracin
y un sistema de ayuda interactivo. Este compilador es el archivo TURBO.EXE de su disco.
El compilador tradicional de lneas de rdenes o m o d o por lotes (batch) le permite
utilizar su propio editor, crear y modificar su cdigo fuente y luego realizar la compilacin y ejecucin clsica. Este compilador es el archivo TPC.EXE.
Otra herramienta m u y til que incorporan las versiones a partir de la 5.0 n o
anteriores es el depurador integrado que facilita el seguimiento del programa lnea a
lnea, examinar o modificar variables y posiciones de memoria, establecer puntos de
ruptura y detener su programa en cualquier m o m e n t o utilizando CTRL-BREAK.

Permiten programas mayores de 64 K.

Programacin orientada a objetos (POO)

Compilacin independiente

A partir de la versin 5.0 Borland introdujo en su compilador T u r b o Pascal las herramientas necesarias para la realizacin de programas orientados a objetos.

(separada)

Es posible compilar separadamente varias unidades de un mismo programa. Tiene una


gran velocidad de compilacin.

Programacin

36

en Turbo/Borland

Pascal 7

Turbo Visin
Las versiones 6.0 y 7.0 incluyen ambas T u r b o Visin, una biblioteca de objetos que
facilita la realizacin del software.
Modo real y modo protegido
T u r b o Pascal 7.0 soporta la posibilidad de trabajar en m o d o real (compatible 8086/8088)
o en modo protegido (posteriormente se ver que segn se utilice u n o u otro mtodo se
necesitarn rdenes diferentes para arrancar T u r b o Pascal).

2.2.

QUE ES UN ENTORNO DE PROGRAMACION?

Un enlomo de programacin es un programa que contiene, adems del compilador


(lenguaje de programacin), utilidades y herramientas. Estos elementos estn integrados,
de modo que pueden llamarse fcilmente a cualquiera de los mdulos, durante el proceso de programacin, desde cualquier otro.
Un entorno de programacin tpico contiene:
Un editor, que proporciona el medio de introducir el texto y smbolos para crear el
cdigo fuente.
Un intrprete o un compilador, que convierte el cdigo fuente en instrucciones que
la computadora puede comprender y ejecutar.
Un verificador de errores en tiempo de ejecucin, que reconoce todos los errores
no detectados anteriormente en tiempo de compilacin.
Un depurador, que ayuda a analizar y corregir errores de sintaxis, estructura o
lgicos.
Una utilidad de referencias cruzadas, que crea tablas de variables, nmeros de
lnea u otros smbolos.
El proceso de diseo, codificacin, depuracin y ejecucin de un programa es m u c h o
ms fcil y rpido cuando se utiliza u n buen entorno de programacin.

2.3.

EL ENTORNO INTEGRADO DE DESARROLLO (EID)

El Entorno Integrado de Desarrollo (IDE, Integrated Development Environment) es un


entorno de programacin que proporciona todas las herramientas que se necesitan para
desarrollar programas de aplicacin, con xito, en Pascal. El entorno EID posee un
conjunto importante de herramientas:
Un editor con caractersticas propias de tratamiento de textos tales c o m o "buscar y
reemplazar" o "pegar y cortar".
Un sistema de gestin (administracin)
de archivos (ficheros), que le facilita la
grabacin y recuperacin de sus archivos fuente.
Un compilador, que produce programas E X E autnomos que se pueden ejecutar
directamente desde DOS.
Un sistema de ayuda de referencias cruzadas, que proporciona informacin sobre
el lenguaje y el entorno.

El entorno

de programacin

Turbo Pascal: Comenzando

la programacin

37

Adems de estas herramientas, posee las siguientes notables propiedades:

Soporte de ratn.
Ventanas mltiples, separables y redimensionables.
Edicin multiarchivos de hasta 1 M b de t a m a o .
Cuadros de dilogo.

El ratn es un dispositivo que facilita el uso del nuevo EID. Se pueden realizar
numerosas operaciones como saltar de u n a ventana a otra, seleccionar opciones del
m e n , mover y redimensionar tamaos, etc., con las acciones de "apuntar y hacer clic"
simplemente. Si no posee ratn, le r e c o m e n d a m o s que adquiera uno, pues si bien no se
requiere, el uso del E I D es m u c h o ms fcil con l. El ratn viene generalmente con dos
botones, de m o d o que en T u r b o Pascal se utiliza el botn izquierdo del ratn para
seleccionar una ventana, activar una opcin de m e n o posicionar el cursor dentro de
una ventana. El botn derecho, sin embargo, es totalmente programable. Se puede utilizar para establecer un p u n t o de ruptura, llamar a funciones, etc.

2.4.

INSTALACION DE TURBO PASCAL

La instalacin de T u r b o Pascal es muy fcil. A u n q u e el programa puede ser instalado en


discos flexibles de 3V2", en C D - R O M y en discos duros (rgidos), se recomienda la instalacin en disco duro para sacarle el m x i m o rendimiento, dado que su gran t a m a o
dificulta el uso de disquetes.
Borland ha automatizado el proceso de instalacin en un programa INSTALL.EXE alojado en el disco 1 rotulado INSTALL/COMPIIER. Para ejecutar este programa y proceder a la
instalacin en T u r b o Pascal, siga estos pasos:
1. Inserte el disco que contiene el programa INSTALL.EXE (disco 1) en su unidad A.
2 . T e c l e e A: I n s t a n y p u l s e E N T E R ( I N T R O ) .

3. Siga las instrucciones que aparezcan en la pantalla.


Se requiere al menos 3,2 M b ! libres en disco duro (versin 6.0) y 8 M b libres (versin 7.0) para la instalacin del programa completo. Si necesita liberar algn espacio de
disco, indique en el proceso de instalacin que no desempaquete los archivos ejemplo;
esto le ahorrar unos 800 K b de disco.
T u r b o Pascal contiene muchos archivos. Estos deben estar organizados en directonos; al principio es conveniente dejar la estructura de directorios creada por defecto, que
es C: \TP para todos los archivos T u r b o Pascal, con excepcin de C: \TP\D0C para documentacin y C:\TP\TURB03 para compatibilidad con archivos de Turbo Pascal versin 3. Seleccione S t a r t I n s t a ! 1 a t i o n y los archivos T u r b o Pascal se copiarn en los archivos especificados.
Despus que la instalacin est terminada se puede ejecutar Turbo Pascal haciendo
C: \TP y tecleando TURBO seguido por la pulsacin de ENTER (INTRO).

M b = MegaByte = 103 Kb, Kb = KiloByte = 1.024 bytes.

38

El entorno de programacin

Programacin en Turbo/Borland Pascal 7

2.4.1.

C:\TURB0

el programa Turbo Pascal, los programas de configuracin, los


archivos con extensin BGI y chr asi como utilidades

C:\TURBO\inclu

archivos de inclusin

C:\TURBO\exe

programas compilados

C:\TURBO\unidades

las diferentes unidades

C:\TURB0\obj

los archivos objeto

39

7. En la mayora de los casos, cargar y ejecutar el m o n t a d o r o enlazador 2 que toma


el cdigo objeto y lo convierte en programa ejecutable.
8. Cargar y ejecutar el programa ejecutable y comprobar su correcto funcionamiento
(esta operacin se realiza n o r m a l m e n t e con un depurador).

Consejos prcticos

Dado que T u r b o Pascal puede guardar la traza de los diferentes subdirectorios en los
cuales se encuentran archivos de todo tipo, se puede gestionar el disco duro con mejor
organizacin y separar los distintos tipos de archivos en subdirectorios distintos. U n a
propuesta puede ser sta:

Turbo Pascal: Comenzando la programacin

U n compilador clsico, por consiguiente, requiere en el proceso de puesta a p u n t o de


programas: un editor, un compilador, un montador o enlazador y un depurador. A u n q u e
el usuario puede utilizar el compilador TPC.EXE, normalmente se har uso del entorno de
programacin T U R B O que contiene un editor, un compilador, un sistema de ejecutar
programas compilados y un depurador en un solo programa. Esta caracterstica permite
realizar todas las operaciones de puesta a p u n t o sin necesidad de salir del entorno
T U R B O . Asimismo, es posible acceder a recursos del sistema operativo sin abandonar el
entorno T U R B O .
El entorno integrado es, seguramente, la mejor herramienta para el aprendizaje de la
programacin en Pascal.

U n a vez que la instalacin haya terminado, es conveniente verificar los archivos


CONFIG.SYS y AUTOEXEC.BAT.

2.5.1.

El teclado de su sistema y Turbo Pascal

A a d a e s t a l n e a al a r c h i v o CONFIG.SYS:
FILES = 20

Y esta otra lnea a su archivo AUTOEXEC.BAT:

Antes de comenzar a escribir programas es conveniente aprender el mtodo de escritura


de los mismos, es decir, la manipulacin del teclado. A u n q u e suponemos que usted ya
conoce el uso de teclado de su computadora, le vamos a recordar algunas teclas especficas debido a su especial significado en T u r b o Pascal.
Tecla de control:
Tecla alternativa:
Tecla de funcin:

PATH=C:\TP

(Si ya existe la sentencia PATH. m o d i f q u e l a a a d i e n d o al final de la m i s m a :

CTRL
ALT

Tecla de escape:
Tecla de maysculas:

ESC
SHIFT (Mays)

FI-FIO/FI 1/F12

C:\TP;).

Teclas

Nota
( uando

r.'LL i-sra teiminado. puede loor la informacin mas actualizada en el ai clu\o

CTRL

ALT

Estas teclas se utilizan siempre en unin de otras teclas de letras, dgitos o signos especiales.
CTRL-K

2.5.

1.
2.
3.
4.
5.
6.

ALT-K
CTRL-7

EL ENTORNO DE PROGRAMACION DE TURBO PASCAL

El compilador Pascal es un programa independiente, normalmente. Para desarrollar


programas en Pascal, como se ha comentado en el Captulo 1, se requieren los siguientes
pasos:
Cargar y ejecutar un editor de textos.
Editar el programa o cdigo fuente en Pascal.
G u a r d a r el programa fuente en disco.
Salir del editor.
Cargar y ejecutar el compilador Pascal.
Compilar el programa.

Significa " C o n t r o l - K " y se obtiene p u l s a n d o la tecla K mientras se m a n t i e n e


o p r i m i d a la tecla de control (CTRL).
Se pulsa y m a n t i e n e o p r i m i d a ALT y a continuacin la tecla K.
Se pulsa la tecla CTRL, se m a n t i e n e o p r i m i d a y a continuacin se pulsa 7.

T e c l a s de funcin
Las teclas de funcin pueden estar situadas en el lado izquierdo o en la parte superior del
teclado. Segn sea su modelo de computadora PC, puede tener diez o doce teclas de
funcin: FL, F2, F3, F4, F5, F6, F7, F8, F9, FIO, FLL, F12.
Estas teclas se pueden utilizar solas o en unin de teclas de control o alternativa:
F6
2

F7

linker, en ingls.

ALT-F5

CTRL-F7

CTRL-F9

40

El entorno de programacin Turbo Pascal: Comenzando la programacin

Programacin en Turbo/Borland Pascal 7

41

reside en el depurador integrado. Si al ejecutar un programa aparecen errores en Turbo


Pascal 4.0, deba recurrir a examinar detenidamente el cdigo fuente en el listado en
pantalla o en impresora, hasta encontrar los errores; si posee Turbo Pascal 5.X, 6.0 7.0,
es posible ejecutar su programa, detenerse en cualquier punto y examinar los contenidos
de las variables; adems, es posible mostrar en pantalla las sentencias que se estn ejecutando. El depurador de las versiones 5.X a 7.0 es extraordinariamente til.

2.5.3.

Arranque (carga) y salida de Turbo Pascal

Para comenzar a trabajar arrancar en Turbo Pascal es necesario cargar en memoria


el programa. Para ello es necesario situarse en el directorio creado con INSTALL (C:\TP) y a
continuacin teclear TURBO o bien TPX segn modo funcionamiento y pulsar la tecla
RETURN (ENTER O INTRO).
c: > turbo

versiones 5.5, 6.0 y 7.0 (modo real)

c : > tpx

versin 7.0 (modo protegido)

Puede desear arrancar el programa Turbo Pascal directamente desde el directorio raz
sin necesidad de modificar su sentencia PATH del archivo AUT0EXEC.BAT (aqul en que se
sita nada ms arrancar su computadora). En este caso puede construir (con cualquier
editor) un archivo de tratamiento por lotes (batch), tal como el siguiente (nosotros le dimos el nombre de tp.bat), en el directorio raz.
cd t p
cd bi n
turbo
cd\

Figura 2 . 1 . Ciclo d e d e sa r r o l l o d e un p r o g r a m a en T u r b o Pascal.

Turbo Pascal tiene una serie de secuencias de teclas (shortcuts), cada una de las
cuales realizan unas acciones concretas (Apndices C a F).

2.5.2.

El ciclo de desarrollo de un programa

Un compilador como Turbo Pascal produce cdigo mquina ejecutable independiente.


Una vez que un programa se ha compilado en disco, puede transportar el archivo ejecutable a otra mquina y ejecutarlo sin necesidad de Turbo Pascal. El ciclo de desarrollo de
un programa descrito en la seccin anterior se describe grficamente en la Figura 2.1.
Como se puede observar, la gran diferencia entre las versiones 4.0 y superiores 3
3
La notacin 5.X representa a cualquiera de las versiones 5.0 o .5.3. La notacin 6.0/7.0 representa indistintamente a la versin 6.0 o a la versin 7.0.
4
El depurador integrado se estudia en el Apndice G, por lo que puede optar por su estudio ahora o cuando
lo estime oportuno, a lo largo de los siguientes captulos.

Con este archivo podr arrancar directamente con la orden tp. La pantalla se borrar
y aparecer una pantalla similar a la de la Figura 2.2. El letrero de copyright le indicar la
versin que est utilizando del entorno Turbo Pascal.
Cuando se pulsa cualquier tecla, desaparece la informacin relativa a la Borland y se
visualiza una pantalla limpia con dos ventanas y el men de opciones que diferir segn
sea la versin utilizada (Fig. 2.2).
A partir de este momento se encuentra en condiciones de comenzar su sesin de
trabajo. Si desea tener una ayuda en lnea en cualquier momento, pulse la tecla Fi. La
ayuda especfica del lenguaje se consigue en la ventana de edicin, pulsando CTRL-FI.
Asimismo en el men Hel p dispone de ms ayuda.
Cuando haya terminado su sesin de trabajo y desee salir (abandonar) Turbo Pascal,
dispone de dos mtodos:
1.

Salir de Turbo Pascal "permanentemente": seleccione File) Exi t (activar men


F i l e y e j e c u t a r Exit).

Si ha realizado cambios que no se han grabado, Turbo Pascal le pide si desea


grabar sus programas antes de salir.
2. Salir de Turbo Pascal "temporalmente" para introducir rdenes en la lnea de rdenes de DOS: seleccione entonces File [ Dos Shell (activar men File y orden

El entorno de programacin

Programacin en Turbo/Borland Pascal 7

42

|2Qj

Edit

Search

Run

Compile
Debug Tools
NONAMEOO.PAS

Options

Window

Turbo Pascal: Comenzando la programacin

43

2. La orden est seguida por puntos suspensivos (...). Significa que cuando se ejecute
esta orden se visualizar un cuadro de dilogo, que se utiliza para especificar la
accin exacta que se desea ejecutar y la informacin adicional requerida.
3. La orden est seguida por u n a flecha (). En este caso, la orden conduce a otro
men (un m e n de aparicin sbita " p o p - u p " ) .

Help

2.6.2.

Seleccionar rdenes de un men

La seleccin/ejecucin de rdenes del m e n presuponen seguir los siguientes pasos:


1. Pulsar FIO para activar la barra del m e n .
2. Utilizar las teclas de flechas para seleccionar el m e n que desea visualizar. A
c o n t i n u a c i n p u l s e INTRO (ENTER).

1:1

F1 Help

F2 Save

F3 Open

Alt+F9 Compile

F9 Make

FIO Men

Figura 2 . 2 . E n t o r n o d e p r o g r a m a c i n T u r b o P a s c a l 7 . 0 .

Dos Shell). T u r b o Pascal permanece en memoria, pero la transfiere a DOS. Puede


introducir cualquier orden DOS e incluso ejecutar otros programas. C u a n d o desee
volver a T u r b o Pascal, teclear EXIT en la lnea de rdenes y pulsar INTRO. Turbo
Pascal reaparece en el punto en que se dej.

Otro sistema es pulsar la letra resaltada del ttulo del men. Por ejemplo, para el
m e n File (pulsar la tecla F).
Desde cualquier parte del sistema, pulse ALT y la letra resaltada para visualizar el
men que desee.
Tambin se puede utilizar el ratn. Por ejemplo, para posicionarse en el men
File, lleve el cursor del ratn sobre la palabra "File" y a continuacin pulse el botn izquierdo del ratn.
3. Utilice las teclas de movimiento de cursor (de flechas) para seleccionar la orden
deseada, a continuacin pulsar la tecla INTRO.
Al igual que el paso 2, la orden se puede ejecutar pulsando la letra intensificada
(resaltada) de su palabra o bien con el ratn.

2.6.3.
2.6.

COMPONENTES DEL EID TURBO PASCAL 7 . 0

El EID dispone de tres componentes visibles: la barra de mens, el portapapeles


lnea de estado-, adems algunos mens ofrecen cuadros de dilogos.

2.6.1.

y la

La barra de mens

La barra de m e n s es el sistema principal de acceso a todas las rdenes de los mens. La


nica vez que la barra de m e n no est visible es cuando se visualiza la salida de un
programa. Hay siempre un ttulo de men que est iluminado o resaltado; ste es el m e n
actualmente seleccionado. La barra de mens est situada en la lnea superior de la pantalla:

Ventanas

La mayora de los acontecimientos en el entorno EID se desarrollan en una ventana.


U n a ventana es una zona de la pantalla que se puede mover, redimensionar, solapar,
abrir, cerrar y hacer zoom sobre ella.
Se pueden tener abiertas cualquier n m e r o de ventanas, pero slo puede estar activada a la vez una ventana. La ventana activa es aquella en que se est trabajando en ese
m o m e n t o . Cualquier orden que se selecciona, o texto que se teclea, generalmente se
aplica nicamente en la ventana activa. Sin embargo, se puede tener el mismo archivo
abierto en diferentes ventanas y en ese caso cualquier accin sobre el archivo se realizar
en todas las ventanas. Existen diferentes tipos de ventanas, pero todas ellas son similares.
La ventana de edicin tpica se muestra en la Figura 2.3. Examinemos sus componentes fundamentales:
La parte superior contiene tres reas, cualquiera de las cuales responde al ratn.

File

Edit

Search

Run

Compile

Tools

Debug

Options

Window

Help

Las rdenes de los m e n s pueden ser de tres tipos diferentes:


1. Las rdenes que no requieren informacin adicional y que se ejecutan inmediatamente, por ejemplo, la orden Print del m e n File.

- La barra de ttulos consta del ttulo de la ventana y el nmero de la ventana. El


uso del ratn permite hacer zoom en la ventana. Aunque se puede trabajar slo
con una ventana a la vez (la ventana activa). La versin 6 permite abrir diferentes ventanas, de m o d o que se puede cambiar de una ventana activa a otra sin
tener que cerrar la primera. El sistema asigna un nmero a cada ventana abierta

44

El entorno de programacin Turbo Pascal: Comenzando

Programacin en Turbo/Borland Pascal 7

la programacin

45

Tabla 2 . 1 . O p e r a c i o n e s t p i c a s s o b r e v e n t a n a s
Operacin
Abrir una ventana de edicin
Abrir otras ventanas
Cerrar una ventana
Ir a la ventana anterior
Activar una ventana

Mover a la ventana activa


Redimensionar

la ventana activa

Acciones a realizar
Elegir File I O p e n para abrir u n archivo y visualizarlo
en u n a v e n t a n a , o bien pulsar F3.
Elegir la v e n t a n a deseada del m e n W i n d o w .
Elegir Cise del m e n W i n d o w (o pulse ALT-F3) O hacer
clic en el c u a d r o de cierre de la ventana.
Elegir Windows l Previous o pulsar Shi-F6 (Mays+F6).
Hacer clic en cualquier parte de la ventana, o bien pulsar
ALT ms el n m e r o de ventana, o elegir Window List,
o bien pulsar ALT-0 y seleccionar la ventana de la lista, o
seleccionar W i n d o w Next o F6 para activar la siguiente
ventana.
Pulsar CTRL-F5 ( W i n d o w I Size I M o v e ) y situarse en la
ventana deseada; a c o n t i n u a c i n pulsar INTRO.
Moverse a la esquina de r e d i m e n s i o n a d o (o a cualquier
otra esquina), o bien seleccionar W i n d o w I Size I M o v e
y pulsar SHIFT m i e n t r a s se utilizan las teclas de flechas
para r e d i m e n s i o n a r la ventana, a continuacin pulsar
INTRO.

Hacer zoom sobre la ventana activa

2.6.4.

Figura 2 . 3 . V e n t a n a tpica d e T u r b o P a s c a l .

en el orden en que son abiertas. A continuacin, una simple referencia al nmero de la ventana (con el ratn o mediante el teclado) es todo lo que se necesita
para activar una ventana.
- Un clic del ratn en el cuadro de cierre elimina (cierra) una ventana. La misma
accin puede ser activada desde el ratn.
- El cuadro de zoom ofrece otro medio de cambiar el tamao de la ventana con el
ratn.
Las barras de desplazamiento permiten utilizar el ratn para moverse a travs del
archivo activo tal como se realizara con las teclas de cursor y PGUP (REPAG) y
PGDN (AVPAG).

Hacer clic en el c u a d r o de z o o m , doble clic en la barra


de ttulo, o bien seleccionar W i n d o w ! Z o o m , o bien
pulsar F5.

La lnea de estado

La lnea de estado aparece en la parte inferior de la pantalla y sirve para realizar operaciones mientras est escribiendo y editando programas en una ventana de edicin
(Edit).
Estas operaciones se realizan pulsando la secuencia de teclas a la izquierda de la orden. As Help {ayuda) se consigue pulsando la tecla de funcin FI.

2.6.5.

Cuadros de dilogo

Un cuadro de dilogo es un medio para visualizar y establecer mltiples opciones. En el


cuadro de dilogo existen cinco tipos de control: botones de radio (radio buttons), cuadros de prueba (ckeck boxes), botones de accin, cuadros de entrada (input box) y
cuadros de listas {list box).
Los cuadros de dilogo suelen tener tres botones de accin: Ok, Cancel y Help. Ok,
las opciones del cuadro de dilogo se hacen en el EID; Cancel, no se hacen ningn cambio
ni ninguna accin, y se cancela la accin; Help, abre una ventana de ayuda sobre el cuadro de dilogo.

La esquina de redimensionado ofrece control sobre el tamao de la ventana mediante el ratn.


El indicador fila/columna representa la posicin del cursor.

2.6.6.

Las operaciones tpicas que se realizarn en las ventanas se reflejan en la Tabla 2.1.

El editor integrado de Turbo Pascal aade nuevas caractersticas de edicin:

Nuevas caractersticas de edicin

Programacin en Turbo/Borland Pascal 7

46

Soporte ratn.
Soporte para grandes archivos (hasta 1 Mb).
Desplazar f, i ,
para seleccionar texto.
Ventanas Edit, que se pueden mover, redimensionar o recubrir.
Capacidades multiarchivos que permiten abrir archivos a la vez.
Ventanas mltiples que permiten tener diferentes vistas del mismo o diferentes archivos.
Lenguaje de macros sofisticado.
Capacidad para pegar texto o ejemplos de la ventana Help.
Un portapapeles (dipboard) que permite cortar, copiar y pegar entre ventanas.

2.7.

El entorno de programacin

ffl

Edit

Search

Open...
Save
Save a s . . .
Save al 1

Run

Compile

Turbo Pascal: Comenzando la programacin

Debug

Tools

Options

Window

47

Help

F3
F2

Change d i r . . .
Print
Printer setup
DOS shell
Exit
Al t+X

LOS MENUS

El m e n principal se activa pulsando la tecla Fio o al arrancar T u r b o Pascal. El m e n


principal consta de diez opciones en las versiones 7.0 y 6.0, de siete opciones en las
versiones 5.5 y 5.0, y de cinco opciones en la versin 4.0. Cada orden del men, cuando
se selecciona, visualizar un m e n secundario, que consiste en una caja rectangular con
un nmero determinado de palabras o frases en su interior. C u a n d o se selecciona una
orden del m e n principal, por ejemplo File, se dice que se ha abierto el men File o que
el m e n asociado a Fi 1 e est activo y el men principal est inactivo.
Las opciones del men principal se pueden invocar, como ya se ha comentado, pulsando simultneamente la tecla ALT y la inicial de la opcin deseada. As ALT-O da acceso al men Options. Una vez situado en uno de los mens secundarios, el usuario puede
elegir una opcin pulsando simplemente la tecla correspondiente a la letra inicial. (Todas las iniciales son diferentes en un mismo men, lo que elimina la ambigedad.) Por
ejemplo, en el men File, si se pulsa la tecla x de Exit (versiones 6.0 y 7.0) o la tecla Q
de Quit (versin 7.0), producir la salida del entorno Turbo.
Tambin se puede seleccionar una orden de un m e n secundario, seleccionando la
opcin con las teclas del cursor ( | , f ) y a continuacin pulsar INTRO (RETURN/ENTER).
El modo ms simple de salir de un m e n secundario es pulsando la tecla ESC tantas
veces como sea necesario, segn el nivel del submen en que se encuentre.
Las diversas opciones (rdenes) de un m e n se pueden clasificar en cuatro categoras,
segn su efecto:
1. Opciones que efectan inmediatamente una tarea: exit. sale del entorno Turbo.
2. Opciones que conducen a un submen o m e n secundario de nivel ms bajo (por
ejemplo, File).
3. Opciones que proponen cclicamente valores o estados diferentes (compilacin en
memoria o en disco).
4. Opciones que solicitan informacin al usuario (por ejemplo, la opcin D de Directory versin 5.5 o Change Dir versiones 6.0 y 7.0).

1:1

F1 Hel p i Create a new f i l e i n a new Edi t wi ndow


Figura 2 . 4 .

IVten File ( T u r b o Pascal 7.0).

Prctica
1. Arranque Turbo Pascal o sitese en el m e n principal (pulsar FIO).
2. Activar el m e n Options:
a) Pulsar 0.
b) Desplazar el cursor a Options y pulsar INTRO.
c) Desde cualquier situacin puede pasar con ALT-O.
3. Pulsar ALT-F (se ejecutar la orden File y se desplazar al men File o hacer clic
con el ratn en File.
4. Estando en el men File elegir la opcin Change dir... o bien pulsar la tecla c; se
visualizar el cuadro de dilogo Change Dir que le permite cambiar el directorio
actual.

2.7.1.

La barra de recordatorio de rdenes

N o r m a l m e n t e la ltima lnea (lnea de estado) visualiza una serie de rdenes j u n t o con


las teclas o secuencias de teclas que activan o ejecutan dichas rdenes. Las rdenes que
aparecen en esta lnea son distintas segn la ventana y situacin en que se encuentre
Turbo. As, en el caso de la versin 5.5, el m e n principal se llama desde la ventana de
edicin, las rdenes visualizadas en la ltima lnea son:

En general, la filosofa del entorno Turbo es:


Fl-Help
Pulsar la tecla INTRO (RETURN) p a r a seleccionar y ejecutar una o r d e n .
Pulsar la tecla ESC para retroceder a u n a o r d e n o m e n , sin t e r m i n a r la o r d e n o seleccin
realizada. Si accidentalmente se introduce en un m e n q u e no necesita, pulse ESC y
retornar a la posicin en la cual seleccion ese m e n .

F5-Zoom

F6-Switch

F7-Trace

F8-Step

F9-Make

FlO-Menu

De igual forma, en las versiones 6.0/7.0 las lneas inferiores son:


Fl-Help

F2-Save

F3-0pen

Alt+F9 Compile

F9-Make

Alt+FlOMenu

El entorno de programacin Turbo Pascal: Comenzando

Programacin en Turbo/Borland Pascal 7

48

p r o d u c e la a y u d a e n l n e a p a r a el u s u a r i o .
g u a r d a el a r c h i v o e n u n a u n i d a d d e d i s c o .

Fio
F5

r e t o r n o al m e n p r i n c i p a l .
h a c e u n z o o m d e la v e n t a n a a c t i v a ( v e r s i n 5 . X ) .

El entorno integrado de desarrollo se puede arrancar de dos formas distintas:

2.7.2.

Secuencias de teclas (hotkeys)

Las teclas de funcin y secuencias de teclas SHIFT (Mays),


teclas, ejecutan unas ciertas funciones. Por ejemplo,

ALT y CTRL, j u n t o con otras

ALT + Primera letra de cualquier opcin del men principal


ejecutar esa orden y activar el men sin tener en cuenta cul es la ventana activa.
ALT-C
ALT-F
ALT-E

activa el men Compile


activa el men F i l e .
activa el m e n Edi t

Estas teclas o secuencias de teclas se denominan en ingls hotkeys o shortcuts. Son


cmodas y fciles de manejar, aunque como son muchas, es conveniente tener a m a n o la
lista original (vanse Apndices C a F).

2.7.3.

Ayudas interactivas

T u r b o Pascal proporciona al usuario ayuda en la pantalla para facilitar el aprendizaje y


el recordatorio de aspectos importantes de la gramtica, sintaxis y en general el entorno
Turbo Pascal.
Se puede obtener pantallas de ayuda en cualquier punto (excepto cuando su programa tiene el control est en ejecucin) pulsando la tecla Fi.
La mayora de las pantallas de ayuda contienen palabras claves que dan acceso a
otras pantallas de ayuda. Para alcanzar esas pantallas es preciso situar el cursor en la
palabra deseada y pulsar la tecla RETURN (INTRO).
Se puede obtener un ndice de ayuda pulsando Fl una vez que ya se est en el sistema
de ayuda (pulsar dos veces sucesivamente Fl desde el m e n o desde la pantalla de trabajo).
Las secuencias de teclas que facilitan la consulta de las pantallas de ayuda son:
Alt+H
Shift+Fl (Mays+Fl)

Ctrl+Fl
Alt+Fl

Para salir de ayuda y volver a su lugar de origen, pulse ESC (o tambin haga clic en el
cuadro de cierre de la ventana de ayuda; desde fuera de la ventana de ayuda).

2.8.

49

program Primero;
begin
WriteLn( 'Hola 1 )
WriteLn( 1 Bienvenido a Turbo Pascal 7.0/6.0');
end

Ejemplos
Fi
F6

la programacin

CREACION DE PROGRAMAS: LA EDICION

Supongamos que se encuentra en el editor del entorno integrado,


primer programa y darle el nombre Hola:

que desea crear su

1. Teclear turbo y a continuacin pulsar INTRO (ENTER). Aparecer una ventana con
un nombre de archivo N0NAME00. PAS centrado en la parte superior de la ventana de
edicin.
2. Teclear Turbo hola y a continuacin pulsar INTRO (ENTER). El nombre del archivo
fuente que se vaya a crear ser hol a.pas n o se necesita teclear la extensin .pas,
el compilador lo hace por usted.
U n a vez que est el editor, comience a escribir el programa pulsando INTRO al final
de cada lnea. Site los puntos y comas, exactamente d o n d e aparecen, y asegrese que el
ltimo end est seguido de un punto. Si ha cometido algn error, utilice las cuatro teclas
de movimiento de cursor y la tecla de RETROCESO (Backspace) para desplazarse por la
ventana de edicin. (En el Captulo 3 se darn normas concretas para escribir programas
fuente.)
Cuando termina la edicin y no observa ya errores, puede hacer dos cosas: guardarlo
en un disco o compilarlo. El orden lgico, por seguridad (evitar prdidas indeseadas),
sera: guardar programa fuente en disco (Save) si no le ha dado nombre a su archivo
fuente, opcin 1, debe darle n o m b r e en este m o m e n t o , compilar el programa fuente
(Compiler) y ejecutar el programa compilado (Run).
Una de las excelentes mejoras, desde el punto de vista educativo, que ha introducido
Turbo Pascal 7.0 ha sido el diferente coloreado que t o m a n las palabras reservadas, comentarios, identicadores, etc., al editar su programa. As las palabras reservadas se
visualizan en blanco, mientras el resto del texto se visualiza en amarillo. Tambin es
posible cambiar el color del texto cdigo fuente, si no le gustan los colores estndar
(vanse los Apndices C y E: El editor de T u r b o Pascal).
Para salir del editor e ir a la barra de mens, ejecute CTRL-KD (pulse la tecla CTRL y
mantngala oprimida, y a continuacin en secuencia las teclas K y D).

2.9. CONSERVACION (GRABACION)


DE PROGRAMAS EN DISCOS
Si no ha salido del editor, su programa fuente estar todava en memoria, pero si por
cualquier circunstancia se apaga la computadora, se perder. Por ello, es una buena idea,
antes de seguir, guardarlo o grabarlo en disco. Para hacer esto se debe seleccionar la
orden Save del m e n File. Las rdenes sucesivas a realizar son:
Fio (o CTRL-KD) para salir de la ventana de edicin e invocar al m e n principal.
Pulsar F para activar (abrir) el men File.
Seleccionar la orden Save pulsando s, o bien llevar el cursor a Save y pulsar INTRO.
Aparece un cuadro de dilogo que le solicita el n o m b r e con el que desea guardar el
archivo que contendr su programa fuente.

El entorno de programacin Turbo Pascal: Comenzando

Programacin en Turbo/Borland Pascal 7

50

El sistema por defecto le asigna un n o m b r e a su archivo: NONAME. PAS. Usted


puede cambiar ese n o m b r e escribiendo otro n o m b r e (una a ocho letras); por ejemplo,
Hola.pas, y a continuacin pulsar INTRO. N o r m a l m e n t e debe guardar sus programas con
nombres de archivos especficos y significativos que le recuerden siempre su contenido o
funcin.
U n mtodo alternativo para grabar sus programas es utilizar la tecla de funcin F2, en
lugar de ejecutar la orden especfica Save.

Errores tpicos en tiempo de compilacin

2.10.

2.10.1.

COMPILACION

Su programa ya ha sido guardado en disco, por lo que est listo para su compilacin.
Para compilar se necesita el m e n Compile. Existen tres formas de situarse en el m e n
Compile:

1. Pulsar A L T + C (desde cualquier parte del entorno).


2. Pulsar c (estando activo el m e n principal).
3. Llevar el cursor con las teclas de cursor a la opcin Compile y pulsar la tecla
(estando activo el m e n principal).

INTRO

U n a vez dentro del m e n Compile, se elige la opcin u orden Compile (pulse c , la primera letra). La secuencia de teclas que activa esta orden es A L T - F 9 .
Tras ejecutar esta orden se compila el programa. U n cuadro aparece y visualiza el
proceso de la compilacin de su programa. (Las diferentes lneas que se estn compilando.)
Si ningn error sucede durante la compilacin, el mensaje "Succes: Press any key"
parpadea en el cuadro. Este permanecer visible hasta que se pulsa una tecla.
Si ocurre un error durante la compilacin, T u r b o Pascal se detiene, posiciona el
cursor en el p u n t o donde ocurri el error y visualiza un mensaje de error en la parte
superior del editor.
En nuestro ejemplo
E r r o r 85 : " e x p e c t e d

y el cursor se sita parpadeante bajo la W de la segunda palabra WriteLn. El error es la


ausencia del separador p u n t o y coma (;). Este es u n o de los errores ms tpicos de los
principiantes. Se debera haber situado un punto y coma al final de la primera sentencia
WriteLn. Los puntos y comas, c o m o se ver en el siguiente captulo, sirven para separar
sentencias.
Para corregir el error, mueva el cursor al extremo de la primera sentencia WriteLn y
escriba un p u n t o y coma (el medio ms rpido es pulsar la tecla una vez y a continuacin pulsar la tecla END-FIN). U n a vez que el p u n t o y coma est en su sitio correcto, despus del parntesis derecho de la primera WriteLn, las operaciones a realizar son:
Salir del editor (sugerencia: C T R L - C D ) .
Grabar de nuevo el programa correcto (sugerencia: F S).
Compilar de nuevo el programa.

la programacin

51

' ; ' e x p e c t e d (falta u n :).


unknow i d e n t i f i e r ; ( i d e n t i f i c a d o r desconocido n o declarado).
N o declarar t o d a s las variables, tipos de. datos, c o n s t a n t e s y subprogramas, antes d e utilizarlo.
Parejas begirr... end desequilibradas (falta begin o end).
Asignacin de tipos d e datos incompatibles.

Eleccin del destino de la compilacin

Si est utilizando el m o d o real del EID, se puede elegir compilar el programa en disco o
en m e m o r i a con la orden Compile/Destination. Si elige c o m p i l a r en disco, su cdigo
ejecutable se almacena en disco como un archivo .EXE. La compilacin en disco incrementa la m e m o r i a disponible en el EID para compilar y depurar su programa. Si se elige
compilar en memoria, su programa se almacena en memoria, y si no lo graba, se pierde
cuando salga de T u r b o Pascal.
Si se compila en disco, los archivos resultantes .EXE o .TPU se almacenan en el mismo
directorio que los archivos fuente, o en el directorio EXE y TPU (Options/Directories), si se
especifica.

2.10.2.

Otras opciones de compilacin

T u r b o Pascal soporta otros medios para crear un programa o unidad ejecutable.


Compilar todos los archivos modificados (Compile | Make).
Compilar todos los archivos de su proyecto (Compile ] Build).
Compilar y ejecutar su programa (Run | Run).

2.11.

EJECUCION (RUN)

Despus que se crea un archivo ejecutable, se puede ejecutar el programa directamente


desde el DOS. Tambin se puede ejecutar la orden Run del m e n Run. La ejecucin de
esta orden no requiere la compilacin previa del programa fuente y se puede ejecutar de
varias formas:
Pulsar A L T - R para acceder al men Run y a continuacin pulsar INTRO, que selecciona la orden iluminada (Run).
Pulsar A L T - R para acceder al men Run y a continuacin teclear R para seleccionar
la orden que contiene esa letra intereficada o iluminada.
Pulsar CTRL-F9 (tecla de control justo con la tecla de funcin F9).
Utilizar un ratn para seleccionar la entrada del m e n haciendo clic en la
misma.
En el caso de nuestro programa se visualiza en la ventana de salida:
Hola mundo
B i e n v e n i d o a Turbo Pascal 7 . 0 / 6 . 0

El entorno de programacin

Programacin en Turbo/Borland Pascal 7

52

Cuando su programa se termina de ejecutar, aparecer un mensaje en la parte inferior de la pantalla

a t < segmento>

: <offset>

cdigo del error


direccin de m e m o r i a d o n d e ocurre el error

Si necesita ayuda para localizar el error, pulse Fl o bien CTRL-QW, o bien elija la ord e n Find E r r o r d e l m e n Compile.

2.12.

3. Pulsar j para seleccionar una lista de especificaciones de archivos y elija el nombre.


s e l e c c i o n e Open o Replace. L a o p c i n Replace s u s t i t u y e el c o n t e n i d o d e la v e n t a n a d e e d i -

que significa lo que literalmente dice: pulse cualquier tecla para volver a Turbo Pascal. El
entorno Turbo Pascal reaparece y est listo para otro ciclo: editar, compilar y ejecutar.
Si ocurriera un error mientras el programa se est ejecutando, se visualiza en pantalla
un mensaje similar a:

numerror
< segmento > : < offset >

53

U n a vez que el nombre del archivo o editor se selecciona en el cuadro de entrada,

P r e s s any Key t o r e t u r n t o Turbo P a s c a l . . .

Run- time e r r o r < numerror>

Turbo Pascal: Comenzando la programacin

TRATAMIENTO DE ARCHIVOS
EN LA VENTANA DE EDICION

cin con el archivo seleccionado.

2.13.

EL DEPURADOR INTEGRADO

Las versiones de Turbo Pascal a partir de la 5.0 incluyen un depurador (programa para la
puesta a punto de programas) que permite seguir el programa (lnea a lnea) y ver cmo
cambian los valores de variables y expresiones a medida que el programa se ejecuta. El
depurador sirve para ayudar a encontrar errores ("6ugs") en su programa.
El depurador funciona permitindole detener su programa en cualquier punto a
medida que se ejecuta, de modo que puede verificar o incluso alterar el valor de variables
o de otros elementos de datos.
Dada la importancia del depurador y que se obtiene su mximo rendimiento cuando
se tiene un conocimiento slido del lenguaje Turbo Pascal, el funcionamiento terico y
prctico del depurador se estudiar en el Apndice H.

El EID de Turbo Pascal permite crear nuevos archivos, abrir archivos existentes y
grabados. La Tabla 2.2 resume las tareas bsicas ampliadas en la administracin de archivos.

RESUMEN

2.12.1.

El e n t o r n o T u r b o Pascal contiene todos los recursos y h e r r a m i e n t a s necesarios para desarrollar,


compilar, d e p u r a r y verificar sus propios p r o g r a m a s Pascal. El acceso a estos recursos y h e r r a m i e n tas se realiza m e d i a n t e rdenes incorporadas a u n a serie de m e n s desplegables que aparecen en
pantalla.

Abrir archivos

Para cargar un archivo de programa en la ventana de edicin, pulse

ALT-F

(se selecciona

F i l e ) y a continuacin teclear 0 para seleccionar la orden Open. Aparece un cuadro de

dilogo Open a file. En este momento se pueden realizar varias acciones:


1. Teclear el nombre del archivo en el cuadro que contiene *.PAS (la extensin .PAS
es opcional).
2. Teclear un nombre de archivo con caracteres comodines y seleccionar el nombre
de archivo deseado.
Tabla 2 . 2 .
Orden
F i l e | New
F i l e | Open
F i l e | Save
F i l e ] Save as
F i l e Save a l l
F i l e Change d i r

Administracin d e a r c h i v o s
Descripcin

Abre u n n u e v a v e n t a n a de edicin y le asigna u n n o m b r e t e m p o r a l .


Abre un archivo existente o crea u n nuevo n o m b r e con u n n o m b r e
que se especifica.
G u a r d a el archivo en la ventana activa de edicin en disco.
G u a r d a el archivo en la ventana activa de edicin b a j o u n n o m b r e
diferente.
G u a r d a todos los archivos modificados.
C a m b i a el directorio actual.

La versin 5.0 incorpor mltiples mejoras significativas con relacin a versiones antiguas. A
partir de la versin 5.5 y hasta la versin 7.0 se ha a a d i d o a d e m s la posibilidad de trabajar en
programacin orientada a objetos, tcnica avanzada de programacin que ya constituye u n a filosofa o metodologa p r o p i a en la dcada de los n o v e n t a .
Las etapas que siempre debe seguir en T u r b o Pascal p a r a crear un programa son:
1. Editar el texto del programa f u e n t e con el editor de T u r b o Pascal.
2. E x a m i n a r el texto y utilizar las rdenes del editor para corregir los errores.
3. C o m p i l a r el p r o g r a m a .
3.1. Si el c o m p i l a d o r encuentra un error, se retorna al editor en el probable lugar de
error.
4. Ejecutar el p r o g r a m a y verificar los resultados.
5. Verificar el programa.
6. Si el p r o g r a m a no pr oduc e los resultados esperados, deber recurrir al d e p u r a d o r de T u r b o
Pascal para analizar la ejecucin del programa.
7. Ejecutar el p r o g r a m a . EXE creado directamente desde T u r b o o desde DOS.
8. C a m b i a r la opcin D e s t i n a t i o n del c o m p i l a d o r en disco y compilar el p r o g r a m a u n a ltima
vez.

Introduccin a Pascal

3.1.

55

LA ESTRUCTURA DE UN PROGRAMA EN PASCAL

A u n q u e y a se h a e x a m i n a d o u n p r o g r a m a e n T u r b o P a s c a l , e n e s t a s e c c i n a n a l i z a r e m o s
CAPITULO

e n d e t a l l e las r e g l a s d e e s t r u c t u r a q u e se d e b e n s e g u i r siempre

q u e se e s c r i b a n p r o g r a m a s

e n T u r b o P a s c a l . L a e s t r u c t u r a d e u n p r o g r a m a e n T u r b o P a s c a l se i n d i c a e n la F i g u r a 3.1.

INTRODUCCION A PASCAL

CONTENIDO
3.1.
3.2.
3.3.
3.4.
3.5.
3.6.
3.7.
3.8.
3.9.
3.10.
3.11.
3.12.
3.13.
3.14.

La e s t r u c t u r a d e un p r o g r a m a en Pascal
O b j e t o s d e un p r o g r a m a
D i a g r a m a s d e sintaxis
Tipos de d a t o s
Constantes
Variables
Sentencias
La s e n t e n c i a d e a s i g n a c i n
Expresiones y operaciones aritmticas
Operaciones Entrada/Salida
O p e r a c i o n e s b s i c a s d e utilidad
P r o g r a m a c i n interactiva
El estilo d e p r o g r a m a c i n
Puesta a punto de programas

program identificador
(cabecera del programa!
uses identificadores
label lista de etiquetas
seccin de etiquetas!
const
definiciones de constantes
type
declaracin de tipos de datos definidos por el usuario
var
declaracin de variables
procedure
definiciones de procedimientos
function
definiciones de funciones
begin
sentencias
end

RESUMEN
EJERCICIOS
PROBLEMAS

cuerpo del programa!

Figura 3 . 1 . Estructura d e un p r o g r a m a en T u r b o Pascal.

L a s c i n c o s e c c i o n e s d e d e c l a r a c i n l a b e l , const, type, var y procedure y / o funct i o n , as c o m o la c l u s u l a uses, n o t i e n e n q u e e x i s t i r e n t o d o s los p r o g r a m a s . S i n e m E s t e captulo i n t r o d u c e al l e n g u a j e d e p r o g r a m a c i n d e s a r r o l l a d o en


1 9 7 1 por el p r o f e s o r Nicklaus Wirth d e Zurich. D i f e r e n t e s v e r s i o n e s
d e Pascal han a p a r e c i d o d e s d e su introduccin y d u r a n t e m u c h o s
a o s el Pascal User Manual and Report publicado p o r Wirth y J e n s e n n en 1 9 7 4 ha s e r v i d o de facto c o m o el e s t n d a r .
Pascal e s el l e n g u a j e d e p r o g r a m a c i n m s popular para la e n s e a n z a d e c o n c e p t o s d e p r o g r a m a c i n ya q u e su sintaxis e s relativam e n t e fcil d e a p r e n d e r . Por otra p a r t e , e s el l e n g u a j e p o r naturalez a d e la p r o g r a m a c i n e s t r u c t u r a d a .
La aparicin d e T u r b o Pascal c o m o e n t o r n o d e p r o g r a m a c i n y
las ltimas v e r s i o n e s 5 . 5 , 6 . 0 y 7 . 0 con un e n f o q u e o r i e n t a d o a
o b j e t o s han c o n t r i b u i d o a popularizar Pascal.
E s t e captulo d e s c r i b e los d a t o s y t i p o s d e d a t o s utilizados por el
l e n g u a j e , j u n t o con las s e n t e n c i a s ( p r o c e d i m i e n t o s predefinidos),
para introducir d a t o s y visualizar r e s u l t a d o s .

54

bargo, T u r b o Pascal presenta

flexibilidad

a la h o r a d e e s c r i b i r l a s s e p u e d e h a c e r e n

c u a l q u i e r o r d e n , m i e n t r a s q u e P a s c a l e s t n d a r ( I S O P a s c a l ) r e q u i e r e la e s c r i t u r a e n el
o r d e n d e la F i g u r a 3.1 ( c o n la e x c e p c i n d e u s e s q u e n o e x i s t e e n I S O P a s c a l ) . L a s secc i o n e s d e d e c l a r a c i o n e s e s t n s e g u i d a s p o r el c u e r p o d e l p r o g r a m a o p r o g r a m a p r i n c i p a l
q u e s i e m p r e existir y q u e constar de u n n m e r o d e t e r m i n a d o de sentencias. N o obst a n t e , y p e s e a la f a c i l i d a d d e T u r b o P a s c a l d e p e r m i t i r l e m e z c l a r e n c u a l q u i e r o r d e n las
d e c l a r a c i o n e s , le r e c o m e n d a r e m o s s e g u i r s i e m p r e el o r d e n e s t a b l e c i d o e n d i c h a F i g u r a 3.1, le e v i t a r e n el f u t u r o n u m e r o s o s p r o b l e m a s .
Programa

Demo
program DemoPrimero;
{ cabecera }
{ Este es nuestro primer programa en Turbo Pascal}
uses
Crt, DOS;
{ declaraciones }

56

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal

const

program DemoPrimero;

Pi

3.141592;

IVA

12;

type
Palabra = string [20];
Notas
= 1..10;
var
Salario
: real;
Numero
: integer;
Apellido : palabra;
Pesos
: notas;
begin
ClrScr;
{ borra o limpia la pantalla }
Write
('Cual es su primer apellido? ');
Re adLn
(Ape11 ido);
WriteLn ('Escriba un numero Sr:
Apellido);
ReadLn
(Numero);
WriteLn ('el cuadrado del numero es
Numero * Numero);
{ fin del cuerpo del programa }
end.

separador
nombre

3.1.2.

de sentencias

del programa

o instrucciones
(identificador)

La parte de declaracin de uso de unidades

T u r b o Pascal difiere de I S O Pascal estndar en que permite la compilacin separada


(vase Captulo 18). Si desea utilizar mdulos compilados independientes de su programa, debe tener la parte de declaracin de uso de unidades:
c l a u s u l a uses

Formato
uses
lista de idenjicadores;
lista de identijicadores

En Pascal no es posible definir o declarar un objeto en cualquier parte del programa;


estas definiciones se agrupan en la parte reservada a las declaraciones.

unidades estndar de T u r b o Pascal (Captulos 18 y 19) y


u n i d a d e s c r e a d a s p o r el u s u a r i o ; p o r e j e m p l o , Crt, DOS,
DEMO, e t c .

Ejemplo

Regla
Todo objeto referenciado

en un programa

debe haber sido previamente

uses Dos, Crt, Demo;

definido.

Esta propiedad se traduce en una regla que obliga a que los objetos nuevos han de ser
construidos nicamente con la ayuda de objetos ya conocidos o predefinidos. As, por
ejemplo, el programa:
program Novalido;
const
EdadMaxima = 99;
var
Lista__Edades : array [1..Mximo] of integer;
begin
end.

es incorrecto, ya que se referencia la constante Mximo en la declaracin de variables antes


de ser definida en la declaracin de constantes.

3.1.1.

57

La s e n t e n c i a p r o g r a m

La sentencia program especifica el nombre del programa (identificador) y sus parmetros.


Este nombre no necesita ser el m i s m o que el de su cdigo fuente ni el del cdigo mquina que produce el compilador.

{Dos, Crt: unidades estandar; Demo: unidad


creada por el usuario}

La clusula uses identifica todas las unidades utilizadas por el programa y significa
que a partir de esa lnea se podrn utilizar todas las rutinas (subprogramas) incluidas en
dichas unidades.
La mayora de sus programas tendrn una sentencia uses. Es opcional, pero si existe,
debe ser la primera sentencia no comentario a continuacin de la sentencia program.

3.1.3.

La seccin de declaraciones

Las declaraciones 1 abe!, const, type y var pueden aparecer ms de una vez, y en cualquier
orden, en la parte reservada a las declaraciones, con la sola condicin de que ellas respeten la regla enunciada anteriormente. Esta flexibilidad permite a veces una presentacin a n ms clara, reagrupando declaraciones que tratan objetos lgicamente relacionados. Por ejemplo, es posible escribir:
program Stock;
const NumeroClientes = 100;
var
Cliente: array [1..NumeroClientes] of integer;
const NumeroProveedores = 15;
var
Proveedores
: array [1..NumeroProveedores] of integer;
begin
end.

58

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal
Nombre_Apel 1 idos
A_3^C
ABC-Pas

en lugar de
program Stock;
const
NumeroCllentes
= 100;
NuraeroProveedores = 15;
var
Cliente
: array [1..NumeroClientes] of integer;
Direccin
: string [36];
Proveedores : array [1..NuraeroProveedores] of integer;
begin
end.
O t r a p a r t i c u l a r i d a d es q u e las declaraciones de constantes, tipos y variables se p u e d e n
situar e n t r e p r o c e d i m i e n t o s .

Identificadores

OBJETOS DE UN PROGRAMA

U n p r o g r a m a Pascal se c o n s t r u y e a base de objetos ( t o k e n s ) y s e p a r a d o r e s (blancos o


c o m e n t a r i o s ) . Los objetos son las u n i d a d e s significativas m s p e q u e a s de texto de u n
p r o g r a m a Pascal y se dividen en: s m b o l o s especiales, identificadores, etiquetas, n m e ros. constantes, variables, directivas, etc.

3.2.1.

Identificadores

( p o r e j e m p l o , A, X2, Z) ni d e m a s i a d o largos q u e dificulten la escritura y la legibilidad del


p r o g r a m a (SuperCal i Fragi 1 i sticoEspi al idoso).
maysculas

y minsculas

T u r b o Pascal no distingue las letras m a y s c u l a s de las m i n s c u l a s en los identificadores.


As, p o r e j e m p l o ,
Cantidad

type
i nteger = char;
Identificadores

vlidos

Nombre
Letrasl
Cont
PesetasKilo

Impuesto_IVA
Impuesto_IRPF
ImpuestosTotales
ImpuestoBebidas

CANTIDAD

cantidad

son identificadores vlidos e idnticos.

Palabras reservadas

Las palabras reservadas de T u r b o Pascal t i e n e n significado especial y n o se p u e d e n


utilizar para otros propsitos. U n a p a l a b r a reservada n o se p u e d e utilizar c o m o identificador. La T a b l a 3.1 c o n t i e n e la lista de p a l a b r a s reservadas.
En este texto, casi siempre, las p a l a b r a s reservadas se escriben en m i n s c u l a s negritas,
a u n q u e c o m o ya se ha c o m e n t a d o el c o m p i l a d o r n o diferencia e n t r e var y VAR; sin

1. D e b e c o m e n z a r con u n a letra (A a Z, m a y s c u l a s o m i n s c u l a s ) y n o p u e d e
c o n t e n e r blancos.
2. Letras, dgitos y caracteres s u b r a y a d o s ( - ) estn p e r m i t i d o s d e s p u s del p r i m e r
carcter.
3. N o se p u e d e utilizar u n a p a l a b r a reservada c o m o i d e n t i f i c a d o r ; sin e m b a r g o , los
identificadores e s t n d a r se p u e d e n redefinir:

contiene un carcter no vlido (&)


contiene un blanco
@ es vlido slo al principio
es una palabra reservada

de identificadores

3.2.2.

Los identificadores
r e p r e s e n t a n los objetos de un p r o g r a m a (constantes, variables, tipos
de datos, p r o c e d i m i e n t o s , f u n c i o n e s , unidades, p r o g r a m a s y c a m p o s de registros). U n
i d e n t i f i c a d o r es u n a secuencia de caracteres q u e p u e d e ser de c u a l q u i e r longitud, p e r o
slo los 63 p r i m e r o s caracteres son significativos.
U n i d e n t i f i c a d o r se caracteriza p o r estas reglas:

no vlidos

La eleccin de identificadores f a v o r e c e la lectura y c o m p r e n s i n de un p r o g r a m a . N o es


aconsejable utilizar i d e n t i f i c a d o r e s d e m a s i a d o cortos q u e n o sugieran n i n g n significado

Letras

3.2.

SalarioBruto
Salario_Bruto
Salario_Neto

Fox&Horas
F Bar
La@Luna
begi n
Eleccin

59

Tabla 3.1. Palabras reservadas de Turbo Pascal


absolute
and
array
. begin
./casi
const
div
do
downto
else

end
external
' file
forward
function
goto
if
implementation
IT' "

inline
interface
interrupt
label
mod
nil
not
of
or
packed

procedure
program
record
repeat
set
shl
shr
string
then
t X;

type
unit
' until
uses
var
while
with
xor

60

Programacin en Turbo/Borland Pascal 7

introduccin

e m b a r g o , p e n s a m o s que al ser el m o d o natural de e s c r i t u r a las letras minsculas, stas


ofrecern m a y o r legibilidad de escritura y lectura.

3.2.3.

Etiquetas

Notas

{ }

o bien

>

C o m o su n o m b r e indica, son objetos q u e m a n t i e n e n su valor d u r a n t e t o d a la e j e c uc i n


del p r o g r a m a . P u e d e n ser de diferentes tipos:

3.2.5.

16.243

(* *)

2. Para que un comentario sea interpretado por el compilador como una directiva, el sign
debe seguir inmediatamente a la apertura del comentario: { o bien (*.
3. Se sitan en los programas en cualquier posicin donde se pueda situar un comentario.

Constantes

135

61

1. Un comentario (apartado 3.13) es una indicacin al programador ignorada por el compilador. Se representan encerrados entre smbolos.

U n a etiqueta es u n identificador q u e se c o m p o n e de u n a secuencia de letras y dgitos y


q u e a diferencia del identificador clsico p u e d e c o m e n z a r c o n dgitos. Se utilizan con las
sentencias goto. Su uso n o est r e c o m e n d a d o y en este libro n o se e m p l e a r n nunca.

3.2.4.

a Pascal

'Luis'

'Principio'

Ejemplos
i$B+j
{$F+

'Carchelejo (Jan)'

j$I+{
{$I-j

{$IFOPT N+
ENDIFj

Identificadores estndar

Los identificadores conocidos del lenguaje Pascal p u e d e n ser redefinidos p o r el u s u a r i o


( a u n q u e no es r e c o m e n d a b l e ) . A l g u n o s identificadores e s t n d a r son:
tipos

integer

Read

byte

procedimientos

write

WriteLn

ReadLn

reset

read

junciones

sin

eos

ord

chr

eoln

3.2.6.

Lneas de programa

Las lneas de un p r o g r a m a T u r b o Pascal tienen u n a l o n g i t u d m x i m a de 128 caracteres


y n o tienen n m e r o de lnea.

3.2.7.

Directivas de compilacin

3.3.

DIAGRAMAS DE SINTAXIS

Las reglas de g r a m t i c a de u n l e n g u a j e de p r o g r a m a c i n se l l a m a n reglas de sintaxis del


lenguaje. Las reglas de sintaxis d e t e r m i n a n si la secuencia d e caracteres q u e f o r m a n u n
p r o g r a m a se p u e d e t r a d u c i r por el c o m p i l a d o r a cdigo m q u i n a . Las reglas de sintaxis
de Pascal se r e p r e s e n t a n m e d i a n t e d i a g r a m a s d e n o m i n a d o s diagramas de sintaxis. La
Figura 3.2 es el d i a g r a m a de sintaxis de u n identificador.
Para leer u n d i a g r a m a de sintaxis se c o m i e n z a p o r el l a d o i z q u i e r d o y se sigue el
c a m i n o i n d i c a d o p o r la flecha. E n el caso de la F i g u r a 3.2, tras la flecha viene u n
rectngulo e t i q u e t a d o "letra", q u e significa q u e en ese p u n t o debe seleccionar u n a letra.
A c o n t i n u a c i n de este rectngulo, viene u n " p u n t o de b i f u r c a c i n " similar a u n cruce
de calles. Se p u e d e elegir c u a l q u i e r a de las c u a t r o alternativas: c o n t i n u a r d e r e c h o hasta la
flecha de salida (el i d e n t i f i c a d o r t e n d r slo u n a letra, p o r e j e m p l o B), seguir el c a m i n o
q u e nos c o n d u c e a travs del rectngulo " d g i t o " o del rectngulo "subrayado".
Si se elige

U n a directiva ( p s e u d o i n s t r u c c i n ) es u n c o m e n t a r i o q u e a c t a c o m o u n a o r d e n especial
al c o m p i l a d o r y en c o n s e c u e n c i a c o n t r o l a la n a t u r a l e z a del cdigo p r o d u c i d o p o r T u r b o
Pascal. C o n la a y u d a de directivas, el p r o g r a m a d o r p u e d e , p o r e j e m p l o , elegir cortocircuitar la e v a l u a c i n de expresiones lgicas, indicar la p r e s e n c i a de u n c o p r o c e s a d o r m a t e m t i c o , incluir archivos f u e n t e ( p r o g r a m a s ) en otros a r c h i v o s f u e n t e , etc.
Sintaxis
1.

|$ directiva)

directiva

2.

{*% directiva*)

nombre vlido de la directiva, de uno o ms caracteres, situado inmediatamente despus del signo $

Figura 3.2. Diagrama de sintaxis de un identificador.

62

Programacin en Turbo/Borland PascaI 7

Introduccin

a Pascal

u n a de estas alternativas, el identificador t e n d r ya dos caracteres. As se p u e d e seguir


hasta elegir las letras, dgitos o s u b r a y a d o s q u e se deseen, o t e r m i n a r (salir).
Los d i a g r a m a s de sintaxis son m u y tiles en la verificacin de la validez de n u e s t r o s
p r o g r a m a s en Pascal ya q u e ofrecen u n a b u e n a representacin visual d e las reglas q u e se
utilizan en la c o n s t r u c c i n de p r o g r a m a s . Estos d i a g r a m a s son c o n o c i d o s t a m b i n c o m o
diagramas de Conway. E n este captulo r e c u r r i r e m o s a ellos c o n f r e c u e n c i a , h a s t a conseguir su a p r e n d i z a j e p o r p a r t e del lector. El A p n d i c e K r e p r e s e n t a t o d o s los d i a g r a m a s
de sintaxis de T u r b o Pascal.

3.4.

TIPOS DE DATOS

Los diferentes objetos de i n f o r m a c i n con los q u e u n p r o g r a m a Pascal t r a b a j a se c o n o cen c o l e c t i v a m e n t e c o m o datos. T o d o s los d a t o s tienen u n tipo a s o c i a d o c o n ellos. U n
d a t o p u e d e ser u n simple carcter, tal c o m o ' B', u n valor e n t e r o tal c o m o 35 o u n
n m e r o real tal c o m o 141592. U n a operacin de s u m a n o tiene s e n t i d o con caracteres,
slo c o n n m e r o s . Por consiguiente, si el c o m p i l a d o r d e t e c t a u n a o p e r a c i n d e s u m a de
dos caracteres, n o r m a l m e n t e p r o d u c i r u n error. Incluso e n t r e tipos n u m r i c o s , la operacin de s u m a se a l m a c e n a de m o d o distinto. Esto se d e b e a q u e n m e r o s e n t e r o s y
reales se a l m a c e n a n de m o d o s diferentes. A m e n o s q u e el p r o g r a m a c o n o z c a el t i p o de
datos, si es un valor e n t e r o o real, n o p u e d e ejecutar c o r r e c t a m e n t e la o p e r a c i n de
suma.
La asignacin de tipos a los datos tiene dos objetivos principales:
Figura 3.3. Tipos de d a t o s en Turbo Pascal.
1. Detectar errores de o p e r a c i o n e s en p r o g r a m a s .
2. D e t e r m i n a r c m o ejecutar las operaciones.

Los tipos simples d e f i n e n c o n j u n t o s de valores o r d e n a d o s .


Tipo simple-

Pascal se c o n o c e c o m o l e n g u a j e "fuertemente tipificado" ( s t r o n g l y - t y p e d ) o de tipos


f u e r t e s . E s t o significa q u e t o d o s los d a t o s u t i l i z a d o s d e b e n t e n e r sus t i p o s d e c l a r a d o s
e x p l c i t a m e n t e y el lenguaje limita la mezcla de tipos en las expresiones. Pascal d e t e c t a
m u c h o s errores de p r o g r a m a c i n antes que el programa se ejecute.
La v e n t a j a de los lenguajes de tipos fuertes (ricos en t i p o s de d a t o s ) es q u e se gasta
m e n o s esfuerzo en la d e p u r a c i n de p r o g r a m a , ya q u e el c o m p i l a d o r detecta m u c h o s de
esos errores.
El tipo de un d a t o d e t e r m i n a la naturaleza del c o n j u n t o de valores q u e p u e d e t o m a r
u n a variable. Otro c o n c e p t o i m p o r t a n t e a t e n e r en c u e n t a es la r e p r e s e n t a c i n i n t e r n a de
los n m e r o s , o al m e n o s el espacio de m e m o r i a o c u p a d o p o r u n a variable de u n tipo
dado.
La u n i d a d de m e d i d a de la c a p a c i d a d de m e m o r i a es el byte (octeto); u n b y t e se c o m p o n e de o c h o cifras b i n a r i a s (bits) q u e p u e d e n t o m a r c a d a u n a el v a l o r 0 o 1.

Tipo ordinal

Tipo real

Tipo real -

Identificador tipo real

Los tipos ordinales s o n t o d o s los tipos simples distintos d e los tipos reales.

predefinidos

3.4.1.

Clasificacin de los tipos de datos

Pascal s o p o r t a un gran n m e r o de datos; la Figura 3.3 recoge t o d o s ellos.

Tipos ordinales
definidos
por el usuario

integer
char
. boolean
enumerados
subrango

63

64

Introduccin a Pascal

Programacin en Turbo/Borland Pascal 7

65

Integer

E s t u d i a r e m o s en esta seccin los tipos ordinales predefinidos, d e j a n d o p a r a el Captulo 10 los tipos de d a t o s d e f i n i d o s por el usuario.
Los d a t o s p u e d e n ser c o n s i d e r a d o s desde o t r o p u n t o de vista: c o n s t a n t e s (son i n v a riantes) y variables (susceptibles de ser m o d i f i c a d o s por las a c c i o n e s del p r o g r a m a ) .

Los enteros se expresan en el r a n g o de valores

3.4.2.

y no p u e d e n t e n e r parte decimal. Los enteros Integer se a l m a c e n a n en m e m o r i a c o m o


dos bytes (Fig. 3.4). El bit de m a y ^ r peso ( o r d e n ) d e los d o s bytes en m e m o r i a es el bit de
signo (positivo o negativo). Si este bit es un 1, el e n t e r o es negativo, y si el bit es 0 el
entero es positivo.

Tipos enteros

T u r b o Pascal d i s p o n e de cinco tipos p r e d e f i n i d o s n o necesitan n u e v a d e f i n i c i n del


p r o g r a m a d o r q u e p e r m i t e n representar valores enteros.

-32768 . . 32767

Se p u e d e separar u n e n t e r o en sus dos bytes u t i l i z a n d o las f u n c i o n e s i n t e r n a s Hi y Lo.

Hi
Lo

Byte
Los valores de tipo byte son los n m e r o s enteros c o m p r e n d i d o s e n t r e 0 y 255. Se a l m a c e nan en m e m o r i a c o m o u n byte (8 bits). Al nivel de lenguaje m q u i n a , byte y char son
e x a c t a m e n t e lo m i s m o . La nica diferencia reside en c m o los gestiona el c o m p i l a d o r .
U n tipo byte, al no ser nunca negativo, n o est d e s t i n a d o a clculos, sino a la m a n i p u lacin del bit del interior del byte u octeto.

el byte de mayor peso de los 2 bytes de memoria


el byte de menor peso

Ejemplo
Entero
Hi
Lo
Hi
Lo

Ejemplo
program Test_Byte;
var
Octeto : byte;
begin
Octeto := 2 53;
WriteLn ('el valor del octeto =
end.

devuelve
devuelve

17352

(17352)
(17352)
(-21244)
(-21244)

equivale a

devuelve
devuelve
devuelve
devuelve

67
200
173
4

(hex
(hex
(hex
(hex

Hexadecimal

$43c8

$43)
$C8)
$AD)
$04)

Nota
En Turbo Pascal existe una constante predefinida maxint, que contiene el mayor valor
que un entero puede tomar; 32767.

Octeto)

bit 7

Si ejecuta este p r o g r a m a , se o b t e n d r :

bit 0

Byte

; 1 byte)

Shortint

(1 byte)

el valor del octeto = 253


Si se i n t e n t a asignar u n a c o n s t a n t e negativa a u n a variable de tipo byte, se o b t i e n e el
mensaje:

bit de signo
Error 7 6 : Constant out of range
Word

{.2 bytes)

Integer

(2 bytes)

Tabla 3.2. Tipos enteros predefinidos


Tipo
byte
integer
longint
shortint
word

Formato

Rango
0
-32768
-217483648
-128
0

.. 255
.. 32767
..2147483647
.. 127
.. 65535

8
16
32
8
16

bits sin signo


bits con signo
bits con signo
bits con signo
bits sin signo

(4 bytes)

Longnt
byte

Figura 3.4. Representacin en memoria de tipos enteros.

66

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal

Longint (enteros largos)

67

1, Notacin cientfica o d e c o m a f l o t a n t e

A partir de la versin 4.0 se han incorporado nmeros que amplan el rango de variacin
de los enteros a -2.147.483.648. Este tipo de datos se d e n o m i n a longint (enteros largos).
Ocupan 4 bytes de memoria.
Existe una constante predefinida de tipo longint, d e n o m i n a d a maxlongint, cuyo valor
es 2.147.483.647.

El rea ocupada por un n m e r o real se divide en dos zonas: mantisa


nente.
mantisa:

y expo-

fraccin binaria entre 0.5 y 1.0 (o - 0 . 5 y - 1 . 0 para segmentos negativos)


potencia de 10
4

exponente:

Shortint (enteros cortos)

nmero real = mantisa x iOcsencmc

En ciertos casos, puede ser prctico disponer de valores enteros positivos y negativos cuyo
alcance sea ms restringido que el de los tipos enteros. Los tipos shortint pueden t o m a r
valores entre - 1 2 8 y 127. Estos datos ocupan 1 byte de memoria.

Esta notacin se utiliza para representar nmeros muy grandes o muy pequeos. En notacin decimal los nmeros se escriben en notacin E (E de exponente,
y significa multiplicar por 10 la potencia que sigue).

Word
Existen casos en los que se desea representar nicamente valores positivos. Este es el
caso, por ejemplo, cuando se desea acceder desde un programa hasta una direccin de
memoria. En tal situacin, no tiene sentido una direccin negativa. T u r b o Pascal dispone del tipo word (o palabra, de palabra de memoria), cuyo intervalo posible de valores es
de 0 a 65535.
Una variable de tipo word como una de tipo integer ocupa dos bytes en memoria,
pero slo puede recibir valores positivos.

n E del

nmero decimal (con o sin signo + o - )


exponente entero (positivo, negativo o cero)

Ejemplos

3.4.3.

Tipos reales

Los tipos de datos reales son aquellos que representan al c o n j u n t o de los nmeros reales.
Los clculos matemticos normales exigen dos tipos de datos numricos: enteros y reales. Aunque cualquier nmero se puede representar como real. Las computadoras diferencian uno y otro tipo. Las diferencias residen en la representacin interna en la memoria de la computadora. Todos los datos se representan en m e m o r i a como series binarias
(cadenas de ceros y unos). Sin embargo, la cadena binaria almacenada para el entero 15
no es la misma que la cadena almacenada para el n m e r o real 15.0. La representacin
interna depende de la computadora. En la Figura 3.5 se representan los formatos entero
y real.
As. en el caso del nmero 15, el nmero binario equivalente es 1111. Los nmeros
reales se pueden representar de dos formas.

Formato entero
Nmero binario

Formato reaI
Mantisa

Exponente

Figura 3.5. Formatos entero y real.

equivale a
equivale a

1.6125E-10
3.49E-2

de constantes

1.6125x10"'10
3.49xl0~ 2 = 0.0349

de tipo real

vlidas

no vlidas

9.34E13
5.0E+25
5.0E-25
-8.63814.e20
+34.85E54
-6.783E-12

'5 E12
-7EI3
3.5E32.5

no tienen mantisa legal


no tienen mantisa legal
tiene un punto decimal en el exponente

2 . Notacin en c o m a fija
Expresar el nmero real con un p u n t o decimal (no con comas)
3.141592

0.0056

-18.8

El tipo real se representa en memoria con 6 bytes y en un rango de 10~38 a


103s.
Los nmeros reales estn siempre disponibles en T u r b o Pascal, pero si su sistema
incluye un coprocesador matemtico c o m o 8087, 80287 u 80387, se dispone adems
de otros tipos de nmeros reales:
real (real)
single (real corto)
comp (entero ampliado)

double (real de doble precisin)


extended (real ampliado)

68

Programacin en Turbo/Borland Pascal 7

Computadoras

sin coprocesador

Introduccin a Pascal

matemtico

(emulacin

por software)

Reglas

d a t o s disponibles: real, comp, double, extended y s i n g l e


Computadoras

con coprocesador

69

Utilizar $N- y $E- datos tipo Real: no se necesitan coprocesadores.


Utilizar $N+ y $E- soporte real hardware, se requiere coprocesador.
Utilizar $N+ y $E+ soporte real IEEE emulado. Es indiferente que exista o no el coprocesador.

matemtico

datos disponibles: real, comp, double, extended y s i n g l e (reales IEEE)


Desde la versin 5.0 se p e r m i t e utilizar los d a t o s t i p o c o p r o c e s a d o r m a t e m t i c o
a u n q u e su c o m p u t a d o r a n o lo t e n g a i n c o r p o r a d o . L a r a z n es q u e se emula d i c h o
coprocesador. Los diferentes tipos reales se d i f e r e n c i a n p o r el d o m i n i o de d e f i n i c i n , el
n m e r o de cifras significativas (precisin) y el espacio o c u p a d o e n m e m o r i a ( T a b l a 3.3).
T u r b o Pascal 4.0 requiere o b l i g a t o r i a m e n t e u n chip c o p r o c e s a d o r m a t e m t i c o
para hacer uso de n m e r o s reales de c o m a flotante I E E E .
T u r b o Pascal 5.0 a 7.0 emula el c h i p c o p r o c e s a d o r m a t e m t i c o t o t a l m e n t e en
software, p e r m i t i e n d o ejecutar tipos I E E E t a n t o si tiene c o m o si n o u n c h i p 8 0 8 7 /
2 8 7 / 3 8 7 instalado en su m q u i n a .

Tabla 3 . 3 . Nmeros reales


Rango

Tipo

1CT
10~45
1(T324
1(T4932
+

.. 1.7
..3.4
.. 1.7
.. 1.1

38

10
1 0 3S
10308
10 4932
I

2.9
1.6
5.0
3.4
ri
1

real
single
double
extended
comp

39

Cifras

Tamao y bytes

11-12
7-8
15-16
19-20
19-20

6
4
8
10
8

Notas
Los enteros ocupan menos memoria que los reales.
Las operaciones con enteros son siempre precisas.
Normalmente las operaciones con enteros son ms rpidas que con nmeros reales.

3.4.4.

Tipos carcter (Char)

El t i p o char es u n tipo de datos q u e p u e d e c o n t e n e r u n solo carcter. C a d a u n o d e estos


caracteres p u e d e ser e x p r e s a d o gracias al c d i g o ASCII (en realidad ASCII a m p l i a d o ) . E n
el A p n d i c e A se i n c l u y e n 256 caracteres distintos. U n literal char se debe e n c e r r a r e n t r e
simples a p s t r o f o s (sin e m b a r g o , n o se p u e d e utilizar a p s t r o f o s c u a n d o se i n t r o d u c e n
caracteres desde el terminal).
Ejemplo
1

A1

1 1

b'

' *1

' ^'

'5'

11

Nota
Clasificacin

de reales

T i p o real hardware
(necesitan el c o p r o c e s a d o r
m a t e m t i c o en 4.0, se e m u l a
en 5.0)

single
double
extended
comp

tipo real s o f t w a r e

real

Directivas de compilacin
$N y $E controlan el s o p o r t e de reales d e c o m a flotante. Sus valores p o r d e f e c t o son
$N- y $E+.
versin 4.0

$N+
$N

permite utilizar coma flotante IEEE


limita los tipos reales a real

versin 5.X, 6.0, 7.0

$E+
$E_

emula coma flotante


desactiva emulacin

El carcter blanco se escribe en un programa como el literal * ' y se introduce en memoria


pulsando la barra espadadora

U n d a t o de tipo carcter p u e d e ser u n a letra (tal c o m o A, B, etc.), u n dgito (tal


c o m o 7), o u n carcter especial (tal c o m o $, &, *, etc.). Los d a t o s de tipo c a r c t e r son
ordinales, lo q u e significa q u e c a d a carcter r e p r e s e n t a u n a posicin en u n a serie o r d e n a da (de 0 a 255). El o r d e n de la letra A es 65, d e la letra B es 66, etc.
L a f u n c i n p r e d e f i n i d a chr p e r m i t e r e f e r e n c i a r t o d o s los caracteres: chr (65) e q u i v a l e
a la letra A, chr (66) equivale a la letra B, etc.
T u r b o Pascal d i s p o n e de dos facilidades s u p l e m e n t a r i a s p a r a designar caracteres:
1. Se escribe el s m b o l o # seguido del c d i g o del c a r c t e r
#65

equivale a

chr (65)

7O

Programacin

en Turbo/Borland Pascal 7

2. Los caracteres de control (no visualizables) se r e p r e s e n t a n hacindoles preceder


del s m b o l o
~G ~G

produce dos pitidos sonoros

El pitido s o n o r o c o r r e s p o n d e al carcter ASCII n m e r o 7 (o CTRL-G).

Introduccin

3.4.7.

a Pascal

71

Tipo cadena (string)

U n tipo s t r i n g (cadena) es u n a s e c u e n c i a de caracteres de cero o m s caracteres corresp o n d i e n t e s al cdigo ASCII, escrito en u n a lnea sobre el p r o g r a m a y e n c e r r a d o e n t r e
apstrofos.
El t r a t a m i e n t o de c a d e n a s es u n a caracterstica m u y p o t e n t e de T u r b o Pascal q u e no
c o n t i e n e ISO Pascal e s t n d a r , a u n q u e tiene m u c h a similitud con el tipo packed array.
P o r su i m p o r t a n c i a , se d e d i c a un c a p t u l o (el 11) a t r a t a r el t e m a .

Ejemplos
#26 o "Z
# 27' G1

representa fin de archivo


# 2 7 equivale a la tecla ESC

# 13

equivale a la pulsacin d e la tecla INTRO (ENTER)

Ejemplos
'

'Turbo'

' E s t a s de a c u e r d o '

#13#10

Nota
Un carcter se almacena en memoria como un solo byte.

Notas
Una cadena sin nada entre los apstrofos se llama cadena nula o cadena vacia.
La longitud de una cadena es el nmero de caracteres encerrados entre los apstrofos.

3.4.5.

Tipos lgicos (boolean)

El tipo lgico (boolean) es, al igual q u e el carcter, p a r t e de ISO Pascal estndar. L o s valores de tipo lgico p u e d e n t o m a r slo dos valores posibles: true (verdadero) y false (falso).
Al igual q u e el tipo char, el t i p o boolean es u n t i p o ordinal, q u e significa q u e tiene u n
n m e r o fijo de posibles valores q u e existen en u n o r d e n d e f i n i d o . U n a variable lgica
o c u p a slo un byte en m e m o r i a . Los valores lgicos son de tipo o r d i n a l , y sus relaciones
son:
false

3.4.6.

< true

Tipos de datos definidos por el usuario

T o d o s los tipos de d a t o s e s t u d i a d o s hasta a h o r a son de tipo simple, p r e d e f i n i d o s p o r


T u r b o y listos p a r a utilizar. Sin e m b a r g o , u n o d e los aspectos m s p o t e n t e s de T u r b o
Pascal es su c a p a c i d a d p a r a crear e s t r u c t u r a s de d a t o s a partir de estos d a t o s simples. Los
datos e s t r u c t u r a d o s a u m e n t a n la legibilidad de los p r o g r a m a s y s i m p l i f i c a n su m a n t e n i miento.
Los tipos de d a t o s d e f i n i d o s p o r el u s u a r i o se clasifican en:
Escalares

definidos

3.5.

CONSTANTES

U n a constante es un valor q u e n o p u e d e c a m b i a r d u r a n t e la ejecucin del p r o g r a m a ,


recibe un valor en el m o m e n t o de la c o m p i l a c i n del p r o g r a m a y este valor no p u e d e ser
modificado.
Las c o n s t a n t e s p u e d e n ser:
constantes
constantes
constantes
constantes

literales
con nombres o declaradas
expresin (slo en la versin 5.0)
de tipos (tipeadas)

Las c o n s t a n t e s d e b e n ser d e c l a r a d a s antes de su utilizacin y p u e d e n ser enteros o


reales, caracteres o c a d e n a s de caracteres, c o n j u n t o s o arrays, e inclusive de tipo e n u m e rado.

por el usuario ( e n u m e r a d o y s u b r a n g o ) .

Registros.
Arrays.
Conjunto (set).
Archivo (file).
Puntero ( a p u n t a d o r ) .
Procedimiento.

Estos tipos de d a t o s se e s t r u c t u r a n en captulos sucesivos.

3.5.1.

Constantes literales

U n a constante

literal es un valor de c u a l q u i e r tipo q u e se utiliza c o m o tal.

VolumenEsfera := 4 / 3 * Pi * Radio * Radio * Radio;

4 y 3 son c o n s t a n t e s literales de valores 4 y 3.

72

Introduccin a Pascal

Programacin en Turbo/Borland Pascal 7

3.5.3.

Nota
Un signo ($) delante de un literal numrico significa que el compilador interpretar el literal
como un nmero hexadecimal.
Di r = $4F8

3.5.2.

73

Constantes expresin

En T u r b o Pascal existen constantes expresin. U n a c o n s t a n t e expresin es u n a c o n s t a n t e


con n o m b r e a la q u e se le asigna u n valor q u e es u n a expresin q u e se e v a l a en t i e m p o
de c o m p i l a c i n .

$4F8 es un valor hexadecimal


const
identificador

Constantes con nombres

^
= expresin;

Son constantes q u e se identifican p o r u n n o m b r e y el valor asignado.


Ejemplos

Formato

const
Min
Max
Central

= 0;
= 100;
= (Max - Min) div 2; { div indica
divisin entera }
Ancho, Alto, Longitud = 25;
Alfa
= Chr (65) ;
Mensaje
= 'hola Mortimer';
Posicion
= 40 - Lenght (Mensaje) div 2;
Ln20
= 2.4567891234567123;
Log
= 1/Ln20;
Suma
= (2.5 + 40) / (3.5 - 4);
Volumen
= Ancho * Alto * Longitud

const
identificador

= valor;

Ejemplos
Pi
= 3.141592;
DosPi
2 * Pi;
Direccin
$06;
Caracter
Cuenta
625;
Epsilon
1E-4;
Esc
#2 7;
CRLF
~M~ J;

{es un valor real}


{$ representa valor hexadecimal}
{es un caracter}
{es un entero}
{es un real}
{caracter de control}
{secuencia CR/LF. retorno de carro/avance
de linea}

En Pascal estndar, la declaracin de c o n s t a n t e s se sita i n m e d i a t a m e n t e d e s p u s de


la cabecera Program. En T u r b o Pascal n o es obligatoria la situacin a n t e r i o r , pero s recomendable.
Diagrama

A u n q u e las expresiones se v e r n p o s t e r i o r m e n t e y n o est f a m i l i a r i z a d o con ese


c o n c e p t o m a t e m t i c o , p e n s a m o s que, n o h a b r t e n i d o dificultad en la c o m p r e n s i n de la
declaracin a nt e ri or. Los e l e m e n t o s legales de u n a c o n s t a n t e expresin son:

Constantes literales ( n u m r i c a s , lgicas, carcter, cadenas).


Constantes definidas anteriormente.
Operadores Pascal (se v e r n p o s t e r i o r m e n t e ) .
Algunas funciones incorporadas o predefinidas:
Ord, Chr, Odd, Hi, Lo, Length, Abs, Pred, Succ, Swap, Ptr, Round, SizeOf y Trunc. Las rest a n t e s f u n c i o n e s p r e d e f i n i d a s , c o m o p o r e j e m p l o Sqr y Cos, son ilegales.

de sintaxis

V e n t a j a s d e utilizar c o n s t a n t e s d e e x p r e s i n
Las r a z o n e s m s i m p o r t a n t e s p a r a utilizar c o n s t a n t e s d e e x p r e s i n son: r e c o n f i g u r a c i n
y documentacin.

Nota
El carcter ; en Pascal es el elemento separador de sentencias

3.6.

VARIABLES

Las variables son obj e t os de un p r o g r a m a c u y o valor p u e d e c a m b i a r d u r a n t e la e j e c u c i n


dei p r o g r a m a . E! c a m b i o se p r o d u c e m e d i a n t e sentencias ejecutables.

74

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal
Posicin de memoria

nombre de la variable

Ejemplos
var
NumeroEmpleado
Horas
Tasas
Edad
Apellidos
Letral, Letra2, Letfra3
Mural, Num2

contenido (valor)
de la variable

Figura 3.6.

Almacenamiento de una variable.

U n a variable es, en realidad, u n a posicin de m e m o r i a con n o m b r e . El n o m b r e de la


posicin ( u n i d e n t i f i c a d o r ) se l l a m a nombre variable; el valor a l m a c e n a d o e n la posicin
se llama valor de la variable.
Las variables se a s e m e j a n a cajas o b u z o n e s , c a d a u n a de las cuales tiene u n n o m b r e y
c o n t i e n e u n valor. La Figura 3.7 r e p r e s e n t a u n a serie de variables y sus valores.

Todas las variables de un programa Pascal deben ser declaradas antes de ser utilizadas

L a s v a r i a b l e s se d e b e n d e c l a r a r en la s e c c i n d e d e c l a r a c i n del p r o g r a m a , y m e d i a n t e la p a l a b r a r e s e r v a d a var. En esta declaracin se d e b e n incluir t o d a s las variables


utilizadas en u n p r o g r a m a y los tipos de d a t o s asociados a ellas.

75

integer;
real;
real ;
integer;
string [30]
char ;
integer;

{numero de empleado}
{horas trabajadas}
{tasa horaria}
{edad del empleado}
{apellidos del empleado}

Notas
Es buena prctica^ de! programacin utilizar nombres de variables significativas quesugieren
lo que. ellas representan, ya que esto hace al programa nuis legible y fcil, d comprender.
Tambin es buena prctica .incluir; breves: comentarios que indiquen cmo se utiliza la
variable., Un comentario es cualquier frase encerrada entre llaves { f o, bien entre signos (*, *).

Existen t a n t o s tipos de variables c o m o tipos de d a t o s diferentes.

Declaraciones
Diagrama
var
listavarl
listavarl

listavarN
listavarl
tipol

-(

tipol;
. tipol;

de sintaxis

" '

lista de variables (identificadores) separados por comas: identificador 1,


identificado^...
tipo de dato vlido

NumeroCodigo
Horas
Tasa
Salario
Nombre

o - c

tipo de datos

j1*^^)

tipoN

Variable

identificador

Valor

6714321
14
12
343421
'Luis Garca Garca'

Figura 3.7. Nombres y valores de variables.

3.7.

SENTENCIAS

Las sentencias describen las acciones algortmicas q u e p u e d e n ser ejecutadas. En general,


las sentencias se clasifican en ejecutables (especifican o p e r a c i o n e s de clculos a r i t m t i c o s
y e n t r a d a s / s a l i d a s de datos) y no ejecutables ( n o realizan acciones concretas, a y u d a n a la
legibilidad del p r o g r a m a , p e r o n o a f e c t a n en la e j e c u c i n del p r o g r a m a ) . Las s e n t e n c i a s
ejecutables a p a r e c e n en el c u e r p o del p r o g r a m a a c o n t i n u a c i n de la palabra reservada
begin.

76

Programacin en Turbo/Borland Pascal 7


Introduccin a Pascal

C a d a sentencia ejecutable se t r a d u c e p o r el c o m p i l a d o r Pascal en u n a o m s instrucciones de lenguaje m q u i n a , q u e se copian en el archivo o b j e t o y p o s t e r i o r m e n t e se


ejecutan. Las declaraciones, p o r otra parte, describen el significado y el p r o p s i t o de
cada identificador d e f i n i d o p o r el usuario: n o se t r a d u c e n a i n s t r u c c i o n e s en l e n g u a j e
m q u i n a y n o aparecen en el archivo objeto.
Las sentencias se clasifican, a t e n d i e n d o a su tipo y n m e r o , en:
simples
estructuradas

3.8.

77

LA SENTENCIA DE ASIGNACION

La sentencia de asignacin se utiliza p a r a asignar ( a l m a c e n a r ) valores o variables. La


asignacin es u n a o p e r a c i n q u e sita u n valor d e t e r m i n a d o en u n a posicin d e m e m o ria. La o p e r a c i n de asignacin se d e m u e s t r a en p s e u d o c d i g o con el s m b o l o
para
d e n o t a r q u e el valor s i t u a d o a su d e r e c h a se a l m a c e n a en la variable situada a la izquierda.
Formato

Sentencias simples

variable

*- expresin

Es u n a sentencia q u e n o c o n t i e n e n i n g u n a otra sentencia. Se clasifican en: asignacin,


procedure y goto.
variable
expresin

identificador vlido declarado anteriormente


variable, constante o una expresin o frmula a evaluar

En Pascal el o p e r a d o r
de asignacin.

variable

:= expresin

El valor de expresin
Diagrama

se sustituye p o r el s m b o l o :=, q u e se d e n o m i n a operador

se asigna a la variable.

de sintaxis

Sentencias estructuradas
variable

S o n sentencias c o m p u e s t a s de otras sentencias q u e se e j e c u t a n e n secuencia ( c o m p u e s t a s


y sentencias with), c o n d i c i o n a l m e n t e (sentencias condicionales o selectivas), o repetidam e n t e (sentencias repetitivas).

<E>/

./

expresin

Precaucin

El tipo de expresin debe ser del mismo tipo que el de la variable.

Ejemplos
A: =16
Inici al := ' LJ1
Interruptor:=true
NI := N2
NI := NI + 5
Car := # 7 0

16 se asigna a la variable A
se asigna LJ a la variable Inicial
se asigna el valor true (verdadero) a Interruptor
el valor de la variable NI se cambia por un nuevo valor: el
valor de la variable N2
el valor de NI se modifica incrementndose en 5
se asigna a la variable car el carcter 70 del cdigo ASCII, es
decir, 'F'.

78

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal

79

los valores 16 y - 2 5 de la variable A se h a n d e s t r u i d o s u c e s i v a m e n t e y ha t o m a d o


finalmente
el valor 10.

Reglas
l. Una variable en el lado derecho de una sentencia de asignacin debe tener un valor antes
de que la sentencia de asignacin se ejecute.
Hasta que un programa le da un valor a una variable, esa variable no tiene valor...
Si x no tiene un valor antes de ejecutar .

Operaciones de asignacin especiales


1.

Contador. U n c o n t a d o r es u n a v a r i a b l e q u e se i n c r e m e n t a , c u a n d o se ejecuta, en
u n a u n i d a d o en u n a c a n t i d a d c o n s t a n t e .

.... : y ;= X + 1
se produce un error lgico. A una variable que no se le ha dado un valor se dice que no
; > se ha inicializado:: Sin embargo, Turbo Pascal, como otros lenguajes .de programacin
(BASIC), inicializa todas las variables numricas a cero.
: 2. En la izquierda de una sentencia de asignacin slo pueden existir:variables, N o .essvlida

Contador := 25

x : = 50

Jr
Contador := Contador + 1

x := x + 1

N := 16

la sentencia
SalBruto - Taxas := 34015
3. El smbolo de igualdad,

N := N + 1

slo, se utiliza para operaciones matemticas lgicas de

igualdad, nunca de asignacin


Precio
- 20 .
operacin de igualdad no de asignacin
- 1f Precia = 20 therr write ( ' c o r r e c t o 5 ) ; sentencia vlida

Al e j e c u t a r las s e n t e n c i a s de a s i g n a c i n , los n u e v o s valores de Contador y x son


25 + 1 = 26 y 50 + 1 = 5 1.
2. Acumulador.

Ejemplos

Es u n a variable q u e se i n c r e m e n t a en u n a c a n t i d a d variable.
Suma := Suma + x

Sentencia

Si x vale 7 y Suma 40, el n u e v o valor d e Suma ser 47.

var
CoordX.CoordY : r e a l ;
Numero,Posicion:integer;
Codigo
: char;
Terminado
iboolean;
5 := Numero
CoordX + 4 := 20
Codigo : = 5
Numero := 1 5 1
Numero := 3.41
Numero := ' 31 + ' 5'
Terminado:='v'

Las operaciones contador y acumulador son de gran utilidad en programacin.

5 no es un identificador vlido.
Una expresin aritmtica no puede aparecer en el lado izquierdo del operador de asignacin.
Un valor numrico no se puede asignar a una variable carcter.
Una constante carcter no se puede asignar a una vanable
numrica.
Una variable real no se puede asignar a una vanable entera.
'3' + '5' no es una expresin legal.
'v' no es una constante lgica.

La o p e r a c i n d e asignacin es u n a operacin destructiva d e b i d o a q u e el valor a l m a c e n a d o en u n a variable se pierde o d e s t r u y e y se sustituye p o r el n u e v o valor en la


s e n t e n c i a d e asignacin. Al e j e c u t a r las sentencias
A := 16;
A := -25;
A := 10

x es una variable

Lrror

3.9.

EXPRESIONES Y OPERACIONES ARITMETICAS

Las variables y c o n s t a n t e s e s t u d i a d a s a n t e r i o r m e n t e se p u e d e n procesar u t i l i z a n d o oper a c i o n e s y f u n c i o n e s a d e c u a d a s a sus tipos. E n esta seccin se e x a m i n a r n las expresiones y o p e r a c i o n e s q u e se utilizan con d a t o s n u m r i c o s .
U n a expresin es u n c o n j u n t o de d a t o s o f u n c i o n e s u n i d o s p o r o p e r a d o r e s a r i t m t i cos. La T a b l a 3.4 recoge los o p e r a d o r e s a r i t m t i c o s s o p o r t a d o s p o r T u r b o Pascal q u e
p e r m i t e n realizar o p e r a c i o n e s en expresiones aritmticas.

3.9.1.

Operadores aritmticos: +,

*, /

1. Los o p e r a d o r e s a r i t m t i c o s (+,
#) p u e d e n ser utilizados con tipos e n t e r o s o
reales. Si a m b o s son enteros, el r e s u l t a d o es e n t e r o ; si a l g u n o de ellos es real, el
r e s u l t a d o es real.
2+
2+
2.0
2.0

3
3.0
+3
+ 3.0

=5
=5.0
=5.0
= 5.0

80

Introduccin a Pascal

Programacin en Turbo/Borland Pascal 7


Nota

Tabla 3.4. Operadores aritmticos bsicos

Suma
Resta
Multiplicacin
Divisin
Divisin entera
Mdulo
Desplazamiento a izquierda
Desplazamiento a derecha

/
div
mod
shl
shr

Resultado

Ejemplo

Significado

Operador

a +

a ~ b
a *b

a/b
b
a mod b
a shl b
a shr b
a div

Suma de a y b
Diferencia de a y b
Producto de a por b
Cociente de a por b
Cociente entero de a por b
Resto de a por b
Desplazar a izquierda b bits
Desplazar a derecha b bits

2. El o p e r a d o r (/) p r o d u c e un resultado real c o n i n d e p e n d e n c i a del t i p o de operando.


7/2
7.0/2
7/2.0
7.0/2.0

3.9.2.

81

=3.5
=3.5
=3.5
= 3.5

Si operando i es 0, el resultado de div o mod no est definido.


Si operando2 es negativo, el resultado de la operacin mod est indefinido.

La T a b l a 3.5 recoge diferentes casos prcticos.


Tabla 3.5. Operadores div y mod
Expresin

Resultado

3 div
15 div
17 div
3 div
7 mod

0
5
5
0
2

15
3
3
15
5

Expresin
15
16
15.0
15
15

div - 3
div 3
div 3.0
d i v (4/2)
mod 6

Resultado

Expresin

-5
-5
no vlido
no vlido
-3

3 mod 5
3
5 mod 5
0
- 5 mod 3
-2
- 15 mod 5
0
1 5 mod 7 indefinido

Resultado

Ejemplo

Los operadores aritmticos div y mod

Los o p e r a d o r e s div y mod slo se p u e d e n utilizar c o n n m e r o s enteros. El o p e r a d o r div


calcula el cociente e n t e r o (parte entera) de la divisin d e d o s n m e r o s enteros, y el oper a d o r mod calcula el resto de dicha divisin. Los o p e r a d o r e s div y mod slo p u e d e n utilizarse con o p e r a n d o s enteros.
Formato
operando \

div

operando2

operando [

mod

operando?

1. 12 div 7
2. 22 div 6
3. 47 div 50
4. 23 div (-3)
5, -13 div (-4)
6. 11 div 0
7. 12 mod 7
8. 20 mod 5
9.
3 mod 5
10. -10 mod 7
11. -13 mod -4

3.9.3.

3
7 mod 2 = 1

* mod

12 div 3 = 4

12

12 mod 3 = 0

0 div 5 = 0
0 mod 5 = 0

* div

aritmtica

12 div 3
12 mod 3

es:

1. U n a c o n s t a n t e (por e j e m p l o , 25; o u n a c o n s t a n t e con n o m b r e IVA).


2. U n a variable (por e j e m p l o , S u m a ) .
3. U n a c o m b i n a c i n de c o n s t a n t e s y / o variables u n i d a s p o r o p e r a d o r e s aritmticos.
4 * Base - 5

I (72 dividido entre 7, cociente I, resto 3).


3.
0.
-7.
3.
tiene sentido.
5.
0.
3 (cociente 0, resto 3).
- 3 (cociente - / , resto -3).
- 1 (cociente 3, resto - / ) .

Reglas de evaluacin de expresiones (prioridad)

U n a expresin

7 div 2 = 3

es
es
es
es
es
no
es
es
es
es
es

(A + B) / C

C u a n d o u n a expresin aritmtica se evala, el resultado es s i e m p r e u n n m e r o . A h o r a


bien, c u a n d o en u n a expresin a p a r e c e n dos o m s operadores, q u o p e r a c i n se realiza
p r i m e r o ? Es decir, c u l es el orden de prioridad ( j e r a r q u a ) de las o p e r a c i o n e s a r i t m ticas.

82

Programacin en Turbo/Borland Pascal 7

Reglas

de evaluacin

Introduccin

de expresiones

*/,div,mod
+,

primero
ltimo

3. Regla asociativa izquierda. Los operadores en una misma expresin o subexpresin con
igual nivel de prioridad (tal como * y /) se evalan de izquierda a derecha.

Ejemplos
1. 4 + 2 * 5

primero, la multiplicacin; despus, la suma

3.5 + 5.09

7. Evaluar

14.0/4.0

3.5 + 5.09
8.59 - 3.5
5.09

3.5

2.1 * (1.5 + 12.3)


2.1 * 13.8
28.98

Escritura de frmulas matemticas en Pascal

Frmulas matemticas

a := b * c

b : - 4ac

b * b - 4 * a * c

v2 - vi
x2 - xl

x + v

z+w
5

( 9 + 3 ) * 5 div 4 mod 7 + 1

(9 + 3) * 5 div 4 mod 7 + 1 = 1 2 * 5 div 4 mod 7 + 1


= 60 div 4 mod 7 + 1
= 15 mod 7 + 1
= 1 + 1
= 2

5. Evaluar

x+y-z

(parntesis ms interno)
(segundo parntesis)
(multiplicacin)
(suma)

x-

( a + b div 2) + y * z

El o r d e n de las o p e r a c i o n e s es
x - (A + B

div 2 ) + y * z

1 + x~
(parntesis)
(*)
(div)
(mod)

3.10.

Expresin Pascal

a = be

4. Evaluar

(parntesis;
(parntesis)
multiplicacin)

En Pascal las f r m u l a s m a t e m t i c a s se d e b e n escribir en f o r m a t o lineal. Esto obliga al


uso f r e c u e n t e de parntesis q u e i n d i q u e n el o r d e n de evaluacin c o r r e c t o de los operadores.

(de izquierda a derecha : *.div)

3. Evaluar
3 + 5 * ( i o (2 + 4 ) )
35 + 5 * (10-2 + 4)) = 3 + 5* (10-6)
= 3 + 5*4
= 3 + 20
= 23

(divisin)
(suma, resta)
(resta)

2.1 *(1.5 + 3.0 *4.1)

2.1 * (1.5 + 3.0 * 4.1)

3.9.4.

83

5.5 + 5 . 0 9 - 14.0/4.0

6. Evaluar

1. Todas las subexpresiones entre parntesis se evalan primero. Las subexpresiones con
parntesis anidados se evalan de dentro-afuera; el parntesis ms interno se evala primero.
2. Prioridad de operaciones. Dentro de una misma expresin o subexpresin, los operadores se evalan en el siguiente orden:

a Pascal

m : = (y2 - y l ) / (x2 - x l )
x+y- z
(x + y) / (z + w)
5 / (1 + x * x)

OPERACIONES ENTRADA/SALIDA

Los d a t o s se p u e d e n a l m a c e n a r en m e m o r i a de tres f o r m a s diferentes: asociados con


constantes, asignados a u n a variable c o n u n a s e n t e n c i a de asignacin o u n a sentencia de
lectura. Y a se h a n e x a m i n a d o las dos p r i m e r a s . El tercer m t o d o , la s e n t e n c i a de lectura,
es el m s i n d i c a d o si se desea m a n i p u l a r d i f e r e n t e s d a t o s cada vez q u e se e j e c u t a el
p r o b l e m a . A d e m s , la lectura de d a t o s p e r m i t e asignar valores d e s d e dispositivos hasta
archivos e x t e r n o s (por e j e m p l o , u n t e c l a d o o u n a u n i d a d de disco) en m e m o r i a se d e n o m i n a operacin de entrada o lectura.
A m e d i d a q u e se realizan clculos en u n p r o g r a m a , se necesitan visualizar los resultados. Esta o p e r a c i n se c o n o c e c o m o operacin de salida o de escritura.
E n los algoritmos las i n s t r u c c i o n e s de e n t r a d a / s a l i d a escritas en p s e u d o c d i g o son:
1 eer (listas de variables entrada)
e s c r i b i r (listas de variables salida)

leer (v, z, x)
escribir (a, b, c)

84

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal

En Pascal t o d a s las operaciones de e n t r a d a / s a l i d a se realizan e j e c u t a n d o u n i d a d e s d e


p r o g r a m a especiales d e n o m i n a d a s procedimientos
de entrada/salida
que f o r m a n parte
del c o m p i l a d o r Pascal y sus n o m b r e s son identificadores e s t n d a r :
procedimientos
procedimientos

3.10.1.

de entrada
de salida

Read
Write

Ejemplos
Sentencias
WriteLn
WriteLn
WriteLn
WriteLn
WriteLn
WriteLn
WriteLn

ReadLn
WriteLn

La escritura de resultados (salida)

El p r o p s i t o d e WriteLn es escribir (visualizar) i n f o r m a c i n e n la p a n t a l l a .

Resultados

('Test de resultados 1);


( '
' );
15;
('15' + '20');
(Pi);
(true);
(5.0);

A := 1; B := 2; C :=3;
Nombre := 'Luis';
WriteLn (A, B, C) ;
WriteLn ('A', ' ' , 'B1, ' ' ,
'C '
WriteLn ('Hola
Nombre);

Los p r o g r a m a s para ser tiles deben p r o p o r c i o n a r i n f o r m a c i n de salida (resultados).


Esta salida t o m a i n f o r m a c i n de la m e m o r i a y la sita ( a l m a c e n a ) en: la p a n t a l l a , en u n
dispositivo de a l m a c e n a m i e n t o (disco d u r o o flexible), o e n u n p u e r t o de E / S ( p u e r t o s
serie para c o m u n i c a c i o n e s o impresoras, n o r m a l m e n t e paralelos).

P r o c e d i m i e n t o WriteLn

85

Test de resultados
15
1520
3.1415926536E+00
true
5.0000000000E+00

123
ABC
Hola Luis

WriteLn p e r m i t e escribir salidas en diferentes lneas. WriteLn sin n i n g n tem en su


sintaxis p r o p o r c i o n a saltos o a v a n c e s de lnea.
En T u r b o Pascal, c o m o se ver en el C a p t u l o 8, es vlido el o p e r a d o r de c o n c a t e n a cin ( u n i n ) : +
Ejemplo 3.1

Formato

WriteLn {tem, tem...)',

Supongamos
mente.

que Numl,

Num2

y Num3

tienen

los valores

331, 57 y 909, respectiva-

1. WriteLn (Numl,Num2);
WriteLn (Num3);
tem

el objeto que desea visualizar: un valor literal (entero o real, un carcter, una
cadena 'Hola joven', o un valor lgico true o false), una constante con
nombre, una variable, un puntero este punto no se cumple en Pascal estndar o una llamada a funcin.

C u a n d o se ejecuta el p r o c e d i m i e n t o WriteLn, se visualizan t o d o s los e l e m e n t o s en el


o r d e n d a d o y en la m i s m a lnea. Al t e r m i n a r de visualizar t o d a la lnea, el c u r s o r a v a n z a
(salta) al c o m i e n z o de la siguiente lnea.

Diagrama

de sintaxis

producir
33157
909
y si existe c u a l q u i e r dalida a c o n t i n u a c i n de WriteLn (Num3), c o m e n z a r c o n la
siguiente lnea.
2. WriteLn (Numl);
WriteLn;
WriteLn (Num2);
331
57

writeLn

La instruccin WriteLn en b l a n c o p r o p o r c i o n a legibilidad a la salida de resultado.

P r o c e d i m i e n t o write
Al ejecutarse WriteLn el c u r s o r salta a la siguiente lnea. Si se desea d e j a r el c u r s o r d e s p u s
del l t i m o e l e m e n t o en la m i s m a lnea, se d e b e utilizar el p r o c e d i m i e n t o Write.

86

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal

Formato

Formato

Write (tem, tem...)]

Diagrama

WriteLn (tem: anchura...)-,

de sintaxis

write

Ejemplos
Write (-512);
Write ('El total es')
Num := 14;
Write ('El resultado es ', N u m ) ;

87

anchura
Formato

2
WriteLn (tem: anchura:
dgitos
anchura

visualiza
-512
visualiza
El total es
asigna 14 a Num
visualiza
El resultado es 14

x := 532.54;

dgitos...);

dgitos decimales de un nmero real


total de dgitos del nmero real contado parte entera, punto decimal y
dgitos decimales

Ejemplos
x := 5.265;
WriteLn (X:8:4);
WriteLn (X:8:2);
X := 14
WriteLn (X:3);
WriteLn ('A':4);

Los n m e r o s reales se visualizan en n o t a c i n e x p o n e n c i a l , si no existe un f o r m a t o


d e f i n i d o por un usuario:

Uso de WriteLn

WriteLn (x);

expresin entera (literal, constante, variable o llamada a funcin) que


especifica la anchura total del campo en que se escribe tem.

produce
produce
produce
produce

5.2650
5.26
14

sin lista de salida

La ejecucin de

visualiza

WriteLn;
5 . 3254000000E+02
Diferencias

entre

p r o d u c e u n a lnea en b l a n c o ya q u e el c u r s o r a v a n z a a la siguiente lnea.

Write y WriteLn

El cursor pasa al c o m i e n z o de la siguiente lnea d e s p u s de e j e c u t a r WriteLn,


que con Write el cursor se q u e d a al final de la lnea.

Organizacin
mientras

Formatos de salida
La p u n t u a c i n de resultados de u n p r o g r a m a suele ser u n factor i m p o r t a n t e en la eficiencia del m i s m o . Sin embargo, no s i e m p r e es posible c o n o c e r c o n antelacin la a n c h u r a
que o c u p a n los valores a visualizar, lo q u e p u e d e ser p r e o c u p a n t e sobre t o d o si se trata
de alinear n m e r o s en c o l u m n a . C o m o se h a visto antes. T u r b o Pascal visualiza los
n m e r o s reales en notacin cientfica.
Para evitar estos problemas, Pascal y T u r b o Pascal p e r m i t e n c o n t r o l a r en cierta
m e d i d a las instrucciones de salida q u e p r e s e n t a n resultados. Es posible especificar el
n m e r o de posiciones del c a m p o de escritura. P a r a los n m e r o s reales es posible precisar
el n m e r o de decimales deseado.
Se p u e d e n utilizar especificadores de f o r m a t o de c a m p o p a r a d e f i n i r dicha a n c h u r a .

de cadenas

U n valor d e c a d e n a se i m p r i m e s i e m p r e j u s t i f i c a n d o a d e r e c h a en su c a m p o . Por consiguiente, espacios en b l a n c o p r e c e d e n a u n a c a d e n a si el c a m p o en q u e se i m p r i m e es


m a y o r q u e la c a d e n a . Si el a n c h o del c a m p o es d e m a s i a d o p e q u e o p a r a c o n t e n e r u n
valor de c a d e n a , slo los p r i m e r o s caracteres de la a n c h u r a de c a m p o se visualizan.
Ejemplos
Cadena

Formato

Salida impresora

:1
2
3

'MUSA'
'MUSA1
'MUSA'
'MUSA'
'MUSA'

2
3
4
5

M
MU
MUS
MUSA
MUSA

88

Programacin en Turbo/Borland Pascal 7

3.10.2.

Introduccin a Pascal

Impresin de resultados (salidas a impresora)

Las salidas a pantalla se obtienen m e d i a n t e los p r o c e d i m i e n t o s Write y WriteLn. Si se


desea enviar resultados a otro dispositivo, es preciso especificar el n o m b r e del a r c h i v o
c o m o p r i m e r a r g u m e n t o de las instrucciones Write y WriteLn. P a r a p o d e r realizar la
o p e r a c i n de enviar salidas a la impresora, en lugar de a la pantalla, se necesita la u n i d a d
Printer.
Printer define un archivo l l a m a d o 1 st y asocia este archivo al p u e r t o de c o m u n i c a ciones L P T 1 (impresora) del D O S . Se p u e d e n e n v i a r datos a la i m p r e s o r a , i n c l u y e n d o
1 st en las instrucciones Write y WriteLn.
Es preciso, sin embargo, definir p r e v i a m e n t e en la seccin uses la u n i d a d printer.
Ejemplo

Ejemplo
Realizar

un salto de pgina

Este p r o g r a m a i m p r i m e en la impresora:

pasar

a la pgina

siguiente

en la impresora.

El cdigo ASCII salto de p g i n a ( F F ) es 12. D e f i n i r en la seccin de constantesM


const
pagina = #12
E n t o n c e s la sentepcia
WriteLn (Lst, Pagina)
realiza el salto de p g i n a

3.10.3.
uses
Printer
var
Plumas
: integer;
PrecioUnidad : longint;
begin
Plumas
: integer;
PrecioUnidad : longint;
Write (Lst, 'el precio de
Plumas);
WriteLn (Lst, 'plumas es 1 , Plumas * PrecioUnidad);
end.

89

La entrada de datos (lectura)

El t r m i n o lectura se aplica a u n a o p e r a c i n de e n t r a d a de valores p r o v e n i e n t e s de u n


perifrico y dirigidos hacia z o n a s d e m e m o r i a . El perifrico p u e d e ser el teclado, u n a
u n i d a d de disco o u n a lnea q u e c o n e c t e la c o m p u t a d o r a a o t r o dispositivo. En esta
seccin n o s r e f e r i m o s al teclado.
La o p e r a c i n de lectura p e r m i t e p r o p o r c i o n a r d a t o s d u r a n t e la e j e c u c i n de u n programa.
Los d a t o s q u e se p u e d e n leer son: enteros, reales, caracteres o cadenas. N o se p u e d e
leer un boolean o un e l e m e n t o de t i p o e n u m e r a d o .
L o s d a t o s e s t r u c t u r a d o s , arrays, registros o c o n j u n t o s , no se p u e d e n leer g l o b a l m e n t e
y se suele recurrir a d i s e a r p r o c e d i m i e n t o s especficos.
L o s p r o c e d i m i e n t o s de lectura son Read y ReadLn.
Formato

el precio de 50 plumas es 90000


Read (vari, var2, ...);
ReadLn (vari, var2, ...);

Regla
Siempre que desee escribir en impresora, deber incluir en su pinrama la lnea
u s e s prj.nf.er
\ luego aadir en i.ada sentencia i'nlc/U'ntcln

Visualizacin

e impresin

la palabra lst

simultnea

Lo ideal es disponer de u n a posibilidad tal q u e c a d a carcter visualizado o e n t r a d a p o r


teclado se enve a la impresora. En M S - D O S esta posibilidad se ofre c e con el cdigo
CTRI-P i n t r o d u c i d o desde teclado. En T u r b o Pascal 4.0 y 5.0 esta caracterstica est
i n c o r p o r a d a . C u a n d o la u n i d a d Crt no se utiliza, el archivo de e n t r a d a est a s o c i a d o a la
e n t r a d a e s t n d a r del sistema MS-SOS, es decir, el teclado. E n este c o n t e x t o , si se i n t r o d u c e u n cdigo CTRL-P d u r a n t e u n a lectura, las E / S t e c l a d o / p a n t a l l a se e n v a n en eco a
la i m p r e s o r a de igual f o r m a q u e bajo M S - D O S . D e m o d o similar, CTRL-C es u t i l i z a d a
para detener un programa durante una entrada/salida.

var

variable de tipo integer, (de cualquier tipo), real, char o string

La e n t r a d a de d a t o s desde el t e c l a d o se hace u n valor cada vez. Las instrucciones


ReadLn y Read e s p e r a n h a s t a q u e se pulsa la tecla INTRO (RETURN o ENTER) antes
de asignar u n valor a la variable.
Ejemplo
var
Nombre
: string [15];
Horas, Tasas, IVA : real;

ReadLn (Nombre);
ReadLn (Horas);
ReadLn (Tasas)

90

Programacin en Turbo/Borland Pascal 7

El u s u a r i o d e b e i n t r o d u c i r los d a t o s de e n t r a d a en el o r d e n en q u e a p a r e c e n las
i n s t r u c c i o n e s read. En el e j e m p l o anterior, el p r i m e r valor i n t r o d u c i d o ser u n a c a d e n a
[palabra(s) d e q u i n c e o m e n o s caracteres de longitud] y luego d o s valores n u m r i c o s ; p o r
e j e m p l o , 12534.15 y 3.75. Estas e n t r a d a s d e b e n separarse p o r blancos. La e n t r a d a de
d a t o s slo es vlida d e s p u s de p u l s a r la tecla INTRO. A n t e s de p u l s a r d i c h a tecla se
p u e d e n hacer correcciones de lo q u e se ha escrito. Sin e m b a r g o , d e s p u s de p u l s a r la
tecla INTRO, los d a t o s se asignan a los variables.
Diferencias

entre

Read

y ReadLn

Introduccin a Pascal

r d e n e s o p r o c e d i m i e n t o s q u e p o d r utilizar a p a r t i r de a h o r a : ClrScr y GotoXY, a u n q u e


p o s t e r i o r m e n t e se v o l v e r n a m e n c i o n a r . A m b o s p r o c e d i m i e n t o s p e r t e n e c e n ia la u n i d a d Crt.
L a o r d e n ( p r o c e d i m i e n t o ? C l r S c r b o r r a (limpia) la p a n t a l l a ( v e n t a n a actual) y sita el
c u r s o r en la e s q u i n a superior i z q u i e r d a . T u r b o Pascal considera las c o o r d e n a d a s de la
e s q u i n a s u p e r i o r i z q u i e r d a : 1,1.
P a r a p o d e r utilizar ClrSrr, d e b e r d e c l a r a r e n la c l u s u l a uses la u n i d a d e s t n d a r Crt.
Formato

En Read, d e s p u s de p u l s a r la tecla INTRO, el cursor p e r m a n e c e i n m e d i a t a m e n t e despus


del ltimo carcter introducido. En ReadLn, el cursor se enva al principio de la siguiente
lnea, tras pulsar la tecla INTRO.
Ejemplo

91

C1rScr

Ejemplo
Read (Salario, Edad)

program Demo
uses
Crt;
var
Longitud, Anchura, Superficie : real;
begin

al ejecutarse se debe i n t r o d u c i r
48675

56

Precaucin

ClrScr;

( b o r r a d o de l a p a n t a l l a }

No es aconsejable utilizar ms de un dato por instruccin.


end

3.11.

OPERACIONES BASICAS DE UTILIDAD

Las m e n c i o n a d a s u n i d a d e s e s t n d a r de T u r b o Pascal i n c o r p o r a n u n g r a n n m e r o de
utilidades (rutinas o p r o c e d i m i e n t o s ) , en general r d e n e s a la c o m p u t a d o r a , q u e facilitan
c o n s i d e r a b l e m e n t e la labor del p r o g r a m a d o r . A u n q u e en los C a p t u l o s 18 y 19 se tratarn en a m p l i t u d su c o n c e p t o y t r a t a m i e n t o , d e s t a c a m o s en esta seccin a l g u n a s utilidades bsicas q u e son de uso f r e c u e n t e y c u y o c o n o c i m i e n t o es c o n v e n i e n t e desde el principio del a p r e n d i z a j e d e la p r o g r a m a c i n p o r la gran a y u d a q u e a p o r t a al p r o g r a m a d o r .
E n esta seccin se describen las utilidades:
cirScr
GotoXY
GetTime
SetTime

limpieza o borrado de la pantalla


movimiento
del cursor
leer la hora del reloj de la computadora
poner en hora el reloj de la computadora

Regla

Es una buena costumbre utilizar en todos los programas la unidad Crt, mediante ia clusula
uses; ello permite el uso de ClrScr y GotoXY, entre otros rutinas de utilidad.

3.11.2.

Movimiento del cursor

L a o r d e n ( p r o c e d i m i e n t o ) GotoXY m u e v e el c u r s o r a la p o s i c i n x, y, d o n d e x es la col u m n a ( c o n t a n d o de izquierda a d e r e c h a ) e y es la fila ( c o n t a n d o de a r r i b a - a b a j o ) .


Formato

GotoXY (x, V)

3.11.1.

El borrado (limpieza) de la pantalla; ClrScr

En el C a p t u l o 9 se e s t u d i a r la gestin o control de la pantalla, q u e facilitar al program a d o r u n a p r o g r a m a c i n interactiva; sin e m b a r g o , p o r su i m p o r t a n c i a d e s t a c a r e m o s dos

x v

columna, fila: de tipo integer, byte, word, longint o shortint.

La e s q u i n a s u p e r i o r i z q u i e r d a es 1.1. GotoXY r e q u i e r e el uso de la u n i d a d Crt.

92

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal
Ejemplo

Ejemplo
progra/n TestCursor;
uses
Crt ;
begin
ClrScr;
GotoXY (10,15);
Write ( ' x ' ) ;
{visualiza una letra x en la fila 15,
columna 10}
GotoXY (15,10);
Write ('y')
(visualiza una letra y en fila 10, columna 15}
end.
Recordatorio

uses
Dos;
4
GetTime (h, m, s, es);
WriteLn (' hora actual', h, '

,m, ' ',s, ' ',cs :2)

SetTirne
P o n e en h o r a el sistema, m e d i a n t e el u s o d e valores e n sus p a r m e t r o s .
Formato

Si desea utilizar ClrScr y GotoXY, necesita declarar uses Crt en su programa.

3.11.3.

SetTime (horas, minutos,

segundos,

Ejemplo

Medicin de tiempos

En n u m e r o s a s ocasiones se requiere m e d i r t i e m p o s : decidir q u f u n c i n , p r o c e d i m i e n t o ,


programa, s e g m e n t o de p r o g r a m a es m s rpido; calcular el t i e m p o e m p l e a d o p o r el
p r o g r a m a en e j e c u t a r u n a o varias instrucciones, etc.
El sistema o p e r a t i v o D O S p e r m i t e fijar o establecer la h o r a de su c o m p u t a d o r a , as
c o m o conocer la m i s m a en cualquier m o m e n t o ; en otras palabras, p r o g r a m a r su reloj interno.
T u r b o Pascal p u e d e c o n t r o l a r d i c h o reloj, p o n i n d o l o en h o r a y l e y e n d o d i c h a h o r a
c u a n d o se desee. L a s r d e n e s ( p r o c e d i m i e n t o s ) q u e p e r m i t e n estas o p e r a c i o n e s son:
GetTime y SetTime. Estas r d e n e s se e n c u e n t r a n en la u n i d a d e s t n d a r DOS, p o r lo q u e p a r a
p o d e r utilizarlas se r e q u i e r e la c o r r e s p o n d i e n t e declaracin en uses, es decir, uses Dos.

uses Dos

SetTime (0,0,0,0);
{ establece la hora : 0:0:0:0 }
WriteLn ('hora actual', h, ' 1 , m, ' ', s, ' ', cs:2);
GetDate
D e v u e l v e la fecha actual del s i s t e m a operativo.
Formato

GetTime
Devuelve la h o r a actual del sistema operativo (de su m q u i n a ) .

GetDate (Ao, Mes, Da, DaSemana)


Formato

GetTime (horas,

minutos,

horas
minutos, segundos
centsimas

0..23
0..59
0..99

segundos,

centsimas)

Ao
Mes
Da
DaSemana

centsimas)

1980..2099
[..12
1..31
0..6

SetDate
Establece la fecha actual del s i s t e m a operativo.

94

Programacin en Turbo/Borland Pascal 7

Introduccin a Pascal
Programa

Formato

program TestLectura;
var
A : real;
B : char;
begin
Write ('Introduzca un numero real');
ReadLn (A);
Write ('Introduzca un caracter');
ReadLn (B)
end.

SetDate (Ao, Mes, Da)

Ao
Mes
Da

3.12.

95

1980..2099
1..12
1..31

P R O G R A M A C I O N INTERACTIVA

Al ejecutarse el p r o g r a m a , visualiza

E x i s t e n d o s m o d o s bsicos d e f u n c i o n a m i e n t o de u n a c o m p u t a d o r a : interactivo y por


lotes (batch). L o s p r o g r a m a s e s c r i t o s h a s t a a h o r a y la m a y o r a d e los q u e e s c r i b a m o s
estn c o n c e b i d o s p a r a m o d o interactivo. E n este m o d o , el u s u a r i o del p r o g r a m a p u e d e
i n t e r a c t u a r con el p r o g r a m a e i n t r o d u c i r d a t o s m i e n t r a s se est e j e c u t a n d o el p r o g r a m a .
Al o b j e t o de facilitar esta e n t r a d a d e datos, la c o m p u t a d o r a d e b e i n d i c a r al u s u a r i o el
m o m e n t o en que debe i n t r o d u c i r los datos. P a r a ello d e b e n visualizar m e n s a j e s interacti-

Introduzca un numero real : 45 <lntro>


Introduzca un caracter : b c i n t r o

teclee 45 y pulse Intro


teclee b y pulse Intro

Ejemplo 3 . 3
Calcular

la suma y diferencia

de dos nmeros

ledos del teclado.

vos con indicaciones al usuario.


program SumaDiferencia;
var

Ejemplo 3 . 2
Escribir

un segmento

ele programa

que lea el nombre

de una persona,

i, j : integer;
begin

las horas trabaja-

das y el salario/hora.
Write
ReadLn
Write
ReadLn
Write
ReadLn

Write ('Introduzca el primer numero');


ReadLn (i);

('Introduzca un nombre');
(Nombre);
('Introduzca horas trabajadas' ) ;
(Horas);
('Introduzca salario hora');
(SalarioHora

WriteLn ('Introduzca el segundo numero');


ReadLn (j);
WriteLn ('La suma es', i+j);
WriteLn ('La diferencia es 1 , i-j)
end.

S u p o n g a m o s q u e se i n t r o d u c e n los d a t o s

3.13.

Ratn Mickey
38.5 -J
1240 ^-1
Estos valores se a l m a c e n a n en las variables Nombre
rioHora

(tipo rea!) del m o d o siguiente:


Nombre
Horas
SalarioHora

'Ratn Mickey'
3.85000000000E+01
1'24000000000E+03

(tipo c a d e n a ) . Horas

y Sala-

EL ESTILO DE P R O G R A M A C I O N

El b u e n estilo de programacin
es, sin lugar a d u d a , u n a d e las caractersticas m s
n o t a b l e s q u e debe tener u n p r o g r a m a d o r . U n p r o g r a m a con b u e n estilo es m s fcil de
leer, de corregir s i c o n t i e n e un e r r o r y d e m a n t e n e r . A u n q u e la experiencia p r o p o r c i o n a el estilo, existen u n a serie d e reglas q u e se r e c o m i e n d a n seguir desde el principio
del a p r e n d i z a j e en p r o g r a m a c i n .

Sangrado (indentacin)
A u n q u e los p r o g r a m a s escritos en Pascal n o exigen reglas estrictas en su escritura, es
p r c t i c a h a b i t u a l realizar s a n g r a d o en los b l o q u e s y u n i d a d e s de p r o g r a m a s f u n d a m e n tales.

96

Programacin en Turbo/Borland Pascal 7


Introduccin a Pascal
{programa con mal estilo de programacin}
program Felicidades; type Cad80 = string [80]; var J,A: integer;
Nombre : Cad80; begin A:=5; Write ('escriba su nombre ');
ReadLn (Nombre); WriteLn; for J:=l to 4 do if A=5 then
WriteLn ('Felicidades ', Nombre) else WriteLn
('Enhorabuena') end.
El m i s m o p r o g r a m a a n t e r i o r escrito con un estilo razonable:
program Felicidades;
type
Cad80 = string [80];
var
J, A
: integer;
Nombre : cad80;
begin
A := 5;
Write ('escriba su nombre ');
ReadLn (Nombre);
WriteLn;
for J := 1 to 4 do
if A = 5
then
WriteLn ('Felicidades ', Nombre)
else
WriteLn ('Enhorabuena')
end.

Comentarios
La legibilidad de los p r o g r a m a s a u m e n t a c o n s i d e r a b l e m e n t e u t i l i z a n d o c o m e n t a r i o s . U n
comentario es un texto explicativo m s o m e n o s largo, s i t u a d o en el p r o g r a m a e i g n o r a d o
por el c o m p i l a d o r . Los c o m e n t a r i o s n o se c o n s i d e r a n (son invisibles) en la fase de c o m p i lacin y ejecucin, pero de i m p o r t a n c i a p r i m o r d i a l en las fases de anlisis, p u e s t a a
punto y mantenimiento.
Los c o m e n t a r i o s son u n a parte i m p o r t a n t e de la documentacin
de u n p r o g r a m a , ya
que a y u d a n al p r o g r a m a d o r y a otras personas a la c o m p r e n s i n del p r o g r a m a . N o es
raro e n c o n t r a r p r o g r a m a s en los cuales los c o m e n t a r i o s o c u p a n m s sitio, incluso, q u e
as propias instrucciones.

partes de un p r o g r a m a , p e r o con la c o n d i c i n de q u e sean significativos. Se d e b e n evitar


comentarios superfluos o redundantes, c o m o

A := B-C

jel valor de B-C se asigna a Aj

c u y o significado es evidente.
Es c o n v e n i e n t e s i t u a r c o m e n t a r i o s en la cabeza q u e al m e n o s especifiquen:
el n o m b r e del p r o g r a m a d o r ,
la fecha d e la versin actual,
-
u n a breve descripcin d e lo q u e hace el p r o g r a m a d o r .
El siguiente p r o g r a m a ilustra m o d o s de especificar c o m e n t a r i o s .

program Prueba;
{

{programa escrito por : J.R. Mortimer


{Fecha
{Versin
{Nombre del archivo
{Este programa permite listar direcciones postales
^* * * * * * * * * * * * * * * * * * * * * * * * *
const
Distrito
28220'
var
Nombre
string [ 2 0 ]
Apellidos
string [30]
Direccin
string [40]
Provincia
string [15
Codigo_Postal
string [5]
Edad
integer;
begin
{Prueba}
{proceso de entrada de datos }
end.

{Prueba}

Es posible a n i d a r c o m e n t a r i o s con d e l i m i t a d o r e s de tipo diferentes, pero n o es posible con d e l i m i t a d o r e s del m i s m o tipo. El p r o g r a m a d o r p u e d e t e n e r libertad p a r a los comentarios.

Formato
1. comentario|
2 . (* comentario

97

*)

Cualquiera de los dos f o r m a t o s se p u e d e n utilizar i n d i s t i n t a m e n t e . Los c o m e n t a r i o s


pueden aparecer en u n a sola lnea de p r o g r a m a , al final de u n a lnea d e s p u s d e u n a
sentencia, o e m b e b i d o en u n a sentencia. E n general se d e b e incluir en las d i f e r e n t e s

{
un comentario puede extenderse
en varias lineas o paginas de programas}
{comentarios anidados (* como este caso *)}
(* comentarios anidados {como este caso} *)

98

Introduccin a Pascal

Programacin en Turbo/Borland Pascal 7

99

Lneas en blanco

A l i n e a r o p e r a c i o n e s (o s e p a r a d o r e s ) e n l n e a s c o n s e c u t i v a s

O t r o m e d i o de hacer un p r o g r a m a m s legible es dejar lneas en b l a n c o e n t r e partes


i m p o r t a n t e s o q u e estn lgicamente separados. Es m u y f r e c u e n t e d e j a r lneas en b l a n c o
entre la cabecera y la seccin de declaraciones, entre sus diferentes partes, as c o m o entre
los p r o c e d i m i e n t o s y funciones, entre s y con el p r o g r a m a principal, etc.

C u a n d o diferentes lneas c o n s e c u t i v a s c o n t i e n e n el m i s m o o p e r a d o r (o separador), es


b u e n a prctica alinear estos syn-bolos u t i l i z a n d o b l a n c o s si es necesario.

Eleccin de n o m b r e s de identificadores significativos


Las variables, c o n s t a n t e s e incluso n o m b r e s de s u b p r o g r a m a s y p r o g r a m a s d e b e n ser
significativos para o r i e n t a r al usuario sobre lo q u e representan: x, AS, JJ n o son identificadores significativos.
x : = Y * z ,
Salario
Nomina_Mayo
Nombre_Apellidos
Salaro_Mensual

:=
>=
=
>

Horas * SalarioHoras;
10000;
'Mortimer';
30000;

no es una sentencia ilustrativa


es una sentencia ilustrativa
es una sentencia ilustrativa
es una sentencia ilustrativa
es una sentencia ilustrativa

Los n o m b r e s es c o n v e n i e n t e que c o m i e n c e n con u n a letra m a y s c u l a , y si son largos


es preferible utilizar palabras compuestas o con subrayado.
Evitar p u n t o s y c o m a s s u p e r f l u o s
A n t e s de las palabras end y until se puede suprimir el s e p a r a d o r p u n t o y c o m a . Los
p u n t o s y c o m a s espreos p u e d e n afectar al mal f u n c i o n a m i e n t o d e u n p r o g r a m a .
1 . begin
Total := Total + Parcial;
WriteLn (Total);
{punto y coma superfluo}
end.
2. program SumaDeCuadros;
var
A, Cuadrado, Suma : integer;
begin
Suma := 0;
for A := 1 to 5 do;
(este ; provoca un error logico!
begin
Cuadrado := Sqr (A);
Suma := Suma + Cuadrado
end;
WriteLn (Suma)
end.
Lneas de programa m a y o r e s de 8 0 caracteres
El editor T u r b o p e r m i t e escribir lneas de hasta 126 caracteres de l o n g i t u d , a u n q u e en la
pantalla slo se ven 80 c o l u m n a s a la vez. Utilizando las teclas HOME (Inicio), END (Fin)
y de m o v i m i e n t o de cursor se puede desplazar el texto a i z q u i e r d a y d e r e c h a .

1.for j := 1 to 10 do {operador =}
begin
Prueba
:= Random;
Total
:= Total + Prueba;
Valor [j]:= Prueba;
WriteLn ('Estrella errante')
end;
2. type {operador
Cadena80
=
TipoVector =
Color
=
Anno
=

= , declaracin type}
string [80];
array [1..50] of real;
(Rojo,Azul,Verde,Gris,Amarillo);
1900..2000;

3. var {operador : , declaracin var}


Principal, Interes, Tasa : real;
Meses
: integer;
Respuesta
: char;
Encontrado
: boolean;
B l a n c o s no significativos
P o n e r u n espacio en c a d a lado de u n o p e r a d o r
if A = B then
Encontrado := true;
Incluir un espacio d e s p u s de los signos de p u n t u a c i n : c o m a , p u n t o y c o m a , dos
puntos.
Otras reglas de escritura
P o n e r cada s e n t e n c i a en u n a lnea distinta.
Las p a l a b r a s r e s e r v a d a s program, const, var, procedure, function, uses, begin, end
d e b e n ir en lneas distintas.
Si u n a s e n t e n c i a c o n t i n a en o t r a lnea, se d e b e n s an g r ar la(s) lnea(s) siguientes.
Insertar lneas en b l a n c o antes de la seccin const, var, uses, procedure, function y
el begin del p r o g r a m a principal; y en c u a l q u i e r s e g m e n t o o b l o q u e s de sentencias
significativas.
Utilizar espacios e n t r e los e l e m e n t o s de u n a s e n t e n c i a p a r a hacerla m s legible.

3.14.

PUESTA A PUNTO DE PROGRAMAS

En esta seccin se incluirn: Tcnicas de resolucin de problemas


y de programacin
(diseo de p r o g r a m a s ) , errores tpicos de programacin
y estilo de programacin.

1 00

Introduccin a Pascal

Programacin en Turbo/Borland Pascal 7

3.14.1.

Tcnicas de programacin (diseo de programas)

1. Los programas no pueden considerarse


correctos hasta que han sido validados
utilizando un rango amplio de datos de test.
2. Los p r o g r a m a s deben ser legibles y comprensibles.
3. Utilizar comentarios significativos q u e describan el p r o p s i t o de u n p r o g r a m a o
segmentos de programas, as c o m o e l e m e n t o s i m p o r t a n t e s de p r o g r a m a s , variables, funciones, etc.
4. Etiquetar todas las salidas producidas

por un programa

WriteLn ('Nombre Empleado', Nombre: 8, ' Sal ario = ' , S a l a r i o : 8: 2)


produce

una salida ms informativa

deben ser eficientes.

8/5 = 1.6

2*n

y a c o n t i n u a c i n utilizar identificadores:
Interes
:= Tasalmp * Precio;
NuevoSaldo :=Saldo + Tasalnteres * Saldo;
En este caso slo se necesitan c a m b i a r los valores d e las c o n s t a n t e s .
7. A n t e s de utilizar variables, asegurarse de q u e son inicializadas p o r el p r o g r a m a .
8. En p r o g r a m a c i n interactiva, incluya s i e m p r e u n a lnea c o n u n m e n s a j e d e aviso
al usuario c u a n d o desee i n t r o d u c i r datos.
9. Los p r o g r a m a s deben hacer e n g e n e r a l s i e m p r e " e c o " de la e n t r a d a .
Antes de escribir un programa en Pascal se deben seguir los pasos:
Anlisis del programa (entrada, salida, datos auxiliares y proceso).
Diseo del algoritmo (con preferencia pseudocdigo), siguiendo esencialmente el
mtodo descendente.

8 di v 5 = 1

8 . 0 / 2 . 0 = 4.0

8.0div2.0

(no vlido)

vlido

2n

no vlido

6. P u n t o s y c o m a s (ausencia, exceso, s u p e r f l u o s ) .
begin
Suma
:= Suma + Contador;
Contador := Contador + 1
end
vlido
begin
Suma
:= Suma + Contador;
Contador := Contador + 1;
end

Interes
:= 14.50 * Precio;
NuevoSaldo : = Saldo + 17.75 * Saldo;

const
Tasaslmp
= 14.50;
Tasalnteres = 17.75;

no vlidas como constantes reales

5. Las multiplicaciones deben ser i n d i c a d a s p o r *.

se d e b e n evitar. N o es eficiente calcular b*b-4*a*cosu


raz c u a d r a d a (sqrt)
dos veces; calcular su valor u n a vez, asignarlo a u n a variable y a c o n t i n u a c i n
utilizar esta variable en los clculos.
6. Programas generales y flexibles. D e b e n ser r e l a t i v a m e n t e fciles de m o d i f i c a r p a r a
solucionar un problema similar sin necesidad de c a m b i a r m u c h o el p r o g r a m a . P o r
e j e m p l o , considerar las sentencias:

El uso de las constantes 14.50 y 17.75 limita la flexibilidad.


Si se c a m b i a n la tasa de inters (17.75) o la tasa de i m p u e s t o (14.50), estas d o s
sentencias y todas las q u e c o n t e n g a n dichas c o n s t a n t e s se t i e n e n q u e m o d i f i c a r . Es
m e j o r asociar estas constantes con identificadores de constantes.

.1

2. Las c o n s t a n t e s de c a d e n a d e b e n estar e n c e r r a d a s e n t r e a p s t r o f o s (simples c o m i llas). U n a p s t r o f o se representa c o n u n p a r de a p s t r o f o s ' K a n t " s ' .


3. L o s p a r n t e s i s d e n t r o de e x p r e s i o n e s d e b e n c o n c o r d a r . T a n t o s p a r n t e s i s a izq u i e r d a c o m o a derecha.
4. L a divisin entera se representa p o r div y la real p o r /.

Por ejemplo, clculos innecesarios, tales c o m o :

Raiz 1 := (-b+sqrt (b*b-4*a*c))/(2*a);


Ra i z 2 := ( - b - s q r t (b*b-4*a*c))/ (2*a);

Errores tpicos de programacin

1. Las c o n s t a n t e s reales deben tener al m e n o s u n dgito a n t e s y al m e n o s un dgito


despus del p u n t o decimal.
*

que WriteLn

WriteLn (Nombre: 8, S a l a r i o : 8: 2)
5. Los programas

3.14.2.

101

begin
Suma
:= Suma + Contador
Contador := Contador + 1
end
no vlido (falta en una lnea un ;)

sobra el punto y coma

7. D e b e h a b e r un p u n t o detrs del end final d e c a d a p r o g r a m a .


8. T o d o s los identificadores d e b e n ser d e c l a r a d o s .
9. T o d a s las variables estn i n i c i a l m e n t e i n d e f i n i d a s ( T u r b o Pascal n o sigue esta
regla inicializa a cero o c a d e n a v a c a , p e r o es c o n v e n i e n t e la inicializacin).
10. U n signo igual (=) se utiliza en d e c l a r a c i o n e s de c o n s t a n t e s o c o m o signo igual.
El o p e r a d o r := se utiliza en sentencias de asignacin. N o c o n f u n d i r = c o n := (ojo,
p r o g r a m a d o r e s d e BASIC).
11. Los p r o b l e m a s q u e implican n m e r o s d e tipo real n o p u e d e n utilizar test/
c o m p a r a c i o n e s p a r a c o m p r o b a r e x a c t i t u d d e igualdad o desigualdad (= o < > ) .
C o m o los n m e r o s estn a p r o x i m a d o s e n la c o m p u t a d o r a , n o tiene sentido la
igualdad/desigualdad.
12. Es b u e n a idea verificar errores tales c o m o divisin p o r cero y races c u a d r a d a s de
n m e r o s negativos d e n t r o de u n p r o g r a m a .

3.14.3.

Estilo de programacin

U n p r o g r a m a T u r b o Pascal se p r e p a r a c o n el editor. D e s p u s de teclear el program a c o m p l e t o se sale al m e n p r in cip al y se c o m p i l a el p r o g r a m a . Si hay errores, se


vuelve al editor; en caso contrario, se g u a r d a y ejecuta.

1 02

Introduccin a Pascal

Programacin en Turbo/Borland Pascal 7

Los errores d e u n p r o g r a m a pueden ser: sintaxis,

en tiempo

de ejecucin

lgicos.
La planificacin de un p r o g r a m a c o m i e n z a con el anlisis del p r o b l e m a [especificaciones de e n t r a d a y salida (E/S), el proceso necesario p a r a p r o d u c i r la salida
desde la e n t r a d a ] y sigue con el algoritmo (pseudocdigo).
E s p e c i a l m e n t e en prog r a m a s grandes, seguir el diseo descendente y refinamiento
sucesivo. A c o n t i n u a cin debe realizarse la d o c u m e n t a c i n externa, la escritura del p r o g r a m a c o n t o d a
la d o c u m e n t a c i n i n t e r n a (comentarios) necesaria.

de un programa

program identificador;
uses identificadores
const
type

Identificador
Cualquier c a d e n a de letras y dgitos q u e com i e n c e con u n a letra.
Suma2

PagaMes

Paga_Mes

Maxint

procedure

C o n s t a n t e p r e d e f i n i d a igual al valor m a y o r
de tipo integer, q u e p u e d e m a n i p u l a r la
c o m p u t a d o r a (32767)

end.

de constantes/variables

const
i d e n t i f i c a d o r 1 = c o n s t a n t e 1;
i d e n t i f i c a d o r 2 = c o n s t a n t e 2;

const
Pi
= 3.1415982;
E
= 2.71812;
Dias = 30;

Sentencia

de asignacin
D i s t a n c i a := Velocidad * Tiempo;

a : = 15 div 3
b := 15 mod 3

Comentarios
texto!

Procedimientos

(* texto *)
Read

y ReadLn

Write

Lee d a t o s del d i s p o s i t i v o de e n t r a d a ]
I g u a l , pero c u a l q u i e r e n t r a d a p o s t e r i o r se
toma de l a s i g u i e n t e l i n e a de e n t r a d a }

y WriteLn

Write ( ' P e s o Neto = ' , Neto);


Write (x, y)
WriteLn (x, y)
WriteLn

e s c r i b e 'Peso Neto 1 y v a l o r de Netoj


e s c r i b e x, y j
e s c r i b e x, e y s a l t a una 1 i n e a j
s a l t a una l i n e a l

Salida con formato


e x p r e s i on e x p r e s i n e n t e r a
expresin
expresin entera : expresin entera
WriteLn (x : 5, R : 6 : 2; 'Hola Hud' : 12);

x:6
R:6:2

RESUMEN

begin

Declaraciones

e x p r e s i n e n t e r a 1 div e x p r e s i n e n t e r a 2
e x p r e s i n e n t e r a 1 div e x p r e s i n e n t e r a 2

Procedimientos

var

function

entera

Read (Horas, Minutos)


ReadLn (Horas, Minutos)

S i n t a x i s y c o n s t r u c c i o n e s d e Turbo P a s c a l
Escritura

Divisin

103

var
l i s t a v a r i a b l e s 1 : t i p o 1;
l i s t a v a r i a b l e 2 : t i p o 2;

var
NI, N2 : integer;
Tasa
: real;
IVA
: real;

Este captulo introduce ai lector en muchos conceptos claves que se emplearn posteriormente
para desarrollar problemas con programas de computadora.
Algunos de los conceptos importantes son: datos y tipos de datos, variables y constantes,
sentencias de asignacin, operaciones de E/S. as como operaciones bsicas utilizando operadores
tales como *. +. y /, entre otros.
Debe recordar que cada programa en Pascal tiene una determinada estructura y ha de escribirse siguiendo unas reglas gramaticales y de sintaxis rgidas. No seguir estas reglas provocar errores
durante la compilacin o posteriormente durante la ejecucin. Recuerde asimismo declarar cada
identificador utilizado como variable o como constante y separar las sentencias del programa
mediante separadores puntos y comas (;).

EJERCICIOS
1. Determinar el valor de las siguientes expresiones aritmticas:
15
24
123
200

div
div
div
div

12
12
100
100

15
24
123
200

mod
mod
mod
mod

12
12
100
100

1 04

Programacin en Turbo/Borland Pascal 1

Introduccin a Pascal

2. Cul es el valor de cada una de las siguientes expresiones?


a)
c)
d)

15*14-3*7
-4*5*2
(24+2*6) div 4
a div a div a*b

<?)
f )
g)
h)

S u p o n i e n d o que Alfa y Beta son variables reales de valores 567.392 y 0.0004, respectivamente,
y que M n es una variable entera con un valor de 436, indicar la salida de cada u n o de los
siguientes c o n j u n t o s de sentencis:

3+4*(8*(4-{9+3)/6))
4*3*5+8*4*2-5
4-40 div 5
( - 5 ) mod ( - 2 )

a)
b)

3. Escribir las siguientes expresiones matemticas c o m o expresiones de c o m p u t a d o r a :


b

,
g)

a)

+ 1
y

d)

b)
'

--x - y

e)

(a + b) ~~
d

h)

/)

[{a + b)2}1

i)

c + d

105

xy
1 - 4Z.x

WriteLn
WriteLn
WriteLn
WriteLn

(Alta :8: 1, Mn :5)


('Tolerancia:', Beta : 8: 5);
('Alfa =', Alfa: 12: 5);
(Beta =' Beta: 6: 2, ' ': 4, *Mn =', Mn : 6);

WriteLn (Alfa + 4.0 + Mn: 15:3);


WriteLn ('Tolerancia =' : 8, Beta : 5: 30;
WriteLn;
WriteLn;

X+-

>nn

9. El siguiente programa contiene errores, cules son?

c)

(x + y)2 (a-b)

4. Cul de los siguientes identificadores son vlidos?


n
Mi Problema
Mi Juego
Mi Juego
write
m&m
registro
AB

85 Nombre
AAAAAAAAAAA
Nombre_Apellidos
Sal do-Actual
92
Universidad P o n t i f i c i a
Set 15
* 143Edad

5. Explicar la diferencia entre estas sentencias de asignacin:


A := B
A := 7

y
y

A := ' B'
A := ' 7 '

6. Describir la diferencia producida en la salida por los siguientes segmentos de programas:


a)

WriteLn (Mn :2, Alfa :4 :2);

write ( ' * ' ) ;


write ( ' * ' ) ;
write ( ' * ' ) ;
wri t e l n

b)

writeln ( ' * ' ) ;


writeln ( ' * ' ) ;
writeln ( ' 8 ' ) ;

7. X es una variable entera e Y una variable carcter. Qu resultados producir la sentencia

program Test
begin
WriteLn ('Hola');
WriteLn ('este programa se ha escrito como prueba 1 );
WriteLn ('busque que no hay errores');
WriteLn ('si no los localiza se producirn errores');
WriteLn ('al compilar')
end;

10. Escribir un programa que lea un entero, lo multiplique por 2 y a continuacin lo escriba de
nuevo en la pantalla.
11. Escribir las sentencias de asignacin que p e r m i t a n intercambiar los contenidos (valores) de
dos variables,
12. Escribir un programa que lea dos enteros en las variables x e y, y a continuacin obtenga los
valores de: 1. x div y. 2. x mod y. Ejecute el p r o g r a m a varias veces con diferentes pares de
enteros c o m o entrada.
13. Escribir un programa que solicite al usuario la longitud y a n c h u r a de una habitacin y a
continuacin visualice su superficie con cuatro decimales.
14. Escribir un programa que convierte un n m e r o d a d o de segundos en el equivalente de m i n u tos y segundos.
15. Escribir un programa que solicite dos n m e r o s decimales y calcule su suma, visualizando la
s u m a ajustada a la derecha. Por ejemplo, si los n m e r o s son 57.45 y 425.55, el p r o g r a m a visualizar:

readln (X y) si la entrada es
a)
b)

5
5C

57.45
425.55
483.00

106

Introduccin a Pascal

Programacin en Turbo/Borland Pascal 7

16. 0 Cules son los resultados visualizados por el siguiente programa, si los datos proporcionados
son 5 y 8?

1!
O
1

program Demo_l;
const
M = 6;
var
A, B, C : integer;
begin
ReadLn (A,B);
C := 2 * A - B;
M;
B : = A + C - M;
A := B * M;
WriteLn ( A ) ;
B := B - 1;
WriteLn (B: 6 C
end.

107

PROBLEMAS
1. Escribir un programa que lea dos enteros de tres dgitos y calcule e imprima su producto,
cociente y el resto g u a n d o el p r i m e r o se divide por el segundo. La salida ser justificada a
derecha:

739
12

739

8868

R = 7

12
Q = 6i

2. U n a t e m p e r a t u r a Celsius (centgrados) C puede ser convertida a una temperatura equivalente F de acuerdo a la siguiente frmula:

T)
Escribir un programa Pascal que lea una t e m p e r a t u r a Celsius c o m o n m e r o decimal y obtenga
la t e m p e r a t u r a Fahrenheit equivalente.

17. Escriba un p r o g r a m a para calcular la longitud de la circunferencia y el rea del crculo para
u n radio introducido por el teclado.
3. U n sistema de ecuaciones lineales
18. Crear un p r o g r a m a para ver la diferencia entre Write y WriteLn.

ci.x + by = c
cix + ey = /

19. En este ejercicio se asignan valores a las variables declaradas, y se visualizan.


20. C r e a m o s u n p r o g r a m a para visualizar u n d a t o entero con diversos a n c h o s de salida.

se puede resolver con las siguientes frmulas:


ce - bf

21. El siguiente p r o g r a m a visualiza tres n m e r o s enteros, los dos l t i m o s con un a n c h o de dos


posiciones y el p r i m e r o con el a n c h o predefinido.
22. Este otro ejemplo nos mu e st r a la salida f o r m a t e a d a para n m e r o s decimales.

ae - bd

a f - cd
v=
'
ae~ bd

Disear un programa q u e lea dos c o n j u n t o s de coeficientes (a. b y c; d, e y f ) y visualice los


valores de .v e y.

23. C o n el siguiente p r o g r a m a se p o n e u n e j e m p l o de asignacin de cadenas y su visualizacin.


24. Escribir u n programa que visualice valores tales c o m o :

4. Escribir un programa q u e dibuje el tringulo siguiente:

7.1
7.12
7.123
7.1234
7.12345
7.123456
25. Este ejercicio muestra la entrada de datos. Al ejecutarse e! p r o g r a m a pide que se i n t r o d u z c a n
tres enteros, a l m a c e n n d o s e en tres variables.

5. Escribir u n programa q u e dibuje el rectngulo siguiente:

108

Programacin en Turbo/Borland Pascal 7

6. Modificar el programa anterior, de modo que se lea una palabra de cinco letras y se imprima
en el centro del rectngulo.
7. Escribir un programa que escriba los nmeros de 1 a 100 en una lnea.

CAPITULO

8. Escribir un programa Pascal que lea dos nmeros y visualice el mayor.


9. Escribir un programa que lea dos enteros de tres dgitos e imprima su producto en el siguiente
formato:
+

ESTRUCTURAS DE
CONTROL SELECTIVAS

325
426
1950
650
1300

138450"
10. Escribir un programa para convertir una medida dada en pies a sus equivalentes en: a) yardas; b) pulgadas; c) centmetros, y d) metros (1 pie = 12 pulgadas, 1 yarda = 3 pies, 1 pulgada = 2.54 cm, 1 m = 100 cm). Leer el nmero de pies e imprimir el nmero de yardas, pies,
pulgadas, centmetros y metros.
11. Teniendo como datos de entrada el radio y la altura de un cilindro queremos calcular: el rea
lateral y el volumen del cilindro.
12. Calcular el rea de un tringulo mediante la frmula:

CONTENIDO
4.1.
4.2.
4.3.
4.4.
4.5.
4.6.
4.7.

Expresiones lgicas
La sentencia i f
Sentencias i f anidadas
Programacin con e xp r es io n es lgicas
La sentencia case
Comparacin de sentencias i f anidadas y c a s e
Puesta a punto de programas

RESUMEN
PROBLEMAS RESUELTOS
EJERCICIOS
PROBLEMAS

Area = (p(p - a([p - b)(p ~ c)f


donde p es el semipermetro, P = (a + b + c)2, siendo a, b, c los tres lados del tringulo.
El c o n c e p t o de flujo de control a travs de un programa se refiere al
orden en que s e ejecutan las acciones individuales de un programa.
Aunque un flujo normal de un programa e s lineal, existen m t o d o s
que permiten salir del flujo lineal a travs del uso de las estructuras
de control.
Este captulo explica c m o representar decisiones en algoritmos
cuando existen acciones con d o s o m s alternativas. Se muestra
c m o realizar ejecucin condicional en Turbo Pascal utilizando expresiones lgicas y las sentencias if y case. Se proporcionan m u c h o s
ejemplos de f r a g m e n t o s de programas que contienen sentencias if
y case.

13. Escribimos un programa en el que se introducen como datos de entrada la longitud del permetro de un terreno, expresada con tres nmeros enteros que representan hectmetros, decmetros y metros respectivamente. Se ha de escribir, con un rtulo representativo, la longitud
en decmetros.
14. Construir un programa que calcule y escriba el producto, cociente entero y resto de dos nmeros de tres cifras.
15. Escribir un programa que transforme grados Celsius en grados Fahrenheit.
16. Codificar un programa que muestre un rectngulo en pantalla.
17. Construir un programa para obtener la hipotenusa y los ngulos agudos de un tringulo rectngulo a partir de las longitudes de los catetos.
18. Desglosar cierta cantidad de segundos introducida por teclado en su equivalente en semanas,
das, horas, minutos y segundos.
19. Escribir un programa que le pregunte su nombre y le salude.
20. Escribir un programa que exprese cierta cantidad de pesetas en billetes y monedas de curso
legal.

4.1.

EXPRESIONES LOGICAS

E n t o d o s los a l g o r i t m o s realizados h a s t a este p u n t o , c a d a i n s t r u c c i n se h a e j e c u t a d o


e x a c t a m e n t e u n a vez en el o r d e n e n q u e aparecera. Sin e m b a r g o , c o n f r e c u e n c i a , n o s
e n f r e n t a m o s c o n situaciones e n las q u e se d e b e n p r o p o r c i o n a r i n s t r u c c i o n e s a l t e r n a t i v a s
q u e p u e d e n o n o ejecutarse d e p e n d i e n d o de los d a t o s d e e n t r a d a , r e f l e j a n d o el c u m p l i m i e n t o o n o de u n a d e t e r m i n a d a c o n d i c i n . P o r e j e m p l o , s u p o n g a m o s q u e se desea
d i s e a r u n p r o g r a m a p a r a c a l cu lar el salario s e m a n a l d e u n e m p l e a d o q u e t r a b a j a p o r

109

110

Programacin en Turbo/Borland Pascal 7

Estructuras de control selectivas

horas; la e m p r e s a paga u n a tasa de 1.5 la tasa n o r m a l p o r todas las horas t r a b a j a d a s


superiores a 40. El a l g o r i t m o de clculo de paga sera:

Los ope ra dore s de relacin se utilizan en c o n d i c i o n e s c u y o f o r m a t o tiene u n a de las


siguientes formas: ^

leer tasa
leer HorasTrabajadas
si h o r a s > 4 0 jcondicion}
entonces condicin se cumplej
paga * tasa*40+l. 5*tasa*(horas-40)
sino jcondicion no se cumple)
paga
tasa*horas
fin_si

1. variable
2. constante

La solucin del p r o b l e m a requiere, c o m o se ve, el uso d e e s t r u c t u r a s de decisin: si ( i f ) ,

booleanas)'.

' A' < 1B1


' Z' < ' H1

Las expresiones lgicas se f o r m a n c o m p a r a n d o los valores de las expresiones utilizand o los operadores de relacin (relacinales) o comparacin
m o s t r a d o s en la T a b l a 4.1 y
los operadores lgicos m o s t r a d o s en la T a b l a 4.4.

Los operadores de relacin (o relacinales) se utilizan p a r a expresar c o n d i c i o n e s y describen u n a relacin e n t r e d o s valores. El c o n j u n t o de o p e r a d o r e s relacinales se m u e s t r a n
en la T a b l a 4.1.

<
=
>

<

<

>

valor
falso
verdadero
verdadero

es
es

verdadero
falso

'0' < '1' < ' 2 ' < . . . < '9'


' a ' < 1 b 1 < ' c ' < . . . < ' z'
'A' < 'B' < "C* < . . . < 1 Z'
Recuerde
Los datos carcter y otros tipos de datos no se me/clan en Pascal.

Tabla 4 . 1 . Operadores de relacin

>

expresin
6.7315 > 6.7342
-124.2 < 0.003
8 = 8.0

o falso.

Las reglas a seguir en las c o m p a r a c i o n e s es el o r d e n del c d i g o ASCII. En este cdigo,


los c a r a c t e r e s n u m r i c o s son m e n o r e s q u e las letras m a y s c u l a s , q u e a su vez son m e n o r e s q u e las letras m i n s c u l a s . L o s caracteres especiales y signos d e p u n t u a c i n n o sig u e n u n o r d e n t a n estricto. El o r d e n e x p r e s a d o en estos tres g r u p o s es:

Operadores de relacin

Operador

variable
constante

L o s o p e r a d o r e s de relacin se p u e d e n utilizar t a m b i n p a r a c o m p a r a r d o s e l e m e n t o s
de d a t o s tipo carcter. Si la variable Letra c o n t i e n e u n asterisco (*), la expresin lgica
Letra = ' * ' ser v e r d a d e r a ; en caso contrario, ser falsa.
C u a n d o los o p e r a d o r e s de relacin se aplican a e l e m e n t o s t i p o char, se verifican en
o r d e n alfabtico.

Una expresin lgica es una expresin que puede ser verdadera o falsa.

4.1.1.

operador relacional
operador relacional

El resultado de u n a expresin lgica es un valor de tipo lgico: verdadero

entonces (then), sino (else).


Para realizar el a l g o r i t m o a n t e r i o r c o r r e c t a m e n t e se necesita realizar la p r e g u n t a :
Son las h o r a s t r a b a j a d a s m a y o r e s d e 40? E n Pascal esto se realiza m e d i a n t e la evaluacin de u n a expresin lgica. U n m e d i o para expresar u n a c o n d i c i n ( H o r a s > 40) en
Pascal implica c o m p a r a r dos valores y utilizar u n o p e r a d o r de relacin.
La realizacin de acciones alternativas o decisiones se especifican u t i l i z a n d o c o n d i ciones q u e son v e r d a d e r a s o falsas. Estas c o n d i c i o n e s se l l a m a n expresiones lgicas (o

111

Significado

Equivalente matemtico

Mayor que
Menor que
Igual a
Mayor o igual que
Menor o igual que
Distinto a

>
<
=

'5' = 5

praduce un emir

(no tiene sentido)

Los valores n u m r i c o s slo p u e d e n c o m p a r a r s e c o n o t r o s valores n u m r i c o s y los


caracteres con otros caracteres. Es t a m b i n u n error c o m p a r a r u n c a r c t e r c o n u n a
c a d e n a de caracteres.

>

' 2 ' < '385'

<

' Denominadas as en honor del matemtico ingls George Boole (1815-1864), uno de los fundadores de la
lgica matemtica.

produce un error

Nota
Se \era mas tarde que dos cadenas de caracteres pueden ser comparadas solo si tienen
e\aci mente la misma lonmiud.

Estructuras de control selectivas


112

113

Programacin en Turbo/Borland Pascal 7


Tablq4-3. Operadores de relacin y condiciones ejemplo

I n c i d e n t a l m e n t e , los operadores de relacin p u e d e n t a m b i n c o m p a r a r d o s valores


lgicos. P o r e j e m p l o , se p u e d e ver si d o s n m e r o s tienen los m i s m o s signos escribiendo
( x > =0 ) = (y > =0 )
C u a n d o a m b o s n m e r o s son positivos, o los dos son negativos, el resultado es verdadero, y en caso c o n t r a r i o el resultado es falso.

4.1.2.

< =

< >

x < =0
Prueba < MaxPrueba
a> =b
Numl > MinNuml
Car = 'm'
Numl < > Centinela

4.1.3.

Variables lgicas

<
> =
>
=

Significado
x menor o igual a 0
Prueba menor que MaxPrueba
a mayor o igual que b
Numl mayor que MinNuml
Car igual a 'm'
Numl diferente de Centinela

Valor lgico
verdadero
falso
falso
verdadero
verdadero
falso

La expresin lgica m s simple es u n a variable o c o n s t a n t e lgica q u e p u e d e establecerse


a valores verdadero o falso. La sentencia

Tabla 4 . 2 . Orden de evaluacin

Const

Operador

Prioridad

Error = True;

Contenido del parntesis ( )


*, d i v , mod, /

1.

2.
3.
4.

especifica q u e la c o n s t a n t e lgica Error t o m a el valor True (verdadero); la s e n t e n c i a


var

V
II

A
Jl

1!

+, -

Bandera, Centinela: Boolean;

Ejemplo 4.1
mente,

Condicin

Orden de evaluacin

C u a n d o se incluyen estos n u e v o s o p e r a d o r e s c o n los c o n o c i d o s o p e r a d o r e s aritmticos,


se d e b e seguir un o r d e n de evaluacin en las o p e r a c i o n e s ( T a b l a 4.2).

Si Numl

Operador

y Num2

son variables enteras que tienen asignados

los valores 3 y 6, respectiva-

declara ias variables Bandera


los valores True y False.
O t r o e j e m p l o es

y Centinela

de tipo lgico y en c o n s e c u e n c i a p u e d e n t o m a r

entonces:
Bandera := true

1. (2+3*Numl) o
2+3*Numl=ll

6+(Num2-l)
6+(Num2-l)=11

Valor falso
q u e asigna el valor true a la variable Bandera.

2. (l + (2 div 2) mod mod Nuit) <= 4* Numl


2

Valor verdadero

4.1.4.

12

3. 2 - 7 div (2*Numl-Num2) = 0

Xo tiene sentido

Las expresiones lgicas p u e d e n c o m b i n a r s e p a r a f o r m a r e x p r e s i o n e s m s c o m p l e j a s util i z a n d o los o p e r a d o r e s lgicos: and, or y not. Estos o p e r a d o r e s se utilizan c o n c o n s t a n t e s
lgicas de f o r m a similar al m o d o en q u e los o p e r a d o r e s a r i t m t i c o s se u t i l i z a n c o n las
c o n s t a n t e s n u m r i c a s . Estos o p e r a d o r e s t r a b a j a n c o n o p e r a n d o s q u e son e x p r e s i o n e s lgicas.

0
2-7 div 0

No tiene sentido la divisin por cero en Pascal

4 . Num2 > = Numl+3

Valor verdadero

Ejemplo 4 . 2

[operando

La Tabla 4.3 muestra operadores relacinales


suponiendo los siguientes valores de variables.
Centinela
999

Operadores lgicos

Prueba

MaxPrueba

1024

1024

y condiciones.

Cada condicin

1}

[operando 1}
a

MinNuml

2.5

-999.0

Car

operador

operando

se evala

Numl
999

segn el tipo de operador puede no existir.

L a o p e r a c i n and (y) c o m b i n a dos c o n d i c i o n e s simples y p r o d u c e u n r e s u l t a d o verd a d e r o slo si los dos o p e r a n d o s ( c o m p o n e n t e s ) s o n v e r d a d e r o s . L a o p e r a c i n or (o) es

114

Programacin en Turbo/Borland Pascal 7

Es truc turas de control selectivas

Tabla 4 . 4 . Tablas de verdad de operadores lgicos

Tabla 4.5. Prioridad de o p e r a d o r e s lgicos

a) Operador a n d
Operando 1

Operando 2

Operando 1 and Operando 2

Verdadero
Verdadero
Falso
Falso

Verdadero
Falso
Verdadero
Falso

Verdadero
Falso
Falso
Falso

b) Operador o r
Operando 1

Operando 2

Operando 1 o r Operando 2

Verdadero
Verdadero
Falso
Falso

Verdadero
Falso
Verdadero
Falso

Verdadero
Verdadero
Verdadero
Falso

115

Prioridad

Operacin

Alta

not
and
or, xor

Baja

t n presentes m s de u n a o p e r a c i n . La p r e c e d e n c i a o p r i o r i d a d d e las o p e r a c i o n e s lgicas se recogen en la T a b l a 4.5.


C o m o p u e d e apreciarse, el o p e r a d o r not t i e n e la p r i o r i d a d m s alta, seguida de los
o p e r a d o r e s multiplicativos ( i n c l u y e n d o and), los o p e r a d o r e s aditivos ( i n c l u y e n d o or) y,
p o r l t i mo, los o p e r a d o r e s de relacin. D e b i d o a esto, los o p e r a d o r e s de relacin se pued e n utilizar g e n e r a l m e n t e con parntesis a fin d e p r e v e n i r errores.

c) Operador n o t
Operando 1

n o t Operando 1

Verdadero
Falso

Falso
Verdadero

Tabla 4.6. Prioridad completa de o p e r a d o r e s


Operador

d) Operador x o r
Operando 2

Operando 1 x o r Operando 2

Verdadero
Verdadero
Falso
Falso

Verdadero
Falso
Verdadero
Falso

Falso
Verdadero
Verdadero
Falso

de evaluacin

Ms alta (se evala primero)

not

Operando 1

v e r d a d e r a si u n o de los d o s o p e r a n d o s es v e r d a d e r o . La o p e r a c i n not (no) a c t a sobre


u n a sola c o n d i c i n s i m p l e u o p e r a n d o y s i m p l e m e n t e niega (o invierte) su valor.
Los significados de estos o p e r a d o r e s se describen m s f c i l m e n t e u t i l i z a n d o u n a s
tablas d e n o m i n a d a s tablas de verdad (Tabla 4.4).
C u a n d o la expresin lgica c o n t i e n e diferentes tipos d e o p e r a d o r e s lgicos, es preciso
seguir un o r d e n de p r i o r i d a d o precedencia p a r a o b t e n e r el valor final de la e x p r e s i n .
Orden

Prioridad

de operadores

lgicos

1. not
2. and
3. or

* , / , d i v , mod, and
+,

<

<=

/ = ,

<

> ,

> = ,

>

Ms baja (se evala el ltimo)

Si existen parntesis, las expresiones de su interior se evalan primero.

Ejemplo 4 . 3
1. not (' A' = ' Z')
es true ya que 'A' = 'Z' es false
2. not (2 < 3)
es false ya que 2 < 5 es verdadero (true)
3. ((Mes=10) and (Dia> =24)) or ((Mes=ll) and ( D i a < 2 2 ) )
Si se t r a t a la fecha de n a c i m i e n t o de u n a p e r s o n a c u y o signo es Escorpio, el r e s u l t a d o
d e la expresin 3 ser true, ya q u e el signo E s c o r p i o p e r t e n e c e a las p e r s o n a s nacidas en
el p e r o d o c o m p r e n d i d o e n t r e el 24 de o c t u b r e y 2 2 d e n o v i e m b r e .

Ejemplo 4 . 4
Realizar

Al igual q u e en operaciones aritmticas, existen reglas de precedencia (prioridad) p a r a


d e t e r m i n a r cul es la o p e r a c i n lgica q u e h a de realizarse c u a n d o en u n a e x p r e s i n es-

or
/

el anlisis

de la siguiente

expresin

lgica.

((x*2 > y - 3) or (x > y - 1)) and (y < 5)

116

Estructuras

Programacin en Turbo/Borland Pascal 7

de control selectivas

117

Ejemplo 4 . 6
La variable A tiene el valor 2 y la variable B tiene el valor 0. Calcular el resultado de la
expresin lgica (A < 3) or (B = 1).
L a expresin lgica x or y es v e r d a d e r a c u a n d o x o y, o a m b a s a la vez son verdaderas.
E n este e j e m p l o , la relacin (A < 3) es v e r d a d e r a , y p o r consiguiente, el r e s u l t a d o de la
e x p r e s i n total es v e r d a d e r a sea cual sea el v a l o r d e la o t r a p a r t e de la e x p r e s i n (B = l).
P o r consiguiente, es i n n e c e s a r i o e v a l u a r la e x p r e s i n (B = 1) p a r a d e t e r m i n a r q u e la exp r e s i n c o m p l e t a es v e r d a d e r a .
La evaluacin en cortocircuito requiere que la directiva del compilador B est activada (sea
positiva, {SB+}). El estado por defecto (omisin) de esta directiva es {SB-}.

Ejemplo 4 . 5
La expresin
n o t p o r q and r
se evala en o r d e n : 1. not p; 2. q and r; 3. not p or q and r. Si se desea c a m b i a r el o r d e n
de pr iorid ad, se d e b e n incluir parntesis; p o r e j e m p l o :
not

(p o r q and r )

se e v a l u a r e j e c u t a n d o p r i m e r o la o p e r a c i n and, a c o n t i n u a c i n la o p e r a c i n or y, finalm e n t e , la o p e r a c i n not.


O t r o s e j e m p l o s son:
Expresin lgica
not a or b
not a and b or not c
a or b and c

Obsrvese q u e si la p r i m e r a p a r t e de la e x p r e s i n del E j e m p l o 4.6 h u b i e r a sido falsa,


h a b r a sido necesario p a r a el s i s t e m a e v a l u a r la o t r a p a r t e d e la expresin p a r a d e t e r m i n a r el valor de la expresin c o m p l e t a . P o r c o n s i g u i e n t e , la o p c i n en c o r t o c i r c u i t o a h o r r a
t i e m p o de e j e c u c i n en a l g u n o s casos, p e r o en o t r o s n o . Sin e m b a r g o , esta caracterstica
suele ser positiva y b u e n a p r u e b a de ello es q u e otros l e n g u a j e s m o d e r n o s c o m o C / C + +
t a m b i n la s o p o r t a n . P o r esta c a u s a p u e d e ser o p o r t u n o i n c l u i r la directiva {$B+} en su
p r o g r a m a si prev q u e v a n a existir n u m e r o s o s y sobre t o d o c o m p l e j a s o p e r a c i o n e s lgicas.

4.2. LA SENTENCIA IF
D a d o q u e las expresiones lgicas t o m a n el valor v e r d a d e r o o falso, se necesita u n a
s e n t e n c i a de c o n t r o l q u e dirija a las c o m p u t a d o r a s p a r a e j e c u t a r u n a sentencia si la

Orden de evaluacin
(not a) or b
((not a) and b) or (not c)
a or (b and c)

4.1.5. Evaluacin de operadores and y or


T u r b o Pascal s o p o r t a dos m o d e l o s diferentes de g e n e r a c i n de c d i g o p a r a los o p e r a d o res and y or: evaluacin c o m p l e t a y evaluacin en c o r t o c i r c u i t o (parcial).
La evaluacin completa significa q u e se garantiza la e v a l u a c i n de u n a e x p r e s i n lgica, incluso a u n q u e el r e s u l t a d o d e la citada expresin lgica sea y a c o n o c i d a , ste es el
sistema clsico de evaluacin, p e r o p r e s e n t a p r o b l e m a s de r a l e n t i z a c i n en los clculos
finales.
La evaluacin en cortocircuito g a r a n t i z a la estricta evaluacin d e i z q u i e r d a a d e r e c h a
y esa evaluacin se detiene t a n p r o n t o c o m o el r e s u l t a d o de la e x p r e s i n c o m p l e t a es
evidente. Este m o d e l o es a d e c u a d o en la m a y o r a de los casos ya q u e g a r a n t i z a el t i e m p o
m n i m o de ejecucin y n o r m a l m e n t e t a m a o m n i m o d e cdigo. Esto significa q u e alg u n a s p a r t e s de u n a e x p r e s i n p u e d e n n o ser e v a l u a d a s a h o r r a n d o e n c o n s e c u e n c i a
t i e m p o d u r a n t e la ejecucin del p r o g r a m a .

T
a)
f expresin lgica
then
sentencia A
else
sentencia B

c)
Figura 4 . 1 .

if expresin lgica then


<accin A >
else
< accin B>

d)

Estructura selectiva i f : a) diagrama de flujo; b) pseudocdigo; c), d) escritura i f


modelos 1 y 2.

118

Estructuras de control selectivas

Programacin en Turbo/Borland Pascal 7

expresin es verdadera, y otra sentencia en caso de ser falsa. En Pascal esta alternativa se
realiza c o n la s e n t e n c i a o estructura de c o n t r o l i f - t h e n - e l s e . La Figura 4.1 describe el
d i a g r a m a de flujo y p s e u d o c d i g o d e la e s t r u c t u r a j u n t o c o n el f o r m a t o d e la sentencia.
La e s t r u c t u r a o sentencia if f u n c i o n a de la siguiente f o r m a :

Diagrama

119

4-1

1. Se evala la expresin lgica.


2. Si la expresin t o m a el valor true (verdadero), se e j e c u t a r la sentencia A y el control p a s a r a la s e n t e n c i a i n m e d i a t a m e n t e s i g u i e n t e a la i f - t h e n - e l s e ( n o se ejec u t a la s e n t e n c i a 3).
3. Si la expresin t o m a el valor false (falso), e n t o n c e s slo se e j e c u t a r la s e n t e n c i a B
y el control pasa de n u e v o i n m e d i a t a m e n t e a la siguiente s e n t e n c i a del programa.
Ejemplo 4 . 7
Considere

el siguiente

segmento

de programa.

program Nmeros;
var
Numero : real;
begin
WriteLn ('introduzca un numero ');
Read (Numero);
if Numero > 0.0
then
WriteLn ('El numero introducido es positivo')
else
WriteLn ('El numero introducido es negativo');
Write ('Por aqui pasa siempre el programa')
end.
Si se lee d e s d e el a r c h i v o de e n t r a d a (teclado o u n i d a d de disco) ei valor 8.25, la salida
ser:

Sin e m b a r g o , las sangras y saltos de lneas f a v o r e c e n la legibilidad de los p r o g r a m a s ,


hoy da d e gran i m p o r t a n c i a p a r a favorecer la transportabilidad
de los p r o g r a m a s de
u n a s m q u i n a s a otras. A u n q u e p u e d e realizar escritura c o m p a c t a d a , c o m o la citada
a n t e r i o r m e n t e , le r e c o m e n d a m o s s i e m p r e la e s c r i t u r a de sus p r o g r a m a s con sangrados.
Diagramas

de sintaxis

El numero introducido es positivo


Por aqui pasa siempre el programa
m i e n t r a s q u e si se lee - 4 . 5 se o b t e n d r en la salida:
El numero introducido es negativo
Por aqui pasa siempre el programa

4.2.1.

Sangrado (ndentacin)

S i n t c t i c a m e n t e , el sangrado ( " i n d e n t a c i n " ) y la separacin de lneas n o s o n necesarias.


Por e j e m p l o , el c o m p i l a d o r aceptar las siguientes sentencias:
Read (Numero);
if Numero >0.0 then WriteLn ('positivo') else WriteLn ('negativo');
Write ('por aqui pasa siempre el programa')

4.2.2.

Omisin de la clusula else

E n m u c h o s casos se desea q u e u n a d e t e r m i n a d a a c c i n slo se ejecute si u n a cierta c o n d i c i n es v e r d a d e r a y n o realizar n i n g u n a a c c i n si la c o n d i c i n es falsa: en este caso se


o m i t e del f o r m a t o la clusula else.

if

condicin
then
sentencia

if condicin then
sentencia

if condicin

then sentencia

1 20

4.2.3.

Estructuras de control selectivas

Programacin en Turbo/Borland Pascal 7

Sentencias compuestas

var
A, B, Aux : integer;
begin
ReadLn (A, B);
if A > B
then
begin
Aux := A;
A
B
end;

En n u m e r o s a s ocasiones, en lugar de realizar slo u n a accin, c u a n d o se c u m p l a o no se


c u m p l a u n a d e t e r m i n a d a condicin, se d e b e n realizar diferentes acciones. Esto se realiza
m e d i a n t e sentencias c o m p u e s t a s . U n a sentencia compuesta es u n c o n j u n t o de sentencias
s e p a r a d a s p o r p u n t o s y c o m a s y e n c e r r a d a entre las p a l a b r a s begin y end. El c u e r p o de u n
p r o g r a m a o p r o c e d i m i e n t o es u n a sentencia c o m p u e s t a .

begin
sentencia
sentencia
sentencia
end

1;
2:
n

begin
Read(Numero);
N:=N+1;
Write('el numero es',Numero:4);
Bandera:=1
end

Seguimiento

S u p o n g a m o s q u e A y B t i e n e n los valores originales 45 y 36, r e s p e c t i v a m e n t e . El seguim i e n t o sera:


Sentencia

si un nmero

ledo desde el teclado es positivo

Read (X);
if X > 0
then
begin
WriteLn
WriteLn
end
else
begin
WriteLn
WriteLn
end

o negativo.

A y B}
valor A en Aux}
valor B en A}
valor antiguo de A en B}

del programa

AUX

then

45

36

:= A;
:= B;
:= Aux

45
36

36
36

45
45

45 > 36 es verdadero
Se almacena 45 en Aux
Se almacena 36 en A

36

45

45

Se almacena 45 en B

Ejemplo 4 . 8
Deducir

{Intercambiar
{Almacenar el
{Almacenar el
{almacenar el
{final de if}

121

if A > B
begin
Aux
A
B
end;

Efecto

(X, ' es positivo ) ;


( 1 en esta ocas ion ', X,

es positivo ' )

4.2.4.
(X, 1 es negativo1);
( 'o bien es cero1 )

Puntos y comas innecesarios

C o m o ya conoce, los p u n t o s y c o m a s se utilizan p a r a separar sentencias, pero n o f o r m a n


p a r t e d e u n a sentencia. Esto es e s p e c i a l m e n t e i m p o r t a n t e en la escritura de sentencias
i f - t h e n - e l s e . As, p o r e j e m p l o , en:

Nota
El punto y coma de una sentencia anterior al end final de if es opcional y se suprime casi

Ejemplo 4 . 9
En los prximos captulos se ver la utilidad de intercambiar
los valores almacenados
en
memoria en dos determinadas
variables A y B; es decir, si A contiene 45 y B 36, intercambiar sus valores significar que A pase a contener a 36 y B pase a contener 45. El
ejercicio consiste en intercambiar
los valores de dos nmeros A y B si no estn en orden
creciente y no hacer nada si estn ordenados. Esto se consigue con el siguiente segmento
de programa.

if N > 0
then w r i t e l n ( ' P o s i t i v o ' )
e l s e writeIn ('Negativo o c e r o 1 ) ;
writeln ('siguiente sentencia1)
Si se sita u n p u n t o y c o m a d e s p u s de la p r i m e r a sentencia WriteLn, su p r o g r a m a
p r o d u c i r u n m e n s a j e d e error. El c o m p i l a d o r s u p o n e q u e el p u n t o y c o m a separa d o s
sentencias y q u e la siguiente sentencia c o m i e n z a c o n el identificador else. C o m o n o existe
n i n g u n a s e n t e n c i a en Pascal q u e c o m i e n c e c o n el se, se p r o d u c i r u n error.
Si se escribe u n p u n t o y c o m a extra a n t e s d e else, el c o m p i l a d o r p r o d u c i r u n m e n saje de error.
O t r a causa d e error es i n s e r t a r u n p u n t o y c o m a d e s p u s de la p a l a b r a then en u n a
s e n t e n c i a if-then, ya q u e h a r t e r m i n a r p r e m a t u r a m e n t e la sentencia i f .

122

Programacin en Turbo/Borland Pascal 7


if Nomina < 50.000 then
begin
WriteLn ('este empleado');
WriteLn ('no paga impuesto');
end;
else
begin
WriteLn ('este empleado paga impuestos');
WriteLn ('en una cantidad igual a');
Nomina (Nomina * 0.15)
end;
E n el e j e m p l o anterior se visualizar u n m e n s a j e del c o m p i l a d o r 'error in statement'

(error en sentencia).

4.2.5.

La sentencia vaca

Pascal tiene u n a sentencia q u e n o hace a b s o l u t a m e n t e n a d a , es la sentencia nula o sentencia vaca. Los p u n t o s y c o m a s separan sentencias en Pascal. P a r a realizar s e n t e n c i a s
c o m p u e s t a s se necesitan begin y end.
begin
ReadLn (x);
Total := Total + x
end

Estructuras de control selectivas

123

e l s e c o n t i e n e n t a m b i n u n a sentencia i f - t h e n - e l s e , se dice q u e dichas sentencias i f est n anidadas y al p r o c e s o anidamiento.


U n a s e n t e n c i a i f a n i d a d a se p u e d e utilizar para
c o n s t r u i r decisiones c o n diferentes alternativas.
Modelo

if condicin 1
then
sentencias X
else
if condicin 2
then
sentencias Y
else
sentencias Z...

Modelo

if condicin 1
then
sentencias X
else if condicin 2
then
sentencias
Y
else if . . .

Ejemplo 4.1 0
Se desea leer nmeros sucesivamente
de un archivo
son mayores, iguales o menores que cero.

de entrada,

determinando

cuntos

La resolucin de este p r o b l e m a implica d i s e a r tres c o n t a d o r e s , Total Pos, Total Neg y


Total Ceros, q u e c u e n t a n los n m e r o s positivos, n e g a t i v o s y ceros, respectivamente.

S u p o n g a m o s q u e se escribe u n p u n t o y c o m a al final de la s e n t e n c i a de a s i g n a c i n
begin
ReadLn (x);
Total := Total + x; { sentencia vacia }
end
C o m o end n o es u n a sentencia, el n u e v o p u n t o y c o m a n o a p a r e c e c o m o s e p a r a c i n
de dos sentencias. Sin e m b a r g o , n o existe error: el c o m p i l a d o r d e c i d e q u e h a y u n a sentencia e n t r e la sentencia de asignacin y end, es decir, la s e n t e n c i a n u l a . L a s e g u n d a versin de la sentencia c o m p u e s t a tiene tres sentencias, n o dos.
L a principal razn para p e r m i t i r sentencias vacas es la flexibilidad. L a s e n t e n c i a vaca se p u e d e utilizar t a m b i n en u n a sentencia case p a r a especificar q u e n o se h a g a n a d a
en a l g u n a alternativa. En general se p u e d e utilizar en c u a l q u i e r p a r t e q u e necesite u n a
sentencia q u e n o produzca n i n g u n a accin ni c a m b i o .

4.3.

SENTENCIAS IF ANIDADAS

La sentencia q u e sigue a la p a l a b r a reservada then o e l s e p u e d e ser c u a l q u i e r a , i n c l u s o


otra sentencia if-then-else. C u a n d o u n a o a m b a s bifurcaciones de u n a sentencia i f - t h e n -

TotalPos := 0;
TotalNeg := 0;
TotalCero := 0;
Read (X);
if X > 0
then
TotalPos := TotalPos + 1
else
if X < 0
then
TotalNeg := TotalNeg + 1
else
TotalCero := TotalCero + 1;

La e j e c uc i n de esta sentencia if es c o m o sigue: la p r i m e r a c o n d i c i n (,x>0) se verifica; si es verdadera, TotalPos se i n c r e m e n t a e n 1 y el resto de la s e n t e n c i a se salta. Si


la p r i m e r a c o n d i c i n es falsa, la segunda c o n d i c i n ( . r < 0 ) se verifica; si la segunda condicin es verdadera, TotalNeg se i n c r e m e n t a en 1; en caso c o n t r a r i o , TotalCero se increm e n t a . Obsrvese q u e la s e g u n d a c o n d i c i n slo se verifica si la p r i m e r a condicin es
falsa.

1 24

Estructuras de control selectivas

Programacin en Turbo/Borland PascaI 7


Si Distancia > 1.000 km
5.000 pesetas + kilometraje
a razn de 30 ptas./km para las distancias
y 20 ptas./km para las distancias mayores

Tabla 4 . 7 . Seguimiento del Ejemplo 4 . 9 para x = - 5


Efecto

Parte de la sentencia
if x> 0
then...
else if < 0
then TotalNeg := TotalNeg+1
else

-5>0

entre 300 y 1.000 km

falso
5.000 pesetas

-5<0
verdadero
Se SUma 1 a TotalNeg
0

no kilometraje

300 km
<

30 ptas./km

1.000 km
+

20 ptas./km

Algoritmo

Problema 4.1
Dados tres nmeros
distintos).

comprendidas
de 1.000 km.

125

enteros,

determinar

cul es el mayor

(los tres nmeros

se suponen

program Mayor;
var
A,B,C
: integer;
{ valores de entrada }
Elmayor : integer;
{ valores de salida }
begin
{ introduccin de datos en memoria }
WriteLn ('Introduzca tres nmeros enteros ');
ReadLn (A,B,C);
{ determinar el numero mayor }
if A > B
then
if A > C
then
Elmayor := A
else
Elmayor := C
else
if B > C
then
Elmayor := B
else
Elmayor := C;
{ visualizacion del numero mayor }
WriteLn ('El numero mayor es
Elmayor)
end.

si Kilmetros < 300


entonces
Suplemento
0
sino
si Kilmetros < 1000
entonces
Suplemento-* (Kilometros-300) * 30
sino
Suplemento
700 * 30 + (Kilometros-1000) * 20
f i n_s i
3. I m p o r t e T o t a l

Problema 4 . 2
Una compaa de alquiler de automviles
sin conductor desea un programa
las facturas de sus clientes, teniendo presente los siguientes puntos:
1. Cantidad fija de 5.000 pesetas si no se rebasan
2. Distancia recorrida mayor de 300 km.
Si Distancia > 300 km y < 1.000 km
5.000 pesetas + kilometraje
a razn de 30 ptas./km

los 300 km.

1. Calcular C u e n t a K i l m e t r o s F i n a l - C u e n t a K i l m e t r o s I n i c i a l .
2. Asignar valor resultante a la variable K i l m e t r o s .

para emitir

5000 + S u p l e m e n t o .

program Factura;
const
Fijo
= 5000;
Tasal
= 30;
Tasa2
= 20;
Limiteinf = 300.0;
Limitesup = 1000.0;
var
Cuentakilometrosfinal, Cuentakilmetrosinicial,
Kilmetros, Suplemento, Importetotal : real;
begin
WriteLn ('introduzca kilmetros finales y kilmetros
iniciales ');
ReadLn (Cuentakilometrosfinal, Cuentakilometrosinicial);
Kilmetros := Cuentakilometrosfinal - Cuentakilometrosinicial;
if Kilmetros <= Limiteinf
then
Suplemento := 0
else
if Kilmetros <= Limitesup
then
Suplemento := ( Kilmetros - Limiteinf ) * Tasal

Estructuras de control selectivas

127

Programacin en Turbo/Borland Pascal 7

126

O t r o s e j e m p l o s p u e d e n ser:
else
Suplemento := (Limitesup - Limiteinf ) * Tasal +
(Kilmetros - Limitesup ) * Tasa2;
Importetotal := Fijo + Suplemento;
WriteLn ('el importe total es
Importetotal:1:1)
end.

4.4.

PROGRAMACION CON EXPRESIONES LOGICAS

Las expresiones lgicas p u e d e n t e n e r diferentes grados d e c o m p l e j i d a d . Su correcta aplicacin reducir el t i e m p o de escritura d e cdigo f u e n t e y a h o r r a r t i e m p o d e e j e c uc i n y
de d e p u r a c i n del p r o g r a m a . E n esta seccin se a n a l i z a n diferentes casos q u e suelen
darse con f r e c u e n c i a en p r o g r a m a c i n .

4.4.1.

Tipos lgicos

Las expresiones lgicas t o m a n valores lgicos: verdadero (true) o falso (false). Este v a l o r
p u e d e ser a l m a c e n a d o en u n a variable, t e n i e n d o presente q u e tal variable d e b e ser declar a d a en la seccin c o r r e s p o n d i e n t e d e tipo boolean (lgico). P o r consiguiente, si N es u n a
variable de tipo integer y x es u n a variable de t i p o boolean, las siguientes expresiones son
vlidas y el valor final de

4.4.2.

implica

variables.
program Demo;
var
Temperatura
Casado, Bandera
Sw, Flag
Resp

:
:
:
:

real;
boolean;
boolean;
char;

E n el c u e r p o del p r o g r a m a se p u e d e n d a r las siguientes s e n t e n c i a s d e asignacin o


decisin:
sw := x = Y
= ^

then
SW := true
else
sw := false

asigna el valor true a SW si X = Y; en caso contrario, asigna el valor false


igual efecto que SW:= X = Y

{el valor de la variable Resp


es S o s}

Las variables lgicas como interruptores


o banderas

L a s variables lgicas p u e d e n ser utilizadas p a r a r e c o r d a r u n a condicin q u e p u e d e c a m b i a r o q u e n o se p u e d e verificar c o n facilidad; es decir, se utilizan c o m o indicadores,
b a n d e r a s o centinelas (flags), q u e s e a l a n si u n suceso d e t e r m i n a d o o c u r r e o n o en u n
p r o g r a m a . El h e c h o de q u e tal suceso o c u r r a es i m p o r t a n t e p a r a la f u t u r a e j e c u c i n del
p r o g r a m a . U n a variable lgica se inicializa a u n o de los d o s posibles valores (true o false)
y t o m a el o t r o valor t a n p r o n t o c o m o o c u r r e el suceso previsto.
E n los e j e m p l o s anteriores se p u e d e d e s e a r c o n o c e r en el p r o g r a m a c o n p o s t e r i o r i d a d
a esas s e n t e n c i a s si x e Y son iguales o si u n d e t e r m i n a d o seor est c a s a d o o n o . Su aplic a c i n prctica p u e d e ser:
WriteLn ('son iguales a los nmeros');
{verificar el estado de la variable SW}
if SW = true
then WriteLn ('son iguales')
else WriteLn ('son distintos');

X: =fal se

Las variables d e tipo lgico se d e c l a r a n en el m i s m o lugar de p r o g r a m a q u e el resto de las

4.4.3.

false

Variables lgicas (sentencias de asignacin)

if

then
Casado := true
else
Casado := false

es falso.

N:=5
X:= (N> 10) or (N<0)
false

if (Resp = 'S') or (Resp = 's')

4.4.4.

Lectura y escritura de valores lgicos

U n valor de tipo lgico n o p u e d e leerse d i r e c t a m e n t e . P a r a realizar esta o p e r a c i n se


d e b e leer algn o t r o t i p o de e n t r a d a , tal c o m o u n carcter, y asignarse a u n a variable lgica.
WriteLn ('Teclee t o T para True');
ReadLn (Car);
ValorLogico := (Car='T') or (Car = 't');
ValorLgico t o m a el valor true (verdadero) si el c a r c t e r ledo Car es T o t; en caso contrario, t o m a el valor false (falso).
L o s valores lgicos p u e d e n ser escritos c o m o salidas:
1. if SW
then
Write ('verdadero')
else
Write ('falso')
2. Write (SW)

{visualiza true o false}

1 28

4.4.5.

Programacin en Turbo/Borland Pascal 7

Constantes lgicas en la depuracin

Las constantes lgicas se p u e d e n utilizar en la fase de d e p u r a c i n de u n p r o g r a m a , ya


q u e p u e d e n ser utilizados c o m o i n t e r r u p t o r e s entre d o s partes de u n p r o g r a m a .

Las siguientes sentencias de escritura slo se e j e c u t a n si D e p u r a r es True:


if Depurar then
begin
WriteLn ('procedimiento de depuracin');
WriteLn ('Salario es', Salario : 12:2)
end;
{i f}

Evaluacin de expresiones lgicas en cortocircuito

En la evaluacin de expresiones lgicas se p u e d e e m p l e a r c o n f r e c u e n c i a u n a tcnica


d e n o m i n a d a evaluacin en cortocircuito. Esta tcnica significa q u e se p u e d e d e t e n e r la
evaluacin de una expresin lgica tan p r o n t o c o m o su valor se p u e d a d e t e r m i n a r .
Ejemplo
Evaluar la expresin
(not Bandera) or ((b + c) >= (a - c))
donde
Bandera = false

a=3.0, b=4.0, c=20

En esta expresin not Bandera=true, sea cual sea el valor de la e x p r e s i n e n t r e p a r n tesis a c o n t i n u a c i n de or. ya q u e u n a operacin or es true si a l g n o p e r a n d o es true.
En T u r b o B o r l a n d Pascal 7.0 los operadores lgicos and y or a c t a n en c o r t o c i r c u i t o
p o r defecto.
expl

and

expl

or

exp2
exp2

si expl es falso, entonces la expresin completa es falsa,


y exp2 nunca se evala
exp2 nunca se evala si expl es verdadero

Nota
fucilo l'or/ai la realizacin de expiesion lgica completa con la directiva del compilador

129

Ejemplo
Si X es cero, la c o n d i c i n
i f (X< > 0 . 0 ) and ( a / b > 7 . 0 ) then
es falsa, ya q u e ( X < > 0.0) es falsa y false

const
Depurar = true;

4.4.6.

Estructuras de control selectivas

4.4.7.

and (...) d e b e ser s i e m p r e falsa.

Aritmtica lgica

El uso de c o n d i c i o n e s lgicas c o m p u e s t a s facilita en m u c h a s ocasiones la p r o g r a m a c i n .


Ejemplo
Una cierta compaa fabricante
de repuestos de automviles
ha descubierto defectos en
algunos de sus productos, especficamente
aquellos cuyos nmeros de serie se encuentran
dentro de los rangos: 14681 a 15681, 70001 a 79999 y 88888 a l i l i l . La compaa se
lo ha comunicado
a la divisin de relaciones con los consumidores
y desea un programa
que permita leer el nmero de serie y deducir si es o no defectuoso.
U n p r i m e r cdigo p u e d e ser:
Read (NumeroSerie);
if NumeroSerie >= 14681
then
if NumeroSerie <= 15681
then
Write ('es defectuoso')
else
if NumeroSerie < 70001
then
Write ( 'es. correcto' )
else
if NumeroSerie <= 79999
then
Write ('es defectuoso')
else
if NumeroSerie < 88888
then
Write ('es correcto')
else
if NumeroSerie <= lilil
then
Write ('es defectuoso')
else
Write ('es correcto')
else
Write ('es correcto');

Este cdigo, a u n q u e correcto, es ineficiente y difcil de leer. En estos casos es posible


evitar m u c h o s niveles de a n i d a m i e n t o r e c u r r i e n d o a escribir c o n d i c i o n e s lgicas c o m puestas:

130

Estructuras de control selectivas

Programacin en Turbo/Borland Pasca! 7

131

la r a z n del o p e r a d o r not es que:

C m o se p u e d e expresar q u e el N m e r o de Serie (NumeroSerie) est c o m p r e n d i d o


e n t r e d o s n m e r o s A y B? Algrebraicamente:

not ( 1 F ' <= Letra) es lo mismo que d e c i r 1F1 > Letra


not (Letra <= 1 S ' ) es lo mismo que d e c i r 1 e t r a > 1 S'

A < = NumeroSeri e < = B

3. Las expresiones lgicas c o m p u e s t a s siguientes tienen el m i s m o valor:

y en expresin Pascal

not ( e x p r e s i o n l and expresion2)


(not expresionl)
or (not exprs ion2)

(A <= NumeroSerie) and (NumeroSerie <= B)


De este m o d o , el s e g m e n t o de p r o g r a m a a n t e r i o r p u e d e sustituirse por:
if ((14681
((70001
((88888
then
Write
else
Write

<= NumeroSerie) and (NumeroSerie <= 15681)) or


<= NumeroSerie) and (NumeroSerie <= 79999)) or
<= NumeroSerie) and (NumeroSerie <= lilil))

Estas expresiones se c o n o c e n c o m o leyes de M o r g a n en Algebra de Boole.


4. D e m o d o similar,
not ( e x p r e s i o n l or expresionZ)
(not expresionl)
and (not expresion2)

(' es defectuoso ')

tienen s i e m p r e el m i s m o valor.

(' es correcto ');

Este cdigo p u e d e escribirse de m o d o m s legible:


program Repuestos;
var
Numeroserie: longint;
Defectuosol, Defectuoso2, Defectuoso3 : boolean;
begin
WriteLn ('Introduzca numero de serie');
Read (Numeroserie);
Defectuosol := (14681 <= Numeroserie) and (Numeroserie <=
15681);
Defectuoso2 := (70001 <= Numeroserie) and (Numeroserie <=
79999) ;
Defectuoso3 := (88888 <= Numeroserie) and (Numeroserie <=
lilil);
if Defectuosol or Defectuoso2 or Defectuoso3
then
Write ('Este numero de serie es defectuoso')
else
Write ('Este numero de serie es correcto');
WriteLn
end.
Ejemplos

4.5.

LA SENTENCIA CASE

L a s e n t e n c i a case se utiliza p a r a elegir e n t r e d i f e r e n t e s alternativas. U n a s e n t e n c i a case


se c o m p o n e de varias s e n t e n c i a s simples. C u a n d o case se ejecuta, u n a (y slo u n a ) de las
s e n t e n c i a s simples se selecciona y ejecuta.
c a s e selector of
lisia constantes
lista constantes

1: sentencia
2: sentencia

1;
2;

lista constantes n: sentencia


[else
sentencia x]
end
{case}

n;

Lista de constantes:

s e g n _ s e a selector h a c e r
Cll,C12,..:.
sentencia 1
C21.C22,...: sentencia 2

[sino
sentencia
fin_segn

x\

pueden ser constantes o un valor subrango: constante 1.. constante 2

Reglas:

1. E x p r e s a r la c o n d i c i n : el valor de u n a variable carcter (Letra) est en el r a n g o F


a S:
( ' F ' <= Letra) a n d (Letra <= ' S ' )
2. E x p r e s a r la c o n d i c i n : el valor de u n a variable c a r c t e r Letra n o est en el r a n g o
FaS:
not ( ( ' F 1 <= Letra) and (Letra <= ' S ' ) )

1. La expresin selector se evala y se c o m p a r a c o n las listas de c o n s t a n t e s ; las listas


de c o n s t a n t e s son listas de u n o o m s posibles valores d e selector s e p a r a d o s por
c o m a s . Slo se e j e c u t a u n a sentencia. Si el valor del selector est en lista constantes 1. se ejecuta sentencia l. El c o n t r o l se pasa s e g u i d a m e n t e a la p r i m e r a s e n t e n c i a
a c o n t i n u a c i n d e end. C a d a sentencia p u e d e ser a su vez u n a s e n t e n c i a Pascal
simple o compuesta.
2. La c l u s u l a el se es o p c i o n a l c o m o e n la s e n t e n c i a i f.

132

Estructuras de control selectivas

Programacin en Turbo/Borland Pascal 7

3. Si el valor del selector n o est c o m p r e n d i d o en n i n g u n a lista de c o n s t a n t e s y n o


existe la clusula el se, n o sucede n a d a y sigue el flujo del p r o g r a m a ; si el valor del
selector n o coincide c o n a l g u n a c o n s t a n t e , se e j e c u t a ( n ) la(s) sentencia(s) a continuacin de la clusula else.
4. El selector debe ser u n tipo ordinal (integer, char, boolean o enumerado).
Los n m e r o s reales n o p u e d e n ser utilizados ya q u e n o son ordinales. L o s valores ordinales de los lmites inferiores y superiores d e b e n estar d e n t r o del r a n g o - 3 2 7 8 6 a
32767. P o r consiguiente, los tipos string, longint y word n o son vlidos.
5. T o d a s las c o n s t a n t e s case d e b e n ser n i c a s y de u n tipo o r d i n a l c o m p a t i b l e c o n el
tipo del selector.
6. C a d a sentencia, excepto la l t i m a , d e b e n ir seguidas de p u n t o y c o m a .
Diagrama

de sintaxis

de case

sentencia case

< X

Ejemplo 4 . 1 3
case Caracter of
Write ('es una vocal');
'0' . . '9'
Write ('es una cifra');
Write ('es un codigo de control)
#0..#31
else
Write ('es otro caracter diferente')
end
Ejemplo 4 . 1 4
El segmento de programa siguiente desplaza el cursor en la pantalla. El usuario pulsa la
tecla S' para "subir", 'B' para "bajar", 'D' para "derecha", T para "izquierda" y 'P' para
"parar" (stop).
x := 40;
y := 10;
read (ch);
case ch of
S ' Y := Y
Y := Y
'B'
' D ' X := X
' I ' X := X
' P ' exit
end;
GotoXY (X, Y);
Write ('*');

{posicion inicial horizontal}


{posicion inicial vertical }
+
+
-

{el cursor se posiciona en (x, y)}


{un * se visualiza en la posicion x, y}

Este e j e m p l o se p u e d e m o d i f i c a r , para c o n t e m p l a r el caso d e q u e la e n t r a d a no sea


n i n g u n a de las teclas s, B, D, I o P. E n este caso, la c o m p u t a d o r a e m i t i r u n pitido ( b i p ) .

O
parte else

133

^ e l s e j-

Ejemplo 4 . 1 1
Write ('Introduzca un valor');
ReadLn (Valor);
case Valor of
'+' : Resultado := Resultado
'-' : Resultado := Resultado
: Resultado := Resultado
'/' : Resultado := Resultado
end;

+
*
/

Ejemplo 4 . 1 2
case Caracter_leido of
'0'-. ' 9 ' : Write ('cifra');
'a'..'z' : Write ('minuscula');
'A'..'Z' : Write ('mayuscula')
end;

program cursor;
uses
Crt;
var
X, Y : integer;
Ch
: char;
begin
ClrScr;
X := 40;
Y := 10;
GotoXY (X,Y ) ;
Write ('*');
repeat
Ch := ReadKey;
GotoXY (X,Y);
Write ( ' ' ) ;
case Ch of
'S' : Y := Y - 1;
'B' : Y := Y + 1;

134

Programacin en Turbo/Borland Pascal 7


' : X := X + 1;
' I ' : X := X - 1;
P' : Exit
else
write (Chr(7))
end;
GotoXY ( X , Y ) ;
write ( ' * ' )
until Ch = 'P'
end.

Estructuras de control selectivas

'D

4.6.

ReadLn (seleccin);
case seleccin of
'N', 'n' : begin
Write ('su nombre:');
ReadLn (nombre)
end;
' D ' , 'd' : begin
Write ( ' s u direccin es;');
ReadLn (direccin)
end;
'T', 't' : begin
Write ('su telefono es;');
ReadLn (telefono)
end
' f * : {no hace nada}
else

emisin de un pitido

escribe un * en la posicin x, y

COMPARACION DE SENTENCIAS I F ANIDADAS Y CASE

Se p u e d e n utilizar sentencias i f a n i d a d a s , en lugar de la s e n t e n c i a case p a r a realizar u n a


decisin de a l t e r n a t i v a mltiple. L a sentencia case, sin e m b a r g o , es m s legible y se utilizar s i e m p r e q u e sea prctica.
C o n s i d e r e m o s el e j e m p l o a n t e r i o r resuelto m e d i a n t e s e n t e n c i a s i f a n i d a d a s .
x: =40;
y:=10;
Read (ch) ;
if ch='S' then y:=y-l
else if ch='B' then y:=y+l
else if ch:='D' then x:=x+l
else if ch='I' then x:=x-l
else if ch='P' then Exit;
GotoXY (x,y);
Write ('*');

end

WriteLn ('eleccin no valida')


{fin de case}

Problema 4 . 3
Escribir un programa que permita jugar a adivinanzas.
El usuario tiene que elegir un
nmero de un solo dgito. El programa tiene que pedir si el nmero es par o impar, y el
resto cuando el nmero se divide entre 5. A partir de esta informacin se debe determinar
el nmero.
Anlisis
Programa Adivinanza

4.6.1.

Los mens

Los p r o g r a m a s d e b e n p r e s e n t a r c o n m u c h a f r e c u e n c i a m e n s . U n men es u n c o n j u n t o
de opciones q u e se p r e s e n t a al usuario, e n t r e las cuales d e b e elegir u n a d e ellas. D e p e n d i e n d o de la decisin se realizarn u n a serie de acciones.
U n m e n p u e d e ser, p o r e j e m p l o :
N:
D:
T:
C:
F:

Nombre del cliente


Direccin
Telfono
Ciudad
Fin

El p r o g r a m a c o r r e s p o n d i e n t e d e b e p e r m i t i r elegir u n a o p c i n N, D, T, C o F. L a opcin se d e b e asignar a u n a variable Seleccin de tipo char. El u s u a r i o p u e d e i n t r o d u c i r


u n a letra m a y s c u l a o m i n s c u l a .

135

O b t e n e r dgito del usuario


Pedir si el dgito es p a r o i m p a r
Pedir el resto de dividir p o r 5
A d i v i n a r el dgito
dgito

paridad

0
2
4
6
8
1
3
5
7
9

0
2
4
1
3
1
3
0
2
4

resto mod 5
par
par
par
par
par
impar
impar
impar
impar
impar

Estructuras de control selectivas

Programacin en Turbo/Borland Pascal 7

136

2. Las cantidades reales que son algebraicamente


iguales pueden producir un valor lgico falso cuando se comparan con =, ya que la mayora de los valores reales no se
almacenan
exactamente.
Por e j e m p l o , a u n q u e las expresiones reales x * (1/x) y 1.0
son algebraicamente iguales, la expresin lgica x * (1/x) = 1.0 es n o r m a l m e n t e falsa.
3. E n u n a sentencia i f - t h e n - e l s e n o p u e d e a p a r e c e r un p u n t o y c o m a i n m e d i a t a m e n t e
a n t e s de el se. U n a sentencia tal c o m o

Programa
program Adivinanza (input,output);
const
Impar = 0;
Par
= 1;
var
Digito, Paridad, Mod5, Sudigito : integer;
begin
WriteLn ('Elija un digito (0-9)');
ReadLn (Digito);
WriteLn ('Es el digito par o impar?');
WriteLn ('Teclee 0 si es impar y 1 si es par');
ReadLn (Paridad);
Mod5 := Digito mod 5;

if x>0 then
WriteLn (x);
else
WriteLn (2*x)
p r o d u c e u n error. U n p u n t o y c o m a a c o n t i n u a c i n d e then o e l s e c o m o en
if x>0 then;
WriteLn (x);

case Paridad of
Par
: case Mod5 of
0: Sudigito := 0;
1: Sudigito := 6;
2: Sudigito := 2;
3: Sudigito ;= 8;
4: Sudigito := 4
end;
Impar : case Mod5 of
0: Sudigito := 5 ,1: Sudigito := 1;
2: Sudigito := 7;
3: Sudigito := 3;
4: Sudigito := 9
end
end;
WriteLn ('Su digito es ', Sudigito)
end.

4.7.

o bien en

es s i n t c t i c a m e n t e correcto (sentencia vaca), p e r o p r o d u c i r con seguridad u n error,


ya q u e i n d i c a u n a sentencia vaca. E n a m b o s e j e m p l o s , la sentencia WriteLn(x) se ejecuta, con i n d e p e n d e n c i a de q u e x sea positiva o n o . No utilizar puntos y comas antes
0 despus de las palabras reservadas then o e l s e en una sentencia i f .
4. Las estructuras de seleccin mltiple pueden ser realizadas
ms eficientemente
con
una sentencia case o una sentencia compuesta
if que con una secuencia de sentencias
1 f. P o r e j e m p l o , u t i l i z a n d o las s e n t e n c i a s

Tcnicas de programacin
deben ser utizados
dentro de expresiones
lgicas para
que se evalan primero. L a p r i o r i d a d de o p e r a d o r e s es

not
*,/,div,mod,and
+,-,or
< , > , =,< =, > = , < >

if x>0 then
x := abs(x)
else;
WriteLn(x);

PUESTA A PUNTO DE PROGRAMAS

1. Los parntesis
subexpresiones

indicar

las

prioridad ms alta (se ejecuta primero)


prioridad ms baja (se ejecuta ltimo)

if Nota<60 then
Resultado := 'F';
if (Nota>60) and (Nota<73) then
Resultado :='D';
if (Nota>70) and (Nota<80) then
Resultado := 'C';
if (Nota>80) and (Nota<90) then
Resultado :='B';
if Nota>=90 then
Resultado :='A';
es m e n o s eficiente q u e

la sentencia
if (1 < X and X < 10) then WriteLn (X)

donde x es de tipo reai

p r o d u c i r u n error de *1Ilegal types of operandfs)* ya q u e la s u b e x p r e s i n X and x n o es


u n a expresin lgica. S u b s a n e el e r r o r a a d i e n d o parntesis ) antes del and y u n p a r n tesis ( despus.

137

if Nota < 60
then Resultado : = ' F '
else if Nota
70
then Resultado := 'D'

138

Programacin

en Turbo/Borland

Estructuras

Pascal 7

e l s e i f Nota < 80
then R e s u l t a d o := 'C'
e l s e i f Nota < 90
then R e s u l t a d o := 'B'
else R e s u l t a d o := 'A;

de control

En este texto, se utilizarn las siguientes notaciones para escribir las sentencias consideradas en este captulo:
Modelos sentencia i f - t h e n - e l s e
1.
i f expl > < o p e r a d o r de relacin exp2 then
sentenciasl
else
sentencias2;
if x<0 then
WriteLn ( ' e l v a l o r de x e s menor que c e r o ' )
else
WriteLn ( ' e l v a l o r de x e s c e r o o p o s i t i v o 1

> 0 then
> 0 then
X + Y
X + abs(Y);
X * Y * Z;

2.
if expl operador de relacin expl
then
sentencias]
else
sentencias2;

Con cul if est asociada else? De acuerdo a estas reglas, estas sentencias se ejecutan c o m o
if X > 0
if Y >
Z :=
else
Z :=
W := X *

then
0 then
X + Y

if x<0
then
WriteLn ( ' e l v a l o r de x e s menor que c e r o ' )
else2
WriteLn ( ' e l v a l o r de x e s c e r o o p o s i t i v o ' )

X + Abs (Y);
Y * Z;

Modelos sentencia i f - t h e n
Errores tpicos d e p r o g r a m a c i n
El error ms frecuente es debido al uso incorrecto de los p u n t o s y comas en la sentencia
i f . Se deben utilizar puntos y comas slo para separar las sentencias de una sentencia
compuesta dentro de una sentencia i f. Se necesita un punto y coma despus de i f cuando
le siguen ms sentencias.
N o utilizar nunca puntos y comas antes o despus de las palabras reservadas then o
el se en una sentencia i f.
if s a l a r i o < 400 then
WriteLn ( ' c o n s i d e r a r a t r a s o s ' ) ;
else
WriteLn ( ' y s i n o a d e l a n t o s ' )
Ai ejecutar la sentencia anterior se produce un error debido al p u n t o y coma.

139

Estilo d e programacin

5. En una sentencia case el valor del selector debe ser de tipo ordinal (no real ni de tipo
estructurado).
6. En una sentencia if anidada, cada clusula else debe concordar con la if precedente
ms prxima. Por ejemplo, considere la siguiente sentencia que se escribe intencion a d a m e n t e sin sangrado:
if X
if Y
Z :=
else
Z :=
W :=

selectivas

1.
i f expl operador de relacin expl then
sentencia;
2.
if expl operador de relacin expl then
sentencia compuesta;
i f x>0 then
WriteLn ( ' e l v a l o r de x e s mayor que c e r o ) ;
if X > 0
then WriteLn ( ' E l v a l o r de X e s mayor que c e r o ' ) ;

140

Estructuras

Programacin en Turbo/Borland Pascal 7

Sentencia

compuesta

(begin-end)

begin
sentencia
sentencia

1;
2;

sentencia

n;

1. if x>0 then
begin
WriteLn ( ' p r i m e r o ' ) ;
WriteLn ( ' s e g u n d o ' ) ;
WriteLn ( ' t e r c e r o ' ) ;
end
2. if SW then
WriteLn ( ' H o l a M o r t i m e r ' )
else
begin

end

end;

Modelos

sentencia

selectivas

141

A b s o l u t o x := 0 . 0
end
begin
WriteLn ( ' p o s i t i v o ' ) ;
A b s o l u t o x := x
end

RESUMEN
Este captulo trata sobre el modo de realizar las tomas de decisiones en Pascal. Las estructuras utilizadas son las conocidas como selectivas. Dos son las sentencias bsicas que codifican las estructuras citadas: i f - t h e n - e l se (permite la eleccin de una alternativa a seguir, a seleccionar entre dos
propuestas, normalmente de carcter opuesto) case (permite la eleccin de una alternativa a seguir, a seleccionar entre varias propuestas).
Aunque los diagramas de sintaxis ya han sido citados en el captulo anterior, aqu se citan los
correspondientes a las estructuras selectivas, que pueden servir para ayudar a prevenir errores.

(PROBLEMAS RESUELTOS

case

c a s e selector o
lista_etiquetas

1 .sentencia

1;

listajetiquetas

n:sentencia

c a s e selector of
lista_etiquetas
1 -.sentencia 1;

listajetiquetas
else
lista_etiqueta
end;

end ( * c a s e )

Aplicaciones
1. if x o O . O
then P r o d u c t o := P r o d u c t o * x
2. i f

de control

x>0 . o
then W r i t e L n ( x : 4 : 2 ,
else W r i t e L n ( x : 4 : 2 ,

'es positivo')
'es negativo')

3. if x < 0 . 0 then
begin
WriteLn ( ' n e g a t i v o ' ) ;
A b s o l u t o x := - x
end
else if x = 0 . 0 then
begin
WriteLn ( ' c e r o ' ) ;

n:sentencia
x:sentencia

n
x

1. La fecha de Pascua corresponde al primer domingo despus de la primera luna llena que sigue
al equinocio de primavera, y se calcula con las siguientes expresiones:
A
B
C
D
E
N

= ao mod 19
= ao mod 4
= ao mod 7
= (19 * A + 24) mod 30
= ( 2 * B + 4 * C + 6 * D + 5) mod 7
= (22 + D + E)

en el que N indica el nmero del da del mes de marzo (o abril si N es superior a 31) correspondiente al domingo de Pascua. Realizar un programa que determine esta fecha para aos comprendidos entre 1986 y 2000.
program P a s c u a ;
uses
Crt;
var
Anno
: integer;
{ ao de c a l c u l o }
A,B,C,D,E : i n t e g e r ;
{ variable auxiliar }
Dia
: integer;
{ d i a de P a s c u a }
begin
ClrScr;
Write ( ' C u a l es e l ao? ' ) ;
ReadLn ( A n n o ) ;

:= Anno mod 1 9 ;
B
:= Anno mod 4 ;
C
:= Anno mod 7 ;
D
:= (19 * A + 24) mod 3 0 ;
E
:= ( 2 * B + 4 * C + 6 * D + 5) mod 7;

142

Programacin

en Turbo/Borland

Pascal 7

Estructuras

D i a := 22 + D + E;
W r i t e ( ' L a f e c h a d e l domingo d e P a s c u a de ' , A n n o ,
if D i a <= 31
then
WriteLn (Dia, ' de m a r z o ' )
else
W r i t e L n ( D i a - 3 1 , ' de a b r i l ' )
end.

' es:

');

2. Escribir un programa que determine si un ao es bisiesto. Un ao es bisiesto si es mltiplo de 4


(por ejemplo, 1984). Los aos mltiplos de 100 no son bisiestos, salvo si ellos son tambin
mltiplos de 400 (2000 es bisiesto, 1800 no lo es).
program B i s i e s t o ;
uses
Crt ;
var
Anno
: integer;
EsBisiesto : boolean;
begin
ClrScr;
W r i t e ( ' C u a l es e l ao? ' ) ;
ReadLn ( A n n o ) ;
E s B i s i e s t o := f a l s e ;
if Anno mod 4 = 0
then
E s B i s i e s t o := t r u e ;
if (Anno mod 100 = 0) and (Anno mod 400 o
then
E s B i s i e s t o := f a l s e ;
W r i t e ( ' E l ao ' , A n n o ) ;
if E s B i s i e s t o
then
WriteLn (' es B i s i e s t o ' )
else
W r i t e L n ( ' no e s B i s i e s t o ' )
end.

program L e t r a p r i m e r a ;
{ encontrar e imprimir la primera l e t r a }
var
C h l , Ch2, Ch3, P r i m e r a l e t r a : c h a r ;
begin
Write ( ' I n t r o d u c i r t r e s l e t r a s cualesquiera ' ) ;
ReadLn ( C h l , C h 2 , C h 3 ) ;
if Chl < Ch2
then
P r i m e r a l e t r a := C h l
else
P r i m e r a l e t r a := Ch2;
if Ch3 < P r i m e r a l e t r a
then
P r i m e r a l e t r a := Ch3;
W r i t e L n ( P r i m e r a l e t r a , ' p r i m e r a l e t r a en o r d e n a l f a b t i c o ' )
end.

1. Cul es la salida del siguiente programa?

3. Leer tres letras y encontrar y visualizar aquella que viene primero en el alfabeto.
La condicin 'A' < 'F' es true porque A precede a F
Especificaciones
Especificaciones

Programa

EJERCICIOS

0)

de entrada: l e t r a s ( c h l , ch2, ch3: char)


de salida: Primera l e t r a : char;

Algoritmo
1. Leer las t r e s l e t r a s : c h l , ch2, ch3
2. Guardar en PrimeraLetra, las l e t r a s alfabticamente
2.1. Guardar la primera l e t r a chl o ch2 en PrimeraLetra
2.2. Guardar en PrimeraLetra, la l e t r a primera en orden a l f a b t i c o
3. Imprimir la primera l e t r a por orden a l f a b t i c o

de control selectivas

X := 3 ;
if 2 > X
then W r i t e L n ( ' P r i m e r o ' )
else W r i t e L n ( ' S e g u n d o ' ) ;
if 4 > X
then W r i t e L n ( ' T e r c e r o ' ) ;
WriteLn ( ' C u a r t o ' )
2. Qu valores toman las siguientes expresiones?
a) (24 mod 12) o
b) 'H' < = 'M1

c) ' s' = 1S'


d) - 1 2 < = maxint

3. Cul es la salida producida por el siguiente cdigo?


if true
then W r i t e ( ' P r i m e r o ' )
else W r i t e L n ( ' S e g u n d o ' ) ;
x : = ( l < 2 ) and (4<3);
if x
then
WriteLn ( ' T e r c e r o ' )
else
WriteLn ( ' C u a r t o ' )

143

14 4

Programacin

en Turbo/Borland

Pascal 7

Estructuras

4. Escribir un programa que lea tres enteros y emita un mensaje que indique si estn o no en
orden numrico.
5. Escribir una sentencia if-then-else que clasifique un entero x en una de las siguientes categoras y escriba un mensaje adecuado:
x < 0

o bien

0 < x < 100

o bien

7. Se trata de escribir un programa que clasifique enteros ledos del teclado de acuerdo a los
siguientes puntos: 1. Si es 30 o mayor, o negativo, visualizar un mensaje en ese sentido; en caso
contrario, si es un nuevo primo, potencia de 2, o un nmero compuesto, visualizar el mensaje
correspondiente; si son cero o 1, visualizar 'cero' o 'unidad'.
8. Escribir un programa que lea dos nmeros y visualice el mayor.
9. Codificar un programa que determine el mayor de tres nmeros.

1. Cuatro enteros entre 0 y 100 representan las puntuaciones de un estudiante de un curso de


informtica. Escribir un programa para encontrar la media de estas puntuaciones y visualizar
una tabla de notas de acuerdo al siguiente cuadro:

2. La fuerza de atraccin entre dos msas, m, y m 2 , separadas por una distancia d, est dada por la
formula:

5.0
6.5
8.5
10

G m^mj

d2

G = 6.673 x 10~8 cm 3 /g
mod 7

11. Codificar un programa que escriba la calificacin correspondiente a una nota, de acuerdo con
el siguiente criterio:
<
<
<
<

A
B
C
D
E

donde G es la constante de gravitacin universal

donde N indica el nmero de da del mes de marzo (si .V es igual o menor que 31) o abril (si
es mayor que 31). Construir un programa que determine fechas de domingos de Pascua.

a
a
a
a

Puntuacin

90-100
80-89
70-79
60-69
0-59

10. El domingo de Pascua es el primer domingo despus de la primera luna llena posterior al equinoccio de primavera, y se determina mediante el siguiente clculo sencillo:

0
5
6.5
8.5
10

145

PROBLEMAS

Media

= ao mod 19
= ao mod 4
= ao mod 7
= (19 * A + 24) mod 30
= (2*B + 4*C + 6*D+5)
= (22 + D + E)

selectivas

x > 100

6. Escribir un programa que introduzca el nmero de un mes (1 a 12) y visualice el nmero de


das de ese mes.

A
B
C
D
E
N

de control

Suspenso
Aprobado
Notable
Sobresaliente
Matrcula de honor

12. Determinar si el carcter asociado a un cdigo introducido por teclado corresponde a un carcter alfabtico, dgito, de puntuacin, especial o no imprimible.

seg2

Escribir un programa que lea la masa de dos cuerpos y la distancia entre ellos y a continuacin obtenga la fuerza gravitacional entre ella. La salida debe ser en dinas; un dina es igual
a g cm/seg-,
3. La famosa ecuacin de Einstein para conversin de una masa m en energa viene dada por la
frmula
E = cm 3

c es la velocidad de la luz
c = 2.997925 x 1010 m/sg

Escribir un programa que lea una masa en gramos y obtenga la cantidad de energa producida
cuando la masa se convierte en energa.
Nota: Si la masa se da en gramos, la frmula produce la energa en ergios.
4. La relacin entre los lados (a,b) de un tringulo rectngulo y la hipotenusa (h) viene dada por
la frmula
a2 + b2 = h2
Escribir un programa que lea la longitud de los lados y calcule la hipotenusa.
5. El rea de un tringulo cuyos lados son a, b, y c se puede calcular por la frmula
A = V P(P ~ a)(P ~ b)(P - c)
donde p = (a + b + c)/2. Escribir un programa que lea las longitudes de los tres lados de un
tringulo y calcule el rea del- tringulo.

1 4 6

Programacin

en Turbo/Borland

Pascal

147

6. Escribir un programa que lea la hora de un da de notacin de 24 horas y la respuesta en


notacin de 12 horas. Por ejemplo, si la entrada es 13:45, la salida ser

13. Un sistema de ecuaciones lineales:


ax + by= c
dx + ey =/

1:45 PM
El programa pedir al usuario que introduzca exactamente cinco caracteres. As, por ejemplo,
las nueve en punto se introduce como

se puede resolver con las siguientes frmulas:


x = (ce - b f ) / (ae - bd)
y = [af- cd) / [ae - bd)

09:00
7. Escribir un programa que acepte fechas escritas de modo usual y las visualice como tres
nmeros. Por ejemplo, la entrada

Disear un programa que lea los coeficientes a, b, c, e, d y / y muestre los valores de x e y.

15, Febrero 1989

14. Escribir un programa que determine si un ao es bisiesto. Un ao es bisiesto si es mltiplo de


4 (por ejemplo 1984). Sin embargo, los aos mltiplos de 100 slo son bisiestos cuando a la
vez son mltiples de 400 (por ejemplo, 1800 no es bisiesto, mientras que 2000 s lo ser).

15 2 1989

15. Escribir un programa que calcule el nmero de das de un mes, dados los valores numricos
del mes y el ao.

producir la salida

8. Escribir un programa que acepte un nmero de tres dgitos escrito en palabra y a continuacin los visualice como un valor de tipo entero. La entrada se termina con un punto. Por
ejemplo, la entrada

Horas Semanales trabajadas < 38 a una tasa dada.


Horas extras (38 o ms) a una tasa 50 por 100 superior a la ordinaria.
Impuestos 0 por 100, si el salario bruto es menor o igual a 50.000 pesetas.
Impuestos 10 por 100, si el salario bruto es mayor de 50.000 pesetas.

doscientos veinticinco

producir la salida
225

17. Determinar el menor nmero de billetes y monedas de curso legal equivalentes a cierta cantidad de pesetas (Cambio ptimo).

9. Escribir un programa que lea el radio de un crculo y a continuacin visualice, circunferencia


del crculo, rea del crculo o dimetro del crculo.
10. Escribir un programa que acepte un ao escrito en citras arbigas y visualice el ao escrito en
nmeros romanos, dentro del rango 1000 a 2000.
Nota: Recuerde que V = 5

X = 10

IV = 4
XL = 40
MCM=1900
MCML=1950
MCMLXXXIX = 1989

L = 50 C = 100

16. Se desea calcular el salario neto semanal de los trabajadores de una empresa de acuerdo a las
siguientes normas:

D = 500

CM = 900
MCMLX=1960

M = 1000
MCMXL=1940

11. Un archivo de dados contiene los cuatro dgitos, A, B, C, D, de un entero positivo N. Se desea
redondear N a la centena ms prxima y visualizar la salida. Por ejemplo, si A. es 2, B es 3, C
es 6 y D es 2, entonces N ser 2362 y el resultado redondeado ser 2400. Si N es 2342, el
resultado ser 2300, y si N = 2962, entonces el nmero ser 3000. Disear el programa correspondiente.
12. Un archivo contiene dos fechas en el formato da (1 a 31), mes (1 a 12) y ao (entero de cuatro
dgitos), correspondientes a la fecha de nacimiento y la fecha actual, respectivamente. Escribir
un programa que calcule y visualice la edad del individuo. Si es la fecha de un beb (menos de
un ao de edad), la edad se debe dar en meses y das; en caso contrario, la edad se calcular en
aos.

18. Construir un programa que indique si un nmero introducido por teclado es positivo, igual a
cero, o negativo.

Estructuras

CAPITULO

ESTRUCTURAS DE CONTROL
REPETITIVAS
El concepto de bucle
La sentencia w h i l e
Diseo de bucles
Terminacin de los bucles
La sentencia r e p e a t
Comparacin de los bucles w h i l e y r e p e a t
La sentencia f o r
Bucles anidados
Sentencias de control incondicional
Eleccin de la estructura repetitiva adecuada
Optimizacin de bucles
Puesta a punto de programas

RESUMEN
PROBLEMAS RESUELTOS
EJERCICIOS
PROBLEMAS
Las computadoras estn especialmente preparadas para ejecutar tareas repetidamente. Los clculos simples o la manipulacin de pequeos conjuntos de datos se pueden realizar fcilmente a mano,
pero las tareas grandes o repetitivas son realizadas con mayor eficiencia por una computadora.
Como se vio en el Captulo 1, las estructuras de control repetitivas son aqullas en las que una sentencia o grupos de sentencias se
repiten muchas veces. Este conjunto de sentencias se denomina bucle (loop). En este captulo se introducen las estructuras de control
repetitivas disponibles en el lenguaje Turbo Pascal; asimismo s e describen un conjunto de tcnicas para disear algoritmos y programas
que utilicen bucles.

5.1.

EL C O N C E P T O DE BUCLE

Una estructura de control que permite la repeticin de una serie determinada de sentencias se d e n o m i n a bucle ' (lazo o cicl).
1

U S

En ingls, loop.

repetitivas

149

El cuerpo del bucle contiene las sentencias que se repiten. Pascal proporciona tres
estructuras o sentencias de control para especificar la repeticin: while, repeat y for.
Supongamos que se desea leer una lista de n m e r o s desde el teclado y sumar sus valores. Para realizar esta suma se utiliza una variable llamada Suma. La variable Suma se
pone a cero, y a continuacin, cada vez que lea u n nmero, Suma se incrementa aadindole ese nmero. Despus de inicializar Suma a cero, el programa ejecutar acciones equivalentes:
Suma
Read
Suma
Read
Suma
Read
Suma

CONTENIDO
5.1.
5.2.
5.3.
5.4.
5.5.
5.6.
5.7.
5.8.
5.9.
5.10.
5.11.
5.12.

de control

: = 0;
(Numero);
:= Suma + Numero
(Numero);
:= Suma + Numero
(Numero);
:= Suma + Numero

En otras palabras, el programa repite lo siguiente para cada nmero ledo y sumado:
Read (Numero);
Suma := Suma + Numero;

Tales acciones repetidas se llaman bucles. La accin o acciones que se repiten en un


bucle se denomina el cuerpo del bucle, y cada repeticin del cuerpo del bucle se denomina iteracin. Las dos principales preguntas a responder son: cul es el cuerpo del bucle?,
y cuntas veces se repetir? Para contestar a estas preguntas, volvamos al ejemplo de la
suma de una lista de nmeros.
Cuando se utiliza un bucle para sumar una lista de nmeros, necesitamos determinar
cuntos nmeros a sumar. Se precisa algo para detener el bucle. En este primer ejemplo
solicitaremos al usuario cuntos nmeros hay, y a continuacin iterar el bucle ese nmero de veces. A fin de contar el nmero de iteraciones, utilizaremos una variable llamada
Contador, que se iiiicializar a cero y se incrementar en u n o cada vez que se realiza u n a
iteracin. Esta sentencia ser:
C o n t a d o r := C o n t a d o r + 1

Ejemplo 5 . 1
Algoritmo

para sumar N nmeros.


e s c r i b i r ('cuantos nmeros t i e n e la l i s t a ? ' )
Leer (N)
Contador-* 0 |Suma de N elementos}
Suma
-<0 i n i c i a l i z a r v a r i a b l e Sumaj
comienzo del bucle)
repetir lo s i g u i e n t e mientras Contador < N

150

Programacin

en Turbo/Borland

Estructuras

Pascal 7

Leer (Numero)
Suma - Suma + Nmero
Contador < Contador +1
fin_repetir
{ f i n d e l bucle}
escribir ( ' l a suma de
N, 'nmeros e s ' ,

5.2.

de control

repetitivas

151

Suma)

LA SENTENCIA WHILE

while expresin lgica do


sentencia;

La estructura repetitiva while (mientras) es aquella en la que el n m e r o de iteraciones no


se conoce por anticipado y el cuerpo del bucle se repite mientras se cumple una determinada condicin. Por esta razn, a estos bucles se les d e n o m i n a bucles condicionales.
El diagrama de flujo y el pseudocdigo de la sentencia while se muestran en la Figura 5.1.
Cuando la sentencia while se ejecuta, la primera cosa que sucede es la evaluacin de
la expresin lgica. Si se evala a falso (false), ninguna accin se realiza y el programa
prosigue en la siguiente sentencia despus del bucle. Si la expresin lgica se evala a
verdadero (true), entonces se ejecuta el cuerpo del bucle y se evala de nuevo ^la expresin. Este proceso se repite mientras que la expresin lgica permanezca verdadera. Despus de cada iteracin, la expresin lgica se evala y se verifica de nuevo, y si es verdadera, el bucle se repite de nuevo; si cambia de verdadera a falsa, la sentencia while
finaliza y el programa prosigue en la siguiente sentencia del programa.
La sintaxis y el formato de la sentencia while se indican en la Figura 5.2.
REGLAS DE FUNCIONAMIENTO
1. La condicin (expresin lgica) se evala antes y despus de cada ejecucin del
bucle. Si la condicin es verdadera, se ejecuta el bucle, y si es falsa, el control pasa
a la sentencia siguiente al bucle.
mientras condicin hacer
sentencia/s
fin_mentras
condicin

while expresin lgica do


begin
sentencia 7
cuerpo del
bucle

sentencia simple

sentencia c o m p u e s t a

sentencia n
end;

Figura 5.2. Sentencia w h i l e : a) diagrama de sintaxis; b) formato con una sentencia; c) formato con varias sentencias (sentencia compuesta).
2. Si la condicin se evala a falso cuando se ejecuta el bucle por primera vez, el
cuerpo del bucle no se ejecutar nunca. En este caso se dice que el bucle se ha
ejecutado cero veces.
3. Mientras la condicin sea verdadera el bucle se ejecutar. Esto significa que el
bucle se ejecutar indefinidamente a menos que "algo" en el interior del bucle
modifique la condicin haciendo que su valor pase a falso. Si la expresin nunca
cambia de valor, entonces el bucle no termina nunca y se denomina bucle infinito/
o sin fin (en general, esta situacin no es deseable).

expresin lgica
o relacional

Ejemplo 5 . 2

b)

Calcular la suma de una lista de nmeros enteros ledos del teclado.


El bucle del ejemplo 5.1 se puede resolver con la sentencia while.

a)
Figura 5.1. Bucle while: a) diagrama de flujo; b) pseudocdigo.

program Sumar;
{Calculo de la suma de N nmeros enteros}
var
N, Contador, Numero, Suma : integer;

1 52

Programacin

en Turbo/Borland

Pasca! 7

begin
WriteLn ( ' E s t e programa suma n m e r o s ' ) ;
WriteLn ( ' C u a n t o s nmeros e n t e r o s d e s e a s u m a r ? ' ) ;
ReadLn (N);
WriteLn ( ' T e c l e e l o s ' , N , ' nmeros e n t e r o s ' ) ;
Contador := 0;
Suma
:= 0;
while C o n t a d o r < N do
begin
Read (Numero);
suma := Suma + Numero;
c o n t a d o r := c o n t a d o r + 1
end;
WriteLn ( ' L a suma de l o s ' , N , ' nmeros e s
Suma)
end.
Una ejecucin de prueba:
E s t e programa suma nmeros
Cuantos e n t e r o s d e s e a sumar?
3
T e c l e e l o s 3 nmeros e n t e r o s
8 6 4
La suma de l o s 3 nmeros e s 18

Estructuras

5.3.1.

while Contador <- 30 do

DISEO DE BUCLES

El diseo correcto de bucles es una de las tareas ms complejas a realizar en un programa, debido esencialmente a la gran cantidad de bucles que existirn en la mayora de los
programas. Existe una serie de reglas que es preciso conocer y seguir si se desean diseos
de bucles sin errores.

153

Variables no inicializadas

Suma := Suma + Numero


producir un resultado impredecible a menos que a la variable Suma se la asigne un
valor inicial fuera del bucle. A qu valor se debe inicializar? Depender de cada situacin, pero valores tpicos suelen ser 0 y 1.
Suma de N nmeros
Read (N);
Suma
:= 0;
Contador := 0;
while C o n t a d o r < N do
begin
Read (Numero);
Suma
:= Suma + Numero;
Contador := Contador + 1
end;

Producto de N nmeros
Read (N);
P r o d u c t o := 1;
C o n t a d o r := 0;
while C o n t a d o r < N do
begin
Read (Numero);
P r o d u c t o := P r o d u c t o * Numero;
Contador := Contador + 1
end;

El problema de la inicializacin se puede producir a u n q u e no est la sentencia en el


interior del bucle, como puede ser en la condicin del bucle o en cualquier sentencia de
asignacin. Cada variable debe tener explcitamente un valor antes de que pueda aparecer en el lado derecho de una sentencia de asignacin o en cualquier parte en donde se
espera u n valor. Por ejemplo, si en la condicin Contador < N, N no tuviera valor n o
existiera Read (N), al compilar el programa se producir un error.

5.3.2.
5.3.

repetitivas

Turbo Pascal, al contrario que Pascal estndar, inicializa las variables por defecto cuando no les han sido asignado valores previamente mediante sentencias read o de asignacin. As las variables de tipo numrico se iniciaiizan a cero, las variables de tipo
boolean a false y las variables de tipo string a cadena vaca.
Esta prctica no es buena y se recomienda siempre cmo exige Pascal estndar la
inicializacin de las variables mediante las sentencias read o de asignacin antes de
poder ser utilizadas.
De igual modo, cuando en un bucle se manipulan variables, es preciso inicializarlas si
se les invoca en sentencias de asignacin o escritura para evitar errores al compilar o
ejecutar el programa. As, en el ejemplo 5.2, una sentencia tal c o m o

S a n g r a d o d e la s e n t e n c i a while

Paia aumentar la legibilidad y claridad de un bucle while, el cucipo del bucle se debe sangrai
respecto de la palabra while y begin en su caso. A veces es conveniente terminar el bucle con
una llave i|iie mulenga la palabra while paia indicar que es el fin de la sentencia.

de control

Bucles infinitos

Algunos bucles no exigen terminacin. Por ejemplo, un sistema de reservas de aviones


comerciales puede repetir simplemente un bucle que permita al operador aadir o borrar
reservas. El programa y el bucle se ejecutan continuamente, o al menos hasta que la
computadora se desconecta o se rompe el control del programa. Sin embargo, lo ms
frecuente es que un bucle se disea para calcular un valor o una lista de valores y finaliza
despus de encontrar dichos valores. U n bucle que se repite continuamente y no se
termina nunca se llama bucle infinito. Los bucles infinitos no intencionados se deben
evitar normalmente.

154

Programacin

en Turbo/Borland

Pascal 7

Supongamos el siguiente bucle:


Contador := 10;
While C o n t a d o r <> 20 do
begin
Read (Numero);
Suma := Suma + Numero;
Contador := C o n t a d o r + 2
end;
Este bucle se termina cuando Contador = 20; sin embargo, si en lugar de incrementar
Contador en 2 se hace en 3,
Contador := C o n t a d o r + 3
E! contador pasar por los valores 10, 13, 16, 19, 2 2 , e s decir, nunca pasa por el
valor 20; por consiguiente, el bucle no se termina nunca, es infinito.
Como regla general, es ms seguro terminar un bucle con una prueba que simplifique
comparaciones mayor que o menor que en lugar de probar igualdades o desigualdades.
Ya que los valores reales se almacenan como cantidades aproximadas, las comparaciones de igualdad de nmeros reales no tienen sentido. Siempre que compare valores
reales, utilice los operadores < , < = , > , o bien > = .

Estructuras

de control

repetitivas

155

En general, existen dos mtodos para controlar o terminar un bucle: bucles controlados por contador (bucles de conteo) y bucles condicionales.

5.4.1.

Bucles controlados por contador

Un bucle controlado por contador es un bucle cuyas iteraciones se controlan por una
variable cuyo valor representa a un contador. El mecanismo utilizado es una variable de
control del bucle que acta como contador.
Un bucle controlado por contador consta de tres partes, adems del cuerpo y de la
condicin de salida.
Inicializacin de la variable de control del bucle.
Comprobacin del valor de la variable de control del bucle.
Incremento del valor de la variable de control del bucle.
El formato de estos bucles es:
1. Establecer variable contador a un valor inicial
2. while variable contador < valor final do
begin

Precauciones
incrementar variable contador en 1

I I.a condiuon lgica en un bucle while debe tcnei un valor la primera vez que se evala:
en caso contrario el programa abortar (se detendr) al ejecutarse while
2. I acondicion lgica en un bucle while debe ser modificada por u tu sentencia en el cuerpo
del huele; en caso contrario, el bucle es infinito.
?. Hs posible que el euerpo del bucle no se ejecute nunca. Esto suceder si la eondicion
lgica es falsa la primera \ e / que se evala.

end

Se utiliza un bucle controlado por contador cuando se puede anticipar con antelacin cuntas iteraciones se deben ejecutar exactamente. Cada vez que el cuerpo de un
bucle se ejecuta, el valor del contador se incrementa en 1.
Ejemplo 5 . 3

Otros ejemplos de bucles infinitos


1. w h i l e Y < 10 do
X := X + 1;
2. X := 15;
w h i l e X < 10 do
X := X + 1;

{variable incorrecta}

como .v no es menor que 10, el cuerpo del bucle no se ejecuta nunca.

5.4.

TERMINACION DE LOS BUCLES

Si su programa est leyendo u n a lista de valores o, por el contrario, realizando unos


clculos determinados en un bucle while, se debe incluir algn tipo de mecanismo para
terminar el bucle.

Contar 50 nmeros ledos del teclado.


Final
:= 50;
C u e n t a := 1;
w h i l e Cuenta <= F i n a l do
begin
Cuenta := Cuenta + 1
end;
Normalmente, los contadores se inicializan a 0 o 1, dependiendo del diseo del programa. En el uso de contadores se deben tener en cuenta al menos tres factores: 1) el
valor inicial, 2) el valor final, 3) el operador relacional utilizado para comprobar la terminacin del bucle.

156

Programacin

en Turbo/Borland

Estructuras

Pascal 7

1. Solicitar al usuario la c o n t i n u a c i n del b u c l e

Ejemplos
1.

2.

3.

4.

5.

i := 0;
While i < 10 do
begin
Write ( i : 8);
i := i + 1
end
i := 0;
while i < 10 do
begin
i := i + 1;
write (i:8)
end
i := 1;
while i < 10 do
begin
write (i:8)
i := i + 1;
end
i := 1
While i < 10 do
begin
i := i + 1;
Write (i:8)
end
i := 0
While i <= 10 do
begin
Write (i:8);
i := i + 1
end

6. i : = 1
While i <= 10 do
begin
Write (i:8);
i := i + 1
end

157

de control repetitivas

Este mtodo consiste simplemente en pedir al usuario si existen ms entradas.

salida 0, 1, 2, 3, . . 9
el bucle se ejecuta diez veces

salida 1, 2, 3, . .
10
el bucle se ejecuta diez veces

Suma := 0;
W r i t e l n ( ' E x i s t e n mas nmeros en l a l i s t a ?
ReadLn ( R e s p ) ;
while (Resp = * s ' ) or (Resp = ' S ' )
begin
WriteLn ( ' I n t r o d u z c a un numero: ' ) ;
ReadLn (Numero);
Suma := Suma + Numero;
WriteLn ( ' E x i s t e n mas nmeros ( S / N ) ? ' ) ;
Readln (Resp)
end;

(S/n)-');

Este bucle se realizar mientras que la respuesta a las sentencias read y readln sea distinta de s o de S.
salida 1, 2, 3,
9
el bucle se ejecuta nueve veces

salida 2, 3, 4, . .
10
el bucle se ejecuta nueve veces

salida 0, 1, 2, . .
10
el bucle se ejecuta once veces

2. Valor centinela
Un centinela es un valor especial utilizado para sealar el final de una lista de datos. El
valor elegido debe ser totalmente distinto de los posibles valores de la lista para que se
pueda utilizar para sealar el final de la lista. Por ejemplo, si el bucle lee una lista de
nmeros positivos, un nmero negativo se puede utilizar c o m o valor centinela para
indicar el final de la lista. Un bucle tal c o m o el siguiente se puede utilizar para sumar
una lista de nmeros negativos.
Suma := 0;
Read (Numero);
While Numero >= 0 do
begin
Suma := Suma + Numero;
Read (Numero)
end
Para sumar los nmeros 1, 2, 3, 4 y 5, el usuario aade un n m e r o negativo a la lista:
1

salida 1, 2, 3, . .
10
el bucle se ejecuta diez veces

5 . 4 . 2 . Bucles controlados por condicin


Los bucles condicionales o controlados por condicin se utilizan cuando no se sabe, a
priori, el nmero exacto de iteraciones a realizar. Existen diferentes tcnicas para realizar
el control del bucle.

-1

El n m e r o - 1 se lee pero no se suma.


Con un valor centinela se desea que el bucle termine tan pronto c o m o se lee el valor
centinela, lo que exige una sentencia Read antes del bucle while, de m o d o que en la expresin lgica Numero > 0 la variable Numero tenga un valor definido en la primera sentencia de asignacin.
Ejemplo 5 . 4
Leer un texto del teclado y deducir el nmero
carcter final del texto ser el primer punto.

de asteriscos

de una frase

dada. El

158

Programacin

en Turbo/Borland

Pascal

Estructuras

C := O
Read (Ch)
While Ch <> '.1 do
begin
if Ch = '*' then
C : = C + 1;
Read (Ch)
end
3. U s o d e b a n d e r a s o interruptores

Problema 5.1
Disear un programa que permita deducir si un nmero ledo de un perifrico de entrada
es primo o compuesto.
U n nmero es primo si dividido sucesivamente por 2, 3, 4, Numero-I,
ninguna divisin entera (resto cero).

hace Positivo a true cuando se introduce un entero mayor que cero. El bucle se repite
mientras Positivo sea falso, que suceder siempre que el nmero ledo N sea negativo.
procedure P o s i t i v o s (var N : i n t e g e r { N, s a l i d a } ) ;
{ l e e un e n t e r o N y d e v u e l v e e l p r i m e r o que s e a mayor que c e r o }
var
P o s i t i v o : Boolean;
begin
P o s i t i v o := f a l s e ;
while not P o s i t i v o do
begin
W r i t e ( ' i n t r o d u c i r un e n t e r o mayor que c e r o ' ) ;
ReadLn (N);
P o s i t i v o := N > O
end {while}
end { P o s i t i v o s }
1
Un procedimiento es un subprograma que realiza una tarea especifica (vase Apartado 6.3). Su sintaxis
es similar a la de un programa, con la diferencia del parmetro de entrada N. Aunque todava no se ha estudiado este concepto, se incluye por consistencia con el ejemplo.

no produce

Read (Numero);
Compuesto : = f a l s e ;
{se s u p o n e que Numero e s primo}
C := 2;
while not Compuesto and (C < Numero) do
begin
Compuesto := (Numero mod C) = 0;
C := C + 1
end;
if Compuesto
then WriteLn ( ' E s c o m p u e s t o e l n u m e r o 1 , Numero :4)
else WriteLn ('Es p r i m o e l n u m e r o ' , Numero:4)

Ejemplo 5 . 5

P o s i t i v o := N > 0;

159

El procedimiento se ejecuta siempre que Positivo sea false, ya que not Positivo = true,
y por consiguiente el bucle while se realiza. C u a n d o se lee un nmero N positivo, entonces N > 0 ser verdadero y por tanto not Positivo = fal se y el bucle no se ejecutar ms.

Una bandera o interruptor (flag) es una variable lgica que se utiliza para conservar el
estado (verdadero o falso) de una condicin. Se d e n o m i n a bandera o interruptor por
asociarse a un interruptor (encendido/apagado) o a una bandera (arriba/abajo). El valor
del interruptor debe inicializarse antes de comenzar el bucle y debe cambiar su estado
(valor) dentro del cuerpo del bucle para preparar la siguiente iteracin.
Las banderas o interruptores se representan con variables lgicas. Estas variables se
inicializan a u n o de los dos posibles valores (true o falso) y t o m a el otro valor cuando
sucede el evento que se est verificando.

El procedimiento1
Positivos lee nmeros enteros hasta que se introduce un cero. El primer valor mayor que cero se devuelve como resultado del procedimiento. La variable lgica Positivo acta como un indicador o bandera del programa para sealar si el suceso
entrada de un entero positivo ha ocurrido. Positivo se inicializa a falso cuando se inicializa el procedimiento. Dentro del bucle while, la sentencia

de control repetitivas

En la variable lgica Compuesto se puede conocer en todo m o m e n t o (en el exterior


del bucle while) si Numero es compuesto o primo.
Condiciones c o m p u e s t a s
En numerosas ocasiones as expresiones de control de un bucle pueden ser condiciones
lgicas compuestas, c o m o
-

while
while
while
while
while

(Datos >= 100) and ( D a t o s >= 1000) do


not (A <= 5) do
(A o B) and not Eof (input) do
(A < B) and (B < C) do
( C a r a c t e r <> '.') and ( C a r a c t e r <> '?') or E n c o n t r a d o do

Problema 5 . 2
Un nmero primo, como ya se ha comentado, es un entero que no tiene ms divisores que
el mismo y la unidad. Por ejemplo, 5 es primo, ya que slo tiene como divisores 5 y l; 24
no es primo, ya que tiene divisiones distintas de 24 y 1 (2 y 3). Escribir un programa para
determinar si un entero proporcionado por el usuario es un primo.
Anlisis
Para saber si un entero A es divisor de B, basta dividir B por A y comprobar si el resto es 0.
Esto es, A ser divisor de B si B mod A es igual a 0.
Para encontrar si u n entero Numero es u n p r i m o se debe determinar si alguno de los
nmeros 2, 3, . . . , Numero-1 son divisores de Numero.

160

Estructuras de control repetitivas

Programacin en Turbo/Borland Pascal 7

161

Diseo

5.5.

Definamos una variable lgica Primo que indique s o no Numero es un primo. Esto es,
Primo ser verdadero (true) si Numero es primo y falso en caso contrario. Inicialmente se
asignar a Primo el valor verdadero (es decir, suponemos que Numero es primo hasta que
no se encuentre un divisor).
Utilizaremos un bucle while-do para verificar los divisores de Numero, mediante una
variable Divisor que contenga el posible divisor a probar. Si Divisor es un divisor, se establece Primo a falso. Al final del programa se examina el valor de Primo para determinar
si ha encontrado o no alguna divisin.

LA SENTENCIA REPEAT

U n a variante de la sentencia while es la sentencia repeat. U n a de las caractersticas de los


bucles while-do es que la condicin se evala al principio de cada iteracin. En particular, si la condicin es falsa cuando la sentencia comienza, entonces el bucle no se ejecuta
nunca.
La sentencia repeat especifica un bucle condicional que se repite hasta que la condicin se hace verdadero. Tal bucle se d e n o m i n a bucle repeat-until.
El diagrama de flujo y el pseudocdigo se representan en la Figura 5.3.

Pseudocdigo
programa Primo
Primo * true
Di v i sor- 2
leer el valor de Numero
mientras Divisor < Numero hacer
si Numero mod Divisor = cero entonces
Primo-* falso
fin_si
Divisor * Divisor + 1
fin_mi entras
si Primo = true
entonces visualizar 'Numero es primo'
sino visualizar 'Numero no primo1
fin_si
Codificacin
program Primos;
{ E s t e programa v e r i f i c a s i un e n t e r o e s primo }
var
Primo
: boolean;
Numero, D i v i s o r : i n t e g e r ;
begin
Primo
:= t r u e ;
D i v i s o r := 2;
WriteLn ( ' i n t r o d u z c a un e n t e r o p o s i t i v o ' ) ;
ReadLn (Numero);
while ( D i v i s o r < Numero) and Primo do
begin
if Numero mod D i v i s o r = 0
then
Primo := f a l s e ;
D i v i s o r := D i v i s o r + 1
end;
if Primo = t r u e
then
WriteLn (Numero, ' e s p r i m o ' )
else
WriteLn (Numero, ' no e s p r i m o ' )
end.

repetir
sentencias
hasta_que condicin
condicin expresin lgica o relacional
b)

a)
Figura 5.3. Bucle Repeat: a) diagrama de flujo; b) pseudocdigo.
Despus de cada iteracin el cuerpo del bucle evala la condicin. Si la condicin es
verdadera (true), el bucle se termina y se sale de l, ejecutndose la siguiente sentencia. Si
la condicin es falsa (false), el cuerpo del bucle se repite.
La sintaxis y el formato de las sentencias repeat-until se muestran en la Figura 5.4.

sentencia repeat

repeat

sentencia

'V until

expresin

a)
repeat
sentencia 1
cuerpo del
bucle
sentencia n

'

until expresin lgica


b)
Figura 5.4. Sentencia r e p e a t - u n t i l : a) diagrama de sintaxis; b) formato de la sentencia.

162

Programacin

en Turbo/Borland

Estructuras

Pascal 7

Suma enteros.
WriteLn ( ' I n d i q u e c u a n t o s nmeros d e s e a sumar 1 ) ;
ReadLn ( T o t a l N u m e r o s ) ;
C o n t a d o r := 0;
Suma
:= 0;
repeat
Read (Numero);
Suma
:= Suma + Numero;
C o n t a d o r := C o n t a d o r + 1
until C o n t a d o r = TotalNumeros ;

Ejemplo 5 . 7
Escribir un segmento
sea 'no'.

de programa

que se ejecuta hasta que la respuesta a una pregunta

program P r u e b a ;
type
Mesannno = string [ 1 0 ] ;
Diasmes = 1 . . 3 1 ;
var
Mes : Mesanno;
Dia
: Diasmes;
Resp : string [ 2 ] ;
p r o c e d u r e Ordenar ( d i a : i n t e g e r ; mes : s t r i n g ) ;
. . . e l concepto procedimiento se e s t u d i a en e l C a p i t u l o 6
begin
repeat
WriteLn ( ' e s c r i b a e l nombre de un mes, E n e r o a D i c i e m b r e ' ) ;
ReadLn (Mes);
WriteLn ( ' e s c r i b a e l numero d e l d i a , 1 a 3 1 ' ) ;
ReadLn ( D i a ) ;
{ l l a m a d a a un p r o c e d i m i e n t o o r d e n a r }
O r d e n a r (Dia, Mes);
WriteLn;

163

La variable Resp, si se declara de tipo char, permitir sustituir la sentencia until por
este otro formato
until (Resp = ' n ' ) or (Resp = * N ' )

5.6.

Ejemplo 5 . 6

repetitivas

WriteLn ( ' T e c l e e S i p a r a c o n t i n u a r ; No p a r a t e r m i n a r ' ) ;


ReadLn (Resp)
until Resp = 'No'
end.

REGLAS DE FUNCIONAMIENTO
1. La condicin (expresin lgica) se evala al final del bucle, despus de ejecutarse
todas las sentencias.
2. Si la expresin lgica es falsa, se vuelve a repetir el bucle y se ejecutan todas las
sentencias.
3. Si la expresin lgica es falsa, se sale del bucle y se ejecuta la siguiente sentencia a
until.
4. La sintaxis no requiere begin y end.

de control

COMPARACION DE LOS BUCLES

WHILE

Y REPEAT

Los bucles while y repeat son complementarios en su actuacin. La eleccin de una sentencia u otra depender del diseo del problema por parte del programador. Si bien con
la sentencia while se pueden escribir casi todos los algoritmos repetitivos, en muchas ocasiones la sentencia repeat facilita la escritura de algoritmos. En general, el cuerpo de un
bucle repeat se ejecuta siempre.
La Tabla 5.1 representa una comparacin de los bucles while y repeat.

Tabla 5.1. Comparacin de w h i l e y repeat


Bucles WHILE

Bucles REPEAT

1. La condicin (expresin lgica) se verifica antes de que se ejecute el cuerpo del


bucle.

1. La condicin se verifica despus que el


cuerpo del bucle se ha ejecutado.

2. Como resultado de (1), el cuerpo del


bucle puede no ser ejecutado (si la condicin es falsa).

2. Como resultado de (1), el cuerpo del


bucle se ejecutar al menos una vez (no
imprta cul ser el valor de la condicin).

3. Como resultado de (1), las variables de


la condicin deben haber sido inicializadas antes de alcanzar la sentencia
while, de modo que la condicin puede
ser verificada.

3. Como resultado de (1), las variables de


la condicin no necesitan ser inicializadas antes de alcanzar la sentencia repeat. A esas variables se les pueden
asignar valores en el cuerpo del bucle,
que se ejecutarn antes de que se verifique la condicin.

4. Si la condicin es verdadera, el cuerpo


del bucle se ejecutar y continuar el
bucle.

4. Si la condicin es verdadera, el cuerpo


del bucle habr sido ejecutado pero se
detiene el bucle.

5. Para evitar un bucle infinito, debe asegurarse que la condicin contenga una
variable cuyo valor se modifique en el
cuerpo del bucle, pasando a tomar el
valor falso.

5. Para evitar un bucle infinito, debe asegurarse que la condicin contenga una
variable cuyo valor se modifique en el
cuerpo del bucle, pasando a tomar el
valor verdadero.

164

Programacin

en Turbo/Borland

Pascal 7

Estructuras

Ejemplo 5 . 8
Visualizar

de control

repetitivas

165

B u c l e s infinitos

las potencias

de 2 comprendidas

U n bucle se dice q u e es infinito c u a n d o n o t e r m i n a n u n c a su e j e c u c i n . Esta situacin se


p r o v o c a c u a n d o la c o n d i c i n o expresin lgica de salida n o se c u m p l e n u n c a y es una
situacin que se debe evitar.
En u n bucle while se p r o d u c e c u a n d o la c o n d i c i n n u n c a se hace falsa en las sucesivas iteraciones.

entre 1 y 10.000.

P o t e n c i a := 1 ;
while P o t e n c i a < 10000 do
begin
Write (Potencia :5);
P o t e n c i a := P o t e n c i a * 2
end

P o t e n c i a := 1
repeat
Write (Potencia:5);
P o t e n c i a := P o t e n c i a * 2
until P o t e n c i a >= 10000

{error}
C o n t a d o r := 1;
w h i l e C o n t a d o r <> 0 do
C o n t a d o r := C o n t a d o r + 1;

Complementar una condicin


El e j e m p l o a n t e r i o r m u e s t r a u n a p o t e n c i a s i m p l e (Potencia < 10000) y su c o m p l e m e n t o
(Potencia >= 10000). P a r a c a m b i a r de u n bucle a o t r o se necesita c o m p l e m e n t a r la c o n dicin.
Se p u e d e c o m p l e m e n t a r u n a c o n d i c i n simple c a m b i a n d o el o p e r a d o r relacional de
la f o r m a siguiente:
Operador

Operador que complementa

<

> =

<=

>

>

< =

<=

5.7.

>

< >
< >

Por e j e m p l o , el c o m p l e m e n t o de x < = y es z > y. Si la expresin c o m i e n z a c o n not,


q u i t a r el not (por e j e m p l o , el c o m p l e m e n t o de Bandera es not Bandera).
El t e o r e m a de M o r g a n sirve p a r a c o m p l e m e n t a r u n a expresin c o m p u e s t a : escribir
el c o m p l e m e n t o de c a d a expresin lgica y c a m b i a r c a d a and p o r or y or p o r and. O t r o
m e d i o p a r a c o m p l e m e n t a r u n a expresin lgica es p r e c e d e r a la e x p r e s i n c o m p l e t a c o n
not.
Teorema de Morgan
not ( e x p r e s i n 1 and expresin
not ( e x p r e s i n 1 or expresin

(not Bandera) or (x<=y)


Bandera and (not Bandera)
(Demo ='A') or (Demo ='b')

LA SENTENCIA FOR

E n n u m e r o s a s o c a s i o n e s se p u e d e d e s e a r u n bucle q u e se e j e c u t e u n n m e r o d e t e r m i n a d o de veces, y cuyo n m e r o se c o n o z c a p o r a n t i c i p a d o . P a r a a p l i c a c i o n e s de este tipo


se utiliza la sentencia f o r .
La sentencia for r e q u i e r e q u e c o n o z c a m o s p o r a n t i c i p a d o el n m e r o de veces q u e se
e j e c u t a n las sentencias del interior del bucle. Si se desea q u e las sentencias c o n t r o l a d a s
se e j e c u t e n hasta q u e o c u r r a u n a d e t e r m i n a d a situacin y n o se c o n o c e d e a n t e m a n o el
n m e r o de repeticiones, e n t o n c e s se debe utilizar la s e n t e n c i a while o repeat en lugar de
for.

5.7.1.

Incrementos de contador de f o r ( t o )

El p s e u d o c d i g o y f o r m a t o de la s e n t e n c i a for se i n d i c a n en la Figura 5.5.

d e s d e i < valor inicial h a s t a valor final h a c e r

2) = (not expresin
2)

= (not expresin

1) or (not expresin
1) and (not expresin

Ejemplos
Expresin

La variable C o n t a d o r c o m i e n z a en 1, y c o m o en c a d a iteracin se i n c r e m e n t a su
valor en 1, n u n c a t o m a r el valor 0 y en c o n s e c u e n c i a el b u c l e n u n c a t e r m i n a r .
El s e g u i m i e n t o del p r o g r a m a paso a paso, tras su c o d i f i c a c i n evita g e n e r a l m e n t e los
bucles infinitos. En general, los bucles infinitos se p r o d u c e n p o r errores en las expresiones lgicas de while y repeat. L a t e r m i n a c i n de u n b u c l e c o n u n test d e igualdad o desigualdad, en lugar de u n a c o m p a r a c i n ( m a y o r o m e n o r ) es o t r a f u e n t e de p r o d u c c i n
de bucles infinitos.

Complemento
Bandera and ( x > y )
(not Bande>:a) or I n t e r r u p t o r
(Deroo o ' . V ) and (Demo o ' a '

2)
2)

sentencias
fin_desde
a)

f o r variable:= valor inicial t o valor final do


sentencia;
b)
Figura 5 . 5 . Sentencia f o r : a) diagrama de flujo; b) formato de la sentencia.

1 66

Programacin

en Turbo/Borland

Pascal 7

Estructuras

Al ejecutarse la sentencia for la primera vez, el valor inicial se asigna a variable que
se denomina variable de control, y a continuacin se ejecuta la sentencia del interior del
bucle. Si la sentencia es compuesta, entonces el formato de for es

3.3.B B 3.3. B B 3 3. B B 3. 3 B B 3 3 B 8

1. for Anno := 1983 to 1989 d o

begin
Read ( S a l a r i o ) ;
W r i t e ( ' E n e l a o ' , Anno : 5 ) ;
W r i t e L n ( ' h e g a n a d o ' , S a l a r i o : 8 : 2)
end

La computadora fija la variable Anno a un valor inicial de 1983 y en cada iteracin la


variable se incrementa en 1 hasta llegar a 1990, en cuyo m o m e n t o ser termina el bucle.

El diagrama de sintaxis de la sentencia for-to es


~* expresin

^ do^

2. P r i m e r o := 3 ;
Ultimo
:= 5 ;
for C o n t a d o r := P r i m e r o to U l t i m o do
begin
P r i m e r o := 1 ;
Ultimo
:= 10
end;

> sentencia

La variable v se denomina variable de control del bucle. C u a n d o se ejecuta la sentencia for, a la variable v se le asigna el valor inicial; al llegar a la sentencia end se verifica si
el valor final es mayor que el valor inicial; en caso negativo se incrementa el valor de la
variable de control en uno y se vuelven a ejecutar todas las sentencias del interior del
bucle, hasta que la variable de control sea mayor que el valor final, en cuyo m o m e n t o se
termina el bucle. Veamos un ejemplo prctico de for.
f o r c := 1 t o 10 do
WriteLn ( c ) ;

5.7.2.

Decremento del contador de f o r (downto)

El contador del bucle se puede decrementar de uno en uno en lugar de incrementar


como en el caso anterior. El format o y el diagrama de sintaxis se indican en la Figura 5.6.

La variable c es la variable de control; se asignan los valores 1, 2, 3,..., 10 y se ejecuta


diez veces la sentencia WriteLn (c), es decir, se escribe
f o r v := vi downto vf do
begin
sentencia 1;
sentencia 2;

i
2
3

sentencia n
end;

10

vi = valor inicial de v
vf = valor fina! de v

Si la sentencia del interior del bucle es compuesta, entonces se puede apreciar que el
bucle
for c : = 1 to 5 do
begin
Write ( ' a a ' ) ;
W r i t e (* BB *)
end

167

al ejecutarse visualiza:

sentencia n
end;

expresin t o

repetitivas

Ejemplo

f o r v:= v, t o v, do
begin
sentencia 1;
sentencia 2;

variable

de control

variable K

expresin | ^ d o w n t o ^ | expresin

do

tu
Figura 5 . 6 . Sentencia f o r - d o w n t o : a) formato; b) diagrama de sintaxis.

168

Programacin

en Turbo/Borland

Estructuras

Pascal 7

En esta variante la sentencia for se ejecuta un nmero determinado de veces (valor


inicial - valor final + 7).
Al ejecutarse
f o r C := S downto 1 do
w r i t e (C);

repetitivas

169

3. f o r SW := f a l s e t o t r u e do
i f SW t h e n
WriteLn ( ' i n t e r r u p t o r v e r d a d e r o 1 )
else
WriteLn ( ' i n t e r r u p t o r f a l s o ' ) ;
4.

se visualiza
5
4
3
2
1

de control

f o r j := ' a ' t o ' e ' do


Write ( j ) ;

La variable contador del bucle no puede ser una variable real.


f o r Cambio := 2 . 5 t o 3 . 7 do
WriteLn ('Cambio = ' , Cambio : 6 : 2 ) ;
D a d o que Cambio no puede listar todos los valores reales entre 2.5 y 3.7, no puede
conocer con exactitud cuntas veces se ejecutar el cuerpo del bucle.

REGLAS DE FUNCIONAMIENTO DE f o r - t o - d o w n t o
1. Las variables de control, valor inicial y valor final deben ser todas del mismo tipo,
pero el tipo real no est permitido. Los valores iniciales y finales pueden ser tanto
expresiones como constantes.
2. Antes de la primera ejecucin del bucle, a la variable de control se asigna el valor
inicial.
3. La ltima ejecucin del bucle normalmente ocurre cuando la variable de control
es igual al valor final.
4. Cuando se utiliza la palabra reservada to la variable de control se increment en
cada iteracin. Si se utiliza downto, la variable se decrementa.
5. Es ilegal intentar modificar el valor de la variable de control, el valor inicial y el
valor final dentro del bucle.
6. El valor de la variable de control se queda indefinido cuando se termina el
bucle.

Problema 5 . 3
Escribir un programa

que calcule la suma

1 + 2 + 3 + + 100
Anlisis
Ya que se solicita la suma de 100 nmeros, se requiere un bucle para su gestin. Se utiliza u n a variable Suma que almacene cada uno de los valores sucesivos resultantes.
1 , 1 + 2 , 1 + 2 + 3, . . .
Despus de 100 iteraciones, Suma contendr la suma indicada.

Otros tipos permitidos d e variables de control d e b u c l e s

>

Una variable de control debe ser de tipo ordinal o un subrango de tipo ordinal. As pues,
adems de entera puede ser de tipo char o de tipo lgico u otro tipo ordinal.
Ejemplos
1. f o r C a r a c t e r := 'A' to ' Z ' do
WriteLn ( C a r a c t e r )

{ v a r i a b l e de c o n t r o l t i p o c h a r }

2. f o r C a r a c t e r := ' e ' downto ' a ' do


if C a r a c t e r A c t u a l = C a r a c t e r then
begin
C := C + 1;
Write (Caracter)
end;

Diseo del programa


Los clculos anteriores se muestran en el pseudocdigo:
Programa Sumar
Suma < 0;
desde Numero *- 1 hasta 100 hacer
Suma
Suma + Numero
fi n_desde
escritura de la Suma}
visualizar Suma
Observe que en la primera iteracin el nmero Numero se suma a Suma. Despus de la
primera repeticin Suma = 0 + 1 ; despus de dos repeticiones Suma es igual a 0 + 1 + 2; y
despus de 100 repeticiones Suma = 0 + 1 + 2 + . . . + 100.

170

Programacin

en Turbo/Borland

PascaI 7

Estructuras

Codificacin
p r o g r a m Sumar;
{ E s t e p r o g r a m a suma l o s e n t e r o s e n t r e 1 y 100 }
const
Mximo = 1 0 0 ;
var
Numero, Suma : i n t e g e r ;
begin
Suma -. = 0 ;
f o r Numero := 1 t o Mximo do
Suma := Suma + Numero;
W r i t e ( ' L a suma de l o s ' , Mximo, ' p r i m e r o s n m e r o s e s
igual a ' ) ;
W r i t e L n (Suma)
end.

begin
WriteLn ( ' C u a l es e l numero ' , J , '
ReadLn
(Numero);
Suma := Suma + Numero
end;
Media := Suma / 5 ;
WriteLn ( ' L a media e s ' , M e d i a : 5 : 2 )
end.
Ejecucin

Escribir

un programa

que acepte cinco nmeros

del usuario

y calcule su media.

Anlisis
Para calcular la media, d e b e m o s s u m a r los n m e r o s y a c o n t i n u a c i n dividir e n t r e 5.
Utilizaremos u n a variable Suma p a r a a c u m u l a r las s u m a s parciales. La m e d i a se a l m a c e n a r en otra variable Media.
Diseo (pseudocdigo)
Programa HacerMedia
inicio
Suma * - 0
desde j +- 1 hasta 5 hacer
leer Numero
Suma
Suma + Numero
fin_desde
Medi a * Suma/5
v i s u a l i z a r Media
fin
Codificacin

(programa)

program Hacermedia;
{ E s t e programa c a l c u l a l a media de 5 nmeros }
var
Numero, Suma, Media : r e a l ;
J : integer;
begin
Suma := 0 ;
for J := 1 to 5 do

5.7.3.

repetitivas

171

? ');

de muestra
Cual es
17.3
Cual es
25.1
Cual es
12 . 9
Cual es
15.5
Cual e s
27.4
La m e d i a

Problema 5 . 4

de control

e l numero 1?
e l n u m e r o 2?
e l n u m e r o 3?
e l n u m e r o 4?
e l n u m e r o 5?
es 19.64

Sintaxis del bucle f o r

La sentencia for r e p r e s e n t a u n a e s t r u c t u r a o b u c l e c u y o c u e r p o de s e n t e n c i a s se ejecuta


u n n m e r o fijo de veces. Este n m e r o d e p e n d e del c o n t a d o r del bucle (variable de control del bucle) y de los valores iniciales y final del m i s m o .
As, si Vf y vf r e p r e s e n t a n los valores inicial y final de variable de c o n t r o l de bucle, el
n m e r o de veces ( i t e r a c i o n e s ) q u e se realiza (ejecuta) el b u c l e f o r se recoge en la Tabla 5.2.
Tabla 5 . 2 . Nmero de iteraciones de un bucle f o r
for-to

iteraciones

for-downto

V, < Vf
V, = Vf
V, > Vf

Vf - v + 1
1
0

Vi < Vf
V, = Vf
V, > Vf

iteraciones

V,

0
1
- Vf + 1

v,: valor inicial de la variable de control del bucle.


v f : valor final de la variable de control del bucle.

5.8.

BUCLES ANIDADOS

El c u e r p o de u n bucle p u e d e c o n t e n e r c u a l q u i e r tipo de s e n t e n c i a s secuenciales (simples


o c o m p u e s t a s ) , selectivas ( i f - t h e n - e l s e , case) o repetitivas ( f o r , while, repeat). C u a n d o
u n bucle est c o n t e n i d o en o t r o bucle, se d e n o m i n a n bucles anidados.

172
5.8.1.

Programacin

en Turbo/Borland

Pascal 7

Bucles while/repeat

Estructuras

173

Programa

anidados

D i a s := 1;
w h i l e D i a s <= 365 do
begin
Horas := 1;
w h i l e Horas <= 24 do
begin
Read ( T e m p e r a t u r a ) ;
Horas := Horas + 1
end;
D i a s := D i a s + 1
end;

Los bucles mientras y repetir (while o repeat) pueden estar anidados, entre s, o bien bucles while con repeat o viceversa.
mientras condicin 1 hacer

de control repetitivas

-repetir

-mientras condicin 2 hacer

repetir

-fin_mientras

hasta_que condicin 1

5.8.2.

-fin_nri entras

-hasta_que condicin 2

-mientras condicin 1 hacer

-repetir

Bucles f o r anidados

Al igual que sucede con los bucles while y repeat-until es posible poner un bucle dentro
de otro bucle: anidar bucles. Cuando se anidan bucles, se debe tener cuidado que el
bucle interior est completamente dentro del bucle exterior. Si los bucles se cruzan, no
sern vlidos.
Bucles vlidos

mientras condicin 2 hacer

repetir

-hasta_que condicin 2

f o r m := 1 t o 10 do
f o r n := 10 downto 2 do
begin

f i n_jni entras
end;
- hasta-que condicin 1

fin_mientras
Problema 5 . 5
Se desea leer las temperaturas
da (Madrid).

f o r i := 1 t o mi do
f o r j := 3 t o m2 do
f o r k := 5 t o m3 do
begin

horarias de cada uno de los das de un ao en Majadahon-

El problema se puede resolver con dos bucles mientras anidados y controlados por
contadores que debern contar de 1 a 365 (das) y de 1 a 24 (horas).

end;

Cada sentencia for, si tiene un proceso compuesto, deber estar delimitado entre begin-end. Esta delimitacin establecer el orden de anidamiento.
Es posible anidar bucles for dentro de bucles while o repeat, o viceversa.
Bucles vlidos
1. w h i l e n < 10 do
f o r j := 1 t o 100 do
begin

2. r e p e a t
f o r j : = 1 t o 10 do
begin

Pseudocdigo
Di as * 1
mientras Di as <= 365 hacer
Horas
1
mientras Horas <= 24 hacer
leer Temperatura
Horas * Horas + 1
fin_mientras
Dias -* Di as + 1
finjiti entras

end
3. f o r i := 4 t o 100 do
whil,e j > 20 do
begin
end;

end
u n t i l j < 15;
4. f o r i := 100 downto 10 do
repeat

u n t i l J < 15;

174

Programacin

en Turbo/Borland

Pascal 7

En esta aplicacin se observa cmo el bucle J (bucle interno) se ejecuta completamente


para cada valor de I. Cada vez que el bucle externo se incrementa, las sentencias de su
interior se ejecutan de nuevo.
:
17);
, :
17 ) ;
do
12 do
3 , j : 17)

La ejecucin producir:
J

5.9.

1
i
1
2
2
2

io
ii
12
10
11
12

10

11

12

SENTENCIAS DE CONTROL INCONDICIONAL

T u r b o Pascal 7.0 incluye cuatro procedimientos Brale Continu, Exit y Halt que
controlan el flujo de control de un programa. Break y Continu son exclusivos de la versin 7.0 mientras que Exit y Halt ya existan en versiones anteriores. Estos procedimientos permiten bifurcar a determinadas zonas de un programa de u n m o d o incondicional.
Los nuevos procedimientos Break y Continu deben aparecer en el interior de un bucle
(for, while o repeat) y permiten salir fuera (terminar el bucle) del m i s m o mientras que
los otros dos procedimientos (exit y halt) pueden aparecer en cualquier parte de un programa. Las sentencias Break y Continu realizan la misma uncin que sus h o m n i m a s
del lenguaje C.

5.9.1.

de control repetitivas

175

v a r t : Integer

Ejemplo 5 . 9

begin
WriteLn ('I' : 3
WriteLn ( :
3
for i := 1 to 12
for j := 10 to
WriteLn (i :
end.

Estructuras

Procedimiento break

Este procedimiento termina una sentencia repetitiva (bucle). El control se transfiere inmediatamente a la primera sentencia despus del bucle; break es un procedimiento sin
parmetros, por consiguiente su llamada se realizar invocando directamente al procedimiento break.

f o r j := 1 t o 100 do
begin
ReadLn (t);
i f t = 0 t h e n Break
else
(* otras sentencias *)
end;
U n caso muy tpico de utilizacin es el citado en el manual de referencia del program a d o r (Programmer's Reference, Borland, pgina 15).
w h i l e True do
begin
ReadLn(S);
i f S = " t h e n Break;
WriteLn;
end;
Sin embargo, este ejemplo puede resolverse fcilmente, sin necesidad de utilizad break
de la forma siguiente:
repeat
ReadLn(S);
if S < > 11then
WriteLn (S);
u n t i l S = 11;
Precaucin

El compilador producir un error si break no est situada en el interior de bucles for. whi 1 e
y repeat.

Ejemplo 5 . 1 0
El siguiente bucle I lee y visualiza 10 nmeros no negativos. Si encuentra un nmero
negativo antes de haber ledo los 10 primeros nmeros se termina el bucle inmediatamente y la sentencia WriteLn no se ejecuta y no se leen ms nmeros.
f o r I := 1 t o 10 do
begin
Read(N);
if N < 0 then
break;
WriteLn ('El numero es
end;

N) ;

176

Estructuras
Programacin

en Turbo/Borland

de control

repetitivas

Pasca! 7

f o r I := 1 t o ParamCount do
begin
Nombre := ParamStr (I);
Assign (F, Nombre);

Ejemplo 5 . 1 1
El bucle While lee una lnea de texto y cuenta el nmero total de caracteres y el nmero
de blancos. Se detiene la cuenta, tan pronto como se encuentra o bien el final de la lnea
o un punto. Si se lee un punto, se utiliza la sentencia break para terminar el bucle inmediatamente; en ese momento el programa ejecuta la sentencia que sigue al bucle (la sentencia ReadLn;.
{la siguiente lectura comienza al principio de una linea)
CuentaTotal := 0;
CuentaBlancos := 0;
w h i l e n o t eoln do
begin
Read(Caracter ) ;
i f Caracter = 1 . 1 t h e n
break
else
CuentaTotal := CuentaTotal + 1;
i f Caracter = ' ' t h e n
CuentaBlancos := CuentaBlancos + 1;
end;
ReadLn;

177

($1- )

Reset (F, 1);


($1+)

i f , I O R e s u l t o 0 then
begin
WriteLn ('Archivo no encontrado: ', Nombre);
Continu;
end;
WriteLn (Nombre,
FileSize (F), 'bytes');
Cise (F);
end;
Al igual que sucediera con el procedimiento break, la situacin anterior puede ser resuelta por el mtodo tradicional.
f o r I := 1 t o ParamCount do
begin
w h i l e IOResult o 0 do
Nombre := ParamStr (I);
($1- )

Reset ( F-i> 1) ;
($1+)

Procedimiento Continu

5.9.2.

i f IOResult <> t h e n
begin
WriteLn ('Archivo no encontrado:', Nombre);
Continu;
end;
WriteLn (Nombre,
FileSize (F), 'bytes');
Cise (F); end;

Este procedimiento proporciona un medio de volver al principio de un bloque antes de


lo previsto. Dicho de otro modo, el procedimiento Continu contina la siguiente iteracin de una sentencia repetitiva. U n ejemplo de su uso es:
v a r t, total:integer
f o r f := 1 t o 10 0 do
begin
ReadLn(t);
if t = 0 then Continu;
Total = Total + t
WritenLn ('la suma total es = ' , Total);
end;
Precaucin

El compilador daia un mensaje de erroi si UIKI llamada :i Continu no esla enconada dentro
de una sentencia for. while o repeat.
El manual de referencia, ya citado anteriormente, menciona un ejemplo de aplicacin de Continu.

Con esto queremos significar que las funciones que realizan Break y Continu pueden
ser realizadas, normalmente, por el mtodo tradicional y, por consiguiente, su uso suele
implicar redundancia. Sin embargo, su uso aporta ms legibilidad y sobre todo evita el
uso de la fatdica sentencia goto, incluso en situaciones anormales, que suelen ser los nicos casos donde goto tiene aplicacin.

5.10.

ELECCION DE LA ESTRUCTURA REPETITIVA


ADECUADA

La eleccin adecuada de estructuras repetitivas es una de las partes ms importantes en


el diseo de algoritmos. La repeticin de sentencias en el interior del bucle requiere
definir las condiciones de terminacin del bucle con sumo cuidado para evitar un bucle
incorrecto o infinito.
En un bucle REPEAT-UNTIL, la secuencia de sentencias se ejecutar al menos una vez,-

1 78

Programacin

en Turbo/Borland

Pasca! 7

mientras que en un biche WHILE no siempre se ejecutar el proceso del bucle y en ocasiones (condicin falsa) no se ejecutar. En la prctica, el bucle WHILE se utiliza con ms
frecuencia que el bucle REPEAT en los algoritmos de computadora y por ello en caso de
duda seleccione WHILE.
El bucle FOR se reserva para situaciones en que el n m e r o de repeticiones se puede
predecir y enumerar fcilmente antes que comience el bucle. U n bucle FOR se puede reescribir fcilmente (normalmente con un bucle WHILE) utilizando otras estructuras.
Cuando no se conoce con anticipacin cuntas veces se tiene que ejecutar un bucle,
el uso de las estructuras WHILE es el ms indicado, incluso aun cuando el bucle est controlado por un simple incremento o decremento de un contador entero.
Es frecuente confundir estructuras IF-THEN con WHILE, debido al hecho que muchos
algoritmos tienen estructuras que implican bucles dentro de los cuales se realizan estructuras de decisin secundarias.

Estructuras

de control

repetitivas

179

El bucle anterior se puede disear incorrectamente.


T o t a l := 0;
{ i n i c i a l i z a sumador }
Read ( V a l o r ) ;
{ p r i m e r numero }
while V a l o r <= 1 do
while V a l o r > 1 do
while v a l o r = 1 do
begin
T o t a l := T o t a l + v a l o r
Read ( V a l o r )
end
begin
if V a l o r <> 0 then T o t a l := T o t a l + V a l o r ;
Read ( V a l o r )
end;

Ejemplo 5 . 1 2
Sumar todos los nmeros positivos contenidos en una lista que puede tener positivos y
negativos. El nmero fin de archivo o final de la lista es el cero.
T o t a l := 0;
{ i n i c i a l i z a r sumador}
Read ( V a l o r ) ;
{ p r i m e r numero }
while V a l o r > 0 do
begin
i f V a l o r > 0 then T o t a l := T o t a l + V a l o r ;
Read ( V a l o r )
end;
Algunos programadores pueden intentar escribir el algoritmo anterior de modo incorrecto como:
T o t a l := 0;
Read ( V a l o r ) ;
while V a l o r o 0 do
begin
while V a l o r <> 0 do
T o t a l := T o t a l + V a l o r ;
Read ( V a l o r )
end;
En ocasiones c o m o ya se ha comentado un bucle sencillo tiene una condicin
de terminacin compuesta. C o m o ejemplo, considere el siguiente programa, que calcula
Total mientras su valor est fuera del rango: 1 < = Valor > = 1 .
T o t a l := 0 ;
{ i n i c i a l i z a sumador }
Read ( V a l o r ) ;
{ p r i m e r numero }
while (Valor < - 1 ) or ( v a l o r > 1 )
do
begin
T o t a l := T o t a l + V a l o r ;
Read ( V a l o r )
end;

Reglas de seleccin de bucles


1. Si el nmero de iteraciones se conoce por adelantado, se debe utilizar FOR.
2. Si el nmero de iteraciones es indeterminado y el bucle no se debe ejecutar cuando la
condicin sea falsa la primera vez, se debe utilizar WHILE.
3. Si el nmero de iteraciones es indeterminado y el bucle se debe ejecutar siempre al menos una vez, utilizar REPEAT-UNTIL.

5.11.

OPTIMIZACION DE BUCLES

Se han analizado anteriormente las posibilidades de tratamiento de las estructuras repetitivas. La sentencia FOR est delimitada por un programa d o n d e se conoce con anticipacin el rango de valor de la variable de control del bucle. La sentencia WHILE es una
estructura pretest, donde se controla el valor de la condicin booleana antes de activarse
su proceso. La estructura REPEAT es postest: una vez concluido el proceso, se testea la condicin del bucle para validar el proceso.
Con estas premisas previas, vamos a analizar el nivel de eficiencia temporal de bucles
utilizando biblioteca de T u r b o Pascal.
Para ello, importaremos de la biblioteca DOS los procedimientos SetTirne y GetTime que
tratan directamente con el reloj interno de la computadora. GetTime devuelve la hora del
sistema en formato horas, minutos y centsimas de segundo y SetT i me pone la hora en el
sistema con los mismos parmetros.
Incorporamos de la biblioteca CRT el procedimiento de "Limpiar la pantalla" (Cl rScr).
El tipo word asigna el tipo entero sin signo necesario para el argumento de los procedimientos SetTime y GetTime.
El siguiente programa nos da los tiempos de proceso de los tres bucles de programacin en Pascal. El recorrido de la variable de control ser el rango del tipo Integer.

180

Programacin

en Turbo/Borland

Pascal 7

Estructuras

n ;= 1 (n,

program BuclesOptimos ( i n p u t , o u t p u t ) ;
uses
Dos, Crt;
var
Hora, M i n u t o , Segundo, C e n t e s i m a : word;
i : integer;
begin
ClrScr;

bucle

{n,

repetitivas

181

no i n i c i a l i z a d o }

while n < 10 do

valido

bucle

no valido

(error)

b) N o modificar el valor de la variable de control dentro del bucle y, por consiguiente, la condicin siempre es verdadera:

{ f r a g m e n t o d e c o d i g o q u e e v a l a e l b u c l e FOR}
SetTime (0, 0, 0, 0 ) ;
f o r i := - M a x i n t t o M a x i n t d o ;
GetTime ( h o r a , m i n u t o , s e g u n d o , c e n t e s i m a ) ;
W r i t e L n ( ' T i e m p o FOR: ' , s e g u n d o : 8, c e n t e s i m a : 8 ) ;
{ f r a g m e n t o d e c o d i g o q u e e v a l a e l b u c l e REPEAT}
SetTime (0, 0, 0, 0 ) ;
i := - M a x i n t ;
repeat
i := i + 1
u n t i l i = Maxint;
GetTime ( H o r a , M i n u t o , S e g u n d o , C e n t e s i m a ) ;
W r i t e L n ( ' T i e m p o REPEAT: ' , s e g u n d o : 8, c e n t e s i m a

inicializado)

while n < 10 do

de control

: 8);

{ f r a g m e n t o d e c o d i g o q u e e v a l a e l b u c l e WHILE}
S e t T i m e ( 0 , 0 , 0 , 0) ;
i := - M a x i n t ;
w h i l e i < M a x i n t do
i := i + 1 ;
GetTime (Hora, Minuto, Segundo, C e n t e s i m a ) ;
W r i t e L n ( ' T i e m p o WHILE :
segundo:8, centesima:8)
end.

n
5;
while n < 10 do
ReadLn ( N u m e r o ) ;
W r i t e (Numero)

end.
c) Existe u n a sentencia vaca despus de do:
while n < 10 do

{; s e n t e n c i a v a c i a }

d) En u n bucle repeat, la condicin de salida n u n c a se cumple. Por ejemplo, si x es


u n a variable real:
x : = 0;

repeat
W r i t e L n (x : 4 : 1 ) ;
x : = x + 0. 3

until x = 1 . 0
produce un bucle infinito ya que x vale sucesivamente 0.0, 0.3, 0.6, 0.9,. . .
En este ejemplo, al ser x real y utilizar una condicin de igualdad, se podra
producir tambin un error. Con el siguiente segmento de programa:

Las conclusiones q u e se obtienen son las siguientes:

x := 0 ;

1. El bucle for-do es el ms rpido en ejecutarse. (Su uso, sin embargo, debe limitarse a sus tratamientos propios: iteraciones controladas, tratamiento de matrices,
contador de sucesos, etc.).

repeat

2. El bucle repeat es ms rpido que el while.

{ e l v a l o r d e n no s e m o d i f i c a }

begin

WriteLn

(x:4:1);

x := x + 2/10
until x = 1 . 0
se puede producir un bucle infinito. La salida
o.o

5.12.

PUESTA A PUNTO DE PROGRAMAS

0.2
0.4

5.12.1.

Tcnicas de depuracin de programas

1. Es normalmente mejor disear el bucle utilizando pseudocdigos que no especificar


directamente el cdigo. Una vez diseado el algoritmo, la eleccin del bucle Pascal
es ms clara.
2. Los bucles infinitos se deben evitar. Posibles causas de error son:
o) N o tener valor inicial la variable de control del bucle while (error en compilacin) antes de comenzar el bucle:

0.6

0.8
1.0
1.2
1.4

puede producir un error, ya que x t o m a el valor 1, pero la expresin lgica x = 1


puede ser falsa, ya que la mayora de los valores reales no se almacenan exactamente. Evite condiciones de igualdad con valores reales.

182

Programacin

en Turbo/Borland

Estructuras

Pascal 7

) Las condiciones de desigualdad p u e d e n producir t a m b i n bucles infinitos:


while

Saldo o

0.0 do

Puede ocurrir q u e el saldo de u n a c u e n t a corriente sea positivo o negativo, pero


n u n c a 0. Sera ms seguro:

de control

repetitivas

183

14. N u n c a t e r m i n a r u n bucle c o n un test de igualdad de valores reales. Los test de


igualdad son peligrosos p o r lo ya i n d i c a d o en el p u n t o 2.
15. Al d e p u r a r bucles, verificar s i e m p r e la p r i m e r a y l t i m a iteracin del c u e r p o del
bucle.
16. La d e p u r a c i n de bucles se facilita c o n el s e g u i m i e n t o de los valores de las variables
claves del c u e r p o del b u c l e c o n las o p c i o n e s de " T r a c e " disponibles en el c o m p i lador.

while S a l d o > 0 . 0

5.12.2.
3. Si se utiliza un bucle c o n t r o l a d o por centinela, recuerde p r o p o r c i o n a r en el program a un m e n s a j e q u e i n d i q u e al usuario q u valor debe i n t r o d u c i r p a r a t e r m i n a r (el
centinela). Asegrese q u e el valor del centinela no se p u e d e c o n f u n d i r c o n u n d a t o
vlido.
4. Si el cuerpo del bucle c o n t i e n e m s de u n a sentencia, d e b e e n c e r r a r las sentencias
entre begin y end. E n caso contrario, slo se repetir la p r i m e r a sentencia y las sentencias restantes se e j e c u t a r n c u a n d o se sale del bucle. El siguiente p r o g r a m a n o
terminar ya q u e el paso q u e actualiza la variable de control del bucle n o se considera parte del c u e r p o del bucle. E n el ejemplo:
while P o t e n c i a <= 1000 do
W r i t e L n ( ' l a s i g u i e n t e p o t e n c i a de N e s 1 ,
P o t e n c i a := P o t e n c i a * N;

Potencia

for SW
for C a r a c t e r
for P r u e b a

:= f a l s e to t r u e do
:= ' A ' to * Z' do
:= B l a n c o to A m a r i l l o do

Las sentencias i f y while se suelen c o n f u n d i r p o r el h e c h o de t e n e r a m b a s sentencias


u n a c o n d i c i n . Sin e m b a g o , i f implementa
u n paso de decisin y while un bucle condicional.
Los test de desigualdad son peligrosos c o m o c o n t r o l de u n bucle while.
while S a l d o <> 0 . 0 do
Write ( Saldo );
Si Saldo pasa de positivo a negativo, sin pasar e x a c t a m e n t e p o r 0.0, el bucle n o
t e r m i n a , se c o n v i e r t e en u n b u c l e infinito. Es preferible utilizar:
while S a l d o > 0 . 0 do
Write (Saldo);

: 5);

se imprime c o n t i n u a m e n t e el valor inicial de Potencia (2).


5. Asegrese inicializar a cero u n a variable utilizada para a c u m u l a r u n a s u m a repetidamente y de inicializar a u n o u n p r o d u c t o p o r multiplicacin repetida.
6. Hay que revisar c u i d a d o s a m e n t e las c o n d i c i o n e s extremas o f r o n t e r a de las expresiones lgicas p a r a evitar q u e nos falte o sobre u n e l e m e n t o al c o n t a r .
7. Las variables de control de los bucles f o r p u e d e n ser de c u a l q u i e r tipo escalar n o
real:
{boolean}
{char}
{ d e f i n i d o por e l

Errores tpicos de programacin

Si se utiliza u n bucle c o n t r o l a d o p o r centinela, es c o n v e n i e n t e escribir u n m e n s a j e q u e


i n d i q u e al usuario q u valor se d e b e i n t r o d u c i r c o m o centinela.
Asegurarse de inicializar a cero las variables utilizadas c o m o a c u m u l a d o r e s o totalizadores de s u m a s , y a u n o las variables utilizadas p a r a a c u m u l a d o r e s de p r o d u c t o s .
Suma := 0 ;
Suma := Suma + 1 ;

P r o d u c t o := 1 ;
P r o d u c t o := P r o d u c t o * 1;

Evitar utilizar variables reales c o m o variables de c o n t r o l de bucles.


usuario}

8. La e x p r e s i n lgica de while se d e b e c u m p l i r la p r i m e r a v e z p a r a q u e se p u e d a
ejecutar el bucle.
9. U n bucle repeat n o se d e b e utilizar a m e n o s que se tenga seguridad de q u e el bucl-e
siempre se ejecuta u n a vez, c o m o m n i m o .
10. El valor de la variable de c o n t r o l del bucle for se q u e d a i n d e f i n i d o al t e r m i n a r el
bucle.
11. Un medio p a r a simplificar la dificultad de c o m p r e n s i n de los bucles a n i d a d o s es
hacer del c u e r p o del bucle interior u n p r o c e d i m i e n t o .
12. Los programas deben ser d i s e a d o s c o n robustez suficiente p a r a su c o r r e c t a ejecucin incluso si el usuario c o m e t e errores en la entrada. Esto e n t r a a s i e m p r e verificacin de datos y operaciones i m p o r t a n t e s .
13. Asegrese q u e las variables utilizadas en un bucle son inicializadas c o r r e c t a m e n t e
antes de q u e c o m i e n c e el bucle.

RESUMEN
Las sentencias repetitivas que soporta Turbo Pascal son:
while, r e p e a t - u n t i l , f o r
Sentencia while
1.

while expresin lgica do


sentencia;

2.

while expresin lgica do


begin
S1;
S2;

Sn

end;

{Si, sentencia}

1 84

Programacin

en Turbo/Borland

Estructuras

Pascal 7

de control

repetitivas

185

El contador del bucle externo se llama Externo, y el contador del bucle interno se llama
Interno. Por cada iteracin del bucle externo se realizan cuatro iteraciones del bucle interior.

Ejemplo
Numero := 1;
{ e s c r i t u r a de l o s p r i m e r o s 100 e n t e r o s }
while Numero <= 100 do
begin
WriteLn (Numero);
Numero := Numero + 1
end;
Las sentencias del cuerpo del bucle se ejecutan mientras la expresin lgica sea verdadera.

for I n t e r n o := 1 to 4 do
W r i t e (10 * E x t e r n o + I n t e r n o ) ;
WriteLn;
La primera repeticin del bucle externo produce una salida:
14

13

12

11

22

21

La siguiente lnea ser

Sentencia repeat

24

23

y as sucesivamente. La salida de los bucles anidados es:

repeat
Suma := Suma + Nmero

read (Numero)
until Nmero < =0;

Las sentencias del interior del bucle se ejecutan hasta que la expresin lgica sea verdadera.

11
21
31
41
51

12
22 . ^
32
42
52

13
23
33
43
53

14
24
34
44
54

PROBLEMAS RESUELTOS
1. Escribir un programa que calcule la suma

Sentencia for
1. Formato bsico {incremento)

2. Formato downto (decremento)

v = variable de control de bucle


v = expresin inicial; vf = expresin final

1
1+
2

1
1
+ ++
3
n

donde n se especifica por el usuario (esta suma se llama serie armnica)


for v:=v downto vf do
begin
S1;
S2;

for v:=v to v( do
begin
S1;
S2;

Anlisis
En primer lugar se debe pedir al usuario el valor de n: en segundo lugar se debe acumular la
suma dada (variable Suma), y en tercer lugar se debe realizar n iteraciones (bucles for) y en cada
una de ellas sumar 1/1, 1/2, 1/3,..., \/n.
Diseo (Pseudocdigo)

Sn
end

Sn

end
Si slo existe una sentencia en el interior del bucle:
for v := Vj to v f do
sentencia;

for v := vi downto v f do
sentencia;

Codificacin (programa)

Ejemplos
1. for j := 100 to 500 do
begin
Suma := Suma + J ;
W r i t e L n (Suma)
end

programa Armnica
Suma < 0
leer N
{entrada del numero de trminos)
desde i
1 hasta n hacer
Suma
Suma + 1/rt
fin-desde
escribir
Suma v i s u a l i z a r la suma)

2. for E x t e r n o := 1 to 5 do
begin
for I n t e r n o := 1 to 4 do
W r i t e (10 * E x t e r n o + I n t e r n o ) ;
WriteLn
end;

program S e r i e _ r m o n i c a ;
var
I, N : i n t e g e r ;
Suma : r e a l ;
begin
Suma := 0 ;

186

Programacin

en Turbo/Borland

Pascal 7

WriteLn ('Cuantos trminos desea sumar?');


ReadLn (N);
for I := 1 to N do
S ama := S uma + 1 / I
WriteLn ('La suma de los ', N, 'primeros trminos es',
Suma :8:4)
end.
Ejecucin de muestra
Cuantos trminos desea sumar?
100
La suma de los 100 primeros trminos es 5.1874
2. Calcular la suma
1
2

2
22

2?

2"

program Sumaserie;
const Trminos = 100;
var
I
: integer;
Suma,
Potencia : real;
begin
Suma
:= 0;
Potencia := 1;
for I:= 1 to Trminos do
begin
Potencia := Potencia * 2;
Suma
:= Suma + I / Potencia
end;
WriteLn ('La suma es ', Suma:1:1)
end.

3. Contar la cantidad de nmeros negativos ledos de un terminal.


program Negativos;
v a r Numero, TotalNegativos : integer;
begin
Numero := 1;
TotalNegativos := 0;
WriteLn ('teclee varios nmeros enteros, terminando con el 0')
while Numero o 0 do
begin
Read (Numero);
if Numero < 0

Estructuras

de control repetitivas

187

then
TotalNegativos := TotalNegativos + 1
end;
WriteLn ('Total negativos: ',TotalNegativos)
end.
4. Escribir un programa que encuentre el primer valor n para el cual la siguiente suma excede a
10000: 1 + 2 + 3 + 4 + --- + *.
program Suma;
{ Encontrar el valor mas pequeo de N tal que
1 + 2 + ... + N > 10000 }
var
Total, N : integer;
begin

Total := 0;
N
:= 0;
while Total < 10000 do
begin
N
:= N + 1;
Total := Total + N
end;
WriteLn ('El numero de trminos empleados es ', N )
end.
5. Escribir un programa que permita leer una serie de enteros y contar el nmero de valores
introducidos y su suma. En este programa se utilizar un valor centinela que detecte el final de
entrada de datos y que naturalmente no puede ser un dato vlido. En este caso, como los
nmeros son positivos, puede ser un nmero negativo.
El algoritmo puede ser como sigue:
i n i c i a l i z a r Variable, Cuenta, Total
leer primer valor
mientras el numero leido no sea el c e n t i n e l a hacer
procesar el valor introducido (sumar y contar)
leer nuevo valor
fin-mi entras
escribir resultados
La variable Cuenta es un contador para contar nmero de enteros, y Total un acumulador
que contiene su suma.
program Calculo;
{ Calcula la suma de enteros positivos }
var
Cuenta, Numero, Total : integer;
begin
Cuenta := 0;
Total := 0;
Write
(' introduzca enteros positivos,');
WriteLn (' para terminar entero negativo');
ReadLn (Numero);
while Numero >= 0 do

1 88

Programacin

en Turbo/Borland

Estructuras

Pascal 7

CODIFICACIN
program FactorialWhile;
var
N
: Integer;
Fact : Longlnt;

6. Este programa permite validar datos de entrada, rechazando valores que no sean positivos y
mayores que cero.
p r o g r a m Buclel;
var Edad : integer;
begin
Write ('Introducir la edad :');
ReadLn (Edad);
while Edad <= 0 do
begin
WriteLn ('La edad debe ser positivo');
Write ('Introduzca otra edad');
ReadLn (Edad)
end;

begin
Write ('Introduzca un numero entero: ');
ReadLn (N);
Write (N, '!=');
Fact := 1;
^
while N > 0 do
begin
Fact := Fact * N;
N := N - 1
end;
WriteLn (Fact)
end.
program FactorialRepeat;
var
N
: Integer;
Fact : Longlnt;

end.
7. Transformar metros en centmetros con bucles while y repeat.
program Medidas;
var
Metros : real;
begin
Write ('Introduzca numero de metros ');
ReadLn (Metros);
while Metros > 0 do
begin
WriteLn (Metros : 6 : 2, 1 Metros Corresponde a 1 ),
Metros * 100 :10: 2, 1 centmetros');
Write ('Numero de metros a transformar en centmetros ? ');
ReadLn (Metros)
end
end.
El programa anterior se modifica cambiando la sentencia while por repeat, de la forma siguiente:
repeat

{condicion complementaria Metros >

repetitivas

189

Calcular el factorial de un nmero entero ledo desde el teclado utilizando las sentencias while,
repeat y for.

begin
Cuenta := Cuenta + 1;
Total := Total + Numero;
Write ('introduzca numero ');
ReadLn (Numero)
end;
WriteLn ('Numero de valores sumados ', Cuenta );
WriteLn ('Total=
Total)
end.

until Metros < = 0

de control

0}

begin
Write ('Introduzca un numero entero: ');
ReadLn (N);
Write (N, '!=');
fact := 1;
if N o o then
repeat
Fact := Fact * N;
N := N - 1
until N = 0;
WriteLn (Fact)
end.
program FactorialFor;
var
N,VCB : Integer;
Fact : Longlnt;
begin
Write ('Introduzca un numero entero: ');
ReadLn (N);
Write (N, '!=');
Fact := 1;
for vcb := 1 to N do

190

Programacin

en Turbo/Borland

Estructuras

Pascal 7

Fact := Fact * vcb;


WriteLn (Fact)
end.
9. Encontrar el nmero mayor de una serie de nmeros
CODIFICACION
program MayorDeUnaSerle;
{Este programa lee algunos nmeros y escribe el mayor?
var
NumDatos, j : Integer;
Siguiente, Mayor : Real;
begin
Write ('Cuantos nmeros se van a leer? : ' ) ;
ReadLn (NumDatos);
Write ('Introduzca el primer numero:1);
ReadLn (Mayor);
f o r j := 2 t o NumDatos do
begin
Write ('Introduzca el' , j, '0','numero :');
ReadLn (Siguiente);
i f Siguiente > Mayor t h e n
Mayor := Siguiente
end;
WriteLn ('El numero mayor introducido es
Mayor:1:1)
end.
10. Calcular la media de las notas introducidas por teclado con un dilogo interactivo semejante
al siguiente:
Cuntas notas? 20
Nota 1 : 7.50
Nota 2 : 6.40
Nota 3 : 4.20
Nota 4 : 8.50
Nota 20 : 9.50
Media de estas 20 : 7.475
CODIFICACION
program NotaMedia;
var
TotalNotas, NumNota : Integer;
Nota,Suma, Media
: Real;
begin
Write ('Cuantas notas desea introducir: ');
ReadLn (TotalNotas);
Suma := 0
f o r NumNota := 1 t o TotalNotas do

de control repetitivas

191

begin
Write 'Introduzca nota numero:', NumNota,'');
readln (Nota);
Suma := Suma + Nota
end;
Media := Suma / TotalNotas;
WriteLn ('Media de las
TotalNotas, 'notas :', Media:l:l)
end.

EJERCICIOS
1. 0 Cul es la salida de los siguientes programas?
a) x := 10;
A.
while x > 0 do
x : = x - 3 ;
WriteLn

b)

(x)

X
:= 1 0 ;
while x > 0 do
x : = x + 4

WriteLn

(x)

2. Cul es la salida del siguiente programa?


x := 10;
repeat
x := x - 3
until x <= 0 ;
WriteLn ( x ) ;
3. Escribir un programa que lea una lnea de texto y a continuacin visualice el ltimo carcter
ledo. As, para la entrada
S i e r r a de Cazorla
la salida ser la letra a.
4. Cul es la salida del siguiente programa?
a) for i := - 3 to 11 do
W r i t e (2 * i ) ;

b) for i := downto 1
Write ( i ) ;

5. Realizar un programa que escriba todos los nmeros pares comprendidos entre 1 y 50.
6. Cul es la salida del siguiente programa?
for j := 10 downto 1 do
for i := 1 to 10 do
WriteLn ( i , ' p o r ' , j ,

'igual a',

i * j);

7. Escribir un programa que calcule la suma de los nmeros enteros comprendidos entre 1
y 50.
8. Escribir un programa que calcule y visualice una tabla con las 20 potencias de 2.
9. Imprimir los cuadrados de los enteros de 1 a 20.

1 92

Programacin

en Turbo/Borland

PascaI 7

Estructuras

10. Dado una serie de nmeros enteros ledos de un archivo de entrada, calcular el factorial de
cada uno de ellos.

Contrato
0 a 9.000 dlares
9.001 a 15.000 dlares
15.001 a 20.000 dlares
ms de 20.000 dlares

Aumento %
20
10
5
0

Escribir un programa que solicite el salario actual del empleado y calcule y visualice el nuevo
salario.
2. La constante pi (3.1441592...) es muy utilizada en matemticas. Un mtodo sencillo de calcular su valor es:

193

comprendidos entre 1 y n. La suma de los nmeros que figuran en cada lnea, cada columna
y cada diagonal son idnticos. Un ejemplo es:
8
3
4

PROBLEMAS
1. En una empresa de computadoras, los salarios de los empleados se van a aumentar segn su
contrato actual:

de control repetitivas

1
5
9

6
7
2

Un mtodo de construccin del cuadrado consiste en situar el nmero 1 en el centro de la


primera lnea, el nmero siguiente en la casilla situada encima y a la derecha, y as sucesivamente. Es preciso considerar que el cuadrado se cierra sobre s mismo: la lnea encima de la
primera es de hecho la ltima y la columna a la derecha de la ltima es la primera. Sin
embargo, cuando la posicin del nmero caiga en una casilla ocupada, se elige la casilla
situada por debajo del nmero que acaba de ser situado.
*

7. Un nmero perfecto es un entero positivo, que es igual a la suma de todos los enteros positivos
(excluido el mismo) que son divisores del nmero. El primer nmero perfecto es 6, ya que los
divisores de 6 son 1, 2, 3 y 1 + 2 + 3 = 6.
Escribir un programa que encuentre los tres primeros nmeros perfectos.
8. El valor de e* se puede aproximar por la suma

'-'(tMtMtMt
Escribir un programa que efecte este clculo con un nmero de trminos especificado por el
usuario.
3. Escribir un programa que calcule y visualice el ms grande, el ms pequeo y la media de N
nmeros. El valor de N se solicitar al principio del programa y los nmeros sern introducidos por el usuario.
4. La fecha del domingo de Pascua corresponde al primer domingo despus de la primera luna
llena que sigue al equinocio de primavera. Los clculos que permiten conocer esta fecha
son:
A = anno mod
B = anno mod
C = anno mod
D=(19*A +
E = ( 2*B +
N = (22 + D +

19
4
7
24) mod 3 0
4 * C + 6 * D + 5) mod 7
E)

donde N indica el nmero del da del mes de marzo (o abril si N es superior a 31) correspondiente al domingo de Pascua. Realizar un programa que determine esta fecha para los aos
comprendidos entre 1990 y 2000.
5. Escribir un programa que determine si un ao es bisiesto. Un ao es bisiesto si es mltiplo
de 4 (1988), excepto los mltiplos de 100 que no son bisiestos salvo que a su vez tambin sean
mltiplos de 400 (1800 no es bisiesto, 2000 s).
6. Escribir un programa que visualice un cuadrado mgico de orden impar n, comprendido entre
3 y 11; el usuario elige el valor de n. Un cuadrado mgico se compone de nmeros enteros

1 +XH

X2

2!

X3
3!

x"

h +
ni

Escribir un programa que tome un valor de x como entrada y visualice la suma para cada uno
de los valores de 1 a 100.
9. El matemtico italiano Leonardo Fibonacci propuso el siguiente problema. Suponiendo que
un par de conejos tiene un par de cras cada mes y cada nueva pareja se hace frtil a la edad de
un mes. Si se dispone de una pareja frtil y ninguno de los conejos muertos, cuntas parejas
habr despus de un ao? Mejorar el problema calculando el nmero de meses necesarios para
producir un nmero dado de parejas de conejos.
10. Para encontrar el mximo comn divisor ( m c d ) de dos nmeros se emplea el algoritmo de
Euclides, que se puede describir as: Dados los enteros a y b {a > b), se divide a por b,
obteniendo el cociente q\ y el resto rl. Si r\ o
0, se divide r por b 1, obteniendo el cociente
ql y el resto rl. Si rl < > 0, se divide r 1 por r2, para obtener q3 y r3, y as sucesivamente. Se
contina el proceso hasta que se obtiene un resto 0. El resto anterior es entonces el mcd de los
nmeros a y b. Escribir un programa que calcule el mcd de dos nmeros.
11. Determinar si un nmero dado ledo del teclado es primo o no.
12. Calcular la suma de la serie 1/1 + lk + ... + 1 /N donde N es un nmero que se introduce por
teclado.
13. Calcular la suma de los trminos de la serie:
1/2 + 1/2 1 + 3/2 3 + ... + n/T

194

Programacin en Turbo/Borland Pascal 7

14. Visualizar en pantalla una figura similar a la siguiente:

**

CAPITULO _.

>e +S r+c sf:

LA PROGRAMACION MODULAR

siendo variable el nmero de lneas que se pueden introducir.


15. Un nmero perfecto es aquel nmero que es igual a la suma de todas sus divisiones excepto el
mismo. El primer nmero perfecto es 6. ya que 1 + 2 + 3 = 6. Escribir un programa que muestre todos los nmeros perfectos hasta un nmero dado ledo del teclado.
16. Encontrar el nmero natural N ms pequeo tal que la suma de los N primeros nmeros exceda de una cantidad introducida por el teclado.
17. Escribir un programa que calcule y visualice el ms grande, el ms pequeo y la media de N
nmeros. El valor de N se solicitar al principio del programa y los nmeros sern introducidos por el usuario.

CONTENIDO
6.1.
6.2.
6.3.
6.4.
6.5.
6.6.
6.7.
6.8.
6.9.
6.10.
6.11.

El dise^ descendente: los subprogramas


El diseo modular: los mdulos
Procedimientos
Transferencia de informacin a/desde procedimientos: los parmetros
Variables locales y globales
Efectos laterales
Ambito de un identificador
La declaracin forward
Diseo descendente y programacin modular
Incluir archivos en programas (creacin de libreras)
Puesta a punto de programas

RESUMEN
EJERCICIOS
PROBLEMAS

Una estrategia para la resolucin de problemas complejos con


computadoras es, como se ha venido comentando, la divisin o
descomposicin del problema en otros problemas ms pequeos:
subproblemas. Estos subproblemas se implementan
(se realizan)
mediante mdulos o subprogramas. Los subprogramas son una herramienta importante para el desarrollo de algoritmos y programas,
de modo que normalmente un proyecto de programacin s e compone, generalmente, de un programa principal y un conjunto de subprogramas, con las llamadas a los mismos dentro del programa principal. Los subprogramas se clasifican en procedimientos
y funciones.
En este captulo se tratar el anlisis y diseo de procedimientos,
dejando el Captulo 7 para el estudio de funciones [predefinidas (estndar) y definidas por el usuario].

6.1.

EL DISEO DESCENDENTE: LOS SUBPROGRAMAS

U n o d e los m t o d o s f u n d a m e n t a l e s p a r a resolver u n p r o b l e m a es dividirlo en p r o b l e m a s


m s p e q u e o s , l l a m a d o s subproblemas.
Estos p r o b l e m a s p u e d e n a su vez ser d i v i d i d o s
r e p e t i d a m e n t e en p r o b l e m a s m s p e q u e o s h a s t a q u e los p r o b l e m a s m s p e q u e o s s o n

195

1 96

Programacin

en Turbo/Borland

La programacin

Pascal 7

solucionados. Esta tcnica de dividir el problema principal en subproblemas se denomina, frecuentemente, divide y vencers. El mtodo de diseo se denomina diseo descendente debido a que se comienza en la parte superior con un problema general y se
disean soluciones especficas a sus subproblemas. Cada subproblema es deseable que
sea independiente de los restantes y se d e n o m i n a mdulo, de modo que cada problema
principal se subdivide en subproblemas. El problema principal se resuelve con el programa principal (tambin llamado conductor del programa), y los subproblemas (mdulos)
mediante subprogramas: procedimientos y funciones.
Un subprograma realiza una tarea concreta que se describe con una serie de instrucciones.

modular

Algoritmo
1.
2.
3.
4.
5.

Leer (y verificar) las puntuaciones.


Hacer eco en la impresin de los datos.
Ordenar las notas en orden decreciente.
Asignar calificaciones adecuadas.
Visualizar resultados.

Problema 6.1

Leer el radio de un crculo y calcular e imprimir

su superficie y longitud.

Anlisis

La resolucin de un problema comienza con una descomposicin modular y luego


nuevas descomposiciones de cada mdulo en un proceso d e n o m i n a d o refinamiento sucesivo (stepwise).

Especificaciones de entrada
Radio:

Ejemplo 6.1

Real (Radio del crculo).

Dadas las puntuaciones de una clase de informtica, ordenar las puntuaciones (notas) en
orden decreciente; a continuacin visualizar la calificacin alcanzada basada en la puntuacin. Realizar el anlisis y el algoritmo.

Especificaciones de salida

Anlisis

Algoritmo

La descomposicin modular del problema, mediante subproblemas ms pequeos, es el


diagrama de estructura:

Superficie:
Longitud:

1.
2.
3.
4.

Real (Area del crculo).


Real (Longitud de la circunferencia).

general

Leer el valor del radio.


Calcular la superficie.
Calcular la longitud.
Visualizar los valores de superficie y longitud.

Refinamiento del algoritmo


1. Leer el valor del radio.
2. Calcular la superficie:
2.1. pi <- 3.141592 {constante pi = JI}
2.2. S - pi * Radio * Radio

Superficie(S)

= n Radio2

3. Calcular la longitud:
< 5
5..6,5
6,6..8,50
>8.50

Suspenso
Aprobado
Notable
Sobresaliente

3.1. pi -3.141592
3.2. L - 2 * pi * Radio
4. Visualizar S y L.

Longitud(L)

= 2 n Radio

197

198

Programacin

en Turbo/Borland

Pascal 7

Programa

6.3.
program AreaLongitud;
{ encontrar e imprimir el area y longitud de un circulo }
const
Pi = 3.141592;
var
Radio, Superficie, Longitud : Real;
begin
{leer el valor del radio}
Write ('Introducir Rado ');
ReadLn (Radio);
{Calcular Superficie}
Superficie := Pi * Radio * Radio;
{Calcular Longitud}
Longitud := 2 * Pi * Radio;
{visualizar resultados}
WriteLn ('La superficie es', Superficie : 4 : 2);
WriteLn ('La longitud es 1 , Longitud : 4 : 2);
end.

modular

199

PROCEDIMIENTOS

U n procedimiento es u n s u b p r o g r a m a q u e realiza u n a tarea especfica. P u e d e recibir cero


o m s valores del p r o g r a m a q u e l l a m a y d e v o l v e r cero o m s valores a d i c h o p r o g r a m a
l l a m a d o r . U n p r o c e d i m i e n t o est c o m p u e s t o d e un g r u p o de s e n t e n c i a s a las que se
asigna u n n o m b r e ( i d e n t i f i c a d o r ) y c o n s t i t u y e u n a u n i d a d d e p r o g r a m a . La tarea asign a d a al p r o c e d i m i e n t o se e j e c u t a s i e m p r e q u e Pascal e n c u e n t r a el n o m b r e del procedimiento.
Los p r o c e d i m i e n t o s son obligatorios declararlos en T u r b o Pascal y d e b e n estar declarados antes de q u e p u e d a n ser r e f e r e n c i a d o s en el c u e r p o de u n p r o g r a m a .

6.3.1.

Declararon de un procedimiento

Al igual q u e cualquier o t r o i d e n t i f i c a d o r en Pascal, t o d o s los p r o c e d i m i e n t o s se deben


declarar d e n t r o del c u e r p o del p r o g r a m a . La d e c l a r a c i n de u n p r o c e d i m i e n t o no indica
a la c o m p u t a d o r a q u e ejecute las i n s t r u c c i o n e s d a d a s , sino q u e indica a la c o m p u t a d o r a
cules son estas i n s t r u c c i o n e s y d n d e estn localizadas c u a n d o sea necesario.
Declaracin

Ejecucin
Introducir Radio 4.0
La superficie es 41.26
La longitud es 25.13

6.2.

La programacin

Formato

1
procedure nombreproc;
declaraciones locales
begin
cuerpo del procedimiento
end;

EL DISEO MODULAR; LOS MODULOS

Los s u b p r o b l e m a s o m d u l o s se d i s e a n con subprogramas, q u e a su vez se clasifican en


procedimientos y funciones.
Los p r o c e d i m i e n t o s y las f u n c i o n e s son u n i d a d e s de p r o g r a m a s d i s e a d o s p a r a ejecutar u n a tarea especfica. P o r e j e m p l o , los p r o c e d i m i e n t o s p r e d e f i n i d o s , ReadLn y WriteLn, estn diseados p a r a realizar o p e r a c i o n e s de e n t r a d a y salida.
El proceso de d e s c o m p o s i c i n de u n p r o b l e m a en m d u l o s se c o n o c e c o m o m o d u l a cin y a la p r o g r a m a c i n relativa a ellos programacin
modular.
Los p r o c e d i m i e n t o s y f u n c i o n e s q u e sirven p a r a realizar los m d u l o s son similares,
a u n q u e presentan notables diferencias e n t r e ellos:
1. Las funciones, n o r m a l m e n t e , d e v u e l v e n un solo valor a la u n i d a d de p r o g r a m a
( p r o g r a m a principal u o t r o s u b p r o g r a m a ) q u e los referencia. L o s p r o c e d i m i e n t o s
p u e d e n devolver cero, u n o o varios valores. E n el caso d e n o devolver n i n g n
valor, realiza a l g u n a tarea tal c o m o a l g u n a o p e r a c i n d e e n t r a d a y / o salida.
2. A un n o m b r e de p r o c e d i m i e n t o n o se p u e d e asignar u n valor, y p o r consiguiente
n i n g n tipo est a s o c i a d o con u n n o m b r e de p r o c e d i m i e n t o .
3. U n a funcin se referencia u t i l i z a n d o su n o m b r e en u n a expresin, m i e n t r a s q u e
u n p r o c e d i m i e n t o se referencia p o r u n a l l a m a d a o i n v o c a c i n al m i s m o .

Formato

procedure nombreproc (lista parmetros formales) ;


declaraciones locales
begin
cuerpo del procedimiento
end;

nombreproc
lista parmetros formales

identificador vlido
parmetros formales del procedimiento; sirven para
pasar informacin al procedimiento y/o devolver
informacin del procedimiento a la unidad de
programa que le invoca; tiene el formato:
lista 1: tipo 1; lista 2: tipo 2;...
lista : uno o varios identificadores

200

Programacin

6.3.2.

en Turbo/Borland

Pascal 7

La programacin

Llamada al procedimiento

6.3.3.

Los p r o c e d i m i e n t o s se l l a m a n d e n t r o de u n p r o g r a m a o de otro p r o c e d i m i e n t o directam e n t e por su n o m b r e , de a c u e r d o a los f o r m a t o s 1 o 2.


Formato

201

Posicin de las declaraciones de procedimientos


en un programa

La posicin a d e c u a d a de la declaracin de los p r o c e d i m i e n t o s est e n t r e la declaracin


de variables y el p r o g r a m a principal.
p r o g r a m identficador;
constant
declaracin de tipos de datos
type
definicin de constantes
var
w
definicin de variables
definiciones de procedimientos
y funciones
<
begin
sentencias del cuerpo del programa
end;

nombreproc

Formato 2
nombreproc (lisia parmetros

modular

actuales)

la sentencia nombreproc inicia la ejecucin del procedimiento nombreproc;


despus que ha terminado la ejecucin, se ejecuta la sentencia que sigue a la llamada
al procedimiento

procedure
'

1
function
11

1
1

En resumen, un p r o c e d i m i e n t o , al igual q u e u n p r o g r a m a , c o n s t a de tres partes:


1. U n a cabecera del p r o c e d i m i e n t o q u e p r o p o r c i o n a el n o m b r e del m i s m o y, caso de
existir, u n a lista de p a r m e t r o s formales.
2. U n a seccin de declaracin q u e p u e d e c o n t e n e r c o n s t a n t e s variables e incluso
otros p r o c e d i m i e n t o s .
3. U n a seccin ejecutable: el c u e r p o del p r o c e d i m i e n t o .

Ejemplo 6 . 2
Programa

que incorpora

procedure E s t r e l l a s ;
{ v i s u a l i z a r 15 a s t e r i s c o s }
begin
i_t ( ' * * * * * * * * * * * * * * * ' )
end;

1. Procedimiento Estrellas: visualiza 15 asteriscos:


procedure E s t r e l l a s ;
{ v i s u a l i z a 15 a s t e r i s c o s }
begin
{estrellas}
Write ('***************')
end
{estrellas}
Este p r o c e d i m i e n t o n o tiene p a r m e t r o s ejecuta u n a t a r e a c o n c r e t a : visualizar asteriscos.
2. Procedimiento para calcular el Area y el P e r m e t r o d e u n rectngulo:
(Longitud, Anchura
Area, Perimetro

estrellas.

program R e c u a d r o ;

Ejemplos

procedure G e o m e t r i a

el procedimiento

: r e a l ; var
: real);

begin
{Geometria}
A r e a ;= L o n g i t u d * A n c h u r a ;
Perimetro := 2 * (Longitud + Anchura)
end;
{Geometria}
Este p r o c e d i m i e n t o , c o m o se ver m s adelante, recibe c o m o i n f o r m a c i n de entrada Longitud y Anchura, y devuelve c o m o salida Area y Perimetro.

begin
Estrellas;
Write ('Mensajes');
Estrellas
end.
Ejecucin
*************** Mensaje ***************

6 . 3 . 4 . Orden de ejecucin relativa de procedimiento


y el programa principal
C u a n d o se l l a m a a u n p r o c e d i m i e n t o , se i n s t r u y e a la c o m p u t a d o r a p a r a ejecutar las
sentencias q u e c o n s t i t u y e n el c u e r p o del p r o c e d i m i e n t o . C o m o ya se ha c o m e n t a d o para
l l a ma r a u n p r o c e d i m i e n t o , b a s t a s i m p l e m e n t e escribir en la seccin ejecutable del prog r a m a principal el n o m b r e del p r o c e d i m i e n t o q u e desea ejecute la c o m p u t a d o r a . Al

202

Programacin

en Turbo/Borland

Pascal 7

t a programacin

ejecutar la c o m p u t a d o r a la sentencia q u e llama al p r o c e d i m i e n t o , se localiza este proced i m i e n t o y se e j e c u t a n t o d a s las instrucciones del c u e r p o de ese p r o c e d i m i e n t o .
p r o g r a m demo;

modular

203

Algoritmo
1. Leer R a d i o y A l t u r a ( P r o c e d i m i e n t o Leer).
2. Calcular A r e a ( P r o c e d i m i e n t o Area).
A r e a = 2 * Pi * R * H ( R = radio, H = altura)
3. Visualizar r e s u l t a d o s ( P r o c e d i m i e n t o Salida).

p r o c e d u r e A;

p r o g r a m GeometriaUno;
{programa para calcular Superficie de un Cilindro}
const
Pi = 3.141592;
var
Radio, Altura : re#l
{datos de entrada}
Area
: real
{area calculada }

p r o c e d u r e B,
@

p r o c e d u r e Leer;
begin
Write ('Introducir Radio ');
ReadLn (Radio);
Write ('Introducir Altura ');
ReadLn (Altura)
end;

begin

:A

:
B

end;
C u a n d o el c u e r p o del p r o c e d i m i e n t o se t e r m i n a de ejecutar, se r e t o r n a al p r o g r a m a
principal y se e j e c u t a la s e n t e n c i a i n m e d i a t a m e n t e a la siguiente q u e l l a m al procedimiento.
Si en lugar d e un p r o c e d i m i e n t o el p r o g r a m a c o n t i e n e varios p r o c e d i m i e n t o s , el
orden de escritura de los m i s m o s no tiene i m p o r t a n c i a si n o se i n v o c a n u n o s a otros. En
el caso de q u e d o s p r o c e d i m i e n t o s se l l a m e n entre s, se d e b e seguir la siguiente regla de
escritura:
Si SubA y SubB son subprogramas definidos en la misma unidad de programa y si SubA es
llamado por SubB. entonces SubA debe estar definido antes de SubB.

Problema 6 . 2
Calcular

el rea de un cilindro

dado (Area = 2 * Pi * Radio

* Altura).

p r o c e d u r e CalcularArea;
{calcular area del cilindro};
begin
Area := Pi * Radio * Altura * 2
end;
procedure Salida;
{visualizar resultados de la Superficie}
begin
WriteLn ('La altura del cilindro es : ', Altura : 8 : 2);
WriteLn ('El radio del cilindro es : ', Radio : 8 : 2);
WriteLn ('El area del cilindro es : ', Area : 8 : 2);
end;
begin
Leer ;
WriteLn;
CalcularArea;
WriteLn;
Salida;
end.

programa principal}
{llamada al procedimiento Leer
llamada al proc. de calcular area
llamada al proc. de salida de datos '

G r f i c a m e n t e , el p r o g r a m a a n t e r i o r se p u e d e ver en la F i g u r a 6.1.
C u a n d o la c o m p u t a d o r a ejecuta u n a sentencia d e l l a m a d a al p r o c e d i m i e n t o (Leer), se
transfiere el control al p r o c e d i m i e n t o i n v o c a d o (flecha superior). La c o m p u t a d o r a asigna
c u a l q u i e r m e m o r i a q u e se p u e d a necesitar p a r a los d a t o s locales del p r o c e d i m i e n t o y a
c o n t i n u a c i n se e j e c u t a n las s e n t e n c i a s del c u e r p o del p r o c e d i m i e n t o . D e s p u s q u e la

204

Programacin

en Turbo/Borland

La programacin

Pascal 7

Programa principa!

procedure Leer;
begin
Write

205

3. El uso de procedimientos
facilita la divisin de las tareas de programacin
entre
un equipo de programadores.
4. Los procedimientos
se pueden comprobar individualmente
y estructurarse libreras
especficas.

Procedimiento

Leer;
WriteLn;
Area;
WriteLn;
Salida;

modular

( ' I n t r o d u c i r Radio);

6.3.6.

Diseo prctico de procedimientos

La divisin de un p r o g r a m a c o m p l e j o en p r o c e d i m i e n t o s hace los p r o g r a m a s m s legibles y m a n e j a b l e s . El t a m a o de los p r o c e d i m i e n t o s n o p u e d e ser ni m u y g r a n d e ni m u y


p e q u e o . Se d a n c o m o cifras ideales p a r a el c d i g o f u e n t e de u n p r o c e d i m i e n t o el n m e ro de lneas q u e caben en u n a o dos p a n t a l l a s d e t e x t o (25 50 lneas). La regla prctica
aconseja n o pasar de estas cifras p a r a evitar c o m p l i c a r el p r o c e d i m i e n t o .

end;
Figura 6 . 1 . Flujo de control entre programa principal y procedimiento.

Problema 6 . 3
ltima sentencia del c u e r p o del p r o c e d i m i e n t o se ejecuta, se devuelve e! c o n t r o l al programa principal (flecha inferior) y la c o m p u t a d o r a libera c u a l q u i e r m e m o r i a a s i g n a d a al
procedimiento. D e s p u s de r e t o r n a r al p r o c e d i m i e n t o , se ejecuta la siguiente s e n t e n c i a
(WriteLn).

6.3.5.

Dibujar

un tablero de ajedrez

similar

a ste.

Ventajas de utilizar procedimientos

A p r i m e r a vista, los p r o c e d i m i e n t o s parecen dificultar la escritura de u n p r o g r a m a Pascal. Sin e m b a r g o , no slo no es as, sino q u e la organizacin de u n p r o g r a m a en procedimientos lo hace m s fcil de escribir y d e p u r a r .
Las v e n t a j a s ms sobresalientes de utilizar p r o c e d i m i e n t o s son:
1. El uso de procedimientos
facilita el diseo descendente.
2, Los procedimientos
se pueden ejecutar ms de una vez en un programa
y en
diferentes programas, ahorrando en consecuencia
tiempo de programacin.
U n p r o c e d i m i e n t o , en esencia, se p u e d e ver c o m o u n a caja negra q u e e j e c u t a
u n a tarea particular en un p r o g r a m a , acepta e n t r a d a s y p r o d u c e ciertas salidas.
Entradas

Anlisis

Procedimiento
N

Se d e b e visualizar u n a fila del t a b l e r o de a j e d r e z o c h o veces. P o r ello, cada fila se va a


d i b u j a r c o n u n p r o c e d i m i e n t o de n o m b r e D i b u j a F i l a y m e d i a n t e bucles for.
Codificacin

Salidas

Una vez que un procedimiento


otros programas.

se ha escrito y comprobado,

se puede

utilizar

en

program a j e d r e z ;
uses
Crt;

2 0 6

Programacin

en Turbo/Borland

Pascal

La programacin

var
fila : integer;
procedure PintarFila (f : integer);
var
Blanco : boolean;
Columna : integer;
begin
Write (' ' : 32 ) ;
Blanco := f mod 2 = 1 ;
for Columna := 1 to 8 do
begin
if Blanco then
Write (' ')
{dibuja un cuadro blanco}
else
Write (chr (219), chr (219)); {dibuja un cuadro negro}
Blanco := not Blanco
end;
WriteLn
end;
begin
ClrScr;
for Fila := 1 to 8 do
PintarFila (Fila)
end.

6.4.

TRANSFERENCIA DE INFORMACION A/DESDE


PROCEDIMIENTOS: LOS PARAMETROS

Los p r o c e d i m i e n t o s vistos a n t e r i o r m e n t e sirven p a r a ejecutar tareas concretas, pero n o


utilizan n i n g n tipo de d a t o s del resto del p r o g r a m a . Sin e m b a r g o , u n a de las caractersticas i m p o r t a n t e s y d i f e r e n c i a d o r a s de los s u b p r o g r a m a s es la posibilidad de c o m u n i c a cin entre el p r o g r a m a principal y los p r o c e d i m i e n t o s (o entre dos p r o c e d i m i e n t o s ) . Esta
c o m u n i c a c i n se realiza a travs de u n a lista de parmetros.
U n parmetro es u n m t o d o p a r a p a s a r i n f o r m a c i n v a l o r e s a variables del
p r o g r a m a principal a un p r o c e d i m i e n t o y viceversa.
As pues, los p r o c e d i m i e n t o s se clasifican en:
procedimientos

207

de entrada
(sus valores se determinan en el
programa principal)

Procedimiento

Parmetros

de salida
(sus valores se determinan en el
p r o c e d i m i e n t o y se devuelven ai
programa principal para su proceso)

**

Figura 6.2. Transferencia de informacin a/desde procedimiento.


U n p a r m e t r o es, p r c t i c a m e n t e , u n a variable c u y o valor debe ser o bien prop o r c i o n a d o p o r el p r o g r a m a principal al p r o c e d i m i e n t o o ser devuelto desde el
p r o c e d i m i e n t o hasta el p r o g r a m a principal. P o r consiguiente, hay dos tipos de
p a r m e t r o s : parmetros
de entrada y parmetros
de salida. Los p a r m e t r o s de
e n t r a d a son p a r m e t r o s c u y o s valores d e b e n ser p r o p o r c i o n a d o s p o r el p r o g r a m a
principal, y los p a r m e t r o s de salida son p a r m e t r o s cuyos valores se calcularn en
el p r o c e d i m i e n t o y se d e b e n devolver al p r o g r a m a principal para su proceso posterior (Fig. 6.2).

E j e m p l o 6 . 3 {parmetros
El procedimiento
metro n.

de entrada)

RecuadroDos

dibuja

el nmero

de asteriscos

indicados

en el par-

procedure RecuadroDos (N : integer);


{visualizar una linea de N asteriscos}
var
J : integer;
begin
for J := 1 to N do
Write ('*')
end;

sin parmetros

(no existe c o m u n i c a c i n e n t r e el p r o g r a m a principal y los p r o c e d i m i e n t o s o e n t r e


dos p r o c e d i m i e n t o s )
procedimientos

Parmetros

modular

L a c a b e c e r a de este p r o c e d i m i e n t o i n d i c a q u e la variable N se especifica en la l l a m a d a


al p r o c e d i m i e n t o y el v a l o r d e N d e b e ser u n e n t e r o . D i f e r e n t e s l l a m a d a s al p r o c e d i m i e n t o son:

con parmetros

(existe c o m u n i c a c i n e n t r e el p r o g r a m a principal y los p r o c e d i m i e n t o s o e n t r e d o s


procedimientos)

RecuadroDos (5)
RecuadroDos (10)
R e c u a d r o D o s (2 * x - 4)

visualiza
visualiza
si x = 3, se visualiza

ie-k-k-k-k-kie-k-kie

2 0 8

Programacin

en Turbo/Borland

E j e m p l o 6 . 4 (parmetros
El procedimiento
rea y permetro
cipal.

Pascal

La programacin

procedure G e o m e t r i a

de entrada/salida)

Geometra recibe la longitud y anchura


de un rectngulo y devuelve los valores

de un rectngulo, calcula el
obtenidos al programa prin-

procedure Geometria (Longitud, Anchura : real; var Area,


Perimetro : real);
begin
Area
:= Longitud * Anchura;
Perimetro
:= 2 * ( L o n g i t u d + A n c h u r a )
end;
parmetros de entrada
parmetros de salida

6.4.1.

Lista de parmetros actuales y formales


de procedi-

nombreproc (pal, p2, p3, . . .);

Los p a r m e t r o s actuales pal, pal, pa3,. . . tienen q u e t e n e r u n o s valores q u e se


pasan al p r o c e d i m i e n t o nombreproc.
En la declaracin de un p r o c e d i m i e n t o , c u a n d o se incluyen p a r m e t r o s , stos se
d e n o m i n a n parmetros formales o ficticios ( p f l , pf2,. . . ). Ellos sirven para c o n t e n e r los
valores de los p a r m e t r o s actuales c u a n d o se invoca el p r o c e d i m i e n t o .

En el caso de q u e x = 4 e y = 7. El paso de p a r m e t r o s se p u e d e ver en la Figura 6.3.


Al ejecutar el p r o g r a m a , d a d o q u e los valores del Area y Permetro se p a s a n al
p r o g r a m a principal y se a l m a c e n a n en las variables a y p, se visualizar:
el area es
e l perimetro es

28.00
22.00

Los n o m b r e s d e los p a r m e t r o s actuales y f o r m a l e s p u e d e n ser los m i s m o s , a u n q u e


se r e c o m i e n d a sean diferentes a efectos de legibilidad del p r o g r a m a .

El valor de los parmetros actuales no se c o n o c e c u a n d o se d e c l a r a el p r o c e d i m i e n t o ;


sin e m b a r g o , c u a n d o se ejecuta la sentencia de l l a m a d a al p r o c e d i m i e n t o es preciso q u e
tengan valores asignados, ya q u e en caso c o n t r a r i o se p r o d u c i r error.

Correspondencia de parmetros

Los p a r m e t r o s actuales en la invocacin del p r o c e d i m i e n t o d e b e c oi nc i di r en n m e r o ,


o r d e n y tipo, con los parmetros ficticios de la declaracin del p r o c e d i m i e n t o . Es decir,
debe existir u n a correspondencia e n t r e p a r m e t r o s actuales y ficticios.

Parmetros

actuales

4
7
a

program Correspondencia;
var
X, Y,A,P : real;

var A r e a ,

begin { Geometria }
Area
:= L o n g i t u d * A n c h u r a ;
P e r i m e t r o := 2 * ( L o n g i t u d + A n c h u r a )
end;

procedure nombre proc ( p f l , p f l , pf3, . . . )

6.4.2.

2 0 9

begin
WriteLn ( ' I n t r o d u c i r l o n g i t u d ' ) ;
ReadLn
(X);
WriteLn ( ' I n t r o d u c i r a n c h u r a ' ) ;
ReadLn
(Y) ;
Geometria (X,Y,A,P);
{ llamada al procedimiento }
WriteLn
('El area es ', A:6:2);
WriteLn
( ' E l p e r i m e t r o es
P:6:2)
end.

Longitud, Anchura
Area, Permetro

Las sentencias llamadas a p r o c e d i m i e n t o s c o n s t a n de dos partes: un nombre


m i e n t o y una lista de parmetros llamados actuales:

(Longitud, Anchura : r e a l ;
Perimetro : r e a l ) ;

modular

P
Figura 6.3.

Parmetros

formales

Longitud
Anchura
Area(28)
Parametro(22)
Paso de parmetros.

210

Programacin

6.4.3.

en Turbo/Borland

Pascal

La programacin

Parmetros valor y variable

program FC;
{Este programa transforma grados Fahrenheit en Celsius}
var
Fahr
: real;
Celsius : real;

procedure Uno (pl,p2 : r e a l ; v a r p 3 , p4 : r e a l ) ;

parmetros

procedure Convertir (F : real; var C : real);


begin
C := (5/9) * (F - 32)
end;

variable

P a r m e t r o s valor

begin
WriteLn ('Convertir Fahrenheit en Celsius');
WriteLn ('IntrodiAca temperatura en grados Fahrenheit');
ReadLn (Fahr);
Convertir (Fahr, Celsius);
Write ('El equivalente a ',Farh:4:l, ' grados Fahrenheit es ');
WriteLn (Celsius:4:1, ' grados Celsius')
end.

Los parmetros valor son p a r m e t r o s unidireccionales q u e se utilizan para p r o p o r c i o n a r


i n f o r m a c i n a u n p r o c e d i m i e n t o , pero n o p u e d e n devolver valores. Si la p a l a b r a var n o
aparece d e l a n t e del p a r m e t r o f o r m a l en u n p r o c e d i m i e n t o , la c o m p u t a d o r a s u p o n e q u e
el p a r m e t r o f o r m a l es un p a r m e t r o valor. En la l l a m a d a al p r o c e d i m i e n t o el valor del
p a r m e t r o actual se pasa a la variable q u e r e p r e s e n t e el p a r m e t r o actual. Este valor
p u e d e ser m o d i f i c a d o d e n t r o del p r o g r a m a , pero su valor n o se p u e d e devolver al programa o procedimiento llamador.
Ejecucin

Ejemplo 6 . 5
Escribir
sius.

un programa

211

Codificacin

Los p a r m e t r o s , en Pascal, se p u e d e n clasificar en: parmetros


valor y parmetros
variable. L o s p a r m e t r o s valor se listan en la lista de p a r m e t r o s p o r sus i d e n t i f i c a d o r e s , y los
p a r m e t r o s variables c o n la p a l a b r a r e s e r v a d a var antes del i d e n t i f i c a d o r .

parmetros valor

modular

Pascal

que convierta

temperaturas

en grados

Fahrenheit

a Cel-

Convertir Fahrenheit en Celsius


Introduzca temperatura en grados Fahrenheit
212
El equivalente a 212.0 grados Fahrenheit es 100.0 grados Celsius

Anlisis
La f r m u l a de conversin de grados F a h r e n h e i t a Celsius es:

Celsius =

(Fahr - 32)

P a r m e t r o s variable
En la declaracin de u n p r o c e d i m i e n t o , los n o m b r e s d e los p a r m e t r o s variables estn
precedidos con la palabra var. Los p a r m e t r o s variable se utilizan t a n t o para recibir c o m o
p a r a t r a n s m i t i r valores entre el s u b p r o g r a m a y el p r o g r a m a l l a m a d o r .
U n p a r m e t r o variable p u e d e a c t u a r de p a r m e t r o de salida o de e n t r a d a / s a l i d a .

Algoritmo
programa Temperaturas
var Fahr, Celsius : real
inicio
leer temperatura Fahrenheit (Fahr)
llamar-a Convertir (Fahr, Celsius)
v i s u a l i z a r temperaturas Celsius
fin
procedimiento Convertir (Fahr : r e a l )
var Celsius : real
inicio
Celsius
(5/9) * (Fahr - 32)
escribir
'Los grados centigrados s o n ' , Celsius
fin

Ejemplo 6 . 6
Intercambiar

los valores de dos variables

con un procedimiento.

procedure Intercambio (var a, b : integer);


{intercambiar contenidos de a y b}
var
aux : integer;
begin
aux := a;
a
: = b;
b
:= aux
end;
{intercambio}
C o m o a y b d e b e n c a m b i a r sus valores, d e b e n ser p a r m e t r o s variables.

212

Programacin

en Turbo/Borland

La programacin

Pascal 7

Turbo Pascal protege a los parmetros actuales de modificacin a menos que el parmetro
formal correspondiente sea variable (est precedido por var).
Los cambios realizados en los parmetros valor no se hacen en los parmetros actuales
correspondientes.

Problema 6 . 4
Este programa
correspondencia

ilustra la diferencia
entre ellos.

entre parmetros

valor y variable

en Pascal

y Ja

program EjemploParametros;
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 ('Despues del retorno del procedimiento Pasar');
Imprimir (A, B, C)
end.

La salida de este p r o g r a m a 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
Despues del retorno del procedimiento Pasar
a=2
b=3
c=6

modular

213

Reglas de sintaxis
l. La lista de parmetros formales est siempre encerrada entre parntesis. Consta de una o
m s listas de identificadores. .Cada lista puede estar precedida por var: Los identificadores estn separados por comas, las listas de identificadores estn separadas por puntos y
comas, y. cada lista debe finalizar con un carcter dos puntos,/seguido por un tipo de
datos.
2..Una-lista-de parmetros actuales puede ser una lista de expresiones^ variables o constan- ,
tes separadas por comas.
3. La correspondencia entre parmetros actuales y formales se determina por la posicin en
su respectiva lista de parmetros. La lista debe ser del mismo tamao. Los nombres de
los parmetros correspondientes actuales y formales pueden ser diferentes.

4. En parmetros variables, los tipos de; parmetros, correspondientes actual y formales


deben ser idnticos.
5. En los parmetros variables, un parmetro actual debe ser una variable. En los parmetros valor, un parmetro actual debe ser una variable, una constante, funcin o una expresin.

Ejemplos
program Test;
var
x, y : real;
p
: integer;
Aux : char;

procedure Prueba (a, b : integer; var c, d : real; var e : char);


Sentencias

de llamada vlidas

Prueba (40, p, x, y, Aux);


Prueba (25, 3 * p, x, y, Aux);
Sentencias

de llamada no vlida

Prueba (p, 10, 40, y, 'e')


Prueba (20, 40, m, n, l)

cqnstantes 40 y 'e' no pueden ser parmetros


variables
m, n y 1 no estn declarados en el programa
principal

C u n d o utilizar p a r m e t r o s v a l o r o v a r i a b l e
Algunas reglas a seguir p a r a utilizar u n o u o t r o tipo de p a r m e t r o son:
Si la i n f o r m a c i n q u e se pasa al p r o c e d i m i e n t o n o tiene q u e ser d e v u e l t a f u e r a del
p r o c e d i m i e n t o , el p a r m e t r o f o r m a l q u e r e p r e s e n t a la i n f o r m a c i n p u e d e ser un
p a r m e t r o valor ( p a r m e t r o de entrada).

214

Programacin

en Turbo/Borland

La programacin

Pasca/ 7

Si se tiene q u e devolver i n f o r m a c i n al p r o g r a m a l l a m a d o r , el p a r m e t r o f o r m a l
q u e representa esa i n f o r m a c i n debe ser un p a r m e t r o variable [parmetro de
salida).

program P o l a r e s ;
{ programa p a r a c o n v e r t i r coordenadas p o l a r e s a r e c t a n g u l a r e s
var
Radio, Angulo, Abscisa , Ordenada : r e a l ;
Respuesta : i n t e g e r ;

Problema 6 . 5
polares

(r, 0) de

un punto

P a coordenadas

procedure C o n v e r s i n
begin
X := R * Cos ( T ) ;
Y := R * S i n (T)
end;

rectangu-

I n t r o d u z c a c o o r d e n a d a s p o l a r e s d e un p u n t o
2.0 1.1
Coordenadas r e c t a n g u l a r e s : a b s c i s a = 0.91 y ordenada =1.78

procedure C o n v e r s i n ( r , T h e t a : r e a l ; var x , y : r e a l ) ;
{procedimiento para convertir
coordenadas
p o l a r e s (r,
a coordenadas r e c t a n g u l a r e s (x, y)}
begin
{conversin}
x := r * e o s ( T h e t a ) ;
y := r * s i n ( T h e t a )
end;
{conversin}

parmetros variable

Mas c o o r d e n a d a s : 0 = No, 1 = S i ?
1
I n t r o d u z c a c o o r d e n a d a s p o l a r e s d e un p u n t o
2.2 1.78
Coordenadas r e c t a n g u l a r e s : a b s c i s a = - 0 . 4 6 y ordenada = 2.15

Theta)

Los valores de r y Theta se reciben en el p r o c e d i m i e n t o p r o c e d e n t e s del p r o g r a m a


principal, y no se tiene q u e devolver al p r o g r a m a principal; p o r consiguiente, son parmetros valor. Por el c o n t r a r i o , los resultados de x e y se tienen q u e devolver p o r el
p r o c e d i m i e n t o al p a r m e t r o , y d e b e n ser p a r m e t r o s variables:
r , Theta

var X,Y: r e a l ) ;

Ejecucin

El siguiente p r o c e d i m i e n t o realiza esta conversin:

parmetros valor

(R,T : r e a l ;

begin
repeat
*
W r i t e L n ( ' I n t r o d u z c a c o o r d e n a d a s p o l a r e s d e un p u n t o ' ) ;
ReadLn ( R a d i o , A n g u l o ) ;
Conversin (Radio, Angulo, A b s c i s a , Ordenada);
Write ('Coordenadas r e c t a n g u l a r e s : abscisa = ', Abscisa:4:2);
WriteLn ( ' y ordenada =' , Ordenada : 4 : 2 ) ;
WriteLn;
W r i t e L n ( ' M a s c o o r d e n a d a s : 0= No, 1 = S i ? ' ) ;
ReadLn ( R e s p u e s t a )
until R e s p u e s t a <> 1
end.

Las f r m u l a s q u e c o n v i e r t e n las c o o r d e n a d a s polares de un p u n t o a rectangulares


son:
x = r cos6
y = r senO

215

Programa

Si la i n f o r m a c i n q u e se pasa al p r o c e d i m i e n t o p u e d e ser m o d i f i c a d a y se devuelve


un nuevo valor, el p a r m e t r o f o r m a l q u e representa a esa i n f o r m a c i n d e b e ser un
p a r m e t r o variable {parmetro de entrada/salida).

Convertir las coordenadas


lares (x, y).

modular

x,y

El p r o g r a m a m u e s t r a u n a aplicacin c o m p l e t a , que lee las c o o r d e n a d a s de u n p u n t o ,


llama al p r o c e d i m i e n t o Conversin para e n c o n t r a r las c o o r d e n a d a s r e c t a n g u l a r e s de ese
p u n t o y a c o n t i n u a c i n visualiza estas c o o r d e n a d a s .

Mas c o o r d e n a d a s
0

6.4.4.

: 0 = No, 1 = S i ?

Clasificacin de los parmetros

Existen c u a t r o tipos de p a r m e t r o s : valor, constante,

Parmetros

v a d a var.
Parmetros
tipo.

variable y sin tipos.

valor, g r u p o de p a r m e t r o s s e g u i d o p o r u n t i p o , p e r o sin p a l a b r a reserconstantes',

g r u p o de p a r m e t r o s p r e c e d i d o s p o r const y seguidos p o r u n

216

Programacin

Parmetros
Parmetros
un tipo.

en Turbo/Borland

La programacin

Pascal 7

variable: g r u p o de p a r m e t r o s p r e c e d i d o r p o r var y seguido p o r u n tipo.


sin tipo: g r u p o de p a r m e t r o s precedidos p o r var y const y n o seguidos p o r

Los p a r m e t r o s tipo array y c a d e n a (string) p u e d e n ser parmetros


sifican del siguiente m o d o :

abiertos.

Se cla-

Parmetros cadena abierta: es u n p a r m e t r o variable d e c l a r a d o u t i l i z a n d o el identific a d o r O p e n S t r i n g , o utilizando la p a l a b r a reservada s t r i n g (en el e s t a d o {$P+}).

Parmetros
array abierta: u n p a r m e t r o valor, v a r i a b l e o c o n s t a n t e d e c l a r a d o m e d i a n t e la sintaxis de array of.

D a d o q u e los p a r m e t r o s valor y variable ya h a n sido t r a t a d o s , a n a l i z a r e m o s los o t r o s


dos tipos: constantes y sin tipo. P o r su i m p o r t a n c i a , d e d i c a r e m o s u n a seccin especfica
p a r a t r a t a r los arrays abiertos.

6.4.5.

217

m i e n t r a s q u e u n p a r m e t r o sin tipo d e c l a r a d o , u t i l i z a n d o la palabra r e s e r v a d a const es


d e slo lectura.
U n s u b p r o g r a m a con p a r m e t r o s sin tipo t i e n e u n a sintaxis c o m o esta:
f u n c t i o n ParSinTipos ( v a r Primero, Segundo; Longitud:Word) :
Boolean
C o n s i d e r e m o s u n e j e m p l o c o m o el siguiente:
p r o c e d u r e Ejemplo ( v a r x ) ;
var
y: Integer Absoiute x;
begin
WriteLn (y);
{legal: y de tipo Integer}
WriteLn (x);
{No Aegal; no tiene tipo}
end;

Parmetros constante

U n parmetro constante es u n p a r m e t r o c u y o valor n o se p u e d e m o d i f i c a r en el proced i m i e n t o o f u n c i n al q u e se pasa el p a r m e t r o . P o r c o n s t r u c c i n , u n p a r m e t r o const a n t e sigue las m i s m a s reglas q u e u n p a r m e t r o valor real y p o r c o n s i g u i e n t e slo se p a s a
en u n a direccin. N o se p u e d e asignar u n valor al p a r m e t r o en el i n t e r i o r del s u b p r o g r a m a ni se p u e d e p a s a r , p o r n a t u r a l e z a , el p a r m e t r o p o r r e f e r e n c i a a o t r o s u b p r o grama.
U n p a r m e t r o c o n s t a n t e f o r m a l a c t a c o m o u n a variable local de slo l e c t u r a q u e lee
su valor del c o r r e s p o n d i e n t e p a r m e t r o real tras la activacin del p r o c e d i m i e n t o o f u n cin. Las asignaciones a p a r m e t r o s c o n s t a n t e s f o r m a l e s n o estn p e r m i t i d a s .
La sintaxis de u n p a r m e t r o c o n s t a n t e se m u e s t r a en las siguientes d e f i n i c i o n e s de
procedimiento y funciones.
p r o c e d u r e EjemploConstante (const Cad : String);
f u n c t i o n Suma (const t : a r r a y of Integer) : Integer;

6.4.6.

modular

Parmetros sin tipo

Los p a r m e t r o s d e f i n i d o s utilizando u n tipo de d a t o p r e d e f i n i d o (Real, Integer, etc.). Se


d e n o m i n a n parmetros
con tipo. T u r b o Pascal 6.0 y 7.0 p e r m i t e n el uso de parmetros
sin tipo.
Los parmetros sin tipo, c o m o su p r o p i o n o m b r e indica, p a s a n p a r m e t r o s a u n a r u tina sin especificar u n tipo p o r los p a r m e t r o s . Al c o n t r a r i o q u e los p a r m e t r o s c o n t i p o
d o n d e el c o m p i l a d o r se encarga de verificar la c o r r e s p o n d e n c i a de tipos e n t r e los p a r m e t r o s reales y formales, en los p a r m e t r o s sin tipo el p r o c e d i m i e n t o a c e p t a c u a l q u i e r
cosa q u e se le pase y espera q u e el p r o g r a m a d o r sepa m a n i p u l a r l o . P o r esta r a z n , los
parmetros sin tipo se deben utilizar con precaucin.
C u a n d o u n p a r m e t r o f o r m a l es u n p a r m e t r o sin tipo, el c o r r e s p o n d i e n t e p a r m e t r o
real (actual) p u e d e ser cualquier variable o c o n s t a n t e , c o n i n d e p e n d e n c i a de u n tipo. U n
p a r m e t r o sin tipo declarado, u t i l i z a n d o la p a l a b r a r e s e r v a d a var, p u e d e ser m o d i f i c a d o ,

C o m o se ve en estos ejemplos, x es u n p a r m e t r o tipo, pero requiere ir p r e c e d i d o polla p a l a b r a reservada var, ya q u e t o d o s los p a r m e t r o s sin tipo d e b e n ser p a r m e t r o s variables o p o r referencia.
L o s p a r m e t r o s sin tipo son tiles en a l g u n o s casos n o m u y frecuentes. P o r e j e m p l o ,
u n a f u n c i n q u e c o m p a r a dos variables c u a l e s q u i e r a y de cualquier t a m a o .
f u n c t i o n Comparar ( v a r x , y; Tamanyo: Word): Boolean;
type
TLista = a r r a y [0..65534] of Byte;
var
j :Word;
begin
j := 0 ;
w h i l e ( j < Tamanyo) and (TLista(y)[j] = T l i s t a ( x ) [ j ]
Inc(j);
Comparar := j = Tamanyo;
end;
U n p r o g r a m a q u e hace uso de la f u n c i n C o m p a r a r es:
p r o g r a m PruebaComparar;
var
Cadl : Integer;
Cad2 : String
{...}
begin
Cadl := $32256;
Cad2 := ' 75 ' ;
i f Comparar (Cad2[l], Cadl, 2) t h e n
WriteLn ('Si de acuerdo')
else
WriteLn ('No, desacuerdo');
end;

do

218

Programacin en Turbo/Borland Pascal 7

La programacin modular
WriteLn (A : 12, B :5, Aux :5)
WriteLn;
Intercambio (A, B);

Precaucin
Los parmetros sin tipo proporcionan gran flexibilidad, pero a costa de grandes riesgos, L1
compilador no puede verificar las variables sin, tipo.

6.5.

VARIABLES LOCALES Y GLOBALES

Las variables que intervienen en un programa con procedimientos pueden ser de dos
tipos: variables locales y variables globales.
Una variable local es una variable que est declarada dentro de un subprograma, y
se dice que es local al subprograma. Una variable local slo est disponible durante el
funcionamiento del mismo. Su valor se pierde una vez que el subprograma puede hacer
referencia a las variables locales declaradas en el mismo.
Las variables declaradas en el programa principal se denominan variables globales.
Al contrario que las variables locales, cuyos valores se pueden utilizar slo dentro del
subprograma en que estn declaradas, las variables globales pueden ser utilizadas en el
programa principal y en todos los subprogramas.
Regla
Las variables globales se declaran en el programa principal, mientras que las variables locales se declaran en un subprograma.

Ejemplo 6 . 7
program Test;
var
A, B, : integer;
Aux
: integer;

WriteLn ('Valores de A, B y Aux despues de la llamada a


Intercambio');
WriteLn (A : 12, B : 5, Aux : 5)
end;

Ejecucin
Valores de A, B y Aux antes de la llamada a Intercambio
1
2
3
2
1
.1
Valores de A, B y Aux despues de^la llamada a Intercambio
2
1
3

La variable Aux es una variable local y tambin es una variable global. En el caso de
Aux, variable local, existe slo durante la ejecucin del procedimiento y no se puede
utilizar fuera del procedimiento. Las variables A y B son globales y se podran utilizar en
subprogramas. Sin embargo, es mucho ms eficiente utilizar parmetros para transferir
informacin, a y desde un subprograma, como es el caso del programa anterior.
Qu sucede e n e s t e caso con dos variables Aux? Una es global y otra local. Cul es
la relacin entre estas dos variables? Son diferentes o iguales?: Tienen el mismo nombre,
pero son diferentes. En el caso de coincidir en un mismo programa dos variables con el
mismo nombre, una global y otra local, la variable global no tiene actuacin en el
subprograma en que est definida la variable local. Dicho de otro modo, en el subprograma tiene prioridad la variable local y por tanto no puede tomar ningn valor la variable
global. En esencia coexisten las dos variables, aunque lgicamente no es una prctica recomendada.
Problema 6 . 6

procedure Intercambio (var X, Y : integer);


var
Aux : integer
begin
Aux := X;
X
: = Y;
Y
:= Aux;
WriteLn (A:12, B:5, Aux:5)
end;
begin
A
: = 1;
B
:= 2;
Aux := 3;
WriteLn ('Valores de A, B y
Intercambio');

219

Aux antes de la llamada a

Escribir tres programas que permitan determinar y visualizar el ms grande de dos


nmeros dados. Utilizar en cada programa un procedimiento Mayor con las siguientes
caractersticas: a) slo variables globales, b) transferencia de parmetros por valor,
c) transferencia de parmetros por variable.
Variables globales
program Calculono;
var
X,Y,Max : real;
procedure Mayor;
begin
if X > Y
then
Max := X
else
Max := Y;
WriteLn ('El mayor de los nmeros introducidos es ' ,Max:4:2)
end;

220

Programacin en Turbo/Borland Pascal 7

La programacin modular

begin
repeat
Write
('Introduzca dos nmeros ');
ReadLn (X,Y);
Mayor
until X = 0
end.

else
Max :
end;
begin
repeat
Write
ReadLn
Mayor
WriteLn
until X
end.

Este mtodo presenta graves inconvenientes. Esencialmente que el procedimiento Mayor slo puede tratar las variables x e y, en consecuencia no es general.
Parmetros por valor
program CalculoDos;
var
X, Y : real;
procedure Mayor (A,B: real);
var
Max : real;
begin
if A > B
then
Max := A
else
Max := B;

6.6.

var
m : integer;
procedure MalaPractica;
begin
WriteLn ('Introduzca un numero');

Write ('Introduzca dos nmeros ');


ReadLn (X,Y);
Mayor (X,Y)
until X = 0
end.

program CalculoTres;
var
X,Y,Grande : real;
procedure Mayor( A,B : real; var Max : real);
begin
if A > B
then
Max := A

EFECTOS LATERALES

Pascal permite a los subprogramas (procedimientos y funciones) modificar el valor de


variables globales que no son parmetros actuales. Supngase que m es una variable global de tipo integer, el compilador traducir sin errores el siguiente procedimiento:

begin
repeat

Parmetros por valor y por variable

('Introduzca dos nmeros


(X,Y);
(X,Y,Grande);
Grande :4:2 )
('El mayor es
0

En este caso el procedimiento recibe los dos valores a comparar a travs de los
parmetros de entrada a y b. Se determina a continuacin el ms grande de los dos
valores {Max) y se transmite al programa llamador al parmetro Grande, que es el valor
que se visualiza por ser el mayor.

WriteLn ('El mayor de los nmeros introducidos es ' ,Max:4:2)


end;

En este programa los parmetros formales a y b reciben, cuando son llamados, los
valores contenidos en los parmetros actuales o reales x e y.

221

ReadLn (m);
WriteLn ('le dar ese numero 1 );
end.

El valor de m se ha modificado dentro del procedimiento y, por consiguiente, si a partir de este punto se utiliza en el programa llamador, tomar este ltimo valor. Sin embargo, aunque permitido, casi siempre es una mala idea utilizar variables globales de
esta forma.
Un efecto lateral es la accin de modificar el valor de una variable global en un subprograma.
Regla
Evite utilizar variables globales en subprogramas.
Si se desea transferir la informacin contenida en alguna variable global a un procedimiento. debe hacerlo a travs del uso de parmetros. No slo evita los efectos laterales,

222

La programacin modular

Programacin en Turbo/Borland Pascal 7

sino que mejora la legibilidad de un subprograma. Ya que todos los parmetros se listan
en la cabecera del subprograma. necesita consultar la lista de los mismos para determinar las entradas y salidas del procedimiento. Si no se utilizan parmetros, tendr que
consultar el cuerpo del subprograma para determinar las entradas y salidas.

223

nivel superior

Programa principal

Ejemplo 6 . 8
program EfectosLaterales;
var
J : integer;

Proel

procedure Lateral;
begin
for J := 1 to 100 do
WriteLn ('J ahora vale
end;
begin
J := 8;
WriteLn (J)
Lateral;
WriteLn (J);
end.

Func3

J)

Figura 6 . 5 . P r o g r a m a principal y p r o c e d i m i e n t o s a n i d a d o s .

{EfectosLaterales}
{se visualiza 8}
{se visualiza 100}

AMBITO DE UN IDENTIFICADOR

Los programas Pascal tienen estructura tipo rbol. El programa principal es la raz y de
ste penden muchas ramas (procedimientos y funciones). De estas ramas, a su vez,
pueden pender otras ramas ms pequeas (procedimientos y funciones anidados dentro

del programa principal y otros subprogramas). Por ejemplo, en la Figura 6.5, Proel,
Proc2 y Func3 (abreviaturas de procedimiento 1, -2 y funcin 3) estn anidados dentro
del programa principal. Dos de stos (Proel y Func3) tienen sus propios procedimientos
y funciones anidados con ellos. Este es un nuevo nivel de anidamiento de orden o nivel
dos.
En resumen, un programa puede contener diferentes bloques (procedimientos o funciones) y un procedimiento puede a su vez contener otros procedimientos, que se dice
estn anidados.
La organizacin de los procedimientos se representa tambin como bloques de programa. Un bloque es la parte de declaracin (incluyendo cualquier lista de parmetros) y
el cuerpo del programa o procedimiento.

Programa principal
otros procedimientos
Declaraciones

const
type
var
procedure
function

'

Efectos
laterales

Lista de parmetros
actuales

>

1
Procedimiento

Figura 6 . 4 . E f e c t o s laterales.

segundo nivel

tercer nivel

La interaccin o comunicacin entre un procedimiento y el programa debe realizarse


completamente a travs de parmetros y no de variables globales (Fig. 6.4).

6.7.

Proc2

Cuerpo

Figura 6 . 6 . Un b l o q u e .

224

La programacin modular

Programacin en Turbo/Borland Pascal 7

procedure A
const

225

Program Demo:
const

var
var
procedure B
begin

p r o c e d u r e A;

end;

var

begin Aj

procedure B
begin {B

end;

A}

end;

j B}

Figura 6 . 7 . P r o c e d i m i e n t o s a n i d a d o s .
begin |A

l/n programa puede ser definido como una cabecera de programa, un bloque y un
punto. Un procedimiento, como se sabe similar en Pascal, consta tambin de cabecera de
procedimiento seguido por un bloque y un punto y coma.
Como se puede ver en la Figura 6.7, el primer nivel de procedimientos puede contener otro nivel de anidamiento, y as sucesivamente.
Los bloques en los que un identificador puede ser utilizado se conocen como mbito
del identificador, dicho de otro modo, el mbito es la seccin de un programa en la que
un identificador es vlido, y las reglas que definen el mbito de un identificador se
llaman reglas de mbito.

6.7.1.

end;

A}

p r o c e d u r e C;
begin
end;

begin principal j

Reglas de mbito
end.

1. El mbito de un identificador es el dominio en que est declarado. Por consiguiente. un identificador declarado en un bloque P puede ser representado en el
procedimiento P y en todos los procedimientos encerrados en el procedimiento P.
(Cualquier identificador se puede utilizar en cualquier parte del bloque en que est
declarado o en cualquier bloque anidado.)
2. Si un identificador j declarado en el procedimiento p se redeclara en algn procedimiento interno q encerrado en p, entonces el procedimiento q y todos sus procedimientos encerrados se excluyen del mbito de j declarado en p.
En la Figura 6.9 el programa EjemploAnidados contiene tres procedimientos, A, B y C.
A y B estn anidados; en consecuencia, el mbito de un identificador declarado en el procedimiento A (externo) incluye el bloque del procedimiento B (interno). Por consiguiente,
un identificador declarado en A (por ejemplo, la variable n) puede ser referenciado en el
cuerpo de cualquiera de los dos procedimientos. El parmetro formal w tiene un mbito

{principal}

Figura 6 . 8 . Organizacin de un p r o g r a m a c o m p l e j o en b l o q u e s .

restringido solamente al procedimiento interno B. Este parmetro w no puede ser reerenciado en el cuerpo del procedimiento A (externo), ni en el procedimiento B, ni en el
cuerpo del programa principal. Lo mismo se puede decir de las variables p y q.
w, p, q son locales al p r o c e d i m i e n t o B

Cualquier identificador declarado en el programa principal, por ejemplo k, x, y al


ser globales, puede ser referenciado en cualquier parte del programa.

226

La programacin modular

Programacin en Turbo/Borland Pascal 7

Ejemplo 6,9
Program EjemploAnidados;

const k = 2.71828;

-Ambito

de Y

var x, y : r e a l ;
procedure A e x t e r n o }

(var x : r e a 1
var m, n : i n t e g e r ;

de M

Declaraciones mltiples de identificadores

Un identificador slo puede estar declarado en un procedimiento; sin embargo, el mismo identificador se puede declarar en ms de un procedimiento, siendo en este caso diferentes:
x
x

procedure B i n t e r n o }

(w : Real]

Aunque las variables globales x e y pueden ser referenciadas en procedimientos, tal


como se ha comentado, es una prctica peligrosa. Sin embargo, si es posible, referenciar
una constante global en un procedimiento ya que Pascal no permite que el valor de una
constante sea modificado, y, en consecuencia, no se puede considerar un efecto lateral el
referenciar una constante global dentro de un procedimiento (este es el caso de la constante global k).

6.7.2.
-Ambito

-Ambito

de w

var p, q : i n t e g e r ;

variable global en el programa principal.


parmetro formal en el procedimiento A.

Cuando se referencia x en el cuerpo del procedimiento A o B, se est manipulando


el parmetro x. Cuando se referencia x fuera del bloque A-B se manipula la variable global x.

begin i n t e r n o }
T a b l a 6 . 1 . Referencia d e i d e n t i f i c a d o r e s vlidos

end; j i n t e r n o }
Bloque

Identificador

Significado de cada identificador

begin e x t e r n o }
EjemploAnidados

k,

y
A, C
x,

end; externo}

Ambito

de IVA
B

begin

m, n
8
y
B, C
k

procedure C

(var L e t r a : C h a r ) ;
const IVA = 12

1 etra
IVA
x, y
k
A, C

p a r m e t r o de c
constante local
variables locales
constante global
procedimientos declarados en E j e m p l o A n i d a d o s

begi n
C

Figura 6 . 9 . P r o c e d i m i e n t o s a n i d a d o s .

p a r m e t r o s de A
variables locales
procedimiento local
variable declarada en E j e m p l o A n i d a d o s
procedimientos declarados en E j e m p l o A n i d a d o s
constante global

B
y
A, B
k

end;

constante global
variables globales
procedimientos declarados en E j e m p l o A n i d a d o s

parmetros de B
variables locales
variable declarada en A
p a r m e t r o de A
p r o c e d i m i e n t o declarado en A
variable declarada en E j e m p l o A n i d a d o s
procedimientos declarados en E j e m p l o A n i d a d o s
constante global

p. q

end

227

228

Programacin en Turbo/Borland Pascal 7

La programacin modular

6.7.3.

Regla
Si un identificador no est declarado localmente, las reglas de mbito requieren que el compilador utilice la declaracin ms prxima de un bioque externo que contenga e! punto de
referencia.
Referencia a n declarado en los procedimientos A o B, se utiliza la declaracin local
del identificador n.
Referencia a m en el procedimiento B, en el que no est declarado localmente, se
utiliza la declaracin de la variable m en el procedimiento A.
Referencia a m, en el cuerpo del programa principal o en el procedimiento C, produce un error de sintaxis.

Llamadas a procedimientos

Como los nombres de los procedimientos son identificadores, las reglas de mbito especifican dnde puede ser referenciado o llamado un procedimiento.
En el ejemplo, los identificadores A y C son globales (estn declarados en el programa
principal) y pueden ser llamados en cualquier parte del programa. El procedimiento B
(interno) est declarado en el procedimiento A (externo), de modo que slo puede ser
llamado por el procedimiento A o por el propio B (en lo que se llamar posteriormente
llamadas recursivas de procedimientos). Cualquier llamada a B desde el cuerpo del procedimiento C o desde el cuerpo del programa principal producir un error de sintaxis.
i d e n t i f i e r is undeclared

Regla

i d e n t i f i e r not d e c l a r e d

Ejemplo 6 . 1 0
Ambito de identificador.
program A
procedure B
procedure C
begin
jC(

Cuando un subprograma llama a otro subprograma, el subprograma llamado debe aparecer


en la seccin de declaracin antes del programa llamador. La razn es que cuando el compiladorencuentra una llamada a un subprograma, el compilador:ebehaber visto-anterior-:''
mente ese subprograma en la seccin de declaracin (Fig. 6.7).

Program A

procedure B
end;
begin

end;

|C
procedure C

Bj

Bj

procedure D
procedure E
begin
E|

procedure D
procedure E

end;
begin

Retorno

procedure F

end;
procedure F
begin

end;
begin

Variables y constantes
declaradas en

ID)
I Al

229

program
procedure
procedure
procedure
procedure
procedure

Pueden ser utilizadas


en el cuerpo de

A
B
C
D
E
F

A, B, C, D, E, F
B, C
C
D, E, F
E
F

Retorno

terminado

end;
Figura 6 . 1 0 . A m b i t o d e identificadores.

Figura 6 . 1 1 . Llamada d e un s u b p r o g r a m a a o t r o .

230

6.8.

La programacin modular

Programacin en Turbo/Borland Pascal 7

LA DECLARACIN FORWARD

231

Diagrama de sintaxis de forward

Como se ha comentado anteriormente, un procedimiento no puede ser llamado a menos


que la declaracin del mismo aparezca antes que la sentencia que lo invoca. Sin embargo, en ocasiones, es necesario llamar a un procedimiento que no ha sido declarado antes
que la sentencia de llamada. Para resolver este problema es necesario informar al compilador que la declaracin de procedimientos no exige ningn orden previo.
As, por ejemplo, supongamos las siguientes declaraciones:
procedure Uno (x : real);
begin
{Uno}

El ejemplo anterior se debe modificar en el siguiente sentido:


Dos (y)

end;

{llamada incorrecta a Dos, ya que el compilador


todavia ignora que el procedimiento Dos sera
declarado}

procedure Dos (a -.integer), forward;


procedure Uno (x :real);
begin

{Uno}

procedure Dos (a : integer);


begin

Uno (b)

end;

end

procedure Dos;

{llamada correcta, el compilador conoce que el


procedimiento Uno ha sido ya declarado }

begin

{Dos}

Cuando el compilador encuentra la llamada al procedimiento Dos en el procedimiento Uno, no conoce todava la existencia del procedimiento Dos, cuya declaracin
viene despus. El problema no se puede solucionar inviniendo el orden en que estn declarados los dos procedimientos, ya que el mismo problema se planteara entonces con Uno.
La resolucin del problema requiere informar al compilador que la declaracin del
procedimiento aparecer ms tarde en la seccin de declaracin. Esto se realiza, como ya
se ha anunciado antes, con la declaracin o sentencia forward. Antes de la declaracin
del procedimiento Uno se debe poner la cabecera completa del procedimiento Dos, seguida por la palabra reservada forward y un punto y coma. Formato:
procedure nombre_proc(lista parmetros formales); forward

Posteriormente en el programa, el procedimiento especificado se declara del modo


usual, excepto que la cabecera del procedimiento se abrevia omitiendo la seccin de declaracin de parmetros formales:
procedure nombre_proc

{Uno}

end

{Dos}

Ejemplo
Un ejemplo de un procedimiento declarado con forward. En este caso Etapal y Etapa2 se
llaman entre s, algo que la prioridad de procedimientos no permitira si no existiera.

program Lazo_sin_ fin;


var
n : integer;
procedure Etapa2(n : integer); forward:
procedure Etapal(n integer);
begin
n : = n + 1;
WriteLn(n);
Etapa2(n);
end;

232

Programacin

en Turbo/Borland

La programacin

Pascal 7

procedure Etapa2;
begin
n := n + 1;

modular

233

Anlisis
El diagrama inicial estructurado del problema es:

WriteLn(n);
Etapa2(n);
end;
procedure Etapa2;
begin
n : = n + 1;
WriteLn(n);
if n > 1000 then Halt;
Etapal(n) ;
end;

Tanto las funciones como los procedimientos pueden tener declaraciones forward. Una
de las aplicaciones ms frecuentes de las declaraciones forward es aquella en la que un
programa contiene dos o ms procedimientos cada uno de los cuales incluye una llamada al otro. Esta caracterstica se denomina recursin mutua (recursividad mutua) y se
da con cierta frecuencia en diversas facetas de la vida ordinaria y la naturaleza.
En el Captulo 15 que estudia la recursividad se ver un caso prctico de recursin
mutua.

INICIAL

begin
n := 1;
Etapal(n);
end.

6.9.

DISEO DESCENDENTE
Y PROGRAMACION MODULAR

Uno de los mejores sistemas para resolver un problema es construir un programa basado
en un diseo descendente (top-down). Este sistema requiere romper el problema en
subproblemas, y a continuacin escribir subprogramas para cada subproblema. Estos
subprogramas pueden contener llamadas a otros subprogramas que realizan tareas ms
pequeas, hasta llegar a un nivel en que la codificacin sea fcil de realizar.
El diseo descendente exige el refinamiento sucesivo en aquellos mdulos iniciales
que as lo requieran. El siguiente problema muestra una solucin a un problema resuelto
con diseo descendente, y dentro de l un refinamiento.

Algoritmo

PROCESO
Especificaciones de entrada

Saldolnicial : real
Datos d e la operacin
operacin : char (l,P,F)
cantidad : real

Especificaciones de salida

Saldo actual
Nmero de ingresos
Nmero de p a g o s

Escribir un programa que ayude a controlar el saldo de una cuenta corriente. El programa lee su saldo inicial y cada operacin (ingreso o depsito, pago o retirada). Debe
imprimir el nuevo saldo despus de cada operacin y un mensaje de aviso en el caso de
saldo negativo (descubierto en cuenta). Al finalizar la sesin se imprimirn los saldos
finales junto con el nmero de operaciones (ingresos/pagos) realizados.

SaldoActual : real
Ingresos : integer
P a g o s : integer

inicial

Tras leer el saldo inicial se debe leer cada operacin, que debe ser procesada independientemente.
1. Visualizar instrucciones y leer saldo inicial.
2. En cada operacin se deben realizar las acciones:
leer tipo de operacin;
actualizar e imprimir el saldo actual;
incrementar cuenta de ingresos/pagos.
3. Visualizar salario inicial y nmero de ingresos y pagos procesados.
Los mdulos (procedimientos) en que se ha descompuesto el problema son:
INICIAL

Problema 6 . 7

INFORME

PROCESO

INFORME

Los parmetros de cada procedimiento son:


INICIAL

Salida

: Saldolnicial

PROCESO

Entrada
Salida

: Saldolnicial
: SaldoActual,

INFORME

Entrada

: Saldolnicial,

Ingresos,

Pagos

SaldoActual,

Ingresos,

Pagos

"234

La programacin modular

Programacin en Turbo/Borland Pascal 7

Codificacin

(Primer refinamiento)

program ControlCuenta;
vises
Crt;
var
Saldolnicial, SaldoActual : real;
Ingresos, Pagos : integer;

El procedimiento PROCESO realiza el paso 2 del algoritmo q u e requiere un refinamiento posterior. Cada operacin implica:
leer tipo de operacin,
actualizar e imprimir saldo actual,
incrementar los contadores de n m e r o de ingresos o pagos realizados.
El diagrama estructurado de procesos se muestra en la figura siguiente:

procedure Iniciar (var Inicial : real);


visualiza instrucciones al usuario y lee saldo inicial;
begin
{iniciar}
ClnScr;
WriteLn ('Control de una cuenta corriente');
WriteLn;
WriteLn ('Opciones a introducir en cada caso');
WriteLn ('I (Ingreso), P (Pago), F (Fin programa)');
WriteLn;
WriteLn ('Introduzca saldo inicial');
ReadLn
(Inicial)
end;
{iniciar}
procedure Proceso(Inicial:Real;var Actual:real;
var Ing,Pag:integer);
{proceso de cada operacion : lee la operacion, actualiza e imprime
saldo actual y lleva el control del numero de operaciones;
begin
Proceso}
WriteLn ('procedimiento Proceso debe refinarse y descomponerse
en otros procedimientos');
end;
Proceso;

ACTUALIZAR

LEER

La descomposicin modular del procedimiento PROCESO y sus parmetros son:

procedure Informe (Inicial, Actual : real; Ing, Pag : integer);


{imprime salarios inicial y final, y numero de operaciones}
begin
{informe;
WriteLn;
WriteLn ('Saldo inicial : ', Inicial:8:0);
WriteLn ('Saldo final ;
Actual:8:0);
WriteLn ('Numero de ingresos realizados
, Ing:5);
WriteLn ('Numero de pagos realizados :' , pag:5);
end;
{informe}
begin

LEER

parmetros

de salida

TipoOper
Cantidad
ACTUALIZAR

parmetros de entrada
TipoOper
Cantidad
parmetros de entrada/salida
SaldoActual
Ingresos
Pagos

{programa principal}

{llamada al procedimiento Iniciar;


Iniciar (Saldolnicial);
llamada al procedimiento Proceso}
Proceso (Saldolnicial, SaldoActual, Ingresos, Pagos);
{impresin de resultados : informes;
Informe (Saldolnicial, SaldoActual, Ingresos, Pagos)
end.

fin del programa ControlCuenta}

235

Algoritmo

PROCESO (segundo

refinamiento)

1. Inicializar Contadores de total de operaciones a cero.


2. Leer Saldo Inicial.

236

Programacin en Turbo/Borland Pascal 7

La programacin modular

3. Leer primera operacin.


4. Mientras existan ms operaciones hacer:
4.1. Actualizar saldos.
4.2. Incrementar contador de ingresos o pagos.
4.3. Leer siguiente operacin.
El tipo de operacin se realiza mediante la eleccin adecuada de las letras I (Ingreso),
P (Pago), F (Fin).

237

program ControlCuenta;
uses
Crt;
var
Saldolnicial, SaldoActual : real;
Ingresos, Pagos : integer;

procedure S_inicial (var Inicial : real);


{visualiza instrucciones al usuario y lee saldo inicialj
begin
clrscr;
WriteLn('Control de una cuenta corriente');
WriteLn;
WriteLn('Opciones a introducir en cada caso');
WriteLn( 1 I (Ingreso), P (Pago), F (Fin programa)');
WriteLn;
WriteLn('Introduzca saldo inicial');
ReadLn(Inicial)
end;

procedure Proceso (Inicial:real; var Actual:real;


var Ing,Pag:integer);
{ proceso de cada operacion : lee la operacion, actualiza e imprime
salario actual y lleva el control del numero de operaciones }
var
TipoOper : char; {tipo de operacion : ingreso/deposito o pago}
Cantidad : real;

procedure Leer (var Tipo : char; var Cantidad : real);


i lectura de cada operacion }

LEER

ACTUALIZAR

Figura 6 . 1 2 . Diagrama d e e s t r u c t u r a del p r o g r a m a Control d e S a l d o s .

El cdigo del procedimiento PROCESO escrito anteriormente debe ser sustituido por el
siguiente:

begin
WriteLn;
repeat
Write( 1 I (Ingreso), P (Pago), F (Fin programa) : ');
ReadLn (Tipo)
until (Tipo=' I' ) or (T.ipo='P') or (Tipo='F');
if T i p o < > ' F ' then
begin
Write ('Cantidad a procesar ');
ReadLn (cantidad)
end
end;

238

La programacin modular

Programacin en Turbo/Borland Pascal 7


procedure Actualizar (TipoOper
Cantidad
var Actual
var Ing, Pag

:
:
:
:

239

begin
{programa principal}
S_inicial (Saldolnicial);
Proceso (Saldolnicial, SaldoActual, Ingresos, Pagos);
Informe (Saldolnicial, SaldoActual, Ingresos, Pagos)
end. {Programa principal;

char;
real;
real;
Integer);

i actualiza saldo actual e incrementa el contador Ingresos o Pagos


begin
case TipoOper of
' I' : begin
:= Actual + Cantidad;
Actual
:= Ing + 1;
Ing
('Ingreso la cantidad
Write
Saldo actual:
WriteLn ('
end;
1 1
P
: begin
:= Actual - Cantidad;
Actual
:= Pagos + 1;
Pagos
('El pago efectuado es de
Write
Saldo actual:
WriteLn (
end;
end;
if Actual < 0.0 then
WriteLn ( ' P r e c a u c i n , descubierto
end;
begin Proceso}

Ejecucin
Control de una cuenta corriente
Opciones a introducir en cada caso
I (Ingreso), P (Pago), F (Fin programa)

,Cantidad:8:0 ) ;
,Actual:8:0)

Introduzca saldo inicial


100000
',Cantidad:8:0);
',Actual:8:0)

I (Ingreso), P (Pago), F (Fin programa) : I


Cantidad a procesar 10000
Ingreso la cantidad
10000
Saldo actual:

en cuenta');

I (Ingreso), P (Pago), F (Fin programa) : P


Cantidad a procesar 150000
El pago efectuado es de 150000
Saldo actual:
Precaucin, descubierto en cuenta

procedure Informe (Inicial, Actual : real; Ing, Pag : integer)


{imprime salarios inicial y final, y numero de operaciones}
begin
WriteLn;
WriteLn('Saldo inicial:
WriteLn('Saldo final:
WriteLn('Numero de ingresos realizados)
WriteLn('Numero de pagos realizados)
end;
{informe!

',Inicial:8:0);
',Actual :8:0);
',
Ing :5);
Pag :5);

-40000

I (Ingreso), P (Pago), F (Fin programa)

j inicializar contadores a cero y SaldoActual a Saldo Inicial


Ing
:= 0;
Pag
:= 0;
Actual := Inicial;
Leer "(TipoOper, Cantidad);
while TipoOper < > 1 f ' do
begin
Actualizar (TipoOper, Cantidad, Actual, Ing, Pag),
Leer (TipoOper, Cantidad)
end
end {Fin de procesol

110000

Saldo inicial:
100000
Saldo final:
-40000
Numero de ingresos realizados:
1
Numero de pagos realizados:
1

6.10.

INCLUIR ARCHIVOS EN PROGRAMAS


(CREACION DE BIBLIOTECAS)

En Turbo Pascal es posible guardar un procedimiento o funcin como un archivo independiente en una biblioteca de archivos separados y utilizar una directiva (pseudoinstruccin) para instruir al compilador que inserte este archivo en el programa. Recuerde
que una directiva del compilador se escribe como un comentario que comienza con el
smbolo $.
Si el procedimiento DEMO se guarda como un archivo DEM0. PAS, la directiva del compilador
$I DEMO.PAS!

240

La programacin modular

Programacin en Turbo/Borland Pascal 7

har que el procedimiento se inserte en el programa que se est compilando en el punto


en que ocurre la directiva del compilador, tal como si se hubiera escrito el procedimiento
en el programa.
El uso de la directiva incluir archivos permite al programador escribir y guardar
secciones de un programa como archivos independientes. El compilador puede, por
tanto, ser instruido para extraer esos archivos juntos durante la compilacin.

DIRECTIVA DE COMPILACION: INCLUDE


{$I nombrearchivo
L1 archivo nunhrarchivo se inserta en el programa que se esta compilando en el punto
donde esta situado el comentario. N o deben existir espacios en blanco entre el smbolo \ y
el smbolo $, ya que en este caso el compilador lo interpreta c o m o un comentario.

6.11.

241

PUESTA A PUNTO DE PROGRAMAS

6.11.1.

Tcnicas de programacin

1. Los programas para la resolucin de problemas complejos deben ser diseados de


modo modular.
El problema se divide en subproblemas ms pequeos, de modo que una funcin o procedimiento resuelva cada uno de estos subproblemas.
Se deben utilizar identificadores locales, siempre que sea posible para evitar
conflictos con otras unidades de programas y hacer el programa tan modular
como sea posible.
Los parmetros formales en los subprogramas se deben declarar como parmetros valor siempre que sea posible, de modo que los subprogramas no puedan
modificar los valores de los parmetros actuales.
2. Utilizar variables locales para almacenar cualquier informacin temporal que
pueda necesitar un procedimiento para sus clculos, pero que no se necesita en
ninguna otra parte del programa.

Ejemplo
Este procedimiento se ha grabado en disco con el nombre DEMO.PAS.
procedure Demo;
begin
WriteLn ('prueba de incluir archivos')
end;

El programa PRUEBA incluye al ejecutarse el procedimiento DEMO:


program Prueba;
{$1 DEMO.PAS}
begin
Demo
end
El p r o g r a m a PRUEBA e q u i v a l e a:
program Prueba;
procedure Demo;
begin
WriteLn ('prueba de incluir archivos')
end;

3. La interaccin de un procedimiento con el resto del programa debe ser a travs de


los parmetros. Las variables globales normalmente no deben aparecer en una
declaracin de procedimientos, pero se pueden pasar como parmetros actuales al
procedimiento.
4. Un parmetro formal por valor es una variable local que se inicializa al valor del
parmetro actual correspondiente cuando se llama al procedimiento. Se utiliza
como cualquier otra variable local.

6.11.2.

Errores tpicos de programacin

l. Cuando una funcin o procedimiento se referencian, el nmero de parmetros


actuales debe ser el mismo que el nmero de parmetros formales en la cabecera
de la funcin o procedimiento, y el tipo de cada parmetro actual debe ser compatible con el tipo del correspondiente parmetro actual. Sea, por ejemplo, la declaracin:
procedure Mayor (Numl, Num2 : i n t e g e r ) ;

Las sentencias de llamada al procedimiento siguiente son incorrectas:


Mayor (k, ra, n ) ;

begin
Demo
end.

Mayor (Numero,4.75)

el n m e r o de p a r m e t r o s actuales (3) no c o n c u e r d a con el


n m e r o de p a r m e t r o s formales (2).
el valor real 4.75 n o se p u e d e asignar al p a r m e t r o entero
Num2.

242

La programacin modular

Programacin en Turbo/Borland Pascal 7

2. Los parmetros que devuelvan valores de un procedimiento se deben declarar


como parmetros variables utilizando el indicador var. Los parmetros actuales
que corresponden a parmetros formales variables deben ser variables (no pueden
ser constantes o expresiones):
procedure Impuesto (Bruto : real; var Neto, Tasas : real);
{solo pueden devolver al programa llamador valores en Neto y
Tasas}
Impuestos (Salario, 4532.45, Profesional);
{es incorrecta ya que la constante 4532.45
no puede
asociarse con el parmetro variable Neto}

3. Los parmetros formales de los subprogramas slo estn definidos durante la


ejecucin de los mismos; antes y despus de la ejecucin estn indefinidos. Si se
intentan utilizar estos parmetros fuera de los subprogramas, se producir un
error.
4. Modificar variables globales en un subprograma produce efectos laterales. Eliminar las variables globales es un buen mtodo de evitar efectos laterales.
5. Evitar redefinir procedimientos y funciones predefinidos.

243

RESUMEN
Declaracin de procedimientos
p r o c e d u r e nombre ( l i s t a p a r m e t r o s f o r m a l e s )
declaracin constantes locales
declaracin variables locales
declaracin procedimientos locales
begin
s e n t e n c i a 1;
s e n t e n c i a 2;

end;

Llamada a procedimientos
nombre ( l i s t a de parmetros a c t u a l e s ) ;
variable local: declarada dentro de una declaracin de un procedimiento:
identificador local: declarado d e n t r o de un procedimiento;
variable global: declarada en el p r o g r a m a completo;
mbito: zona del p r o g r a m a d o n d e un identificador est declarado.

6. Cualquier expresin general puede ser pasada a un parmetro valor.


7. Los parmetros var no pueden controlar bucles for-do. Turbo Pascal no permite
escribir un programa como ste:

EJERCICIOS
1. P R O C es un procedimiento. Puede aparecer la siguiente sentencia en el programa principal?

procedure Suma (var j : integer; x, y : integer):


var
Aux : Integer;
begin
for j : = 1 to 10 do
Aux := x * x + y * y
end;

8. No se pueden pasar nombres de subprogramas como parmetros.


9. Una funcin o procedimiento debe estar definida antes de ser referenciada. Por
ejemplo, si Notas llama a Calculo, entonces Calculo debe estar antes de Notas.
procedure C a l c u l o

procedure Notas

A := 2 * PROC ( 0 , 7 )
2. Qu i m p r i m e este programa?
program Secreto;
var
A, B, C : integer;
procedure Misterio;
var
B : integer;
begin
A := 1;
B := 2;
C := 3
end;
begin
{programa principal}
A := 101
B := 102
C := 103
Misterio;
WriteLn (A, B, C)
end

244

Programacin en Turbo/Borland Pascal 7

3. Cul es la diferencia entre estas dos llamadas a procedimientos?


PROC (A, B)

PROC ( ' A 1 , B)

Si la cabecera del procedimiento P R O C es


PROC (x : c h a r ;

var y : b o o l e a n ) ;

La programacin modular

245

c) Se ejecutan las siguientes secuencias de pasos:

Se asigna a L un valor en A.
A invoca a B.
Se asigna un nuevo valor a L en B.
B invoca a C.
Qu valor de L est disponible en C?

d) Se ejecutan las siguientes secuencias de pasos:


4. El programa A incluye los procedimientos B, C, D y E. Las siguientes variables se declaran en
las secciones de declaracin de variables:
en
en
en
en
en

programa A :
procedimiento
procedimiento
procedimiento
procedimiento

K,
K,
K,
M,
N,

B:
C:
D:
E:

L,
L,
P,
R,
R

M, N
0, P,
S
s, T

Supongamos que los procedimientos no tienen parmetros.

A invoca a B.
B invoca a C.
Se asigna a S un valor C.
El control se transfiere de nuevo a B.
B invoca a D.
Se conoce el valor de S en D?

e) A R se le asigna un valor en E y se transfiere de n u e v o el control a A. Est disponible el


valor de R en A?
/ ) Puede llamar a C directamente?
g) Puede D llamar a C?

h) Puede B llamar a E?
i) Puede C llamar a B?
B

5. Puede un p a r m e t r o variable ser utilizado p a r a dar i n f o r m a c i n a un procedimiento? Puede


un p a r m e t r o valor utilizarse p a r a dar i n f o r m a c i n a u n procedimiento? Puede un p a r m e t r o
variable ser utilizado para sacar i n f o r m a c i n fuera de un procedimiento? Y un p a r m e t r o
valo
6. Puede un p a r m e t r o actual variable ser u n a variable? Puede un parmetro valor actual ser
una variable? Puede un p a r m e t r o valor actual ser u n a constante?
7. Cul es la salida del siguiente programa?

program Demo_Test;
var
x, y : integer; .
procedure Test (x, y : integer);
begin
{Test}
WriteLn (x, y)
end;
begin
{Demo_Te st}
x := 1;
y := 2;
Test (y, x)
end.
{Demo_Test}

Contestar a las siguientes preguntas:


a) Se asigna a K un valor en A y se invoca el procedimiento B. Se conoce el valor de K en B?
b) Se asigna a L un valor en B y se invoca al procedimiento D. Est disponible el valor de L
en D?

8. Dadas las declaraciones


var
x, y, z : real;
m, n
: integer;
procedure Hacer (var A, B : integer; x : integer),

246

Programacin en Turbo/Borland Pascal 7


Cules llamadas al procedimiento son incorrectas y por qu?
h a c e r (x, y , z ) ;
h a c e r (x, y, M, 15);
h a c e r (A, B, x ) ;

La programacin modular
11. Considere el siguiente programa:

h a c e r ( z , y, N);
. h a c e r ( 2 5 . 4 , 15, m);
h a c e r (a, y, ' 1 5 ' ) ;

program Test_Dos;
var
I, J : integer;
procedure X (P, Q : integer);
begin
Q := I * P + Q;
P := I;
WriteLn (o, P, J)
end;

9. Cul es la salida del siguiente programa?

program Test_Uno;
var
a, b, c : integer;

procedure Y (L, M : integer);


begin
I := 5;

procedure Calculo (var x, y : integer; z : integer


var
a : integer;
begin
a = 4;
= 5;
b
= x + 1
X

X (L, M)
end
begin
{programa principal}
I := 15;
J := 1;
Y (J, I)
end.

ii

y
2
z = z + 3
WriteLn (a 4, b:4, x:4, y:4, z:4)
end
{Calculo}
begin
{principal}
a : = 1;
b := 2;
c : =3 ;
Calculo
WriteLn
Calculo
WriteLn

(a, b, c) ;
(a:4, b:4, c : 4 ) ;
(c, a, c);
(a:4, b:4, c:4)

10. Es correcto este procedimiento? En caso negativo, trate de mejorarlo.

procedure Dividir (var x : integer; y : integer);


begin
if y o o then
begin
x := x div y;
WriteLn ('El cociente es', x)
end
else
WriteLn ('no se debe dividir por cero')
end;
{Dividir}

247

D a r la salida del programa c u a n d o los a r g u m e n t o s se pasan: a) por valor, b) por variable.


Nota
Suponga existe el prefijo var c u a n d o el a r g u m e n t o (parmetro) sea por variable.

PROBLEMAS
1. Escribir un p r o g r a m a que solicite del usuario un carcter y que site ese carcter en el centro de
la pantalla. El usuario debe poder a c o n t i n u a c i n desplazar el carcter pulsando las letras A
(arriba), B (abajo), I (izquierda). D (derecha) y F (fin) para terminar.
2. Escribir un p r o c e d i m i e n t o que reciba una c a d e n a de caracteres y la devuelva (en parmetros) en
f o r m a inversa ('hola' se convierte en 'aloh').
3. Escribir un p r o c e d i m i e n t o q u e d e t e r m i n e si u n a cadena de caracteres es un p a l n d r o m o (un
p a l n d r o m o es un texto que se lee igual en sentido directo y en inverso: radar).
4. Escribir u n programa m e d i a n t e un p r o c e d i m i e n t o que acepte u n n m e r o de da, mes y a o y lo
visualice en el f o r m a t o
dd/mm/aa
Por ejemplo, los valores 8, 10 y 1946 se visualizan c o m o
8/10/46

248

Programacin en Turbo/Borland Pascal 7

5. Escribir un programa q u e utilice un procedimiento para convertir coordenadas polares a rectangulares.

CAPITULO L

FUNCIONES ESTANDAR
Y DEFINIDAS POR EL USUARIO
CONTENIDO
6. Escribir un programa que lea un entero positivo y a continuacin llame a un p r o c e d i m i e n t o
que visualice sus factores primos.
7. Escribir un programa, mediante procedimientos, que visualice un calendario de la forma:
L
6
13
20
27

M
7
14
21
28

X
1
8
15
22
29

J
2
9
16
23
30

V
3
10
17
24

S
4

11
18
25

D
5
12
19
26

El usuario indica n i c a m e n t e el mes y el ao. La f r m u l a que permite conocer el da de la


semana correspondiente a una fecha dada es:
a) meses de enero o febrero
n := a + 3 1 * ( m - l ) + d ( a - l ) d i v 4 - 3 * ( ( a + 9 9 ) d i v 100)div 4;
b) restantes meses
n := a+31*(m-l)+d-(4*m+23) div 10+a div 4 - ( 3 * ( a div 100+1)) div 4;
donde a = ao, m = mes, d = da.
Nota
n raod 7 indica el da de la s e m a n a (1 = lunes, 2 = martes, etc.).
8. Escribir un programa que lea los dos enteros positivos n y b y que llame a un p r o c e d i m i e n t o
CamhiarBase para calcular y visualizar la representacin del n m e r o n en la base b.
9. Escribir un programa que permita el clculo del m c d ( m x i m o c o m n divisor) de dos n m e ros por el algoritmo de Euclides. (Dividir a entre b, se obtiene el cociente q y el resto r si es
cero b es el mcd, si no se divide b entre r, y as sucesivamente hasta encontrar u n resto cero,
el ltimo divisor es el mcd).
10. Escribir el inverso de un n m e r o entero d a d o (1234, inverso 4321).

7.1.
7.2.
7.3.
7.4.
7.5.
7.6.
7.7.
7.8.
7.9.
7.10.
7.11.
7.12.

Las f u n c i o n e s d e T u r b o Pascal
Las f u n c i o n e s p r e d e f i n i d a s en T u r b o Pascal
Funciones matemticas
Funciones trigonomtricas
F u n c i o n e s ordi n a le s
Funciones especiales
F u n c i o n e s e s p e c i a l e s (bajo nivel): Hi/Lo/swap
I n c r e m e n t o y d e c r e m e n t o Inc/Dec
Nmeros aleatorios
F u n c i o n e s d e f i n i d a s p o r el usuario
El tipo p r o c e d i m e n t a l (procedure, function)
Puesta a punto de programas

RESUMEN
PROBLEMAS RESUELTOS
EJERCICIOS
PROBLEMAS

Las f u n c i o n e s s o n u n o d e los e l e m e n t o s b s i c o s en p r o g r a m a c i n .
T u r b o P a s c a l incorpora f u n c i o n e s p r e d e f i n i d a s y f u n c i o n e s d e f i n i d a s
por el usuario.
La definicin d e ISO Pascal e s t n d a r incluye un n m e r o d e t e r m i n a d o d e f u n c i o n e s e s t n d a r p r e d e f i n i d a s q u e s e incorporan al lenguaje y no n e c e s i t a n s e r d e c l a r a d a s y c o d i f i c a d a s en su p r o g r a m a . E s t a s
f u n c i o n e s s e dividen en d o s g r u p o s : matemticas
(proporcionan
o p e r a c i o n e s t a l e s c o m o c u a d r a d o , raz c u a d r a d a , logaritmos, funcion e s t r i g o n o m t r i c a s , etc.) y d e conversin
o transferencia
q u e defin e n r e l a c i o n e s e n t r e tipo d e d a t o s (ord, succ, etc.).
T u r b o Pascal ha a u m e n t a d o c o n s i d e r a b l e m e n t e las f u n c i o n e s e s t n d a r o p r e d e f i n i d a s , y a las e s t n d a r d e ISO P a s c a l le ha a a d i d o
f u n c i o n e s de c a d e n a s y o t r a s e s p e c f i c a s q u e permitirn resolver
p r o b l e m a s n u m r i c o s , d e simulacin y e s t a d s t i c a , c o m o random y
randomize, n m e r o d e b y t e s o c u p a d o s p o r los a r g u m e n t o s , inform a c i n s o b r e p a r m e t r o s p a s a d o s al p r o g r a m a principal, e t c .
Este captulo trata las f u n c i o n e s p r e d e f i n i d a s b s i c a s d e tipo num r i c o o e s p e c i a l e s , d e j a n d o para el s i g u i e n t e captulo el e s t u d i o d e
las f u n c i o n e s d e c a d e n a . A s i m i s m o , s e analizarn las f u n c i o n e s defin i d a s p o r el usuario q u e t a n t a i m p o r t a n c i a a d q u i e r e n en la p r o g r a m a c i n profesional.

249

250
7.1.

Programacin en Turbo/Borland Pascal 7

LAS FUNCIONES DE TURBO PASCAL

Una funcin es un subprograma que recibe como argumentos o parmetros datos de tipo
numrico, o no numrico (char, string, boolean u otros), y devuelve un resultado. Esta
caracterstica le diferencia esencialmene de un procedimiento.
Las funciones, en general, tienen el formato:

n o m b r e - f u n c i n ( a r g u m e n t o l , argumento2,...)

argumentol, . . .

= X
=

X 2 - 4x + 5

= 4/x
= -2x

Cada una de estas funciones devuelve un resultado para cada valor particular de x.
As, para .v = l, las funciones se representan por7(1), g(l), h(l), 1(1) y sus valores son:

/(l) = 1

g(l) = 12 4.1 + 5 = 6 - 4 = 2
h( 1) = 4 / 1 = 4
/(l)

Funciones
Funciones
Funciones
Funciones
Funciones
Funciones
Funciones
Funciones

de asignacin dinmica de memoria.


de transferencia.
matemticas.
trigonomtricas.
ordinales.
de cadena.
de direccin y punteros.
especiales (miscelnea).

(En este captulo analizaremos los grupos 3, 4 y 8, dejando el estudio de las restantes
funciones para otros captulos.)

7.3.

FUNCIONES MATEMATICAS

Las funciones matemticas (BOPiLAND las denomina aritmticas) son aquellas que
realizan operaciones matemticas (tales como raz cuadrada, cuadrado, logaritmo, etc.) y
devuelven un solo valor. Las funciones son referenciadas directamente en una expresin
o una sentencia genrica y el valor calculado por la funcin es sustituido por la referencia de la funcin. La Tabla 7.1 resume las funciones matemticas.

7.3.1.

Funciones de conversin reales/enteras


y enteros/reales

Ya se ha visto que un valor entero se puede asignar a una variable de tipo real. Sin
embargo, lo inverso no es posible, ya que un valor real puede tener una parte decimal, y
no hay forma de expresar un aparte decimal en tipo integer. Round y Trunc proporcionan
un medio para transferir o convertir un valor real en un entero. Ambas aceptan parmetros de tipo real y devuelve valores que pueden ser de tipo integer o real.
Tabla 7 . 1 .

-2.1 = -2

Las funciones son un medio muy adecuado de resolver operaciones complejas matemticas o de otras disciplinas afines, as como tratar diferentes tipos de datos definidos
en Turbo Pascal y realizar con ellos procesos complejos. En Turbo Pascal existen dos
grandes grupos de funciones:
funciones predefinidas, internas o estndar
funciones definidas por el usuario
En este captulo nos centraremos en las primeras.

7.2.

1.
2.
3.
4.
5.
6.
7.
8.

251

dato de tipo numrico, char, string, etc.

El argumento se conoce en trminos de lenguajes de programacin con el nombre de


parmetro. Para poder calcular el valor o resultado de la funcin, todo lo que se debe
conocer es el valor o valores de los argumentos (parmetros) respectivos.
Como el concepto ms difundido de funcin entra dentro del campo de las matemticas, recordaremos con un ejemplo la nocin de funcin, asociada a variables (argumentos o parmetros en programacin). Algunos ejemplos de funciones son:
AX)
g(x)
h(x)
l(x)

Funciones estndar y definidas por el usuario

LAS FUNCIONES PREDEFINIDAS EN TURBO PASCAL

Turbo Pascal incorpora todas las funciones estndar de ISO Pascal y aade nuevas.
BORLAND, en su gua de Referencia ("Reference Guide"), divide las funciones estndar
(predeclaradas o predefinidas) en los siguientes grupos:

Nombre
Abs(x)
ArcTan(x)*
Cos(x)*
Exp(x)
Frac(x)
Int(x)
Ln(x)
Pi
Round
Si n ) *
Sqr(x)
Sqrt(x)
Trunc(x)

Funciones matemticas
Descripcin

Argumentle)
Real
Real
Real
Real
Real
Real
Real
Real
Real
Real
Real
Real
Real

o
o
o
o

Integer
Integer
Integer
Integer

o Integer
o
o
o
o

Integer
Integer
Integer
Integer

Devuelve
Devuelve
Devuelve
Devuelve
Devuelve
Devuelve
Devuelve
Devuelve
Devuelve
Devuelve
Devuelve
Devuelve
Devuelve

el
el
el
el
la
la
el
el
el
el
el
la
la

* El argumento de estas funciones es siempre en radianes.

valor absoluto del a r g u m e n t o


arco tangente del argumento
coseno del a r g u m e n t o
exponencial del a r g u m e n t o
parte decimal del a r g u m e n t o
parte entera del a r g u m e n t o
logaritmo natural del a r g u m e n t o
valor de Pi(3.1415926535897932385)
entero m s p r x i m o al a r g u m e n t o
seno del a r g u m e n t o
c u a d r a d o del a r g u m e n t o
raz c u a d r a d a del a r g u m e n t o
parte entera de su a r g u m e n t o

252

Funciones estndar y definidas por el usuario

Programacin en Turbo/Borland Pascal 7

Ejemplos

Trunc (Truncamiento)

Formato
T r u n c (x)

expresin numrica de tipo real en el rango de los enteros largos

Comentarios
Trunc devuelve un valor entero largo longint. Si x est fuera del rango de los enteros largos, se produce un error en tiempo de ejecucin.
Ejemplos
Trunc (5.2)
Trunc (5.99)
Trunc (-3.14)
Trunc (-339.00451)
r := 6.77
i := Trunc (r);
WriteLn (i) ;

{devuelve 5}
{devuelve 5}
{devuelve -3}
{devuelve -339}
{r es de tipo real}
{i es de tipo entero}
{visualiza el numero 6}

{devuelve 4
}
{devuelve -7
}
{devuelve 1
}
{devuelve 19
}
{r de tipo real
}
{i es de tipo entero
}
{visualiza el numero 6}

Round (4.448)
Round (-7.15)
Round (0.7)
Round (18.5)
r := 5.77;
i := Round (r);
WriteLn (i);
WriteLn (Trunc(3.6 *

La funcin Trunc trunca la parte decimal de un nmero real.

(Round(1.4) - 2.5)))

7.3.2.

{visualiza -5

En Turbo Pascal 3.0 el resultado era de tipo entero, y si se utilizaban reales grandes
como argumentos, dado que trabajaba internamente con valores enteros, se cometa un
error si Trunc devolva un parmetro mayor que maxlnt (32768).
A partir de la versin 4.0 Turbo Pascal elimin esta restriccin al realizar la conversin en el rango de enteros largos.

Adems de las funciones de truncamiento y redondeo, en clculos aritmticos simples se


necesitan con frecuencia otras operaciones bsicas: valor absoluto, parte entera y parte
real de un nmero. Estas operaciones se realizan con las funciones abs, int y frac.
Abs

La funcin Abs devuelve el valor absoluto de un nmero. El valor absoluto de un nmero es la distancia de un nmero al 0, es decir, dicho nmero sin signo.
valor
valor

absoluto
absoluto

de
de

-5
+5

es
es

5
5

Formato

A b s (x)

Round(Redondeo)
la Funcin Round permite redondear un nmero real a un entero.

expresin de tipo entero o real

El resultado es del mismo tipo que x.

Formato
Ejemplos
R o u n d (x)

expresin de tipo real dentro del rango de los enteros largos

Comentarios
Round devuelve un valor entero que es el entero ms prximo a x

Round (-x)

= Round (x).

Funciones aritmticas e l e m e n t a l e s

Diferencias con Turbo Pascal 3.0

253

Abs
Abs
Abs
Abs

(-64)
(128)
(3.97)
(-4.25)

{devuelve
{devuelve
{devuelve
{devuelve

64; tipo entero }


128; tipo entero}
3.97; tipo real }
4.25; tipo real
}

La funcin Abs es realmente una forma abreviada de la siguiente sentencia:


i f x < o then x : = - x

254

Programacin en Turbo/Borland Pascal 7

Funciones estndar y definidas por el usuario

255

Formato

Frac
D e v u e l v e la p a r t e d e c i m a l d e u n n m e r o r e a l .

Exp (x)

Formato

Frac (x)

expresin real o entera

Ejemplo
x

expresin de tipo real


Exp (4.5)

equivale a

ea'5

o bien a

2.718282 4

Ejemplo
Ln
Frac (28.44894)

devuelve 0 . 4 4 8 9 4 j

Devuelve el logaritmo natural (logaritmo en base ) de x. El resultado es real.

Int

Formato

Devuelve la parte entera decimal de un nmero real.


Ln (x)

Formato
Int (x)

expresin real o entera

Ln (x) es la inversa

expresin de tipo real

Ejemplo
Int (321.004)

{devuelve 321.0}

Int (45.438)

{devuelve 45.0}

d e Exp (x)

( x = Ln v, y = e )

Al contrario que otros lenguajes como FORTRAN y BASIC, Pascal no contiene la funcin de potenciacin (a elevado a x). Sin embargo, Exp y Ln permiten disear una funcin que eleva un nmero a una potencia dada.

Comentarios

Xy = Exp (y * Ln (x))

[7.2]

Las funciones Int y Frac devuelven resultados de tipo real.

Frac (x) = x - I n t ( x ) .

7.3.3.

La deduccin de esta frmula es:

Funciones exponenciales y logartmicas

Las funciones para clculos de potencias y logaritmos son:


exponenciales
logartmicas

Exp
Ln

Potencias
Raz cuadrada

[7.1]

Sqr
Sqrt

Exp

Devuelve la funcin exponencial de x potencia de e, elevado a x: (eK) (x, nmero


real o entero), siendo su resultado siempre real.

xy = t
tomando logaritmos en ia expresin 7.2
Ln (x-'O = Ln t
deducindose de las frmulas bsicas 7.1
y Ln X = Ln t
Exp (y Ln (x)) = t = Xy
La frmula 7.2 se puede definir con una funcin externa.
function Potencia (X, Y : real) : real;
begin
Potencia := Exp (Ln(X) * Y)
end;

256

Programacin en Turbo/Borland Pascal 7

Funciones estndar y definidas por el usuario

Ejemplo 7.1

257

la declaracin de la funcin Hipotenusa es

Calcular 74 25

function Hipotenusa (Catetol, Cateto2 : real) : real;


begin
Hipotenusa := Sqrt (Sqr (Catetol) + Sqr (Cateto2))
end;

Su valor se puede obtener con la funcin Potencia:


Potencia ( 7 , 4 . 2 5 )

que se puede asignar a cualquier variable:


Z := P o t e n c i a ( 7 , 4 . 2 5 )

7.4.

Sqr/Sqrt

La funcin cuadrado Sqr (x) equivalen a x 2 , o de otro modo, x * x. La funcin Sqrt (x)
es la funcin raz cuadrada del argumento.
Formato

Las funciones trigonomtricas, aunque de gran aplicacin en Matemticas, para


clculos geomtricos, topogrficos, etc., tienen poca utilidad en el resto de los campos,
por lo que si no est interesado en la trigonometra, puede saltar esta seccin dado que
las funciones trigonomtricas no sern utilizadas en el resto de ejemplos y programas del
captulo y del libro. Las funciones trigonomtricas que Turbo Pascal soporta son:
SIN
COS

Sqr (x)
Sqrt (x)

FUNCIONES TRIGONOMETRICAS

ATN

expresin de tipo real o entera en Sqr y de tipo real en S q r t

Ejemplos
const
Pi = 3.141592;
var
I : integer;
R : real;
begin
I := 8 1 ;
R := 6.077;
WriteLn (Sqrt (25));
WriteLn (Sqrt (Pi));
WriteLn (Sqrt (I));
WriteLn (Sqr (7 ));
WriteLn (Sqr (R ))
end.

Antes de analizar las funciones trigonomtricas citadas, recordaremos algunos conceptos de trigonometra bsicos: las unidades angulares.
Todas las operaciones que implican ngulos en Turbo Pascal se deben realizar en
radianes en lugar de en grados. Los radianes son una unidad de medida de ngulos
fundamental en los clculos de programacin. Si el sistema angular a utilizar es el sexagesimal, 0 a 360 grados, el rango de radianes equivalentes es 0 a 2% (Figura 7.1).

90* = 7I/2 radianes

{devuelve
{devuelve
{devuelve
{devuelve
{devuelve

5 . 0 ; numero real }
1.77245
}
9.0
}
49; entero o real}
36.92993 : real
}

180 = n radianes

\ 45 = TI/4 radianes
0 = 0 radianes

Problema 7.1
Calcular la longitud de la hipotenusa de un tringulo rectngulo dados sus dos catetos.
Ya que la hipotenusa a en funcin de los catetos (b y c) es
2

a = i + c

o bien

a = Jb

+c

270 = 3k/2 radianes


Figura 7 . 1 .

S i s t e m a angular s e x a g e s i m a l .

258

Funciones estndar y definidas por el usuario

Programacin en Turbo/Borland Pascal 7

259

C o m o los ngulos se suelen medir en grados, es necesario una frmula de conversin


de grados a radianes y viceversa.

271
2 * 3 141592
I o = -=- radianes =
' 1
=0.0174533
360
360

360
1 radin = =
= 57.2958
2ti
2*3.141592

Las reglas de conversin son:


Grados sexagesimales (G) a radianes: (G * 0.0174533) radianes.
Radianes (R) a grados sexagesimales: (R * 57.2958) grados.

Ejemplo
57
2 radianes

equivalen a
equivalen a

57 * 0.0174533 radianes
2 * 57.2958 grados sexagesimales

7.4.2.

La funcin coseno: e o s

C0S d e v u e l v e el c o s e n o d e u n n g u l o d a d o e x p r e s a d o e n r a d i a n e s :

Si no desea memorizar las constantes anteriores, deber utilizar las reglas siguientes:
1
1 radin

7.4.1.

equivale a
equivale a

k 180 radianes
l80/7t radianes

La funcin seno: SIN

L a f u n c i n SIN d e v u e l v e el s e n o d e l n g u l o d e f i n i d o e n el a r g u m e n t o e s p e c i f i c a d o e n ra-

Formato

v = S I N (x)

SIN (Angulo) =

expresin de tipo real (en radianes)

eos

expresin de tipo real (en radianes)

(x)

Geomtricamente, el coseno proporciona la coordenada horizontal de un punto en la


circunferencia de un crculo. En la Figura 7.2 la funcin coseno es

d i a n e s . SIN t o m a u n a r g u m e n t o , el n g u l o e x p r e s a d o e n r a d i a n e s , y p r o p o r c i o n a u n v a l o r
e n t r e - 1 y 1, d e d o b l e p r e c i s i n .

El significado geomtrico de la funcin seno se muestra en la Figura 7.2. La funcin


seno mide la relacin entre la distancia vertical desde el punto de la circunferencia
donde termina el ngulo hasta el eje de las equis y el radio de la circunferencia.

v =

COS (Angulo) = ~

7.4.3.

La funcin arco tangente: ArcTan

La funcin ArcTan proporciona el arco tangente (tangente inversa) de cualquier argumento positivo o negativo. El arco tangente de un nmero x es el ngulo cuya tangente
es x .
El resultado de la funcin Arelan se expresa en radianes.
El arco tangente es la nica funcin trigonomtrica inversa implementada en Turbo
Pascal.

260

Funciones estndar y definidas por el usuario

Programacin en Turbo/Borland Pascal 7

function Cot (x : real) : real;


begin
Cot := Cos (x)/Sin (x)

Formato

end;

function Sec (x : real) : real; {secante (x) = 1/cos (x)}


begin
Sec := 1/cos (x)
end;

Problema 7 . 2
Escribir un programa que permita calcular el seno y el coseno de un ngulo expresado en
radianes.

function Csc (x : real) : real; {cosecante (x) = 1/seno (x)}


begin
Csc := 1/sin (x)
end;

program
Trigonometra;
var
a
:real;
function Radianes (ngulo: real): real;
begin
Radianes :=angulo * (Pi/180)
end;
begin
Write ('Introduzca ngulo en grados: 1 );
ReadLn (a);
WriteLn ('Coseno =
Cos(Radianes (a)) : 3 : 2);
Write
( 'Seno = ' , Sin(Radianes (a) ) : 3 : 2);
end.

7.4.4.

{cotangente (x) = 1/tangente (x)}

v = A r c T a n (x)

expresin de tipo real

Otras funciones trigonomtricas

Las funciones trigonomtricas bsicas restantes son: tangente (tan), cotangente (cot),
secante (sec) y cosecante (cosec). Pueden deducirse de las funciones bsicas incorporadas
a Turbo Pascal

Su uso en los programas, tras declarar estas funciones en la seccin de declaraciones


de variables, es directa:
x := 3.1845
z := Sec (3.45)
h := Tan (x)

7.5.

FUNCIONES ORDINALES

Las funciones ordinales son aquellas que se aplican a argumentos o parmetros de tipo
ordinal. La Tabla 7.2 recoge las funciones ordinales ord, chr, succ y pred.

7.5.1.

Ord

Esta funcin devuelve la posicin ordial (un entero) del valor x.


Si el parmetro de Ord es un entero, el nmero ordinal devuelto es el propio entero.
Para los restantes tipos ordinales, el nmero ordinal del primer valor en la secuencia es
cero, el nmero ordinal del segundo valor es 1, y as sucesivamente. Por consiguiente:

tan (.Y) = sin (.Y) / cos (x)


cot (x) = cos (x) / sin (x)
sec (x) = 1 / cos(x)
cosec (.Y) = 1 /sin (x)

Ord ( f a l s e )
Ord ( t r u e )

es cero
es uno
Tabla 7 . 2 . F u n c i o n e s ordinales

La codificacin correspondiente se muestra a continuacin:


function Tan (x : real) : real;
begin
Tan := Sin (x)/cos(x);
end;

261

{tangente (x) = seno (x)/cos(x)}

Definicin

Funcin
Ord
Chr
Succ
Pred

(x)
(x)
(x)
(x)

Devuelve
Devuelve
Devuelve
Devuelve

el
el
el
el

n m e r o ordinal correspondiente al a r g u m e n t o x.
carcter en el cdigo ASCII correspondiente al a r g u m e n t o x.
sucesor del a r g u m e n t o ; pr oduc e un error si no tiene sucesor.
predecesor del a r g u m e n t o .

262

Programacin en Turbo/Borland Pascal 7

Funciones estndar y definidas por el usuario

Si A y B pertenecen al mismo tipo ordinal y A < B es verdadero, entonces Ord (A) < Ord
(B) tambin es verdadero.
La Tabla 7.3 recoge diferentes casos comparativos sobre resultados de las funciones
Ord, Succ y Pred 1 .
TYPE semana = (lunes,

martes,

Ord (6)
Ord (martes)
Ord ( m i e r c o l e s )

miercoles,

jueves,

viernes,

263

es decir, la expresin
Ord ( ' 8 ' ) - Ord ( ' 0 ' ) = 8

es verdadera. De igual modo,

sabado);

es 6
es 1
es 2

Ord ( ' D') ^ Ord ( ' A ' ) = 3

La Tabla 7.3 recoge diferentes casos comparativos sobre resultados de las funciones

es verdadera. En el cdigo ASCII las letras minsculas siguen a las letras maysculas, y la
diferencia en cdigo para ambas letras es 32:

Ord, Succ y Pred.


Ord ( ' b ' ) - Ord ( 1 B ' ) = 3 2
Tabla 7 . 3 .
Parmetro
25
0
-40
-Maxlnt
Maxlnt
false
true

R e s u l t a d o s d e Ord, Succ y Pred


Ord

25
0
-40
-Maxlnt
Maxlnt
0
1

";..Succ;v-::.>-y
26
1
-39
-(Maxlnt-1)
indefinido
true
indefinido

Pred
24
-1
-41
indefinido
Maxlnt-1
indefinido
false

Chr

La funcin Chr es la opuesta de Ord. Devuelve el carcter del cdigo ASCII correspondiente al x-esimo carcter (x es un entero).
Ejemplo
Chr (66)

devuelve B que es el carcter 66 del cdigo ASCII

Aplicaciones

Ejemplo 7 . 2
La Tabla 7.4 muestra diferentes casos de caracteres de cdigo ASCII.
Tabla 7 . 4 .

R e s u l t a d o s d e Ord

Parmetro

Ord

D
8
X
blanco
B

68
56
120
32
66

Reglas
Con independencia del cdigo de caracteres utilizados, si x es un dgito

Ord (' x ' ) - Ord ( ' 0 ' ) = x

7.5.2.

Aunque los tipos ordinales y, en particular, los tipos enumerados no se estudiarn hasta el Captulo 8, se
incluyen en esta seccin con la nica finalidad de conseguir consistencia en funciones.

La funcin Chr es la inversa de Ord. As. si Ch es una variable tipo Char la funcin
anidada
Chr (Ord (Ch))

toma el mismo valor que Ch.


Como ya se ha comentado anteriormente, 32 es la separacin entre el cdigo
ASCII para letras maysculas y sus correspondientes letras minsculas. Por esta
razn,
Chr (Ord ( ' A ' ) + 3 2 )
Chr (Ord ( ' P 1 ) + 3 2 )

devuelve
devuelve

'a'
'p'

Un programa puede calcular letras maysculas a partir de letras minsculas


utilizando - 3 2 .
Otro uso de la funcin Chr es para representar caracteres no imprimibles.
Chr (13)
Chr (7)

proporciona el retorno de carro (CR)


un pitido (BEL)

chr (12 7)
Chr (8)

accin borrar un carcter (DEL)


devuelve el retroceso de espacio (BS)

Write (chr (7))

se emite un pitido en el altavoz del PC

264

Funciones estndar y definidas por el usuario

Programacin en Turbo/Borland Pascal 7

265

Ejemplo 7 . 3

7.6.1.

Imprimir los cdigos ASCII 33 a 90 inclusive.

Turbo Pascal incluye tambin una funcin estndar Pi que devuelve el valor de la constante matemtica Pi con tantas cifras significativas como la variable que devuelve el valor puede expresar.
El valor devuelto es un nmero real y no se puede asignar a tipos enteros. Se puede
asignar gran precisin si se utiliza el coprocesador matemtico.

program ASCII ;
const
Min = 33;
Max = 90;
var
Codigo : integer;
begin
{ Imprimir caracteres desde Chr(33) hasta Chr(90) ;
for Codigo := Min to Max do
Write (Chr(Codigo):2);
WriteLn
end.
! " # $ % & ' ( ) * + , - ./ 0 1 2 3 4 5 6 7 8 9 :
A B C D E F G H 1 J K L M N O P Q R S T U V W X Y Z

7.5.3.

Pi

Ejemplo
F $N+}
var
RS :
RR :
RD :
RE :

;<

Single;
Real;
Double;
Extended;

begin
RS := Pi; RR := Pi; RD := Pi; RE := Pi; RC := Pi;

= >?

WriteLn ('Simple precisin', RS : 4 : 25);


WriteLn ('Real
RR : 4 : 25);
end.

Pred y Succ

se visualiza

Dado un valor de tipo ordinal, Pred y Succ devuelven el precedesor y antecesor del valor
del argumento, tal como se ha visto en 7.5.1.
Formato

Simple precisin
Real

7.6.2.

3.141592741012573240
3.141592653588304530

Funcin de paridad odd

Odd verifica si el argumento de la funcin es un nmero impar. Recibe un argumento


entero y devuelve un resultado lgico.

P r e d (x)
Succ (x)

Formato
Ejemplos

O d d (x)
Pred ( ' z' )
Succ ( 'w1 )

Pred (43)
Succ (18041)
Pred (Martes)

7.6.

{devuelve

'y'}

{devuelve

' X ' }

{devuelve 42}
{devuelve 18042}
{devuelve Lunes}

tipo enumerado,

Captulo

10

FUNCIONES ESPECIALES

Existen dos funciones especiales que suelen ser tiles en clculos aritmticos y matemticos, Pi y Odd.

expresin d e tipo entero largo

El resultado es true si x es un nmero impar, y false si x es un nmero par. (Cero


se considera nmero par en razn de estar comprendido entre dos nmeros impares: - 1 y 1.)

7.7.

FUNCIONES ESPECIALES (BAJO NIVEL): Hi/LO/SWAP

Recordemos que el tipo de datos Integer ocupaba en memoria dos bytes. Hay veces que
es necesario conocer el valor de cada uno de los bytes con independencia del otro. Las

266

Funciones estndar y definidas por el usuario

Programacin en Turbo/Borland Pascal 7

f u n c i o n e s Hi y Lo r e a l i z a n e s t a t a r e a . Swap p e r m i t e i n t e r c a m b i a r los b v t e s d e u n n m e r o .

7.7.1.

Ejemplo
var
X : Word;
begin
X := Swap ($4132)
end.

Hi/Lo

Formatos

H i (x)

expresin de tipo integer (entero), o de tipo word

Hi devuelve el valor del byte de mayor peso de x y Lo el valor del byte de menor peso
de x. La sintaxis empleada, en general, es asignar los valores de las funciones a variables
de tipo word o integer.

variable := Hi (x)

Hi, Lo y Swap encuentran su aplicacin cuando se deben desplazar valores hacia o desde
registros de la CPU. Muchos registros del microprocesador 8086 tienen 2 bvtes de ancho
y se deben rellenar de una sola vez, incluso muchas llamadas al sistema operativo requieren que las dos mitades de un registro CPU sean rellenadas con bvtes de datos no
relacionados.

Ejemplo 7 . 4
Se necesita pasar $01 al registro AH y $07 al registro AL. AH y AL son dos mitades del
registro AX del 8086, y AX se debe pasar al sistema operativo como una unidad. Cmo
se pueden cargar dos nmeros independientes en un entero?
var
AX, Mascara, Bit : Integer;
begin
Mascara := $07;
{los bytes de mayor peso de Mascara
y son cero}

Ejemplos
. x contiene un
v a r i := Hi
vari t o m a
var2 t o m a

valor de $ 5 F 3 F
($5F3F)
el valor de $005F
el valor de $003F

.
.
.
.

devuelve
devuelve
devuelve
devuelve

Hi
Hi
Lo
Lo

(256)
(17341)
(256)
(17341)

{$3241}

Operaciones de bajo nivel

L o (x)

267

var2 := Lo ($5F3F)

Bit
AX
AX
AX

l
67
0
189

=
=
=
=

$01;
Bit;
Swap (AX);
AX + Mascara;

{3it se almacena en el byte bajo de AX}


{intercambiar bytes entre si
}
{aade Mascara al byte de bajo peso
}

Las operaciones de extraccin son:

7.7.2.

Swap

Mascara := Lo (AX);
Bit
:= Hi (AX);

La funcin Swap intercambia los bvtes de orden alto y bajo del argumento. El byte de
mayor orden se convierte en el byte de menor orden y viceversa.
Formato

7.8.

FUNCIONES DE INCREMENTO Y DECREMENTO: INC/DEC

S w a p (x)
x

expresin de tipo integer o word

Turbo Pascal aade dos procedimientos estndar que operan sobre tipos ordinales: INc
incrementa un valor de tipo ordinal. Dec decrementa un valor de tipo ordinal.

268

Programacin en Turbo/Borland Pascal 7

Formatos

Dec (x [,n])

7.9.

variable de tipo ordinal


variable de tipo entero, si existe

Si n existe, x se incrementa/decrementa en n, en caso contrario se incrementa/


decrementa en 1.
Inc
Dec
Inc
Dec

(x)
(x)
(x,n)
(x,n)

equivale
equivale
equivale
equivale

269

Dec (VarEntera);
{ VarEntera
:= VarEntera - 1 }
WriteLn (VarEntera);
Dec (VarEnteraLarga, 10); { VarEnteraLarga := VarEnteraLarga - 10 }
WriteLn (VarEnteraLarga)
end.

Inc (x [,])

x
n

Funciones estndar y definidas por el usuario

a
a
a
a

x:=x+l
x:=x-l
x:-x+n
x:=x-n

Inc y Dec son equivalentes a Pred y Succ, con la diferencia de que stas son funciones
en lugar de procedimientos. La razn de utilizar Inc y Dec reside en el hecho de su mayor
velocidad de ejecucin. Justifiqumoslo con un ejemplo:
1.ra:= Succ (m);

Para ejecutar esta sentencia de asignacin, el compilador genera cdigo para evaluar la expresin del lado derecho y a continuacin mueve ese valor intermedio
para sustituir el valor actual de la variable en el lado izquierdo de la sentencia de
asignacin.
La transferencia de datos de unas posiciones de memoria a otra emplea mayor
tiempo que el empleado simplemente en incrementar o decrementar una variable.
2. Una sentencia como
Inc ( I ) ;

genera cdigo que va directamente a la posicin de la variable I y se incrementa.


Este cdigo es ms rpido que el generado por Succ.'
Ejemplo 7 . 5
program Demo;
var
VarEntera
: integer;
VarEnteraLarga : longint;
begin
VarEntera
:= 20;
VarEnteraLarga := 40000;
Inc (VarEntera);
{ VarEntera
:= VarEntera + 1 }
WriteLn (VarEntera);
Inc (VarEnteraLarga, 10); { VarEnteraLarga := VarEnteraLarga + 10 }
WriteLn (VarEnteraLarga);

NUMEROS ALEATORIOS

Existen numerosas ocasiones en programacin en que se necesitan realizar simulaciones


procesos para diseo de modelos que imitan a condiciones reales y que implican
elementos dependientes del azar; por ejemplo, procesos estadsticos, probabilidad, juegos
de azar (dados, loteras, quinielas, naipes, loto, etc.), balstica, etc.
En estas ocasiones se debe utilizar la computadora y un mtodo generador de nmeros aleatorios; por ejemplo, el mtodo de Montecarlo, algoritmo que permite crear un
generador de nmeros aleatorios. Se entiende por aleatorio el proceso de seleccin de un
nmero al azar. Los nmeros generados por un generador de nmeros aleatorios deben
cumplir tres caractersticas:
1. Los nmeros se generan por un proceso aleatorio.
2. Los nmeros generados estn dentro de un cierto rango de valores.
3. La probabilidad de que se genere un nmero determinado es la misma que la de
cualquier otro nmero del rango.
T u r b o Pascal incorpora una funcin predefinida (Random) que genera n m e r o s
pseudoaleatorios, ya que satisface la segunda y tercera condicin anterior, pero no cumple la primera. Los nmeros se generan a partir de frmulas matemticas complejas y no
por un proceso aleatorio. Esta es la razn por la que se denominan pseudoaleatorios los
nmeros as generados, aunque tambin es cierto que para muchas aplicaciones se pueden considerar realmente aleatorios. La comprensin de los generadores de nmeros
pseudoaleatorios le ofrecer una herramienta de programacin muy til, sobre todo
donde el azar no importe.

7.9.1.

Funcin Random

Turbo Pascal incorpora una funcin de generacin de nmeros pseudoaleatorios


minada Random 2

deno-

Formato
R a n d o m [ ()]
n

es opcional; si existe debe ser u n a expresin entera de valor m a y o r que 0; en caso


contrario se producir un error

2
En realidad pseudoaleatorios, ya que si bien parecen generarse al azar de modo aleatorio, su ley de
formacin sigue una compleja ley matemtica, aunque, eso s, de difcil prediccin.

270

Programacin en Turbo/Borland Pascal 7


Funciones estndar y definidas por el usuario

S no existe a r g u m e n t o o p a r m e t r o (n), la funcin devuelve un n m e r o pseudoaleatorio


en el rango de 0 a 1, sin incluir el 1, es decir: 0 < = Nmero < 1.
Si existe el a r g u m e n t o , la f u n c i n devuelve un n m e r o entero pseudoaleatorio en el rango
de 0 a n - 1, inclusive, es decir: 0 < = Nmero < n.

Ejemplos

7.9.2.

271

Generacin de nmeros aleatorios


en intervalos definidos por el usuario

En ocasiones es necesario generar nmeros aleatorios en otros rangos de valores que los
definidos por Turbo Pascal; ello es posible eligiendo un argumento apropiado para Random y aadiendo una constante adecuada en el caso de nmeros enteros; y en caso de
nmeros reales, multiplicando la funcin Random por el nmero idneo y aadindole
tambin la constante adecuada.

v := Random (10);
WriteLn (v); visualiza un numero entero entre 0 y 9}
WriteLn (Random (100)); {visualiza un entero entre 0 y 99}
WriteLn (Random); visualiza un numero aleatorio real entre 0 y 1

Problema 7 . 3

Random (5) + 3

genera un nmero

aleatorio

Random * 100

genera un nmero

real entre 0 y 99.9999

mayor o igual que 3 y menor que 8

Random * 1 0 0 + 1

genera un nmero

real entre 1 y 100.9999

R a n d o m (M) + N

genera un nmero
inclusive.

entero aleatorio

. . .
. ..

entre N y M + N = 1, ambos

Generar diez nmeros reales aleatorios.


Problema 7 . 5
for i := 1 to 10 do
WriteLn (Random);

Disear una funcin que genere un nmero aleatorio comprendido entre dos lmites
definidos en el programa principal, que se envan como parmetros actuales.

7.017209027OE-01
7. 333213130E-01
8.09774334824E-01
9.3556758194E-01

function RangoAleatorios (Inferior, Superior : integer) : integer;


var
I : integer;
begin
repeat
I := Random (Superior + 1){se genera un numero aleatorio}
until I >= Inferior;
{hasta que cae entre ambos limites}
RangoAleatorios := I
end;

El exponente E - 0 1 hace que todos estos nmeros caigan en el rango 0.0 a


0.9999999999.
Problema 7 . 4
Estudie y ejecute este programa en su computadora, analizando los diferentes resultados.
program Aleatorios;
var
X, Y, Z : real;
M, N, P : integer;
begin
= Random (100)
M
N = Random (100)
P = Random (100)
X = Random;
Y = Random;
Z = Random
WriteLn (M:1S, N:18, P:18);
WriteLn;
WriteLn (X:18:10, Y:18:10, Z:18:10)
end.

7.9.3.

La sentencia Randomi z e

La primera vez que Random se ejecuta, Turbo Pascal arranca la generacin de nmeros
aleatorios a partir de un nmero denominado semilla del nmero aleatorio (random
number seed) y ejecuta las operaciones matemticas relacionadas con esa semilla para
generar el primer nmero aleatorio. El generador de nmeros aleatorios comienza la
generacin de nmeros aleatorios con una semilla determinada. Cada semilla genera una
serie diferente de nmeros aleatorios; eso significa que las series de nmeros aleatorios se
repetirn cada vez que el programa se ejecute, a menos que el generador de nmeros
aleatorios se reinicialice con un nuevo valor de la semilla.
Realice' tres veces la ejecucin del programa
program Azar;
var I : integer;
begin
for I := 1 to 20 do
WriteLn (Random:12:11)
end.

272

Funciones estndar y definidas por el usuario

Programacin en Turbo/Borland Pascal 7

var
J, Pila, Columna : integer;
begin
ClrScr;
Write ('Introduzca semilla ');
{ inicializar semilla }
ReadLn (RandSeed);
ClrScr;
for J := 1 to 100 do
{ imprimir el asterisco en posicion aleatoria }
begin
Fila
:= 1 + Random (25);
Columna := 1 + Random(80);
GotoXY
(Columna, Fila);
Write
( ' *' )
end
end.

y observe que los resultados son siempre iguales. La razn es la ya mencionada de que la
semilla no se ha reinicializado y siempre ha sido la misma.
Randomi ze es la sentencia encargada de remicializar la semilla y RandSeed (Semilla
Aleatoria) es la variable predeclarada de tipo longint (entero largo).
El generador de nmeros aleatorios se inicializar de dos formas diferentes: 1) haciendo una llamada a Randomi ze, 2) asignando un valor especfico a la variable RandSeed.
En ambas ocasiones, la secuencia de nmeros aleatorios siempre ser diferente.
Ejemplo 7 . 6
program AzarUno;
uses
Cr{

-'

begin
Randomize;
ClrScr;
repeat

( s e importa el procedimiento ClrScr que limpia


la pantalla}

{limpia la pantalla}

WriteLn (Random:12:11)
until KeyPressed
end.

Ejecute este programa varias veces y observe cmo la secuencia de nmeros aleatorios es siempre diferente. La razn es que Randomize inicializa en cada ejecucin la semilla.
Otro mtodo de inicializar la semilla es leer el valor de la misma y asirnarla a una
operacin de lectura a la variable RandSeed, es decir, sustituir Randomize por Realln
(RandSeed).
Si se utilizan diferentes valores de entrada, se obtendrn diferentes salidas del programa. Y si se utiliza la misma entrada dos veces, se obtiene la misma salida ambas
veces.

273

7.10.

FUNCIONES DEFINIDAS POR EL USUARIO

Adems de las funciones predefinidas estudiadas es posible que el usuario pueda declarar
sus propias funciones de igual modo que declara sus procedimientos.
Una funcin es un subprograma que devuelve un nico resultado al programa o
subprograma que le llam. La sintaxis de una funcin es muy similar a la de un procedimiento.
Formato
function nombre (pl, p2,
tipo
{declaraciones locales y subprogramas}
begin
< cuerpo de la funcion>
Nombre := valor de la funcin
end;

Problema 7 . 6
Realizar un dibujo sobre la pantalla de 100 caracteres asterisco (*) dibujados aleatoriamente en cualquier posicin de la pantalla.
Como la pantalla tiene 25 filas y 80 columnas hbiles para dibujo, se generarn las
posiciones aleatorias con las funciones:
Fila
:= 1 + R a n d o m ( 2 5 )
Col urna : = 1 + R a n d o m ( 8 0 )
GotoXY (Columna, Fila)

genera un nmero entero de 1 a 25


genera un nmero entero de 1 a 80
posiciona el cursor en la posicin (columna, fila)

Entonces el programa puede ser:


program DibujoAsteriscos;
uses
Crt ;

pl, p2, . . .
tipo

lista de p a r m e t r o s formales
tipo de d a t o del resultado q u e devuelve la f u n c i n

Comparacin de funciones y procedimientos


1. En lugar de la palabra procedure se debe utilizar la palabra reservada function.
2. Al igual que en los procedimientos, el nombre de una funcin es un identificador.
Sin embargo, el nombre de la funcin se refiere a la posicin de memoria que
contiene el valor devuelto por la funcin.
3. La lista de los parmetros formales son los identificadores utilizados para recibir
valores del programa.
4. El tipo de datos del resultado coincide con el tipo expresado en la cabecera de la
funcin.

Programacin

en Turbo/Borland

Pascal 7

Funciones estndar

5. En el cuerpo de la funcin tiene que existir una sentencia de asignacin similar a


nombre-funcin

y definidas por el usuario

275

begin
{encontrar el mayor de A y B}
if A > B
then Mximo := A
else M x i m o := B;
{Ahora compara el mayor de A y B con C}
if Mximo >= C
then Max3 := Mximo
else Max3 := C

:= valor-funcin

donde est definido el valor de la funcin.


6. La funcin slo devuelve un valor, el procedimiento puede devolver cero, uno o
varios valores.
7. El tipo de dato del resultado en la funcin debe estar indicado en la cabecera y
puede ser cualquier tipo de dato escalar (integer, real, boolean o char), o un tipo
enumerado definido anteriormente, un tipo subrango o un tipo puntero (descrito
en el Captulo 17).

end

{Max3}

4. Funcin Tan (tangente de un ngulo x)


Ejemplos

La tangente de un ngulo x viene dada por la frmula:

1 Funcin triple de un nmero


function Triple (Numero : real): real;
begin
Triple := 3 * Numero
end;

2. Funcin signo de un nmero


function Signo (X :
{devuelve signo del
o negativo}
var
Aux : integer;
begin
if X > 0 then Aux
xf X = 0 then Aux
if X < 0 then Aux
Signo := Aux
end;

real) : integer;
parametro X: 1, 0 -1 para positivo, cero

:= 1;
:= 0;
:= -1;

La variable auxiliar (Aux) se puede evitar en algunos casos, como sucede en la


nueva funcin Signo.
function
begin
if X >
if X =
if X <
end;

Signo

tangente (x) =

seno (x)

coseno (x)

Entonces la funcin se declara como


function Tan ( X : real) : real;
begin
Tan := Sin (X) / Cos (X)
end

5. Funcin Cuadrado (Calcula el cuadrado de un nmero x)


function Cuadrado (X : real) : real;
begin
Cuadrado := X * X
end

7.10.1.

Llamadas a una funcin

Una funcin definida por el usuario se llama de igual modo que una funcin Pascal
estndar (predefinida): haciendo referencia a ella en una extensin.
La llamada se realiza con el designador de la funcin nombre (lista de parmetros) en una sentencia de asignacin o en una sentencia de salida (escritura).

(X : real) : integer;

0 then Signo := 1;
0 then Signo := 0;
0 then Signo := - 1

3. Funcin Max3 (Calcula el mayor de tres enteros parmetros)


function Max3 (A,B,C : integer) : integer;
var
Mximo : integer;

Formato (Designador de una funcin)


nombreFuncin

(lista de parmetros

Ejemplos
Cuadrado (x)
Max3 (a, b, c)
WriteLn (Cuadrado (x))

actuales)

276

Funciones estndar y definidas por el usuario

Programacin en Turbo/Borland Pascal 7

7.10.2.

Reglas

277

Funciones con resultados no numricos

Una funcin puede devolver un valor perteneciente a cualquier tipo estndar, un tipo
enumerado, un tipo subrango o un tipo puntero. En esta seccin se recogen unos ejemplos de conversin.

Los parmetros actuales deben estar separados por comas.


El n m e r o de parmetros actuales y formales debe ser el m i s m o , y a d e m s los p a r m e t r o s
correspondientes de igual tipo.
;' -'

Ejemplo 7 . 8
Ejemplo 7 . 7
Escribir un programa que permita calcular el cubo de un nmero mediante una funcin
Cubo.
program Potencia;
var N : integer;
nombre de
la funcin

I
.
*
t
function Cubo (x : integer) : integer;
{proporciona x al cubo}
f

begin
{Cubo}
-Cubo := x * x * x
end;
{Cubo}
begin

tipo de argumento

tipo de valor devuelto


valor devuelto

La funcin Mayscula recibe un argumento de tipo carcter; si es una letra minscula,


devuelve su correspondiente letra mayscula, en caso contrario devuelve su argumento.
function Mayuscula (Ch : char) : char;
begin
if Ch in ['a'..'z'] then
Mayuscula := Chr (Ord (Ch) - Ord ('a') + Ord ('A'))
else
Mayuscula := Ch
end;

El operador in significa pertenece al conjunto de letras minsculas 'a', ' b \


'z'.
Otro tipo de funcin muy utilizado es la funcin que devuelve un valor de tipo
lgico.

{programa}

T := Cubo (3);

Ejemplo 7 . 9

WriteLn ('el cubo de 3 es', T);

Disear una funcin que permita verificar si un nmero determinado est comprendido
en un rango dado (>=-10 y <20, o bien de valor cero); en caso afirmativo, devolver un
valor verdadero, y en caso contrario, falso.

WriteLn ('4 al cubo es :', Cubo (4));


end.

Ejecucin
function RangoValido (n : integer) : boolean;
begin
RangoValido := (n >= 10) and (n < 20) or (n = 0)

el cubo de 3 es 27
4 al cubo es : 64

end;

Problema 7 . 7
Escribir una funcin que permita calcular la suma
1 + 2 + + n
donde n es una variable que pasa a la funcin como parmetro normal.
function Suma (N : integer) : integer;
{esta funcin calcula la suma 1 + 2 + . . + N}
var
Total, J : integer;
begin
Total := 0;
for J := 1 to N do
Total := Total + J;
Suma := Total
end;

7.10.3.

Parmetros variable sin tipo

Cuando un parmetro formal es un parmetro sin tipo, el parmetro real (actual) correspondiente puede ser cualquier referencia a variable, con independencia de su tipo.
Ejemplo (extrado del Language Guide de Turbo Pascal 7.0, pgina 110)
function Igual

(var Fuente, Destino; Longitud: word) : boolean;

type
Bytes = array [O..MaxInt] of byte;
var
n : integer;
begin

278

Programacin

en Turbo/Borland

w h i l e (n < L o n g i t u d ) and
[N] do Inc (N);
Igual
end;

Funciones

Pascal 7
(bytes

(destino)

[N] = Bytes

(fuente)

Las variables procedimiento

Esta funcin se puede utilizar para comparar cualesquiera dos variables de cualquier
tamao (longitud). Por ejemplo, dadas las declaraciones

[1 . . 10] of integer;

x , y : integer;
var
: integer;

: Punto;

: TasaMes;

Resultado
Mis

: RealF;
: TodoP

Ejemplo

: Vector;

{$F +}
procedure Intercambio

y las llamadas'

var
Aux

: integer;

Igual
Igual

(Vecl, Vec2, SizeOf


(Vecl, V e c 2 , SizeOf

Igual
Igual

(Veclfl], Vecl [6], SizeOf


(Vecl[1], P, 4)

begin
Aux
A
B

:= A ;
: = B;
:= Aux

(Vector))
(integer) * N)
(integer) * 5)

EL TIPO PROCEDIMENTAL (procedure, function)

A partir de la versin 5.X se introducen unos tipos de datos procedimentales, que ya en


otros lenguajes, como Modula-2, estn implementados. Los procedimientos y funciones
pueden ser tratados como objetos que se pueden asignar a variables y pasados como parmetros.
Un tipo procedure se declara como la cabecera de una funcin o procedimiento sin
parmetros (el identificador despus de procedure o fuction se omite).

: integer);

function Tan

(Angulo

begin
Tan

(Angulo) / Cos

:= Sin

:real)

: real;
(Angulo)

end.

Las variables P y F fueron declaradas anteriormente como variables procedimiento:


type
IntercambioProc = procedure
FunMat
var
P
F

= function

(var X, Y
(X

: real)

: integer);
: real;

: IntercambioProc;
: FunMat

Las variables P y F pueden ahora tener asignados valores:

type
I n t e r c a m b i o = p r o c e d u r e (Intl, Int2 : integer);
TasaMes
= f u n c t i o n (Tasalnt : r e a l ) : real;
RealF
= function : Real;

(var A , B

end;

comparan sucesivamente: Vecl con Vec2, los Nprimeros componentes de Vecl con los
N primeros componentes del Vec2, los cinco primeros componentes de Vecl con los
cinco ltimos componentes de Vecl y por ltimo comparan V e c l f l ] al identificador de
campo P.x y Vecl[2] a P.y.

7.11.

: Intercambio;

TasaBruta, TasaNeta

o funcin.

end;
V e c l , Vec2

279

Al igual que a una variable entera se puede asignar un valor entero, a una variable
procedimiento se puede asignar un valor procedimiento. Tal valor puede ser, naturalmente, otra variable procedure, pero tambin puede ser un identificador procedimiento

type
V e c t o r = array
Punto = record

y definidas por el usuario

se pueden definir como

var
IntercambioVar

:= N = l o n g i t u d ;

estndar

FunMat
TodoP

= function
(X : r e a l )
= procedure;

MaxFunc

= function

(A,B

: real;

: real; F

Sizeof devuelve el nmero de bytes ocupado por el argumento.

: FunMat)

: real;

:= I n t e r c a m b i o ;

:= T a n ;

Las llamadas
p

(i, J)

(x)

280

Programacin en Turbo/Borland Pascal 7

son equivalentes a
Intercambio (I, J)

Funciones estndar y definidas por el usuario

Ejecucin
Tan (x)

Los tipos procedimiento se pueden utilizar para declarar variables procedimiento,


que son variables cuyos valores son los nombres de los procedimientos. Estas variables se
pueden pasar a procedimientos como parmetros procedimiento.

7.12.
7.11.1.

281

Parmetros tipo procedimiento

Los tipos procedimiento simplifican el desarrollo de subprogramas de propsito general.


Es posible declarar procedimientos o funciones que tomen procedimientos o funciones
como parmetros. El siguiente programa demuestra el uso de un parmetro tipo procedimiento para sacar dos tablas de diferentes funciones aritmticas:
program Tablas;
type
Funcin = function (X,Y : integer) : integer;
{$F+}
function Suma (X,Y : integer) : integer;
begin
Suma := X + Y
end;
function Multiplicar (X,Y : integer): integer;
begin
Multiplicar := X * Y
end;
{*F-}
procedure VisualizarTabla (P, Q : integer; Operaciones : Funcin);
var
X, Y : integer;
begin
for Y := 1 to P do
begin
for X := 1 to Q do
Write (Operaciones (X,Y) : 5 ) ;
WriteLn
end;
WriteLn
end;

1
2

2
4

3
6

4
8

5
10

12

7
14

8
16

9
18

10
20

12

15

18

21

24

27

30

PUESTA A PUNTO DE PROGRAMAS

T c n i c a s de programacin
1. Al disear un programa es muy frecuente que una o ms tareas impliquen el clculo
de un nico valor. En esos casos las subtareas deben ser implementadas como funciones.
2. En el diseo de funciones no es buena prctica realizar efectos laterales, tales como
cambiar una variable global o utilizar un parmetro variable. Si tales cosas son necesarias, es normalmente ms claro utilizar un procedimiento en lugar de una funcin.
3. U n a funcin de valor lgico puede simplificar una sentencia if-then-else haciendo
una tarea separada de evaluacin de expresiones lgicas.
4. En el diseo de una funcin es muy rentable verificar casos especiales y valores
extremos, tales como el primero o el ltimo valor de la lista.
5. El uso correcto de funciones predefinidas simplifica notablemente los clculos.
6. Los parmetros de una funcin deben ser parmetros valor.
Errores de programacin
1. El resultado de la funcin debe estar definida para todo el rango de valores de parmetros vlidos.
2. No utilizar el nombre de una funcin en una expresin en el interior del cuerpo de la
funcin.
3. Evitar utilizar parmetros variables y devolver un resultado que modifique un parmetro de la funcin (efecto lateral).

RESUMEN
Declaracin de la funcin
f u n c t i o n nombre ( l i s t a de p a r m e t r o s ) : t i p o de d a t o d e v u e l t o

Ejemplo
f u n c t i o n Volumen (Radio, A l t u r a : r e a l ) : r e a l ;

Llamada a la funcin

begin
VisualizarTabla (10, 10, Suma);
VisualizarTabla (10, 10, Multiplicar)
end.

nombre funcin

( l i s t a de argumentos)

x := Volumen ( 4 . 2 5 , 6, 7.50)

{x de t i p o r e a l

282

Programacin en Turbo/Borland Pascal 7

PROBLEMAS RESUELTOS
1. Disear una funcin q u e calcule potencias de la f o r m a x" y un p r o g r a m a que haga uso de la
misma, para distintos valores x y n.
Anlisis
X" = X * X * X ... * X
ti veces
El valor de la potencia se obtiene multiplicando n por s mismo; cosa q u e se p u e d e hacer con
un bucle for:
for j := 1 to n do
begin
Producto := Producto * x
end

Funciones estndar y definidas por el usuario

Escribir un programa que permita deducir si un n m e r o n es primo, apoyndose en u n a


funcin Primo.

Anlisis
Los n m e r o s primos son aquellos que slo son divisibles por ellos mismos y la unidad. Por
ejemplo:
12 no es p r i m o (tiene los divisores 1, 2, 3, 4, 6, 12)
13 es p r i m o
(slo tiene los divisores 1 y 13)
El algoritmo para deducir n m e r o s primos es m u y conocido, por lo que escribiremos directam e n t e la f u n c i n . El m t o d o utilizado es el m s simple p e r o a la vez el ms lento al dividir
el n m e r o d a d o n por todos los n m e r o s sucesivos de 2 a n - 1.
program TestPrirnos;
var
N : integer;

Cdigo
program
var
Argl
Arg2
Resp

Calculo;
: real;
: integer;
: char;

function Potencia (X: real; N: integer): real;


var
J
: integer;
Producto : real;
begin
if X = 0.0
then
Potencia := 0.0
else
begin
Producto := 1 ;
for J := 1 to N do
Producto := Producto * X;
Potencia := Producto
end
end;
begin
repeat
WriteLn ('Introduzca un numero real y un entero no negativo');
ReadLn (Argl, Arg2);
WriteLn (Argl : 4: 2, ' elevado a ', Arg2 : 1);
WriteLn ('es
Potencia (Argl, Arg2):5:2);
WriteLn (Otra prueba? (S/N)');
ReadLn (Resp)
until (Resp = 'N') or (Resp = 'n')
end.

283

function Primo (Q: integer) : boolean;


{ devuelve true si Q es primo, false en caso contrario }
{ precondicion Q > 0 }
var
D : integer;
P : boolean;
begin { Primo }
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;
{ Primo }
begin
WriteLn (' Introduzca un entero positivo
WriteLn (' y cero para terminar ');
ReadLn
(N);
while N > 0 do
begin
if Primo (N)
then
WriteLn (N,' es primo')
else
WriteLn (N, ' no es primo');

');

284

Funciones estndar y definidas por el usuario

Programacin en Turbo/Borland Pascal 7


WriteLn ('Introduzca otro entero');
ReadLn (N)
end; { while }
WriteLn ('Fin del programa')
end.

Ejecucin
Introducir rango de valores e incremento
0 1.5 0.25
Angulo

Ejecucin

0.00
0.25
0.50
0.75
1.00
1.25
1.50

Introduzca un entero positivo


y cero para terminar
18
18 no es primo
Introduzca otro entero
17
17 es primo
Introduzca otro entero
0
Fin de programa

seno (x)
coseno (x)

program
Demo;
const
Pi = 3.14159;
Dos = 2;
var
Mes, Dia, Anno
: integer;
Hora , IVA, cantidad : real;
Codigo
: char;

,
x (radianes) : real

function Tan (X: real) : real;


{ Esta funcin devuelve la tangente de X (X, en radianes)}
begin
Tan := Sin(X) / Cos(X)
end; { Tan }

('Introducir rango de valores e incremento: ');


(Inferior, Superior, Incremento);
('Angulo
('======

0.0000
0.2553
0.5463
0.9316
1.5574
3.0096
14.1014

1. Considerar el siguiente programa:

program TablaTangentes;
{ programa que imprime una tabla de valores de la funcin tangente }
var
Inferior, Superior,
{ limites del rango de valores }
Incremento, Angulo : real;

begin
WriteLn
ReadLn
WriteLn;
WriteLn
WriteLn

tan (Angulo)

EJERCICIOS

3 . Escribir un p r o g r a m a que imprima una tabla de valores de la funcin trigonomtrica


tangente.
^
/ ^
T a n (x)

285

tan (Angulo)');
============');

Angulo := Inferior;
while Angulo <= Superior do
begin
WriteLn (Angulo :5 :2, Tan (Angulo):14:4);
Angulo
:= Angulo + Incremento
end
end.

function f (x, y f; real; z : integer) : real;

D e t e r m i n a r si las siguientes sentencias se pueden utilizar en la parte de sentencias del programa. Explicar la respuesta.
)
b)
C)
d)
)

Cantidad ;= f (Pi, IVA, Mes);


IVA := f (Horas, Dia, dos);
WriteLn f (0, 0 , 0 ) ;
if Mes Dos then
Anno := f (Horas, f (IVA, Pi, do), Dia);
while f (Cantidad, 0, 0) < Pi dos
Cantidad := f (Cantidad, Pi, 1);

2. Cul es la salida del siguiente programa?


program Ejercicio;
function Loca (n : integer) : char;

286

Programacin en Turbo/Borland Pascal 7


Program P

begin
Loca := ' x 1 ;
if n = 1 then
Loca := 'A'
if n = 2 then
Loca := ' B '
end;

p r o c e d u r e P1
p r o c e d u r e P2

begin
{Ejercicio}
WriteLn (Loca(l), Loca(2), Loca(3
end.
{Ejercicio}

function F
p r o c e d u r e P3

3. Qu hay incorrecto en la siguiente funcin?


function Potenciados (n : integer) : integer;
{devuelve 2 a la potencia n ; n > 9}
var i : integer;
begin
PotenciaDos := 1;
for 2 := 1 to n do
PotenciaDos := PotenciaDos * 2
end;

{PotenciaDos}

4. Escribir una f u n c i n q u e tenga un a r g u m e n t o de tipo entero y q u e devuelva la letra P si el


n m e r o es positivo, y la letra N si es cero o negativo.
5. Escribir una f u n c i n lgica de dos a r g u m e n t o s enteros, que devuelva true si u n o divide al otro
y false en caso contrario.
6. Escribir una f u n c i n q u e convierta una t e m p e r a t u r a d a d a en grados Celsius a grados Fahrenheit. La frmula de conversin es
9
F = C + 32
5
7. Escribir una f u n c i n lgica Dgito q u e determine si u n carcter es u n o de los dgitos de 0
a 9.
8. Escribir una f u n c i n lgica Vocal q u e d e t e r m i n e si un carcter es u n a vocal.
9. Escribir una f u n c i n R e d o n d e o que acepte u n valor real C a n t i d a d y un valor entero Decimales y devuelva el valor de C a n t i d a d r e d o n d e a d o al n m e r o especificado de Decimales. Por
ejemplo. R e d o n d e o (20.563,2) devuelve los valores 20.0, 20.5 y 20.54. respectivamente.
10. Escribir un p r o g r a m a q u e p e r m i t a al usuario elegir el clculo del rea de cualquiera de las
figuras geomtricas: crculo, cuadrado, rectngulo o tringulo, m e d i a n t e funciones.
11. D a d a la estructura de bloques

Cul de las siguientes acciones no est permitida?


a)
b)
c)
d)
e)
/)

Llamar
Llamar
Llamar
Llamar
Llamar
Llamar

al procedimiento P1 desde el c u e r p o del p r o c e d i m i e n t o P2.


a la funcin F desde el cuerpo del p r o c e d i m i e n t o P3.
a P3 desde el c u e r p o del p r o g r a m a .
a P3 desde el c u e r p o de F.
a P2 desde el c u e r p o de F.
a P2 desde el cuerpo de F.

Describir lo que se i m p r i m e en este programa:


program Prueba;
var
Suma50, SumalOO : real;
function Armnica (n : integer) : real;
var
i : integer;
Suma : real
begin
Suma := 0;
for i : = 1 to n do
Suma := Suma + 1.0 / 1;
Armnica ;= Suma
end
begin
Suma 5C := Armnica (50);
Suma 100 := Armnica (100);
WriteLn ('la suma de 50 trminos es', Suma 50);
WriteLn ('la suma de 100 trminos es', Suma 100);
end.

288

Programacin en Turbo/Borland Pascal 7

Funciones estndar y definidas por el usuario

13. D e t e r m i n a r y visualizar el n m e r o m s grande de dos n m e r o s dados, m e d i a n t e un subprograma.


14. Escribir un p r o g r a m a recursivo que calcule de los N primeros n m e r o s naturales.
15. Realizar u n a f u n c i n que produzca la s u m a de los dgitos de la representacin decimal de un
valor entero no negativo.

289

8. Escribir una funcin con dos parmetros, x y n, que devuelva lo siguiente:


x +

x"

x" + 2

n +2

y-n-r 1

n + 1

si x > = 0

si x < 0

n - l

9. Escribir una funcin que tome c o m o p a r m e t r o s las longitudes de los tres lados de un tringulo (a, b y c) y devuelva el rea del tringulo.

PROBLEMAS

Area = ^ p(p - a) (p - b) (p - c)

1. Calcular el coeficiente del b i n o m i o con una funcin factorial.


/ m\
\ n }

m\

( 1
d o n d e m\ = l
| 1.2.3...m

t,
r
n\(m - n)\

donde

p =

a + b + c

10. Escribir un p r o g r a m a m e d i a n t e funciones q u e realicen las siguientes tareas:


si m = 0

siw<0

2. Escribir un p r o g r a m a que permita el clculo del mcd ( m x i m o c o m n divisor) de dos n m e r o s


por el algoritmo de Euclides. (Dividir a entre b, se obtiene el cociente q y el resto r si es cero b
es el mcd, sino se divide b entre r, y as sucesivamente hasta encontrar un resto cero, el ltimo
divisor es el mcd.)
3. Escribir una funcin que permita calcular la serie:
,,
i
n (n + 10) (2n + 1)
1- + 2- + 3- + + n- =
= n * (n + 10) * (2 * n + 1) /6

a) Devolver el valor del da de la s e m a n a en respuesta a la entrada de la letra inicial (mayscula o minscula) de dicho da.
b) D e t e r m i n a r el n m e r o de das de u n m e s y a o dados.
11. Escribir un p r o g r a m a q u e lea u n a cadena de hasta diez caracteres que representa a u n n m e r o
en n u m e r a c i n r o m a n a e i m p r i m a el f o r m a t o del n m e r o r o m a n o y su e q u i v a l e n t e en n u m e r a c i n arbiga. Los caracteres r o m a n o s y sus equivalentes son:
M
D
C

1000
500
100

L
X
V
I

50
10
5
1

C o m p r u e b e su p r o g r a m a para los siguientes datos:


L X X X X V I (86), C C C X I X (319), M C C L I V (1254)

4. Escribir un programa que lea dos n m e r o s x y n y calcule la s u m a de la progresin geomtrica.


1

+ X + A"2 + X 3 + + x "

5. Escribir un programa que encuentre el valor mayor, el valor m e n o r y la suma de los datos de
entrada. O b t e n e r la media de los datos mediante una funcin.
6. Escribir un p r o g r a m a que utilice una f u n c i n Potencia para calcular el pago mensual de un
prstamo d a d o por la frmula:
r A/n
1 - (1 + r/n)-"
7. Escribir una funcin que acepte un p a r m e t r o x ( x # 0 ) y devuelva el siguiente valor:
1

12. Escriba u n a f u n c i n que calcule cuntos p u n t o s de c o o r d e n a d a s enteras existen d e n t r o de u n


tringulo del q u e se conocen las coordenadas de sus tres vrtices.
13. Codifique un procedimiento que escriba N lneas en blanco.
14. Escribir u n p r o g r a m a q u e mediante procedimientos y funciones d e t e r m i n e el rea del crculo
correspondiente a la circunferencia circunscrita de u n tringulo del q u e c o n o c e m o s las coord e n a d a s de los vrtices.
15. D a d o el valor de un ngulo escribir un p r o c e d i m i e n t o q u e muestre el valor de todas las f u n ciones trigonomtricas correspondientes al m i s m o .

Tipos de datos definidos por el usuario y conjuntos

8
CAPITULO

TIPOS DE DATOS DEFINIDOS


POR EL USUARIO Y CONJUNTOS
CONTENIDO
8.1.
Definiciones d e tipos
8.2.
T i p o s d e d a t o s ordinales
8.3.
Tipos de datos subrango
8.4.
T i p o s d e f i n i d o s por el usuario: e n u m e r a d o s
8.5.
Las f u n c i o n e s ordinales: Ord, Pred y S u c c
8.6.
Compatibilidad d e t i p o s y compatibilidad d e asignacin
8.7.
Conjuntos
8.8.
O p e r a c i o n e s con c o n j u n t o s
8.9.
Recapitulacin s o b r e c o n j u n t o s : c o n c e p t o s y o p e r a c i o n e s
8 . 1 0 . Procedimientos especiales de conjuntos
8.11. Puesta a punto de programas
RESUMEN
EJERCICIOS
PROBLEMAS

291

datos slo requieren elementos simples de datos y no requieren organizacin especfica.


Sin embargo, Pascal incluye un nmero de tipos de datos que requieren una organizacin de datos, son denominados estructuras de datos. Una estructura de datos es una
coleccin de datos organizados de un modo particular. Las estructuras de datos permiten
representar, almacenar, organizar y procesar datos simples y datos ms complejos o
compuestos.
En captulos anteriores se han visto las estructuras de datos ms simples integer,
char, boolean, real, etc.; sin embargo, para tratar problemas complejos Pascal tiene
otros tipos de datos que proporcionan organizaciones de datos muy tiles: enumerados,
conjuntos, registros, arrays, etc. En este captulo se estudiarn los tipos de datos ordinales (una parte de los tipos escalares) enumerados y subrango, junto con los datos compuestos denominados conjuntos. Todos estos tipos de datos estn dentro de las estructuras de datos conocidas como estticas por ocupar una cantidad fija de memoria.
Los tipos de datos enumerados y subrango se les conoce tambin como datos definidos por el usuario, por ser ste el que puede definir el tipo de datos y el nmero de
elementos que componen dicho tipo.

8.2.

TIPOS DE DATOS ORDINALES

Un tipo de datos es ordinal si sus elementos estn dispuestos de modo que:


1. Existe un primer elemento y un ltimo elemento.
2. Cada elemento, excepto el ltimo, tiene un elemento que le sigue llamado sucesor.
3. Cada elemento, excepto el primero, tiene un valor que se precede llamado predecesor.
El siguiente esquema representa datos de tipo ordinal.
siguiente

siguiente

siguiente

Pascal e s un l e n g u a j e rico en t i p o s d e d a t o s , s e le s u e l e d e n o m i n a r

de tipos fuertes o fuertemente tipificados (typed strong). Se ha visto


en captulos a n t e r i o r e s q u e a c a d a variable c o r r e s p o n d e un t i p o . La
nocin d e tipo e s m u y i m p o r t a n t e ya que d e t e r m i n a la n a t u r a l e z a y el
c o n j u n t o d e los v a l o r e s q u e p u e d e t o m a r una variable. En e s t e captulo t r a t a r e m o s los t i p o s e s c a l a r e s o s i m p l e s y un tipo d e d a t o e s t r u c t u r a d o c o n o c i d o c o m o c o n j u n t o , d e j a n d o p a r a los s i g u i e n t e s captulos los r e s t a n t e s t i p o s d e d a t o s e s t r u c t u r a d o s .

8.1.

DEFINICIONES DE TIPOS

En Pascal cada elemento de datos utilizado en un programa, constante o variable, se


asigna a un tipo de datos en una declaracin. Ya se han visto los tipos de datos ms simples: integer, char, boolean, real, entre otros. Adems de estos tipos de datos simples,
existen otros datos simples conocidos como tipos subrango y enumerados. Estos tipos de

290

elemento

elemento

anterior

elemento

anterior

...

elemento

anterior

Turbo Pascal 4.0/5.5 tiene siete tipos de datos ordinales predefinidos: integer, shortint, longint, byte, word, boolean y char. Adems existen otros tipos ordinales definidos
por el usuario: enumerados y subrango.
Veamos la razn por la cual algunos tipos predefinidos ya conocidos por el lector son
ordinales.
1. tipos enteros (integer)
Los enteros se disponen de acuerdo a su orden numrico.
. . . <- 3 < - 2 < - 1 < 0 < 1 < 2 < 3 <. . .

292

Programacin en Turbo/Borland Pascal 7

El primer entero es el lmite inferior del rango permitido y el mayor entero el lmite superior de dicho rango (-maxint . . . +maxint)
integer
shortint
longint
byte
word

-32768.-32767
-128..127
-2147483648..2147483647
0..255
0..65535

Tipos de datos definidos por el usuario y conjuntos

2. Concatenar caracteres mediante variables de cadenas utilizando el operador (+) o


la funcin residente Coricat.
Errores := ConCat ('Hola Mortimer', Letra);
Especificaciones := Letra +
+ Nombres;

3. Comparar caracteres entre s, mediante operaciones relacinales como =, > , < ,


>=, <= y < >.

Cada nmero tiene sucesor y predecesor excepto el primero y ltimo.

' b', > ' B'

2. tipos char
Los caracteres se pueden disponer de muchas formas, pero existe una, el cdigo
ASCII, que todos cumplen.

3. tipos lgicos (boolean)


Existen slo dos valores lgicos: true y false. Estos valores estn ordenados, de
modo que
false < true
Recordemos algunos tipos de datos de gran importancia en programacin: char
v boolean.

8.2.1.

Caracteres (Char)

El tipo Char (carcter) incluye el conjunto de caracteres ASCII: letras, nmeros, caracteres de control no imprimibles como retorno de carro, retroceso, tabulacin, etc. Los datos Char son ordinales. La letra se puede expresar como el carcter literal 'A' y como Chr
(65).
Chr (234)

98 ' > ' 65'

verdaderas

4. Deducir el nmero de orden de los caracteres con la funcin de transferencia Ord:


Limite := 31 + Ord(letra);

'A'<'B'<'C'<. . . .

'a'c'b'c'c'c. . . .

Ord devuelve un valor numrico ASCII que es el nmero de orden del carcter.
Ord permite operaciones aritmticas.

8.2.2.

Lgicos (Boolean)

Una variable lgica (boolean), como ya conoce el lector, slo tiene dos valores posibles:
true y false. Al igual que Char, el tipo Boolean es ordinal.
Las palabras true (verdadero) y false (falso) son identificadores predefinidos en Pascal. El compilador los predefine como constantes de tipo lgico.
Una variable lgica ocupa slo un byte en memoria. Cuando una variable boolean
contiene el valor true, contiene realmente el nmero binario 01, y cuando contiene el
valor falso, contiene realmente el nmero binario 00.
Si se escribe una variable lgica en un archivo de disco, se escribir fsicamente en el
mismo los valores binarios 00 01. Sin embargo, cuando se imprime o visualiza una variable lgica utilizando Write o WriteLn, los valores binarios se reconocen por el cdigo
programa y las palabras true o false se sustituirn por los valores binarios 00 y 01.

representa el carcter letra omega (Qj


var OK : boolean
OK := 3 < 5;

Los caracteres se almacenan en memoria como bytes simples, expresados como nmeros binarios de 0 a 255.
Qu utilidad tienen las variables de tipo Char!

equivale a

OK := true;

Ejemplo

Tratamiento de dispositivos orientados al carcter: secuenciales.


Ejemplos
l. Escritura en la pantalla o impresora mediante Write y WriteLn.
WriteLn ( ' B ' ) ;
Write (Chr (235));
Write (Letra);
{Letra de tipo Char}

293

var
OK : boolean;
OK := 3 < 5;
if OK then
WriteLn ('3 es menos que 5')
else
WriteLn ( 1 3 es igual o mayor que 5');

294

Programacin en Turbo/Borland Pascal 7

Los tipos de d a t o s reales no son ordinales ya que:


1.
2.
3.
:

N o existe un
N o existe un
U n d a t o real
es el sucesor

Tipos de datos definidos por el usuario y conjuntos

295

Es posible definir los subrangos directamente en la declaracin de var aunque no es recomendable.

p r i m e r valor real.
l t i m o valor real.
c u a l q u i e r a n o tiene u n sucesor o un predecesor claro (por ejemplo, cul
de 6.718456?).

var
Numero
: 1..10;
Caracter : 'B'..'Y';

El tipo subrango es esencialmente utilizado para dos fines: 1, mejorar la legibilidad y


la comprensin; 2, aumentar la fiabilidad de los programas, ya que Pascal detecta si un
valor recibe un valor fuera del intervalo declarado.

8.3.

TIPOS DE DATOS SUBRANGO

Ejemplo

El tipo de dato ms simple que se puede definir en un programa Pascal es el tipo subrango o intervalo. Estos tipos son tiles, sobre todo por la facilidad que ofrecen para verificar automticamente errores. Un tipo subrango se define de un tipo ordinal, especificando dos constantes de ese tipo, que actan como lmite inferior y superior del conj u n t o de datos de ese tipo. Un tipo subrango es un tipo ordinal y sus valores se ordenan
de igual modo que en el tipo patrn de que se deducen.

type
d^as

= (lunes, martes, miercoles, jueves, viernes,


sabado, domingo);
fin_de_semana= sabado..domingo;
var
hoy
dias;
fiesta
fin_de_semana;
laborable
lunes..viernes;

Ejemplos
1.

1..10

este tipo s u b r a n g o consta de ios elementos 1,2,3,4,5,6,7,8,9,10

2.

F',.111

3.

a ' . . ' z'

este s u b r a n g o consta de los caracteres ' a ' a 'z'

4.

'0'..191

este s u b r a n g o consta de los caracteres '0' a '9'

este subrango consta de los caracteres 'F', ' G ' , 'H', T

Se pueden crear variables cuyos valores se restrinjan a un subrango dado. Las declaraciones de tipo subrango se sitan entre las declaraciones de constantes y de variables.

Cuando una variable no toma ms que un pequeo nmero de valores, se puede definir
de tipo subrango. Sirven para definir indicadores, variables de estados en un programa.
Pueden ser utilizados como ndices de arravs.

8.3.1.

Compatibilidad de tipos

Los tipos subrangos y sus tipos patrones originales tienen que ser compatibles, en el sentido de que cualquier tipo de subrango debe pertenecer al patrn. En el ejemplo anterior
es legtima la sentencia:
Grande :=

Formato

Reducido;

Tambin es legtimo el cdigo de programa


type Nombre = lmite inferior. .lmite superior

Ejemplos
program Prueba;
const
Pi = 3.141592;
type
IntervaloEnteros = -100..100;
LetrasMin
= 'a'-.'z';
var
Grande
: integer;
Reducido : IntervaloEnteros;
X, Y
: real;

ReadLn (Grande);
Reducido := Grande;

Sin embargo, si al leer con Readln (Grande) se toma para Grande un valor de 500
(fuera del rango IntervaloEnteros), la sentencia de aplicacin
Reducido := Grande

produce un mensaje de error.

8.3.2.

Verificacin de errores

Un uso importante de los tipos subrangos es detectar ciertos errores de programacin. Si


se espera que una variable tome valores siempre en un cierto rango, entonces se debe

296

Tipos de datos definidos por el usuario y conjuntos

Programacin en Turbo/Borland Pascal 7

declarar esa variable que adopte el tipo subrango. De este modo, si las variables de tipo
subrango toman un valor fuera del rango especificado, se producir un mensaje de error.
Por ejemplo, si una variable z se espera que slo contenga enteros positivos, las siguientes declaraciones servirn para definir x de modo tal que nmeros negativos producirn mensajes de error.
type
EnterosPositivos = l..maxint;
var
Z : EnterosPositivos;

Otro ejemplo:
type
Rango = 'A'..'H';
var
Letra : Rango;

297

Esta lnea se denomina directiva del compilador. Su valor por defecto (desactivada) es
$R-, que no realiza la verificacin de los ndices del subrango, pero que por el contrario
aumenta la velocidad de ejecucin.
Durante la fase de depuracin y puesta a punto de un programa es aconsejable utilizar la directiva $R+, insertndola al principio del programa.

8.4.

TIPOS DEFINIDOS POR EL USUARIO: ENUMERADOS

Pascal permite otro tipo de dato ordinal denominado tipo enumerado. Estos tipos de datos son definidos por el usuario. Un tipo enumerado se compone de un conjunto de valores referenciados por identificadores. Estos valores constituyen una lista de identificadores de constantes que el programador debe indicar en la parte del programa reservada
a las declaraciones.
Eligiendo adecuadamente nombres significativos para los identificadores se pueden
hacer programas ms fciles de leer.
Ejemplos

Si al ejecutar el programa a la variable letra se le asigna, por alguna causa, el valor 'M',
se producir un mensaje de error.

8.3.3.

type
Vehiculos
Frutas

= (moto, automovil, autobus, tranvia, tren);


= (manzanas, peras, uvas, ciruelas, cerezas,
meln);
Dias
= (lunes, martes, raiercoles, jueves, viernes,
sabado, domingo);
DiasLaborables = lunes..viernes;
Lenguajes
= (BASIC, FORTAN, Pascal, desconocido, C, Ada);

Ambigedad

Las definiciones siguientes son ambiguas:


type
Semana
= (Lun, Mar, Mier, Jue, Vie, Sab, Dom);
Fin_de_Semana= (Sab, Dom);

De igual forma, las variables pueden ser de tipo enumerado. As, por ejemplo, se puede
declarar
var
Clase
Postre
Fecha
Trabajo
Lengua

Un valor, Sab, por ejemplo, no puede pertenecer simultneamente al tipo Semana y al


tipo Fin_de-Semana. Por el contrario, es posible y aconsejable escribir:
type
Semana
= (Lun, Mar, Mier, Jue, Vie, Sab, Dom);
Fin_de_Semana= Sab..Dom

:
:
:
:
:

Vehiculos;
Frutas;
Dias;
DiasLaborables;
Lenguajes;

Formato de un tipo enumerado


El tipo de dato F i n - d e _ S e m a n a es un intervalo de valores comprendidos en un tipo
enumerado.

type

nombre = (constante 1, constante2, ..., constanteN)

8.3.4.

La directiva del compilador R

Turbo Pascal no siempre produce un mensaje de error cuando el valor de un tipo subrango est fuera de su rango definido. Sin embargo, puede tener la posibilidad de visualizar dichos mensajes de error, insertando la siguiente lnea en el archivo que contenga
su programa:
{ $R+}

Ejemplo
type
estaciones = (primavera, verano, otoo, invierno)
var
periodo
: estaciones;

el tipo de datos estaciones se declara con la palabra reservada type.

298

Tipos de datos definidos por el usuario y conjuntos

Programacin en Turbo/Borland Pascal 7

producirn relaciones verdaderas en las siguientes sentencias:

Caractersticas
Un tipo de dato enumerado es un tipo ordinal cuyo orden se indica por la disposicin de los valores en la definicin.

Hoy
Ayer
Hoy

El nmero de orden de cada elemento comienza en 0 para el primer elemento.


type
Arcoiris = (Verde, Amarillo, Rojo, Azul, Verde);
Gastos
= (casa, colegio, comunidad, vestidos, zapatos, agua,
luz, telefono);
Dia
= (lunes, martes, miercoles,
jueves, viernes, sabado,
domingo);
Verde
Amarillo
Miercoles

es el elemento
es el elemento
es el elemento

var Semana
Presupuesto

program Mezcla;
type
Frutas
= (manzana, pera, meln, uva, cereza, sandia);
Dias
= (lunes, martes, miercoles, jueves, viernes, sabado,
domingo);
Lenguajes = (BASIC, COBOL, FORTRAN, ADA, PASCAL);
var
Fruta, Postre : Frutas;
Hoy
: Dias;
Lenguaje
: Lenguajes;
begin

nmero 0.
nmero 1.
tercero (3).

: dia;
: Gastos;

Postre := cereza;
if Hoy = domingo;
then
Write ('Descanso')

Las sentencias siguientes son vlidas:


Semana
:= Miercoles;
while Semana
= Jueves do

Los nicos operadores que pueden acompaar a los tipos ordinales son los operadores de relacin y de asignacin.
< Martes
< Viernes

verdadera
verdadera

La expresin
Colegio < Martes

produce un error de sintaxis, ya que los valores mostrados se asocian con dos tipos
enumerados diferentes.
El operador de asignacin puede definir el valor de una variable cuyo tipo es
un tipo enumerado. La declaracin
var
Hoy, Ayer : Dia;

especifica que Hoy y Ayer son variables del tipo Dia. Por consiguiente, las sentencias
Hoy
:= Jueves;
Ayer := Sabado;

< Ayer
<> Lunes
>= Miercoles

Ejemplo

Las variables de tipo enumerado slo pueden tomar valores de estos tipos. Por
ejemplo, si

Lunes
Jueves

299

end

Dado que estn ordenados los valores de un tipo enumerado, pueden ser comparados
con la ayuda de operadores relacinales. Mediante las sentencias selectivas y repetitivas
es posible dar gran flexibilidad a su lenguaje.
1.

if fruta > peras then


Write ('frutos secos');

2.

if hoy < sabado then


Write ('Dia laborable 1 );

3.

while (lengua = Pascal) or (lengua = Ingles) do

4.

for fruta := peras to sandias do


if postre = fruta then WriteLn ('no son frutos secos');

8,4.1.

Lectura y escritura de tipos enumerados

El programador define los tipos enumerados: por consiguiente sus valores no son conocidos por anticipado. Eso hace que los tipos enumerados estn sometidos a ciertas restricciones:
1. Los procedimientos de entrada/salida no pueden leer o escribir datos de tipo enumerado.
Write ( jueves) ;

producir

un error

Programacin en Turbo/Borland Pascal 7

300

Tipos de datos definidos por el usuario y conjuntos

El error que se visualiza es


Error

Dia := L u n e s ;
w h i l e Dia <= V i e r n e s d o

64 : Cannot Read or W r i t e v a r i a b l e s of t h i s t y p e

begin
c a s e Dia of
Lunes
Martes

2. Un valor no puede figurar en dos listas diferentes, es decir, en dos tipos enumerados diferentes.

Miercoles
Jueves

type
aparatos

(tv, radio, c a s s e t t e , p r o y e c t o r ,

tomavistas);

electronica=

(diodo, c o n d e n s a d o r , t r a n s i s t o r ,
integrada);

resisitencia,

type
DiaSemana =

(Lunes, Hartes, Miercoles,


Sabado, Domingo);

Dia

Jueves, Viernes,

('Viernes')

{while}

Dia

:= L u n e s ;

w h i l e Dia <= D o m i n g o d o
begin
c a s e Dia o f
Lunes
: WriteLn

= Sabado..Domingo;

('Lunes');

: DiaSemana;
Domingo

Para obtener el valor de la variable de salida Da se utiliza la sentencia case.


c a s e Dia
of
Lunes
Martes
Miercoles
Jueves
Viernes
else
end

('Lunes');
('Martes');
('Miercoles')
('Jueves');

Sin embargo, debe tener cuidado con la sentencia while, ya que s se intenta
visualizar todos los das de la semana modificando la sentencia while del modo
siguiente:

Laborables= Lunes..Viernes;
FinSemana
var

Write
Write
Write
Write

Viernes
Write
end;
{case}
Dia := S u c c (Dia)
end;

3. Salida de valores de tipo enumerado.


Si se desea sacar un valor de tipo enumerado, se debe utilizar la sentencia case.

301

: WriteLn

end;
Dia := Succ

('Domingo')

(Dia)

end;
:
:
:
:

Write
Write
Write
Write
: Write

('Lunes');
('Martes');
('Miercoles');
('Jueves');
('Viernes')

W r i t e ('fin de semana')
{ case }

4. Las variables de control de los bucles for pueden ser de tipo ordinal y especficamente de tipo subrango. El siguiente bucle es vlido.
)

for i := 'a' to
W r i t e (i) ;

'z' do

b)

for Dia := Lunes t o V i e r n e s do


W r i t e l n ('dias laborables');

se producir un error en el resultado, ya que cuando el valor de Da es Domingo,


el valor de Succ (Da) no est definido.
6. Los valores de tipos enumerados no pueden leerse o escribirse en archivos de texto,
incluyendo los archivos del sistema estndar input y output. Sin embargo, a veces
es conveniente utilizarlos para mejorar la legibilidad del programa. Por ejemplo,
utilizar Lunes, Martes, Mircoles, ... en lugar de los cdigos 0, 1,2,... para das de
la semana hace el programa mucho ms fcil de leer y comprender. En tales programas puede ser necesario utilizar las sentencias case como las descritas anteriormente para realizar las conversiones necesarias entre los valores de un tipo de datos enumerados y los cdigos numricos que se puedan visualizar.
Aplicaciones

de tipos enumerados

Un uso muy frecuente de los tipos enumerados es en sentencias case para seleccionar
alternativas mltiples.
Ejemplo

La nica precaucin que es preciso considerar se refiere al hecho de que las expresiones que dan los valores inicial y final deben ser del mismo tipo ordinal que
la variable de control del bucle.
5. Una sentencia while puede ser utilizada en lugar de la sentencia for. En este caso
la funcin Succ se utiliza por incrementar el valor de Da.

type
Automovil =

(Ford, Lancia, BMW, Seat, Fiat, A l f a , Opel,


Renault) ;

var
Marca

: Automovil;

a?

Programacin en Turbo/Borand PascaI 7

302

Tipos de datos definidos por el usuario y conjuntos

c a s e M a r c a of
Ford
: Descuento
BMW
: Descuento
Fiat, A l f a : D e s c u e n t o
else
D e s c u e n t o := 0.10

303

es vlida, pero la sentencia

:= 0.20;
:= 0.15;
:= 0.30

Trabajo

:= S a b a d o ;

produce un error de sintaxis, debido a que Sabado no pertenece al tipo trabajo.

end;

Procedimientos

de visualizacin de datos tipo enumerado

Los tipos enumerados pueden ser ndices (subndices) de arrays.


Como ya se ha comentado, no es posible leer o escribir valores de tipo enumerado. Sin
embargo, se pueden escribir procedimientos propios para este fin. Unos ejemplos complementarn y ampliarn este concepto.

Ejemplo
type
Arcoiris =

(Rojo, N a r a n j a , A m a r i l l o , V e r d e ,

Azul, Morado,

Violeta);
var
Color, C o l o r 2
Colorl
Color2

Dadas las declaraciones

: Arcolris;

type

:= A m a r i l l o ;
:= M o r a d o

Arcoiris =(Rojo, Verde, Azul, Marrn,


var

Los colores del arco iris tienen una frecuencia de luz diferente asociada con ellos. Estas
frecuencias se pueden almacenar en un vector (arrays) con ndices de tipo enumerado

Arcoiris.

8.4.2.

LongitudOnda

: array

Frecuencia
Color

: a r r a y [Rojo..Violeta] o f
: Arcoiris;

LongitudOnda
LongitudOnda

[Rojo]
[Naranja]

[Rojo..Violeta] of r e a l ;
real;

:= 6.2E-7;
:= 5.9E-7;

Subrangos de tipos enumerados

Se pueden declarar subrangos de tipos enumerados.


Ejemplos
type
Dia =

(Lunes, M a r t e s , M i e r c o l e s , J u e v e s , V i e r n e s , S a b a d o ,
Domingo);

Laborables = Lunes.-Viernes;
var T r a b a j o : L a b o r a b l e s ;

La sentencia
Trabajo

Ejemplo 8.1

Color

: Arcoiris;

se puede crear un procedimiento Escrib rColor, de modo que cuando se le invoque por
su nombre y con un determinado color como argumento se visualice dicho color. La sentencia
EscribirColor

(argumento)

visualiza el nombre del color que figura en el argumento.


El procedimiento es el siguiente:
p r o c e d u r e E s c r i b i r C o l o r (Valor : A r c o i r i s ) ;
begin
c a s e V a l o r of
Rojo
: WriteLn
'Rojo')
Verde
: WriteLn
'Verde'
1
Azul
: WriteLn
Azul')
Marrn
: WriteLn
'Marrn
Blanco
: WriteLn
'Blanco
Gris
; WriteLn
'Gris')
Negro
: WriteLn
'Negro'
end
end;

Si en el programa principal se invoca a


EscribirColor

:= M i e r c o l e s ;

Blanco, Gris, Negro);

se visualizar 'Verde'

(Verde)

304

Programacin en Turbo/Borland Pascal 7


Tipos de datos definidos por el usuario y conjuntos

305

Ejemplo
p r o c e d u r e I m p r i m i r D i a (Dia : D i a S e m a n a ) ;
{ p r o c e d i m i e n t o para imprimir el n o m b r e de d i a c o r r e s p o n d i e n t e al
valor de Dia de t i p o e n u m e r a d o D i a S e m a n a
begin
c a s e Dia of
Lunes
Martes
Miercoles
Jueves
Viernes
Sabado

:
:
:
:
:
:
:

Write
Write
Write
Write
Write
Write
Write

Domingo
end
end
{ ImprimirDia }

8.5.

( 'Lunes');
( 'Martes') ;
('Mircoles '
('Jueves');
('Viernes');
('Sabado');
('Domingo')

LAS FUNCIONES ORDINALES: Ord, Pred y Succ

En los tipos de datos ordinales cada valor (excepto el primero) tiene un nico predecesor; cada valor (excepto el ltimo) tiene un nico sucesor. Por ejemplo, el sucesor de 7
es 8 y el predecesor 6.
Cada elemento de un tipo ordinal (predefinido, enumerado o subrango de ambos)
tiene un valor entero asociado a l. Basado en esta propiedad, Pascal incorpora tres funciones predefinidas, Ord, Pred y Succ, que se denominan funciones ordinales. La funcin
Chr, aunque tiene una propiedad diferente a las funciones ordinales, suele asociarse su
uso a las mismas.

8.5.1.

Si A y B son elementos del mismo tipo ordinal y A < B, entonces Ord (A) < Ord (B)
es verdadero.
El orden de secuencial de un tipo ordinal est siempre bien definido en la declaracin
de tipos o en el conjunto de datos de tipo predefinido como en el caso de datos integer,
boolean y char.
Ejemplos
1. type
cartas =
Ord

(ases) =0, i

Ord
Ord
Ord
Ord
Ord

(7) . 7
( - 3 ) = -3
( 'A' ) = 65
= 90

8.5.2.

( 'z*)

('9') = 57

{tipo e n t e r o }
{tipo e n t e r o }
{en c o d i g o A S C I I }
{en c o d i g o A S C I I }
{en c o d i g o A S C I I }

Formato
Pred (x)
Succ ( x )

Formato

elemento de un tipo e n u m e r a d o

Tabla 8.1.
Ar^wncnlr.

Como el orden de los valores lgicos es False y True:


Ord ( f a l s e )
(true)
(-5)
(lunes)
(25)

elemento de tipo ordinal

La Tabla 8.1 muestra diferentes ejemplos.

(x)

Ejemplos

Ord
Ord
Ord
Ord

(bastos)=3

La funcin Pred devuelve el predecesor de su argumento y la funcin Succ devuelve el


sucesor de su argumento.

La funcin Ord determina el nmero ordinal, o posicin relativa, de un valor ordinal en


su secuencia de valores en el tipo ordinal.

( c o p a s ) = 2 , Ord

PredySucc

Ord

Ord

(ases, espadas, copas, b a s t o s )

devuelve cero
devuelve uno
devuelve -5
es cero
devuelve 25

Lunes

\)

R e s u l t a d o s d e a p l i c a c i n d e las f u n c i o n e s Ord, Pred y S u c c


1 pos de dutos

Viernes
15
0

DiaSemana
DiaSemana
Integer
Integer

-25
Maxlnt
false

Integer
Integer
Logico

Ord(\)
0
5
15
0
-25
Maxlnt
0

Predx)

Succ{\)

Indefinido
Jueves
14

Martes
Sabado
16

-1
-26

1
-2 4

Maxlnt-1
Indefinido

Indefinido
true

Programacin en Turbo/Borland Pascal 7

306

8.5.3.

Tipos de datos definidos por el usuario y conjuntos

Las funciones ordinales versus funcin chr


y cdigo ASCII
1

En el cdigo ASCII las letras maysculas ( A' a 'Z') son caracteres consecutivos con cdigos de 65 a 90. Las letras minsculas van del cdigo 97 al 122 y los dgitos del cdigo
48 al 49.
Cdigo ASCII

Carcter

Cdigo ASCII

Carcter

Cdigo ASCII

48

65

49

66

98

50

67

99

307

Ejemplos
1.

Ord ( ' 5 ' ) - Ord ( ' 0 1 ) = 5

2.

Ord ( ' C') - Ord ( ' A 1 ) = 2

es verdadera

Ord ( ' b 1 ) - Ord ( 1 B ' ) = 32

es verdadera

es verdadera

Ejemplo 8 . 2
Escribir una funcin para convertir el carcter de un dgito a su correspondiente entero.

97

function Convertir (Ch : char) : integer;


begin
{Convertir}
Convertir := Ord (Ch) - Ord ('0')
end
{Convertir}

Problema 8.1
90

57

122

Los nmeros de la primera columna (cdigo ASCII) son los valores de Ord cuyo argumento es la segunda columna (carcter). De modo similar, las entradas de la segunda
columna corresponden a los valores de la funcin Chr cuyo argumento es la primera columna. Es decir, las funciones Chr y Ord son funciones inversas.

Se leen del perifrico de entrada tres caracteres dgitos (0 a 9) y se desea convertir dichos caracteres en una variable de tipo entero. Ejemplo: lectura 3, 5, 7; salida 357 de
tipo entero.
Anlisis
Chl, Ch2, Ch3
Numero

variables de tipo char (los tres dgitos de entrada)


variable de tipo integer

Algoritmo
chr (ord (Carcter)) - Carcter
Ord (Chr (S umem)) = Nmero

{ carcter de tipo char}


{ numeio de upo ordinal}

1.
2.
3.
4.
5.
6.
7.

Ejemplos
Chr (Ord ( ' a ' ) )
Ord (Chr ( 5 7 ) )

devuelve
a
devuelve el nmero

57, orden del dgito :

De igual modo, observando las distancias existentes en el cdigo ASCII, entre letras
maysculas, minsculas y dgitos, se cumple la siguiente regla:
l. Si Dgito es un entero de 0 a 9 y Ch es un carcter de tipo char, entonces:

D g i t o : = 0 r d ( ' Ch1) - O r d ( ' 0 ' )

Numero0
{ i n i c i a l i z a r Numero }
A p l i c a r la f u n c i n C o n v e r t i r del ejemplo para cambiar
el c a r a c t e r a un d g i t o ( s a l i d a D i g i t o l )
Numero
Numero * 10 + D i g i t o l
Aplicar la funcin Convertir y obtener Digito2
Numero-* Numero * 10 + Di gi to2
Aplicar la funcin Convertir y obtener Digito3
Numero * Numero * 10 + Di gi t o 3

En el caso de que Chl = '4', Ch2 = '5' y Ch3 = '6', Numero toma el valor:
Paso
Paso
Paso
Paso

1.
3.
5.
7.

Numero
Numero
Numero
Numero

= 0
= 0 * 10 + 4 = 4
= 4 * 10 + 5 = 45
= 45 * 10 + 6 = 456

Se puede utilizar otra funcin TresDigitos que invoque a la funcin Convertir.


function TresDigitos (Chl, Ch2, Ch3,
var
Numero : integer;

: char) : integer;

308

Programacin en Turbo/Borland Pascal 7


begin
Numero := 0
Numero := Numero * 10 + Convertir (Chl);
Numero := Numero * 10 + Convertir (Ch2);
Numero := Numero * 10 + Convertir (Ch3);
TresDigitos := Numero
end

Tipos de datos definidos por el usuario y conjuntos

309

Los operandos que son de tipo compatibles pueden ser manipulados por los mismos
operadores.
OtroCaracter o
OtroCaracter o

' 3 ' expresin vlida


3
expresin incorrecta (3 no es de tipo char)

Problema 8 . 2

Una expresin se considera compatible para asignacin con una variable si sus tipos
son compatibles. En el caso de la variable tipo subrango, el valor de la expresin debe
estar dentro del rango permitido.

Disear una funcin que convierta letras minsculas a maysculas.

Ejemplo

function Maysculas (Ch : char) : char;


var
Distancia : integer ;
{numero de letras de 'a a Ch}
begin
Distancia
:= Ord (Ch) - Ord ('a');
Maysculas := Chr (Ord ('A') + Distancia)
end

type
Letra = 1 A'.. 'Z';
var
Car : Letra;
Ch
: char;
Car := '3'

Nota

Car := Ch

Recuente que en '1 uibo Pascal existe una funcin predefinida Upcase que sirve para cambial letras minusaiiai a maysculas.

Upcase ( ' a ' )


Upcase ( 1 N*)

8.6.

{produce un error de sintaxis, 3 no pertenece al


rango 'A'.. 1 Z ' }
{puede producir un error en tiempo de ejecucin si
el caracter almacenado en Ch no es una letra
mayuscula}

devuelve
devuelve

'A'
'N'

COMPATIBILIDAD DE TIPOS
Y COMPATIBILIDAD DE ASIGNACIN

Dos tipos de datos se consideran compatibles si: 1. Son del mismo tipo. 2. U n o es
subrango del otro. 3. Ambos son subrango del mismo tipo patrn o raz.

Slo hay una excepcin a la regla: una expresin de tipo integer se puede asignar a una
variable de tipo real.

8.7.

CONJUNTOS

Otro tipo de datos estructurado de Pascal es el conjunto (set). Una variable de este tipo
se llama una variable conjunto.
En Matemticas un conjunto se representa por una lista de elementos encerrados entre llaves. En Pascal el conjunto de elementos se representan entre corchetes y separados
por comas
Elementos

Ejemplo
type
Caracteres = char;
Letras
= 'A 1 ..'Z ' ;
var
OtroCaracter : Caracteres;

Los tipos Caracteres

y Char son compatibles.

Notacin.Matemtica

1,3,5,9
a,b,c,d

{1,3,5,9}
{a,b,c,d}

Pascal
[1,3,5,9]
[1 a ' , ' b 1 , 1 c 1 , ' d 1 ]

En Pascal los elementos de un conjunto deben ser siempre del mismo tipo ordinal;
en consecuencia nunca pueden ser reales.
Aunque se puede utilizar notacin de tipo subrango para especificar secuencias de
valores que pertenezcan a un conjunto, los elementos del conjunto no tienen una ordenacin interna particular. La nica relacin entre los miembros de un conjunto es: existe
o no existe en el conjunto.
[ 3 , 3 ] y [3]

son equivalentes

(contienen

un solo elemento)

310

Tipos de datos definidos por el usuario y conjuntos

Programacin en Turbo/Borland Pascal 7

Ejemplos de conjuntos

vlidos

[1,4,7]
[1 . . 3, 9 . . 12]
[]
[i+1 . . j1,4,15]
[' A1, B,' D1 .. ' G' ]

conjunto de tres enteros


conjunto de siete enteros, equivalentes a [1,2,3,9,10,11.12]
conjunto vaco (ningn elemento)
suponiendo i = 4 y j = 9, el conjunto equivale a [5,6,7,4,15]
conjunto de siete elementos ['A','B','D','E','F','G'J

Una variable de tipo conjunto debe ser inicializada siempre antes de poder ser utilizada
con cualquiera de los operadores de conjuntos que se vern posteriormente. Una variable de tipo conjunto se suele inicializar al conjunto vaco o al conjunto universal, que es
el conjunto que consta de todos los valores del tipo base. Conjunto universal de Marca
es [Seat.. Mercedes].
Ejemplos

Un conjunto especial, denominado conjunto vaco, es aquel que no contiene ningn elemento. Pasa a no contener ningn valor; el conjunto vaco es un conjunto real y juega
un papel importante en el tratamiento de conjuntos.

8.7.1.

311

type
Digitos
= 0..9;
ConjuntoDigitos = set of Digitos;
var
Primos : ConjuntoDigitos;
I
: Digitos;

Declaraciones de tipos de datos conjuntos

Adems de las constantes tipo conjunto es posible declarar o definir variables tipo conjunto.

Primos

:= [2, 3, 7, 9]; {2,3,7 y 9 se almacenan en


primos}
NumerosPositivos:= [1..9];
{equivale a [1,2,3,4,5,6,7,8,9]}
{i de tipo digitos}
I
:= 5;
{equivale a }
Conjunto := [I, I + 4..I + 7];
Conjuntol := [5,9 .. 12]}

Formato
type

nombre = set of tipo base


nombre
tipo base

identificador del c o n j u n t o
tipo de d a t o s de los elementos del c o n j u n t o

Ejemplos
type
Automviles = (Seat, Ford, Alfa, BMW, Peugeot, Citroen, VW, Rover,
Opel, Mercedes)
Marca
= set of Automviles;
var
Avis, Hertz, RentaCar : Marca

8.7.2.

Asignacin en conjuntos

8.7.3.

La relacin i n

Una cuestin importante en los conjuntos es conocer si un elemento dado pertenece a


un conjunto dado. Esta prueba se realiza en Pascal con el operador relacional i n y una
expresin relacional.
Formato
elemento in [lista de elementos}

El resultado de evaluar la expresin relacional puede ser true ofalse. El tipo de datos de
elemento y la lista de elementos deben ser compatibles.

Los elementos se ponen en los conjuntos utilizando una sentencia de asignacin.


Avis
:= [Seat, Alfa, VW] ;
Hertz
:= [Opel, Mercedes]
RentaCar := [BMV, Peugeot..Opel];

Si dos tipos de conjuntos son compatibles (tienen los tipos base compatibles: igual tipo
de dato, o uno subrango de otro, o ambos del mismo tipo patrn), sus variables representativas se pueden utilizar en sentencias de asignacin.
Hertz
:= Avis
RentaCar := [ ]

{asignacin del conjunto vacio}

Ejemplo 8 . 3
Se dispone de la declaracin
type
Letras = set of 'A'..'Z';
var
Maysculas : Letras;
Maysculas := ['A',

'E', 'I',

'O',

'U']

312

Cules son los resultados de evaluar las expresiones siguientes?


1.
2.
3.
4.

Tipos de datos definidos por el usuario y conjuntos

Programacin en Turbo/Borland Pascal 7

A' in Maysculas.
'Y' in Maysculas.
Ch es una variable de tipo subrango A'. . 'Z' y su valor es 'O': Ch in Maysculas.
in Maysculas.

8.8.

OPERACIONES CON CONJUNTOS

Una vez creados los conjuntos y las variables tipo conjunto es posible realizar tres operaciones binarias sobre ellos: unin, interseccin y diferencia. La Tabla 8.2 resume el funcionamiento de las operaciones con conjuntos A y B, junto con el conjunto resultante.

Resultados
1.
2.
3.
4.

true (verdadero), ya que 'A' es un elemento del conjunto.


false (falso), ya que 'Y' no pertenece al conjunto.
true (verdadero), Ch pertenece al conjunto.
No tiene sentido, se producir un error, 3 no es una constante del tipo de datos
del conjunto.

Tabla 8 . 2 .

Operacin
Unin

Operaciones sobre dos conjuntos A y B

Notacin
algebraica

Notacin
Pascal

A + B es el c o n j u n t o q u e contiene todos los elementos que estn en A, en B


o en a m b o s .

A * B es el c o n j u n t o cuyos elementos
pertenecen a A y B simultneamente.

Ejemplo 8 . 4
Utilizar el operador in para verificar si determinados smbolos son vlidos (por ejemplo,
verificar los smbolos +,
*, / ) .

Interseccin
Diferencia

El mtodo clsico conocido hasta ahora puede ser


if (Simbolo = '+') or (Simbolo = '-')or
(Simbolo = '*') or (Simbolo = '/')
then WriteLn ('el Simbolo es valido 1 )
else WriteLn ('el Simbolo no es valido')

Con un operador in se simplifica la escritura del cdigo.


if Simbolo in' [ ' + ' ,
'/']
then WriteLn ('el Simbolo es valido')
else WriteLn ('el Simbolo no es valido');

Ejemplo 8 . 5
Otro uso del operador in es visualizar los elementos de una variable conjunto. Supongamos,
type
LetrasMayusculas = 'A' .. 'Z';
var
Letras : set of LetrasMayusculas;
Car
: char;

Si en la variable Letras se han almacenado datos y se desea visualizar los elementos


del conjunto, se puede utilizar un bucle y el operador in para determinar si pertenecen
o no cada una de las letras maysculas al conjunto. Aquellas que pertenecen se visuali-

Conjunto resultante

A - B es el c o n j u n t o cuyos elementos
son de A pero n o de B.

Ejemplo
Operacin

Resultado

1,3,4] + [1,2,4]
'A'j'C'J'F'] + ['B','C','D1,'F']
'1,3,4] * [1,2,4]
1,3] * [2,4]
'AVBVCVF'] * ['A'.'CVDVF']
1,3,4] - [1,2,4]
1,3] - [2,4]
'AVCVF'] - ['BVCVDVF']
1,2,3] + [4,5,6]
;i , 2 , 3 ] + []
;i,2,3,4] * [2,4,6]
1,2,3] * [4,5,6]
1,2,3] - [1,2,3,4]
1 , 2 , 3 ] - []

[1,2,3,4]
['A','B','C','0",'F' ]
[1,4]
[]
[ ' A ' , ' C ' , ' F' ]
[3]
[1,3]
['A']
[1,2,3,4,5,6]
[1,2,3]
[2,4]
[]
[]
[1,2,3]

Reglas de prioridad
Cuando una expresin de conjuntos contiene dos o ms operadores de conjunto, stos
se evalan de acuerdo a la siguiente prioridad:

z a n c o n u n a s e n t e n c i a Write.
WriteLn ('Los elementos del conjunto Letras son=');
for Car := 'A' to ' Z ' do
if Car in Letras then
Write (Car : 2)

313

prioridad ms alta

+, -

prioridad ms baja

y en caso de operaciones con igual prioridad se evalan de izquierda a derecha.

Programacin en Turbo/Borland Pascal 7

Tipos de datos definidos por el usuario y conjuntos

315

Ejemplos

Ejemplos

Comparacin

l. [2,3,5] + [2,4,7] * [ 2 , 4 , 6 , 8 ]
(*)

[1,3] =
[]
=
[] < V
It

[2,4]
(+)

[]
[1,2,3]
[1,2,3]
f'A?B']
['A','B']

[2,3,4,5]
2. [ 1 , 2 , 3 , 4 ] - [ 1 , 3 ] + [ 1 , 2 , 5 ]

Resultado

[1,3]
[1]
[1,3]

>=
< >
=
<>

true
false
true
false
false
true
true
false
true

K>
UJ
V

314

[1,3]
[1,2,4]
[3,1,2]
['A']
['B']

[2,4]

Reglas de prioridad

[1,2,4,5]

Si se desea modificar el orden normal de evaluacin, se pueden poner parntesis.


3.

Si en una expresin lgica se utilizan operadores diferentes con cooperaciones de conjuntos y otros tipos de datos, su evaluacin debe seguir unos niveles de prioridad.

([2,3,5] + [2,4,7]) * [2,4,6,8]

Tabla 8 . 4 .

[2,3,4,5,7]

Operador

Comparacin de conjuntos (operadores de relacin)

Los conjuntos se pueden comparar entre s mediante el uso de los operadores relacinales ( = , < > , < = , > = ) Los operandos deben ser del mismo tipo base. El resultado
de la comparacin es un valor lgico: true o false.
Tabla 8 . 3 .

Operador
< =

Operadores de relacin de conjuntos A y B

Nombre del
operador
Subconjunto

Igualdad

Resultado
El valor de A < = B es true. Si cada e l e m e n t o
de A es t a m b i n de B. E n caso c o n t r a r i o
A < = B es false.
El valor de A = B es true si cada elemento de
A est en B y cada elemento de B est en A.
En caso c o n t r a r i o A = B es falso, A = B
equivale a (A < = B) and (B = A).

< >

Desigualdad

El valor de A < > B es true si el valor de


A = B es false y viceversa.

> =

Superconjunto

A < > B equivale a not (A = B), A < = B es


true si B < = A es true.

Prioridad

not
*, / , d i v , mod, and
+, -f or
=/ < > , </ > =, >/

[2,4]

8.8.1.

Prioridad de o p e r a d o r e s

> =, in

1 (ms alta)
2
3
4 (ms baja)

Ejemplos
Par = [ 0 , 2 , 4 , 6 , 8 ]
Bit = [ 0 , 1 ]
(0 in Par) and (0 i n B i t )

Simplificacin

de expresiones

produce

un valor true

lgicas

1. Las relaciones de conjuntos y operaciones se pueden utilizar para evitar expresiones lgicas complejas.
(ch = ' A ' ) o r (ch = ' L ' ) or (ch = 'M 1 ) o r (ch = 'N 1 )

se puede expresar de modo ms compacto como


ch i n [ ' A ' , ' L 1

..

'N 1 ]

2. La expresin lgica
((ch >= ' a ' )

and (ch <= ' z ' ) ) o r ((ch >= ' A ' ) and (ch <= ' z ' ) )

trata de determinar si ch es minscula o mayscula; se puede expresar ms fcilmente por


ch in [ ' a 1

..

'z',

'A'

..

Z1]

Tipos de datos definidos por el usuario y conjuntos

Programacin en Turbo/Borland Pascal 7

316

o bien
ch in Minsculas + Maysculas

Por ltimo se debe inicializar el valor de la variable CodPostal; en este caso al conjunto vaco que no contiene elementos. Un segmento de programa que lee tres provincias en el conjunto CodPostal es

donde Minsculas es el conjunto [ ' a 1 . . ' z 1 ]


Maysculas es el conjunto [ ' A ' . . ' Z ' j

CodPostal := [];
for elemento := 1 to 3 do
begin
Read (Numero);
CodPostal := CodPostal + [Numero]
end

Ejemplo 8 . 6
Una situacin en la que las expresiones lgicas son tiles es en la verificacin del valor
de un selector de una sentencia case (sin clusula else) a fin de asegurar que est en el
rango correcto de valores.
case Num of
5, 10, 15 : Writeln ('Mltiplo de 5');
7, 14, 21 : WriteLn ('Mltiplo de 7');
11
: WriteLn ('Mltiplo de 11')
end;

Si el valor de Num no es uno de los enteros listados, se produce un error. La siguiente


sentencia evita el error.
if Num
case
5,
7,
11
end;

8.8.2.

in [5, 7, 10, 11, 14, 15, 21] then


Num of
10, 15 : Writeln ('Mltiplo de 5');
14, 21 : WriteLn ('Mltiplo de 7 1 );
: WriteLn ('Mltiplo de 11')

Lectura de conjuntos

Algunas operaciones no se pueden ejecutar sobre variables de conjunto. Por ejemplo, no


se pueden leer tres cdigos postales y almacenarlos en un conjunto CodPostal con la siguiente sentencia
Read (CodPostal)

Una razn es que la computadora no puede conocer cuntos elementos existen en el


conjunto.
Si se necesita leer y almacenar datos en un conjunto, un mtodo es utilizar un bucle:
for elemento := 1 to 3 do
begin
{leer un dato}
{almacenar el valor en el siguiente elemento del conjunto}
end

La forma de aadir un nuevo elemento al conjunto es sumar con el operador + el


n u e v o elemento al conjunto CodPostal y almacenar el resultado de nuevo en la variable
CodPostal.
CodPostal := CodPostal + [Numero]

317

Reglas

.a construccin (almacenamiento de datos) en un conjunto se hace con los siguientes pasos:


1. Iniciali/ar S al conjunto vado.

2. I eer cada elemento A del conjunto > aadirlo al conjunto S con la operacion unin (+)

Ejemplo 8 . 7
Leer (almacenar) el conjunto de nmeros primos menores de 30.
program Primos;
type
Elemento
= 1..30;
NumeroConjunto = Set of Elemento;
var
ConjuntoPrimos, Conjunto_Aux : NumeroConjunto;
Primo : integer;
begin
ConjuntoPrimos := [];
Write
('introduzca nmeros primos entre 1 y 30');
WriteLn (' para terminar introduzca 0 ');
Read (Primo);
while Primo o 0 do
{ 0 , marca bandera final de archivo }
begin
ConjuntoPrimos := ConjuntoPrimos + [Primo];
Read (Primo)
end;
{ listado de los elementos del conjunto } apartado 10.8.3
Write ('Los nmeros que forman el conjunto son ');
for Primo := 1 to 30 do
if Primo in ConjuntoPrimos
then
Write (Primo,' ')
end.

318

Tipos de datos definidos por el usuario y conjuntos

Programacin en Turbo/Borland Pascal 7

Ejemplo

Si los datos introducidos son

procedure LeerConjunto (var S : TipoConjunto);


{procedimiento de lectura de los elementos de un conjunto S
de tipo TipoConjunto; el tipo base de los elementos de S es
TipoElemento que es tipo char o un subrango de tipo entero o
caracter}
var
X : TipoElemento;
begin
S := [];
while not eof do
begin
Read (X);
S := S + [X]
end
{while}
end;
{LeerConjunto}

2, 3, 5, 7, 11, 13, 17, 19, 23, 29

el conjunto ConjuntoPrimos toma el valor


[2,3,5,7,11,13,17,19,23,29]

8.8.3.

319

Escritura de conjuntos

Otra dificultad al procesar conjuntos es que no se pueden visualizar sus valores con una
sentencia write. Esta dificultad se soluciona utilizando el operador in.
P a r a v i s u a l i z a r los e l e m e n t o s d e u n c o n j u n t o S se d e b e u t i l i z a r el s i g u i e n t e a l g o r i t m o :
1. C o p i a r los e l e m e n t o s d e S e n u n c o n j u n t o a u x i l i a r Aux q u e t e n g a u n t i p o b a s e c o m p a t i b l e c o n el d e S.

2. Declarar x una variable del tipo base de Aux e inicializar x al primer elemento de
este tipo base.
3. Mientras x es diferente del ltimo elemento de este tipo base y Aux no est vaca,
hacer:
i. Si x pertenece a Aux, entonces visualizar x y eliminarlo de Aux.
ii. Sustituir x con su sucesor.

Problema 8 . 3
Desarrollar un algoritmo que encuentre todos los nmeros primos menores o igual a un
nmero dado n, mediante el procedimiento de la Criba de Eratstenes.
Algoritmo

Ejemplo 8 . 8
Visualizar los elementos del conjunto ConjuntoPrimos

El mtodo consiste en escribir los nmeros de 2 a n.


del ejemplo anterior.

El siguiente segmento de programa utiliza el algoritmo anterior.


Conjunto_Aux := ConjuntoPrimos;
Primo
:= 1;
while (Primo < > 30) and (Conjunto_Aux < >
[ ] ) do
begin
if Primo in Conjunto_Aux then
begin
Write (Primo : 3);
Conjunto_Aux := Conjunto_Aux - [Primo]
end;
Primo := Succ(Primo)
end;
WriteLn

2
10
18
26

3
11
19
27

3
12
20

5
13
21

7
15
23

6
14
22

8
16
24

9
17
25
n

Tachar todos los mltiplos de 2 (se eliminan 2, 4, 6, 8,... no primos), comenzando en


2; a continuacin todos los mltiplos de 3 (se eliminan los nmeros 3, 6, 9, 12,... no
primos), despus los mltiplos de 5 (es decir, se comienza por el primer nmero ms
bajo sin tachar) y as sucesivamente hasta que se encuentre el primer nmero de la lista
que no haya sido tachado y cuyo cuadrado sea mayor que n. En este momento todos los
nmeros que queden en la lista sin tachar son primos.
El siguiente diagrama muestra el proceso para nmeros de 2 a 26
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

Tras borrar los mltiplos de 2 y 3 el conjunto queda as:

8.8.4.

Los conjuntos como parmetros

Los conjuntos se pueden utilizar como parmetros de funciones y procedimientos. El


tipo de una funcin debe ser un tipo de dato simple y no puede ser estructurado, es decir,
no puede ser un conjunto.

11

13

17

19

23

25

Se borran los mltiplos de 5, excepto el 5, y quedar:


2

11

13

17

19

23

Tipos de datos definidos por el usuario y conjuntos


320

321

Programacin en Turbo/Borland Pascal 7


procedure VisualizarPrimos

11

(var C

{ los N m e r o s que p e r m a n e c e n en
var

Ahora los mltiplos de 7


13

17

19

Numero
begin

23

son p r i m o s

: integer);
}

: integer; { v e r i f i c a la p e r t e n e n c i a del N u m e r o a la c r i b a }

W r i t e L n ('los p r i m o s <
N u m e r o := 2;

Como 7 2 > 26 (n), el proceso se termina.


En el conjunto Criba se almacenarn los nmeros iniciales (1, 3, 4, ..., r).

: ListaNumeros; J

la c r i b a

while C o
begin

',J:1,

' son:

');

[ ] do

w h i l e not (Numero in C) do
N u m e r o := N u m e r o + 1;
C := C - [Numero];
W r i t e L n (Numero)
end

program C r i b a D e E r a t o s t e n e s ;
{programa para e n c o n t r a r todos los nmeros p r i m o s en el rango
de 2 a n, u t i l i z a n d o el m t o d o de la c r i b a de E r a t o s t e n e s }
end;

{ visualizar primos

const
{ programa principal

N u m e r o M a y o r = 100;

WriteLn

L i s t a N u m e r o s = set of 1 . . N u m e r o M a y o r ;
var
Criba : L i s t a N u m e r o s ;
{conjunto d e n m e r o s }
n
: integer;
{2,3,4,
, n nmeros}
p r o c e d u r e R e l l e n a r L a C r i b a (var C r i b a : L i s t a N u m e r o s ;
{inicializar el c o n j u n t o C r i b a a 2 , 3 , 4 , . . . , n }
var
Numero
begin
Criba

: integer;
:=

:integer)

(Criba,N);
(Criba,N);
(Criba,N)

Introduzca l i m i t e superior N
26
los p r i m o s < 26 son:
2
3
5
7
11
13

{numero a a d i d o al conjunto}

[];

p r o c e d u r e E r a t o s t e n e s (var C r i b a : L i s t a N u m e r o s ; n : integer)
{aplicar el m t o d o de E r a t o s t e n e s p a r a e l i m i n a r t o d o s los
n m e r o s no p r i m o s de la C r i b a }

17
19
23

Problema 8 . 4
k : integer;

{primos c u y o s m l t i p l o s se e l i m i n a n por
el p r o d u c t o p r i m o * k}

Disear un procedimiento que devuelva un conjunto de nmeros impares (Impares) y un


conjunto de nmeros pares (Pares) en el rango de 0 a Limite.

:= 2;

w h i l e sqr

(Primo) <= n d o

begin
for k := 2 to n div Primo do
Criba := Criba - [Primo * k] ;
repeat
Primo

:= Primo + 1

u n t i l Primo
end
end

N');

Ejecucin

end;

begin
Primo

('Introduzca l i m i t e s u p e r i o r

ReadLn
(N);
RellenarLaCriba
Eratostenes
VisualizarPrimos
end.

for N u m e r o := 2 t o n d o
C r i b a := C r i b a + [Numero]

var
Primo,

begin

type

in C r i b a

Anlisis
L i m i t e = 100

const
L i m i t e = 100

Conjuntos P a r e s , Impares
(parmetros v a r i a b l e s )

type
Lista = set of 0 . . L i m i t e ;
var

L i s t a 1,2,3,... ,100

Pares,

Impares

322

Tipos de datos definidos por el usuario y conjuntos

Programacin en Turbo/Borland Pascal 7

Pares, Impares sern parmetros por variable que contendrn los nmeros pares e impares que se devolvern al programa principal.
procedure ConstruirConjuntos
var

(var Impares, Pares

while CarSiguiente o

Read
end

i : integer;
begin

end;

w h i l e i <= Limite do
begin
Impares
I

:= Impares +
:= I + 2

procedure V i s u a l i z a r
var

[I];

LetraSiguiente
Letra
begin

(Letras

: ConjuntoLetras);

: 'A'..'Z';
: char;

for Letra := 'A' t o 'Z' do


if Letra in L e t r a s
then

[0..Limite] - Impares

end;

Write
WriteLn
end;

La llamada desde el programa principal ser


ConstruirConjuntos

{LeerLetras}

Visualizar las letras maysculas contenidas en el conjunto (parmetro) Letras.

{el c o n j u n t o Pares sern todos los n m e r o s de 1 a Limite


que no esten en Impares}
:=

(CarSiguiente)

Problema 8 . 6

end;

Pares

C e n t i n e l a do

begin
if C a r S i g u i e n t e in ['A'..'Z'] then
L e t r a s := L e t r a s + [CarSiguiente];

: Lista);

Impares := []
{inicializa I m p a r e s a conjunto vacio}
(construir un conjunto de impares}
i := 1;

323

(Letra);

(alfa, b e t a )

siendo al fa y beta los conjuntos que almacenarn a su vez a los conjuntos Impares y Pares.

8.9.

RECAPITULACION SOBRE CONJUNTOS:


CONCEPTOS Y OPERACIONES

Definicin de un tipo conjunto y registro

Problema 8 . 5
Leer una secuencia de letras maysculas terminadas en un * e insertarlas en un conjunto
Letras.
En el programa principal se declaran
type
ConjuntoLetras = set of
var
LetrasMayusculas

A'..'Z';

Se define formalmente un conjunto como una coleccin ordenada de datos simples, todos del mismo tipo.
Un tipo de datos estructurado compuesto de una coleccin de elementos distintos
escogidos entre los valores del tipo base. El tipo base es el tipo de los objetos que pertenecen al conjunto y puede ser cualquier ordinal, pero no un tipo estructurado.
Diagrama de sintaxis

: ConjuntoLetras;

El procedimiento le llamaremos LeerLetras.


procedure LeerLetras
const

(var L e t r a s

Centinela =
var
CarSiguiente
begin

{salida}

{caracter de
: char;

: ConjuntoLetras);

fin de entrada de datos}

{siguiente c a r a c t e r de e n t r a d a }

Letras := [];
{inicializar L e t r a s }
Write ('Introduzca letras m a y s c u l a s ' ) ;
WriteLn ('Final con', C e n t i n e l a ) ;
Read

(CarSiguiente);

{lectura primer c a r a c t e r }

Declaracin
1. Asociamos un tipo ordinal, normalizado o de usuario, con un identificador utilizando para ello una definicin type. Este tipo de dato se conoce como tipo base.
type
Letras = ' A 1 . . ' Z';

2. El tipo conjunto que queremos definir se introduce entonces en trminos del tipo
base.
C o n j u n t o L e t r a s = s e t of L e t r a s ;

324

Tipos de datos definidos por el usuario y conjuntos

Programacin en Turbo/Borland Pascal 7

3. Una vez que un tipo conjunto ha sido definido, podemos definir una variable
conjunto.
: ConjuntoLetras

Operaciones con conjuntos


1. La inicializacin de una variable conjunto se referencia como conjunto vaco.
a := [ ];

2. Entrada/Salida. No pueden leerse ni escribirse variables de tipo conjunto.


3. Unin. La unin de dos conjuntos es un conjunto compuesto de los elementos de
ambos conjuntos. La operacin se denota con el signo '+'.
['a',

' b1 ] + [ ' c 1 ,

'd',

'e']*-['a',

b1,

'c1,

d',

* e1 ]

4. Interseccin. La interseccin de dos conjuntos es el conjunto formado por los elementos comunes a ambos conjuntos. El operador de interseccin es
['a',

'b\

'd',

'f'] - ['b\

'g',

' k ' ] -* [ ' a ' ,

7. Operadores relacinales. Se aplican todos los operadores relacinales, teniendo un


sentido especial cuando se aplican a variables de tipo conjunto.
=
igualdad de conjuntos
< > desigualdad de conjuntos
< = inclusin (contenido en)
> = inclusin (contiene)

var
Vocales, Consonantes

'd\

'f1 ]

Representacin interna
Un conjunto se representa adecuadamente en la memoria de la computadora mediante
un array de valores lgicos, cuyos componentes especifican la presencia o ausencia del
valor en el conjunto. El tamao del array est determinado por el cardinal del tipo del
conjunto.
En la memoria de la computadora, la secuencia de valores lgicos se representa por
una secuencia bits. Por ejemplo, el conjunto de dgitos
[ 1 , 4 , 8 , 9]

se representa por la secuencia de valores lgicos


[0100100011]

5. Asignacin. Como es norma, la sentencia de asignacin se aplica a conjuntos del


mismo tipo base.
Asignacin interna. La asignacin de valores a una variable de tipo conjunto se
efecta enumerando entre corchetes los elementos o constantes del tipo conjunto
que se desea asignar a esa variable.
Se puede usar tambin la abreviatura '. .' para especificar valores correspondientes a un tipo subrango.
nmeros := [ 1 , 2 , 3 , 8 , 1 0 ]
alfanumericos
[ ' T ' , 'M 1 , ' 1 ' ,
nmeros : = [1 . . 5, 6, 7, 9 ] ;

S'];

Asignacin extema. Ante la imposibilidad de una lectura externa, se solventa la


cuestin con la lectura de valores con variables simples del mismo tipo que el tipo
base del conjunto y establecemos una unin con los elementos del conjunto
previo.

Problema 8 . 7
Leer un texto y contar el nmero de vocales que existen en el mismo.
program Conjuntos
type
Conjunto

(input, output, t e x t o ) ;

= set of Char;

Contadores = record
A, E, I, O, U

s i e n d o b u n a v a r i a b l e d e t i p o base

6. Pertenencia. El operador especial in (en) facilita la funcin de pertenencia de un


elemento a un conjunto. Esta funcin verifica si un valor pertenece a un conjunto. Este operador da como resultado verdadero o falso.
if C in
else

f'0'..'9'] then

<sentencia>
<sentencia>

: integer

end ;
var
Vocales

: Conjunto;

Texto
: Text;
C o n t _ V o c a l : Contadores;
p r o c e d u r e iniciar_contadores

a
[ ];
Read ( b ) ;
a := a + [b]

325

begin
With Cont
begin
=
A
=
E
=
I
O
u
end
end;

Vocal do
0
0
0

= 0
= 0

(var c o n t _ v o c a l

: Contadores);

326

Programacin en Turbo/Borland Pascal 7


p r o c e d u r e Leer Conta

Tipos de datos definidos por el usuario y conjuntos

(var Texto:Text;var C o n t _ V o c a l : C o n t a d o r e s ) ;

8.10.1.

327

Aadir elementos a un conjunto

var
Car : Char;
begin
Assign

El procedimiento Include incluye (aade) un elemento a un conjunto. Su sintaxis es:

(texto,

'prueba DAT');

Reset (Texto);
V o c a l e s := ['A',
W h i l e not eof

'E',

'a',

procedure Include

'e',

'I',

'i',

'O',

'o',

'U',

'u'];

(Texto) do

begin
Read (Texto, Car);
if car in vocales
then
with cont_vocal do

c es una variable de tipo conjunto e I una expresin de un tipo compatible con el tipo
base de c. El elemento representado por I se incluye en el conjunto dado por c. As:
Include

a'

'E',

'e'

'I',
'O',

'i'
'o'

'U',
end

'u'

A := succ
E := succ
I

(c,I)

equivale a

c a s e car of
' A' ,

(var c : set of T; I : T)

(A)
(E)

: = succ

C+[I]

Sin embargo, el uso de Include genera un cdigo ms eficiente que la operacin de unin
de conjuntos, expresada por el operador +.

(I)

O := succ
U := succ

:=

(O)
(U)

8.10.2.

end

Quitar elementos de un conjunto

end;
p r o c e d u r e Resultado
begin

El procedimiento Exelude elimina (quita) un elemento de un conjunto. Su sintaxis es:

(Cont_Vocal : Contadores);

procedure Exclude(var c : set of T; I : T);

WriteLn;
w i t h C o n t _ V o c a l do
begin
WriteLn
WriteLn
WriteLn
WriteLn
WriteLn
end

La construccin
( '
( '
( '
( '
( '

En
En
En
En
En

el
el
el
el
el

texto
texto
texto
texto
texto

hay
hay
hay
hay
hay

,
'/
',
',
',

A
E
I
o
u

3,
3,
3,
3,
3,

'A
'E
' I
'O
'U

s' )
s' )
s' )
S' )
s' )

begin
{Conjuntos}
iniciar__contadores (Cont_Vocal);
L e e r _ C o n t a (Texto, C o n t _ V o c a l ) ;
R e s u l t a d o (Cont_Vocal)

8.10.

equivale a
c

end;

end.

Exclude(c,I)

{Conjuntos}

PROCEDIMIENTOS ESPECIALES DE CONJUNTOS

La versin de Turbo Pascal 7.0 incluye dos nuevos procedimientos para tratar con conjuntos: Include y Exelude, que permiten aadir y eliminar elementos de un conjunto. Asimismo, las versiones 6.0 y 7.0 incluyen otra caracterstica notable constantes de conjuntos y constantes annimos.

:= c -

[I]

y al igual que Include genera un cdigo ms eficiente.

8.10.3.

Constantes tipo conjunto

En las versiones 6.0 y 7.0 se pueden definir constantes conjunto (set). Al igual que una
constante de tipo simple, la declaracin de una constante tipo conjunto especifica el valor del conjunto utilizando una expresin constante. Algunos ejemplos son:
type
Digitos = set of 0..9;
Letras
= set of 'A'..'Z'
const
DigitosPares
: Digitos [0,2,4,6,8];
Vocales
: Letras = ['A', 'E', 'I',
DigitosSimples : set of Byte = [0..9];
ConjuntoTest
: set of 0..99
[10..99];

'O' ,'U *];

Programacin en Turbo/Borland Pascal 7

328

Con frecuencia es necesario especificar una coleccin de valores en un determinado


punto de un programa. Por ejemplo, supongamos que se busca una entrada que contenga uno de los siguientes caracteres: c , a , r , c , h , e , l , e , j , o .
El segmento de programa siguiente muestra cmo especificar la citada coleccin de
valores con un conjunto denominado conjunto annimo (este trmino es similar al de
igual nombre en el lenguaje C++).
if CarEntrada in ['c','a','r','c','h','e', 1 1', 'e', 1 j','o']
then

8.11.

Tipos de datos definidos por el usuario y conjuntos

329

lmites inferior y superior deben estar dentro del rango de 0 a 255. Por estas razones
el tipo base no puede ser shortint, integer, longint o word.
7. L a s n i c a s o p e r a c i o n e s e s t n d a r d e c o n j u n t o s s o n : + ( u n i n ) , * ( i n t e r s e c c i n ) y - (diferencia).

8. Un valor de tipo conjunto no puede ser ledo incluyendo el nombre del conjunto en
la lista de entrada de una sentencia read o readln. En su lugar se puede utilizar
S := S + [x]

para aadir el elemento x al conjunto.


9. Un valor de tipo conjunto no se puede visualizar incluyendo el nombre del conjunto
en la lista de salida de una sentencia write o writeln.

PUESTA A PUNTO DE PROGRAMAS

Tcnicas de programacin
1. Identificadores tipo se deben utilizar para declarar parmetros formales en su programa y el tipo de una funcin.
2. Los valores listados en una definicin de tipos enumerados deben ser identificadores
legales y no pueden aparecer en ninguna otra definicin de tipos enumerados dentro
de esa unidad de programa. Por ejemplo, la declaracin
type
clase = (123A, 580, P=123, ABC_DE, 'Lunes', B' ) ;

no est permitida, ni
type
DiasLaborables = (Lunes, Martes, Miercoles, Jueves, Viernes);
DiasFestivos
= (Sabado, Domingo);

3. La funcin pred(x) no est definida si x es el primer valor de un tipo ordinal; succ(x)


no est definida si x es el ltimo valor.
4. Si una variable o funcin se declara de algn tipo subrango, resulta un error si se intenta asignar un valor que no est en ese subrango. Por ejemplo, si x e y estn declaradas por

RESUMEN
En este captulo se describen nuevos tipos y estructuras de datos: conjuntos, ordinales, enumerados
y subrangos. Asimismo se analizan las funciones ordinales relacionadas con dichos tipos y estructuras. El tipo de datos (set) es una estructura de datos que contiene un grupo de elementos del
m i s m o tipo (llamado el tipo base). Cada valor del tipo base de un c o n j u n t o puede o no pertenecer
al conjunto. Al contrario que en un array, un valor se puede guardar slo una vez en un conjunto,
y no existe forma de determinar la secuencia en que se han almacenado los valores en el conjunto;
por ejemplo, [3,6,1,5] es el mismo c o n j u n t o que [3,1,6,5].

EJERCICIOS
1. Cul es el error de la siguiente definicin?
type
decimales = s e t of r e a l ;
nmeros
= s e t of i n t e g e r ;
2. Evaluar x si
A es [ ' A ' , ' C ' , ' F , 'U']
'F',
B es [ ' C \ ' D 1 , ' E
C es [ ' F 1 , M1 , P ' ]

var
x,

1..10;

la sentencia
for x := 1 to 10 do
begin
y : = x * x;
WriteLn (y)
end

produce un error cuando x alcanza el valor 4 ya que el valor de y est fuera del
rango 1.. 10 (16 = 4 * 4).
5. Todos los elementos de un conjunto deben ser del mismo tipo, llamado el tipo base
de ese conjunto. Este tipo base debe ser un tipo ordinal.
6. El tipo base no debe tener ms de 256 posibles valores, y los valores ordinales de los

a)
b)
c)
d)

X :=
X :=
X :=
X :=

'G'

'H']

e) x := (C+A) *
f ) x := A-A
g) X := A+A*A-A

A+B
8*C
A-C
C+A*B

3. Evaluar las siguientes expresiones lgicas:


a) A=B
b) B <> C
c) D >= B

d) C <= E
e) 'A' IN [ T . . ' N ' ]

donde
A es [ ' K ' ,

'L',

"M", 'N 1 ]

Programacin en Turbo/Borland

330

B
C
D
E

es
es
es
es

[ 1 L ' , 1 N ' , 'M', 'K 1 ]


[1J1..1P1]
[ ]
['K']

4. Evaluar las expresiones lgicas:


a) [ 1 . . 1 0 ] - [ 1 . . 5 , 6 . . 1 0 ]
b) [1, 2, 3] < [1, 2, 3, 4]

'Y' , succ ( ' Y ' ) ]

6. A es el c o n j u n t o [1, 3, 5, 7], B [2, 4, 6] y C [1. 2, 3], Evaluar las expresiones:


a) A + (B-C)
b) A + (B*C)
c) A + B + C
d) (C-A) <= B

tidad y actualizar el saldo. Visualizar el nuevo saldo despus que todas las operaciones de la
semana hayan sido procesadas.
2. Escribir u n a funcin cuyos parmetros son un mes de tipo MesAbrev (ver ejercicio 7) y un
ao en el rango de 1538 a 1999 y cuyo valor es el n m e r o de das del mes. Recuerde: Febrero
tiene 28 das, excepto los bisiestos que tienen 29 das (un ao es bisiesto si es divisible por 4,
excepto para los aos que terminan en 00, que han de ser divisibles por 400. 1950 y 1900 no
son bisiestos; 1660 y 1600 s).
3. Utilizar la funcin del problema 4 para leer dos fechas en el formato dd mm aaa (tal como 7
7 1778 y 1 1 1989) y calcular el n m e r o de das que h a n transcurrido entre las dos fechas.

5. Es vlida la sentencia?
A := [pred ( ' Y ' ) ,

331

Pascal 7

e) C + (A-C)
f ) C - (A-B)
g) (C-A) - B
h) (B+C) = (A+C)

4. Escribir u n programa que encuentre el c o n j u n t o de todas las vocales y el c o n j u n t o de todas las


consonantes que aparecen en una lnea de texto dada.
5. Escribir un programa que localice todas las letras que no estn presentes en una lnea de texto
dada y las visualice en orden alfabtico.
6. Escribir un programa que lea diferentes lneas de texto y encuentre todas las palabras que tienen tres o ms vocales distintas.

7. Escribir un tipo e n u m e r a d o MesAbrev cuyos valores sean las abreviaturas de los meses del a o
y conste de las tres primeras letras del mes; definir tambin el tipo subrango N m e r o M e s que
consta de los valores 1, 2, 3, ..., 12. Escribir una funcin cuyo parmetro es el n m e r o de un
mes y cuyo valor sea el valor correspondiente de MesAbrev.

7. U n n m e r o real en Pascal tiene u n o de los formatos m.n, +m.n, -m.n, donde m y n son enteros no negativos; o puede ser expresado en formato exponencial xEe, xE+e, xE-e, donde x
es un n m e r o real o entero y e es un entero no negativo. Escribir un programa que acepte una
cadena de caracteres y a continuacin verifique a ver si representa una constante real vlida.

8. Los conjuntos A y B constan d e m y elementos, respectivamente. Cul es el rango del nmero de elementos de:

8. Escribir un procedimiento que lea una cadena de caracteres que finalizan con el carcter % e
ignore cualquier carcter que no sea dgito. Calcular asimismo el n m e r o formado por los dgitos.

a) A+B
b) A*B
c) A-B
9. Escribir las sentencias Pascal necesarias para introducir un entero entre 0 y 9 inclusive y se lo
convierta en un valor carcter equivalente (0 a '0', 1 a '1') y se almacene en u n a variable carcter N m .
10. Escribir una expresin lgica que utilice la funcin ord que determine si el valor ordinal de 'a'
es mayor que el valor ordinal de 'Z'. Cul es el valor de esta expresin en el juego de caracteres ASCII?
11. Construir un conjunto de enteros pares y un conjunto de enteros impares en el rango
l..MaxNum (por ejemplo, MaxNum = 100)
12. Escribir un procedimiento que lea una cadena de caracteres y devuelva el c o n j u n t o que contiene todas sus letras maysculas.

PROBLEMAS
1. Utilizando un tipo e n u m e r a d o DasDeSemana, escribir un programa que lea un n m e r o de
cuenta corriente de un cliente y su saldla continuacin por cada da laborable (Lunes a Viernes) lea la serie de operaciones del cliente: D (depsito) o R (retiradas), seguida por u n a can-

Ejemplo: cadena leda

$45,43AB0%

valor devuelto

45430.

9. En un c o n j u n t o de 100 personas existen personas de a m b o s sexos, fumadores, bebedores, deportistas, ancianos, etc. Determinar mediante un programa los siguientes conjuntos:

bebedores y ancianos,
fumadores y hombres,
ancianos y deportistas,
bebedor y f u m a d o r de sexo femenino,
ancianos femeninos y no deportistas,
ver si todo bebedor es f u m a d o r .

10. Escriba un programa para simular el juego de cartas de veintiuna entre dos jugadores. El
programa debe repartir cartas a cada jugador. Las cartas se reparten por orden, primero una
carta a cada jugador y luego una segunda carta a cada jugador. A continuacin, cada jugador
puede solicitar cartas adicionales.
El objetivo del juego es obtener 21 puntos o tantos puntos c o m o sea posible sin sobrepasar
21. Las figuras cuentan diez puntos, y los ases pueden contar 1 u 11 puntos segn convenga
al jugador. Si el jugador tiene un tanteo bajo con sus dos primeras cartas, puede solicitar una
o ms cartas adicionales siempre que el tanteo global no supere 21. Para simular el reparto de
cartas debe usarse un generador de nmeros aleatorios.
Debe usarse la estructura de datos c o n j u n t o para efectuar comprobaciones de pertenencia,
chequeos de error, cartas repetidas.

Introduccin a las estructuras de datos

CAPITULO

INTRODUCCION A LAS
ESTRUCTURAS DE DATOS:
ARRAYS

9.1.

333

CONCEPTO DE ESTRUCTURAS DE DATOS

Una estructura de datos es una coleccin de datos organizados de un modo particular.


Las estructuras de datos pueden ser de dos tipos: estructuras de datos estticas y estructuras de datos dinmicas.
Las estructuras de datos estticas son aquellas en las que se asigna una cantidad fija
de memoria cuando se declara la variable. En numerosas ocasiones se necesitan colecciones de datos que crezcan y reduzcan su tamao en memoria a medida que el programa
progresa. Estas estructuras de datos, cuya ocupacin en memoria puede aumentar o
disminuir en tiempo de ejecucin, se denominan estructuras dinmicas de datos.
Pascal define las estructuras de datos a travs de declaraciones de tipos.
estndar

CONTENIDO
9.1.
9.2.
9.3.
9.4.
9.5.
9.6.
9.7.
9.8.
9.9.
9.10.
9.11.
9.12.
9.13.
9.14.
9.15.

Concepto de estructuras de datos


Qu e s un array?
Arrays unidimensionales: los v e c t o r e s
Operaciones con arrays (vectores)
Arrays unidimensionales: los v e c t o r e s
Valores mnimo y mximo de un vector
La directiva del compilador R
Arrays paralelos
Arrays multidimensionales
Arrays bidimensionales (tablas)
Tratamiento de arrays multidimensionales
Compatibilidad y conversin de tipos
Constantes tipo array (tipeadas)
Arrays abiertos
Puesta a punto de programas

RESUMEN
PROBLEMAS RESUELTOS
EJERCICIOS
PROBLEMAS

Algoritmos + Estructuras de datos = Programas e s un f a m o s o libro


de Niklaus Wirth, diseador e inventor de Pascal. Con esta ecuacin
trata Wirth de indicar al lector que un programa s e obtiene tras el
diseo correcto del algoritmo y la eleccin adecuada de la estructura
de datos. Una estructura de datos e s una coleccin de e l e m e n t o s
datos organizados de un m o d o especfico. En e s t e captulo s e estudian los arrays (listas o tablas): c o n c e p t o s bsicos, operaciones y
tratamiento.

' El trmino ingls array se suele traducir en Latinoamrica por el trmino espaol arreglo. En Espaa se
suele utilizar, adems del trmino en ingls, los trminos vector, matriz y lista.

332

simples

Tipos de
datos
(estructuras)

enumerados
estticos

enumerados

string
arrays
set
record
file

dinmicos (punteros)

Este captulo se dedica a uno de los tipos de datos ms utilizados: el array.

9.2.

QUE ES UN ARRAY?

Un array es una estructura de datos en la que se almacena una coleccin de datos del
mismo tipo (por ejemplo, los salarios de los empleados de una empresa). Dicho de otro
modo, un array es una lista de un nmero finito n de elementos del mismo tipo que se
caracteriza por: 1) almacenar los elementos del array en posiciones de memoria continua; 2) tener un nico nombre de variable (por ejemplo salarios) que representa a todos
los elementos, y stos a su vez se diferencian por un ndice o subndice; 3) acceso directo
o aleatorio a los elementos individuales del array.
Salario
S a l a r i o [1]
S a l a r i o [2]

S a l a r i o [n]

nombre del array


elemento del array
!,2,..,n subndice del array

Programacin en Turbo/Borland Pascal 7

334

Introduccin a las estructuras de datos

335

Los arrays se clasifican en:


unidimensionales
multidimensionales

Artculo [l]
Artculo [2]
Artculo [3]

(vectores o listas)
(tablas o matrices)

contenido

(valor)

Artculo [20] -

9.3.

ARRAYS UNIDIMENSIONALES: LOS VECTORES

Un array de una dimensin (unidimensional) vector o lista es un tipo de datos


estructurado compuesto de un nmero de elementos finitos, t a m a o fijo y elementos
homogneos. Finitos indica que hay un ltimo elemento, tamao fijo significa que el
tamao del array debe ser conocido en tiempo de compilacin, homogneo significa que
todos los elementos son del mismo tipo.
Los elementos del array se almacenan en posiciones contiguas de memoria, a cada
una de las cuales se puede acceder directamente.
Supongamos que se desean conservar las puntuaciones de los 50 estudiantes de un
examen de informtica. Para almacenar estas puntuaciones o calificaciones se necesita:
reservar cincuenta posiciones en memoria, dar un nombre al array, y a cada uno de los
50 estudiantes asignarles su clasificacin correspondiente, es decir, dar el ndice o subndice del array.

C a l i f i c a c i o n e s [1]

7.50

Cal i f i c a c i o n e s [2]

4.75

C a l i f i c a c i o n e s [3]

5.25

ndice o subndice

Ejemplo 9 . 2
Dibujar un vector x de diez elementos que contenga valores reales.

9.3.1.
Calificaciones

nombre del
vector

x[l]

x[2]

x[3]

x[4]

x[5]

x[6]

x[7]

x[8]

x[9]

x[10]

45.21

12.0

3.45

4.32

0.314

513.6

2.65

3.16

2.45

13.04

Declaraciones de tipo array

Normalmente, la estructura de un array (vector) se describe por la declaracin del tipo


de array. A continuacin se asigna almacenamiento para uno o ms arrays de ese tipo.
Formato
type
nombre_array = a r r a y [tipo subndice] o f tipo;

nombre-array
tipo subndice

C a l i f i c a c i o n e s [50]

tipo
Nombre del vector
Subndice
Contenido

Cal i f i c a c i o n e s
[ 5 ] , [4] . . .
C a l i f i c a c i o n e s [41
C a l i f i c a c i o n e s [2] = 4 . 7 5

Ejemplo 9.1
Cantidades en stocks de diferentes artculos.

identificador vlido
puede ser de tipo ordinal: boolean o char, un tipo enumerado o un
tipo subrango. Existe un elemento por cada valor del tipo subndice
describe el tipo de cada elemento del vector; todos los elementos de
un vector son del mismo tipo

Notas
1 Los tipos estndar Real e Inte^et no Dueden ser utilizados c o m o un Upo subndice, sin
embargo, un subrango de enteros puede ser un tipo subndice
2 El upo de elemento puede ser cualquier tipo definido poi el usuario o estandar

336

Programacin en Turbo/Borland Pascal 7

Introduccin a las estructuras de datos

Ejemplo 9 . 3

337

Las variables tipo arrays son creadas utilizando la declaracin var, cuyo formato general es:

Array x de ocho elementos reales.


x[l]

x[2]

x[3j

x[4]

x[5]

x[6]

x[7]

x[8]

16.0

3.45

2.43

0.04

-45.3

2.25

1.14

2.25

var
NombreArrays: NombreTipo;

x[l]
t

NombreArrays
NombreTipo

subndice

nombre elegido para la variable


igual n o m b r e que el utilizado en type

n o m b r e del array (vector)

Ejemplo

Declaracin

type
Valores = array [-10..10] of real;
var
Precios : Valores;

type
array [1..8] of real;

El subndice o ndice del array debe ser de tipo simple: entero (integer, Shortlnt, Byte,
Word), lgico, carcter o enumerado, pero no real. Ejemplos tpicos de ndices son:
1..10
1
C'..' N'
true.. false
a z u l . , marrn

enteros
caracteres
lgicos
enumerados

El subndice de la variable array Precios debe ser un entero entre - 1 0 y 10; cada elemento del array contiene un valor real.
Ejemplo
const
Max = 500;
type
Texto = array [l..Max] of char;
var
Palabras, Letras : Texto

Un elemento del array se identifica por el nombre del array y el subndice (ndice)
adecuado contenido entre corchetes. Por ejemplo, identifiquemos Salarios con diez elementos.
S a l a r i o s [1]
S a l a r i o s [2]

La declaracin var en este ejemplo crea dos variables arrays, cuyos nombres son Pal a b r a s y L e t r a s . C o n s u l t a n d o las d e c l a r a c i o n e s c onst y t y p e se o b s e r v a q u e los s u b n d i c e s
S a l a r i o s [10]

Los subndices pueden definirse tambin por


Salarios ['A']
Salarios [1B']

Salarios ['J1 ]

9.3.2.

Variables tipo array

Las declaraciones de tipo de dato array no crean ninguna variable especfica tipo array.
En realidad la declaracin type proporciona informacin perteneciente a un grupo de
arrays como un todo.

de estos arrays deben ser un entero entre 1 y 500; cada elemento de estos arrays contendrn un valor tipo carcter.
El nmero de elementos de un array viene definido por la diferencia entre los ndices
mayor y menor ms uno. El array Precios contiene 10-(-!.0) + 1 = 21 elementos.
Deber tener cuidado al declarar variables no exceder la capacidad de memoria de su
mquina cuando se declaran arrays.
Los lmites de un array ordinario en Pascal se deben fijar en tiempo de compilacin.
El compilador de Pascal debe conocer, cuando se compila el programa, exactamente el
espacio ocupado por los elementos del array. No se pueden redimensionar arrays ordinarios como se puede hacer en BASIC con REDIM, ni puede cambiar su forma como se
puede hacer en APL.
Los tipos de datos de un array pueden ser cualquier dato vlido.
Ejemplo
var
Estado : array [1..1000] of boolean;

338

Programacin en Turbo/Borland Pascal 7

Los componentes de este array son:


Estado [1]
Estado [2]

Introduccin a las estructuras de datos

339

Precaucin
I as declaraciones de ndices rio pueden contener \ ambles:
var Denc : array

of in(ege? - ;

c\ L'^nl

N se pueden utili/ar ndices de arravs que esten fuera de ranao ('/'mlciuitlus no puede
tener un elemento de ndice 18. va que su rango es de 1 a 1^
F*\ivpcu>n Si se hubiera definido previamente N como constante (por ejemplo. \
10),
si ".cra vlida la declaracin.

Estadof1000]

Ejemplo
Los datos pueden ser de tipo enumerado.

9.3.3.
type
LucesTrafico = (Rojo, Verde, Ambar);
var
Trafico : array [1..4] of LucesTrafico;

Los componentes del array Trafico son:


Trafico
Trafico
Trafico
Trafico

Asignacin de valores a e l e m e n t o s del array


A los componentes de un array se pueden asignar valores de igual forma que a cualquier
otra variable, con tal de que sean del mismo tipo.

[1]
[2]
[3]
[4]

Las declaraciones de arrays pueden aparecer directamente en la seccin de variables


de la parte de declaracin de un programa. Esta declaracin es correcta
var
Coordenadas
Numero
CuentaCar
LineaTexto

Uso del ndice de un array

Cada referencia a un array incluye el nombre y el subndice (ndice) encerrado en corchetes; el ndice determina qu elemento se procesa. El tipo ndice suele ser un subrango.
Centrndonos en el array y los datos contenidos en l, las operaciones bsicas que se
pueden ejecutar en ellos son:

:
:
:
:

array
array
array
array

[1..15] of real;
[0..100] of 1..999;
['A'.-'Z'] of integer;
[1..80] of char;

A[i]
:= 25;
Trafico [4] := Rojo;
A [i]
:= C;

El ndice puede ser el valor de una expresin. Por ejemplo, si J es igual a 8, entonces
Numero [j] := 15;

asigna a Numero [8] el valor 15. La expresin


Estado [100 * j-1] := false;

pero es preferible asociarlas con identificadores tipo, como en


type
Letra
ArrayReal
NumeroDeArray
Linea

=
=
=
=

'A'..* Z';
array [1..15] of real;
array [0..100] of 1..1999;
array [1..80] of char;

y a continuacin utilizar estos identificadores tipo para declarar los tipos de arrays:
var
Coordenadas : ArrayReal;
Numero
: NumeroDeArray;
LineaTexto
: Linea;

asigna el valor false a Estado [100 * 8-1], es decir, Estado [799].


Indices distintos de enteros
Los ndices de un array debe ser un intefvalo de tipo simple: entero, lgico, carcter,
enumerado o subrango.
Ejemplo
type
Linea = array [1..40] of char;
Tabla = array [1..3Q] of Linea;
var
Reticula : Tabla;
Rango
: Linea;

Programacin en Turbo/Borland Pascal 7

340

Introduccin a las estructuras de datos

Estas declaraciones pueden escribirse tambin de la siguiente forma:


const
Longitud =
Altura
=
type
Horizontal
Vertical
Linea
Tabla
var

9.4.

OPERACIONES CON ARRAYS (VECTORES)

Los vectores (arrays) no se pueden leer/escribir en una sola operacin o sentencia. La


lectura o escritura de un array se debe hacer elemento a elemento, y para realizar estas
operaciones se deben leer o visualizar los componentes de un array mediante estructuras
repetitivas. Supongamos, por ejemplo, que el vector Notas contiene las calificaciones
obtenidas en un examen por los alumnos de una clase de Turbo Pascal.

40;
30;
= 1..Longitud;
= 1..Altura;
= a r r a y [Horizontal] of c h a r ;
= array [Vertical] of Linea;

Reticula
Rango

type
ListaDeNotas = a r r a y [1..30] of integer;
var
Notas : L i s t a D e N o t a s ;

: Tabla;
: Linea;

Obsrvese en estas declaraciones la interdependencia de los diferentes objetos.


Otro ejemplo con subndices tipo Char (o un subrango de Char) es una estructura de
datos muy til:

9.4.1.

Lectura de un vector

bucles for
a)

for i := i to 100 do
ReadLn

type
Letra

'A'..'Z';

Conjunto
= array
ConjuntoB = array

[letra] of integer;
[letra] of boolean;

(Notas

[i]);

for I := 1 to 1000 do
ReadLn

(Notas

[i]);

b) I := 1;

w h i l e I <= 100 d o
begin

Ejemplo

b)

bucles repeat

bucles while
a) I := 1;

Read (Notas
I := X + 1

[I]);

repeat
Read (Notas
I := I + 1

[I]);

until I > 100

end;

Las declaraciones
type
DiasDeSemana = (Lunes, Martes, Miercoles, Jueves, Viernes,

En el caso de que el ndice del array sea un tipo enumerado, la lectura completa se
realiza por la sentencia for. La lectura del ejemplo se realiza con el siguiente programa:

Sabado, Domingo);
ConjuntoDias = array [DiasDeSemana] of integer;
var
Cuenta

341

for Dia
Read

:= Lunes t o D o m i n g o do

(Cuenta

[Dia]);

: ConjuntoDias;

establecen un vector (array unidimensional) con siete posiciones, cada una de las cuales
puede almacenar un entero.

Cuenta [Lunes]

345

Cuenta [ M a r t e s ]

2214

Cuenta [ M i e r c o l e s ]

1614

Cuenta [Jueves]

2817

Cuenta [ V i e r n e s ]

1432

Cuenta [Sabado]

2460

9.4.2.

Escritura de un vector

Los elementos de un vector pueden ser visualizados situando una sentencia de salida
dentro de una estructura repetitiva. Por ejemplo:
ReadLn
Write

(Numero);
(Notas

{ lee la cantidad de nmeros a leer en el

vector }
[i]:3);

las salidas aparecern en la misma lnea. Esto se puede evitar escribiendo una sentencia
writeln al final del bucle.
for I := 1 to Numero d o
WriteLn
WriteLn;

(Notas

[I] :3);

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7

342

Problema 9.1

Problema 9 . 2

Leer una lista de las calificaciones de una clase de Turbo Pascal, calcular su media e
imprimir una lista de calificaciones mayores que la media.

Contar el nmero de veces que cada letra mayscula A


de texto leda del teclado.

program Calificaciones;

Limite = 100;
type

Notas
Numero, I
Suma, Media
begin

type
Letras
= 'A'..'Z';
CuentaCaracteres = array [Letras] of integer;

{ numero m x i m o de alumnos }

ListaCalificaciones = array
var

var
Frecuencia

[1..Limite] of real;

WriteLn

then
Frecuencia

[Caracter]

(Caracter <=

...');

'Z')

:= Frecuencia

end;
{while}
{ Imprimir frecuencia de letras

[Caracter] + 1

for Caracter := 'A' to 'Z' do


WriteLn ('frecuencia de ',Caracter,'
[Caracter]:2)

: ',Frecuencia

end.

Ejecucin
Introduzca una Linea de texto

WriteLn ('Lista de calificaciones mayores que la media:');


for I:= 1 t o Numero do

EN UN LUGAR DE LA M A N C H A
frecuencia de A : 4

if N o t a s [ I ] > Media
then
(Notas[I]

('Introduzca una Linea de texto');

begin
Read (Caracter);
if ('A' <= Caracter) and

Read (Notas[I]);
Suma := Suma + Notas[I]
end;
Media := Suma / Numero;

WriteLn

w h i l e not Eoln do

WriteLn ('No se procesan mas de ',Limite:3,' c a l i f i c a c i o n e s ' )


else
begin
Suma := 0;

', Media:3:1);

{ frecuencia de letras

for Caracter := 'A' to 'Z' do


Frecuencia [Caracter] := 0;
{Lectura de la linea de texto y c o m p u t o de ocurrencia de letras }

WriteLn ('Introducir numero de calificaciones');


ReadLn (Numero);
if Numero > Limite
then

WriteLn ('La media es:


WriteLn;

: CuentaCaracteres;

Caracter
: char;
begin
{Inicializar todas las frecuencias de letras a cero }

: ListaCalificaciones;
: integer;
: real;

WriteLn ('Introducir puntuaciones


for I:= 1 t o Numero do
begin

se producen en una lnea

program FrecuenciaLetras;

{lectura de una lista de calificaciones, calcular su media,


imprimir su suma y listar las calificaciones m a y o r e s que la media
const

343

frecuencia
frecuencia
frecuencia
frecuencia

:3:1)

end
end.

de
de
de
de

B
C
D
E

:
:
:
:

0
1
1
2

Ejecucin
Introducir numero de calificaciones

9.4.3.

5
Introducir p u n t u a c i o n e s . . . .
2.5 5.0 7.5 3 7

Una operacin que se suele dar en ocasiones es la copia de los elementos de un vector en
otro vector. Supongamos, por ejemplo, que los vectores Alfa y Beta se declaran con:

La media es

Copia de vectores

: 5.0

Lista de c a l i f ic a c i o n e s m a y o r e s que la media:


7.5
7.0

type
ListaReal = array
var
Alfa, Beta

[1..5] of real;

: ListaReal;

344

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7

var
W, X, Y : VectorDemo;
Z
: array [Indice] of real;

Si el vector Alfa tiene asignados valores, stos se pueden copiar en el vector Beta por
la sentencia
for I := 1 to 5 do
Beta [I] := Alfa [I] ;

X
W
Z
X

Esta asignacin de elementos del vector Alfa al vector Beta se puede hacer de modo
ms simple mediante la sentencia
Beta := Alfa;

Regla

|
!

Ln iieneial. un uriay puede sei asignado a otro arras solo cuando ambos tienen el mismo
tipo > el mismo tamao f sto significa que deben ser declarados por el mismo identiticador
o identificadoies equivalentes.

type
VectorA
VectorB
VectorC
VectorD

=
=
=
=

array [1..20] of real;


VectorA;
VectorA;
VectorB;

Los vectores vectorB, vectorC y vectorD son equivalentes. Sin embargo, vectorB no es
equivalente a vectorA.
Ejemplo 9 . 4
Si los vectores A, B, C y D estn declarados por

A
B
C
D

:
:
:
:

VectorA;
VectorB;
VectorC;
VectorD;

las sentencias de asignacin de vectores:


A
B
B
C

:= B
: = C;
:= D;
:= D;

no vlida
vlida
vlida
vlida

Ejemplo
const
Limite = 100;
type
Indice
= 1..Limite;
VectorDemo = array [Indice] of real;

345

9.5.

:=
:=
:=
:=

Y
Y
Y
Z

{
{
{
{

sentencia
sentencia
sentencia
sentencia

valida
valida
no valida
no valida

}
}
}
}

ARRAYS COMO PARAMETROS

Los arrays pueden ser utilizados como parmetros en funciones y procedimientos; sin
embargo, el valor de una funcin no puede ser un array. Las variables tipo array pueden
ser utilizadas como parmetros en la comunicacin entre funciones y procedimientos.
En general es mejor pasar el array completo en lugar de elementos individuales del
array, aunque existen casos ,en que puede ser ms conveniente el paso de elementos individuales.
Los arrays completos o individuales como parmetros pueden ser por valor o por
variable. Veamos cules son los mtodos ms idneos.
Cuando se utiliza un array como un parmetro variable, Pascal pasa la direccin del
primer elemento real del array al rea de datos del procedimiento. Dado que los elementos del array se almacenan en celdas de memoria adyacentes, se puede acceder al array
completo de datos. El procedimiento manipula directamente el array real.
Cuando se utiliza un array como un parmetro valor, una copia local del array se
hace cuando se llama al procedimiento. El array local se inicializa de modo que contiene
los mismos valores que el array real correspondiente. El procedimiento manipula el
array local y cualquier cambio que se haga en el array local no se refleja en el array
real.

9.5.1.

Parmetros valor

Escribir una funcin que verifique si dos vectores, M y N, son idnticos.


program Demo;
const
Limite = 100;
type
Indice = 1..Limite;
Vector = array [Indice] of real;
var
M, N, P : Vector;
{ declaracin de la funcin Identidad: devuelve True si A=B,
y False si A o B >
function Identidad
var
I : integer;

(A, B : Vector) : boolean;

346

Programacin en Turbo/Borland Pascal 7

Introduccin a las estructuras de datos

begin
I := 1 ;
while ( I < Limite) and (A[X] = B[I]) do
I := I + 1;
Identidad := A[I] = B[I]
{ resultado de la operacion }
end

La llamada desde el programa principal puede ser


z := Identidad (M,N)

La sentencia de llamada al procedimiento en el caso de un vector x puede ser


Intercambio ( x [3], x[l] );
procedure Intercambio ( var A,B : real);

En este caso, jc[3] y x[l] son parmetros por variable, ya que enviarn 5 y 7, respectivamente, y recibirn 7 y 5.
Notas

{ z de tipo logico }
Dada la declaracin de arravs

9.5.2.

Parmetro variable

Sumar dos vectores, X e Y, en un procedimiento

que devuelve el vector suma Z.

type U s t a R e a l e s
array
var A,B - L i s t a R e a l e s ;

of r e a ) .

1. Paso do un arra> completo c o m o parametro ckrlururnm


procedure SumaVectores (X,Y { entrada } : Vector;
var Z { salida } : Vector );
{ X , Y son parmetros por valor, Z es un parametro por variable }
{ el vector suma Z = X + Y se calcula mediante Z[I] = X [ I ] + Y [ I ] }
var
I : Indice;
begin
for I := 1 to Limite do
Z[I] := X(I] + Y [ I ]
end;

Desde el programa principal se envan dos vectores, X e Y, y una vez que se han
sumado, el resultado Z se devuelve al programa principal; por consiguiente, Z ser
parmetro variable.

9.5.3.

Paso de elementos individuales como parmetros

Un procedimiento tpico utilizado en los mtodos de ordenacin y bsqueda es Intercambio, que permite cambiar entre s los valores de dos variables A, B. El algoritmo es
sencillo:
Aux -*r- A
A
B
B
Aux

El procedimiento correspondientes es
procedure Intercambio (var A,B { entrada/salida }: real);
var
Aux : real;
begin
Aux := A;
A
:= B;
B
:= Aux
end;

347

de! .whpnpremia

procedure Prueba {x:List3-ea1 e s ; var y . L i s t d R e a l e s ) ,


llamada

dc^de el pmwnmta

principal

Si \ v B son arrays de tipo Lista Reales, una llamada valida es

2 . Paso de elementos individuales del arra>


Procedure PruebaUna (x . r e a l ; var y : r e a l ) ;
una posible Uaniaaa al pr^cedi-ment"

os

PruebaUna (A[5] , A [ l ] )

Problema 9 . 3
Dados dos vectores, A y B, calcular el vector suma S.
A = (a,, a2, av . . . , a)

bv bv . . . , bj

S = (a + bv a, + b2, . . . , an + b)
program SumaVectores;
{Dados dos vectores del mismo tipo, A y B, calcular su suma}
const
N = 12;
type
Vector = array [1..N] of integer;
var
A, B, S : Vector;
procedure LeerVector (var X : Vector);
var
J : 1..N;
begin
for J := 1 to N do
Read (X [J])
end;

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7

348

procedure EscribirVector

(var X : Vector);

la funcin Mximo se obtiene con el siguiente cdigo:

var
J : 1. . N;
begin
for J := 1 to N do
WriteLn

function M x i m o (Nmeros : L i s t a N u m e r o s ; N : integer) : integer;


{Mximo encuentra el valor mayor del vector Nmeros de N
elementos }
var

(X [J])

I, Aux
begin

end;
procedure Sumar (var X, Y, Z : Vector);
{X e Y son v e c t o r e s a sumar. Z es el vector suma}
var
J : 1..N;
begin
for J : = 1 t o N do
Z [J] := X [J] + Y [J]
end;
begin
WriteLn
WriteLn

{programa principal}
('Para cada vector introduzca', N:l, 'elementos');
('Introduzca datos del primer vector');

LeerVector

(A);

: integer;

Aux := Nmeros [1];


for I := 2 to N do
if Nmeros [I] > Aux then
Aux := Nmeros [I];
Mximo := Aux
end

{Mximo}

En este ejemplo el vector Nmeros es un parmetro valor, y en consecuencia los valores del vector real en la invocacin a la funcin
WriteLn

(Mximo (Calificaciones), Num);

{lectura del primer v e c t o r }

WriteLn ('Introduzca datos del segundo vector');


LeerVector (B);
{Lectura del segundo v e c t o r }
Sumar (A, B, S);
{Calculo de la suma}
EscribirVector (S)
{Visualizacion del r e s u l t a d o }
end.

se copian en Nmeros. Esta operacin produce dos copias de la misma lista de valores, y
en consecuencia no es un uso eficiente de memoria. Adems, el proceso de copia de los
elementos de un vector en otro consume tiempo indeseado. Estas dificultades se pueden
eliminar especificando el vector Nmeros como un parmetro variable.
function Mximo

9.6.

349

VALORES MINIMO Y MAXIMO DE UN VECTOR

Una operacin frecuente es determinar el mnimo o mximo valor almacenado en un


vector. El diseo se suele realizar con funciones o procedimientos.

(var Nmeros:ListaNumeros; n:integer):integer;

Un array debe ser un parmetro variable cuando el subprograma devuelve el array a


la unidad de programa que lo llama. Por ejemplo, un procedimiento que lea un array
Nmeros, que cuente el nmero de elementos y devuelva este array y el nmero de elementos al programa principal, se deben declarar tanto el array como el nmero de elementos como parmetros variables.

Algoritmo Mximo
procedure Demo

1. Se supone que el primer elemento del vector es el mayor.


2. Para cada elemento del vector:
2.1. Si el elemento actual es mayor que el mayor, guardar el subndice del elemento actual como subndice del mayor (utilizar una variable auxiliar Aux).
Programa
Supongamos que se dispone de un vector Nmeros de enteros que se definen en la declaracin
type
ListaNumeros = array [1..100] of integer;
var
Calificaciones : ListaNumeros;
Num
: Integer;

9.7.

(var Nmeros:ListaNumeros; var Cuenta:integer);

LA DIRECTIVA DEL COMPILADOR R

En Turbo Pascal es posible verificar si el subndice o ndice de un array est dentro de los
lmites establecidos en la declaracin del array.
La directiva R (Range cheching, verificacin de rango) tiene dos estados: activada +$R)
y desactivada (-$R). Si R est activa, cuando se intenta utilizar un ndice del array fuera
de los lmites vlidos se producir un error en ejecucin. Esta opcin se suele utilizar
durante la fase de depuracin del programa. Para tener activada la opcin de verificacin
de rango hay que incluir la siguiente lnea en el archivo que contiene de programa.
$R+

350

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7

Cuando el programa est ya depurado, se debe eliminar fsicamente dicha lnea, ya


que su programa correr ms rpidamente. Se pueden incluir comentarios en la directiva.
{$R+

a c t i v a c i n de l o s m e n s a j e s de e r r o r de r a n g o j

Regla
Puesta a punto do i programa: incluir !SR-
Ejecucin del programaclu-uruir \ $R- .

Nombres(1]

Mortimer

Media[ 1 ]

4.234

Nombres[2]

Flanagan

Meda[2]

5.635

Nombres[3]

Mckenna

Media[3]

6.725

Nombres[4]

Mckoy

Meda[4]

8.240

Nombres[5]

Carrigan

Meda[5]

2.320

Nombres[6]

Lpez

Meda[6]

0.060

351

Si se desea imprimir el nombre de un estudiante seguido de su media, se utilizar el


mismo subndice.

La opcin por defecto equivale a j$R+j. es decir, directiva desactivada.


I
Nombres
Media

Ejemplo

: integer;
: array [1..30] of string
: array [1. . 30 ] of real;

[20]

type
Annos

= 1980..1989

VentasAnuales
var
Ventas

= array [ Annos

for I := 1 t o 30 do
WriteLn (Nombre [I], Media

] of real;

[I] :8:3)

: VentasAnuales

Los ndices sirven como enlace entre los dos tipos de vectores.
VentasAnuales

[1992]

:= 1495

Al ejecutarse la ltima sentencia no se producir ningn mensaje de error ya que est


desactivada la directiva R. Aadir j+$Rj

Ejemplo
const
Mximo
type

{+$R}

VentasAnuales

Indice
ListaUna
ListaDos
ListaTres
var
Cantidad
Nombre

[1992] := 1495

al ejecutarse esta ltima sentencia se producir un error ya que 1992 no pertenece al


sucesivamente.

200;
= 1..Mximo;
= aurray [Indice] of real;
= array [1-.Mximo] of s t r i n g
= array [Indice] of L i s t a D o s ;

[20]

ListaUna;
ListaTres;

Los arrays Cantidad y Nombre son paralelos.

9.8.

ARRAYS PARALELOS

Dos o ms arrays que utilizan el mismo subndice para referirse a trminos homlogos se
llaman arrays paralelos. Estos arrays se pueden procesar simultneamente.
Considere el caso de tener que representar dos vectores, uno para nombres de estudiantes Nombres y otro la nota media de un curso Media. Un mtodo lgico es
utilizar dos vectores en los que el primer elemento de Nombres sea el nombre cuya media
es el primer elemento de Medi a, y as sucesivamente.

9.9.

ARRAYS MULTIDIMENSIONALES

Hasta ahora toda la informacin procesada se manipulaba con una sola columna o lista
de entrada, el llamado vector o array de una dimensin. Sin embargo, en numerosas
ocasiones es necesario trabajar con tablas que tengan diferentes columnas. Por ejemplo,
la siguiente tabla de temperaturas de un mapa del tiempo:

Programacin en Turbo/Borland Pascal 7

352

Introduccin a las estructuras de datos


Columnas

Ciudad
'

Madrid

Jan

Granada

Sevilla

i
2
3
4

35
34

40
41
38
39
42

38
37

41
40
42
40
39

Da

30
36
29

35
37
40

T[1.1]

T[L2]

T[1,3]

U n sistema de estructurar los datos podra ser con cuatro arrays paralelos. Sin embargo, puede utilizarse un array de dos dimensiones que suele ser un mtodo ms eficiente
generalmente. En este caso se puede emplear un array de dos dimensiones (dos subndices), una dimensin (subndice) correspondiente a los nombres de la fila y otro para los
nombres de la columna.
As en el ejemplo anterior se puede representar con
type
Ciudad = (Madrid, Jan, Granada, Sevilla);
var
Temperatura : array [1..5, Ciudad] of integer;

Los datos se pueden almacenar en el array mediante sentencias de asignacin de la


forma
Temperatura
Temperatura

T[5,8]

T[3,4]
A r r a y d e d o s d i m e n s i o n e s T c o n 5 filas y 8 c o l u m n a s .

Se deben indicar: 1) nombre del array, 2) tipo del array (recuerde que todos los elementos de un array deben ser del mismo tipo), 3) el rango permitido (es decir, el primero y
ltimo valores posibles) por cada subndice.
Formato

Los arrays se clasifican de acuerdo al nmero de ndices o dimensiones en bidimensionales o multidimensionales propiamente dichos (ms de una dimensin). Los arrays
multidimensionales se declaran de igual modo que los arrays de una dimensin.

1. type
identifcador=

array [ndice 1, ndice 2] of tipo elemento;

2. type
identifcador=

array [ndice] of array [ndice 2] of tipo

Ejemplos

Un array bidimensional (tabla o matriz) es un array con dos ndices, al igual que los
vectores que deben ser ordinales o tipo subrango (Fig. 9.1).
Para localizar o almacenar un valor en el array se deben especificar dos posiciones
(dos subndices), uno para la fila y otro para la columna. Los elementos se referencian
con el formato:
T [3,A]

elemento

de la fila 3 y columna

1. type
Tabla = array [1..25,1..4] of real;
var
Grados : Tabla;
reserva 100 p o s i c i o n e s d e m e m o r i a d a t o s reales: 25 l a s p o r 4 c o l u m n a s
G r a d o s [i, j] se refiere

Matriz = array
Cuenta = array
Dibujo = array
var
Tabla : M a t r i z

Los diferentes tipos de ndices no necesitan ser subrango del mismo tipo.

9.10.1.

Declaracin de los arrays bidimensionales

a la fila i y a la columna

2. type

Al igual que en los arrays de una dimensin (los vectores), los arrays multidimensionales
(tablas) se crean con declaraciones type y var cuando un programa se codifica en Pascal.

8
T[1.8]

T[5,1]

Figura 9 . 1 ,

[1,Madrid] := 35;
[l,Jaen
] := 38;

ARRAYS BIDIMENSIONALES (TABLAS)

2
3

9.10.

353

3.

[1..10, 1..5] of real;


[1..100, 'A'.. 1 Z ' ] of integer;
[0..4, 0..9] of char;

type
Estudiantes = array
var
Clase

: Estudiantes;

[1..5, 1..4] of real;

354

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7

N o t a [1]

N o t a [2]

N o t a [3]

N o t a [4]

(Gracia)

N o m b r e [1]

7.20

3.2

(Rodrguez)

N o m b r e [2]

3.40

1.6

3.20

7.6

(Lpez)

N o m b r e [3]

4.50

3.40

7.4

(Marn)

N o m b r e [4]

3.60

(Ruiz)

N o m b r e [5]

7.40

2.50

6.6

Recorrido por filas/columnas

A[1,3]

A[1,4]

A[2,1]

- A[2,2]

A[2,3].

A[2,4]

A[3,1]

-A[3,2]

A[3,3]

. A[3,4]

a)

. A[1,2]

A[1,3]

A[1,4]

A[2,1]

A[2,2]

A[2,3]

A[2,4]

A[3,1]

A[3,2]

A[3,3]

A[3,4]

b)

Figura 9.2.

25
0
6

35
1
12

18
18

34
24

Por filas
El programa que almacena los datos en el array A es:

(A [Fila, Columna]);

25
35
0
0
0
1

Los elementos de la primera fila/columna se procesan primero, a continuacin los de la


segunda fila/columna, y as sucesivamente. Sea el array A de 3 filas y 4 columnas. La
Figura 9.2 muestra grficamente los recorridos.

A[1,1]

Leer los datos de la siguiente tabla:

Los valores se deben introducir en este orden:

El orden ms natural de procesar los vectores es el orden secuencial: del primero al


ltimo elemento. En el caso de las tablas o de los arrays multidimensionales, existen
diferentes rdenes para su recorrido. Los ms usuales son: recorrido por filas y recorrido
por columnas.

-A[1,2]

Ejemplo 9 . 5

ReadLn

Manipulacin de tablas

A[1,1]

Los recorridos se realizan mediante bucles anidados, uno por cada dimensin o
ndice.

for Fila := 1 to 3 do
for Columna := 1 to 4 do

El estudiante Ruiz tiene las notas 7.40, 2.50. 4 y 6.6.

9.10.2.

355

18
24

A[ 1,1]

A[1 -11

A[1,2]

A[2,1]

A(1,3]

A{3,1]

A[1.4]

A[1,2]

A[2,1]

A[2.2]

A[2,2]

A[3,2j

A[2,3]

A[1,3]

A[2,4]

A[2,3]

25
0

A[3,1]

A[3,3]

6
35

A[3,2]

A[1,4]

A[3,3]

A[2,4]

A[3,4]

A[3,4]

c)

d)

a) Recorrido por filas, b) Recorrido por c o l u m n a s , c) A l m a c e n a m i e n t o por filas.


d) A l m a c e n a m i e n t o por c o l u m n a s .

Por columnas
for Columna := 1 to 4 do
for Fila := 1 t o 3 do
ReadLn

( A

[Fila, Columna]);

Los valores se deben introducir en este orden:

34
24

Las sentencias while anidadas se pueden utilizar tambin en lugar de las sentencias
for para los bucles de entrada.

356

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7


begin
for X:= 1 to 25 do
begin

Ejemplo 9 . 6

La tabla

"25
0
6

0
34
24

0
18
18

35
1
12

357

Write
('Introduccin notas del estudiante
WriteLn (' y calculo de su nota media 1 );
Suma := 0;

se puede leer con las sentencias

Fila : = 1 ;
w h i l e Fila <
3 do
begin
Columna
w h i l e Columna <
4 do
begin
Read ( A Fila, Columna]
Columna
= Columna + 1
end;
Fila := Fila + 1
end;

WriteLn

('Introduzca en una

',1:1);

linea las notas de las

cuatro a s i g n a t u r a s ' ) ;
for J:= 1 t o 4 do
begin

1;

Read (Notas[I,J]);
Suma : = Suma + Notas
end;
ReadLn;
Media := Suma / 4;

[I,J]

WriteLn ( 'La nota m e d i a del e s t u d i a n t e ',1:1,' es ' , Media: 1:1)


end
end.

Ejemplo 9 . 7

Problema 9 . 5

Escribir la tabla anterior.

Un instituto desea controlar los resultados de los alumnos en las diferentes asignaturas
de su curso de informtica. El programa debe leer las calificaciones obtenidas en las distintas asignaturas y visualizar en pantalla el nmero de cada estudiante seguido por la
media del estudiante y una lista de las calificaciones parciales de ese estudiante. El programa visualizar tambin la calificacin media de todos los estudiantes en cada asignatura.

for Fila := 1 to 3 do
begin
for Columna
Write
WriteLn
end;

:= 1 to 4 do

(A [Fila, Columna]

: 4);

Anlisis
Problema 9 . 4
Calcular la media de una lista de veinticinco alumnos de una clase de informtica con
notas en cuatro asignaturas.
* Numero
estudiante
f
"2

3
4

Vlgnritmos

- 7:20
8.40
9.60
1.30

Pascal

6
5.80
4.20
2.50

Base
de (latos
7
7.40
6
4.80

Ingeniera
(le Software
5
4.50
3.20
2.40

Se necesita un array (tabla) bidimensional Alumnos (A) que contenga las diferentes
calificaciones de los alumnos. Un ndice ser el nmero de estudiantes y el otro la
calificacin obtenida en cada asignatura.P [Numero, C a l i f i c a c i n ]

Otro array (vector) MediasAlumnos (MA) contiene las medias de cada alumno y, por
ltimo, MediasAsignaturas (AsigM) ser un array (vector) que contendr las medias de
cada asignatura.

Alumnos
25

5.20

7.80

program NotaMedia;
var
Notas
: array [1..25, 1..4] of real;
I, J
: integer;
Suma, Media : real;

MediaAlumnos

Asignaturas

MediaAsignaturas

10

7.4

8.6

4.5

6.4

8.2

6.65

8.2

6.4

5.6

6.55

6.85

6.55

6.8

358

Programacin en Turbo/Borland Pascal 7

Introduccin a las estructuras de datos

Las calificaciones en cada examen son de 0 a 10.


Las tareas a realizar son:
1.
2.
3.
4.

Lectura de las calificaciones.


Calcular la media de cada asignatura. Calcular la media de cada alumno:
Visualizar calificaciones y medias.

A fin de simplificar el programa, supondremos que el nmero de alumnos es de 4 y el


de asignaturas tambin de 4, y que estos valores se consideran constantes en el programa
Un problema ms general sera considerar que el usuario lee el nmero de alumnos y de
asignaturas directamente del perifrico de entrada (por ejemplo, el teclado).
Cada tarea o mdulo se realiza por un procedimiento independiente.

Control Exmenes

Lectura de
Calificaciones

Medias
Asignaturas

Medias
Alumnos

Resultados

Programa
program ControlExamenes;
{Lectura de las notas de cada estudiante en cada asignatura.
Calculo de la nota media de cada estudiante. Calculo de la
nota inedia por asignatura. Visualizar resultados }
const
NumEstudiantes = 4;
{Modificar estos datos de acuerdo }
NumAsignaturas = 4;
{a sus necesidades}
type
IndiceEstudiantes = 1..NumEstudiantes;
IndiceAsignaturas = 1..NumAsignaturas;
TablaNotas
= array [IndiceEstudiantes,
IndiceAsignaturas] of real;
MediaAlumnos
= array [IndiceEstudiantes] of real;
MediaAsignaturas = array [IndiceAsignaturas] of real;
var
Notas
; TablaNotas;
{notas en las asignaturas}
M_Alumnos
: MediaAlumnos;
{nota media de cada alumno}
M_Asignaturas : MediaAsignaturas;
{nota media por asignatura}
procedure LeerNotas (var N: TablaNotas);
var
E : 1..NumEstudiantes;
A : 1..NumAsignaturas;

359

begin
for E := 1 to NumEstudiantes do
begin
('Introduzca las ',NumAsignaturas :1,'
Write
calificaciones');
WriteLn (' del alumno ', E:l, ' en una sola linea'
for A:= 1 to NumAsignaturas do
Read (N [E,A]);
ReadLn
end
end;
procedure MediasPorAsignatura

(var N
: TablaNotas;
var Medias: MediaAsignaturas),

var
1..NumAsignaturas;
A
1..NumEstudiantes;
E
Suma
real ;
begin
1 to NumAsignaturas do
for A
{Calculo de la media por cada asignatura}
begin
Suma := 0;
for E := 1 to NumEstudiantes do
Suma
:= Suma + N [E, A];
Medias [A]:= Suma / NumEstudiantes
end
end;
procedure MediasPorEstudiante (var N
var Medias

TablaNotas;
MediaAlumnos) ,

1..NumAsignaturas;
A
1..NumEstudiantes;
E
real ;
Suma
begin
1 to NumEstudiantes do
for E
{Calculo de la media por cada estudiante}
begin
Suma := 0;
for A := 1 to NumAsignaturas do
Suma
:= Suma + N [E,A];
Medias [E] := Suma / NumAsignaturas
end
end;
procedure resultados (var N: TablaNotas;
var Medias_A : MediaAsignaturas;
var Medias_E : MediaAlumnos);
var
E : 1..NumEstudiantes;
A : 1..NumAsignaturas;

360

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7

9.11.

begin
{ Listado de cada estudiante con su m e d i a y notas de
asignaturas }
WriteLn ('Estudiante 1 : 10, 'Media':10,
WriteLn ('
': 10, '
':10,
for E := 1 to NumEstudiantes do
Begin

' ': 25,'Asignaturas')


' ': 25,'
')

TRATAMIENTO DE ARRAYS MULTIDIMENSIONALES

Turbo Pascal no limita el nmero de dimensiones de un array, pero s que debe estar
declarado el tipo de cada subndice.
Formato

Write ( E:5, Medias_E [E]:15:2);


for A:= 1 to NumAsignaturas do
Write (Notas [E,A]:14:2);
WriteLn
end;

1. type

identifcador = array [ndice 1] of array [ndice 2], .


of array [ndice n] of tipo de elemento;
2. type

identifcador = array [ndice 1, ndice 2, ... ndice n]


of tipo de elemento',

{ Listado de las medias de cada asignatura }


WriteLn;
Write ('Medias de las asignaturas:
for A:= 1 to NumAsignaturas do
Write
WriteLn
end;

( Medias_A

[A]:3:2,'

', ' ':3);

Ejemplo

': 10);

1. t y p e
Examenes = array [1..5, 1..3] of 0..100;
Dinero
var

begin
LeerNotas

(Notas);

MediasPorAsignatura
MediasPorEstudiante

(Notas, M _ A s i g n a t u r a s ) ;
(Notas, M _ A l u m n o s ) ;

Notas
Pagas

T3

Ejecucin modelo
Introduzca las 4 calificaciones del alumno 1 en una sola Linea
2.5 7.8 4.3 6.2
Introduzca las 4 calificaciones del alumno 2 en una sola Linea
6.1 6.8 8.3 9.3
Introduzca las 4 calificaciones del alumno 3 en una sola Linea
5.6 6.1 3.7 4.4
Introduzca las 4 calificaciones del alumno 4 en una sola Linea
2.5 4.9 6.8 6.7
Estudiante

Media

1
2
3
4

5.20
7.62
4.95
5.22

Medias asignaturas:

= array [1..50, 1..12, 1980..1990] of real;


: Examenes;
: Dinero;

2. t y p e
Fila = array [1..10] of integer;
TI
= array [1..5] of Fila;
T2
= array [1..5] of array [1..12] of integer;

Resultados
(Notas, M _ A s i g n a t u r a s , M _ A l u m n o s ) ;
WriteLn ( ' Fin del programa ')
end.

Fin del programa

361

Asignaturas
2.50
6.10
5.60
2.50

7.80
6.80
6.10
4.90

4.30
8.30
3.70
6.80

6.20
9.30
4.40
6.70

4.17

6.40

5.77

6.65

9.11.1.

= array

[1..5,1..12] of integer;

Problemas de aplicacin (arrays multidimensionales)

Se desea escribir un programa para vender pasajes de una lnea area. Para ello se
necesita un registro con la capacidad de cada vuelo y el nmero de plazas libres de cada
vuelo, as como el nmero de reservas que quedan en lista de espera. Supongamos que la
lnea area tiene un vuelo a ocho ciudades distintas. Escribir las correspondientes declaraciones.
1 .a solucin (Arrays unidimensionales o listas)
const
Primero = 1;
Ultimo
= 8;
type

Ciudad = Primero..Ultimo;
var
Capacidad, Libres, R e s e r v a s

: array

[Ciudad] of integer;

En este caso se utilizan tres arrays paralelos que contienen la capacidad, plazas libres
y reservas de cada vuelo.

362

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7

2. a solucin (Arra?ys tridimensionales: tablas)


En el ejemplo anterior, por cada ndice (por ejemplo, Ciudad = 4) hay tres valores que
identifican al vuelo: Capacidad [4], Libres [4], Reservas [4], El proceso se hace ms claro
si se trata toda la informacin de un vuelo como una sola unidad, y cada unidad contiene tres enteros. La solucin es utilizar un array bidimensional.
Definicin de un vuelo con una tabla.
const
Primero
Ultimo
Capacidad
Libres
Reservas

=
=
=
=
=

1;
8;
8;
1;
2;

: integer;

CiudadDestino

: Ciudad;

begin
C := 0;
for C i u d a d O r i g e n
:= P r i m e r o t o Ultimo do
for C i u d a d D e s t i n o := P i m e r o t o U l t i m o do
C := C + V u e l o [CiudadOrigen, CiudadDestino, Reserva];
:= C

4. a solucin (Array de cuatro dimensiones)

[Ciudad] of InfoVuelo;

Se puede procesar toda la tabla como una unidad. Por ejemplo, verificar si existen
asientos libres en el vuelo a la ciudad 4
If Vuelo

C
CiudadOrigen,

ContarReser v a s

InfoVuelo = array [Capacidad..Reservas].of integer;


Ciudad
= Primero..Ultimo;
var
: array

: integer;

end;

type

Vuelo

function C o n t a r R e s e r v a s
var

363

Ampliar el problema anterior para procesar todos los vuelos diarios durante un determinado mes, de una ciudad a otra ciudad.
La declaracin de la nueva variable Vuelo sera:
var
Vuelo

:array [Ciudad,Ciudad,1..31] of InfoVuelo;

esto hace que Vuelo sea un array de cuatro dimensiones de enteros o un array de tres
dimensiones de InfoVuelo.

[4,Libre] > 0 t h e n ...

y contar las plazas libres disponibles para la lista de espera (reservas).


c

Ejemplo 9 . 8

: = 0;

for j := Primero to Ultimo d o


c

:= c + V u e l o

[Ciudad,Reserva]

Verificar si existen asientos libres en el vuelo de la ciudad 3 a la ciudad 5 el da 14.


if Vuelo

[3,5,14,Libres] > 0 t h e n ...

3. a solucin (Array tridimensional)


Se puede ampliar el ejemplo anterior considerando el total de vuelos diarios entre cada
una de las seis ciudades y las restantes.
La declaracin correspondiente poda ser un array tridimensional.

Problema 9 . 7
Calcular el nmero de reservas en lista de espera.
La funcin ContarReservas se modificar en el sentido:

var
Vuelo = array

[Ciudad,Ciudad,Reserva] of InfoVuelo;

En el caso de desear verificar si existen asientos disponibles desde la ciudad 2 hasta la


ciudad 5, se debe utilizar la sentencia
if Vuelo

[2,5,Libres] > 0 then

c := 0;
for CiudadOrigen := Primero t o Ultimo do
for C i u d a d D e s t i n o := Primero t o Ultimo do
for Dia := 1 t o 31 d o
C := C + V u e l o [CiudadOrigen, CiudadDestino, Dia, Reserva];

...

Problema 9 . 6

Observaciones

Averiguar con una funcin cuntas peticiones de plazas (reservas) hay solicitadas en la
lista de espera de toda la lnea area.

Este ejemplo se podra ver modificado para incluir tipo de clase (Turista, Primera), mes
del ao, etc.

364

Programacin en Turbo/Borland Pascal 7

9.12.

Introduccin a las estructuras de datos

COMPATIBILIDAD Y CONVERSION DE TIPOS

begin
W r i t e L n ('Introduzca un numero e n t e r o ' ) ;
ReadLn (entero);
hexa := cuatro_bytes (entero);
{conversin de tipoj
WriteLn (hexa [3]:6, hexa [2]:6, hexa [1]:6, hexa [0]:6);

Ya se ha comentado en captulos anteriores que los datos en Turbo Pascal pueden ser
idnticos o slo compatibles. En esta seccin trataremos de diversos casos donde se
utilizan estas propiedades aplicadas a los datos tipo array.

9.12.1.

Compatibilidad/Identidad

end.
Una ejecucin de prueba produce los siguientes resultados:

Las declaraciones

entero

[X..25] of integer;
[1..25] o f integer;

determinan tipos no idnticos, ya que array [1...25] of integer no es un identifcador de


tipo. Sin embargo, las variables VI y V2 declaradas como
var
VI, V2

: array [1..25] of integer;

se consideran de tipo idntico.


Veamos otro ejemplo:
var
VI
V2
V3
V4

:
:
:
:

array [1..25] of integer;


array [1..25] of integer;
boolean;
boolean;

vi y V2 no son de tipo idntico; V3 y V4 son de tipo idntico, ya que estn definidas por
el mismo identifcador de tipo (V3 y V4).

salida
0
0
0
0
0

l
255
256
65536
100000

type
Datol = array
Dato2 = array

9.13.

0
0
0
1
1

0
0
1
0
134

1
255
0
0
160

CONSTANTES DE TIPO ARRAY (TIPIFICADAS)

En Pascal estndar las constantes arrays no estn permitidas. Turbo Pascal permite que
las constantes con tipo (tipificadas) puedan ser de casi cualquier tipo. Las constantes con
tipo, tcnicamente hablando no son constantes en el estricto sentido, sino variables inicializadas, es decir, variables que tienen un valor inicial especfico en la cabecera del programa.
Ejemplos
1. c o n s t A

: array

[1..5] of integer = (10,20,30,40,50);

Si en el cuerpo del programa se ejecuta el bucle


for i := 1 to 5 do

9.12.2.

Conversin

Ejemplo 9 . 9
El siguiente programa permite visualizar el contenido de una variable de tipo longint en
forma de cuatro bytes.

entero
hexa

: longint;
: cuatro_bytes;

[i],

'' ) ;

se produce la salida
10

20

30

40

50

2. const
{ vectores }
D i a s _ P o r _ M e s : a r r a y [1..12] of integer =
(31,28,31,30,31,30,31,31,30,31,30,31");

3. type
Matriz_Z = array

[1..2,1..2] of integer;

const

program conversin;
type c u a t r o _ b y t e s = array
var

(A

Write

En Turbo Pascal es posible la conversin de tipos entre dos variables de tipos cualesquiera con la condicin de que la variable fuente y destino sean exactamente del mismo
tamao. Aunque no son muy frecuentes estas conversiones, en ocasiones pueden ser de
gran utilidad.

[0.3] of b y t e ;

365

M : M a t r i z = ((1,2),

(3,4));

esta declaracin establece:


M[l,l]= 1

M[l,2]= 2

M[2,l]= 3

M[2,2]= 4

Programacin en Turbo/Borland Pascal 7

366

4. const
Reticulado : array [1.-4,1.-3] of integer =
((1,4,8), (3,1,5), (10,12,15), (1,0,0));

inicializa el array reticulado


1
3
10
1

Introduccin a las estructuras de datos

367

de elemento es A. Dentro del procedimiento o funcin, el parmetro formal se comporta


como si se hubiera declarado con la sentencia
array [0..n - 1] of A

4
1
12
0

8
5
5
0

Una caracterstica importante de constantes arrays es que ellas pueden ser utilizadas como parmetros variables actuales en llamadas a procedimientos. Esto requiere que el tipo tenga un nombre de tipo y que la constante sea declarada
utilizando el nombre del tipo. As, con la declaracin siguiente:
type
Lista = array [0..3] of real;
const
R : Lista = (0.0, 1.1, 2.2, 3.3);

donde n es el nmero de elementos del parmetro real. En efecto, el rango del ndice del
parmetro real se corresponde con los enteros 0 a n - 1.
U n parmetro abierto es un parmetro array para el cual se definen los lmites inferior y
superior en llamada, en lugar de en la declaracin.

Esta caracterstica de arrays abiertos ya ha sido implementada por Wirth (diseador


de Pascal) al disear Modula-2
Precaucin

Para utilizar parmetros arrays abiertos se necesita emplear la directiva de compilacin {$P+}.

R puede ser un parmetro actual de tipo Lista.


U n a sintaxis de una cabecera de una funcin ser similar a sta:

5. const
Dias : array [0..6] of string [3]=
('Dom', 'Lun', 'Mar', 'Mi', 'Jue', 'Vie', 'Sab');
Mes : array [1..12] of string [5] = ('Ene', 'Feb', 'Mar',
'Abril', 'Mayo', 'Junio', 'Julio', 'Agost', 'Sept',
'Octu', 'Novi', 'Dici');

Esta definicin de constantes define dos arrays de cadenas, das y mes, y asigna una
secuencia de abreviaturas a cada uno.

9.14.

ARRAYS ABIERTOS

U n a limitacin que presenta la declaracin de arrays en Pascal estndar o en Turbo Pascal era la necesidad de especificar su tamao en el momento de definir un array. Cualquier variable de tipo array ser de un tamao particular, al igual que sucede con parmetros del citado tipo. Esto significa que al disear un procedimiento o funcin se necesita
conocer el tamao de cualquier array o cadena a (una cadena en Pascal es esencialmente
un array de caracteres)-, pero la nueva caracterstica de arrays abiertos hace ms simple
y elegante la definicin de arrays: el parmetro se declara simplemente como un array
del tipo adecuado, pero no se debe especificar ningn lmite a su tamao. As, un parmetro formal declarado utilizando la sintaxis
NombreVariable

: array of A

es un parmetro array abierto donde A debe ser un identificador de un tipo (nombre del
tipo) y el parmetro real (actual) debe ser una variable de tipo A o una variable cuyo tipo

function Buscar (var Lista : array of Integer) : Integer;

Restricciones de u s o
Existen restricciones en el uso de parmetros arrays abiertos. Slo puede acceder a ellos
por elementos; no se puede utilizar un parmetro array abierto (sin un ndice) en cualquier lado de un operador de asignacin. Otra restriccin a tener presente es que si la
declaracin de un procedimiento con un parmetro array abierto incluye una llamada a
un procedimiento con ese parmetro, implica que el parmetro en la llamada de este
procedimiento interno ha de ser tambin un parmetro array abierto.
Precaucin

Los parmetros valor de tipo array abierto deben ser evitados, a u n q u e estn permitidos, son
m u y ineficientes y pueden producir fcilmente un error en tiempo de ejecucin de desbord a m i e n t o de la pila.

Ejemplo
{$P+ debe estar incluido al principio del programa}
program
procedure VerArray (var A : array of integer);
{Escribe el contenido de A en la pantalla
Precondicion : A est lleno}

368

Programacin en Turbo/Borland Pascal 7

Introduccin a las estructuras de datos

var
I : Integer;
begin
for I := 0 to High(A) do
Write(A[IJ, '');
end;

function Suma

La unidad System incorpora dos nuevas funciones Low y High que calculan los lmites inferior (valor mnimo) y superior (valor mximo) de rango de un array.
La funcin High devuelve el valor ms alto del rango del argumento. Su sintaxis es:
function High(x);

El tipo de x, o de la variable representada por x, debe ser un tipo ordinal, un tipo


array o un tipo cadena. Para un tipo ordinal High devuelve el valor mayor dentro del
rango del tipo. Para un tipo array High devuelve el valor mayor dentro del rango del tipo
ndice del array, para un tipo cadena, High devuelve el tamao declarado de la cadena.
Para un parmetro cadena o array abierto, High devuelve un valor de tipo Uord, igual al
nmero de elementos del parmetro real menos un elemento. As una funcin Suma que
calcula la suma de una lista de nmeros reales.
(var : array of Real)

: Real;

for i := 0 to High(A) do
S := S + A [i] ;
Suma := S;
end;

es:

: Integer;

for I := Low(A) to High(A) do


S := S + A[i];
Suma := S;
end;

9.15.

Funciones High y Low

function Suma
var
i : Word;
S : Real;
begin
S := 0;

: array of Integer)

var I, S : Integer;
begin
S := 0;

Para determinar los lmites inferior y superior de un array se utilizan las nuevas funciones de Turbo Pascal 7.0 Low y High.

9.14.1.

(const A

369

La funcin Low devuelve el valor ms pequeo del rango del argumento. Su sintaxis

function Low(x);

donde x es un identifcador de tipo o una referencia a una variable. Devuelve x o el ndice de tipo. El tipo x debe ser un tipo ordinal, un tipo array o un tipo cadena. Para un
tipo ordinal, Low devuelve el valor inferior del rango del tipo. Para un tipo array, Low devuelve el valor inferior dentro del rango del ndice del array, y para un tipo cadena, Low
devuelve 0. Para un parmetro cadena o array abierto, Low devuelve 0.
U n ejemplo puede ser la citada funcin Suma con otro planteamiento.

PUESTA A PUNTO DE PROGRAMAS

Tcnicas de programacin
1. Los tipos de componentes de un array pueden ser cualquier tipo predefinido o definido por el usuario. Los tipos de los subndices pueden ser cualquier tipo ordinal
excepto entero.
2. En Pascal el tamao del array debe ser declarado en el momento que se escribe el
programa. Por consiguiente, si el tamao deseado vara de una ejecucin a otra, el
array debe ser declarado del mayor tamao posible.
3. Es buena idea utilizar constantes definidas para uno o los dos lmites de un tipo de
ndice del array. Este sistema permite que el tamao del array pueda ser modificado
cambiando simplemente los valores de las constantes en las declaraciones.
4. A los elementos del array se puede acceder de modo secuencial, con un bucle, o de
modo aleatorio directamente por su ndice.
5. La asignacin de un array a otro requiere que los arrays sean del mismo tipo (A: = B).
6. Los elementos individuales de un array o el array completo pueden ser pasados como
parmetros a procedimientos. En el primer caso el tipo del parmetro formal debe ser
del tipo del componente del array; en el segundo caso debe ser del tipo array.
7. Para utilizar ms eficientemente la memoria se recomiendan como parmetros variables los pmetros formales de las funciones y procedimientos que representan arrays;
es decir, los arrays se pasan como variables. Si se utilizan parmetros valor, se almacenan en memoria dos copias del array.
Errores tpicos de programacin
1. Indices de la declaracin del array fuera de rango o de lmite (error en tiempo de
ejecucin).
2. No inicializar los arrays.
3. Los tipos de dos arrays utilizados en una sentencia de asignacin de arrays deben ser
los mismos.
4. No deben existir inconsistencias de tipos. El tipo del subndice y el tipo del elemento
utilizado en todas las referencias de los arrays deben corresponder a los tipos especificados en la declaracin del array.

370

Programacin en Turbo/Borland Pascal 7

Introduccin a las estructuras de datos

RESUMEN
Todos los tipos de datos descritos hasta ahora se conocen c o m o datos simples o no estructurados.
Esto significa que una variable de u n o de esos tipos puede almacenar solamente un valor. Pascal
tiene diferentes tipos de datos cuyas variables pueden almacenar a la vez diferentes valores. Estos
tipos de datos se conocen como tipos de datos estructurados. Este captulo examina u n o de los
tipos de datos estructurados, el tipo array (lista o vector, tabla).
U n tipo de dato array se describe por el programador. Esta descripcin incluye un rango de
subndices o ndices y u n a base o tipo de datos de los componentes. Se describe cmo declarar un
tipo array y c m o referenciar un elemento individual situando un subndice entre corchetes a
continuacin del n o m b r e del array. El acceso a un elemento del array se realiza a travs del ndice
del array.
E! n m e r o m x i m o de valores que se pueden almacenar en un array se describe por el rango
del ndice del array. Todos los componentes de u n array tienen el m i s m o nombre, pero diferentes
valores de ndice. Los valores almacenados en un array deben ser del m i s m o tipo de datos, el tipo
base, definido c u a n d o se declara el array. El rango del ndice debe ser de un tipo subrango.
Los arrays se pueden pasar entre mdulos de programas, en forma de parmetros, con la
excepcin de que una funcin no puede devolver un array. C u a n d o un array se transmite a un
procedimiento o funcin, el parmetro debe ser declarado de tipo variable (en la cabecera del
subprograma mediante var), incluso aunque la lgica del programa reqiera slo transmitir el array
al mdulo.
La sentencia f o r permite referenciar fcilmente los elementos de un array de m o d o secuencial.
Se pueden utilizar las sentencias f o r para inicializar, leer e imprimir arrays, as c o m o manipular
elementos individuales del array.
El tipo base de un array puede ser otro tipo array. En este caso se dispone de arrays de arrays o
arrays multidimensionales. La dimensin de un arrray es el n m e r o de rangos de ndices del array.
U n array con un rango de ndices es un array unidimensional (lista o vector), y un array con dos
rangos de ndices de un array de dos dimensiones (tabla o matriz), etc.
T u r b o Pascal permite constantes de tipo array.
Se debe considerar el uso de arrays en un programa c u a n d o una gran coleccin de datos
necesita ser almacenado en la memoria de la computadora. Si todos o parte de los datos se tienen
que procesar ms de una vez o si los datos se necesitan almacenar para uso posterior, el uso del
array est totalmente indicado.

repeat
Letra := ReadKey;
Write (Letra);
{ verificacin de letra minuscula }
if Letra in [ ' a ' . . ' z ' ]
then
Tabla [Letra] := Tabla [Letra] + 1
until Letra in ['. 1 ,Chr(13)];
WriteLn;
WriteLn ( ' Estadstica de aparicin de las letras minsculas ' : 65 ) ;
WriteLn (
' : 65) ;
WriteLn;
for Letra := 'a' to 'z' do
Write (Letra : 6, ':',Tabla [Letra] :1, ' ':12 ) ;
WriteLn
end.
2. Se trata de simular un crucigrama de 30 lneas y 40 columnas. Cada casilla se representa por un
elemento de una tabla bidimensional. 1. Rellenar una fila con el carcter
2. Rellenar todo el
crucigrama con blancos.
program Crucigrama;
const
Longitud = 40;
Altura
= 30;
type
Horizontal = 1.. Longitud;
Vertical
= 1.. Altura;
Linea
= array [Horizontal] of char;
Tabla
= array [Vertical] of Linea;
var
Casilla : Tabla;
Rango
: Linea;
X
: Horizontal;
J
: Vertical;
begin
{ Rellenar una fila con asteriscos }
for I:= 1 to Longitud do
Casilla [1,1] := '*'?
for J:= 1 to Altura do
for I:= 1 to Longitud do
Casilla [J,I] := 1 '
end.

PROBLEMAS RESUELTOS
1. Determinar la frecuencia de aparicin de cada letra minscula en un texto tecleado por el
usuario.
program Letras;
uses
Crt;
var
Tabla : array ['a'..'z'] of integer;
Letra : char;
begin
for Letra := 'a' to 'z' do
Tabla [Letra] := 0;
WriteLn ('Teclee un texto terminado en punto o en Intro

371

3.

Escribir uti programa que permita sumar y multiplicar dos matrices ledas del teclado.

Anlisis
1. Dadas las matrices A y B.

372

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7


La matriz producto C es

21

22

{ procedimiento sumar }
procedure Sumar (var SI, S2, S : Matriz; L : integer);
var
I, J : integer;
begin
for I := 1 to L do
for J := 1 to L do
S [I,J] := SI [I,J] + S2 [I,J]
end;

2r

C-

C.x

donde
a,, x bk

C,,= I
2. Dadas las matrices A y B.
a

22

tI

2\

tn

^il

^12

2n

La matriz suma C es

5-

+ m,

m2 + bm2

fl

m +

El clculo de a m b a s matrices, Suma y Producto, se realizar con sendos procedimientos, y


para simplificar los clculos se considerarn cuadrados (igual n m e r o de filas y columnas).
program Matrices;
type
Matriz = array [1..10, 1..10] of real;
var
A, B, Suma, Producto : Matriz;
Longitud
: integer;
procedure LeerMatriz (var M: Matriz; L : integer);
var
I, J :integer;
begin
for I:= 1 to L do
begin
WriteLn ('Introduzca la fila ',1:1);
for J:= 1 to L do
Read ( M [I,J]);
ReadLn
end

end;

373

{ Procedimiento multiplicar >


procedure Multiplicar (var Pl, P2, P*: Matriz; L : integer);
var
I, J, K : integer;
begin
for I:= 1 to L do
for J:= 1 to L do
begin
P [ I , J ] := 0 ;
for K := 1 to L do
P [I,J] := P [I,J] + Pl [I,K] * P2 [K,J]
end
end;
{ visualizar resultados }
procedure Visualizar (var M : Matriz; L : integer);
var
I, J : integer;
begin
for I := 1 to L do
begin
for J := 1 to L do
Write ( M [I,J] : 10 : 4);
WriteLn
end
end;
{programa' principal}
begin '
WriteLn ('Introduzca Numero de filas o columnas de la matriz
cuadrada') ;
ReadLn
(Longitud);
WriteLn ('Introduzca datos de la primera matriz');
LeerMatriz (A, Longitud);
WriteLn ('Introduzca datos de la segunda matriz');
LeerMatriz (B, Longitud);
Sumar (A, B, Suma, Longitud);
{Calculo de la suma}
Multiplicar (A, B, Producto, Longitud);
{Calculo del producto}
{ Salida de resultados }
WriteLn
('La matriz suma es ');

374

Visualizar
WriteLn
Visualizar
end.

Ejecucin

Introduccin a las estructuras de datos

Programacin en Turbo/Borland Pascal 7


(Suma, Longitud);
{ Visualiza matriz suma
('La matriz producto es ');
(Producto, Longitud); { Visualiza matriz product

modelo

a =

1
4
7

2
5
8

3
6
9

b =

10
40
_70

20
50
80

30
60
90_

Introduzca Nmero de filas o columnas de la matriz cuadrada


3
Introduzca datos de la primera matriz
Introduzca la fila 1
12 3
Introduzca la fila 2
4 5 6
"~'~
Introduzca la fila 3
7 8 9
Introduzca datos de la segunda matriz
Introduzca la fila 1
3 5 2
Introduzca la fila 2
5 7 4
Introduzca la fila 3
7 6 8
La matriz suma es
4.0000
7.0000
5.0000
9.0000
12.0000
10.0000
14.0000
14.0000
17.0000
La matriz producto es
34.0000
37.0000
34.0000
79.0000
91.0000
76.0000
124.0000
145.0000
118.0000

EJERCICIOS
1. Cul es el error del fragmento del siguiente programa?
type
Lista = array [1..8] of integer;
var
X : Lista;
J : integer;
begin
for J := 1 to 9 do
X [J] := J

end.

375

2. Cul es el error del siguiente programa?


type
Lista = array [char] of real;
var
X : Lista;
J : integer;
begin
J := 1;
X [J] := 14.325
end.
Para los ejercicios 3 a 9 suponga las declaraciones:
var
I, J, K
: integer;
Primero, Segundo : array [1..20] of integer;
Tercero
: array [1..5, 1..12] of integer;
Determinar la salida de cada segmento de programa (en los casos que se necesite se indica
debajo el archivo de datos de entrada correspondiente).
3. for I := 1 to 6 do
Read (Primero [I]);
for I := 3 dovmto 1 do
Write (Primero [2 * I] :4);
3

-1

4. Read (K);
for I := 3 to K do
Read ( Segundo [I]);
J := 4;
WriteLn (Segundo [K], Segundo [J +1])
6

5. for I : = 1 to 10 do
Primero [I] := I + 3;
Read (J,K);
for I := J to K do
WriteLn (Primero[I]);
7

6. for I := 1 to 12 do
Read (Primero [I]);
for J := 1 to 6 do
Segundo [J] := Primero [2 * J] + J;
for K := 3 to 7 do
WriteLn (Primero [K + 1], Segundo [K -1]);
2
6

7
-5

4
0

9
5

-4
-8

376

Introduccin a las estructuras de datos

Programacin en Turbo/Borlarid Pascal 7


11. D a d o el array

7. for J := 1 to 7 do
Read (Primero [J]);

I := 1;

J := 2;
while (J <= 6) and (Primero [J-l] < Primero[J]) do
begin
I := I + 1;
J := J + 1
end;
for K := 1 to I + 2
WriteLn (Primero [K]);
20

60

70

10

40

30

90

8. for I := to 4 do
begin
Read (Tercero [I, J]);
Write (Tercero [I, J] : 5);
end
WriteLn
end
4
0

6
9

8
1

4
7 - 5 4
9
0
3
-2
6
-2
1 2
4
1 1
6
1
0
3 - 4
escribir un programa que encuentre la s u m a de todos los elementos que no pertenecen a la
diagonal principal.
12. Escribir un procedimiento que intercambie la fila -sima por la y'-sima de un array mxn.

PROBLEMAS
1. Escribir un programa que convierta un n m e r o r o m a n o (en forma de cadena de caracteres) en
n m e r o arbigo.
Reglas de conversin
M
D
C
L
X
V

1000
500
100
50
10
5

1
9. for I := 1 to 3 do
for J := 1 to 12 do
Tercero [X, J] := I * J + l;
for I := 1 to 3 do
begin
J := 3;
while J <= 11 do
begin
WriteLn (I, J, Tercero [I, J]);
J := J + 3
end
end;
10. Escribir un programa que lea el array
4
2
3

7
1 3
0
6
9
1 2
6

5
7
4

y lo escriba c o m o
4
7
1
3
5

2
0
6
9
7

3
1
2
6
4

377

2. Escribir un programa que permita visualizar el tringulo de Pascal:

1
1
1
1
i

1
4
5

1
3

1
2

1
3

6
10
15

1
4

10
20

1
5

15

1
6

En el tringulo de Pascal cada n m e r o es la s u m a de los dos nmeros situados encima de l.


Este problema se debe resolver utilizando un array de una sola dimensin.
3. Escribir un procedimiento que invierta el contenido de n nmeros enteros. El primero se
vuelve el ltimo; el segundo, el penltimo, etc.
4. Escribir un procedimiento al cual se le proporcione una fecha (da, mes, ao), as c o m o un
n m e r o de das a aadir a esta fecha. El procedimiento calcula la nueva fecha y se visualiza.
5. U n n m e r o entero es primo si ningn n m e r o p r i m o m s pequeo que l es divisor suyo. A
continuacin escribir un programa que rellene u n a tabla con los 80 primeros nmeros primos
y los visualice.
6. Escribir un programa que visualice un cuadrado mgico de orden impar n comprendido entre
3 y 11; el usuario debe elegir el valor de n. U n cuadrado mgico se c o m p o n e de nmeros

378

Programacin en Turbo/Borland Pascal 7

Introduccin

enteros comprendidos entre 1 y n. La suma de los nmeros que figuran en cada fila, columna
y diagonal son iguales.
Ejemplo
8
3
4

1
5
9

6
7
2

Un mtodo de generacin consiste en situar el nmero 1 en el centro de la primera fila; el


nmero siguiente en la casilla situada por encima y a la derecha, y as sucesivamente. El
cuadrado es cclico: la lnea encima de la primera es, de hecho, la ltima y la columna a
derecha de la ltima es la primera. En el caso de que el nmero generado caiga en una casilla
ocupada, se elige la casilla situada encima del nmero que acaba de ser situado.
7. El juego del ahorcado se juega con dos personas (o una persona y una computadora). Un
jugador selecciona una palabra y el otro jugador trata de adivinar la palabra adivinando letras
individuales. Disear un programa para jugar al ahorcado. Sugerencia: Almacenar una lista de
palabras en un array y seleccionar palabras aleatoriamente.
8. Escribir un programa que lea las dimensiones de una matriz, lea y visualice la matriz y a
continuacin encuentre el mayor y menor elemento de la matriz y sus posiciones.
9. Si x representa la media de los nmeros tp x2,. . ., xn, entonces la varianza es la media de los
cuadrados de las desviaciones de los nmeros de la media
1

"

varianza = Z (x - x)2
n -i
y la desviacin estndar es la raz cuadrada de la varianza. Escribir un programa que lea una
lista de nmeros reales, los cuente y a continuacin calcule e imprima su media, varianza y
desviacin estndar. Utilizar funciones para calcular la media, varianza y desviacin estndar.
10. Una matriz cuadrada A se dice que es simtrica si A(i,J) = A(j,i) para todo i, j dentro de los
lmites de la matriz. Escribir un procedimiento que decida si una matriz dada es o no simtrica.
11. Escribir un procedimiento que acepte como parmetro un vector que puede contener elementos duplicados. El procedimiento debe sustituir cada valor repetido por - 5 y devolver al punto
donde fue llamado el vector modificado y el nmero de entradas modificadas.
12. Los resultados de las ltimas elecciones a alcalde en el pueblo x han sido los siguientes:
Distrito
1
2
3
4
5

Candidato

Candidato

Candidato

194
180
221
432
820

48
20
90
50
61

206
320
140
821
946

45
16
20
14
18

Candidato

a las estructuras de datos

379

Escribir un programa que haga las siguientes tareas:


a) Imprimir la tabla anterior con cabeceras incluidas.
b) Calcular e imprimir el nmero total de votos recibidos por cada candidato y el porcentaje
del total de votos emitidos. Asimismo, visualizar el candidato ms votado.
c) Si algn candidato recibe ms del 50 por 100 de los datos, el programa imprimir un
mensaje declarndolo ganador.
d) Si ningn candidato recibe ms del 50 por 100 de los datos, el programa debe imprimir el
nombre de los dos candidatos ms votados, que sern los que pasen a la segunda ronda de
las elecciones.
13. Escribir un programa que lea una coleccin de cadenas de caracteres de longitud arbitraria.
Por cada cadena leda, su programa har lo siguiente:
a) Imprimir la longitud de la cadena.
b) Contar el nmero de ocurrencia de palabras de cuatro letras.
c) Sustituir cada palabra de cuatro letras por una cadena de cuatro asteriscos e imprimir la
nueva cadena.
14. Una agencia de venta de vehculos automviles distribuye quince modelos diferentes y tiene
en su plantilla diez vendedores. Se desea un programa que escriba un informe mensual de las
ventas por vendedor y modelo, as como el nmero de automviles vendidos por cada vendedor y el nmero total de cada modelo vendido por todos los vendedores. Asimismo, para
entregar el premio al mejor vendedor, necesita saber cul es el vendedor que ms coches ha
vendido.

modelo
vendedor
1
2
3

4
12
15

8
4
3

1
25
4

15
4
14
7

10
15. En un tablero de ajedrez la reina puede atacar cualquier pieza que est en la misma fila,
columna o diagonal que la reina. El problema de las n reinas es posicionar n reinas en un
tablero n x n, de modo que ninguna reina pueda atacar a ninguna otra. Escribir un programa
que solucione este problema para un valor dado de n.

Tratamiento de cadenas de caracteres

381

de dato string que almacena informacin 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 mxima de la cadena de caracteres entre corchetes.

10.11.1.

TRATAMIENTO DE CADENAS
DE CARACTERES

Las variables de cadena se declaran como las de cualquier otro tipo en la seccin var o
en type.

Declaracin en var
var
Mensaje
Nombre
Ciudad
Estado

CONTENIDO
10.1.
10.2.
10.3.
10.4.
10.5.
10.6.
10.7.
10.8.
10.9.

Concepto de cadena de caracteres (string)


Longitud de una cadena
Operaciones entre cadenas
Procedimientos y funciones de cadena internos
Otras propiedades de las cadenas
Parmetros array abierto de tipo char
Parmetros cadena abierta
Cadenas terminadas en nulo
La unidad String: funciones

10.1.

CONCEPTO DE CADENA DE CARACTERES (STRING)

type
Cadena80
Cadena40
Cadena30
Cadena7
var
Mensaje
Nombre
Ciudad
Estado

Mensaje
Nombre
Ciudad
Estado

=
=
=
=

string [80]
string [40]
string [30]
string [7];

Cadena80
Cadena40
Cadena30
Cadena7

'Hola forastero, yo que tu no lo haria';


'Mortimer y Cazorla';
1
Cazorla';
'Espaa 1 ;

El contenido de una cadena de caracteres se debe encerrar entre apstrofos. Si se desea que figure un apstrofo en una cadena de caracteres, es preciso doblarlo en la cadena.
En los procedimientos de Entrada/Salida resultara

RETURN para continuar", "Calculando...", "Proceso terminado", etc. Pascal estndar tiene

oon

[80]
[40]
[30]
[70]

Una vez que estn declaradas las variables de cadenas se pueden realizar asignaciones o
bien operaciones de lectura/escritura en los programas.

Pascal, como cualquier otro lenguaje, debe tener capacidad de procesar frases como "Pul se
pocas cualidades para procesar frases; sin embargo, Turbo Pascal tiene no slo las propiedades del estndar, sino muchas otras, que lo hacen idneo para este tipo de procesos.
Entre los tipos de datos que se han estudiado en el Captulo 3, figuran los datos tipo
char y string que permiten la manipulacin de datos no numricos.
Una cadena de caracteres (string) es una serie de caracteres cuya longitud (nmero
de caracteres que contiene) puede variar de 1 a 255 caracteres. Turbo Pascal tiene el tipo

string
string
string
string

Declaracin en type

RESUMEN
EJERCICIOS
PROBLEMAS
ISO Pascal estndar carece casi totalmente de posibilidades para tratamiento de cadenas. Por el contrario. Turbo Pascal posee caractersticas avanzadas para una manipulacin de cadenas. Existe un tipo
de datos string. Una variable string es realmente un array de caracteres con un contador conectado al mismo que contiene el nmero
de caracteres que han sido cargados en el array.
Turbo Pascal incorpora un conjunto de procedimientos y funciones que manipulan directamente cadenas, adems de disponer del
operador de concatenacin (+) y la posibilidad de comparar cadena's
de operadores de relacin.

Declaracin de una variable tipo cadena ( s t r i n g )

10.2.

ReadLn

(nombre);

WriteLn

( ' V u e s t r o nombre e s ' ,

Nombre);

LONGITUD DE UNA CADENA

Una cadena fsicamente es una estructura tipo array de caracteres con ndice 0 a longitud fsica (vase Captulo 9). Una variable de cadena puede tener de 0 a 255 caracteres

382

Programacin en Turbo/Borland Pascal 7

Tratamiento de cadenas de caracteres

de longitud. Sin embargo, la ocupacin en memoria de una cadena es un nmero de


bytes igual al de caracteres de la cadena ms uno. As la cadena

383

var
nombre: s t r i n g [ 2 5 ] ;

'Mortimer'

tiene una longitud de 8 bytes, pero ocupa 9 bytes. Esto se debe a que el primer byte en
una cadena contiene la longitud de la cadena actualmente almacenada en memoria. As,
en el caso de la declaracin

nombre:= 'Mortadelo y ' ;

11

var

nombre: s t r i n g [ 1 0 ]

longitud lgica 11

si la variable nombre contiene 'Mortimer', ocupar en memoria 9 bytes (8 bytes, uno por
letra, ms uno para la longitud).
Nmero de byte

0 1

longitud fsica 25

elemento 0 de la cadena
representa la longitud lgica
actual de la cadena

Figura 1 0 . 1 .

longitud de la cadena

Obsrvese que el primer byte no es el carcter "8" sino el nmero 8 en binario


(0000 1000) y los ltimos bytes de la cadena hasta 10 (9,10) contienen datos aleatorios.
Una cadena en Turbo Pascal tiene dos longitudes: longitud fsica y longitud lgica.
La longitud fsica es la cantidad de memoria que la cadena ocupa realmente. Esta longitud se establece en tiempo de compilacin y nunca cambia. La longitud lgica es el
nmero de caracteres actualmente almacenados en la cadena; este dato puede cambiar
durante el tratamiento de la cadena. La longitud lgica (que a partir de ahora denominaremos longitud) se almacena como parte de la propia cadena y se puede leer de diferentes formas. Si nombre se declara del modo siguiente:
var
nombre: s t r i n g [ 2 5 ]

y se le asigna la cadena 'Ada'


nombre = ' A d a 1 ;

entonces ia longitud fsica vale 25 y la longitud lgica vale 3. La Figura 10.1 representa
la estructura de una cadena.
A las cadenas se puede acceder como si de hecho fueran arrays de caracteres. Se puede
referenciar cualquier carcter de la cadena incluyendo el byte de longitud como en un
array normal.

cadena

'Mortimer'

cadena[5]

equivale

al carcter

: string [20];
: integer;
: char;

'Pantagruel 1 ;

MiCadena

:=

CarS
CarExt

:= Ord (MiCadena
:= M i C a d e n a [6]

[0]);

Aunque en tiempo de ejecucin Turbo Pascal trata al byte de longitud como un nmero, es un elemento de un array de tipo char y por consiguiente no puede ser asignado
directamente al tipo byte o integer. Para asignar el byte de longitud a una variable numrica, debe utilizar la funcin ord, que es el medio para transferir un valor carcter a
un valor numrico. Sin embargo, es ms fcil recurrir a las funciones y procedimientos
predefinidos de Turbo Pascal; por ejemplo la funcin length.
CarS

:= length

(MiCadena);

(Cars es igual a 8}

En la versin 4.0 de Turbo Pascal (no en las versiones posteriores), length tiene la
propiedad de ser funcin reversible: se puede establecer la longitud de una cadena situando la funcin length en el lado izquierdo del operador de asignacin:
length

Para acceder a los diferentes caracteres de una cadena se debe indicar entie corchetes la posiuon del carcter deseado

:=

var
MiCadena
CarS
CarExt

Representacin de una cadena de caracteres.

(MiCadena):=6;

esta sentencia establece la longitud lgica de la cadena a seis caracteres con independencia de lo que contena antes.

Tratamiento de cadenas de caracteres

385

Programacin en Turbo/Borland Pascal 7

384

10.2.1.

10.2.4.

Asignacin de cadenas

A las variables de cadena, como se ha visto, se pueden dar valores con u n a sentencia de
asignacin o con una sentencia de lectura (read). A m b a s situaciones se p u e d e n describir
con la ecuacin
destino <- fuente

donde destino es la cadena a la que se da un valor y fuente es la expresin de cadena que


contiene el correspondiente valor. Esta ecuacin acta como la sentencia de asignacin
que evala la cadena fuente y se almacena en la variable de cadena destino.
Dependiendo del tamao (longitud de la cadena) de las cadenas fuente y destino se
pueden presentar tres casos diferentes que analizaremos a partir de la siguiente declaracin de variables de cadena.
var
Cadl
Cad2
Cad3
Cad4

10.2.2.

:
:
:
:

string
string
string
string

Las longitudes de la cadena destino y fuente s o n iguales

Supongamos que se ejecuta la sentencia


cad2:=

Supongamos que se trata de ejecutar ahora


c a d l : = cad2

En este caso, como cadl 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 cadl los ocho caracteres ms a la izquierda de cad2. Es decir, los ocho caracteres ms
a la izquierda de cad2. Es decir,
cadl

10.3.

[8];
[11];
[15];
[11]

La longitud de la cadena destino


e s menor que la cadena fuente

i n f o r ma t
1 2 3 4 5 6 7 8

OPERACIONES ENTRE CADENAS

Las operaciones bsicas entre cadenas son: asignacin, comparacin y concatenacin. Es


posible asignar una cadena a otra cadena, incluso aunque esta ltima sea de longitud
fsica ms pequea. En este caso no se produce ningn error en tiempo de compilacin
ni en tiempo de ejecucin. Se producir un truncamiento de los datos de la cadena mayor a la longitud fsica mxima de la cadena ms pequea.
var
Cadl

'informtica'

longitud actual = 6
longitud mxima = 11

: string

[15];

Este caso no presenta problemas ya que cada posicin de cad2 se rellena con un carcter
cad2

i n f o r m a t i c
a
1 2 3 4 5 6 7 8 9 10 11

Cadl

Este mismo caso sucede si se ejecuta la sentencia

como ambas cadenas tienen igual longitud, cad4 contiene ahora la cadena 'informtita'.

La longitud de la cadena destino


e s mayor que la cadena fuente

Supongamos que ahora se ejecuta la sentencia


c a d 3 : = cad2

Resultar que cad3 tiene 15 caracteres y slo hay 11 caracteres en cad2. Qu sucede con
las posiciones adicionales? La cadena cad3 seguir teniendo una longitud mxima de 15
caracteres, pero slo se almacenan en ella ahora 11 caracteres y su longitud actual ser 11.
cad3

i n f o r m a t i c
a
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

'Hola Margarita, c o m o e s t a s ? '

Se asignar a cadl la cadena 'Hola Margarita c\


Las comparaciones de las cadenas de caracteres se hacen segn el orden de los caracteres en el cdigo ASCII y con los operadores de relacin.

c a d 4 : = cad2

10.2.3.

:=

longitud actual = 11
longitud mxima = 15

'0' < '1'


'A' < ' B '
'a' < 'h'

'1' < '2'


'C' < ' 0 '
'm' > ' b 1

'8' < '9'


*M' > 'B'
'p' < ' r '

Otra operacin bsica que se puede realizar con cadenas es la concatenacin. La operacin de concatenacin es el proceso de combinar dos o ms cadenas en una sola cadena. Turbo Pascal proporciona dos mtodos independientes para ejecutar esta operacin: el operador concatenacin (+) y la funcin concat. La concatenacin
' S i e r r a de ' + ' C a z o r l a '

produce una cadena


' S i e r r a de C a z o r l a '

Tratamiento de cadenas de caracteres


386

387

Programacin en Turbo/Borland Pascal 7

Formato

y de modo similar

Concat ( S i , S2,

C a d e n a G r a n d e : = C a d e n a l + Cadena2 + Cadena3 + Cadena4;

aunque en este caso CadenaGrande debe ser lo suficientemente grande para contener a
las cuatro cadenas; en caso contrario, si la longitud total de las cuatro cadenas fuente es
mayor que la longitud de la cadena destino, todos los datos que no quepan en la cadena
destino se truncan y se ignoran.

S1.S2,...

Sr)

cadenas o variables de caracteres (expresin tipo cadena)

Si la cadena resultante es mayor que 255 caracteres, se truncan los caracteres despus
del 255.
Ejemplo s

Reglas de comparacin de cadenas

1.

begin
Cadl
Cad2
Cad
2.

Ejemplos
{debido a que 'a' < '0'}
{ 'polo' tiene menos caracteres que 'polonio'
{ 'M' < 'm'}
{ 'M' < 'm'}
{ya que (blanco) < 7'}

var
Cadl, C a d 2 , Cad

Las dos cadenas se comparan de izquierda a derecha hasta que se encuentran dos caracteres
diferentes. El orden de las dos cadenas es el que corresponde al orden de los dos caracteres
diferentes. Si las dos cadenas son las mismas pero una de ellas es ms corta que la otra, entonces la ms corta es menor que la ms larga.

< 'bobo'
'baby'
< 'polonio'
'polo'
< 'raaria'
'MARIA'
< 'iriaria'
'Mari a '
'El T i g r e ' < ' E l i W a l l a c h '

3.

var
Cad

: s t r i n g [40];

:= 'Programa';
:= 'de c o m p u t a d o r a 1 ;
:= Concat (Cadl, C a d 2 ) ;

: string

[20];

begin
Cad

: Concat

('abcd',

Cad2

:= C o n c a t

(Cadl,

'efgh');

'Sirius');

produce una cadena cad2 igual a 'Programa Sirius'

10.4.2,

Funcin Length (longitud)

La funcin Length proporciona la longitud lgica de una cadena de caracteres y devuelve

10.4.

PROCEDIMIENTOS Y FUNCIONES DE CADENA INTERNOS

un valor entero.
Formato

Turbo Pascal incorpora, adems de las funciones vistas en captulos anteriores, una serie
de procedimientos y funciones que proporcionan una gran potencia a la hora del tratamiento de cadenas. La Tabla 10.1 recoge los procedimientos y funciones internos.

Length (s)

10.4.1.

Funcin C o n c a t

expresin tipo cadena

Ejemplo
Length ( ' e s t o e s una p r u e b a 1 )
Length('1)

Adems del uso de


para concatenacin, Turbo Pascal tiene la funcin concat que
permite concatenar una secuencia de cadenas.

proporciona
proporciona

el valor 16
cero ( c a d e n a vaca)

Nota
Tabla 10.1.

Procedimientos y funciones de cadena

Procedimiento
Delete
Insert
Str
Val

Funcin
Concat
Copy
Length
Pos

F\istc otro mtodo para acceder a la longitud de una vai able de tipo string.
Como se ha comentado anteriormente, la piimera posicin de la variable de cadena contiene la longitud actual de la cadena. Por consiguiente, la funcin ord(o) devuelve ,a lonwtud de la cadena. En el coso de la variable cadl
longitudi= Ord(cadl[o]);

'

'

Tratamiento de cadenas de caracteres

Programacin en Turbo/Borland Pascal 7

388

389

Ejemplo

Ejemplo 10.1
El procedimiento Maysculas acepta un parmetro tipo cadena y lo devuelve con todas
las letras minsculas cambiadas a las correspondientes maysculas.
procedure M a y s c u l a s (var M i c a d e n a : string);
var
I : integer;
begin
for I := 1 to Length (Micadena) d o
MiCadena [I] := UpCase (MiCadena [I])
end;

1.

cadl:=

'computer'

delete(cadl ,4,6)
2.

cadl:=

'computer'

delete(cadl,4,3)

10.4.4.

proporciona la cadena "com"ya que slo se pueden borrar 5


caracteres
proporciona la cadena comer y se borran los caracteres p, u, t

El procedimiento Insertar ( i n s e r t )

Insert inserta una subcadena en una cadena.


La funcin UpCase convierte una letra minscula en mayscula.

Formato

La funcin longitud reversible


insert (cadl ,s,posicin)

En la versin Turbo Pascal 4.0, la funcin Length tiene una propiedad notable. Puede
situarse en el lado izquierdo en una sentencia de asignacin y de este modo fijar la longitud de una cadena en lugar de leer dicha longitud. En el ejemplo

cadl

posicin

Length (MiCadena) : = 20;

MiCadena se establece a la longitud 20 con independencia del contenido de MiCadena.

Cualquier carcter detrs del 20 se truncar.

cadena a insertar
cadena donde se inserta
carcter a partir del cual se inserta

Ejemplos
S:= ' J o s R o d r i g u e z ' ;

I n s e r t ('Garcia ' , 5 , 6 ) ;

10,4.3.

El p r o c e d i m i e n t o D e l e t e

Delete borra o elimina una subcadena de una cadena. Una subcadena es una cadena
contenida en otra cadena de mayor longitud.
'Hola'

es una subcadena

de

'Hola Pepe'

Delete, en esencia, borra uno o varios caracteres de una cadena a partir de una posicin dada.
Formato

Al insertar texto en una cadena y resulten ms caracteres de los que pueda contener, se
trunca la cadena a su longitud mxima.
Ejemplos
var
Frasel, Prueba

begin
Frasel
Delete (s, posicin,

s
posicin
nmero

nmero)

cadena original o fuente


expresin entera que indica la posicin del primer carcter a suprimir
cantidad de carcter a suprimir (expresin entera)

produce la cadena 'Jos Garca Rodrguez'

:=

: string

[18];

'Yo soy un c o n s e r v a d o r ' ;

Prueba := 'liberal';
Insert (Prueba, Frasel,11);
WriteLn (Frasel);

se imprime
Yo soy un librale

Si posicin es mayor que la longitud de la cadena, no se borra ningn carcter. Si nmero especifica ms caracteres que los existentes desde la posicin inicial hasta el final
de la cadena, slo se borran tantos caracteres como estn en la cadena.

la palabra conservador no se escribe ya que Frasel est definido con 18 caracteres de


longitud, y se ha truncado (perdido) 'conservador'.

Programacin en Turbo/Borland Pascal 7

390

10.4.5.

Tratamiento de cadenas de caracteres

Funcin Posicin (Pos)

10.4.6.

Esta funcin permite determinar si una cadena est contenida en otra. En este caso, la
funcin devuelve la posicin donde comienza la cadena buscada en la cadena fuente. Si
la cadena no existe, se devuelve el resultado 0.

391

La funcin Copiar (Copy)

Esta funcin devuelve una cadena de caracteres (subcadena) extrada de una cadena.
Formato

Formato

Copy (s,posicin,nmero)
Pos (cadena buscada, cadena fuente)

s
posicin
nmero

Ejemplo

Si posicin es mayor que la longitud de S, se devuelve una cadena vacia; si nmero especifica ms caracteres que los indicados desde posicin, slo se devuelve el resto de la
cadena.

Ch := 'uno dos tres cuatro cinco';


W r i t e l n (Pos ('tres', Ch));
W r i t e l n (Pos ('seis', Ch));

Ejemplos

Al ejecutarse estas sentencias se visualiza


9
0

expresin tipo cadena (fuente)


primer carcter a extraer (tipo entero)
total de caracteres a extraer (tipo entero)

Ch
:= 'Esto es una cadena m u y
Ch2 := Copy (Ch, 1, 18);
Write (Ch2)

posicin de t
no existe la cadena seis

larga';

produce la cadena de caracteres 'Esto es una cadena'.

Ejemplo

Ejemplo 1 0 . 2

var
Cadl

string

Cad2
Cad3

[11];

Disear una funcin que acepte una cadena que contenga el nombre de un archivo y devuelva una cadena que contenga la extensin del archivo ('Demo.Pas': Demo,nombre;
Pas,extensin).

string [15];
string [1];
integer;

J,K,M,N,P
Cadl
Cad2
Cad3

:= 'Mississippi';
:= 'anticipacin';
:= 'M';

J
K
P
M
Cad3

:=
:=
:=
:=
:=

function O b t e n e r E x t e n s i o n

Pos (Cad3, Cadl)


Pos ('i', Cadl)
Pos ('si', Cadl)
Pos ('ar', Cad2)
'e'

N
:= Pos (Cad3, Cadl);
W r i t e L n ('j=', J, 'k=', K,'

P , 'm=

M) ,

La salida producir
j=l

: string)

: string;

then
ObtenerExtension

:=

el se
ObtenerExtension

:= C o p y

''
(Nombre, P o s i c i o n P u n t o ,
(Lengt(Nombre) P o s i c i o n P u n t o ) + 1)

end;

k=2 p=4

m=8

n=0

Nota:

I a v c n l i c a c i o n de

(Nombre

var
PosicionPunto : integer;
begin
PosicionPunto := P o s ( ' . ' , N o m b r e ) ;
if P o s i c i o n P u n t o = 0

resultados se dcian c o m o ejercicio al lectoi

ObtenerExtension verifica primero a ver si existe, de hecho, un punto en Nombre (puede no


existir extensin ya que es opcional en DOS). Si no existe punto, no existe extensin y a
ObtenerExtension se le asigna la cadena nula. Si existe un punto, Copy se utiliza para asignar a ObtenerExtension todos los caracteres desde el punto hasta el final de la cadena.
La expresin
(Length(Nombre)-PosicionPunto)+l

392

Programacin en Turbo/Borland Pascal 7

Tratamiento de cadenas de caracteres

se necesita para calcular la extensin que puede tener 1, 2 o 3 caracteres adems del punto
que no se considera.

10.4.7.

Ejemplos
Ch := ' 2 3 . 7 ' ;
Val (Ch, Nombre, Codigo);
i f Codigo = 0
then WriteLn (Nombre, 1 ', Codigo)
e l s e WriteLn (Codigo)

Procedimientos de conversin: nmeros/cadenas

Recordemos que un nmero y su cadena equivalente no son intercambiables. En otras


palabras, el entero 65 y la cadena '65' son dos datos diferentes.
Turbo Pascal incorpora dos procedimientos (Str y Val) que permiten convertir datos
numricos a datos tipo cadena y viceversa.

393

el resultado de la ejecucin de estas instrucciones es


23.7

Str
Este procedimiento efecta la conversin de un valor numrico en una cadena.

por el contrario, si se sustituye ch por


Ch := ' 2 3 x . 7 '

Formato

la ejecucin producir la visualizacin de 3 (posicin del carcter x).


str (valor,s)
valor
s

Reglas

expresin numrica
cadena

Para que las conversiones numricas sean vlidas, una cadena debe cumplir estas condicio-

Ejemplos

1. Debe contener un nmero entero, real o en notacin cientfica.


2 No debe contener blancos, caracteres alfabticos u otros no utilizados en representacin numrica. K, de notacin cientfica, es una excepcin.

Numero := 486.45;
Str (Numero/ Ch);
W r i t e L n (Ch);

'43'
'-3.42'

el resultado de estas tres instrucciones es la cadena de caracteres '486.4'.


N := 12345;
s t r (N, c a d l ) ;
s t r (N: 7, cadena);
s t r (N + 1000: 10, Cad2)
s t r ( 4 . 3 , s)

en cadl se almacena
en cadena se almacena
en cad2 se almacena
en s se almacena

'12345'
'12345'
'12345'
' 4.3000000000E+00

Val
Este procedimiento convierte una cadena de caracteres en variable numrica. Para que
esta conversin sea efectiva, el contenido de la cadena de caracteres debe corresponderse
a las reglas de escritura de nmeros: ningn blanco debe existir en primera o en ltima
posicin.

10.4.8.

valido
valido

'4x3'
' -3.42'

Funcin de conversin a maysculas ( U p c a s e )

Turbo Pascal tiene una funcin de cadena interna, denominada Upcase, que permite
cambiar letras minsculas a maysculas. La funcin Upcase toma un argumento de tipo
char y devuelve la correspondiente equivalencia en maysculas de la expresin. Si la expresin ya est en maysculas o no tiene ningn carcter mayscula equivalente (nmeros, smbolos, etc.), se devuelve el carcter sin modificar.
Formato
Upcase (j)

Formato

val (S, variable,cdigo)


variable
cdigo

cadena equivalente numrica de tipo entero o real


si la conversin ha podido ser efectuada, toma el valor cero; en caso contraro contiene la posicin del primer carcter de la cadena S que impide la
conversin y en ese caso variable no queda definida

no valido
no \alido

expresin de tipo char

Ejemplo
Upcase (' a')
Upcase (' n')
Upcase (' N')

devuelve
devuelve
devuelve

'A'
TV'
TV'

Programacin en Turbo/Borland Pascal 7

394

Aplicacin
Esta funcin es til para verificar o comprobar respuestas que requieran la pulsacin de
una tecla y no diferenciar si es mayscula o minscula. Por ejemplo, la siguiente expresin lgica ser verdadera cuando el valor del carcter Resp sea
o bien "N\

Tratamiento de cadenas de caracteres

var
Direccin
Letra

OTRAS PROPIEDADES DE LAS CADENAS

Adems de las ya analizadas propiedades fundamentales de los datos tipo string (cadenas) se pueden considerar una serie de caractersticas complementarias que es necesario
tener presentes a la hora de realizar una buena programacin de las cadenas. Algunas
caractersticas ya han sido tratadas anteriormente, pero se vuelven a analizar para reforzar su importancia en el tratamiento de cadena.

[30];

Readln (Letra);
D i r e c c i n := Letra;

Upcase ( R e s p ) = ' N '

10.5.

: string
: char;

Por el contrario, la asignacin de una cadena de caracteres, incluso de longitud 0 o 1,


a una variable de tipo carcter no est autorizada. La siguiente asignacin no es vlida.
var
Direccin
Letra

: string
: char;

Cadena nula o vaca.

Direccin

:=

Compatibilidad de datos tipo char y string.


Acceso a posiciones individuales en una cadena.
Arrays de datos tipo char.

Letra

:= D i r e c c i n

10.5.1.

Cadena nula o vaca

Una cadena puede tener longitud cero, es decir, no contiene ningn valor. En este caso
se denominara cadena vaca o nula. La cadena nula se representa con dos comillas juntas (").

395

[30];

41;
{ a s i g n a c i n no valida }

Otros ejemplos son


var
CadVar
DosCadenas
Letra

DosCadenas

Ejemplo

Letra
CadVar
Letra

i f cad ="

: string
: string
: char;

=
=

[15]
[2];

'bm';
' i';

= Concat

(Letra, D o s C a d e n a s )

= DosCadenas

[2]

then WriteLn ( ' l a c a d e n a cad no c o n t i e n e n a d a 1 )

Aplicaciones
La cadena vaca se suele utilizar para inicializar variables de tipo string y asegurarse de
que no contiene un valor no deseado. Esta operacin se realiza normalmente cuando no
se le asigna un valor inicial a dichas variables mediante la sentencia de asignacin o sentencia read.

10.5.2.

Compatibilidad d e c h a r y s t r i n g

Los caracteres [char) y cadenas (string) no son totalmente compatibles. En particular, si


la asignacin de un carcter a una cadena de caracteres es posible, la cadena tendr entonces una longitud de 1.

La cadena de la funcin concat es 'ibm', que se asigna a la variable cadvar. La sentencia


siguiente a concat asigna el carcter dos ('m') de doscadenas a la variable letra de tipo
char. El resultado es
Cadvar:='ibm'
Letra :='m'

10.5.3.

A c c e s o a posiciones individuales en una cadena

Como ya se ha comentado, una variable de cadena es un array, por consiguiente se puede


acceder a sus elementos individuales. Por ejemplo,
Cad:='Flanagan'

396

Tratamiento de cadenas de caracteres

Programacin en Turbo/Borland Pascal 7

10.5.4.

Los caracteres individuales son:


Cad [ 1 ]
Cad[2]
Cad [3]

F
1
a

Estos valores se pueden: 1) imprimir, utilizando sentencias write, 2) asignar a variables de tipo char o string; 3) utilizar en funciones y procedimientos de cadena.

Cadl, Cad2, Cad3, Cad


Cadl
Cadl [2]
Cad2
Cad2 [4]
Cad3

: string

Ejemplos
const
Frase =

[12]

Cadl
Cad2
Cad2[0]
Cad2
Cadl[01

'Marta';

type
Caracteres = array
var
CadFija, CadCar

'madrid'
Cadl [1]
Cadl [2]

CadVar

: string

[1..S] of char;

: Caracteres;
[10]

CadCar
:= 'parta';
CadFija := Frase;
if CadCar > C a d F i j a
t h e n W r i t e L n ('CadCar es m a y o r ' ) ;
CadVar
:= lis;
CadVar
:= Concat (CadVar, C a d C a r ) ;

Despus de ejecutar estas sentencias, cadl contiene "barco', cad2 'madrid' y cad3 '0'.
Esta caracterstica permite cambiar la longitud de una variable de cadena durante la
ejecucin de un programa, mediante la asignacin de un nuevo valor a la posicin 0, que
sabemos contiene la longitud de la cadena.
Esta asignacin se puede hacer por asignacin de la posicin 0 de otra cadena como
un valor carcter (ya que as se almacena, no es recomendable este mtodo).
var
Cadl
Cad2

Array de datos tipo c h a r

Como ya se ha comentado, una variable de tipo string tiene semejanza con un array.
especialmente en su capacidad para acceder a caracteres individuales de la variable de
cadena. De igual forma, un array de objetos de tipo char se puede tratar como una cadena de longitud constante. Sin embargo, no se puede asignar una variable o una expresin de tipo string a un array de caracteres tipo char.

'barco';
' 0 '

397

CadVar
CadVar

:= flores;
:= CadCar;

Seguimiento del programa anterior:


string
string

[12]
[5] ;

= 'tenis';
= 'frontenis';
= Cadl[ 0 ] ' ;
= 'frontontenis'
= Cad2[01;

1.
2.
{
{
{
{
{

sentencial }
sentencia2 }
sentencia3 }
sentencia4 }
sentencia5 }

Las dos sentencias de asignacin proporcionan longitudes actuales de 5 y 12. Se cambia longitud de cad2 a 5, mediante la sentencia de asignacin 3, y hace que cad2 se trunque y valga ahora 'front'. Se reasigna de nuevo el valor original 'frontontenis' y cad2 pasa
a tener una longitud de 12.
Por ltimo, la longitud de cad2 se pasa a cadl [0], que contiene la cadena 'tenis', y las
seis posiciones restantes tomarn valores aleatorios imprescindibles.

1 <i disminucin de la longitud actual de una variable de cadena ti unta su valor actual a la
derecha F1 aumento de la longitud actual de una variable de cadena produce posiciones extras que se suman al final de Ja longitud actual de la cadena

3.
4.
5.
6.

Las variables cadcar y cadfija reciben los arrays de caracteres 'parta' y 'marta.
Se comparan los dos arrays como si fueran cadenas, y como 'parta' es mayor
que 'marta' se imprime el mensaje.
Se asigna ' l i s ' a la variable de cadena cadvar.
Se ejecuta la funcin concat, resultando que cadvar toma el valor 11 i sparta'.
Se asigna 'flores' a cadvar.
Al intentar asignar el valor de cadvar a cadcar se produce un error: es ilegal.

Problema 1 0 . 1
Escribir un programa que cambie una frase dada a otra cuyas letras sean las mismas
pero maysculas.
program C o n v e r s i o n M a y u s c u l a ;
type
Cad = string[255];
var
S : Cad;
{ funcin de c o n v e r s i n }
function C o n v e r s i o n C a d e n a (Z:Cad)

: Cad;

398

Programadu

v a r

I,J

:An en Turbo/Borland Pascal 7

Tratamiento de cadenas de caracteres

10.7.

integer;

'
o r

^or

. . = Upcase (Z(I]); { convierte cada caracter a mayuscula


-tonCadena := Z
Convefs

end;

principal }

{ progr* 1 "

" T

|S)
''
(ConversionCadena

Wri
end.

1o 6

PARAl^ETR0S

A R R A Y

(S);

A B I E R T O DE T I P O CHAR

j emento de un parmetro array abierto es Char, el parmetro real puede


Cuando el tipo e
c a d e n a s . Por ejemplo, dada la siguiente declaracin del procediser una constante ^
miento DemoCadeni
pr o c e d u f e
var
i

: m

begin
1

if

DemoCadena

PARAMETROS CADENA ABIERTA

Los parmetros cadena abierta se pueden declarar de dos modos:

(z O ]) ;
1 to
J do

399

(const S : a r r a y

of Char);

teger;

^ Q t o High (S) do
r j_ i <> tO t h e n Write(S[I]) e l s e Break;
*

end;

,,Pden utilizar las sentencias


para llamarle se p u e u
a 'Sov de Crchelejo:provincia de J a n 1 )
DemoCade" 3
*
DemoCad eria

r
asa c m 0 a r r a y d e c a r a c t e r e s abierto, una cadena vaca se convierte en
Cuando se V ^ e n t o s q u e c o n t i e n e un carcter nulo (NULL), de modo que la senuna cadena con
^ idntica a la sentencia DemoCadena (# 0).

tencia DemoCadena i /

Mediante el identificador OpenString.


Mediante la palabra reservada String activando la directiva del compilador P a {$P+>.
OpenString est declarado en la unidad System. Representa un array abierto para los
parmetros de tipo cadena (String). No es una palabra reservada, por consiguiente puede
ser redeclarada como un identificador definido por el usuario, aunque, naturalmente, esta
prctica no es recomendable.
Cuando se utiliza un parmetro abierto tipo cadena, el parmetro real puede ser una
variable de cualquier tipo cadena y la longitud mxima del parmetro formal, dentro del
procedimiento o funcin, ser el mismo que el del parmetro real. En el siguiente ejemplo, el parmetro Cad del procedimiento, ser el mismo que el del parmetro real. En el
siguiente ejemplo, el parmetro Cad del procedimiento AsignarCadena es un parmetro
abierto tipo cadena.
procedure

AsignarCadena

(var

Cad

: OpenString);

begin
Cad

:= 'Hola m u n d o c r u e l 1 ;

end;

Como Cad es un parmetro de cadena abierta, las variables de cualquier tipo cadena
se pueden pasar a AsignarCadena.
var
Cl
C2

: String[10];
: String[25];

begin
AsignarCadena
AsignarCadena

(Cl); {Cl =
(C2) {C2 =

'Hola Mundo '}


'Hola mundo cruel 1 }

end

Dentro del procedimiento AsignarCadena, la longitud mxima de Cad es la correspondiente al parmetro actual. Por consiguiente, en la primera llamada a Asignarcadena, la asignacin al parmetro Cad trunca la cadena ya que la longitud mxima de Cl
es 10; en la segunda llamada como la longitud mxima de C2 es 25, no es preciso truncar
nada.
Las funciones High y Low, como ya se ha indicado anteriormente, devuelven la longitud mxima del parmetro real y cero respectivamente. La funcin Sizeof devuelve el
tamao del parmetro real.

Precaucin
M e d i a n t e la directiva del compilador p
t o m a corn(>
_
^alor
*irra\ abierto, el compilador crea una copia local
i ""
di-Miiu de la estructuiade la pila del procedimiento o de la funcin Poi
l e parairn -i
^ n 0 desbordai la pila cuando se pasen arravs ur.indes como parame ti os
tanto, lengaauujhiert0

c u v o valor es ui

El tipo cadena string est disponible en Turbo Pascal 7 cuando la directiva del compilador P se establece a {$P+} (su estado por omisin es {$P-}. Con la directiva p activada,
el tipo string es un parmetro abierto tipo cadena o parmetro de cadena abierta. Esto
significa que si un procedimiento tiene un parmetro formal variable de tipo string entonces el parmetro real variable en una llamada al procedimiento puede ser de cual-

400

Tratamiento de cadenas de caracteres

Programacin en Turbo/Borland Pascal 7

quier tipo de cadena. Esto permite, como se ha comentado antes, escribir procedimiento
de cadenas que se apliquen a parmetros tipo cadena de cualquier longitud. Por ejemplo,
el procedimiento DemoCadenaAbierta se puede invocar con un parmetro real de cualquier tipo de cadena.

p r o c e d u r e FillString

401

(var S:OpenString; Ch:Char);

begin
S[0] := Chr(High(S));
FillChar (S[1] , High(S), Ch);
end;

{$P+ debe incluirse al principio del programa}


program ...
procedure PrimeraLetraMayuscula (var Frase : String)
{Comprueba que la primera letra de la cadena Frase est en
maysculas, si no es asi, se cambia a mayuscula}
begin
Frase[l]
end;

:= Upcase

(Frase[l]);

Los parmetros de cadena abierta se disean para utilizarlos como parmetros variable. Si se activa la Directiva P y se declara un parmetro valor tipo string, ste no ser
un parmetro abierto sino que ser un parmetro valor de tipo string [255], Esta caracterstica har que probablemente, su programa se ejecute correctamente, pero se malgastar espacio de almacenamiento. Por esta causa es ms eficiente hacer todos los parmetros cadena y array, parmetros variable.
Ejemplo 1 0 . 3

El programa AsignarCadena anterior se podra resolver de esta forma


Program DemoAsignarCadena;
{$P+}
type

CADENAS TERMINADAS EN NULO

Turbo Pascal 7.0 soporta una clase de cadena de caracteres llamada cadena terminada
en nulo, similar a las cadenas en el lenguaje C. Los compiladores de versiones anteriores
a la 7.0 soportan un tipo string como una secuencia de caracteres, cuya longitud mxima
es de 255 caracteres, y en consecuencia una cadena Pascal ocupa de 1 a 2565 bytes de
memoria. Una cadena ocupa tantos bytes como su longitud mxima ms uno. El primer
byte contiene la longitud dinmica de la cadena y los siguientes bytes contienen los caracteres de la cadena [la longitud mxima de la cadena es 255 caracteres, ms un byte
de longitud String(255)].

Una limitacin de este tipo de cadenas es que no se pueden tener ms de 255 caracteres en la cadena. Sin embargo, algunos lenguajes (como C) y entornos operativos (como
Windows) utilizan una representacin diferente para cadenas: una secuencia de caracteres que terminan en un carcter nulo ( N U L L ) (cdigo 0 o de ASCII). Estas cadenas se
denominan terminadas en nulo o cadenas ASCII. Con esta caracterstica no existen restricciones en la longitud de una cadena ms que las impuestas por la arquitectura del
procesador central; as en el caso de mquinas 8086 se impone un lmite superior de
65.535 bytes.
Turbo Pascal soporta este tipo de cadena y funciones que los manipulan, en la unid a d Strings.

Una cadena terminada en nulo se almacena como array de caracteres cuyo formato es:

Cad255 = String[255];
Cad80
= String[80];
var
C1 : Cad2 55;
C2 : Cad80;
procedure AsignarCadena (var Cad
begin
Cad := 'Hola carpe d i e m 1
end;

10.8.

array

: String);

begin
AsignarCadena(C1) ; {llamada legal con OpenString y $P+}
AsignarCadena(C2); {llamada legal solo con $P+}

Ejemplo 1 0 . 4

El procedimiento FillString (descrito en el manual de Borland, Languaje Guide, en la


pgina 112) hace uso de una variable del tipo OpenString para mostrar la utilizacin de
la funcin High. Este procedimiento rellena una cadena determinada a su longitud mxima con un carcter dado.

[0 . .x] of Char

donde x es un entero positivo distinto de cero. Tales cadenas requieren la activacin de


la directiva del compilador {$X+}. Algunos ejemplos de declaraciones de cadenas terminadas en nulo son:
type
PruebaUno = array[0..120] of Char;
PruebaDos = array[0..100 0] of Char

La diferencia ms sobresaliente entre las cadenas Pascal tradicionales y las cadenas


terminadas en nulo es el amplio uso de punteros en la manipulacin de estas ltimas.
Estos tipos de cadenas estn soportados a travs del tipo predefinido Pchar definido as:
type
Pchar = ^Char;

Programacin en Turbo/Borland Pascal 7

402

Tratamiento de cadenas de caracteres

Una variable de tipo Pchar apunta al principio de una cadena terminada en nulo. Esto
significa que el tipo Pchar equivale a la definicin:

Si desea trabajar con alguna de estas funciones, recuerde que debe incluir siempre
una lnea similar a esta:

type
A r r a y C h = array[0..65534] of Char;
Pchar = ^ArrayCh;

y una cadena se puede asignar a una variable de tipo Pchar. Por ejemplo:
var
S: Pchar;

begin
S := 'Hola Cazorla';
end;

const

: array[0..11] of Char =

'Hola Cazorla'#0;

: Char;

begin
P := @ A u x C a d ;
end;

10.8.1.

uses Strings;

Cuando se hable de cadena en las siguientes funciones se entender, salvo indicacin


expresa, que nos referimos a cadenas terminadas en nulo.
A continuacin se describen por orden alfabtico las diferentes funciones de cadena.
Todas ellas contienen su definicin en la primera lnea. A continuacin una breve descripcin de su propsito y por ltimo una o varias lneas con un ejemplo simple de su
utilizacin:
StrCat

El efecto de tal asignacin es que el puntero apunta a un rea de memoria que contiene una copia terminada en nulo de la cadena. Este ejemplo realiza la misma tarea que
el ejemplo anterior:

AuxCad
var

Activacin de la sintaxis extendida

function StrCat(Destino, Fuente:

uses Strings;
type ConjuntoCar = set of Char;
var

10.9.

Cl, C3

: Pchar;
: array[0..255] of Char;
: ConjuntoCar;

LA U N I D A D STRINGS : F U N C I O N E S

Esta unidad ya incorporada en Turbo Pascal for Windows incorpora un conjunto de 21


funciones para manipulacin de cadenas terminadas en nulo. Estas funciones estn codificadas en lenguaje ensamblador en lnea.

Pchar)

: Pchar;

Aade una cadena fuente al final de una cadena destino y devuelve un puntero a la
cadena destino.
StrCat(S,

'Mackoy 1 );

StrComp
function StrComp(SI,S2

: Pchar)

: Integer;

Compara dos cadenas, SI y S2 y devuelve un valor menor que cero si S2 < Si, 0 si SI
= S2 o mayor que cero si SI > S2.
C

Los arrays tratados en otro captulo se conocen como arrays de caracteres basados en
cero. Si se desea hacer compatibles las cadenas terminadas en nulo con los arrays de caracteres basados en cero, se requiere activar la caracterstica de sintaxis extendida de Turbo
Pascal, mediante la directiva {$P+}.
La declaracin de variables requiere la unidad Strings.

C2
Listas

403

:= StrComp(SI,S2);

StrCopy
function StrCopy

(Destino, Fuente)

: PChar;

Copia una cadena fuente (Fuente) en una cadena destino (Destino) y devuelve un
puntero a la cadena destino.
StrCopy(S*

'Luis');

StrDispose
function StrDispose

( C a d : PChar);

Libera el espacio almacenado por una cadena que fue asignada anteriormente con
StrNew. Si Cad es nil, no hace nada.
StrDisppose(P) ;

404

Programacin

en Turbo/Borland

Tratamiento de cadenas de caracteres

Pascal 7

StrECopy

405

StrLen

function StrECopy

function StrLen

(K Destino, FuenteJ: Pchar;

Copia una cadena fuente en una destino, devolviendo un puntero al final de la cadena resultante.

( C a d : Pchar) : Word;

Devuelve la longitud de una cadena (sin contar el carcter de terminacin nulo).


WriteLn ('Longitud es

: ', StrLen

(s));

StrECopy(SI,S2 ) ;

StrLIComp

StrEnd
function StrEnd(Cad

function StrLIComp

: Pchar) : Pchar;

Devuelve un puntero al final de una cadena (el carcter nulo de terminacin de la


cadena).
WriteLn(

: Word)

: Integer;

:= StrLIComp(SI,S2,10);

StrLower

function StrIComp

function StrLower

(SI, S2 : Pchar) : Integer;

Compara dos cadenas sin tener en cuenta maysculas/minsculas.


T

: Pchar; LongMax

Compara dos cadenas hasta una longitud mxima, sin tener en cuenta el tamao de
la letra y sin distinguir letras maysculas de minsculas.

'Longitud:', StrEnd(Cad) - Cad);

StrIComp

(S1,S2

(S : Pchar)

: Pchar;

Convierte una cadena a letras minsculas.

:= StrIComp(SI,S2 ) ;

WriteLn(StrLower(S));

StrLCat

StrMove
function StrLCat

(S1,S2

: Pchar; LonMax

: Word)

: Pchar;

Aade caracteres de una cadena al final de otra y devuelve una cadena concatenada,
no mayor que la longitud mxima especificada en los argumentos.
StrLCat(S,

: Pchar; C u e n t a : W o r d ) : Pchar;

Copia caracteres de una cadena a otra y devuelve un puntero a la cadena destino.


P

'Mortimer', Sizeof(S) - 1);

StrLComp

:= StrMove(A,B,2);

StrNew

function StrLComp(Sl, S2 : Pchar; LongMax

: Word)

function StrNew(Cad

: Integer;

Compara dos cadenas hasta una longitud dada, sin tener en cuenta el tamao de la
letra.
t

function StrMove(SI,S2

:= StrNew(s);

StrPas

StrLCopy
(S1,S2

: Pchar, LongMax

: Word)

: Pchar;

Copia caracteres de una cadena a otra y devuelve un puntero a la cadena destino.


StrLCopy(SI,S2,7) ;

: Pchar;

Asigna una cadena en el montculo (heap).

:= StrLComp(SI,S2,10) ;

function StrLCopy

: Pchar)

function StrPas

(Cad

: Pchar)

: String;

Convierte una cadena terminada en nulo a una cadena estilo Pascal.


S

:= StrPas(Cad);

406

Programacin

en Turbo/Borland

Pascal 7

Tratamiento de cadenas de caracteres

StrPCopy

407

RESUMEN

function

StrCopy

(Destino : Pchar; Fuente

: S t r i n g ) : Pchar;

Copia una cadena Pascal en u n a cadena terminada en nulo.


StrPCopy(A,S);
REadLn(Cad) ;

1. Turbo Pascal tiene caractersticas potentes para el tratamiento de cadenas.


2. La declaracin de una variable de tipo stri ng define la longitud mxima de 1 a 255 caracteres.
Si no se indica longitud, por defecto se considera 255.
3. La longitud actual de una cadena se almacena en la posicin 0 de la variable de cadena.
4. Las operaciones bsicas de cadena son: concatenacin y comparacin. La concatenacin se
puede hacer con el operador + o con la funcin concat.

StrPos
f u n c t i o n StrPos(SI,S2

: Pchar) : Pchar;

Devuelve un p u n t e r o a la primera ocurrencia de una cadena (S2) en otra (SI). Si S2


no est en SI, se devuelve ni!.
StrPos(S,Sub);
P

:= StrPos(S, Subcadena);

: Pchar; Car

: C h a r ) : Pchar;

Devuelve un puntero a la ltima ocurrencia de u n carcter d a d o dentro de u n a cadena, o nil si el carcter n o existe en la cadena.
P

:= StrRScan (Nombre,

'*');

if p = n i l then

: Pchar; Chr

: Char>) : Pchar;

Devuelve un p u n t e r o a la primera ocurrencia de un carcter dado dentro de una-cadena, o nil si el carcter n o existe en la cadena.
Cars :=(StrScan(Nombre, '*') < > NILL) OR
(StrScan(Nombre,

'#') < > nill);

StrUpper
f u n c t i o n StrUpper

(Cad

: Pchar)

concat(cadl,cad2)

5. El procedimiento copy se utiliza para hacer una copia de parte (o toda) de una cadena.
copy(cad,p,num) devuelve el valor de la subcadena de cad que comienza en la posicin p
y contiene num caracteres.

7. La funcin length(cad) devuelve el nmero de caracteres actualmente almacenados en la cadena cad. Este nmero puede variar de 0 al mximo especificado en la declaracin.
8. El procedimiento insert se utiliza para insertar una cadena en otra cadena, insert (cadl ,cad2,p)
inserta la cadena cadl en la variable de cadena cad2 comenzando en la posicin p.
9. El procedimiento delete sirve para borrar una parte de una variable de cadena, delete (cad,p,nmero) borra una parte de la cadena cad que comienza en la posicin p y tiene
una longitud de nmero caracteres.

StrScan
f u n c t i o n StrSCan (Cad

equivale a

6. La funcin pos se utiliza para hacer una copia de una cadena. En general, copy (cadl ,p, num)
devuelve el valor de la subcadena de cadl comenzando en la posicin p y que conste de num
caracteres.

StrRScan
f u n c t i o n StrRScan (Cad

cad+cad2

: Pchar;

10. Si una variable de cadena acta como parmetro actual, el parmetro formal debe ser un tipo
definido por el usuario. Si la variable de cadena se cambia en el subprograma, debe ser un
parmetro var.

Sintaxis de funciones y procedimientos de c a d e n a s


Declaracin

var nombre: string[40];

Comparacin

'A' < ' a ' 'Luis' < 'Luisa'

Concatenacin

'Hola' + 'Hortimer' = 'Hola Mortimer'

'PEPE' < 'PRIM'

Funciones de cadena

Convierte una cadena a letras maysculas y devuelve u n p u n t e r o a la cadena.


ReadLn(Cad);
WriteLn(StrUpper(Cad));
WriteLn(StrLower(Cad));

length

l e n g t h (cadena)

length ('cobre")

devuelve 5

408

Tratamiento de cadenas de caracteres

Programacin en Turbo/Borland Pascal 7


prueba:='abcd';

concat

insert ('xy'.prueba,3);

concat (cadl,cad2,cad3)

WriteLn;

produce

pos

copy

concat ('ab'+'cd'+'eP)
'ab'+'cd'+'ef

devuelve 'abcdef
devuelve 'abcdeP

pos
pos
pos
pos
pos

devuelve
devuelve
devuelve
devuelve

(modelo,destino)
fabc','abcd')
('bc'/abcd')
('ba','dabadaba')
('BAVdabadaba')

EJERCICIOS
1
2
3
0

copy (cadena, comienzo, longitud)

copy ('abcdeP,3,2)
copy ('goles',2,10)

abxycd

devuelve 'cd'
devuelve 'oles'

1. Indicar cul es la salida despus que se ejecuten las siguientes sentencias:


var
Cad
Cadl
Cad2
Cad3
I, J

string [25];
string [10];
string [ 3 ] ;
s t r i n g [25];
integer;

Cad
:= 'fantstico';
Cadl := Cad;
Cad) - 3);
d e l e t e (Strl, 4, Length
Cad2 := Cadl;
Cad3 := Copy (Cad2, 1,2)

2. Qu se imprime al ejecutar los siguientes programas?


upcase

upcase (expresin de caracteres)

upcase ('a')
upcase ('A')

devuelve 'A'
devuelve 'A'

Procedimientos de cadena

delete

d e l e t e (variable cadena, comienzo, nmero)


1. p r u e b a : = ' a b c d e f 1 ;
delete (prueba,3,2);
WriteLn ( p r u e b a ) ;

visualiza
abef
2. p r u e b a : = ' W o o d y ' ;
delete (Prueba,2,10);
WriteLn ( p r u e b a ) ;

visualiza
W

insert

insert (expresin cadena, variable cadena, comienzo)

p r o g r a m Demol;
var
Cadl: string [6];
Cad2: string [20];
Cad3: s t r i n g [25];
Aux : string [10];
I,J : integer;
begin
= 'Julio';
Cadl
= 'alejandro';
Cad2
= Pos ('x', Cad2);
J
= Cad2;
Aux
D e l e t e ( C a d 2 , J + 1, Length
= Cad2;
Cad3
= L e n g t h (Cad3);
i
= Aux;
Cad2
= Cad3;
Aux
= Concat (Cad3,Cadl);
Cad3
= Cad3 + Aux;
Cad3
, Cad2, '
W r i t e L n (Cadl, 1
end.
p r o g r a m Demo2;
var
Cad, Aux : string [25];
Cadl
: string [25];
Cad2
: string [3];
K,M,N
: integer;

J>;

Cad3,'

',J)

409

410

Tratamiento de cadenas de caracteres

Programacin en Turbo/Borland Pascal 7


begin
Cad
M
N
Cadl
K

:=
:=
:=
:=
:=

WriteLn
end.

'Picapiedra';
L e n g t h (Cad);
Pos(' ',Cad);
Cad;
Pos ( 1 ',Cadl);
(M,N,Cadl

: M, Cad2

b) R e a d L n
ReadLn
ReadLn
ReadLn

(Cad)
(Cadl)
(Cad3)
(Cad2)

c)

(Cadl, Cad2, Cad3, C a d )

d) R e a d L n
ReadLn

(Cadl);
(Cad2,Cad3, Cad),

ReadLn

5. Q u se i m p r i m e al e j e c u t a r el s i g u i e n t e p r o g r a m a ?

program Cadenas;
type
Cadlarga
= string
Cadcorto
= string
var
Cad, Nuevo, Aux
Uno
I,K
:=
:=
:=
:=

(Cad, Cadl, Cad2);


(Cad3)

: N)

3. D e d u c i r cul es el r e s u l t a d o del s i g u i e n t e s e g m e n t o d e p r o g r a m a :

begin
Cad
Nuevo
K
for I

a) Read
ReadLn

Cadena
I
Cadl
Cad2
begin
Cadena
Cadena
Cadena
Cadena
Cadena
Cadena
for I:=

[15];
[1];

: Cadlarga;
: Cadcorto;
: integer;

'ejemplo u n o 1 ;
'';
L e n g t h (Cad);
1 to K do

begin
Aux
:= Cad;
Delete (Cad, 2, Length
Uno
:= Cad;
W r i t e L n (Uno);
Cad
:= Aux;
Nuevo := Concat

p r o g r a m Prueba;
const
Cad = 'turbo ';
var

(Cad) - 1);

(Nuevo,Uno);

Delete (Cad,1,1),
WriteLn (Nuevo, 1 ',Cad)
end
end.

:
:
:
:

array [1..6] o f c h a r ;
integer;
string [6];
string [12];

= 'm'
[1]
= ' n'
[2]
= 'p'
[3]
= ' a'
[4]
= 'b'
[5]
= 1c'
[6]
1 to 6 d o
W r i t e L n ('Numero de e l e m e n t o
Cadl
:= 'pascal';
Cadena := Cad;

WriteLn;
for I
1 to 6 do
WriteLn (Cad );
Cad2
:= Cadl + C a d e n a ;
WriteLn ('la nueva c a d e n a es
Cadena := 'madrid';
WriteLn ('la c a d e n a es ahora
end.
6. C u l e s la salida del s i g u i e n t e p r o g r a m a ?

4. D a d a s las siguientes d e c l a r a c i o n e s y las lneas d e d a t o s a l m a c e n a d a s e n u n a r c h i v o e x t e r n o ,


i n d i c a r q u valores se a l m a c e n a r n e n las variables cad, cadl, cad2 y cad3 d e s p u s d e e j e c u t a r
c a d a u n o d e los siguientes s e g m e n t o s d e p r o g r a m a s :
Hola Mortimer que grande e r e s
Quien
es
usted?
var
Cadl : string [3];
Cad2 : string [ 4 ];
Cad3 : string [5];
Cad
: string [20];

p r o g r a m Chequeo;
const
Cad = 'pepa';
var
Cadena : array [1..4] o f char ;
G r a n d e : string [15];
I
: integer;
begin
Writeln;
Cadena := Cad;
for I := 1 t o 4 d o
Write (Cadena [1]);
WriteLn;

',1,' es' ,cadena

Cad2);
Cadena)

[I]);

411

412

Programacin en Turbo/Borland Pascal 7


Cadena [1] := 'b 1 ;
Cadena [4] := 'j 1 ;
for I := 1 to 4 d o
Write (Cadena [I]);
Cadena[1] := 'd';
Grande := Cadena + 'musa
WriteLn;
WriteLn
end.

Tratamiento de cadenas de caracteres

413

7. Escribir un programa que lea una serie de cadenas, a continuacin determine si la cadena es
un identificador vlido Turbo Pascal. Sugerencias: utilizar los siguientes subprogramas: longitud (tamao del identificador en el rango permitido); primero (determinar si el nombre comienza con un smbolo permitido); restantes (comprueba si los restantes son caracteres permitidos).
8. Escribir un procedimiento conversin que reciba como parmetro una cadena fecha en formato 'dd/mm/aa' (17/11/89) y devuelva el valor en texto '17 Noviembre 1989'.

7. Escribir una funcin buscar que reciba como parmetro formal una cadena cad y devuelva la
posicin de la primera ocurrencia del carcter 'i' en cad. Por ejemplo, si cad tiene el valor
'principal', entonces la funcin devolver 3.

9. Escribir un procedimiento sort que ordene un conjunto de n cadenas en orden alfabtico.


10. Escribir un procedimiento que ordene los n primeros elementos de un array de cadenas basado
en las longitudes de las cadenas. Por ejemplo, 'bibi' vendr antes que 'Ana'.

8. Escribir una funcin LocalizarCaracteres que reciba como parmetro una cadena cad y una
variable ch de tipo char. La funcin devolver la posicin de la primera ocurrencia de ch en
cad. Por ejemplo, si cad contiene 'Guadalquivir' y ch contiene 'a', la funcin devolver 3.

11. Se introduce una frase por teclado. Se desea imprimir cada palabra de la frase en una lnea
diferente y sucesiva.

9. Escribir una funcin buscardos que recibe dos cadenas, cadl y cad2, y un entero p. La funcin
devuelve la posicin de la primera ocurrencia de cadl en cad2 a partir de la posicin p.

12. Disear un editor de texto que pueda ejecutar sobre un texto las siguientes operaciones: localizar una cadena especificada, borrar una subcadena, insertar una subcadena en una posicin
especificada y sustituir una subcadena por otra.

10. Escribir una funcin inversa que recibe una cadena cad como parmetro y devuelve los caracteres de cad en orden inverso. Por ejemplo, si cad es 'Groucho', la funcin devuelve 'ohcuorG'.

13. Escribir un programa que lea una coleccin de cadenas de caracteres de longitud arbitraria.
Por cada cadena leda, su programa har lo siguiente:
a) Imprimir la longitud de la cadena.
b) Contar el nmero de ocurrencias de palabras de cuatro letras.
c) Sustituir cada palabra de cuatro letras por una cadena de cuatro asteriscos e imprimir la
nueva cadena.

PROBLEMAS
1. Escribir un programa que lea una cadena de caracteres y la visualice en un cuadro.
****** *******

informtica*
*************

2. Escribir un programa que lea una frase, sustituir todas las secuencias de dos o varios blancos
por un solo blanco y visualizar la frase obtenida.
3. Escribir un programa que lea una frase y a continuacin visualice cada palabra de la frase en
columna, seguido del nmero de letras que componen cada palabra.
4. Escribir un programa que desplace una palabra leda del teclado desde la izquierda hasta la
derecha de la pantalla.
5. Escribir un programa que visualice en forma codificada la cadena de caracteres leda del teclado.
6. Escribir un programa que calcule la frecuencia de aparicin de las vocales de un texto proporcionado por el usuario. Esta solucin se debe presentar en forma de histograma.
3

15

***************
********

14. Escribir un programa que visualice en forma codificada la cadena de caracteres leda del teclado.

El control de la pantalla y del teclado

CAPITULO

11

EL CONTROL DE LA PANTALLA
Y DEL TECLADO
CONTENIDO
11.1.
11.2.
11.3.
11.4.
11.5.
11.6.
11.7.
11.8.
11.9.

La unidad c r t
Las variables crt
Rutinas de control de pantallas
Pantallas versus ventanas
Pantalla de texto
Coordenadas de pantalla: posicin del cursor
Reglas prcticas para el control de la pantalla
El control del teclado
El control del tiempo y de sonidos

RESUMEN
PROBLEMAS RESUELTOS
El control de la informacin en la pantalla suele ser uno de los caballos de batalla de todos los programadores. Turbo Pascal es uno de
los compiladores Pascal que define su propio interfaz estndar con la
pantalla. Sus procedimientos de control de la pantalla no forman parte
de ISO Pascal estndar, pero recogen muchas caractersticas de otros
lenguajes con posibilidades grficas como BASIC o Modula-2.
Aunque las unidades Crt y Graph contienen procedimientos y funciones relativas al control de la pantalla, este captulo se dedicar a
las potentes rutinas de Crt que proporcionan control total de I3s caractersticas de sus PC, tales como modos de control de pantalla,
cdigos de teclado ampliado, colores, ventanas y sonido.

notaciones equivalentes. Habitualmente el archivo de entrada est asociado, a nivel MSDOS, al teclado y el de salida a la pantalla. De hecho se presentan dos casos:
1. El programa

LA UNIDAD Crt

Esta unidad contiene todos los procedimientos y funciones especficos de control de la


pantalla de un PC. Para hacer estas rutinas disponibles a su programa se debe incluir Crt
en la lista de unidades a continuacin de la clusula uses. Las entradas/salidas han mejorado en las versiones 4.0 y 5.0 considerablemente y ofrecen una mayor flexibilidad y
velocidad comparadas con la versin 3.0.
Las entradas estndar se hacen por intermedio de un archivo de texto llamado entrada y su salida gracias a un archivo llamado salida. Read(A) o Read(input, A) son dos
414

no utiliza la unidad Crt.

El archivo de entrada se asocia a la entrada estndar del sistema MS-DOS, es decir, al teclado en ausencia de redireccin al nivel MS-DOS. En este contexto se
introduce un cdigo Ctrl-P, una lectura/escritura teclado/pan talla enva un eco a
la impresora tal como MS-DOS. De igual forma, Ctrl -C sirve para detener un programa durante una entrada/salida.
2. El programa

utiliza la unidad Crt.

La salida se enva directamente al BIOS, o incluso en operaciones rpidas a la memoria de vdeo. Esto es debido a que Crt sustituye los controladores de vdeo y de
teclado utilizados por MS-DOS con sus propias rutinas. Los interruptores Ctrl-P
y Ctrl -C no sern ya utilizables. Si se necesita facilidades de redireccin de E/S de
DOS, se deben asignar los archivos de texto predefinidos input y output a un
archivo nulo y abrirlos utilizando respectivamente Reset y Rewrite. Por ejemplo:
Assign ( I n p u t , ") ; Reset ( I n p u t ) ;
Assign ( O u t p u t , " ) ; R e w r i t e ( O u t p u t ) ;

Ejemplo
uses
Crt;
Assign (input, ") ; Reset (input);
Assign (output, ") ; Rewrite (output);
{Las E/S siguientes se enviaran a la impresora con eco
despues de Ctrl - p}
Write ('Entradas/Salidas a travs de Dos :'); ReadLn (A) ;
AssignCRT (input); Reset (input);
AssignCRT (output); Rewrite (output);
{Las E/S se dirigen directamente a la memoria video al BIOS.
Ctrl-P no tiene efecto}

11.1.1.
11.1.

415

Uso de la unidad Crt

Al igual que cualquier unidad, Crt como ya se ha comentado se utiliza especificndola en la sentencia uses de sus programas.
program Arcolris;
uses Crt, DOS;

Se pueden hacer salidas a pantalla utilizando Crt, pero las nicas rutinas realmente
disponibles fuera de Crt son Read y ReadLn p a r a e n t r a d a de i n f o r m a c i n , m s Write y

WriteLn para salida a pantalla. Estas rutinas se definen en la unidad System y estn siempre disponibles. Sin embargo, no existe control sobre la posicin donde debe aparecer el

416

El control de la pantalla y del teclado

Programacin en Turbo/Borland Pascal 7

texto en la pantalla, sino que comienza el texto al principio de la lnea y avanza una
lnea con cada sentencia.
Utilizando readln y writeln, las salidas son ms lentas (a travs de DOS) pero permite
redireccionar la entrada y salida a archivos de texto. Esta redireccin se realiza con el
operador > sobre la lnea de rdenes del DOS. Por ejemplo, un programa denominado
BUSCAR puede redireccionar su salida a un archivo de texto.

Las variables de control del sistema definidas en Crt se indican en la Tabla 11.2.
Tabla 1 1 . 2 .

C:\>BUSCAR *.BAK > LISTABAK.TXT

Cuando se utiliza la unidad Crt tiene dos elecciones adicionales: E/S pantalla BIOS
y dirigir E/S a pantalla. El valor por defecto es E/S dirigida a pantalla, que es de los dos

mtodos el ms rpido y el ms especfico a la arquitectura de vdeo del PC.

1 1 . 1 . 2 . Las constantes, variables, procedimientos y funciones


de la unidad Crt
Las constantes, tipos y variables definidas por la unidad Crt se examinan en la Tabla 11.1.
Tabla 11.1.

BW40
BW80
Mono
C040
COSO
Font8 x 8
C40
C80

\ alor
0
2
7
1
3
256
C040
C080

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
128

Nombro

'[po

CheckBreak
CheckEof
CheckSnow
DirectVideo
LastMode
TextAttr
WindMin
WindMax

boolean
boolean
boolean
boolean
word
byte
word
word

Tabla 1 1 . 3 . Procedimientos y
funciones de la unidad Crt

Constantes de la unidad Crt

Descripcin
40 x 25 B/N en Adaptador Color
40 x 25 Color en Adaptador Color
80 x 25 B/N en Adaptador Color
80 x 25 Color en Adaptador Color
80 x 25 en Adaptador Monocromo
De EGA/UGA 43 y 50 lneas
Para compatibilidad 3.0
Para compatibilidad 3.0

Constantes de color tevto


Negro
Azul
Verde
Cian
Rojo
Magenta
Marrn
Gris claro
Gris oscuro
Azul claro
Verde claro
Cian claro
Rojo claro
Magenta claro
Amarillo
Blanco
Parpadeo

Variables de la unidad Crt

Los procedimientos y funciones de la unidad Crt incluidos en la librera de Turbo


Pascal se indican en la Tabla 11.3.

Constantes modo Crt


Identificador

417

11.2.

Procedimiento

Funciones

AssignCrt
ClrEol
ClrScr
Delay
Deline
GotoXY
High Video
InsLine
KeyPressed
LowVideo
NormVideo
NowSound
ReadKey
Sound
TextBackground
TextColor
TextForeground
TextMode

WhereX
WhereY
Window

LAS VARIABLES Crt

Como ya se ha comentado, las variables en Crt son:


var
CheckBreak
CheckEof
CheckSnow

: boolean;
: boolean;
: boolean;

41 8

Programacin en Turbo/Borland Pascal 7

D i r e c t V d e o : boolean;
LastMode
: word;
TexAttr
: byte;
WindMin
: word;
WindMax
: word;

El control de la pantalla y del teclado

11.2.3.

419

CheckBreak

Activa y desactiva la verificacin de Ctrl-Break.

var CheckBreak : boolean;

11.2.1.

Variable D i r e c t V i d e o

DirectVdeo es una variable lgica predefinida que activa y desactiva el acceso directo a
memoria para sentencias Write y WriteLn que escriben en pantalla.

Cuando CheckBreak es True, pulsando Ctrl-Break abortar el programa cuando escribe en la pantalla. Si CheckBreak es false, la pulsacin de Ctrl-Break no tiene efecto.
CheckBreak es true por defecto en tiempo de ejecucin, Crt almacena el vector de interrupcin antiguo Ctrl-Break en una variable global de tipo puntero denominado SaveIntlB.

var DirectVideo : boolean;

Cuando DirectVideo es true, la salida a pantalla se enva directamente a la memoria


intermedia de vdeo, sin referencia a BIOS. Cuando DirectVideo es false, toda la E/S a
pantalla se ejecuta a travs de llamadas BIOS. El valor por defecto es true.
DirectVideo se establece a true en la seccin de inicializacin de la unidad Crt y despus de cualquier llamada al procedimiento TextMode. Si se desea utilizar el BIOS para
ejecutar E/S a pantalla, se debe fijar DirectVideo a false antes de enviar nada a la pantalla
y despus de cada invocacin a TextMode.

11.2.2.

El vdeo "Nieve" con adaptador CGA

En las taijetas CGA (Color Graphics Adapter) originales y muchas compatibles la escritura directamente en pantalla genera una dispersin de "nieve" aleatoria a travs de la
pantalla, durante el instante que se toma para escribir un carcter directamente en memoria.
Si se utiliza E/S directa vdeo y observa nieve en su pantalla durante la actualizacin
de pantallas, se puede suprimir la nieve con una variable predefinida denominada
CheckSnow.

CheckSnow activa/desactiva la "verificacin de nieve" cuando almacena directamente


en memoria

var CheckSnow : boolean;

CheckSnow toma por defecto el valor falso. Cuando se establece a true, se fuerza al cdigo en tiempo de ejecucin a escribir caracteres en la memoria intermedia de pantalla
slo durante los perodos de retraza horizontal.
Cuando se selecciona un modo texto, CheckSnow se establece True y la memoria de
vdeo directa ocurrir slo durante los intervalos de la retraza horizontal.
CheckSnow no tiene efecto cuando DirectVideo es falso.

11.2.4.

CheckEOF

Activa y desactiva el carcter fin de archivo.


var CheckEOF : boolean;

Cuando CheckEOF es true, un carcter fin de archivo (EOF) se genera si se pulsa


Ctrl-Z mientras se lee de un archivo asignado a la pantalla. Es decir, si CheckEOF es verdadero (true), Ctrl-Z actuar como marcador de final de archivo cuando se pulsa la secuencia de teclas por teclado. Si CheckEOF es verdadera y el usuario teclea Ctrl-Z, EOF se
pone true en la siguiente sentencia Read o Readln. Si CheckEOF es false, la pulsacin de

Ctrl-Z no tiene efecto. ChecoEOF es falsa por defecto.

11.3.

RUTINAS DE CONTROL DE PANTALLA

En Crt existen rutinas que envan realmente caracteres a la pantalla y otras rutinas que
no tratan de la salida a pantalla como Delay, Sound y NoSound.

Todos los procedimientos descritos aqu funcionan dentro de la ventana actual. La


ventana por defecto es la pantalla completa; sin embargo, si se define una ventana ms
pequea en la ventana actual, la accin de estas rutinas se limitarn dentro de esa ventana.
11.3.1.

ClrEol

Borra todos los caracteres desde la posicin actual del cursor hasta el final de la lnea
(EoT, end of Une). Sin mover el cursor.
Formato
ClrEol

El control de la pantalla y del teclado

Programacin en Turbo/Borland Pascal 7

420

11.3.2.

c i r S c r (Limpiar la pantalla)

Borra la pantala y sita el cursor en la esquina superior izquierda.

Ejemplos
1.

Formato

Window

(1, 10, 60, 20);

GotoXY

(1, 1);

{mueve el c u r s o r a la esquina superior


izquierda:

2.

ClrScr

Si la ventana actual es la ventana pantalla, la pantalla completa se limpiar.


Turbo Pascal considera las coordenadas de la esquina superior izquierda de la pantalla como 1.1 y no 0.0.
El procedimiento TextMode tambin borra la pantalla; sin embargo, borra la pantalla
fsica completa y no simplemente la ventana actual.
Ejemplos

c o o r d e n a d a s a b s o l u t a s (1, 10)}

G o t o X Y (10, 15);
W r i t e ('X') ;

{se v i s u a l i z a una

G o t o X Y (15, 10);
W r i t e ('Y');

{se v i s u a l i z a

11.3.5.

'x' en la fila 15}

'y' en la fila 10, c o l u m n a 15}

InsLine

Inserta una lnea vaca en la posicin del cursor.


Formato

w i n d o w (1,1,50,22);
ClrScr
{borrara un rectngulo 50 x 22 que comienza en l}
uses
Crt;
begin
TextBackground (LightGray);
ClrScr
end

11.3.3.

421

{cambia la ventana completa a fondo Gris claro}

DelLine

Borra la lnea que contiene el cursor. Todas las lneas por debajo del cursor se mueven
hacia arriba una lnea. U n a nueva lnea se aade en la parte inferior.
Formato

InsLine

Este procedimiento provoca el desplazamiento de las lneas que se encuentran en la ventana actual, por debajo del cursor una lnea hacia abajo.

11.3.6.

LowVideo

Selecciona caracteres de dbil intensidad, es decir, este procedimiento efecta la conversin del color actual (color comprendido entre 8 y 15) en el color correspondiente de
ms baja intensidad (color comprendido entre 0 y 7).
Formato

DelLine
LowVideo

11.3.4.

GotoXY

Este procedimiento sita el cursor en la posicin de coordenadas (x,y). x es la columna


(contando desde la izquierda) y est comprendida entre 1 y el nmero m xim o de caracteres por lnea; mientras que y es la la (contando hacia abajo desde la parte superior) y
est comprendida entre 1 y el n m e r o m x i m o de filas. La esquina superior izquierda
es 1,1.
Formato
GotoXY (x, y)

x,y

tipo byte, integer, word, longint o shortint

La variable TextAttr de Crt se utiliza para alojar el atributo del vdeo actual. LowVideo
borra el bit de alta intensidad del color de primer plano de TextAttr, por consiguiente los
colores 0-7 se corresponden con los colores 8-15.
Ejemplo
uses
Crt;
begin
TexAttr := white;
LowVideo
{el c o l o r es ahora g r i s c l a r o }
end.

El control de la pantalla y del teclado

Programacin en Turbo/Borland Pascal 7

422

11.3.7.

HighVideo

Selecciona caracteres de alta intensidad.


Formato
HighVideo

11.4.

423

PANTALLA VERSUS VENTANAS

Las rutinas de control de la pantalla actan sobre la ventana actual de la misma. Ordinariamente, Turbo Pascal considera la ventana actual como la pantalla fsica completa.
En muchas ocasiones, sin embargo, es conveniente dividir la pantalla en zonas o ventanas y escribir por separado en ellas. El procedimiento Window se utiliza para ello. Window
define una ventana de texto en la pantalla.
Formato

La variable TextAttr acta como LowVideo, con la diferencia de que los colores 0-7 se
corresponden con 8-15.

Window (xl, yl, x2, y2 : byte)

Ejemplo
uses
Crt;
begin
TextAttr := LightGray;
HighVideo
{ el color es ahora blanco }
end.

Aplicacin
TextCoior

(LightRed);

W r i t e ('este texto se v i s u a l i z a en rojo claro');


LowVideo;
W r i t e L n ('este texto se visualiza en rojo oscuro');
HighVideo;
WriteLn

('este texto se v i s u a l i z a en rojo claro');

En el ejemplo anterior, despus de haber elegido el color del texto (rojo claro), la llamada
a LowVideo reduce la intensidad de ste. Despus se restablece la intensidad con la llamada a High Video.

xl,yl
x2,y2

coordenadas esquina superior izquierda de la ventana


coordenadas esquina inferior derecha de la ventana

Una vez que una ventana se ha definido con Window, permanece en ella hasta que otra
ventana se define, o hasta que se ejecuta la sentencia TextMode.
La ventana por defecto es (1,1,80,25) en modo 80 columnas, y (1,1,40,25) en modo
40 columnas, correspondiente a la ventana completa.
Todas las coordenadas de la pantalla son relativas a la ventana actual. Por ejemplo,
GotoXY (1,1) siempre posiciona el cursor en la esquina superior izquierda de la ventana
actual.
Ejemplo
Window ( 1 0 , 1 0 , 8 0 , 2 0 ) ;

Cl rScr;
GotoXY (1,1)

slo se borra la zona definida por la ventana


se posiciona el cursor en la posicin (1,1) de la ventana,
equivalente a la posicin de pantalla (10,10).

Programa de utilidad
El procedimiento BorraZona limpia cualquier zona rectangular de la pantalla.

11.3.6.

NormVideo

Este procedimiento fija el atributo de texto al valor que tena inmediatamente antes que
el programa sea ejecutado.
Formato
NormVideo

Cuando un programa Turbo Pascal se ejecuta, el atributo de vdeo (en la posicin actual
del cursor) se guarda. NormVideo fija la variable TextAttr a ese atributo.

procedure BorraZona
begin
Window

(XI, Yl, X2, Y2

: integer);

(XI, Yl, X2, Y2);

ClrScr;
W i n d o w (1,1,80,25)
end;

11.4.1.

Coordenadas ventana actual

Las coordenadas de la esquina superior izquierda y de la esquina inferior derecha estn


disponibles en las variables WindMin y WindMax, ambas de tipo word. Contienen las coordenadas relativas a cero.

El control de la pantalla y de! teclado

Programacin en Turbo/Borland Pascal 7

424

WindMin

coordenadas (x,y) de la esquina superior izquierda


x, byte de orden bajo
y, byte de orden alto

Wi ndMax

Ejemplos
TextMode (C40);
TextMode (BW80);
TextMode (Mono);
TextMode (last);
TextMode (C80);

coordenadas (x,y) de la esquina inferior derecha


x, byte de orden bajo
y, byte de orden alto

En ambos casos la coordenada columna se almacena en el byte de orden bajo o menor


peso y la coordenada fila en el byte de orden alto. Para acceder a los valores individuales
se deben utilizar las funciones Lo e Hi (ver seccin 7.7).

425

selecciona
selecciona
selecciona
selecciona
selecciona

40 c o l u m n a s , color activado
80 c o l u m n a s , color d e s a c t i v a d o
80 c o l u m n a s en adaptador m o n o c r o m o
m o d o actual o u l t i m o a c t u a l i z a d o
80 c o l u m n a s , color activado

Nota
Con independencia del adaptador que se est utilizando o el modo de texto que selec-

Ejemplo
Ventana actual

10,10/50,18

WindMin
Wi ndMax

11.5.

TextMode

contiene 9,9
contiene 49,17

{ojo, no 10,10)
{ojo, no 50,18)

siempre borra la pantalla

TextMode reinicializa la ventana actual a la ventana fsica completa.

PANTALLA DE TEXTO

Las computadoras personales tienen dos modos de presentacin o vdeo texto y grficos.
Cuando estn en modo texto, pueden visualizar cualquiera de los'256 caracteres estndar ASCII que soporta.
Para visualizar caracteres, su computadora utiliza un adaptador de vdeo, que es una
tarjeta que conecta la computadora a un monitor de vdeo. La mayora de las computadoras tienen una tarjeta adaptadora monocroma o de color (CGA/EGA o bien VGA).
Esta seccin se examina el modo texto, junto con los colores y atributos de texto.

11.5.1.

Modos de texto

Los diferentes modos de visualizacin de texto se pueden seleccionar mediante el pro-

11.5.2.

Colores de texto y atributos de vdeo

Si su computadora tiene instalada alguna tarjeta de vdeo que soporta color (CGA, EGA y
VGA), es posible desde Turbo Pascal controlar los colores de fondo y primer plano de los
caracteres situados en la pantalla. De igual modo es posible hacer parpadear o destellear
un carcter determinado.
Los procedimientos que permiten controlar los colores del texto son: TextColor y
TextBackground. Estos dos procedimientos actan sobre monitores monocromos o color,
pero con presentaciones diferentes.

cedimiento TextMode.

TextColor

Formato

Este procedimiento selecciona el color de primer plano del carcter, es decir, el color del
texto.
TextMode ( M o d o : word)

Modo

Formato

valores posibles en Tabla 11.4.


Tabla 11.4.

'Vunu.'ro
0
1
2
3
7
256

TextColor (Color:

Parmetros Modo
Caracteres

B/N (Blanco y Negro)


Color
B/N (Blanco y Negro)
Color
Monocromo
Juego de caracteres en ROM
(para placas EGA/VGA)

40
40
80
80
80

Constantes
BW40
C040
BW80
C080
Mono//B/N 80 x 25
Font 8 x 8

Color

byte)\

es una expresin entera en el rango 0...7, correspondiente a una de las diecisis


constantes de color definidas en Crt (vase Tabla 11.1); permite elegir entre
diecisis colores

Se pueden parpadear a los caracteres aadiendo 128 al valor del color. Blink es una constante entera predefinida que sirve para ese propsito. Blink vale 128. Si se aade Blink a
una constante de color, se har parpadear a ese carcter.

426

El control de la pantalla y del teclado

Programacin en Turbo/Borland Pascal 7

Ejemplo

427

(1,1)

TextColor

(4);

{selecciona a m a r i l l o }

TextColor

(Red);

{caracteres rojo}

TextColor

(Green-Blink);

{parpadeo}

TextColor

(LightRed+Blink)

{caracteres a m a r i l l o s }

TextBackground

Selecciona el color de fondo.


(80,25)

Formato

Figura 11.1.

Representacin grfica de la pantalla de un monitor.

TextBackground ( C o l o r : byt)

Como ya se ha visto, el cursor se puede mover a cualquier posicin de la pantalla con


Color

expresin entera en el rango 0...7, correspondiente a una de las ocho primeras constantes de color

la sentencia GotoXY.
GotoXY (1,20)

posiciona el cursor en columna 1 y fila 20

Ejemplos
La funcin inversa de la de posicin GotoXY consiste en calcular las coordenadas de la
posicin actual del cursor. Esta accin se realiza con las funciones Turbo Pascal WhereX

TextBackground ( B l u e ) ;

Cada carcter visualizado en la pantalla en modo texto se sita en una matriz de puntos.
Por defecto estos puntos constituyen el fondo, son de color negro y los caracteres visualizados sobre este fondo son de color blanco.
En el adaptador monocromo el color de fondo se convierte a un fondo negro (colores
1, 3, 4, 5, 6 y 7). Para visualizar en vdeo inverso, por ejemplo, se debe visualizar texto
en color negro sobre un fondo blanco.
TexColor

devuelve la coordenada X actual del cursor (columna del cursor)


devuelve la coordenada Y actual del cursor (fila del cursor)

Formato
WhereX

(1);

('video inverso');

TextColor

WhereY

(Normal);

TextBackground

11.6.

WhereX
WhereY

(Black);

TextBackground
WriteLn

y WhereY.

(Black);

COORDENADAS DE PANTALLA: POSICION


DEL CURSOR

La pantalla del monitor de su computadora tiene posiciones que se definen por coordenadas conocidas como x e y, donde x es la posicin de la columna e y la posicin de la
fila. (Las coordenadas se visualizan en formato x:y.) Por consiguiente, la esquina superior izquierda de la pantalla tiene por coordenadas la posicin 1:1 (1,1), mientras que la
esquina inferior derecha tiene las coordenadas (80:25)(80,25).

Las funciones devuelven un dato tipo byte, relativo a la ventana definida actualmente.
Aplicacin
Un uso tpico de WhereX y WhereY es guardar pantallas de texto completas. Las sentencias
GotoXY y Write permiten pintar en la pantalla, pero gastan gran cantidad de tiempo. Si su
aplicacin necesita conmutar con frecuencia entre un nmero de pantallas diferentes, se
emplear mucho tiempo en la regeneracin de pantallas. Con el uso adecuado de una
rutina que permita mover copias de una pantalla en una posicin de memoria RAM a
otra posicin de memoria RAM libre y mediante las funciones WhereX y WhereY se podrn
restaurar las pantallas guardadas.

Programacin en Turbo/Borland Pascal 7

428

11.7.

El control de la pantalla y deI teclado

REGLAS PRACTICAS PARA EL CONTROL


DE LA PANTALLA

Procedimiento de centrado de mensajes en pantalla

En esta seccin daremos algunas recomendaciones de tipo prctico que le permitan crear
pantallas de texto efectivas con Turbo Pascal.

Si se desea centrar un mensaje en la pantalla, se tendr que determinar su longitud, restar dicha longitud de 80 (anchura tpica de la pantalla) y dividir la diferencia por dos.
procedure Centrar (X,Y
: integer;
Swl
: boolean;
Sw2
: boolean;
Texto : string);
begin
if Y < 0 then Y := 12;
if X < 0 then X := (80 - Length (Texto)) div 2;
GotoXY (X, Y);
if Swl then LowVideo;
if Sw2 then WriteLn (Texto) else Write (Texto);
NormVideo
end;

Sntesis de la gestin de la pantalla

I
j

hscnbir en la pantalla (ll'ritc. U'riteln).


["specificjr el tipo de pantalla utilizada (TextWode).
F-.lceir coIoil's do la pantalla (le.xtColor, f 'e\tRuckurmmd).
Boriai la pantalla (CbSn).
Cambiar la intensidad del texto (J.owMdeo, Ih^hVidcn).
Desplazar el cursor {<>oto\ Y)
Obtener posicin del cursor ( W h e r e Y , W/wn'V).

Centrar automticamente centra una lnea de texto en su pantalla en sentido horizontal


o vertical, segn se desee; si se pasa un parmetro x negativo, su lnea de texto se centra
horizontalmente. Si se pasa un valor negativo y, el'texto se situar sobre la fila 12.

Intensificacin de la pantalla
El procedimiento LowVideo proporciona un medio para lograr un intensificador de texto
(dimmer). Si se desea destacar texto, el mejor sistema es ejecutar LowVideo inmediatamente al comienzo de su programa.

Aplicacin
if ERROR then Centrar (-1, 24, Swl, Sw2,

NormVideo;

'Error en el disco'):

{visualiza el mensaje centrado en la fila 24}

WriteLn ('Atencin es una prueba de intensificar');


LowVideo;

Funcin para respuestas reiterativas S/No

Centrado de mensajes
El centrado o situacin de mensajes en pantalla es prctico resolverlo con dos sentencias:
if Error then
begin
GotoXY (10,24);
WriteLn ( 1 IEste archivo esta daado!
end;

429

En los dilogos con la computadora es frecuente que el usuario debe contestar, preguntar y responder S /No (S/N). La codificacin de tales segmentos de programa puede
ser similar a:
Write ('Desea continuar? (S/N : ');
Read (Ch);
if not (Ch in ['S *, 'N']) then
Salir := True
else
Salir := False;

' )

Centrado de mensajes e intensificacin


if Error then
begin
LowVideo;
GotoXY (10, 24);
WriteLn ('iEste archivo est daado:');
NormVideo
end;

Mejora
La sentencia if-then-else anterior podra ser sustituida de modo ms eficiente por la
lnea:
Salir := not (ch in ['S*, 's'])

Dada su frecuencia se puede utilizar una funcin que denominaremos Si, en lugar de
la sentencia if-then-else anterior.

430

Programacin en Turbo/Borland Pascal 7

El control de la pantalla y del teclado

431

function Si : boolean;

11.8.2.

var
Ch : char;
begin
Read (Ch);
if Ch in
['S,
Si := True

Esta funcin lee un carcter del teclado. Cuando se ejecuta la funcin, el programa se
detiene y espera a que el usuario teclee un carcter en el teclado. El primer carcter tecleado se devuelve como valor de la funcin. Este carcter no hace eco en la pantalla,
por lo que si desea visualizarlo ser preciso aadir la sentencia write o writeln.

elae
Si

's'] t h e n

ReadKey

Formato

:= false

end;
ReadKey

v : = ReadKey

Mejora
v

La sentencia if-then-else puede ser sustituida ms eficientemente por la lnea:


Si

11.8.

:= ch in ['S',

's']

EL CONTROL DEL TECLADO

El teclado es el dispositivo de entrada ms utilizado en microinformtica. Permite la


captura o entrada de datos.
Para hacer esto, cada carcter introducido por el teclado se almacena en una memoria. Turbo Pascal permite leer esta memoria mediante dos procedimientos: ReadKey
y KeyPressed (estn contenidas en la unidad Ctr).

11.8.1.

Los caracteres y las teclas de funcin

A cada carcter corresponde, como ya conoce el lector, un nmero comprendido entre


0 y 255. Ello permite referenciar un carcter por su cdigo ASCII; basta hacer preceder
el valor del cdigo por el smbolo " # ".
Car := #65

representa el carcter A en car

A cada tecla del teclado le corresponde un carcter, con la excepcin de las teclas de
funcin y especiales ( F l , F2, . . . . CTRL, etc.). Estas teclas se diferencian de las teclas normales en que ellas envan dos caracteres a la computadora. El primero ( # 0 , cdigo
ASCII cero) especifica que una tecla especial ha sido pulsada, mientras que el segundo
carcter define a la tecla.
Los caracteres vlidos componen los caracteres maysculas, minsculas y signos de
puntuacin. Estos estn comprendidos entre los cdigos ASCII, # 3 2 y #255.
Los caracteres de control (no vlido) estn comprendidos entre los cdigos # 1 y # 3 1 .
Algunos caracteres de control importantes son:
# 13
# 10
#7
#27

retorno de carro
avance de lnea
pitido del altavoz
escape

variable de tipo carcter

Si la funcin KeyPressed era true antes de la llamada de ReadKey, el carcter se devuelve


inmediatamente, y en caso contrario como se ha tecleado la computadora espera la
pulsacin de una tecla.
Ejemplo
1.

Car := ReadKey;
if Car = #0 then
begin
Car := ReadKey;
c a s e Car of
end
else
begin

end

En este ejemplo se lee un carcter. Si el cdigo de ste indica una tecla especial
( # 0), lee el carcter siguiente, y segn el valor de ste (case) se ejecutarn ciertas
sentencias. Este test se puede utilizar, por ejemplo, en un procedimiento de entrada de cadena de caracteres.
2. El siguiente segmento de programa lee un carcter o un cdigo de exploracin
ampliado (vase Apndice A) y lo asigna a la variable ch) si el carcter es una
tecla de funcin, la variable lgica TeclaFun se pone a true y en caso contrario a
false.
Ch := R e a d K e y ;
if Ch <> #0 t h e n
T e c l a F u n := false
else
TeclaFun
Ch
end;

:= t r u e ;
:= R e a d K e y

432

El control de la pantalla y del teclado

Programacin en Turbo/Borland Pascal 7

11.8.3.

Ejemplo 11.1
Aplicacin

prctica

de ReadKey

KeyPressed

E s u n a f u n c i n d e v a l o r l g i c o q u e d e v u e l v e true

en programas.

433

( v e r d a d e r o ) si s e h a p u l s a d o u n a t e c l a

e n el t e c l a d o .
{Declaracin de los identificadores E s p a c i o y E S C }
const
Formato
Espacio =
ESC

' ' ;
{ t e c l a Escape}

= #27;

KeyPressed

{test de impresin tipico cuando se desea t r a b a j a r con i m p r e s o r a }


WriteLn ('Pulsar b a r r a e s p a d a d o r a c u a n d o I m p r e s o r a e s t e lista');
WriteLn ('Pulsar t e c l a E S C para salir de i m p r e s i n ' ) ;
repeat
Car := ReadKey;
until (Car = E s p a c i o ) or
WriteLn;
if car =
begin

KeyPressed
Lock,

Alt,

Num-

etc.

Ejemplo
(Car = ESC);
uses
Crt;
begin
repeat
W r i t e ('$*');
u n t i l KeyPressed

' ' then

WriteLn
WriteLn
WriteLn
end;

n o d e t e c t a t e c l a s d e d e s p l a z a m i e n t o o a l t e r n a t i v a s c o m o Shift,

(lst, 'Empleado
(lst, 1
(lst);

Horas

Paga');
' ) ;

end;
E s t e e j e m p l o r e l l e n a l a p a n t a l l a d e s m b o l o $* h a s t a q u e s e p u l s a u n a t e c l a ( o d o s e n
el c a s o d e teclas d e f u n c i n ) .

E l b u c l e r e p e a t se e j e c u t a h a s t a q u e se p u l s a l a b a r r a e s p a d a d o r a o l a t e c l a E S C , d e b i d o a la c o n d i c i n l g i c a o r q u e s e r v e r d a d e r a c u a n d o l o s e a a l g u n o d e s u s o p e r a n d o s .
Ejemplo 1 1 . 3
Lectura

Ejemplo 1 1 . 2
Procedimiento

de lectura

de lelas

procedure UsarReadKey
begin
Sw
:= false;
Car := ReadKey;
if Car = #0 then
begin
Sw
:= true;
Car := ReadKey

que producen
(var Car

cdigos

de exploracin.

: char; var Sw

end;

de funcin.

Car := ReadKey;
if Car = #0 t h e n
Car := R e a d K e y ;

: boolean)

end

de las teclas

else
begin
end

Ejemplo 1 1 . 4
Cdigos

devueltos

por ReadKey.

Tecla

Cdigo ASCII

A S C I I d e e s a t e c l a e n ch; si Sw e s f a l s e , s e h a p u l s a d o u n a t e c l a n o r m a l y s u v a l o r e s t

#27

Esc

c o n t e n i d o e n Car.

*72

Si Sw e s t r u e , se h a p u l s a d o u n a t e c l a d e c d i g o d e e x p l o r a c i n y s e d e v u e l v e e l c d i g o

{Car c o n t i e n e el c d i g o s e c u n d a r i o }

{aqui. se c o n s i d e r a una t e c l a n o r m a l }

434

El control de la pantalla y del teclado

Programacin en Turbo/Borland Pascal 7

Formato

#75
#77
#80
#0
#13
#7
#8
etc.

Nulo
Return ( I n t r o ) . E n t e r
Pitido (bip)
Retroceso

Delay (Ms : Word) ;


Ms es u n a expresin d e t i p o integer q u e r e p r e s e n t a el n m e r o de milisegundos q u e se
d e t i e n e el p r o g r a m a .

Estos cdigos se suelen definir en la seccin de constantes.


const
Nulo
Return
Pitido
Arriba
Abajo
Derecha
Izquierda

Ejemplo
Delay(600);

=
=
=
=
=
=
=

#0;
#13;
#7;
#72;
#80;
#77;
#75;

11.9.2.

Sound y NoSound

El p r o c e d i m i e n t o Sound p r o d u c e u n t o n o (sonido) en el altavoz del P C con la frecuencia


especificada en el a r g u m e n t o Frecuencia. El s o n i d o c o n t i n a hasta q u e se e j e c u t a el proc e d i m i e n t o NoSound.
Formato

Aplicacin

Sound ( F r e c u e n c i a

Leer las sucesivas pulsaciones de teclas hasta q u e el usuario pulse la tecla Esc o la barra
espaciadora.
const
Espacio = ' ' ;
Esc
= #27;
repeat
car := ReadKey
until (Car = Espacio or (Car = Esc)

11.9.

EL CONTROL DEL TIEMPO Y DE SONIDOS

La u n i d a d Crt contiene, a d e m s de los s u b p r o g r a m a s vistos a n t e r i o r m e n t e , otras r u t i n a s


que tienen t a m b i n gran i m p o r t a n c i a en n u m e r o s a s aplicaciones sobre t o d o c u a n d o se
requiere m e d i r perodos de t i e m p o s y emitir sonidos de a d v e r t e n c i a o p r e c a u c i n . Estas
rutinas f u n d a m e n t a l e s son: Delay, Sound y NoSound.

11.9.1.

435

Delay

El p r o c e d i m i e n t o Delay d e t i e n e la e j e c u c i n del p r o g r a m a (hace u n a p a u s a ) d u r a n t e


a p r o x i m a d a m e n t e el n m e r o de milisegundos d a d o s c o m o a r g u m e n t o .

Word);

^ j

NoSound

Ejemplo
Sound(500);

NoSound;

Ejemplo 1 1 . 5
Demostracin

del uso de los procedimientos

Delay, Sound y NoSound

program MacarenaBips;
uses Crt;
const
Frecuencia
Minutos
CuartoMinuto
OctavoMinuto

= 500
=1000
=250
=12 5

(hertzios)

procedure AireDeMacarena;
begin
Sound(Frecuencia);
Delay(CuartoMinuto);
NoSound;
end;
begin
{programa principal}
WriteLn ('Dale a tu cuerpo alegria Macarena1);

436

Ei control de la pantalla y del teclado

Programacin en Turbo/Borland PascaI 7


byte2 := readkey;
c a s e ord (byte2) of
WriteLn
59..68
WriteLn
82
WriteLn
83
WriteLn
71
WriteLn
79
WriteLn
73
WriteLn
81
WriteLn
72
WriteLn
80
WriteLn
77
WriteLn
75

Delay(Minutos);

ClrScr;
AireDeMacarena;
Delay(OctavoMinuto);
AireDeMacarena;
W r i t e L n ( 1 ; A y , Macarena!');
end;
(Fin de programa}

RESUMEN
El control de la pantalla y del teclado no es en s operacin fundamental en los algoritmos de computadora. Sin embargo, la programacin interactiva ptima (dilogo usuario-mquina) slo es posible si el lenguaje de programacin contiene sentencias especficas para el tratamiento de E/S.
Turbo Pascal posee una serie de recursos que facilitan considerablemente la comunicacin con
la mquina, va teclado/pantalla. Aunque no sea vital en el contexto de programacin, le instamos
de nuevo a leer con detenimiento y practicar los diferentes conceptos y. ejemplos contenidos en el
captulo.
ReadKey. Lee un carcter del teclado sin eco.
Espacio = ' ' ;
Esc
= #27;

repeat
Car := ReadKey

until (Car = Espacio) or (Car = Esc);

KeyPressed. Verifica si se ha pulsado una tecla.

PROBLEMAS RESUELTOS
1.

Detectar la tecla pulsada en el teclado.


program demo;
uses crt;
var
bytel, byte2 : char;
function t e r m i n o (bytel : char)
begin
termino
end;

:= bytel = chr

(27)

begin
repeat
W r i t e ('Pulse una tecla
bytel : = readkey;
c a s e ord (bytel) of
0 : begin

:');

end
until termino

: boolean;

(bytel)

(byte2)-58)!

('Insertar');
('Suprimir 1 );
('Inicio');
( 'Fin');
('Retroceso Pagina');
('Avance P a g i n a ' ) ;
('Flecha arriba');
('Flecha a b a j o 1 ) ;
('Flecha a la derecha')
('Flecha a la izquierda

end
end;
3 1 . . 2 5 5 : W r i t e L n (bytel);
9: W r i t e L n ('Tab');
27: W r i t e L n ('Esc');
13: W r i t e L n ('Enter');
8: W r i t e L n ('Retroceso')

end.

const

('F', ord

Ingeniera de software

CAPITULO L

12

INGENIERIA DE SOFTWARE:
INTRODUCCIN A LA METODOLOGA
DE CONSTRUCCION DE GRANDES
PROGRAMAS
CONTENIDO
11.1.
12.2.
12.3.
12.4.
12.5.
12.6.
12.7.
12.8.
12.9.
12.10.
12.11.
12.12.
12.13.
12.14.

La complejidad inherente al s o f t w a r e
La crisis del software
Factores en la calidad del s o f t w a r e
El ciclo de vida del software
La documentacin
Mtodos formales de verificacin de
Principios de diseos de programas
Estilo de programacin
Diseo de algoritmos
Codificacin
Prueba (Testing)
Depuracin
Eficiencia
Transportabilidad

RESUMEN
PROBLEMAS

439

elementos: la complejidad del dominio del problema, la dificultad de gestionar el proceso de desarrollo, la posible flexibilidad a travs del software, y los problemas de caracterizacin del comportamiento de sistemas discretos.

12.1.1.

La complejidad del dominio del problema

Los problemas que se intentan resolver con software, normalmente implican elementos
de ineludible complejidad, en los que se encuentran una gran cantidad de requisitos, en
muchas ocasiones contradictorios. Esta complejidad se produce por las difciles interacciones entre los usuarios de un sistema y sus desarrolladores: los usuarios, generalmente
encuentran muy difcil dar precisin sobre sus necesidades de forma que los desarrolladores puedan comprender. En casos extremos, los usuarios pueden tener slo ideas vagas
de lo que se desea en un sistema software.
Por otra parte, los usuarios y desarrolladores tienen diferentes perspectivas de la naturaleza del problema y hacen suposiciones diferentes sobre la naturaleza de la solucin.
El medio comn de expresar los requisitos hoy da es utilizar un gran volumen de textos,
en ocasiones acompaados por esquemas y dibujos. Tales documentos son difciles de
comprender, estn abiertos a diferentes interpretaciones y con frecuencia contienen elementos que son diseos en lugar de requisitos esenciales.
Otra complicacin frecuente es que los requisitos de un sistema software cambian
durante su desarrollo. Esto supone que un sistema grande tiende a evolucionar con el
tiempo y el mantenimiento del software en ocasiones es un trmino que no siempre est
bien acuado.
Para ser ms preciso, existen diferentes trminos a definir: el mantenimiento busca
errores, la evolucin responde a cambios de requisitos, y la conservacin, cuando se utilizan medios para mantener piezas de software en funcionamiento. Desgraciadamente,
la realidad sugiere que un porcentaje alto de los recursos de desarrollo de software se
gastan en la conservacin del software.

1 2 . 1 . 2 . La dificultad de gestionar el proceso de desarrollo


La produccin de un programa se puede dividir en diferentes fases:
anlisis, diseo, codificacin y depuracin, prueba y mantenimiento.
Estas f a s e s se conocen como ciclo de vida del software, y constituyen los principios bsicos en los que se apoya la ingeniera del software. Aunque e s t e libro se dedica esencialmente a la segunda y tercera fase, d e b e considerar siempre las restantes f a s e s en su proceso
de creacin de programas, sobre t o d o cuando s t o s son grandes
proyectos. La ingeniera del software trata de la creacin y produccin de programas a gran escala.

1 2 . 1 . LA COMPLEJIDAD INHERENTE AL SOFTWARE


Como Brooks sugiere, la complejidad del software es una propiedad esencial, no accidental. Para Grady Booch, esta complejidad inherente al software se deriva de cuatro
438

El tamao de un programa, no es una gran virtud en un sistema de software. Sin embargo, la escritura de un gran programa requiere la escritura de grandes cantidades de
nuevo software y la reutilizacin del software existente. Recordemos que hace dos/tres
dcadas, los programas en lenguaje ensamblador se construan a base de centenares de
lneas. Sin embargo, hoy da es usual encontrar sistemas en funcionamiento cuyo tamao se mide en cercenares de millares, o incluso millones de lneas de cdigo. Esta
caracterstica se facilita descomponiendo la implementacin en centenares y a veces millones de mdulos independientes. Esta cantidad de trabajo exige el uso de un gran equipo
de desarrolladores, aunque se trata por todos los medios de que este equipo sea lo ms
pequeo posible, puesto que, a medida que haya ms desarrolladores, se producen comunicaciones entre ellos ms complejas, e incluso con coordinacin difcil entre ellos,
particularmente, si el equipo est disperso geogrficamente, como suele ser el caso de
proyectos grandes.
La rotura de una aplicacin en entidades y relaciones que son significativas a los
usuarios, es una fase del anlisis convencional y las tcnicas de diseo. Con la progra-

440

Programacin

en Turbo/Borland

Ingeniera de software

Pascal 7

441

macin orientada a objetos, este proceso de descomposicin se extiende a la fase de implementacin. Es ms fcil disear e implementar aplicaciones orientadas a objetos, ya
que los objetos en el d o m i n i o de la aplicacin se corresponden directamente a objetos
en el dominio del software.

1 2 . 1 . 3 . La flexibilidad a travs del software


El software ofrece flexibilidad, de m o d o que es posible para un desarrollador expresar,
prcticamente cualquier clase de abstraccin.
Los sistemas orientados a objetos proporcionan el rendimiento, la flexibilidad y funcionalidad requerida para implementaciones prcticas. La programacin se puede hacer
con extensiones de lenguajes comerciales, tales como Object-Pascal (Turbo Pascal, Borland Pascal, Mac Pascal, etc.) y C++, que incorpora a sus tpicas propiedades, las propiedades orientadas a objetos, y lenguajes 0 0 puros como Smalltalk y Eiffel. Adems, las
ayudas de programacin actual, mejoran la capacidad del programador para administrar
y modificar sistemas mientras se desarrollan.
La programacin orientada a objetos expande tambin la variedad de aplicaciones
que se pueden programar debido a que se liberan las restricciones de los tipos de datos
predefinidos, y acomoda estructuras de datos heterogneos y complejos. Se pueden aadir nuevos tipos de datos sin modificar cdigo existente.

Figura 1 2 . 1 .

Ciclo de vida del software.

1 2 . 2 . LA CRISIS DEL SOFTWARE


En 1968 una conferencia sobre software, patrocinada por la O T A N , asumi los trminos
ingeniera del software y crisis del software. Con estos trminos se quera expresar que el
software era caro, poco fiable y escaso.
Las metodologas y tcnicas estructurales que han reinado en las dcadas de los setenta y ochenta, no han eliminado el problema y de hecho la crisis del software, contina
hoy da, pese a las muchas herramientas y mtodos utilizados, los problemas del diseo
descendente permanecen igual, posiblemente debido a que la complejidad del problema
ha crecido considerablemente.
Entre las diferentes fases del ciclo de vida del software (Figura 12.1), el m a n t e n i miento, aunque en tiempos fue despreciada su importancia, se considera actualmente
c o m o uno de los problemas ms rigurosos en el desarrollo del software.
Muchos investigadores sugieren que los costes de software requieren ms de la mitad
de los costes y recursos globales en el desarrollo de software (Figura 12.2).
Los cambios realizados en la evolucin de un programa son p u n t o dbil de los mtodos tradicionales de desarrollo de software y, por el contrario, es u n o de los puntos
fuertes de los mtodos de desarrollo de software orientado a objetos.
En 1986, Fredrick P. Brooks, en un famoso artculo No Silver Bullet (ninguna bala
de plata), apuntaba que en los ltimos diez aos no se haba producido ningn progreso
significativo en el desarrollo de software, y analizaba crticamente todas las tecnologas
ms prometedoras. Aunque l confesaba que tena ms confianza en la programacin
' Brooks, Frederik P. Jr.: N o Silver Bullet, Computer,

pp. 10-19 abril 1986.

Mantenimiento
67 %

Figura 1 2 . 2 .

Costes de las diferentes f a s e s del ciclo de vida de un proyecto software.

orientada a objetos que en cualquier otra tecnologa, mantena dudas sobre sus ventajas
efectivas.
Recientemente, las propuestas de reutilizabilidad
o reusabilidad co-eusability (reutilizacin) de componentes software, se consideran c o m o bloques iniciales para la construccin del programa, de m o d o similar a la construccin de cualquier objeto complejo
(tal c o m o u n automvil) que se construye ensamblando sus partes.

442

Programacin

en Turbo/Borland

Pascal 7

En respuesta al artculo de Brooks, Brad Cox 2 el inventor de Objetive-C, public un


artculo en el que esencialmente rebata las tesis de Brooks:
Existe una bala de plata. Es un arma tremendamente potente, impulsada por vastas
fuerzas econmicas que nuevos obstculos tcnicos slo pueden resistir brevemente.
La bala de plata es un cambio cultural en lugar de un cambio tecnolgico. Es un nuevo
paradigma, una revolucin industrial basada en partes reutilizables e intercambiables que
modificarn el universo del software de igual modo que la revolucin industrial cambi
la fabricacin.

Ingeniera de software

443

Correccin
Capacidad de los productos software de realizar exactamente las tareas definidas por su
especificacin.
Robustez
Capacidad de los productos software de funcionar incluso en situaciones anormales.
Extensibilidad

Por consiguiente, la P O O (Programacin Orientada a Objetos) 3 no slo son nuevos


lenguajes de programacin, sino un nuevo m o d o de pensar y disear aplicaciones que
pueden ayudar a resolver problemas que afectan al desarrollo del software. Sin embargo,
el lenguaje debe ser capaz de soportar el nuevo paradigma y es, por consiguiente, una
parte esencial de esta revolucin.

Facilidad que tienen los productos de adaptarse a cambios en su especificacin.


Existen dos principios fundamentales para conseguir esto:
diseo simple;
descentralizacin.
Reutilizacin

1 2 . 3 . FACTORES EN LA CALIDAD DEL SOFTWARE


La construccin de software requiere el cumplimiento de numerosas caractersticas. Entre ellas se destacan las siguientes:
Eficiencia
La eficiencia de un software es su capacidad para hacer un buen uso de los recursos que
manipula.
Transportabilidad (portabilidad)
La transportabilidad
o portabilidad
es la facilidad con la que un software puede ser
transportado sobre diferentes sistemas fsicos o lgicos.
Verificabilidad
La verificabilidad o facilidad de verificacin de u n software, es su capacidad para soportar los procedimientos de validacin y de aceptar juegos de test o ensayo de programas.
Integridad
La integridad es la capacidad de un software a proteger sus propios componentes contra
los procesos que no tengan el derecho de acceder.
Fcil d e utilizar
U n software es fcil de utilizar si se puede comunicar con l de manera c m o d a .

Cox, Brad J.: There is a Silver Bullet. Byte, 209-218, octubre 1987.
En los Captulos 22, 23 y 24 se estudia el concepto del tipo de dato objeto, as c o m o la sintaxis y estructura de las caractersticas 0 0 de T u r b o / B o r l a n d Pascal 7 y las tcnicas de programacin orientada a objetos
con dicho lenguaje.
J

Capacidad de los productos de ser reutilizados, en su totalidad o en parte, en nuevas aplicaciones.


Compatibilidad
Facilidad de los productos para ser combinados con otros.

12.4.

EL CICLO DE VIDA DEL SOFTWARE

Existen dos niveles en la construccin de programas: aquellos relativos a pequeos programas (aquellos que n o r m a l m e n t e realizan programadores individuales) y aquellos que
se refieren a sistemas de desarrollo de programas grandes {proyectos de software) y que,
generalmente, requieren un equipo de programadores en lugar de personas individuales.
El primer nivel se d e n o m i n a programacin a pequea escala-, el segundo nivel se denom i n a programacin a gran escala.
La programacin en pequea escala se preocupa de los conceptos que ayudan a crear
pequeos programas aquellos que varan en longitud desde unas pocas lneas a unas
pocas pgjnas. En estos programas se suele requerir claridad y precisin mental y tcnica. En realidad, el inters mayor desde el p u n t o de vista del futuro programador profesional est en los programas de gran escala que requiere de unos principios slidos y
firmes de lo que se conoce como ingeniera de software y que constituye un c o n j u n t o de
tcnicas para facilitar el desarrollo de programas de c o m p u t a d o r a . Estos programas o
mejor proyectos de software estn realizados por equipos de personas dirigidos por un
director de proyectos (analista o ingeniero de software) y los programas pueden tener ms
de 100.000 lneas de cdigo.
El desarrollo de un buen sistema de software se realiza durante el ciclo de vida que
es el perodo de tiempo que se extiende desde la concepcin inicial del sistema hasta su
eventual retirada de la comercializacin o uso del mismo. Las actividades h u m a n a s relacionadas con el ciclo de vida implican procesos tales c o m o anlisis de requisitos, diseo, i m p l e m e n t a c i n , codificacin, pruebas, verificacin, d o c u m e n t a c i n , m a n t e n i -

444

Programacin

miento y evolucin del sistema y obsolescencia. En esencia el ciclo de vida del software
comienza con una idea inicial, incluye la escritura y depuracin de programas, y contina durante aos con correcciones y mejoras al software original 4 .
El ciclo de vida del software es un proceso iterativo, de m o d o que se modificarn las
sucesivas etapas en funcin de la modificacin de las especificaciones de los requisitos
producidos en la fase de diseo o implementacin, o bien u n a vez que el sistema se ha
implementado, y probado, pueden aparecer errores que ser necesario corregir y depurar, y que requieren la repeticin de etapas anteriores.
La Figura 12.1 muestra el ciclo de vida de software y la disposicin tpica de sus diferentes etapas en el sistema conocido como ciclo de vida en cascada, que supone que la
salida de cada etapa es la entrada de la etapa siguiente.

12.4.1.

Ingeniera de software

en Turbo/Borland Pascal 7

Anlisis

La primera etapa en la produccin de un sistema de software es decidir exactamente qu


se supone ha de hacer el sistema. Esta etapa se conoce tambin c o m o anlisis de requisitos o especificaciones y por esta circunstancia muchos tratadistas suelen subdividir la
etapa en otras dos:
. Anlisis y definicin del problema.
Especificacin de requisitos.
La parte ms difcil en la tarea de crear un sistema de software es definir cul es el
problema y a continuacin especificar lo que se necesita para resolverlo. N o r m a l m e n t e
la definicin del problema comienza analizando los requisitos del usuario, pero estos requisitos, con frecuencia, suelen ser imprecisos y difciles de describir. Se deben especificar todos los aspectos del problema, pero con frecuencia las personas que describen el
problema no son programadores y eso hace imprecisa la definicin. La fase de especificacin requiere n o r m a l m e n t e la comunicacin entre los programadores y los f u t u r o s
usuarios del sistema e iterar la especificacin, hasta que tanto el especificador c o m o los
usuarios estn satisfechos de las especificaciones y hayan resuelto el problema normalmente.
En la etapa de especificaciones puede ser muy til, para mejorar la comunicacin
entre las diferentes partes implicadas, construir un prototipo o modelo sencillo del sistema final; es decir, escribir un programa prototipo que simule el c o m p o r t a m i e n t o de las
partes del producto software deseado. Por ejemplo, un programa sencillo incluso ineficiente puede demostrar al usuario la interfaz propuesta por el analista. Es m e j o r descubrir cualquier dificultad o cambiar su idea original ahora que despus de que la programacin se encuentre en estado avanzado o, incluso, terminada. El modelado de datos
es una herramienta m u y importante en la etapa de definicin del problema. Esta herramienta es m u y utilizada en el diseo y construccin de bases de datos.
Tenga presente que el usuario final, normalmente, no conoce exactamente lo que desea haga el sistema. Por consiguiente el analista de software o programador, en su caso,
debe interactuar con el usuario para encontrar lo que el usuario desear haga el sistema.

4
Carrano, Hellman y Verof: Data structures
Curamings Puhlishing, 1993, p. 210.

and problem solving with Turbo Pascal, T h e B e n j a m i n g /

445

En esta etapa se debe responder a preguntas tales como:


Cules son los datos de entrada?
Qu datos son vlidos y qu datos no son vlidos?
Quin utilizar el sistema: especialistas cualificados o usuarios cualesquiera (sin formacin)?
Qu interfaces de usuario se utilizarn?
Cules son los mensajes de error y de deteccin de errores deseables? Cmo debe
actuar el sistema cuando el usuario cometa un error en la entrada?
Qu hiptesis son posibles?
Existen casos especiales?
Cul es el formato de la salida?
Qu documentacin es necesaria?
Qu mejoras se introducirn probablemente- al programa en el futuro?
Cmo debe ser de rpido el sistema?
Cada cunto tiempo ha de cambiarse el sistema despus que se haya entregado?
El resultado final de la fase de anlisis es una especificacin de los requisitos del software.

Descripcin del problema previa y detalladamente.


Prototipos de programas que puedan clasificar el problema.

12.4.2.

Diseo

La especificacin de un sistema indica lo que el sistema debe hacer. La etapa de diseo


del sistema indica cmo ha de hacerse. Para un sistema pequeo, la etapa de diseo puede
ser tan sencilla c o m o escribir un algoritmo en pseudocdigo. Para un sistema grande,
esta etapa incluye tambin la fase de diseo de algoritmos, pero incluye el diseo e interaccin de un n m e r o de algoritmos diferentes, con frecuencia slo bosquejados, as
c o m o u n a estrategia p a r a c u m p l i r todos los detalles y p r o d u c i r el cdigo correspondiente.
Es preciso determinar si se pueden utilizar programas o subprogramas que ya existen
o es preciso construirlos totalmente. El proyecto se ha de dividir en mdulos utilizando
los principios de diseo descendente. A continuacin, se debe indicar la interaccin entre m d u l o s ; u n d i a g r a m a de estructuras p r o p o r c i o n a un e s q u e m a claro de estas
relaciones 3 .
En este punto, es importante especificar claramente no slo el propsito de cada mdulo, sino tambin el flujo de datos entre mdulos. Por ejemplo, se debe responder a las
5
Para ampliar sobre este tema de diagramas de estructuras, puede
mentos de programacin,
2. a edicin. McGraw-Hill, 1996; Problemas
McGraw-Hill, 1992 o bien las obras Pascal y Turbo Pascal. Un enfoque
moso, McGraw-Hill, 1995 o bien Fundamentos de programacin. Libro
y Fernndez, McGraw-Hill, 1996.

consultar estas obras nuestras: Fundade metodologa de a programacin,


prctico de Joyanes, Zahonero y Herde Problemas, de Joyanes. Rodrguez

446

Programacin en Turbo/Borland Pascal 7

siguientes preguntas: Q u datos estn disponibles al m d u l o antes de su ejecucin? Qu


s u p o n e el m d u l o ? Q u h a c e n los datos despus de que se e j e c u t a el m d u l o ? P o r consiguiente, se d e b e n especificar en detalle las hiptesis, e n t r a d a y salida p a r a cada m d u l o .
U n m e d i o para realizar estas especificaciones es escribir u n a precondicin,
q u e es u n a
descripcin de las c o n d i c i o n e s q u e deben cumplirse al p r i n c i p i o del m d u l o y u n a postcondicin, que es u n a descripcin de las condiciones al final de u n m d u l o . P o r ejemplo,
se p u e d e d e s c r i b i r u n p r o c e d i m i e n t o q u e o r d e n a u n a lista ( u n a r r a y ) de la f o r m a siguiente:
procedure ordenar {A, n)
(Ordena una lista en orden ascendente

precondicin: A es un array de N enteros, 1<= n <= Max.


postcondicin: A[1] <= A[2] < . . . < = a [ n ] , n es inalterable)
P o r l t i m o , se p u e d e utilizar p s e u d o c d i g o 6 p a r a especificar los detalles del algoritmo. Es i m p o r t a n t e q u e se e m p l e e bastante t i e m p o en la fase de d i s e o de sus programas. El resultado final de diseo descendente es u n a solucin q u e d e b e facilitar su trad u c c i n en estructuras de c o n t r o l y estructuras de datos de u n l e n g u a j e de p r o g r a m a c i n
especfico e n n u e s t r o caso, T u r b o Pascal.

El gasto de tiempo en la tase de diseo ser ahorro de tiempo cuando se escriba y depure su

1 2 . 4 . 3 . Implementacin (Codificacin)
La e t a p a de implementacin
(codificacin) t r a d u c e el diseo en u n p r o g r a m a escrito en
u n l e n g u a j e d e p r o g r a m a c i n . Los algoritmos y las e s t r u c t u r a s d e d a t o s realizadas en
pseudocdigo h a n de traducirse a u n lenguaje q u e e n t i e n d e la c o m p u t a d o r a .

1 2 . 4 . 4 . Pruebas e integracin
C u a n d o los d i f e r e n t e s c o m p o n e n t e s de u n p r o g r a m a se h a n i m p l e m e n t a d o y c o m p r o b a d o i n d i v i d u a l m e n t e , el sistema c o m p l e t o se e n s a m b l a y se integra.
La etapa de p r u e b a s sirve p a r a m o s t r a r q u e u n p r o g r a m a es correcto. Las p r u e b a s
n u n c a son fciles. E d g a r D r j k s t r a h a escrito q u e m i e n t r a s q u e las p r u e b a s r e a l m e n t e
m u e s t r a n la presencia de errores, n u n c a puede mostrar su ausencia. U n a p r u e b a con xito
en la ejecucin significa slo q u e no se h a n descubierto errores en esas circunstancias
especficas, pero n o se dice n a d a de otras circunstancias. E n teora el n i c o m o d o q u e
u n a p r u e b a p u e d e m o s t r a r q u e u n p r o g r a m a es correcto si todos los casos posibles se h a n
6
Para consultar el tema del pseudocdigo, vanse las obras: Fundamentos de programacin. Algoritmos y
estructuras de datos, 2. a edicin. McGraw-Hi, 1996 de Luis Joyanes y Fundamentos de programacin. Libro
de problemas, McGraw-Hill, 1996 de Luis Joyanes, Luis Rodrguez y Matilde Fernndez.

Ingeniera de software

447

i n t e n t a d o y c o m p r o b a d o (es lo q u e se c o n o c e c o m o prueba exhaustiva); es u n a situacin


t c n i c a m e n t e i m p o s i b l e i n c l u s o p a r a los p r o g r a m a s m s sencillos. S u p o n g a m o s , p o r
e j e m p l o , q u e se ha escrito u n p r o g r a m a q u e calcule la nota m e d i a de un e x a m e n . U n a
p r u e b a exhaustiva requerir todas las c o m b i n a c i o n e s posibles de m a r c a s y t a m a o s de
clases; p u e d e llevar m u c h o s a o s c o m p l e t a r la p r u e b a .
L a fase de p r u e b a s es u n a parte esencial de u n p r o y e c t o de p r o g r a m a c i n . D u r a n t e la
fase de p r u e b a s se necesita eliminar t a n t o s errores lgicos c o m o p u e d a . E n p r i m e r lugar,
se debe p r o b a r el p r o g r a m a con datos de e n t r a d a vlidos q u e c o n d u c e n a u n a solucin
c o n o c i d a . Si ciertos datos d e b e n estar d e n t r o de u n rango, se d e b e n incluir los valores en
los e x t r e m o s finales del rango. P o r ejemplo, si el valor de e n t r a d a de n cae en el r a n g o
d e 1 a 10, se ha de asegurar incluir casos de p r u e b a en los q u e n est entre 1 y 10. T a m bin se d e b e n incluir datos n o vlidos p a r a c o m p r o b a r la c a p a c i d a d d e deteccin de errores del p r o g r a m a . Se han de p r o b a r t a m b i n algunos d a t o s aleatorios y, p o r ltim o , int e n t a r algunos datos reales.

1 2 . 4 . 5 . Verificacin
La e t a p a de pruebas ha de c o m e n z a r t a n p r o n t o c o m o sea posible en la fase de diseo y
c o n t i n u a r a lo largo de la i m p l e m e n t a c i n del sistema. Incluso a u n q u e las p r u e b a s son
h e r r a m i e n t a s e x t r e m a d a m e n t e vlidas p a r a p r o p o r c i o n a r la e v i d e n c i a de q u e u n prog r a m a es correcto y c u m p l e sus especificaciones, es difcil c o n o c e r si las p r u e b a s realizadas son suficientes. Por ejemplo, c m o se p u e d e conocer q u e son suficientes los diferentes c o n j u n t o s d e datos de p r u e b a o q u e se h a n e j e c u t a d o t o d o s los c a m i n o s posibles a
travs del p r o g r a m a ?
P o r esas razones se h a desarrollado un s e g u n d o m t o d o p a r a d e m o s t r a r la correccin
o e x a c t i t u d de u n p r o g r a m a . Este m t o d o , d e n o m i n a d o verificacin formal i m p l i c a la
c o n s t r u c c i n de pruebas m a t e m t i c a s q u e a y u d a n a d e t e r m i n a r si los p r o g r a m a s hacen
lo q u e se s u p o n e h a n de hacer. La verificacin f o r m a l implica la aplicacin de reglas form a l e s p a r a m o s t r a r q u e u n p r o g r a m a c u m p l e su especificacin: la verificacin. La verificacin f o r m a l f u n c i o n a bien en p r o g r a m a s p e q u e o s , pero es c o m p l e j a c u a n d o se utiliza en p r o g r a m a s g r a n d e s . L a teora de la v e r i f i c a c i n r e q u i e r e c o n o c i m i e n t o s
m a t e m t i c o s a v a n z a d o s y, p o r otra parte, se sale fuera de los objetivos de este libro; p o r
esta razn slo h e m o s c o n s t a t a d o la i m p o r t a n c i a de esta etapa.
La p r u e b a de q u e u n algoritmo es correcto es c o m o p r o b a r u n t e o r e m a m a t e m t i c o .
P o r ejemplo, p r o b a r q u e u n m d u l o es exacto (correcto) c o m i e n z a c o n las precondiciones ( a x i o m a s e hiptesis en m a t e m t i c a s ) y m u e s t r a q u e las e t a p a s del a l g o r i t m o c o n d u c e n a las postcondiciones. La verificacin trata de probar c o n m e d i o s m a t e m t i c o s q u e
los algoritmos son correctos.
Si se descubre u n error d u r a n t e el proceso de verificacin, se debe corregir su algor i t m o y posiblemente se h a n de m o d i f i c a r las especificaciones del p r o b l e m a . U n m t o d o
es utilizar invariantes (una condicin q u e s i e m p r e es v e r d a d e r a en un p u n t o especfico
de u n algoritmo) lo q u e p r o b a b l e m e n t e h a r que su a l g o r i t m o c o n t e n g a p o c o s errores
antes de q u e c o m i e n c e la codificacin. C o m o resultado se gastar m e n o s t i e m p o en la
d e p u r a c i n de su p r o g r a m a .

448

Programacin

en Turbo/Borland

Ingeniera de software

Pascal 7

449

1 2 . 4 . 6 . Mantenimiento
C u a n d o el p r o d u c t o software (el p r o g r a m a ) se ha t e r m i n a d o , se distribuye entre los posibles usuarios, se instala en las c o m p u t a d o r a s y se utiliza. Sin embargo, y aunque, a priori,
el p r o g r a m a f u n c i o n e correctamente, el software debe ser m a n t e n i d o y actualizado. D e
hecho, el coste tpico del m a n t e n i m i e n t o excede, con creces, el coste de p r o d u c c i n del
sistema original.
U n sistema de software p r o d u c i r errores q u e sern detectados, casi con seguridad,
por los usuarios del sistema y q u e no se descubrieron d u r a n t e la fase de prue ba . L a correccin de estos errores es parte del m a n t e n i m i e n t o del software. Otro aspecto de la fase
de m a n t e n i m i e n t o es la m e j o r a del software a a d i e n d o m s caractersticas o m o d i f i c a n d o partes existentes q u e se a d a p t e n m e j o r a los usuarios.
O t r a s causas q u e obligarn a revisar el sistema de software en la etapa de m a n t e n i m i e n t o son las siguientes: (1) C u a n d o u n n u e v o hardware se introduce, el sistema p u e d e
ser m o d i f i c a d o p a r a ejecutarlo en u n n u e v o e n t o r n o ; (2) Si c a m b i a n las necesidades del
usuario, suele ser m e n o s caro y m s rpido, m o d i f i c a r el sistema existente q u e p r o d u c i r
un sistema t o t a l m e n t e nuevo. La m a y o r parte del t i e m p o de los p r o g r a m a d o r e s de u n
sistema se gasta en el m a n t e n i m i e n t o de los sistemas existentes y n o en el diseo de sist e m a s t o t a l m e n t e nuevos. P o r esta causa, entre otras, se ha de tratar siempre de disear
p r o g r a m a s de m o d o q u e sean fciles de c o m p r e n d e r y e n t e n d e r (legibles) y fciles de
cambiar.

Figura 1 2 . 3 .

Etapas del ciclo de vida del software cuyo ncleo aglutinador


e s la documentacin.

1 2 . 5 . LA DOCUMENTACION
1 2 . 4 . 7 . La obsolescencia: programas obsoletos
La l t i m a etapa en el ciclo de vida del software es la evolucin del m i s m o , p a s a n d o p o r
su vida til hasta su obsolescencia o fase en la q u e el software se q u e d a a n t i c u a d o y es
preciso actualizarlo o escribir un n u e v o p r o g r a m a sustitutorio del antiguo.
La decisin de d a r de b a j a un software por obsoleto no es u n a decisin fcil. U n sist e m a g r a n d e representa u n a inversin e n o r m e de capital q u e parece, a p r i m e r a vista, m s
barato m o d i f i c a r el sistema existente, en vez de construir u n sistema t o t a l m e n t e n u e v o .
Este criterio suele ser, n o r m a l m e n t e , correcto y p o r esta causa los sistemas g r a n d e s se
d i s e a n para ser modificados. U n sistema p u e d e ser p r o d u c t i v a m e n t e revisado m u c h a s
veces. Sin e m b a r g o , incluso los programas grandes se q u e d a n obsoletos p o r caducida'd de
t i e m p o al pasar u n a fecha lmite d e t e r m i n a d a . A m e n o s q u e u n p r o g r a m a g r a n d e est
bien escrito y a d e c u a d o a la tarea a realizar, c o m o en el caso de p r o g r a m a s p e q u e o s ,
suele ser m s eficiente escribir un n u e v o p r o g r a m a q u e corregir el p r o g r a m a antiguo.

U n p r o g r a m a (un p a q u e t e de software) de c o m p u t a d o r a necesita siempre de u n a d o c u m e n t a c i n q u e p e r m i t a a sus usuarios a p r e n d e r a utilizarlo y m a n t e n e r l o . La d o c u m e n tacin es u n a p a r t e i m p o r t a n t e de cualquier p a q u e t e de software y, a su vez, su desarrollo
es u n a pieza clave en la ingeniera de software.
Existen tres g r u p o s de p e r s o n a s q u e n e c e s i t a n c o n o c e r la d o c u m e n t a c i n del prog r a m a : p r o g r a m a d o r e s , ope ra d o r es y usuarios. Los requisitos necesarios p a r a cada u n o
de ellos suelen ser diferentes, en f u n c i n de las m i s i o n e s de cada grupo:
programadores
operadores

usuario

1 2 . 4 . 8 . Iteracin y evolucin del s o f t w a r e


Las etapas de vida del software suelen f o r m a r parte de u n ciclo o bucle, c o m o su n o m b r e
sugiere y n o son s i m p l e m e n t e u n a lista lineal. Es probable, p o r ejemplo, q u e d u r a n t e la
fase de m a n t e n i m i e n t o tenga que volver a las especificaciones del p r o b l e m a p a r a verificarlas o modificarlas.
Obsrvese en la figura q u e las diferentes etapas r o d e a n al ncleo d o c u m e n t a c i n . La
d o c u m e n t a c i n n o es u n a etapa independiente, c o m o se p u e d e esperar, sino q u e est integrada en todas las etapas del ciclo de vida del software.

manual de mantenimiento del programa


manual del operador
operador: persona encargada de correr el programa,
introducir datos y extraer resultados
manual del usuario
usuario: persona o seccin de una organizacin que
explota el programa, conociendo su funcin, las entradas requeridas, el proceso a ejecutar y la salida que
produce

E n e n t o r n o s interactivos c o m o el caso de T u r b o Pascal, las misiones del u s u a r i o y


o p e r a d o r suelen ser las m i s m a s . As pues, la d o c u m e n t a c i n del p r o g r a m a se p u e d e concretar a:
manual del usuario,
manual de mantenimiento.

450

Ingeniera de software

Programacin en Turbo/Borland Pascal 7

D o c u m e n t a c i n d e usuario
La documentacin de un paquete (programa) de software suele producirse con dos propsitos: uno, es explicar las funciones del software y describir el m o d o de utilizarlas (documentacin
del usuario) p o r q u e est diseada para ser leda por el usuario del prog r a m a ; dos, describir el software en s p a r a poder m a n t e n e r el sistema en u n a etapa
posterior de su ciclo de vida (documentacin del sistema o de mantenimiento)1.
La documentacin de usuario es un instrumento comercial importante. U n a buena
documentacin de usuario har al programa ms accesible y asequible. H o y da es u n a
prctica habitual que m u c h o s creadores de programas contratan escritores tcnicos para
elaborar esta parte del proceso de p r o d u c c i n de u n p r o g r a m a . Esta d o c u m e n t a c i n
adopta la forma de un m a n u a l que presenta una introduccin a las funciones ms utilizadas del software, una seccin que explica cmo instalar el programa y u n a seccin de
referencia que describe los detalles de cada funcin del software. Es frecuente que el manual se edite en f o r m a de libro, a u n q u e cada vez es m s frecuente incluirlo adems, o en
lugar, del libro en el propio programa y suele denominarse manual de ayuda en lnea.
La documentacin del sistema o m a n u a l de m a n t e n i m i e n t o es por naturaleza m s
tcnica que la del usuario. Antiguamente esta documentacin consista en los programas
fuente finales y algunas explicaciones sobre la construccin de los mismos. H o y da esto
ya no es suficiente y es necesario estructurar y ampliar esta documentacin.
La d o c u m e n t a c i n del sistema abarca todo el ciclo de vida del desarrollo del software, incluidas las especificaciones originales del sistema y aquellas con las que se verific el sistema, los diagramas de flujo de datos (DFD), diagramas entidad-relacin (DER),
diccionario de datos y diagramas o cartas de estructura q u e representan la estructura
modular del sistema.
El problema ms grave que se plantea es la construccin prctica real de la d o c u m e n tacin y su continua actualizacin. Durante el ciclo de vida del software cambian cont i n u a m e n t e las especificaciones, los diagramas de flujo y de E / R (Entidad/Relacin) o el
diagrama de estructura; esto hace que la documentacin inicial se quede obsoleta o incorrecta y, por esta causa, la documentacin requiere una actualizacin continua de m o d o
que la documentacin final sea lo ms exacta posible y se ajuste a la estructura final del
programa.

1 2 . 5 . 1 . Manual de mantenimiento
(documentacin para programadores)
El m a n u a l de m a n t e n i m i e n t o es la d o c u m e n t a c i n requerida para m a n t e n e r un programa durante su ciclo de vida. Se divide en dos categoras:
documentacin interna,
documentacin externa.

451

Cabecera de programa (nombre del programador, fecha de la versin actual, breve


descripcin del programa).
N o m b r e s significativos para describir identificadores.
Comentarios relativos a la f u n c i n del programa c o m o en todo, as c o m o los mdulos que c o m p r e n d e n el programa.
Claridad de estilo y f o r m a t o [una sentencia por lnea, Mentacin
(sangrado)], lneas en blanco para separar mdulos (procedimientos, funciones, unidades, etc.).
Comentarios significativos.

Ejemplos
var
Radio...

{entrada, radio de un c r c u l o }

{Calcular A r e a }
{Area := Pi * radio * radio;

Documentacin externa
Documentacin ajena al programa fuente, que se suele incluir en un m a n u a l q u e acompaa al programa. La d o c u m e n t a c i n externa debe incluir:
Listado actual del programa fuente, m a p a s de memoria, referencias cruzadas, etc.
Especificacin del programa: d o c u m e n t o que define el propsito y m o d o de funcionamiento del programa.
Diagrama de estructura que representa la organizacin jerrquica de los mdulos
que comprende el programa.
Explicaciones de frmulas complejas.
Especificacin de los datos a procesar: archivos externos incluyendo el f o r m a t o de
las estructuras de los registros, campos etc.
Formatos de pantallas utilizados para interactuar con los usuarios.
Cualquier indicacin especial q u e pueda servir a los p r o g r a m a d o r e s q u e deben
mantener el programa.

1 2 . 6 . METODOS FORMALES DE VERIFICACION


DE PROGRAMAS
A u n q u e la verificacin formal de programas se sale fuera del m b i t o de este libro, por su
importancia vamos a considerar dos conceptos clave, asertos (afirmaciones) y precondiciones/postcondiciones
invariantes que ayuden a d o c u m e n t a r , corregir y clarificar el diseo de mdulos y de programas.

D o c u m e n t a c i n interna

1 2 . 6 . 1 . Aserciones 8

Esta documentacin cubre los aspectos del programa relativos a la sintaxis del lenguaje. Esta documentacin est contenida en los comentarios, encerrados entre llaves { } o
bien parntesis/asteriscos (* *). Algunos tpicos a considerar son:

U n a parte importante de u n a verificacin formal es la d o c u m e n t a c i n de un programa


a travs de asertos o afirmaciones - s e n t e n c i a s lgicas acerca del programa q u e se decla-

Brookshear, Glen J.: Introduccin a las ciencias de la computacin, Addison-Wesley, 1995, p. 272.

8
Este trmino se suele traducir tambin por afirmaciones o declaraciones. El trmino aserto est extendido
en la jerga informtica, pero no es aceptado por el DRAE (Diccionario de la Real Academia Espaola).

452

Ingeniera de software

Programacin en Turbo/Borland Pascal 7

Lectura de un entero entre Min y Max en N


Pre : Min y Max son valores asignados
Post: devuelve en N el primer valor de dato entre Min y Max
si Min <= Max es verdadero; en caso contrario
N no esta definido.

ran verdaderas. U n aserto se escribe como un comentario y describe lo que se supone


sea verdadero sobre las variables del programa en ese punto.

Un aserto es una frase sobre una condicin especfica en un cierto punto de un algoritmo o
programa.
'
-

Ejemplo 1 2 . 1 .
El siguiente fragmento de programa contiene una secuencia de sentencias de asignacin,
seguidas por un aserto
A
X

:= 10;
:= A;

: = X + A;

{ aserto
< aserto

: A es 10 }
: X es 10 }

La precondicin indica que los parmetros de entrada Min y Max se definen antes
de que comience la ejecucin del procedimiento. La postcondicin indica que la ejecucin del procedimiento asigna el primer dato entre Min y Max al parmetro de salida
siempre que Min < = Max sea verdadero.
Las precondiciones y postcondiciones son ms que un m t o d o para resumir acciones
de u n procedimiento. La declaracin de estas condiciones debe ser la primera etapa en
el diseo y escritura de u n procedimiento. Es conveniente en la escritura de algoritmos
de procedimientos, se escriba la cabecera del procedimiento que muestra los parmetros
afectados por el procedimiento as como unos comentarios de cabecera que contienen
las precondiciones y postcondiciones.

{ aserto : Y es 20 }

La verdad de la primera afirmacin, {A es 10}, sigue a la ejecucin de la primera sentencia con el conocimiento de que 10 es u n a constante. La verdad de la segunda afirmacin; {X es 10}, sigue de la ejecucin de X . = A con el conocimiento de que A es 10.
La verdad de la tercera afirmacin {Y es 20} sigue de la ejecucin Y := X + A con el
conocimiento de que X es JO y A es 10. En este segmento del programa se utilizan afirmaciones c o m o comentarios para d o c u m e n t a r el cambio en una variable de programa
despus que se ejecuta cada sentencia de afirmacin.
La tarea de utilizar verificacin formal es probar que un segmento de programa c u m ple su especificacin. La afirmacin final se llama postcondicin (en este caso, (Y es 20}
y sigue a la presuncin inicial o precondicin (en este caso, {10 es u n a constante} despus
que se ejecuta el segmento de programa.

12.6.2.

453

Precondiciones y postcondiciones

Las precondiciones y postcondiciones son afirmaciones sencillas sobre condicions al


principio y al final de los mdulos. U n a precondicin de un procedimiento es u n a afirmacin lgica sobre sus parmetros de entrada; se supone que es verdadera cuando se
llama al procedimiento. U n a postcondicin de un procedimiento puede ser u n a afirmacin lgica que describe el cambio en el estado del programa producido por la ejecucin
del procedimiento; la postcondicin describe el efecto de llamar al procedimiento. E n
otras palabras, la postcondicin indica que ser verdadera despus que se ejecute el procedimiento.

1 2.6.3.

R e g l a s para p r u e b a d e p r o g r a m a s

U n medio til para probar que un programa P hace lo que realmente ha de hacer es proporcionar aserciones que expresen las condiciones antes y despus de que P sea ejecutado. En realidad las aserciones son c o m o sentencias o declaraciones que pueden ser o
bien verdaderas o bien falsas.
La primera asercin, la precondicin describe las condiciones que han de ser verdaderas antes de ejecutar P.
La segunda asercin, la postcondicin, describe las condiciones que han de ser verdaderas despus de que P se ha ejecutado (suponiendo que la precondicin fue verdadera
antes). El modelo general es
iprecondicin}

{= condiciones lgicas que son verdaderas


antes de que P se ejecute)

lpostcondicin}

{= condiciones lgicas que son verdaderas


despus de que P se ejecute;

Ejemplo 1 2 . 3 .

Ejemplo 1 2 . 2
1Precondiciones y postcondiciones del procedimiento L e e r E n t e r o s }
procedure LeerEnteros

Precondicin: Predicado lgico que debe cumplirse al: comenzar la: ejecucin .de una operacin.
Postcondicin: Predicado lgico que debe cumplirse al acabar la ejecucin de una operacin,
siempre que se haya cumplido previamente la precondicin correspondiente.

(Min, Max:Integer; var N: "Integer);

El procedimiento Ordenarse!eccion (A, m, n) ordena a los elementos del array A{m. .n] en
orden descendente. El modelo correspondiente puede escribirse as:
$n}

{precondicin: A ha de tener al menos 1 elemento}

454

Programacin en Turbo/Borland Pascal 7


OrdenarSeleccion

Ingeniera de software

(A,m,n)

{programa de ordenacin a
ejecutar}
{A[m] ^ A[m+1] ^ . . . > A[n]
{postcondicin: elementos de A
en orden descendente;

Problema 12.1
Encontrar

la posicin del elemento mayor de una lista con indicacin de precondiciones

y postcondiciones.
function EncontrarMax

(var A:Lista; m,n: Integer): Integer;

12.6.4.

Invariantes de bucles

U n a invariante de bucle es una condicin que es verdadera antes y despus de la ejecucin de u n bucle. Las i n v a r i a n t e s de bucles se utilizan p a r a d e m o s t r a r la correccin
(exactitud) de algoritmos iterativos. Utilizando invariantes, se pueden detectar errores
antes de comenzar la codificacin y por esa razn reducir tiempo de depuracin y prueba.
Ejemplo 1 2 . 4 .
Un bucle que calcula la suma de los n primeros elementos

{precondicin : m < n
{postcondicin : devuelve posicion elemento mayor en A[ra..n]}

del array (lista) A:

{calcular la suma de A[1], A [ 2 ] , . . . A [ n ] }


{asercin n >= 14}
Suma := 0;
j := 1;

var i, j : Integer;
begin
i := m;
j := m;
{asercin)
{ (i=m) " ( j ^ j ' t m < n) ;

455

w h i l e j <= n do
begin
Suma := Suma + A[j];
j
:= succ(j)

{", operador and}

repeat
i : = i + i;

end

if A[i] > A[j] then j := i;


until i = n;
EncontrarMax := j;
{devuelve j como elemento mayor;
end;

Antes de que este bucle comience la ejecucin Suma es 0 y j es 1. Despus que el bucle
se ha e j e c u t a d o u n a vez, Suma es /1[1] y j es 2.

Invariante

del bucle Suma es la suma de los elementos A[l] a Afj-1],

Problema 1 2 . 2
Ordenar por el mtodo seleccin

una lista de enteros con precondiciones

y postcondi-

ciones.
procedure OrdenarSeleccion

(var A:Lista; m,n

Un invariante es un predicado que cumple tanto antes como despus de cada iteracin
(vuelta) y que describe la misin del bucle.

: Integer);

{precondicin : m ^ n}
{postcondicin : A[m,n] esta ordenado tal que
A[m] > A[m+1] > ... > A[n

Ejemplo 1 2 . 5 .

var PosicionMax, Aux

Invariante

begin
if m < n then
begin
PosicionMax

: Integer;

:= EncontrarMax

(A,m,n);

{ A[PosicionMax]
A[m..n] }
{intercambiar A[m] <-> A (PosicionMax] }
Aux := A[m];
A[m] := A[PosicionMax];
A[PosicionMax] := Aux;
{ A[m]
A[m. .n] ;
OrdenarSeleccion (A,m+l,n);
{produce : A [m+1] ^ A[m+2]

{asercin n>= 1}
suma := 0;
i := 1;

{precondicin}

w h i l e i <= n do
begin
Suma := Suma + i;
i := i + 1
end
{asercin: Suma es 1+2+3+...+n1+n}

{postcondicin}

...A[n] ;

end {if}
end

de un bucle que sume n enteros fn entero positivo)

i, Suma, n s o n d e t i p o e n t e r o .

{Asercin final: A(m] ^ Am+1] J; . . . ^ A[n] ;


{OrdenarSeleccion}

Una invariante del bucle puede ser:


(invariante: i <= n+1 y Suma es 1+2+..i-1}

456

Programacin en Turbo/Borland Pascal 7

Ingeniera de software

lo que significa: i debe ser menor que o igual que n+1 y despus de cada pasada o vuelta,
Suma es igual a la suma de todos los enteros positivos menores que i.
En la verificacin de programas la invariante del bucle se utiliza para probar que el
bucle cumple su especificacin. Para nuestro propsito, se puede utilizar el invariante
del bucle para documentar el comportamiento del mismo y se situar justo antes del
cuerpo del bucle.

Ejemplo
En los bucles for es posible declarar tambin invariantes, pero teniendo presente la particularidad de esta sentencia: la variable de control del bucle es indefinida despus que se
sale del bucle, por lo que para definir su invariante se ha de considerar que dicha variable
de control se incrementa antes de salir del bucle y mantiene su valor final.
{precondicin n >= l}
Suma := 0;

{Suma de enteros 1 a n;
{precondicin : n >= 14;
S urna : = 0;
i := 1;

for i := 1 to n do
{invariante : i <= n+1 y Suma es l+2+...i-l}
Suma := Suma + i;

while i <= n do
{invariante: i <= n+1 y Suma es l+2+...i-l;
begin
Suma := Suma + i;
i := i+1
end;
{postcondicin

Invariantes

Escribir
datos.

de diseo

Otra aplicacin de los invariantes de bucle es la especificacin del bucle: iniciacin, condicin de repeticin y cuerpo del bucle.

Ejemplo 12.6

{invariante : i <= n y Suma es la suma de todos los nmeros


ledos del teclado}

Se puede deducir que:


{Iniciacin}

i < n
{condcion/prueba
del bucle}
Read (Item);
Suma := Suma + Item;
{cuerpo del bucle}
i := i + 1;

Con toda esta informacin es una tarea fcil escribir el bucle de suma
Suma := 0.0;
i := 0;
while i < n do

{i, toma los valores 0,1,2,3,..n1}

begin
Read (Item);
Suma := Suma + Item;
i := i + 1
end;

un bucle controlado por centinela

que calcule el producto

de un conjunto de

{Calcular el producto de una serie de datos}


{precondicin : centinela es constante}
Producto := 1;
W r i t e l n ('Para terminar, introduzca', Centinela:!);
W r i t e l n ('Introduzca nmero:');
ReadLn (Numero);
w h i l e Numero <> Centinela do
{invariante: Producto es el producto de todos los
valores ledos en N u m e r o y ninguno era el
Centinela}

Si la variante de un bucle es:

Suma := 0.0:
i : = 0;

{postcondicin: Suma es 1+2+3+..n-l+n}

Problema 1 2 . 3

: Suma es 1+2+3+..n-l+n;

de bucle como herramientas

457

begin
Producto := Producto * Numero;
W r i t e L n ('Introduzca nmero siguiente:');
ReadLn (Numero)
end;
{postcondicin: Producto es el producto de todos los
nmeros ledos en N u m e r o antes del
centinela}
,

1 2 . 6 . 5 . Etapas para establecer la exactitud (correccin)


de un programa
Se pueden utilizar invariantes para establecer la correccin de un algoritmo iterativo.
Supongamos el algoritmo ya estudiado anteriormente.
{calcular la suma de A[l], A [ 2 ] , . . . A [ n ] }
Suma := 0;
j := 1;
w h i l e j <= N do
begin
Suma := Suma + A[j];
j
:= succ(j)
end
{invariante: Suma es la suma de los elementos A[l] a A [ j 1 ] }

458

Programacin

en Turbo/Borland

Ingeniera de software

Pascal 7

Los siguientes cuatro puntos han de ser verdaderos 9 :


1. El invariante debe ser inicialmente verdadero, antes de que comience la ejecucin
por primera vez del bucle. En el ejemplo anterior, Suma es 0 y j es 1 inicialmente.
En este caso, el invariante significa que Suma contiene la suma de ios elementos
A[ 1 ] a A [0], que es verdad ya que no hay elementos en este rango.
2. Una ejecucin del bucle debe mantener el invariante. Esto es si el invariante es verdadero antes de cualquier iteracin del bucle, entonces se debe demostrar que es
verdadero despus de la iteracin. En el ejemplo, el bucle aade A[j] a Suma y a
continuacin incrementa y en 1. Por consiguiente, despus de una ejecucin del
bucle, el elemento aadido ms recientemente a Suma es A-[ j -1 ]; esto es el invariante que es verdadero despus de la iteracin.
3. El invariante debe capturar la exactitud del algoritmo. Esto es, debe demostrar que
si el invariante es verdadero cuando termina el bucle, el algoritmo es correcto.
Cuando el bucle del ejemplo termina, j contiene N + l y el invariante es verdadero:
Suma contiene la suma de los elementos A[l] a A[N + l) - i], que es la suma que se
trata de calcular.
4. El bucle debe terminar. Esto es, se debe demostrar que el bucle termina despus
de un nmero finito de iteraciones. En el ejemplo, j comienza en 1 y a continuacin se incrementa en 1 en cada ejecucin del bucle. Por consiguiente, j eventualmente exceder a N con independencia del valor de N. Este hecho y la caracterstica fundamental de while garantizan que el bucle terminar.

La identificacin de invariantes de bucles, ayuda a escribir bucles correctos. Se representa el


invariante como un comentario que precede a cada bucle. En el ejemplo anterior
{invariante: 1 <= j <= N+l y Suma = A [ l ] + . . . + A f j 1 J }
w h i l e j <= N do

12.7.

PRINCIPIOS DE DISEO DE S I S T E M A S

El diseo de sistemas de software de calidad requiere el cumplimiento de una serie de


caractersticas y objetivos. En un sentido general los objetivos a conseguir que se consideran tiles en el diseo de sistemas incluyen al menos los siguientes principios:
1.
2.
3.
4.
5.
6.
7.
8.
9

Modularidad mediante diseo descendente.


Abstraccin y ocultamiento de la informacin.
Modificabilidad.
Comprensibilidad y fiabilidad
Interfaces de usuario.
Programacin segura contra fallos.
Facilidad de uso.
Eficiencia.

Carrasco, Helman y Verof, op. cit.. p. 15.

459

9. Estilo de programacin.
10. Depuracin.
11. Documentacin.

12.7.1.

Modularidad m e d i a n t e d i s e o d e s c e n d e n t e

Un principio importante que ayuda a tratar la complejidad de un sistema es la modularidad. La descomposicin del problema se realiza a travs de un diseo descendente que
a travs de niveles sucesivos de refinamiento se obtendrn diferentes mdulos. Normalmente los mdulos de alto nivel especifican qu acciones han de realizarse mientras que
los mdulos de bajo nivel definen cmo se realizan las acciones.
La programacin modular tiene muchas ventajas. A medida que el tamao de un
programa crece, muchas tareas de programacin se hacen ms difciles. La diferencia
principal entre un programa modular pequeo y un programa modular grande es, simplemente, el nmero de mdulos que cada uno contiene, ya que el trabajo con programas modulares es similar y slo se ha de tener presente el modo en que unos mdulos
interactan con otros.
La modularidad tiene un impacto positivo en los siguientes aspectos de la programacin:
Construccin del programa. La descomposicin de un programa en mdulos permite que los diversos programadores trabajen de modo independiente en cada uno
de sus mdulos. El trabajo de mdulos independientes convierte la tarea de escribir un programa grande en la tarea de escribir muchos programas pequeos.
Depuracin del programa. La depuracin de programas grandes puede ser una tarea enorme, de modo que se facilitar esa tarea, al centrarse en la depuracin de
pequeos programas ms fciles de verificar.
Legibilidad. Los programas grandes son muy difciles de leer, mientras que los
programas modulares son ms fciles de leer.
Eliminacin de cdigo redundante. Otra ventaja del diseo modular es que se pueden identificar operaciones que suceden en muchas partes diferentes del programa
y se implementan como subprogramas. Esto significa que el cdigo de una operacin aparecer slo una vez, produciendo como resultado un aumento en la legibilidad y modificabilidad.

12.7.2.

Abstraccin y e n c a p s u l a m i e n t o

La complejidad de un sistema puede ser gestionada utilizando abstraccin. La abstraccin es un principio comn que se aplica en muchas situaciones. La idea pnncipal es
definir una parte de un sistema de modo que puede ser comprendido por s mismo (esto
es como una unidad) sin conocimiento de sus detalles especficos y sin conocimiento de
cmo se utiliza esta unidad a un nivel ms alto.
Existen dos tipos de abstracciones: abstraccin procedimental y abstraccin de datos.
La mayora de los lenguajes de programacin soportan este tipo de abstraccin. Es aqulla en que se separa el propsito de un subprograma de su implementacin. Una vez que
se ha escrito un subprograma, se puede utilizar sin necesidad de conocer las peculiari-

460

Programacin

en Turbo/Borland

dades de sus algoritmos. Suponiendo que el subprograma est documentado adecuadamente, se podr utilizar con slo conocer la cabecera del mismo y sus comentarios descriptivos; no necesitar conocer su cdigo.
La modularidad tratada anteriormente y la abstraccin procedimental se complementan entre s. La modularidad implica la rotura de una solucin en mdulos; la
abstraccin procedimental implica la especificacin de cada mdulo claramente antes de
que se implemente en Pascal. De hecho, lo importante es poder utilizar los subprogramas predefinidos, tales como Writeln, Sqrt, etc., o bien los definidos por el usuario sin
necesidad de conocer sus algoritmos.
El otro tipo de abstraccin, es la abstraccin de datos, soportada hoy da por diversos
lenguajes Turbo Pascal, C++, Ada-83, Ada-95. Modula-2, etc. El propsito de la abstraccin de datos es aislar cada estructura de datos y sus acciones asociadas. Es decir, se centra la abstraccin de datos en las operaciones que se realizan sobre los datos en lugar de
cmo se implementan las operaciones. Supongamos, por ejemplo, que se tiene una estructura de datos C1 i entes, que se utiliza para contener informacin sobre los clientes de
una empresa, y que las operaciones o acciones a realizar sobre esta estructura de datos
incluyen Insertar, Buscar y Borrar. El mdulo, objeto o tipo abstracto de datos, TipoCliente es una coleccin de datos y un conjunto de operaciones sobre esos datos. Tales
operaciones pueden aadir nuevos datos, buscar o eliminar datos. Estas operaciones
constituyen su interfaz, mediante la cual se comunica con otros mdulos u objetos.
Un tipo abstracto de datos (TAD) se implementar mediante unidades en Turbo Pascal. Por su importancia se dedicar un captulo completo a tratar ms detenidamente el
concepto de un TAD, su diseo e implementacin prctica.
Otro principio de diseo es la ocultacin de la informacin. El propsito de la ocultacin de la informacin es hacer inaccesibles ciertos detalles que no afecten a los otros
mdulos del sistema. Por consiguiente, el objeto y sus acciones constituyen un sistema
cerrado, cuyos detalles se ocultan a los otros mdulos.
La abstraccin identifica los aspectos esenciales de mdulos y estructura de datos, que
se pueden tratar como cajas negras. La abstraccin indica especificaciones funcionales
de cada caja negra; es responsable de su vista externa o pblica. Sin embargo, la abstraccin ayuda tambin a identificar detalles de lo que se debe ocultar de la vista pblica
detalles que no estn en las especificaciones pero deben ser privados. El principio
de ocultacin de la informacin no slo oculta detalles dentro de la caja negra sino flue
tambin asegura que ninguna otra caja negra pueda acceder a estos detalles ocultos. Por
consiguiente, se deben ocultar ciertos detalles dentro de sus mdulos y TAD, y hacerlos
inaccesibles a los restantes mdulos y TAD.
La abstraccin de datos y su expresin ms clara el tipo abstracto de datos, se implementa en Turbo Pascal con unidades.

12.7.3.

Ingeniera de software

Pascal 7

Modificabilidad

La modificabilidad se refiere a los cambios controlados de un sistema dado. Un sistema


se dice que es modificable si los cambios en los requisitos pueden adecuarse bien a los
cambios en el cdigo. Es decir, un pequeo cambio en los requisitos en un programa
modular normalmente requiere un cambio pequeo slo en algunos de sus mdulos; es
decir, cuando los mdulos son independientes (esto es, dbilmente acoplados) y cada

461

mdulo realiza una tarea bien definida (esto es, altamente cohesivos). La modularidad
aisla las modificaciones.
Las tcnicas ms frecuentes para hacer que un programa sea fcil de modificar son:
uso de subprogramas y uso de constantes definidas por el usuario.
El uso de procedimientos tiene la ventaja evidente, no slo de eliminar cdigo redundante sino tambin hace el programa resultante ms modificable. Normalmente ser un
signo de mal diseo de un programa que pequeas modificaciones a un programa requieran su reescritura completa. Un programa bien estructurado en mdulos ser ms
fcilmente modificable; es decir, si cada mdulo resuelve slo una pequea parte del
problema global, un cambio pequeo en las especificaciones del problema normalmente
slo afectar a unos pocos mdulos y en consecuencia eso facilitar su modificacin.
Las constantes definidas por el usuario o con nombre, son otro medio para mejorar
la modificabilidad de un programa.
Ejemplo 1 2 . 8
Los lmites del rango de un array suelen ser definidos mejor mediante constantes con
nombre que mediante constantes numricas. As la declaracin de un array y proceso
posterior mediante bucle tpica es:
type TipoPuntos = array [1..100] of integer;
for i := i to 100 do
proceso de los elementos

El diseo ms eficiente podra ser:


const NumeroDeltems = 100;
type TipoPunto = array [1..NumeroDeltems] of integer;
for i := 1 to NumeroDeltems do
proceso

de los

elementos

ya que cuando se desee cambiar el nmero de elementos def array slo sera necesario
cambiar el valor de la constante NumeroDeltems, mientras que en el caso anterior supondr cambiar la declaracin del tipo y el ndice de bucle, mientras que en el segundo
caso slo el valor de la constante.

1 2.7.4.

Comprensibilidad y Fiabilidad

Un sistema se dice que es comprensible si refleja directamente una visin natural del
mundo 1 0 . Una caracterstica de un sistema eficaz es la simplicidad. En general, un sistema sencillo puede ser comprendido ms fcilmente que uno complejo.
Un objetivo importante en la produccin de sistemas es el de la fiabilidad. El objetivo de crear programas fiables ha de ser crtico en la mayora de las situaciones.

10
Tremblav, Donrek y Bunt, Introduction
1989, p. 440.

lo Computer Science. An Algorithmic

approach. McGraw-Hill,

462

Programacin en Turbo/Borland Pascal 7

1 2.7.5.

Ingeniera de software

Interfaces d e usuario

function Sumalntervalo (m,n:Integer ) : Integer;

Otro criterio importante a tener presente es el diseo de la interfaz del usuario. Algunas
directrices a tener en cuenta pueden ser:
i
I

En un entorno interactivo, se ha de tener en cuenta las preguntas posibles al usuario y sobre todo aquellas que solicitan entradas de usuario.
Es conveniente que se realicen eco de las entradas de un programa. Siempre que
un programa lee datos, bien de un usuario a travs de un terminal o de un archivo,
el programa debe incluir los valores ledos en su salida.
Etiquetar (rotular) la salida con cabeceras y mensajes adecuados.

12.7.6.

Programacin s e g u r a contra fallos

Sin embargo, es ms til un mensaje tal como ste:


- 2 5 no es un nmero vlido de aos
Por favor vuelva a introducir el nmero

Otras reglas prcticas a considerar son:


No utilizar tipos subrango para detectar datos de entrada no vlidos. Por ejemplo,
si se desea comprobar que determinados tipos nunca sean negativos, se podran
cambiar las definiciones de tipo globales a:

0..maxint;
{tipo nuevo;
Bajo..Alto;
{permanece el mismo}
array[TipoMillar] of TipoNoNeg;
tipo contiene solo enteros no negativos}

Comprobar datos de entrada no vlidos


ReadLn (Grupo, Numero)
if Numero >= 0
then agregar Numero a total
else manejar el error.

Cada subprograma debe comprobar los valores de sus parmetros. As, en el caso
de la funcin Suma Intervalo que suma todos los enteros comprendidos entre my n.

Facilidad d e u s o

La utilidad de un sistema se refiere a su facilidad de uso. Esta propiedad ha de tenerse


presente en todas las etapas del ciclo de vida, pero es vital en la fase de diseo e implementacin.

12.7.8.

Error de rango

precondicin : m y n son enteros tales que m <= n


postcondicin: Devuelve Sumalntervalo = m+(m+1)+...+n
m y n son inalterables

var Suma, Indice : Integer;


begin
Suma := 0;
for Indice := m to n do
Suma := Suma + Indice;
Sumalntervalo := Suma
end;

12.7.7.

Un programa es seguro contra fallos cuando se ejecuta razonablemente por cualquiera


que lo utilice. Para conseguir este objetivo se han de comprobar los errores en datos de
entrada y en la lgica del programa.
Supongamos un programa que espera leer datos enteros positivos pero lee - 2 5 Un
mensaje tpico a visualizar ante este error suele ser:

type TipoNoNeg =
TipoMillar =
TipoTabla =
{un array de este

463

Eficiencia

El objetivo de la eficiencia es hacer un uso ptimo de los recursos del programa. Tradicionalmente, la eficiencia ha implicado recursos de tiempo y espacio. Un sistema eficiente es aqul cuya velocidad es mayor con el menor espacio de memoria ocupada. En
tiempos pasados los recursos de memoria principal y de CPU eran Tactores claves a considerar para aumentar la velocidad de ejecucin. En el ao 1997 en que las CPU (procesadores) tpicas de los PC son Pentium de 133 o 150 MHz, y son ya frecuentes los
Pentium de 200 Mhz as como los nuevos Pentium dotados de los juegos de instrucciones especiales M M X y las memorias centrales usuales son 16 Mb, el factor eficiencia ya
no se mide con los mismos parmetros de memoria y tiempo. Hoy da debe existir un
compromiso entre legibilidad, modificabilidad y eficiencia, aunque, con excepciones,
prevalecer la legibilidad y modificabilidad.

12.7.9.

Estilo d e programacin, d o c u m e n t a c i n y depuracin

Estas caractersticas hoy da son claves en el diseo y construccin de programas, por


esta causa dedicaremos por su especial importancia tres secciones independientes para
tratar estos criterios de diseo.

12.8.

ESTILO DE PROGRAMACION

Una de las caractersticas ms importantes en la construccin de programas, sobre todo


los de gran tamao, es el estilo de programacin. La buena calidad en la produccin de
programas tiene relacin directa con la escritura de un programa, su legibilidad y com-

464

Programacin

en Turbo/Borland

prensibilidad. Un buen estilo de programacin suele venir con la prctica, pero el requerimiento de unas reglas de escritura del programa, al igual que sucede con la sintaxis y
reglas de escritura de un lenguaje natural humano, debe buscar esencialmente que no
slo sean legibles y modificables por las personas que los han construido, sino tambin
y esencialmente puedan ser ledos y modificados por otras personas distintas. No
existe una frmula mgica que garantice programas legibles, pero existen diferentes reglas que facilitarn la tarea y con las que prcticamente suelen estar de acuerdo, desde
programadores novatos a ingenieros de software experimentados.
Naturalmente, las reglas de estilo para construir programas claros, legibles y fcilmente modificables, depender del tipo de programacin y lenguaje elegido. En nuestro
caso, y dado que el tipo de programacin es estructurado y el lenguaje es Pascal/Turbo
Pascal, nos centraremos en este enfoque, pero estas reglas sern fcilmente extrapolables
a otros lenguajes estructurados tales como C, C++, Ada, Modula-2, Modula-3, Java, etc.
Reglas de estilo de programacin 11
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.

Ingeniera de software

Pascal 7

Modularizar un programa en partes coherentes (uso amplio de subprogramas).


Evitar variables globales en subprogramas.
Usar nombres significativos para identificadores.
Definir constantes con nombres al principio del programa.
Evitar el uso del goto y no escribir nunca cdigo spaghetti.
Escribir subrutinas cortas que hagan una sola cosa y bien.
Uso adecuado de parmetros variable.
Usar declaraciones de tipos.
Presentacin (comentarios adecuados).
Manejo de errores.
Legibilidad.
Documentacin.

Otro criterio para juzgar un diseo es examinar cada mdulo de un sistema y determinar la fortaleza de la ligadura (enlace) dentro de ese mdulo. La fortaleza interna de
un mdulo, esto es, lo fuertemente (estrictamente) relacionadas que estn entre s las
partes de un mdulo; esta propiedad se conoce por cohesin. Un modelo cuyas partes
estn fuertemente relacionadas con cada uno de los otros se dice que es fuertemente cohesivo. Un modelo cuyas partes no estn relacionadas con otras se dice que es cohesivo
dbilmente.
Los modelos de un programa deben estar dbilmente acopiados y fuertemente cohesionados.
Como regla general, es conveniente utilizar subprogramas ampliamente. Si un conjunto de sentencias realiza una tarea recurrente, repetitiva, identificable, debe ser un subprograma. Sin embargo, una tarea no necesita ser recurrente para justificar el uso de un
subprograma.

12.8.2.

Modularizar un programa en subprogramas

Un programa grande que resuelva un problema complejo siempre ha de dividirse en mdulos para ser ms manejable. Aunque la divisin no garantiza un sistema bien organizado ser preciso encontrar reglas que permitan conseguir esa buena organizacin.
Uno de los criterios clave en la divisin es la independencia; esto es, el acoplamiento
de mdulos; otro criterio es que cada mdulo debe ejecutar una sola tarea, una funcin
relacionada con el problema. Estos criterios fundamentalmente son acoplamiento y cohesin de mdulos, aunque existen otros criterios que no se tratarn en esta seccin.
El acoplamiento se refiere al grado de interdependencia entre mdulos. El grado de
acoplamiento se puede utilizar para evaluar la calidad de un diseo de sistema. Es preciso minimizar el acoplamiento entre mdulos, es decir, minimizar su interdependencia.
El criterio de acoplamiento es una medida para evaluar cmo un sistema ha sido modularizado. Este criterio sugiere que un sistema bien modularizado es aqul en que los
interfaces sean claros y sencillos.
' [ Proverbios de programacin es el trmino utilizado por los grandes maestros de la programacin estructurada como Kernighan, Plauger, Legard, Dijkstra, etc.

Evitar variables g l o b a l e s en s u b p r o g r a m a s

Una de las principales ventajas de los subprogramas es que pueden implementar el concepto de un mdulo aislado. El aislamiento se sacrifica cuando un subprograma accede
a variables globales, dado que los efectos de sus acciones producen los efectos laterales
indeseados, normalmente.
En general, el uso de variables globales con subprogramas no es correcto. Sin embargo, el uso de la variable global, en s, no tiene por qu ser perjudicial. As, si un dato
es inherentemente importante en un programa que casi todo subprograma debe acceder
al mismo, entonces esos datos han de ser globales por naturaleza.

12.8.3.
12.8.1.

465

Usar n o m b r e s significativos para identificadores

Los identificadores que representan los nombres de mdulos, subprogramas, funciones,


tipos, variables y otros elementos, deben ser elegidos apropiadamente para conseguir
programas legibles. El objetivo es usar interfaces significativos que ayuden al lector a recordar el propsito de un identificador sin tener que hacer referencia continua a declaraciones o listas externas de variables. Hay que evitar abreviaturas crpticas.
Identificadores largos se deben utilizar para la mayora de los objetos significativos
de un programa, as como los objetos utilizados en muchas posiciones, tales como, por
ejemplo, el nombre de un programa usado frecuentemente. Identificadores ms cortos
se utilizarn estrictamente para objetos locales: as i, j, k, son tiles para ndices de arrays
en un bucle, variables contadores de bucle, etc., y son ms expresivos que ndice,
Variabl eDeControl, etc.

Los identificadores deben utilizar letras maysculas y minsculas. Cuando un identificador consta de dos o ms palabras, cada palabra debe comenzar con una letra mayscula. Una excepcin son los tipos de datos definidos por el usuario que suelen comenzar con una letra minscula. As, identificadores idneos son:
SalarioMes

Nombre

MensajeUsuario MensajesDatosMal

466

Ingeniera de software

Programacin en Turbo/Borland Pascal 7

Algunas reglas que se pueden seguir son:


Usar nombres para nombrar objetos de datos tales como variables, constantes y
tipos. Utilizar Salario mejor que APagar o Pagar.
Utilizar verbos para nombrar procedimientos. LeerCaracter, LeerSigCar,
CalcularSigMov son procedimientos que realizan estas acciones mejor que SigCar o
SigMov (siguiente movimiento).
Utilizar formas del verbo ser o estar para funciones lgicas. Sonlguales, EsCero, EsListo, y EsVacio se utilizan como variables o funciones lgicas.
if Sonlguales (A, B)

Los nombres de los identificadores de objetos deben sugerir el significado del objeto al lector
del programa.

1 2.8.4.

Definir c o n s t a n t e s con nombres

Se deben evitar constantes explcitas siempre que sea posible. Por ejemplo, no utilizar 7
para el nmero de das de la semana o 3.141592 para representar el valor de la constante 7i. En su lugar, es conveniente definir constantes con nombre que permite Pascal, tal
como:
Const Pi = 3.141592
Const NumDiasSemana = 7;
Const Longitud = 45;

Este sistema tiene la ventaja de la facilidad para cambiar un valor determinado bien
por necesidad o por cualquier error tipogrfico
Const Longitud = 200;
Const Pi = 3.141592654;
*

12.8.5.

Evitar el u s o d e g o t o

Uno de los factores que ms contribuyen a disear programas bien estructurados es un


flujo de control ordenado que implica los siguientes pasos:
1.
2.
3.
4.

El flujo general de un programa es adelante o directo.


La entrada a un mdulo slo se hace al principio y se sale slo al final.
La condicin para la terminacin de bucles ha de ser clara y uniforme.
Los casos alternativos de sentencias condicionales han de ser claros y uniformes.

El uso de una sentencia goto casi siempre viola al menos una de estas condiciones.
Adems, es muy difcil verificar la exactitud de un programa que contenga una sentencia
goto. Por consiguiente, en general, se debe evitar el uso de goto. Hay sin embargo, raras
situaciones en las que se necesita un flujo de control excepcional. Tales casos incluyen

467

aquellos que requieren o bien que un programa termine la ejecucin cuando ocurre un
error, o bien que un subprograma devuelve el control a su mdulo llamador. La inclusin en Turbo Pascal de sentencias halt y exit hacen innecesario en cualquier caso
el u s o d e goto.

12.8.6.

U s o a d e c u a d o de parmetros variable

Un programa interacta se comunica de un modo controlado con el resto del programa mediante el uso de parmetros. Los parmetros valor, que son declarados por defecto cuando no se especifica la palabra reservada var, pasa los valores al subprograma,
pero ningn cambio que el programa hace a estos parmetros se refleja en los parmetros reales de retorno a la rutina llamadora. La comunicacin entre la rutina llamadora
y el subprograma es de un solo sentido; por esta causa en el caso de mdulos aislados se
deben utilizar parmetros valor siempre que sea posible.
Cundo es adecuado usar parmetros variable? La situacin ms evidente es cuando
un procedimiento necesita devolver valores a la rutina llamadora. Sin embargo, si el procedimiento necesita devolver slo un nico valor, puede ser ms adecuado usar una funcin. Si una funcin no es adecuada entonces utilizar parmetros variables.
Es conveniente utilizar un parmetro variable para comunicar un valor de retorno
del subprograma a la rutina llamadora. Sin embargo, los parmetros variable cuyos valores permanecen inalterables hacen el programa ms difcil de leer y ms propenso a
errores si se requieren modificaciones. La situacin es anloga a utilizar una constante
en lugar de una variable cuyo valor nunca cambia. Por consiguiente, se debe alcanzar un
compromiso entre legibilidad y modificabilidad por un lado y eficiencia por otro. A menos que exista una diferencia significativa en eficiencia, se tomar generalmente el aspecto de la legibilidad y modificabilidad.

12.8.7.

U s o a d e c u a d o de f u n c i o n e s

Pascal le proporciona un sistema para realizar tareas distintas a las funciones primitivas
incorporadas al lenguaje. El mecanismo de llamada a un procedimiento o funcin definida por el usuario se puede activar desde cualquier punto de un programa en el que se
necesite ese subprograma.
En el caso de una funcin, sta se debe utilizar siempre que se necesite obtener un
nico valor. Este uso corresponde a la nocin matemtica de funcin. Por consiguiente,
es muy extrao que una funcin realice una tarea diferente de devolver un valor y no
debe hacerlo.
Una funcin no debe hacer nada sino devolver el valor requerido. Es decir, una funcin nunca
tiene un efecto lateral (secundario).
Qu funciones tienen potencial para efectos laterales (secundarios)?
Funciones con variables globales. Si una funcin referencia a una variable global,
presenta el peligro de un posible efecto lateral. En general, las funciones no deben
asignar valores a variables globales.

468

Ingeniera de software

Programacin en Turbo/Borland Pascal 7

Funciones con parmetros variable. Un parmetro variable es aqul en que su valor cambiar dentro de la funcin. Este efecto es un efecto lateral. En general, las
funciones no deben utilizar parmetros variables. Si se necesitan parmetros variable utilizar procedimientos.
Funciones que realizan entrada/salida (E/S). Las E/S son efectos laterales. Las
funciones no deben realizar E/S.

1 2 . 8 . 8 . Tratamiento de errores
Un programa diseado ante fallos debe comprobar errores en las entradas y en su lgica
e intentar comportarse bien cuando los encuentra. El tratamiento de errores con frecuencia necesita acciones excepcionales que constituirn un mal estilo en la ejecucin
normal de un programa. Por ejemplo, el manejo de funciones puede implicar el uso de
funciones con efectos laterales.
Un subprograma debe comprobar ciertos tipos de errores, tal como entradas no vlidas o parmetros valor. Qu accin debe hacer un subprograma cuando se encuentra
un error? Un sistema puede, en el caso de un procedimiento, presentar un mensaje de
error y devolver un indicador o bandera lgica a la rutina llamadora para indicarle que
ha encontrado una lnea de datos no vlida; en este caso, el procedimiento deja la responsabilidad de realizar la accin apropiada a la rutina llamadora. En otras ocasiones,
es ms adecuado que el propio subprograma tome las acciones pertinentes por ejemplo cuando la accin requerida no depende del punto en que fue llamado el subprograma.
Si una funcin maneja errores imprimiendo un mensaje o devolviendo un indicador,
viola las reglas contra efectos laterales dadas anteriormente.
Dependiendo del contexto, las acciones apropiadas pueden ir desde ignorar los datos
errneos hasta continuar la ejecucin para terminar el programa. En el caso de un error
fatal que invoque la terminacin, una ejecucin de halt puede ser el mtodo ms limpio
para abortar. Otra situacin delicada se puede presentar cuando se encuentra un error
fatal en estructuras condicionales ifrthen-else o repetitivas while, repeat. La primera accin puede ser llamar a un procedimiento de diagnstico que imprima la informacin
necesaria para ayudarle a determinar la causa del error; pero despus de que el procedimiento ha presentado toda esta informacin, se ha de terminar el programa. Sin ejnbargo, si el procedimiento de diagnstico devuelve el control al punto en el que fue llamado, debe salir de muchas capas de estructuras de control anidadas. En este caso la
solucin ms limpia es que la ltima sentencia del procedimiento de diagnstico sea halt.

12.8.9.

Legibilidad

Para que un programa sea fcil de seguir su ejecucin (la traza) debe tener una buena
estructura y diseo, una buena eleccin de identificadores, buen sangrado y utilizar lneas en blanco en lugares adecuados y una buena documentacin.
Como ya se ha comentado anteriormente se han de elegir identificadores que describan fielmente su propsito. Distinguir entre palabras reservadas, tales como for o procedure, identificadores estndar, tal como real o integer e identificadores definidos por el
usuario. Algunas reglas que hemos seguido en el libro son:

469

Las palabras reservadas se escriben en minsculas negritas (en letra courier, en el


libro).
Los identificadores, funciones estndar y procedimientos estndar en minsculas
con la primera letra en maysculas (Writeln).
Los identificadores definidos por el usuario en letras maysculas y minsculas.
Cuando un identificador consta de dos o ms palabras, cada palabra comienza con
una letra mayscula (LeerVector, Li staNumeros).
Otra circunstancia importante a considerar en la escritura de un programa es el sangrado o Mentacin de las diferentes lneas del mismo. Algunas reglas importantes a seguir para conseguir un buen estilo de escritura que facilite la legibilidad son:
Los bloques deben ser sangrados suficientemente para que se vean claramente (3
a 5 espacios en blanco puede ser una cifra aceptable).
En una sentencia compuesta, las palabras begin-end deben estar alineadas:
begin
< sentencial >
< sentencia2 >

< sentencian >


end

Sangrado consistente. Siempre sangrar el mismo tipo de construcciones de la misma


manera. Algunas propuestas pueden ser:
bucles while/repeat/for
while <condicin> do
<sentencia>

C
while <condcin> do
begin
<sentenca>
opcin 1
end
while <condicin>
begin
<sentencias>
end

do
opcin

S e n t e n c i a s if-then-else
if<condicin>
then<sentencial>
else<sentencia2>

if<condicin>
then
<sentencias>
else
<sentencias>

if<condicion>then
sentencial
else
sentencia2

470

Programacin en Turbo/Borland Pascal 7


i<condicin>
then begin
<sentencias>
end
else begin
<sentencias>
end

Ingeniera de software
if<condl>
then<accionl>
else if <cond2>
then <accion2>
else<cond2> if

Regla

Asegrese de que siempre se corresponden los comentarios y el cdigo. Si se hace un


cambio importante en el cdigo, asegrese de que se realiza un cambio similar en el comentario.

(inadecuada)

if<condl>then
<accionl>
else if<cond2>then
<accion2>
else if<cond3>then
accion3

12.8.10.

471

D o c u m e n t a c i n del programa

Un programa bien documentado es aquel que otras personas pueden leer, usar y modificar. Existen muchos estilos aceptables de documentacin y, con frecuencia, los temas
a incluir dependern del programa especfico. N o obstante sealamos a continuacin algunas caractersticas esenciales comunes a cualquier documentacin de un programa:
1. Un comentario de cabecera para el programa que incluye:
a) Descripcin del programa: propsito.
b) Autor y fecha.
c) Descripcin de la entrada y salida del programa.
d) Descripcin de cmo utilizar el programa.
e) Hiptesis sobre tipos de datos esperados.
/ ) Breve descripcin de los algoritmos globales y estructuras de datos.
g) Descripcin de las variables importantes
2. Comentarios breves en cada mdulo similares a la cabecera del programa y que
contenga informacin adecuada de ese mdulo, incluyendo en su caso precondiciones y postcondiciones. Describir las entradas y cmo las salidas se relacionan
con las entradas.
3. Escribir comentarios inteligentes en el cuerpo de cada mdulo que expliquen partes importantes y confusas del programa.
4. Describir claramente y con precisin los modelos de datos fundamentales y las
estructuras de datos seleccionadas para representarlas as c o m o las operaciones
realizadas para cada procedimiento.
Aunque existe la tendencia entre los programadores y sobre todo entre los principiantes a documentar los programas como ltima etapa, esto no es buena prctica, lo
idneo es documentar el programa a medida que se desarrolla. La tarea de escribir'un
programa grande se puede extender por periodos de semanas o incluso meses. Esto le ha
de llevar a la consideracin de que lo que resulta evidente ahora puede no serlo de aqu
a dos meses; por esta causa, documentar a medida que se progresa en el programa es una
regla de oro para una programacin eficaz.

12.8.11.

Depuracin. Localizacin y reparacin d e errores

A u n q u e se sigan todas las tcnicas de diseo dadas a lo largo del libro y en este captulo,
en particular, y cualquier otra que haya obtenido por cualquier otro medio (otros libros,
experiencias, cursos, etc.) es prcticamente imposible e inevitable que su programa carezca de errores. Afortunadamente los programas modulares, claros y bien documentados son ciertamente ms fciles de depurar que aquellos que no lo son. Es recomendable
utilizar tcnicas de seguridad contra fallos, que protejan contra ciertos errores e informen de ellos cuando se encuentran.
Con frecuencia el programador, pero sobre todo el estudiante de programacin, est
convencido de la bondad de sus lneas de programa, sin pensar en las mltiples opciones
que pueden producir los errores: el estado incorrecto de una variable lgica, la entrada
de una clusula then o else, la salida imprevista de un bucle por un mal diseo de su
contador, etc. El enfoque adecuado debe ser seguir la traza de la ejecucin del programa
utilizando las facilidades de depuracin de Turbo Pascal o aadir sentencias Write que
muestren cul fue la clusula ejecutada. En el caso de condiciones lgicas, si la condicin
es falsa cuando se espera que es verdadera c o m o el mensaje de error puede indicar
entonces el siguiente paso es determinar cmo se ha convertido en falsa.
Cmo se puede encontrar el punto de un programa en que algo se ha convertido en
una cosa distinta a lo que se haba previsto? En T u r b o Pascal se puede hacer el seguimiento de la ejecucin de un programa o bien paso a paso a travs de las sentencias del
programa o bien estableciendo puntos de ruptura (breakpoint). Se puede examinar tambin el contenido de una variable especfica bien estableciendo inspecciones/observaciones (watches) o bien insertando sentencias Wri te temporales (vase el Apndice). La clave
para una buena depuracin es sencillamente utilizar estas herramientas que indiquen lo
que est haciendo el programa.
La idea principal es localizar sistemticamente los puntos del programa que causan
el problema. La lgica de un programa implica que ciertas condiciones sean verdaderas
en puntos diferentes del programa (recuerde que estas condiciones se llaman invariantes). U n error {bugs) significa que una condicin que pensaba iba a ser verdadera no lo
es. Para corregir el error, se debe encontrar la primera posicin del programa en la que
una de estas condiciones difiera de sus expectativas. La insercin apropiada de puntos
de ruptura, y de observacin o inspeccin o sentencias Write en posiciones estratgicas
de un programa tal como entradas y salidas de bucles, estructuras selectivas y subprogramas sirven para aislar sistemticamente el error.
Las herramientas de diagnstico han de informarles si las cosas son correctas o equivocadas antes o despus de un punto dado del programa. Por consiguiente, despus de
ejecutar el programa con un conjunto inicial de diagnsticos se ha de poder seguir el error
entre dos puntos. Por ejemplo, si el programa ha funcionado bien hasta la llamada al

472

Ingeniera de software

Programacin en Turbo/Borland Pascal 7

procedimiento o funcin pi, pero algo falla cuando se llama al procedimiento P2, nos
permite centrar el problema entre estos dos puntos, la llamada a P2 y el punto concreto
donde se ha producido el error en P2. Este mtodo es muy parecido al de aproximaciones
sucesivas, es decir, ir acotando la causa posible de error hasta limitarla a unas pocas sentencias.
Naturalmente, la habilidad para situar los puntos de ruptura, de observacin o sentencias Write, depender del dominio que se tenga del programa y de la experiencia del
programador. No obstante, le damos a continuacin algunas reglas prcticas que le faciliten su tarea de depuracin.
Uso de s e n t e n c i a s Write
Las sentencias Write pueden ser muy adecuadas en numerosas ocasiones. Tales sentencias sirven para informar sobre valores de variables importantes y la posicin en el programa en que las variables toman esos valores. Es conveniente utilizar un comentario
para etiquetar la posicin.
{Posicion una}
WriteLn ('Situado en posicin una del procedimiento Test');
WriteLn ('A=', a, 'B =', b, 'C = ', c)

12.8.12.

Depuracin de s e n t e n c i a s i f - t h e n - e l s e

Situar una parte de ruptura antes de una sentencia if-then-else y examinar los valores
de las expresiones lgicas y de sus variables. Se pueden utilizar o bien puntos de ruptura
o sentencias Write para determinar qu alternativa de la sentencia if se toma:
{Examinar valores de <condicion> y variables antes de if}
if <condicin>
then
begin
WriteLn ('Condicin 1 verdadera: siga camino');
end
else
begin
WriteLn ('Condicin falsa: siga camino 1 );
end;

473

Depuracin de s u b p r o g r a m a s
Las dos posiciones clave para situar los puntos de ruptura son al principio y al final de
un subprograma. Se deben examinar los valores de los parmetros en estas dos posiciones utilizando o bien sentencias Write o ventanas de inspeccin u observacin (watches).
Lecturas de e s t r u c t u r a s d e d a t o s c o m p l e t o s
Las variables cuyos valores son arravs u otras estructuras puede ser interesante examinarlas. Para ello se recurre a escribir rutinas especficas de volcado (presentacin en pantalla o papel) que ejecuten la tarea. U n a vez diseada la rutina se llama a ella desde puntos diferentes segn interesa a la secuencia de flujo de control del programa y los datos
que sean necesarios en cada caso.

12.8.13.

Los e q u i p o s d e programacin

En la actualidad es difcil y raro que un gran proyecto de software sea implementado


(realizado) por un solo programador. Normalmente, un proyecto grande se asigna a un
equipo de programadores, que por anticipado deben coordinar toda la organizacin global del proyecto.
Cada miembro del equipo es responsable de un conjunto de procedimientos, algunos
de los cuales pueden ser utilizados por otros miembros del equipo. Cada uno de estos
miembros deber proporcionar a los otros las especificaciones de cada procedimiento,
condiciones pretest o postest y su lista de parmetros formales; es decir, la informacin
que un potencial usuario del procedimiento necesita conocer para poder ser llamado.
Normalmente, un miembro del equipo acta cpmo bibliotecario, de m o d o que a medida que un nuevo procedimiento se termina y comprueba, su versin actualizada sustituye la versin actualmente existente en la librera. U n a de las tareas del bibliotecario
es controlar la fecha en que cada nueva versin de un procedimiento se ha incorporado
a la librera, as como asegurarse de que. todos los programadores utilizan la versin ltima de cualquier procedimiento.
Es misin del equipo de programadores crear libreras de procedimientos, que posteriormente puedan ser utilizadas en otras aplicaciones. U n a condicin importante deben cumplir los procedimientos estar comprobados y ahorro de tiempo/memoria.

Depuracin de b u c l e s
Situar los puntos de ruptura al principio y al final del bucle y examinar los valores de las
variables importantes
{examinar valores de m y n antes de entrar al bucle}
for i := m to n do
begin
{Examinar los valores de i y variables importantes}
(Examinar los valores de i y variables importantes final bucle}
end;
{Examinar los valores de m y n despus de salir del bucle}

12.9.

DISEO DE ALGORITMOS

Tras la fase de anlisis, para poder solucionar problemas sobre una computadora, debe
conocerse cmo disear algoritmos. En la prctica sera deseable disponer de un mtodo
para escribir algoritmos, pero, en la realidad, no existe ningn algoritmo que sirva para
realizar dicha escritura. El diseo de algoritmos es un proceso creativo. Sin embargo,
existen una serie de pautas o lneas a seguir que ayudarn al diseo del algoritmo
(Tabla 12.1).
De cualquier forma, antes de iniciar el diseo del logaritmo es preciso asegurarse de
que el programa est bien definido:

474

Programacin en Turbo/Borland Pascal 7

Tabla 12.1.

Pautas a seguir en el diseo de algoritmos

1. Formular una solucin precisa de! problema que debe solucionar el algoritmo.
2. Ver si existe ya algn algoritmo para resolver el problema o bien se puede adaptar uno
ya existente (algoritmos conocidos).
3. Buscar si existen tcnicas estndar que se puedan utilizar para resolver el problema.
4. Elegir una estructura de datos adecuada.
5. Dividir el problema en subprobiemas y aplicar el mtodo a cada uno de los subproblemas (diseo descendente).
6. Si todo lo anterior falla, comience de nuevo en el paso 1.

Especificaciones precisas y completas de las entradas necesarias.


Especificaciones precisas y completas de la salida.
Cmo debe reaccionar el programa ante datos incorrectos?
Se emiten mensajes de error? Se detiene el proceso?, etc.
Conocer cundo y cmo debe terminar un programa.

12.10.

LA CODIFICACION

Cuando un problema se divide en subprobiemas, los algoritmos que resuelven cada subproblema (tarea o mdulo) deben ser codificados, depurados y probados independientemente.
Es relativamente fcil encontrar un error en un procedimiento pequeo. Es casi imposible encontrar todos los errores de un programa grande, que se codific y comprob
como una sola unidad en lugar de como una coleccin de mdulos (procedimientos) bien
definidos.
Las reglas del sangrado ( M e n t a c i n ) y buenos comentarios facilitan la escritura del
cdigo. El pseudocdigo es una herramienta excelente que facilita notablemente la codificacin.

12.11.

PRUEBA (TESTING)

Aunque muchos programadores utilizan indistintamente los trminos prueba o comprobacin (testing) y depuracin, son, sin embargo, diferentes. La comprobacin (pruebas)
se refiere a las acciones que determinan si un programa funciona correctamente. La depuracin es la actividad posterior de encontrar y eliminar los errores (bugs) de un programa. Las pruebas de ejecucin de programas normalmente muestran claramente
que el programa contiene errores, aunque el proceso de depuracin puede, en ocasiones,
resultar difcil de seguir y comprender.
Edgar Dijkstra ha escrito que mientras las pruebas muestran efectivamente la presencia de errores, nunca pueden mostrar su ausencia. U n a prueba (test) con xito significa
solamente que ningn error se descubri en las circunstancias particulares probadas, pero
no dice nada sobre otras circunstancias. En teora, el nico medio de comprobar que un
programa es correcto es probar todos los casos posibles (realizar una prueba exhaustiva),

Ingeniera de software

47 5

situacin tcnicamente imposible, incluso para los programas ms simples. Consideremos un caso sencillo: calcular la media aritmtica de las temperaturas de un mes dado;
una prueba exhaustiva requerir todas las posibles combinaciones de temperaturas y das
de un mes: tarea ardua, laboriosa y lenta.
N o obstante, el anlisis anterior no significa que la comprobacin sea imposible; al
contrario, existen diferentes metodologas formales para las comprobaciones de programas.
U n a filosofa adecuada para pruebas de programas incluye las siguientes consideraciones:
1. Suponer que su programa tiene errores hasta que sus pruebas muestren lo contrario.
2. Ningn test simple de ejecucin puede probar que un programa est libre de error.
3. Trate de someter al programa a pruebas duras. Un programa bien diseado manipula entradas con elegancia. Por este trmino se entiende que el programa no
produce errores en tiempo de ejecucin ni produce resultados incorrectos; por el
contrario, el programa, en la mayora de los casos, visualizar un mensaje de error
claro y solicita de nuevo los datos de entrada.
4. Comenzar la comprobacin antes de terminar la codificacin.
5. Cambiar slo una cosa cada vez.

12.12.

DEPURACION

Una de las primeras cosas que se descubren al escribir programas es que un programa
raramente funciona correctamente la primera vez. La ley de Murphy: si algo puede ser
incorrecto, lo ser, parece estar escrita pensando en la programacin de computadoras.
Aunque un programa funcione sin mensajesr de error y produzca resultados, puede
ser incorrecto. U n programa es correcto slo si se producen resultados correctos para todas las entradas vlidas posibles. El proceso de eliminar errores bugs se denomina
depuracin (debugging) de un programa.
Cuando el compilador detecta un error, la computadora visualiza un mensaje de error,
que indica que se ha producido un error y cul puede ser la causa posible del error. Desgraciadamente, los mensajes de error son, con frecuencia, difciles de interpretar y son,
a veces, engaosos. Los errores de programacin se pueden dividir en tres clases: errores
de compilacin (sintaxis), errores en tiempo de ejecucin y errores lgicos. El proceso de
los errores en la ejecucin de un programa en Pascal se representa en la Figura 12.4.

12.12.1.

Errores d e sintaxis (de compilacin)

Un error de sintaxis o en tiempo de compilacin se produce cuando existen errores en la


sintaxis del programa, tales como signos de puntuacin incorrectos, palabras mal escritas, ausencia de separadores (signos de puntuacin), o de palabras reservadas (ausencia
de un end). Si una sentencia tiene un error de sintaxis, no puede ser traducida y su programa no se ejecutar.
Cuando se detecta un error, Turbo Pascal carga automticamente el archivo fuente,
sita el cursor en el error y visualiza un mensaje de error.
44 Field identifier expected

476

Programacin en Turbo/Borland Pascal 7

Ingeniera de software

12.12.3.

477

Errores lgicos

Los errores lgicos son errores del algoritmo o de la lgica del programa. Son difciles de
encontrar porque el compilador no produce ningn mensaje de error. Se producen
cuando el programa es perfectamente vlido y produce una respuesta.
Calcular la media de todos los nmeros ledos del teclado
Suma := 0;
for i := 0 to 10 do
begin
ReadLn (Num);
Suma := Suma + Num
end;
Media := Suma / 10;

Normalmente, los mensajes de error son fciles de encontrar. El siguiente ejemplo


presenta dos errores de sintaxis: el punto y coma que falta al final de la primera lnea y
la palabra WritaLn mal escrita, debera ser WriteLn.

Salario := Horas * Tasa;

Suma := 0
for I := 0 to 10 do
Suma := Suma + A[I];
WritaLn (Suma/10);

12.12.2.

y se escribe
Salario := Horas + Tasa;

Es un error lgico (+ por *) ya que a priori el programa funciona bien, y sera difcil,
por otra parte, a no ser que el resultado fuese obvio, detectar el error.

Errores en t i e m p o d e e j e c u c i n

Los errores en tiempo de ejecucin o simplemente de ejecucin (runtime error) suceden cuando el programa trata de hacer algo imposible o ilgico. Los errores de ejecucin slo se detectan en la ejecucin. Errores tpicos son: la divisin por cero, intentar
utilizar un subndice fuera de los lmites definidos en un array, etc.
x := 1/N

produce un error si N = 0

Los mensajes de error tpicos son del tipo:


Run-Time error nnn at xxxxtyyyy

nnn
xxxx: yyyy

nmero de error en ejecucin


direccin del error en ejecucin (segmento y desplazamiento)

Los errores de ejecucin se dividen en cuatro categoras:

errores DOS, 1-99


(nmeros de mensaje)
errores 1/0, 100-149
errores crticos, 150-199
errores fatales, 200-255

La media est calculada mal ya que existen once nmeros (0 a 10) y no diez como se
ha escrito.
Si se desea escribir la sentencia

12.12.4.

El depurador

Turbo Pascal tiene un programa depurador disponible para ayudarle a depurar un programa; el programa depurador le permite ejecutar su programa, una sentencia cada vez,
de modo que se pueda ver el efecto de la misma. El depurador imprime un diagnstico
cuando ocurre un error de ejecucin, indica la sentencia que produce el error y permite
visualizar los valores de variables seleccionadas en el m o m e n t o del error. Asimismo, se
puede seguir la pista de los valores de variables seleccionadas durante la ejecucin del
programa {traza), de modo que se pueda observar cmo cambian estas variables mientras el programa se ejecuta. Por ltimo, se puede pedir al depurador que detenga la ejecucin en determinados puntos (breakpoints); en esos momentos se pueden inspeccionar
los valores de las variables seleccionadas a fin de determinar si son correctas.
El Apndice K describe el depurador de Turbo Pascal 7.0 y el m o d o de utilizarlo. El
depurador tiene la gran ventaja de posibilitar la observacin de los diferentes valores que
van tomando las variables dentro del programa.

478

Ingeniera de software

Programacin en Turbo/Borland Pascal 7

12.12.5.

Manual del usuario

El manual de usuario debe cubrir al menos los puntos:


Ordenes necesarias para cargar el programa en memoria desde el almacenamiento
secundario (disco) y arrancar su funcionamiento.
Nombres de los archivos externos a los que accede el programa.
Formato de todos los mensajes de error o informes.
Opciones en el funcionamiento del programa.
Descripcin detallada de la funcin realizada por el programa.
Descripcin detallada, preferiblemente con ejemplos, de cualquier salida producida por el programa.

12.13.

EFICIENCIA

La eficiencia de un programa es una medida de cantidad de recursos consumidos por el


programa. Tradicionalmente, los recursos considerados han sido el tiempo de ejecucin
y/o el almacenamiento (ocupacin del programa en memoria). Mientras menos tiempo
se utilice y menor almacenamiento, el programa ser ms eficiente.
El tiempo y almacenamiento (memoria) de la computadora suelen ser costosos y por
ello su ahorro siempre ser importante. En algunos casos la eficiencia es crticamente
importante: control de una unidad de vigilancia intensiva de un hospital u n retardo
de fracciones de segundo puede ser vital en la vida de un enfermo, un programa de
control de roturas en una prensa hidrulica la no deteccin a tiempo podra producir
grandes inundaciones, etc. Por el contrario, existirn otros casos en los que el tiempo
no ser factor importante: control de reservas de pasajeros en una agencia de viajes.
La mejora del tiempo de ejecucin y el ahorro en memoria se suelen conseguir con
la mejora de los algoritmos y sus programas respectivos. En ocasiones, un simple cambio
en un programa puede aumentar la velocidad de ejecucin considerablemente. C o m o
muestra de ello analicemos el problema siguiente desde el punto de vista de tiempo de
ejecucin
Buscar en un array o lista de enteros una clave dada (un entero)

El bucle va comprobando cada elemento de la lista hasta que encuentra el valor de T


o bien se alcanza el final de la lista sin encontrar T.
Supongamos ahora que la lista de enteros est ordenada.
45

73

81

120

160

321

450

En este caso el bucle puede ser ms eficiente si en lugar de la condicin


(T o L i s t a [ J] ) and (J < Ultimo)

se utiliza
(T > Lista[J]) and (J < Ultimo)

Ello se debe a que si T es igual a Lista[J], se ha encontrado el elemento, y si T es


menor que Lista[J], entonces sabemos que T ser ms pequeo que todos los elementos
que le siguen, tan pronto como se pruebe un valor de T y resulte menor que su correspondiente Lista[J], esta condicin ser falsa y el bucle se terminar. De este modo, y
como trmino medio, se puede ahorrar alrededor de la mitad del nmero de iteraciones.
En el caso de que T no existe en la lista, el nmero de iteraciones de ambos algoritmos es igual, mientras que si T no existe en la lista, el algoritmo 2 (con T > Lista [J])
reducir el nmero de iteraciones en la mitad y, por consiguiente, ser ms eficiente.
El listado y ejecucin del programa con los dos procedimientos muestran cmo con
un simple cambio (el operador < > por el operador > ) se gana notablemente en eficiencia ya que reduce el tiempo de ejecucin.
program Eficiencia;
{comparar dos algoritmos de bsqueda}
r
const
Primero = 1;
Ultimo = 10;
type
Indice = Primero..Ultimo;
Items = array [Indice] of integer;
var
Lista : Items;
J, T
: integer;
procedure Busquedal (L : Items, T : Integer);

ArrayLista : Lista[Primero..Ultimo] of integer


ALGORITMO Buscar elemento t
begin
J := Primero;
while ( T o Lista [J]) and (J < Ultimo) do
J := J + 1;
if T = Lista [J] then
WriteLn ('el elemento', T, 'esta en la l i s t a 1 )
else
WriteLn ('el elemento', T, 'no esta en la lista)
end;

479

var
I : Indice;
begin
I := Primero;
while (T o L [I]) and (I < Ultimo) do

I := 1+1;

if T = L[I] then
WriteLn ('el elemento

',T, 'est en la lista')

else
WriteLn ('el elemento ',T,'no est en la lista');
WriteLn ('Bsqueda terminada');
WriteLn (I,'iteraciones')
end;

480

Ingeniera de software

Programacin en Turbo/Borland Pascal 7


procedure Busqueda2 (L : Items, T : Integer);
var
I : Indice;
begin

I : = 1;

while (T > L[I]) and (I < Ultimo) do

I := I + 1;

if T = L [I] then
WriteLn ('el e l e m e n t o T e s t en la lista ')
else
WriteLn ('el elemento',T,'no est en la lista');
WriteLn ('Bsqueda terminada');
WriteLn (I, 'iteraciones')
end;
begin {programa principal}
WriteLn ('Introduzca 10 enteros en orden ascendente: ');
for J := primero to Ultimo do
Read
(Lista[J] ) ;
ReadLn;
WriteLn ('Introducir nmero a buscar:');
ReadLn (T) ;
Busquedal (Lista,T);
Busqueda2 (Lista,T)
end.

12.14.

481

TRANSPORTABILIDAD (PORTABILIDAD)

U n programa es transportable o portable si se puede trasladar a otra computadora sin


cambios o con pocos cambios apreciables. La forma de hacer un programa transportable
es elegir como lenguaje de programacin la versin estndar del mismo, en el caso de
Pascal: A N S I / I E E E estndar e I S O estndar.
Turbo Pascal no sigue todas las normas del estndar y adems rene un conjunto de
caractersticas no disponibles en Pascal estndar. Esto significa que si desea transportar
sus programas a Pascal estndar, deber evitar en los mismos todas las caractersticas
propias de Turbo.

RESUMEN
La ingeniera de software trata sobre la creacin y produccin de programas a gran escala. El ciclo
de vida del software consta de las fases:
Anlisis de requisitos o requerimientos.
Diseo.

Implementacin (codificacin y depuracin).


Prueba.
Funcionamiento y mantenimiento.
Si se desea crear buenos programas en T u r b o Pascal, los conceptos de unidades y programacin
modular sern vitales en el desarrollo de los mismos.

Ejecucin
Introduzca 10 enteros en orden ascendente:
2 5 8 12 23 37 45 89 112 234
Introducir numero a buscar:
27
el elemento 27 no est en la lista
Bsqueda terminada en
10 iteraciones
el elemento 27 no est en la lista
Bsqueda terminada en
6 iteraciones

12.13.1.

Eficiencia versus

legibilidad (Claridad)

Las grandes velocidades de los microprocesadores (unidades centrales de proceso) actuales, j u n t o con el aumento considerable de las memorias centrales (cifras tpicas usuales
superan siempre los 640K), hacen que los recursos tpicos tiempo y almacenamiento no
sean hoy da parmetros fundamentales para la medida de la eficiencia de u n programa.
Por otra parte, es preciso tener en cuenta que a veces los cambios para mejorar
un programa pueden hacerlo ms difcil de comprender: poco legibles o claros. En programas grandes la legibilidad suele ser ms importante que el ahorro en tiempo y en almacenamiento en memoria. Como norma general, cuando la eleccin en un programa
se debe hacer entre claridad y eficiencia, generalmente se elegir la claridad o la legibilidad del programa.

EJERCICIOS
1. Cul es el invariante del bucle siguiente?
Indice:= 1;
Suma := A[1];
while Indice < N hacer
begin
Indice := Succ (Indice);
Suma := Suma + A[Indice]
end
2. Considere el programa siguiente que interactivamente lee y escribe el n m e r o de identificacin,
nombre, edad y salario (en millares de pesetas) de un grupo de empleados. C m o se puede
mejorar el programa?
program Test;
var xl, x2, x3 , i : integer;
Nombre : array[1..10] of char;
begin
while not eof do
begin
Read(xl);
for i := 1 to 8 do

482

Programacin en Turbo/Borland PascaI 7


Read (Nombre[ i ] ;
ReadLn (x2,x3);
WriteLn (xl, Nombre, x2,x3)
end
end.

3. Cul es el error de la siguiente funcin? C m o puede resolverse?


function Tangente (x : real) : real;
begin
Tangente := sin (x)/cos (x)
end
4. Escribir una funcin que devuelve el total de dgitos (n) distintos de cero en un n m e r o entero
arbitrario (Numero). La solucin debe incluir un bucle while con el siguiente invariante de bucle vlido.
{invariante:
0 <= Total <= n y Numero se ha dividido por 10 veces Total}

y sta ser la asercin vlida (postcondicin)


{postcondicin : Total es n}
5. Escribir un invariante de bucle para el siguiente segmento de cdigo
Producto := 1;
Contador := 2;
while Contador < 10 do
begin
Producto := Producto * Contador;
Contador := Contador + 1
end;

PROBLEMAS
1.

Escribir un programa que lea una lista de 100 o m e n o s enteros y a continuacin realice las
siguientes tareas: visualizar la lista ordenada desde el mayor hasta el menor; visualizar lista en
orden inverso, calcular la media; calcular la mediana; listar las listas en orden creciente y en
orden decreciente, mostrando la diferencia de cada valor con la media y la mediana. Es conveniente que cada tarea se realice con un m d u l o y luego se integren todos en un programa.

2. A la entrada de un aparcamiento, un automovilista retira un ticket en el cual est indicado su


hora de llegada. Antes de a b a n d o n a r el a p a r c a m i e n t o se introduce el ticket en u n a m q u i n a que
le indica la s u m a a pagar. El pago se realiza en una m q u i n a automtica que devuelve cambio.
Escribir un programa que simule el trabajo de la m q u i n a . Se supone que:
la duracin del estacionamiento es siempre inferior a 24 horas;
la m q u i n a no acepta ms que m o n e d a s de 200,100, 50, 25, 5, 2 y 1 peseta;
las tarifas de estacionamiento estn definidas por t r a m o s semihorarios (1 / 2 hora).

Ingeniera de software

483

3. Escribir u n programa que contenga una serie de opciones para manipular un par de matrices
(suma, resta y multiplicacin). Cada procedimiento debe validar sus parmetros de entrada antes de ejecutar la manipulacin requerida de datos.
4. U n viajante de comercio debe visitar A" ciudades. Parte de una de ellas y debe volver a su p u n t o
de partida. Conoce la distancia entre cada una de las ciudades y desea hacer un viaje lo ms
corto posible. El sistema elegido de viaje es el siguiente:
A partir de cada ciudad, elige c o m o ciudad siguiente la ms prxima entre las ciudades
que n o ha visitado.
Se s u p o n e n datos: la lista de ciudades, las distancias (en kilmetros) entre cada una de ellas
y el n o m b r e de la ciudad de partida. Elegir un algoritmo que calcule el recorrido ms corto.
5. Se tiene la lista de una clase que contiene un n o m b r e de estudiante y las notas de cinco exmenes. Se desea escribir un programa que visualice la media de cada alumno, la nota media
m s alta y la nota media ms baja, j u n t o con los n o m b r e s correspondientes.
6. Se desea disear un programa que permita adiestrar a un nio en clculos mentales. Para ello
el n i o debe elegir entre las cuatro operaciones aritmticas bsicas; la computadora le presentar la operacin correspondiente entre dos nmeros, y el nio debe introducir desde el teclado
el resultado. El nio dispone de tres tentativas. Caso de acertar, la computadora debe visualizar

Enhorabuena, y en caso de fallo Lo siento, intntalo otra vez.


7. Escribir u n programa que construya un directorio telefnico interactivo que contiene una coleccin de nombres y nmeros de telfonos. Las caractersticas del directorio han de ser: 1) poder
insertar u n a nueva entrada en el directorio; 2) recuperar una entrada del directorio; 3) cambiar
una entrada del directorio, y 4) borrar u n a entrada del directorio. Nota: El directorio debe estar
o r d e n a d o alfabticamente.

Ordenacin, bsqueda y mezcla

13
CAPITULO

ORDENACION, BUSQUEDA
Y MEZCLA
13.1.
13.2.
13.3.
13.4.
13.5.
13.6.
13.7.
13.8.
13.9.

Introduccin
Ordenacin
Ordenacin por burbuja
Ordenacin por seleccin
Ordenacin por insercin
Ordenacin Shell
Bsqueda lineal
Bsqueda binaria
Mezcla

RESUMEN
EJERCICIOS
PROBLEMAS
Las computadoras emplean gran parte de su tiempo en operaciones
de ordenacin, de bsqueda y mezcla. Los arrays (vectores y tablas)
se utilizan con mucha frecuencia para almacenar datos, por ello los
algoritmos para el diseo de estas operaciones son fundamentales y
se denominan a las operaciones internas, debido a que los arrays
guardan sus datos de modo temporal en memoria interna y desaparecen cuando se apaga la computadora.
Los mtodos de ordenacin, bsqueda y mezcla son numero^ps;
en este captulo se consideran algunos de los ms eficientes. Su
importancia reside en el hecho de que su anlisis y algoritmos servirn tambin, en gran medida, para realizar las mismas operaciones
con registros, archivos y estructuras dinmicas de datos.

13.1.

INTRODUCCION

Tres operaciones muy importantes en programacin de computadoras son: ordenacin,


bsqueda y mezcla-, son esenciales para un gran nmero de programas de proceso de
datos y se estima que en estas operaciones las computadoras por trmino medio gastan
gran parte de su tiempo. La bsqueda, ordenacin y mezcla son tambin procesos que
las personas se encuentran normalmente en sus vidas diarias. Considrese, por ejemplo,
el proceso de encontrar una palabra en un diccionario o ith nombre en una gua o listado
484

de telfonos. La bsqueda de un elemento especfico se simplifica considerablemente por


el hecho de que las palabras en el diccionario y los nombres en la gua telefnica estn
ordenados o clasificados en orden alfabtico. Asimismo, la operacin de mezclar datos
de dos listas o conjuntos de datos en una sola lista suele ser una operacin frecuente.
En este captulo tratamos los mtodos ms usuales de ordenacin, bsqueda y mezcla. relativos a listas o vectores (arrays), ya que si bien estas operaciones se aplican sobre
otras estructuras de datos como registros o archivos, su mayor aplicacin est casi siempre asociada a los vectores, y, por otra parte, la comprensin de los algoritmos en vectores extrapolables a otras estructuras es ms fcil.

13.2.

CONTENIDO

485

ORDENACION

La ordenacin o clasificacin de datos (sort en ingls) es una operacin consistente en


disponer un conjunto estructura de datos en algn determinado orden con respecto
a uno de los campos de elementos del conjunto. Por ejemplo, cada elemento del conjunto de datos de una gua telefnica tiene un c a m p o nombre, un campo direccin y un
campo nmero de telfono; la gua telefnica est dispuesta en orden alfabtico de
nombres. Los elementos numricos se pueden ordenar en orden creciente o decreciente
de acuerdo al valor numrico del elemento. En terminologa de ordenacin, el elemento
por el cual est ordenado un conjunto de datos (o se est buscando) se denomina
clave.
U n a coleccin de datos (estructura) puede ser almacenada en un archivo, un array
(vector o tabla), un array de registros, una lista enlazada o un rbol. Cuando los datos
estn almacenados en un array, una lista enlazada o up rbol, se denomina ordenacin
interna. Si los datos estn almacenados en un archivo, el proceso de ordenacin se llama
ordenacin externa.
Una lista se dice que est ordenada por la clave k si la lista est en orden ascendente o
descendente con respecto a esta clave. La lista se dice que est en orden ascendente si:
i < j

implica que

K[i] <= K[j]

y se dice que est en orden descendente


i > j

implica que

si:

K[i] >= K[j]

para todos los elementos de la lista. Por ejemplo, para una gua telefnica, la lista est
clasificada en orden ascendente por el campo clave k, donde k[i\ es el nombre del abonado (apellidos, nombre).
4
75

5
70

14
35

21
16

32
14

45
12

Z a c a r a s Rodrguez M a r t n e z Lpez G a r c a

orden ascendente
orden descendente
orden

descendente

Los mtodos (algoritmos) de ordenacin son numerosos, por ello se debe prestar
especial atencin en su eleccin. Cmo se sabe cul es el mejor algoritmo? La eficiencia
es el factor que mide la calidad y rendimiento de un algoritmo. En el caso de la operacin de ordenacin, dos criterios se suelen seguir a la hora de decidir qu algoritmo de
entre los que resuelven la ordenacin es el ms eficiente: 1) tiempo menor de ejecucin
en computadora-, 2) menor nmero de instrucciones. Sin embargo, no siempre es fcil

486

Programacin en Turbo/Borland Pascal 7

efectuar estas medidas: puede no disponerse de instrucciones para medida de tiempo


aunque no sea este el caso de T u r b o Pascal, y las instrucciones pueden variar,
dependiendo del lenguaje y del propio estilo del programador. Por esta razn, el mejor
criterio para medir la eficiencia de un algoritmo es aislar una operacin especfica clave
en la ordenacin y contar el nmero de veces que se realiza. As, en el caso de los
algoritmos de ordenacin, se utilizar como medida de su eficiencia el nmero de comparaciones entre elementos efectuados. El algoritmo de ordenacin A ser ms eficiente
que el B, si requiere menor n m e r o de comparaciones. As, en el caso de ordenar los
elementos de un vector, el nmero de comparaciones ser funcin del numero de elementos (n) del vector (array). Por consiguiente, se puede expresar el nmero de comparaciones en trminos de n (por ejemplo, n + 4, o bien n2) en lugar de nmeros enteros
(por ejemplo, 325).
En todos los mtodos de este captulo, normalmente para comodidad del lector
se utiliza el orden ascendente sobre vectores o listas (arrays unidimensionales).
Los mtodos de ordenacin se suelen dividir en dos grandes grupos:
directos
indirectos (avanzados)

burbuja, seleccin, insercin


Shell, ordenacin rpida, ordenacin por mezcla

En el caso de listas pequeas, los mtodos directos se muestran eficientes, sobre todo
porque los algoritmos son sencillos; su uso es muy frecuente. Sin embargo, en listas
grandes estos mtodos se muestran ineficaces y es preciso recurrir a los mtodos avanzados.

se hayan realizado (n - 1) pasadas. Para su mejor comprensin, veamos grficamente el


proceso anterior con un vector (lista) de cinco elementos: A[1 ], A[2], A[3], A[4], A[5],
A[l]

23

15

A[2]

19

19

A[3]

45

23

A[4]

31

31

A[5]

15

44

Lista sin ordenar

Lista ordenada

En la lista A, i ser el nmero de la pasada y j indica el orden del elemento de la lista.


Se comparan el elemento j-simo y el (j + X)-simo.
Pasada 1: i = 1
A[l]

23

19

19

19

19

A[2]

19

23

23

23

23

A[3]

45

45

45

31

31

A[4]

31

31

31

45

15

Este mtodo es clsico y muy sencillo, aunque por desgracia poco eficiente. La ordenacin por burbuja ("bable sort") se basa en la comparacin de elementos adyacentes de la
lista (vector) e intercambiar sus valores si estn desordenados. De este modo se dice que
los valores ms pequeos burbujean hacia la parte superior de la lista (hacia el primer
elemento), mientras que los valores ms grandes se hunden hacia el fondo de la lista.
Consideremos, como ya se ha expuesto, clasificaciones en orden creciente.

A[5]

15

15

15

15

45

13.3.1.

Pasada 2: i = 2

1 3.3.

ORDENACION POR BURBUJA

Anlisis

Supongamos un vector A[ 1 ], A[2], . . . , A[n], Se comienza el seguimiento del vector de


izquierda a derecha, comparando A[l] con A[2]; si estn desordenados, se intercambian
entre s. A continuacin se compara A[2] con A[3], intercambindolos si estn desordenados. Este proceso de comparaciones e intercambios contina a lo largo de toda la lista.
Estas operaciones constituyen una pasada a travs de la lista. Al terminar esta pasada el
elemento mayor est en la parte inferior de la lista y alguno de los elementos ms pequeos ha burbujeado hacia arriba de la lista. Se vuelve a explotar de nuevo la lista, comparando elementos consecutivos e intercambindolos cuando estn desordenados, pero
esta vez el elemento mayor no se compara, ya que se encuentra en su posicin correcta.
Al terminar esta pasada se habr situado en su sitio el segundo elemento ms grande. Se
siguen las comparaciones hasta que toda la lista est ordenada, cosa que suceder cuando

487

Ordenacin, bsqueda y mezcla

elemento
ordenado

j=4
j=3
j-2
Comparacin1 Comparacin2 Comparacin3 Comparacin4
Se han realizado cuatro comparaciones (5 - 1 o bien ny tres intercambios (rotulados por el smbolo | u ) .

1, en el caso de n elementos)

A[l]

19

19

19

19

19

A[2]

23

23

23

23

23

A[3]

31

31

31

15

15

A[4]

15

15

15

31

31

A[5]

45

45

45

45

45

j-4
j-3
j-2
Comparacin1 Comparacin2 Comparacin3 Comparacin4

elemento
ordenado

488

Ordenacin, bsqueda

Programacin en Turbo/Borland Pascal 7

19

19
"1
23 J

19

19

23 *i

15

15

15

15

15 J

23

23

23

31

31

19

31 <->

45

Aux
A[j]
A [j ]
+- A [ j + 1 ]
A [j+1]
Aux

o mejor modularizando esta operacin con un procedimiento Intercambio que recibe


como parmetro de entrada los dos valores a intercambiar y devuelve al procedimiento
llamador los dos valores ya intercambiados como parmetros de salida.

31
31

45

45

45

15

15

15

"1

45

Pasada 4: i = 4
19 -

19

19

19

19

23

23

23

23

23

31

31

31 -

45

31

''"I

45

45

procedure Intercambio (var A, B : integer);


var
Aux : integer;
begin
Aux := A;
A
:= B;
B
:= Aux
end;

15

25 -I

45

45

Se observa que se necesitan cuatro pasadas para ordenar una lista de nmeros de
cinco elementos, por lo que una lista de n elementos necesitar n - 1 pasadas. El proceso
se describe as:
1. Realizar cuatro pasadas por la lista: i = .1,2,3,4.
2. Para la pasada 1 (i = 1) se realizan comparaciones (j = 1,2,3,4). A[l] con A[2],
A[2] con A[3], etc.
3. Para la pasada 2 (i = 2) se realizan 3(5 - 3) comparaciones (j = 1,2,3).
4. Para la pasada 3 (i = 3) se realizan 2(5 - 3) comparaciones (j = 1,2).
5. Para la pasada 4 (i = 4) se realizan 1(5 - 4) comparaciones (j = 1).

13.3.2.
Mtodo

bucle externo
i

i = 1
i =2
i = 3
i=4

j
j
j
j

=
=
=
=

1,2,3,4
1,2,3
1,2,
1,

5
5
5
5

P r o c e d i m i e n t o d e ordenacin
1

procedure burbujal (var A : Lista; N : integer);


{ordenar A[1],...,A[N] en orden ascendente
Lista en un array unidimensional definido en el programa
principal de N elementos de tipo entero}
var
I, J, Aux : integer;
begin
for I := 1 to N - 1 do
for J := 1 to N - I do
if A[J] > A [J + 1] then
begin
{intercambio dentro del programa}
Aux
:= A [J];
A [J]
:= A [J + 1]
A[J + 1] := Aux
end;
{fin de los bucles for}
end;
{Burbujal}

El nmero de pasadas (4 o bien n - 1) se puede controlar con un bucle for, y cada


secuencia de comparaciones se puede controlar con un bucle for, anidado al bucle de
pasadas, en el que vara desde 1 hasta 5 menos el valor especfico de i.
4 bucle interno (n - i)
3
2

Por consiguiente, el bucle for que controla cada pasada ser:


for j = l to 5-i

Mtodo

(Pseudocdigo)

desde i
desde j

489

La operacin de intercambio se realiza con las instrucciones

Pasada 3: i = 3

Algoritmo

y mezcla

1 hasta n-1 hacer


1 hasta n - i hacer

si A[j] > A[j + 1]


entonces I n t e r c a m b i o { A f j ] , A[j+1])
fin-si
fin-desde
jbucle j j
fin-desde
bucle i

procedure Burbujal

(var A : lista; N : integer);

var
I, J : integer;
procedure Intercambio (var X, Y : integer);
var
Aux : integer;

490

Ordenacin, bsqueda

Programacin en Turbo/Borland Pascal 7

1.
2.
3.
4.

begin
Aux := X;
X
: = Y;
Y
:= Aux
end;
begin
for I := 1 to N for J := 1 to N
if A[J > A[J
Intercambio
end;
{Burbujal}

13.3.3.

491

Leer lista de nmeros aleatorios.


Visualizar lista.
Ordenar lista por burbuja.
Visualizar lista ordenada.

1 do
- I do
+ 1] then
(A[J], A[J + 1])

Algoritmo d e burbuja mejorado (refinamiento)

La tcnica de ordenacin por burbuja compara elementos consecutivos de la lista, de


modo que si en una pasada no ocurrieran intercambios, significara que la lista est
ordenada. El algoritmo burbuja se puede mejorar si disponemos de algn tipo de indicador que registre si se han producido intercambios en la pasada. Cuando se explore la lista
y el indicador no refleje intercambios, la lista estar ya ocupada y se terminarn las comparaciones.
El indicador ser una variable lgica Nolntercambio (o bien ordenado) que se inicializa a true (significa que la lista a priori est desordenada). Si dos elementos se intercambian en una pasada, Nolntercambio se pone a false. Al principio de cada pasada NoIntercambio se fija a true y a false si se produce a intercambios. El bucle externo for se
sustituye por un bucle repeat-until o bien while-do y un contenido i se necesitar para
contar el n m e r o de pasadas.
Pseudocdigo BurbujaMejorado
i +- 1
repetir
Nolntercambio +- t r u e
desde j <- i hasta n - i hacer
s i A [ j ] > A [j+1]
entonces I n t e r c a m b i o ( A [ j ] , A[j+1])
N o l n t e r c a m b i o +- f a l s e

fin-si
fin-desde
i * i+1
hasta-que Nolntercambio = t r u e

13.3.4.

y mezcla

Programa c o m p l e t o d e ordenacin por burbuja

Se genera aleatoriamente una lista de 100 nmeros enteros (o bien se leen de un archivo
de entrada: teclado o disco) y se desea escribir un programa que realice las siguientes
tareas:

El procedimiento Leer sirve para introducir la lista de 100 nmeros; el procedimiento


Visualizar permite imprimir cualquier lista, en este caso tanto la lista ordenada como
desordenada; y el procedimiento Ordenar clasifica la lista A.
program OrdenarBurbuja;
{ Ordenacin ascendente por el mtodo de la burbuja }
const
Limite = 100;
type
Item = integer;
rango = 0..Limite;
Lista = array [Rango] of Item;
var
Listaltem : Lista;
Numitems
: integer;
procedure Leer (var A: Lista; N : integer);
var
I : integer;
begin
for I := 1 to N do
A [I] := Random (1000)
end;
procedure Escribir (var A: Lista; N : integer);
var
I : integer;

492

Programacin en Turbo/Borland Pascal 7

Ordenacin, bsqueda y mezcla

El nmero total de comparaciones es

begin
for I := 1 to N do
Write (A[I] : 4);
WriteLn
end;

1 +2 + 3 + -- + (N-3)

procedure Burbuja (var A: Lista; N : integer)


var
I,J : integer;
Nolntercambio : boolean;
{ procedimiento de intercambio }
procedure Intercambio (var A,B : item);
var
Aux : item;
begin
Aux := A;
A := B;
B := Aux
end;
begin
for I := 1 to N -1 do
for J:= I + 1 to N do
if A [ I ] > A [ J ]
then
Intercambio (A[I], A[J])
end;
{ programa
begin
Leer
WriteLn
Escribir
Burbuja
WriteLn
Escribir
end.

13.3.5.

principal }
(Listaltem, Limite);
('La lista original es
(Listaltem, Limite);
(Listaltem, Limite);
('La lista ordenada es
(Listaltem, Limite)

) ;

1)= N2~N

+ (N-

=~

(W-N)

La funcin de eficiencia de rendimiento de un algoritmo se representa con la funcin


0(AO, tambin llamada Notacin de O-grande. En el caso de la burbuja, en el peor de los
casos, el nmero de comparaciones es 0(jV2), y en el mejor de los casos es 0(IV). El peor
de los casos se da cuando el vector est invertido (ordenado por orden descendente de
claves, el nmero de intercambios es 0 ( N 2 ) . En el mejor de los casos, el n m e r o de intercambios depende de N, es decir, 0(N).
El algoritmo de burbuja es una ordenacin cuadrtica, lo que significa elevado nmero de comparaciones y, por consiguiente, excesivo tiempo de ejecucin, o dicho de otro
modo: es un algoritmo lento.

13.4.

ORDENACION POR SELECCION

El algoritmo de ordenacin por seleccin de una lista (vector) de n elementos tiene los
siguientes pasos:
1. Encontrar el elemento mayor de la lista.
2. Intercambiar el elemento mayor con el elemento de subndice n (o bien el elemento menor en el subndice l).
3. A continuacin se busca el elemento mayor en la sublista de subndices l ...n - 1, y
se intercambia con el elemento de subndice n-l;
por consiguiente, se sita el
segundo elemento mayor en la posicin n-l.
4. A continuacin se busca el elemento mayor en la sublista 1 ...n - 2, y as sucesivamente.

Desde j * n hasta 2 [decremento - 1 ] hacer:

Este algoritmo proporciona buen rendimiento en cuanto a su sencillez, pero por el con
trario su eficacia es pobre. Para una lista de N elementos, el proceso de ordenacin re
quiere N - l pasadas y el nmero de comparaciones se refleja en la tabla siguiente:
Comparaciones
N-l

N-l

+ (n-2)

Algoritmo

Anlisis d e la ordenacin por burbuja

Pasada

493

Encontrar el elemento mayor en el array 1


Si el elemento mayor no est en el subndice j, entonces intercambiar elemento
mayor con el de subndice i.
Lista
desordenada

A[1 ]

A[2]

14

A[3]

-2

- 2

-2

A[4]

10

10

10

10

A[5]

14

14

14

Figura 1 3 . 1 .

Seguimiento d e la ordenacin por seleccin.

- 2

494

Programacin en Turbo/Borland Pascal 7

El algoritmo de PosMayor debe guardar j como la posicin del elemento mayor y luego
poder intercambiar.

Ordenacin, bsqueda y mezcla

Anlisis d e la ordenacin por s e l e c c i n


Nmero de comparaciones por cada una de las pasadas.

program OrdenarSeleccion;
{ leer 100 enteros. Ordenar. Visualizar }
const
Limite = 100;
type
Lista = array [1..Limite] of integer;
var
I, Num : 1..Limite;
A
: Lista;
function PosMayor (Ultimo : integer; var Tabla: Lista) : integer;
{ encuentra el ndice del elemento mayor en la Tabla [1..Ultimo]}
var
Indice_Max, Indice : 1..Limite;
begin
Indice_max := 1;
for Indice := 2 to Ultimo do
if Tabla [Indice] > Tabla [Indice_Max]
then Indice_Max := Indice;
PosMayor := Indice_Max
end;
procedure Seleccin (Limi : integer; var Tabla : Lista);
var
Aux, J, Mayor : integer;
begin
for J := Limi downto 2 do
begin
{ encontrar el Elemento mayor de 1..J }
Mayor := PosMayor (J, Tabla);
{ intercambio con el Elemento Tabla [J] }
Aux
:= Tabla [Mayor];
Tabla [Mayor] := tabla [J];
Tabla [J]
:= Aux
end
end;
{ programa principal }
begin
for I := 1 to Limite do
begin
A [I]
:= Random
Write (A[I ] :4) ;
end;
WriteLn;
Seleccin (Limite, A);
for I := 1 to Limite do
Write (A[I]:4);
WriteLn
end.

495

Pasada

Nmero de comparaciones
N-l
N-2
N-3

El nmero total de comparaciones es


N (N2

1+2+3+-+N-2+N-1

1)

1
(A" - N)
2

La eficiencia, como se observa, es similar al mtodo de la burbuja.

13.5.

ORDENACION POR INSERCION

Este mtodo est basado en la tcnica utilizada por los jugadores de cartas para clasificar
sus cartas. Ei jugador va colocando (insertando) cada carta en su posicin correcta.
10

cuatro canas

10

cinco cartas

V
y // // // // // //

10

El mtodo se basa en considerar una parte de la lista ya ordenada y situar cada uno
de los elementos restantes insertndolo en el lugar que le corresponde por su valor.
A[1]

A[2]

A[3]

A [4]

10-

r15-

A(5]

A[N]

(100);

Figura 13.2.

10

15

Ejemplo de ordenacin por insercin: 6 se injerta justo antes de 10, y todos


los valores a la derecha se desplazan una posicin para dejar espacio.

496

El procedimiento Desplazar es

Algoritmo
para cada elemento de l a l i s t a despues del p r i m e r o j
desde k
2 hasta n hacer

procedure Desplazar

Guardar el v a l o r de e s t e elemento A[k] en una v a r i a b l e Aux.


Hacer e s p a c i o para Aux d e s p l a z a n d o t o d o s l o s v a l o r e s mayores que dicho v a l o r
A[k] una p o s i c i o n .
I n s e r t a r el v a l o r de Aux en el l u g a r del ultimo v a l o r d e s p l a z a d o .

La operacin de desplazamiento se realiza con un procedimiento Desplazar, que


mueve todos los elementos de la lista mayores que Aux, comenzando con el elemento de
la lista de posicin Aux-1. Si Aux es el valor ms pequeo hasta aqu, la operacin de desplazamiento termina despus de que todos los elementos de la lista se han desplazado.
Si Aux no es el valor ms pequeo, la operacin de desplazamiento termina cuando un
valor menor o igual a Aux se alcanza. Aux se inserta en la posicin que ocupaba el ltimo
valor que se desplaz.
de desplazamiento

mientras el primer elemento no se d e s p l a z a y v a l o r del elemento > Aux hacer


D e s p l a z a r elemento una p o s i c i o n .
Comprobar v a l o r del s i g u i e n t e e l e m e n t o .
D e f i n i r NuevaPos como p o s i c i o n o r i g i n a l del u l t i m o elemento d e s p l a z a d o ,
fin-mi e n t r a s

Codificacin del procedimiento

Ordenarlnsercin

procedure Ordenacionlnversa (var Tabla: Lista; N : integer);


{ Tabla (entrada/salida) , N (entrada) }
{ Lista = array de N elementos enteros }
var
K
: integer;
{ subindice del siguiente elemento al
que se inserta }
NuevaPos : integer;
{ subindice de este elemento despues
de la insercin }
Aux
: integer;
begin
for K :
begin
Aux

13.5.1.

Anlisis d e la ordenacin por insercin

El anlisis de la ordenacin por insercin es un poco ms complicado. El nmero de


comparaciones en el z-simo paso es c o m o mximo k - 1 y como mnimo 1. Por consiguiente, la media proporciona el n m e r o de comparaciones.
[ ( k - l ) + 1] / 2 = k/2

El nmero de comparaciones (c) es


Cm4x= ( / - l ) = l + 2 + + ( y V - l ) = ^ ^ = ^ - ( A '

- A )

2 to H do

{ obtener siguiente elemento a


insertar }
{ desplazar todos los valores > Aux un elemento }
Desplazar (Tabla, K , Aux, NuevaPos);
{ insertar Aux en posicion NuevaPos }
Tabla [NuevaPos] := Aux
end

end;

(var Tabla : Lista; Aux, K : integer;


var NuevaPos : integer);

var
Encontrado : boolean;
.{indicador}
begin
{desplazar valores > Aux . Comenzar con el elemento K - 1}
Encontrado := false;
while (K > 1) and (not Encontrado) do
if (Tabla [K - 1] > Aux) then
begin
Tabla [K] := Tabla [K - 1];
K
:= K - 1
end
else
Encontrado := true;
NuevaPos := K
end;
{Desplazar}

fin-desde

Algoritmo

497

Ordenacin, bsqueda y mezcla

Programacin en Turbo/Borland Pascal 7

Tabla [K];

C m i n = .1 ( D - 1 + 1 + - - - + \=(N-\)

C media = (Cmx + Cmn)/2 = | - i - (N2 - N) + (N - l)J/2 = - i - (N2 + N-

Como se observa, la eficiencia es O{n 2 ).

2)

498

13.5.2.

Comparacin de o r d e n a c i o n e s cuadrticas
Caso favorable

Caso desfavorable

0(AG)
0(/V)
O(iV)

0(Ar2)
O(A-)
O A-)

Seleccin
Burbuja
Insercin

499

Ordenacin, bsqueda y mezcla

Programacin en Turbo/Borland Pascal 7

Segundo paso (divisin/ordenacin


504 88

150

62

612

171

por 4)

760

277

654

427

513

510

908

675

898 704

Como el tiempo requerido para ordenar un array (vector) de n elementos es proporcional a N1, ninguno de estos algoritmos es particularmente bueno para arrays grandes
(Ar > = 100). Para listas de mayor nmero de elementos, los mtodos avanzados son los
ms idneos ya que su eficiencia en lugar de depender de N1 depende de N x log, N, lo
que reduce considerablemente el tiempo de ejecucin.

13.6.

ORDENACION SHELL

La ordenacin Shell debe el nombre a su inventor, D. L. Shell [CACM 2 (Julio, 1959),


30-32]. Se suele denominar tambin ordenacin por disminucin de incremento (gap).
La idea general del mtodo (algoritmo) es la siguiente:

Tercer paso (divisin/ordenacin


504 88 150 62 612

171

por 2)

513

277

654

427

760 510
' > / \

908
/ \

675
/V

898
/

704
/

Lista original
504

88

513

62

908

171

898

277

654

427

150

510

612

675

750

704

1. Se divide la lista original (16 elementos, en este ejemplo) en ocho grupos de dos
(considerando un incremento o intervalo de 16/2 = 8).
2. Se clasifica cada grupo por separado (se comparan las parejas de elementos y si no
estn ordenados se intercambian entre s de posiciones).
3. Se divide ahora la lista en cuatro grupos de cuatro (intervalo o salto de 8/2 = 4) y
nuevamente se clasifica cada grupo por separado.
4. Un tercer paso clasifica dos grupos de ocho registros y luego un cuarto paso
completa el trabajo clasificando todos los 16 registros.
Primer paso (divisin/ordenacin
504 88

513

62

908

171

por 8)
898

277

654

427

150 510

612

675

760 704

Cuarto paso (divisin/ordenacin


154 62
62

88

504
154

por 1)

88

513

171 612

277

654

427
i

760
|

510
i

171

277

427

510

513 612

654

675

504

675

704 760

908

704

898 908

El algoritmo de Shell tiene diferentes modelos; recogemos en este libro uno de los
ms populares y citados en numerosas obras de programacin.
Algoritmo
i n t e r v a l o * n d i v 2
mientras ( i n t e r v a l o > 0) hacer
desde i *- ( i n t e r v a l o + 1) hasta n hacer
j <*- i - i n t e r v a l o
m i e n t r a s ( j > 0 ) hacer
k *- j + i n t e r v a l o
si ( a f j ] < = a[k])
entonces
j
0
sino
Intercambio ( a [ j ] , a[k]);
fin-si
j *- j - i n t e r v a l o
fin-mi entras
f i n-desde
i n t e r v a l o * - i n t e r v a l o div 2
fin-mi entras

500

Programacin en Turbo/Borland Pascal 7

Ordenacin, bsqueda

Programa

y mezcla

501

begin
K := J + Intervalo;
if A [J] <= A [K]
then
J := 0

program OrdenarShell;
{ modelo de ordenacin de 500 enteros aleatorios }
const
NumElementos = 500;
type
Rango = 1..Numelementos;
Lista = array [Rango] of integer;
var
L : Lista;

else
Intercambio (A[J], A[K]);
J := J - Intervalo
end
{while}
end;
Intervalo

:= Intervalo div 2

end
end;

procedure GenerarAleatorios (var A:Lista; Elementos : integer)


var
I : integer;
begin
randomize;
for I := 1 to Elementos do
A [1] := Random (1000)
end;
procedure Visualizar (var A: Lista; Elementos : integer);
var
I : integer;
begin
for I := 1 to Elementos do
Write {A[I] :6, ' ' ) ;
WriteLn
end;
procedure Intercambio (var X,Y
var
Aux : integer;
begin
Aux := X;
X := Y;
Y := Aux
end;

begin
{ programa principal
WriteLn ('Comienza la
GenerarAleatorios (L,
Shell
(L,
Visualizar
(L,
end.

13.7.

}
ordenacin ');
NumElementos);
NumElementos);
NumElementos)

BUSQUEDA LINEAL

Otro problema importante en proceso de datos, como ya se ha comentado, es la bsqueda en un conjunto de datos de un elemento especfico y la recuperacin de alguna
informacin asociada al mismo.
Existen diferentes mtodos de bsqueda:

: integer);

procedure Shell (var A : Lista; N : integer);


var
Intervalo, I, J, K : integer;
begin
Intervalo := N div 2;
while Intervalo > 0 do
begin
for I := (Intervalo + 1 ) to N do
begin
J := I - Intervalo;
while (J > 0) do

bsqueda lineal o secuencial


bsqueda binaria o dicotmica
bsqueda hash o por conversin de claves
Las dos primeras se pueden aplicar a listas implementadas con arrays, y la tercera es
ms propia de estructuras tipo registros o archivos. En esta seccin y en la siguiente
trataremos de la bsqueda lineal, dejando para el captulo de registros el tercer mtodo.

13.7.1.

Anlisis

La bsqueda lineal o secuencial es la tcnica ms simple para buscar un elemento en un


array (vector). Consiste el mtodo en el recorrido de todo el vector, desde el primer elemento hasta el ltimo, y de uno en uno. Si el vector contiene el elemento, el proceso
devolver la posicin del elemento buscado dentro del vector y, en caso contrario, un
mensaje que indique la falta de xito en la bsqueda. Mediante un bucle desde ir com-

502

Ordenacin, bsqueda y mezcla

Programacin en Turbo/Boriand PascaI 7

parando el elemento t buscado con a[\, donde i vara, en el ejemplo, de 1 a 100. En caso
de encontrarlo, almacenar la posicin (el ndice del array) del mismo centro de la lista y
finalmente se devolver al programa principal. Dado que los algoritmos de bsqueda
normalmente slo devuelven la posicin, es muy frecuente que la implementacin del
algoritmo se haga con una funcin.

503

La bandera o indicador (Encontrado, por ejemplo) toma el valor esperado (por


ejemplo, true verdadero) y la bsqueda ha tenido xito.
El valor del ndice i es mayor que el nmero de trminos de la lista, lo que significa
que se ha terminado de recorrer la misma y el elemento buscado no ha aparecido.
Pseudocdigo 2

Ejemplo
Supongamos una lista de nmeros de la Seguridad Social incluidos en un array a y se
desea buscar a ver si existe el nmero 453714.

3(1]

451871

3(2]

120467

a(3j

401321

a[4]

25761

Encontrado
falso
Posicion * 0
i
1
mientras (i < = n) y (No Encontrado=verdadero) hacer
si a [i] = t
entonces Posicion * i
Encontrado
verdadero
fin_si
i <* i + 1
fin-mi entras

o bien con la estructura repetir


repetir
elemento a buscar: t
453714
hasta_que (Encontrado=verdadero) o (i > n)

a[98]

339412

a(99]

81467

Funcin b s q u e d a lineal
924116

a( 100]

Nmeros Seguridad Social


Figura 1 3 . 3 .

Pseudocdigo

Bsqueda lineal de un elemento.

P o s i c i o n * 0
l i s t a = vector a [ i ] de n elementos]
desde i
1 hasta n hacer
si a [ i ] = t
entonces P o s i c i o n * i

fin_si
f i n-desde

function BusquedaLineal (A: Lista; {entrada, vector busqueda}


N : integer;
{entrada, numero de elementos}
T : integer;
{elemento a buscar}) : integer
var
Encontrado : boolean;
I
: integer;
begin
BusquedaLineal := 0; {posicion del elemento caso de no existir}
Encontrado
:= false;

: = l;

while (I <= N) and not Encontrado do


if A[I] = T then
begin
BusquedaLineal := I;
Encontrado
:= true;
end;
{findel if y del while}

I := I + 1

Este algoritmo tiene un grave inconveniente: sea cual sea el resultado (existe/no existe
el elemento) se recorre el vector completo. El algoritmo tiene una mejora: detectar el
momento de localizar el elemento y terminar el bucle. As el algoritmo mejorado se puede
realizar con un bucle while o repeat, y utilizando unas banderas (interruptor) que detecten cundo se encuentra el elemento. El bucle se terminar por dos causas:

end

{posicion del elemento en la lista}

Si se desea saber en el programa principal si existe el elemento, bastar preguntar con


una sentencia if cul es el valor de la funcin BusquedaLineal; si es cero no existe el elemento, y en caso contrario existe y su valor es la posicin en la lista o vector.

504

Programacin en Turbo/Borland Pascal 7

Ordenacin, bsqueda y mezcla

Nota

begin
{ programa principal }
for J := 1 to Total do
{ lectura de 100 enteros aleatorios }
L [J] := Random (100);
repeat
Write
('introduzca numero a buscar ');
ReadLn (Num);
P := BusquedaLineal (Num, L, Total);
if P = 0
then
WriteLn ('no existe el numero en la lista')
else
Writeln ('encontrado en la posicion ',P:1)
until Num = 0
{ marca fin de datos de entrada }

C o m o T u r b o Pascal tiene la sentencia e x i t para terminacin anormal de un bucle, la bsqueda lineal se podra terminar n a d a ms encontrarse el elemento ejecutado a continuacin
de la sentencia e x i t (en general, el uso de e x i t est orientado a la programacin en tiempo

function BusquedaLinealDos (A: Lista; N : integer;


T: integer ): integer;
var
I : integer;
begin
for I := 1 to N do
if T = A[I] then
begin
BusquedaLineal := I;
Exit
end;
BusquedaLineal := 0
end;

Programa (se muestra una variante del algoritmo de la funcin)


program
const
Total
type
Lista
var
L
P, J,

Eficiencia de la b s q u e d a lineal

El mtodo de bsqueda secuencial, en el peor de los casos (el elemento buscado est al
final de la lista o no existe), requiere consultar los n elementos de la lista para encontrar
el elemento deseado o determinar que el elemento no existe en la lista. Entonces el
tiempo de bsqueda es directamente proporcional al n m e r o de elementos de la lista,
por lo que utilizando la notacin 0 se tiene para el tiempo t la frmula:
t = O [f(n)\

= 100;
= array [1..Total] of integer;

o simplificando

: Lista;
Num : integer;

:= 0;

while (I < Mximo) and not Encontrado do


begin

13.7.2.

LinealBusqueda;

function BusquedaLineal (t : integer; A: Lista; Mximo: integer)


integer;

var
I
: integer;
Encontrado : boolean;
begin
Encontrado := false;

505

:= I + 1;

Encontrado := A [I] = t
end;
if Encontrado
then BusquedaLineal := I
else BusquedaLineal := 0
end;

t - O(n)

13.8.

BUSQUEDA BINARIA

La bsqueda lineal, por su simplicidad, es buena para listas de datos pequeas. Para
listas grandes es ineficiente; la bsqueda binaria es el mtodo idneo. Se basa en el
conocido mtodo de divide y vencers.
Este mtodo tiene una clara expresin en la bsqueda de una palabra en un diccionario. Cuando se busca una palabra no se comienza la bsqueda por la pgina 1 y se sigue
secuencialmente, sino que se abre el diccionario por una pgina donde aproximadamente se piensa puede estar la palabra, es decir, se divide el diccionario en dos partes; al abrir
la pgina se ve si se ha acertado o en qu parte (la primera o la segunda) se encuentra la
palabra buscada. Se repite este proceso hasta que por divisiones o aproximaciones sucesivas se encuentra la palabra.

506

Programacin en Turbo/Borland Pascal 7

Ordenacin, bsqueda

Supongamos que la lista donde se busca es

elemento buscado

1331
1373
1555
1850
1892
1898-*
>-1989
2002
2400
2670
3200

elemento central

>-1989
2002
2400-*
2670
3200

s i n o si t > a [ C e n t r a l ]
entonces Primero-*Central + 1
sino Ultimo-*- Central - 1
fin_mientras
4. s i Encontrado = v e r d a d e r o
entonces Posicion- C e n t r a l
e x i s t e el e l e m e n t o }
sino
Posicion-*0
no se ha e n c o n t r a d o
fin_si

Obsrvese que Encontrado = falso verdadero equivale a Not Encontrado cuando se ha iniciaiizado Encontrado a falso.

elemento central

El elemento central en esta sublista es 2400, y como 1989 es menor, la nueva sublista
donde buscar es
1989-*
2002

507

Nota

y que se busca el nmero 1989.


Se examina en primer lugar el elemento central de la lista (las divisiones se toman
iguales), 1898. Dado que 1989 es mayor que 1898, el elemento a buscar estar en la
segunda mitad. Por consiguiente, se sigue la bsqueda en esta mitad:
elemento a buscar

y mezcla

elemento considerado central

Como ya no hay elemento central, se toma el nmero inmediatamente anterior a la


posicin central, que en este caso es 1989. En este caso se ha encontrado el elemento
deseado en tres comparaciones, mientras que en la bsqueda lineal hubiese necesitado al
menos seis comparaciones (la mitad de los elementos, redondeada a un entero).
*
Este mtodo es muy eficiente, con el nico inconveniente, como habr deducido, de
requerir la lista ordenada.
Algoritmo
1. E s t a b l e c e r Primero-*
1 y Ultimo-* n ( n , numero de e l e m e n t o s ) . E s t a s v a r i a b l e s r e p r e s e n t a n l a p r i m e r a y u l t i m a p o s i c i o n de l a l i s t a o s u b l i s t a donde se e s t a buscando y
p e r m i t e el c a l c u l o de l a p o s i c i o n del elemento c e n t r a l .
2 . Encontrado-* f a l s o ( v a r i a b l e l g i c a ) .
3. mientras Primero < = Ultimo y Encontrado = f a l s o hacer
(Encontrar posicion c e n t r a l }
C e n t r a l * (Primero + Ultimo) d i v 2
Comparar e l e m e n t o buscado t con a [ C e n t r a l ] }
si t = a [ C e n t r a l ]
e nto nc e s Encontrado-*verdadero

Programa
La bsqueda binaria requiere una ordenacin previa del vector o lista en el que se va a
efectuar la bsqueda. Por consiguiente, las acciones tpicas (mdulos) en un algoritmo de
bsqueda binaria son:
1.
2.
3.
4.

Lectura del vector.


Ordenacin del vector.
Bsqueda binaria.
Visualizar resultados.

Aprovechando que en Turbo Pascal disponemos de la directiva de compilacin $1,


compile el procedimiento de ordenacin Shell, de la forma explicada en el Captulo 6,
para archivos de inclusin y dle el nombre Shell, se grabar con Shel 1. inc.
program BusquedaBinaria;
const
Limite = 100;
type
Lista = array [1..Limite] of integer;
var
A
: Lista;
I,J,t. : integer;
{ directiva de inclusin, aqui se inserta el procedimiento
Shell }
{ si se ha grabado en disco como se indica en el capitulo 6 }
{$1 Shell.Inc}
function Binaria (T : integer; var L : Lista; N : integer) : integer;
var
Primero, Ultimo, Central : integer;
Encontrado
: boolean;
begin
Primero
:= 1;
Ultimo
:= N;
Encontrado := false;
while (Primero <= ULtimo) and not Encontrado do

508

Ordenacin, bsqueda y mezcla

Programacin en Turbo/Borland Pascal 7

509

begin
Central := (Primero + Ultimo) div 2;
if T = LfCentral]
then
Encontrado := true
else
if T > L[Central]
then Primero := Central + 1
else Ultimo
:= Central - 1
end;
{ while }
if not Encontrado
then Binaria := 0
else Binaria := Central
end;
begin
{ programa principal }
{ lectura de 100 enteros aleatorios }
for I := 1 to 100 do
A[I] := Random (100) ;
Shell
(A,100);
Write
('introduzca numero a buscar');
ReadLn (T);
J := Binaria (T,A,100);
if J = 0
then WriteLn ('el numero no figura en lista')
else WriteLn ('el numero ocupa la posicion ', J:1);
WriteLn
{ Si desea repetir la busqueda, aada a este programa una
estructura repetitiva }

13.8.1.

Eficiencia de la b s q u e d a binaria

En el algoritmo de bsqueda binaria, con cada comparacin se divide en dos mitades el


tamao de la lista en estudio. Si n es el tamao de la lista, los tamaos sucesivos de las
sublistas sern

"T'T'T""
n
n
n
~~V ' ~W '

Si se toman logaritmos en base 1, en ambos lados, se tiene


log2 n<k

log2 2 = k

log2 n < k
Por consiguiente, la eficiencia de la bsqueda binaria se puede escribir como
O (log2 ti)

que es bastante ms rpido que la bsqueda lineal, como se puede ver en la Figura 13.4,
que representa las dos funciones O.
El tiempo que se ahorra utilizando el algoritmo de bsqueda binaria es muy considerable. Para una lista de 50.000 elementos, la bsqueda lineal'en el peor de los casos
requiere 50.000 comparaciones y 25.000 por trmino medio, mientras que la bsqueda
binaria nunca requerir ms de log2 50.000, es decir, alrededor de diecisis comparaciones. A fin de ser sinceros, al tiempo de la bsqueda binaria habra que sumarle el tiempo
empleado en ordenar la lista.
Recuerde
1 a busqueda binaria slo funcionaia coi l e d a m e n t e si la li.sia esta ordenada Sin embado,
la busqueda lineal l n u o n a tanto si la lista esta c o m o si no esta o denada.

El proceso terminar cuando el t a m a o se hace igual a menor a 1. Por consiguiente,


si k es el nmero mayor de comparaciones

JL < i

13.9.

n < 2k

El proceso de mezcla, fusin o intercalacin (merge en ingls) consiste en tomar dos


vectores ordenados (a, b) y obtener un nuevo vector (c) tambin ordenado.

2k

o bien

MEZCLA

510

Ordenacin, bsqueda y mezcla

Programacin en Turbo/Borland Pascal 7

Procedimiento mezcla de los vectores A y B

El algoritmo ms sencillo para resolver el problema es:


1. Situar todos los elementos del vector a en el nuevo vector c.
2. Situar todos los elementos del vector b en el nuevo vector c.
3. Ordenar todo el vector c.
Esta solucin tiene un inconveniente: no se tiene en cuenta que los vectores a y b ya
estn ordenados; ello supone una ralentizacin del proceso. El algoritmo que tiene en
cuenta la ordenacin es el siguiente:
1. Seleccionar el elemento de valor o clave ms pequeo con cualquiera de los dos
vectores y situarlo en el nuevo vector c.
2. Comparar a{i) y b(j) y poner el elemento de vector ms pequeo en ck). (i, j, k
son los ndices de los elementos correspondientes en los vectores).
3. Seguir esta secuencia de comparaciones hasta que los elementos de un vector se
hayan agotado, en cuyo momento se copia el resto del otro vector en c.
Ejemplo 1 3 . 1

4
0

78
13

97
15

78

90

96

lista A
lista B

El proceso grfico se muestra en la Figura 13.5.


2

78

97

Comparar A [/']
y Bjj. Poner el
ms pequeo en
C[k], Incrementar
los ndices apropiados

Lista A

O
k

-15

13

procedure Mezcla (var A,B,C : Lista; M,N : integer);


{ A Y B: entrada. Vectores ya ordenados }
{ M Y N: numero de elementos de A Y B respectivamente }
{ C : salida. Vector mezcla ordenado }
{ El tipo Lista, tendr una longitud minima de M + N elementos}
var
I,J,K : integer;
begin
I := 1;
J := 1;
K := 1;
while (I <= M) and (J <= N) do
begin
if A[I] <= B(J]
then
begin
C [K] := A[X];

Mezclar las dos listas de nmeros a y b.


2
-15

15

78

90

511

94

-15

96

Lista B
Lista C

:= I + 1

end
else
begin
C [K] := B[J];
J
:= J + 1
end;
K := K + 1
end;
{copiar el resto del vector no agotado}
if I > M
then
for P := J to N do
begin
C [K] := B [P] ;
K
:= K + 1
end
else
{J > N}
for P := I to M do
begin
C [K] := A[P];
K
:= K + 1
end
end;

RESUMEN

Figura 1 3 . 5 .

Mezcla d e d o s listas.

En este captulo se han tratado los algoritmos y programas correspondientes de ordenacin, bsqueda y mezcla. Las consideraciones ms importantes a tener en cuenta son:

512

Ordenacin, bsqueda y mezcla

Programacin en Turbo/Borland Pascal 7

5. Se lee u n a lista de n m e r o s desde teclado y se desea saber si entre dichos nmeros se encuentra
el 333. En caso afirmativo, visualizar su posicin en la lista. Resolver el problema por:

Ordenacin
Burbuja shell
Seleccin
Insercin

a) Bsqueda secuencial.

Los tres algoritmos presentan una eficiencia de tipo cuadrtico 0 ( n 2 ) , lo que implica un aumento en el tiempo de ejecucin de los mismos a medida que a u m e n t a el valor de n. Por ello, no
son recomendables si el valor de n es grande. El algoritmo de Shell ofrece mejores prestaciones.
Bsqueda
La bsqueda lineal presenta una eficiencia O(^), mientras que en la bsqueda binaria su eficiencia
es O(log 2 ri). Estas frmulas significan que el tiempo requerido para ejecutar una bsqueda binaria
aumenta muy lentamente, y por ello es el m t o d o ideal, a u n q u e tiene c o m o inconveniente la
necesidad de que la lista o vector debe estar ordenado.
Mezcla
El mtodo de fusin de listas, adems de servir para esta operacin, ser la base de un mtodo de
ordenacin.
Otros mtodos
En los Captulos 13, 14 y 15 se estudiarn otros mtodos importantes de ordenacin, bsqueda y
mezcla, basados en los descritos en estos captulos, pero en general ms eficientes.

EJERCICIOS
1. Escribir un programa que lea una serie de n m e r o s enteros, los ordene en orden descendente y
a continuacin visualice la lista ordenada.
2. U n mtodo de ordenacin m u y simple, pero no muy eficiente, de elementos xlt Xj, x^,...x en
orden ascendente es el siguiente:
Paso 1: Localizar el elemento ms pequeo de la lista x a xn; intercambiarlo con x.
Paso 2: Localizar el elemento ms pequeo de la lista x2 a xn, intercambiarlo con x2.
Paso 3: Localizar el elemento ms pequeo de 1a lista x3 a xn, intercambiarlo con x.

En el ltimo paso, los dos ltimos elementos se comparan e intercambian, si es necesario, v


la ordenacin se termina. Escribir un programa para ordenar una lista de elementos, siguiendo
este mtodo.
3. Escribir un programa que lea 42 nmeros enteros en un array 7 x 6 y realizar las siguientes
operaciones:
a)
b)
c)
d)

Imprimir el array.
Encontrar el elemento mayor del array.
Indicar dnde se encuentra el elemento mayor del array.
Si el elemento mayor est repetido, indica cuntas veces y la posicin de cada elemento repetido.

4. Igual que el 1, pero con el mtodo Shell

513

b) Bsqueda binaria.

PROBLEMAS
1. D a d o un vector x de n elementos reales, donde n es impar, disear una funcin que calcule y
devuelva la mediana de ese vector. La mediana es el valor tal que la mitad de los n m e r o s son
mayores que el valor y la otra mitad son menores. Escribir u n programa que compruebe la
funcin.
2. Se trata de resolver el siguiente problema escolar. Dadas las notas de los alumnos de un colegio
en el primer curso de bachillerato, en las diferentes asignaturas (5, por comodidad), se trata de
calcular la media de cada a l u m n o , la media de cada asignatura, la media total de la clase y
ordenar los a l u m n o s por orden decreciente de notas medias individuales.
3. Se dispone de dos vectores, Maestro y Esclavo, del m i s m o tipo y n m e r o de elementos. Se
deben i m p r i m i r en dos c o l u m n a s adyacentes. Se ordena el vector Maestro, pero siempre que
u n elemento de Maestro se mueva, el elemento correspondiente de Esclavo debe moverse tambin; es decir, cualquier cosa que se haga a Maestro[i] debe hacerse a Esclavo[i], Despus de
realizar la ordenacin se i m p r i m e n de nuevo los vectores. Escribir un programa que realice
esta tarea.
4. Cada lnea de un archivo de datos contiene i n f o r m a c i n sobre u n a c o m p a a de informtica.
La lnea contiene el n o m b r e del empleado, las ventas efectuadas por el m i s m o y el n m e r o de
aos de antigedad del empleado en la compaa. Escribir u n programa que lea la informacin del archivo de datos y a continuacin se visualiza. La informacin debe ser ordenada por
ventas de mayor a m e n o r y visualizada de nuevo.
5. Se desea realizar un programa principal que realice las siguientes tareas con procedimientos o
funciones:
a)
b)
c)
d)
e)

Leer u n a lista de n m e r o s desde el teclado.


Visualizar dichos nmeros.
Ordenar en m o d o creciente.
Visualizar lista ordenada.
Buscar si existe el n m e r o 444 en la lista.

A m p l i a r el p r o g r a m a anterior de m o d o q u e p u e d a obtener y visualizar en el p r o g r a m a


principal los siguientes tiempos:
?!_ T i e m p o empleado en ordenar la lista de coordenadas.
t2. T i e m p o que se empleara en ordenar la lista ya ordenada.
3 . T i e m p o empleado en ordenar la lista ordenada en orden inverso.
6. Se leen dos listas de n m e r o s enteros, A y B, de 100 y 60 elementos, respectivamente. Se desea
resolver m e d i a n t e procedimientos las siguientes tareas:
a) Ordenar cada u n a de las listas A y B.
b) Crear u n a lista C por intercalacin o mezcla de las listas A y B.
c) Localizar si existe en la Lista C el n m e r o 255.

514

Programacin en Turbo/Borland Pascal 7


Se desea visualizar tambin en el programa principal las siguientes tareas:

14

d) Escribir un mensaje existe/ no existe el nmero 255.


e) Visualizar la lista C ordenada.

CAPITULO I

7. Se trata de resolver el siguiente problema escolar: dadas las notas de los alumnos de un colegio
en el primer curso de bachillerato, en las diferentes asignaturas (5, por comodidad), se trata de
calcular la media de cada alumno, la media de cada asignatura, la media total de la clase y
ordenar los alumnos por orden decreciente de notas medias individuales.
8. Escribir un programa que lea una serie de nmeros enteros, los ordene en orden descendente
y a continuacin visualice la lista ordenada.
9. Un mtodo de insercin muy simple, pero no muy eficiente, de elementosX\, x2,...x en orden
ascendente es el siguiente:
Paso 1:
Paso 2:

Localizar el elemento ms pequeo entre x y xn y cambiarlo con x\.


Localizar el elemento ms pequeo entre x 2 y x y cambiarlo con x2.

En el ltimo paso, los dos ltimos elementos se comparan e intercambian, si es necesario,


y la ordenacin se termina. Escribir un programa para ordenar una lista de elementos siguiendo este mtodo
10. Escribir un programa que lea 42 nmeros enteros en un array 7 * 6 y realizar las siguientes
operaciones:
d)
b)
c)
d)

Imprimir el array.
Encontrar el elemento mayor del array.
Indicar dnde se encuentra el elemento mayor del array.
Si el elemento mayor est repetido, indicar cuntas veces y la posicin de cada elemento.

11. Se lee una lista de nmeros desde teclado y se desea saber si entre dichos nmeros se encuentra
el 333. En caso afirmativo, visualizar su posicin en la lista. Resolver el problema por bsqueda secuencial y por bsqueda binaria.
12. Se implementan cadenas de caracteres mediante arravs de caracteres de una dimensin. Disear un programa que ordene cadenas.

13. Se quiere construir una agenda telefnica con la siguiente informacin: nombre, domicilio y
nmero de telfono. Disear un programa para mantener la agenda, que como mucho almacenar informacin sobre 100 personas de tal forma que la bsqueda se realice por el nombre
de la misma y que se mantenga durante su procesamiento ordenada alfabticamente de forma
ascendente.

REGISTROS
CONTENIDO
14.1.
14.2.
14.3.
14.4.
14.5.
14.6.
14.7.
14.8.
14.9.
14.10.
14.11.

El tipo de datos registro


La sentencia with
Registros jerrquicos (anidados)
Los registros c o m o parmetros
Arrays de registros
Registros variantes
Constantes de tipo registro (tipeadas)
Bsqueda en un array de registros
Bsqueda por conversin de claves (hashing)
Ordenacin de un array de registros
Puesta a punto de programas

RESUMEN
EJERCICIOS
PROBLEMAS

En los Captulos 8 y 9 se han introducido d o s tipos de estructuras de


datos: arrays y conjuntos. T o d o s los elementos de un array d e b e n
ser del mismo tipo y a cada e l e m e n t o se p u e d e acced er directam e n t e mediante el nombre y el ndice que indica la posicin del elemento en el array. De modo similar, t o d o s los elementos de un conjunto deben ser del mismo tipo; sin embargo, a e s t o s elementos no
s e a c c e d e directamente.
En muchas situaciones s e necesita procesar elementos que estn
relacionados entre s, pero que no son del mismo tipo. Por ejemplo,
una fecha consta de un nombre (cadena o array de caracteres),
un da (tipo entero o subrango 1..31) y un ao (por ejemplo,
1 9 0 0 , . 2 0 0 0 ) . Tales elementos s e conocen como registros. Pascal
puede procesar un nuevo tipo de datos llamado registro cuyos elementos pueden ser de diferentes tipos. En los registros se puede
almacenar una variedad de informacin sobre una persona (nombre,
estado civil, fecha de nacimiento, etc.), una empresa, etc. Cada elemento se almacena en un campo del registro independiente y se
puede referenciar cada elemento almacenado en un campo por su
nombre.
En e s t e captulo s e estudiar el concepto de registros y el mtodo de declarar y procesar dichos registros.

515

516

Registros

Programacin en Turbo/Borland Pascal 7

14.1.

Ejemplo 1 4 . 1

EL TIPO DE DATO 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.

Declaracin de un registro de empleados cuyos campos son: nombre, edad, domicilio, salario.
type
Empleado

Los componentes de un registro se denominan campos. Cada campo tiene un nombre llamado identificador de campo, que es algn identificador elegido por el programador cuando se declara el tipo registro y un tipo que se especifica cuando se declara el tipo
de dato record.
Formato

Fecha
type

tipojeg = record
lista idl tipo 1:
lista id2 tipo 2;

record
string [30]
Nombre
integer;
Edad
string [40]
Domicilio
real
Salario
end
record
(Enero, Febrero, Marzo, Abril, Mayo, Junio,
Mes
Julio, Agosto, Septiembre,
Octubre,Noviembre,Diciembre);
Dia
1. .31;
1900..2000
{ao}
Anno
end

Estas declaraciones han creado un tipo de datos llamado Empleado con cuatro campos: Nombre, Edad, Domicilio y Salario y otro denominado Fecha con tres campos:
Mes, Da y Ao.

lista idn tipo n


end;

tipo-reg
lista id
tipo

517

n o m b r e de la estructura o dato registro


lista de u n o o m s n o m b r e s de campos separados por c o m a s
puede ser cualquier tipo de dato estndar o definido por el usuario

Un registro se suele representar grficamente en funcin de sus campos.

14.1.1.

Variables tipo registro

Tras utilizar la declaracin type se ha creado un tipo de dato registro, pero no se ha creado
una variable de ese tipo. Esto se consigue con la declaracin var.
Formato

Empleado
Nombre

Edad

Domicilio

Sal a r i o

tipo cadena

tipo entero

tipo cadena

tipo real

var
NombreReg : NombreTipo

NombreTipo
NombreReg

es el m i s m o que el utilizado en la correspondiente declaracin type


n o m b r e de una variable particular registro

Ejemplo

Nacimiento : Fecha;
Trabajador : Empleado;
Campos
Figura 14.1.

Estructura d e un registro.

Las variables Nacimiento y Trabajador tienen la estructura especificada en la declaracin del tipo de registro Empleado y Fecha y se representan grficamente en la Figura 14.2.

518

Programacin en Turbo/Borland Pascal 7

Registros

Variable Empleado

Ejemplo

Nombre :
Edad :
Domicilio :
Salario :

type
Stock = record
Nmeros : integer ;
Nombre
: string [20];
Precio
: real
end;
var
Articulo, Item : Stock;

Josechu Garca de la Vega


34
3 de Mayo 1945
245320

Variable Fecha
Mes:
Da:
Ao:

La sentencia de asignacin de registros

Septiembre
25
1983

Figura 14.2.

14.1.2.

Septiembre

25

1983

Mes

Da

Ao

Variables tipo registro: Empleado y Fecha.

A c c e s o a los c a m p o s d e 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 y Fecha mediante una secuencia de


sentencias de asignacin:
Empleado.Nombre
Empleado.Edad
Empleado.Domicilio
Empleado.Salario

:=
:=
:=
:=

'Josechu Garcia de la Vega';


34;
'3 de Mayo de 1945';
245320;

Una vez que los datos estn almacenados en un registro, se pueden manipular de
igual forma que otros datos en memoria.
Write

14.1.3.

519

(Empleado.Nombre)

visualiza

Josechu Garcia de la Vega

O p e r a c i o n e s s o b r e registros

Los procedimientos de lectura y escritura no permiten ms que nmeros, caracteres o


cadenas. Un registro al ser una estructura compuesta es preciso efectuar las operaciones
de lectura y escritura individualmente.
Otra operacin que se puede realizar entre registros es la asignacin (copia del contenido de un registro en otro registro 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.

Articulo := Item;

equivale a
Articulo.Numero := Item.Numero;
Articulo.Nombre := Item.Nombre;
Articulo.Precio := Articulo.Precio;

Ejemplo 1 4 . 2
El siguiente programa define un tipo registro (cliente) y a continuacin 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];
Direccin : string [80];
Edad
: integer;
Saldo
: real
end;
var
Aux, Cliente
Datos;
begin
{ rellenar los campos }
Write
('Introduzca nombre del cliente : ');
ReadLn (Cliente.Nombre);
Cliente.Direccin := 'Avda 3 de Mayo 25';
Write
('Introduzca edad del cliente ');
ReadLn (Cliente.Edad);
Cliente". Saldo := 245320;
{ transferir los datos al registro Aux }
Aux := Cliente;
{ Visualizar los campos de Aux }
WriteLn ('Nombre :
',Aux.Nombre);
WriteLn ('Direccin:
',Aux.Direccin);
1
WriteLn ('Edad:
,Aux.Edad:1);
WriteLn ('Saldo:
',Aux.Saldo:i:1)
end.

520

Programacin en Turbo/Borland Pascal 7

Registros

521

Este mtodo de lectura/escritura campo a campo es engorroso. Pascal proporciona la


sentencia with, que facilitar el proceso de lectura/escritura de los registros.

14.2.1.

14.2.

Aunque la sentencia with es muy til para reducir la longitud de las sentencias de un
programa que manipulan componentes de un registro, tambin puede reducir la claridad
de las sentencias y producir ambigedades. En particular deber tener especial cuidado
cuando incluya ms de una variable registro en una sentencia wi th, ya que se puede producir ambigedad aparente. Pascal siempre utiliza la variable registro ms prxima.

LA S E N T E N C I A 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 nmero de campos es grande.
La sentencia with permite referenciar el nombre del registro en su cabecera, y posteriormente para llamar a algn campo slo se necesita el nombre del campo y no el selector de campo completo, con el nombre del registro (por ejemplo, Edad en lugar de
Cliente.Edad). La sentencia with slo ofrece un medio fcil de manipular diferentes campos de misma variable tipo registro.

Ejemplo
type
Empleado = record
Nombre
: string [20];
Edad
: integer;
Empresa : string [30]
end;
var
Socio
: Empleado;
Jefe
: Trabajador;
Deducciones : real;

Formato

var VarRegistro do
' begin
{sentencias que hacen referencia a campos de VarRegistro}
end

VarRegistro
sentencias

P r e c a u c i o n e s en el u s o d e la s e n t e n c i a w i t h

begin

n o m b r e o nombres de registros
relacionadas con los campos

with Socio do
begin
ReadLn (Nombre);
Neto := Salario - Deducciones;
WriteLn (Empresa)
end;

Ejemplos
l. Considere las siguientes declaraciones:
type
Prueba = record
F1 : integer;
F2 : string [8]
end;
var
X : Prueba;

Nombre y Empresa referencian a la variable Socio, m i e n t r a s q u e salario se refiere a la


*

variable J e f e .

14.3.

REGISTROS JERARQUICOS (ANIDADOS)

Un modo de asignar valores a un registro y luego visualizarlo con with puede ser:
En los ejemplos anteriores todos los campos de los registros eran tipos de datos simples,
cadenas o arrays. Es posible declarar un tipo registro con campos que sean otros registros. Un registro con uno o ms campos que son tipo registro se llama registro jerrquico
o registro anidado.

with X do
begin
F1 := 20;
F2 := 'Mortimer'
end;
WriteLn (X.F1, X.F2)
2. w i t h empleado do
WriteLn (Nombre)

Ejemplo 1 4 . 3
equivale a

WriteLn (Empleado.Nombre)

La Figura 14.3 representa un registro llamado Empleado correspondiente a una compaa


de informtica. Los campos del registro empleado contienen a su vez otros campos o subcampos.

522

Programacin en Turbo/Borland Pasca! 7


Empleado

Nombre

Apellido

Registros
Nombre
Apellidos

DireccionCompleta = record
Dir
: CalleNumero;
Ciudad
: string [15];
Provincia
: string [15];
CodigoPostal : string [5]
end;
RegEmpleado
= record
Nombre
: NombreEmp;
NumeroSS
: string [9];
Direccin : DireccionCompleta
end;
var
Empleado : RegEmpleado;

Nmero de la Seguridad Social


Direccin
completa

Direccin

523

Calle
Nmero

Ciudad
Provincia
Cdigo Postal

Figura 14.3. Estructura del registro Empleado.


O en representacin grfica

Como se ver ms tarde, se podra declarar una lista (array) de 100 empleados, con la
sentencia
Empleado

var Empleado: array [1..100] of RegEmpleado;

Otro mtodo de declarar Empleado como registro es simplemente establecer el registro completo en la sentencia var como sigue:

Postal

Calle

Nmero

var
Empleado : record
Nombre : record
Apellidos : string [25];
Nombre
: string [10]
end;
NumeroSS : string [9];
Direccin: record
Dir
: record
Calle
: string [20];
Numero : integer
end;
Ciudad
: string [15];
Provincia
: string [15];
CodigoPostal: string [5]
end
end;

Declaracin de! registro Empleado


type

NombreEmp

CalleNuitiero

record
apellidos : string [25],
nombre
: string [10]
end;
record
Calle : string [20];
Numero: integer
end;

Los numerosos sangrados pueden hacer ms difcil de leer que la primera versin.
Tiene otro inconveniente, y es que un registro declarado de este modo (sin definicin de
tipo) no se puede enviar como un parmetro a un subprograma, ya que un subprograma
debe tener un tipo definido para cada parmetro.

14.3.1.

A c c e s o a los registros a n i d a d o s

Para referenciar un campo en registros anidados se debe indicar el camino a seguir en


orden jerrquico desde el nombre del registro raz hasta el campo especfico.

524

Programacin en Turbo/Borland Pascal 7

Registros

Ejemplos
Empl eado. nombre. apel 1 i dos

se refiere al campo apellidos del subregistro


Empleado, nombre.

Empl eado. numero-SS.

se refiere al campo nmero SS del registro empleado

Empleado.direccion.codigoPostal

14.3.2.

WriteLn ( 1 introduzca numero');


ReadLn
(Numero)
end;
WriteLn ('introduzca ciudad');
(Ciudad);
ReadLn
WriteLn ('introduzca provincia);
(Provincia);
ReadLn
WriteLn ('introduzca Codigo Postal');
(CodigoPostal)
ReadLn
end

:= '28220'

Sentencias w i t h anidadas

La sentencia with se puede utilizar para abreviar los selectores de campos, f o r m a n d o with
anidadas.

end

14.3.3.

Ejemplo
with empleado, nombre do
WriteLn (apellidos, '

nombre)

es equivalente a

525

A m b i g e d a d : n o m b r e s n i c o s para identificadores

Un identificador de campo debe ser nico dentro de un registro, es decir, no puede haber
dos identificadores de campo con el mismo nombre dentro del mismo registro.
Ejemplo. Esta definicin de registro es ilegal.

with empleado do
with nombre do
WriteLn (apellidos,

', nombre)

o tambin a
with empleado nombre do
WriteLn ('apellidos',

nombre)

Ejemplo 1 4 . 4
Leer el registro completo Empleado.
with Empleado do
begin
with Nombre do
begin
WriteLn
ReadLn
Wr te
i Ln
ReadLn
end;

('introduzca apellidos');
(Apellidos);
('introduzca nombre');
(Nombre)

WriteLn ('introduzca numero de la Seguridad Social');


ReadLn
(NumeroSS);
with Direccin do
begin
with Dir do
begin
WriteLn ('introduzca calle');
ReadLn
(Calle);

type direccin = record


numero : integer;
calle : string [10];
numero : real
end

Sin embargo, un registro puede contener un identificador de campos que puede aparecer en otro registro, incluso aunque estn los dos campos anidados. En la Figura 14.4,
en el registro persona, hay un identificador de campo a en cada u n o de los dos registros
numero y media, que estn anidados en el registro PersonaReg.

526

Programacin en Turbo/Borland Pascal 7

Ejemplo
type
NumReg

MediaReg

Registros

Para acceder a un elemento se deben especificar todos los niveles, y por ello no se
produce ambigedad y los identificadores demo y demo. demo pueden coexistir en un programa.

= record
A : real;
B : integer
end;
= record

A : real;
J : integer
end;
PersonaReg = record
Numero : NumReg;
Media
: MediaReg
end;

var
Persona : PersonaReg;
A
: real;

Pascal evita la ambigedad. Son diferentes las siguientes variables:


campo a del subregistro numero
campo a del subregistro media
es una variable de tipo real

persona.numero.a
persona.media.a
a

527

Ejemplo

demo
demo. demo

14.4.

es el nombre de un registro
variable entera

LOS REGISTROS COMO PARAMETROS


%

Los registros pueden ser utilizados como parmetros de funciones y procedimientos. En


consecuencia, un registro se puede pasar como un parmetro a una funcin o procedimiento. El uso de registros como parmetros abrevia la lista de parmetros considerablemente, ya que un parmetro (la variable registro) se puede pasar en lugar de diferentes
parmetros (los campos del registro). Los registros se pueden pasar por valor y por
variable (referencia), aunque normalmente es este ltimo el mtodo utilizado.
Ejemplo
type
demol = record
X : integer;
Y : integer
end;
procedure Prueba (A: Demol);

La Figura 14.5 muestra el registro demo, que contiene un campo tambin llamado
demo.
Ejemplo 1 4 . 5
demo

Escribir un procedimiento que reciba como parmetro de entrada un registro completo


que contenga los datos estadsticos de calificaciones de una clase: Notas inferior y superior (puntuaciones de 0 a 100), media y desviacin estndar (diseo de parmetro por valor).
Declaracin del registro

Figura 14.5. Registro demo.


La definicin del registro es
type

type
Estadstica = record
Inferior, Superior : 0..100;
Media, DesEstandar : real
end;
var
Clase : Estadstica;

InfoReg = record
A
: real;
B
: string [20];
Demo : integer
end;
var Demo : InfoReg;

Procedimiento
procedure DatosClase
begin
with Clase do

(Aula : Estadstica);

Registros
528

529

Programacin en Turbo/Borland Pascal 7

La nueva hora ser:


begin
WriteLn ('Puntuacin mayor: ',
WriteLn ('Puntuacin mayor:
WriteLn ('Media aritmtica: ',
WriteLn ('Desviacin Estandar:
end
{ with }

Superior :3);
Inferior :3);
Media :3:1 );
', DesEstandar :3:1)

end;

72m = lh 12m

4h 12m 50s

Escribir un procedimiento que lea los valores de cada campo de un registro de stock de un
almacn y lo devuelva al programa principal. (Diseo de parmetro de salida variable.)
type
Stock = record
Nmeros : integer;
Nombre
: string [20];
Precio
: real
end;

procedure
begin
WriteLn
ReadLn
WriteLn
ReadLn
WriteLn
ReadLn
end;

('Introducir numero de la serie');


( Articulo.Numero );
('Introducir nombre ' )
(Articulo.Nombre);
('Introducir precio)
(Articulo.Precio)

Ejemplo 1 4 . 7

Anlisis
Supongamos que la hora actual es : 3h I9m 30s.
Si el intervalo de tiempo es 3.500 segundos, la nueva hora ser
3h 14m 30s + 3.500s = 3h 14m 3530s

Habr que transformar en horas, minutos y segundos: 3530 segundos


|

60
58

Programa
program Horario;
type
Tiempo = record
Horas
: O..23;
Minutos, segundos : 0..59
end;
var
Actual : Tiempo;
Pausa
: integer;

Leer_Registro (var Articulo : Stock)

En un programa de simulacin se desea tener actualizada la hora del da, despus de un


intervalo de tiempo (duracin de un experimento) expresado en segundos. Disear w
procedimiento que lea como dato de entrada dicho intervalo de tiempo y la hora antigua,
expresado en horas, minutos, segundos (en un registro), y devuelva la nueva hora.

530
50

Los 72m se convertirn en horas

La nueva hora ser:

Ejemplo 1 4 . 6

353

3h 14m + 58m 50s = 3h 72m 50s.

resultado 58m 50s, se obtiene con operadores mod y div


3530 mod 60 = 50;3530 div 60 = 58

procedure Actualizar (Intervalo : integer; var HoraActual :


Tiempo);
var
MinutosNuevos, SegundosNuevos : integer;
begin
with HoraActual do
begin
SegundosNuevos := Segundos + Intervalo; { total segundos }
Segundos
:= SegundosNuevos mod 60;
MinutosNuevos
:= Minutos + SegundosNuevos div 60;
Minutos
:= MinutosNuevos mod 60;
Horas
:= Horas + MinutosNuevos div 60;
Horas
:= Horas mod 24
end
{ with }
end;
begin
{ inicio programa principal }
WriteLn ('introduzca hora actual');
with Actual do
begin
WriteLn ('hora? ');
ReadLn
(Horas);
WriteLn ('minutos? ');
ReadLn
(Minutos);
WriteLn ('segundos? ');
ReadLn
(Segundos)
end;

530

Programacin

en Turbo/Borland

Registros

Pascal 7

531

W r i t e ('Mes (1-12): ');


R e a d L n (Mes);
F e c h a U s u a r i o . M e s := P r i m e r o M e s ;
for J := 2 t o M e s do
F e c h a U s u a r i o . M e s := Succ (FechaUsuario.Mes);

WriteLn ('introduzca los segundos t r a n s c u r r i d o s ' ) ;


ReadLn
(Pausa);
A c t u a l i z a r (Pausa, Actual);
{ salida de hora actual }
W r i t e L n ('La hora actual es ');
with Actual do
W r i t e L n ( H o r a s : 1 , M i n u t o s : 1 S e g u n d o s : 1) ;
end.

W r i t e ('Ao 19xx');
ReadLn (Anio)
F e c h a U s u a r i o . A n i o := 100 + Anio
end;

Problema 1 4 . 1
Disear un procedimiento EntradaFecha que permita introducir una fecha, se almacene en
un registro de tipo Fecha y se devuelva de nuevo al programa llamador.

Ejecucin modelo
llamada al p r o c e d i m i e n t o

: IntroduzcaFecha

(Actual);

resultado:

Anlisis

Dia 1-31
Mes (1-12)

La fecha se considera como un tipo registro.

Ao i9xx

: 15
: 5

: 89

esta fecha es el 15 de mayo de 1989

type Fecha = record


Mes
Dia
Anio
end

: (Ene, Feb, Mar, Abr, May, Jun, Jul, Ago,


Sep, Oct, Nov, Dic);
: 1..31;
: 0..2000

14.5.

Los registros simples se utilizan raramente por s mismos. En general se agrupan en


conjuntos conocidos como arrays de registros. Por ejemplo, si se dispone un registro que
contiene los datos relativos a un artculo de un stock de almacn.

El mes se va a introducir como un nmero ordinal de un entero de 1 a 12 que luego


se convierte en un elemento del tipo de datos Mes. Esta operacin se puede hacer asignando
PrimerMes

:= Ene;

A continuacin a Mes se asigna el valor del -simo mes utilizando un bucle:


Mes := P r i m e r o M e s ;
for K := 2 t o N do
Mes

:= Succ

(Mes);{ mes siguiente }

ARRAYS DE REGISTROS

type
ItemStock = r e c o r d
N o m b r e : string [30];
N u m e r o : integer;
Precio : real
end;

Nombre

tornillo

Nuevo

1492

Cdigo
p r o c e d u r e I n t r o d u c i r F e c h a (var F e c h a U s u a r i o : Fecha);
{introducir
una
fecha
por el
usuario
y almacenarla
registro q u e se d e v u e l v e de nuevo al p r o g r a m a l l a m a d o r }
var
J, Mes, A n i o

Precio
en

25.000

un

: integer

{J c o n t a d o r del b u c l e del mes, es la r e p r e s e n t a c i n del orden del


mes. A n i o r e p r e s e n t a d o por los d o s l t i m o s digitos}
begin
P r i m e r M e s ;= Ene;
W r i t e ('Dia < 1 - 3 1 ' ) ;
ReadLn (FechaUsuario.Dia);

Si el inventario dispone de 100 artculos y se desean procesar adecuadamente, se


puede utilizar un array de registro de 100 elementos; mediante la declaracin siguiente se
definen los elementos del conjunto.
type
Lista = array
var
Inventario

[1..100] of ItemStock;

: Lista;

532

Programacin

en Turbo/Borland

Registros

Pascal 7

Merced a esta declaracin se puede acceder a cada registro a travs de los campos de
cada registro. As, por ejemplo, la lista completa del inventario se puede leer con el
siguiente segmento de programa:

BoletinNotas

WriteLn (' el siguiente e l e m e n t o es:


LeerRegistro (Inventario [I])
end;

');

Boletin

(var Item

WriteLn

('del e s t u d i a n t e numero

:1,' en una L i n e a

');

for I := 1 t o N u m A s i g n a t u r a s d o
Read (B [E].Asignaturas [I]);
ReadLn
{ salto de L n e a para n o t a s de otro e s t u d i a n t e }

: ItemStock);

end

('Introducir el nombre
(Item.Nombre);

end;

');

('Introducir numero de stock


(Item.Numero);
('Introducir precio');
(Item.Precio)

procedure MediasEstudiante

');

El proceso de registros del array es similar al tratamiento, ya conocido, de elementos


de un array con la peculiaridad de ser tipos compuestos (registros) en lugar de ser tipos
simples.

campo del registro


ndice del elemento del array
array de registros de tipo ItemStock

begin
Suma := 0;
for I := 1 t o N u m A s i g n a t u r a s do
Suma := Suma + B [ E ] . A s i g n a t u r a s [ I ] ;
B [E].Media := Suma / N u m A s i g n a t u r a s
end
end;
procedure Resultados

(var B: B o l e t i n N o t a s ) ;

Problema 1 4 . 2

var
E : IndiceEstudiantes;
I : IndiceAsignaturas;

Escribir mediante registros el problema 11.5, relativo a Control de exmenes de un curso


escolar.

begin
WriteLn
for E

: array
: real

'media'

WriteLn
end
end;
[IndiceAsignaturas]
of real;

Media
end;

('Estudiante',

: 10,

'Notas A s i g n a t u r a s ' : 4 1 ) ;

:= 1 t o N u m E s t u d i a n t e s do

begin
W r i t e (E:6, B[E].Media :13:1,' ':10);
for I := 1 t o N u m A s i g n a t u r a s d o
W r i t e (B[E]. A s i g n a t u r a s [I] :10:1);

program ControlExamenes;
const
NumEstudiantes = 4;
cambiar valores segn
NumAsignaturas = 4;
necesidades del usuario
type
IndiceEstudiantes = 1.
NumEstudiantes;
IndiceAsignaturas = 1. N u m A s i g n a t u r a s ;
Estudiante
record
Asignaturas

(var B: BoletinNotas);

var
E
: IndiceEstudiantes;
I
: IndiceAsignaturas;
Suma : real;
begin
for E := 1 t o N u m E s t u d i a n t e s do

I n v e n t a r i o [2].Nombre

(var B: B o l e t i n N o t a s ) ;

begin
W r i t e ( ' i n t r o d u z c a las ',NumAsignaturas :1, 'calificaciones')

I : integer;
begin

WriteLn
ReadLn
WriteLn
ReadLn
end;

: BoletinNotas;

var
E : IndiceEstudiantes;
I : IndiceAsignaturas;
begin
for E := 1 t o N u m E s t u d i a n t e s do

El procedimiento LeerRegistro debe permitir leer los datos de cada registro definido
por el ndice i.
p r o c e d u r e LeerRegistro
var

[ I n d i c e E s t u d i a n t e s ] of E s t u d i a n t e ;

var

procedure LeerNotas

for I := 1 to 100 do
begin

WriteLn
ReadLn

= array

533

b e g i n { p r o g r a m a principal }
LeerNotas
(Boletin);
M e d i a s E s t u d i a n t e (Boletin);
Resultados
(Boletin)
end.

534

Registros

Programacin en Turbo/Borland Pascal 7

Ejemplo

Ejecucin modelo
introduzca las 4 calificaciones del estudiante numero 1 en una
Linea 10 9 8 7.4

type
Libro

record
Autor
Titulo
Paginas
Editorial
Ciudad
Anio
end;
Articulo = record
Autor
Titulo
Paginas
Periodico
Dia

introduzca las 4 calificaciones del estudiante numero 2 en una


Linea 5 4 3 6
introduzca las 4 calificaciones del estudiante numero 3 en una
Linea 6 8.2 6.4 5.6

Estudiante

Media

1
2
3
4

8.6
4.5
6.6
6.5

Notas Asignaturas
10..0
5..0
6.,4
6..0

9.0
4.0
5.0
8.2

8.0
3.0
7.0
6.4

7.4
6.0
8.2
5.6

Nota

string [30];
string [20];
integer;
str ing [15];
string [20];
integer

string [30];
string [20];
integer;
string [25];
Fecha {tipo supuestamente
definido antes}

end;

Los dos registros de tipo fijo se pueden combinar en un solo registro de tipo variante.

Los arrays de registros sustituyen a los arrays paralelos estudiados en el Captulo 12 con notable eficacia.

14.6.

535

REGISTROS VARIANTES

Las variables de los tipos registro utilizadas hasta este punto se suelen conocer como
registros invariantes o registros fijos. Esto se debe a que una vez que el tipo registro ha
sido definido, cualquier registro de ese tipo debe incluir todos los campos incluidos en la
definicin del tipo y por consiguiente son partes invariantes o fijas. Sin embargo, en
numerosas ocasiones se requieren registros del mismo tipo pero que contengan claves
diferentes de informacin. Esta tarea es posible gracias a los registros variantes.
Registros variantes son aquellos tipos de registros que tienen algunos campos que son
iguales para todas las variables de ese tipo {parte fija) y otros campos que pueden ser
diferentes {parte variante). Por ejemplo, supongamos registros que contengan las referencias bibliogrficas de libros y artculos de prensa. Tanto libros como artculos tienen
autor, ttulo y nmero de pginas. Sin embargo, los libros requieren editorial, ciudad y
ao de publicacin, mientras que los artculos requieren peridico y da de salida. Ambos datos pueden almacenarse en registros variantes con una parte fija {autor, ttulo y
pginas) y una parte variante {editorial, ciudad, ao o bien peridico, fecha).
Los registros variantes se declaran de m o d o similar a los registros fijos excepto que
hay un campo de indicador especial {tag) con una o ms opciones {variantes) del registro. Una sentencia case se utiliza para declarar los campos diferentes variantes. El indicador especial puede constar de una variable indicadora (con un tipo asignado) o slo un
tipo.

El nuevo registro ser similar a:


type
(Libro, Articulo);
Forma
Publicacin = record
: string [30];
Autor
Titulo
: string [20];
Paginas
: integer;
case Tipo: Forma of
Libro:
string [15];
(Editorial
integer);
Anio
Articulo:
(Periodico
Dia: Fecha)

string [25];
{tipo previamente
definido}

end;

Ejemplo
var
A

record
Campos
case Bandera
true

integer;
boolean of
(A : integer;
B : char;
C : string [10]);
false : (E : array [1..15] of boolean)
end; { fin declaracin variable tipo registro }

536

Registros

Programacin en Turbo/Borland Pascal 7

537

DatosPers = record

Ejemplo
type
Forma = (triangulo, cuadrado, circulo);
Tinta = (rojo, azul, verde);
Figura = record
Color : Tinta;
case Aspecto : Forma of
Triangulo : (base, altura : real);
Cuadrado
: (lado : real);
Circulo
: (radio : real)
end; { record }
var
Dibujol, Dibujo2 : Figura;

La parte fija de un registro siempre debe preceder a la parte variante que debe figurar
al final de la declaracin. Si para una parte variante dada no est previsto campo, se
indicar por ().
Problema 1 4 . 3
Se desea guardar en registros informaciones sobre profesores y alumnos. En el caso de los
profesores se guardar nombre, apellidos y materia que ensea; en el caso de lo alumnos, nombre, apellidos, curso y asignatura opcional elegida. Escribir un programa que
agrupe la informacin de profesores y alumnos en registros variantes.
Anlisis
Registro variante:
N o m b r e Apellidos

Asignatura

Profesor

Alumno (estudiante)

Asignatura

Curso

Opcin

Programa
program Docente;
const
Profesor
= 1;
Estudiante = 2;
type
Materia
= string [15];
Nivel
= 1. . 3 ;
Profesion = Profesor..Estudiante;

Persona

Tabla

Nombre : string [15];


Apellidos : string [30]
end;
= record
Identidad
DatosPers;
case Estado
Profesion of
Profesor
(Asignatura: Materia);
Estudiante
(Curso
: Nivel;
Opcin
Materia )
end;
= array [1..2] of Persona;

var
T : Tabla;
J : integer;

begin
{programa principal}
for J := 1 to 2 do
with T [J], Identidad do
begin
ReadLn (Nombre);
Write ('Nombre
Write ('Apellidos
ReadLn (Apellidos);
Write ('Estado
ReadLn (Estado);
case Estado of
Profesor
: begin
Write ('Asignatura que imparte:'
ReadLn (Asignatura)
end;
Estudiante
begin
Write ('Curso
: ' ); ReadLn (Curso);
Write ('Opcional : ' ); ReadLn (Opcin)
end
end
end;

for J := 1 to 2 do
with T [J], Identidad do
begin
Write (Apellidos, ' ', Nombre, ' ');
case Estado of
Profesor
: WriteLn ('imparte ', Asignatura);
Estudiante : begin
Write ('estudia ', Curso :1, ' curso ');
WriteLn ('y opcional : ', Opcin)
end
end
end
end.

538

Programacin en Turbo/Borland Pascal 7

Registros

El usuario i n t r o d u c i r p o r teclado u n a letra (R o r, o bien C o c) y, segn sea dicha


e n t r a d a , el p r o g r a m a calcular el rea del crculo o el rea del rectngulo.
Se declara u n tipo de d a t o e n u m e r a d o , Figura, c o m p u e s t o de los datos Circulo y
Rectngulo,
as c o m o u n tipo d e n o m i n a d o Dibujo p a r a declarar los tipos de datos a
considerar segn sea el caso.

Ejecucin
Nombre : John
Apellidos : Mortimer
Estado : 1 Asignatura que imparte : Programacin
Nombre : Tom
Apellidos : Carrigan
Estado : 2
Curso :3
Opcin : Tecnologia

Programa

Mortimer John imparte Programacin


Carrigan Tom estudia 3 curso y opcional Tecnologia

14.6.1.

Almacenamiento de los registros variantes

Los registros variantes n o son a b s o l u t a m e n t e necesarios. Basta con definir los registros
con m a y o r n m e r o de c a m p o s o sus registros equivalentes. Sin e m b a r g o , en la m a y o r a
de los sistemas el registro variante utilizar m e n o s m e m o r i a ( a l m a c e n a m i e n t o ) ya q u e se
e m p l e a el m i s m o a l m a c e n a m i e n t o p a r a el c a m p o Libro c o m o para el c a m p o Articulo.
Por consiguiente, el espacio de m e m o r i a o c u p a d o p o r u n a variable registro v a r i a n t e es el
c o r r e s p o n d i e n t e a la s u m a del t a m a o del c a m p o fijo y el t a m a o del c a m p o v a r i a n t e
m s grande, en lugar de ser la s u m a de los espacios o c u p a d o s p o r los c a m p o s totales
Libro v Artculo.
Artculo

Libro
Autor
Ttulo
Pginas

Editorial
Ciudad
Ao

Parte fija

Parte
variante

Autor
Ttulo
Pginas

Parte fija

Peridico
Fecha
Da
Mes
Ao

Parte
variante

No utilizada
(espacio
malgastado)

No utilizada
(espacio
malgastado)

Problema 1 4 . 4

Anlisis
Srectangulo = Longitud.Anchura
Acirculo
= 7t.R2

calcular la superficie

de un rectngulo

program SuperficieFiguras;
{ uso de registros variantes }
const
Pi = 3.141592;
type
Figura = (Circulo, Rectngulo);
Dibujo = record
Superficie : real;
case Forma : Figura of
Circulo
: ( Radio : real);
Rectngulo : ( Longitud, Anchura : real)
end;
var
D
: D ibu jo;
Resp : char;
function Convertir (Letra : char): Figura;
{ convierte un codigo de Letra, en un valor del tipo enumerado
Figura }
{ c/c en Circulo, R/r en Rectngulo }
begin
case Letra of
'C','c' : Convertir := Circulo;
'B'i'r' : Convertir := Rectngulo
end
{case}
end;
{Convertir}

P o r consiguiente, a u n q u e los registros variantes n o son obligatorios, se a h o r r a considerable m e m o r i a c u a n d o se utilizan.

Utilizar un registro variante que permita


crculo segn la eleccin del usuario.

539

o de un

begin
{ programa principal }
{ determinar tipo de figura }
WriteLn ('Seleccione tipo de figura ');
WriteLn ('R/r Rectngulo, C/c Circulo');
ReadLn
(Resp);
D.Forma := Convertir (Resp);
{ lectura de datos Y Calculo de superficies }
case D.Forma of
Circulo
: begin
{ Circulo }
WriteLn ('introduzca el radio');
ReadLn
(D.Radio);
D.Superficie := Pi * Sgr (D.Radio)
end;
{ Circulo
}
Rectngulo : begin { rectngulo }
WriteLn ('introduzca longitud y anchura ');
ReadLn
(D.Longitud, D. Anchura),;
D.Superficie := D.Longitud * D.Anchura
end
{ rectngulo }

540

Registros

Programacin en Turbo/Borland Pascal 7


type
RegEmpleado = record
Nombre
NombreReg;
NumSegSocial
string [9];
DireccionPostal;
Direccin
boolean of
case Directivo
true :
(Cargo
string [ 1 5 ] ;
real ;
Salario
Secretaria string [30]),
false : ( )
end;
var
Empleado
array [1..100] of Empleado;

encocase D.Forma of
Circulo
:WriteLn ('radio=
D.Radio :2:1);
Rectngulo :WriteLn ('dimensiones=
D.Longitud:2:1,
' y
D.Anchura:2:1}
end;
WriteLn ('superficie =
D.Superficie :1:1)
end.
Ejecucin modelo
1. Seleccione tipo de figura
R/r Rectngulo, C/c Circulo
r
introduzca longitud y anchura
1 5
dimensiones = 1.0 y 5.0
superficie = 5.0

Se desea a l m a c e n a r i n f o r m a c i n en el registro de cada directiva pero n in g u n a inform a c i n en el resto de los e m p l e a d o s . Se utilizar u n registro variante con u n a lista de
c a m p o s vacos p a r a el resto de los e m p l e a d o s . E n este e j e m p l o , c u a n d o d i r e c t i v o no es
verdadero, la lista de c a m p o s es vaca, y se i n d i c a este h e c h o con u n p a r de parntesis vacos.

2. Seleccione tipo de figura


R/r Rectngulo, C/c Circulo
c
introduzca el radio
3
radio = 3 . 0
superficie = 28.3

14.6.2.

541

Nota
Como se proporciona la estiuctuu fsica del registro rmplea.tn, se deja para diseo del lector
la csciituu de los tipos de datos: wnibn'Ri\s. lnrw cionfostii! \ su inclusin en la deela-

Variantes vacos

En ocasiones en un p r o g r a m a con registros variantes no se desea i n t r o d u c i r i n f o r m a c i n


en d e t e r m i n a d o s c a m p o s . P o r e j e m p l o , c o n s i d e r e m o s el registro Empleado.

14.6.3.

Registros variantes anidados

U n registro variante p u e d e t a m b i n estar a n i d a d o d e n t r o de otro registro variante.


Empleado

Ejemplo 1 4 . 8
Consideremos
de nuevo el registro Empleado. Supongamos
que cada directivo o ejecutivo
tiene un cierto automvil (turismo) asignado en funcin de su categora dentro de la compaa. En cada uno de estos casos se debe anotar la matrcula del automvil. Los directivos ms altos tienen asignado un vehculo Mercedes y chfer.
El registro variante Empleado tendr asignado otro registro variante Transporte en el
que se recojan todas las circunstancias
anteriores.

Nombre
Pepe

Direccin

Apellido
Mortimer

Ciudad

Provincia

Cdigo
Postal

Anlisis
Se d a r n los siguientes casos en f u n c i n de la categora del directivo.

Calle

Nmero

Majadahonda

Madrid

'28220'

turismo : matricula
Mercedes : matricula y nombre del chofer
ni nguno

542

Programacin en Turbo/Borland Pascal 7

La n u e v a declaracin del registro E m p l e a d o sera:


type
Transporte = (Turismo, Mercedes, Ninguno);
RegEmpleado = record
Nombre
: NombreReg; { previamente
definido }
No_SegSocial
: string [9;
Direccin
: DireccionPostal; { previamente
definido
case Directivo : boolean of
true : (Cargo
: string [13];
Salario
: real;
Secretaria
: string [30];
case Vehiculo : Transporte' of
Turismo : (Matricula : string [10]);
Mercedes: (Matricula : string [10];
Conductor : string [30]);
Ninguno : ();
false: ( )
end;

14.6.5.

Aplicaciones especficas

U n registro con variantes p u e d e ser la e s t r u c t u r a bsica de u n archivo p e r o t a m b i n


p u e d e servir para confundir al compilador. M e d i a n t e u n registro variante a d e c u a d o , u n a
m i s m a z o n a de m e m o r i a p u e d e ser c o n s i d e r a d a de dos m o d o s diferentes. El e j e m p l o
siguiente ilustra este caso.
Ejemplo
program Recubrimientos;
type Entero
= 1..2;
Recubrimiento = record
case entero of
1 : (X : char);
2 : (Octeto : byte)
end;
var
R : Recubrimiento;
begin
with R do
begin
X := 'B ;
WriteLn (X);
Octeto := Ord (x);
WriteLn (Octeto);
Octeto := Octeto + 1;
WriteLn (X)
end
end.

Registros

543

Ejecucin
B
66
C

La variable R.x se e n c u e n t r a en m e m o r i a s o lap ad a con la variable R.octeto. A a d i r 1


a Octeto equivale a a a d i r 1 al carcter q u e se e n c u e n t r e en x; es decir, el siguiente en el
cdigo ASCII, la letra C.
P o r esta razn los registros c o n variantes en ocasiones p u e d e n ser peligrosos de usar y
es preciso e x t r e m a r las precauciones.

14,7.

CONSTANTES DE TIPO REGISTRO (TIPIFICADAS)

Las c o n s t a n t e s tipo registro d e b e n ser declaradas de u n m o d o ligeramente deferentes a


las otras c o n s t a n t e s estructuradas. Se debe d e c l a r a r p r i m e r o un tipo registro y a contin u a c i n u n a c o n s t a n t e q u e c o n t e n g a los valores de cada c a m p o del registro. La lista de
valores debe incluir el n o m b r e de c a d a c a m p o seguida p o r dos p u n t o s y a c o n t i n u a c i n
el valor de ese c a m p o . Los e l e m e n t o s d e la lista d e b e n estar separados p o r p u n t o s y
comas.
Ejemplo
1. type
Coordenadas = record
X, Y
end;
const
Origen : Coordenadas
EjeX
: Derecha
EjeY
: Derecha

: real

= (X :0, Y :0);
= (A:0; B:l; C:0);
= (A:l; B:0; C:0);

2. type
Simple = record
Nombre : string [20];
Edad
: integer
end;
const
Empleado : Simple = (Nombre : 'Mortimer'; Edad: 42);
3. type
Bps
= (B110, B300, B1200, B2400, B2800, B9600),
TipoParidad
= (Impar, Par, SinParidad);
Caractersticas = record
CodigoLocal
: string [3j;
Tono
: boolean;
Dial
: boolean;
VelocidadesBaudios : Bps;
BitsPorCaracter
: integer;
Paridad
: TipoParidad
end;

544

Programacin en Turbo/Borland Pascal 7


const
Calificacin : Caractersticas =
(CodigoLocal
Tono
Dial
VelocidadBaudisos
BitsPorCaracter
Paridad

Registros

P a r a buscar algn e l e m e n t o ( t ) en el array: A[ 1 ], A[2], . . . , A[ 100], se debe c o m p a r a r


el e l e m e n t o d a d o con los diferentes e l e m e n t o s del array segn el tipo de b s q u e d a e m pleado, con sentencias similares a:

' 325 '


False
True ;
B2400
7;
Par) ;

1f A.Codigo = t then
A p l i q u e m o s los m t o d o s de b s q u e d a lineal y binaria al caso de elem en to s registros y
p o s t e r i o r m e n t e e s t u d i a r e m o s el caso de la b s q u e d a p o r conversin de claves.
Se realizarn t o d o s los algoritmos con u n m i s m o tipo de estructuras de datos (registros de e m p l e a d o s de u n a empresa).

Sintaxis
const
NombreCons: NombreReg

= NombreCampol : Valorl; NombreCampo2 : V a l o r 2 , . , .

Regla
Pura tledarar eonsiantes tipo registro se deben seguir estas reglas:
1. Declarar el tipo registro.
2. IX'daiar la constante tipo resisti.

14.8.

BUSQUEDA EN UN ARRAY DE REGISTROS

U n problema tpico en el proceso de arrays es la bsqueda en u n array para d e t e r m i n a r


si contiene un e l e m e n t o de datos d e t e r m i n a d o . Si los e l e m e n t o s de los arrays son registros, entonces la b s q u e d a se debe realizar por un c a m p o d e t e r m i n a d o del registro denom i n a d o clave del registro: u n n o m b r e , u n n m e r o de telfono, etc. U n a vez localizado
el registro en cuestin, se p u e d e visualizar o m o d i f i c a r dicho registro. Los tres tipos de
b s q u e d a m s conocidos son:
bsqueda
bsqueda
bsqueda

lineal
binaria
"hash" (conversin

de claves)

Ejemplo 1 4 . 9
El array de registros A con elementos
type
Item = record
Codigo
Nombre
Cantidad
Precio
end
var
A: array [1..100]

:
:
:
:

de un stock de almacn

string [10];
string [20];
integer;
real;

of Item;

est definido

545

as:

program Ordenal ;
const
Max = 100; { numero mximo de registros de empleados }
type
Cadl
= string [20];
Cad2
= string [15];
InfoEmp = record
Nombre
: Cadl;
NumSSocial : Cad2;
Edad
: integer;
Salario
: real
end;
ListaEmpleados = array [l..Max] of InfoEmp; {array de registros}
var
Total
: integer;
{numero de registros almacenados
}
Opcin
: char;
{ entrada del usuario para seleccin }
Terminado : boolean;
{ variable lgica de fin de proceso }
Empleado : ListaEmpleados; {variable tipo array de registros
}
S u p o n g a m o s q u e e s t a m o s b u s c a n d o en la lista de e m p l e a d o s un registro q u e contiene
un n o m b r e a l m a c e n a d o en u n i d e n t i f i c a d o r (o bien tiene el valor t). El valor q u e devuelve el p r o c e d i m i e n t o / f u n c i n de b s q u e d a ser u n valor e n t e r o y se asigna al identificad o r Posicion (ndice). Posicion se inicializa a 0, y si el d a t o b u s c a d o se e n c u e n t r a d u r a n t e
la bsqueda, a Posicion se le asignar u n n u e v o valor e n t e r o igual al ndice del array de
registros. Al final de la b s q u e d a el valor de Posicion servir p a r a deducir si la b s q u e d a
ha tenido xito.
Posicion = 0
Posicion = n

elemento no encontrado
elemento encontrado en posicin ;n = valor entero

D a d o q u e en el C a p t u l o 13 se d i s e a r o n los algoritmos de b s q u e d a con funciones,


en este captulo se utilizarn p r o c e d i m i e n t o s c o n ligeras variantes en los algoritmos a fin
de darle u n a p a n o r m i c a m s p r o f u n d a al lector.

546

Programacin

14.8.1.

en Turbo/Borland

Pascal 7

Registros

Bsqueda lineal

14.9.

procedure BusquedaLineal

(Lista

.-ListaEmpleados; T : C a d i ;

C u e n t a : integer; var P o s i c i o n : integer);


{Procedimiento para b u s c a r un registro, con un n o m b r e d a d o
}
{Parmetros v a r i a b l e s : P o s i c i o n :0, si el n o m b r e no se e n c u e n t r a
{Parmetros v a l o r

P, ndice del r e g i s t r o b u s c a d o
: Lista - a r r a y de r e g i s t r o s de e m p l e a d o s
T
- nombre a buscar
C u e n t a - numero de r e g i s t r o s de a r r a y

{
var
I
Encontrado
begin
Encontrado
Posicion
I
repeat
if L i s t a
then

}
}

La b s q u e d a binaria p u e d e utilizarse slo c u a n d o el c o n t e n i d o del vector (array) est


o r d e n a d o . O t r a tcnica p a r a a l m a c e n a r d a t o s en u n array, de m o d o q u e p u e d a ser
r e c u p e r a d o de un m o d o eficiente, se d e n o m i n a conversin de claves (hashing).
Si los c a m p o s claves n m e r o s de c d i g o s o n enteros d e n t r o de u n rango pequeo, por e j e m p l o de 1 a 50, la b s q u e d a ser u n a tarea trivial: se d e f i n e un array de
registros en el que la clave es el ndice del array.
corresponde
corresponde

[I].Nombre = T

1 1 1 1 1 1 1 1
:= I;
:= true

(I > C u e n t a )

Bsqueda binaria

procedure B u s q u e d a B i n a r i a

a
a

Registro 1
Registro 2

S u p o n g a m o s a h o r a q u e el c a m p o clave es el n m e r o de la Seguridad Social de u n


e m p l e a d o , el n m e r o de expediente de u n e s t u d i a n t e o el n m e r o del D o c u m e n t o N a cional de Identidad (DNI), y q u e este n m e r o tiene, p o r e j e m p l o , o c h o cifras. El rango
p u e d e ser:

:= false;
:= 0;
: = 1;

until E n c o n t r a d o or
end;

BUSQUEDA POR CONVERSION DE CLAVES (HASHING)

clave 1
clave 2

: integer;
: boolean;

begin
Posicion
Encontrado
end;
I := I + 1

14.8.2.

}
}

547

(Lista : L i s t a E m p l e a d o s ; T: Cadl;
Cuenta: integer; var P o s i c i o n : integer);

9 9 9 9 9 9 9 9

Esto significa q u e n o p u e d e existir u n a c o r r e s p o n d e n c i a clave-direccin ( n m e r o de


registro) ya q u e el espacio necesario a reservar sera m u y grande, y si luego el array de
registros slo tiene 50 elementos, el espacio m a l g a s t a d o sera e n o r m e . El m t o d o ideal es
disear un array de 50 elementos, de m o d o q u e cada clave g r a n d e ( n m e r o D N I , Segurid a d Social, expediente, etc.) se c o n v i e r t a en u n ndice p e q u e o en el rango 1 a 50.
Este m t o d o se c o n o c e c o m o hashing (dispersin) o conversin de claves y consiste en
convertir u n a clave en u n ndice de tabla de ndices o d e b s q u e d a vlida d o n d e se
a l m a c e n a n los diferentes registros del array.
Se necesita u n a funcin de conversin o funcin hash\ q u e convierta la clave en el
ndice del array de elementos.
La Figura 14.6 representa la f u n c i n de conversin.

var
Primero, Ultimo, Central
begin
Posicion := 0;
Primero
:= 1;
Ultimo
:= Cuenta;
repeat

: integer;

14.9.1.
*

Central := (Primero + Ultimo ) div 2;


if T < Lista [Central].Nombre
then
Ultimo := Central - 1
el se
if T > Lista [Central].NOmbre
then
Primero := Central + 1
until (T = Lista [Central].Nombre) or
if T = Lista [Central].Nombre
then Posicion := Central
end;

Funcin de conversin

C o n s i d e r e m o s el e j e m p l o del registro de stock declarado a n t e r i o r m e n t e , cuyos n m e r o s


de cdigo tienen o c h o dgitos, y se desea hacer u n a c o r r e s p o n d e n c i a c o n una tabla de
1.000 posibles artculos. En el caso ideal se s u p o n e q u e no hay cdigos duplicados; c o m o
la correspondencia u n o a u n o es imposible, se necesita u n a f u n c i n de conversin.

Indice de tabla
Clave de registro
>

Funcin de conversin "hash"

75064059
(Primero > Ultimo);

Figura 1 4 . 6 . Funcin de conversin.

[1]

2145123

[2]

1101174

[3]

75064059

[4]

14132106

[5]

2671854

[6]

45100012

548

Registros

Programacin en Turbo/Borland Pascal 7

U n a b u e n a funcin de conversin (hash) t o m a c o m o e n t r a d a u n a clave (cdigo del


artculo) y la convierte en el ndice la tabla de conversin. Esta tabla p u e d e ser representada c o m o un array de t a m a o n (ndices de 0 a n-\), siendo n el n m e r o de registros del
array (lgicamente de valor m s p e q u e o q u e el valor de la clave). Si H es la f u n c i n de
conversin y K es u n a de las claves ( n m e r o s de cdigo), e n t o n c e s el ndice calculado
(HCK) se l l a m a la conversin de la clave K.

549

Ejemplos
N m e r o de cdigo (clave, k) 12347296 a p l i c a n d o la f u n c i n de conversin para
ndices de O a 9 9 9 9 < 10000 elementos:
12347296 mod 10000 = 1234

Si se desea q u e el rango sea de 1 a 10000, utilizar la f u n c i n


(k mod 10000) + 1

K ( k ) -+ n d i c e

N m e r o de cdigo 12340000
G r f i c a m e n t e este proceso se representa en la F i g u r a 14.7.
U n a b u e n a f u n c i n de conversin distribuye o dispersa las claves u n i f o r m e m e n t e a lo
largo de t o d a la tabla de conversin. Existen diferentes f u n c i o n e s de conversin q u e se
han m o s t r a d o significativamente importantes; c o n s i d e r a r e m o s a q u u n a de ellas.
Funcin Mdulo

o Divisin entera

1. H(k( = k div M
2. H(k) = k mod M

M es el tamao de la tabla, de
ndices 0 a m - 1

Nombre

Cantidad

14.9.2.

Precio

Resolucin de colisiones

D a d o q u e las colisiones son inevitables, ser preciso elegir f u n c i o n e s de conversin idneas q u e r e d u z c a n al m x i m o posible dichas colisiones. Existen dos mtodos: direccionamiento cerrado y direccionamiento
abierto. S u p o n g a m o s dos claves q u e p r o p o r c i o n a n la
m i s m a posicin: H(kl) =H(k2) = 12.

[1]

7564059

Se observa q u e con este m t o d o , dos claves diferentes p r o d u c e n el m i s m o ndice


(1234). Este f e n m e n o se c o n o c e c o m o colisiones y es preciso evitarlo. En este caso se
debe redefinir u n a n u e v a f u n c i n de conversin q u e e l i m i n e las colisiones. En la prctica, las colisiones son inevitables; sin e m b a r g o , es necesario buscar u n a f u n c i n hash q u e
garantice el m e n o r n m e r o de colisiones.
La f u n c i n Random d e T u r b o Pascal facilita la o b t e n c i n de claves h o m o g n eas , m e d i a n t e la f u n c i n
(Random (N) mod 100) + 1

Esta f u n c i n es especialmente efectiva c u a n d o m es u n n m e r o p r i m o .


Cdigo

12340000 mod 10000 = 1234

[2]

PI

Funcin
de
conversin

75064059

[m-

T ornillo

25

432

2}

[ m - 1]

Figura 1 4 . 7 . Diagrama de una funcin

a)
de conversin.

Figura 1 4 . 8 .

b)
Direccionamiento. a) Cerrado, b) Abierto.

550

Programacin

en Turbo/Borland

Pascal 7

U n m t o d o fcil de implementar
el siguiente algoritmo 1:

Registros

es el d i r e c c i o n a m i e n t o cerrado, que se resuelve con

D a d a la clave k y el array de registros A.


1. Calcular el ndice H (ir) = i.
2. Si el ndice o posicin n o est o c u p a d o (no contiene u n registro), e n t o n c e s se alm a c e n a el registro en la posicin A[H(/0] = A[ /] y se t e r m i n a el algoritmo.
3. Si A[ ] ya est o c u p a d a (contiene u n registro), se c o m p r u e b a A[7 + 1], y si est vaco se a l m a c e n a en esa posicin: si no, se c o m p r u e b a A[ + 2], etc., hasta q u e se
e n c u e n t r a u n a posicin libre; si se llega a la posicin final (por ejemplo, 100) sin
e n c o n t r a r espacio libre, se salta a la p r i m e r a posicin (1) y se sigue la c o m p r o b a cin.
Este a l g o r i t m o requiere q u e el array sea inicializado de m o d o que el p r o g r a m a p u e d a
c o m p r o b a r si u n a posicin del array a c o n t i e n e ya u n registro. Por ejemplo, si la clave es
siempre un e n t e r o positivo, entonces el c a m p o clave de cada e l e m e n t o del array p u e d e
inicializarse a cero. D e m o d o que si tiene u n valor de 0 el p r o g r a m a sabe q u e n o c o n t i e n e
u n registro. O t r o sistema p u e d e ser t e n e r u n a variable lgica OCUPADO c o m o u n n u e v o
c a m p o m s del registro, de m o d o q u e c u a n d o est libre t o m e u n valor, por e j e m p l o falso
false,
y c u a n d o est o c u p a d o u n valor v e r d a d e r o t r u e (es decir, el valor de
OCUPADO c o n m u t a a v e r d a d e r o c u a n d o se inserte u n e l e m e n t o en la posicin).
Modelo

1
p r o c e d u r e Inicializar
var
i : l..MaxTabla
begin

(var A

: Lista);

{ declaraciones }
const
M a x T a b l a = 100;
type
Item
= record
Codigo
Precio
Nombre
end;
Lista = a r r a y

: integer;
: real;
: char

[1..MaxTabla]

of

Item;

p r o c e d u r e V e r R e g i s t r o (R : Item);
{ Este p r o c e d i m i e n t o visualiza un r e g i s t r o
begin
WriteLn
WriteLn
WriteLn
WriteLn
end;

('El r e g i s t r o c o n t i e n e :');
('Codigo de archivo :
R.Codigo);
('Precio : ', R . P r e c i o :8:2);
('Nombre :
R.Nombre)

p r o c e d u r e I n i c i a l i z a r (var A: L i s t a ) ;
{ fijar el c a m p o Codigo de c a d a e l e m e n t o del array igual a O,
para indicar que ningn registro tiene a l m a c e n a d o algo }
var
I : 1..MaxTabla;
begin
for I := 1 to M a x T a b l a do
A [ I ] . C o d i g o := 0

for i := 1 t o M a x T a b l a do
A [ i ] . N u m e r o := 0

end;

end;

Modelo

551

{ inicializar

function H a s h (K: integer) : integer;


{ d e v u e l v e un e n t e r o en el rango 1 . . M a x T a b l a
begin

p r o c e d u r e Inicializar (var A : L i s t a ) ;
v a r i : integer;
begin
for I := 0 t o M a x T a b l a - 1 do

Hash
end;

A[i].Numero-Ocupado
A [ i ] . N u m e r o := 0
end;

procedure Insertar

:= false;

:=

( K mod MaxTabla

(var A

) + 1

: Lista; R

: Item);

{Inserta el r e g i s t r o R en
el a r r a y A. P r e c o n d i c i o n : a ha sido
i n i c i a l i z a d o en el p r o c e d i m i e n t o I n i c i a l i z a r , y d e s p u e s es
modificado por este procedimiento}
var

En r e s u m e n , los pasos p a r a la resolucin de colisiones son:


1. Inicializar el array.
2. Calcular la funcin de conversin para la clave.
3. Situar la nueva clave en la tabla sin posicin libre, si no ir a la siguiente
repetir el proceso.

I, C u e n t a
begin
I := H a s h

posicin

: 1..MaxTabla;
(R.Codigo);

{consulta de la p r i m e r a p o s i c i o n d i s p o n i b l e , c o m e n z a n d o en I)}
C u e n t a := 1;

552

Programacin

en Turbo/Borland

Registros

Pascal 7

w h i l e (A[I].Codigo o
0) and
(cuenta < M a x t a b l a ) do

(A[i].Codigo <> R . C o d i g o ) and

{posicion ocupada, clave no encontrada,


verificado}
begin
I
:= I mod M a x T a b l a + 1;
Cuenta := Cuenta + 1
end;
if A[I].Codigo = R . C o d i g o
then
WriteLn ('existe una entrada', R . C o d i g o )
else

a r r a y no

type
Cadl
Cad2
Empleado

string
string
record

R e g i s t r o de empleado
Campos
Significado
Nombre =
Nombre
NumSS
=
Numero de 1 a S e g u r i d a d S o c i a l
Salario =
Salario

[30]
[12]

Nombre : Cadl;
NumSS
: Cad2 ;
Salario: real
end;
L i s t a E m p l e a d o s = array [l..Max]
of

if A [ I ] , C o d i g o = 0
then
A[I] ;= r
else
WriteLn

const
Max = 100;

var
Lista

553

Empleado;

: ListaEmpleados;

('array lleno')

end;

14.10.1.
procedure E n c o n t r a r (var
{Busqueda de la c l a v e }
var

: Lista, C l a v e

{
{
{
{
{

I, Cuenta : 1..MaxTabla;
begin
I := Hash (clave)
Cuenta := 1;
w h i l e (A[I]Codigo o
Clave) and
and (Cuenta < M a x T a b l a )

(A[I.Codigo o

0)

begin
{ir a la siguiente p o s i c i o n }
I
:= (I mod M a x T a b l a ) + 1;
Cuenta := C u e n t a + 1
end;

14.10.

WriteLn ('el registro no esta en el a r r a y ' )


{Encontrar}

E n el C a p t u l o 13 se h a n e s t u d i a d o u n a s e r i e d e m t o d o s d e o r d e n a c i n r e l a t i v o s a c o n j u n t o s de d a t o s (arrays) de tipos simples: enteros, char, string, etc. Estos m t o d o s s o n


d e registros. C o m o ya se h a r e a l i z a d o

u n anlisis e n p r o f u n d i d a d d e los m i s m o s , d e c r i b i r e m o s e n esta s e c c i n d i f e r e n t e s p r o cedimientos de ordenacin, j u n t o con algunos problemas completos especficos.
C o n s i d e r e m o s e n l o s d i f e r e n t e s p r o c e d i m i e n t o s , p o r e j e m p l o , u n array

: n u m e r o de registros del array

repeat
O r d e n a d o := true;
for J := 1 t o N if L [J. .Nombre
then

ORDENACION DE UN ARRAY DE REGISTROS

a p l i c a b l e s d e i g u a l m o d o a l a o r d e n a c i n d e arrays

B u r b u j a M e j o r a d o . P r o c e d i m i e n t o para ordenar un array de


r e g i s t r o s en orden ascendente por Nombre
p a r m e t r o s variables
L : array de registros de e m p l e a d o s
p a r m e t r o s valor

p r o c e d u r e BurbujaMejorado
var
I, J
integer;
Aux
: Empleado;
Ordenado : boolean;
begin
I := 1;

if A[I].Codigo = Clave then


VerRegistro (A[I])
else
end

Ordenacin por burbuja mejorado

: integer);

de registros de

1 0 0 e m p l e a d o s . E n el p r o g r a m a p r i n c i p a l e x i s t i r n l a s s i g u i e n t e s d e c l a r a c i o n e s :

(var L: L i s t a E m p l e a d o s ; N: integer);

do
L[J + 1].Nombre

begin
Aux
Lista [J]
Lista [J + 1]
Ordenado

=
=
=
=

Lista
Lista
Aux;
false

end;
{ if }
I := I + 1
u n t i l O r d e n a d o or (I > N - 1)
end;
{ BurbujaMejorado }

[J],
[J - l]i

554

Registros

Programacin en Turbo/Borland Pascal 7

14.10.2.

Ordenacin por seleccin

program Ordenacin;
const
Max = 100;
type
Estudiante = record
Nombre
: string [30];
Edad
: integer;
Estudios : string [15]
end;
ListaEstu = array [l..Max] of Estudiante;
var
Lista : ListaEstu;
K
: integer;

procedure Seleccin (var L: ListaEmpleados; N: integer);


var
I,J : integer;
Aux : Empleado;
begin
for X := 1 to N - 1 do
for J := I + 1 to N do
if L [I].Nombre > L[J].Nombre
then
begin
Aux
:= Lista [I];
Lista [I] := Lista [J];
Lista [J] := Aux;
end
{ if y for }
end;
{ Seleccin }

14.10.3.

procedure Ordenar (var L:ListaEstu);


var
I,J : integer;
Aux : Estudiante;
begin
for I := 1 to Max - 1 do
for J := I + 1 to Max do
if L [I].Nombre > L[J].Nombre
then
begin
Aux
:= L[I];
Lista [I] := Lista [J];
Lista [J] := Aux
end
end;
{ ordenar }

Ordenacin por insercin

procedure Insercin (var L: ListaEmpleados; N: integer);


var
I,J
: integer;
Aux
: Empleado;
Encontrado : boolean;
begin
for J := 2 to N do
begin
Aux
:= Lista [J];
I
:= J - 1;
Encontrado := false;
while (I >= 1) and not Encontrado do
if Aux.Nombre < L[I].Nombre
then
begin
Lista [I + 1] := Lista [I];
I
:= I -1
end
else
Encontrado := true;
L [I + 1] := Aux
end
{ for }
end;
{ insercin }

14.10.4.

begin
{ programa principal }
WriteLn ('introduzca ',Max : 1,' nombres , edades y estudios')
for K := 1 to Max do
begin
ReadLn (Lista [K].Nombre);
ReadLn (Lista [K].Edad);
ReadLn (Lista [K].Estudios)
end;
Ordenar (Lista);
{ llamada al procedimiento Ordenar }
WriteLn ('Los estudiantes ordenados alfabticamente son ');
WriteLn;
for K := 1 to Max do
with Lista [K] do
WriteLn ( Nombre:30, Edad: 8, Estudios : 15)

Aplicacin completa

Clasificar un array de registros de estudiantes (campos: nombre,


orden alfabtico creciente, mediante u n programa completo.

edad, estudios),

555

por

556

14.11.

Programacin en Turbo/Borland Pascal 7

PUESTA A PUNTO DE PROGRAMAS

Tcnicas de programacin
La lista de c a m p o s en u n a definicin registro se t e r m i n a con la p a l a b r a reservada
END.
Los identificadores de c a m p o en un registro deben ser todos nicos. Registros diferentes pueden reutilizar los m i s m o s identificadores.
U n identificador de c a m p o se utiliza p a r a acceder a los c o m p o n e n t e s de u n registro.
U n p u n t o separa la variable registro y el identificador de c a m p o :

Registros

RESUMEN
Declaracin registro
type

estudi ante [1].nombre

U n registro completo puede ser asignado a otro registro c o n tipos idnticos.


Los registros p u e d e n estar anidados.
La sentencia WITH debe especificar u n a variable registro.
Los c o m p o n e n t e s y los registros c o m p l e t o s se p u e d e n pasar c o m o p a r m e t r o s a u n
p r o c e d i m i e n t o funcin. En el p r i m e r caso el tipo p a r m e t r o f o r m a l d e b e ser u n c o m p o n e n t e tipo del registro; en el segundo caso debe ser el tipo registro.
Los arrays paralelos y de registros son estructuras de datos q u e sirven a la m i s m a f u n cin.
U n a variable c o m p o n e n t e de u n a variable registro se p u e d e utilizar en c u a l q u i e r lugar
d o n d e p u e d a utilizarse una variable simple.
El m b i t o de cada identificador de c a m p o es el registro en q u e aparece.
U n a variable registro sin un identificador de c a m p o se p u e d e utilizar en u n a sentencia
de asignacin tal c o m o Item: = tem2. (El valor del registro se p u e d e copiar en otro
registro del m i s m o tipo.)
C a d a c o m p o n e n t e de un registro o u n registro completo se p u e d e p a s a r c o m o u n
p a r m e t r o a un procedimiento o f u n c i n . En el p r i m e r caso el t i p o de p a r m e t r o
formal debe ser un tipo c o m p o n e n t e del registro; en el segundo caso d e b e ser el tipo
registro.
El valor de u n a funcin no p u e d e ser u n registro.
Los arrays paralelos y de registros son estructuras de datos que sirven a la m i s m a
funcin. La eleccin ms a d e c u a d a d e p e n d e r de los detalles de la aplicacin.

Errores t p i c o s d e p r o g r a m a c i n
1. El error m s c o m n suele ser especificar i n c o r r e c t a m e n t e el c a m p o del registro a m a nipular.
2. La lectura o escritura de registros en el terminal se debe realizar c a m p o a c a m p o separadamente.
3. La parte variante de un registro debe aparecer despus de la parte fija, y n o es as.
4. C u a n d o se leen o escriben registros en el terminal, se debe procesar cada c a m p o
separadamente, y no se hace as.
5. Si u n n o m b r e de variable registro se lista en u n a sentencia with, slo se r e q u i e r e el
n o m b r e del c a m p o para referenciar los c a m p o s de ese registro d e n t r o d e la s e n t e n c i a
with.

Empleado = record
Nombre : array [1..20] of char;
Edad
: 1..100;
Altura : real;
Peso
: real
end;
Complejo = record
X : real;
Y : real
end;

Declaracin de variable registro


var
Apellidos : Empleado;

Variable componente de una variable registro


Apellidos.Edad

Registro variante
type Clase = (Rectngulo, Circulo, Triangulo);
Figura = record
cuenta
: integer
case forma : clase of
Rectngulo := (Altura, radio : real);
Circulo
:= (Radio, real);
Triangulo := (Ladol, Lado2, Lado3);
end;

Sentencia with
whith x do
begin
F1 := 5;
F2 := 'A'
end;

with InfoReg.Direccin do
begin
WriteLn (Nombre);
WriteLn (DireccionCalle) ;
WriteLn (Ciudad);
WriteLn ('Edad
Edad)
end;

557

558

Registros

Programacin en Turbo/Borland Pascal 7

559

EJERCICIOS
1. Escribir una declaracin de tipo registro que almacene la siguiente informacin sobre un disco
de audio: ttulo, autor, ao de publicacin y duracin (en segundos).
2. Escribir una declaracin de tipo registro que almacene la siguiente informacin sobre un
automvil: marca, modelo, ao, color, n m e r o de puertas, n m e r o de cilindros, precio de
compra, potencia en caballos (CV).
3. Escribir la declaracin de un registro cuya estructura es

6. Un programa incluye
type
Descripcin = string r 2 0 ]
Pelicula
= record
Titulo, Distribuidor : Descripcin;
NumCopias
: 0..100;
Preci
: real
end;
Calle

Ciudad

Provincia

Comunidad

Epica, Cartoon
: Pelicula;
Novelas, Biografia : Libro;
I, NumCaracteres
: integer;

4. El registro anterior se desea modificar aadindole la informacin adicional siguiente:


o) Si el empleado est casado, se desea conocer el n o m b r e de la esposa y el n m e r o de
hijos.
b) Si el empleado est divorciado, se desea conocer fecha de divorcio.
c) Para todos los empleados solteros se desea conocer si viven solos.
el) Si el empleado tiene estudios superiores, se desea conocer carrera cursada y universidad
que imparti el ttulo.

5. Cada uno de los siguientes dibujos describe un registro. Por cada uno de ellos, escribir una
declaracin para el registro, j u n t o con los tipos de datos apropiados para los valores sealados.
Cuntos datos se pueden almacenar en cada registro?
P[1..10]

Indicar si la ejecucin de las siguientes sentencias es vlida. En caso negativo, razone la


respuesta.
a)
b)
c)

Epica.NumCopias := 80;
Read (Biografia);
for I := 1 to NumCaracteres do
Read (Distribuidos [X]) ;
d)
Read (Novelas.Editor);
Biografia.Titulo := Cartoon.Titulo;
c) with Cartoon do
/')
WriteLn (Coste);
g) with Biografia, Epica do
Write (Precio);

7. Escribir un procedimiento que lea informacin sobre un registro y luego la visualice.


8. Escribir un procedimiento que visualice la informacin de los registros dados en los problemas 1 y 2.
b)

560

Programacin en Turbo/Borland Pascal 7

Registros

9. Mostrar los resultados de ejecutar el siguiente segmento de programa.


type
regA = record
b : real;
c : record
d : integer;
e : integer
end;
f : array [1..4] of integer
end;
var
a : regA;
f : integer;

begin
{programa principal}
with estudiante do
begin
nombre
:= 'Joe Cocker';
ndice
:= 3.25;
mayor
:= 'tenis'
end;
sub (estudiante);
WriteLn;
with estudiante do
WriteLn (nombre, ' ', ndice,
end

561

', mayor)

11. Escribir un programa q u e introduzca y visualice los datos de un registro declarado c o m o

a.c.d. := 10;
a.c.e. := 20;

sigue:

a) a. f[3] = a.c.d;
a.f[a.c.e]
:= a.c.e;
a.f[a.c.d] := a.c.d. + a.c.e;
WriteLn (a.b, ' ', a.f[l], ' ', a.f[3]
b) for j : = 1 to 4 do
a.f[j] := a.c.d + a.c.e;
WriteLn (a.c.d, '
a.c.e, ' ', a.f[l], ' ', a.f[2],' ',
a.f[3].
a.c.d := 40;
a.c.e := 40;
a.f[1] := a.c.d;
a.f[2] := a.c.e;
WriteLn (a.c.d,1 ', a.c.e,' ', a.f[l], '
a.f[2],' ', a.f[3]

10. Qu se imprime al ejecutar el siguiente programa?


program Reg 1;
type estudio = record
nombre : string [20];
ndice : real;
mayor : string [10]
end;
var
estudiante : estudio;
procedure sub (var s: estudio);
var aux : string [5];
begin
writeln (s.nombre, ' ', s.ndice,
s. ndice := s.ndice + 0.75;
aux := 1 Sr. 1 ;
s.nombre := concat (aux, s.nombre)
end;

s.mayor)

const
Longitud = 20
type
Cadena = string [Longitud];
Deporte = record
baloncesto,
ftbol,
atletismo : Cadena
Plazas : integer
end;
var
Competicin : Deporte;

12. Identificar y corregir los errores del siguiente programa:


program Informe
type
Cadenal5 = string [15];
Tarifa
= record
Nombre : Cadena 15;
Fecha
: Cadena 15;
Horas
: Real
end;
var
operador : Tarifa;
begin
with Tarifa do
begin
'Hotel Villarosa'
Nombre
'Junio 5, 1989');
Fecha
Horas
:= 30.5
end
WriteLn (Operador)
end
{Informe}

562

Registros

Programacin en Turbo/Borland Pascal 7

PROBLEMAS
1. Leer dos puntos, Pt y P2 representados c o m o registros, calcular la longitud del segmento que
los une y la pendiente de la recta q u e pasa por dichos puntos.
p

i U

v,)

P2 (x2, y2)
2

Longitud

= 7 (x2-xt)

Pendiente

y y
X

2~X\

+ (y,-,v1)2

2. Escribir un programa que acepte la hora del da en formato militar (0845) y encuentre la
representacin usual en horas y m i n u t o s y A M / P M (8: 45 AM) o acepte el formato usual y
encuentre la correspondiente representacin militar:
0100
3:45 PM

se representa por
se representa por

1:00AM
1545

Tringulo

S = f p i p - a) (p-b)

{p - c)

p =

a + b + c

Rectngulo S = Longitud * A n c h u r a
Cuadrado

S = I2

Crculo

S=kR2

(TC = 3.141592)

4. U n nmero complejo tiene la f o r m a a + bi, d o n d e a y b son n m e r o s reales e /- = -1. Las


operaciones bsicas con n m e r o s complejos son:
Suma

: (a + bi) -(c+

Resta

: (a + bi) - (c + di) = (a-c)

Inicializar a cero el n m e r o complejo {a,b) = (0,0).


Leer n m e r o s complejos.
Escribir n m e r o s complejos.
S u m a r nmeros complejos {a, bi) + (c, di) = {a + b), {c + d)i.
Restar nmeros complejos {a, bi) - (c, di) = {a- b), {c - d)i.
Multiplicar complejos {a + bi) * {c + di) = {ac - bd), {ad + bc)i.
Parte real de un complejo, a.
Parte imaginaria de un complejo, bi.
Conjugado de un complejo a - bi.
Valor absoluto de un complejo.
|a + bi\ = yj{a + bi) {a - bi) = ^|a2~+~b2

+ {b- d)i

+ bi
ac+ bd
be - ad
,
,
,
= - +
donde c2cP o
c + di
c2 + d2
c2 + d2

1 {i, el n m e r o imaginario: >/- 1).

7. U n array de registros contiene la descripcin de personas a efectos estadsticos. Cada registro


tiene los campos: nombre, edad, sexo, altura, color de piel, color de ojos, nacionalidad y
regin. Escribir un programa que lea y almacene datos en este array, ordene el array por orden
alfabtico de nombres y visualice o i m p r i m a su contenido.
8. El inventario de un almacn de artculos deportivos se desea guardar en un array de registros
Artculos con los campos: nombre, n m e r o de cdigo (seis dgitos), n m e r o de artculos y
precio. Escribir un procedimiento que lea y almacene el archivo de datos del inventario en un
array de registros adecuados. El programa principal debe contemplar las siguientes opciones,
que sern realizadas tambin con procedimientos." impresin de todo el inventario, bsqueda
de un artculo por n m e r o de cdigo, actualizacin semanal (altas y bajas de artculos), ordenacin alfabtica por n o m b r e y ordenacin decreciente por n m e r o de artculo.
9. Se desea crear un array de registros con los datos de los estudiantes en un d e t e r m i n a d o colegio.
Los campos de los registros son: nombre, cdigo, sexo, edad, curso, notas de las asignaturas
del curso anterior. A continuacin, escribir un programa que lea y escriba este array, as c o m o
las opciones: ordenar por orden alfabtico de nombres, calcular la media de cada a l u m n o y
visualizar la lista de a l u m n o s por curso ordenados alfabticamente por n o m b r e .
10. U n mdico almacena la siguiente informacin de sus pacientes: nombre, direccin, telfono,
fecha ltima visita, si es o no privado (no tiene seguridad social), si tiene alergias, y un c a m p o
de observaciones. Se desea un programa con las siguientes opciones:

di) = {a + c) + (b+ d)i

Producto : (a + bi) * (c + di) = {ac - bd) + (ad + bc)i


rv Divisin :

6. Se declara un dato tipo registro Complejo d o s c a m p o s que representa a los n m e r o s


complejos (a, bi) que tienen u n a parte real (a) y u n a parte imaginaria {bi). Se desea disear
una serie de procedimientos que realicen las siguientes tareas:

Nota: Recuerde que i /=;-=-

3. Escribir una declaracin de un registro que tenga una parte variante para cuatro figuras
geomtricas: tringulo, rectngulo, cuadrado y crculo. Para el tringulo se deben almacenar
las longitudes de sus tres lados; para el rectngulo, la longitud y la anchura, para el cuadrado
su lado y para el crculo su radio. A continuacin, escribir un programa que lea una de las
letras T (Tringulo), R (Rectngulo), C (Cuadrado), X (Crculo), y los valores correspondientes, y calcule sus superficies.

563

Escribir un programa que lea dos n m e r o s complejos y el smbolo correspondiente a la operacin y ejecute la operacin indicada. Utilizar un registro para representar n m e r o s complejos
y procedimientos para realizar las operaciones.
5. Se dispone de un tipo de dato registro Tiempo que consta de tres campos: Horas, M i n u t o s y
Segundos. Se desea disear un procedimiento que reciba c o m o entrada la hora inicial desde el
comienzo de un experimento y el tiempo transcurrido en segundos y que devuelva c o m o
salida la hora actual. Se debe suponer un reloj de 24 horas.

a)
b)
c)
d)
e)
/)

Introduccin de registros interactivamente.


I m p r i m i r en pantalla toda la informacin del paciente.
D a d o un n o m b r e de un paciente, encontrar la fecha de la ltima visita.
Listar todos los pacientes con alergias.
Listar alfabticamente todos los pacientes privados.
I m p r i m i r todo el listado completo de pacientes.

11. Nos p r o p o n e m o s m a n e j a r los elementos del Sistema Peridico. Para ello el usuario del programa introduce datos referidos a n elementos del Sistema Peridico, stos son ordenados respecto al c a m p o del peso atmico y se listan por pantalla.
Los datos a pedir por cada elemento son: n o m b r e , smbolo, peso atmico, n m e r o atmico, estado (slido, lquido, gaseoso y plasma). D e p e n d i e n d o del estado, si es slido: densidad y temperatura de fusin. Si es lquido: viscosidad. Si es gas: peso molecular.

Archivos

15.1.

CAPITULO

ARCHIVOS
CONTENIDO
15.1.
15.2.
15.3.
15.4.
15.5.
15.6.
15.7.
15.8.
15.9.
15.10.
15.11.
15.12.
15.13.
15.14.
15.15.
15.16.
15.17.
15.18.
15.19.
15.20.

Introduccin a los archivos


Los archivos en Turbo Pascal
Los archivos de texto (secuenciales)
Tratamiento de archivos de texto
Redirecciones de las entradas/salidas estndar
Los archivos de acceso aleatorio (con tipos)
Tratamiento de archivos de acceso aleatorio
Mantenimiento de archivos aleatorios
Deteccin de errores de Entrada/Salida (E/S)
Errores de E/S bajo M S - D O S
Tratamiento completo de archivos aleatorios
Archivos sin tipos
Borrar y renombrar archivos
Dispositivos en Turbo Pascal
Escritura en impresora
Archivos de texto asociados a unidades lgicas
Los archivos como parmetros de procedimientos
Ordenacin de archivos
Mezcla de archivos
Puesta a punto de programas

RESUMEN
EJERCICIOS
PROBLEMAS
Las estructuras de datos tratadas hasta ahora, conjuntos, arrays y
registros, se denominan internas (se almacenan en memoria central).
Sin embargo, en numerosas ocasiones es preciso conservar los datos de modo permanente en soportes magnticos: disquetes o discos duros (rgidos), de modo que puedan existir, mientras se crean o
manipulan programas u otros conjuntos de datos. Los archivos (ficheros) es la nica estructura de datos que se almacena en memoria
secundaria o externa (disco o cinta). Un archivo de datos es una
estructura constituida simplemente por colecciones de datos que se
pueden guardar (grabar) para uso posterior mediante la ejecucin de
programas adecuados. Los archivos permiten almacenar grandes
cantidades de datos. En este captulo aprender el concepto y
cmo y dnde utilizar esta estructura de datos en la resolucin de
problemas.

564

565

INTRODUCCION A LOS ARCHIVOS

U n archivo o fichero (file) es u n a coleccin de i n f o r m a c i n (datos relacionados entre s)


localizada o a l m a c e n a d a c o m o u n a u n i d a d en alguna parte de la c o m p u t a d o r a . Esta
coleccin de datos sirve p a r a e n t r a d a y salida a la c o m p u t a d o r a y se m a n e j a n con un
p r o g r a m a . En contraste con arrays y registros, el t a m a o de esta coleccin no es fijo, y
est limitado slo p o r la c a n t i d a d de m e m o r i a secundaria (disco o cinta) disponible. Es
decir, los archivos son d i n m i c o s ; en un registro se d e b e n especificar los campos, el
n m e r o de e l e m e n t o s en u n array y el n m e r o de caracteres en u n a cadena, y son:
estructuras estticas; en los archivos n o se requieren t a m a o s p r e d e t e r m i n a d o s . Eso
significa q u e se p u e d e n hacer archivos de datos m s grandes o m s p e q u e o s , segn se
necesiten.
Los archivos n o estn limitados p o r la m e m o r i a de su c o m p u t a d o r a , d o n d e estn
c o n t e n i d a s las estructuras d e datos. En teora, si d i s p o n e de u n a u n i d a d de disco de
20-Megabytes, p o d r a alojar u n archivo de datos, p r c t i c a m e n t e , de igual t a m a o , incluso con m e m o r i a de 128 Kilobytes (Kb) o los 640 K b tpicos d e las c o m p u t a d o r a s personales actuales. M e d i a n t e p r o g r a m a s a d e c u a d o s se p u e d e n m a n i p u l a r los archivos de
texto.
C a d a archivo es referenciado p o r u n identificador (su nombre).

15.1.1.

Tipos de archivos

Los e l e me nt os d e u n archivo p u e d e n ser de cualquier tipo, simple o estructurado, excepto un tipo archivo (file) o cualquier tipo e s t r u c t u r a d o c o n u n c o m p o n e n t e tipo archivo.
Los principales tipos de archivos son:
1. Archivo de entrada: u n a coleccin de d a t o s localizados en u n dispositivo de entrada.
2. Archivo de salida: u n a coleccin de i n f o r m a c i n visualizada p o r la c o m p u t a d o r a .
3. Archivo de programa: un p r o g r a m a codificado en u n l e n g u a j e especfico y localizado o a l m a c e n a d o en u n dispositivo de a l m a c e n a m i e n t o .
4. Archivo de texto: u n a coleccin d e caracteres a l m a c e n a d o s c o m o u n a u n i d a d en
un dispositivo de a l m a c e n a m i e n t o .

15.1.2.

Tipos de acceso a un archivo

Existen dos m o d a l i d a d e s p a r a acceder a u n archivo de datos: acceso secuencial y acceso


directo o aleatorio. El acceso secuencial exige el t r a t a m i e n t o e l e m e n t o a elemento, es
necesario u n a exploracin secuencial c o m e n z a n d o desde el p r i m e r e l e m e n t o . El acceso
directo p e r m i t e procesar o acceder a u n e l e m e n t o d e t e r m i n a d o referencia d i r e c t a m e n t e
p o r su posicin en el s o p o r t e d e a l m a c e n a m i e n t o . Pascal e s t n d a r slo a d m i t e el acceso
secuencial, pero T u r b o Pascal a d m i t e el acceso directo.

566

Programacin en Turbo/Borland

Archivos

Pascal 7

En D O S existen diferentes tipos de archivos q u e se c o n o c e n por su extensin: archivos binarios (.EXE y .COM), archivos por lotes o lbatch" (.BAT), archivos de configuracin
del sistema (.SYS), etc. Al igual q u e e n el sistema operativo, T u r b o p u e d e crear diferentes
clases de archivos: archivos de texto creados c o n el editor (extensin . PAS) y q u e p u e d e n
ser utilizados p o r p r o g r a m a s de t r a t a m i e n t o de texto. A r c h i v o s b i n a r i o s (.COM y .CMD)
creados en el proceso de c o m p i l a c i n . La extensin .COM i n d i c a a D O S q u e es un archivo
p r o g r a m a q u e se p u e d e ejecutar d i r e c t a m e n t e desde el i n d i c a d o r (prompt) del D O S ; as
el p r o g r a m a T u r b o Pascal se d e n o m i n a Turbo.COM. Los archivos f u e n t e T u r b o Pascal gen e r a l m e n t e t i e n e n la extensin .PAS; p o r ejemplo, Programl.PAS.

puntero

a)

Archivos
a c c e s o directo
ndice (posicin)

Figura 1 5 . 1 .

A c c e s o a un archivo: a) s e c u e n c i a l , b) directo.

T o d o s los archivos de T u r b o Pascal, con i n d e p e n d e n c i a de su tipo, c o m p a r t e n caractersticas c o m u n e s . En p r i m e r lugar, todos los archivos se utilizan bien para e n t r a d a , bien
para salida. Entrada se p r o d u c e c u a n d o u n p r o g r a m a t o m a d a t o s de u n archivo y los
utiliza en el p r o g r a m a ; Salida a l m a c e n a los resultados de u n p r o g r a m a en u n archivo o
enva Jos resultados a un dispositivo, tales c o m o un terminal o impresora.
Despus q u e los archivos han sido creados p o r T u r b o , se gestionan p o r el sistema
operativo de la c o m p u t a d o r a ( M S - D O S , O S / 2 , U N I X / X e n i x , etc.). El sistema operativo
a l m a c e n a y accede a archivos, genera directorios, copia, r e n o m b r a y transfiere archivos
entre discos, m e m o r i a y dispositivos de E / S ( m o d e m , impresora...). Esto significcf q u e
p u e d e e m p l e a r las utilidades de su sistema operativo para m a n i p u l a r un archivo despus
q u e se crea c o n T u r b o .
Los archivos se p u e d e n a l m a c e n a r en disquetes y u n i d a d e s de discos duros. Existen
otros dispositivos de a l m a c e n a m i e n t o (cinta, discos pticos, discos R A M , etc.), a u n q u e
son m e n o s frecuentes.

Conceptos de archivos DOS/Turbo

U n archivo tiene un n o m b r e a l m a c e n a d o en un directorio j u n t o con otros archivos de


discos. Los n o m b r e s de archivos en T u r b o Pascal y D O S requieren de 1 a 8 letras, y
p u e d e n incluir t a m b i n u n a extensin de u n a a tres letras, n o r m a l m e n t e son significativos y relativos al c o n t e n i d o del m i s m o .
Demo.Pas

en discos duros

unidad: (especificador de u n i d a d . A:, B:, C:),


camino: (especificador d e c a m i n o \TURB0\),
nombre: (especificador de archivo, n o m b r e . e x t e n s i n , PR0G1.DAT).

LOS ARCHIVOS EN TURBO PASCAL

15.2.1.

en directorios

Los archivos de d a t o s o p r o g r a m a s se p u e d e n a l m a c e n a r en un directorio DOS. En ese


caso el n o m b r e del archivo consta de:

b)

15.2.

567

MiPrograma.DAT

Prueba.PAS

Ejemplo 1 5 . 1
El archivo DEM01. PAS est en el directorio TURBO de la unidad
completa del nombre del camino del nombre del archivo es
C:\TURB0\DEM01.PAS

C (disco duro); la descripcin

\ directorio raiz

Ejemplo 1 5 . 2
El archivo S0RT.DAT est en el directorio

TURBO, que a su vez contiene

un directorio

C:\TURBO\LIB\S O RT.DAT

Cada vez q u e se refiera al archivo SORT. DAT deber especificar el c a m i n o correcto.


Regla

I os jri'lmo* de texto estandar de "luiho Pascal tienen la extensin .TXT: por consiguiente,
nombre sus archivos de datos dos eieados por usted) a paitirde jhoia con la extensin .DAT

15.2.2.

Tipos de archivos

Existen tres tipos de archivos de datos en T u r b o Pascal:


texto ( t e x t ) o secuenciales (acceso secuencial),
tipeados (tipificados) o con tipo ( f i l e of) (acceso aleatorio),
no tipeados (no tipificados) o sin tipo ( f i l e ) .

aleatorios,

LIB.

568

Programacin en Turbo/Borland Pascal 7

Archivos de texto:
(,secuenciales)
Archivos con tipo:
(aleatorios)
Archivos sin tipo:

1 5.2.3.

Archivos

son archivos q u e contienen texto (carcter ASCII)


archivos q u e c o n t i e n e n datos de cualquier tipo c o m o integer,
byte, real, record... (datos con estructuras y c o n t e n i d o s conocidos)
archivos en los q u e n o se conoce su estructura ni su c o n t e n i d o ;
estn concebidos para acceso de bajo nivel a los datos de u n
disco ( E / S de bytes).

Variable tipo archivo (file)


Para definir u n archivo con tipos, s i m p l e m e n t e declare u n a variable archivo.
Ejemplo
var
Cantidades: ArcEnteros;
var
Cantidades, Notas, Salarios: ArcEnteros;
A s i m i s m o , y al igual q u e c o n o t r o s tipos de d a t o s , se p u e d e n d e c l a r a r d i r e c t a m e n t e
variables del tipo f i l e .

Declaracin de archivos

var
ArchiDemol
ArchiDemo2

La declaracin de un archivo consta de dos pasos:


1. Declaracin del tipo de archivo adecuado:
l. I. f i 1 e of char
f i l e of text
1.2. f i l e of < tipo >
1.3. f i l e

: file of real;
: file of integer;

archivo de texto
Variables tipo texto y sin tipo
archivo tipeado o tipificado
archivo sin tipo

Este tipo de variables n o requiere n i n g u n a declaracin de tipos; as pues, se p u e d e declarar con u n identificador p r e d e f i n i d o (Text, File):

2. Declaracin de u n a variable archivo de u n tipo de archivo declarado.


Declaracin

569

var
texto : text;
Archil : file;

de un tipo archivo (file)

U n tipo archivo se declara de igual m o d o q u e cualquier otro tipo de d a t o d e f i n i d o p o r el


usuario: en la seccin de declaracin de tipos (type). .

15.2.4.

Formato

Procedimientos y funciones estndar para gestin


de archivos

La T a b l a 15.1 recopila todos los p r o c e d i m i e n t o s y f u n c i o n e s estndar p a r a t r a t a m i e n t o


y m a n i p u l a c i n de archivos en T u r b o Pascal.

type
nombre = file of tipo de datos

Tabla 1 5 . 1 . Procedimientos y funciones de tratamiento de archivos


nombre
tipo de datos

identificador que se asigna como nombre del tipo archivo


tipo de datos de los elementos del archivo

'Indos tipos de arelmos

^
Ejemplos
type
type
type
type

ArcEnteros = file of integer;


ArcCarac
= file of char ;
Agenda
file of NumTelefono;
Nombres
= file of string [60];

tipo
tipo
tipo
tipo

de
de
de
de

archivo
archivo
archivo
archivo

type Beta = file of array [1..100] of char; no vlida


type ConjuntoCar = array [1..100] of char;
Prueba
= file of ConjuntoCar;

vlida

\rchi\os di' texto

Vrchiios sin lipo

:
Assign
ChDir
Cise
Erase
GetDir
MkDir
Rename
Reset
Rewrite
RmDir

Append
Flush
Read
Readln
SetTexBuf
Write
Writeln

BlockRead
BlockWrite

570

Programacin en Turbo/Borland Pascal 7

Archivos

Tabla 1 5 . 1 . Procedimientos y funciones de tratamiento de archivos (cont.)


'1 odos tipos de archivos

Eof
IOResult

Archivos de texto

\rchivns sin tipo

Eoln
SeekEof
SeekEoln

Precaucin

571

con eoln

En Turbo Pascal el delimitador eoln se trata como caracteres independientes: un retorno de


carro, que posiciona el cursor (puntero) a ia primera columna de la lnea actual; un avance
de lnea, que mueve el cursor a la siguiente lnea. Pascal estndar lo considera un solo caarchivo de entrada Hola.

,J

'

En Turbo Pascal tiene siete caracteres y en Pascal estndar cinco.

Procedimientos y funciones sobre cualquier tipo de variable excepto archivos de texto


FilePos
FileSize
Seek
Trncate

1 5.3.

LOS ARCHIVOS DE TEXTO (SECUENCIALES)

U n archivo de texto es u n tipo estndar, c o m o se ha c o m e n t a d o a n t e r i o r m e n t e . Los


archivos de texto estn constituidos p o r e l e m e n t o s q u e son caracteres Pascal (pertenecientes al cdigo ASCII).
U n a r c h i v o de texto c o n s t a de u n a serie d e lneas ( c a d a u n a c o n t i e n e c a r a c t e r e s ,
palabras y frases) y separadas p o r u n a m a r c a fin de lnea (eoln, " e n d of line"). L a m a r c a
fin de lnea es u n a secuencia de caracteres CR (carriage return) y LF (linefeed),
q u e se conoce c o m o retorno de carro y avance de lnea. L a c o m b i n a c i n CR/LF (cdigos ASCII 10
y 13) se c o n o c e c o m o delimitador y se o b t i e n e p u l s a n d o la tecla Intro (Enter o Return),
o bien las c o m b i n a c i o n e s de teclas CTRL-M, CTRL-J.

15.3.1.

Creacin de archivos de texto con un editor

L o s a r c h i v o s de t e x t o se p u e d e n crear c o n u n e d i t o r del s i s t e m a o p e r a t i v o ( E D L I N ,
W o r d S t a r , etc.) del m i s m o m o d o q u e se crea u n p r o g r a m a f u e n t e en Pascal. Los caracteres individuales se i n t r o d u c e n p o r teclado y u n a m a r c a fin de lnea (eoln) se inserta en
el archivo s i e m p r e q u e se p u l s a la tecla
. U n a vez q u e el archivo est t o t a l m e n t e int r o d u c i d o , se pulsa Ctrl-Z y ya se p u e d e g u a r d a r c o m o u n archivo p e r m a n e n t e en disco
al q u e se p u e d e acceder en c u a l q u i e r m o m e n t o .
D e este m o d o se p u e d e n p r e p a r a r archivos de texto q u e p u e d e n ser ledos posteriorm e n t e p o r sus p r o g r a m a s .
L o s a r c h i v o s de t e x t o p u e d e n ser ledos o v i s u a l i z a d o s en p a n t a l l a d e s d e el D O S
c o n la o r d e n TYPE. P r u e b e c o n algn a r c h i v o de texto q u e haya c r e a d o . T r a t e d e s p u s
de visualizar u n a r c h i v o de u n disco de t r a b a j o q u e tenga extensin COM; por e j e m p l o ,
TURBO.COM.
type TURBO.COM

Ejemplo de archivo de texto

y observar u n a serie de letras y smbolos sin sentido; la razn es q u e al no ser TURB0.C0M


u n a r c h i v o de t e x t o , se a l m a c e n a en disco c o n f o r m a t o b i n a r i o n o legible p o r el
usuario.

U n archivo de texto est c o n s t i t u i d o p o r u n a serie de lneas de caracteres s e p a r a d o s p o r


CR/LF (pulsacin de la tecla Intro,
i ).
'

15.3.2.

Esto es una prueba de un archivo de texto


Cada linea en un archivo de texto finaliza con CR/LF,
es decir un Retorno de Carro y un Avance de Linea J
{linea vacia}
45671.45 es la cantidad total

Funciones eoln//eof

La f u n c i n eoln devuelve el estado de fin de lnea de u n archivo. Es u n a f u n c i n de tipo


lgico.
Formato
funcin

eoln [var f: text) }

Los archivos de texto se t e r m i n a n con u n a m a r c a final de archivo Ctrl -Z (eof, end of

llamada a
la funcin

eoln (f)

file).
A u n q u e hasta a h o r a n o se le ha prestado atencin, ya se h a n utilizado archivos de
texto: El teclado de la c o n s o l a es u n a r c h i v o de t e x t o d e n o m i n a d o input ( e n t r a d a ) ; la
p a n t a l l a de la consola r e p r e s e n t a u n a r c h i v o d e texto d e n o m i n a d o output (salida). E n
Pascal e s t n d a r estos archivos es obligatorio declararlos, c u a n d o se t r a b a j a c o n la c o n s o l a
o t e r m i n a l en la cabecera program del p r o g r a m a .

variable de archivo de texto

Comentarios
Eoln (f) devuelve true si en la posicin actual del archivo ( p u n t e r o ) est la m a r c a fin
de lnea, o bien si eof (f) es true; en caso contrario devuelve false.

572

Archivos

Programacin en Turbo/Borland Pascal 7

C o m o cualquier otra variable, u n a variable de tipo T E X T se p u e d e definir local o


globalmente; p e r o al c o n t r a r i o q u e otras estructuras, la longitud de u n a variable archivo
n o se precisa.

Ejemplos
WriteLn (eoln);
La f u n c i n eof (end of file), fin de archivo, devuelve el estado de u n archivo de texto. Es
u n a f u n c i n de tipo lgico q u e indica si el fin del archivo se h a a l m a c e n a d o ; devuelve
true si se ha a l m a c e n a d o , false en caso contrario.

1 5.4.2.

Asignacin de archivos

La operacin de asignar un archivo establece u n a c o r r e s p o n d e n c i a entre variable tipo


archivo con u n archivo e x t e r n o situado en un disco.

Formato
llamada a
a funcin

funcin

Formato
assign (var f: nombre; string)

15.3.3.

/
nombre

f i l e of char;

1 5.4.

TRATAMIENTO DE ARCHIVOS DE TEXTO

El proceso o t r a t a m i e n t o de archivos de texto exige los siguientes pasos:


Declaracin del archivo.
Apertura del archivo.
Leer los datos del archivo o escribir datos en l.
Cierre del archivo.

1 5.4.1.

llamada al
procedimiento

assign (f, nombre)

Archivos tipo char

U n archivo de texto es casi la m i s m a cosa q u e un a r c h i v o de caracteres (char). La nica


diferencia es q u e un archivo de texto se divide en lneas y u n archivo de caracteres no.
Los archivos de caracteres se leen y escriben de carcter en carcter, m i e n t r a s q u e los
archivos de texto se leen lnea a lnea. La declaracin es m e d i a n t e las palabras:

1.
2.
3.
4.

573

Declaracin de un archivo

La declaracin de un archivo consta de dos operaciones:


1. Definir u n a variable de tipo archivo TEXT.
2. Asociar a esta variable el n o m b r e de un archivo en disco (sentencia assign).
Definir una variable de tipo text

nombre interno del archivo por el que se conoce el archivo dentro del
programa (por ejemplo, el utilizado en la declaracin)
nombre externo con el que se conoce el archivo por el sistema operativo
(por ejemplo, 'b:program5.txt'); es una cadena que se define como una
constante en ei programa o bien una variable cuyo valor se lee interactivamente; puede ser una unidad: nombre.extensin o bien una unidad con
nombres de caminos y archivos

Ejemplos
1. const
NombreAr = 'Program7.txt';
var
Miarch : text;
begin
assign (Miarch, NombreAr);
2. var
Datos : text;
Nombre : string [20];
Write ('escriba el nombre del archivo externo');
ReadLn (Nombre);
assign (Datos, Nombre);

El f o r m a t o general de u n a variable de tipo text es:


1. var
Nombre Var: text;
2. var
NombreVar file of char;
Nombre Var

nombre vlido de variable

3. var
Fichtext : text;
assign

(Fichtext, 'C:\turbo\miprogl.pas');

D e s p u s q u e se ha a s i g n a d o u n i d e n t i f i c a d o r de a r c h i v o a u n a r c h i v o de disco, se
prepara el archivo de disco con u n a de estas tres rdenes (procedimientos): reset, rewri te
o append.

574

Programacin en Turbo/Borland Pascal 7

15.4.3.

Apertura de archivo

Archivos

15.4.4.

575

Escritura de un archivo

D e s p u s de h a b e r asignado, un archibo debe ser abierto. Esta operacin se realiza p o r


u n o de los dos p r o c e d i m i e n t o s predefinidos: rewrite y reset.

U n a vez q u e se h a abierto u n archivo para escritura, las sentencias (procedimientos) write


y w r i t e l n sirven p a r a escribir datos en el n u e v o archivo.

Reset

Formato

A b r e u n n u e v o archivo existente para u n a operacin de lectura. Si se i n t e n t a l l a ma r a


Reset y el archivo especificado n o existe, se p r o d u c i r un error de E / S (entrada/salida).

write (f, vi, v2, . . .)

Formato

f
reset (NombreArch)
NombreArch

variable tipo archivo

Ejemplo
reset (MiArch);
reset (fichtext);

2. var NombreArch
archtex

Si al abrir u n archivo de texto, con assign y reset, ya existe en el disco, la sentencia


rewrite lo reescribir; en otras palabras, "se perder" el archivo contiguo.
P o r el contrario, las sentencias assign y rewrite s u p o n e n la existencia del archivo
l l a m a d o en el disco. Si este archivo n o existe, las sentencias anteriores p r o d u c i r n
n o r m a l m e n t e errores de ejecucin. M e d i a n t e la directiva {$1-} se p u e d e desactivar
la deteccin de errores de E n t r a d a / S a l i d a y prevenir u n a p a r a d a en la e j e c u c i n del
p r o g r a m a a n t e la eventualidad de la ausencia de u n archivo. U n a posible solucin
es el s e g m e n t o de p r o g r a m a siguiente:
{ $i- }
reset (NombreArchivo);
{ $1+ }
if IOResult = 0 then
{ lectura del archivo }
else
{ error de entrada/salida }
En este caso, la f u n c i n IOResul t devuelve el valor 0 si la sentencia reset se ha ejecutado correctamente.

: string [60];
: text;

Write ('nombre de archivo');


ReadLn (NombreArch);
assign (Archtext, NombreArch);
reset
(Archtex);

15.4.5.

Precaucin

variables del tipo de datos

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


WriteLn (demo, 'y esta es la siguiente prueba');

Crea y abre un n u e v o archivo. Si el archivo ya existe, Rewrite borra su c o n t e n i d o ; en


caso contrario, el archivo q u e d a abierto para u n a operacin de escritura.

rewrite (f)

vi, v2,.. .

Ejemplos

Rewrite

Formato

variable tipo archivo

writeln (fl, vi, v2, . . . vn)

Lectura de un archivo

Los p r o c e d i m i e n t o s read y readln se utilizan p a r a la lectura de los d a t o s situados en un


archivo de tipo texto.
Formato
read (f, vi, v2, . . .)

readln (fl, vi, v2, ... vn)

variable archivo de texto (si se omite, se supone la variable archivo


input)
vi, v2 .. . variable de tipo char, integer, real o string

Ejemplo
var
Total, Horas : real;
Archivo
: text;
Mensaje
: string [30;
begin
assign (Archivo, 'Demo');
reset
(Archivo);
ReadLn (Archivo, Mensaje, Horas);

576

Archivos

Programacin en Turbo/Borland Pascal 7


Programa

Memoria Central

Nota

577

Archivo de datos

Var a,

b,

c,

ReadLn (a, b,

ReadLn (a,

b,

ReadLn (a, b,

c,

c,

c,

d)

d)

d)

c= 3

d= 4

1 2
<CR>
3 4
<CR>
5 6
<CR>
Se asignan
a= 1 b = 2 c=3
d=4
Los valores 5 y 6 quedan sin asignacin
1 2
<CR>
Se asignan a = J, b = 2 y la computadora
espera nuevas entradas

15

18

12

15

18

12

15

18

Figura 1 5 . 2 . Posicin actual del puntero.

< C R > (avance de lnea)


1, 2, 3, 4
Se asignan
3=1 b = 2

12

posicin actual del puntero

Vrcliivo de texto

d : char;

Ejemplos
Declaracin

Originalmente, el piocedi miento lieu't.n oslaba pensad") en I'ascal estandar \ en el control


de tarjetas patinadas i - I.T ) f 11 "1 urho Pascal Rcutil n salta al principio de la siguiente
lnea del archivo. I ste salto de linea se produce cuando se han asignado vjiotes a la lista de
vaidbles del procedimiento, en caso contrario, el procedimiento hace caso omiso dei control de linea \ sigue asignando informacin.

Reset reinicializa el hipottico p u n t e r o al p r i m e r e l e m e n t o del archivo. Readln (n)


lee del teclado, read (fin) lee del archivo asociado con el identificador f . D e s p u s
q u e se lee un dato, el p u n t e r o (posicin actual del archivo) se m u e v e u n a posicin,
y as sucesivamente hasta el final del archivo, m o m e n t o en q u e se debe cerrar el
archivo con cise.
Read (x)

equivale a

Read (input.x)

3. En u n archivo de texto se p u e d e realizar u n a operacin de lectura o u n a de


escritura, pero n o a m b a s . Si se realiza u n reset, slo p u e d e leerse de l. Se p u e d e
c a m b i a r de salida a e n t r a d a o viceversa, l l a m a n d o a estos p r o c e d i m i e n t o s a m e d i da q u e el p r o g r a m a se ejecuta, pero no se p u e d e hacer a m b a s operaciones simultn e a m e n t e . I n c i d e n t a l m e n t e se p u e d e n reutilizar datos ledos de u n archivo llam a n d o de n u e v o a reset.

< CR > (Carriage Return = Retorno de carro


Programa 1 5.1

15.4.6.

Recapitulacin sobre los procedimientos predefinidos


de E/S

1. El uso de write y w r i t e l n en archivos de texto es e x a c t a m e n t e el m i s m o q u e e n


la pantalla, se est utilizando u n archivo l l a m a d o output (salida). Este archivo es
p r e d e f i n i d o de t i p o text, p r e a s i g n a d o a la p a n t a l l a d e su c o m p u t a d o r a . Si el
p r i m e r a r g u m e n t o de w r i t e o w r i t e l n n o es u n a r c h i v o , se utiliza output p o r
defecto.
Write (x)

equivale a

Write ( o u t p u t , x )

2. Las operaciones de lectura de datos se c o m p r e n d e n m e j o r i n t r o d u c i e n d o el concepto de posicin actual del archivo. A m e d i d a q u e su p r o g r a m a se ejecuta, i m a gnese u n puntero q u e se moviese a travs de los datos de m o d o q u e la c o m p u t a dora conozca d n d e se lee el siguiente elemento. S u p o n g a m o s u n a r c h i v o de datos
n u m r i c o . La F i g u r a 15.2 m u e s t r a el proceso de lectura y el s i s t e m a en q u e se
m u e v e el puntero en c a d a operacin.

Se ha creado un archivo de texto (c:demo99.dat)


con un editor, o bien con un programa
especfico. Leer dicho archivo y visualizarlo en la pantalla. Para facilidad de lectura y
atencin al usuario se desea que el programa emita un pequeo pitido (sonido) al final de
cada lnea del archivo.
program LeerArTex;
var
Fichero
: text;
Caracter : char;
begin
Assign (Fichero, 1c:demo99.dat');
Reset (Fichero);
while not Eof (Fichero) do
begin
while not Eoln (Fichero) do
begin

578

Programacin en Turbo/Borland Pascal 7


Read (Fichero, Caracter);
Write (Caracter)
end;
Write (Chr(7));
WriteLn;
ReadLn (Fichero)
end;
Cise (Fichero)
end.

Archivos

1 5.4.7.

579

Aadir datos a un archivo de textos

E l p r o c e d i m i e n t o Append a b r e u n a r c h i v o e x i s t e n t e p a r a a a d i r d a t o s al
mismo.

final

del

Formato

Append ( f )
Programa 1 5 . 2
Se ha creado
20
30

el siguiente
27.34
41.26

archivo

de texto

(20 lneas):

i f ) variable de archivo de texto que debe haber sido asociada con un archivo externo mediante Assign

894123.65
121467.23

Si el a r c h i v o n o existe, se p r o d u c e u n e r r o r ; y si ya e s t a b a a b i e r t o , p r i m e r o se cierra y
l u e g o se r e a b r e .
100

17.35

814567.23

Los nmeros en este caso no se almacenan


en formato
binario sino como caracteres;
27.34 se almacena como '2', 'T,
'3', '4' y requiere 5 bytes. El siguiente programa
lee el
archivo de texto anterior (las tres columnas)
y calcula la media de cada columna.
program Medias;
var
Col
Text;
I, J
integer;
Numl, Num2, Num3,
Med, Med2, Med3
real;
begin
Assign (Col, demo.dat 1 );
Reset (Col);
J
:= 0;
Med := 0;
Med2 := 0;
Med3 := 0;

Notas
1. S i / s e asigno a un 11 o m i n e vacio, tal c o m o ItwyH
entonces, iras la llamada a
Append, f se referir al arelu\o estndar de salida.
2. Tras abrir con \pnc.-u! ' se c< 'ir. ier'.r i_-n s>iio escritura.
3. Con la dire.l\a {51-/. lORi^'.Ot de\olveia 0 M la operaeinrt tuvo xito. \ un end i y o de
error distinto J.e eeio en eav> contrario.

Ejemplo
program Agregar;
var
Fich : Text;
begin
Assign
(Fich, 1 texto . txt' ) ;
{ crea nuevo Archivo }
Rewrite (Fich);
WriteLn (Fich, ' linea primitiva');
Cise
(Fich);
{ cierra archivo, guarda cambios }
Append
(Fich);
{ Aade texto al final }
WriteLn (Fich, 'linea Aadida');
Cise
(Fich)
end.

while not Eof (Col) do


begin
Read
(Col, Numl, Num2, Num3);
WriteLn (Numl 8 : 2 , ' ', Num2:8:2, '
',Num3:8:2),
J
:= J + 1;
Med := Med + Numl;
Med2 := Med2 + Num2 ;
Med3 := Med3 + Num3
end;
Med := Med / J;
Med2 := Med2 / J;
Med3 := Med3 / J;
WriteLn; WriteLn;
WriteLn (Med :8:2,
, Med2 : 8 :2, ' ,Med3 :8:2 ) ;
Cise (Col)
end.

1 5.5.

REDIRECCIONES DE LAS ENTRADAS/SALIDAS


ESTANDAR

E n T u r b o P a s c a l se p u e d e e f e c t u a r u n a r e d i r e c c i n a l igual q u e e n D O S d e la
e n t r a d a e s t n d a r (el t e c l a d o ) y d e la s a l i d a e s t n d a r (la p a n t a l l a ) , y p e r m i t i r p r o g r a m a s
m s flexibles.

580

Archivos

Programacin en Turbo/Borland Pascal 7

L a e n t r a d a y s a l i d a e s t n d a r se p u e d e e s p e c i f i c a r m e d i a n t e u n a c a d e n a v a c a (") e n
l u g a r del n o m b r e d e a r c h i v o e x t e r n o , e n el p r o c e d i m i e n t o Assign. E n este c a s o el t e c l a d o
y la p a n t a l l a se c o m p o r t a n c o m o a r c h i v o s d e t i p o t e x t o .
Ejemplo

de aplicacin

L e e r el c o n t e n i d o d e u n a r c h i v o y e s c r i b i r l o e n o t r o s e g u n d o a r c h i v o , c a r c t e r a carcter.
program Copia;
uses
Crt ;
var
Fichl,
Fich2 : Text;
Car
: char;
begin
ClrScr;
Assign
(Fichl, ' ');
Rewrite (Fichl);
Assign
(Fich2, 1 ' );
Reset
(Fich2);
while not Eof (Fich2) do
begin
Read
(Fich2, Car);
Write (Fichl, Car)
end;
Cise (Fichl);
Cise (Fich2)
end.
C o m p i l a r este p r o g r a m a c o n el n o m b r e P R U E B A , el a r c h i v o c o m p i l a d o s e r e n t o n c e s
P R U E B A . E X E . D e s d e el i n d i c a d o r ( > ) d e l D O S e j e c u t e la o r d e n
PRUEBA
Si a h o r a e s c r i b e u n t e x t o p o r t e c l a d o , a c a d a < I n t r o > , se v i s u a l i z a l a l n e a escrita,
h a s t a llegar a < C t r l -Z > . A l g u n a s a p l i c a c i o n e s d e la r e d i r e c c i n ( s m b o l o > ) d e e s t e p r o g r a m a son:
prueba > l p t l
prueba < d e m o . d o c
prueba demo.doc < > t e s t . t x t

reproduce en impresora todo lo que se teclea


por teclado
visualiza en pantalla el contenido del archivo
demo.doc
copia el contenido del archivo demo.doc en el
archivo test, text

Problema 15.1
Realizar

un programa

que permita

copiar

un archivo

de texto

en otro archivo.

S u p o n g a m o s q u e el a r c h i v o , ya e x i s t e n t e y a l m a c e n a d o e n u n a u n i d a d d e d i s c o , se
d e n o m i n a E N T R A D A I . T X T . El n u e v o a r c h i v o a c r e a r se l l a m a r S A L I D A 1 . T X T .

program Transferencia_Archivos_Textosl;
{copia el contenido del archivo entradal.txt al archivo
salidal.txt}
var
Fl, F2 : Text;
Linea
: string [80];
begin
{abrir archivos}
Assign (Fl, 'entradal.txt');
Assign (F2, 'salidal.txt');
Reset (Fl);
Rewrite (F2);
{transferencia de datos}
while not Eof (Fl) do
begin
{transferencia de una Linea}
ReadLn (Fl, Linea);
WriteLn (F2, Linea);
end;
{cerrar archivos}
Cise (Fl);
Cise (F2);
end.
program Transferencia_Archivos_Textos2;
{copia el contenido de entradal.txt en salidal.txt}
var
Fl, F2
: text;
Caracter : char;
begin
{abrir archivos}
Assign (Fl, 'entradal.txt');
Assign (F2, 'salidal.txt');
Reset (Fl);
Rewrite (F2);
{transferencia de datos}
while not Eof (Fl) do
begin
while not Eoln (Fl) do
begin
{transferencia de una linea}
Read (Fl, Caracter);
Write (F2, Caracter)
end;
ReadLn (Fl);
WriteLn (F2)
end;
{cerrar archivos}
Cise (Fl);
Cise (F2)
end.

581

582

Programacin en Turbo/Borland Pascal 7

Archivos

En este p r o g r a m a p u e d e ser m o d i f i c a d o , de m o d o q u e en lugar de leer u n a lnea


completa lea carcter a carcter:
{transferencia de datos}
while not eof (fl) do
begin
while not eoln (fl) do
begin
Read (fl, sigcar);
Write (f2, sigcar);
end;
ReadLn (fl);
WriteLn (f2);
end;

1 5.6.

{lee el siguiente caracter}


{lo escribe en f2}
{salta marca fin de linea}
{inserta marca fin de linea}

LOS ARCHIVOS DE ACCESO ALEATORIO


(CON TIPOS)

Los archivos tipificados (con tipos), t a m b i n l l a m a d o s archivos binarios, c o n t i e n e n datos


de tipo simple o estructurado, tales c o m o integer, real, record, etc., excepto otro tipo de
archivos. Estos archivos se l l a m a n binarios ya q u e los valores binarios a l m a c e n a d o s en
m e m o r i a se c o p i a n d i r e c t a m e n t e en el disco.

1 5.6.1.

15.6.2.

program Datos1;
var
f: file of real;
g: file of integer;

el archivo g a l m a c e n a n m e r o s de tipo real y el archivo / d e tipo entero; d a d o q u e un


n m e r o real requiere 6 bytes en T u r b o Pascal y u n n m e r o entero 2 bytes. Los registros
(elementos) en q u e se organiza el archivo sern de 6 y 2 bytes, respectivamente, y la
longitud en bytes de c a d a archivo multiplicado p o r 6 o p o r 2.
U n e j e m p l o tpico de a l m a c e n a m i e n t o de datos es el de las cadenas. S u p o n g a m o s q u e
se declaran dos archivos ftexto y f c a d e n a (en este caso se debe declarar la longitud de la
cadena, d a d o q u e en t o d o s los e l e m e n t o s d e b e n ser igual).

program tipificados
var
f : file of real;

indica a T u r b o Pascal q u e este archivo se utilizar p a r a a l m a c e n a r slo n m e r o s reales,


pero con u n a diferencia notable, los n m e r o s reales se a l m a c e n a n en el m i s m o f o r m a t o
en q u e se a l m a c e n a n en R A M . P o r esta r a z n , los archivos binarios son m u c h o m s
rpidos q u e los archivos de texto: los archivos b i n a r i o s transfieren los datos d i r e c t a m e n t e
a m e m o r i a , m i e n t r a s q u e los archivos de t e x t o r e q u i e r e n u n proceso de t r a d u c c i n y
conversin. As, p o r ejemplo, un archivo b i n a r i o de tipo e n t e r o a l m a c e n a slo datos enteros.

Estructura de un archivo con tipos (binario)

Los archivos con tipos estn es tr u ctu r ad o s en elem en to s o registros (record) cuyo tipo
puede ser cualquiera. A los e l e m e n t o s de estos archivos se accede d i r e c t a m e n t e , al no
situarse stos en posiciones fsicamente consecutivas, sino en posiciones lgicas. Esta es
la razn p o r la q u e se les d e n o m i n a archivos de acceso aleatorio o directo. Los elem en to s
de los archivos aleatorios son de igual t a m a o y el t r m i n o acceso directo significa q u e es
posible acceder d i r e c t a m e n t e a n o i m p o r t a cul e l e m e n t o con slo especificar su posicin. U n p u n t e r o del archivo m e m o r i z a el rango o posicin del registro para la p r x i m a
operacin de lectura o escritura. C u a n d o u n archivo se abre, su p u n t e r o indica el registro
de posicin cero, es decir, el p r i m e r registro del archivo se i n c r e m e n t a en el n m e r o de
registros ledos o escritos. U n registro es la u n i d a d m n i m a de transferencia de i n f o r m a cin entre u n archivo y u n p r o g r a m a .
U n archivo de acceso aleatorio se a l m a c e n a , c o m o ya se ha c o m e n t a d o , en f o r m a t o
binario c o m p r i m i d o , q u e n o es visualizable d i r e c t a m e n t e en pantalla. Esto significa q u e
los archivos binarios n o p u e d e n crearse a l igual q u e los de t e x t o con u n editor del
sistema operativo. E n su lugar, un archivo b i n a r i o se debe crear por la ejecucin de un
programa.
La longitud de u n registro d e p e n d e del n m e r o de bytes requeridos para a l m a c e n a r el
tipo de datos. En el e j e m p l o siguiente

Diferencias entre archivos de texto y binarios

En un archivo TEXT, los c o m p o n e n t e s del a r c h i v o son caracteres del j u e g o d e caracteres


de Pascal; en c o n s e c u e n c i a , slo los c d i g o s d e c a r a c t e r e s p u e d e n ser c o p i a d o s en el
disco. Pascal convierte u n valor n u m r i c o en m e m o r i a a u n a secuencia de cdigos de
caracteres antes de escribirlos en u n archivo TEXT; esta c o n v e r s i n n o se realiza c u a n d o
un valor n u m r i c o se escribe de m e m o r i a a u n a r c h i v o binario. Los archivos b n a n o s son
estructurados al c o n t r a r i o q u e los archivos de t e x t o q u e n o son estructurados; los archivos binarios tienen u n a estructura rgida q u e d e p e n d e del tipo de datos q u e contiene.
As, por ejemplo, la declaracin

583

program Datos2;
var
ftexto : Text;
fcadena : file of string [10];

Se escribe en a m b o s archivos la c a d e n a 'LUIS'. C m o se a l m a c e n a en c a d a u n o de


ellos?

Archivo de texto

584

Programacin en Turbo/Borland Pascal 7

Archivos
10

Archivo con tipos

s
basura

cadena

var
Fich_Cliente : file of Cliente;
Un_Cliente
: Cliente;
Car
: char;
2. type

Longitud de la cadena
En el archivo tipeado, T u r b o Pascal a l m a c e n a la c a d e n a en su f o r m a t o completo:
byte de longitud, 4 bytes de la c a d e n a y caracteres basura (no tienen a l m a c e n a d a inform a c i n significativa) q u e o c u p a n 5 bytes. Los archivos de cadenas requieren m s espacio
q u e los archivos de texto ya q u e los registros incluyen el byte de longitud de la cadena, la
c a d e n a real y los bytes (basura) q u e faltan para la longitud declarada.

1 5.7.

TRATAMIENTO DE ARCHIVOS DE ACCESO


ALEATORIO

El proceso de operaciones con archivos con tipo o de acceso aleatorio es similar al ya


t r a t a d o en los archivos de texto, con algunas diferencias q u e analizaremos.
Las etapas necesarias para la creacin, lectura y escritura de u n archivo aleatorio son:
1. Definir el tipo de c o m p o n e n t e s del archivo y declarar u n a variable, de archivo c o m o
estructura de tipo f i l e (declaraciones type y var).
2. Establecer u n enlace entre la variable tipo archivo y el n o m b r e del archivo en disco
(procedimiento
assign).
3. Abrir u n archivo n u e v o o u n o ya existente {procedimientos
rewrite o reset). E n
cualquier caso, el archivo se abre t a n t o para lectura c o m o p a r a escritura.
4. M a r c a r u n a posicin especfica en el archivo para la siguiente operacin de lectura
o escritura (seek). Leer el registro (read) o escribir u n n u e v o registro en esa posicin (write).
5. Crear el archivo al t e r m i n a r las operaciones de lectura/escritura (cise).

1 5.7.1.

1. type

3. var

15.7.2.

Cliente = record
Codigo
Nombre
Direccin
Telefono
Saldo
Edad
end;

Lista
item

= array [0..10] of integer;


= record
Nombre : string [20];
Codigo : integer;
Precio : real
end;
TipoFichl = file of real;
TipoFich2 = file of Lista;
TipoFich3 = file of Item;
f : file of byte;
g : file of string [40];

Asignacin de archivo

El p r o c e d i m i e n t o de asignacin es idntico al ya conocido.

assign (nombre_archivo_interno, nombre_archivo_externo)


assign ( f i c h - c l i e n t e ,

15.7.3.

el i e n t e . d a t 1 ) ;

Apertura del archivo

Esta operacin se efecta p o r u n o de los p r o c e d i m i e n t o s ya conocidos: reset, rewrite.

rewrite (arch_cliente) ;
reset (f)
Reset
ReWrite

Declaracin de un tipo de archivo

La declaracin de un archivo de acceso directo se efecta con la a y u d a de las palabras


reservadas f i l e of.

585

el archivo puede existir


el archivo debe existir

necesita la existencia del archivo


crea y abre un archivo; si ya exista, su contenido se destruye

Precaucin
Sea prudente al usar Rewrite para evitar prdidas indeseadas de informacin.

:
:
:
:
:
:

string [10]
string [40]
string [30]
string [10]
real;
integer

15.7.4.

Operaciones de lectura, escritura y fin de archivo

L o s a r c h i v o s b i n a r i o s ( c o n t i p o ) n o e s t n c o n s t i t u i d o s p o r lneas; e n c o n s e c u e n c i a ,
los p r o c e d i m i e n t o s e s t n d a r readln, writeln y eoln n o se p u e d e n utilizar en archivos con
tipo.

586

Programacin en Turbo/Borland Pascal 7


Archivos

L o s n i c o s p r o c e d i m i e n t o s q u e se p u e d e n utilizar p a r a lectura y escritura son:

read

write

eof

Los f o r m a t o s respectivos son los ya c o n o c i d o s :

read (nombre_de__fichero, lista de elementos)


write (nombre_de_fichero,

lista de elementos)

eof {nombre_de_fichero)

E n c a d a o p e r a c i n d e l e c t u r a y e s c r i t u r a el p u n t e r o a s o c i a d o al a r c h i v o se i n c r e m e n t a
a u t o m t i c a m e n t e d e m o d o q u e se p o s i c i o n a e n el r e g i s t r o s i g u i e n t e . P o s t e r i o r m e n t e
v e r e m o s c m o se p u e d e s e l e c c i o n a r , p a r a s u m o d i f i c a c i n o b o r r a d o , u n d e t e r m i n a d o r e gistro.

15.7.5.

Nombre
: string
Calle
: string
Ciudad
: string
Telefono
: string
end;
file of Direc;

Cierre del archivo

El c i e r r e d e u n a r c h i v o c o n t i p o se e f e c t a d e i g u a l m o d o q u e p a r a u n a r c h i v o d e t e x t o .
E s t a o p e r a c i n l i b e r a al D O S d e l c o n t r o l d e l a r c h i v o .

cise {nombre_del_archivo)

587

[30]
[25]
[15]
r oi

Archivo
var
Dir
: Archivo;
Elemento
: Direc;
Respuesta : char;
begin
Assign (Dir, 'Agenda.dat');
{asigna Dir A Agenda.dat}
Rewrite (Dir);
{abre archivo Dir
}
with Elemento do
repeat
Write
('Nombre :');
ReadLn
(Nombre);
Write
('Calle :');
ReadLn
(Calle);
Write
('Ciudad :');
ReadLn
(Ciudad);
Write
('Telefono :');
ReadLn
(Telefono);
Write
(Dir, Elemento)
{escritura de un registro}
WriteLn
('desea otro elemento s/n');
respuesta := Upcase (Readkey)
until respuesta = ' N 1
Cise (Dir)
end.
Programa 1 5.3

1 5.8.

MANTENIMIENTO DE ARCHIVOS ALEATORIOS

L a s o p e r a c i o n e s t p i c a s e n el m a n t e n i m i e n t o d e a r c h i v o s s o n :

creacin

acceso

consulta
actualizar

1 5.8.1.

Creacin de un archivo aleatorio

C r e a r un archivo de registro de direcciones:


program Crear;
uses
Crt;
type
Direc
= record

Crear un archivo de nmeros


visualizarlo
en la pantalla.

enteros

y en el rango

program crear;
const
Nument = 1000;
type
Archnum = file of integer;
var
Nmeros : Archnum;
I
: integer;
Item
: integer;
begin
{crear un archivo de enteros}
Assign (Nmeros, 'num.dat');
Rewrite (Nmeros);
for X := 1 to Nument do
Write (Nmeros, I) ;
{salida del archivo de Nmeros}
Reset (Nmeros);

1 a 1000

y posteriormente

leerlo

588

Programacin en Turbo/Borland Pascal 7


while not Eof (Nmeros) do
begin
Read (Nmeros, Item);
WriteLn (Item)
end;
{while}
Cise (Nmeros)
end.

1 5.8.2.

Archivos
Ejemplo 1 5 . 3

Modificar los datos contenidos en el registro nmero 10 de un archivo dado Inventario,


cuyos elementos son registros de artculos de un stock, cuya variable se llama artculo.
seek (Inventario, 10);
Read (Inventario, articulo)
{lectura del registro}
. . . {modificacin de los datos contenidos en un registro}
seek (Inventario, 10);
Write (Inventario, articulo); {escritura del registro 10
modificado}

Acceso aleatorio a un archivo

Ai igual que con otras estructuras de datos, u n archivo, con frecuencia, se debe modificar
o actualizar despus de h a b e r sido creado. Se puede desear modificar u n o o m s c a m p o s
de un registro existente, b o r r a r u n registro, insertar u n n u e v o registro o s i m p l e m e n t e
visualizar los valores actuales de los c a m p o s de u n registro.
T u r b o Pascal n o as Pascal e s t n d a r nos p e r m i t e acceder y actualizar los c o m p o nentes de un archivo b i n a r i o en u n orden aleatorio. P a r a p o d e r realizar este acceso
directo se necesitan u n o s p r o c e d i m i e n t o s y f u n c i o n e s especficas q u e efecten las teclas
correspondientes:

589

15.8.3.

Funciones filepos y filesize

Filepos de vue l ve la p o s i c i n actual del a r c h i v o ( n m e r o de registro), en f o r m a de u n


e n t e r o largo (longint).
Formato

P o s i c i o n a m i e n t o en el interior de un archivo y en un registro especfico:


Filepos (nombrearch)

p r o c e d i m i e n t o seek
O b t e n c i n de la posicin de u n registro d e n t r o del archivo:

nombrerarch

variable de tipo archivo

funcin filepos
O b t e n c i n del t a m a o del archivo:

Notas

funcin filesize
Estos p r o c e d i m i e n t o s y f u n c i o n e s son especficos de T u r b o Pascal y n o estn soportados en Pascal estndar.
P r o c e d i m i e n t o seek

1. Disuelve 0 si esta al principio del atclnvo


r. 1-s igual a FileSize (,'; si el punteiu de posicion del aichivo esta al final del ai chivo [es
decir, eof (/) es truc].

Sita el p u n t e r o de posicin del archivo en el n m e r o de registro correspondiente.

FileSize devuelve el t a m a o actual del archivo ( n m e r o de registros existentes en el


archivo).

Formato

Formato
seek (nombrearch, numreg)

nombrearch
numreg

nombre del archivo (no puede ser de tipo text)


nmero de posicin del registro, sobre la base de que el primer registro es cero; si numreg es menor que 0 o mayor que n para un
archivo de n registros, se producirn resultados imprescindibles

FileSize (nombrearch)

Nota
Si el archivo esta \acio. se devuelve tero.

Ejemplo
Seek (inventario, 15)

mueve el puntero de posicin del archivo al registro 15, que


en realidad es el decimosexto registro

Ejemplo
f i l e s i z e (inventario)

devuelve 100 si tiene registros el archivo

590

Archivos

Programacin en Turbo/Borland Pascal 7


program NumerosEnteros;
uses
Crt;
type

Ejemplo 1 5 . 4
Aadir

un registro al final de un archivo existente

llamado

INVENTARIO.

{posicionado del puntero al final del archivo}


seek (Inventario, filesize (inventario));
{el procedimiento seek mueve el puntero de posicion del }
{archivo al ultimo registro actual, registro (n-1)}
Write (inventario, articulo); {aade un nuevo registro en}
{la posicion n}

14.8.4.

Lectura y escritura de archivos aleatorios

U n a vez vistas i n d i v i d u a l m e n t e t o d a s las operaciones necesarias, en el proceso de archivos aleatorios se va a explicar u n ejercicio prctico de creacin (escritura) de u n archivo
y lectura posterior, q u e se resolver con procedimientos.
Las operaciones a realizar para leer o escribir en u n archivo de acceso aleatorio (con
tipo o binario) son:
Leer

1.
2.
3.
4.
5.

Declarar el archivo.
Asignar u n n o m b r e al archivo {assign).
Abrir el archivo p a r a lectura {reset).
Leer datos del archivo {read).
Cerrar el archivo u n a vez t e r m i n a d a la lectura {cise).

Escribir/crear

1. Declarar el archivo.
2. Asignar u n n o m b r e al archivo {assign).
3. Abrir el archivo p a r a escritura (rewrite).
4. Escribir datos en el archivo (write).
5. Cerrar el archivo u n a vez t e r m i n a d a la escritura (cise).
Problema 1 5 . 2
Crear un archivo de nmeros
Anlisis

enteros y a continuacin

visualizar

los nmeros

pares.

Enteros = file of integer;


var
Fichero : Enteros;
Num
: integer;
{creacin del archivo de nmeros}
procedure Crear (var F : enteros);
var
Resp : char;
N
: integer;
begin
Assign (F, 'numeros.dat');
Rewrite (F);
repeat
Write ('introduzca un numero entero ');
ReadLn (N);
Write (F, N);
WriteLn ('Desea introducir mas nmeros S/N?')
until UpCase (Readkey) = 'Nacise (F)
end;

{lectura de un archivo de Nmeros}


procedure Leer (var F : Enteros);
var
N : integer;
begin
WriteLn ('Nmeros pares del archivo');
{posicionar el puntero en el primer registro}
Reset (F) ;
Seek (F, 0);while not Eof (F) do
{lectura secuencial del archivo}
begin
Read (F, N);
{verificar si el numero es par}
if N mod 2 = 0
then WriteLn (N : 1, ' ')
end;
Close (F)
end;
{programa principal}
begin
ClrScr;
Crear (Fichero);
Leer (Fichero)
end.

591

592

Programacin en Turbo/Borland Pascal 7

15.8.5.

Actualizar un archivo

U n a vez creado un archivo es preciso m a n t e n e r l o , o lo que es igual: tenerlo actualizado;


es decir, realizar las operaciones de
aadir
borrar
modificar
datos parciales o totales de uno o varios e l e m e n t o s del archivo.

Archivos

593

A h o r a bien, el p r o b l e m a q u e se plantea es q u e u n a vez elim in ad o s diferentes e l e m e n tos h a n q u e d a d o huecos en el archivo. C m o se p u e d e n eliminar dichos huecos? U n a
solucin sera utilizar un archivo t e m p o r a l d o n d e se graben todos los registros reales
existentes (con i n f o r m a c i n vlida).
Los pasos seran:
1. Abrir lista para lectura y aux para escritura.
2. Se lee secuencialmente lista y se van g r a b a n d o en aux todos los e l e m e n t o s existentes (un i n t e r r u p t o r d e b e r sealar si el e l e m e n t o existe/no existe).
3. Borrar el archivo lista y c a m b i a r el n o m b r e de t e m p o r a l por lista.

Aadir
Para p o d e r a a d i r datos
comprobar su existencia,
en l y n o a a d i r datos.
funcin FileSize y luego
tencia

a un archivo es preciso q u e ste exista, es decir, se necesita:


si no existe el archivo, la operacin n i c a a realizar ser escribir
Para a a d i r datos se ha de detectar el final del archivo con la
posicionarle en ese p u n t o con el p r o c e d i m i e n t o Seek. La sen-

seek (nombre-arch, f i l e s i z e (nombre~arch))


sita el p u n t e r o del archivo detrs del l t i m o e l e m e n t o existente, por lo q u e basta con
escribir en el archivo para aadir u n e l e m e n t o .
seek (nombre-arch, f i l e s i z e (nombre-arch));
,write (nombre-arch, articulo);

1 5.9.

DETECCION DE ERRORES DE ENTRADA/SALIDA (E/S)

N o r m a l m e n t e , c u a n d o un error de E / S (Entrada/Salida) sobreviene, se i n t e r r u m p e la


ejecucin del p r o g r a m a . Estos errores p u e d e n ser de diversas causas: leer un archivo sin
haberlo abierto, el usuario inserta por error el disco en otra u n i d a d , errores en disquetes,
etctera. T u r b o p r o p o r c i o n a u n sistema para tratar estas situaciones y evitar las in ter r u p ciones. L a directiva de c o m p i l a c i n {$1-} p r o p o r c i o n a u n n m e r o entero q u e indica el
c d i g o d e e r r o r c o n e c t a d o a la l t i m a o p e r a c i n de E / S ; si este c d i g o vale c e r o , la
o p e r a c i n se desarrolla sin problemas. C o n 1a a y u d a de la directiva de c o m p i l a c i n {$1-}
se deja desactivado el control de errores y se p u e d e conseguir q u e el p r o g r a m a n o se interrumpa.

S en lugar de u n e l e m e n t o desea a a d i r ms, sera necesario u n bucle while o repeat.


Ejemplos
Borrar/Modificar
El p r o c e d i m i e n t o de borrar un e l e m e n t o requiere los siguientes pasos:
1. Situarse en la posicin con seek.
2. Leer ei e l e m e n t o correspondiente.
3. Borrar/Modificar.
3.1. Modificar.
Leer el n u e v o e l e m e n t o m o d i f i c a d o (read).

Situarse en la posicin correspondiente (seek).


Escribir el n u e v o e l e m e n t o en el archivo.
3.2. Borrar.
Pulsar la tecla INTRO, con lo cual no se introduce n a d a en el e l e m e n t o y, p o r
consiguiente, se borra del archivo.

program Error_Esl;
var
F : text;
Cad : string [255] ;
begin
assign (F, 'otrofich.nom');
ReadLn (F, Cad); reset (F);
end.
Al ejecutarse este p r o g r a m a aparece el m e n s a j e
1 / 0 E r r o r 0 1 , PC = xxxx

program Error_Esl;
var
F : text;
Cad : string [255];
begin
assign (F,'otrofich.nom');
ReadLn (F,Cad)
end.
Si en el disco n o existe el archivo ' o t r o f i c h . n o m ' , se p r o d u c i r
u n error de E / S

d o n d e xxxx es u n n m e r o de cuatro dgitos (este


m e r o de error indica " f i l e not open for input")

1 / 0 E r r o r 0 1 , PC = xxxx

(este error significa "File does not


exi s t s )

L directiva de c o m p i l a c i n I ya la c o n o c e el lector en su f o r m a t o
($1 nombre_ar chivo}

594

Archivos

Programacin en Turbo/Borland Pascal 7

q u e incluye el archivo m e n c i o n a d o en su p r o g r a m a e x a c t a m e n t e c o m o si h u b i e s e tecleado el cdigo en esa posicin. En esta ocasin nos interesa el otro f o r m a t o de I. Esta
directiva se invoca s i t u a n d o u n | $ I + } o j $ I - j en su p r o g r a m a .
j $1+j
{$1-}

se desactiva el control de errores y el programa contina su ejecucin incluso despus que haya ocurrido un error de E/S
se verifican (activan) los errores en todas las operaciones de E/S

U n a vez desactivado el control de errores, se necesita u n a f u n c i n que p r o p o r c i o n e el


cdigo del error. Esta f u n c i n es IOResult:
devuelve un n m e r o entero q u e indica el
cdigo del error de la ltima operacin de E/S; si este cdigo vale cero, la o p e r a c i n se ha
desarrollado sin p r o b l e m a .
Formato

15.10.

ERRORES DE E/S BAJO

595

MS-DOS

T u r b o soporta cuatro p r o c e d i m i e n t o s p a r a m a n i p u l a c i n de subdirectorios:


g e t d i r ( i , s)

chdir (s)
mkdir (s)
rmdir (s)

Busca el n o m b r e del subdirectorio actual. El p r i m e r p a r m e t r o


u n entero q u e representa la u n i d a d : i = 0 ( u n i d a d de disco actual,
defecto), i = 1 ( u n i d a d A), i = 2 ( u n i d a d B), etc. D e s p u s de la
m a d a , la variable de c a d e n a 5 c o n t i e n e el subdirectorio actual de
unidad.
C a m b i a el subdirectorio actual al especificado p o r la variable de
d e n a 5.
Crea un n u e v o subdirectorio con el n o m b r e s.
E l i m i n a el subdirectorio de n o m b r e 5.

i es
por
llaesa
ca-

c h d i r , mkdir y rmdir p u e d e n d e v o l v e r u n e r r o r de E / S . T u r b o d e v o l v e r el e r r o r de
E / S 01 ( f i l e does not exist): si se i n t e n t a c a m b i a r a u n subdirectorio q u e no existe, se
e l i m i n a u n subdirectorio q u e n o existe o crea u n subdirectorio q u e ya existe. Por esta
causa es b u e n a idea activar la verificacin de errores con la directiva I.

IOResult

Problema 1 5 . 3
El siguiente

programa

proporciona

el usuario.

muestra

cmo verificar la existencia

de un archivo cuyo nombre

program Encontrar_Archivo;
var
F
: Text;
S
: string [255];
Resultado : integer;
begin
repeat
Write ('introducir nombre de archivo: ');
ReadLn (S);
Assign (F,S);
{$1-}
Reset (F);
Resultado := IOResult; { resultado contiene el Codigo de error }
{$1+}
if Resultado < > 0
then WriteLn {'el archivo ',S,
' no se ha encontrado')
until Resultado = 0;
Cise (F)
end.
Nota
I a funcin 10Reptil es una buena herramienta para deteccin do enotvs on la fasi vk(.lepuuieion de programas. Fs mu> uul en aportilla de archivos para deteetai su existencia,
aunque piu'de plantear ptohiemas durante operaciones rejd \ writ
Los cdigos de error devueltos p o r la f u n c i n IOResult

se listan en el A p n d i c e I.

Ejemplo
begin
{$1-}
chdir (ParamStr (1));
if IOResult o O then
WriteLn ('no se puede encontrar el directorio')
end.

15.11.

TRATAMIENTO COMPLETO
DE ARCHIVOS ALEATORIOS

Se dispone de u n archivo y a c r e a d o de registros de estudiantes de un instituto con


los siguientes c a m p o s :
nombre
: s t r i n g [40];
calle
: s t r i n g [20];
ciudad
: s t r i n g [25];
codigo postal : s t r i n g [5];
ed^
: integer;
sw
: boolean;
Realizar las opciones aadir, borrar, modificar, b u s c a r y visualizar registros, m e d i a n te p r o c e d i m i e n t o s .

596

Programacin

en Turbo/Borland

Pascal 7

Archivos

597

cerrar a r c h i v o s
Se cierran todos los archivos.
ampliar
Altas de registros.
borrar
Se busca el registro a eliminar; si existe, se elimina. Es c o n v e n i e n t e utilizar u n c a m p o
lgico S W q u e representa la ex is ten cia/n o existencia del registro
SW *- v e r d a d e r o
S W f a l s e

r e g i s t r o borrado}
registro existente}

o bien recurrir a u n a f u n c i n Posicin q u e realiza la m i s m a tarea: d e d u c i r si el registro


procesado existe.
modificar
Introduccin de n u e v o s datos en el registro que se desea m o d i f i c a r .
consultar
E x a m e n del c o n t e n i d o de u n registro; si existe el registro b u s c a d o , lo visualiza.
listadototal
Consulta c o m p l e t a de t o d o el archivo.
p o s i c i n (existir)
F u n c i n lgica q u e d e t e r m i n a si u n registro existe.
Programa completo
Describamos b r e v e m e n t e los diferentes procedimientos.

abrir
Se selecciona el archivo c o r r e s p o n d i e n t e p o r el usuario.
Se verifica su existencia tal c o m o se vio a n t e r i o r m e n t e con la a y u d a de la directiva
$1 y la f u n c i n IOResult.

program Aleatorio;
uses
Crt;
type
Cadena40
string
Estudiante
record

Nombre
Calle
Ciudad

men
Se visualizan las diferentes opciones y m e d i a n t e u n a sentencia case se llama a los
diferentes procedimientos.

[40];

Fichero

: Cadena40;
:
:
:
:
:

string [20];
string [25];
string [5];
integer;
boolean

CodigoPostal
Edad
Sw
end;
= file of E s t u d i a n t e ;

598

Programacin en Turbo/Borland Pascal 7


var
Arch

Archivos

: Fichero;

procedure PulsarUnaTecla;
var
Car : char;
begin
GotoXY (25,23);
Writeln ('pulsar cualquier tecla para continuar');
Car := ReadKey;
ClrScr
end;
{ PulsarUnaTecla }
procedure Activar (var F: Fichero);
var
Resultado : integer;
begin
ClrScr;
{$1-}
Reset (F);
Resultado := IOresult;
{$1 + }
if Resultado o 0
then Rewrite (F);
Cise (f)
end;
{ Activar}
function Posicion (N : Cadena40; var F: Fichero ) : integer
var
Registro : Estudiante;
Hallado
: boolean;
begin
Hallado := false;
Seek (F,0);
while not Eof(F) and not Hallado do
begin
Read (F,Registro);
Hallado := Registro.Nombre = N
end;
if Hallado then
Posicion := FilePos(F) - 1
else
Posicion := -1
end;
{ Posicion }
procedure Visualizar (E : Estudiante);
begin
with E do
if E.SW then
begin
GotoXY (20,5); WriteLn ('Nombre
GotoXY (20,6); WriteLn ('Calle

:', Nombre);
:', Calle);

GotoXY (20,7); WriteLn ('Ciudad


GotoXY (20,8); WriteLn ('Codigo Postal
GotoXY (20,9); WriteLn ('Edad
end;
PulsarUnaTecla
end;
{ Visualizar }

Ciudad);
CodigoPostal);
Edad)

procedure LeerRegistro (var E : Estudiante);


begin
with E do
begin
GotoXY (20,15); Write ('Nombre :'); ReadLn (Nombre);
GotoXY (20,16); Write ('Calle :'); ReadLn (Calle);
GotoXY (20,17); Write ('Ciudad :'); ReadLn (Ciudad);
GotoXY (20,18); Write ('Codigo Postal :');
ReadLn (CodigoPostal);
GotoXY (20,19);
Write ('Edad :');
ReadLn (Edad);
Sw := true
end;
PulsarUnaTecla
end;
{ LeerRegistro }

procedure ListadoTotal (var F: fichero);


var
E : Estudiante;
begin
Reset (F);
while not Eof(F) do
begin
ClrScr;
WriteLn ('Registro : ',FilePos (F) + 1
Read (F,E) ;
if E.Sw then
Visualizar (E)
else
begin
GotoXY (20,7);
WriteLn ('Registro vacio');
PulsarUnaTecla
end
end;
Cise (F)
end;
{ ListadoTotal }

599

: 1);

procedure Ampliar (var F : Fichero);


var
R, E : Estudiante;
I
: integer;
{posicion del registro en el archivo}

600

Archivos

Programacin en Turbo/Borland Pascal 7


begin
ClrScr;
GotoXY (25,2); WriteLn ('Esta Vd. en opcion de altas');
Reset (F);
GotoXY (25,4);
WriteLn ('Pulse cualquier tecla excepto - n o N -');
while Upcase (Readkey) o
'N' do
begin
GotoXY (20,13);
WriteLn ('introduzca datos del nuevo registro');
LeerRegistro (E);
I := Posicion (E.Nombre, F);
if I = -1 then
begin
I := FileSize (F);
Seek (F, I);
Write (F, E)
end
else
begin
Seek (F, I);
Read (F, R) ;
if R.Sw then
begin
GotoXY (20,21);
WriteLn ('el elemento ya existe')
end
else
Write (F, E)
end;
GotoXY (20, 21);
WriteLn ('Pulse - n - si quiere salir de la opcion altas')
end;
Cise (f)
end;
{Ampliar}

procedure Borrar (var F : Fichero);


var
E : Estudiante;
N : Cadena4 0;
I : integer;
begin
Reset (F);
repeat
ClrScr;
GotoXY (25,2);
WriteLn ('Esta Vd. en opcion de bajas');
Reset (F);
GotoXY (25, 4);
WriteLn ('Introduzca nombre del estudiante a borrar');
ReadLn (N);

601

I := Posicion (N, F);


if I = -1 then
begin
GotoXY (20, 11);
WriteLn ('No existe el nombre buscado')
end
else
begin
Seek (F, I);
Read (F, E);
if E.Sw then
begin
Visualizar (E);
E.Sw := false;
I := FilePos (F) - 1;
Seek (F, I);
Write (F, E)
end;
GotoXY (20, 11);
WriteLn ('El registro fue dado de baja')
end;
PulsarUnaTecla;
GotoXY (20, 11);
WriteLn ('Pulse - n - para salir de opcion bajas')
until UpCase (Readkey) = 'Nacise (F)
end;
{Borrar}
procedure Modificar
var
E : Estudiante;
N : Cadena40;
I : integer;

(var F:Fichero);

begin
Reset (F);
repeat
,
ClrScr;
GotoXY (25,2);
WriteLn ('Esta Vd. en opcion de modificaciones');
GotoXY (25, 4);
WriteLn ('Introduzca nombre del estudiante a modificar');
ReadLn (N);
I := Posicion (N, F);
if I = -1 then
begin
GotoXY (20, 11);
WriteLn ('No existe el nombre buscado')
end
else
begin

602

Archivos

Programacin en Turbo/Borland Pascal 7


Seek (F, I);
Read (F, E);
if E.Sw then
begin
ClrScr;
Visualizar (E) ;
GotoXY (20, 13);
WriteLn ('Introduzca nuevos datos del registro');
LeerRegistro (E);
I := FilePos (F) - 1;
Seek (F, I);
Write (F,E);
GotoXY (20, 21);
WriteLn ('Registro modificado')
end
else
begin
GotoXY (20,11);
WriteLn ('El registro fue dado de baja')
end
end
PulsarUnaTecla;
GotoXY (25, 23);
WriteLn ( 'Pulse - n - para salir de opcion de modificaciones' )
until UpCase (Readkey) = 'Nacise (F)
end;
{Modificar}
procedure Consultar (var F : Fichero);
var
E : Estudiante;
N : Cadena40;
I : integer;
begin
Reset (F) ;
repeat
ClrScr;

GotoXY (25,2);
WriteLn ('Esta Vd. en opcion de consultas');
GotoXY (25, 4);
WriteLn ('Introduzca nombre del estudiante a consultar');
ReadLn (N);
I := Posicion (N, F);
if I = -1 then
begin
GotoXY (20, 11);
WriteLn ('No existe el nombre que desea consultar')
end
else
begin
Seek (F, I);
Read (F, E) ;

603

if E.Sw then
begin
ClrScr;
Visualizar (E);
end
else
begin
GotoXY (20,11);
WriteLn ('El registro fue dado de baja');
PulsarUnaTecla
end
end;
GotoXY (20,11);
WriteLn ('Pulse - n - para salir de opcion de consultas')
until UpCase (Readkey) = 'Nacise (F)
end;
{Modificar}

procedure Men (var F: Fichero)


var
Opcion : char;
begin
repeat
ClrScr;
'Men Principal');
GotoXY (23,2); WriteLn
'1.- Ampliar elemento');
GotoXY (20,4); WriteLn
Borrar elemento');
GotoXY (20,6); WriteLn
Modificar elemento');
GotoXY (20,8); WriteLn
Consultar un elemento');
GotoXY (20,10); Writeln
Listado Total');
GotoXY (20,12); WriteLn
Salida (fin de programa)'),
GotoXY (20,14); WriteLn
'Elija una opcion');
GotoXY (24,20); WriteLn
repeat
Opcion := ReadKey
until Opcion in [ 1 1' . . ' 6 ' ] ;
ClrScr;
case Opcion of
' 1' Ampliar (F);
Borrar (F);
' 2 '
'3' Modificar (F)
4' Consultar (F)
' 5 ' ListadoTotal ( F )
end
until Opcion
end;
{ Men
begin { programa principal }
ClrScr;
Assign (Arch, 'c:alumnos.dat');
Activar (Arch);
Men (Arch)
end.

604

Programacin en Turbo/Borland Pascal 7

15.12.

Archivos

ARCHIVOS SIN TIPOS

begin
{$1-}
Assign (F,Test);
Reset (F);
Cise (F);
{$1+}
Existir := (IOResult =0) and (Test o
end;

T u r b o Pascal a d m i t e u n tercer tipo de archivo que constituye a su vez u n a h e r r a m i e n t a


potente: los archivos sin tipo.
T o d o s los archivos utilizados hasta a h o r a s u p o n e n algn tipo de estructura. Por
ejemplo, los archivos de texto s u p o n e n q u e un archivo consta d e lneas t e r m i n a d a s con
CR/LF y los archivos c o n tipos s u p o n e n q u e u n archivo c o n s t a de u n tipo particular de
estructura de datos. Si n o se c o n o c e la estructura del registro, c m o leer el archivo? La
solucin: describir el archivo c o m o u n archivo sin tipo.
Los archivos sin tipo son canales de E / S de b a j o nivel, p r i n c i p a l m e n t e utilizados para
acceso directo a cualquier archivo de disco con i n d e p e n d e n c i a del tipo y estructura.
C u a l q u i e r archivo d e disco p u e d e ser declarado c o m o sin tipo. T u r b o Pascal p e r m i t e
tratar u n archivo c o m o u n a serie de bloques sin necesidad de conocer el tipo de datos
q u e contiene. La declaracin de un archivo sin tipo o m i t e s i m p l e m e n t e el tipo del archivo

var

')

begin { programa principal }


ReadLn (Cad);
{ Cad: tipo string previamente declarado }
if Existir (Cad(1))
then
WriteLn ('el Fichero existe')
else
WriteLn ('el archivo no se ha encontrado')
end.

15.12.1.

nombre arch : file

605

Acceso a los archivos

El acceso a los archivos sin tipo se realiza con los p r o c e d i m i e n t o s


y no i m p o r t a c o m o se haya escrito originalmente el archivo. Los archivos de texto,
archivos binarios, archivos de p r o g r a m a s o cualquier otro, p u e d e n ser declarados y abiertos c o m o un archivo sin tipo.
Los archivos sin tipo tienen u n a longitud de registro por defecto de 128 bytes, y se
transfieren directamente entre la variable registro y el archivo.
El f o r m a t o de los p r o c e d i m i e n t o s Reset y Rewrite en archivos sin tipos difiere del ya
c o n o c i d o para archivos de texto y sin tipos.

BlockRead
Formatos

BlockRead (nombre_arch, buffer, bloques, resultado)


filockWrite (nombre_arch, buffer, bloques, resultado)

nombre-arch
buffer

reset
(nombre_arch, bloque)
rewrite(nombre_ arch, bloque)

bloques
bloque

BlockWrite

un nmero de tipo word

resultado

archivo sin tipo


variable de cualquier tipo de longitud suficiente para acoger los datos
transferidos
expresin que corresponde al nmero de bloques de 128 bytes a
transferir
parmetro opcional que indica el nmero de bloques que se leyeron
o escribieron realmente

Ejemplo
reset {fuente, 1)

presenta el archivo para ser ledo y especifica que la longitud de


registro es 1 byte

Programa 1 5 . 4
Funcin lgica Existir que devuelve true si el archivo existe; en caso contrario,
false. S el archivo no existe, se cierra el archivo.
var
F: file;

Los archivos sin tipo son m u c h o m s rpidos, debido a q u e los datos no necesitan ser
organizados en lneas o estructuras; son s i m p l e m e n t e b l o q u e s q u e se transfieren c o m o
u n i d a d e s entre el disco y buffer.
Las aplicaciones m s usuales de los archivos sin tipo son aquellas q u e n o se refieren
m s q u e a directorios:

devuelve

borrar u n archivo,
r e n o m b r a r u n archivo,
copiar de n u e v o u n archivo cualquiera,
c o m p r o b a r la existencia de u n archivo,

606

Programacin

en Turbo/Borland

Pascal 7

Programa 15.5
Copiar

607

Archivos

el contenido

Rename
de un archivo

en otro.

R e n o m b r a ( c a m b i a el n o m b r e ) d e u n a r c h i v o e x t e r n o .

program CopiaDeArchivos;
var
Fuente, D e s t i n o : file;
{ declarados sin tipo }
Buffer
: a r r a y [1..100] of byte;
Reg_Leidos
: integer;
begin
Assign
(Fuente, 'anterior.dat');
Reset
(Fuente, 2);
Assign
(Destino, 'nuevo.dat');
Rewrite
(Destino, 1);
BlockRead (Fuente, Buffer, SizeOf (Buffer), R e g _ L e i d o s ) ;
while Reg_Leidos
> 0 do
begin
BlockWrite (Destino, Buffer, SizeOf(Buffer), Reg_Leidos);
BlockRead
(Fuente, Buffer, SizeOf (Buffer), R e g _ L e i d o s )

Formato

rename ( ' f , nombre_archivo

')

Ejemplo 1 5.6
Renombrar

un archivo:

1. A s i g n a r u n a r c h i v o a l a v a r i a b l e a r c h i v o .
2. L l a m a r al p r o c e d i m i e n t o r e n a m e .
assign (f,
rename ( f ,

end;
Cise (Fuente);
Cise (Destino)
end.

'viejo.dat');
'viejo.nue');

Programa 1 5.6

15.13.

Realizar

BORRAR Y RENOMBRAR ARCHIVOS

archivo.

un programa

que permita

las

tareas:

l. Renombrar

un archivo.

2. Borrar

un

Demo
: file;
Pruebal, Prueba2 : string [80];
Resp
: char;
begin
repeat
WriteLn ('(R)enombrar');
WriteLn ('(B)orrar');
WriteLn ('(F)in');
WriteLn (' elegir opcion ');
ReadLn
(Resp);
Resp := UpCase (Resp);
c a s e Resp of
'R' : b e g i n
Write
('nombre d e s a r c h i v o que d e s e a cambiar

');

3. Fin

L a s o p e r a c i o n e s d e b o r r a r y r e n o m b r a r ( c a m b i a r el n o m b r e ) a r c h i v o s e s u n a o p e r a c i n
f r e c u e n t e e n la g e s t i n d e a r c h i v o s . T u r b o P a s c a l p r o p o r c i o n a d o s p r o c e d i m i e n t o s p a r a
r e a l i z a r e s t a s t a r e a s : E r a s e y Rename.
Erase
Borra un archivo externo.
Formato
[

erase (nombre_archivo)

E l p r o c e d i m i e n t o erase

n u n c a se p u e d e u t i l i z a r s o b r e u n a r c h i v o a b i e r t o . P a r a b o r r a r u n

a r c h i v o se d e b e r e a l i z a r :
1. A s i g n a r el a r c h i v o e x t e r n o a u n a v a r i a b l e d e a r c h i v o .
2.

L l a m a r al p r o c e d i m i e n t o e r a s e .

Ejemplo 1 5 . 5
Borrar

archivo

'viejo.dat'

assign (f,
erase (f)

almacenado

'viejo.dat');

en disco.

program OperacionesArchivos;
var

ReadLn
Write

(Pruebal);
('nuevo nombre del archivo

ReadLn

(Prueba2);

');

A s s i g n (Demo, Pruebal);
Rename (Demo, Prueba2);
end;
'B' : b e g i n
Write ('nombre del archivo que desea borrar
ReadLn

(Pruebal);

');

608

Archivos

Programacin en Turbo/Borland Pascal 7

15.15.

Assign (Demo, Pruebal);


Erase (Demo)
end
end { case }
until Resp = 'F'
end.

15.14.

T u r b o Pascal considera a los dispositivos externos, teclado, pantalla e impresora, c o m o si


fueran archivos, y, en consecuencia, el p r o g r a m a d o r debe tratarlos de igual f o r m a .
T u r b o Pascal soporta dos tipos de dispositivos: dispositivos D O S y dispositivos de
archivos de textos.
DOS

T u r b o d i s p o n e de u n i d a d e s lgicas conectadas d i r e c t a m e n t e al DOS, q u e son t o t a l m e n t e


transparentes. Se utilizan n o r m a l m e n t e en conexin con archivos de textos. Las u n i d a des lgicas existentes q u e son tiles en T u r b o Pascal son:
CON

LPT1, LPT2, LPT3

COMI, C0M2

ESCRITURA EN IMPRESORA

La i m p r e s o r a es u n dispositivo fsico al q u e se p u e d e acceder c o m o u n archivo de texto.


Existen dos m t o d o s para acceder a la impresora: p r i m e r o , asignar u n o de los n o m b r e s
de dispositivos D O S (LPTl, LPT2, LPT3, COMI o C0M2) a u n archivo de texto d e t e r m i n a d o y
a b r i e n d o el archivo con Reset, segundo, utilizando la u n i d a d e s t n d a r Printer.

DISPOSITIVOS EN TURBO PASCAL

Dispositivos

609

NUL

CON
Designa a la consola (teclado/pantalla); en salida, las i n f o r m a c i o n e s se visualizan en
pantalla y en e n t r a d a se leen desde el teclado. Las operaciones estn " a d a p t a d a s " (bufferise'es); eso significa q u e u n a variable de tipo buffer p e r m i t e la c a p t u r a de datos (gracias
a read o readlri), con las posibilidades de correccin habituales (teclas DEL y BACKSPACE).
LPT1, LPT2, LPT3
Dispositivos c o n e c t a d o s a los puertos de salida paralelo: impresora.

Primer mtodo
program Pruebal;
var
Impresora : Text;
begin
Assign (Impresora, 'LPTl');
Rewrite (Impresora);
{ abrir el archivo de impresora }
WriteLn (Impresora, 'salida de prueba')
end.
Segundo mtodo
P r i n t e r es u n a u n i d a d d i s e a d a p a r a facilitar el u s o de la i m p r e s o r a d e n t r o de u n p r o grama. Declara u n archivo de texto, u n dispositivo, p a r a a l m a c e n a r caracteres: LST y lo
asocia c o n la impresora. P r i n t e r debe estar d e c l a r a d a en la clusula uses
program Prueba2;
uses
Printer;
begin
WriteLn (Lst,' esta es una nueva salida')
end.
al ejecutarse el p r o g r a m a s e i m p r i m e en la i m p r e s o r a ; sta es u n a n u e v a salida.
Precaucin

COM1, COM2
U n i d a d e s lgicas asociadas a los puertos de c o m u n i c a c i o n e s serie; A U X y C O M I son sinnimos.
NUL
Ignora t o d a la operacin de escritura y p r o p o r c i o n a u n a seal de fin de archivo ( E O F ) en
cualquier lectura.

writeln ('compruebe que la impresora esta p r e p a r a d a ' ) ;


writeln ( ' p u l s e Intro para c o n t i n u a r ' ) ;
readln;
Si se envan i n f o r m a c i o n e s a la i m p r e s o r a y sta n o se e n c u e n t r a lista, la ejecucin del
p r o g r a m a se i n t e r r u m p e p o r u n m e n s a j e del D O S similar a:

Nota
i

Se p u e d e n p r o d u c i r p r o b l e m a s si la i m p r e s o r a no est e n c e n d i d a y a l i m e n t a d a con papel;


por ello, en previsin de olvidos del u s u a r i o del p r o g r a m a , d e b e r escribir en su program a m e n s a j e s de aviso c o n v e n i e n t e s al usuario.

Se puede acceda a estas unidades lgicas, asignandolas a variables asociadas a archivos de


tipo texto hahitiulcs

"Write f a u l t on LPTl, Abort, Retry or Ignore?"


Si esto le sucede, prepare la i m p r e s o r a y pulse R (de reintentar).

610

Programacin en Turbo/Borland Pascal 7

Archivos

611

Control d e la i m p r e s o r a
Es posible c a m b i a r tipos de letras, interlineado, etc., en el texto; basta para ello enviar a
la impresora una secuencia de caracteres d e n o m i n a d a de escape, cuyos valores d e p e n d e n
del tipo de impresora.
Algunos ejemplos con impresoras IBM o Epson son los siguientes:
Funcin

Secuencia de escape

Secuencia de teclas

Esc U l

* 2 7 , Ul

Esc n 5

# 27 # 78 # 5

desactivacin de salto de pgina

Esc n 0

#27#78#0

activacin negrita
desactivacin negrita

Esc E
Esc F

#27 #69
#27 #70

impresin bidireccional
1

wri te (1st, # 27, 'Ul );


salto de pgina con cinco lneas de
separacin entre un folio y el siguiente
wri te (1 s t , # 27 # 78# 5);

activacin subrayado

# 27 # 45 # 1

desactivacin subrayado

#27#45#0

Si desea aprovechar al m x i m o su impresora, le sugerimos consulte el m a n u a l de la


misma.

Esta caracterstica es m u y selectiva y su p r o f u n d i z a c i n supera los objetivos de este


p r i m e r v o l u m e n de T u r b o Pascal y p o r ello n o se presenta n i n g n e j e m p l o de puesta en
m a r c h a de la gestin d e u n i d a d e s lgicas. Si necesita esta p r o f u n d i z a c i n , d e b e r consultar el Captulo 15, Inside Turbo PascaL del m a n u a l original de Borland " T u r b o Pascal
Reference

15.17.

Cuide'

LOS ARCHIVOS COMO PARAMETROS


DE PROCEDIMIENTOS

Los p r o c e d i m i e n t o s p u e d e n tener p a r m e t r o s de cualquier tipo f i l e , pero d e b e n ser parmetros variables; n o p u e d e n ser p a r m e t r o s valor.

15.18.

ORDENACION DE ARCHIVOS

L a o r d e n a c i n de archivos sigue los m t o d o s ya c o n o c i d o s p o r el lector. E n esta seccin


v a m o s a considerar la o r d e n a c i n de u n archivo de texto (por ejemplo, n o m b r es ) ; y c o m o
m t o d o s , cualquiera de los ya vistos. Se va a suponer, c o m o se hizo en el C a p t u l o 13,
q u e los referidos m t o d o s estn g r a b a d o s en discos c o m o a r c h i v o s de i n c l u s i n , y med i a n t e la directiva $1 se van a insertar a eleccin del p r o g r a m a d o r o bien en unidades.
E n p r i m e r lugar se d e b e crear u n archivo de texto d e n o m i n a d o NOMBRES q u e c o n t e n g a
las siguientes lneas:

15,16.

ARCHIVOS DE TEXTO ASOCIADOS A UNIDADES


LOGICAS

T u r b o Pascal p e r m i t e implementar
u n i d a d e s lgicas distintas de las soportadas por el
D O S , o m e j o r las u n i d a d e s lgicas DOS. C a d a unidad lgica se asocia a un archivo de
texto. Esta propiedad a m p l a c o n s i d e r a b l e m e n t e las posibilidades de t r a t a m i e n t o de las
e n t r a d a s y salidas.
,
El usuario p u e d e definir por s m i s m o u n a u n i d a d lgica, as c o m o las funciones que
p e r m i t e n su control. T u r b o Pascal p e r m i t e definir sus propios controladores de dispositivos de archivos de texto.
U n conrolador de dispositivos de archivos de texto es un c o n j u n t o de cuatro funciones q u e realizan t o t a l m e n t e u n interfaz entre el sistema de archivos de T u r b o Pascal y
algn dispositivo. Las c u a t r o f u n c i o n e s q u e definen cada c o n t r o l a d o r de dispositivos son
Open, InOut, Flush y Cise.
La cabecera function de cada f u n c i n es:

function FunDispositivo

(f) : integer;

variable de tipo archivo de texto

Mortimer
Flanagan
Carrigan
MacDonald
Sabrina

HombresG
Martnez
Mackenna
Mackoy
^Ronaldos

y s u p o n g a q u e tiene g r a b a d o s tres archivos d e inclusin ( i n c l u d e ) sortl,


p r o g r a m a para o r d e n a r los d a t o s alfabticos del archivo n o m b r e es:
program Sort;
const
Max = 100;
type
Cadl = string [40];
Lista = array [l..Max] of Cadl;
var
L
: Lista;
N,I
: integer;
Error
: boolean;
NombreArch
: string [20];
Fichl, Fich2 : Text;
procedure LeerDatos;
{ leer registros del disco }

sort2, sort3. U n

612

Archivos

Programacin en Turbo/Borland Pascal 7


begin
WriteLn;
WriteLn ('programa para ordenar archivos de texto en disco
repeat
Write ('archivo a ordenar: ');
ReadLn (NombreArch) ;
Assign (Fichl, NombreArch);
{$1-}
Reset (Fichl)
{*!+}
until IOResult = 0;
N := 0;
repeat
N := N + 1;
ReadLn (Fichl, L[N])
until Eof (Fichl)
end;
p r o c e d u r e CrearArchivo;
{ escribir registros ordenados en disco }
var
J : integer;
begin
WriteLn;
Write
('nuevo nombre del archivo : ');
ReadLn (NombreArch);
Assign (Fich2, NombreArch);
Rewrite (Fich2);
for J := 1 to N do
WriteLn (Fich2, L[J]);
Cise (Fich2)
end; { CrearArchivo }
{$1 Sortl.pas}

{Sortl, Sort2, Sort3, segn procedimiento elegido}

begin
{ programa principal }
WriteLn;
LeerDatos;
Sortl (L,N);
CrearArchivo
end.

maestros. C u a n d o se necesita actualizar en u n gran n m e r o de elementos un archivo


maestro, el m t o d o u s u a l n o es realizar la actualizacin registro a registro, sino recurrir
a u n archivo de m o v i m i e n t o s q u e c o n t e n g a t o d a s las a l t a s / b a j a s / m o d i c a c i o n e s del
maestro.
Ejemplo 1 5 . 7
Se dispone de un archivo de registros
siguientes

(INVENTARIO)

MEZCLA DE ARCHIVOS

La mezcla o fusin (merge) de archivos es el proceso m e d i a n t e el cual dos archivos ord e n a d o s p o r el m i s m o c a m p o clave se c a m b i a n p a r a f o r m a r u n archivo o r d e n a d o m s
grande. El anlisis del p r o b l e m a es similar al ya estudiado en el C a p t u l o 13, relativo a
vectores (listas), con la diferencia de que en el caso de los archivos, la m e z c l a se realiza
en base a u n c a m p o clave.
U n a aplicacin tpica de la mezcla de archivos es actualizar archivos histricos o

sobre los libros de una librera con los

campos:
ttulo

autor

precio

cantidad

cdigo

y ordenado por el campo clave cdigo de tipo entero.


Siempre que la librera recibe un pedido de libros se debe actualizar el archivo afn
de tener el inventario de libros al da. Para resolver este problema,
los movimientos
del archivo se almacenarn
en un archivo de movimientos
PEDIDO del mismo tipo que
INVENTARIO y ordenado tambin por el campo clave cdigo.
Cada uno de los archivos INVENTARIO y PEDIDO tienen un valor centinela como final del
archivo; por ejemplo,

9999.

Anlisis
Los archivos de e n t r a d a u originales son:
INVENTARIO

PEDIDO

El archivo de salida
NUEVOINV
Si u n n m e r o de cdigo aparece en u n o slo de los archivos, entonces el registro se
copiar d i r e c t a m e n t e en el archivo NUEVOINV. Si u n n m e r o de cdigo aparece en a m b o s
archivos, e n t o n c e s los d a t o s del archivo PEDIDO se c o p i a r n e n NUEVOINV, pero el c a m p o
Cantidad escrito en NUEVOINV d e b e ser la s u m a de a m b o s c a m p o s Cantidad; es decir, la cant i d a d existente m s la n u e v a c a n t i d a d del pedido.
Los registros del n u e v o archivo d e b e n estar t a m b i n en o r d e n de n m e r o de cdigo.
La T a b l a 15.2 ilustra el resultado deseado de la mezcla de los d o s archivos.
Tabla 1 5 . 2 . Estado del inventario de la librera
Nl'KVOINV

PEDIDO

FSVtNTYRIO

15.19.

613

Codito

( antukui

Ctuh'n>

C anudad

( odu>o

2240
3145
4467
8120
9999

20
15
16
40

1820
2140
3145
8240
9999

20
12
5
6

1820
2140
2240
3145
4467
8120
8240

(anudad
20
12
20
20 (15+5)
16
40
6

614

Programacin

en Turbo/Borland

Archivos

Pascal 7

if L i b r o l n v . C o d i g o > L i b r o P e d . C o d i g o
then
begin
W r i t e (N, L i b r o P e d ) ;
Read (P, L i b r o P e d )
end
else
begin { = }
L i b r o P e d . C a n t i d a d := L i b r o P e d . C a n t i d a d +
Librolnv.Cantidad;

Algoritmo
1. A b r i r l o s a r c h i v o s I N V E N T A R I O y P E D I D O p a r a e n t r a d a ( l e c t u r a ) y N U E V O I N V p a r a s a l i d a
(escritura).
2. L e e r e l p r i m e r r e g i s t r o d e INVENTARIO y d e PEDIDO.
3. C o p i a r t o d o s l o s r e g i s t r o s q u e a p a r e c e n e n u n s o l o a r c h i v o a N U E V O I N V . S i u n r e g i s tro a p a r e c e e n a m b o s a r c h i v o s d e e n t r a d a , s u m a r los d o s c a m p o s Cantidad a n t e s
d e c o p i a r el r e g i s t r o d e P E D I D O e n N U E V O I N V .
C u a n d o e l final d e u n a r c h i v o d e e n t r a d a s e a l c a n z a ( p o r e j e m p l o , m a r c a

final

de

a r c h i v o 9 9 9 9 ) , se c o p i a e n N U E V O I N V el r e s t o d e l o t r o a r c h i v o . C u a n d o se a l c a n z a el final
d e a m b o s a r c h i v o s , se s a l e d e l b u c l e w h i l e y el r e g i s t r o c e n t i n e l a se e s c r i b e e n N U E V O I N V .
D a d a l a i m p o r t a n c i a d e e s t a o p e r a c i n , s e v a a d i s e a r u n p r o c e d i m i e n t o MEZCLA q u e
end;

p e r m i t a r e a l i z a r la m i s m a .
E l d i a g r a m a d e e s t r u c t u r a se m u e s t r a e n l a F i g u r a 1 5 . 3 .

MEZCLA

MEZCLA

mezcla INVENTARIO y
PEDIDO en NUEVOINV

Librolnv
Libro Ped
copia registro
con clave ms
pequea en
NUEVOINV.

Figura 1 5.3.

D i a g r a m a d e e s t r u c t u r a del p r o c e d i m i e n t o M E Z C L A .

W r i t e (N, L i b r o P e d ) ;
Read (A, L i b r o l n v ) ;
Read (P, L i b r o P e d )
end
{ copiar }

b e g i n { mezcla

Assign (Inventario, 'Archl');


Reset (Inventario);
Assign (Pedido, 'Arch2');
Reset (Pedido);
Assign (Nuevolnv, 'Arch3 1 );
Rewrite (Nuevolnv);
{ leemos primer r e g i s t r o de Inventario y Pedido.
Suponemos a m b o s ficheros no v a c i o s }
Read (Inventario, L i b r o l n v ) ;
Read (Pedidos, L i b r o P e d ) ;
{ copiar todos los registros del archivo Inventario y
Pedido en N u e v o l n v }
w h i l e not E o f ( P e d i d o ) or not Eof

(Inventario) do

copiar (Inventario,Pedido,Nuevolnv,Librolnv,LibroPed);
{ escribir el r e g i s t r o c e n t i n e l a en Nuevolnv }

procedure Mezcla (Archl, Arch2, Arch3 : string);


var Inventario,Pedido,Nuevolnv : BiblioLib;
Librolnv, LibroPed : Libro;
procedure Copiar ( v a r A , P , N : BiblioLib; var Librolnv, LibroPed : LibroJ
{ Compara los N m e r o s de C o d i g o de los r e g i s t r o s actuales,
escribiendo el r e g i s t r o de Codigo m a s p e q u e o en N u e v o l n v ,
leyendo a c o n t i n u a c i n el siguiente registro del a r c h i v o
al que p e r t e n e c e el r e g i s t r o escrito; Si ambos r e g i s t r o s
tienen el mismo N u m e r o de Codigo, se suman los c a m p o s
Cantidad antes de e s c r i b i r el nuevo registro, y se lee un
registro de cada a r c h i v o }
begin
if L i b r o l n v . C o d i g o < L i b r o P e d . C o d i g o
then
begin
W r i t e (N, L i b r o l n v ) ;
Read (A,Librolnv)
end
else

W r i t e (Nuevolnv, L i b r o l n v ) ;
WriteLn ('terminada la o p e r a c i o n ' ) ;
Cise (Inventario);
Cise (Pedido);
Cise (Nuevolnv)
end; { mezcla }
L a d e c l a r a c i n y el c u e r p o d e l p r o g r a m a p r i n c i p a l p u e d e n s e r :
program PruebaMezcla;
uses crt;
type
RangoCodigo = 1111... 9999;
Libro = record
Titulo
: string [20];
Autor
: string [15];
Precio
: real;
Cantidad : integer;
Codigo
: integer;
end;
Bibliolib = file of Libro;

615

Programacin

616

en Turbo/Borland

Archivos

Pascal 7

var
Archl, Arch2, Arch3 : string;

617

Los archivos tipeados (con tipos) contienen una serie de componentes accesibles individualmente, que pertenecen todos al mismo tipo o estructura de datos. Cada elemento de un archivo
con tipos es accesible directamente para lectura y escritura.

. | sustituir por procedure Mezcla }


Manipulacin de archivos aleatorios
begin { programa principal }
ClrScr;
Write ('escriba el nombre del primer archivo '
ReadLn (Archl);
Write ('escriba el nombre del segundo archivo
ReadLn (Arch2);
Write ('escriba el nombre del archivo mezcla '
ReadLn (Arch3);
Mezcla (Archl, Arch2, Arch3)
end.

1 5.20.

PUESTA A PUNTO DE PROGRAMAS

Tcnicas de programacin
Los archivos de texto q u e son m a n i p u l a d o s p o r p r o g r a m a s Pascal p u e d e n ser
t a m b i n ledos y m o d i f i c a d o s utilizando el editor.
U n archivo de texto no p u e d e ser abierto p a r a lectura y escritura al m i s m o t i e m p o .
Por consiguiente, en p r o g r a m a s q u e editen u n archivo de texto, la tcnica usual es
utilizar un archivo auxiliar.
Los archivos q u e n o son de texto se abren y n o m b r a n de igual m o d o q u e los de
texto.

RESUMEN
Cuando la cantidad de datos necesarios para sus programas es demasiado grande para almacenarlos en la memoria de la computadora, se deben utilizar archivos (files).
Turbo Pascal admite tres tipos de archivos: archivos de texto, archivos no tipeados y archivos
tipeados o de acceso directo.

El tipo de datos predefinido text permite crear archivos secuenciales de caracteres ASCII. Un
archivo secuencia! contiene una coleccin de datos o lneas de texto y est concebido para ser ledo
desde el principio al fin cada vez que el archivo est abierto. No es posible acceder directamente a
un registro.
Manipulacin de archivos de texto

Definir un variable de tipo archivo text.


Asociar la variable archivo a un nombre de archivo en disco con la sentencia assign.
El procedimiento rewrite crea un nuevo archivo y lo abre para escritura.
El procedimiento reset abre un archivo existente para lectura.
El procedimiento append abre un archivo existente para aadir datos.
Las sentencias Write y Read sirven para Salida/Entrada de datos.

Los archivos no tipeados tienen componentes de un tipo no especfico. Turbo Pascal contiene
dos procedimientos especiales, BlockRead y BlockWrite, para leer y escribir archivos sin tipos.

Funcin FileSize devuelve al nmero actual de registros del archivo abierto.


Procedimiento Seek desplaza el puntero de registros hacia una posicin dada del archivo.
Funcin FilePos indica la posicin actual del puntero de registros en el archivo.
Las sentencias Read y Write permiten leer y escribir en registros especficos.

EJERCICIOS
1. Realizar un programa que escriba su nombre en un archivo de texto. Comprobar su archivo con
un editor.
2. Crear un archivo de texto utilizando un editor y escribir tres nmeros en el archivo de texto.
Realizar un programa que lea tres nmeros y los excriba en pantalla. Ejecuar varias veces el
programa con diferentes archivos comprobando sus salidas.
3. Supongamos que ha creado un archivo de texto TEST.TXT, que contiene lo siguiente: .
5
5

64
64

75
75

Cul es la salida del siguiente programa?


program Ejercicio;
const
blanco = ' ';
var
Luis : text;
Num : integer;
Letral, Letra2 :'char;
begin
assign (Luis, 'test.txt');
Reset (Luis);
Read
(Luis, Num);
Write (Num, Blanco);
Read
(Luis, Num);
Write (Num);
ReadLn (Luis);
WriteLn;
Read
(Luis, Letral);
Write (Letral);
Read
(Luis, Letral, Letra2);
Write (Letral, Letra2);
Cise (Luis)
end.
4. Supongamos que el archivo de texto llamado Rosa contiene
a b c d e f < e o l n > g h i j k < e o l n > Imnop < e o l n >

618

Archivos

Programacin en Turbo/Borland Pascal 7

y que se declaran las variables


var Rosa
: text;
Ll, L2, B u f f e r : c h a r ;
Cul ser la salida del siguiente segmento de programa, suponiendo abierto Rosa con Reset?
Readln (Rosa, Ll, L2);
WriteLn (Ll, L2) ;
while not eoln (Rosa) do
begin
Read
(Rosa, Buffer);
Write (Buffer)
end;
WriteLn (' Ah');
5. Realizar un programa que escriba los n m e r o s l a 15 en un archivo de texto, u n o por lnea.
Ejecute el programa y a continuacin examinar dicho archivo.
6. Escribir un p r o g r a m a que lea la lista de n m e r o s del archivo del ejercicio anterior, calcule su
s u m a y visualice la suma en pantalla. (Utilizar eof.)
7. Se dispone de un archivo de texto llamado DEM01 y se desea hacer una copia de este archivo en
otro archivo l l a m a d o S E G U R I D A D .

619

6. Se dispone de u n archivo de registros, cada u n o de los cuales contiene los c a m p o s nombre,


direccin, edad, fecha de nacimiento, sexo y estado, y se quiere crear un nuevo archivo de
registros que contenga slo los nombres y edad. Asimismo se desea escribir el n o m b r e y direccin de cada persona cuyos nombres comiencen con las letras A, B o C y hayan nacido en el
mes de mayo.
7. Escribir un programa que busque en un archivo de enteros y encuentre los enteros ms grandes y ms pequeos del archivo.
8. Se dispone de un archivo maestro U S U A R I O S con registros de los usuarios de un centro de
clculo (nombre, n m e r o de identificacin, clave de acceso, lmite de recursos y recursos utilizados hasta la fecha). Se desea escribir un programa que actualice diariamente el archivo con
la actividad del centro recogida en un archivo A C T I V I D A D que contiene el n m e r o de identificacin del usuario y los recursos utilizados por la tarea realizada. A m b o s archivos estn ordenados en orden ascendente de n m e r o de identificacin.
9. Se dispone de un archivo de inventario S T O C K (campos: nombre, cdigo, cantidad, precio,
fabricante). Escribir un programa que busque un d e t e r m i n a d o artculo por el n m e r o de cdigo. Si el artculo existe, visualizar n o m b r e y cdigo; en caso contrario, un mensaje en este
sentido.
10. Al final de cada mes se produce un i n f o r m e en un banco que muestra el estado de las cuentas
de crdito de la misma. Los registros de cada cuenta se encuentran en un archivo C R E D I T O .
Escribir un programa que lea la fecha actual y produzca un i n f o r m e del f o r m a t o siguiente:
Estado Cuenta - - - 09/06/89

PROBLEMAS
1. Se crea un
y se desea
(CARTA)
reccin de

Nombre

archivo de texto llamado C A R T A y otro de nombres y direcciones llamado LISTA


escribir un p r o g r a m a q u e p u e d a ser utilizado p a r a e n v i a r cartas p e r s o n a l i z a d a s
a cada u n a de las personas del archivo LISTA. Nota. En cada carta figurar la dicada persona y u n a salutacin del tipo: Estimado/a (nombre).

2. Escribir un p r o g r a m a que permita crear un archivo inventario de los libros de u n a librera, as


c o m o calcular e i m p r i m i r el valor total del inventario. C a m p o s Registro libro: ttulo, autor,
n m e r o de cdigo, precio, cantidad.
o
3. El programa anterior se desea ampliar en el sentido de visualizar el archivo completo, o bien
consultar un registro determinado.
4. Cada vez que la librera del programa 3 recibe un pedido de libros, se introducen en un archivo
P E D I D O y luego se debe mezclar con el archivo I N V E N T A R I O , a fin de tener actualizado el
archivo. (Los dos archivos tienen el m i s m o tipo de registros.)
5. El programa de la librera se desea ampliar para cerrar una base de datos, de m o d o que pueda
responder correctamente a las siguientes preguntas:
Cuntos libros del autor x existen en stock?
Cuntos libros tienen un precio entre 3.500 y 4.500 pesetas?
Cul es el n m e r o de cdigo de "La insoportable levedad del ser"?
Cuntos libros del stock hay de precio mayor de 5.000 pesetas y m s de 10 ejemplares?
Cul es el libro m s vendido?

del cliente

Luis Garca
Jos Martnez

Nmero

de cuenta

520840
120416

Limite
crdito

Total
utilizado

40.000
85.000

22.000
765.000*

Nota:
Los asteriscos (***) indican que el cliente ya ha utilizado el 90 por 100 del crdito asignado.
11. Escribir un procedimiento para concatenar dos archivos de tipo idntico.
12. Escribir un procedimiento Mezclar que mezcle dos archivos de tipo integer, cuyos elementos
"estn en orden ascendente. Los enteros del archivo resultante deben estar tambin en orden
ascendente.

La recursividad

16

621

La comprensin del concepto de recursividad, como se ve, es difcil; trataremos de


explicar con ejemplos sencillos definiciones recursivas.

CAPITULO
Un ramo de rosas
"Es o bien una rosa (1) o una rosa j u n t o con un pequeo ramo de rosas (2)."

LA RECURSIVIDAD

Uri descendiente (por ejemplo, del Sr. Mortimer)

CONTENIDO
16.1.
16.2.
16.3.
16.4.
16.5.
16.6.
1 6.7.
16.8.
16.9.
16.10.
16.11.
16.12.
16.13.

La naturaleza d e la recursividad
El s e g u i m i e n t o d e la recursividad
Pilas
S u b p r o g r a m a s recursivos con p a r m e t r o s tipo array
La eficiencia (iteracin versus recursividad)
Recursividad indirecta: declaracin Forward
B s q u e d a binaria recursiva
Ordenacin rpida (quicksort)
Ordenacin por mezcla (ordenacin externa)
El problema de las T o r r e s de Hanoi
Recursin mutua
La recursividad, p r o s y c o n t r a s (sntesis)
P u e s t a a p u n t o de p r o g r a m a s

Una persona es descendiente del Sr. Mortimer si


(1) esta persona es un hijo del Sr. Mortimer, o
(2) esta persona es un hijo de un descendiente del Sr. Mortimer.
Obsrvese que las palabras ramo de rosas y descendiente se utilizan para definirse a s
mismas. La caracterstica importante de la recursividad es que siempre existe un medio
de salir de la definicin. En los ejemplos anteriores, la condicin 1 se denomina Salida
de la definicin (en su caso algoritmo recursivo), y la condicin 2 parte recursiva propiamente dicha y que garantiza que siempre evenualmente se alcance k Salida: cuando
el ramo est compuesto por una rosa o el descendiente es hijo del Sr. Mortimer, se termina el proceso recursivo.
En Pascal los procedimientos y funciones pueden ser definidos de modo recursivo, es
decir, pueden llamarse a s mismos. El procedimiento recursivo ms simple es:

RESUMEN
EJERCICIOS
PROBLEMAS
Un s u b p r o g r a m a (procedimiento o funcin) recursivo e s aquel que s e
llama a s m i s m o . En Pascal los p r o c e d i m i e n t o s y las f u n c i o n e s pued e n ser definidos d e m o d o recursivo. La recursividad e s una alternativa a la iteracin o repeticin, y a u n q u e en t i e m p o de c o m p u t a d o r a y
en ocupacin en memoria e s la solucin recursiva m e n o s eficiente
que la solucin iterativa, existen n u m e r o s a s s i t u a c i o n e s en las que la
recursividad e s una solucin simple y natural a un p r o b l e m a que en
c a s o contrario ser difcil de resolver. Por e s t a razn s e p u e d e decir
que la recursividad e s una herramienta p o t e n t e y til en la resolucin
d e p r o b l e m a s q u e t e n g a n naturaleza recursiva y, por e n d e , en la programacin.

1 6.1.

LA NATURALEZA DE LA RECURSIVIDAD

Existen numerosas definiciones de recursividad o recursin, algunas de las ms importantes o sencillas son stas:
1. Recursin: ver recursin (Devil's D P Dictionary).
2. Un objeto es recursivo si figura en su propia definicin.
3. Una definicin recursiva es aquella en la que el objeto que se define forma parte
de la definicin (recuerde la regla gramatical: lo definido n u n c a debe f o r m a r
parte de la definicin).

620

procedure Infinito;
begin
Infinito
end;

En cada invocacin del procedimiento se va ocupando zona de memoria hasta que


sta se agote, ya que el final del procedimiento nunca se alcanza, de hecho el procedimiento Infinito constituye un bucle sin fin. As pues, es vital controlar la recursividad de
modo que se pueda detener despus de un cierto nmero de llamadas; es decir, se
necesita una condicin de salida (un test) que debe situarse en todo procedimiento o
funcin recursiva, de modo que sta puede terminar. Existen numerosos ejemplos que
ilustran el concepto de recursividad; veamos algunos que sean significativos.

16.1.1.

Funciones recursivas

Ejemplo 1 6 . 1
Escribir la definicin del factorial de un nmero de modo recursivo.
La definicin matemtica de ni es

i __ 1

I n * (n - 1) * (n - 2) ** 1

si

si

n = 0

n>

622

Programacin en Turbo/Borland Pascal 7

as, para el caso de n = 5,

que se puede expresar tambin como


5! = 5 * 4!
y generalizando
t _ 1
- ~ |n * (n - 1)!

623

Ejemplo 1 6 . 2

5! = 5 * (5 - 1) * (5 - 2) * (5 - 3) * (5 - 4) * (5 - 5) = 5 * 4 * 3 * 2 * 1 = 120

La recursividad

si
si

n = 0
n > 0

que es una definicin recursiva, ya que contiene las dos condiciones o partes mencionadas anteriormente:
1. Condicin de salida: n = 0.
2. Parte recursiva:
ni = n * (n - 1)!
Sobre la base de esta descripcin se puede declarar una funcin recursiva.
function Factorial (n:integer):integer;
{calculo del factorial de n (ni).
Pre : n esta definida y n>=0
Post : factorial (n) = n!}
begin
if n=0
then factorial := 1
else factorial := n * factorial (n-1)
end;

La funcin est declarada slo para enteros positivos, ya que ni no existe para n < 0.
Obsrvese, sin embargo, que la funcin factorial no est bien declarada ya que cuando
n = 10, 10! = 24320, y en el caso de n = 11, se superara ampliamente el rango de los
enteros (32767). Por esta razn sera mejor definir la funcin factorial, bien de tipo word
(rango 0...2 16 - 1), bien de tipo longint (rango -2 j l ...2 3 1 ) o de tipo real.
La versin iterativa de la funcin Factorial es:

function Factorial (n: integer) : real;


var
Fact, J : integer;
begin
Fact := 1;
for J := 2 to N do
Fact := Fact * J;
Factorial := Fact
end;

Obsrvese que la versin iterativa contiene un bucle for como su estructura de control importante, mientras que la versin recursiva contiene una sentencia if. Tambin
necesita una variable local Fact en la versin iterativa para contener el producto acumulado.

Disear la funcin que representa a la serie de Fibonacci: 1,1,2,3,5,8,13,21,34,


La serie de Fibonacci se representa as:
Fib
Fib
Fib
Fib

(1)
(2)
(3)
(4)

=
=
=
=

1
1
Fib (2) + Fib (1)
Fib (3) + Fib (2)

Esta funcin se define recursivamente del siguiente modo:


rr;u t\

Fib () = | F i b ( _ i ) + Fib (n -2)

si
si

n = 0, n = 1
n > 1

La declaracin de la funcin recursiva es:


function Fibonacci (integer) : integer
{dado un numero n como parametro de entrada esta funcin calculada
el n-esimo de Fibonacci}
begin
if (n=l) or (n=2) = 2
then Fibonacci := 1
else Fibonacci := Fibonacci (n-2) + Fibonacci (n-1)
end;
{Fibonacci}
end.

Problema 1 6 . 1
Un programa que hace uso de Fibonacci es:
program VerFibonacci (input,output);
var
I,J : integer;
function Fibonacci (N: integer): integer;
begin
if (N=l) or (N=2)
then
Fibonacci := 1
else
Fibonacci := Fibonacci(N-1) + Fibonacci (N-2)
end;
begin
WriteLn ('Introduzca numero de trminos de la sucesin');
ReadLn
(J);

624

Programacin en Turbo/Borland Pascal 7

La recursividad

Write
('los primeros ', J:l,' nmeros');
WriteLn ('de la sucesin de Fibonacci son:
for I := 1 to J do
Write (Fibonacci(I):1, ' ');
WriteLn

625

function mcd (m, n : integer) : integer;


begin
{mcd}
if m mod n = 0
then mcd := n
else mcd := mcd (n, m mod n)
end;
{mcd}

');

Problema 1 6 . 2

Ejemplo 1 6 . 3
El algoritmo de Euclides para encontrar el mcd (mximo comn divisor) de dos nmeros
enteros positivos (M y N) se puede definir recursivamente.
Algoritmo de Euclides: el mcd de dos enteros es el entero mayor que divide a
ambos.
ql

Q2

q3

rl

r2

rl

r2

r3

IN

rl
I

ql

resto
I rl
q2

r2
rl

cociente

|r2

r3

q3

Cuando el ltimo resto es cero (por ejemplo, r3 = 0), el mcd es el ltimo divisor (en ese
caso, r2).
El algoritmo recursivo se puede definir con los siguientes pasos:
mcd (m, n) = s i n <= m y n divide a m.
mcd (m, n) = mcd (, m) si m <n.
mcd (m, n) es mcd (n, resto de m dividido por n).
function mcd (m, n : integer) : integer;
{encuentra el mximo comn divisor de m y n
pre : m y n >0
post : devuelve el mcd de m y n}
begin
{mcd}
if (n <= m ) and (m mod n = 0) then
mcd := n
else if m < n
then mcd := mcd (n, m)
else mcd := mcd (n, m mod n)
end;
{mcd}

Un programa que permite calcular el mcd de dos nmeros cualesquiera ledos del teclado es:
program Euclides;
var
M,N : integer;
function MCD (MI, NI : integer) : integer;
var
R : integer;
begin
R := MI mod NI;
if R = 0
then
MCD := NI
else
MCD := MCD (NI, R)
end;
begin
Writeln ('Introduzca dos nmeros enteros');
ReadLn (M,N);
Write ('El mximo comn divisor de ',M:1,' Y
if M > N
then
WriteLn (MCD (M,N))
else
WriteLn (MCD (N,M))
end.

16.1.2.

Procedimientos recursivos

Los ejemplos presentados hasta ahora son funciones recursivas. Son posibles tambin
procedimientos recursivos.
Ejemplo 1 6 . 4

Modificacin al algoritmo
El algoritmo se puede simplificar si considera que m > n.

es ');

Obtener el nmero inverso de uno dado.


254: su inverso es 542

626

Programacin en Turbo/Borland Pascal 7

La recursividad

Se genera nvirtiendo las cifras


n = 254

254
254
25
25
2

mod
div
mod
div
mod

10
10
10
10
10

= 4
= 25
= 5
= 2
= 2

procedure InversoTotal;
var
X : integer;
begin
if not eof then
begin
Read (X) ;
InversoTotal;
Write (X)
end
end;

di = 4
d2 = 5
dZ = 2

Se genera 452; as pues, el procedimiento es;


procedure Inverso (n : integer);
{pre : n >= 0
post : los digitos de n se sitan en orden inverso en la Salida}
begin
Write (n mod 10);
if n >= 10 then Inverso (n div 10)
end

Problema 1 6 . 3
Aplicacin del procedimiento Invertir: Leer un nmero entero por teclado y proporcionar
su nmero invertido.
program InvertirNumero;
{ Este programa invierte un numero entero introducido por teclado }
var
Numero : integer;
procedure Invertir (N : integer);
begin
Write (N mod 10 :1);
if N >= 10
then Invertir (N div 10)
end;

627

begin
{ programa principal }
WriteLn
('introduzca un numero entero');
ReadLn
(Numero);
Write
(Numero:!,' invertido es ');
Invertir (Numero);
WriteLn
end.

Ejemplo 1 6 . 5
Este procedimiento sin parmetros sita los valores de entrada (enteros) en orden inverso
en la Salida.

Ejemplo 1 6 . 6
Leer una palabra (una cadena) y generar su palndromo: El palndromo de Venezuela es
aleuzeneV.
Consideremos la obtencin del palndromo de una palabra leda por teclado (nmero de
caracteres y palabra).
procedure Palindromo (n : integer);
var
Sig : char;
{siguiente dato caracter}
begin
if n <= 1 then
begin
Read (sig);
Write (sig)
end
else
begin
Read (sig);
Palindromo (n-1);
Write (sig)
end
{recursividad}
end;
{palindromo}

Problema 1 6 . 4
Un programa de aplicacin del procedimiento Palndromo es:
program Alreves;
{ lee una palabra y la escribe invertida }
type
Cad255 = string [255] ;
var
Palabra : Cad255 ;

628

Programacin en Turbo/Borland Pascal 7


procedure Palndromo (var P : Cad255; N : integer);
begin
if N = 1
than
Write (P[1])
else
begin
Write (P[N]);
Palndromo (P,N - 1)
end
end;
begin
( 1 introduzca una palabra');
WriteLn
ReadLn
(Palabra);
Palndromo (Palabra, Length (Palabra))
WriteLn
end.

1 6.1.3.

Sntesis de la recursividad

La recursividad

629

Ejemplo 16.6 (Palndromo)


llamada recursiva
condicin de salida

1 6.1.4.

Palndromo (n-1)
n < 1

Tipos de recursividad

La recursividad puede ser de dos tipos:


recursividad directa (simple)
un subprograma se llama a s mismo una o ms veces directamente.
recursividad indirecta (mutua)
un subprograma A llama a otro subprograma B y sta a su vez llama al subprograma A.
Los subprogramas recursivos estudiados hasta ahora son recursivos directos, en la
seccin 16.6 analizaremos la recursividad indirecta mediante la declaracin forward.

Los subprogramas recursivos deben contener siempre las dos partes o sentencias siguientes:

1 6.2.
1 l ' n a llamada a s m i s m o (recursiva); n o r m a l m e n t e con el valor de los parmetros q u e
cambian en cada llamada
2 U n a condicion de terminacin o salida, que es la condicion que n o produce n i n g u n a

Recordemos los ejemplos citados anteriormente.


Ejemplo 16.1 (Factorial)
llamada recursiva

Factorial := n * Factorial (n-1)

condicin de salida

n= 0

Ejemplo 16.2 (Fibonacci)


llamada recursiva
condicin de salida

Fibonacci : = Fibonacci ( n - l ) + F i b o n a c c i (n-2)


n= 1o n= 2

Ejemplo 16.3 (mcd)


llamada recursiva
condicin de salida

mcd := mcd (n, m mod n)


m > = y m mod n

Ejemplo 16.4 (Inverso)


llamada recursiva
condicin de salida

Inverso (n div 10)


n < 10

EL SEGUIMIENTO DE LA RECURSIVIDAD

El seguimiento (traza) de un algoritmo es el mejor mtodo para entender y comprobar su


funcionamiento. Los algoritmos recursivos no son una excepcin, y por ello realizaremos el seguimiento de algunos ejemplos ya tratados.

Funcin Factorial
function
begin
if N =
then
else
end;

Factorial (N : integer) : word;


0
Factorial := 1
Factorial := N * Factorial (N - 1)

Consideremos el clculo del factorial para n = 3, enviado como parmetro valor


desde otro subprograma o desde el programa principal:
n=3 Llamada a F a c t o r i a l (3)
n = 0: no
F a c t o r i a l := 3 * F a c t o r i a l

(2)

n=2 Llamada a F a c t o r i a l (2)


n = 0: no
F a c t o r i a l := 3 * F a c t o r i a l

(1)

630

La recursividad

Programacin en Turbo/Borland Pascal 7


n=l Llamada a F a c t o r i a l (1)
n = 0: no
F a c t o r i a l := 3 * 2 * 1 * F a c t o r i a l

631

Funcin Fibonacci
Clculo del trmino quinto de Fibonacci: Fibonacci (5).

(0)

Fibonacci (5) =
Fibonacci (3)
Fibonacci (1)
Fibonacci (2)

n=0 Llamada a F a c t o r i a l (0)


n = 0: si
F a c t o r i a l := 3 * 2 * 1

= 1
= 1
= 2

Factorial = 6
Fibonacci (4)
Fibonacci (2) = 1
Fibonacci (3)
Fibonacci (1)
Fibonacci (2)

La representacin grfica del proceso recursivo se indica en la Figura 16.1.

=1
= 1
_2_
3

=3

Fibonacci (5) = 2 + 3 = 5

Factorial = 6

16.3.

Factorial = 2

= 2

PILAS*

Cmo realiza tcnicamente Turbo Pascal la operacin de recursividad? La implementacin de la recursividad se hace con el uso de una estructura denominada pila (stack).
Una pila es un espacio o zona de la memoria a la que se accede de un modo especial: el
primer elemento en entrar es el ltimo elemento en salir (tambin se le denomina UFO
"last-in, first-out", ltimo en entrar o llegar-primero en salir, o tambin proceso llegadoltimo servido). Su analoga ms ciara en la vida ordinaria est en la pila de platos de
una cocina, o en una pila de folios para una impresora, etc.
Turbo Pascal gestiona la memoria necesaria para la recursividad mediante zonas de
memoria tipo pila. La pila est limitada en espacio por unas direcciones de memoria fijas. Los conceptos fundamentales en una pila (Fig. 16.2) son: puntero de pila (stackpointer), operacin de meter datos en la pila (pop), operacin de 1 impi ar la pila o dejar la pila
vaca (sin elementos) y tamao o longitud de la pila (capacidad).

Factorial = 1

tamao
pila

pila
vaca

puntero
pila (p).
Figura 1 6 . 2 .

C o n c e p t o s b s i c o s d e una pila.

Factorial = 1

Figura 1 6 . 1 . S e g u i m i e n t o del algoritmo recursivo Factorial.

Pascal utiliza al menos una pila durante la ejecucin de cualquier programa para almacenar valores de variables, constantes, parmetros y direcciones de retorno (Figura 16.3.).
* En el Captulo 17 se ampliar este concepto debido a su importancia en el mundo de la programacin.

632

Programacin

en Turbo/Borland

Pascal 7

La recursividad
p

Asignacin de espacio
para una llamada
de procedimiento

Asignacin de espacio
para una llamada
de funcin

variables locales

variables locales

direccin de retorno

direccin de retorno

parmetros valor

parmetros valor

P,

begin
if n > 0
then F a c t o r i a l
else F a c t o r i a l

Asignacin de espacio en llamadas recursivas.

:= n * Factorial
:= 1;

(n-1)

como n = 0, se obtiene directamente Factorial = 1; y al encontrar el final de la funcin


Factorial se saca de la pila el ltimo elemento, 1, y el puntero de pila desciende; en la
segunda llamada a Factorial se saca el siguiente elemento de la pila, 2, y el puntero de
pila, y as sucesivamente.

Aplicacin de la juncin Factorial.

(n : integer)

: real;

begin
if n > 0
then Factorial := Factorial (n-1) * n
else Factorial := 1
end;
begin
{programa p r i n c i p a l }
WriteLn ('3! =', Factorial ( 3 ) : 1: 0)
{llamada a Factorial}
end.

16.4.

Tras las llamadas sucesivas se van almacenando las direcciones de retorno y los
parmetros valor 3, 2 1). En la primera llamada se almacena en la pila el valor 3 y la
direccin de retorno. En la segunda llamada se almacena 2 y la segunda direccin de
retorno, y as sucesivamente.

SUBPROGRAMAS RECURSIVOS
CON PARAMETROS TIPO ARRAY

Los subprogramas analizados anteriormente incorporaban parmetros de tipo simple; es


posible utilizar tipos compuestos como arrays, y aunque la filosofa de diseo es muy
similar, examinaremos diferentes problemas con arrays como parmetros.
Ejemplo 1 6 . 8

Factorial (3)

Imprimir
^

end;

Ejemplo 1 6 . 7

retorno 3

2
>

Cuando se llega al clculo de Factorial (0)

valor encontrado
de la funcin final

program fac;
function factorial

j
1

pila
vaca

Figura 1 6 . 3 .

los elementos de un vector en orden inverso con un procedimiento

*-3 * Factorial (2)

Anlisis
retorno 2

633

i
retorno 1

> 2 Factorial (1)


>

> 1 Factorial (0)


a retorno 1
1

Sea el vector A: array [l.'.n] of integer


Los elementos del vector A son: A[l], A[2], A [ 3 ] , . . . , S[n]
Los elementos de A en orden inverso son: A[n], A[n- l ] ; . . . , A[2], A[l]
Condicin de salida
n= 1
Condicin recursiva
imprimir A [n] ltimo elemento A
imprimir vector A [ 1 . . n - 1 ]

recursivo.

634

Programacin en Turbo/Borland Pascal 7

La recursividad

Algoritmo

635

Cdigo

si n = 1
entonces e s c r i b i r A (1)
sino
e s c r i b i r A [n]
e s c r i b i r el subvector A [ 1 . . n-1]

program SumaRecursiva;
type
Vector = array [1..100] of integer;
var
Lista : Vector;
N
: integer;
function Suma (var A : Vector; N : integer) : integer;
{Pre : array A y N estn definidos y n > 0}
{Post: devuelve la suma de los N elementos de A}
begin
{Suma}
if N = 1
then
Suma := A{1]
else
Suma := A[N] + Suma (A, n - 1)
end;
{Suma}
begin
{programa principal}
N
:= 4;
Lista[1] := 5; Lista[2] := 25; Lista[3] := 0; Lista[4] := 30;
WriteLn ('La suma es: 1 , Suma (Lista, 4))
end.
{programa principal}

I n v e r s o (A, n-1)

f i n_si

Programa
type
vector = array [1..100] of integer;
var
Lista : vector;
procedure Inverso (var A: vector {entrada}; n:integer {entrada});
{pre : El vector A y n estn definidos y n > 0}
{post : salida A[n], A[n ~'l]. ... / A[1]}
begin
if n = 1
then WriteLn (A[1])
else
begin
{paso recursivo}
WriteLn (A[n]);
Inverso (A, n - 1)
end
end;

Ejecucin
La suma es 60

Ejemplo 1 6 . 9
Imprimir
cursiva.

la suma de elementos de un vector A de subndices

I..n con una funcin

Anlisis
Entrada
Vector A
Salida
Suma
Suma

:
:
:
=
=

( v e c t o r A, n)
A [ l ] , A[2], A[3], . . . . A[n]
(Suma)
A[l] + A[2] + A[3] + . . . + A[n]
A[n] + Suma ( A [ l ] , A[2], . . . , A[n-1])

re-

LA EFICIENCIA (ITERACION VERSUS RECURSIVIDAD)

16.5.

Una vez vista cmo funciona la recursin, analicemos la eficiencia o eficacia de la


misma. La recursividad parece un mtodo simple para resolver problemas mediante
relaciones recursivas; sin embargo, en ocasiones se puede volver un mtodo ineficiente
ya que se realizan ms clculos que su equivalente solucin repetitiva.
Como ejemplo, y para medida de la eficiencia de los algoritmos recursivos, consideremos de nuevo la serie de Fibonacci y el algoritmo ya examinado ( f i , trmino i-simo
de la serie).
1

Algoritmo
si n = 1
entonces Suma
A[1]
sino Sumar A[n] a la suma A[1] + A[2] + . . . + A[n-1]
finsi

fl = 1

2
f2 =2

5
fi

11

= ( f i - 1) + ( f i - 2)

19 . . .
para i > = 2

Mediante una solucin repetitiva se necesitaran aproximadamente n iteraciones. En


el caso de la solucin recursiva, si consideramos Ai el nmero de veces que se llama la
funcin Fibonacci para calcular fi, se tiene:

636

La recursividad

Programacin en Turbo/Borland Pascal 7

A, = 1
A, = 1

A = 1 + A/_ + A:_j para ; > = 2


por induccin si se desea c a l c u l a r ^ se tiene
A

- i

Este nmero de llamadas para c a l c u l a r ^ es considerablemente mayor que el nmero


de iteraciones de la solucin iterativa. Por ejemplo, para calcular/^, se necesitan aproximadamente once iteraciones, mientras que una solucin recursiva necesita 278 llamadas
a la funcin. Naturalmente, la serie de Fibonacci no es conveniente generarla por un
mtodo recursivo.
La eficacia de un algoritmo recursivo viene medida por una serie de factores, entre
otros se destacan:

En ella se ve que la eficiencia es de tipo exponencial y claramente como ya se ha


comentado no se recomienda su uso, ya que para m = 31 se necesitan 2.178.309
clculos.
Estos resultados confirman las tesis anteriores relativas a la lentitud de Iqs algoritmos
recursivos. Recuerde, no obstante, las ventajas positivas de la recursividad tanto si decide aplicarlo a su problema como si no le queda otro remedio por la naturaleza del
mismo.

1 6.6.

RECURSIVIDAD INDIRECTA: DECLARACION FORWARD

Cuando un procedimiento o funcin se llama a s mismo, esta propiedad se denomina


recursividad directa. Se tiene recursividad indirecta o mutua cuando dos (o ms) procedimientos se llaman mutuamente.
Supongamos que el procedimiento P llama al procedimiento Q y viceversa, se podra
escribir:
procedure P ( . . . ) ;
... Q
;

tiempo de ejecucin,
espacio en memoria ocupado por el algoritmo,
legibilidad y facilidad de comprensin.
Desde el punto de vista del tiempo de ejecucin,Jlos algoritmos recursivos son ms
lentos y ocupan mayor espacio en memoria, con el inconveniente que puede suponer en
el caso de poca memoria disponible. Sin embargo, en ciertos problemas, la recursividad
conduce a soluciones que son mucho ms fciles de leer y comprender que su correspondiente solucin iterativa; en estos casos la ganancia en claridad puede compensar con
creces el coste en tiempo y en memoria de la ejecucin de programas recursivos. Las
definiciones recursivas se caracterizan por su elegancia y simplicidad en contraste con la
dificultad y falta de claridad de las definiciones repetitivas.
La solucin recursiva es estticamente ms agradable, y una vez acostumbrado, la
forma recursiva es normalmente ms fcil de leer y comprender que la forma iterativa.
Algunos programadores utilizan la recursividad como una herramienta conceptual: una
vez que han escrito la forma recursiva, buscan la forma de convertirla en una versin
iterativa y as ganar en eficiencia, en tiempo de ejecucin y ocupacin en memoria.
De cualquier forma, como se ver en este mismo captulo, numerosos problemas son
difciles de resolver con soluciones iterativas, y slo la solucin recursiva conduce a la
resolucin del problema. No obstante, no abuse del mtodo recursivo ms que cuando se
den las circunstancias explicadas en esta seccin.

procedure Q ( . . . ) ;
. . . Q ;

Sin embargo, este cdigo no es vlido ya que en el procedimiento P se llama al


procedimiento Q que an no ha sido definido; es decir, Q debera estar antes de P; pero
claro, si esto se realiza no se podra invocar desde Q hasta el procedimiento P. El lenguaje Pascal permite resolver este problema con la declaracin forward. La sintaxis de los
procedimientos recursivos es

cabecera del primer subprograma ;


forward;
cabecera del segundo procedimiento;
{bloque del segundo procedimiento}
nombre del primer procedimiento ;
{bloque del primer procedimiento}

Ejemplo
procedure P ( p l , p 2 , . . . ) ; forward;
procedure Q(q1, q2, . . ) ;

16.5.1.

Anlisis d e la eficiencia

Si se considera la serie Fibonacci desde el punto de vista matemtico, se obtiene la funcin de eficiencia 0 recursiva siguiente:

function B(x:integer):char;forward;
procedure A(var y : c h a r ) ;
begin

cuerpo de Q
y := B ( i ) ;

Fibonacci (n) = 0 (1.62")

637

n, n m e r o de elementos
end;

638

La recursividad

Programacin en Turbo/Borland Pascal 7


procedure P;

function B ( x : i n t e g e r ) : c h a r ;

639

Por ltimo, las cadenas de retorno producen

begin
Par (1) := f a l s e
end ;
Impar (2) := f a l s e
end ;
= false
Par (3)
end ; rapar (4) ;= f a l s e
end ;
Par (5) := f a l s e
end ;

A(c)
cuerpo de Pj

end

Ejemplo 1 6 . 1 0

pan
impar}
par}
impar}
s o l u c i o n esperada}
par}

Se desea escribir las funciones par e impar que toman un entero y devuelven un valor
lgico dependiendo de la paridad de ese entero. Disear un programa que incluya recursividad mutua (naturalmente, el algoritmo es mucho ms sencillo sin recursividad).

1 6.7.
function Par (Numero : integer) : boolean; forward;
function Impar (Numero : integer) : boolean;
begin
{ Impar }
if Numero = 1
then Impar := true
else Impar := Par (pred (Numero))
end;
{ Impar }
function Par;
begin
if Numero = 1
then Par := false
else Par := Impar (pred (Numero))
end;

Seguimiento del programa


Llamar a Par (5).

5 < >

En el Captulo 13 se examin el diseo de un subprograma para realizar la bsqueda en


una lista [array) o r d e n a d o por el m t o d o de bsqueda binaria. Reconsideremos este
ejemplo y reescribamos el subprograma de bsqueda utilizando recursividad, y recurriendo a dos estructuras muy frecuentes: a) array de enteros; b) array de registros, y como
generalizacin del mtodo en un caso utilizaremos una funcin y en otro un procedimiento.

1 6.7.1.

Funcin bsqueda

Datos de entrada:

Datos de salida:

Array ordenado A
Primero, Ultimo (ndices extremos de A)
Clave (elemento buscado)
Central
Central (entero), posicin de la clave verdadero, falso
(existe/no existe la clave buscada)

Programa

1, se e j e c u t a l a s e n t e n c i a Par : = Impar (4),

[pred (5) es 4], el control pasa ahora a la funcin Impar.


4 < > 1, se ejecuta la sentencia else Impar := Par (3),
el control pasa ahora a la funcin Par.

Las sucesivas sentencias de asignacin por las que se pasa son.


Par (5)
Impar (4)
Par (3)
Impar (2)
Par (I)

BUSQUEDA BINARIA RECURSIVA

:=
:=
:=
:=
:=

Impar (4)
Par (3)
Impar (2)
Par ( I )
false

function Busqueda (var ArLista; Max, Min:integer; Clave :


integer): boolean;
var
Central : integer;
{ elemento central del array }
begin
if Min > Max
then Busqueda := false
else
begin
Central := (Max + Min) div 2;
if A[Central] = Clave
then
Busqueda := true

640

La recursividad

Programacin en Turbo/Borland Pascal 7


else
begin
if Clave > A [Central]
then
Min := Central + 1
else
Max := Central - 1;
Busqueda := Busqueda (A, Max,Min, Clave)

end;

16.7.2.

Procedimiento BusquedaBin

Consideremos ahora un array de registros.


type
InfoEmp

end
end
{ busqueda }

record
Nombre
NumSS

string [30];
integer;
{numero de la Seguridad
Social}
real;
integer;

Salario
Edad
end
Array_Emp = array [1..100] of InfoEmp;

begin
{ programa principal }
Randomize;
for I := 1 to Mximo do
Nmeros [I] := Random(Maximo)

Lista : Array_Emp;

Parmetros de entrada
end.
Li s t a
Clave
Pri mero, U11 i mo

Programa
procedure BusquedaBin (var Lista: Array_Num; var Indice: integer
Primero, Ultimo, Clave : integer);
var
Central : integer;
{ elemento central del array }
begin
if Primero > Ultimo
then Indice := 0
else
begin
Central := (Primero + Ultimo) div 2;
if Clave = Lista[Central]
then
Indice := Central
else
begin
if Clave > Lista[Central]
then
Primero := Central + 1
else
Ultimo := Central - 1;
BusquedaBin (Lista, Indice, Primero, Ultimo,Clave)
end
end
end;
{ busqueda }
begin
{ programa principal }
Randomize;
for I := 1 to Mximo do
Nmeros [I] := Random(Mximo)
end.

(numero de Ia seguridad social buscado)


(lmite del array - ndices-)

Parmetros de salida
I n d i c e ( p o s i c i o n que ocupa el numero de la SS buscado, NumSS)

Programa
procedure BusquedaBin (var Lista:ArrayEmp; var Indice: integer;
Primero, Ultimo:integer; clave:integer);
var
Central : integer;
begin
if Primero > Ultimo then
Indice := 0
else
begin
Central := (Primero + Ultimo) div 2;
if Clave = Lista [ Central ]-. NumSS then
Indice := Central
else
if clave < Lista [Central].NumSS
then
begin
{busqueda en la primera mitad}
Ultimo := Central-1;
BusquedaBin (Lista, Indice, Primero, Ultimo,Clave
end
else
begin
{busqueda en la segunda mitad}

642

La recursividad

Programacin en Turbo/Borland Pascal 7


Primero := Central + 1;
BusquedaBin (Lista, Indice, Primero, Ultimo, clave)

23

end
end
{else}
end
{BusquedaBin}

1 6.8.

17

31

13

15

elegir un elemento del array denominado pivote,


dividir o partir el array original en dos subarrays o mitades (sublistas), de modo
que en una de ellas estn todos los elementos menores que el pivote y en la otra
sublista todos los elementos mayores que el pivote;
las sublistas deben ser ordenadas, independientemente, del mismo modo, lo que
conduce a un algoritmo recursivo.

15

17

31

15

19

26

21

19

13

23

26

31

23

26

31

23

26

31

23

26

5. El proceso se repite.
9

15

13

[ID

17

La eleccin del pivote es arbitraria, aunque por comodidad es usual utilizar el trmino central de la lista original, o bien el primero o ltimo elemento de la misma.
Como ejemplo ilustrativo de la divisin de una lista en dos sublistas, consideremos la
siguiente lista de enteros:
17

26

4. Se intercambian los elementos apuntados por I y J y a continuacin se incrementan


en uno los contadores I, J.

Uno de los mtodos ms rpidos y ms frecuentemente utilizado en ordenacin de arrays


es el conocido como ordenacin rpida (QuickSort). Fue inventado por C. H. Hoare, y la
cantidad de cdigo necesario es sorprendentemente pequeo comparado con la excelente velocidad que proporciona.
La idea bsica de la ordenacin rpida de un array (lista) es:

31

19

ORDENACION RAPIDA (QUICKSORT)

23

21

643

15

nn

17

13

19

Elijamos el elemento pivote; supongamos el trmino central, 21.

19

pivote

21

23

31

17

21

19

13

15

26
19

un

26

J=9

6. En el momento en que J > I, se ha terminado la particin. Se han generado dos


sublistas, que tienen las propiedades citadas: la primera sublista, todos los elementos
menores o igual a 20, y en la segunda todos los elementos mayores que 20.

2. A continuacin se establecen dos punteros en el array I o J. El primer puntero apunta


al primer elemento. Por consiguiente, 1= 1. El segundo puntero apunta al ltimo
elemento y, por tanto, J = 9 (noveno elemento).
23

1 =

31

17

21

19

13

15

3. Mientras I apunte a un elemento que sea menor que 20, se incrementa el valor de I en
1, hasta que se encuentre un elemento mayor que el pivote. A continuacin se realiza
la misma tarea con el puntero J, buscando un elemento menor que 21, y mientras no
lo encuentra se decrementa J en 1.

15

13

17

Sublista izquierda
9

15

13

17

Sublista derecha
19

21

31

23

26

04-4

La recursividad

Programacin en Turbo/Borland Pascal 7


Programa

S i n t c t i c a m e n t e h a b l a n d o , si el a r r a y o r i g i n a l es a
a [le] <= 2 0

for k = 1..I - 1
( f c = 1..5)

a [k] > 20

Si se u t i l i z a J c o m o n d i c e final d e la p r i m e r a s u b l i s t a , se t i e n e :
1..J

(9

Sublista derecha

I..N

([21]

15

13
31

17
23

19)
procedure Rpido (var A: Enteros; N : integer);

26)

7. L a o r d e n a c i n d e las s u b l i s t a s i m p l i c a el m i s m o p r o c e s o q u e a n t e s , e x c e p t o q u e los
n d i c e s e n el c a s o d e la s u b l i s t a s o n (1..5) y (6..9). L o s p a s o s e n el c a s o d e la s u b l i s t a
izquierda son:
Sublista
15

izquierda
13

Sublista

izquierda

Sublista

15

13

17

Sublista

111

17

1.
2.
3.
4.

Sublista
9

15
t
I
Algoritmo

19

17

de ordenacin

izquierda
17

19

112

13

9
15
t
I

Sublista

11

izquierda
13

15

1 ordenada
17

19

19

rpida

I n i c i a l i z a r I a Primero ( p r i m e r ndice del array)


I n i c i a l i z a r J a Ultimo (ultimo
ndice del array)
S e l e c c i o n a r el elemento p i v o t e ( t e r m i n o Central)
Central
A [(Primero + Ultimo) div 2]
repetir
4.1. mientras A[I] < Central hacer
I 4- I + 1
4.2. mientras A[I] > Central hacer
J
J - 1
4.3. si I < = J entonces I n t e r c a m b i a r ( A [ I ] ) , A[J] hasta-que
J <1
hasta-que I > J

5.
6.

rpida

program TestRapido;
type
Enteros = array [1..100] of integer;
var
Lista : Enteros;
K
: integer;

for k J + 1 . . N to
(A: = 6..9)

Sublista izquierda

ordenacin

si J > Primero , 11 amar al p r o c e d i m i e n t o P a r t i r , para di vi di r 1 a sub i s t a


i z q u i e r d a [Primero . . J ]
si I < Ultimo, llamara al procedimiento P a r t i r , para d i v i d i r la s u b l i s t a derecha
[J . .Ultimo]

12

procedure Partir (Primero, Ultimo : integer);


var
I, J
: integer;
Central : integer;
procedure Intercambiar (var M,N : integer);
var
Aux : integer;
begin
{ Intercambiar }
Aux := M;
M := N;
N := Aux
end;
{ Intercambiar }
begin { Partir }
I := Primero;
J := Ultimo;
{ encontrar Elemento pivote (central) }
Central := A [(Primero + Ultimo) div 2);
repeat
while A[I] < Central do
I := I + 1;
while A[J] > Central do
J := J - 1;
if I <= J then
begin
Intercambiar (A[I], A[J]);
I := I + 1;
J := J - 1
end
{ if }
until I > J;
if Primero < j
then Partir (Primero, J);
if I < Ultimo
then Partir (I, Ultimo)
end; { Partir }
begin
{Rpido}
Partir (1, N)
end;
{Rpido}

645

646

Programacin en Turbo/Borland Pascal 7


{ programa principal }
begin
{ lectura de 100 enteros aleatorios }
for K := 1 to 100 do
begin
Lista [K] := Random (1000);
Write (Lista [K] :8)
end;
WriteLn;
{ llamada al procedimiento Rpido }
Rpido (Lista, 100);
{ escritura de la lista ordenada }
for K := 1 to 100 do
Write (Lista [K] : 8];
WriteLn
end.

1 6.8.1.

i-a i ctu/ siviudu

3. Ordenar la sublista derecha.


4. Mezclar las dos sublistas juntas.
Ejemplo 1 6 . 1 1
Ordenar por mezcla la lista.
9

10

El proceso consiste en dividir la lista en dos mitades y cada una de las mitades en otras
mitades. Este proceso se repite hasta que cada sublista contiene, cada una, una entrada,
segn se aprecia en el grfico.

Anlisis de la ordenacin rpida

El mtodo de ordenacin rpida es el ms veloz de los conocidos. El nico inconveniente de este mtodo es la cantidad de memoria que se requiere en la pila. Caso de tener
problemas de memoria, deber realizar pruebas para evitar errores en ejecucin. En este
caso le recomendamos utilizar el mtodo de Shell.
Si se supone que la lista se divide siempre en dos partes iguales, entonces, despus de
la d-sima divisin de la lista, se tendrn 2d partes. El nmero de iteraciones del procedimiento particin (partir) es 0 (n) para todas las partes. Como haba log 2 divisiones, el
algoritmo requerir 0 (n * log 2 ).

16.9.

ORDENACION POR MEZCLA (ORDENACION EXTERNA)

Todos los algoritmos de ordenacin en ste y en el Captulo 13 son mtodos de ordenacin interna-, es decir, el conjunto completo de elementos a ordenar se deben almacenar
en memoria principal. En numerosos problemas de tratamiento de datos, el conjunto de
datos es demasiado grande para almacenarse en memoria principal (no caben) y deben
almacenarse en memoria externa. Para ordenar estas colecciones de datos (los archivos)
se requieren algoritmos de ordenacin externa. Un mtodo muy popular y eficiente es el
conocido como ordenacin por mezcla (mergesort).
Como su nombre sugiere, la idea bsica de la ordenacin es la mezcla de archivos ya
ordenados. La fdosofa de la mezcla ya la conoce el lector del Captulo 13, la diferencia
reside en que en este caso los archivos estarn ordenados por un campo clave determinado. Como la mezcla de archivos es anloga a la mezcla de listas, consideremos por
facilidad de compresin el algoritmo de ordenacin por mezcla de listas.
Algoritmo
1. Dividir la lista en dos mitades.
2. Ordenar la sublista izquierda.

La mezcla comienza con las sublistas de un solo elemento, que se mezclan en sublistas ms grandes cuyos elementos estn ya ordenados, y-el proceso contina hasta que se
construye una nica lista ordenada.

648

La recursividad

Programacin en Turbo/Borland Pascal 7


var
Aux : ListaEnteros;
X, Y, Z : integer;
begin
{ Mezcla }
X := Ida;
Y := PuntoCen + 1;
Z := X;

El d i a g r a m a d e m e z c l a se i l u s t r a as:

Primero

{ bucle para mezclar las sublistas }


while ( X <= PuntoCen) and ( Y <= Dcha) do
begin
if Lista [X] <= Lista[Y]
then
begin
Aux [Z] := Lista [X];
X
:= X + 1
end
else
begin
Aux [Z] := Lista [Y];
Y
:= Y + 1
end;
Z := Z
end;

' Ultimo

El p r o c e d i m i e n t o d e ordenacin por mezcla se d i s e a c o n a y u d a d e la r e c u r s i v i d a d p a r a


d i v i d i r las l i s t a s y o r d e n a r l a s s u b l i s t a s ; p o s t e r i o r m e n t e se l l a m a a u n p r o c e d i m i e n t o
M e z c l a s i m i l a r al e s t u d i a d o e n el C a p t u l o 13.
Algoritmo

OrdMezcla

1. si Primero < Ultimo, e n t o n c e s {ndices de l a l i s t a o r i g i n a l }


1.1. Central-(Primero + Ultimo) div 2 punto de d i v i s i n para l a p a r t i c i n }
1.2. Llamar a OrdMezcla a [ P r i m e r o . . C e n t r a l ]
1.3. Llamar a OrdMezcla a [ C e n t r a l + 1 . . U l t i m o ]
1.4. Mezclar a [ P r i m e r o . . C e n t r a l ] con a [ C e n t r a l + 1 . . U 1 t i m o ]

#>

El p r o c e d i m i e n t o OrdMezcla ( m e r g e s o r t ) es u n p r o c e s o r e c u r s i v o q u e se l l a m a a s
m i s m o p a r a o r d e n a r la s u b l i s t a i z q u i e r d a y a c o n t i n u a c i n la s u b l i s t a d e r e c h a , y u n a v e z
o r d e n a d a s as d o s sublistas se l l a m a al p r o c e d i m i e n t o Mezcla.
procedure OrdMezcla (var A : ListaEnteros; Primero, Ultimo :
integer);{procedimiento recursivo para ordenar la sublista
A[Primero..Ultimo]}
var
Central : integer; { ndice del ultimo elemento de la sublista
derecha }
procedure Mezcla (var Lista : ListaEnteros; Ida, Dcha, PuntoCen
: integer);
mezcla la sublista ordenada Lista [Ida] a Lista [PuntoCen]
con la sublista ordenada Lista [PuntoCen +1] a Lista [Dcha] }

{ bucle para copiar elementos restantes, si existen }


while X < PuntoCen do
begin
Aux [Z] := Lista [X];
X
:= X + 1;
Z
:= Z + 1
end;
while Y < Dcha do
begin
Aux [Z] := Lista [Y];
Y
:= Y + 1;
Z
:= Z + 1
end;
{ copiar Aux en Lista }
for X := Ida to Dcha do
Lista [X] := Aux [X]
end; { Mezcla }
begin
{ OrdMezcla }
if Primero < Ultimo
then Central := (Primero + Ultimo) div 2;
OrdMezcla (Lista, Primero, Central);
OrdMezcla (Lista, Central + 1, Ultimo);
Mezcla
(Lista, Primero, Ultimo, Central)
end; { OrdMezcla }

649

650

Programacin

16.10.

en Turbo/Borland

Pascal 7

La recursividad

EL PROBLEMA DE LAS TORRES DE HANOI

Un caso tpico de resolucin de un problema con un mtodo recursivo es el juego de


nios conocido como Torres de Hanoi (segn leyendas inventado en la antigua civilizacin tibetana).

Se dispone de tres postes (1, 2, 3) con soportes de madera (varillas de alambre o similar)
y un juego de discos de diferentes tamaos (el nmero de ellos se leer en el programa
principal) que se sitan en el primer poste. El disco de mayor t a m a o (dimetro) se sita
en el fondo y el ms pequeo en la parte superior. El juego consiste en mover los discos
del poste 1 al poste 3 de acuerdo a las siguientes reglas:
1. Slo un disco se puede mover a la vez.
2. U n disco nunca puede estar encima de otro disco con un dimetro ms pequeo.
3. Un disco siempre debe estar en u n o de los postes (excepto cuando se est moviendo).
Anlisis
El problema a primera vista parece simple, pero su solucin es francamente difcil y slo
la solucin recursiva facilita la resolucin. Tres, cuatro discos son imaginables, 64 (las
leyendas citan esta cifra como la propuesta de un rey tibetano a sus sbditos, al estilo del
Situacin
inicia1

rl
r_
i

(3 discos)

Mover dos (3 - 1) discos desde el poste 1 hasta el poste 2.


Mover el disco ms grande desde el poste 1 hasta el poste 3.
Mover los dos discos desde el poste 2 hasta el poste 3 utilizando el poste 1.
Algoritmo

(n discos)

Mover n - 1 discos desde 1 hasta el 2 utilizando el poste 3.


Mover el disco restante desde 1 hasta el 3.
Mover la torre de n - 1 discos desde el poste 2 hasta el poste 3 utilizando el poste
Este modelo de solucin es recursivo.
p r o g r a m Hanoi;
type
Poste = 1..3;
Pos
= l..Maxint;
var
N u m D i s c o s : Pos;
p r o c e d u r e M o v e r T o r r e (N : Pos; Uno, Dos, Tres : Poste);
p r o c e d u r e M o v e r D i s c o (Desde, H a s t a .-Poste) ;
begin
Write
WriteLn
end;

('mover un disco d e s d e el p o s t e
(' hasta el poste ',hasta :1)

then MoverDisco
else
begin

Poste 1

Poste 2

Poste 3

Situacin
finaI

( N - 1 , Uno, Tres, Dos);


(Uno, Tres);

MoverTorre

(N-1,

Figura 1 6 . 4 .

T o r r e s d e Hanoi.

Poste 3

Dos, Uno, Tres)

end
end;

WriteLn
ReadLn
Poste 2

(Uno, T r e s )

MoverTorre
MoverDisco

{ programa principal
begin

Poste 1

', desde

begin
if N = 1

tambin famoso problema del tiempo necesario para llenar un tablero de ajedrez en
progresin geomtrica) es prcticamente inimaginable y casi imposible, sin solucin recursiva.
Veamos una solucin con tres discos y luego decidiremos por induccin la solucin
para n discos (Fig. 16.5).
Algoritmo

Definicin del problema

651

('introduzca numero de d i s c o s en juego


(NumDiscos);

Write
('Para ', N u m D i s c o s :1, ' d i s c o s ' ) ;
W r i t e L n (' los m o v i m i e n t o s s u c e s i v o s son: ');
M o v e r T o r r e (NumDiscos, 1, 2, 3)
end.

');

:1);

652

La recursividad

Programacin en Turbo/Borland Pascal 7


1

653

Ejecucin
Mover dos discos
al poste 2

introduzca numero de d i s c o s en juego


4
Para 4 discos los m o v i m i e n t o s sucesivos son:
mover un disco d e s d e el p o s t e 1 hasta el poste
mover un disco d e s d e el p o s t e 1 hasta el poste
m o v e r un disco d e s d e el p o s t e 2 hasta el poste
m o v e r un disco d e s d e el p o s t e 1 hasta el poste
mover un disco d e s d e el p o s t e 3 hasta el poste
mover un disco d e s d e el p o s t e 3 hasta el poste
m o v e r un disco d e s d e el p o s t e 1 hasta el poste
mover un disco d e s d e el p o s t e 1 hasta el poste
mover un disco d e s d e el p o s t e 2 hasta el poste
m o v e r un disco d e s d e el p o s t e 2 hasta el poste
m o v e r un disco d e s d e el p o s t e 3 hasta el poste
mover un disco d e s d e el p o s t e 2 hasta el poste
mover un disco d e s d e el p o s t e 1 hasta el poste
mover un disco d e s d e el p o s t e 1 hasta el poste
m o v e r un disco d e s d e el p o s t e 2 hasta el poste

Mover disco
grande del poste
1 al poste 3

2
3
3
2
1
2
2
3
3
1
1
3
2
3
3

Anlisis de las Torres de Hanoi

Mover dos discos


del poste 2
al poste 3

El nmero de movimientos H() para una torre de n discos se calcula as:


H (i) = i
H(n) = 1 + 2 H ( n - l )

(n > 1)

con lo que se puede deducir


H(n) = 2 " - l

para n > = 1

Para una torre de 4 discos los movimientos son 15 y para una torre de 64 discos
es 2 6 4 - 1 = 10" (Situacin inimaginable!).
En este problema el gran nmero de movimientos de disco se produce por el problema en s y no por la recursividad como suceda en la versin recursiva de Fibonacci.

16.11.

RECURSION MUTUA

La recursin m u t u a es aquella propiedad en la que un programa contiene dos procedimientos Pl y P2 tales que cada uno de ellos incluye una llamada al otro. En el caso de
Turbo Pascal se requiere que u n o de los procedimientos tenga una declaracin forward.
Una aplicacin prctica que contiene recursin m u t u a es TestRecMutua.

Figura 1 6 . 5 .

M o v i m i e n t o s s u c e s i v o s d e las T o r r e s d e H a n o i (n - 3).

program TestRecMutua;
{Contiene los p r o c e d i m i e n t o s recursivos Leer y r e c h a z a r )
var
Resp : char;

654

Programacin en Turbo/Borland Pascal 7

La recursividad

1. En primer lugar, no utilice nunca la recursividad, a menos que tenga un medio


para terminar las llamadas recursivas. El programador debe tener la seguridad de
que en los datos utilizados existe al menos uno que cumpla la condicin de terminacin.
2. Si un proceso se puede definir en trminos ms simples en funcin del mismo,
como es el caso de sumas, factoriales, etc., se debe considerar la recursividad.
3. El nmero de pasos de un programa se puede reducir considerablemente utilizando un proceso recursivo. De igual modo, el diseo del programa se puede simplificar considerablemente. Existen problemas en los cuales la solucin recursiva es la
idnea; por ejemplo, el problema de las Torres de Hanoi o el recorrido de rboles
(Captulo 17).
4. Cada llamada recursiva requiere la asignacin de espacio de memoria (en la pila)
para todas las variables locales, parmetros valor y la direccin de retorno. Por
tanto, cada llamada utiliza memoria, y si existen limitaciones en memoria central,
esto puede suponer una seria limitacin.
5. Si no existe una ventaja clara para utilizar recursividad, no la utilice. Por el contrario, si la definicin del problema es inherentemente recursiva, entonces la solucin recursiva debe ser considerada preferentemente.
6. Si en un proceso las sucesivas llamadas a un procedimiento suponen guardar
valores de variables en cada etapa, que posteriormente deben ser procesados en
orden inverso, es aplicable en estos casos, normalmente, la recursividad. La razn
es la semejanza del problema con la definicin de una pila.

procedure Rechazar (var Resp : char); forward;


{visualiza un mensaje de respuesta no aceptable y llamada
al procedimiento Leer;
procedure Leer (var Resp : char);
{Fija el valor de Resp a 'S' o 'N' dependiendo de lo que el
usuario escribe. Repite el proceso hasta que el usuario
teclea uno de los dos caracteres. Es recursivo mutuamente
con Rechazar}
begin
WriteLn ( * S' para Si o N para ' N ' ) ;
ReadLn (Resp),
if not (Resp in [ ' S ' , ' N ' ] then
Rechazar (Resp),
end;
procedure Rechazar (var Resp : char);
begin
WriteLn (resp, 'no es una respuesta aceptable');
Leer (Resp);
end;
begin
{programa;
WriteLn ('Esto es una prueba');
Leer (Resp);
WriteLn ('El valor de Resp es', Resp);
WriteLn ('Fin de la prueba');
end.

16.13

Una salida de la ejecucin de este programa es


Esto es una prueba
S para Si o N para No
s
no es una respuesta aceptable
S para Si o N para No
Visto
V no es una respuesta aceptable
S para si o N para No
S
El valor de Resp es S
Fin de la prueba

16.12.

655

PUESTA A PUNTO DE PROGRAMAS

Tcnicas de programacin

LA RECURSIVIDAD, PROS Y CONTRAS (SINTESIS)

Aunque en la seccin 16.5 se han analizado ya las ventajas e inconvenientes de la recursividad frente a la iteracin, sintetizamos en este apartado los conceptos fundamentales
y describiremos nuevamente los pros y contras de esa potente herramienta llamada
recursividad, junto con pautas para la eleccin adecuada del mtodo recursivo o reiterativo.

Las funciones y procedimientos recursivos se pueden utilizar cuando los datos del
problema estn organizados en una estructura de datos que se define recursivamente. Si un algoritmo no recursivo se puede obtener y es menos complejo que el
recursivo, es normalmente mejor utilizar la versin no recursiva.
Cuando se escriben procedimientos o funciones recursivas, se deben verificar siempre para comprobar que el procedimiento no produce recursin infinita.
El problema ms frecuente con un procedimiento/funcin recursiva es que puede
no terminar adecuadamente. Por ejemplo, si la condicin de terminacin no es
correcta o incompleta, entonces el procedimiento puede llamarse a s mismo indefinidamente o bien hasta que se gaste toda la memoria disponible.
Un error en tiempo de ejecucin (stack overflow) indica que no se ha terminado el
procedimiento recursivo.
Asegurarse de que cada posible caso de recursin tiene una condicin de terminacin.

656

Programacin en Turbo/Borland Pascal 7

La recursividad
6. Cul es la salida del siguiente programa?

RESUMEN
La recursividad es una herramienta de programacin m u y potente que puede utilizar T u r b o
Pascal; es la propiedad por la cual u n subprograma puede llamarse a s m i s m o para realizar u n a
tarea. T u r b o Pascal permite el diseo de procedimientos y funciones recursivos.
La tcnica recursiva es de difcil conceptualizacin. Sin embargo, un algoritmo recursivo se
escribe con un cdigo ms simple y corto que su equivalente repetitivo. Por ejemplo, c o m p a r e los
algoritmos de ordenacin rpida y bsqueda binaria en a m b o s mtodos.
El uso correcto de la recursividad debe ser considerado con detenimiento. En caso de utilizar la
recursin, el programador debe tener s u m o cuidado de incluir, en su cdigo, condiciones de
terminacin a fin de detener las llamadas recursivas. Si no es as, fcilmente se convierte en un
bucle infinito.

EJERCICIOS
1. Disear una funcin recursiva que permita multiplicar dos n m e r o s enteros m y n.
2. Encontrar los errores de la siguiente definicin de funcin recursiva:

35

68

13

46

procedure Cuenta (N : integer)


begin
if N = 1
then
WriteLn ('Hurtado')
else
begin
Write ( ' vos');
Cuenta ( N - 1 )
end
end;
{Cuenta}
begin
{Demox}
Cuenta (3)
end
7. Escribir una funcin recursiva que calcule la potencia de enteros:
(x : real, n : entero)

8. Cul es la salida del siguiente programa?


program EjercicioTest;
function Flor (n : integer) : integer; {n >= 0}
begin
if n = 0
then Flor := n * Flor (n-1)
end;

3. Describa el algoritmo QuickSort para los n m e r o s


23

program Demox;

x"

program Ejemplo_Recursividad;
function recur (var x : integer);
begin
if x < 1 then
recur (x) := 1
else
recur (x) := 2 * recur (x - 1)
end
{ recur }

46

657

32

23

56

40

4. Escribir las funciones, una recursiva y otra no recursiva, tal que dado el entero positivo x
devuelva true (verdadero) si y slo si x es una potencia de 2.
*

begin
{EjercicioTest}
WriteLn (Flor (4))
end.
{EjercicioTest}
9. Disear un programa que calcule recursivamente la s u m a de N nmeros enteros.
10. Escribir u n programa recursivo que calcule la s u m a de los N primeros nmeros naturales.

5. Qu hace la siguiente funcin?


function Md (Numl, Num2 : RangoEnt) : integer;
{ RangoEnt es del tipo l..Maxint }
begin
if Numl < Num2
then
Md := Numl
else
if Numl = Num2
then
else
Md := Md (Numl, _Num2, Num2)
end;
{Md}

PROBLEMAS
1. Escribir el inverso de un n m e r o entero dado (1234, inverso 4321).
2. Escribir u n a funcin recursiva que calcule la suma:
1 + 2 + 3 + + (n - 1) + n
3. Escribir una funcin que determine si una cadena de caracteres es un palndromo (un palnd r o m o es un texto que se lee igual en los dos sentidos: Ana).

658

Programacin en Turbo/Borland Pascal 7

La recursividad

4. Escribir una funcin recursiva que calcule C(m. n): el n m e r o de combinaciones de m elementos tomados en n.
C(m, n) = Cm, n

mi
ni (m - ri)l

5. Escribir un subprograma recursivo que liste todos los pares de enteros positivos que son la
suma de un n m e r o dado. Por ejemplo:

(no se pueden repetir las parejas 6 + 1 y 1 + 6)

Frmula del inters compuesto


C = C 0 * ( 1 + r/100)"

+ r/100)
7. Realizar un subprograma recursivo que permita el clculo de la funcin de Ackerman

A(m, n):
para
para
para

m =0
= 0
m > 0, n > 0 y entero

8. Escribir un programa que llame a una funcin recursiva para encontrar ia suma de los enteros
pares hasta N.
S u m a pares = 2 + 4 + + (N - 2) + N
9. Encontrar una frmula para el n m e r o de veces que un anillo se transfiere de un alambre al
otro en la Torre de H a n o i con n anillos. Calcular el valor para n = 5, 10 y 20.
10. Escribir un subprograma que liste todos los pares de subconjuntos de un c o n j u n t o dado de
letras. Por ejemplo:
['M\ 'P\ 'R\ T ' ]

buscar el elemento ms p e q u e o y situarlo en primera posicin;


clasificar el resto de la lista.
14. Situar ocho reinas sobre un tablero de ajedrez de m o d o que ninguna pueda ser amenazada por
otra.

16. Escribir un programa recursivo que permita contar las palabras de una frase.

6. Escribir un procedimiento recursivo que determine el capital C obtenido, situando el capital C 0 a inters c o m p u e s t o durante n aos al inters anual r (expresado en porcentaje).

n + 1
A ( m , n ) - \ A(m - 1,1)
A ( m - 1,A(m,m - 1)

13. Escribir un procedimiento recursivo que efecte la clasificacin por insercin de una lista de
nmeros enteros en orden decreciente. El algoritmo utilizado es:

15. Escribir un procedimiento recursivo que permita invertir una cadena de caracteres ('Mortim e r ' - - 'remitron').

7 = 6 + 1 , 5 + 2, 4 + 3

C, = C 0 * ( 1 + r/100)
C, = C t * (1 + r/100)

659

[ ' M \ 'P'J, ['M', 'R'],


['M', 'T'],
[ ' F . 'R'], ['P'. 'T'],
['R', 'T']

11. Realizar una funcin que produzca la s u m a de los dgitos de la representacin decimal de un
valor entero no negativo.
12. Construir una funcin que produzca la imagen espejo de una cadena de caracteres ('12345' se
transforma en '53421')- Resolver este problema mediante las funciones de cadenas copy y
length.

Pilas y colas

661

una pila de
camisas

CAPITULO

PILAS Y COLAS
CONTENIDO
17.1.
17.2.
1 7.3.
17.4.
17.5.
1 7.6.
17.7.

Introduccin
Qu e s una pila?
Realizacin d e pilas con arrays (vectores) y r e g i s t r o s
Qu e s una cola?
Aplicaciones d e las colas
Realizacin d e una cola con arrays y r e g i s t r o s
Puesta a punto de programas

RESUMEN
EJERCICIOS
PROBLEMAS

una pila de cajas de zapatos

Figura 1 7 . 1 .

Pilas d e la vida real.

Una cola es una estructura de datos en la cual los elementos slo pueden aadirse por
un extremo y eliminarse por el otro. El nombre cola, al igual que el de la pila, tiene
semejanza con las colas de la vida ordinaria: cola de personas para tomar un autobs,
comprar una entrada para el cine, etc.

En los captulos a n t e r i o r e s s e han c o n s i d e r a d o d i v e r s a s e s t r u c t u r a s


d e d a t o s y su realizacin (implementacin) utilizando a r r a y s y registros. Existen o t r a s e s t r u c t u r a s d e d a t o s q u e p u e d e n s e r realizadas
utilizando arrays c o m o e s t r u c t u r a s de a l m a c e n a m i e n t o b s i c o : las
pilas y las colas. E s t a s e s t r u c t u r a s s e realizan c o n v e c t o r e s , d e b i d o a
que la mayora de los l e n g u a j e s p r o p o r c i o n a n un tipo d e d a t o p r e d e finido array; a u n q u e e s p o s i b l e realizar e s t a s e s t r u c t u r a s con listas
e n l a z a d a s y p u n t e r o s (Captulo 18).

17.1.

INTRODUCCION

Las listas lineales (vectores o arrays) examinadas hasta ahora permitan insertar y borrar
elementos en cualquier lugar de la lista: al principio, en el interior o al final. Sin embargo, son muy numerosos los casos que en informtica se necesitan listas en las cuales las
inserciones y borrados se produzcan slo por un extremo; estas estructuras se conocen
con el nombre de pilas y colas.
La pila es una estructura de datos relativamente simple y muy utilizada en informtica en general y en programacin en particular, tanto en programacin de aplicaciones
como en programacin de sistemas (desarrollo de lenguajes y compiladores). Una pila
(stack) es una estructura de datos, en la cual los elementos se pueden aadir o borrar
(inserciones y eliminaciones) por un extremo llamado cima (top). El concepto de pila,
desde el punto de vista informtico, es similar al concepto de pila en el mundo real: una
pila de platos, una pila de libros, etc.; en estas pilas los elementos (platos, libros, etc.) slo
pueden aadirse por un extremo (la parte superior o cima), y slo pueden quitarse por
ese mismo extremo.

660

Figura 1 7 . 2 .

17.2.

Colas d e la vida real.

QUE ES UNA PILA?

Una pila (stack) es una estructura de datos, que consta de una serie de datos, en la cual
las inserciones y eliminaciones se hacen por un extremo, llamado la cima (top), de la
pila. La estructura pila se conoce tambin como LIFO (last-in, first-out, ltimo en
entrar, primero en salir), que significa "ltimo elemento introducido, primero sacado".
Las operaciones fundamentales de aadir y quitar elementos de la pila se hacen por
un extremo de pila llamado cima. Consideremos la estructura de pila siguiente;

662

Programacin en Turbo/Borland Pascal 7

Pilas y colas
Tabla 1 7 . 1 .

663

O p e r a c i o n e s b s i c a s s o b r e pilas

E
D
C
B
A

La evolucin de la pila tras diferentes operaciones de entrada y salida se muestra a


continuacin:

estado
inicial de
la pila

aadir F

suprimir

suprimir

aadir D

Las operaciones bsicas que se asocian con una pila son:


crear o inicializar
pila vaca (empty)
meter (push)
sacar (pop)

j crea-inicializa-limpia u n a pila vaca J


mete Elemento en Pila}
j sacar Elemento en Pila}

Funcin
PilaVacia (Pila)
PilaLlena (Pila)

j determina si Pila esta vaca


determina si Pila esta llena}

Pila Elemento

parmetros de los subprogramas

Pese a la similitud, es preciso notar que una pila no es igual que un vector. Un pila es,
por esencia, un objeto dinmico, mientras que un vector tiene un nmero mximo de
elementos, determinado por su definicin; no es, pues, ms que una representacin de la
nocin abstracta.
La estructura pila se realiza con un vector, cuyo ndice representa el rango de un
elemento de la pila. Las operaciones f u n d a m e n t a l e s sobre la pila se representan a
continuacin mediante procedimientos y funciones considerando un tipo de dato
TipoPila.
Antes de describir la realizacin de una pila y sus operaciones bsicas vamos a considerar las posibles situaciones de error que se pueden presentar:

Procedimientos
Crear (Pila);
Meter (Pila,Elemento):
Sacar (Pila,Elemento);

inicializar una pila (p) vaca


determinar si una pila est vaca
inserta un elemento en la cima de la pila
recupera y elimina el ltimo elemento en la cima de la pife

En teora el tamao de una pila no est limitado; sin embargo, en la prctica de la


programacin existe una limitacin fsica en el espacio reservado en memoria.
U n a estructura pila puede ser realizada en Pascal utilizando un vector (array)* cuyo
t a m a o sea lo suficientemente grande para alojar los elementos iniciales, as c o m o todas
las posibles inserciones que se puedan hacer.
La variable cima contiene el nmero de elementos actualmente en la pila y puede ser
utilizada como un subndice o como un puntero al elemento superior de la pila. Si una
pila no tiene elementos, se dice que es una pila vaca. La variable o puntero cima se
incrementa en uno al poner un elemento en la pila y se decrementa en uno al quitar el
elemento.
* Es posible tambin realizarla con estructuras dinmicas, tipo puntero (vase Captulo 18).

1. Intentar meter un elemento en una pila llena (error de desbordamiento, "overflow").


2. Intentar sacar un elemento de una pila vaca (error de desbordamiento negativo
"underflow").
Las operaciones PilaLlena y PilaVacia devuelven 11 true" si la pila est llena o vaca, y
"false" en caso contrario. En general, antes de realizar una operacin en una pila se deben evaluar las situaciones anteriores mediante las sentencias:
antes de sacar un elemento x de la Pila
1, if not PilaVacia (Pila) then
Sacar (Pila, X)
else
{mensaje de error al usuario}
{tratamiento del mismo}
antes de meter un elemento x en la Pila
2. if

not PilaLlena (Pila) then


Meter (Pila, X)
else
{mensaje de error al usuario}
{tratamiento del mismo}

El mejor sistema es poner un mensaje de error indicando 1 Pi 1 aLl ena' o ' Pi 1 aVaci a 1 ,
o mejor incluso devolver en una variable lgica, por ejemplo Exito, el valor true si ha
tenido xito la operacin se ha podido realizar, o bien false si se ha encontrado el
error; tambin se puede detener el programa con la sentencia Halt.

664

Programacin en Turbo/Borland Pascal 7

Pilas y colas

Estas acciones se pueden realizar con sentencias individuales o llamando a un procedimiento llamado Desbordamiento:
if not Pilallena (Pila)
then Meter (Pila, X)
else Desbordamiento

y el procedimiento Desbordamiento se puede declarar as:


procedure Desbordamiento;
begin
WriteLn ('****Error de desbordamiento****');
WriteLn;
WriteLn ('Incremente el tamao de la pila y ');
WriteLn ('vuelva a ejecutar el programa');
Halt
end;

Las sentencias para meter o sacar elementos de una pila si p es la variable que
representa la pila son:
Cima
:= Cima + 1;
Pila [Cima] := X;

X
:= Pila [Cima];
Cima := Cima - 1;

meter

1 7.3.

sacar

REALIZACION DE PILAS CON ARRAYS


(VECTORES) Y REGISTROS

Todas las operaciones sobre pilas se deben realizar con procedimientos o funciones y
conseguir el mximo de modularidad.
La declaracin de la variable de tipo array que contenga la pila debe incluir su
tamao mximo. Supongamos un mximo de 100 elementos.
*

17.3.1.

Realizacin bsica de una pila

Consideremos una pila con la siguiente declaracin:


const
MaxPila = 100;
type
Elemento = char;
Pila
= array [1..MaxPila] of Elemento;
var
P
: Pila;
Cima : 0..MaxPila;

665

Las operaciones bsicas se realizan con los subprogramas meter y sacar.


procedure Meter (var P : pila, Ch : elemento);
begin
if Cima = MaxPila then
Write ('Pila llena')
else
begin
Cima
:= cima + 1;
P[Cima := Ch
end
end;
function Sacar (var P :pila) : elemento;
begin
if Cima = 0 then
Write ('Pila vacia')
else
begin
Sacar := P[Cima];
Cima
:= Cima-1
end
end ;

Meter (Pushj
procedure Meter (var P : Pila; X :TipoElementoPila; var Exito :
boolean);
{parametro P (entrada/salida), X(entrada), Exito (salida)}
{Exito, variable que representa operacion realizada si es true}
{y false si no se puede realizar por desbordamiento}
begin
if P.Cima>= MaxPila then
Exito := false
{no hay espacio en pila, pila llena}
else
begin
P.Cima
:= P.cima+1;
P.Elementos [P.Cima] := X; {mete X en la pila}
Exito
:= true
end
end; {Meter}

Sacar (Pop)
procedure Sacar (var P {entrada/salida} : Pila;
var X {salida} : TipoElementoPila;
var Exito {salida} :boolean);
begin
if P.Cima<=0 then
Exito
:= false
else

666

Programacin en Turbo/Borland Pascal 7

Pilas y colas

Pila vaca

begin
X

:= P.Elementos[P.Cima]; { saca de la pila elemento


y lo pone en X }
P.Cima := P.Cima - 1;
{decrementa cima de la pila}
Exito
:= True
end
end;
{Sacar}

1 7.3.2.

function PilaVacia (P : Pila) : boolean;


begin
PilaVacia := P.Cima<=0 {devuelve True si pila esta vacia}
{devuelve False si pila no esta vacia}
end;

Pila llena

Realizacin general de una pila

La representacin de una pila es ms general disearla con un tipo de dato Pila que sea
una estructura registro que contiene dos campos: el vector y la cima. La declaracin de
pilas es:

const
MaxPila=100;
type
Pila=record
Cima
Elementos
end;
var
P: Pila;

667

function PilaLlena (P :pila) :boolean;


begin
PilaLlena := P.Cima> = MaxPila {devuelve True si pila esta
llena}
{devuelve False si pila no llena}

end;

Recuperar

0..MaxPila;
array [1..MaxPila] of TipoElementoPila

Este procedimiento Recuperar obtiene el contenido del elemento de la cima de la pila p;


la variable lgica Exito indica si se ha realizado con xito la operacin.

procedure Recuperar (p {entrada}

TipoElementoPila: c h a r , i n t e g e r , . . .

Pila;

begin
if P.Cima <= 0 then
Exito := false
else
begin
X
:= P.Elementos [P.Cima];
Exito := True
end
end;

Inicializar (crear o limpiar)


La primera operacin a realizar con una pila es Inicializar ("vaciar la pila", "limpiar la
pila").
procedure Limpiar (var P : Pila);
{crea una pila vacia}
begin
P.Cima := 0
{pila esta vacia}
end;

var X {salida}
: TipoElementoPila;
var Exito {salida}: Boolean);

4>

Problema 1 7 . 1

o bien

Leer una palabra y visualizarla en orden inverso.


procedure Limpiar (var P : Pila);
begin
with P do
Cima := 0
end;

Este procedimiento debe ser llamado antes de que la pila pueda ser manipulada.

Anlisis
La estructura de datos idnea para este programa es una pila. Se introduce cada carcter
en la pila y luego se sacan, visualizndose los caracteres en orden inverso, ya que el
ltimo carcter introducido es el primero que se saca.

668

Programacin en Turbo/Borland Pascal 7


Palabra de entrada

remitroM

Pilas y colas
Salida

Mortimer

M
0

r
remitroM

Especificaciones

Entrada
Salida
Variables

t
1
m
e

var
P : pila ; {pila de caracteres}
Sw: boolean;
{insertar aqui los procedimientos Limpiar, Meter, Sacar, PilaVacia,
PilaLlena}

Mortimer

(palabra remitroM : Carcter a carcter)


(Mortimer, los caracteres de la pila)
(p:Pila);

Algoritmo
1.
2.
3.
4.

669

Crear una pila vaca de caracteres.


Meter cada carcter en la pila.
Sacar cada carcter y visualizarlo.
Indicar si la pila est vaca o llena.

Programa
El tipo de datos TipoElementoPila se considerar carcter.
program Escribir_Inversa;
const
MaxPila = 1 0 0 ;
type
TipoElementoPila = char;
pila
= record
cima: 0..MaxPila;
Elementos: array[1..MaxPila] of
TipoElementoPila
end;

procedure Rellenar (var p {entrada/salida} : Pila);


;var Sw: boolean);
{lectura de los caracteres e introduccin en la pila}
var
SigCar : Char;
{caracter siguiente}
begin
{rellenar pila}
WriteLn ('Introduzca una secuencia de uno o mas caracteres');
WriteLn ('Pulse Return para terminar');
repeat
Read (SigCar);
Meter (P, SigCar, Sw)
until Eoln (input) or not Sw;
{visualizar un error si existe desbordamiento}
if not Sw then
WriteLn ('Error de desbordamiento de pila-cadena
demasiado larga')
end;
{Rellenar}
procedure Visualizar (var P (entrada/salida} : pila ; Sw: boolean);
var
SigCar : char;
Sw
: boolean;
begin
if Sw then
begin
while not PilaVacia (P) do
begin
Sacar (p, SigCar)
Write (SigCar)
end ;
end
WriteLn
end;
{visualizar}
{programa principal}
begin
{EscribirInversa}
Limpiar
(P);
{arranque con una pila vacia}
Rellenar
(P,Sw);
{rellenar la pila}
Visualizar (P,Sw);
{visualizar caracteres en orden inverso}
{cuando no ha habido error de desbordamiento}
if PilaVacia(p) then
Write ('pila vacia-operacion ha tenido xito')
else
if PilaLlena(p) then
WriteLn ('pila llena - fallada operacion')
{visualizar}
end.

670

Programacin

17.4.

en Turbo/Borland

Pascal 7

QUE ES UNA COLA?

El diccionario de la Real Academia Espaola define una acepcin de cola como "hilera
de personas que esperan turno para alguna cosauna
hilera de vehculos esperando
pasar una frontera, una hilera de personas para entrar en un teatro, una hilera de aviones
en la pista en espera de despegar, o una cola de trabajos en un sistema de computadora
que espera la disponibilidad de algn dispositivo de salida tal como una impresora. En
cada uno de estos ejemplos, los elementos se atienden en el orden en que llegaron; es decir,
el primer elemento en entrar (primero en la cola) es el primero en ser atendido (salir).
Por consiguiente, mientras que una pila es una estructura LIFO (Last-in-First-Out),
una cola es una estructura FIFO (First-In-First-Out); primero en entrar, primero en
salir), tambin llamada a veces estructura FCFS (First-Come-First-Served; primero que llega, primero que se atiende).
Al igual que las pilas, las colas son estructuras de datos en las cuales las operaciones
bsicas de aadir y eliminar elementos se realiza en los extremos de la lista. Al contrario
que en las pilas cuyos elementos se aaden y borran por un extremo de la lista, en las
colas los elementos se borran por un extremo, llamado frente o cabeza (front, head), de
la cola y los elementos se aaden por el otro extremo, llamado final o fin (rearjail).
Las operaciones bsicas a realizar una cola son:
CrearCola(Q)
ColaVaca(Q)
ColaLlena(Q)
Insertar(Q.x)
Borrar(Q,x)
ElementosCola(Q)

Crea una cola vaca (sin elementos).


Determina si una cola est vaca; devuelve true si la cola est
vaca, false en caso contrario.
Devuelve true si la cola est llena; false en caso contrario.
Aadir un elemento al final de la lista (siempre y cuando la
cola no est llena).
Recupera y elimina el elemento que est al principio (frente)
de la cola.
~:
Devuelve el nmero de las colas existentes en la cola.

Ejemplo 17.1
Operaciones bsicas en una cola de cuatro elementos.
CrearCola(Q)

lnsertar(Q,a)

Pilas y colas

1 7.5.

671

APLICACIONES DE LAS COLAS

Las colas se utilizan con frecuencia en los sistemas informticos, siempre que ms de un
proceso requiera un recurso especfico, tal como una impresora, una unidad de disco o la
unidad central de proceso. Tales procesos, al solicitar un recurso especfico, se sitan en
una cola a la espera de atender a ese recurso. Por ejemplo, diferentes computadoras
pueden compartir la misma impresora, y una cola spool se utiliza para planificar las
diferentes salidas. Si una peticin para un trabajo de impresin se realiza y la impresora
est libre, se le asigna inmediatamente ese trabajo. Mientras esta salida se est imprimiendo, otras tareas pueden necesitar la impresora. Se sitan en una cola de tipo spool
para esperar su turno. Cuando la salida del trabajo actual termina, la impresora se libera
de ese trabajo y se asigna a la primera tarea de la cola.
Otro uso importante de las colas en un sistema informtico es para operaciones de
acoplamiento o adaptacin de entrada/salida (input/output buffering). La transferencia de
informacin, desde un dispositivo de entrada o desde un dispositivo de entrada/salida, es
una operacin relativamente lenta, y si el proceso de un programa debe ser suspendido
mientras se transfieran los datos, la ejecucin del programa se ralentiza drsticamente.
Una solucin frecuente a este problema utiliza secciones de memoria principal conocidas como memorias intermedias (buffers) y transfiere datos entre el programa y estas
memorias intermedias, en lugar de entre el programa y el dispositivo de entrada/salida
directamente.
En particular, considrese el problema en el cual los datos procesados por un programa se leen de un archivo de disco. Esta informacin se transfiere desde el archivo de
disco hasta una memoria intermedia de entrada en memoria principal mientras que la
unidad central de proceso (CPU) est ejecutando alguna otra cosa. Cuando el programa
necesita los datos, se recuperan los siguientes valores almacenados en la memoria intermedia. Mientras estos valores se estn procesando, se pueden transferir valores de datos
adicionales desde el archivo del disco hasta la memoria intermedia. Mientras estos valores se estn procesando, se pueden transferir valores de datos adicionales desde el archivo
del disco hasta la memoria intermedia. La memoria intermedia (buffer) debe ser organizada como una estructura primero en entrar primero en salir, es decir, una cola. Una
condicin de cola vaca indica que la memoria intermedia est vaca y la ejecucin del
programa se suspende mientras el sistema operativo intenta cargar ms datos en la
memoria intermedia o seala el fin de la entrada. Naturalmente, tal memoria intermedia
tiene un tamao limitado, y por consiguiente una condicin de cola llena se debe utilizar
para indicar cundo la memoria intermedia est llena y ningn dato ms se tiene que
transferir desde el archivo de disco hasta la misma.

lnsertar(Q,b)

1 7.6.
InsertarfQ, c)

Insertarlo,d)

Una cola es una estructura de datos adecuada para almacenar elementos que se
deben procesar en el orden en que son generados.

REALIZACION DE UNA COLA CON ARRAYS


Y REGISTROS

Al igual que una pila, una cola se puede realizar (implementar) mediante un array (un
vector). Para representar una cola se utiliza una estructura tipo registro, que consta de
tres campos enteros (Frente,Final,NumElementos)
y un campo de tipo vector (Elementos). Un elemento se elimina de la cola recuperando el elemento del vector en la posicin
Frente y a continuacin incrementando Frente en l. Un elemento se aade a la cola

672

Pilas y colas

Programacin en Turbo/Borland PascaI 7

almacenndolo en la posicin Final del vector, verificando que Final no excede el tamao mximo permitido por el vector, y a continuacin incrementando Final en 1.
Estas operaciones se basan en "desplazamientos a derecha" en el vector, de modo que
todos los elementos del vector se pueden desplazar de nuevo a las posiciones iniciales.

Ejemplo 1 7 . 2
Se considerar una cola de seis elementos tipo entero. La secuencia de operaciones
Insertar(Q,70), Insertar(Q,80), Insertar(Q,30) produce la configuracin.
Final = 4
I
70

80

17.6.1.

Declaracin de una cola

Como ya se ha expuesto, para realizar una cola se puede utilizar una estructura registro
que almacene los elementos de la cola y los campos Frente y Final para registrar la
posicin del elemento frontal y final, as como un campo de tipo array unidimensional
llamado Elementos.
const
MaxCola
type
TipoElemento
Tipolndice
ArrayCola
TipoCola

30

var
Cola

Frente = I

673

=100;
{o cualquier otro tipo}
=integer;
=1..MaxCola;
=array [Tipolndice] of TipoElemento;
=record
Frente, Final :TipoIndice;
Elemento
:ArrayCola
end;
: TipoCola;

Eliminar dos elementos


El array o vector circular se puede realizar fijando el ndice del array en 0 e incrementando Frente y Final.

Final = 4

Finat = 4

30

30

Frente = 3

Aadir tres elementos: 110, 60 y 40.


Final = 7
1
40

60

110

30

Frente = 3

Como la cola ya est llena, antes de poder insertar otro elemento en la cola, los
elementos del array se deben desplazar de nuevo al principio del array.
Final = 5

I
30

110

60

40

Frente = 1

Este desplazamiento se puede evitar si se piensa en un array de carcter circular, es


decir, el primer elemento viene despus del ltimo.

75

55

674

Programacin

en Turbo/Borland

Pascal 7

Pilas y colas

675

i function C o l a V a c i a (Q TipoCola): b o o l e a n ;
{el valor de la funcin es true si la cola e s t a v a c i a }
{false en c a s o c o n t r a r i o }
begin
ColaVacia
end;

Para determinar si la cola est vaca se tiene que verificar la condicin Frente = Final.
Inicialmente, CrearCola fijar Frente y Final, ambas a cero. Veamos el porqu de la
condicin Frente = Final.. Si la cola contiene un solo elemento, debe estar en la posicin
Frente y Final es la posicin libre siguiente a ella. Si este elemento se suprime. Frente se
incrementa en 1, de modo que Frente y Final tienen el mismo valor cuando la cola est
vaca.
La deteccin de la condicin pila llena se deduce de igual modo. Supongamos que el
array est casi lleno, con slo una posicin vaca.
MaxCola - 1
0
/
\ / < ^ I >>v
/ A
I / "\
\

function C o l a L l e n a (Q :TipoCola): b o o l e a n ;
{devuelve t r u e si la cola est llena; false en c a s o c o n t r a r i o }
var
Siguiente: Tipolndice;
begin
{localizar siguiente posicion disponible;
if Q.Final+1 = MaxCola then
Siguiente := 0
else
Siguiente := Q.Final+1;
Colallena := Siguiente = Q.Frente
end;
p" p r o c e d u r e Insertar (var Q : T i p o C o l a ; Item : T i p o E l e m e n t o ) ;
{aade Item al final de la lista; se supone que la cola no esta llena}
const
M a x P o s = M a x C o l a - 1;
var
Siguiente
begin
w i t h Q do
begin

Final

( Final + 2) mod MaxCola

= Frente

Las operaciones bsicas sobre las colas se realizarn, al igual que en el caso de las
pilas, con subprogramas.

{posicion del n u e v o e l e m e n t o }

. ,/
>;,.,

Halt
else
begin
E l e m e n t o s [Final] := Item;
Final
:= S i g u i e n t e
end
{else
end
{with}
end;
{Insertar}
p r o c e d u r e Borrar (var Q :Cola;var Item :TipoElemento);
{recuperar Item y b o r r a r l o del p r i n c i p i o de la cola, suponiendo
que la c o l a no esta v a c i a }
begin
if ColaVacia
Halt;
else

procedure C r e a r C o l a (var Q: T i p o C o l a ) ;
{crea una cola v a c i a con c e r o e l e m e n t o s }
begin
{CrearCola}
Q.Frente := 0;
{inicializa p u n t e r o Frente y F i n a l }
Q.Final
:= 0
end;

: 0..MaxPos;

Siguiente := (Final + 1) mod MaxCola;


if Siguiente = Frente then

Frente

Si un elemento se almacena en esa posicin, Final se incrementar en 1 y por consiguiente tendr el mismo valor que Frente. Sin embargo, la condicin Frente = Final
indica que la cola est vaca. Por tanto, no podremos diferenciar entre una cola vaca y
una cola llena, si esta posicin se utiliza para almacenar un elemento. Se puede evitar
esta dificultad, si se mantiene una posicin vaca (libre) en el array; la condicin q/,ie
indica si una cola est llena es entonces:

:= (Q.Frente = Q . F i n a l )

(q) t h e n

w i t h Q do
begin

end;

Item := E l e m e n t o s [ F r e n t e ] ;
Frente := (Frente+1) mod M a x C o l a
end
|with}
{Borrar}

676

Programacin en Turbo/Borland Pascal 7

17.6.2,

Pilas y colas

Tipos de colas

L a s o p e r a c i o n e s d e i n s e r c i n y b o r r a d o en u n a c o l a s o n o p e r a c i o n e s e n las q u e las
i n s e r c i o n e s se r e a l i z a n p o r u n e x t r e m o y las e l i m i n a c i o n e s ( b o r r a d o ) p o r o t r o . E n a l g u n a s
a p l i c a c i o n e s es n e c e s a r i o q u e las i n s e r c i o n e s y e l i m i n a c i o n e s se r e a l i c e n e n a m b o s e x t r e m o s . U n a e s t r u c t u r a t i p o c o l a e n q u e las i n s e r c i o n e s y e l i m i n a c i o n e s se r e a l i c e n e n
c u a l q u i e r a d e los e x t r e m o s se l l a m a bicola (deque, " d o u b l e e n d e d s t a c k " ) .
Frente

Final

das (punteros) para i m p l e m e n t a r pilas y colas (Captulo 18), el t a m a o de la pila o cola slo est
limitada por la cantidad de m e m o r i a que se ha asignado al programa.

EJERCICIOS
1. Escribir un segmento de programa que elimine el elemento justo debajo de la cima de la
pila.
2. Escribir una funcin que obtenga el i-simo
rrarlo.

elemento a partir de la cima de una pila, sin bo-

3. Escribir un procedimiento q u e cambie el i-simo


valor contenido en x.

O t r a e s t r u c t u r a d e d a t o s r e l a c i o n a d a c o n la c o l a es la l l a m a d a cola de prioridad. E n
esta e s t r u c t u r a se a s o c i a u n a c i e r t a p r i o r i d a d c o n c a d a e l e m e n t o , y e s t o s e l e m e n t o s se
a l m a c e n a n d e tal m o d o q u e los d e p r i o r i d a d m s a l t a e s t n c e r c a d e l f r e n t e d e la c o l a , d e
f o r m a q u e se e l i m i n a n d e la c o l a y a t i e n d e n a n t e s q u e los d e m e n o r p r i o r i d a d . L a s r e g l a s
de prioridad son:

l. Un elemento de mayor prioridad se procesa de acuerdo con el orden en q u e se anadieron


2 Dos elementos de it'ual prioridad se procesan d e acuerdo eon el orden en q u e se anadie-

1 7.7.

PUESTA A PUNTO DE PROGRAMAS

Errores t p i c o s d e p r o g r a m a c i n
D a d o q u e las pilas y c o l a s se r e a l i z a n c o n a r r a y s , los e r r o r e s m s f r e c u e n t e s s e r n los
m i s m o s q u e los e x a m i n a d o s e n los C a p t u l o s 10 y 11; s t o s s u e l e n ser s u b n d i c e s f u e r a
de rango.

elemento a partir de la cima de la pila por el

4. Escribir un procedimiento para insertar un elemento en u n a cola tipo deque. Nota: Observe
que debe tener u n p a r m e t r o que especifique en qu extremo del deque se realiza la insercin.
5. Suponga que una cola circular de capacidad 6 contiene los cinco caracteres +, - , *, /, # ,
donde + se almacena al principio de la cola. En la representacin en array, cul es el valor de
Q.Frente? Cul es el valor de Q.FinaP.
6. Borrar el carcter al principio de la cola del ejercicio 5 e insertar el carcter \ y despus %.
Dibujar la nueva cola. Cul es el valor de Q.Frente? Cul es el valor de Q.Final?
7. Explicar el efecto de cada u n a de las siguientes operaciones sobre la pila S. Supngase que Y
(tipo Char) contiene el carcter 'x'. Cules son los valores finales de A' y Exito (tipo Boolean)
y el contenido de la pila S.
CrearPila(S);
Meter(S,'+',Exito);
Sacar(S,X,Exito);
Sacar(S,X,Exito);
Meter(S,1(',Exito);
Meter(S,Y,Exito);
Sacar(S,,Exito);
8. Suponiendo que la pila S se realiza en un array, mostrar el valor del c a m p o entero Cima y el
c a m p o array Items despus de cada operacin.
9. Escribir un operador de colas llamado MoverAlFinal
almacenado en la frente de la cola al final de la cola.

RESUMEN
Este captulo introduce a dos estructuras de datos, pilas y colas. Las pilas se utilizan en aplicaciones de recursividad y en conversin de expresiones y notaciones. Las colas se utilizan para realizar
listas de espera y problemas de simulacin.
U n a pila es una estructura de datos ltima-en-entrar,
primer a-en-salir,
esto significa que el
ltimo elemento insertado es el primero eliminado. En contraste, una cola es u n a estructura de
datos primero en entrar, primero en salir.
Las pilas y colas pueden ser implementadas
con arrays o con punteros. En el primero caso, la
pila (o cola) est limitada por el t a m a o del array y no se puede cambiar mientras se est ejecutando el programa. Este es el diseo empleado en este captulo; sin embargo, utilizando listas enlaza-

677

10. Escribir un operador de colas llamado MoverAlPrincipio


cola al frente de la cola.

que m u e v a el elemento actualmente

que mueve el elemento al final de la

PROBLEMAS
1. Determinar si u n a expresin con parntesis est equilibrada. Ejemplo, la expresin
(x+y*(m/(n-p))) + ( x / y )
1
2 3
123 4
4
est equilibrada.

678

Programacin en Turbo/Borland Pascal 7

Pilas y colas

2. U n a tarea de un compilador es evaluar expresiones aritmticas. En la mayora de los lenguajes


de programacin, las expresiones aritmticas se escriben en notacin infija, que son aquellas
en las cuales el smbolo de cada operacin binaria se sita entre los operandos

6. Convertir las expresiones prefijas a notacin infija:


A)

*+AB-CD

b) A B - C D

infija

5*6

5*(6+4)

C)

4+((5*7)/5)

Muchos compiladores t r a n s f o r m a n estas expresiones infijas en notacin postfija (o prefija),


en la cual el operador sigue a los operandos. y a continuacin genera instrucciones m q u i n a
para evaluar esta expresin postfija:
((a*b)+c)
not acin infija
+*abc
notacion prefija
(polaca)
ab*c+
n o t a c i o n postfija
( s u f i j a ) (polaca inversa)

a+b
+ab
ab+

c-d
-cd

e*f
*ef

cd-

ef*

La conversin de notacin infija a notacin polaca se puede hacer as:


(A+B)*C

[+AB]*C

= *+ABC

A+(B*C)

= A+[*BC]

= +A*BC

(A+B)/(C-D)

2 * ( 3 + 4 ) = 234+*

C o m o ver, nunca se necesitan parntesis para escribir expresiones en notacin polaca, y


bastan las prioridades habituales entre los diferentes operadores.
Evaluar las expresiones notacin polaca inversa
d) A B C + / D *

b) A B C D + / *

e)

AB+C+D+

c) A B + C 0 + +

/')

ABC++D+

3. Convertir las siguientes expresiones infijas a notacin polaca inversa:


ci) A*B+C-D

e)

b)

(A+B)/C+D

/') A + B / ( C + D )

C)

(A+B)/(C+D)

g) (AB)*(C(D+E)

d) (((AB) C) D)E

A+B/C+D

h) A ( B ( C ( D E ) ) )

4. Convertir las siguientes expresiones en notaciones polacas inversas a notacin infija:


a) A B C h D *
b) A B C D + - *
C)

AB/C/0//

d) A B C / D / /

e) A B + C 0 - *
F) AB+C-DE*/
g) A B / C O / /
h) A B C D / / /

5. Convertir las siguientes expresiones lgicas a notacin polaca inversa:


a) A and B or C
b) A and ( B or not C )
c) not ( A and B )
d) (A=B) or (OD)

ABCD

d) A - B C D
e)

/+*AB-CDE

./')

/+A*BC-DE

7. Disear un algoritmo para evaluar expresiones polacas inversas mediante pilas.


8. Disear un algoritmo para convertir de notacin infija a notacin polaca inversa.
9. Escribir un programa que simule el f u n c i o n a m i e n t o de un centro de informacin/reservas:
por ejemplo, lneas areas, trenes, alquiler de coches, etc., que atiende a llamadas telefnicas
gratuitas, realizadas por clientes a un n m e r o de telfono determinado. C u a n d o una llamada
llega a este centro, se atiende i n m e d i a t a m e n t e si el empleado (telefonista) est libre, pero si el
empleado est ocupado, la llamada se sita en u n a cola y se atender ms tarde. Sugerencia'.
Utilizar las funciones Random y Randomize y una cola.
10. Utilizando las operaciones bsicas de colas y pilas, escribir un algoritmo que invierta los
elementos de una cola.

[+AB]/[CD]=/+ABCD

a) A B + C / D *

679

11. Escribir un programa que lea una cadena de caracteres, metiendo cada carcter en una pila a
medida que se lee y aadindolo s i m u l t n e a m e n t e a una cola. C u a n d o se encuentra el final de
la cadena, utilice las operaciones bsicas de pilas y colas para determinar si la cadena es un palndromo.
12. Simular el f u n c i o n a m i e n t o de una calculadora leyendo una expresin en notacin postfija y
visualizar sus resultados. Cada dato carcter ser un blanco, un dgito, o u n o de los operadores
del c o n j u n t o [+,
*. /].

Estructuras dinmicas de datos: punteros y listas enlazadas

CAPITULO

ESTRUCTURAS DINAMICAS DE DATOS:


PUNTEROS Y LISTAS ENLAZADAS
CONTENIDO
18.1.
18.2.
18.3.
18.4.
18.5.
18.6.
18.7.
18.8.
18.9.
18.10.
18.11.
18.12.

E s t r u c t u r a s d e d a t o s dinmicas
Punteros
O p e r a c i o n e s con variables p u n t e r o s : p r o c e d i m i e n t o s N e w y D i s p o s e
El tipo g e n r i c o p u n t e r o (pointer)
La asignacin d e memoria en T u r b o Pascal
Listas e n l a z a d a s
O p e r a c i o n e s en una lista enlazada
Listas circulares
Listas d o b l e m e n t e e n l a z a d a s
Diseo d e pilas con listas e n l a z a d a s
Diseo d e c o l a s con listas e n l a z a d a s
Puesta a punto de programas

RESUMEN
EJERCICIOS
PROBLEMAS
Las t c n i c a s de p r o g r a m a c i n m o d e r n a exigen tratar con e s t r u c t u r a s
d e d a t o s dinmicas que al contrario que las e s t r u c t u r a s e s t t i c a s ya
t r a t a d a s s e a l m a c e n a n en z o n a s d e memoria de t a m a o variable cuy o s valores crecen o d e c r e c e n en funcin del diseo d e la e s t r u c t u r a .
El d a t o tipo puntero e s el e l e m e n t o b a s e d e e s t r u c t u r a s d i n m i c a s tales c o m o listas y rboles.
Este captulo introduce al tipo de d a t o p u n t e r o (apuntador) y examina la lista enlazada c o m o una e st r u c t u r a d e d a t o s . S e p u e d e n utilizar p u n t e r o s p a r a m p l e m e n t a r una lista e n l a z a d a en P a s c a l . A s i m i s m o s e consideran las d i f e r e n t e s v a r iant es de listas: circulares y
doblemente
enlazadas.
Los p u n t e r o s tienen m u c h a s aplicaciones en ciencias d e la c o m putacin y d e la informtica, en general; f u n d a m e n t a l m e n t e en el dis e o e implementacin de a l g o r i t m o s d e manipulacin d e listas, rboles y grafos.

debe ser declarado por anticipado y no puede ser incrementado durante la ejecucin del
programa si se necesitara ms espacio de memoria.
Un array de requisitos es esttico dado que la cantidad exacta de memoria se fija por
la declaracin del tamao del array. Esta falta de-flexibilidad puede ser una desventaja
notable. As, por ejemplo, si en un array de registros se declara para un tamao mximo
de 1.000 registros, el programa no funcionar si se deben almacenar ms de 1.000 registros en ese array. Por otra parte, si el tamao mximo declarado para un array es mucho
mayor que el total de espacio de memoria requerido, el programa utilizar ineficientemente la memoria, dado que la cantidad de memoria especificada en la declaracin se
reservar, incluso aunque slo se utilice una pequea parte.
Los punteros (apuntadores) 1 permiten la creacin de estructuras de datos dinmicas:
estructuras de datos que tienen capacidad de variar en tamao y ocupar tanta memoria
como utilicen realmente. Las variables que se crean y se destruyen durante la ejecucin
se llaman variables dinmicas (tambin annimas). As, durante la ejecucin de un programa, puede haber una posicin de memoria especfica asociada con una variable dinmica y posteriormente puede no existir ninguna posicin de memoria asociada con
ella.
Pascal proporciona los mtodos para asignar y liberar espacio de memoria utilizando
punteros y los procedimientos predefinidos new y dispose.
Al contrario que las estructuras de datos estticas, tales como arrays cuyos tamaos
y posiciones de memoria asociados se fijan en tiempo de compilacin, las estructuras
dinmicas de datos se amplan (expanden) o reducen (contraen) a medida que se requiera durante la ejecucin y cambia sus posiciones de memoria asociada.
Una estructura de datos dinmica es una coleccin de elementos llamados nodos de
la estructura normalmente de 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
Existen diferentes tipos de estructuras dinmicas de datos, siendo las ms notables y
significativas las listas enlazadas, los rboles y los grafos.
Las estructuras de datos dinmicas son tiles especialmente para almacenar y procesar conjuntos de datos cuyos tamaos cambian durante la ejecucin del programa, por
ejemplo, el conjunto de trabajos que se han introducido en una computadora y estn
esperando su ejecucin o el conjunto de nombres de pasajeros y asignacin respectiva de
asientos de un vuelo de avin determinado. En este captulo se estudiarn los punteros
y los procedimientos new y dispose as como el mtodo que se puede utilizar para consSiguiente

Nodo 1

1 8 . 1 . ESTRUCTURAS DE DATOS DINAMICAS


Todas las variables y estructuras de datos que se han considerado hasta este momento
han sido estticas. Con una, variable esttica, la cantidad de memoria (espacio) ocupada

680

681

Siguiente

Nodo 2
Figura 1 8 . 1 .

Siguiente

Nodo 3

Representacin d e una lista enlazada.

' En Latinoamrica, el trmino utilizado para definir este concepto es apuntador.

Siguiente

Nodo 4

682

Programacin en Turbo/Borland Pascal 7

Estructuras dinmicas de datos: punteros y listas enlazadas

truir y procesar estructuras dinmicas de datos, junto con la estructura dinmica de datos, por excelencia, la lista enlazada.

18.2.

Se puede declarar un puntero a una variable carcter, un puntero a un array de enteros, un puntero a un registro o un puntero a cualquier otro tipo. En general, se'pueden
declarar variables puntero que apunten a cualquier tipo de dato, incluso otros punteros.
La declaracin de una variable a un puntero se realiza con el formato siguiente

PUNTEROS

En una computadora cada posicin de memoria tiene una direccin y un valor especfico almacenado en esa posicin. Se han utilizado nombres de variables en lugar de direcciones porque los nombres son ms fciles de recordar. Para almacenar un nuevo valor en m e m o r i a se asigna a una variable, y la c o m p u t a d o r a enva u n a direccin a la
memoria seguida por el valor a almacenar en esa posicin.
El tipo puntero es un tipo de datos simple en Pascal; es simple debido a que no se
puede romper en otros componentes pequeos como es el caso de un array o un registro.
Los punteros en esencia son un tipo especial de variable que se utiliza para almacenar la
direccin de memoria de otra variable, o lo que es igual, su valor es una direccin de
una posicin de memoria donde est almacenada otra variable. Las variables utilizadas
para almacenar direcciones en vez de valores convencionales se d e n o m i n a n variables
puntero o simplemente puntero (apuntador).
1747 (direccin)

683

Nombre-variable:

~identificador - tipo

var
Ptr : ^TipoElemento

La variable Ptr apunta a un tipo de dato TipoElemento


Ejemplo
var
P : ^Integer;

2014 (direccin)

Los punteros se pueden representar mediante diagramas grficos


un puntero

un puntero

Al definir un tipo puntero se debe indicar el tipo de valores que se almacenarn en


las posiciones designadas por los punteros. La razn es que los diferentes tipos de datos
requieren diferentes cantidades de memoria para almacenar sus constantes, una variable
puntero puede contener una direccin de una posicin de memoria adecuada slo para
un tipo dado. Por esta razn se dice que un puntero apunta a una variable particular, es
decir, a otra posicin de memoria.

Por ejemplo, la variable P contiene 059164 que es la direccin de memoria donde est
la variable entera apuntada 345.
059164

t 'na variable tipo puntero contiene la direccin de la posicin de uli\i variable.

P est en la
direccin 034405

1 8 . 2 . 1 . Declaracin de punteros
ble.
Un puntero es una variable que se utiliza para almacenar la direccin de otra variable.
Sin embargo, el puntero en si, no es normalmente lo que le interesa ms; sino que el
inters reside en la celda (direccin de memoria) apuntada por l. Es decir, es preciso
diferenciar entre las dos entidades implicadas en el apuntamiento: la variable puntero
(quin hace el apuntamiento) y la variable apuntada (a quin se apunta).
Un tipo de dato puntero se especifica utilizando el smbolo de circunflejo (~) seguido
por un identificador de tipo. Su formato es:
identificador-tipo

345
variable entera en la
direccin 059164

U n puntero apunta hacia (a) otra variable cuando contiene la direccin de esa varia-

Variable entera a la que


apunta el puntero P

684

Programacin en Turbo/Borland Pascal 7

Estructuras dinmicas de datos: punteros y listas enlazadas

Es muy til crear un identificador de tipo para los tipos de datos puntero. Se puede
crear dicho identificador y utilizar ese identificador para crear variables punteros.

18.3.

685

OPERACIONES CON VARIABLES PUNTERO: LOS


PROCEDIMIENTOS NEW Y DISPOSE

Los punteros se crean con las declaraciones citadas:

type
nombre

tipo :

identificadortipo;

type
PunteroReal = "Real;

var
nombre var-ptr : nombre-tipo;

var
P : PunteroReal;

Ejemplo 1 8 . 1
Supongamos
que se desean almacenar
nmeros
reales utilizando
aplicacin
dinmica.
Las variables A y B son variables punteros que apuntan a datos

type

de memoria
reales:
real

PunteroReal = "Real

p es una variable puntero de tipo PunteroReal que apunta a posiciones que contienen reales. La posicin de memoria designada por el valor de la variable puntero P se representa
por P". La Figura 18.2 representa la relacin entre P y P".
Como P" designa una posicin de memoria, se puede utilizar como cualquier otra
variable Pascal. Se pueden asignar valores a P" y utilizar valores de P" en expresiones tal
como cualquier otra variable. Si P apunta a posiciones que contienen reales, P" es una
variable real. As en la Figura 18.2 el valor de P" es 50.

var
p" := 1000
3 * P" + 500

A, B : PunteroReal;

el valor de
es 1000
toma el valor 3500

Sin embargo, estas operaciones no se pueden realizar directamente tras la declaracin, debido a que el objeto o direccin apuntada P1 no tiene existencia. Antes de que
un programa utilice un puntero, se requiere primero espacio para el tipo de datos objeto
de la direccin del puntero. En otras palabras, un programa debe inicializar sus punteros
su declaracin no basta; para iniciar un puntero se debe utilizar el procedimiento
New.

real

1. t y p e
Tipo_Puntero = "integer;

var
P = Tipo_Puntero;

2. v a r
P : "integer;
3. t y p e cad40 = string[40];
v a r ptr
: "cad4 0;
ql, q2 : "real;

declara tres variables puntero:


ptr apunta a valores cadena
ql, q2 apuntan
a valores reales

Figura 18.2.

4. t y p e
PunteroReal = "Real;

puntero

P es una variable
PunteroReal

puntero

R : Real;

5. v a r
Primero

type
"Real;

Diferencia entre p y p~.

18.3.1. New

a reales

var
P : PunteroReal;

PA

PunteroEnt = "integer;

var

de

tipo

La declaracin de una variable puntero P no crea una celda de memoria para apuntar a
ella. El procedimiento (sentencia) New se utiliza para crear tal celda de memoria P; es decir, el procedimiento New crea una nueva variable dinmica y establece que una variable
puntero apunte a ella.
Formato

Sig : PunteroEnt;
New (P)
p variable

puntero

686

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7

La sentencia New(P); llama al procedimiento New que asigna almacenamiento para un


valor del tipo determinado y sita la direccin 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. La posicin exacta de la memoria de esta celda particular es indiferente.
La nueva variable creada es la ya conocida con el smbolo P". La llamada a New exige
que exista suficiente espacio de memoria libre en el montculo la pila de variables dinmicas (heap) para asignar a la nueva variable. En caso contrario se producir un
error en tiempo de ejecucin.
Se puede representar el valor de una variable puntero por una flecha dirigida a una
celda de memoria. El diagrama

687

Funcionamiento de New (Pj

1. Se asigna espacio de m e m o r i a c o n v e n i e n t e p a r a a l m a c e n a r tipos de d a t o s c o r r e s p o n dientes.


2. La direccin de esta posicin de m e m o r i a se almacena en P; se crea una variable dinmica P~.

Ejemplos
A la posicin o celda de memoria a que apunta un puntero se puede acceder situando
un smbolo " despus del nombre de la variable puntero. Por ejemplo
muestra que la variable puntero P apunta a una celda de memoria cuyo contenido se
desconoce. sta es la sentencia que existe inmediatamente despus de que se ejecuta
New(P).

El smbolo P~ se utiliza para referenciar a la celda de memoria apuntada por la variable puntero P. El smbolo " (circunflejo) se denomina operador de indireccin o de desreferencia.
La sentencia de asignacin

new (Ptr);
Ptr''. := 'Mckenna';

La sentencia new(Ptr) crea una celda de memoria vaca (o con basura) a la que apunta
Ptr. La segunda sentencia sita el valor 'Mckenna' en esa celda de memoria. Un diagrama
grfico sera:
Ptr

[ Z 3

P" := 25.0

almacena el valor real 25.0 en la posicin (celda) de memoria apuntada por P.

McKenna

Implementacin interna
Internamente, los punteros se implementan teniendo en cuenta las direcciones de memoria a las que se apunta. Por ejemplo, supongamos que la direccin de ptr es 1015 y
que la celda de memoria que crea new(ptr) est en la direccin 1256. Por consiguiente,
el efecto de

new (ptr);

Como P~ se considera una variable, podr ser visualizado su valor


ptr~ := 'McKenna';

w r i t e ( p" : i o : 2);

visualiza el valor 25.0


se puede dibujar a nivel de direcciones de memoria como se muestra a la izquierda o
con el diagrama ms sencillo de la derecha

Atencin
p := 2 5.0;
write (p: io: 2);

asignacin no vlida
sentencia no vlida

Ambas sentencias son no vlidas debido a que no se puede almacenar un valor de


tipo Real en una variable puntero P, ni se puede visualizar el valor (una direccin) de
una variable puntero.

Direccin 1015

Direccin 1256

1256

McKenna

McKenna
Ptr

Ptr

688

Programacin

en Turbo/Borland

Pascal 7
Estructuras

dinmicas

de datos: punteros

y listas enlazadas

Atencin
Observe que en la declaracin de un puntero, el circunflejo est situado a la izquierda de
su tipo, mientras que en una sentencia en que se accede a la celda de memoria a que se
est apuntando, el circunflejo aparece a la derecha.

Ptr 1

Ejemplo 1 8 . 2
Realizar el seguimiento

del segmento de programa.

Ptr2

Ptr2'

Ptrl

Ptr1^

Ptr2

Ptr2"

var
1.
2.

3.
4.
5.
6.
Paso

Ptrl
Ptr2

: "char;
: "integer;

begin

New ( P t r l ) ;
b e g i n p t r i " .= ' B 1 ;
beginNew (Ptr2);
beginptr2"' := 86;
Grfico de memoria

Significa

Ejemplo 1 8 . 3
Realice el lector el seguimiento

del siguiente programa y deduzca su salida.

Se declara Ptr 1 como una variable esttica

program Puntero;

Ptrl

type
Ptrint = ^integer;

Ptr 1

var
I, J
N

Se declara Ptr2

Ptr2

Paso

Grfico de memoria

Ptr 1

Ptrl'

Significa

Asigna espacio de memoria para P t r l " y almacena su direccin en Ptr 1 (se crea una nueva posicin de memoria)

: Ptrint;
: integer;

begin
New (I);
New (J.);
N := 5;
I a : = N;
W r i t e L n (I~);
J := I ;
J^:= -7;
WriteLn

(I~)

end.

Ejemplo 1 8 . 4

Ptr2

Qu se imprime tras ejecutar el siguiente programa?

Ptrl

Ptr2

Ptrl'

Asignacin del valor I a la variable dinmica


Ptr 1 a

program PruebaSimple;
var p, q : ''integer;
x, y : integer;
begin
new(P);
P~:= 5;
x

:= p" + 1;

689

690

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7


sentencias

y == p " ;
new ( Q ) ;
q" := y + 3;
WriteLn (x,
end.

y,

p" , ' q " )

Solucion
6 5 5 8

La distribucin grfica es:


p

18.3.2.

PA

Variables de puntero con registros


Ejemplo 1 8 . 5

Las variables de puntero pueden contener la direccin de tipos de datos simples o datos
de tipo compuesto. En las estructuras dinmicas de datos es frecuente el uso de registros
como elementos. Se suelen conocer con el nombre de nodos, aunque en realidad el trmino se extiende tanto a datos simples como compuestos. Por su importancia, y a u n q u e
la manipulacin es idntica a la ya estudiada, consideraremos un ejemplo con variables
dinmicas tipo registro.
Ejemplo
type
Estudiante = record
Nombre : string [20];
edad
: integer
end;
PunteroEst = "Estudiante;
{puede ser sustituido por)
var
{var Pl, P2 : "Estudiante]
Pl, P2, P3 : PunteroEst;
Write (Pl".nombre, P2".nombre, P3".nombre);

Algunas operaciones tpicas son:

declaraciones
P1

P2

Cul es la salida de este programa?


program Test;
type
Estudiante = record
Letra : char;
Edad
: integer
end;
PuntEstu
= "Estudiante;
var
Pl, P2 : PuntEstu;
begin
New (Pl);
Pl?Edad := 1;
Pl".Letra := ' A' ;
WriteLn (pl".Edad, Pl".Letra);
New (P 2);
P2" .Edad
-.= 2;
P2".Letra := 'B';
WriteLn (P2".Edad, P2".Letra);
Pl
:= P2;
P2".Edad
:= 3;
P2".Letra := 'C';
WriteLn (Pl".Edad, Pl".Letra, P2".Edad, P2".Letra)
end.

691

692

Programacin en Turbo/Borland Pascal 7

Estructuras dinmicas de datos: punteros y listas enlazadas

693

Ejecucin
antes

1A
2B
3C 3C

18.3.3.

Iniciacin y asignacin de punteros

Antes de intentar referirse a valores de variables es preciso, como siempre, inicializar las
variables. Los pasos a dar se muestran en las siguientes sentencias:

75
P"

despus de p" := q'

despus de p := q

var
P

P : "integer;

90

New (P);

P"

:= 17;

En un puntero (P) se deben considerar dos valores:


Puntero

(P)

Su valor es la posicin (direccin) de una variable integer.


El valor de la variable integer propiamente dicho.
p (flecha que a p u n t a a la posicin de una
variable de memoria)
p~ (contenido de esa memoria)

1. Los punteros p y q apuntan a la misma posicin; por consiguiente, pr~ y cf designan


la misma posicin y tienen el mismo valor.
2. El valor de cT se asigna a T; despus de la asignacin, /T y cp tienen el mismo valor,
sin embargo, T y q~ permanecen en distintas posiciones de memoria.
Advertencia
No se puede asignar un puntero de un tipo que apunte a un puntero de un tipo diferente.
Ejemplo
P I y P2 son punteros de tipo entero. Qu se imprimir tras la ejecucin del siguiente
segmento de programa? y cmo ser la distribucin en memoria?

El procedimiento new inicializa el puntero con la direccin de una variable integer.


La variable integer, p~, a la que P apunta debe tambin ser inicializada (P~ .-= 17).

new (pl);
new (p2) ;
Pl"
P2"
Pl
WriteLn (Pl

Recuerde
sentencia vlida
sentencia no vlida (error)

Write (P" )
Write (P)

Solucin

Asignacin
Las variables dinmicas pueden tener ms de un puntero que est apuntando a ellas.
Tambin los punteros pueden ser modificados de modo que apunten a variables dinmicas diferentes en momentos diferentes.
Estos cambios se pueden realizar con el operador de asignacin (:=). Estudiemos las
asignaciones posibles.
(1)

(2)

50

50

No se puede acceder a este valor

P2 ) ;

694

Programacin

en Turbo/Borland

Pascal 7

Estructuras

1 8 . 3 . 4 . Dispose

dinmicas

de datos: punteros

695

Significa

Grfico de memoria

Paso

y listas enlazadas

El procedimiento dispose libera la posicin de memoria ocupada por una variable dinmica.
Asignacin de memoria a P"

Formato
dispose

(P)

p variable puntero
Dispose destruye la variable referenciada por p y devuelve su zona de memoria a la pila
dinmica (heap). Despus de una llamada a dispose, el valor de P se vuelve indefinido y
cualquier intento de referenciar a P~ producir un error.
En resumen, Dispose produce las siguientes acciones:

Asignacin a P~

1. La posicin de memoria cuya direccin se almacena en P se libera de la memoria


montculo [heap). En otras palabras, P" deja de existir.
2. P se vuelve indefinido.
00

La representacin grfica es:

El contenido de P se asigna a Q de modo que


P" y CT comparten la misma posicin de
memoria

situacin despues de dispose (p)

Ejemplo 1 8 . 6
1.

<

CL

situacin inicial

P^Q"

Asignacin a Q A y P

var
P, Q : ^integer;
begin

2.
3.
4.
5.

:= P;

Q"

:= 5;

6.

Dispose

New

(P) ;

P~ := 8;
Como P y apuntan a la misma posicin, dispose libera la memoria de P y Q

(P)

end

Paso

Grfico de memoria

Significa

1
Funcionamiento de new y dlspose
Declaracin de las variables puntero
P
Q

696

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7

697

proporciona la salida
despus de newfP)
el puntero p no apunta a nada
7
p

Un puntero puede apuntar a una variable registro (record).

P~

despus de P" := 50
50
despus de dispose(P)

Ejemplo 1 8 . 8
type
RegEstudiante = record
Nombre
: string[20];
edad
: integer
end;
var ptr : "RegEstudiante;

Despus de la ejecucin del siguiente segmento de programa

18.3.5.

Constante n i 1

Pascal proporciona una constante predefinida, ni 1 (nulo), la constante nil se utiliza para
dar un valor a una variable puntero que no apunta a ninguna posicin, nil puede ser
asignada a un puntero de cualquier tipo.
p

new (Ptr);
Ptr".nombre := 1 Crchelejo';
Ptr".Edad
:= 65;

La memoria contendr

:= nil

Crchelejo

Como nil no apunta a ninguna posicin de memoria, una referencia a p~ es ilegal si


el valor de p es nil.

65

y la sentencia
WriteLn (ptr".nombre)

:= nil;

p" : = 5

es ilegal ya que se instruye a la computadora a almacenar 5


en la posicin apuntada por p, pero debido a la primera sentencia (p:=nil), p no apunta a ninguna direccin

Ejemplo 1 8 . 7 .
El segmento de programa
var
p : "char;
begin
p := nil;
if p = nil
then
WriteLn ('el puntero P no apunta a nada')
else
WriteLn ('P se queda indefinido apunta a una variable
caracter');

dar la salida
Crchelejo

1 8 . 3 . 6 . Naturaleza dinmica de los punteros


Las variables a las que se apuntan no estn declaradas. nicamente las variables a las
que se apunta se declaran. As una sentencia como:
New(P);

se puede ejecutar muchas veces dentro de un programa simple; cada vez que se ejecuta
una nueva celda de memoria. En consecuencia no existe lmite declarado para saber
cuantas celdas de memoria se pueden crear utilizando unos pocos punteros.
Los arrays se dice que son estticos debido a que la cantidad mxima de espacio de
memoria que se puede utilizar debe ser declarado por anticipado. Los punteros son di-

698

Programacin en Turbo/Borland Pascal 7

nmicos ya que no hay tal lmite previo el espacio de memoria se crea durante la ejecucin del programa.

1 8 . 3 . 7 . Comparacin de punteros
Los punteros pueden ser comparados slo en expresiones de igualdad. As, en el caso de
var
PunteroA, PunteroB : ^integer;

Estructuras dinmicas de datos: punteros y listas enlazadas

699

Ejemplo
Pl y P2 son punteros de tipo integer. Cul es la salida del siguiente segmento
grama:
new (Pl);
new (P2);
Pl" := 125;
P2" := 50;
Pl := P2;
WriteLn (Pl",

de pro-

5 c:

P2" ) ;

Despus de la ejecucin del programa, un plano de memoria podra ser sta:

las comparaciones:
if (PunteroA = PunteroB)
then < sentencia >;
if (PunteroA <> PunteroB)
then < sentencia >;

No se pueden comparar la ordenacin de punteros con los operadores de relacin < ,


>, < = y >=.
N o existe ningn problema para comparar los objetos direccionados por los punteros. La lnea siguiente es variable.
if (PunteroA" <= Puntero"B)
then < sentencia >

La salida ser
50

50

Obsrvese que el valor 125 no se puede acceder. Al valor 50 puede accederse con Pl o
con P2.

Si dos punteros P1 y P2 son del mismo tipo, el efecto de


Ejemplo 1 8 . 9 .
P1 := P2 ;

redirige Pl de modo que apunta a la celda de memoria apuntada por P2. Despus de la
ejecucin de Pl := P2, ambos punteros apuntan a la misma celda.
Se dice que dos punteros son iguales si ambos apuntan precisamente al mismo elemento de datos. En un diagrama ambos apuntan a la misma caja.
P1

Suponga que p y q son ambos de tipo cadena f^string). Qu se imprimir al ejecutar este
segmento de programa?
new (p);
new (q);
p" := 'Carpe';
:= 'Diem';
q := p;
q" := 'Concha';
WriteLn (p~);
WriteLn ( q" ) ; - -

La traza de memoria es
p

Carpe

Advertencia
Diem
No se puede asigna i un punteio de un tipo para jpuntai a un puntero de un tipo di te rente

700

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7

La direccin contenida en la variable l i s est asignada a la variable enlace.


Los punteros genricos estn especialmente concebidos para la programacin de bajo
nivel, para la cual Turbo Pascal ofrece buenas posibilidades.

La salida ser
Concha
Concha

18.3.8.

Paso de punteros como parmetros

El paso de parmetros es como conoce el lector una tcnica poderossima para procesar
informacin. El paso de punteros se realiza como cualquier otro tipo de dato, con la salvedad de que cuando se pasa un puntero c o m o un parmetro, se est pasando el puntero, no el objeto al que apunta. En el caso de una lista enlazada, el paso de la cabeza o
cabecera de la lista no pasa la lista en s, slo el puntero a su primer elemento.
El caso ms sencillo es cuando se pasa el puntero como un parmetro var. Al igual
que en otros casos similares, todos los cambios realizados a los parmetros formales se
harn tambin al parmetro real. Normalmente se utiliza un parmetro var cuando se
espera que el procedimiento cambie el puntero.
Ms complejo es el caso c u a n d o un p u n t e r o se pasa por valor. En este caso, la
computadora hace una copia legal del parmetro real de modo que cualquier cambio
hecho al parmetro formal no se reflejar de nuevo. Por ejemplo, supongamos que en el
procedimiento de escritura VerNumeros (imprime los nmeros almacenados en una pila)
en lugar de utilizar un puntero temporal para moverse a travs de la lista, se utiliza el
propio parmetro.
procedure VerNumeros (Cabeza : PtrLista);
begin
while Cabeza < > nil do
begin
WriteLn (Cabeza^.Datos);
Cabeza := Cabeza^.Siguiente;
end;
end;

n
/
El procedimiento funciona, pero" se destruye la lista cuando se cambia Cabeza: La respuesta es no ya que el parmetro valor protege el parmetro real del cambio.

18.4. EL TIPO GENERICO PUNTERO (POINTER)


Turbo Pascal permite un tipo especial de definicin de puntero: genrico o no tipificado. Difiere del puntero estndar en que no tiene un tipo base, no est definido como
un puntero hacia algn tipo, sino simplemente como una variable de tipo pointer.
Ejemplo
var
enlace : pointer;
enlace := lis;

701

{la variable lis figura en declaraciones


precedentes}

18.5.

LA FUNCION ASSIGNED

Turbo Pascal 7.0 incluye en la unidad System una funcin que determina si un puntero
o variable de tipo procedimiento es nil. Especfica si el argumento (que debe ser un puntero o variable tipo procedimiento) es nil o el argumento tiene un valor. Su sintaxis es:
function Assigned (var P) : Boolean;

donde P debe ser una referencia de un puntero o tipo procedimiento. La funcin devuelve verdadero (tru) si P no es nil, o falso ifalse) si es nil. U n a posible aplicacin se
muestra a continuacin:
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 evaluacin de P < > ni 1 para una variable


puntero, mientras que @P <> ni 11 se corresponde a una variable por procedimiento.

18.6.

LA ASIGNACION DE MEMORIA EN TURBO PASCAL

Turbo Pascal divide la memoria de su computadora en cuatro partes: el segmento de


cdigo, el segmento de datos, el segmento pila (stack) y el segmento montculo o almacenamiento dinmico (heap). Tcnicamente la pila y el montculo no estn totalmente
separados, pero funcionan como entidades separadas.
El segmento de datos est claramente dedicado al almacenamiento de datos, pero en
los otros tres segmentos tambin pueden almacenarse datos. La Figura 18.3 muestra el
mapa de memoria simplificada de Turbo Pascal 7.0. Cada mdulo (que incluye el programa principal y cada unidad) tiene su propio segmento de cdigo.
El programa principal ocupa el primer segmento de unidades (en orden inverso de
como estn listadas en la clusula uses) y el ltimo segmento de cdigo est ocupado por
la librera en tiempo de ejecucin.
El tamao de un segmento de cdigo no puede exceder de 64k, pero el tamao total
del cdigo est limitado slo por la memoria disponible. El segmento de datos contiene
todas las constantes con tipo seguidas por todas las variables globales. El tamao del seg-

702

Programacin

en Turbo/Borland

Pascal 7

Estructuras

dinmicas

de datos: punteros

y listas enlazadas

703

Cima d e la m e m o r i a DOS
Lista libre (crece hacia abajo)

FreePtr

Memoria libre

HeapPtr

Montculo (crece hacia arriba)

HeapOrg

Recubrimiento d e Buffer
Pila (crece hacia abajo)

Comienzo del
programa
principal

Aqu se a lma c e n a el
cdigo objeto.
OvrHeapEnd
OvrHeapOrg

Cdigo unidad n

SSeg:Sptr -

Pila libre

SSeg:0000 -

Variables globales

El t a m a o de la zona
d e c d i g o e s el total
del t a m a o del c d i g o
d e p r o g r a m a principal
m s el t a m a o del
c d i g o d e t o d a s las
u n i d a d e s utilizadas
por el p r o g r a m a . El
t a m a o total del
c d i g o slo e s t
limitado por la
memoria disponible.

Cdigo unidad 2

C o n s t a n t e s con tipos

DSeg:0000-

Cdigo unidad 1
S e g m e n t o d e c d i g o d e la primera unidad

S e g m e n t o d e c d i g o d e la unidad S y s t e m

Contenido d e una
imagen d e
archivo .EXE

S e g m e n t o d e cdigo de la ltima unidad


S e g m e n t o de cdigo del p r o g r a m a principal

Program S e g m e n t Prefix (PSP)


PrefixSeg
Memoria baja

Figura 1 8 . 3 .

Mapa de memoria de Turbo Pascal 7.0.

ment de la pila no puede exceder de 64k (el tamao por defecto es 16k, que se pueden
modificar con la directiva $M).
El buffer o memoria intermedia de recubrimiento (overlay) se utiliza por la unidad
estndar Overlay para almacenar cdigo recubierto. Si el programa no tiene recubrimiento, el tamao de la memoria intermedia del recubrimiento es cero.
La Figura 18.4 (modificacin de la 18.3) muestra cmo queda la memoria cuando
un programa arranca, y en ella se observa que todas las variables locales se almacenan
en la pila (stack) y las variables globales (tambin llamadas estticas) se almacenan en el
segmento de datos. El cdigo y el segmento de datos estn localizados en la parte baja
de la memoria y la pila (stack) y el almacenamiento dinmico o montculo (heap) ocupan la zona alta de la memoria.
El diagrama de la Figura 18.4 muestra tambin que la pila crece hacia abajo en la
memoria y el montculo crece hacia arriba en la memoria. Aunque la pila y el montculo
comparten la misma zona de la memoria, ellas nunca deben solaparse (recubrirse).
La mayora de las variables que se declaran en Turbo Pascal son estticas, su tamao
se fija en tiempo de compilacin y no pueden variar. Por el contrario, el montculo almacena variables dinmicas.

Se a l m a c e n a n
variables globales
(estticas) y
c o n s t a n t e s c o n tipos.

Se almacenan
variables d e
subprograma.
parmetros pasados y
o t r o s valores
auxiliares.

Fin de d a t o s

Comienzo d e la
pila
Comienzo del
montculo

Se a l m a c e n a n
variables d i n m i c a s
c r e a d a s por N e w y
GetMem.

Cima del
montculo

Espacio del montculo


no utilizado disponible
para a l m a c e n a r
variables dinmicas
adicionales.

Figura 1 8 . 4 .

Comienzo d e
datos

T a m a o d e la zona d e
d a t o s (suma d e t o d a s
las variables globales
del p r o g r a m a principal
y t o d a s las u n i d a d e s
utilizadas). El mximo
es 6 5 . 5 2 0 bytes.
El t a m a o d e la zona
d e la pila s e e s t a b l e c e
c o n las directivas del
compilador.
La pila c r e c e hacia la
zona baja d e la
memoria.
El montcuio c r e c e
hacia la zona alta d e la
memoria.

El t a m a o del
montculo se
e s t a b l e c e con las
o p c i o n e s del
compilador. Si la
memoria disponible e s
m e n o r q u e el lmite
b a j o del montculo, el
p r o g r a m a no se
cargar.

Mapa prctico de memoria de Turbo Pascal 7.0.

1 8 . 6 . 1 . El montculo (heap) y los punteros


El montculo o heap {pila de variables dinmicas o almacenamiento dinmico) almacena
variables dinmicas, esto es, las variables asignadas a travs de los procedimientos estn-

Estructuras dinmicas de datos: punteros y listas enlazadas

704

705

Programacin en Turbo/Borland Pascal 7

dar New y GetMem. El montculo puede crecer o disminuir en el segmento correspondiente, ya que utiliza tipos de datos dinmicos: los punteros, que pueden crear o liberar
variables dinmicas mientras el programa se est ejecutando. En resumen, las variables
puntero pueden utilizar y reutilizar la memoria montculo.
El tamao real del montculo depende de los valores mnimos y mximos que pueden fijarse con la directiva del compilador $M. El tamao mnimo es de O bytes, y el
mximo por defecto es de 640 Kb; esto significa que por defecto el montculo ocupar
toda la memoria restante (640 Kb viene definida por la mxima memoria direccionable
por el DOS, aunque los procesadores 8086/88 tienen diecisis segmentos que por un valor de 64k de RAM resultara 1.048.560 bytes = 1 Megobyt).
El lmite inferior del montculo se almacena en la variable HeapOrg, y el lmite o
cuota superior (lmite inferior de la memoria libre) se almacena en la variable HeapPtr.
Cada vez que una variable dinmica se asigna en el montculo (va New o GetMen), el
gestor de la pila mueve GeatPtr hacia arriba el tamao de la variable.
El uso de las variables puntero en el montculo ofrece dos ventajas principales. Primero se ampla la cantidad total de espacio de datos disponibles en un programa; el segm e n t o de datos est limitado a 64 k, pero el montculo, como ya se ha citado, est limitado slo por la cantidad de RAM en su computadora. La segunda ventaja es permitir
que su programa se ejecute con menos memoria. Por ejemplo, un programa puede tener
dos estructuras de datos muy grandes, pero slo una de ellas se utiliza en cada momento.
Si estas estructuras de datos se declaran globalmente, ellas residen en el segmento de datos y ocupan memoria en todo momento. Sin embargo, si estas estructuras de datos se
definen como punteros, se pueden poner en el montculo y quitarse cuando no se necesiten, reduciendo, por consiguiente, los requisitos, de memoria.

18.6.2,

Mtodos de liberacin de memoria

Los subprogramas que gestionan el montculo o almacenamiento dinmico son:


Asignacin

dinmica

New
Mark
Getmem

18.6.3.

de memoria

Espacio ocupado en memoria

Dispose
Release
FreeMem

18.5.4.

Mark y Release son una alternativa a utilizar New y Dispose para asignar memoria dinmicamente.
El procedimiento Mark registra la direccin de la parte superior del montculo en una
variable puntero. El procedimiento Release devuelve el montculo a un estado dado
(reestructura la direccin).

Mark (varpunt)

Nota
Recuerde q u e Dispose y Release son m t o d o s incompatibles de recuperacin de m e m o r i a .
Puede elegir utilizar u n o u otro, n u n c a utilizar a m b o s en el mismo p r o g r a m a .

18.6.5.

GetMem y FreeMem

U n t e r c e r m t o d o d e a s i g n a r m e m o r i a es GetMem y FreeMem. Se a s e m e j a n a New y Dispose

en que asignan o liberan memoria, pero GetMem y FreeMem pueden especificar cunta
memoria se desea asignar con independencia del tipo de variable que est utilizando. Se
pueden asignar bloques de memoria en la pila de una unidad de datos cuyo tamao no
se conoce en tiempo de compilacin.
GetMem crea una nueva variable dinmica del t a m a o especificado y pone la direccin
del bloque en una variable puntero.
Formato

GetMem (varpunt, tamao)

varpunt
tamao

New y Dispose

u n i n c o n v e n i e n t e : Dispose n o es c o m p a t i b l e c o n Mark y Release.

Release (varpunt)

varpunt variable puntero de cualquier tipo puntero

MaxAvail
MemAvail

Cuando Di spose libera o destruye una variable dinmica, puede dejar un agujero en el
montculo. Si hace uso frecuente de New y Di spose, puede llegar a producirse una acumulacin de espacio de memoria inservible basura (garbage). Algunos sistemas Pascal
proporcionan rutinas especficas para comprimir esa informacin inservible (garbage collection), Turbo Pascal no las soporta, pero s utiliza un sistema de gestin de la memoria
montculo muy sofisticada que minimiza la prdida de esos espacios inservibles. Los
procedimientos Mark y Release proporcionan un mtodo alternativo de gestin del montculo que eliminan la necesidad de la operacin eliminar basura. Sin embargo, hay

Mark y Release

variable puntero de cualquier tipo puntero


expresin de tipo word.

FreeMem libera una variable dinmica de un t a m a o dado.


Formato

FreeMem (varpunt, tamao)


L a s v a r i a b l e s a s i g n a d a s c o n GetMem se l i b e r a n c o n FreeMem.

706

Programacin en Turbo/Borland Pascal 7

Estructuras dinmicas de datos: punteros y listas enlazadas

Ejemplo

ciones y borrados) es frecuente, las estructuras de datos estticas (los arrays) no son adecuadas para su implementacin. Las razones son varias.

GetMem (y, 100);


i := x+y;
WriteLn (i);
FreeMem ( i, 100);

Nota

El n m e r o de bytes especificado en FreeMem debe concordar con el especificado en GetMem.


N o se debe utilizar Dispose en lugar FseeMem."
;

18.6.6.

1. Los arrays deben ser declarados en t a m a o en el programa fuente, de modo que


si se elige uno mayor que el necesario, entonces se malgasta espacio de memoria
(por ejemplo, dimensionar el array a 100 elementos y utilizar slo 20), y si se hace
el array pequeo, podra no ejecutarse el programa.
2. La operacin de aadir datos al final de la lista (el array) es un proceso rpido; sin
embargo, las inserciones y eliminaciones en el interior del array son lentas y complejas, ya que puede ser necesario desplazar cada elemento del array para hacer
espacio al nuevo elemento, o bien cerrar el espacio dejado por una eliminacin.
Si a esta dificultad se aaden los casos en que las operaciones anteriores sean frecuentes, se puede deducir que en estos casos las estructuras ms idneas son las estructuras dinmicas de datos. Se clasifican en los siguientes tipos:

MemAvail y MaxAvail

El conocimiento de cunta memoria est realmente disponible para variables dinmicas


puede ser crtico. Turbo Pascal lleva un registro de cunta memoria queda en el montculo, de m o d o que si se solicita ms de la disponible, se generar un error en tiempo de
ejecucin. La solucin es no crear una variable dinmica que sea mayor que la memoria
disponible en el montculo. Turbo Pascal proporciona dos funciones para medir la mem o r i a d i s p o n i b l e : MemAvail y MaxAvail.

^ MaxAvail devuelve el tamao del bloque libre contiguo ms grande del montculo, correspondiente al tamao de la variable dinmica ms grande que se puede asignar a la
vez. (El valor devuelto es un entero largo.)
Formato
MaxAvail

listas
\ pilas
colas

listas
rboles
grafos

Las listas enlazadas son una secuencia de nodos que se encuentran enlazados cada
uno con el siguiente mediante un enlace o puntero. Cada elemento (nodo) de una lista
enlazada debe tener dos campos: un campo (info) que contiene el valor de ese elemento
(datos) y un campo (enlace o puntero) representado" por una flecha, que indica la posicin del siguiente elemento.
Los elementos de una lista estn conectados o enlazados mediante sus campos enlace
o puntero. La Figura 18.6 muestra un array (vector) y una lista enlazada, que representan ambas una lista de enteros.

MemAvail devuelve un valor (del tipo entero largo) que indica, en bytes, la cantidad total
de memoria disponible para variables dinmicas.

Info

Enlace

Formato

Valor

Numero

Figura 1 8 . 5 .

nodo

Info = datos
Enlace = puntero

Nodo de una lista enlazada.

MemAvail
15

Ejemplos
begin
WriteLn {MemAvail, 'bytes disponibles');
WriteLn ("el bloque libre mas grande es:

18.7.

707

14

11

18

17

a)
MaxAvail, 'bytes ')

info

nodo

enlace

LISTAS ENLAZADAS

Cuando se procesan conjuntos de datos cuyo espacio de almacenamiento no se puede


predecir a prion (en tiempo de compilacin) y adems la actividad de los mismos (inser-

b)
Figura 1 8 . 6 .

Lista d e enteros: a) array; b) lista enlazada.

708

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7

Los componentes de un nodo se llaman campos. U n nodo tiene al menos un campo


datos o valor y un campo enlace o siguiente. El campo enlace apunta (indica la direccin) al siguiente nodo de la lista. Existe una marca para fin de lista, que es la constante
ya conocida ni 1, tambin representada por una barra inclinada o el signo elctrico
de tierra (Figura 18.7).
El campo datos puede contener cualquier tipo estndar o definido por el usuario. El
campo enlace contiene el punto al siguiente elemento de la lista.
Formato de declaracin de un nodo (por ejemplo, de enteros}

18.7-2.

709

Representacin grfica de una lista

U n a lista enlazada se compone de una,serie de nodos normalmente registros. Un


nodo de la lista se representa por

Datos

Siguiente

de modo que un campo son datos y el otro es un puntero.


En una lista se tienen dos punteros adicionales conocidos como Cabeza (principio) y
Cola (final). El primer puntero se denomina puntero a cabeza o simplemente cabeza de
la lista y apunta al primer nodo de la lista. Este puntero cabeza es un puntero externo
que est fuera de la lista y sirve como un medio para comprobar el principio de la lista.

type
PunteroNodo = ^TipoNodo;
TipoNodo
= record
Info : integer;
Enlace : PunteroNodo
end;

nil

Observe que la definicin del tipo puntero PunteroNodo


PunteroNodo = ^TipoNodo

Cabeza

Datos Siguiente
Figura 1 8 . 8 .

precede a la definicin del registro tipo TipoNodo. Esta es la nica situacin en que est
permitido utilizar un identificador (TipoNodo) antes de ser definido.

18.7.3.
8

nil

18.7.1.

Datos Siguiente

Un puntero de cabeza a una lista.

Estructura de una lista enlazada

Supongamos una lista enlazada que contenga enteros tal como la Figura 18.8. Cada nodo
contendr un registro TipoNodo cuya declaracin es:

8
77L

Figura 1 8 . 7 .

Datos Siguiente

type

Smbolos del elemento nil.

Implementacin de listas enlazadas con arrays

ptrTipo = ^nodoTipo
nodotipo = record
Datos : integer;
Siguiente": ptrtipo
end;

En este m o m e n t o nodoTipo es un tipo desconocido. La declaracin


var P : PtrTipo

Existen dos mtodos comnmente utilizados para implementar (realizar) listas enlazadas. En los lenguajes de programacin clsicos, las listas enlazadas se implementan utilizando arrays; los nodos se almacenan en arrays paralelos o arrays de registros, mientras
que en los lenguajes evolucionados como Pascal se realizan con punteros.
El valor del nodo se almacena en un campo y el subndice del siguiente elemento de
la lista se almacena en el campo puntero. Un valor puntero de 0 indica el fin de la lista.
U n a de las desventajas de almacenar listas en arrays es que se debe declarar un array
lo bastante grande para contener la lista ms grande posible con independencia del nmero de nodos que se utilicen realmente. En Pascal se pueden utilizar variables puntero
y asignacin dinmica para asegurar el espacio suficiente para la lista y su diseo es mucho ms flexible y potente que mediante arrays.

declara una variable puntero P del tipo PtrTipo; es decir, P puede apuntar a un nodo del
t i p o nodoTipo.

La variable puntero Cabeza, cabecera o principio de la lista es diferente de los otros


punteros y no es parte de un registro. Sirve para obtener el principio de la lista; por consiguiente, es un puntero externo que est fuera de la lista y que debe existir siempre. La
declaracin
var Cabeza : ptrTipo;

crea la variable Cabeza cuyo valor, como el de las variables n iniciadas, es indefinido. Si
el valor de Cabeza es ni 1 entonces la lista est vaca.

710

Programacin

18.8.

Estructuras

en Turbo/Borland Pascal 7

OPERACIONES EN UNA LISTA ENLAZADA

Las listas enlazadas son muy tiles para mantener informacin. El acceso a la lista se
hace comenzando por la cabeza o el principio y a continuacin se sigue de un elemento
a otro hasta que se encuentre el ltimo elemento. En enlace del ltimo elemento siempre
toma el valor nil. Las operaciones usuales dentro de una lista enlazada son:

Crear una lista vaca


Insertar un nuevo dato al principio de la lista
Insertar un nuevo dato entre nodos
Borrar la cabeza (principio) de una lista
Borrar un nodo cualquiera
Contar el nmero de elementos de una lista
Recorrer la lista
Avanzar al siguiente elemento de la lista

18.8.1.

dinmicas de datos: punteros

y listas enlazadas

711

tero temporal (Aux) que servir como puntero al espacio nuevo. El nuevo dato se situar en este elemento y el nuevo enlace del elemento se iniciar a nil.

Diem

Carpe
Cabeza

Final

Aux

Las operaciones siguientes a realizar son:


1. El enlace del elemento que contiene a 'Carpe' debe apuntar al nuevo elemento;
esta accin tiene el efecto de aadir datos a la lista

Creacin de una lista enlazada

Car
arpee

Cabeza

Cabeza
y

type
ListaPtr = ^ N o d o T i p o ;
NodoTipo = record
N o m b r e : String[20];
Siguiente : ListaPtr
end;
var Cabeza, Ultimo: ListaPtr;

Los datos se introducen por lectura desde un teclado o un archivo o mediante sentencias de asignacin. Una vez que el elemento inicial est en su sitio, se pueden aadir
elementos adicionales a la lista por un procedimiento iterativo. Se necesita un puntero
que apunte al ltimo elemento de la lista; inicialmente el puntero Ultimo (Cola o Final)-,
apunta al primer elemento

Carpe

Diem

Caroe

Inicialmente, la lista est vaca. El puntero Cabeza apuntar al primer elemento. Se crea
el primer elemento, se sitan datos en l y se establece el campo Siguiente (o Enlace) a
nil. Suponiendo que se introducen datos tipo cadena 'Carpe'.

Aux

Final

Aux

Final

2. Se cambia el contenido de Final de modo que apunte al nuevo elemento en donde


se aade el siguiente elemento.
La insercin de nuevos elementos en la lista se hace por un mtodo similar; se hace
que Aux apunte al siguiente elemento.

Cabeza
Carpe

Diem

Cabeza
Final

Ahora se inserta el siguiente elemento de datos (' Di en') en la lista. Se debe crear primero un espacio para el elemento. A fin de crear el espacio necesario, se necesita un

Final

Aux

Concha

712

Programacin en Turbo/Borland Pascai 7

Estructuras dinmicas de datos: punteros y listas enlazadas

El procedimiento CrearLista para aadir un elemento a una lista enlazada es:


1. Crear espacio para el elemento (utilizar el puntero Aux para asignar espacio; situar
los datos nuevos en esta posicin y fijar Enlace o Siguiente a nil)
2. Aadir el elemento a la lista
3. Ajustar Ultimo que apunte al nuevo elemento

713

Aux = Cabeza
{Aux, puntero actual}
mientras puntero actual no sea nil hacer
Escribir los campos datos del nodo actual
Establecer el puntero actual al siguiente campo
' fin

Sea la lista siguiente

Ejemplo
Crear una lista enlazada que contenga tres nodos con palabras en su interior
program Crear;
type
ListaPtr = "NodoTipo;
NodoTipo = record
Nombre
: string[20]Siguiente : ListaPtr
end;
var Cabeza, Final, Aux : ListaPtr-;
begin
new (Cabeza)
Cabeza"" . Nombre ;= 'Carpe';
Final := Cabeza
new (Aux)
Aux"'.Nombre := 'Dien';
Final".Siguiente:= Aux;
Final := Aux
new(Aux ) ;
Aux".Nombre := 'Concha 1 ;
Final"' . Siguiente := Aux;
Final := Aux;
Final".Siguiente := nil;
(proceso de la lista enlazada}

Cabeza

Inicialmente, el valor de Cabeza se sita en Aux, produciendo la siguiente situacin:

crea primer nodo


inserta valor
actualiza ltimo
crea nuevo nodo
inserta valor
enlaza
actualiza ltimo
igual que operaciones
con Concha

Cabeza

anteriores

Aux

El valor de Aux no es nil, de m o d o que se utiliza el contenido actual (A). La parte


Siguiente de este elemento se convierte en el nuevo valor de Aux, de modo que Aux apunta
al elemento siguiente.

centinela

end.

18.8.2.

Recorrido de una lista

El proceso de acceder a los elementos de la lista, comenzando en el primero y siguiendo


los enlaces hasta el final de la lista se llama recorrido de la lista. La posicin del primer
elemento de la lista est contenida en el puntero Cabeza, donde comienza el proceso. Se
necesita un puntero Aux para apuntar a los elementos de la lista u n o a uno. El valor inicial de Aux es el contenido de Cabeza; mientras el valor de Aux no sea igual a ni 1, se puede
utilizar los campos de datos de estos elementos de la lista (Aux" .Datos) y a continuacin
se sigue al elemento siguiente sustituyendo Aux con el valor de Aux" .siguiente.

Cabeza

Como el valor de Aux no es nil (nulo), se utiliza el contenido del elemento y se ajusta
al valor de Aux para apuntar al elemento siguiente.

P r o c e d i m i e n t o p a r a recorrer u n a lista

Establecer un puntero que apunte al primer nodo de la lista

Aux

Cabeza

714

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7

De nuevo el valor de Aux no es ni 1, de modo que los datos de ese elemento se utilizan
y la parte de enlace o siguiente del elemento se convierte en el nuevo valor de Aux.

concha

Diem

Carpe

Cabeza

Aux

Ahora el valor de Aux es nil, de m o d o que la lista se ha recorrido totalmente y termina el proceso.

715

L a d e c l a r a c i n d e los p u n t e r o s Actual y A n t e r i o r
var Actual
: ListaPtr;
Anterior : ListaPtr;

{puntero al nodo actual}


{puntero al nodo anterior}

La operacin que se desea realizar es eliminar de la vista el nodo al que apunta Actual. Un sistema es el indicado en la Figura 18.9, modificando el valor del puntero del
campo Siguiente en el nodo n-1, que ahora debe apuntar al nodo sucesor a n, pnenteando (saltando) para ello a n. Obsrvese, sin embargo, que este cambio no modifica el
nodo n que sigue existiendo y adems sigue apuntando al mismo nodo que antes, pero
el objetivo final se ha logrado ya que el nodo ha sido eliminado realmente de la lista. El
procedimiento VerLista no visualizar el contenido del nodo n. La eliminacin del nodo
al q u e a p u n t a Actual es:
Anterior^.Siguiente := Actual^.Siguiente

Algoritmo
,

E s t e m t o d o n o f u n c i o n a si el n o d o q u e se d e s e a b o r r a r d e la lista es el p r i m e r n o d o ,
ya q u e e n este c a s o n o t i e n e s e n t i d o el p u n t e r o A n t e r i o r .

procedure
VerLista (Cabeza : ListaPtr);
{visualizar cada uno de los nombres de la lista}
var ptr : ListaPtr;

Borrado del p r i m e r n o d o

Cuando se borra el primer nodo de la lista, se debe cambiar el valor de Cabeza, de modo
que despus de la eliminacin, habr un nuevo primer nodo en la lista; es decir, el nodo
que era segundo antes de la eliminacin ahora es el primero. Este cambio se hace con la
sentencia de asignacin

begin
Ptr := Cabeza
{se apunta al primer nodo}
while p t r o n i l do
begin
WriteLn (ptr~.nombre);
ptr := ptr~.siguiente
end
end;

18.8.3.

Cabeza ;= Actual^.Siguiente;

15

Eliminacin de elementos

La operacin de eliminar (borrar) un nodo especfico supone que la lista ya existe. Se


pueden considerar dos casos: eliminar el primer elemento de la lista y eliminar un ele-/
ment del interior de la lista. El proceso requiere un puntero cabeza y dos variables pun-

500

Cabeza
Actual

t e r o s e x t e r n o s Actual v A n t e r i o r .
Anterior
Valor antiguo
Figura 1 8 . 1 0 .
Cabeza

10

Anterior
Figura 1 8 . 9 .

15

Actual
Borrar un nodo de una lista enlazada.

Eliminar ei primer nodo.

500

Aunque, como se ha dicho antes, el nodo eliminado no ha desaparecido fsicamente,


no tiene sentido malgastar memoria, por lo que es conveniente liberar el espacio de almacenamiento ocupado por dicho nodo. Por consiguiente, se debe liberar ese espacio de
memoria mediante el procedimiento Dispose. As, antes de cambiar el valor de Actual se
deben utilizar las sentencias:
Actual^.Siguiente := nil;

716

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7

717

Cabeza

dispose(Actual);
Actual := nil;

que devuelven el nodo n al sistema

18.8.4.

Insertar un nodo en una posicin especfica

Los casos que se pueden dar para insertar un nodo en una lista son tres:
Insertar un nodo entre nodos.
Insertar un nodo al principio de la lista.
Insertar un nodo al final de la lista.

Figura 1 8 . 1 2 .

Insercin al principio de una lista enlazada.

I n s e r c i n d e un n o d o e n el interior d e la lista

La Figura 18.11 ilustra la tcnica de insertar un nodo en una posicin especificada de


una lista enlazada. Se inserta el nuevo nodo al que apunta la variable puntero NuevoPtr
entre los nodos que apunten los dos nodos Anterior y Actual.

las sentencias siguientes realizan esta tarea:


NuevoPtr".Siguiente := Cabeza;
Cabeza := NuevoPtr;

Valor antiguo
100

800

1000

Insercin d e u n n o d o al f i n a l d e la lista

Anterior
Figura 1 8 . 1 1 .

Obsrvese que si la lista est vaca entes de la insercin, Cabeza es nil de modo que el
campo Siguiente del nuevo elemento se ha de fijar a nil.

La operacin de insertar un nodo al final de una lista, es potencialmente un caso especial


en el que el puntero Actual tenga el valor de nil y Anterior apunte al ltimo nodo de la
lista.
Las parejas de sentencias de asignacin son:

Actual
Insercin de un n o d o en una lista enlazada.

NuevoPtr".Siguiente := Actual;
Anterior".Siguiente := NuevoPtr;

La insercin se puede realizar mediante las dos sentencias de asignacin siguientes:


NuevoPtr".Siguiente := Actual;
Anterior".Siguiente := Nuevo Ptr;

realiza realmente la tarea de insertar un nodo al final de la lista.

N a t u r a l m e n t e , e s t e m t o d o r e q u i e r e q u e l a s v a r i a b l e s A n t e r i o r , Actual y NuevoPtr

apunten a los nodos apropiados; para ello se establecen los valores de Anterior y Actual
recorriendo la lista hasta que se encuentre el lugar indicado. A continuacin se crea un
nuevo nodo al que apunte NuevoPtr mediante la llamada al procedimiento New siguiente:

valor antiguo

new(NuevoPtr) ;

Anterior

Despus que se establece la parte de datos de este nuevo nodo se inserta en la lista,
tai como se ha descrito antes.

NuevoPtr

I n s e r c i n d e u n n o d o al principio d e la lista

La operacin de insercin requiere que la variable Cabeza apunte al nuevo nodo y el nuevo
nodo apunte al nodo que antes era el primero de la lista

y /
Figura 1 8 . 1 3 .

Actual

Insercin al final de una lista enlazada.

718

Programacin en Turbo/Borland Pascal 7

18.8.5.

Estructuras dinmicas de datos: punteros y listas enlazadas

Realizacin prctica de operaciones en listas

begin
new (aux);
{obtiene un nuevo nodo}
aux".info := valor;
{almacena la informacin en el nuevo nodoaux".enlace := Lista;{insertar el nodo al principio de la
lista}
Lista := aux {la cabecera de Lista apunta el nuevo nodo};
end;

Recapitulacin de las operaciones importantes en una lista enlazada


Iniciacin
Creacin
Insertar (al principio y al final)
Recorrido
Eliminacin

I n s e r t a r al f i n a l d e la l i s t a

Iniciacin

procedure InsertarDespues (var Lista:TipoLista; valor:Tipolnfo);


{inserta el nuevo nodo, como ultimo}
var
anterior, actual, aux : TipoLista;
begin
new (aux);
{crear nuevo nodo}
aux".info := valor
{inicializa contenido nuevo nodo
aux".enlace := nil;
anterior := nil;
actual ;= Lista;
while actual <> nil do
begin
anterior : = actual;
actual := actual".enlace
end;
{si la lista original esta vacia entonces el primer puntero
apunta al nuevo nodo}
if anterior = nil then
Lista := aux
else
anterior".enlace := aux
end;

La primera operacin a realizar con una lista enlazada es la iniciacin. Esta operacin
construye una lista vaca, es decir, una estructura que no contiene elementos
procedure Iniciar (var Lista : TipoLista);
{salida, lista lineal enlazada}
begin
Lista := nil {fija el puntero del primer nodo a nil)
end;
Creacin

La construccin de una lista enlazada comienza con una lista vaca, insertando un nuevo
elemento (nodo) al principio de una lista. El procedimiento funciona insertando al principio de una lista vaca o bien insertando al principio de una lista no vaca.
En primer lugar se debe declarar un nodo tipo registro, con dos campos, uno de tipo
cadena (info) y otro de tipo enlace que es un puntero.
type
Tipolnfo = String[9];
TipoLista = "TipoNodo;
TipoNodo = record
Info
: Tipolnfo;
Enlace : TipoLista
end;
var
Lista : TipoLista

A continuacin se debe declarar un procedimiento Insertar, al que se llamar cada


vez que se desee insertar un nuevo nodo (elemento) en la lista. El procedimiento Insertar tiene dos variantes (1) insertar al principio de una lista enlazada InsertarAntes (2)
insertar al final de una lista enlazada, InsertarDespues.
I n s e r t a r al principio d e la lista
procedure InsertarAntes (var Lista:TipoLista; {entrada/salida}
valor:TipoInfo {entrada de informacin})
{inserta valor en un nuevo nodo al principio de la lista Lista}
var
aux : TipoLista;

719

>
Recorrido d e u n a lista

La operacin de imprimir los datos de una lista se conoce como recorrido. Se debe comenzar por la cabecera de la lista y seguir con todos los punteros de la lista, imprimiendo todos los campos info (datos).
procedure ImprimirLista (Lista : TipoLista) ;
{imprimir los valores de cada nodo apuntado por lista}
begin
while Lista <> nil do
begin
WriteLn (Lista".info);
{imprime el valor del nodo )
Lista := Lista".enlace
{avanza al siguiente nodo}
end
end;
{ImprimirLista}

720

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7

procedure Insertar (var Final:Listaptr; Elemento:cad9);


var
Nuevo : Listaptr;
begin
new (Nuevo);
Nuevo".Nombre := Elemento;
Nuevo".Enlace := nil;
Final^.. Enlace := Nuevo;
Final"
:= Nuevo
end;

E l i m i n a c i n d e un nodo

Borrar o eliminar el nodo al que se est apuntando, exige conectar el nodo precedente al
nodo despus del que se desea borrar.

procedure Leer (Inicio : Listaptr);


begin
while Inicio <> nil do
begin
Write (Inicio".Nombre, '..');
Inicio := Inicio" .Enlace
end
end;

procedure Borrar (var Lista:TipoLista; Pl:TipoLista);


{P1, elemento a borrar}
var
Q1 : TipoLista;
{puntero que se mueve por la lista
begin
if Pl = Lista then
(si es el primer elemento}
Lista := Lista".Enlace
{Eliminar Pl"}
else {sino encontrar elemento antes de Pl}
begin
Q1 := Lista;
while Ql".Enlace < > Pl do
Q1 := Ql".Enlace;
Ql".enlace := Pl".Enlace
{eliminar Pl"}
end;
{else}
dispose (Pl)
{liberar memoria}
end;
{Borrar}

begin
{programa principal}
New (Primero);
Primero".Nombre
:= 'comienzo 1 ;
Primero".Enlace
:= nil;
Ultimo
:= Primero;
WriteLn ('Insercin: introduzca palabras(Fin/Terminar)');
repeat
ReadLn (Cadena);
Insertar (Ultimo, Cadena)
until cadena = 'Fin';
Leer (Primero)
end.

Problema 1 8 . 1

Crear una lista enlazada, insertar nuevos nodos (al final de la lista) y recorrer la lista.

18.9.

Anlisis

Se necesitan tres punteros:


Primero
ultimo
Nuevo

apunta hacia el primer elemento de la lista


apunta hacia el ltimo elemento de la lista
elemento a insertar, apuntado por nuevo

program Dinmico;
type
Cad9
= string^];
Listaptr = "Nodo;
Nodo
= record
Nombre : Cad9;
Enlace : Listaptr
end;
var
Primero, Ultimo : Listaptr;
Cadena
: Cad9;

721

LISTAS CIRCULARES

Las listas son estructuras muy ricas y variadas. Hemos visto las ms simples: las listas
lineales. Veamos ahora otros tipos de listas, similares a las ya estudiadas: las listas circulares. Una lista lineal enlazada circularmente, o simplemente una lista circular, es una
lista en la que el puntero siguiente al ltimo elemento apunta hacia el primer elemento
o nodo (Figura 18.14). En estas lneas no existe ni primero ni ltimo elementos, aunque
se debe elegir obligatoriamente un puntero para referenciar la lista.

Figura 1 8 . 1 4 .

Lista circular.

722

Programacin en Turbo/Borland Pascal 7

Estructuras dinmicas de datos: punteros y listas enlazadas

Esta lista presenta la gran ventaja de que cada nodo en una lista circular es accesible
desde cualquier nodo. Tiene el inconveniente de que requiere un diseo cuidadoso para
evitar caer en un bucle infinito.
Procedimiento Insertar

nodo
Ida

Info

Dcha.

Ida

Dcha.

Este procedimiento describe la insercin del elemento apuntado por nuevo a continuacin del elemento apuntado despus.
b)

procedure Insertar (var Despues : TipoLista; Nuevo:TipoLista);


begin
if Despues = nil
then
Despues := Nuevo
else
Nuevo''.Enlace
:= Despues'.Enlace;
Despues'.Enlace ;= Nuevo
end;
Procedimiento suprimir

Este procedimiento borra el elemento que sigue al elemento designado por el puntero
Despues.
procedure Suprimir (var Despues: TipoLista);
{elimina el elemento que sigue al apuntado por Despues)
var
Aux : TipoLista;
begin
if Despues o nil
then
begin
Aux := Despues'.Enlace;
if Despues = Aux
then Despues := nil
else Despues'.Enlace := Aux'.Enlace;
Dispose (Aux)
end
end;

18.9.1.

Listas circulares versus listas enlazadas

Uno de los inconvenientes de las listas enlazadas es que dado un puntero P a un nodo de
la lista, no se puede alcanzar ninguno de los nodos que preceden a nodo(p). Si se recorre
una lista, el puntero original al principio de la lista debe ser guardado con el objeto de
poder referenciar de nuevo la lista.
La lista circular resuelve este problema al permitir que desde cualquier punto de la
lista es posible alcanzar cualquier otro punto de la lista. Si se comienza en un nodo dado
y se recorre la lista completa, se terminar en el puntero inicial.

723

Figura 1 8 . 1 5 .

Lista lineal d o b l e m e n t e enlazada.

Otra consideracin a tener en cuenta, es que un valor nil en el puntero externo indica una lista vaca. Sin embargo, ningn nodo de la lista circular contiene nil en su
campo Siguiente. Por consiguiente, se deben modificar los algoritmos de lectura de modo
que se detecte cuando se ha recorrido una lista completa.

18.10.

LISTAS DOBLEMENTE ENLAZADAS

Hasta este momento, las listas enlazadas se han recorrido en un solo sentido, de izquierda a derecha. En muchas aplicaciones se requiere recorrer la lista en ambas direcciones. Estos recorridos se pueden conseguir manteniendo dos campos de enlace en cada
nodo, en lugar de uno. Estos enlaces (punteros) se utilizan para denotar la direccin del
predecesor y sucesor de un nodo dado. El predecesor se llama enlace izquierdo y el sucesor enlace derecho. Una lista cuya estructura de nodos contiene dos campos de enlace
se denominar lista lineal doblemente enlazada (Figura 18.15)
Una lista doblemente enlazada se declara como una lista enlazada pero con tres campos: un campo info que contiene la informacin almacenada en el nodo, y los campos
izquierda (Izda) y derecha (Ocha), que contienen punteros a los nodos de cualquier lado.
As se puede declarar un conjunto de nodos tales como
const numNodos = 500;
type ptrNodos = 0..numNodos;
tipoNodo = record
Info : integer;
Izda, Dcha : ptrNodos
end;
var Nodo : array [1..numNodos] of TipoNodo;

Las siguientes declaraciones describen un nodo general de una lista doblemente enlazada:
type
TipoListaPtr = 'TipoNodo;
TipoLista = record
Ida, Dcha : TipoListaPtr
end;

7 24

Programacin

Estructuras dinmicas de datos: punteros

en Trurbo/Borand Pascal 7

y listas enlazadas

725

TipoNodo = record
PtrI : TipoListaptr;
Info : Tipolnfo;
PtrD : TipoListaptr
end;

Ejemplo
Declaracin de una lista doblemente enlazada que contenga nombres de informticos
famosos (nombre y primer apellido)

b)
Figura 1 8 . 1 7 .

Cabeza

18.11.

Final
>

James

Rumbaugh

Grady

Booch

Turing

Alan

type
TipoDato = record
Nombre
: Strings[25];
Apellido : Strings[25]
end;
PunteroNodo = "Nodo;
Nodo = record
Izda
: PunteroNodo;
Datos : TipoDato;
Dcha
: PunteroNodo
end ;
Lista = record
Cabeza : PunteroNodo;
Cola
: PunteroNodo
end;
var
Nombre : Lista;

DISEO DE PILAS CON LISTAS ENLAZADAS

El mayor inconveniente de la impiementacin de ua pila mediante arrays es que el tamao mximo de la pila se debe especificar en tiempo de compilacin. Esta es una limitacin muy seria ya que las pilas se utilizan en muchas y diferentes aplicaciones, la
mayora de las cuales requieren espacios de memoria que son imposibles de predecir
cuando se disean las pilas. Las listas enlazadas son la solucin ideal para resolver este
problema. Esta seccin explica cmo implementar pilas utilizando listas enlazadas en lugar de arrays.
U n a pila es una lista enlazada en la cual se realizan las inserciones y eliminaciones
en la cabecera de la lista.

Cima

(a) Pila de cinco caracteres


CARPE

(>) Pila d e s p u s de aadir "$"


pila CARPE

18.10.1.

Lista circular doblemente enlazada con un nodo cabecera.

pila $CARPE

Tipos de listas doblemente enlazadas

Las listas doblemente enlazadas pueden ser lineales o circulares y pueden o no contener
un nodo de cabecera o cabeza.
Por ltimo, se puede considerar el nuevo tipo de lista: la lista circular doblemente
enlazada con un nodo cabecera.

Figura 1 8 . 1 6 .

Pila de caracteres implementada con una lista enlazada.

726

Estructuras dinmicas de datos: punteros y listas enlazadas

Programacin en Turbo/Borland Pascal 7

begin
Exito := not PilaEsVacia(P);
if Exito
then
{la pila no esta vacia}
begin
PtrCima := P;
P := P" . Siguiente;
dispose (PtrCima)
end
end;

Cada elemento de una pila se puede almacenar en un nodo con un campo dato y un
tipo puntero que apunta al siguiente nodo de la pila.
D e c l a r a c i n d e la pila

Cada elemento de una pila se puede almacenar en un nodo con un campo dato que representa el tipo elemento (tipo Tipoltem) y un c a m p o puntero > ( t i p o SigPila) que apunta

al siguiente nodo de la pila (tipo Ti poNodo). Estos tipos de datos se declaran al principio
del programa
type Tipoltem = <Tipo deseado de elemento
y ; , V SigPila
= "TipoNodo; r-'1 'c
-j.
TipoNodo = record
X-Vltem : Tipoltem;
Siguiente : SigPila
end;

1TO

de la pila>

{obtiene la cima de la pila, si la pila no esta vacia}


procedure ObtenerCimaPila (P:TipoPila; var CimaPila:Tipoltem;
var Exito : Boolean);
begin
Exito ;= not PilaEsVacia (P);
if Exito
then CimaPila := p".Item
end;

TipoPila = SigPila;
O p e r a c i o n e s d e m a n i p u l a c i n d e la pila

18.12.

{creacin de la pila}
procedure CrearPila (var P : TipoPila);
crea una pila vaca
begin
P := nil
end;
{comprueba si la pila est vacia}
function PilaEsVacia ( P ; TipoPila) : boolean;
begin
PilaEsVacia := (P = nil)
end;
{meter o poner un dato en la pila}
procedure Poner (var P : TipoPila; Nuevolten : Tipoltem;
var Exito : boolean);
var Nuevo PtrCima : SigPila;
begin
{crear un nuevo nodo}
new (NuevoPtrCima);
N u e v o P t r C i m a " . I t e m := Nuevoltem;
{insertar un nuevo nodo}
NuevoPtrCima".Siguiente := P;
P := NuevoPtrCima;
Exito := true
end;
{Poner, meter un dato en la pila}
{Quitar o sacar un dato de la pila}
procedure Quitar (var P : TipoPila; var Exito : Boolean);
var
PtrCima : SigPila;

DISEO DE COLAS CON LISTAS ENLAZADAS

Una cola es otra estructura muy popular en aplicaciones informticas, por ejemplo, para
modelar un conjunto de tareas de trabajo que estn pendientes de imprimirse en la impresora de un centro de clculo que dispone de una impresora central. Una cola difiere
de la pila en que los nuevos elementos se insertan por un extremo (al final de la cola) y
los elementos existentes se eliminan por el otro extremo (el frente o cabeza de la cola).
De este modo el elemento que lleva ms tiempo esperando (en. existencia) es el primero
que se quita o elimina. En contraste, los elementos de la pila se insertan y eliminan desde
un mismo extremo (la cima de la pila). Las operaciones tpicas de la cola son:

Crear
Insertar
Quitar
Recuperar
Est vaca?
Est llena?
Tamao de la cola (en su caso)

C r e a r la cola

La declaracin de un tipo de dato cola es


type
SigCola = "TipoNodo;
Tipoltem = string [10];
TipoNodo = record
Item
: Tipoltem;
siguiente
: SigCola;

728

Programacin en Turbo/Borland Pascal 7

Estructuras dinmicas de datos: punteros y listas enlazadas

end;
TipoCola = record
frente, final : SigCola
end;
var
Q
: TipoCola;
Item
: Tipoltem;
Exito : boolean;

begin
Exito := not ColaEsVacia(Q);
if Exito then
begin
PtrFrente := Q.frente;
Item := PtrFrente"" . item;
Q.frente := Q . frente"'. siguiente ;
if Q.frente = nil then
Q.final := nil;
dispose(PtrFrente);
end {if}
end;

O p e r a c i o n e s d e m a n i p u l a c i n d e u n a cola
Procedure CrearCola (var Q: TipoCola);
begin
Q.frente : = nil;
Q.final := nil;
end;
function ColaEsVacia (Q: TipoCola) : boolean;
begin
ColaEsVacia := (Q.frente = nil)
end;
procedure LeerFrenteCola (Q: TipoCola; var Item: Tipoltem;
var Exito: boolean);
begin
Exito := not ColaEsVacia(Q);
if Exito then
Item := Q.frente^.item
end;
procedure Insertar (var Q: TipoCola; Nuevoltem: Tipoltem;
var Exito: boolean);
var
NuevoPtrFrente: SigCola;
begin
(obtener un nuevo nodo}
New(NuevoPtrFrente);
NuevoPtrFrente^.Item := Nuevoltem;
NuevoPtrFrente^.siguiente := nil;
if ColaEsVacia(Q) then
Q.frente := NuevoPtrFrente
else
Q.final".siguiente := NuevoPtrFrente;
Q.final := NuevoPtrFrente;
Exito := true
end;
procedure Eliminar (var Q: TipoCola; var Item: Tipoltem;
var Exito: boolean);
var
PtrFrente : SigCola;

729

18.13.

PUESTA A PUNTO DE PROGRAMAS

Tcnicas de p r o g r a m a c i n

Un puntero es la direccin de una posicin de memoria en la que slo un valor de


ese tipo se puede almacenar.
Para verificar si una expresin con punteros es correcta, verificar el tipo para ver
si es un tipo puntero o un tipo nodo.
Las ventajas de una lista enlazada sobre un array es que la lista enlazada puede
crecer y contraerse, y que es fcil insertar o borrar un valor (nodo) en el centro de
una lista enlazada.
La constante ni 1 se utiliza para marcar puntos finales, tal como el fin de una lista
enlazada, y denota estructuras vacas, tales como una lista enlazada vaca o un rbol vaco.
Verificar siempre que los procedimientos para manipular estructuras de datos dinmicas, tales como listas enlazadas y rboles, funcionan correctamente para la
estructura vaca.
.
Los nicos valores que se pueden asignar a una variable puntero utilizando una
sentencia de asignacin son el valor nil o el valor de otra variable puntero del
mismo tipo.
Las operaciones aritmticas no se pueden ejecutar sobre punteros.
Los valores punteros no pueden ser comparados con los operadores relacinales
<, <=, > y >=. Slo estn permitidos los operadores = y < > .
Los valores punteros no pueden leerse o visualizarse.
Los punteros pueden ser utilizados como parmetros en funciones y procedimientos, pero los parmetros correspondientes actuales y formales no pueden estar limitados a tipos diferentes.
El valor de un puntero P es la direccin de una posicin de memoria, mientras que
el valor de P" es el dato almacenado en esa posicin.
Un puntero indefinido no es lo mismo que un puntero nil.
Si P es un puntero que es indefinido o nil, cualquier ihtento de utilizar P" es un
error.

730

Programacin

en Turbo/Borland

Pascal 7

Errores t p i c o s d e p r o g r a m a c i n

La depuracin de un programa que implique variables de puntero puede ser, a veces, difcil, debido al hecho de que el valor de una variable puntero representa una
direccin de la celda de memoria y normalmente no se puede imprimir. En consecuencia, si un valor puntero no es vlido o incorrecto, puede ser difcil encontrar
cual es el error.
Asegrese de que el smbolo ~ sigue a cada variable de puntero utilizada para designar un nodo particular o registro. El ~ debe escribirse siempre cuando se desea
manipular un campo de un nodo.
Asegrese que se utiliza el operador ~ donde se necesita. Si ptr es una variable
puntero, P t r \ x se utilizar para referenciar al campo x del registro apuntado por
ptr.

Los procedimientos new y dispose asignan y liberan respectivamente almacenamiento en memoria. Ambos procedimientos requieren un parmetro que es una
variable puntero.
new(P) es correcta
new(P A ) es incorrecta

Otra posible causa de error es el intento de referenciar un campo de un nodo


apuntado por un puntero cuyo valor es nil. Esta operacin no es legal, ya que el
puntero nil es un valor especial utilizado para indicar el fin de una lista.

RESUMEN
En este captulo se introduce un nuevo tipo de estructuras de datos: las listas lineales
enlazadas. Al contrario que los arrays, el tamao de una lista enlazada puede variar durante la ejecucin de un algoritmo (programa). En las estructuras de datos elementales
(arrays) los elementos se almacenaban en memoria de modo adyacente, mientras que en
el caso de las listas enlazadas los elementos lgicamente contiguos no tiene por qu ser
adyacentes fsicamente. Se describen en el captulo diferentes estructuras enlazadas: listas
enlazadas simples, listas enlazadas circularmente y listas doblemente enlazadas.

Estructuras

dinmicas

de datos: punteros

y listas enlazadas

731

5. Disear un procedimiento q u e inserte un n o d o al final de una lista circular.


6. Escribir los procedimientos insertar y borrar un elemento en una lista circular.
7. Cuntos rboles diferentes existen con tres nodos?
8. Escribir procedimientos que permitan la eliminacin y bsqueda de un nodo en una lista doblemente enlazada.

PROBLEMAS
1. Con la ayuda de las declaraciones siguientes
type
Ptr = "Nodo;
Nodo = record
Numero : integer;
Enlace : Ptr
end;
var
primero, Ultimo, Nuevo : Ptr;
escribir u n p r o g r a m a que cree una lista enlazada de n m e r o s enteros. Cada n m e r o se sita
en orden creciente. El p r o g r a m a visualizar el contenido de la lista.
2. Escribir u n p r o g r a m a que ejecute las operaciones siguientes:
a) Crear u n a lista enlazada con los tipos de datos siguientes:
type
Ptr = "Nodo
Nodo = record
Info
: string [30];
Enlace : Ptr
end;
b) Recorrido de la lista e impresin de sus elementos.

EJERCICIOS
1. Dada u n a lista lineal enlazada sencilla, cuyos n o d o s tienen la estructura (Info y Enlace), disear
un procedimiento q u e cuente el n m e r o de nodos de la lista.
2. Escribir un procedimiento que m o d i f i q u e el c a m p o Info del n o d o n-simo de u n a lista enlazada
por un valor d a d o t.
3. Construir un procedimiento que realice u n a insercin i n m e d i a t a m e n t e antes del n o d o -simo
de la lista.
4. Escribir un procedimiento que inserte u n n o d o al final de u n a lista circular.

3. Escribir u n p r o g r a m a que lea un texto de longitud i n d e t e r m i n a d a y que produzca c o m o resultado la lista de todas las palabras diferentes contenidas en el texto, as c o m o su frecuencia de
aparicin.
4. U n p o l i n o m i o p u e d e ser representado por una lista en la q u e cada n o d o c o n t i e n e un coeficiente, un e x p o n e n t e y un p u n t e r o o enlace hacia el siguiente elemento.
type
Puntero = "Nodo;
Nodo
= record
Coeficiente : real;
Exponente
: integer;
Enlace
: Puntero
end;

732

Programacin

en Turbo/Borland

Pascal 7

Ejemplo: 6x} - 2x + 5

CAPITULO i
Escribir un procedimiento que ejecute la suma y diferencia de dos polinomios almacenados
de esta forma.
5. Utilizar una lista para controlar una lista de pasajeros de una lnea area. El programa principal debe ser controlado por men y permitir al usuario visualizar los datos de un pasajero determinado, visualizar la lista completa, crear una lista, insertar un nodo, borrar un nodo y sustituir los datos personales de un determinado pasajero.
6. Disear un programa interactivo que gestione una lista ordenada simplemente enlazada de
nmeros enteros.
7. Disear un programa interactivo que gestione una pila de nmeros enteros.
8. Escribir un programa que lea un texto de longitud indeterminada y que produzca como resultado la lista de todas las palabras diferentes contenidas en el texto as como su frecuencia de
aparicin.
9. Disear un procedimiento que inserte nodos en una lista simplemente enlazada y en una posicin determinada. Repetir la operacin para el caso de una lista doblemente enlazada (si la
posicin es mayor que el nmero de nodos de la lista, evidentemente, deber insertarse al final).
10. Construir un programa que gestione una lista doblemente enlazada que permanezca ordenada
durante la ejecucin del programa.
11. Escribir un procedimiento que permita ordenar una lista enlazada y otro para ordenar una
lista doblemente enlazada, sin utilizar otras estructuras auxiliares.

19

ARBOLES
CONTENIDO
19.1.
19.2.
19.3.
19.4.
19.5.
19.6.
19.7.

Concepto de rbol
Arboles binarios
Arboles de expresin
Construccin de un rbol binario
Recorrido de un rbol
Arbol binario de bsqueda
Operaciones con rboles binarios de bsqueda

RESUMEN
EJERCICIOS
PROBLEMAS

En e s t e captulo se centra la atencin sobre una estructura de datos


cuyo uso est muy extendido y e s muy til en numerosas aplicaciones. S e definen formas de esta estructura de datos (rboles generales, rboles binarios y rboles binarios de bsqueda) y c m o s e pueden representar en Pascal, as c o m o el mtodo para su aplicacin en
la resolucin de una amplia variedad de problemas. Al igual que ha
sucedido anteriormente con las listas, los rboles s e tratan principalmente c o m o estructura de datos en lugar de c o m o tipos de datos.
Es decir, nos centraremos principalmente en los algoritmos e implementaciones en lugar de en definiciones matemticas.
Los rboles junto con los grafos constituyen estructuras de datos
no lineales.

1 9 . 1 . CONCEPTO DE ARBOL
U n rbol (en ingls, tree) s o n e s t r u c t u r a s q u e o r g a n i z a n sus e l e m e n t o s , d e n o m i n a d o s nodos, f o r m a n d o j e r a r q u a s . L o s c i e n t f i c o s u t i l i z a n los r b o l e s g e n e r a l e s p a r a r e p r e s e n t a r
relaciones. F u n d a m e n t a l m e n t e la r e l a c i n clave es la de padre-hijo
e n t r e los n o d o s del
rbol. Si existe u n a arista ( r a m a ) d i r i g i d a del n o d o n al n o d o m, e n t o n c e s n es el padre d e
m y m es u n hijo d e n. E n el r b o l d e la F i g u r a 19.1, los n o d o s B y C s o n h i j o s del n o d o A.
L o s h i j o s del m i s m o p a d r e se l l a m a n hermanos, p o r e j e m p l o B y C. C a d a n o d o d e u n
r b o l t i e n e al m e n o s u n p a d r e y existe, u n n i c o n o d o , d e n o m i n a d o raz del rbol, q u e
n o t i e n e p a d r e . El n o d o A es el raz del r b o l d e la F i g u r a 19.1. U n n o d o q u e n o t i e n e
h i j o s se l l a m a hoja del r b o l . L a s h o j a s del r b o l d e la F i g u r a 19.1 s o n C, D , E y F.

733

734

Arboles

Programacin en Turbo/Borland Pascal 7

Altura del rbol '


A

Padre

B, C

hijos del nodo A

D, E, F

hijos del nodo B

B, C

hermanos

Altura de un nodo

Nivel (profundidad)
Figura 1 9 . 1 .

Arbol general.

Terminologa bsica
raz, padre, hijo, hermano, hoja

Grado (aridad)
La relacin padre-hijo entre los nodos se generaliza en las relaciones ascendiente (antecesor) y descendiente. En la Figura 19.1 A es un antecesor de D, y por consiguiente D
es un descendiente de A. Obsrvese que no todos los nodos estn relacionados por las
relaciones ascendente/descendiente: B y C , por ejemplo, no estn relacionados. Sin embargo, el raz de cualquier rbol es un ascendiente de todos los nodos de ese rbol. Un
subrbol de un rbol es cualquier nodo del rbol junto con todos sus descendientes. Un
subrbol de un nodo n es un subrbol enraizado en un hijo de n. Por ejemplo, la Figura 19.2 muestra un subrbol de la Figura 19.1. Este subrbol tiene a B como su raz y es
un subrbol del nodo A.

Hermanos

735

Es el nivel ms alto del rbol. La altura es igual a la longitud


del camino desde el nodo raz a la hoja ms lejana que sea alcanzable desde l. Por ejemplo, la altura del rbol de la Figura 19.2 es 4. Un rbol que contiene slo un raz, tiene de altura 1.
Es uno ms que la longitud del camino desde el nodo a la hoja
ms lejana que sea alcanzada desde l. El nodo Luis Carchelejo
tiene de altura 2.
De un rbol (level o depth), es el nmero de nodos que se encuentra entre l y la raz. El nodo Luis Carchalejo est en el nivel 3. Por definicin el nmero de niveles de un rbol se define
como el nivel de la hoja ms profunda; as el nmero de niveles
del rbol de la Figura 19.3 es 4. Observemos que por definicin,
el nmero de niveles de un rbol es igual a la altura por lo que
pueden usarse ambas magnitudes indistintamente.
Es el nmero de hijos del nodo. La aridad de un rbol se define
como el mximo de la aridad de sus nodos
Dos nodos son hermanos si tienen el mismo padre. Se llamarn
hermano izquierdo de n y hermano derecho de n respectivamente.

Debido a la naturaleza jerrquica de los rboles, se puede utilizar para representar en


formacin que sea jerrquica por naturaleza, por ejemplo, diagramas de organizaciones,
rboles genealgicos, rboles de especies animales, etc.

Terminologa complementaria

Figura 1 9 . 3 .

Arbol g e n e a l g i c o .

Adems de los trminos ya citados anteriormente, existen otros tambin de gran importancia
Camino
Longitud del camino

Una secuencia de nodos conectados dentro de un rbol.


Es el nmero de nodos menos uno (r - 1). Si r > 0, se dice que
el camino es propio.

1
Las definiciones de altura, profundidad y nivel como se seala en [Franch 93], p. 220 y son contradictorias en algunos textos, que no definen algunos de estos conceptos o los defmen slo para un rbol y no para
sus nodos; o bien empiezan a numerar a partir de cero. En nuestro caso, y al igual que hace Franch, preferimos
numerar a partir del uno para que el rbol vaco tenga una altura diferente al rbol con un nico nodo.

736

Programacin

en Turbo/Borland

Pascal 7

Arboles

737

Un tipo especial de rbol es el denominado rbol binario y un rbol binario especfico de gran utilidad es el rbol binario de bsqueda.

19.2.

ARBOLES BINARIOS

Un rbol binario es un rbol en el que cada nodo no puede tener ms que dos hijos o
descendientes.
En particular, un rbol binario es un conjunto de nodos que es o bien el conjunto
vaco o un conjunto que consta de un nodo raz enlazado a dos rboles binarios disjuntos
denominados subrbol izquierdo y subrbol derecho. Cada uno de estos subrboles es, a
su vez, un rbol binario. La Figura 19.4 muestra diversos ejemplos de rboles binarios.

Figura 1 9 . 4 .

Por consiguiente, los nodos H, I, E, F y J son hojas en el rbol de la Figura 19.4. Los
nodos con descendientes se denominan nodos interiores.
El nodo raz se dice que est en el nivel 0 en el rbol, los nodos B y C estn en el
nivel 1, y los nodos D, E, F y G estn en el nivel 2. La altura del rbol se define como el
nivel ms alto del rbol. Por consiguiente, la altura del rbol (a) de la Figura 19.4 es 2.
Cualquier nodo sin sucesores se denomina un nodo terminal. Por consiguiente, los
nodos D, E, F y G son todos hojas o nodos terminales, en el rbol. Un rbol binario se dice
que est equilibrado (balanceado) si cada nodo tiene exactamente dos hijos o no tiene
hijo y si cada hoja est al mismo nivel. Por consiguiente, el rbol de la Figura 19.7 est
equilibrado. La Figura 19.8 muestra rboles no equilibrados pero muy tiles.
En la Figura 19.9, los nodos B, D y E forman el subrbol izquierdo. De modo similar
C, F y G forman el subrbol derecho. Cada uno de estos subrboles es un verdadero rbol.
Los subrboles izquierdo y derecho de un rbol binario deben ser subconjuntos disjuntos de nodos. Esto es, ningn nodo puede estar en ambos subrboles.

Diversos tipos de rboles binarios.


Un rbol binario es un conjunto de nodos que es o bien vaco o consta de un nodo raz
y dos rboles binarios disjuntos denominados subrbol izquierdo y subrbol derecho.

Terminologa

En un rbol binario los hijos se conocen como hijo izquierdo e hijo derecho, lo que supone automticamente una diferencia. Los dos rboles de la Figura 19.5 no representan
el mismo rbol binario ya que sus hijos izquierdo y derecho estn en orden inverso.
Un nodo que no tiene hijos se denomina hoja.

Figura 1 9 . 5 .

Arboles binarios distintos.

738

Arboles

Programacin en Turbo/Borland Pascal 7

739

Un rbol binario completo es un rbol binario en el que cada nodo tiene o bien dos
hijos o ningn hijo; esto es, todos los nodos interiores tienen dos hijos. La Figura a es un
rbol completo y la Figura b no es completo ya que carecen del cuarto nodo de segundo
nivel.

Nivel de un nodo y altura de un rbol


El nivel o profundidad de un nodo se define como una cantidad mayor en uno al nmero
de sus ascendientes. As, suponiendo el nivel de nodo n:
Si n es la raz de T, entonces est en el nivel 1.
Si n no es el raz de T, entonces su nivel es mayor que el nivel de su padre.
(a)

(b)
Figura 1 9 . 8 .

Por ejemplo en la Figura 19.11

Arboles binarios no equilibrados.


nodo A est a nivel 1
nodo B est a nivel 2
bodo C est a nivel 3

Subrbol
izquierdo

Subrbol
derecho
Figura 1 9 . 1 1 .

Figura 1 9 . 9 .

Subrboles d e un rbol binarios.

La definicin de rbol conlleva el hecho de que un rbol binario es un tipo de estructura de datos recursiva. Esto es, cada subrbol se define como un rbol ms simple.
La naturaleza recursiva del rbol binario ayuda a simplificar la operacin con rboles
binarios.

(a)
Figura 1 9 . 1 0 .

Arbol binario con diferentes niveles.

La altura de un rbol, es el nmero de nodos en el camino ms largo desde la raz a


una hoja; dicho de otro modo, la altura de un rbol es el nmero de niveles distintos.
Asi en un rbol general T, en trminos de los niveles de sus nodos se define como sigue:
Si T es vaco, entonces la altura es 0.
Si T no es vaco, entonces su altura es igual al nivel mximo de sus nodos.
Los rboles de la Figura 19.12. tienen por altura 3, 5 y 6.

(b)
Arbol binario: a) completo; b) no c o m p l e t o .

Figura 1 9 . 1 2 .

Arboles binarios con los m i s m o s n o d o s pero alturas diferentes.

740

Programacin

en Turbo/Borland

Pascal 7

Arboles

Definicin recursiva de altura


Si T est vaco, su altura es 0.
Si T no es un rbol binario vaco, entonces debido a que T es de la forma.

741

Todos los nodos de nivel h-z y superiores tienen dos hijos cada uno.
Si cuando un nodo tiene un descendiente derecho a nivel h todas las hojas de su
subrbol izquierdo estn a nivel h.
Si un rbol binario es lleno es necesariamente completo.

Td

La altura de T se puede definir como 1 ms que la altura del subrbol mayor descendiente del raz, es decir:
altura(T) = 1 + max (altura(Ti), altura (TD)

U n rbol binario es completamente (totalmente) equilibrado si los subrboles izquierdo


de cada nodo tienen la misma altura.
I mi rbol binario completo es equilibrado, mientras que un rbol hinano lleno es total-

Arbol binario lleno


U n rbol binario lleno de altura h tiene todas sus hojas a nivel h y todos los nodos que
estn a nivel menor que h tiene cada u n o dos hijos. La Figura 19.13 representa un rbol
binario de altura 3.

Figura 1 9 . 1 3 .

Arbol binario de altura 3.

Se puede dar una definicin recursiva de rbol binario:

equilibrados.

Si T est vaco, entonces T es un rbol binario lleno de altura 0.


Si no est vaco y tiene altura h < > 0 entonces T es un rbol binario lleno si sus
subrboles del raz son ambos rboles binarios llenos de altura h - 1.

Recorrido de un rbol binario

Un rbol binario completo de altura h es un rbol binario que est lleno a partir del
nivel h - 1, con el nivel h relleno de izquierda a derecha (Figura 19.13). M s formalmente un rbol binario de altura h es completo si

El proceso u operacin de acceder o visitar a todos los nodos (datos) de un rbol se conoce normalmente como recorrido de un rbol. El rbol puede ser recorrido en varios
rdenes. Los tres recorridos ms tpicos se clasifican de acuerdo al m o m e n t o en que se
visita su raz en relacin con la visita a sus subrboles.
recorrido preorden

recorrido en orden

1. Visitar el raz
1. Recorrer subrbol izquierdo
2. Ir a subrbol izquierdo 2. Visitar el raz
3. Ir a subrbol derecho
3. Ir a subrbol derecho

Preorden
Fnorden

Postorden
Figura 1 9 . 1 4 .

Arbol binario completo.

raiz-i/quierdo-derccho
izquierdo-i ai7-derecho
izquiei do-dei echo-rai/

recorrido postorden
1. Ir a subrbol izquierdo
2. Ir a subrbol derecho
3. Visitar el raz

742

Programacin en Turbo/Borland Pascal 7

Arboles

743

representar una expresin por un rbol binario cuya raz contiene un operador y cuyos
subrboles izquierdo y derecho son los operandos izquierdo y derecho respectivamente.
Cada operando puede ser una letra (X, Y, A, B, etc.) o una subexpresin representada como
un subrbol. En la Figura 19.17 se puede ver cmo el operador que est en la raz es *,
su subrbol izquierdo representa la subexpresin (x + y) y su subrbol derecho representa
la subexpresin (A - B). El nodo raz del subrbol izquierdo contiene el operador (+) de
la subexpresin izquierda y el nodo raz del subrbol derecho contiene el operador ( - )
de la subexpresin derecha. Todos los operandos letras se almacenan en nodos hojas.

Figura 1 9 . 1 6 .

Arbol binario.

En el rbol de la figura 19.16 los posibles recorridos pueden ser:


Recorrido preorden visita los nodos en el orden GDBACEFKHJIML.
Recorrido en orden visita los nodos en el orden ABCDEFGIJHKLM.
Recorrido postorden visita los nodos en el orden ACBFEDIJHLMKG.

Figura 1 9 . 1 8 .

Arbol de expresin (x + y) * (A - B).

Utilizando el razonamiento anterior, se puede escribir la expresin almacenada como

1 9 . 3 . ARBOLES DE EXPRESION
Los rboles binarios se utilizan para representar expresiones en memoria; esencialmente^
en compiladores de lenguaje de programacin. La Figura 19.17 muestra un rbol binario
de expresiones para la expresin aritmtica (a + b)* c.
Obsrvese que los parntesis no se almacenan en el rbol pero estn implicados en la
forma del rbol. Si se supone que todos los operadores tienen dos operandos, se puede

Figura 1 9 . 1 7 .

Arbol binario d e e x p r e s i o n e s que representa (A + B) *C.

(X + (Y*Z)) * (A-B)
e n d o n d e se h a n i n s e r t a d o p a r n t e s i s a l r e d e d o r d e s u b e x p r e s i o n e s d e l r b o l (los o p e r a n d o s Y, Z d e la s u b e x p r e s i n m s i n t e r n a t i e n e n el n i v e l d e v a l o r m a y o r , B).

Figura 1 9 . 1 9 .

Arbol de expresin (X + (Y*Z)) * (A - B).

744

Programacin

en Turbo/Borland

Arboles

Pascal 7

19.3.1. Reglas para la construccin de rboles de expresin

Ejemplo 1 9 . 1

Deducir las expresiones que representan los siguientes rboles binarios

(*)
X )

745

Los rboles de expresiones se utilizan en las computadoras para evaluar expresiones usadas en programas. El algoritmo ms sencillo para construir un rbol de expresin es uno
que lee una expresin completa que contiene parntesis en la misma.
Una expresin con parntesis es aqulla en que:

(+ )

/ J

\ )

f AJ

(* )

( * J

( ^ )

(*

(^aj

( ^ )

1. La prioridad se determina slo por parntesis.


2. La expresin completa se sita entre parntesis.
(C

r7)

Por consiguiente, (4 + (5 * 6)) es un ejemplo de una expresin completa entre parntesis. Su valor es 34. Si se desean cambiar las prioridades, se escribe ((4 + 5) * 6), su
valor es 54. A fin de ver la prioridad en las expresiones, considrese la expresin:
( 4 * 5 ) + 6/7 - (8 + 9)

( z )
(*)

r+)
fl

x j

CYJ
(c)

Los operadores con prioridad ms alta son y

es decir,

( 4 * 5 ) + (6/7) - (8 + 9)
El orden de los operadores aqu es + y

Por consiguiente, se puede escribir

((4 * 5) + (6/7)) - (8 + 9)
Por ltimo, la expresin completa entre parntesis ser

Soluciones
a.

(((4 * 5) + (6/7)) - (8 + 9))

x*(Y/-z)

b.

A + (B*-(C+D))

C.

(A*(X+Y))*C

El algoritmo para la construccin de un rbol de expresin es:

Ejemplo 1 9 . 2

Dibujar la representacin en rbol binario de cada una de las siguientes expresiones


a.

x*Y / ((A + B)*C)

b.

(X*Y/A) + (B*C)

Soluciones
i )

vYJ

( + )

C+J

QaJ
(a)

( ^ )

(J

C*J

( x j

) (

( V )
(b)

19.4. CONSTRUCCION DE UN ARBOL BINARIO

1. La primera vez que se encuentra un parntesis a izquierda, crea un nodo y lo hace


en el raz. Se llama a ste, el nodo actual y se sita su puntero en una pila.
2. Cada vez que se encuentre un nuevo parntesis a izquierda, crear un nuevo nodo.
Si el nodo actual no tiene un hijo izquierdo, hacer el nuevo nodo el hijo izquierdo; en caso contrario, hacerlo el hijo derecho. Hacer el nuevo nodo el nodo
actual y situar su puntero en una pila.
3. Cuando se encuentra un operando, crear un nuevo nodo y asignar el operando a
su campo de datos. Si el nodo actual no tiene un hijo izquierdo, hacer el nuevo
nodo el hijo izquierdo; en caso contrario, hacerlo el hijo derecho.
4. Cuando se encuentra un operador, sacar un puntero de la pila y situar el operador
en el campo datos del nodo del puntero.
5. Ignorar parntesis derecho y blancos.

Los rboles binarios se construyen de igual forma que las listas enlazadas, utilizando diferentes elementos con la misma estructura bsica. Esta estructura bsica es un ndo con
un espacio de almacenamiento para datos y enlaces para sus hijos izquierdo y derecho.
Existe una diferencia clara con las listas y es el argumento de los nodos; esto se debe a
que el rbol es bidimensional, tiene una estructura de registro ms compleja y tiene muchos punteros ni 1 frente a uno solo que aparece al final de una lista enlazada.
Con este formato cada nodo tiene tres elementos: datos, un puntero izquierdo y un

746

Arboles

Programacin en Turbo/Borland Pascal 7

747

Aadir una hoja


D a d a esta d e f i n i c i n , u n r b o l se p u e d e c o n s t r u i r m e d i a n t e l l a m a d a s s u c e s i v a s a new, c a d a
u n a d e las c u a l e s a s i g n a u n n o d o n u e v o al r b o l .

nil

J - U -

nil

nil

nil

nil

nil

nil

nil

nil

ni!

(a) Expresin: (3 - (4 - 5) '(6 + 7)

Figura 1 9 . 2 0 .

Implementacin de un rbol binario.

La implementacin de un rbol binario comienza disponiendo al principio de una


variable puntero a puntero externo T que apunta a la raz del rbol. Si el rbol est vaco,
T es nil. La Figura 19.20 ilustra esta implementacin. La definicin recursiva de un rbol
binario conduce a que cada rbol binario no vaco conste de un subrbol izquierdo y un
subrbol derecho, cada uno de los cuales es un rbol binario. As, si T apunta a la raz de
un rbol binario, entonces T ~ . i z d o a p u n t a a la raz del subrbol izquierdo y T-.Dcho

apunta a la raz del subrbol derecho.


El procedimiento para crear una hoja de un rbol y una funcin que comprueba si
un nodo es una hoja se muestran a continuacin

b. Ecuacin cuadrtica (segundo orden):


-b \[tf~- 4 ac
ax1 + bx + c = 0, x =
2a
Figura 19.20.

Modelos de rboles de expresin.

puntero derecho. Los punteros son otros nodos que llevan a declaraciones muy similares
a las de una lista enlazada.
type
{PtrArbol = "NodoArbol
NodoArbol = record
Datos : NombreTpo ;
Izda, Dcha : PtrArbol;
end; {NodoArbol}

{punteros a hijos}

procedure NuevaHoja(-var NuevoItemPtr : PtrArbol; Num: Integer);


begin
new (NuevoItemPtr);
NuevoElementoPtr*^ .Datos := Num;
NuevoElemenetoPtr""-. Izdo := nil;
NuevoElementoPtr~.Dcho ;= nil;
end; {NuevaHoja;
,function EsHoja (unNodo : PtrArbol) : boolean;
begin
if unNodo = nil then
begin
EsHoja := false;
end
else
EsHoja := (unNodo^. Izdo = nil) and (unNodc)~. Dcho = nil);
end; {EsHoja;

748

Programacin en Turbo/Borland Pascal 7

Arboles

749

1 9 . 5 . RECORRIDO DE UN ARBOL
Para visualizar o consultar los datos almacenados en un rbol se necesita recorrer el rbol o visitar los nodos del mismo. Al contrario que las listas enlazadas, los rboles binarios no tienen realmente u n primer valor, un segundo valor, tercer valor, etc. Se puede
afirmar que el raz viene el primero, pero quin viene a continuacin? Existen diferentes mtodos de recorrido de rbol como ya se coment en el Apartado 19.2. La mayora
de las aplicaciones binarias son bastante sensibles al orden en el que se visitan los nodos,
de forma que ser preciso elegir cuidadosamente el tipo de recorrido.
El recorrido de un rbol supone visitar cada nodo slo una vez. Las tres etapas bsicas en el recorrido de un rbol binario recursivamente son:
1. Visitar el nodo (N)
2. Recorrer el subrbol izquierdo (I)
3. Recorrer el subrbol derecho (D)

Figura 1 9 . 2 1 .

Recorrido enorden de un rbol binario.

IND para el subrbol derecho, se visita primero F, despus C (nodo o raz) y por ltimo G.
Por consiguiente, el orden del recorrido en orden de la Figura 19.21 es D-B-E-A-F-C-G.

Segn sea la estrategia a seguir, los recorridos se conocen como enorden (inorder),
preorden (preorder) y postorden (postorder)

1 9 . 5 . 2 . Recorrido preorden

preorden (nodo-izdo-dcho) (NID)


enorden (izdo-nodo-derecho) (IND)
postorden (izquierdo-derecho-nodo) (IDN)

El recorrido preorden (NID) conlleva los siguientes pasos:

1 9 . 5 . 1 . Recorrido enorden

1. Visitar el raz (N)


2. Visitar el subrbol izquierdo (I)
3. Visitar el subrbol derecho (D)
El algoritmo recursivo correspondiente es:

Si el rbol no est vaco, el mtodo implica los siguientes pasos:


1. Visitar el subrbol izquierdo (I)
2. Visitar el nodo raz (N)
3. Visitar el subrbol derecho (D)
El algoritmo correspondiente es

si T no es vaco entonces
inicio
ver los datos en el raz de T
preorden (subrbol izquierdo del raz de T)
preorden (subrbol derecho del raz de T)
fin

Enorden(A)
Si el rbol no esta vacio entonces
inicio
Recorrer el subrbol izquierdo
Visitar el nodo raiz
Recorrer el subrbol derecho
fin

En el rbol de la Figura 19.21, los nodos se han numerado en el orden en que son
visitados durante el recorrido enorden. El primer subrbol recorrido es el subrbol izquierdo del nodo raz (rbol cuyo nodo contiene la letra B). Este subrbol consta de los
nodos B, D y E y es a su vez otro rbol con el nodo B como raz, por lo que siguiendo el
orden IND, se visita primero D, a continuacin B (nodo o raz) y por ltimo E (derecha).
Despus de la visita a este subrbol izquierdo se visita el nodo raz A y por ltimo se visita
el subrbol derecho que consta de los nodos C, F y G. A continuacin, siguiendo el orden

Si utilizamos el recorrido preorden del rbol de la figura se visita primero el raz (nodo A). A continuacin se visita el subrbol A, que consta de los nodos B, D y E. Dado que

Figura 1 9 . 2 2 .

Recorrido preorden de un rbol binario.

750

Programacin en Turbo/Borland Pascal 7

Arboles

el subrbol es a su vez un rbol, se visitan los nodos utilizando el orden NiD. Por consiguiente, se visita primero el nodo B, despus D (izquierdo) y por ltimo E (derecho).

751

Ejemplo 1 9 . 3

Deducir los tres recorridos del rbol binario siguiente

A continuacin se visita subrbol derecho de A, que es un rbol que contiene los nodos C, F y G. De nuevo siguiendo el orden NID, se visita primero el nodo C, a continuacin
F (izquierdo) y por ltimo G (derecho). En consecuencia, el orden del recorrido preorden
para el rbol de la Figura 19.11 es A-B-D-E-C-F-G.
19.5.3.

Recorrido

postorden

El recorrido postorden (IDN) realiza los pasos siguientes:


1. Visitar el subrbol izquierdo (I)
2. Visitar el subrbol derecho (D)
3. Visitar el raz (N)
El algoritmo recursivo es

Solucin

si A no esta vacio entonces


inicio
Postorden (subrbol izquierdo del raz de A)
Postorden (subrbol derecho del raz de A)
Visualizar los datos del raz de A
fin

Si se utiliza el recorrido postorden del rbol de la figura, se visita primero el subrbol


izquierdo A. Este subrbol consta de los nodos B, D y E y siguiendo el orden ION, se visitar
primero D (izquierdo), luego E (derecho) y por ltimo B (nodo). A continuacin, se visita
el subrbol derecho A que consta de los nodos C, F y G. Siguiendo el orden IDN para este
rbol, se visita primero F (izquierdo), despus G (derecho) y por ltimo C (nodo). Finalmente se visita el raz A (nodo). As, el orden del recorrido postorden del rbol de la Fig u r a 1 9 . 2 3 es D-E-B-F-G-C-A.

Preorden
Enorden
Postorden

M E A G Z P Q (NID)
A E G M P Q Z (IND)
A G E Q P Z M (IDN)

1 9 . 5 . 4 . Implementacin de los algoritmos d e recorrido


Los mtodos utilizados para recorrer un rbol binario son recursivos y, por tanto, se emplearn procedimientos recursivos para implementar los recorridos. Un rbol se representa utilizando las siguientes sentencias Pascal:

c o n s t LongMax = 3 0 {longitud mxima del nombre}


type NombreTipo = string(LongMax];
ptrTipo = ^nodoTipo;
nodoTipo = record
Nombre : nombreTipo;
Hijolzdo : ptrTipo; {puntero a Hijo izquierdo}
HijoDcho : ptrTipo {puntero a hijo derecho}
end;
TipoArbolBin = ptrTipo;
var A : TipoArbolBin; {puntero a raz del rbol}

y el procedimiento EnOrden puede ser:


1

Figura 1 9 . 2 3 .

Recorrido postorden

d e un rbol binario.

procedure EnOrden (A : TipoArbolBin);


begin

752

Programacin

en Turbo/Borland

if A o nil
begin
EnOrden
WriteLn
EnOrden
end;
end;

PascaI 7

Arboles

then

{rbol no esta vaco}

(A^.Hijolzdo);
(A^.Nombre);
(A^.HijoDcho);

{operacin
{operacin
{operacin

753

Ejemplo
i}
N}
D}

Arbol binario de bsqueda

4 menor q u e 30
30 menor que 55
41 mayor que 30
75 mayor que 55

1 9 . 6 . ARBOL BINARIO DE BUSQUEDA


Los rboles vistos hasta ahora no tienen un orden definido; sin embargo, los rboles binarios ordenados tienen sentido. Estos rboles se denominan rboles binarios de bsqueda, debido a que se pueden buscar en ellos un trmino utilizando un algoritmo de
bsqueda binaria similar al empleado en arrays.
Un rbol binario de bsqueda es aquel que dado un nodo, todos los datos del subrbol izquierdo son menores que los datos de ese nodo, mientras que todos los datos del
subrbol derecho son mayores que sus propios datos. Por consiguiente, este rbol no es
un rbol binario de bsqueda.

85 mayor que 75

19.6.1. Creacin de un rbol binario de bsqueda


Supongamos que se desea almacenar los nmeros
8

20

10

en un rbol binario de bsqueda. Siguiendo la regla, dado un nodo en el rbol todos los
datos a su izquierda deben ser menores que todos los datos del nodo actual, mientras que
todos los datos a la derecha deben ser mayores que dichos datos. Inicialmente el rbol
est vaco y se desea insertar el 8. La nica eleccin es almacenar el 8 en el raz:

A continuacin viene el 3. Ya que 3 es menor que 8, el 3 debe ir en el subrbol izquierdo

Sin embargo, el siguiente rbol si es binario de bsqueda.

A continuacin se ha de insertar 1 que es menor que 8 y que 3, por consiguiente, ir


a la izquierda y debajo de 3.

754

Arboles

Programacin en Turbo/Borland Pascal 7

El siguiente nmero es 20, mayor que 8, lo que implica debe ir a la derecha de 8.

755

19.6.2. Implementacin de un rbol binario de bsqueda


La implementacin de los algoritmos para crear un rbol binario de bsqueda se apoyarn en los pasos citados anteriormente. As, suponiendo que se desea almacenar la lista
de nmeros enteros del ejemplo anterior, los pasos a seguir son:
1. Crear un nodo que no tenga hijos (los punteros izquierdo y derecho son nil.
2. Crear hijo izquierdo (subrbol izquierdo).
3. Crear hijo izquierdo del subrbol izquierdo, etc.

Crear un nodo con dos hijos nil


La funcin SubArbol crea un nodo con dos hijos nil.
Cada nuevo elemento se inserta como una hoja del rbol. Los restantes elementos se
pueden situar fcilmente.

type NodoPtr = ^Padre;


Padre = record
Info : Integer,
Izdo, Dcho : NodoPtr
end;
function SubArbol (Smbolo : Integer) : NodoPtr;
var P : NodoPtr;
begin
new (P);
P~.Info
Smbolo;
P^.Izdo
nil ;
P~.Dcho
nil;
SubArbol
P
end;

El rbol creado tras escribir Raiz := Subrbol (12) ser

Una propiedad de los rboles binarios de bsqueda es que no son nicos para los
datos dados,
Ejemplo 1 9 . 4

Construir un rbol binario para almacenar los datos 12,8, 7, 16 y 11.

Solucin

El identificador Raiz se convierte en el puntero a la raz.


El procedimiento Arbol izdo inserta un nodo como el hijo izquierdo de un nodo especificado por un puntero dado. Si se selecciona Raiz como este puntero y se escribe
Arbol lzdo(Raiz,8) se crear un nodo que contiene a 8 y lo hace el hijo izquierdo del raz.

Arbollzdo (Raz, 8)

756

Programacin en Turbo/Borland Pascal 7

Arboles

757

procedure Arbollzdo (P : NodoPtr, Simbolo : Integer);


{inserta un nodo como hijo izquierdo del puntero p}
begin
P^.Izdo := Subrbol (Simbolo),
end
L a i n s e r c i n d e l d a t o 7, se r e a l i z a d i c h o n o d o c o m o h i j o i z q u i e r d o d e 8 m e d i a n t e
Arbol I z d o t R a i z ^ . I z d o , 7 ) .

E l p r o c e d i m i e n t o g e n e r a r es el c o n j u n t o d e s e n t e n c i a s q u e g e n e r a n el r b o l . S e d e clara r a z c o m o p a r m e t r o v a r i a b l e ( v a r )

nil

A c o n t i n u a c i n se i m p l e m e n t a el p r o c e d i m i e n t o ArbolDcho; i n s e r t a u n n o d o c o m o el
h i j o d e r e c h o p a r a u n n o d o e s p e c i f i c a d o d e u n p u n t e r o d a d o . E l p r o c e d i m i e n t o Arbol Dcho
es

16

procedure Generar (var Raiz : NodoPtr);


{construye un rbol binario de busqueda con cinco nodos
begin
raiz := SubArbQl (12);
Arbollzdo (Raiz, 8);
Arbollzdo (Raiz".Izdo, 7);
ArbolDcho (Raiz, 16);
ArbolDcho (Raiz".Izdo, 11);
end; {Generar}

Recorrer el rbol
ArbolDcho (Raz, 16)

El p r o c e d i m i e n t o r e c u r s i v o p a r a r e c o r r e r e n o r d e n el r b o l b i n a r i o q u e se e s t c o n s i d e r a n d o es RecorrdoEnOrden

procedure ArbolDcho (P : NodoPtr, Simbolo : Integer);


{inserta un nodo como hijo derecho del puntero P}
begin
P".Dcho := Subrbol (Simbolo)
end; {Arbol derecho}
A c o n t i n u a c i n se e n l a z a el n m e r o 11 c o m o el h i j o d e r e c h o d e 8.

procedure RecorridoEnOrden (Arbol : NodoPtr);


{visualiza nodos del rbol en un orden infijo}
begin
if Arbol <> nil then
begin
RecorridoEnOrden (Arbol".Izdo);
Write (Arbol".Info : 4);
RecorridoEnOrden (Arbol".Dcho);
end {if}
end; {Recorrido en orden}U n p r o g r a m a c o n t r o l a d o r p a r a la c r e a c i n d e l r b o l b i n a r i o es GenerarArbolBin
program GenerarArbolBin;
{crea un rbol binario de busqueda}

758

Arboles

Programacin en Turbo/Borland Pascal 7

759

type NodoPtr = "Padre;


Padre = record
Info : Integer;
Izdo, Dcho : NodoPtr
end;
var Arbol : NodoPtr;
function SubArbol (Smbolo : Integer) : NodoPtr;

procedure Arbollzdo (P : NodoPtr; Smbolo : Integer);


procedure ArbolDcho (P : NodoPtr; Smbolo : Integer);
CODIFICACION
procedure Generar (var Raiz : NodoPtr);

program NumeroDeNodos
{Este programa genera un rbol binario de nmeros enteros, y posteriormente muestra y cuenta el nmero de nodos}
uses
Crt;
const
MaxNumNodos = 30;
MaximoValor = 100;
type
RangoNodos = 0..MaxNumNodos - 1;
TipoClave = 1..Maximovalor;
Puntero = "NodoArbol;
NodoArbol = record
Clave : TipoClave;
Izdo,
Dcho : Puntero
end;

procedure RecorridoEnOrden (Arbol : NodoPtr);

begin
Generar (Arbol);
WriteLn ('Recorrido en orden del rbol:');
RecorridoEnOrden (Arbol)
end.
L a e j e c u c i n d e este p r o g r a m a d e b e p r o d u c i r :
Recorrido en orden del r b o l :
7

11

12

16

Problema 19.12
Este programa
genera un rbol binario de nmeros
enteros con un nmero
aleatorio
de
nodos y en un rango de valores tambin
aleatorio.
Se utiliza un procedimiento
recursivo
para contar el nmero de nodos del rbol, otro procedimiento
para mostrar los nodos ordenados
generado

ascendentemente
y un procedimiento
en su correspondiente
nodo.

de altas para

insertar

cada

nuevo

nmero

2
Este problema ha sido extrado de la obra: Pascal y Turbo Pascal: Un enfoque prctico de Luis Joyanes,
Ignacio Zahonero y Angel Hermoso, McGraw-Hill, 1995, y con permiso de los autores.

Raiz
: Puntero;
NodosGenerados,
NodosContados,
Indice
: RangoNodos;
Valor
: TipoClave;
funtion Nodos (P : Puntero) : RangoNodos;
{Funcin recursiva para contar el nmero de nodos del rbol. El
nmero de nodos es la suma del nmero de nodos de cada uno de sus
subrboles izquierdo y derecho ms el nodo raiz}
begin
if P = nil then
Nodos := 0
else
Nodos := 1 + Nodos (P~.Izdo) + Nodos ("P^.Dcho)
end;

760

Programacin

en Turbo/Borland

Arboles

Pascal 7

WriteLn;
WriteLn;
NodosContados := Nodos (Raiz);
WriteLn ('recorrido InOrden. Nodos encontrados':65) ;
InOrden (Raiz);
WriteLn;
WriteLn;
WriteLn ('Numero de nodos generados:
NodosGenerados);
WriteLn ('Numero de nodos contados: ', NodosContados)
end.

procedure InOrden (P : Puntero);


begin
if P o nil then
begin
InOrden (P".Izdo);
Write (P".Clave : 5);
Inorden (P".Dcho
end
end;
procedure Altas (var Root : Puntero; Valor : TipoClave);
{inserta el nuevo valor generado, como nodo del rbol}
var
Padre,
Actual,
NodoAlta : Puntero;
begin
new (NodoAlta);
Valor;
NodoAlta".Clave
nil; {el nuevo nodo es el nodo hoja)
NodoAlta".Izdo
nil;
NodoAlta".Dcho
Padre
:= nil;
Actual := Root;
while Actual <> nil do
begin
Padre := Actual;
if Actual".Clave > Valor then
Actual := Actual".Izdo
else
Actual := Actual".Dcho
end;
if Padre = nil then {se situar como raiz}
Root := NodoAlta
else
if Padre".Clave >= Valor then
la izquierda;
Padre".Izdo := NodoAlta {se sita
else
la derecha}
Padre".Dcho := NodoAlta {se sita
end;
begin
ClrScr;
Randomize;
NodosGenerados := Random (MaxNumNodos);
Raiz := nil;
Writeln ('conjunto de nodos generados al azar': 52);
for Indice := 1 to NodosGenerados do
begin
Valor := Random (maximoValor) + 1;
Write (valor: 5 ) ;
Altas (Raiz, valor)
{insercin del nodo en el rbol
end;

761

19.7. OPERACIONES EN ARBOLES BINARIOS DE BUSQUEDA


De lo expuesto se deduce que los rboles binarios tienen naturaleza recursiva y, en consecuencia, las operaciones sobre los rboles son recursivas, si bien siempre tenemos la
opcin de realizarlas de forma iterativa. Estas operaciones son:

Bsqueda de un nodo
Insercin de un nodo
Recorrido de un rbol
Borrado de un nodo.

19.7.1. Bsqueda
La bsqueda de un nodo comienza en el nodo raz y sigue estos pasos:
1. La clave buscada se compara con la clave del nodo raz.
2. Si las claves son iguales, la bsqueda se detiene.
3. Si la clave buscada es mayor que la clave raz, la bsqueda se reanuda en el subrbol derecha. Si la clave buscada es menor que la clave raz, la bsqueda se reanuda con el subrbol izquierdo.

19.7.2. Insercin
La operacin de insercin de un nodo es una extensin de la operacin de bsqueda. Los
pasos a seguir son:
1. Asignar memoria para una nueva estructura nodo.
2. Buscar en el rbol para encontrar la posicin de insercin del nuevo nodo, que se
colocar como nodo hoja.
3. Enlazar el nuevo nodo al rbol. -

19.7.3. Eliminacin
La operacin de eliminacin de un nodo es tambin una extensin de la operacin de
bsqueda, si bienes ms compleja que la insercin debido a que el nodo a suprimir puede

762

Programacin

en Turbo/Borland

Pascal

7
Arboles

ser cualquiera y la operacin de supresin debe mantener la estructura de rbol binario


de bsqueda despus de la eliminacin de datos. Los pasos a seguir son:

procedure postorden (p : ptr);


begin
if p o nil then
begin
postorden (p~.izquierdo);
postorden ( . derecho) ;
write (p^.elemento : 6);
end;
end;

1. Buscar en el rbol para encontrar la posicin de nodo a eliminar.


2. Reajustar los punteros de sus antecesores si el nodo a suprimir tiene menos de 2
hijos, o subir a la posicin que ste ocupa el nodo m s prximo en clave (inmediatamente superior o inmediatamente inferior) con objeto de mantener la estructura de rbol binario.

1 9 . 7 . 4 . Recorrido de un rbol

1 9 . 7 . 5 . Determinacin de la altura de un rbol

Existen dos tipos de recorrido de los nodos de un rbol: el recorrido en anchura y el recorrido en profundidad. En el recorrido en anchura se visitan los nodos por niveles. Para
ello se utiliza una estructura auxiliar tipo cola en la que despus de mostrar el contenido
de un nodo, empezando por el nodo raz, se almacenan los punteros correspondientes a
sus hijos izquierdo y derecho. De esta forma si recorremos los nodos de un nivel, mientras mostramos su contenido, almacenamos en la cola los punteros a todos los nodos del
nivel siguiente.
El recorrido en profundidad se realiza por u n o de tres mtodos recursivos: preorden,
inorden y postorden. El primer mtodo consiste en visitar el nodo raz, su rbol izquierdo
y su rbol derecho, por este orden. El recorrido inorden visita el rbol izquierdo, a continuacin el nodo raz y finalmente el rbol derecho. El recorrido postorden consiste en
visitar primero el rbol izquierdo, a continuacin el derecho y finalmente el raz.
preorden
en orden
postorden

Raz
Izdo
Izdo

Izdo
Raz
Dcho

763

La altura de u n rbol depender del criterio que se siga para definir dicho concepto. As,
si en el caso de u n rbol que tiene n o d o raz, se considera que su altura es 0, la altura del
rbol

es 1, y la altura del rbol

Dcho
Dcho
Raz

procedure preorden (p : ptr);


begin
if p o nil then
begin
write (p~.elemento : 6);
preorden (.izquierdo);
preorden (p^.derecho)
end
end;
procedure en_orden (p : ptr)-;
begin
if p o nil then
begin
en_orden (p~.izquierdo);
Write (p~.elemento : 6);
en_orden (p".derecho)
end
end;

tero es nil) es - 1 .
Nota

La liltiiK) de un nrhol os 1

qiK' la ma\or tic iai alturas de su>> subarhules i/quieni) \

764

Arboles

Programacin en Turbo/Borland Pascal 7

765

La funcin recursiva Altura encuentra la altura de un rbol


type NodoPuntero = "Padre;
Padre = record
info : integer;
Izdo, Dcho : NodoPuntero
end;
function Altura (T : NodoPuntero) : Integer;
{Determina la altura de un rbol}
function Max (A, B : integer) : Integer;
begin
if A > B then
Max := A

30

15

69

else
Max := B
end {Max}

28

32

begin {Altura}
if t = nil then
Altura : = 0
else
Altura :=1+Max (Altura(T".Izdo), Altura(T".Dcho))
end; {Altura}

RESUMEN

La altura de un rbol binario es el nmero de ramas entre el raz y la hoja ms lejana.


Si el rbol A es vaco, la altura es - 1 . La altura del rbol anterior es 5. El nivel o profundidad de un elemento es un concepto similar al de altura. En el rbol anterior el nivel
de 30 es 30 y el nivel de 37 es 5. U n nivel de u n elemento se conoce tambin como
profundidad.
Un rbol binario no vaco est equilibrado totalmente si sus subrboles izquierdo y
derecho tienen la misma altura y ambos son o bien vacos o totalmente equilibrados.

En este captulo se i n t r o d u j o y desarroll la estructura de datos d i n m i c a rbol. Esta estructura,


m u y potente, se p u e d e utilizar en u n a gran variedad d e aplicaciones d e programacin.
La estructura rbol m s utilizada n o r m a l m e n t e es el rbol binario. U n rbol binario es un rbol
en el que cada n o d o tiene c o m o m x i m o dos hijos, llamados subrbol izquierdo y subrbol derecho.

x padre o raz
y hijo izquierdo de x
z hijo derecho de x

En u n rbol binario, cada elemento tiene cero, u n o o dos hijos. El n o d o raz n o tiene u n padre,
pero s cada elemento restante tiene un padre. X es u n antecesor
o ascendente
d e l e l e m e n t o Y.

Los rboles binarios presentan dos tipos caractersticos: rboles binarios de bsqueda
y rboles binarios de expresiones. Los rboles binarios de bsqueda se utilizan, fundamentalmente, para mantener una coleccin ordenada de datos y los rboles binarios de
expresiones para almacenar expresiones.

766

Programacin

en Turbo/Borland

Pascal

Arboles

767

4. Para los rboles del ejercicio 1, recorrer cada rbol utilizando los rdenes siguientes: NDI, DNI,
DIN.

EJERCICIOS
1. Explicar por qu cada una de las siguientes estructuras no es un rbol binario.

5. Dibujar los rboles binarios que representan las siguientes expresiones:


a)
t)
C)
d)
e)

(A+B) / (C-D)
A+B+C / D
A-(B-(C-D) / (E+F))
(A+B) * ((C+D) / (E+F))
(A-B) / ((C*D) - (E/F))

6. El recorrido preorden de un cierto rbol binario produce


ADFGHKLPQRWZ

y en recorrido enorden produce


GFHKDLAWRQPZ

Dibujar el rbol binario


2. Considrese el rbol siguiente
a)
b)
c)
d)
)
f)

7. Escribir una funcin recursiva que cuente las hojas de un rbol binario.

Cul es su altura?
Est el rbol equilibrado? Porqu?
Listar todos los nodos hoja
Cul es el predecesor inmediato (padre) del nodo U
Listar los hijos del nodo R
Listar los sucesores del nodo R

8. Escribir un programa que procese un rbol binario cuyos nodos contengan caracteres y a partir del siguiente men de opciones:
I (seguido de un carcter)
B (seguido de un carcter)
RE
RP
RT
SA

Insertar un carcter
Buscar un carcter
Recorrido en orden
Recorrido en preorden
Recorrido postorden
Salir

9. Escribir una funcin que tome un rbol como entrada y devuelva el nmero de hijos
del rbol.
10. Escribir una funcin booleana a la que se le pase un puntero a un rbol binario y
devuelva verdadero (tru) si el rbol es completo y falso ifalse) en caso contrario.
11. Disear una funcin recursiva que devuelva un puntero a un elemento en un rbol
binario de bsqueda.
12. Disear una funcin iterativa que encuentre un elemento en un rbol binario de
bsqueda.
3. Para cada una de las siguientes listas de letras
a) Dibujar el rbol binario de bsqueda que se construye cuando las letras se insertan en el
orden dado.
b) Realizar recorridos enorden, preorden y postorden del rbol y mostrar la secuencia de letras que resultan en cada caso.
1)
(i)

M,
T,

Y,
Y,

T,
M,

E,
E,

R
R

(iii)
(in)

R,
C,

E,
0,

M,
R,

Y,
N,

T
F,

L,

A,

K,

E,

PROBLEMAS
1. Crear un archivo de datos en el que cada lnea contenga la siguiente informacin
Columnas

1-20
21-31
32-78

Nombre
N m e r o de la Seguridad Social
Direccin

768

Programacin

en Turbo/Borland

Escribir un programa que lea cada registro de datos de un rbol, de modo que cuando el rbol
se recorra utilizando recorrido en orden, los nmeros de la seguridad social se ordenen en orden ascendente. Imprimir una cabecera " D A T O S DE EMPLEADOS O R D E N A D O S P O R
N U M E R O S E G U R I D A D SOCIAL". A continuacin se han de imprimir los tres datos utilizando el siguiente formato de salida.
Columnas

1- 11
25- 44
58-104

Arboles

Pascal 7

N m e r o de la Seguridad Social
Nombre
Direccin

2. Escribir un programa que lea un texto de longitud indeterminada y que produzca como resultado la lista de todas las palabras diferentes contenidas en el texto, as como su frecuencia de
aparicin

769

12. Un rbol binario de bsqueda puede implementarse con un array. La representacin no enlazada correspondiente consiste en que para cualquier nodo del rbol almacenado en la posicin I del array, su hijo izquierdo se encuentra en la posicin 2*1 y su hijo derecho en la posicin 21 + 1. Disear, a partir de esta representacin, los correspondientes procedimientos y
funciones para gestionar interactivamente un rbol de nmeros enteros. (Comente el inconveniente de esta representacin de cara al mximo y mnimo nmero de nodos que pueden
almacenarse.)
13. Una matriz de N elementos almacena cadenas de caracteres. Utilizando un rbol binario de
bsqueda como estructura auxiliar ordene ascendentemente la cadena de caracteres.
14. Dado un rbol binario de bsqueda disee un procedimiento que liste los nodos del rbol ordenados descendentemente.

3. Se dispone de un rbol binario de elementos de tipo integer. Escribir funciones que calculen:
a) La suma de sus elementos
b) La suma de sus elementos que son mltiplos de 3.
4. Escribir una funcin booleana I D E N T I C O S que permita decir si dos rboles binarios son
iguales.
5. Crear un archivo de datos en el que cada lnea contenga la siguiente informacin:
Nombre
30 caracteres
Nmero de la Seguridad Social
10 caracteres
Direccin
24 caracteres
Escribir un programa que lea cada registro de datos en un rbol, de modo que cuando el rbol
se recorra en orden los nmeros de la Seguridad Social se almacenen en orden ascendente.
Imprimir una cabecera " D A T O S DE E M P L E A D O S O R D E N A D O S A C U E R D O A L U M E R O DE LA S E G U R I D A D SOCIAL" y a continuacin imprimir los datos del rbol con el
formato Columnas:
1-10
20-50
55-79

Nmero de la Seguridad Social


Nombre
Direccin

6. Disear un programa interactivo que permita dar altas, bajas, listar, etc., en un rbol binario
de bsqueda.
7. Construir un procedimiento recursivo para encontrar una determinada clave en un rbol binario de bsqueda.
8. Calcular el nmero de hojas en un rbol binario.
9. Disear procedimientos no recursivos que listen los nodos de un rbol en inorden, preorden y
postorden.
10. Dados dos rboles binarios de bsqueda indicar mediante un programa si los rboles tienen o
no elementos comunes.
11. Dado un rbol binario de bsqueda construir su rbol espejo. (Arbol espejo es el que se construye a partir de uno dado, convirtiendo el subrbol izquierdo en subrbol derecho y viceversa.)

REFERENCIAS BIBLIOGRAFICAS PARA LECTURAS


POSTERIORES
Aho, Alfred V. y Ullman, Jeffrey D.: Foundations of Computer Science, Computer Science Press,
1992.
Cormen, T h o m a s H., Leiserson Charles E., Rivert Roal L.: Introduction to Algorithms, The Mit
Press, McGraw-Hill, 1992.
Carrasco, Hellman y Veroff: Data Structures and problem solving with Turbo Pascal, The Benjamin/Cummings, 1993.
Collins, William J.: Data structures. An Object-Oriented Approach, Addison-Wesley, 1992.
Franch Gutirrez, Xavier: Estructura de datos. Especificacin, Diseo e implementacin. Edicions
UPC, 1994
Hale, Guy J. y Easton, Richard J.: Applied Data Structures Using Pascal, Heath, Massachusetts,
1987.
Horowitz, Ellis y Sartaj, Sahni: Data Structures in Pascal, Third edition, Computer Science, Press,
New York, 1990.
Joyanes Aguilar, Luis: Fundamentos de programacin, 2 a edicin, McGraw-Hill, 1996.
Joyanes, L., Zahonero, I. y Hermoso A.: Pascal y Turbo Pascal. Un enfoque prctico, McGrawHill, 1995.
Joyanes, L., Rodrguez, L. y Fernndez, M.: Fundamentos de programacin. Libro de problemas
en Pascal y Turbo Pascal, McGraw-Hill, Madrid, 1997.
Joyanes, L., Zahonero, I.: Estructura de datos. Un enfoque prctico en Pascal y Turbo Pascal,
McGraw-Hill, Madrid, 1997.
Krase, Robert L.: Data Structures andprogram design, Prentice-Hall, 1994,
Koffman, Elliot B. y Maxim, Bruce R.: Software Design and Data Structures in Turbo Pascal, Addison-Wesley, 1994.
Salmn, William J.: Structures and abstractions, Irwin, 1991.
T e n e m b a u m Aaron M. y Angenstein Moshe: Data structures using Pascal, Prentice-Hall, 1986.

Construccin de grandes programas

771

2 0 . 1 . CONCEPTO DE UNIDAD
CAPITULO

CONSTRUCCION DE GRANDES
PROGRAMAS. (Las unidades
y la compilacin independiente)
CONTENIDO
20.1.
20.2.
20.3.
20.4.
20.5.

C o n c e p t o de unidad
Estructura d e una unidad
Creacin de unidades
Utilizacin de unidad estndar
Situacin de las unidades en s u s d i s c o s .
Dnde b u s c a Turbo Pascal las unidades?
2 0 . 6 . Identificadores idnticos en diferentes unidades
2 0 . 7 . Sntesis de unidades
2 0 . 8 . Otros m t o d o s de estructuras programas: inclusin, s o l a p a m i e n t o y e n c a d e n a miento
RESUMEN
PROBLEMAS
PROBLEMAS RESUELTOS

Una unidad es un c o n j u n t o de constantes, tipos de datos variables, procedimientos y funciones. Cada unidad es c o m o un programa independiente Pascal o bien una librera de
declaraciones que se pueden poner en un programa y que permiten que ste se pueda
dividir y compilar independientemente. U n a unidad puede utilizar otras unidades y posee una parte que puede contener instrucciones de iniciacin.
Una unidad contiene u n o o ms procedimientos, funciones constantes definidas (y a
veces otros elementos). Se puede compilar, probar y depurar una unidad independientemente de un programa principal. U n a vez que una unidad ha sido compilada y depurada, no necesita compilarse ms veces, T u r b o Pascal se encarga de enlazar la unidad al
programa que utiliza esa unidad, empleando siempre en esta tarea m e n o r tiempo que en
la propia compilacin. 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 estndar 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 versin 3.0 de Turbo Pascal. Las siete unidades estn almacenadas en el archivo TURBO/.TPL (librera de programas residente propia del programa
Turbo Pascal). La versin 7.0 introdujo dos nuevas unidades WinDos y Strings.

20.2.

ESTRUCTURA DE UNA UNIDAD

Una unidad est constituida de cuatro partes: cabecera de la unidad, seccin de i nterface
(interfaz), seccin implementation (implementacin) y seccin i n i t i a l i z a t i o n (inicializacin)1.
Formato
Una de las caractersticas m s i n t e r e s a n t e s de Turbo/Borland Pascal 7 e s la posibilidad d e d e s c o m p o n e r un programa grande en prod u c t o s m s p e q u e o s que s e pueden compilar independientemente.
Estos mdulos s e denominan unidades y eliminan el inconveniente de
las versiones anteriores a 4 . 0 d e la limitacin de la memoria o c u p a d a
por programas ejecutables a 64K. La versin 4 . 0 pudo utilizar t o d a la
memoria, hasta 64K. Los lectores que hayan utilizado Modula-2 encontrarn familiar el c o n c e p t o unidad, ya que unidad (en Turbo Pascal) y mdulo (en Modula-2) representan el c o n c e p t o de compilacin
separada y la posibilidad d e construir grandes programas enlazando
unidades compiladas s e p a r a d a m e n t e para construir un programa ejecutable. C o m o resultado de ello, cuando s e realiza un cambio en el
cdigo fuente, s l o s e tiene que compilar el s e g m e n t o al que a f e c t a
la modificacin.

770

unit <identificador>
interface
uses <lista de unidades>;
{opcional}
{declaraciones publicas objetos exportados/
implementation
{declaraciones privadas)
{definicin de procedimientos y funciones pblicos}
begin
{codigo de inicializacion}
{opcional}
end
' Aceptamos el trmino inicializacin por su extensa difusin en la jerga informtica, aun a sabiendas que
dicho trmino no es aceptado por el DRAE y su expresin correcta sera iniciacin.

772

Construccin de grandes programas

Programacin en Turbo/Borland Pascal 7

20.2.1.

Unidad.

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. C u a n d o
T u r b o Pascal compila la unidad, le asigna le extensin TPU (Turbo Pascal Unit). Si el n o m bre de la unidad es diferente del nombre del archivo, el programa principal n o podr
encontrar el archivo TPU.
U n a unidad puede utilizar otras unidades siempre que se incluyan en la clusula uses
que aparece inmediatamente despus de la palabra interface, y separadas por comas

20.2.2.

var
a, b, c : integer;
function Exponencial (a, b : integer) : real;
procedure Dividir (x, y : integer;
var cociente : integer),

Cabecera de la unidad

La cabecera de la unidad comienza con la palabra reservada unit, seguida por el n o m b r e


de la unidad (identificador vlido) 2 . Es similar a una cabecera de programa, donde la
palabra reservada unit reemplaza a la palabra reservada program. Por ejemplo, para crear
u n a u n i d a d d e n o m i n a d a Mi Unidad se ha de utilizar la cabecera de la u n i d a d : unit Mi-

Seccin de interfaz

773

Observaciones
1. La unidad Rayo puede utilizar cualquier procedimiento o funcin presente en las
unidades estndar Dos, Graph o Crt.
2. Se declaran tres variables globales; a, b, c (estn disponibles a otras unidades y programas que utilicen la unidad Rayo). Se debe extremar el cuidado a la hora de declarar variables globales en la seccin de interfaz de la unidad.

20.2.3.

Seccin de implementacin

La tercera parte de u n a unidad, d e n o m i n a d a de implementacin, es estrictamente privada; su contenido no es exportable. Slo los procedimientos o funciones que aparecen
en la seccin interface pueden ser invocados desde el exterior de la unidad.
Esta seccin contiene el cuerpo de los procedimientos y funciones declarados en la
seccin de interface.
unit Rayo;

La seccin de interface (interfaz) es la parte de la unidad que sirve para conectar dicha
unidad con otras unidades y programas. Esta seccin se conoce como la parte pblica
de la unidad, ya que todos los objetos que figuren en esta seccin son visibles desde el
exterior o exportables. Las restantes unidades y programas tienen acceso a la informacin contenida en la seccin 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 seccin de implementacin. La seccin de interfaz indica a un programador cules procedimientos y funciones se pueden utilizar en un programa. La seccin
de implementacin indica al compilador cmo implementarlos.
Los identificadores declarados en la seccin de interfaz pueden ser referenciados por
un cliente de la unidad, de modo que se consideran visibles.
En la seccin de interface se pueden declarar variables y elementos globales y otras
unidades.
Ejemplo de declaracin
unit Rayo;
interface
uses DOS, Graph, Crt; {se utilizan las unidades DOS,
Graph y Crt}

El identificador puede tener de uno a ocho caracteres ms un punto y una extensin tal como . PAS.

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 * A;
Exponencial := P
end;
procedure Dividir (X, Y : integer; var Cociente : integer);
begin
Cociente := X div Y
end;
end.

Ntese que la declaracin de una unidad est terminada por la palabra reservada end
y un punto. Las variables globales pueden ser declaradas dentro de una seccin de implementacin, pero estas variables sern globales a la unidad 1 solamente y no accesibles
a cualquier otra unidad o programa.

774

Programacin en Turbo/Borland Pascal 7

20.2.4.

Seccin de iniciacin

La cuarta parte de una unidad, llamada inicializacin, puede contener instrucciones pero
puede igualmente estar vaca. Estas instrucciones sirven, por ejemplo, para iniciar variables. La ejecucin de estas instrucciones se efecta en el m o m e n t o del lanzamiento o
ejecucin de un programa que utiliza la unidad antes de la ejecucin de la primera instruccin del cuerpo del programa.
En la seccin de iniciacin se inicializa cualquier estructura de datos (variables) que
utilice la unidad y las hace disponibles (a travs del interface) al programa que las utiliza.
Comienza con la palabra reservada begin seguida por u n a secuencia de sentencias y term i n a con end. (Al igual que en los programas ordinarios se requiere un p u n t o a continuacin de end.)
C u a n d o un programa que utiliza esta unidad se ejecuta, la seccin de iniciacin se
llama antes que el cuerpo del programa se ejecute.

20.2.5.

Ventajas de las unidades

La nocin de unidad acenta el carcter estructurado y modular de Turbo Pascal para


el diseo de grandes programas. Las unidades que representan mdulos independientes
pueden ser compiladas aisladamente, con independencia de un programa. Estas propiedades facilitan la creacin de libreras, estndar o personalizadas (por el usuario).
T u r b o Pascal dispone de varias unidades estndar predefinidas conectadas a tareas especficas: grficos, gestin de pantalla,.etc. Cualquier usuario puede, a su vez, crear
sus propias unidades, enriqueciendo as los recursos bsicos. En general, una unidad puede
llamar a otras unidades.

20.3.

CREACION DE UNIDADES

U n a unidad tiene una estructura muy similar a la de un programa.


La clusula uses de la parte de interface slo es necesaria en el caso de que la unidad
actual llame a otras unidades. Todos los procedimientos y funciones en la seccin de interface deben ser definidos en la seccin de implementacin.
El contenido de la parte de iniciacin es facultativo; si figuran en ellas instrucciones,
se ejecutarn inmediatamente antes del principio de la ejecucin del programa que utiliza esta unidad.
La cabecera de los procedimientos y funciones declarados en la parte de i nterface
deben ser idnticos a la cabecera de las mismas funciones definidas en la parte de implementacin; sin embargo, es posible escribir la cabecera en forma abreviada en la seccin
de implementacin.
unit u t i l i d a d n o m b r e de unidad ha de corresponder
con nombre de archivo

cabecera de la unidad

Construccin de grandes programas

775

interface
uses
Crt, Printer; opcional
procedure Frase(Texto : string);

seccin de interfaz
implementation
uses Printer; < opcional
var
MiVar : Integer
procedure Frase;
begin
ClrScr;
GotoXY ((80-Langth (Texto)) div 2, 1)
Write (texto) ;
end;

seccin de implementacin
begin
MiVar := 0
end.

seccin de iniciacin
Figura 2 0 . 1 .

Estructura de una unidad.

Una vez que se dispone el cdigo fuente de una unidad, se compila de igual forma
que un programa, pero el archivo obtenido no es ejecutable directamente. Se trata de un
archivo objeto con la extensin TPU (Turbo Pascal Unit). As, por ejemplo, si la unidad
se graba con el n o m b r e Demo.Pas, se guardar con el n o m b r e Demo.TPU.
Para utilizar una unidad en su programa, debe incluir u n a sentencia uses para indicar
al compilador que est utilizando esa unidad.
program Prueba;
uses demo;

Turbo Pascal espera que el n o m b r e del archivo fuente tenga el m i s m o nombre de la


unidad. Por ejemplo, la unidad demo, se encuentra en el archivo demo. tpu. Si el nombre
de la unidad fuera demostra. TPU, T u r b o Pascal tratar de encontrar u n archivo demostra.TPU. Para evitar estas contrariedades se puede utilizar una directiva del compilador
($u), que permite especificar el n o m b r e del archivo en que se encuentra la unidad. As,
por ejemplo, si la unidad utilidad se encuentra en el archivo V A R I O S . P A S un programa
puede llamar de la forma siguiente:
program Test;
uses
Crt, {5VARIOS.PAS} utilidad;

776

Programacin en Turbo/Borland Pascal 7

Construccin de grandes programas

La directiva debe preceder inmediatamente


al identificador de la unidad.
C u a n d o el compilador encuentra la clusula uses nombre-unidad, busca la u n i d a d
nombre-unidad sucesivamente en:

biblioteca de base TURBO.TPL;

el archivo nombre-unidad. TPU en el directorio actual, despus en el directorio reservado a las unidades y especifica en el m e n Options del entorno de trabajo.

111

var
X, Y : integer;
begin
Write ('Introducir dos nmeros enteros 1 );
ReadLn (X, Y);
Intercambio ( X , Y ) ; WriteLn (X, 1 1 , Y);
WriteLn ('el valor mximo es', Mximo (X, Y));
end.

Pasos de compilacin de una unidad


1. Edicin de la unidad.
2 . Seleccionar la orden Compile/Compile (o pulse

El programa utiliza la unidad Demol y, en consecuencia, puede disponer del procedimiento Intercambio y la funcin Max,

ALT-C):

Turbo Pascal crea un archivo con extensin TPU. Este archivo se puede dejar o mezc l a r l o c o n TURBO.TPL.

Ejemplo 2 0 . 2

Ejemplo 2 0 . 1

Construccin de una unidad con un procedimiento


Exponenciacin (x"; x: real, n: entero).

Escribir una unidad que conste a su vez de un procedimiento


lores de dos variables, as como calcular su valor mximo.

para intercambiar

function Mximo;
begin
if I>J
then Mximo := I
else Mximo := j
end;
end.

Tras editar el programa, gurdelo en disco con el nombre Demol.PAS, a continuacin


compilar en disco. El cdigo objeto resultante ser Demol.TPU. U n programa que utiliza

program Prueba;
uses
Demol;

y una funcin Potencia o

los va-

unit Demol;
interface
procedure Intercambio (var I, J : integer);
function Mximo (I, J : integer) : integer;
implementat ion
procedure Intercambio;
var
Aux : integer;
begin
Aux := I;
I
:= J;
J
:= Aux
end;

la u n i d a d Demol es:

Intercambio

unit Calculo;
interface
{seccin de interface}
procedure Intercambio (var X, Y : integer);
{intercambia los valores de X e Y}
function potencia (X : real; n : integer) : real;
{devuelve X a la potencia n-sima}
implementation

{seccin de implementacin}

procedure Intercambio (var X, Y : integer);


var
Aux : Integer;
begin
Aux := X;
X
:= Y ;
Y
:= Aux
end;
{intercambio}
function Potencia (X : real; n : integer) : real;
vr
I
: integer;
producto : real;
begin
{potencia}
Producto := 1;
for I := 1 to n do
begin
Producto := Producto * X
end;
Potencia := Producto
end; {potencia}
end. {Calculo}

Programacin en Turbo/Borland Pascal 7

778

El procedimiento Intercambio y la funcin Potencia de la seccin de implementacin


pueden ser definidos de un m o d o abreviado.
procedure Intercambio;
function Potencia;

Sin embargo, el mtodo abreviado para declarar no es un estilo m u y recomendado.


Reglas de compilacin

U n a unidad se compila tal c o m o se compila un programa completo. La compilacin se realiza en memoria. Sin embargo, antes que la unidad pueda ser utilizada por un programa o
por otra unidad, debe ser compilado en disco. Normalmente el archivo que contiene una
unidad debe tener el mismo nombre que la unidad.

20.3.1.

Construccin de grandes programas

La caracterstica de compilacin independiente de las unidades facilita considerablemente la programacin modular. U n programa grande se divide en unidades q u e agrupan procedimientos por su funcin. As, un programa puede ser dividido en diferentes
mdulos o unidades: A, B, C y D, y la estructura del programa podra ser sta:
N
program Prueba;
uses
DOS, Crt, Printer;
A, B, C, D;
(declaraciones de procedimientos y funciones del programa}
begin
end.

(programa principal}

La compilacin independiente de las unidades permite tambin superar el t a m a o


del cdigo fuente de un programa de 64K que viene limitado por el t a m a o de un segm e n t o del microprocesador 8086 (64K); esta caracterstica significa que el p r o g r a m a
principal y cualquier segmento dado no pueden exceder un t a m a o de 64K.
T u r b o Pascal manipula las u n i d a d e s de f o r m a q u e el lmite superior de almacenamiento ocupado por un programa puede llegar al lmite mximo de m e m o r i a que puede
soportar la m q u i n a y el sistema operativo: 640K en la mayora de los PC,s. Sin la posibilidad de construccin de unidades, de T u r b o Pascal, los programas estn limitados a
64K.

Turbo diferencia unidades de programas por las palabras reservadas c o n las que comienzan
y acta de acuerdo con ellas.

Construccin de grandes programas

20.3-2.

779

Uso de unidades

Las unidades creadas por el usuario se almacenan con la extensin TRU, mientras q u e las
unidades estndar se almacenan en un archivo especial (TURBO.TPL) y se cargan automticamente en memoria j u n t o con el propio T u r b o Pascal.
El uso de una unidad o diferentes unidades aade m u y poco tiempo (normalmente
menos de un segundo) al tiempo de compilacin de su programa. Si las unidades estn
cargadas en un archivo de disco independiente, se pueden necesitar unos segundos para
leerlas del disco.
Un programa puede utilizar ms de una unidad. En este caso, todas las unidades se
listan en la sentencia uses, separadas por comas en el siguiente ejemplo:
program Prueba;
uses Objetos, Unidad2;

Slo las unidades realmente utilizadas en el programa necesitan ser listadas. Si Unidad2
utiliza una unidad llamada ObViejos, pero el programa no incluye una llamada a algo
definido en ObViejos, n o es necesario listar ObViejos en la sentencia uses.
Las unidades pueden ser listadas en cualquier orden. A u n q u e no exigible, una buena
regla a seguir es listar cada unidad antes de todas aquellas que la utilicen. As, por ejemplo, si Unidad2, utiliza Objetos, es buena prctica listar Objetos antes que Unidad2.
Si una u n i d a d utiliza otra unidad, debe contener u n a clusula uses. Por ejemplo,
continuemos suponiendo que Unidad2 utiliza las dos unidades Objetos y ObViejos, entonces Unidad2 debe incluir u n a clusula uses que indique al compilador su uso. La clusula
uses (si se necesita) se incluye normalmente en la seccin de interface.
unit Unidad2
interface
uses ObViejos, Objetos

20.3.3.

Declaraciones/Informacin pblica y privada

La seccin de interface no est limitada a contener slo procedimientos y cabeceras. Puede


contener declaraciones de tipos, constantes u otras clases.
Todos los objetos declarados en la seccin de interface es informacin pblica y puede
ser referenciada en cualquier programa (o unidad) que utilice la unidad. La informacin
que se desea ocultar del programa principal debe ser situada en la seccin de implementacin.
Adems de los procedimientos y funciones cuyas cabeceras aparecen en la seccin de
interfaz de una unidad, sta puede tener tambin otros procedimientos, funciones, constantes y/u otras declaraciones. Estas declaraciones se llaman, con frecuencia, declaraciones privadas. Son locales a la unidad y no se pueden ver referenciadas por cualquier programa (u otra unidad) que utilice la unidad. Por ejemplo, si un programa utiliza la unidad
Financa, puede utilizar el procedimiento Uno, el procedimiento Dos y la constante Tasa.
Sin embargo, no puede referenciar la constante Banda o la funcin Conversin que aparece
en la seccin de implementacin. Banda y Conversin son locales a la unidad Fi nanea. Pueden ser utilizadas en la unidad Financa, pero no tienen significado fuera de esa unidad.

780

Construccin de grandes programas

Programacin en Turbo/Borland Pascal 7


unit Financa;
{declara procedimiento para convertir capitales}

Cuando se utiliza una clusula uses en la seccin de implementacin, se sita inmediatamente despus de la palabra reservada implementation.
unit P;
interface
uses A, B, C;

interface
const
Tasa = 4.25;
procedure Uno (Capital : real);
procedure Dos (Capital : real);
implementation
const
Banda = ' * ' ;

implementation
uses Q;

Uso circular de unidades

function Conversin (Capital : real) : real;


var
FactorConversion
CantidadPagar
begin
FactorConversion
CantidadPagar
Conversin

781

: integer;
: real;
:= 65;
:= Capital * FactorConversion;
:= CantidadPagar

Desde la versin 5.0 se permite el uso circular de unidades. Es posible a la unidad P utilizar la unidad Q y a la unidad Q utilizar la unidad P: se pueden construir unidades mutuamente dependientes. En ambos casos la clusula uses se debe situar en la seccin de
implementacin.
Si se escriben unidades con referencia circular, se debe utilizar la orden Make del men
Compile en lugar de la orden Compile.

end;
La orden Make gestiona las unidades, compilando automticamente cualesquiera unidades
que necesiten ser compiladas o recompiladas.

procedure Uno (Capital : real);


begin
Write ('el nteres es igual a :');
WriteLn (Capital * 4.25),
end;
procedure Dos (Capital : real);
begin
WriteLn ('el nteres es igual a

Ejemplo 2 0 . 3 .

Capital * 6)

end;
end.
{fin de Financa}

La seccin de interface de una unidad es la seccin pblica y la seccin de implementacin es la seccin privada.
Un programa que utilice la unidad puede referenciar cualquier cosa de la parte pblica (interfaz), pero no puede referenciar nada en la parte de implementacin. Este proceso de ocultacin de la informacin es muy til en el diseo de grandes programas.

20.3.4.

Clusula uses en la seccin de implementacin

En las versiones a partir de la 5.0 una clusula uses se puede situar en la seccin de implementacin. Esta propiedad permite ocultacin adicional de la informacin. Por ejemplo, supngase que la unidad P utiliza la unidad q. Esta clusula uses puede ser situada
en la seccin de interface o en la seccin de implementacin. Si la clusula uses se utiliza
en la seccin de implementacin, entonces las declaraciones dadas en la unidad Q slo
pueden situarse en la seccin de implementacin de la unidad P. Ellas no pueden situarse
en la seccin interface de la unidad P.

El programa circular utiliza una unidad denominada Visualiz, que incorpora un procedimiento denominado EscribirEnPosicionXY,
que a su vez se llama a otro procedimiento
denominado VerError que pertenece a una unidad denominada Errores, que contiene una
llamada a la unidad Visualizar.
program Circular;
{visualizar texto utilizando EscribirEnPosicionXY}
uses
Crt, Visualiz;
begin
ClrScr;
{limpieza de la pantalla}
EscribirEnPosicionXY (1, 1, 'Test');
EscribirEnposicionXY (90, 90, 'Fuera de pantalla');
EscribirEnPosicionXY (10, 20, 'Retorno a pantalla')
end.

El procedimiento EscribirEnPosicionXY tiene tres parmetros: x, y, mensaje, x, y, coordenadas del punto en la pantalla de texto (de 25x80); mensaje, frase a visualizar en la
posicin (x, y).
Si las coordenadas (x, y) son vlidas, es decir, 1 < = x < = 80 y 1 < = y < = 25 se
escribe el mensaje en la pantalla; si x e y no son vlidos (la posicin queda fuera de la
pantalla), se visualiza un mensaje de error.

Construccin de grandes programas

Programacin en Turbo/Borland Pascal 7

782

unit Visualiz;
interface
procedure EscribirEnposicinXY (X,Y:integer; Mensaje:string);
implementation
uses C r t , E r r o r ;
procedure EscribirEnPosicionXy (X,Y;integer; Mensaje:string);
begin
if (X in [1..80]) and (X in [ 1. .25])
then
begin
GotoXY (X, Y);
Write (Mensaje)

783

Un programa debe contener la clusula uses, situada inmediatamente despus de la


cabecera, cuando utiliza objetos declarados en una unidad.
program Test;
uses
Crt,Proceso;
const
Mayor = 100;
type
Palabra = string [20];
var
Expresin : real;

end
else
VerError ('Coordenadas XY fuera de rango')
end;
end.

El procedimiento VerError visualiza el mensaje 'Error Fatal' en la lnea 25 de la pan-

R e c o r d e m o s q u e las u n i d a d e s e s t n d a r s o n :
System

Dos Crt

Printer

Graph

Graph3

Turbo 3

unit Error;
interface
procedure VerError (Cadena : string)

En este captulo se har una breve introduccin a las diferentes unidades profundizando en sus estructuras en el Captulo 21. Todas las unidades contienen una serie de
objetos que estn declarados en la seccin de interface (constantes, variables, tipos, procedimientos y funciones) y que son exportables o visualizables desde cualquier programa
o unidad que utilice dichas unidades.

implementation
uses
Visualiz;
procedure VerError (Cadena : string)

20.4.1.

talla,

begin
EscribirEnPosicionXY (1,25,cadena)
end;
end.

C o m o habr observado en la clusula uses de las secciones de implementacin, existen referencias m u t u a s (llamadas recprocas) de las unidades posibles porque T u r b o Pascal puede compilar ambas secciones de interface completas.

Si se utiliza Make para compilar una de las dos unidades que referencia a la otra unidad, se
compilarn ambas unidades.

UTILIZACION DE UNIDAD ESTANDAR

El archivo TURBO.TPL, que contiene todas las unidades estndar se carga en m e m o r i a central a la vez que el propio compilador y est disponible en cualquier m o m e n t o , con la
ayuda de la clusula uses.

Unidad System

Esta unidad contiene todos los procedimientos y funciones estndar de T u r b o Pascal relativas a entradas/salidas, cadena de caracteres, clculos en coma flotante, gestin de memoria, etc.
La unidad System tiene una configuracin especial, se enlaza automticamente en la
compilacin de cada programa y no precisa ser referenciada por la clusula uses system.

20.4.2.

20.4.

Overlay

Unidad Crt

Esta unidad proporciona un conjunto especfico 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 mayora de los programas T u r b o Pascal que hacen uso de la pantalla para representaciones de salida recurren a la unidad Crt. Algunos procedimientos tpicos son:
cirScr
KeyPressed
sound
window

Borra la pantalla.
Detecta la pulsacin de una tecla. (
Hace sonar el altavoz interno.
Define una ventana de texto en la pantalla.

784

Programacin en Turbo/Borland Pascal 7

Construccin de grandes programas

Ejemplo 2 0 . 4 .

Ejemplo 2 0 . 5

El siguiente programa permite comprobar la velocidad de presentacin de los caracteres


en la pantalla, creando una ventana de 10.000 caracteres aleatorios que se repiten tres
veces.

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

program Velocidad_Caracteres;
uses
Crt;
var
j, k : integer;
begin
Randomize;
ClrScr;
DirectVideo := true;
window (1,1,40 + Random (20), 10+Random (15));
for j := 1 to 2 do
begin
ClrScr;
GotoXY (1, 1) ;
if i = 1 then
WriteLn ('acceso directo a memoria');
else
WriteLn ('no acceso directo a memoria');
delay (2000 ) ;
for k := 1 to 10000 do
Write (chr (Random (128) + 32));
DirectVideo := not DirectVideo
end
end.

program Hora;
uses
Crt, Dos;
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.

20.4.4.

Unidad Printer

La unidad Printer est concebida para facilitar la tarea del programador cuando ha de
utilizar una impresora c o m o dispositivo de salida. Permite enviar la salida estndar de
P a s c a l a la i m p r e s o r a u t i l i z a n d o Hrite y MriteLn.

La inclusin de Printer en su programa define Lst c o m o u n a variable de texto. Esta


unidad requiere a su vez de la u n i d a d Crt.
Ejemplo 2 0 . 6

20.4.3.

Unidad Dos

program impresora;
uses
Printer;
var

Esta unidad contiene declaraciones, constantes, tipos, variables, procedimientos y funciones relacionadas con el sistema operativo DOS y la gestin de archivos. Los subprogramas que constituyen esta unidad no existen en Pascal estndar. Esta unidad no necesita
ninguna otra unidad en su declaracin.
Algunos procedimientos importantes son:
GetTime

SetTime

DiskSize

GetAttr

MsDos

A, B, C : integer;
begin.
WriteLn (Lst, 'este texto aparece en la impresora');
Read (A, B);
C := A + B;
WriteLn (Lst, C : 6)
end.

...

y rutinas de bajo nivel:

Nota

Intr

que permiten invocar directamente cualquier llamada MS-DOS o interrupcin del sistema.
Los registros del microprocesador son los tipos de datos que se asignan a los parmetros de las rutinas de bajo nivel MsDos e Intr.

785

refcPndoarTh"sr'mpr

s i n l k m u i a U u , 1 K , a t l Pr

^ e > tomo se v,uen el .jpaulo

Programacin en Turbo/Borland Pascal 7

786

20.4.5.

Unidad Graph

Esta unidad contiene las constantes, tipos, variables, procedimientos y funciones relacionadas con los grficos, que permiten hacer uso de las capacidades grficas de su PC.
Algunas de las rutinas a las que se tiene acceso con esta unidad son:
reconocimiento automtico de u n gran n m e r o de tipos de pantallas y adaptadores grficos;
escrituras de texto con diferentes tipos y t a m a o s de caracteres;
desplazamiento de objetos grficos;
trazado de figuras geomtricas e histogramas.

20.5.

SITUACION DE LAS UNIDADES EN SUS DISCOS:


DONDE BUSCA TURBO PASCAL LAS UNIDADES?

Las unidades existen fsicamente en una de las dos formas siguientes: c o m o archivo independiente con su nombre y una extensin TPU (Turbo Pascal Unit), o como parte de u n
archivo llamado TURBO.TPL. Pueden existir muchos archivos con extensin TPU, pero slo
puede haber un archivo .TPL (Turbo Pascal Library).
TURBO.TPL se carga en la memoria de la computadora siempre que se arranca el programa TURBO Pascal, de m o d o que todas las unidades predefinidas, tales como Crt, Dos,
etctera, estn siempre disponibles. No importa cual sea la unidad de disco activa o en
qu directorio est situado, su programa puede utilizar cualquiera de estas uniHades y
TURBO encontrar la unidad. Si se conoce de antemano que algunas de las unidades residentes en TURBO.TPL no se van a utilizar, se pueden eliminar con la utilidad llamada TPUMOVER.EXE. Esta operacin har ms pequea TURBO.TPL y permitir que la m e m o r i a sea
utilizada para otras cosas; es decir, se pueden aadir las unidades del usuario al archivo
TURBO.TPL.

Las unidades que disea el programador, el sistema TURBO espera encontrarlas en el


directorio activo de la unidad de disco activa. Esto significa que si tiene una unidad con
procedimientos que utiliza con frecuencia, deber transferir la unidad cada vez que cambia el directorio, o en caso contrario perder el acceso a esa unidad cuando no est en el
directorio activo. Es preciso indicar entonces al sistema TURBO en qu directorio estn las
unidades.
Desgraciadamente no se puede situar un especificador de unidad o de c a m i n o en la
sentencia uses. Las sentencias siguientes no son vlidas

Construccin de grandes programas

787

Supongamos que estn todas las unidades del usuario en el directorio Pruebas en
la unidad de disco B y se desea indicar al sistema que busque siempre all para
encontrar las unidades. Las operaciones a realizar son:
1. Activar el m e n Options.
2. Elegir la orden Directories de ese men. Se produce una lista con los tipos de
directorios que se pueden especificar.
3. Elegir de esa lista Unit Directories y aparecer una ventana en la pantalla. Teclee B:\Pruebas y, tras pulsar RETURN, aparece:
p

Unit Directories
B:\Pruebas

El sistema ya est preparado para buscar en ese directorio las unidades que haya
escrito. C u a n d o se e n c u e n t r a u n a clusula uses, el sistema busca la u n i d a d en
TURBO.PTL, si no la encuentra, busca en el directorio activo de la unidad de disco
activa. Si no se encuentra en ninguna de esas posiciones, entonces busca en el directorio que se referenci c o m o Unit Directories, es decir, en el ejemplo Pruebas,
en la unidad B. En caso negativo el sistema produce un error.
Se pueden utilizar directorios mltiples. En este caso se pueden listar todos los directorios separados por puntos y comas:
unit directories : B :\Practicas; B:\Pruebas; C:\DemoUno

En esta ocasin TURBO busca, c o m o siempre, en TURBO.TPL y a continuacin en el directorio activo para encontrar una unidad. Si no tiene xito la bsqueda, se busca en el
directorio Practicas de la unidad B. Si no existe ninguna unidad, entonces se busca en
Pruebas de la unidad B. Si tampoco tiene xito en la bsqueda, entonces se busca en el
directorio DemoUno de la unidad C. Si tampoco tiene xito la bsqueda, se producir un
mensaje de error.
$U indica un n o m b r e de camino a un archivo d e n o m i n a d o Practicas/.TPU que contiene la unidad llamada Practicas.
La directiva $U tiene prioridad sobre unidades del directorio actual o de los directorios especificados en el m e n Options, de modo que si tiene una unidad idntica en su
directorio actual, $U permite seleccionar u n a unidad del m i s m o n o m b r e almacenada en
cualquier parte de su disco.

Reglas de funcionamiento

uses Crt, Dos, C:\UnidadesUsuario;


uses Crt, C:\Prueba\UnidadesUsuario;

Algunos mtodos para indicar al sistema TURBO en qu directorio estn las unidades
son:
Si los archivos de su unidad estn en el directorio actual (por ejemplo, C: \Practicas)
y el compilador est en C:\TUR80, se puede invocar el compilador desde C:\Practicas,
el compilador las encontrar.

Cuando aparece un n o m b r e de unidad en una directiva uses. Turbo busca esta unidad
(mdulo) sucesivamente en:
1. Entre las unidades residentes en la librera TURBO.TPL.

2. En el directorio actual.
3. Los directorios citados en el m e n Options.

788

Construccin de grandes programas

Programacin en Turbo/Borland Pascal 7

TURBO supone que el nombre de la unidad y el n o m b r e del archivo que contiene a la


unidad son idnticos (por ejemplo, unidad Demo y archivos Demo.Pas y Demo.TPU.
El programa TPUMOVER
Las unidades estndar residen en la librera T U R B O . T P L y se cargan a u t o m t i c a m e n t e
c u a n d o arranca T u r b o Pascal. Al objeto de ahorrar m e m o r i a se p u e d e n transferir unidades poco utilizadas, tales c o m o Turbo3 y Graph, fuera del archivo TURBO.TPL, mediante
la unidad TPUMOVER. En otras palabras, esta utilidad se puede utilizar para aadir o borrar

20.7.

789

SINTESIS DE UNIDADES

U n a vez visualizadas todas las caractersticas de las unidades, vamos a realizar una sntesis de las mismas al objeto de que el lector pueda asimilar totalmente y comenzar a
rnodularizar sus programas con la m x i m a eficiencia a partir de ese m o m e n t o .
I /! piri'/rid piii'ih' iii\poni'> Je ton^hmt's, dchnmom's de hp/>\ v
l ,l. "" Imetah > una \enwr.c.ii uses i A . d e a
cru de un p/iighima

prccom

desde TURBO.TPL.

20.6.

IDENTIFICADORES IDENTICOS
EN DIFERENTES UNIDADES

Es vlido tener identificadores idnticos dentro de dos unidades y utilizar a m b a s unidades en el mismo programa. Es decir, es posible tener una unidad llamada Pantalla que
contenga un procedimiento d e n o m i n a d o C1 rScr, de igual nombre que el procedimiento,
ya conocido, de borrado de la pantalla de la unidad estndar Crt.

20.7.1. Estructura de una unidad


Una unidad es un mdulo. No es un programa ejecutable. Existen unidades estndar (por
ejemplo, Crt; si desea acceder a procedimientos de esa unidad como ClrScr, Window, debe
incluir mediante una clusula uses la unidad Crt: uses Crt) y unidades creadas por el
usuario.
Una unidad tiene u n a estructura ya conocida que contiene una cabecera, u n a parte
interface, u n a parte implemenation y, opcionalmente, u n a parte de iniciacin.

uses DOS, Crt, Pantalla;


En este caso, se dispondra de dos procedimientos ClrScr. Cul utilizar? T u r b o Pascal utiliza el ltimo procedimiento ClrScr q u e se encuentra al explorar las unidades en la
sentencia uses. En este ejemplo explora primero Crt y luego Pantalla, y por consiguiente,
se emplea el procedimiento ClrScr escrito por el usuario. Si se intercambian los nombres
de las unidades
uses DOS, Pantalla, Crt;
el compilador utilizar ahora el procedimiento estndar ClrScr. Sin embargo, recuerde
q u e en este ltimo caso Pantalla no puede utilizar nada de Crt. Esto evidentemente limita las opciones.
Un sistema de diferenciar los identificadores idnticos es utilizar el identificador de
la unidad y un punto.
program Pruebas;
uses
Dos, Crt, Pantalla;
begin
Crt.ClrScr;
{limpieza de la pantalla de texto}
ClrScr
{limpieza de cualquier otra pantalla de texto}
end
Con este mtodo es posible referenciar y diferenciar identificadores idnticos en unidades diferentes. En el caso de que ningn n o m b r e de unidad preceda al identificador o
referencia, se asigna la primera unidad encontrada en la exploracin de unidades en la
sentencia uses.

unit cidentificador>; {cabecera obligatoria}


(el identificador se utiliza como nombre del archivo
de la unidad ya compilada; la extenxin es .TP}
interface
uses <lista de unidades>
{opcional}
{declaraciones pblicas o visibles son opcionales}
const
type
var
procedure ...
function ...

{solo cabecera}
{solo cabecera}

implementation
{declaraciones privadas: locales a la unidad}
uses dista de unidades>
const ....
type
var
procedure
function ....
begin

end.

{cabecera y cuerpo del procedimiento}


{cabecera y cuerpo de la funcin}
{seleccin de iniciacin: opcional}

{obligatoria, fin de implementacin}

790

Los identificadores que aparecen en la seccin de interface son visibles desde cualquier programa que utiliza la unidad, pero los detalles de su estructura interna slo se
pueden conocer en la seccin de implementation.
Desde el p u n t o de vista profesional, usted puede proteger su cdigo fuente, distribuyendo en la documentacin del programa slo la seccin de interface y reservndose los
algoritmos y el cdigo fuente de la seccin de implementatin.
La cabecera de los procedimientos y funciones declaradas en la seccin de interface
debe ser idntica a la cabecera de las mismas funciones definidas en la seccin de implementacin; sin embargo, es posible escribir la cabecera en forma abreviada en la seccin
de implementacin. Los dos modelos de la unidad Base que se exponen a continuacin
son correctos y equivalentes
Modelo

Construccin de grandes programas

Programacin en Turbo/Borland Pascal 7

1
unit Base;
interface
uses
Crt;
procedure mensaje (Texto : string);
implementation
procedure Mensaje;
begin
ClrScr;
GotoXY ((80 - Length (Texto)) div 2, 4);
Write (Texto)
end;
begin
end.

20.7.2.

791

Excepciones en la escritura de unidades

Al escribir unidades debe tener en cuenta estas limitaciones:


La declaracin forward de los subprogramas no est permitida (no es necesaria) en
una unidad.
Si un subprograma se declara como i mine, su definicin de cdigo debe aparecer
en la seccin de interface y el identificador del subprograma no debe aparecer en
la seccin implementatin.
Si un subprograma es declarado externa!, su identificador no debe aparecer en la
seccin implementation.

20.7.3.

Compilacin de unidades

La compilacin de una unidad se efecta del mismo m o d o que la compilacin de un


programa, con la diferencia de que al compilar el programa se obtiene un archivo autnomo ejecutable (.EXE) y al compilar una unidad se obtiene un archivo en cdigo objeto
(no ejecutable) c o m o resultado, con extensin .TPU (Turbo Pascal Unit), a u n q u e con el
mismo nombre que el archivo de cdigo fuente. Este cdigo objeto de un archivo .TPU
slo es enlazable (linkable) por el compilador de T u r b o Pascal y no es compatible con
archivos . OBJ creados por otros compiladores.
Para crear unidades que pueda automticamente recompilar con las opciones Make y
Build de T u r b o Pascal se deben seguir estas reglas:
El identificador de unidad (especificado) en la cabecera debe ser el mismo que el
nombre del archivo fuente (sin incluir la extensin . PAS).
El n o m b r e del archivo fuente debe tener u n a extensin (.PAS).
El archivo .TPU debe estar en el directorio actual o en un directorio especificado
con las opciones Options/Directories/Unit directories. El cdigo fuente debe estar
en el directorio actual.

Modelo 2
unit Base;
interface
uses
Crt;
procedure Mensaje (Texto : string);
implementation
procedure Mensaje(Texto:string);
begin
ClrScr;
GotoXY ((80 - Length (Texto)) div 2, 4);
Write (Texto)
end;
begin
end.

20.8.

OTROS METODOS DE ESTRUCTURAR PROGRAMAS:


INCLUSION, SOLAPAMIENTOS Y ENCADENAMIENTO

Adems de las unidades, existen dos mtodos para estructurar o construir grandes programas a partir de T u r b o Pascal 5.0: los archivos de inclusin (include) y los solapamientos (overlays). A u n q u e es necesario hacer constar que si bien en las versiones 3.0 y anteriores eran imprescindibles, su utilidad ha decado en 5.0 en beneficio de las unidades.

20.8.1.

Los archivos de inclusin o incluidos (include)

Como ya conoce el lector, la directiva Incluir Archivos (include) ($1) permite incluir cdigo fuente en el programa que est en memoria, a partir de archivos externos de discos.
El cdigo del programa ejecutable acta como si el cdigo inclido estuviera fsicamente
presente en el archivo que se est compilando.

792

Construccin de grandes programas

Programacin en Turbo/Borland Pascal 7

L a d i r e c t i v a $1 < nombrearchivo>

p e r m i t e i n c l u i r el a r c h i v o d e n o m i n a d o < nombrear-

chi vo> durante la compilacin. Este es un mtodo para dividir su cdigo fuente en segmentos ms pequeos. Cuando el compilador encuentra la directiva $1 < nombrearchi vo>,
abre el archivo del disco < nombrearchi vo> y comienza a compilarlo. El archivo < nombrearchi vo> no se lee realmente en memoria como un todo; el compilador lee simplemente lnea a lnea, compila la lnea a cdigo mquina y a continuacin lee la siguiente
lnea.

Utilizar unidades, no archivos de inclusin, para bibliotecas de subprogramas.

El uso actual de los archivos de inclusin se suele reducir a archivos que contienen
procedimientos o funciones sencillas, o incluso la definicin de uno o ms tipos de datos; como ejemplos tpicos: procedimientos o funciones de bsqueda, ordenacin, etc.

20.8.2.

Los solapamientos (overlays)

Si se desarrollan grandes aplicaciones que deban correr sobre sistemas con recursos de
memoria limitados (640K o menos), la tcnica de solapamientos es indispensable.
Los solapamientos (overlays) son partes de un programa que comparten u n a zona de
memoria comn. Slo las partes del programa que se requieren para una funcin dada
residen en memoria al mismo tiempo; se cargan (sobreescriben) una sobre otra durante
la ejecucin. Los solapamientos pueden reducir significativamente los requisitos totales
de memoria de un programa en tiempo de ejecucin. De hecho, con solapamientos se
pueden ejecutar programas que son mucho ms grandes que la memoria total disponible, ya que slo partes del programa residen en memoria en un instante dado.
La idea bsica del solapamiento es sta: se divide un programa en partes y se prepara
de modo que diferentes partes compartan el mismo lugar en memoria. Cuando el programa principal comienza la ejecucin, un solapamiento (segmento de programa) se carga
en una zona libre (slot) de la memoria. Cuando se requiere el segundo solapamiento, se
carga en memoria en la misma zona que el primer solapamiento, recubriendo el primer
solapamiento. Posteriormente, cuando un tercero, cuarto o quinto solapamiento se requieren, simplemente se cargan en la parte superior de cualquier solapamiento que hubiese ocupado anteriormente la zona del mismo. De este modo, se pueden manejar megabytes de cdigo que pueden correr sobre memorias de 640K. 256K o incluso menos.
Simplemente necesita dividir esos megabytes de cdigo en un nmero suficiente de solapamientos.

Todas las unidades especificadas como solapamientos (overlays) se enlazan en un


archivo independiente, con el mismo nombre que el programa principal, pero con una
extensin .OVR. En otras palabras, si un programa con solapamientos MIPROG.PAS se compila, Turbo Pascal genera un archivo de solapamiento (MIPR0G.0VR) y un archivo ejecutable (MIPROG.EXE). El archivo .EXE contiene las partes estticas (no recubiertas) del programa y el archivo .OVR contiene todas las unidades de solapamiento que se
intercambiarn en la memoria durante la ejecucin del programa.
Existe una sola zona de memoria para solapamientos, se denomina memoria intermedia de solapamiento (overlay buffer), que reside en memoria entre el segmento de la
pila (stack) y el segmento para variables dinmicas (heap). Inicialmente el t a m a o de la
memoria intermedia de solapamiento se hace tan grande como sea necesaria, de m o d o
que puede contener la unidad de solapamiento ms grande; posteriormente puede incrementarse su tamao, s as se desea. S no existe bastante memoria disponible cuando se
carga la unidad, se visualizarn mensajes de error
Program too big to fit in memory
Not enough memory to run program

El gestionador de solapamientos tiene la posibilidad de cargar el archivo recubierto


en memoria ampliada o expandida (EMS) cuando exista espacio disponible suficiente.
Si la biblioteca en tiempo de ejecucin detecta memoria E M S ( E x p a n d e d Memory Specification) libre, el archivo de solapamiento se sita en la memoria EMS R A M .
La Figura 20.2 muestra el sistema de funcionamiento de los solapamientos.

20.8.3.

La unidad Overlay (Generacin de solapamientos)

Turbo Pascal proporciona un gestionador de archivos que manipulan acceso a solapamientos en una unidad llamada Overlay. Si se trata de utilizar solapamientos, se debe
incluir Overlay en su sentencia Uses, antes de todas las unidades a recubrir. Para disear
programas con solapamientos se deben seguir las siguientes reglas:
1. Una unidad especificada como solapamiento debe ser compilada con la directiva
$0. Esta directiva define una unidad como un solapamiento.
La directiva $0 tiene dos formatos: un formato de tipo conmutador y un formato de parmetro.
formato conmutador

{$0+}

{$o-}
formato parmetro
$o+

Gestin de los s o l a p a m i e n t o s
El sistema de solapamientos de la versin 5.0 est basado en unidades. La gestin de los
mismos se realiza a nivel de unidad; sta es la parte ms pequea de un programa que
se puede hacer en un solapamiento. Cualquier nmero de unidades puede ser especificado como solapamiento, lo que significa que cada uno ocupar la misma regin de memoria cuando se cargan.

793

$o Xmodem

{$0parametro}
situada en la unidad del archivo fuente, se activa su uso c o m o
un solapamiento, pero no se requiere su uso c o m o solapamiento; puede ser enlazada, todava, normalmente si se desea.
indica al programa principal que la unidad llamada Xmodem se
trate como un solapamiento.

Las directivas $0 deben ser situadas despues do las clausula uses.

794

Programacin en Turbo/Borland Pascal 7

Construccin de grandes programas

program Mortimer;
{$F+, 0+}
uses overlay, Dos, Crt, Circuios, Xmodem, Kermit, Parser;
{$0 Xmodem}
{$0 Kermit}
($0 Parser}

En el ejemplo anterior se observa la directiva $F+. La razn es que todas las unidades utilizadas por el programa, as c o m o el propio programa, deben ser compiladas con la directiva Far Calis activada ({$F+}). Por esta causa, $F+ se sita inmediatamente despus de la sentencia program.
Iniciar el gestionador (manipulador) de solapamientos. El cdigo de iniciacin se
debe situar antes de la primera llamada a una rutina de solapamiento, y en particular al principio de la parte de sentencias del programa. La llamada se realiza con
Ovrlm't,

Constantes y variables d e la unidad Overlay


const
= 0;
OvrOk
= -1
OvrError
=
-2
OvrNotFound
= -3
OvrNoMemory
= -4
OvrloError
OvrNoEMSDriver = - 5
OvrNoEMSMemory = - 6
var
OvrResult : integer;

Procedimientos y funciones d e la unidad Overlay

c u y o f o r m a t o es O v r l n i t (nombrearchivo).

MIPROG.OVR

MIPROG.EXE

Heap
(montculo)

Unit Tee;

Unit Tee;

Unit Tie;

Un i t T s;

Unit Toe;

Unit Toe;

Unit Tum;

Unit Tum;

Unit Tea;

Unit Tea;

795

Procedimientos

Funciones

Ovrlnit
OvrInitEMS
OvrSetBuf

OvrGetBuf

OvrClearBuf

OvrClearBuf
Este procedimiento permite borrar t e m p o r a l m e n t e la memoria intermedia de solapamiento; esta operacin se debe realizar cuando se necesite utilizar la memoria que ocupa.
OvrClearBuf

fondo

OvrGetBuf
Devuelve el t a m a o actual de la memoria intermedia de solapamiento, en VarLonglnt.

overlay buffer (debe ser tan


grande como el mayor
solapamiento)

VarLongInt:= OvrGetBuf
Unit Tir;

Unit Tir;

Unit Tas;

Unit Tas;

Ovrlnit
Stack (pila)

Memoria EMS
(si existe)

Memoria principal
(DOS)
Figura 2 0 . 2 .

Almacenamiento en
disco (DOS)

Archivos y memorias de solapamiento.

Inicia el gestionador de solapamientos y abre el archivo de solapamiento.


Ovrlnit (nombrearchivo)

OvrlnitEMS
Verifica que existe un controlador EMS y suficiente memoria EMS para contener el archivo
de solapamiento.

Ejemplo
begin
OvrInit ('MIPROG.OVR')
end;

OvrlnitEMS

796

Programacin en Turbo/Borland Pascal 7

OvrSetBuf

Construccin de grandes programas

797

PROBLEMAS

Establece el t a m a o de la m e m o r i a i n t e r m e d i a de s o l a p a m i e n t o (overlay buffer).

OvrSetBuf (VarLonglnt)

VarLonglnt

variable d e tipo longint.

20.8.4.

Encadenamiento de archivos compilados

T u r b o Pascal p r o d u c e archivos .EXE en lugar de los a r c h i v o s m s simples .COM q u e producira la versin 3; p o r esta r a z n n o p u e d e s o p o r t a r e n c a d e n a m i e n t o d e p r o g r a m a s c o n
d a t o s - c o m p a r t i d o s . Se p u e d e utilizar el p r o c e d i m i e n t o Exec de T u r b o Pascal p a r a t ra ns ferir el c o n t r o l de u n p r o g r a m a a otro, p e r o c a d a p r o g r a m a t e n d r su p r o p i o s e g m e n t o
de datos.

1. Disear una unidad Libl que defina las tres funciones siguientes, que puedan ser utilizadas
posteriormente por cualquier programa:
function Min (X1,X2 :
{devuelve el elemento
function Max (XI,X2 :
{devuelve el elemento
function Media (XI,X2
{devuelve la media de

integer) : integer;
mas pequeo de XI y X2}
integer) : integer;
mayor de XI y X2}
: integer): real;
XI y X2}

Escribir un programa que haga uso de la unidad.


2. Construir una unidad que contenga las siguientes funciones estadsticas de un vector x de n
elementos.
1 "
_
Desviacin media (DM = - V Ui - x|

- 1 4 *
i
donde x = > Xi = - (x + x2 + ... + x)
nn~1
x

RESUMEN
Una unidad es una coleccin de procedimientos y funciones de propsito genera], guardadas en
disco de forma compilada. Las unidades se pueden utilizar para construir su propia librera de procedimientos y funciones predefinidas. Esta librera puede ser utilizada en diferentes proyectos y por
diferentes equipos de programadores.
Las unidades refuerzan el concepto de abstraccin de datos. Esto se consigue situando los detalles sobre procedimientos implementados en una unidad y, por consiguiente, ocultando estos detalles.

Sintaxis de una unidad

es el valor absoluto
Media cu adrada (MC)

- 2 ' f

Media armnica (MA) =

1_

L V*i
3. Escribir una unidad llamada Grados que incluya funciones para convertir grados sexagesimales y centesimales a radianes. Disear un programa que permita calcular los valores de las funciones trigonomtricas seno, coseno y tangente de una tabla de valores angulares dados en grados sexagesimales y centesimales (incremento del ngulo en la tabla, 1 grado.
4. Dadas dos matrices, A y B donde

unit <nombre>
interface
uses d i s t a de unidades utilizadas por esta unidad>
{se omite si no se utiliza ninguna unidad}
cabeceras de procedimientos y funciones>
<otras declaraciones>
implementation
<declaraciones completas de procedimientos y funciones>
begin
{no se necesita si no existen sentencias de inicializacion}

au

a 2

a i

b 12

0-21

0-22

CL-ln

>22

&m\

&m2

Disear una unidad que contenga los procedimientos o funciones: producto y suma de A y .
Producto = C y = 2 aik.xbk]

end.

Suma = Sy =

2
k-l.j-l

^0

798
5.

Construccin de grandes programas

Programacin en Turbo/Borland Pascal 7


Disear una u n i d a d que soporte las siguientes dos funciones de tiempo:

Fecha (convierte los p a r m e t r o s numricos p r o p o r c i o n a d o s por el p r o c e d i m i e n t o

G e t O a t e en
una cadena con el f o r m a t o D a S e m a n a Da Mes Ao: ds M M AAAA).
Hora (convierte valores numricos proporcionados por el p r o c e d i m i e n t o GetTime en u n a cadena de f o r m a t o : ' h h m m ss')-

799

12. Disear u n a u n i d a d q u e contenga los siguientes procedimientos de bsqueda:


secuencial
binaria

hash

PROBLEMAS RESUELTOS

Nota

Los procedimientos GetTime y GetDate estn predefinidos en la unidad DOS.

1. La unidad Prueba contiene dos f u n c i o n e s que sirven para asegurar divisiones correctas y evitar
la divisin por cero, que p r o d u c e u n error irrecuperable en la ejecucin del programa. El programa DemoPrueba utiliza las f u n c i o n e s creadas en la unidad.
unit Prueba;
interface
const
ValorNoValido = -999.99;
Tolerancia
= 1. OE- 6;
function DistintoCero (valor : real) : boolean;
function CocienteCorrecto (Dividendo, Divisor : real) : real;
(definicin de las funciones}

6. Construir una unidad que contenga los siguientes procedimientos de ordenacin:


Burbuja
Shell
QuickSort
7. Escribir una unidad que m a n i p u l e tipos de datos abstractos Enteros grandes (enteros de al menos 20 dgitos). D e b e p r o p o r c i o n a r n m e r o s positivos y negativos, y las operaciones de s u m a ,
resta, multiplicacin y divisin.

implementation
function DistintoCero (Valor : real) : boolean;
{devuelve true si valor difiere de cero en ms de la cantidad
predef inida}
begin
if abs (valor -0.0) > Tolerancia then
DistintoCero := true
else
DistintoCero : = false
end;

8. Escribir u n a unidad cuyos subprogramas bsicos deben ser:


Operacin traspuesta de u n a matriz.
Multiplicaciones de dos matrices cuadradas.
S u m a de dos matrices cuadradas.
9. Crear una unidad que se c o m p o n g a de procedimientos y funciones q u e realicen las tareas siguientes:

function CocienteCorrecto (Dividendo, Divisor:real) : real;


{verificar la divisin por cero; se debe devolver el cociente o
un valor por defecto 999.99}
begin
if DistintoCero (Divisor) then
CocienteCorrecto := Dividendo/Divisor
else
CocienteCorrecto := valorNoValido
end;
begin
{instrucciones de inicializacion, si existen}
end.

Hacer el cursor visible o invisible.


Emitir un sonido (pitido bip).
Borrar la parte de pantalla situada entre dos lneas.
Convertir las letras de u n a cadena de caracteres en maysculas.
Convertir u n valor n u m r i c o en u n a cadena de caracteres.
Insertar caracteres.

10. Escribir u n a u n i d a d q u e contenga los procedimientos de c a m b i o s de base de n u m e r a c i n : paso


de base 2 a base 16, base 2 a base 10 y base 10 a base 2.
11. Escribir u n a u n i d a d q u e c o n t e n g a p r o c e d i m i e n t o s y f u n c i o n e s q u e e f e c t e n las tareas siguientes:
Desplazar u n a cadena de caracteres en la pantalla, de izquierda a derecha o viceversa y de
velocidad ajustable.
Visualizar u n a ventana.
Mover el cursor por la pantalla.

Programa

de aplicacin
program DemoPrueba;
uses
Prueba;

Programacin en Turbo/Borland Pascal 7


var
Numerador, Denominador : real;
begin
{generacin de nmeros aleatorios}
Randomize;
Numerador
:= Random;
Denominador := Random;
WriteLn (Numerador : 6 : 2, Denominador : 6 : 2);
WriteLn (CocienteCorrecto (Numerador, Denominador) : 8 : 4);
ReadLn;
end.
Crear una unidad Aleatori que contenga tres f u n c i o n e s que p r o p o r c i o n e n valores g e n e r a d o s
aleatoriamente de tres tipos diferentes: enteros, cadenas y lgicos.
Las funciones a definir se d e n o m i n a n EnterosA, CadenasA, LgicosA.
Proporciona un entero c o m p r e n d i d o en u n intervalo de valores especficos
min y max.
Enteros (Min y Max).
Enteros ( 5 , 5 0 ) genera un entero aleatorio entre 5 y 50.
CadenasA Proporciona u n a cadena de letras maysculas arbitrarias.
CadenaA (n) n, nmero de letras.
Lgi COSA Proporciona un valor lgico aleatorio.
Enteros A

unit Aleatori;
interface
function EnterosA (min, max : integer) : integer;
function CadenaA (k : Byte) : string;
function LogicosA : boolean
implementation
function EnterosA;
const
Minimo = - 327 67 :
var
Intervalo, Word;
begin
if Min < Minimo then Min := Minimo;
intervalo := max - min + 1;
EnterosA
:= Random (Intervalo) + min
end;
function CadenaA;
var
A, Z, j : byte;
Aux : string;
begin
A
:= ord ('A');
Z
:=ord ( ' Z ' ) ;
Aux := 1 ' ;

Construccin de grandes programas

801

for j := 1 to k do
Aux := Aux + Chr (EnterosA (A, Z));
CadenaA := Aux
end;
function LogicosA;
begin
LogicosA := boolean (EnterosA (0,1))
end.
3. Escribir u n p r o g r a m a q u e visualice seis lneas q u e contengan cada u n a de ellas u n entero entre
300 y 400, u n a cadena de ocho letras y un valor true o false, todos ellos aleatorios.
325
346
371
382
343

MNRPQANT
LOIVRSTN
MSPBVTRL
NZJMKSBC
FGRILTRP

true
false
true
false
true

Nota: Utilice la u n i d a d Aleatori.


uses Aleatori;
var
j : byte;
begin
Randomize;
for j := 1 to 6 do
WriteLn (EnterosA (300, 400),
end.

11

, CadenaA(8), ', LogicosA)

4. El programa siguiente lee un archivo de entrada (programa fuente en Pascal) y lo convierte en


otro archivo de salida (programa f u e n t e en Pascal) con las palabras reservadas de T u r b o Pascal
en negritas y maysculas.
program enfatizar;
uses
Crt, Printer;
type
cadena = string [14];
lista = array [1..50] of cadena;
var
car
: char;
a, b, denominacin : cadena;
fichero
: text;
claves
: lista;
procedure
begin
claves
claves
claves
claves

Tabla (var claves : lista);


[ 1]
[ 2]
[3]
[ 4]

:=
:=
:=
:=

'AND';
'ARRAY';
'BEGIN';
'BOOLEAN';

802

Programacin en Turbo/Borland Pasca! 7


claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
claves
end;

[ 5]
[ 6]
[ 7]
[ 8]
[ 9]
[10]
[11]
[12]
[13]
[14]
[15]
[16]
[17]
[18]
[19]
[20]
[21]
[22]
[23]
[24]
[25]
[26]
[27]
[28]
[29]
[30]
[31]
[32]
[33]
[34]
[35]
[36]
[37]
[38]
[39]
[40]
[41]
[42]
[43]
[44]
[45]
[46]
[47]
[48]
[49]
[50]

=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=

CASE ' ;
'CHAR';
'CONST';
'CONSTRUCTOR
'DESTRUCTOR'
'DIV';
'DO' ;
'ELSE';
' END ' ;
'EXIT';
'FILE';
'FOR';
'FUNCTION';
' IF' ;
'IMPLEMENTAT
'IN';
'INPUT';
'INTERFACE';
'INTEGER';
'MOD 1 ;
'NOT';
'OBJET';
' OF ' ;
' OR ' ;
'OUTPUT';
'PROCEDURE';
'PROGRAM';
'REAL';
'RECORD';
'REPEAT';
'THEN';
'TO';
'TYPE';
'UNTIL 1 ;
'USES';
'VAR';
'WHILE';
'VIRTUAL';
'WITH';
'NEW';
'DISPOSE';
'STRING';
'PACKED';
'LONGINT';
'SHORTINT';
'BYTE';

function Preservada (identificador : cadena;


claves : lista) : boolean;
var
i
: integer

Construccin de grandes programas


encontrado : boolean;
begin
i
:= 0;
encontrado := false;
while not encontrado and (i < 50) do
begin
i := succ (i);
if identificador = claves [i]
then encontrado := true
end;
Preservada ;= identificador = claves [i]
end;
function Negrita (identificador : cadena) : string;
const
NumReps = 1;
var
J, K, Longitud : byte;
begin
Write (Ist, identificador);
Longitud := length (identificador);
for J := 1 to NumReps do
begin
for K := 1 to Longitud do
Write (lst, chr (8));
Write (lst, identificador)
end;
if Longitud = 0 then
begin
Write (lst, chr (32));
Negrita := chr (32)
end
else Negrita : = 11
end;
begin
ClrScr;
Tabla (claves);
Write ('introduzca el fichero a procesar: ');
ReadLn (denominacin);
assign (fichero, denominacin);
reset (fichero);
while not eof (fichero) do
begin
while not eoln (fichero) do
begin
Read (fichero, car);
if car in ['A'..'Z', 'a'..'z']
then
begin

803

804

Programacin en Turbo/Borlarid Pascal 7


repeat
a := a + car;
b := b+ upcase (car);
Read (fichero, car)
until not (car in ['A'.-'Z',
'a' . . 'z' ,'0' .. '9]
if preservada (b, claves)
then Write (lst, negrita (b))
else Write (lst, a)
end;
Write (lst, car)
end;
WriteLn (lst);
ReadLn (fichero)
end
end.

REFERENCIAS BIBLIOGRAFICAS
1. Borland. Reference

Guide. Turbo Pascal 7.

CAPITULO

UNIDADES ESTANDAR
CONTENIDO
21.1.
21.2.
21.3.
21.4.
21.5.
21.6.
21.7.
21.8.

RESUMEN

Si desea trabajar con solapamientos, este captulo le c o m p l e m e n t a r las ideas expuestas en la


Seccin 20.8.
2. D u n t e m a n , Jeff. Complete

Las u n i d a d e s e s t n d a r
La unidad System
La unidad Printer
La unidad Dos
P r o c e d i m i e n t o s y f u n c i o n e s d e la unidad Dos
La unidad Crt
La unidad Strings; F u n c i o n e s
La unidad Turbo3

En e s t e captulo s e e x a m i n a n en detalle las s i e t e u n i d a d e s e s t n d a r


p r o p o r c i o n a d a s c o n T u r b o P a s c a l . Los o b j e t o s ( c o n s t a n t e s , t i p o s ,
variables, p r o c e d i m i e n t o s y f u n c i o n e s ) d e c l a r a d o s en ellas en la p a r t e
del i n t e r f a c e p u e d e n s e r utilizados por cualquier p r o g r a m a , c o n tal d e
q u e la unidad s e a d e c l a r a d a en la clusula uses.
Para utilizar una d e las u n i d a d e s e s t n d a r , b a s t a c o n incluir su
n o m b r e en su clusula uses, por e j e m p l o :

Turbo Pascal. Third Edition. Scott F o r e m a n , 1989.

Es una excelente obra para p r o f u n d i z a r en T u r b o Pascal. R e c o m e n d a d a p a r a usuarios expertos


y c o m o ampliacin de conocimientos tras la lectura de esta obra.

uses Crt, Graph, Printer;


Las u n i d a d e s e s t n d a r residen en la librera TURBO.TPL, q u e s e carga
a u t o m t i c a m e n t e c u a n d o s e a r r a n c a T u r b o Pascal. Si d e s e a ahorrar
m e m o r i a , p u e d e eliminar las u n i d a d e s r a r a m e n t e u t i l i z a d a s c o m o
Turbo3 y Graph, utilizando el p r o g r a m a d e utilidad TPUMOVER.
A lo largo del captulo s e d e s c r i b e n t o d o s los o b j e t o s a c c e s i b l e s
por el p r o g r a m a d o r y q u e d e b e r c o n o c e r a fin d e s a c a r el m x i m o
r e n d i m i e n t o a T u r b o / B o r l a n d 7 . 0 , p e r t e n e c i e n t e a t o d a s las u n i d a d e s
e s t n d a r c o n la e x c e p c i n d e las u n i d a d e s Graph y Graph3 q u e n o s o n
o b j e t o d e e s t u d i o en e s t a o b r a .

21.1.

LAS U NID ADES ESTAN DAR

L a s u n i d a d e s e s t n d a r s o n i n d e p e n d i e n t e s e n s u u s o , e x c e p t o las u n i d a d e s q u e f a c i l i t a n
la c o m p a t i b i l i d a d c o n la v e r s i n 3 . 0 ( n o u t i l i z a d a e n l a a c t u a l i d a d ) : Turbo3 y Graph3,
q u e r e q u i e r e n l a u n i d a d Crt. E s t a d e p e n d e n c i a se m u e s t r a e n l a T a b l a 2 1 . 1 .
L a u n i d a d System e s t s i e m p r e u t i l i z a d a i m p l c i t a m e n t e y n u n c a n e c e s i t a ser e s p e c i ficada e n u n a c l u s u l a uses.

805

806

Programacin en Turbo/Borland Pasca! 7


Tabla 2 1 . 1 .
Unidad
System
Printer
Dos
Crt
Graph
Overlay
Turbo3
Graph3

Unidades estndar

Unidades estndar
Uses

Ninguna
Ninguna
Ninguna
Ninguna
Ninguna
Ninguna
Crt
Crt

21.2. s LA UNIDAD SYSTEM


La unidad System no exporta ninguna funcin ni procedimiento. Es de hecho la librera
en tiempo de ejecucin. Esta unidad se utiliza automticamente por cualquier unidad o
programa y no necesita nunca incluirse en una clusula uses. Citaremos aqu las diferentes variables predeclaradas disponibles.
var
Input
Output
PreefixSeg
HeapOrg
HeapPtr
FreePtr
FreeMix
HeapError
ExicProc
ExitCode
ErrorAddr
RandSeed
SavelntOO
Savelnt02
Savelnt23
Savelnt2 4
Savelnt7 5
FileMode

Text;
Text;
Word;
Pointer;
Pointer;
Pointer;
Word ;
Pointer;
Pointer;
Integer;
Pointer;
Longint;
Pointer;
Pointer;
Pointer;
Pointer;
Pointer;
Byte;

La descripcin de las diferentes variables se indican en la Tabla 21.2.

21.3.

LA UNIDAD PRiNTER

La unidad Printer ha sido creada para facilitar el manejo de la impresora dentro de un


programa. Printer declara un archivo de texto llamado Lst y o asocia con el dispositivo
(puerto de comunicacin) LPT1 del DOS. Se puede enviar, por consiguiente, datos a la

Tabla 2 1 . 2 .
Variable

807

Variables p r e d e c l a r a d a s d e System
Descripcin

Xnput/Output

Archivos estndar de entrada/salida.

prefixSeg

Variable tipo Word q u e contiene la direccin del segm e n t o del P r o g r a m S e g m e n t Prefix (PSP) c r e a d o por
D O S c u a n d o se ejecuta el programa.

HeapOrg, HeapPtr,
FreePtr, FreeMin,
HeapError

Variables utilizadas por T u r b o Pascal para la gestin de


la asignacin d i n m i c a de la m e m or ia .

ExitProc

Variable tipo p u n t e r o utilizada para i m p l e m e n t a r (realizar) procedimientos de salida.

ExitCode

Cdigo de salida.

ErrorAddr

Direccin conectada a un error en la ejecucin.

RandSeed

Semilla del generador de n m e r o s aleatorios.

FileMode

M o d o de apertura de archivos

SavelntOO

Se guardan ciertos vectores de interrupcin utilizados por


el sistema operativo.

Savelnt02

Idem.

Savelnt23

Idem.

Savelnt24

Idem.

Savelnt75

Idem.

impresora gracias a Lst en las sentencias Wrfte y HriteLn; para ello basta incluir la clusula Uses siguiente en la cabecera del programa
uses Printer;

y a continuacin incluir Lst como primer argumento en sentencias h/rite/UriteLn,


segundo argumento desea enviar a la impresora

cuyo

WriteLn (Lst, 'esta frase se escribe en la impresora 1 );

El uso de Printer evita la declaracin, asignacin, apertura y cierre de un archivo de


texto. Esta unidad no exporta ninguna funcin ni procedimiento.
Ejemplo
program Pruebalmpresora;
uses Printer;
begin
WriteLn (Lst, 'Hola amigo Mortimer')
end.

808

21.4.

Unidades estndar

Programacin en Turbo/Borland Pascal 7

{informes relativos a los archivos de tipo texto}

LA UNIDAD Dos

L a u n i d a d Dos r e a l i z a u n g r a n n m e r o d e r u t i n a s d e u t i l i d a d p a r a t r a t a m i e n t o d e a r c h i vos. E s t a s r u t i n a s p e r m i t e n e j e c u t a r f u n c i o n e s r e l a c i o n a d a s c o n el s i s t e m a o p e r a t i v o . L a
d e c l a r a c i n d e c o n s t a n t e s , t i p o s y v a r i a b l e s es la s i g u i e n t e :
const
{comprueban bits indicadores individuales en el registro Flags}
{despus de una llamada a Intr o a MsDos}
FCarry
FParity
FAuxiliary
FZero
FS4gn
FOverflow

=
=
=
=
=
=

$0001
$0004
$0010
$0040
$0080
$0800

{constantes utilizadas por los procedimientos de tratamiento de


archivos durante la apertura y cierre de los mismos}
fmClosed
fmlmput
fmOutput
fmlnOut

=
=
=
=

TextBuf = array [1..127]


TextReg = record
Handle
Mode
BufSize
Privete
BufPos
BufEnd
BufPtr
OpenFunc
InOutFunc
FlushFunc
CloseFunc
UserData
ame
Buffer
end;

SearchRec

= $01
= $02
$04
= $08
= $10
= $20
= $3F

Word ;
Word;
Word;
Word ;
Word;
Word ;
TextBuf;
pointer;
pointer;
pointer;
pointer;
array [1..16] of byte;
array [0..79] of char;
TextBuf;

record
Fill
Attr
Time
Size
ame
end;

array [1..21] of Byte {reservado para DOS]


Byte;
{atributo del archivo}
Longint;
{fecha y hora}
Longint;
{tamao del archivo}
string [12];
{nombre del archivo}

{Estructura de fechas y horas, utilizadas por PackTime y


UnpackTime}

type
{registro utilizado por los procedimientos Intr y MsDos}
Registers = record
case integer of
0 : (AX,BX,CX,DX,BP,SI,DI,DS,ES,FLags:Word);
1 : (AL,AH,BL,BH,CL,CH,DL,DH : Byte);
end;
{informaciones relativas a los archivos
FileRec = record
Handle
: Word;
Mode
: Word;
RecSize
: Word;
Private
array [1- .26] of
UserData
array [1. .16] of
ame
array [0. .79] of
end;

of Char;

{Estructura utilizada por los procedimientos FindFirst y


FindNext}

$D7B0;
$D7B1;
$D7B2;
$D7B33;

{atributos de los archivos}


ReadOnly
Hidden
SysFile
VolumeID
Directory
Archive
AnyFile

809

DateTime = record
Year, Month, Day, Hour, Min, Sec
end;

Word;

{variable de error del DOS}


var
DosError
Integer;
L o s t i p o s y v a r i a b l e s p r e d e c l a r a d o s d e la u n i d a d Dos s o n :

tipeados y no tipeados}
DateTime
C i e r t o s p r o c e d i m i e n t o s , c o m o GetFTime, SetFTime o F i n d F i r s t , u t i l i z a n u n v a l o r c o m p a c Byte;
Byte;
Char;

t a d o e n c u a t r o bytes q u e c o n t i e n e n la fecha y h o r a asociados a u n a r c h i v o .


UnpackTime y PackTime p e r m i t e n d e s c o m p a c t a r y c o m p a c t a s f e c h a s y h o r a s y h a c e n la
l l a m a d a a l a e s t r u c t u r a DateTime.

810

Unidades estndar

Programacin en Turbo/Borland Pascal 7

10 entorno no vlido
11 formato no vlido
18 no existen ms archivos

FileRec, TextBuf y T e x t R e c
Se utilizan de modo interno por Turbo Pascal y describen caractersticas relativas a los
archivos.
Registers
Este tipo describe los registros e indicadores del procesador. Se utiliza para la transferenc i a d e i n f o r m a c i n c o n Instr

y MsDos.

21.5.

PROCEDIMIENTOS Y FUNCIONES DE LA UNIDAD Dos

Los procedimientos y funciones de la unidad Dos que pueden ser utilizados en cualquier
programa se enumeran en la Tabla 21.3

SearchRec
Contiene informacin sobre los archivos.

Funcin DiskFree

DosError

P r o p o r c i o n a el n m e r o d e b y t e s l i b r e s e n la u n i d a d d e d i s c o e s p e c i f i c a d a .

Se utiliza por muchas de las rutinas de la unidad DOS para informe de errores. Los valores almacenados en DosError son cdigos de error DOS.

Formato

0
2
3
5
6
8

no hay error
archivo no encontrado
camino no encontrado
acceso prohibido
manipulacin no vlida
falta memoria

DiskFree (unidad: word)

unidad
longint

: longint

0, indica la unidad por defecto


1, unidad 1; 2, unidad 3; etc.
tipo de datos resultante de la funcin

Ejemplo
Tabla 2 1 . 3 .

P r o c e d i m i e n t o s y f u n c i o n e s d e la unidad DOS

Descripcin

811

uses
DOS;
begin
WriteLn (DiskFree(0 ) div 1024) ;
WriteLn ( 1 K-bytes disponibles en la unidad por defecto')
end.

Nombre

Procedimientos de soporte de interrupcin

GetlntVeo
Intr
MsDos
SetlntVec

Procedimientos fecha y hora

GetDate
GetFTime
GetTime
PackTime
SetDate
SetFTime
UnpackTime

Funciones de estado del disco

DiskFree
DiskSize

Procedimientos manipulacin de archivos

FindFirst
FindNext
GetFAttr

P r o c e d i m i e n t o s / F u n c i o n e s de manipulacin de procesos

DosExitCode (funcin)
Execute (procedimientoj
Keep (procedimiento)

Funcin DiskSize
Devuelve la capacidad total en bytes del disco situado en la unidad especificada.
Formato

DiskSize (unidad: word): longint

unidad
longint
Ejemplo
uses DOS;

0, unidad por defecto; 1, unidad A; 2, unidad B


tipo de dato resultante de la funcin

812

Programacin en Turbo/Borland Pascal 7


begin
WriteLn (DiskSize(2) div 1024);
WriteLn ('K-bytes disponibles en la unidad 'B)
end.

Funcin DosExitCode

Unidades estndar
Procedimiento FindFirst

Busca en el directorio actual o especificado, la primera entrada que coincida con el n o m bre del archivo especificado y conjunto atributos.

Formato

Esta funcin permite recuperar el cdigo de salida de un proceso lanzado* despus del
programa actual.

FindFirst (Camino : s t r i n g ; Attr:byte; var Flnfot SearchRec)

Formato

camino
Attr
Dos ExitCode : word
word

El byte de menor orden contiene el cdigo devuelto por el proceso, mientras que el
byte de mayor orden contiene la informacin relativa al m o d o en que se termina el proceso: 0, indica terminacin normal; 1, indica interrupcin por CTRL-C; 2, indica interrupcin por hardware; 3, indica terminacin por ejecucin del procedimiento Keep.

*. Pas

de atributos de archivos}
$01;
$02;
$04;
$0 8;
$10;
$20;
$3F;

SearchRec se declara en el interfaz de la unidad DOS.


type {buscar registro utilizado por FindFirst y FindNext}
SearchRec = record
Fill : array [1..21] of byte;
Attr : byte;
Time : longint;
Size : longint;
ame : string [12]
end;

Ejecuta el programa especificado en la lnea de rdenes. Realiza una salida temporal hacia el D O S a fin de efectuar un programa .EXE o COM (rdenes ejecutables).
Formato
Exec (Programa,LineaOrdenes : string)
Programa
LineaOrdenes

mscara del directorio: ' *1 . *1 .


atributos de archivos

const
{constantes
ReadOnly =
Hidden
=
SysFile
=
Volumeld =
Directory =
Archive
=
AnyFile
=

tipo de resultado de la funcin

P r o c e d i m i e n t o Exec

nombre del programa


lnea de rdenes

Ejemplo
Para ejecutar una orden del DOS se escribe COMMAND.COM en Programa y el n o m b r e de la
orden como LineaOrdenes.
Exec ('\COMMAND.COM','/C DIR*.PAS');
U n programa debe recurrir a la directiva de compilacin $M para definir el t a m a o de la
pila antes de emplear EXEC. Por ejemplo, la directiva $M de un programa define el t a m a o
de la pila dinmica antes de emplear Exec($M 16384,0,0).

813

Ejemplo
uses Dos;
var
Dirlnfo : SearchRec;
begin
FindFirst ('*.PAS', Archivo, Dirlnfo);
while DosError = 0 do
begin
WriteLn (Dirlnfo.Nombre);
FindNext (Dirlnfo)
end
end;

814

Programacin en Turbo/Borand Pascal 7

Unidades estndar

815

Procedimiento FindNext

procedimiento GetFTime

Permite encontrar los archivos siguientes, que satisfacen a los criterios de bsqueda de la

Devuelve la fecha y hora (en f o r m a c o m p a c t a d a ) de la ltima modificacin de! archivo F,

llamada precedente a FindFirst o FindNext.


Formato
Formato
FindNext (var s

GetFTime (var F; var Time: longint)

SearchRec)
F

variable tipo archivo (tipeado, no tipeado o texto)

Procedimiento GetDate
Devuelve la fecha del reloj interno en el sistema operativo.

Procedimiento GetlntVec

Formato

Devuelve la direccin, almacenada en un vector, de la interrupcin n m e r o Nolnt.


GetDate (var Ao, Mes, Da, DiaSemana: word)

Ao
Mes
oia
DiaSemana

rango
rango
rango
rango

1980...2099
1..12
1..21
0..6 (0 es domingo, lunes....)

Formato

GetlntVec (Nolnt:byte;var vector: pointer)

Procedimiento GetTime

Procedimiento GetFAttr

Devuelve la hora actual del sistema operativo (reloj interno).

Devuelve los atributos Attr del archivo de cualquier tipo F.

Formato

Formato
GetTime (var Hora, Minutos, Segundos, Centesimas: word)
GetFAttr (var F; var Attr: word)

F
Attr

Hor
a
Minutos
segundos
Centsimas

variable tipo archivo (tipificado, no tipeado o texto que ha sido asignado pero no abierto).
los diversos atributos corresponden a valores asociados a constantes
definidas en el interfaz de la unidad DOS. Los atributos definidos como
constantes en la unidad DOS se examinan con la operacin A N D con
las mscaras de atributos de archivos.

const
{constantes de atributos de archivos}
$01;
ReadOnly
$02
Hidden
$04
SvsFile
$08
Volumeld
$10
Directory
$20
Archive
$3F
AnyFile

rango
rango
rango
rango

0..23
0..59
0..59
0..99

Procedimiento Intr
Este procedimiento permite llamar a la rutina de interrupcin n m e r o Nolnt.
Formato

Intr (Nolnt: byte; var Regs: Registers)

Nolnt
Registers

nmero de interrupcin (0..255)


es u n registro definido en D O S

816

Programacin en Turbo/Borland Pascal 7

Ejemplo

Unidades estndar

817

Formato
type
Regsters = record
case integer of
0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags:word);
1: (AL,AH,BL, BH,CL,CH,DL,DH : byte);
end;

SetDate {Ao, Mes,Dia,DiaSemana

Ao
Mes
Dia

: word)

r a n g o de 1980..2099
r a n g o d e l . . 12
r a n g o de 1..31

Keep
T e r m i n a la e j e c u c i n del p r o g r a m a actual y lo g u a r d a en m e m o r i a . Esta caracterstica
p e r m i t e realizar programas

residentes en m e m o r i a .

SetFAttr
Este p r o c e d i m i e n t o p e r m i t e m o d i f i c a r los a t r i b u t o s A t t r del a r c h i v o F, cu alq u ier a q u e
sea el tipo.

Formato

Keep (CodigoSalida : word)

Formato

SetFAttr (var F; Attr : word)

MsDos
Este p r o c e d i m i e n t o p e r m i t e llamar a la r u t i n a de i n t e r r u p c i n n m e r o $21 de M S - D O S
y ejecutar u n a l l a m a d a a u n a funcin DOS.

Ejemplo
uses DOS;
var
f : file;
begin
Assign (f, 'C: |AUTOEXEC.BAT1 ) ;
SetFAttr (f, Hidden);
ReadLn;
SetFAttr ( f, archivo)
end

Formato

MsDos (var R : Registers)

type
Registers = record
case integer of
0: (AX,BX,CX,DX,BP,SI,DI,DS,ES,Flags: word);
1: (AL,AH,BL,BH,CL,CH,DL,DH : byte);
end;

Los valores de los a t r i b u t o s se d e f i n e n c o m o c o n s t a n t e s en la u n i d a d D O S .


const
{constantes
ReadOnly =
=
Hidden
=
SysFile
Volumeld =
Directory =
=
Archive
=
AnyFile

PackTime
Este p r o c e d i m i e n t o efecta la operacin inversa del p r o c e d i m i e n t o UnpackTime. C o n v i e r t e
u n registro F e c h a H o r a en p a q u e t e de 4 bytes.
FechaHora = record
Anio, Mes, Dia, Hora
Min, Seg
: Word
end;

de
$01
$02
$04
$08
$10
$20
$3F

SetDate

SetFTime

Este p r o c e d i m i e n t o p e r m i t e modificar la fecha del reloj i n t e r n o .

Establece la f e c h a y h o r a d e la l t i m a m o d i f i c a c i n del a r c h i v o F.

818

Programacin en Turbo/Borland Pascal 7

Unidades estndar

Formato

21.6.
SetFTime (var F; FechaHora

819

LA UNIDAD CRT

La unidad Crt implemento una amplia gama de rutinas que permiten un control completo de las caractersticas de su computadora, tales como control del m o d o pantalla, cdigos de teclado, colores, ventanas y sonido. U n a de las grandes ventajas de utilizar Crt
es el aumento de velocidad y flexibilidad en las operaciones de salida a pantalla.

: longint)

SetlntVec
Establece un vector interrupcin especificado a u n a direccin especificada.

21.6.1.

Archivos de entrada y salida

El cdigo de iniciacin de la unidad Crt asigna los archivos de texto estndar input y
output para referirse al C R T en lugar de a los archivos de entrada y salida del DOS.

Formato

AssignCrt (Input); Reset (Input);


AssignCrt (Output); Rewrite (Output);

SetlntVec (Nolnt : byte; Vector: pointer)

Noint
Vector

n m e r o de interrupcin (0..253)
especifica la direccin

21.6.2.

Crt soporta un c o n j u n t o completo de ventanas. El procedimiento Uindow permite definir


una ventana en cualquier parte de la pantalla. Cuando se escribe en una ventana especfica, la ventana acta c o m o si fuera u n a pantalla completa, dejando el resto de la pantalla inalterada, es decir, inaccesible. La ventana por defecto es la pantalla completa.

SetTime
Establece la hora actual en el sistema operativo.
Formato

21.6.3.
SetTime {Hora,Minutos,Segundos,Centesima:

word)

UnpackTime
Este procedimiento convierte la fecha y hora, compactadas en el parmetro Compacto,
en una variable FechaHora cuya estructura D a t e T i m e est definida en el interface de la
unidad DOS.
Formato

UnpackTime (Compacto: longint; var FechaHora:

DateTime)

Caracteres especiales

Cuando se escribe en un archivo Output que ha sido asignado a Crt, existen caracteres
de control que tienen significados especales:
#
#
#
#

Hora 00..232, Minuto 0..59, Segundos 0..59, Centsima 0..99

DateTime

Ventanas

7
8
10
13

Campana: emite un pitido de altavoz interno.


Retroceso: mueve el cursor un carcter a la izquierda.
Avance de lnea: mue ve el cursor una lnea abajo.
Retorno de carro: vuelve el cursor al extremo izquierdo de la ventana actual.

21.6.4.

Lnea de entrada

Cuando se lee de un archivo de texto que ha sido asignado a Crt o de un archivo Input,
el texto se introduce lnea a lnea. La l n p de entrada se almacena en la memoria intermedia interna del archivo de texto, y cuando las variables se leen, esta memoria intermedia se utiliza c o m o archivo fuente. Siempre que se vaca la memoria intermedia, se
introduce u n a lnea. Al introducir una lnea se debe tener presente la accin de las teclas
de edicin.

Es un registro declarado en la unidad Dos

DateTime = record
Year, Month, Day, Hour,
Min, Sec : word
end;

RETROCESO

ESC
INTRO (ENTER)

borra el ltimo carcter introducido.


borra la lnea completa de entrada.
t e r m i n a la lnea de entrada y almacena la marca fin de lnea (CR+LF) en
la m e m o r i a intermedia.

820

Programacin en Turbo/Borland Pascal 7


acta igual que RETROCESO.
recupera un carcter de la ltima lnea de entrada.
igual que ESC.
recuerda la ltima lnea de entrada.
termina la lnea de entrada y genera una marca fin de archivo.

CTRL - s
CTRL - D
CTRL-A
CTRL - F
CTRL - z

21.6.5.

Unidades estndar
var CheckBreak : boolean:

var CheckEOF : boolean;

Constantes, tipos y variables


var CheckSnow : boolean;

Constantes modo Crt


Las siguientes constantes se utilizan c o m o parmetros en el procedimiento TestMode.
const
BW40
C40
BW80
C80
Mono
Last
Font8x8

=
=
=
=
=
=
=

0;
1;
2;
3;
7;
-1;
256;

{40x25 B/N con adaptador color}


{40x25 color con adaptador color}
{80x25 B/N con adaptador color}
{80x25 color con adaptador color}
{80x245 con adaptador monocromo}
{ultimo modo de texto activo}
{juego de caracteres en ROM}

C40 y C80 son constantes definidas para la compatibilidad con la versin 3.0.

var DirectVideo : boolean;

var TextAttr : byte

Las variables que siguen permiten controlar la visualzacin y el desarrollo de los programas:

estas dos variables contienen las coordenadas de la


esquina superior izquierda y de la esquina inferior
derecha de la ventana actual:
Lo(WindMin) c o o r d e n a d a x esquina superior izquierda.

Las constantes siguientes se utilizan con los procedimientos TextColor y TextBackground:

Variables

cuando es verdadero, al pulsar CTRL-BREAK se abortar el programa; falso, no tiene efecto la pulsacin
de CTRL-BREAK.
cuando t o m a el valor verdadero, se genera un carcter de fin de archivo si se pulsa CTRL-Z durante
la lectura de un archivo asociado al teclado; si t o m a
el valor falso, la pulsacin de CTRL-Z no tiene efecto.
CheckEOF es falsa por defecto.
facilita la sincronizacin de la pantalla en determinados adaptadores que producen fluctuaciones en
la presentacin.
verdadero, todas las operaciones de escritura (write
y writeln) en la pantalla se efectan por acceso directo a la memoria vdeo, en lugar de acceso a travs de BIOS considerablemente ms lenta.
esta variable contiene el atributo actual de texto;
para obtener una visualizacin parpadeante, amarillo sobre fondo rojo, se puede escribir:
TextAttr:=Yellow+Red*16+Blink;

var WindMin,WindMax : word

Constantes color de texto

const
=
Black
=
Blue
=
Green
=
Cyan
=
Red
=
Magenta
=
Brown
=
LightGray
=
DarkGray
=
LightBlue
LightGreen =
=
LightCyan
=
LightRed
LightMagenta=
=
Yellow
=
White
=
Blink
12

821

Hi (Wi ndMi n) coordenada y de la esquina superior izquierda.

21.6.6.

Procedimientos y funciones

AssignCrt

AssignCrt (var F: text)


Asocia u n archivo de texto F a la pantalla (CRT); funciona de igual m o d o que el procedimiento assign, pero
no se necesita ningn archivo externo.

ClrEol

ClrEol
Borra dos caracteres desde el cursor al fin de lnea.

ClrScr

ClrScr
Borra la ventana actual (en su defecto, la pantalla) y posiciona el cursor en la esquina superior izquierda de ste.

822

Unidades estndar

Programacin en Turbo/Borland Pascal 7

Delay

Delay (ms:word)

LowVideo

Ejemplo
TextColor (LightRed);
WriteLn ('este texto se visualiza en rojo claro');
LowVideo;

DeLine

Borra el contenido de la lnea en la que se encuentra el


cursor.

GotoXY

LowVideo

Selecciona caracteres de baja intensidad.

Detiene la ejecucin del programa d u r a n t e ms milisegundos.

DeLine

823

WriteLn ('este texto se visualiza en rojo oscuro');


HighVideo;
WriteLn ('este texto se visualiza en rojo claro');

GotoXY {x,y: byte)

Sita el cursor en el punto de coordenadas (x,y)


x comprendido entre 1 y 40/80 caracteres (columnas).
y comprendido entre 1 y 25 (filas).

NormVideo

NormVideo

Fija el atributo del texto al valor que tena inmediatamente antes que el programa sea ejecutado.

Window (1, 10, 60, 20);


GotoXY (1, 1);
NoSound

Ejemplo
GotoXY(10, 15);
Write( 1 x 1 );
GotoXY(15, 10);
Write( 'y');

Este programa visualiza una 'x' en la lnea 15, c o l u m n a


10, y una 'y' en la lnea 10, columna 15.

HighVideo

Interrumpe la emisin de sonidos emitidos por el altavoz.

ReadKey

Lee un carcter del teclado; si la funcin KeyPressed tena e l valor verdadero antes de llamar a ReadKey, se devuelve un carcter; en caso contrario, la f u n c i n
ReadKey espera a que una tecla sea pulsada. El carcter
devuelto no se visualiza en pantalla.

HighVideo

Selecciona caracteres de alta intensidad.

InsLine

KeyPressed

InsLine

Inserta una lnea vaca en la posicin del cursor.

KeyPressed: boolean

Devuelve el valor verdadero si se pulsa una tecla, y falso


en caso contrario.

ReadKey: char

Sound

Sound: (Frec: word)

Emite un sonido de la frecuencia indicada (en hercios);


este sonido se emite por el altavoz hasta el m o m e n t o en
que el p r o c e d i m i e n t o NoSoynd se llama; si n o se encuentra NoSound, la emisin del sonido prosigue despus del fin de la ejecucin del programa.

824

Unidades estndar

Programacin en Turbo/Borland Pascal 7

TextBackground

0
1
2
3
7
256

TextBackground (Color: byte)

Selecciona el color de fondo; cada carcter visualizado


en la pantalla en modo texto se sita en una matriz de
puntos; por defecto, estos puntos que constituyen son de
color negro y los caracteres visualizados en este fondo
son de color blanco, valores de color:
0
1
2
3
4
5
6
7

negro
azul
verde
can
rojo
magenta
marrn
gris claro

WhereX

WhereY: byte

La llamada a esta funcin devuelve un valor entero que


corresponde a la coordenada Y del cursor.

Selecciona el color del carcter de primer plano, es decir, el color del texto; valores de color:

TextColor y TextBackground permiten personalizar los


colores de la pantalla.

WhereX: byte

La llamada a esta funcin devuelve un valor entero que


corresponde a la coordenada X del cursor

TextColor {Color-, byte)

0..7 igual que TextBackground


gris oscuro
8
azul claro
9
verde claro
10
cian claro
11
rojo claro
12
magenta claro
13
amarillo
14
blanco
15
128 parpadeo

negro/blanco, 40 caracteres (BW40)


color, 40 caracteres (C40)
negro/blanco, 80 caracteres (BW80)
color 80 caracteres (C80)
monocromo, 80 caracteres (MONO)
juego de caracteres en ROM (Font8x8)

Toda llamada al procedimiento TextMode provoca el


borrado de la pantalla.

WhereY
TextColor

825

Window

Window (xlt ylr x2, y2: byte)

Define una ventana de texto en la pantalla:


esquina superior izquierda(X), y),
esquina inferior derecha (X2, yi),
(1,1) corresponde a la esquina superior izquierda de la
ventana activa.

21.7.

LA UNIDAD STRINGS: FUNCIONES

Esta unidad ya incorporada en Turbo Pascd\l for Windows incorpora un conjunto de 21


funciones para manipulacin de cadenas terminadas en nulo. Estas funciones estn codificadas en lenguaje ensamblador en lnea.
Si desea trabajar con alguna de estas funciones, recuerde que debe incluir siempre
una lnea similar a sta:
uses Strings;

T extMode

TextMode {Modo: integer)

Selecciona el modo de texto; los valores posibles del parmetro modo son:

Cuando se hable de cadena en las siguientes funciones se eutender, salvo indicacin


expresa, que nos referimos a cadenas terminadas en nulo. A continuacin se describen
por orden alfabtico las diferentes funciones de cadena. Todas ellas contienen su defin-

Programacin en Turbo/Borland Pascal 7

826

Unidades estndar

cin en la primera lnea. A continuacin una breve descripcin de su propsito y por


ltimo una o varias lneas con un ejemplo simple de su utilizacin:

827

StrEnd
function StrEnd(Cad : Pchar) : Pchar;

StrCat
function StrCat(Destino, Fuente:

Pchar) : Pchar;

Aade una cadena fuente al final de una cadena destino y devuelve un puntero a la cadena destino.

Devuelve un puntero al final de una cadena (el carcter nulo de terminacin de la cadena).
WriteLn(

'Longitud:', StrEnd(Cad) - Cad);

StrIComp

StrCat(S, 'Mackoy 1 ) ;

function StrIComp (SI, S2 : Pchar) : Integer;

StrComp

C o m p a r a d o s c a d e n a s sin t e n e r en c u e n t a m a y s c u l a s / m i n s c u l a s .

function StrComp(SI,S2 : Pchar) : Integer;

T := StrIComp(SI,S2 ) ;

Compara dos cadenas, Si y S2 y devuelve un valor menor que cero si S2 < SI, 0 si SI =
= S2 o mayor que cero si SI > S2.

StrLCat
function StrLCat ( S 1 , S 2

c := StrComp(SI,S2);

: Pchar; LonMax : Word) : Pchar;

Aade caracteres de una cadena al final de otra y devuelve una cadena concatenada, no
mayor que la longitud mxima especificada en los argumentos.

StrCopy
function StrCopy (Destino,

Fuente

: PChar):PChar;

Copia u n a cadena fuente (Fuente) en u n a cadena destino (Destino) y devuelve un p u n t e r o

StrLCat(S, 'Mortimer', Sizeof(S) - 1);

StrLComp

a la cadena destino.
function StrLComp(SI, S2 : Pchar; LongMax : Word) : Integer;
StrCopy(S, 'Luis');

Compara dos cadenas hasta una longitud dada, sin tener en cuenta el tamao de la letra.
StrDispose

t := StrLComp(SI,S2,10);

function StrDispose (Cad : PChar);

StrLCopy

Libera el espacio almacenado por una cadena que fue asignada anteriormente con StrNew.
Si Cad es ni 1, no hace nada.

function StrLCopy (S1,S2 : Pchar, LongMax : Word) : Pchar;

Copia caracteres de una cadena a otra y devuelve un ptfntero a la cadena destino.

StrDispose{P);

StrLCopy(SI,S2,7);

StrECopy
Function StrECopy (Destino,

Fuente:PChar)

: Pchar;

Copia una cadena fuente en una destino, devolviendo un puntero al final de la cadena
resultante.
StrECopy(SI,S2);

StrLen
function StrLen (Cad : Pchar) : Word;

Devuelve la longitud de una cadena (sin contar el carcter de terminacin nulo).


WriteLn ( 'Longitud es : ', StrLen (s));

828

Programacin en Turbo/Borland

Unidades estndar

Pascal 7

StrLIComp

StrPos
function StrPos(SI,S2 : Pchar) : Pchar;

function StrLIComp (S1,S2 : Pchar; LongMax : Word) : Integer;

Compara dos cadenas hasta una longitud mxima, sin tener en cuenta el t a m a o de la
letra.

Devuelve un puntero a la primera ocurrencia de una cadena (S2) en otra (SI). Si S2 no


est en SI, se devuelve nil.
P := StrPos(S, Subcadena);

t := StrLIComp(SI,S2,10 ) ;

StrLower

829

StrRScan
function StrRScan (Cad : Pchar; Car : Char) : Pchar;

function StrLower (S : Pchar) : Pchar;

Convierte una cadena a letras minsculas.

Devuelve un puntero a la ltima ocurrencia de un carcter dado dentro de u n a cadena,


o nil si el carcter no existe en la cadena.

WriteLn(StrLower(S) ) ;

P := StrRScan (Nombre, '*');


if p = nil then

StrMove
function StrMove(SI,S2 : Pchar; Cuenta:Word) : Pchar;

StrScan
function StrSCan (Cad : Pchar; Chr : Char) : Pchar;

Copia caracteres de una cadena a otra y devuelve u n puntero a la cadena destino.


P := StrMove(A,B,2) ;

Devuelve un puntero a la primera ocurrencia de un carcter dado dentro de una cadena,


o nil si el carcter no existe en la cadena.

StrNew

Cars :=(StrScan(Nombre, '*') < > NIL) OR


(StrScan(Nombre, '#') < > nil;

function StrNew(Cad : Pchar) : Pchar;

Asigna una cadena en el montculo (heap).

StrUpper
function StrUpper (Cad : Pchar) : Pchar;

P := StrNew(s);

Convierte una cadena a letras maysculas y devuelve un puntero a la cadena.

StrPas

ReadLn(Cad);
WriteLn(StrUpper(Cad));
WriteLn(StrLower(Cad));

functionStrPas (Cad : Pchar) : String;

Convierte una cadena terminada en nulo a una cadena estilo Pascal.


S := StrPas(Cad);

StrPCopy
function StrPCopy (Destino : Pchar; Fuente : String) : Pchar;

Copia una cadena Pascal en una cadena terminada en nulo.


StrPCopy(A,S);
REadLn(A);

21.8.

LA UNIDAD T U R B 0 3

La unidad Turbo3 tiene como funcin principal la compatibilidad con la versin 3.0 de
Turbo Pascal. Esta unidad t o m a los procedimientos y funciones de la versin 3, algunos
de los cuales existen tambin en la versin 4, a u n q u e son ligeramente diferentes en su
implementacin. Puede suceder que un programa que utiliza la unidad T u r b o 3 deba llamar a un procedimiento de esta unidad, pero que tambin est presente en T u r b o Pascal

830

Unidades estndar

Programacin en Turbo/Borland Pascal 7

4/5. En este caso, conviene prefijar el n o m b r e del procedimiento por el n o m b r e de la


unidad. Por ejemplo:

Ejemplo en versin 4.0/5.X


program PruebaLeerTabla;
uses
Crt;
var
C : Char;
begin
C : ReadKey;
if (C = +0)
then WriteLn ('tecla suplementaria: ', ReadKey);
else WriteLn (C)
end.

if turbo3.IOresult = o
then...

la seccin de interface de la unidad Turbo3 es:


unit Turbo3;
interface
uses Crt;
var
Kbd : Text
Cbreak : boolean absolute CheckBreak;
function MemAvail : integer;
function LongFileSize (var F) : real;
function LongFilePus (var F) : real;
procedure LongSeek (var F; Pos : real);
procedure HighVideo;
procedure NormVideo
procedure LowVideo
function IOResult : integer;

21.8.1.

Variables

Cbreak
CBreak
CBreak:=false
CBreak.-true

21.8.2.

HighVideo y
Norm Video
(procedimientos)

en la versin 4.

HighVideo

NormVideo

Despus de llamar a u n o de estos procedimientos, el


texto visualizado en la pantalla tendr un contraste normal en oposicin al texto escrito en dbil intensidad.

En programas 3.0, la lectura del dispositivo de teclado se realiza con el procedimiento


Read (Kbd,VarCar); en la unidad Crt existe una funcin llamada ReadKey, que se utilizar en lugar de la citada Read.

program Prueba Dbd;


uses
Crt, Turbo3;
var
C : Char;
begin
Read (Kbd,C)
if (C = #27) and KeyPressed
{=27 Esc}
then
begin
Read (Kbd,C);
WriteLn ('Tecla suplementaria ',C)
end
else
WriteLn (C)
end.

ha sido d e n o m i n a d a CheckBreak
desactiva verificacin Ctrl-Break.
activa verificacin Ctrl-Break.

Procedimientos y funciones

Kbd

Ejemplo en versin 3.0

831

loResult
(funcin)

IoResult-

Esta funcin permite saber si la ltima operacin de entrada/salida se desarrolla sin problemas; valor 0 ausencia de errores; en caso contrario, indica un cdigo de
error manual de T u r b o Pascal.

LongFilePos
(funcin)

LongFilePos(var F: file): real

Esta funcin se utiliza de igual forma que FilePos con la


diferencia de que el valor devuelto es de tipo real, lo que
permite la gestin de archivos de ms de 32767 c o m ponentes.

832

Programacin en Turbo/Borland Pascal 7

LongFileSize
(funcin)

LongFileSize(var F: file): real

Esta funcin es equivalente a FileSize, pero permite conocer el tamao de grandes archivos por el hecho de que
el valor devuelto es de tipo real.

LongSeek
(procedimiento)

LongSeekn(var F; Pos: file): real

Permite posicionar el puntero del archivo en el registro,


cuyo nmero de orden es Pos, para una operacin de
lectura o escritura.
LowVideo
(procedimiento)

LowVideo

A partir del momento en que se llama a este procedimiento, todo lo que se visualiza en pantalla tiene una
intensidad luminosa ms dbil.
MaxAvail

MaxAvail: integer

Proporciona el tamao de la zona de memoria disponible ms grande contigua sobre el heap; el valor devuelto
se expresa en prrafos (un prrafo= 16 bytes).
MaxDisp_real := Avail + 65.536.0

MemAvail

MemAvail: integer

Esta funcin proporciona el tamao de memoria (en


prrafos) disponible en la pila dinmica (heap).

RESUMEN
Las versiones 5.X y 6.0 de Turbo Pascal aporta ocho unidades predefinidas, que se llaman unidades estndar. Estas unidades contienen un gran nmero de procedimientos y
funciones que completan el lenguaje Turbo Pascal. Los nombres de estas unidades estn-

Unidades estndar

833

dar son: SYSTEM, DOS, OVERLAY, CRT, PRINTER, GRAPH, T U R B 0 3 y GRAPH3.


La versin 7.0 incluye dos nuevas unidades WINDOWS y STRINGS.
La unidad SYSTEM contiene las definiciones y declaraciones esenciales que emplea
todo programa. Turbo Pascal incluye automticamente los recursos de esta unidad, y el
programador no necesita incluir SYSTEM en una clusula uses; su presencia conduce a
un error de compilacin.
Las otras unidades estndar comprenden rutinas especficas utilizables en ciertos programas. Para poder usar estas rutinas es preciso indicar el nombre de la unidad que la
contiene en la clusula uses.

Tipos abstractos

de datos y objetos

835

22.1. EL PAPEL (EL ROL) DE LA ABSTRACCION


CAPITULO

TIPOS ABSTRACTOS DE DATOS


Y OBJETOS
CONTENIDO
22.1.
22.2.
22.3.
22.4.
22.5.
22.6.
22.7.
22.8.
22.9.
22.10.
22.11.
22.12.
22.13.

El papel (el Rol) d e la abstraccin


Un nuevo paradigma de programacin
Modularidad
Diseo de mdulos
Tipos de d a t o s
Abstraccin en lenguajes d e programacin
Tipos a b s t r a c t o s d e d a t o s
Tipos a b s t r a c t o s d e d a t o s en Turbo Pascai
Orientacin a objetos
Reutilizacin de s o f t w a r e
Lenguajes de programacin orientados a o b j e t o s
Desarrollo tradicional frente a orientado a objetos
Beneficios de las Tecnologas de objetos (TO)

RESUMEN
EJERCICIOS
En e s t e captulo examinaremos los conceptos de modularidad y abstraccin de datos. La modularidad es la posibilidad de dividir una aplicacin en piezas m s p e q u e a s llamadas mdulos. Abstraccin de
datos e s la tcnica d e inventar nuevos tipos de d a t o s que sean m s
a d e c u a d o s a una aplicacin y, por consiguiente, facilitar la escritura
del programa. La tcnica de abstraccin de d a t o s e s una tcnica pot e n t e de p r o p s i t o general q u e c u a n d o s e utiliza a d e c u a d a m e n t e ,
puede producir programas ms cortos, ms legibles y flexibles.
Los lenguajes d e programacin soportan en sus compiladores tipos de datos fundamentales o bsicos (predefinidos), tales como nt,
char y f l o a t e n C y C + + , o b i e n i n t e g e r , real o boolean e n P a s c a l . Al-

gunos lenguajes de programacin tienen caractersticas que permiten ampliar el lenguaje aadiendo sus propios tipos de datos.
Un tipo de d a t o definido por el programador s e denomina tipo
abstracto de dato, TAD (abstract data type, ADT). El trmino abstracto s e refiere ai medio en que un programador a b s t r a e algunos
c o n c e p t o s de programacin creando un nuevo tipo d e dato.
La modularizacin de un programa utiliza la nocin d e tipo abstracto de dato (TAD) siempre que sea posible. Si e / T A D soporta ios
tipos que desea ei usuario y el conjunto de operaciones s o b r e cada
tipo, se obtiene un nuevo tipo de dato denominado objeto.

834

Los programadores han tenido que luchar con el problema de la complejidad durante
mucho tiempo desde el nacimiento de la informtica. Para comprender lo mejor posible
la importancia de las tcnicas orientadas a objetos, revisemos cules han sido los diferentes mecanismos utilizados por los programadores para controlar ia complejidad. Entre
todos ellos se destaca la abstraccin. C o m o describe Wulft, Los humanos hemos desarrollado una tcnica excepcionalmente potente para tratar la complejidad: abstraemos
de ella. Incapaces de d o m i n a r en su totalidad los objetos complejos, se ignoran los detalles no esenciales, tratando en su lugar con el modelo ideal del objeto y centrndonos
en el estudio de sus aspectos esenciales.
En esencia, la abstraccin es la capacidad para encapsular y aislar la informacin,
del diseo y ejecucin. En otro sentido, las tcnicas orientadas a objetos se ven como
resultado de una larga progresin histrica que comienza en los procedimientos y sigue
en los mdulos, tipos abstractos de datos y objetos.

22.1.1.

La abstraccin como un proceso natural mental

Las personas normalmente comprenden el m u n d o construyendo modelos mentales de


partes del mismo: tratan de comprender cosas con las que pueden interactuar: un modelo mental es una vista simplificada de c m o funciona de modo que se pueda interactuar contra ella. En esencia, este proceso de construccin de modelos es lo mismo que el
diseo de software, a u n q u e el desarrollo de software es nico: el diseo de software produce el modelo que puede ser manipulado por una computadora.
Sin embargo, los modelos mentales deben ser ms sencillos que el sistema al cual
imitan, o en caso contrario sern intiles. Por ejemplo, consideremos un m a p a c o m o un
modelo de su territorio. A fin de ser til, el m a p a debe ser ms sencillo que el territorio
que modela. U n mapa nos ayuda, ya que abstrae slo aquellas caractersticas del territorio que deseamos modelar. U n m a p a de carreteras modela cmo conducir mejor de
una posicin a otra. U n m a p a topogrfico modela el contorno de un territorio, quiz
para planear un sistema de largos paseos o caminatas.
De igual forma que un mapa debe ser ms pequeo significativamente que su territorio e incluye slo informacin seleccionada cuidadosamente, as los modelos mentales
abstraen esas caractersticas de un sistema requerido para nuestra comprensin, mientras
ignoran caractersticas irrelevantes. Este proceso de abstraccin es psicolgicamente necesario y natural: la abstraccin es crucial para comprender este complejo m u n d o .
La abstraccin es esencial para el funcionamiento de una mente h u m a n a normal, y
es una herramienta muy potente para tratar la complejidad. Considerar por ejemplo el
ejercicio mental de memorizar nmeros. U n total de siete dgitos se puede memorzar
con ms o menos facilidad. Sin embargo, si se agrupan y se denominan nmeros de telfono, los dgitos individuales se relegan en sus detalles de ms bajo nivel, crendose un
nivel abstracto y ms alto, en el que los siete n m e r o s se organizan en una nica entidad.
Utilizando este mecanismo, se pueden memorizar algunos nmeros de telfonos de modo
que la agrupacin de diferentes entidades conceptuales es un mecanismo potente al servicio de la abstraccin.

836

22.1.2.

Historia de la abstraccin del software

La abstraccin es la clave para disear buen software. En los primeros das de la informtica, los programadores enviaban instrucciones binarias a una computadora, manipulando directamente interrupciones en sus paneles frontales. Los nemotcnicos del lenguaje ensamblador eran abstracciones diseadas para evitar que los programadores
tuvieran que recordar las secuencias de bits que componen las instrucciones de un programa. El siguiente nivel de abstraccin se consigue agrupando instrucciones primitivas
para formar macroinstrucciones.
Por ejemplo, un conjunto se puede definir por abstraccin como una coleccin no
ordenada de elementos en el que no existen duplicados. Utilizando esta definicin, se
pueden especificar si sus elementos se almacenan en un array, una lista enlazada o cualquier otra estructura de datos. Un conjunto de instrucciones realizadas por un usuario
se pueden invocar por una macroinstruccin. Una macroinstruccin instruye a la mquina para que realice muchas cosas. Tras los lenguajes de programacin ensambladores
aparecieron los lenguajes de programacin de alto nivel, que supusieron un nuevo nivel
de abstraccin. Los lenguajes de programacin de alto nivel permitieron a los programadores distanciarse de las interioridades arquitectnicas especficas de una mquina
dada. Cada instruccin en un lenguaje de alto nivel puede invocar varias instrucciones
mquina, dependiendo de la mquina especfica donde se compila el programa. Esta
abstraccin permita a los programadores escribir software para propsito genrico, sin
preocuparse sobre qu mquina corre el programa.
Secuencias de sentencias de lenguajes de alto nivel se pueden agrupar en procedimientos y se invocan por una sentencia. La programacin estructurada alienta el uso de
abstracciones de control tales como bucles o sentencias if-then que se han incorporado
en lenguajes de alto nivel. Estas sentencias de control permitieron a los programadores
abstraer las condiciones comunes para cambiar la secuencia de ejecucin.
El proceso de abstraccin fue evolucionando desde la aparicin de los primeros lenguajes de programacin. El mtodo ms idneo para controlar la complejidad fue aumentar los niveles de abstraccin. En esencia, la abstraccin supone la capacidad de encapsular y aislar la informacin de diseo y ejecucin. En un determinado sentido, las
tcnicas orientadas a objetos pueden verse como un producto natural de una larga progresin histrica que va desde las estructuras de control, pasando por los procedimientos, los mdulos, los tipos abstractos de datos y los objetos.
En las siguientes secciones describiremos los mecanismos de abstraccin que han
conducido al desarrollo profundo de los objetos: procedimientos, mdulos, tipos abstractos de datos y objetos.

22.1.3.

Tipos abstractos

Programacin en Turbo/Borland Pascal 7

Procedimientos

Los procedimientos y funciones fueron uno de los primeros mecanismos de abstraccin


que se utilizaron ampliamente en lenguajes de programacin. Los procedimientos permitan tareas que se ejecutaban rpidamente, o eran ejecutados slo con ligeras variaciones, que se reunan en una entidad y se reutilizaban, en lugar de duplicar el cdigo varias
veces. Por otra parte, el procedimiento proporcion la primera posibilidad de ocultacin
de informacin. Un programador poda escribir un procedimiento o conjunto de proce-

de datos y objetos

837

dimientos, que se utilizaban por otros programadores. Estos otros programadores no necesitaban conocer con exactitud los detalles de la implementacin slo necesitaban el interfaz necesario. Sin embargo, los procedimientos no resolvan todos los problemas. En
particular, no era un mecanismo efectivo para ocultar la informacin y para resolver el
problema que se produca al trabajar mltiples programadores con nombres idnticos.
Para ilustrar el problema, consideremos un programador que debe escribir un conjunto de rutinas para implementar una pila. Siguiendo los criterios clsicos de diseo de
software, nuestro programador establece en primer lugar el interfaz visible a su trabajo,
es decir cuatro rutinas: meter, sacar, pilavacia y pilallena. A continuacin, implementa
los datos rutinas mediante arrays, listas enlazadas, etc. Naturalmente, los datos contenidos en la pila no se pueden hacer locales a cualquiera de las cuatro rutinas, ya que se
deben compartir por todos. Sin embargo, si las nicas elecciones posibles son variables
locales o globales, entonces la pila se debe mantener en variables globales: por el contrario, al ser las variables globales, no existe un mtodo para limitar la accesibilidad o visibilidad de dichas variables. Por ejemplo, si la pila se representa en un array denominado
datospila, este dato debe ser conocido por otros programadores, que puedan desear crear
variables utilizando el mismo nombre pero relativo a las referidas rutinas. De modo similar las rutinas citadas estn reservadas y no se pueden utilizar en otras partes del programa para otros propsitos. En Pascal existe el mbito local y global. Cualquier mbito
que permite acceso a los cuatro procedimientos debe permitir tambin el acceso a sus
datos comunes. Para resolver este problema, se ha desarrollado un mecanismo de estructuracin diferente.

22.1.4.

Mdulos

Un mdulo es una tcnica que proporciona la posibilidad de dividir sus datos y procedimientos en una parte privada slo accesible dentro del mdulo y parte pblica
accesible fuera del mdulo. Los tipos, datos (variables) y procedimientos se pueden
definir en cualquier parte.
El criterio a seguir en la construccin de un mdulo es que si no se necesita algn
tipo de informacin, no se debe tener acceso a ella. Este criterio es la ocultacin de informacin.
Los mdulos resuelven algunos problemas, pero no todos los problemas del desarrollo de software. Por ejemplo, los mdulos permitirn a nuestros programadores ocultar
los detalles de la implementacin de su pila, pero qu sucede si otros usuarios desean
tener dos o ms pilas? Supongamos que un programador ha desarrollado un tipo de dato
Complejo (representacin de un nmero complejo) y ha definido las operaciones aritmticas sobre nmeros complejos suma, resta, multiplicacin y divisin; asimismo ha
definido rutinas para convertir nmeros convencionales a complejos. Se presenta un
problema: slo puede manipular un nmero complejo. El sistema de nmeros complejos no ser til con esta restriccin, pero es la situacin en que se encuentra el programador con mdulos simples.
Los mdulos proporcionan un mtodo efectivo de ocultacin de la informacin, pero
no permiten realizar instanciacin, que es la capacidad de ha^er mltiples copias de las
zonas de datos.

838

Programacin

22.1.5.

en Turbo/Borland

Pascal 7

Tipos abstractos

3.
4.

Objetos

Un objeto es sencillamente un tipo abstracto de datos al que se aaden importantes innovaciones en comparticin de cdigo y reutilizacin. Los mecanismos bsicos de orientacin a objetos son: objetos, mensajes y mtodos, clases e instancias y herencia.
Una idea fundamental es la comunicacin de los objetos a travs de paso de mensajes. Adems de esta idea, se aaden los- mecanismos de herencia y polimorfismo. La herencia permite diferentes tipos de datos para compartir el mismo cdigo, permitiendo
una reduccin en el tamao del cdigo y un incremento en la funcionalidad. El polimorfismo permite que un mismo mensaje pueda actuar sobre objetos diferentes y comportarse de modo distinto.
La persistencia se refiere a la permanencia de un objeto, esto es, la cantidad de tiempo
para el cual se asigna espacio y permanece accesible en la memoria del computador.

UN NUEVO PARADIGMA DE PROGRAMACION

La programacin orientada a objetos (POO) 1 se suele conocer como un nuevo paradigma de programacin. Otros paradigmas conocidos son: el paradigma de la progra-

Encapsulacin

Persistencia

Herencia

Polimorfismo

Genericidad

Objeto

Figura 2 2 . 1 .

Mensajes
Mtodos

Clases
Instancias

Herencia
Jerarqua

Principios bsicos de la orientacin a objetos.

macin imperativa (con lenguajes tales como Pascal o C), el paradigma de la programacin lgica (PROLOG) y el paradigma de la programacin funcional (Lisp). El
significado de paradigma 2 (paradigma, en latn, paradigma en griego) en su origen significaba un ejemplo ilustrativo, en particular enunciado modelo que mostraba todas las
inflexiones de una palabra. En el libro The Structure of Scientific Revolutions el historiador Thomas Kuhn 3 [Kuhn 70] describa un paradigma como un conjunto de teoras,
estndar y mtodos que juntos representan un medio de organizacin del conocimiento:
es decir, un medio de visualizar el mundo. En este sentido la programacin orientada a
objetos es un nuevo paradigma. La orientacin a objetos fuerza a reconsiderar nuestro
pensamiento sobre la computacin, sobre lo que significa realizar computacin y sobre
cmo se estructura la informacin dentro del computador.
Jenkins y Glasgow observan que la mayora de los programadores trabajan en un
lenguaje y utilizan slo un estilo de programacin. Ellos programan en un paradigma
forzado por el lenguaje que utilizan. Con frecuencia, no se enfrentan a mtodos alternativos de resolucin de un problema y, por consiguiente, tienen dificultad en ver la ventaja de elegir un estilo ms apropiado af problema a manejan>. Bobrow y Stefik definen
2

Un ejemplo que sirve c o m o modelo o patrn: Diccionarv of Science and Technology.

Academic Press.

1992.
3

' En ingls, O O P (Object Oriented Programming).

Abstraccin

Entidades bsicas

Los mdulos son mecanismos de ocultacin de informacin y no cumplen bsicamente ms que los apartados 2 y 3. Los tipos abstractos de datos se implementan con
mdulos en MODULA-2 y paquetes en CLU o Ada.

22.2.

839

Conceptos
clave

Exponer una definicin del tipo.


Hacer disponible un conjunto de operaciones que se pueden utilizar para manipular instancias de ese tipo.
Proteger los datos asociados con el tipo de modo que slo se puede actuar sobre
ellas con las rutinas proporcionadas.
Hacer instancias mltiples del tipo.

22.1.6.

y objetos

Tipos abstractos de datos

Un tipo abstracto de datos (TAD) es un tipo de dato definido por el programador que se
puede manipular de un modo similar a los tipos de datos definidos por el sistema. Al
igual que los tipos definidos por el sistema, un tipo de dato abstracto corresponde a un
conjunto (puede ser de tamao indefinido) de valores legales de datos y un nmero de
operaciones primitivas que se pueden realizar sobre esos valores. Los usuarios pueden
crear variables con valores que estn en el rango de valores legales y pueden operar sobre
esos valores utilizando las operaciones definidas. Por ejemplo, en el caso de la pila ya
citada, se puede definir dicha pila como un tipo abstracto de datos y las operaciones sobre la pila como las nicas operaciones legales que estn permitidas para ser realizadas
sobre instancias de la pila.
Los mdulos se utilizan frecuentemente como una tcnica de implementacin para
tipos abstractos de datos, y el tipo abstracto de datos es un concepto ms terico. Para
construir un tipo abstracto de datos se debe poder:
1.
2.

de datos

1970.

Kuhn, T h o m a s S.: The Structure of Scientific Revolucin, 2. a ed. Univefsity of Chicago Press, Chicago,

840

Programacin

en Turbo/Borland

Pascal 7

un estilo de programacin como un medio de organizacin de programas sobre la base


de algn modelo conceptual de programacin y un lenguaje apropiado para hacer programas en un estilo claro. Sugiere que existen cuatro clases de estilos de programacin:

Orientados
Orientados
Orientados
Orientados

a
a
a
a

procedimientos
objetos
lgica
reglas

Algoritmos
Clases y objetos
Expresado en clculo de predicados
Reglas if-then

No existe ningn estilo de programacin idneo para todas las clases de programacin. La orientacin a objetos se acopla a la simulacin de situaciones del m u n d o real.
En POO, las entidades centrales son los objetos, que son tipos de datos que encapsulan con el mismo nombre estructuras de datos y las operaciones o algoritmos que manipulan esos datos.

22.3.

MODULARIDAD

La programacin modular trata de descomponer un programa en un pequeo nmero


de abstracciones coherentes que pertenecen al dominio del problema y cuya complejidad
interna es susceptible de ser enmascarada por la descripcin de un interfaz.
Si las abstracciones que se desean representar, pueden, en ciertos casos, corresponder
a una nica accin abstracta y se implementan en general con la nocin de objeto abstracto (o tipo abstracto) caracterizado en todo instante por:
Un estado actual, definido por un cierto nmero de atributos.
U n conjunto de acciones posibles.
En consecuencia, la modularidad es la posibilidad de subdividir u n a aplicacin en
piezas ms pequeas (denominadas mdulos) cada una de las cuales debe ser tan independiente como sea posible, considerando la aplicacin como un todo, as c o m o de las
otras piezas de las cuales es una parte. Este principio bsico desemboca en el principio
bsico de construir programas modulares. Esto significa que, aproximadamente, ha de
subdividir un programa en piezas ms pequeas, o mdulos, que son generalmente independientes de cada una de las restantes y se pueden ensamblar fcilmente para construir la aplicacin completa. En esencia las abstracciones se implementan en mdulos,
conocidos en la terminologa de Booch, c o m o objetos, que agrupan en u n a sola entidad:
Un conjunto de datos.
Un conjunto de operaciones que actan sobre los datos.
Liskov define la modularizacin c o m o el proceso de dividir un p r o g r a m a en mdulos que se pueden compilar separadamente, pero que tienen conexiones con otros mdulos. Parnas, va ms lejos y dice que las conexiones entre mdulos deben seguir el
criterio de ocultacin de la informacin: un sistema se debe descomponer de acuerdo al
criterio general, de que cada mdulo oculta alguna decisin de diseo del resto del sistema; en otras palabras cada mdulo oculta un secreto.
Si un programa se descompone (o subdivide en mdulos) de m o d o consistente con
el criterio de Parnas es decir, aplicando el principio de ocultacin de la informacin
se reduce la complejidad de cada mdulo que compone la solucin. Estos se constituyen,

Tipos abstractos

de datos

y objetos

841

en cierto m o d o independientes de los restantes y, por consiguiente, se reduce la necesidad de tomar decisiones globales, operaciones y datos.

22.3-1 La estructura de un mdulo


Un mdulo se caracteriza fundamentalmente por su interfaz y por su implementacin.
Parnas define el mdulo c o m o un conjunto de acciones denominadas, funciones o submdulos que corresponden a una abstraccin coherente, que compartan un c o n j u n t o de
datos comunes implantadas estticamente llamadas atributos, eventualmente asociadas
a definiciones lgicas de tipos. Las acciones o funciones de u n mdulo que son susceptibles de ser llamadas desde el exterior se d e n o m i n a n primitivas o puntos de entrada del
mdulo. Los tipos lgicos eventualmente definidos en el interfaz, permiten representar
los parmetros de estas primitivas.

22.3.2.

Reglas de modularizacin

En primer lugar, un m t o d o de diseo debe ayudar al programador a resolver un problema dividiendo el problema en subproblemas ms pequeos, que se puedan resolver
independientemente unos de otros. Debe, tambin, ser fcil conectar los diferentes mdulos a los restantes, dentro del programa que est escribiendo.
Cada mdulo tiene un significado especfico propio y se debe asegurar que cualquier
cambio a su implementacin no afecte a su exterior (o al menos, lo mnimo). De igual
modo, los errores posibles, condiciones de lmites o frontera, comportamientos errticos
no se propaguen ms all del mdulo (o como mximo, a los mdulos que estn directamente en contacto con el afectado).
Para obtener mdulos con las caractersticas anteriores, se deben seguir las siguientes
reglas:
Unidades modulares
El lenguaje debe proporcionar estructuras modulares con las cuales se puedan describir
las diferentes unidades. De este modo, el lenguaje (y el compilador) puede reconocer u n
mdulo y debe ser capaz de manipular y gobernar su uso, adems de las ventajas evidentes relativas a la legibilidad del cdigo resultante. Estas construcciones modulares pueden, como en el caso de los lenguajes orientados a objetos, mostrar caractersticas que
facilitan la estructura del programa, as como la escritura de programas. En otras palabras, nos referimos a las unidades modulares lingsticas q u e en el caso de C++ se co-

Interfaz

Seccin
privada

Primitivas de a c c e s o
Descripcin de propjedades d e los datos
Atributos

Algoritmos

Representacin

P a r m e t r o s actuales

Figura 22.2.

Estructura de un mdulo.

Seccin
pblica

842

Programacin en Turbo/Borland Pascal 7

Tipos abstractos

de datos y objetos

843

nocen c o m o clases y en Turbo Pascal, los mdulos se denominan unidades. La sintaxis


de las unidades diferencia entre el interfaz y la implementacin del mdulo. Las dependencias entre unidades se pueden declarar slo en un interfaz del mdulo. Ada va ms
lejos y define el paquete en dos partes: la especificacin del paquete y el cuerpo del paquete. Al contrario que Object Pascal, Ada permite que la conexin entre mdulos se
declaren independientemente en la especificacin y en el cuerpo de un paquete.

mdulo trata de exportar y cules deben permanecer ocultos del exterior. El interfaz debe
ser fcilmente legible, tanto para el programador como para el compilador. Es decir, el
programador debe comprender cmo funciona el programa y el compilador ha de poder
comprobar si el cdigo que accede al mdulo se ha escrito correctamente.

Interfaces adecuados

Todos los mdulos deben seguir el principio de ocultacin de la informacin; cada mdulo debe representar al menos un elemento de diseo (por ejemplo, la estructura de un
registro, un algoritmo, una abstraccin, etc.).
Otro criterio a tener en cuenta es la subdivisin de un sistema en mdulos, es el principio denominado abierto-cerrado 4 , formulado por Meyer. Este principio entiende que
cada mdulo se considerar cerrado (esto es, terminado y, por consiguiente, til o activo
desde dentro de otros mdulos) y al mismo tiempo, debe ser abierto (esto es, sometido a
cambios y modificaciones). El principio abierto-cerrado debe producirse sin tener que
reescribir todos los mdulos que ya utilizan el mdulo que se est modificando.

En la estructuracin de un programa en unidades es beneficioso que existan pocos interfaces y que stos sean pequeos. Es conveniente que existan pocos enlaces entre los diferentes mdulos en que se descompone u n programa. El interfaz de un mdulo es la
parte del mdulo (datos, procedimientos, etc.) que es visible fuera del mdulo.
Los interfaces deben ser tambin pequeos (esto es, su t a m a o debe ser pequeo con
respecto al t a m a o de los mdulos implicados). D e este modo, los mdulos estn acoplados dbilmente; se enlazarn por un n m e r o pequeo de llamadas (Figura 22.3.)
Interfaces explcitos
El interfaz o parte visible externamente de un mdulo se debe declarar y describir explcitamente; el programa debe especificar cules son los datos y procedimientos que un

Figura 2 2 . 3 .

En lenguajes de programacin clsicos, la modularizacin se centra en los subprogramas


(procedimientos, funciones y subrutinas). En lenguajes orientados a objetos, ia moduiarizacin o participacin del problema se resuelve a travs de los tipos abstractos de datos.

En diseo estructurado, la modularizacin c o m o ya se ha comentado se centra


en el agrupamiento significativo de subprogramas, utilizando el criterio de acoplamiento
y cohesin.
En diseo orientado a objetos, el problema es sutilmente diferente: la tarea consiste
en decidir dnde se empaquetan fsicamente las clases y objetos de la estructura lgica
del diseo, que son claramente diferentes de los subprogramas.

Muchos
interfaces

Ocultacin de la Informacin

Interfaces a d e c u a d o s (pocos-muchos)

22.4.

Interfaces
grandes

Parte
visible

Parte
visible
Interfaces
pequeos

Figura 22.4.

Interfaces adecuados (grandes-pequeos).

DISEO DE MODULOS

Aunque el diseo modular persigue la divisin de un sistema grande en mdulos ms


pequeos y a la vez manejables, no siempre esta divisin es garanta de un sistema bien
organizado. Los mdulos deben disearse con los criterios de acoplamiento y cohesin.
El primer criterio exige independencia de mdulos y el segundo criterio se corresponde
con la idea de que cada mdulo debe realizarse con una sola funcin relacionada con el
problema.
Desde esta perspectiva Booch 5 define la modularidad como: La propiedad de un sistema que ha sido descompuesto en un conjunto de mdulos cohesivos y dbilmente acoplados.
4
Sobre el principio abierto-cerrado y su implementacin en C++ y Eiffel, se puede consultar la bibliografa
de Miguel Katrib. Algunos ttulos destacados sobre orientacin a objetos son: Programacin Orientada a travs
de C++ y Eiffel. V Escuela Internacional en Temas Selectos de Computacin. Zacatecas. Mxico, 1994 (esta
Escuela est organizada por la UNAM. Mxico); Programacin Orientada a Objetos en C++. Infosys, Mxico,
1994; Collections and Interators in Eiffel, JooP, vol. 6 n. 7, nov/dic. 1993.
5
Booch. Grady: Object-Oriented Design with applications. Benjamn Cummings. 1991, p. 52.

844

Programacin en Turbo/Borland Pascal 7

22.4.1.

Tipos abstractos de datos y objetos

Acoplamiento de mdulos

Tabla 2 2 . 2 .

El acoplamiento es una medida del grado de interdependencia entre mdulos, es decir,


el modo en que un mdulo est siendo afectado por la estructura interna de otro mdulo. El grado de acoplamiento se puede utilizar para evaluar la calidad de un diseo de
sistema. El objetivo es minimizar el acoplamiento entre mdulos, es decir, minimizar su
interdependencia, de modo que un mdulo sea afectado lo menos posible por la estructura de otro mdulo. El acoplamiento entre mdulos vara en un amplio rango. Por un
lado, el diseo de un sistema puede tener una jerarqua de mdulos totalmente desacoplados. Sin embargo, dado que un sistema debe realizar un conjunto de funciones o tareas de un modo organizado, no puede constar de un conjunto de mdulos totalmente
desacoplados. En el otro extremo, se tendr una jerarqua de mdulos estrechamente
acoplados; es decir, hay un alto grado de dependencia entre cada pareja de mdulos del
diseo.
Tal como define Booch, un sistema modular dbilmente acoplado facilita:
1.
2.

La sustitucin de un mdulo por otro, de modo que slo unos pocos mdulos
sern afectados por el cambio.
El seguimiento de un error y el aislamiento del mdulo defectuoso que produce
ese error.

Existen varias clases de acoplamiento entre dos mdulos (Tabla 22.1). Examinaremos los cinco tipos de acoplamiento, desde el menos deseable (esto es, acoplamiento estrecho o impermeable) al ms deseable (esto es, acoplamiento ms dbil). La fuerza de
acoplamiento entre dos mdulos est influenciada por el tipo de conexin, el tipo de comunicacin entre ellos y la complejidad global de su interfaz.

22.4.2.

845

Clasificacin d e c o h e s i n de m d u l o s

Tipo de cohesin

Grado de cohesin

Grado de mantenibilidad

Bajo

Bajo

i
Alto

Bajo

Por coincidencia
Lgica
Temporal
Por procedimientos
Por comunicaciones
Secuencial
Funcional
Informacional

La cohesin y el acoplamiento se miden como un espectro que muestra las escalas


que siguen los mdulos. La Tabla 22.1 muestra la clasificacin de acoplamientos de mdulos y su grado de acoplamiento. La Tabla 22.2 muestra los grados de cohesin: baja
cohesin (no deseable) y alta cohesin (deseable), as como los diferentes tipos de cohesin.
Idealmente se buscan mdidos altamente cohesivos y dbilmente acoplados.
La cohesin y el acoplamiento se miden como un espectro que muestra las escalas
que siguen los mdulos. La Tabla 22.1 muestra la clasificacin de acoplamientos de mdulos y su grado de acoplamiento. La Tabla 22.2 muestra los grados de cohesin: baja
cohesin (no deseable) y alta cohesin (deseable), as como los diferentes tipos de cohesin.
Idealmente se buscan mdulos altamente cohesivos y dbilmente acoplados.

Cohesin de mdulos

La cohesin es una extensin del concepto de ocultamiento de la informacin. Dicho de


otro modo, la cohesin describe la naturaleza de las interacciones dentro de un mdulo
software. Este criterio sugiere que un sistema bien modularizado es aqul en el cual los
interfaces de los mdulos son claros y simples. Un mdulo cohesivo ejecuta una tarea
sencilla de un procedimiento de software y requiere poca interaccin con procedimientos que ejecutan otras partes de un programa. En otras palabras, un mdulo cohesivo
slo hace (idealmente) una cosa.
Tabla 2 2 . 1 .

1 ipo de acuplamiento
Por c o n t e n i d o
Comn
De control
Por sellado (estampado)
Datos
Sin a c o p l a m i e n t o

22 5.

TIPOS DE DATOS

Todos los lenguajes de programacin soportan algn tipo de datos. Por ejemplo, el lenguaje de programacin convencional Pascal soporta tipos base tales como enteros, reales
y caracteres, as como tipos compuestos tales como arrays (vectores y matrices) y registros. Los tipos abstractos de datos extienden a funcin de un tipo de datos; ocultan la
implementacin de las operaciones definidas por el usuario asociadas con el tipo de datos. Esta capacidad de ocultar la informacin permite el desarrollo de componentes de
software reutilizables y extensibles.

Clasificacin del a c o p l a m i e n t o del m d u l o

Grado de acopiamiento

Grado de mantenibilidad

Alto (Fuerte)

Bajo

Bajo (Dbil)

Alto

l n

de diito 'i un conjunto de \ulonr

"

un canjunm de operaciones definidas por e\o\

Un valor depende de su representacin y de la interpretacin de la representacin,


por lo que una definicin informal de un tipo de dato es: Representacin + Operaciones.
Un tipo de dato describe un conjunto de objetos con la misma representacin. Existen un nmero de operaciones asociadas con cada tipo. Es posible realizar aritmtica so-

846

Programacin en Turbo/Borland Pascal 7

bre tipos de datos enteros y reales, concatenar cadenas o recuperar o modificar el valor
de un elemento.
La mayora de los lenguajes tratan las variables y constantes de un programa como
instancias de un tipo de dato. U n tipo de dato proporciona una descripcin de sus instancias que indican al compilador cosas como cunta memoria se debe asignar para una
instancia, cmo interpretar los datos en memoria y qu operaciones son permisibles sobre esos datos. Por ejemplo, cuando se escribe una declaracin tal como f l o a t z en C o
C++, se est declarando una instancia denominada z del tipo de dato float. El tipo de
datos float indica al compilador que reserve, por ejemplo, 32 bits de memoria, y qu
operaciones, tales como sumar y multiplicar, estn permitidas, mientras que operaciones tales como el el resto (mdulo) y desplazamiento de bits no lo son. Sin embargo, no se necesita escribir la declaracin del tipo float el autor de compilador lo
hizo por nosotros y se construyen en el compilador. Los tipos de datos que se construyen en un compilador de este modo, se conocen como tipos de datos fundamentales
(predefinidos) y, por ejemplo, en C y C++ son entre otros: int, char y f l o a t .
Cada lenguaje de programacin incorpora una coleccin de tipos de datos f u n d a mentales, que incluyen normalmente enteros, reales, carcter, etc. Los lenguajes de programacin soportan tambin un n m e r o de constructores de tipos incorporados que permiten generar tipos ms complejos. Por ejemplo, Pascal soporta registros y arrays.
En lenguajes convencionales tales como C, Pascal, ..., las operaciones sobre un tipo
de dato son composiciones de constructores de tipo y operaciones de tipos bases.

Operaciones = Operaciones constructor + Operaciones base

Algunos tipos de constructores incluyen registros, arrays, listas, conjuntos, etc.

22.6.

ABSTRACCION EN LENGUAJES DE PROGRAMACION

Los lenguajes de programacin son las herramientas mediante las cuales los diseadores
de lenguajes pueden implementar los modelos abstractos. La abstraccin ofrecida por los
lenguajes de programacin se puede dividir en dos categoras: abstraccin de datos (perteneciente a los datos) y abstraccin de control (perteneciente a las estructuras de control).
Desde comienzos del decenio de los sesenta, en que se desarrollaron los primeros lenguajes de programacin de alto nivel, ha sido posible utilizar las abstracciones ms primitivas de ambas categoras (variables, tipos de datos, procedimientos, control de bucles,
etctera.). Ambas categoras de abstracciones han producido una gran cantidad de lenguajes de programacin no siempre bien definidos.

22.6.1.

Abstracciones de control

Los microprocesadores ofrecen directamente slo dos mecanismos para controlar el flujo
y ejecucin de las instrucciones: secuencia y salto. Los primeros lenguajes de programa-

r/pos abstractos

de datos y objetos

847

cin de alto nivel introdujeron las estructuras de control: sentencias de bifurcacin ( i f )


y bucles (for, while, do-loop, etc.).
Las estructuras de control describen el orden en que se ejecutan las sentencias o grupos de sentencia (unidades de programa). Las unidades de programa se utilizan como
bloques bsicos de la clsica descomposicin descendente. En todos los casos, los subprogramas constituyen una herramienta potente de abstraccin ya que durante su implementacin, el programador describe en detalle c m o f u n c i o n a n los subprogramas.
Cuando el subprograma se llama, basta con conocer lo que hace y no cmo lo hace. De
este modo, los subprogramas se convierten en cajas negras que amplan el lenguaje de
programacin a utilizar. En general, los subprogramas son los mecanismos ms ampliamente utilizados para reutilizar cdigo, a travs de colecciones de subprogramas en bibliotecas.
Las abstracciones y estructuras de control se clasifican en estructuras de control a nivel de sentencia y a nivel de unidades. Las abstracciones de control a nivel de unidad se
conoce como abstraccin procedimental.
Abstraccin

procedimental

(por procedimientos)

Es esencial para disear software modular y fiable. La abstraccin procedimental se basa


en la utilizacin de procedimientos o funciones sin preocuparse de cmo se implementan. Esto es posible slo si conocemos qu hace el procedimiento; esto es, conocemos la
sintaxis y semntica que utiliza el procedimiento o funcin. El nico mecanismo en Pascal estndar para establecer abstraccin procedimental es el subprograma (procedimientos y funciones). La abstraccin aparece en los subprogramas debido a las siguientes
causas:
Con el nombre de los subprogramas, un programador puede asignar u n a descripcin abstracta que captura el significado global del subprograma. Utilizando el
nombre en lugar de escribir el cdigo permite al programador aplicar la accin en
trminos de su descripcin de alto nivel en lugar de sus detalles de bajo nivel.
Los subprogramas en Pascal proporcionan ocultacin de la informacin. Las variables locales y cualquier otra definicin local se encapsulan en el subprograma,
ocultndolos realmente de forma que no se pueden utilizar fuera del subprograma.
Por consiguiente, el programador no tiene que preocuparse sobre las definiciones
locales; sin embargo, pueden utilizarse los componentes sin conocer nada sobre
sus detalles.
Los parmetros de los subprogramas, j u n t o con la ocultacin de la informacin
anterior, permiten crear subprogramas que constituyen entidades de software propias. Los detalles locales de la implementacin pueden estar ocultos mientras que
los parmetros se pueden utilizar para establecer el interfaz pblico.
Otros mecanismos de abstraccin de. control
La evolucin de los lenguajes de programacin ha permitido la aparicin de otros mecanismos para la abstraccin de control, tales como manejo de excepciones, corrutinas,
unidades concurrentes, plantillas (templates). Estas construcciones son soportadas por los
lenguajes' de programacin basados v orientados a objetos, tales como Modula-2, Ada,
C++, Smalltalk o Eiffel.

848

22.6.2.

Programacin

en Turbo/Borland PascaI 7

Abstraccin de datos

Los primeros pasos hacia la abstraccin de datos se crearon con lenguajes tales como
FORTRAN, COBOL y ALGOL 60, con la introduccin de tipos de variables diferentes,
que manipulan enteros, nmeros reales, caracteres, valores lgicos, etc. Sin embargo, estos tipos de datos no podan ser modificados y no siempre se ajustaban al tipo de uno
para el que se necesitaban. Por ejemplo, el tratamiento de cadenas es una deficiencia en
FORTRAN, mientras que la precisin y fiabilidad para clculos matemticos es muy alta.
La siguiente generacin de lenguajes, incluyendo Pascal, SIMULA-67 y ALGOL 68,
ofreci una amplia seleccin de tipos de datos y permiti al programador modificar y
ampliar los tipos de datos existentes mediante construcciones especficas (por ejemplo,
arrays y registros). Adems, SIMULA-67 fue el primer lenguaje que mezcl datos y procedimientos mediante la construccin de clases, que eventualmente se convirti en la
base del desarrollo de programacin orientada a objetos.
La abstraccin de datos es la tcnica de programacin que permite inventar o definir
nuevos tipos de datos (tipos de datos definidos por el usuario) adecuados a la aplicacin
que se desea realizar. La abstraccin de datos es una tcnica muy potente que permite
disear programas ms cortos, legibles y flexibles. La esencia de la abstraccin es similar
a la utilizacin de un tipo de dato, cuyo uso se realiza sin tener en cuenta cmo est
representado o implementado.
Los tipos de datos son abstracciones y el proceso de construir nuevos tipos se llaman
abstracciones de datos. Los nuevos tipos de datos definidos por el usuario se llaman tipos
abstractos de dalos.
El concepto de tipo, tal como se defini en Pascal y ALGOL 68, ha constituido un
hito importante hacia la realizacin de un lenguaje capaz de soportar programacin estructurada. Sin embargo, estos lenguajes no soportan totalmente una metodologa. La
abstraccin de datos til para este propsito, no slo clasifica objetos de acuerdo a su
estructura de representacin; sino que se clasifican de acuerdo al comportamiento esperado. Tal comportamiento es expresable en trminos de operaciones que son significativas sobre esos datos, y las operaciones son el nico medio para crear, modificar y acceder
a los objetos.
En trminos ms precisos, Ghezzi indica que un tipo de dato definible por el usuario
se denomina tipo abstracto de dato (TAD) si:

Tipos abstractos

22.7.

Algunos lenguajes de programacin tienen caractersticas que nos permiten ampliar el


lenguaje aadiendo sus propios tipos de datos. Un tipo de dato definido por el programador se denomina tipo abstracto de datos (TAD) para diferenciarlo del tipo fundamental (predefinido) de datos. Por ejemplo, en Turbo Pascal un tipo Punto, que representa a
las coordenadas x e y de un sistema de coordenadas rectangulares, no existe. Sin embargo, es posible implementar el tipo abstracto de datos, considerando los valores que se
almacenan en las variables y qu operaciones estn disponibles para manipular estas variables. En esencia un tipo abstracto de datos es un tipo de datos que consta de datos
(estructuras de datos propias) y operaciones que se pueden realizar sobre esos datos. Un
TAD se compone de estructuras de datos y los procedimientos o funciones que manipulan esas estructuras de datos.

TAD - Representacin (datos) + Operaciones (funciones y procedimientos)

Las operaciones desde un enfoque orientado a objetos se suelen denominar mtodos.


La estructura de un tipo abstracto de dato (clase), desde un punto de vista global, se
compone del interfaz y de la implementacin (Figura 22.5).
Las estructuras de datos reales elegidas para almacenar la representacin de un tipo
abstracto de datos son invisibles a los usuarios o clientes. Los algoritmos utilizados para

Mtodo 1
Mtodo 3

Mtodo 2
Mtodo 4

interfaz pblico

Representacin:
estructuras de datos
(variables de instancia)

Las clases en SIMULA slo cumplan la primera de las dos condiciones, mientras
que otros lenguajes actuales cumplen las dos condiciones: Ada, Modula-2 y C++.
Los tipos abstractos de datos proporcionan un mecanismo adicional mediante el cual
se realiza una separacin clara entre el interfaz y la implementacin del tipo de dato. La
implementacin de un tipo abstracto de dato consta de:

Implementacin de mtodos:
Cdigo del mtodo 1
Cdigo del mtodo 2
Cdigo del mtodo 3
Cdigo del mtodo 4

La representacin: eleccin de las estructuras de datos.


Las operaciones: eleccin de los algoritmos.

El interfaz del tipo abstracto de dato se asocia con las operaciones y datos visibles al
exterior del TAD.

849

TIPOS ABSTRACTOS DE DATOS

Existe una construccin del lenguaje que le permite asociar la representacin de


los datos con las operaciones que lo manipulan.
La representacin del nuevo tipo de dato est oculta de las unidades de programa
que lo utilizan [Ghezzi 87],

1.
2.

de datos y objetos

Implementacin privada

Figura 2 2 . 5 .

Estructura de un tipo a b s t r a c t o d e d a t o s (TAD).

850

Programacin en Turbo/Borland Pascal 7

implementar cada una de las operaciones de los TAD estn encapsuladas dentro de los
propios TAD. La caracterstica de ocultamiento de la informacin del T A D significa que
los objetos tienen interfaces pblicos. Sin embargo, las representaciones e implementaciones de esos interfaces son privados.

22.1 A.

Ventajas de los tipos abstractos de datos

Un tipo abstracto de datos es un modelo (estructura) con un nmero de operaciones que


afectan a ese modelo. Es similar a la definicin que daremos en el captulo siguiente de
objeto y, de hecho, estn unidos ntimamente. Los tipos abstractos de datos proporcionan numerosos beneficios al programador, que se pueden resumir en los siguientes:
1. Permite una mejor conceptualizacin y modelizacin del m u n d o real. Mejora la
representacin y la comprensibilidad. Clarifica los objetos basados en estructuras
y comportamientos comunes.
2. Mejora la robustez del sistema. Si hay caractersticas subyacentes en los lenguajes
permiten la especificacin del tipo de cada variable, los tipos abstractos de datos
permiten la comprobacin de tipos para evitar errores de tipo en tiempo de ejecucin.
3. Mejora el rendimiento (prestaciones). Para sistemas tipeados, el conocimiento de
los objetos permite la optimizacin de tiempo de compilacin.
4. Separa la implementacin de la especificacin. Permite la modificacin y mejora
de la implementacin sin afectar al interfaz pblico del tipo abstracto de dato.
5. Permite la extensibilidad del sistema. Los componentes de software reutilizables
son ms fciles de crear y mantener.
6. Recoge mejor la semntica del tipo. Los tipos abstractos de datos agrupan o localizan las operaciones y la representacin de atributos.

22.7.2.

Implementacin de los TAD

Los lenguajes convencionales, tales como Pascal, permiten la definicin de nuevos tipos
y la declaracin de procedimientos y funciones para realizar operaciones sobre objetos
de los tipos. Sin embargo, tales lenguajes no permiten que los datos y las operaciones
asociadas sean declaradas juntos como una unidad y con un solo nombre. En los lenguajes en el que los mdulos (TAD) se pueden implementar como una unidad, stos reciben nombres distintos:
Turbo Pascal
unidad, objeto
Modula-2
mdulo
Ada
paquete
C++
clase
Java
clase
En estos lenguajes se definen la especificacin del TAD, que declara las operaciones
y los datos ocultos al exterior, y la implementacin, que muestra el cdigo fuente de las
operaciones y que permanece oculto al exterior del mdulo.
Las ventajas de los T A D se pueden manifestar en toda su potencia, debido a que las
dos partes de los mdulos (especificacin e implementacin) se pueden compilar por separado mediante la tcnica de compilacin separada (separate compilation).

Tipos abstractos do dstos y objQtos

22.8.

851

TIPOS ABSTRACTOS DE DATOS EN TURBO PASCAL

Una pila es una de las estructuras de datos ms utilizadas en el mundo de la compilacin. U n a pila es un tipo de dato clsico utilizado frecuentemente para introducir al concepto de tipo abstracto de datos; es una lista lineal de elementos en la que los elementos
se aaden o se quitan por un slo extremo de la lista. La pila almacena elementos del
mismo tipo y actan sobre ella las operaciones clsicas de Meter y Sacar elementos en
dicha pila, teniendo presente la estructura lgica U F O (ltimo en entrar, primero en
salir).
En Turbo Pascal, los TAD se implementan mediante estructuras tipo unidad. Recordemos que una unidad es una biblioteca de funciones y procedimientos que pueden ser
utilizados por cualquier programa con la condicin de incluir el nombre de la unidad en
la clusula uses de su sintaxis.
unit cnombre unidad>;
interface
<clausula uses>
<constantes, tipos y variables publicas>
Ccabeceras de procedimientos y funciones publicas>
implementation
<clausula uses>
cconstantes, tipos y variables privadas>
<procedimientos/funciones privadas y cuerpos de
procedimientos/funciones publicas>
begin
<secuencia de sentencias para incializacon>
end.

es:

La implementacin de una pila con capacidad para 1.000 elementos del tipo entero
unit Pila;
interface
const
iMaxPila = 1000;
type
TipoElemento = integer;
ListaElementos = array
tipo = record

[l..MaxPila] of TipoElemento;

Elems : ListaElementos;
Cima
end;

integer;

procedure Crear (var S:tipo);


(* S se inicializa y se limpia o vaca *)
p r o c e d u r e Destruir (var S:tipo);
(* Se libera memoria asignada a S *)
(* S no est inicializada
*)
procedure Meter (var S-.tipo; Item; tipoElemento);
(* Se aade un elemento a la cima de la pila *)

852

Tipos abstractos de datos y objetos

Programacin en Turbo/Borland Pascal 7

procedure Sacar (var S:tipo; var Item:TipoElemento) ;


begin
Item := S.Elems[S.Cima];
S.Cima := S.Cima-1
end;

Pila
Estructura de datos
Almacena una serie de elementos del tipo elemento. La pila est inicialmente vacia y los elementos se
meten o sacan en ia pila por el mismo extremo.
Operaciones (Procedimiento que actan sobre la estructura de datos).
Meter
Sacar
Crear
Destruir
PilaVacia

853

procedure PilaVacia (var S : tipo)-.boolean;


begin
PilaVacia := (S.Cima=0);
end;
end.
U n a vez q u e se h a i m p l e m e n t a d o el t i p o d e d a t o Pila,

ste p u e d e ser u t i l i z a d o e n

c u a l q u i e r p r o g r a m a c o n t a l d e i n v o c a r e n la c l u s u l a u s e s a d i c h o t i p o d e d a t o Pila.
Sacar

Cima

1i

ir

22.8.1.

- Meter

Fondo

El s i g u i e n t e p r o g r a m a lee u n a s e c u e n c i a d e e n t e r o s , u n o p o r l n e a , t a l e s c o m o stos:
PilaVacia

Figura 2 2 . 6 .

Aplicacin del tipo abstracto de dato Pila

Estructura d e d a t o s Pila.

100
4567
-20
250
y g e n e r a la m i s m a s e c u e n c i a d e n m e r o s e n o r d e n i n v e r s o (los s a c a d e la p i l a ) .
250
-20

procedure Sacar (var S:tipo; Item:tipoElemento) ;


(*quitar un elemento de la pila *)
procedure PilaVacia (var S:tipo):boolean;
(*devuelve true si'S es vaca; false en caso contrario *)

4567
100
E s t a t a r e a se c o n s i g u e m e t i e n d o n m e r o s e n la p i l a y a c o n t i n u a c i n v a c i a n d o d i c h a
pila.

implementation

program Nmeros;

procedure Crear (var S:tipo);


begin
S.Cima := 0;
end;

uses
Pila;
var
S:Pila.Tipo;

procedure Destruir (var S:tipo);


begin
(*no hace nada *)
end;

procedure LeeryAlmacenarNumeros(var NumPila:Pila.Tipo);


var
Aux:Pila.TipoElemento;
begin
while not eof do
begin
readln(Aux);
Pila.Meter(NumPila, Aux);
end;
end;

procedure Meter (var S:tipo; Item:TipoElemento);


begin
S.Cima := S.Cima + 1;
S.Elems[S.Cima] := Item;
end;

854

Programacin en Turbo/Borland Pascal 7

Tipos abstractos de datos y objetos

855

procedure VerNumeros(var NumPila: Pila.Tipo);


var
Aux: Pila.TipoElemento;
begin
while not Pila.Pilavacia(NumPila) do
begin
Pila.Sacar(NumPila, Aux);
WriteLn(Aux);
end;
(* while *)
end;
(* VerNumeros *)
begin
(* programa principal *)
Pila.Crear(S)
LeeryAlmacenarNumeros(S);
Pila.Destruir(S ) ;
end.
(* fin de principal *)

A igual que se ha definido el tipo Pila con estructuras estticas tipo array, se poda
haber realizado con estructuras dinmicas tales como listas enlazadas. De igual modo se
pueden implementar otros tipos de datos abstractos tales como, por ejemplo, las colas
que se utilizan en muchas aplicaciones: sistemas operativos, sistemas de comunicaciones, etc.

22.9.

ORIENTACION A OBJETOS

La orientacin a objetos puede describirse como el conjunto de disciplinas (ingeniera)


que desarrollan y modelizan software que facilitan la construccin de sistemas complejos
a partir de componentes.
El atractivo intuitivo de la orientacin a objetos es que proporciona conceptos y herramientas con las cuales se modela y representa el mundo real tan fielmente como sea
posible. Las ventajas de la orientacin a objetos son muchas en programacin y modelacin de datos. Como apuntaban Ledbetter y Cox (1985):

Codificacin del programa

Figura 2 2 . 7 .

orientadas a objetos proporcionan mejoras metodolgicas para construir sistemas de


software complejos a partir de unidades de software modularizado y reutilizable.
Se necesita un nuevo enfoque para construir software en la actualidad. Este nuevo
enfoque debe ser capaz de manipular, tanto sistemas grandes como pequeos, y debe
crear sistemas fiables que sean flexibles, mantenibles y capaces de evolucionar, para
cumplir las necesidades de cambio.
La tecnologa orientada a objetos puede cubrir estos cambios y algunos otros ms en
el futuro.
La orientacin a objetos trata de cumplir las necesidades de los usuarios finales, as
como las propias de los desarrolladores de productos software. Estas tareas se realizan
mediante la modelizacin del mundo real. El soporte fundamental es el modelo objeto.
Los cuatro elementos (propiedades) ms importantes de este modelo 6 son:

La programacin orientada a objetos permite una representacin m s directa del m o d e l o


de m u n d o real en el cdigo. El resultado es que la t r a n s f o r m a c i n radical n o r m a l de los
requisitos del sistema (definido en t r m i n o s de usuario) a la especificacin del sistema
(definido en t r m i n o s de c o m p u t a d o r ) se reduce considerablemente.

La Figura 22.7 ilustra el problema. Utilizando tcnicas convencionales, el cdigo generado para un problema de m u n d o real consta de una primera codificacin del problema y a continuacin la transformacin del problema en trminos de un lenguaje de
computador Von Newmann. Las disciplinas y tcnicas orientadas a objetos manipulan
la transformacin automticamente, de modo que el volumen de cdigo codifica el problema y la transformacin se minimiza. De hecho, cuando se compara con estilos de
programacin convencionales (procedimentales por procedimientos), las reducciones de
cdigo van desde un 40 % hasta un orden de magnitud elevado cuando se adopta un
estilo de programacin orientado a objetos.
Los conceptos y herramientas orientadas a objetos son tecnologas que permiten que
los problemas del m u n d o real sean expresados de m o d o fcil y natural. Las tcnicas

C o n s t r u c c i n de s o f t w a r e .

Abstraccin;
Encapsulamiento;
Modularidad;
Jerarqua.

Como sugiere Booch, si alguno de estos elementos no existe, se dice que el modelo
no es orientado a objetos.

22.9.1.

Abstraccin

La abstraccin es uno de los medios ms importante mediante el cual nos enfrentamos


con la complejidad inherente al software. La abstraccin es la propiedad que permite re-

Booch, Grady. Object-Oriented Analysis and Design with Applications, Benjamin/Cummings, 1994.

856

Tipos abstractos

Programacin en Turbo/Borland Pascal 7

presentar las caractersticas esenciales de un objeto, sin preocuparse de las restantes caractersticas (no esenciales).
Una abstraccin se centra en la vista externa de un objeto, de modo que sirva para
separar el comportamiento esencial de u n objeto, de su implementacin. Definir u n a
abstraccin significa describir una entidad del m u n d o real, no importa lo compleja que
pueda ser, y a continuacin utilizar esta descripcin en un programa.
El elemento clave de la programacin orientada a objetos es la clase. U n a clase se
puede definir como una descripcin abstracta de u n grupo de objetos, cada u n o de los
cuales se diferencia por su estado especfico y por la posibilidad de realizar una serie de
operaciones. Por ejemplo, una pluma estilogrfica es un objeto que tiene un estado (llena
de tinta o vaca) y sobre la cual se pueden realizar algunas operaciones (por ejemplo, escribir, poner/quitar el capuchn, llenar de tinta si est vaca).
La idea de escribir programas definiendo una serie de abstracciones no es nueva, pero
el uso de clases para gestionar dichas abstracciones en lenguajes de programacin ha facilitado considerablemente su aplicacin.

22.9.2.

Encapsulamiento

La encapsulacin o encapsulamiento es la propiedad que permite asegurar que el contenido de la informacin de un objeto est oculta al m u n d o exterior: el objeto A no conoce
lo que hace el objeto B y viceversa. La encapsulacin (tambin se conoce como ocultacin de la informacin), en esencia, es el proceso de ocultar todos los secretos de u n objeto que no contribuyen a sus caractersticas esenciales.
La encapsulacin permite la divisin de un programa en mdulos. Estos mdulos se
implementan mediante clases, de forma que una clase representa la encapsulacin de una
abstraccin. En la prctica, esto significa que cada clase debe tener dos partes: u n interfaz y una implementacin. El interfaz de una clase captura slo su vista externa y la implementacin contiene la representacin de la abstraccin, as como los mecanismos que
realizan el comportamiento deseado.

22.9.3.

Modularidad

La modularidad es la propiedad que permite subdividir una aplicacin en partes ms


pequeas (llamadas mdulos), cada una las cuales debe ser tan independiente c o m o sea
posible de la aplicacin en s y de las restantes partes.
La modularizacin, como indica Liskov, consiste en dividir un programa en m d u los que se pueden compilar por separado, pero que tienen conexiones con otros m d u los. Al igual que la encapsulacin, los lenguajes soportan la modularidad de diversas formas. Por ejemplo, en C++ los mdulos son archivos compilados por separado. La prctica
usual es situar los interfaces de los mdulos en archivos con nombres con extensin .h
(.archivos de cabecera) y las implementaciones de los mdulos se sitan en archivos con
nombres con extensin .cpp.
En Ada, el mdulo se define como paquete (package). U n paquete tiene dos partes:
la especificacin del paquete y el cuerpo del paquete, tambin se pueden compilar por
separado.
La modularidad es la propiedad de u n sistema que permite su descomposicin en un
conjunto de mdulos cohesivos y dbilmente acoplados.

22.9.4.

de datos y objetos

857

Jerarqua

La jerarqua es una propiedad que permite una ordenacin de las abstracciones. Las dos
jerarquas ms importantes de u n sistema complejo son: estructura de clases (jerarqua
es-un (is-a): generalizacin/especializacin) y estructura de objetos (jerarqua partede (part-of): agregacin).
No se debe confundir clases y objetos de la misma clase: un coche rojo y un coche azul no
son objetos de clases diferentes, sino objetos de la misma clase con un atributo diferente.

Las jerarquas de generalizacin/especializacin se conocen como herencia. Bsicamente, la herencia define una relacin entre clases, en donde u n a clase comparte la estructura o c o m p o r t a m i e n t o definido en una o ms clases (herencia simple y herencia
mltiple, respectivamente).
La agregacin es el concepto que permite el agrupamiento fsico de estructuras relacionadas lgicamente. As, un camin se c o m p o n e de ruedas, motor, sistema de transmisin y chasis; en consecuencia, camin es una agregacin y ruedas, motor, transmisin y chasis son agregados de camin.

22.9.5.

Polimorfismo

La quinta propiedad significativa de los lenguajes de programacin orientados a objetos


es el polimorfismo. Esta propiedad, no suele ser considerada como fundamental en los
diferentes modelos de objetos propuestos, pero dada su importancia, no tiene sentido
considerar un objeto modelo que no soporte esta propiedad.
Polimorfismo es la propiedad, que indica, literalmente, la posibilidad de que u n a entidad tome muchas formas. En trminos prcticos, el polimorfismo permite referirse a
objetos de clases diferentes mediante el mismo elemento de programa y realizar la misma
operacin de diferentes formas, segn sea el objeto que se referencia en ese m o m e n t o .
Por ejemplo, cuando se describe la clase mamferos, se puede observar que la operacin comer es u n a operacin fundamental en la vida de los mamferos, de m o d o que
cada tipo de mamfero debe poder realizar la operacin o funcin comer. Por otra parte,
una vaca o una cabra que pastan en un campo, u n nio que se come un b o m b n o caramelo y un len que devora a otro animal, son diferentes formas que utilizan los distintos mamferos, para realizar la misma funcin (comer).
El polimorfismo implica la posibilidad de tomar un objeto de un tipo (mamfero, por
ejemplo) e indicarle que ejecute comer, esta accin se ejecutar de diferente forma segn
sea el objeto mamfero sobre el que se aplica.
Clases, herencia y polimorfismo son aspectos claves en la programacin orientada a
objetos y se reconocen a estos elementos como esenciales en la orientacin a objetos. El
polimorfismo adquiere su mxima expresin en la derivacin o extensin de clases; es
decir, cuando se obtiene u n a clase a partir de una clase ya existente, mediante la propiedad de derivacin de clases o herencia. As, por ejemplo, si se cjispone de una figura que
represente figuras genricas, se puede enviar cualquier mensaje tanto a un tipo derivado
(elipse, crculo, cuadrado, etc.) como al tipo base. Por ejemplo, una clase figura, puede

858

aceptar los mensajes dibujar, borrar y mover. Cualquier tipo derivado de una figura es
un tipo de figura y puede recibir el mismo mensaje. Cuando se enva un mensaje, por
ejemplo dibujar, esta tarea ser distinta segn que la clase sea un tringulo, un cuadrado
o una elipse. Esta propiedad es el polimorfismo, que permite que una misma funcin se
comporte de diferente forma segn sea la clase sobre la que se aplica. La funcin dibujar
se aplica igualmente a un crculo, un cuadrado o un tringulo y el objeto ejecutar el
cdigo apropiado dependiendo del tipo especfico.
El polimorfismo requiere ligadura tarda o postergada (tambin llamada dinmica),
y esto slo se puede producir en lenguajes de programacin orientados a objetos. Los
lenguajes no orientados a objetos, soportan ligadura temprana o anterior, esto significa
que el compilador genera una llamada a un nombre especfico de funcin y el enlazador
(linker) resuelve la llamada a la direccin absoluta del cdigo que se ha de ejecutar. En
POO, el programa no puede determinar la direccin del cdigo hasta el momento de la
ejecucin; para resolver este concepto, los lenguajes orientados a objetos utilizan el concepto de ligadura tarda. Cuando se enva un mensaje a un objeto, el cdigo que se llama
no se determina hasta el momento de la ejecucin. El compilador asegura que la funcin
existe y realiza verificacin de tipos de los argumentos y del valor de retorno, pero no
conoce el cdigo exacto a ejecutar.
Para realizar la ligadura tarda, el compilador inserta un segmento especial de cdigo
en lugar de la llamada absoluta. Este cdigo calcula la direccin del cuerpo de la funcin
para ejecutar en tiempo de ejecucin utilizando informacin almacenada en el propio
objeto. Por consiguiente, cada objeto se puede comportar de modo diferente de acuerdo
al contenido de ese puntero. Cuando se enva un mensaje a un objeto, ste realmente
sabe qu ha de hacer con ese mensaje.

22.9.6.

Otras propiedades

El modelo objeto ideal, no slo tiene las propiedades anteriormente citadas al principio
del apartado, sino que es conveniente soporte adems, estas otras propiedades:

Tipos abstractos

Programacin en Turbo/Borland Pascal 7

Concurrencia (multitarea)
Persistencia
Genericidad
Manejo de excepciones

Muchos lenguajes soportan todas estas propiedades y otros slo algunas de ellas. As,
por ejemplo, Ada soporta concurrencia y Ada y C++ soportan genericidad y manejo de
excepciones. La persistencia o propiedad de que las variables y por extensin, a los
objetos existan entre las invocaciones de un programa, es posiblemente la propiedad
menos implantada en los LPOO, aunque ya es posible considerar la persistencia en lenguaje tales como Smalltalk y C+, lo que facilitar el advenimiento de las bases de datos
orientadas a objetos como as est sucediendo en esta segunda mitad de la dcada de los
noventa.

22.10.

REUTILIZACION DE SOFTWARE

Cuando se construye un automvil, un edificio o un dispositivo electrnico, se ensamblan una serie de piezas independientes de modo que estos componentes se reutilizan en

de datos y objetos

859

vez de fabricarlos cada vez que se necesita construir un automvil o un edificio. En la


construccin de software, esta pregunta es continua Por qu no se utilizan programas
ya construidos para formar programas ms grandes? Es decir, si en electrnica, los computadores y sus perifricos se forman esencialmente con el ensamblado de circuitos integrados, existe algn mtodo que permite realizar grandes programas a partir de la utilizacin de otros programas ya realizados? Es posible reutilizar estos componentes de
software?
Las tcnicas orientadas o objetos proporcionan un mecanismo para construir componentes de software reutilizables que posteriormente puedan ser interconectados entre
s y formar grandes proyectos de software 7.
En los sistemas de programacin tradicionales y en particular en los basados en lenguajes de programacin estructurados (tales como FORTRAN, C, etc.) existen las bibliotecas de funciones, que contienen funciones (o procedimientos, segn el lenguaje) que
pueden ser incorporados en diferentes programas. En sistemas orientados a objetos se
pueden construir componentes de software reutilizables. al estilo de las bibliotecas de
funciones, normalmente denominados bibliotecas de software o paquetes de software
reutilizables. Ejemplos de componentes reutilizables comerciaimente disponibles son:
Turbo Visin de Turbo Pascal, OLE 2.0 y COM de Microsoft, jerarqua de clases Smalltalk, clases MacApp para desarrollo de interfaces grficos de usuario en Object Pascal,
disponibles en Apple, la coleccin de clases de Objective-C, CORBA, etc.
En el futuro inmediato, los ingenieros de software dispondrn de catlogos de paquetes de software reutilizable, al igual que sucede con los catlogos de circuitos integrados
electrnicos como les ocurre a los ingenieros de hardware.
Las tcnicas orientadas a objetos ofrecen una alternativa de escribir el mismo programa una y otra vez. El programador orientado a objetos modifica una funcionalidad
del programa sustituyendo elementos antiguos u objetos por nuevos objetos, o bien conectando simplemente nuevos objetos en la aplicacin.
La reutilizacin de cdigo en reprogramacin tradicional se puede realizar copiando
y editando mientras que en programacin orientada a objetos se puede reutilizar el cdigo, creando automticamente una subclase y anulando alguno de sus mtodos.
Muchos lenguajes orientados a objetos fomentan la reutilizacin mediante el uso de
bibliotecas robustas de clases preconstruidas, as como otras herramientas como los hojeadores o exploradores (browser), para localizar clases de inters y depuradores interactivos para ayudar al programador.

22.11.

LENGUAJES DE PROGRAMACION ORIENTADQS


A OBJETOS

El primer lenguaje de programacin que introdujo el concepto de clase fue Simula-67,


corno entidad que contena datos y las operaciones que manipulaban los datos. Asimismo, introdujo tambin el concepto de herencia.
Brad Cox, en su ya clsico libro Object-Oriented Programming An Evolutionary Approach [Cox, Novobilski, 91], acu el trmino chip de software (Software-IC), o componentes de>software, para definir las clases
de objetos como componentes de software reutilizables. Existe versin en espaol de Addison-Wesley/Daz de
Santos, 1993, con el ttulo Programacin orientada a objetos. Un enfoque evolutivo.

860

Programacin

en Turbo/Borland

Pascal 7

Algol

Tipos abstractos

de datos y objetos

861

La evolucin de los lenguajes orientados a objetos se muestra en la Figura 22.8, en la


que se aprecia el tronco c o m n a todos los lenguajes modernos Algol y las tres lneas
fundamentales: enfoque en Pascal (Ada, Object Pascal), enfoque puro de orientacin a
objetos (Simula/Smalltalk) y enfoque en C (Objective-C, C++, Java y Ada-95).

22.11.1.

Clasificacin de los lenguajes orientados a objetos

Existen varias clasificaciones de lenguajes de programacin orientados a objetos, atendiendo a criterios de construccin o caractersticas especficas de los mismos. U n a clasificacin ampliamente aceptada y difundida es la dada por Wegner y que se ilustra en la
Figura 22.9 8 .
La clasificacin de Wegner divide los lenguajes en tres categoras:
1.

Figura 22.8.

Evolucin de los lenguajes orientados a objetos.

El siguiente lenguaje orientado a objetos, y seguramente el ms popular desde un enfoque conceptual exclusivamente de objetos, es Smalltalk, cuya primera versin comercial se desarroll en 1976, y en 1980 se populariz con la aparicin de Smalltalk-80. Posteriormente, se ha popularizado gracias al desarrollo de Smalltalk/V de la casa Digital Y,
que recientemente se ha implementado bajo entorno Windows. El lenguaje se caracteriza por soportar todas las propiedades fundamentales de la orientacin a objetos, dentro
de un entorno integrado de desarrollo, con interfaz interactivo de usuario basado en
mens.
Entre los lenguajes orientados a objetos que se han desarrollado a partir de los ochenta,
destacan extensiones de lenguajes tradicionales tales como C++ y Objective-C (extensiones de C), Modula-2 y Object Pascal (extensin de Pascal) y recientemente Object Cobol,
que a lo largo de 1994 han aparecido sus primeras versiones comerciales.
Otro lenguaje orientado a objetos puros es Eiffel, creado por Bertrand Meyer y que
soporta todas las propiedades fundamentales de objetos. Hasta ahora no ha adquirido
popularidad ms que en ambientes universitarios y de investigacin.
Ada ha sido, tambin, un lenguaje e n este caso basado en objetos q u e soporta la
mayora de las propiedades orientadas a objetos. Sin embargo, la nueva versin Ada-95
ya soporta herencia y polimorfismo.
En los ltimos aos h a n aparecido lenguajes con soporte de objetos q u e cada vez se
estn popularizando ms: Clipper, Visual BASIC, Java, etc.
D e cualquier forma, existe un rey actual en los lenguajes orientados a objetos: C++.
La normalizacin por ANSI y A T & T de la versin 3.0 y las numerosas versiones de diferentes fabricantes, tales como Borland C + + 4.0/4.5/5, Turbo C++ 3.0/3.1 y 4.5, Visual
C++ 4.1/4.2/5, Symantec 6.0/7.0, etc., hacen que en la segunda mitad de los noventa
ser el lenguaje orientado a objetos ms popular y utilizado en el m u n d o de la programacin. A C++ se le ha unido recientemente Java, u n lenguaje evolucin de C++, creado
especficamente para programar en Internet pero que puede ser utilizado t a m b i n en
aplicaciones de propsito general.

2.

3.

Lenguajes basados en objetos que soportan objetos. Es decir, disponen de componentes caracterizados por un conjunto de operaciones (comportamiento) y u n
estado.
Lenguajes basados en clases que implican objetos y clases. Es decir, disponen de
componentes tipo clase con operaciones y estado comn. U n a clase de un objeto
se construye con u n interfaz que especifica las operaciones posibles y un
cuerpo que implementa dichas operaciones.
Lenguajes orientados a objetos que adems de objetos y clases ofrecen mecanism o s de herencia entre clases. Esto es, la posibilidad de derivar operaciones y atributos de una clase (superclase) a sus subclases.

La definicin anterior, pese a su antigedad sigue teniendo vigencia. Existen otras


clasificaciones similares, pero con la inclusin de la propiedad de polimorfismo en la categora 3, c o m o requisito para ser lenguaje orientado a objetos.
D e cualquier forma, hoy da es posible ampliar esa clasificacin de acuerdo a criterios
puramente tcnicos y hacer u n a nueva clasificacin de la categora 3:

Figura 2 2 . 9 .

Wegner, Peter (1987): Dimensions


Notices, 1987.

Clasificacin de lenguajes OO de Wegner.

of Object-Based Languajes Design. Nmero especial de SIGPLAN

862

Programacin en Turbo/Borland

3.1.

Tipos abstractos

Pascal 7

Lenguajes orientados a objetos puros. Soportan en su totalidad el paradigma de


orientacin a objetos:
Smalltalk

3.2.

Eiffel

Simula

Lenguajes orientados a objetos hbridos. Soportan en su totalidad el paradigma


de orientacin a objetos sobre un ncleo de lenguaje hbrido.
C++ (extensin de C: Borland C++, Microsoft C++, Turbo C++, Visual C++,
S y m a n t e c , W a t c o m , ...)

Objective-C (extensin de C)
Object COBOL (extensin de COBOL)
Object Pascal (extensin de Pascal. Turbo/Borland Pascal)
Visual Object (extensin de-Clipper)
Delphi (extensin de T u r b o Pascal 7.0)
Java (extensin mejorada de C++)
Ada-95 (extensin de Ada-83)
De cualquier forma, Meyer. creador del lenguaje Eiffel, proporciona unos criterios
para considerar la bondad 9 de un lenguaje orientado a objetos, cuyos complementos
configuran, de hecho, una nueva clasificacin. En este sentido, los criterios recogidos en
[Meyer 88] son los siguientes:
1 La modularizacin de los sistemas ha de realizarse mediante estructuras de datos
apropiadas.
2. Los objetos se describen c o m o la implementacin de tipos abstractos de datos.
3. La memoria se gestiona (administra) automticamente.
4. Existe una correspondencia entre tipos de datos no elementales y clases.
5. Las clases se pueden definir como extensiones o restricciones de otras clases ya
existentes mediante herencia.
6. Soportan polimorfismo y ligadura dinmica.
7. Existe herencia mltiple y repetida.
De acuerdo con los criterios de Meyer recogemos en la Tabla 22.3. el cumplimiento
de dichos criterios en los lenguajes O O y basados en objetos ms populares.
Tabla 2 2 . 3 .

Criterios de Meyer en lenguajes OO y basados en objetos

Criterios
1. Modularizacin
Tipos abstractos de datos
Gestin automtica de memoria
Slo clases
Herencia
Polimorfismo (ligadura dinmica)
Herencia mltiple y repetida

9
3.
4.
5.
6.
7.

Ada
83

Ada
95

C++

S
Si

S
S

S
S

S
S

S
S

S
S
No
No
No

S
S
S
SiNo

En parte
En parte
S
S
S

Si
S
S
S
S

S
SiS
S
I\o

Meyer, Bertrand: Object Oriented Software Construction.

Eiffel Smalltalk

Englewood ClifFs NJ, Prentice-Hall. 1988.

22.1 2.

de datos y objetos

863

DESARROLLO TRADICIONAL FRENTE A ORIENTADO


A OBJETOS

El sistema tradicional del desarrollo del software para un determinado sistema, es la subdivisin del m i s m o en mdulos, a la cual deben aplicarse criterios especficos de descomposicin, los cuales se incluyen en metodologas de diseo. Estos mdulos se refieren a
la fase de construccin de un programa, que en el modelo clsico, sigue a la definicin
de los requisitos (fase de anlisis).
El modelo clsico del ciclo de vida del software no es el nico modelo posible, dado
que es posible desarrollar cdigo de un m o d o evolutivo, por refinamiento y prototipos
sucesivos. Existen numerosos lenguajes de programacin y metodologas que se han desarrollado en paralelo a los mismos, aunque, normalmente, con independencia de ellos.
En esta seccin nos centraremos en la metodologa ms utilizada denominada desarrollo estructurado, que se apoya esencialmente en el diseo descendente y en la programacin estructurada.
La programacin estructurada es un estilo disciplinado de programacin que se sigue
en los lenguajes procedimentales (por procedimientos) tales como F O R T R A N BASIC
COBOL, C y C++.
Las metodologas diseo descendente (o descomposicin funcional) se centran en
operaciones y tienden a descuidar la importancia de las estructuras de datos. Se basan en
la clebre ecuacin de Wirth:
Datos + Algoritmos

= Programas

La idea clave del diseo descendente es romper un programa grande en tareas ms


pequeas, ms manejables. Si una de estas tareas es demasiado grande, se divide en tareas ms pequeas. Se contina con este proceso hasta que el programa se compartimentaliza en mdulos ms pequeos y que se programan fcilmente. Los subprogramas facilitan el e n f o q u e e s t r u c t u r a d o , y en el caso de lenguajes c o m o C, estas unidades de
programas, llamadas funciones representan las citadas tareas o mdulos individuales. Las
tcnicas de programacin estructuradas, reflejan, en esencia, un m o d o de resolver un
programa en trminos de las acciones que realiza.
Para c o m p r e n d e r m e j o r las relaciones entre los algoritmos (funciones) y los datos,
consideremos una comparacin con el lenguaje natural (por ejemplo Espaol o Ingls),
que se compone de muchos elementos, pero que reflejar poca expresividad si slo se
utilizan nombres y verbos. U n a metodologa que se basa slo en datos o slo en procedimientos es similar a un lenguaje (idnea) en el que slo se utilizan nombres o verbos.
Slo enlazando nombres o verbos correctos (siguiendo las reglas semnticas), las expresiones tomarn formas inteligibles y su proceso ser ms fcil.
Las metodologas tradicionales se vuelven poco prcticas cuando han de aplicarse a
proyectos de gran t a m a o . El diseo orientado a objetos se apoya en lenguajes orientados a objetos, que se sustentan, fundamentalmente, en los tipos de datos y operaciones
que se pueden realizar sobre los tipos de datos. Los datos no fluyen abiertamente en un
sistema, como ocurre en las tcnicas estructuradas, sino que estn protegidos de modificaciones accidentales. En programacin orientada a objetos, lps mensajes (en vez de los
datos) se mueven por el sistema. En lugar del enfoque funcional (invocar una funcin
con unos datos), en un lenguaje orientado a objetos, se enva un mensaje a un objeto.

864

Tipos abstractos

Programacin en Turbo/Borland PascaI 7

De acuerdo con Meyer, el diseo orientado a objetos es el mtodo que conduce a


arquitecturas de software basadas en objetos que cada sistema o subsistema evala.
Recordemos Qu son los objetosl U n objeto es una entidad cuyo comportamiento
se caracteriza por las acciones que realiza. Con ms precisin/un objeto se d e n e como
una entidad caracterizada por un estado; su comportamiento se define por las operaciones que puede realizar; es una instancia de u n a clase; se identifica por un nombre; tiene
una visibilidad limitada para otros objetos; se define el objeto mediante su especificacin
y su implementacin.
U n a definicin muy elaborada se debe a Meyer Diseo orientado a objetos, es la
construccin de sistemas de software como colecciones estructuradas de implementaciones de tipos de datos abstractos.
La construccin de un sistema se suele realizar mediante el ensamblado ascendente
(abajo-arriba) de clases preexistentes. Las clases de un sistema pueden tener entre s, como
se ver en los siguientes captulos, relaciones de uso (cliente), relaciones de derivacin
{herencia) o relaciones de agregacin (composicin) o, incluso slo relaciones de asociacin. As, por ejemplo, con una relacin de cliente, una clase puede utilizar los objetos
de otra clase; con una relacin de herencia, u n a clase puede heredar o derivar sus propiedades definidas en otra clase.
El hardware se ensambla a partir de componentes electrnicos, tales c o m o circuitos
integrados (chips), que se pueden utilizar repetidamente para disear y construir conjuntos mucho ms grandes, que son totalmente reutilizables. La calidad de cada nivel de
diseo se asegura mediante c o m p o n e n t e s del sistema que h a n sido p r o b a d o s previamente a su utilizacin. El ensamblado de c o m p o n e n t e s electrnicos se garantiza mediante interfaces adecuados.
Estos conceptos se aplican tambin con tecnologas de objetos. Las clases (tipos de
objetos) son como los chips de hardware, Cox les llam chips de software, que no slo se
pueden enlazar (ensamblar) entre s, sino que tambin se pueden reutilizar (volver a utilizar). Las clases se agruparn, normalmente, en bibliotecas de clases, que son componentes reutilizables, fcilmente legibles.
En la actualidad, existen gran cantidad de software convencional, en su mayora escrito normalmente para resolver problemas especficos; por esta razn, a veces es ms
fcil escribir nuevos sistemas que convertir los existentes.
Los objetos al reflejar entidades del m u n d o real permiten desarrollar aplicaciones
creando nuevas clases y ensamblndolas con otras ya existentes. Normalmente, los desarrolladores experimentados gastan un porcentaje alto de su tiempo (20 al 40 %) en crear
nuevas clases y el t i e m p o restante en e n s a m b l a r c o m p o n e n t e s probados de sistemas,
construyendo sistemas potentes y fiables.

22.1 3.

Figura 2 2 . 1 0 .

de datos y objetos

El objeto como caja negra.

turas de datos internos y mtodos se pueden refinar sin afectar a otras partes de un sistema (Figura 22.10.)
Los sistemas tradicionales, por otra parte, presentan, con frecuencia, efectos laterales
no deseados. Las tecnologas de objetos ayudan a los desarrolladores a tratar la complejidad en el desarrollo del sistema.
La productividad del desarrollador se puede mejorar debido a que las clases de objetos se pueden hacer reutilizables de m o d o que cada subclase o instancia de u n objeto
se puede utilizar el mismo cdigo de programa para la clase. Por otra parte, esta productividad tambin a u m e n t a debido a que existe una asociacin ms natural entre objetos
del sistema y objetos del m u n d o real.
Taylor 10 considera que los beneficios del modelado y desarrollo de objetos son:
1.
2.
3.
4.
5.
6.
7.

Desarrollo ms rpido.
Calidad ms alta.
Mantenimiento ms fcil.
Coste reducido.
Incremento en escalabilidad.
Mejores estructuras de informacin.
Incremento de adaptabilidad.

Sin embargo, Taylor 11 tambin considera algunos inconvenientes, aunque algunos


de ellos ya han sido superados o al menos reducido su impacto.

BENEFICIOS DE LAS TECNOLOGIAS DE OBJETOS

U n a pregunta que hoy da se hacen muchos informticos, es: Cul es la razn para introducir mtodos de TO en los procesos de desarrollo? La principal razn, sin lugar a
dudas, son los beneficios de dichas TO: a u m e n t o de la fiabilidad y productividad del desarrollador. La fiabilidad se puede mejorar debido a que cada objeto es simplemente una
caja negra con respecto a objetos externos con los que debe comunicarse. Las estruc-

865

10

"

Taylor, David A.: Object-Oriented


Ib id., pp. 108-113.

Technology Reading, MA: Addison-Wesley, 1992, pp. 103-107.

866

Programacin en Turbo/Borland

Pascal 7

Reutilizacin. Las clases se construyen a partir de otras clases.


Sistemas ms fiables.
Proceso de desarrollo ms rpido.
Desarrollo ms flexible.
Modelos que reflejan mejor la realidad.
Mejor independencia e interoperatividad de la tecnologa.
Bibliotecas de clases comerciales disponibles.
Mejor relacin con los clientes.
Mejora la calidad del producto software terminado.

Figura 2 2 . 1 2 .

1.
2.
3.
4.
5.
6.
7.

Beneficios de las tecnologas de objetos.

Inmadurez de la tecnologa (hoy da ya no se puede considerar as).


Necesidades de estndares (el grupo O M G es una realidad).
Necesidad de mejores herramientas.
Velocidad de ej ecuci n.
Disponibilidad de personal cualificado.
Coste de conversin.
Soporte para modularidad a gran escala.

Tipos abstractos

Este captulo examina el concepto fundamental de la orientacin a objetos, el tipo abstracto de


datos. Los tipos abstractos de datos (TAD) describen un conjunto de objetos con la misma representacin y comportamiento. Los tipos abstractos de datos representan una separacin clara entre
la interfaz externa de un tipo de datos y su implementacin interna. La implementacin de un tipo
abstracto de datos est oculta. Por consiguiente, se pueden utilizar implementaciones alternativas
para el mismo tipo abstracto de dato sin cambiar su interfaz.
En la mayora de los lenguajes de programacin orientados a objetos, los tipos abstractos de
datos se implementan mediante clases (unidades en Pascal, mdulos en Modula-2, paquetes en
Ada).
Se analizan y describen las implementaciones de tipo abstractos de datos en los lenguajes Turbo/
Borland Pascal, Modula-2, Ada, C y C++.
En este captulo se considera tambin una introduccin a los mtodos de desarrollo orientados
a objetos. Se comienza con una breve revisin de los problemas encontrados en el desarrollo tradicional de software, que condujeron a la crisis del software y que se han mantenido hasta los aos
actuales. El nuevo modelo de programacin se apoya esencialmente en el concepto de objetos.
La orientacin a objetos modela el mundo real de un modo ms fcil a la perspectiva del usuario que el modelo tradicional. La orientacin a objetos proporciona mejores tcnicas y paradigmas
para construir componentes de software reutilizables y bibliotecas ampliables de mdulos de software. Esta caracterstica mejora la extensibilidad de los programas desarrollados a travs de metodologas de orientacin orientada a objetos. Los usuarios finales, programadores de sistemas y desarrolladores de aplicaciones, se benefician de las tecnologas de modelado y programacin
orientadas a objetos.

867

Los conceptos fundamentales de orientacin a objetos son tipos abstractos de datos, herencia c
identidad de los objetos. Un tipo abstracto de datos describe una coleccin con la misma estructura y comportamiento. Los tipos abstractos de datos extienden la nocin de tipos de datos ocultando la implementacin de operaciones definidas por el usuario (mensajes) asociados con los tipos de datos. Los tipos abstractos de datos se implementan a travs de clases. Las clases pueden
heredar unas de otras. Mediante la herencia, se pueden construir nuevos mdulos de software (tales como clases) en la parte superior de una jerarqua existente de mdulos. La herencia permite la
comparticin de cdigo (y por consiguiente reutilizacin) entre nodulos de software. La identidad
es la propiedad de un objeto que diferencia cada objeto de los restantes. Con la identidad de un
objeto, los objetos pueden contener o referirse a otros objetos. La identidad del objeto organiza los
objetos del espacio del objeto manipulado por un programa orientado a objetos.
Este captulo examina el impacto de las tecnologas orientadas a objetos en lenguajes de programacin, as como los beneficios que producen en el desarrollo de software.
Los conceptos claves de la programacin orientada a objetos se examinan en el captulo; si no
ha ledo hasta ahora nada sobre tecnologas de objetos, deber examinan con detenimiento todos
los elementos conceptuales del captulo, que se ampliarn en detalle en captulos posteriores; si ya
tiene conocimientos bsicos de la orientacin a objetos, en este captulo debe consolidarlos y prepararle para una eficiente lectura de los siguientes captulos.

EJERCICIOS
22.1. Construir un tipo abstracto lista enlazada de nodos que contienen enteros

La Figura 22.12 muestra los beneficios genricos de las tecnologas de objetos.

RESUMEN

de datos y objetos

25

|
i

45

50

15

22.2. Disear un tipo abstracto de datos pila de nmeros enteros y que al menos soporte las siguientes operaciones:
Borrar:
Copiar:
Meter:
Sacar:
Longitud:
Llena:
Vaca:
Igual:

Eliminar todos los nmeros de la pila.


Hace una copia de la pila actual.
Aadir un nuevo elemento en la cima de la pila.
Quitar un elemento de la pila.
Devuelve un nmero natural igual al nmero de objetos de la pila.
Devuelve verdadero si la pila est llena (no existe espacio libre en la pila).
Devuelve verdadero si la pila est vaca y falso en caso contrario.
Devuelve verdadero si existen dos pilas que tienen la misma profundidad y las
dos secuencias de nmeros son iguales cuando se comparan elemento a elemento
desde sus respectivas cimas de la pila; falso en caso contrario.

22.3. Crear un tipo abstracto Cola que sirva para implementar una estructura de datos cola.
22.4. Crear un TAD para representar:
Un vector (representacin grfica y-operaciones).
Una matriz y sus diferentes operaciones.
Un nmero complejo y sus diferentes operaciones.
22.5. Crear un TAD que represente un dato tipo cadena istring) y sus diversas operaciones: clculo,
longitud, buscar posicin de un carcter dado, concatenar cadenas, extraer una subcadena
etctera.

Programacin orientada a objetos: modelo objeto y relaciones

un programa no significa que est programado en un modo orientado


a objetos. Es el sistema en el cual los objetos se nterconectan y comunican entre s, lo que cuenta.
En el curso nos limitaremos al campo de la programacin, pero es
tambin posible hablar de sistemas de administracin de bases de
datos orientadas a objetos, sistemas operativos orientados a objetos, interfaces de usuarios orientados a objetos, etc.

CAPITULO

PROGRAMACION ORIENTADA
A OBJETOS: MODELO OBJETO
Y RELACIONES
CONTENIDO
23.1.
23.2.
23.3.
23.4.
23.5.
23.6.
23.7.
23.8.
23.9.
23.10.

Programacin estructurada
Qu es programacin orientada a objetos?
Un mundo de objetos: notaciones grficas
Comunicaciones entre objetos: los mensajes
Estructura interna de un objeto
Estructura interna de una clase
Herencia.
Anulacin/Sustitucin
Sobrecarga
Ligadura dinmica

869

23.1.

PROGRAMACION ESTRUCTURADA

La programacin estructurada que se emplea desde el principio de la dcada de los setenta es u n o de los mtodos ms utilizados en el c a m p o de la programacin.
La tcnica descendente o el refinamiento sucesivo comienza descomponiendo el programa en piezas manejables ms pequeas conocidas como funciones (subrutinas, subprogramas o procedimientos) que realizan tareas menos complejas. U n programa estructurado se construye rompiendo el programa en funciones. Esta divisin permite escribir
cdigo ms claro y mantener el control sobre cada funcin.
U n concepto importante se introdujo con la programacin estructurada y ya comentada anteriormente: la abstraccin. Abstraccin se puede definir como la capacidad para
examinar algo sin preocuparse de sus datos internos. En un programa estructurado, es
suficiente conocer que un procedimiento dado realiza una tarea especfica. El cmo se
realiza esta tarea no es importante, sino conocer cmo se llama correctamente la funcin
y lo que hace.

RESUMEN

La dcada de los noventa ser, sin lugar a dudas, la dcada de la programacin orientada a objetos. Como Rentsch predijo /a programacin orientada a objetos ser en los ochenta, lo que la programacin
estructurada fue en la dcada de los setenta. En la actualidad la programacin orientada a objetos se ha hecho excesivamente popular.
Escritores y diseadores de software, junto a compaas importantes en el campo del software, se dedican de modo continuo a producir compiladores de lenguajes, sistemas operativos, bases de datos, etc., orientados a objetos.
Qu es la programacin orientada a objetos? Por qu es tan popular? La programacin orientada a objetos es algo ms que una coleccin de lenguajes de programacin tales como Smalltalk, Object
Pascal, C++, etc. Se podra decir que este tipo de programacin es
un nuevo medio de pensar sobre lo que significa computar (computarizar), es decir cmo se puede estructurar informacin en un
computador.
La programacin orientada a objetos es un importante conjunto
de tcnicas que se pueden utilizar para hacer el desarrollo de programas ms eficientes a la par que mejora la fiabilidad de los programas
de computadora. En la programacin orientada a objetos, los objetos
son los elementos principales de construccin. Sin embargo, la simple comprensin de lo que es un objeto o bien el uso de objetos en
868

Figura 2 3 . 1 .

Programa estructurado.

A medida que la complejidad de un programa crece, tambin crece su independencia


de los tipos de datos fundamentales que procesa. En un programa estructurado las estructuras de datos de un programa son tan importantes como las operaciones realizadas
sobre ellas. Esto se hace ms evidente a medida que crece un programa en t a m a o . Los
tipos de datos se procesan en muchas funciones dentro de un programa estructurado y
cuando se producen cambios en esos tipos de datos, las modificaciones se deben hacer
en cada funcin que acta sobre esos tipos de datos dentro del programa. Esta tarea puede

870

Programacin orientada a objetos: modelo objeto y relaciones

Programacin en Turbo/Borland Pascal 7

ser frustrante y consumir considerablemente tiempo en programas con millones de lneas de cdigo y centenares de funciones.
En un programa estructurado los datos locales se ocultan dentro de funciones y los
datos compartidos se pasan como argumentos (Figura 23.2).

Accesibles, por cualquier funcin

Variables locales

Funcin A

Funcin I

Accesible slo por funcin A

Accesible slo por funcin B

Figura 2 3 . 2 .

Variables globales y locales.

Otro problema es que, dado que muchas funciones acceden a los mismos datos, el
medio en que se almacenan los datos se hace ms crtico. La disposicin de los datos no
se pueden cambiar sin modificar todas las funciones que acceden a ellos. Si se aaden
nuevos datos, por ejemplo, se necesitarn modificar todas las funciones que acceden a
los datos de m o d o que ellos pueden tambin acceder a esos elementos.
Los programas basados en funciones son difciles de disear. El problema es que sus
componentes principales funciones y estructuras de datos no modelan bien el m u n d o
real. Por ejemplo, supongamos que est escribiendo un programa para crear los elementos de un interfaz grfico de usuario; mens, ventanas, cuadros de dilogo, etc. Qu
funciones se necesitarn? Qu estructuras de datos? La solucin sera ms aproximada
si hubiera una correspondencia lo ms estrecha posible entre los m e n s y ventanas y sus
correspondientes elementos de programa.

23.1.1.

871

Desventajas de la programacin estructurada

Adems de los inconvenientes citados anteriormente, comentaremos algunos otros que


influyen considerablemente en el diseo.
Cuando diferentes programadores trabajan en equipo para disear una aplicacin, a
cada programador se le asigna la construccin de un conjunto especfico de funciones y
tipos de datos. D a d o que los diferentes programadores m a n i p u l a n funciones independientes que relacionan a tipos de datos compartidos mut uament e, los cambios que un
programador hace a los datos se deben reflejar en el trabajo del resto del equipo. A u n q u e
los programas estructurados son ms fciles de disear en grupo, los errores en c o m u nicacin entre miembros de equipos pueden conducir a gastar tiempo en reescritura.
Por otra parte los lenguajes tradicionales presentan una dificultad aadida: la creacin de nuevos tipos de datos. Los lenguajes de programacin tpicamente tienen tipos
de datos incorporados: enteros, c o m a flotante, caracteres, etc. Cmo inventar sus propios tipos de datos? Los tipos definidos por el usuario y la facilidad para crear tipos abstractos de datos en determinados lenguajes, es la propiedad conocida extensibilidad. Los
lenguajes tradicionales no son n o r m a l m e n t e extensibles y eso hace que los programas
tradicionales sean ms complejos de escribir y mantener.
En resumen, con los mtodos tradicionales un programa se divide en dos componentes: procedimientos y datos. Cada procedimiento acta como una caja negra. Esto es, es
un componente que realiza una tarea especfica tal como convertir un c o n j u n t o de nmeros o visualizar una ventana. Este procedimiento permite e m p a q u e t a r cdigo programa en funciones, pero qu sucede con los datos? Las estructuras de datos utilizados
en programas son, con frecuencia, globales o se pasan explcitamente con parmetros.

23.2.

QUE ES PROGRAMACION ORIENTADA A OBJETOS?

Grady Booch, autor del mtodo de diseo orientado a objetos, define la programacin
orientada a objetos (POO) como:
un m t o d o de i m p l e m e n t a c i n en el que los programas se organizan c o m o colecciones
cooperativas de objetos, cada u n o de los cuales representan u n a instancia de alguna clase,
y cuyas clases son todos m i e m b r o s de u n a jerarqua de clases u n i d o s m e d i a n t e relaciones
de herencia '.

Existen tres importantes partes en la definicin: la programacin orientada a objetos


1) utiliza objetos, no algortmicos, c o m o bloques de construccin lgicos (jerarqua de
objetos)-, 2) cada objeto es una instancia de una clase, y 3) las clases se relacionan unas
con otras por medio de relaciones de herencia.
Un programa puede parecer orientado a objetos, pero si cualquiera de estos elementos no existe, no es un programa orientado a objetos. Especficamente la programacin
sin herencia es distinta de la programacin orientada a objetos; se d e n o m i n a programacin con tipos abstractos de datos o programacin basada en objetos.
' Booch, Grady: Anlisis y diseo orientado a objetos con aplicaciones, 2.a edicin. Addison-Wesley/Daz
de Santos, 1995.

872

Programacin en Turbo/Borland Pascal 7

Programacin orientada a objetos; modelo objeto y relaciones

El concepto de objeto, al igual que los tipos abstractos de datos o tipos definidos por
el usuario, es una coleccin de elementos de datos, j u n t o con las funciones asociadas utilizadas para operar sobre esos datos. Sin embargo, la potencia real de los objetos reside
en el modo en que los objetos pueden definir otros objetos. Este proceso se d e n o m i n a
herencia: es el mecanismo que ayuda a construir programas que se modifican fcilmente
y se adaptan a aplicaciones diferentes.
Los conceptos fundamentales de programacin son: objetos, clases, herencia, mensajes y polimorfismo.
Los programas orientados a objetos constan de objetos. Los objetos de un programa se comunican con cada uno de los restantes pasando mensajes.

23.2.1.

El objeto

La idea fundamental en los lenguajes orientados a objetos es combinar en u n a sola unidad, datos y funciones que operan sobre esos datos. T al unidad se denomina objeto. Por
consiguiente, dentro de los objetos residen los datos de los lenguajes de programacin
tradicionales, tales como nmeros, arrays, cadenas y registros, as como funciones o subrutinas que operan sobre ellos.
Las funciones dentro del objeto (funciones miembro en C++, mtodos en Object-Pascal y Smalltalk) son el nico medio de acceder a los datos privados de un objeto. Si se
desea leer un elemento datos de un objeto se llama a la funcin miembro del objeto. Se
lee el elemento y se devuelve el valor. N o se puede acceder a los datos directamente. Los
datos estn ocultos y eso asegura que no se pueden modificar accidentalmente por funciones externas al objeto.
Funciones

externas

Funcin

Procedimientos

externos

(^Funcin miembro^)

23.2.2.

Ejemplos de objetos

Qu clase de cosas pueden ser objetos en un programa orientado a objetos? La respuesta


est slo limitada a su imaginacin. Algunos ejemplos tpicos pueden ser:
Objetos fsicos
Aviones en un sistema de control de trfico areo.
Automviles en un sistema de control de trfico terrestre.
Casas.
Elementos de interfaces grficos de usuario
Ventanas.
Mens.
Objetos grficos (cuadrados, tringulos, etc.).
Teclado.
Cuadros de dilogo.
Ratn.
Animales
Animales vertebrados.
Animales invertebrados.
Pescados.

Datos

(^Datre^)

^ ( ^ F u c i n miembro^)
Funcin
^ ( ^ F u c i n miembro^)

(^Datos^)

Pblico

Privado

Figura 23.4.

El modelo objeto.

Los datos y las funciones (procedimientos en Object-Pascal) asociados se dicen que


estn encapsulados en una nica entidad o mdulo. La encapsulacin de datos y ocultacin de datos son trminos importantes en la descripcin de lenguajes orientados a objetos.
Si se desea modificar los datos de un objeto, se conoce exactamente cules son las
funciones que interactan con el mismo. Ninguna otra funcin puede acceder a los datos. Esta caracterstica simplifica la escritura depuracin y mantenimiento del programa.

873

(a)

(b)

Nombre
del objeto
Nombre
Atributos
Mtodos

(c)
Figura 2 3 . 5 .

Datos
y operaciones
(d)

Notaciones grficas de objetos: (a) Taylor; (b) iourdon/Coad; (c) OMT;


(d) Booch.

874

Programacin

en Turbo/Borland Pascal 7

Programacin

Tipos de datos definidos por el usuario


Datos complejos.
Puntos de un sistema de coordenadas.

orientada a objetos:

Seccin
privada

j
i

Alimentos
Carnes.
Frutas.
Pescados.
Verduras.
Pasteles.

Figura 23.7.

modelo objeto y relaciones

875

Informacin
y
operaciones

Encapsulamiento de datos.

Interfaz pblico

Un objeto es una entidad que contiene los atributos que describen el estado de u n
objeto del m u n d o real y las acciones que se asocian con el objeto del m u n d o real. Se
designa por un nombre o identificador del objeto.
Dentro del contexto de un lenguaje orientado a objetos (LOO), un objeto encapsula
datos y los procedimientos/funciones (mtodos) que m a n e j a n esos datos. La notacin
grfica de un objeto vara de unas metodologas a otras.
Consideremos un ejemplo de u n coche vendido por un distribuidor de coches. El
identificador del objeto es Cochel. Los atributos asociados pueden ser: nmero de matrcula, fabricante, precio.compra, precio^actual, fecha_compra,... El objeto Cochel se muestra en la Figura 23.6.

Representacin
privada

Figura 2 3 . 8 .

23.2.3.

Interfaz pblico de un objeto.

Mtodos y mensajes

Coche 1
Matrcula
Marca
Precio
Ao compra
Calcular_Precio_Actual

Figura 2 3 . 6 .

Atributos:
Mtodos:

El o b j e t o Cochel.

Un programa orientado a objetos tpicamente consiste en u n n m e r o de objetos, que se


comunican unos con otros llamando a funciones miembros. Las funciones miembro (en
C++) se denominan mtodos en otros lenguajes orientados a objetos (tales como Smalltalk y Turbo/Borland Pascal 7.0).
Los procedimientos y funciones, denominados mtodos o funciones miembro residen
en el objeto y determinan cmo actan los objetos cuando reciben un mensaje. U n mensaje es la accin que hace un objeto. Un mtodo es el procedimiento o funcin que se
invoca para actuar sobre un objeto. U n mtodo especifica cmo se ejecuta un mensaje.
El conjunto de mensajes a los cuales puede responder un objeto se d e n o m i n a protocolo del objeto. El protocolo de un icono puede constar de mensajes invocados por el
clic de u n b o t n del ratn cuando el usuario localiza u n puntero sobre u n icono.
Al igual que en las cajas negras, la estructura interna de u n objeto est oculta a los
usuarios y programadores. Los mensajes que recibe el objeto son los nicos conductos

Datos o variables que caracterizan el estado de u n objeto.


Procedimientos o acciones que cambian el estado de u n objeto.

El objeto retiene cierta informacin y conoce c m o realizar ciertas operaciones. La


encapsulacin de operaciones e informacin es muy importante. Los mtodos de un objeto slo pueden manipular directamente datos asociados con ese objeto. Dicha encapsulacin es la propiedad que permite incluir en una sola entidad (el mdulo u objeto) la
informacin (los datos o atributos) y las operaciones (los mtodos o funciones) que operan sobre esa informacin.
Los objetos tienen un interfaz pblico y una representacin privada, q u e permiten
ocultar la informacin que se desee al exterior.

Objeto

Llegada
de mensajes'

Datos

^LZ]
Figura 23.9.

Mtodos

Mtodos y mensajes de uri objeto.

876

Programacin en Turbo/Borland Pascal 7

que conectan el objeto al mundo externo. Los datos de un objeto estn disponibles para
manipulacin slo de los mtodos del propio objeto.
Cuando se ejecuta un programa orientado a objetos, ocurren tres sucesos. Primero,
los objetos se crean a medida que se necesita. Segundo, los mensajes se mueven de un
objeto a otro (o desde el usuario a un objeto) a medida que el programa procesa informacin internamente o responde a la entrada del usuario. Por ello, cuando los objetos
ya no son necesarios, se borran y se libera la memoria.
La Figura 23.10. representa un diagrama orientado a objetos.

23.2.4.

La clase

Una clase es la descripcin de un conjunto de objetos; consta de mtodos y datos que


resumen caractersticas comunes de un conjunto de objetos. Se puede definir muchos
objetos de la misma clase. Dicho de otro modo, una clase es la declaracin de un tipo
objeto.
Las clases son similares a los tipos de datos y equivalen a modelos o plantillas que
describen cmo se construyen ciertos tipos de objetos. Cada vez que se construye un objeto a partir de una clase, estamos creando lo que se llama una instancia de esa clase.
Por consiguiente, los objetos no son ms que instancias de una clase-. Una instancia es
una variable de tipo objeto. En general instancia de una clase y objeto son trminos intercambiables.

l'n ohjeUi o una in.sUncia de una clas.c

Programacin orientada a objetos: modelo objeto y relaciones

877

Cada vez que se construye un objeto de una clase, se crea una instancia de esa clase.
Los objetos se crean cuando un mensaje de peticin de creacin se recibe por la clase
base.

23.3.

UN MUNDO DE OBJETOS: NOTACIONES GRAFICAS

Una de las ventajas ineludibles de la orientacin a objetos es la posibilidad de reflejar


sucesos del mundo real mediante tipos abstractos de datos extensibles a objetos. As pues,
supongamos el fenmeno corriente de la conduccin de una bicicleta, un automvil, una
motocicleta o un avin: usted conoce que esos vehculos comparten muchas caractersticas mientras que difieren en otros. Por ejemplo, cualquier vehculo puede ser conducido: aunque los mecanismos de conduccin difieren de unos a otros, se puede generalizar el fenmeno-de la conduccin. En esta consideracin, enfrentados con un nuevo
tipo de vehculo (por ejemplo una nave espacial), se puede suponer que existe algn medio para conducirla. Se puede decir que vehculo es un tipo base y nave espacial es un
tipo derivado de ella.
En consecuencia, se puede crear un tipo base que representa el comportamiento y
caractersticas comunes a los tipos derivados de este tipo base.
Un objeto es en realidad una clase especial de variable de un nuevo tipo que algn
programador ha creado. Los tipos objeto definidos por el usuario se comportan como
tipos incorporados que tienen datos internos y operaciones externas. Por ejemplo, un
nmero en coma flotante tiene un exponente, mantisa y bit de signo y conoce cmo sumarse a s mismo con otro nmero de coma flotante.
Los tipos objeto definidos por el usuario contienen datos definidos por el usuario (caractersticas) y operaciones (comportamiento). Las operaciones definidas por el usuario
se denominan mtodos. Para llamar a uno de estos mtodos, se hace una peticin al objeto: esta accin se conoce como enviar un mensaje al objeto. Por ejemplo, para detener un objeto automvil, se enva un mensaje de parada (stop). Obsrvese que esta
operacin se basa en la nocin de encapsulacin (encapsulamiento): se indica al objeto
lo que ha de hacer, pero los detalles de cmo funciona se han encapsulado (ocultado).

23.3.1.

Definicin de objetos 2

Un objeto (desde el punto de vista formal se debera hablar de clase), como ya se ha comentado, es una abstraccin de cosas (entidades) del mundo real, tales que:
Todas las cosas del mundo real dentro de un conjunto denominadas instancias tienen las mismas caractersticas;
Todas las instancias siguen las mismas reglas.

2
Cuando se habla se m o d o genrico, en realidad se debera hablar de CLASES, dado que la clase en el tipo
de dato y objeto es slo u n a instancia, ejemplar o caso de la clase. Aqu mantenemos el trmino objeto por
conservar la rigurosidad de la definicin orientado a objetos, aunque en realidad la definicin desde el p u n t o
de vista tcnico sera la clase.

878

Programacin en Turbo/Borland Pascal 7

Cada objeto consta de:


Estado (atributos);
Operaciones o comportamiento (mtodos invocados por mensajes).

Programacin orientada a objetos: modelo objeto y relaciones

Una vez identificados los objetos ser preciso identificar los atributos y las operaciones que actan sobre ellos.
Los atributos describen la abstraccin de caractersticas individuales que poseen todos los objetos.

Desde el punto de vista informtico, los objetos son tipos abstractos de datos (tipos
que encapsulan datos y funciones que operan sobre esos datos).
Algunos ejemplos tpicos de objetos:
Nmero racional:
Estado (valor actual).
Operaciones (sumar, multiplicar, asignar, ...).
Vehculo
Estado (velocidad, posicin, precio, ...).
Operaciones (acelerar, frenar, parar, ...).
Conjunto
Estado (elementos).
Operaciones (aadir, quitar, visualizar, ...).
Avin
Estado (fabricante, modelo, matrcula, nmero de pasajeros,...).
Operaciones (aterrizar, despegar, navegar, ...).

23.3.2.

AVION
Matrcula
Licencia de piloto
Nombre del avin
Capacidad de carga
Nmero de pasajeros

Cosas tangibles (avin, reactor nuclear, fuente de alimentacin, televisor, libro,


automvil);
Roles o p p e t e jugados o representados por personas (gerente, cliente, empleado,
mdico, paciente, ingeniero);
Organizaciones (empresa, divisin, equipo, ...);
Incidentes (representa un suceso (evento) u ocurrencia, tales como vuelo, accidente, suceso, llamada a un servicio de asistencia tcnica, ...);
Interacciones (implican generalmente una transaccin o contrato y relacionan dos
o ms objetos del modelo: compras comprador, vendedor, artculo, matrimonio esposo, esposa, fecha de boda);
Especificaciones (muestran aplicaciones de inventario o fabricacin: refrigerador,
nevera,...);
Lugares (sala de embarque, muelle de carga, ...).

EMPLEADO
Nombre
Nmero de identificacin
Salario
Direccin
Nombre del departamento

Las operaciones cambian el objeto su comportamiento de alguna forma, es decir, cambian valores de uno o ms atributos contenidos en el objeto. Aunque existe gran
nmero de operaciones que se pueden realizar sobre un objeto, generalmente se divide
en tres grandes grupos 3 :
Operaciones que manipulan los datos de alguna forma especfica (aadir, borrar,
cambiar formato, ...);
Operaciones que realizan un clculo o proceso;
Operaciones que comprueban (monitorizan) un objeto frente a la ocurrencia de
algn suceso de control.

Identificacin de objetos

El primer problema que se nos plantea al analizar un problema que se desea implementar mediante un programa orientado a objetos es identificar los objetos', es decir, qu
cosas son objetos? Y cmo deducimos los objetos dentro del dominio de la definicin
del problema?
La identificacin de objetos se obtiene examinando la descripcin del problema (anlisis gramatical somero del enunciado o descripcin) y localizando los nombres o clausulas nominales. Normalmente estos nombres y sus sinnimos se suelen escribir en una
tabla de la que luego deduciremos los objetos reales.
Los objetos, segn Shlaer, Mellor y Coud/Yourdon, pueden caer dentro de las siguientes categoras:

879

La identificacin de las operaciones se realiza haciendo un nuevo anlisis gramatical


de la descripcin del problema, y buscando y aislando los verbos del texto.

23.3.3.

Duracin de los objetos

Los objetos son entidades que existen en el tiempo; por ello, deben ser creados o instanciados (normalmente a travs de otros objetos). Esta operacin se hace a travs de operaciones especiales llamadas constructores en C++ o inicializadores. Estas operaciones se
ejecutarn implcitamente por el compilador o explcitamente por el programador, mediante invocacin a los citados constructores.

23.3.4.

Objetos frente a clases: Notacin grfica (Notacin de


Ege)

Los objetos ocupan espacio en memoria y, en consecuencia, existen en el tiempo y debern crearse o instanciarse. Por la misma razn se debe liberar el espacio ocupado en
la memoria por los objetos cuando va no son necesarios. Dos operaciones comunes en
cualquier clase son:

Pressman, Roger: Ingeniera del software. Un enfoque prctico, 3.a edicin, Madrid, McGraw-Hill, 1993.

880

Programacin en Turbo/Borland Pascal 7

Programacin orientada a objetos: modelo objeto y relaciones

Constructor. Operacin que crea un objeto y/o inicia su entrada.


Destructor. Operacin que libera el espacio de memoria ocupado por un objeto y/
o destruye el propio objeto.
Los objetos y las clases se comparan a variables y tipos en lenguajes de programacin
convencional. U n a variable es una instancia de un tipo, al igual que un objeto es una
instancia de una clase; sin embargo, una clase es ms expresiva que u n tipo. Expresa la
estructura y todos los procedimientos y funciones que se pueden aplicar a una de sus
instancias.
En un lenguaje estructurado, un tipo integer, por ejemplo, define la estructura de
una variable entera, por ejemplo una secuencia de 16 bits y los procedimientos y funciones que se pueden realizar sobre enteros. De acuerdo a nuestra definicin de clase el
tipo integer ser una clase. Sin embargo, en estos lenguajes de programacin no es posible agrupar nuevos tipos y sus correspondientes nuevas funciones y procedimientos en
una nica unidad. En un lenguaje orientado a objetos una clase proporciona este servicio.
Adems de los trminos objetos y clases existen otros trminos en orientacin a objetos. Las variables o campos que se declaran dentro de una clase se d e n o m i n a n como
variables instancia. Las funciones que se declaran dentro de u n a clase se d e n o m i n a n mtodos. Las funciones y campos m i e m b r o se conocen c o m o caractersticas miembro, o
simplemente miembros. A veces, se invierten las palabras y las funciones miembros se
conocen como miembro funcin y los campos se d e n o m i n a n miembro datos.
Es til ilustrar objetos y clases con diagramas 4 . La Figura 23.11 muestra el esquema
general de un diagrama objeto. U n objeto se dibuja como u n a caja. La caja se etiqueta
con el nombre del objeto y representa el lmite o frontera entre el interior y el exterior
de un objeto.
Un campo se dibuja por una caja rectangular, una funcin por un hexgono largo.
Los campos y funciones se etiquetan con sus nombres. Si u n a caja rectangular contiene
Objeto
Campos miembro

1
Funciones miembro

Interior

Figura 2 3 . 1 1 .

3
<1> <
oNT

Exterior

Diagrama de un objeto.

4
Las notaciones de clases y objetos en esta seccin se deben a Raimund K. Ege, que las dio a conocer en
su libro Programming in an Object-Oriented Environment, Academic Press (AP), 1992.

881

Saludo 1
Miembro dato privado
|

Bienvenido

Figura 2 3 . 1 2 .

Leer

Visualizar

El objeto saludol.

algo, entonces se representa el valor del campo para el objeto dibujado. Los campos y
funciones miembro en el interior de la caja estn ocultos del exterior que significa estar
encapsulados. El acceso a las caractersticas miembros (campos y funciones) es posible a
travs del interfaz del objeto.
En Turbo/Borland Pascal el interfaz se construye a partir de todas las caractersticas
que se listan despus de la palabra reservada object; puede ser funciones y campos
La Figura 23.12 muestra el diagrama objeto del objeto Saludol. Se llama Saludol y
permite acceder a su estado interno a travs de las funciones m i e m b r o pblicas leer y y
visualizar. El campo m i e m b r o dato privado contiene el valor Bienvenido.
Cul es la diferencia entre clase y objeto?
Un objeto es un simple elemento, no importa lo complejo que p u e d a ser. U n a clase,
por el contrario, describe una familia de elementos similares. En la prctica, una clase es
como un esquema o plantilla que se utiliza para definir o crear objetos.
A partir de una clase se puede definir un nmero determinado de objetos. Cada u n o
de estos objetos generalmente tendr un estado particular propio (una pluma estilogrfica puede estar llena, otra puede estar medio llena y otra totalmente vaca) y otras caractersticas (como su color) aunque compartan algunas operaciones comunes (como escribir o llenar su deposito de tinta). Los objetos tienen las siguientes caractersticas:

Se agrupan en tipos llamados clases.


Tienen datos internos que definen su estado actual.
Soportan ocultacin de datos',
Pueden heredar propiedades de otros objetos;
Pueden comunicarse con otros objetos pasando mensajes',
Tienen mtodos que definen su comportamiento.

La Figura 23.13 muestra el diseo general de diagramas que representa a u n a clase y


a objetos pertenecientes a ella.
U n diagrama de clase es similar a u n diagrama objeto. La caja superior dentro del
diagrama de la clase visualiza el n o m b r e de la clase. La caja inferior proporciona los detalles estructurales de los objetos de la clase. Muestra qu carnpos m i e m b r o y funciones
de esta clase existen y qu caractersticas son privadas o pblicas. Las caractersticas se
etiquetan con sus nombres dentro de la caja o hexgono.

882

Programacin en Turbo/Borland Pascal 7

Programacin orientada a objetos: modelo objeto y relaciones

Clase

deben ser ocultados. Considerando este enfoque, somos libres de cambiar el diseo de la
ventana (bien para mejorar su eficiencia o bien para obtener su trabajo en un hardware
diferente) sin tener que cambiar el cdigo que la utiliza.

Campo miembro

Turbo/Borland Pascal soporta las caractersticas de ocultacin de datos con las palabras reservadas public y p r v a t e .

Funciones miembro
(

r~

Figura 2 3 . 1 3 .

Diagrama de una clase.

Una clase es un tipo definido que determina las estructuras de datos y operaciones
asociadas con ese tipo. Las clases son como plantillas que describen cmo ciertos tipos
de objetos estn construidos. Cada vez que se construye un objeto de una clase, estamos
creando lo que se llama una instancia de una clase. Por consiguiente, los objetos no son
ms que instancias de clases. En general, los trminos objeto e instancia de una clase se
pueden utilizar indistintamente.

L'n objeto es una instancia de una clase.


l 'na clase puedo tenor muchas instancias \ cada una es un objeto independiente.
Lina clase es una plantilla que se utiliza para describir uno o mas objetos de un mismo

23.3.5.

Datos internos

Una propiedad importante de los objetos es que almacenan informacin de su estado en


forma de datos internos. El estado de un objeto es simplemente el c o n j u n t o de valores
de todas las variables contenidas dentro del objeto en un instante dado. Se denominan,
a veces, a las variables que representan a los objetos variables de estado.

23.3.6.

883

23.4.

COMUNICACIONES ENTRE OBJETOS: LOS MENSAJES

Ya se ha mencionado en secciones anteriores que los objetos realizan acciones cuando


ellos reciben mensajes. El mensaje, es esencialmente una orden que se enva a un objeto
para instruirle a que realice alguna accin. Esta tcnica de enviar mensajes a objetos se
denomina pasar mensajes. Los objetos se comunican entre s enviando mensajes, al igual
que sucede con las personas.
Los mensajes tienen u n a contrapartida denominada mtodos. Mensajes y mtodos
son dos caras de la m i s m a moneda. Los mtodos son los procedimientos que se invocan
cuando un objeto recibe un mensaje. En terminologa de programacin tradicional, un
mensaje es una llamada a una funcin. Los mensajes juegan un papel crtico en POO.
Sin ellos, los objetos q u e se definen no se podrn comunicar entre s. C o m o ejemplo,
consideramos enviar u n mensaje tal como subir 5 lneas al objeto ventana definido anteriormente. El aspecto importante no es cmo se implementa un mensaje sino cmo se
utiliza.
Consideremos de nuevo nuestro objeto ventana. Supongamos que deseamos cambiar
su tamao, de m o d o que le enviamos el mensaje
Reducir 3 columnas por la derecha

Observe que no le indicamos a la ventana como cambiar su t a m a o la ventana maneja la operacin por s misma. De hecho se puede enviar el mismo mensaje a diferentes

Ocultacin de datos

Al objeto de mantener las caractersticas de caja negra de POO, se debe considerar cmo
se accede a un objeto en el diseo del mismo. Normalmente es una buena prctica, restringir el acceso a las variables estado de un objeto y a otra informacin interna que se
utiliza para definir el objeto. Cuando se utiliza un objeto no necesitamos conocer todos
los detalles de la implementacin. Esta prctica de limitacin del acceso a cierta informacin interna se llama ocitacin de datos.
En el ejemplo anterior de ventana, el usuario no necesita saber c m o se implementa
la ventana, slo cmo se utiliza. Los detalles internos de la implementacin pueden y

Figura 2 3 . 1 4 .

Mensajes entre objetos.

884

Programacin

en Turbo/Borland

Pascal 7

Programacin

clases de ventanas y esperar a que cada una realice la misma accin. Los mensajes pueden venir de otros objetos o desde fuentes externas, tales c o m o un ratn o un teclado.
U n a aplicacin Windows es un buen ejemplo de c m o se emplean los mensajes para
comunicarse entre objetos. El usuario pulsa u n botn para enviar (remitir, despachar)
mensajes a otros objetos que realizan una funcin especfica. Si se pulsa el botn Exit, se
enva un mensaje al objeto responsable de cerrar la aplicacin. Si el mensaje es vlido,
se invoca el mtodo interno. Entonces, se cierra la aplicacin.

23.4.1.

orientada a objetos:

modelo objeto y relaciones

885

Estructuralmente un mensaje consta de tres partes:


Identidad del receptor;
El mtodo que se ha de ejecutar;
Informacin especial necesaria para realizar el mtodo invocado (argumentos o
parmetros requeridos).

obj e st

Activacin de objetos

"obj_test

S u m a r r e c e p t o r

sumar

10xyz"

mtodo

parmetro

A los objetos slo se puede acceder a travs de su interfaz pblico. Cmo se permite el
acceso a un objeto? U n objeto accede a otro objeto envindole un mensaje.
Bus
Modelo [~

Puertas |

^clacl

Figura 2 3 . 1 7 .

Preciojaus

Matricula
)
|
( Calcular_precio ( ) )

Figura 2 3 . 1 5 .

23.4.2.

Estructura de un mensaje.

Calcularprecio ( )
*

Envo de un mensaje.

Concepto de un mensaje

Un mensaje es una peticin de un objeto a otro objeto al que le solicita ejecutar u n o de


sus mtodos. Por convenio, el objeto que enva la peticin se denomina emisor y el objeto que recibe la peticin se d e n o m i n a receptor.

Cuando un objeto est inactivo (durmiendo) y recibe un mensaje se hace activo. El


mensaje enviado por otros objetos o fuentes tiene asociado un mtodo que se activar
cuando el receptor recibe dicho mensaje. La peticin no especifica cmo se realiza la
operacin. Tal informacin se oculta siempre al emisor.
El conjunto de mensajes a los que responde un objeto se denomina comportamiento
del objeto. N o todos los mensajes de un objeto responden, es preciso que pertenezcan al
interfaz accesible.
Nombre de un mensaje
Un mensaje incluye el nombre de una operacin y cualquier argumento requerido por
esa operacin. Con frecuencia, es til referirse a u n a operacin por nombre, sin considerar sus argumentos.
Mtodos
Cuando un objeto recibe un mensaje, se realiza la operacin solicitada ejecutando un
mtodo. U n mtodo es el algoritmo ejecutado en respuesta a la recepcin de un mensaje
cuyo nombre se corresponde con el nombre del mtodo.
La secuencia actual de acontecimientos es que el emisor enva su mensaje; el receptor
ejecuta el mtodo apropiado, consumiendo los parmetros; a continuacin, el receptor
devuelve algn tipo de respuesta al emisor para reconocer el mensaje y devolver cualquier informacin que se haya solicitado.

Figura 23.1 6.

Objetos emisor y receptor de un mensaje.

L1 receptor i esponjo a un mensaje.

886

Programacin orientada a objetos: modelo objeto y relaciones

Programacin en Turbo/Borland Pascal 7

23.4.3.

Paso de mensajes

Gato

1.
2.

Mtodos

datos utilizados por el mtodo invocado;


un mensaje, propiamente dicho.

J
Objetos

Clase
Figura 2 3 . 1 8 .

Notacin grfica OMT de una clase y de un objeto.

un receptor;
un nombre de mensaje;
argumentos o parmetros (si se necesita).

En primer lugar, un objeto receptor que ha de recibir el mensaje que se ha especificado. Los objetos no especificados por el emisor no respondern. El receptor trata de
concordar el nombre del mensaje con los mensajes que l entiende. Si el mensaje no se
entiende, el objeto receptor no se activar. Si el mensaje se entiende por el objeto receptor, el receptor aceptar y responder al mensaje invocando el mtodo asociado.
Los parmetros o argumentos pueden ser:

' (Torno)

Atributos

Los objetos se comunican entre s a travs del uso de mensajes. El interfaz del mensaje
se define un interfaz claro entre el objeto y el resto de su entorno.
Esencialmente, el protocolo de un mensaje implica dos partes: el emisor y el receptor. C u a n d o un objeto emisor enva un mensaje a un objeto receptor, tiene que especificar lo siguiente:
1.
2.
3.

(Romo)

887

Alimento
Atributos Servicios -

' /

Pescado

))

Figura 2 3 . 1 9 .

Carne

'f

'

Leche

Y
),

Objetos en notacin Yourdon/Coad.

La estructura de un mensaje puede ser:


enviar <Objeto A>. cMtodol (parametrol, . . . ,parametroN)>

El ejemplo siguiente muestra algunos mensajes que se pueden enviar al objeto Cochel.
El primero de stos invoca al mtodo Precio_Coche y no tiene argumentos, mientras que
el segundo, Fi jar-precio, enva los parmetros 8-10-92, y Poner_en_blanco no tiene argumentos.

Los objetos simples pueden constar de tipos primitivos tales como enteros, carcter,
boolean, reales o tipos simples definidos por el usuario. Los objetos complejos pueden
constar de pilas, conjuntos, listas, array, etc., o, incluso, estructuras recursivas de alguno
o todos los elementos.
Los constructores se utilizan para construir estos objetos complejos a partir de otros
objetos complejos.

Ejemplo
enviar Cochel.Precio_Coche()
enva a Cochel el mensaje Precio __Coche
enviar Cochel.Fijar_precio (8-10-92) enva a Cochel el mensaje Fijar_precio
con el parmetro 8-10-92
enviar Cochel .Poner_en_blanco()
enva a Cochel el mensaje
Poner_en_blanco

23.5.

ESTRUCTURA INTERNA DE UN OBJETO

La estructura interna de un objeto consta de dos componentes bsicos:


Atributos;
Mtodos (operaciones o servicios).

23.5.1.

Atributos

Los atributos describen el estado del objeto. U n atributo consta de dos partes: un n o m bre de atributo y un valor de atributo.

23.5.2.

Mtodos

Los mtodos (operaciones o servicios) describen el comportamiento asociado a un objeto.


Representan las acciones que se pueden realizar por un objeto o sobre un objeto.
Cada m t o d o tiene u n n o m b r e y un cuerpo que realiza la accin o comportamiento
asociado con el n o m b r e del mtodo. En un LOO, el cuerpo de un mtodo consta de un
bloque de cdigo procedimental que ejecuta la accin requerida. Todos los mtodos que
alteran o acceden a los datos de u n objeto se definen dentro del objeto. U n objeto puede
modificar directamente o acceder a los datos de otros objetos.
Un mtodo dentro de un objeto se activa por un mensaje que se enva por otro objeto al objeto que contiene el mtodo. De m o d o alternativo, se puede invocar por otro
mtodo en el mismo objeto por un mensaje local enviado de un mtodo a otro dentro
del objeto.
mtodo: Precio_coche
inicio

Precio_coche := Precio_coste * (Marca+1);

fin.

888

Programacin orientada a objetos: modelo objeto y relaciones

Programacin en Turbo/Borland Pascal 7

889

el capuchn, etc.). En resumen, y c o m o ya se ha comentado con anterioridad, un objeto es una instancia de una clase.

El mtodcM llama
al mtodo_2,
envindole
un mensaje
El mtodo_3
se invoca por
un mensje
de otro objeto

Figura 2 3 . 2 0 .

23.6.

Invocacin de un mtodo.

ESTRUCTURA INTERNA DE UNA CLASE

La clase es la construccin del lenguaje utilizada, ms frecuentemente, para definir los


tipos abstractos de datos en lenguajes de programacin orientados a objetos. U n a de las
primeras veces que se utiliz el concepto de clase fue en Simula (Dahl y Nygaard, 1966;
Dahl, Myhrhang y Nigaard, 1970) c o m o entidad que declara conjuntos de objetos similares. En Simula, las clases se utilizaron principalmente como plantillas para crear objetos de la misma estructura. Los atributos de u n objeto pueden ser tipos base, tales como
enteros, reales y booleans. O bien, pueden ser arrays, procedimientos o instancias de otras
clases.
Generalmente, una clase se puede definir como una descripcin abstracta de un grupo
de objetos, cada u n o de los cuales se diferencia por un estado especfico y es capaz de
realizar una serie de operaciones.
Por ejemplo, una pluma estilogrfica es un objeto que tiene un estado (llena de tinta
o vaca) que puede realizar algunas operaciones (por ejemplo, escribir, poner/quitar el
capuchn, rellenar si est vaca).
En programacin, una clase es una estructura que contiene datos y procedimientos
(o funciones) que son capaces de operar sobre esos datos. U n a clase p l u m a estilogrfica
puede tener, por ejemplo, una variable que indica si est llena o vaca; otra variable puede
contener la cantidad de tinta cargada realmente. La clase contendr algunas funciones
que operan o utilizan esas variables.
Dentro de un programa, las clases tienen dos propsitos principales: definir abstracciones y favorecer la modularidad.
Cul es la diferencia entre u n a clase y u n objeto, con independencia de su complejidad? U n a clase, verdaderamente describe una familia de elementos similares. En realidad, u n a clase es una plantilla para u n tipo particular de objetos. Si se tienen muchos
objetos del mismo tipo, slo se tienen que definir las caractersticas generales de ese tipo
una vez, en lugar de en cada objeto.
A partir de u n a clase se puede definir un n m e r o de objetos. Cada u n o de estos objetos tendr generalmente un estado peculiar propio (una p l u m a puede estar rellenada,
otra puede estar medio-vaca y otra estar totalmente vaca) y otras caractersticas (como
su color), aunque compartirn operaciones comunes (como escribir, llenar, poner

23.6.1.

Una comparacin con tablas de datos

Una clase se puede considerar c o m o la extensin de un registro. Aquellas personas familiarizadas con sistemas de bases de datos, pueden asociar clase e instancias con tablas
y registros, respectivamente. Al igual que una clase, una tabla define los nombres y los
tipos de datos de la informacin que contenga. Del mismo modo que una instancia, un
registro de esa tabla proporciona los valores especficos para una entrada particular. La
principal diferencia, a nivel conceptual, es que las clases contienen mtodos adems de
las definiciones de datos.
U n a clase es una caja negra o mdulo, en la que est permitido conocer lo que hace
la clase, pero no cmo lo hace. U n a clase ser un mdulo y un tipo. ,Como m d u l o la
clase encapsula los recursos que ofrece a otras clases (sus clientes). C o m o tipo describe
un conjunto de objetos o instancias que existen en tiempo de ejecucin.

Clase A

; *-

Clase

Figura 2 3 . 2 1 .

Instancia (objeto)
de la clase

Una clase y una instancia (objeto) de la clase (Notacin Booch).

I n s t a n c i a s c o m o registros

Servicio
S2020
S1010
S4040

Horas

Frecuencia

Descuento

4.5
8
5

6
2
3

10
20
15

Cuenta
Servicio
Horas
Frecuencia
Descuento
Clase

Clase

Figura 2 3 . 2 2 .

Instancias de una clase (notacin OMT).

890

23.7.

Programacin orientada a objetos: modelo objeto y relaciones

Programacin en Turbo/Borland Pascal 7

HERENCIA

La encapsulacin es una caracterstica muy potente, y junto con la ocultacin de la informacin, representan el concepto avanzado de objeto que adquiere su mayor relevancia cuando encapsula e integra datos ms las operaciones que manipulan los datos en
dicha entidad. Sin embargo, la orientacin a objetos se caracteriza, adems de por las
propiedades anteriores, por incorporar la caracterstica de herencia, propiedad que permite a los objetos ser construidos a partir de otros objetos. Dicho de otro modo, la capacidad de un objeto para utilizar las estructuras de datos y los mtodos previstos en
antepasados o ascendientes. El objetivo final es la reutilizabilidad o reutilizacin (reusability) 3, es decir reutilizar cdigo anteriormente ya desarrollado.
La herencia se apoya en el significado de ese concepto en la vida diaria. As, las clases
bsicas o fundamentales se dividen en subclases. Los animales se dividen en mamferos,
anfibios, insectos, pjaros, peces, etc. La clase vehculo se divide en subclase automvil,
motocicleta, camin, autobs, etc. El principio en que se basa la divisin de clases es la
jerarqua compartiendo caractersticas comunes. As, todos los vehculos citados tienen
un motor y ruedas, que son caractersticas comunes; si bien los camiones tienen una caja
para transportar mercancas, mientras que las motocicletas tienen un manillar en lugar
de un volante.
La herencia supone una clase base y una jerarqua de clases que contienen las clases
derivadas de la clase base. Las clases derivadas pueden heredar el cdigo y los datos de
su clase base, aadiendo su propio cdigo especial y datos a ellas incluso cambiar aquellos elementos de la clase base que necesita sean diferentes.

891

Tso se debe confundir las relaciones de los objetos con las clases, con las relaciones de
una clase base con sus clases derivadas. Los objetos existentes en la m e m o r i a de la
computadora, expresan las caractersticas exactas de su clase, y sirven c o m o un mdulo
o plantilla. Las clases derivadas heredan caractersticas de su clase base, pero aaden otras
caractersticas propias nuevas.

Una clase hereda sus caractersticas (datos y funciones) de otra clase.

As, se puede decir que una clase de objetos es un conjunto de objetos que comparten
caractersticas y comportamientos comunes. Estas caractersticas y comportamientos se
definen en una clase base. Las clases derivadas se crean en un proceso de definicin de
nuevos tipos y reutilizacin del cdigo anteriormente desarrollado en la definicin de sus
clases base. Este proceso se d e n o m i n a programacin por herencia. Las clases que heredan propiedades de una clase base pueden a su vez servir como definiciones base de otras
clases. Las jerarquas de clases se organizan en forma de rbol.

23.7.1.

lmplementacin d e clases en lenguajes

Supongamos una clase Punto que consta de los campos dato (coordenadas . e y) y los
campos funcin (mtodos leer dichas coordenadas x e y).

Clase base

Clase Punto
Coordenadas

x. y
Mtodos
Fijar
Leer x
Leer y

Objetos de la clase Punto

Figura 2 3 . 2 3 .

Jerarqua d e c l a s e s .

s
Este trmino tambin se suele traducir por reusabilidad, aunque no es un trmino aceptado por el DRAE
(Diccionario de la Real Academia Espaola).

x1, y1

x2, y2

x3, y3

Mtodos 1

Mtodos 2

Mtodos 3

objeto 1

objeto 2

objeto 3

Turbo/Borland
Pascal 7.0 llama a la clase objeto y al objeto una instancia de un objeto.
U n objeto es u n a variable de u n a clase dada, y se d e n o m i n a instancia de esa clase.
Las funciones del objeto se d e n o m i n a n mtodos ( T u r b o Pascal) (Junciones miembro en

C++).

892

Programacin orientada a objetos: modelo objeto y relaciones

Programacin en Turbo/Borland Pascal 7

893

Herencia simple
Base (01)

En realidad una clase es un tipo de dato definido por el usuario que determina las
estructuras de datos y operaciones asociadas con ese tipo. Dicho de otro m o d o una clase
es una coleccin de objetos similares. La definicin de una clase no crea ningn objeto,
de igual modo que una declaracin de variables, tampoco crea variables.

(11) derivada de base (01)


(111) derivada de (11)

int X;
int pesetas;

(12) derivada de base (01)


(13) derivada de base (01)

Tenga cuidado no confundir clases con objetos de esas clases: un automvil rojo y un automvil azul no son objetos de clases diferentes, sino objetos de la misma clase con un atributo diferente.

Herencia mltiple
Base (01)
(11) derivada de base (01)

23.7.2.

(111) derivada de (11)

Tipos de herencia

Existen dos mecanismos de herencia utilizados c o m n m e n t e en programacin orientada


a objetos: herencia simple y herencia mltiple.
En herencia simple, un objeto {clase) puede tener slo un ascendiente, o dicho de
otro modo, una subclase puede heredar datos y mtodos de u n a nica clase as como
aadir o quitar comportamientos de la clase base. T u r b o Pascal, slo admite este tipo de
herencia. C++ admite herencia simple y mltiple. La herencia mltiple es la propiedad
de una clase de poder tener ms de un ascendiente inmediato o lo que es igual adquirir
datos y mtodos de ms de una clase.
La Figura 23.24 representa los grficos de herencia simple y herencia mltiple de la
clase figura y persona, respectivamente. En la Figura 23.25 se muestra grficamente las
relaciones de herencia, aprecindose fcilmente los dos tipos (simple y mltiple), con una
da s e gase genrica 01.
A primera vista, se puede suponer, que la herencia mltiple es mejor que la herencia
simple; sin embargo, como ahora comentaremos no siempre ser as. En los lenguajes
POO incluyendo Object-Pascal, Objective-C, Smalltalk y Acter implementan slo
herencia simple. Eiffel y C++ (a partir de la versin 2.0) por otra parte soportan herencia
mltiple.

(12) derivada de (02)


^
Figura 2 3 . 2 5 .

Figura 2 3 . 2 4 .

Herencia mltiple
Tipos de herencia.

Herencia simple y mltiple.

En general, prcticamente todo lo que se puede hacer con herencia mltiple se puede
hacer con herencia simple, a u n q u e a veces resulta ms difcil. U n a dificultad surge con
la herencia mltiple cuando se combinan diferentes tipos de objetos, cada u n o de los
cuales define mtodos o campos iguales. Supongamos dos tipos de objetos pertenecientes
a las clases Grficos y Sonidos, y se crea un nuevo objeto d e n o m i n a d o Multimedia a partir
de ellos. Grficos tiene tres campos datos: tamao, color y mapasdebits y los mtodos dibujar, cargar, almacenar y escala; sonidos t i e n e dos c a m p o s d a t o s , duracin, voz y tono, y
los m t o d o s reproducir, cargar, escala y almacenar. As, p a r a u n o b j e t o Multimedia, el m -

todo escala significa poner el sonido en diferentes tonalidades o bien aumentar/reducir


el t a m a o de la escala del grfico.
Naturalmente el problema que se produce es la ambigedad y se tendr que resolver
con una operacin de prioridad que el correspondiente lenguaje deber soportar y entender en cada caso.
En realidad, ni la herencia simple ni la herencia mltiple son perfectas en todos los
casos y ambos tipos pueden requerir un poco de cdigo extra que represente bien las
diferencias en el m o d o de trabajo.
La herencia es un mecanismo potente para tratar con la evolucin natural de un sistema y con modificacin incremental [Meyer, 1988], Existen dos tipos diferentes de herencia: simple y mltiple.

23.7.3.
Herencia simple

(12111) derivada de (12) y (111)

Herencia simple (herencia jerrquica)

En esta jerarqua cada clase tiene como mxi mo una sola superclase. La herencia simple
permite que una clase herede las propiedades de su superclase en una cadena jerrquica.

894

Programacin orientada a objetos: modelo objeto y relaciones

Programacin en Turbo/Borland Pascal 7

895

Conflictos por defecto.


Conflictos de dominio.
Conflictos de restricciones.
Por ejemplo,
Conflicto

de nombres

Valores

23.7.4.

Herencia mltiple (herencia en malla)

U n a malla o retcula consta de clases, cada una de las cuales puede tener una o ms superclases inmediatas. U n a herencia mltiple es aqulla en la que cada clase puede heredar mtodos y variables de cualquier n m e r o de superclase.
En la Figura 23.27 la clase C tiene dos superclases, A y D. Por consiguiente, la clase
C hereda las propiedades de las clases A y D. Evidentemente, esta accin puede producir
un conflicto de nombres, donde la clase C hereda las mismas propiedades de A y D.
Herencia s e l e c t i v a
La herencia selectiva es la herencia en que algunas propiedades de las superclases se heredan selectivamente por la clase heredada. Por ejemplo, la clase B puede heredar algunas propiedades de la superclase A, mientras que la clase C puede heredar selectivamente
algunas propiedades de la superclase A y algunas de la superclase D.
Herencia mltiple

Nombre_estudiante
Nombre_empleado

Atributos con igual nombre, tienen


valores en cada clase.
Universidad con distintos carapus.

Reglas de resolucin de conflictos


1.
2.
3.

U n a lista de procedencia de clases, como sucede en LOOPS y FLAVORS.


U n a precedencia especificada por el usuario para herencia, c o m o en Smalltalk.
Lista de precedencia del usuario, y si no sucede as, la lista de precedencia de las
clases por profundidad.
Atributos
Nombre
Direccin
Campus
Curso
Ao

Atributos
Nombre
Direccin
Estudios
Salario
Das^Vacaciones
Mtodo
Aumento_Salaro

Atributos Heredados
Nombre
Das_Vacaciones
Direccin
Curso
Salario
Campus
Estudiios
Ao

Mtodos heredados
Aumento_Salaro

Problemas:

1.
2.

Nombre

Figura 2 3 . 2 8 .

Herencia d e a t r i b u t o s y m t o d o s .

La propiedad referida solo est en una de las subclases padre.


La propiedad concreta existe en ms de una superclase.

23.7.5.

Caso 1. N o hay problemas.


Caso 2. Existen diferentes tipos de conflictos que pueden ocurrir:
Conflictos de nombres.
Conflictos de valores.

Figura 2 3 . 2 7 .

Herencia mltiple.

Clases abstractas

Con frecuencia, cuando se disea u n modelo orientado a objetos, es til introducir clases
a cierto nivel que pueden no existir en la realidad, pero son construcciones conceptuales
tiles. Estas clases se conocen c o m o clases abstractas.
U n a clase abstracta n o r m a l m e n t e ocupa una posicin adecuada en la jerarqua de
clases que le permite actuar c o m o un depsito de mtodos y atributos compartidos para
las subclases de nivel inmediatamente inferior.
Las clases abstractas no tienen instancias directamente. Se utilizan para agrupar otras
clases y capturar informacin que es c o m n al grupo. Sin embargo, las subclases de clases abstractas que corresponden a objetos del m u n d o real puecjen tener instancias.
U n a clase abstracta es COCHE_TRANSPORTE_PASAJEROS. U n a subclase es SEAT, que puede
tener instancias directamente, por ejemplo, Cochel y Coche2.

896

Programacin orientada a objetos: modelo objeto y relaciones

Programacin en Turbo/Borland Pascal 7

Figura 2 3 . 2 9 .

897

Clase d e r i v a d a por herencia mltiple.

lina clase abstracta es una clase que sirve como clase base comn, pero no tendr instancias.
U n a clase abstracta puede ser una impresora.
Las clases derivadas de una clase base se conocen c o m o clases concretas, que ya pueden instanciarse (es decir, pueden tener instancias).

Figura 2 3 . 3 1 .

Jerarqua d e h e r e n c i a .

Las definiciones de clases para esta jerarqua puede tomar la siguiente estructura:

Figura 2 3 . 3 0 .

La c l a s e a b s t r a c t a i m p r e s o r a .

clase animal
atributos
tipo : string;
peso : real;
habitat : (...algn tipo de habitat...);
operaciones
crearanimal;
esperanza_vida(animal):entero;
fin animal

1 : n objeto es lina instancia (ejemplar, caso u ocunenca) de una clase.

23.7.6.

Sintaxis

Los objetos con propiedades comunes (atributos y operaciones) se clasifican en u n a clase.


De igual modo, las clases con propiedades y funciones comunes se agrupan en u n a superclase. Las clases que se derivan de una superclase son las subclases.
Las clases se organizan como jerarqua de clases. La ventaja de definir clases en una
jerarqua es que a travs de un mecanismo d e n o m i n a d o herencia, casos especiales comparten todas las caractersticas de sus casos ms generales.
La herencia es una caracterstica por la que es posible definir u n a clase, no de un
borrador, sino en trminos de otra clase. U n a clase hereda sus caractersticas (datos y
funciones) de otra clase. Esta caracterstica proporciona claramente u n soporte poderoso
para reutilizacin y extensibilidad, dado que la definicin de nuevos objetos se pueden
basar en clases existentes. Como ejemplo, considrese la jerarqua de herencia mostrada
en la Figura 23.31. Las clases de objeto mamfero, pjaro e insecto se definen c o m o subclases de animal, la clase de objeto persona c o m o una subclase de mamfero y u n h o m bre y una mujer son subclases de persona.

clase mamifero hereda_de animal


atributos (propiedades)
periodo_gestacin: real;
operaciones
fin mamifero.
clase persona hereda_de mamifero;
propiedades
apellidos, nombre: string;
fecha_nacimiento: date;
origen: pais;
fin persona.
clase hombre hereda_de persona;
atributos
esposa: mujer;
operaciones
fin hombre.

898

Programacin orientada a objetos: modelo objeto y relaciones

Programacin en Turbo/Borland Pascal 7

899

clase mujer hereda_de persona;


propiedades
esposo: hombre;
nombre: string;
fin mujer.

23.8.

C o m o se ha comentado anteriormente, los atributos y mtodos definidos en la superclase se heredan por las subclases. Sin embargo, si la propiedad se define nuevamente en
la subclase, aunque se haya definido anteriormente a nivel de superclase; entonces la definicin realizada en la subclase es la utilizada en esa subclase. Entonces se dice que anula
las correspondientes propiedades de la superclase. Esa propiedad se d e n o m i n a anulacin
o sustitucin (overriding).
Supongamos que ciertos atributos y mtodos definidos en la clase A se redefinen en
la clase C. Las clases E, F, G y H heredan esos atributos y mtodos. La cuestin que se
produce es si estas clases heredan las definiciones dadas en la clase A o las dadas en la
clase C. El convenio adoptado es que una vez que un atributo o mtodo se redefine en
un nivel de clases especfico, entonces cualquier hijo de esa clase, o sus hijos en cualquier
profundidad, utilizan este mtodo o atributo redefmido. Por consiguiente, las clases E,
F, G y H utilizarn la redefinicin dada en la clase C, en lugar de la definicin dada en
la clase A.

23.9.

Beneficios
Calcular_Comisn=0,05+Presupuesto
Salario [40-80]
Edad [25-65]
Incrementar
Calcular_Comisin=0,03+Presupuesto

ANULACION/SUSTITUCION

SOBRECARGA

La sobrecarga es una propiedad que describe una caracterstica adecuada que utiliza el
mismo nombre de operacin para representar operaciones similares que se comportan
de m o d o diferente cuando se aplican a clases diferentes. Por consiguiente, los nombres
de las operaciones se pueden sobrecargar, esto es, las operaciones se definen en clases
diferentes y pueden tener nombres idnticos, a u n q u e su cdigo programa puede diferir.
Si los nombres de una operacin se utilizan para nuevas definiciones de clases de u n a
jerarqua, la operacin a nivel inferior se dice que anula la operacin a un nivel ms alto.
U n ejemplo se muestra en la Figura 23.32, en la que la operacin Incrementar est
sobrecargada en la clase Empleado y la subclase Administrativo. Dado q u e Administrativo
es una subclase de Empleado, la operacin Incrementar, definida en el nivel Administrativo, anula la operacin correspondiente al nivel Empleado. En ingeniero la operacin
Incrementar se hereda de Empleado. Por otra parte, la sobrecarga puede estar situada entre
dos clases que no estn relacionadas jerrquicamente. Por ejemplo Calcular_Comision est
sobrecargada en Administrativo y en Ingeniero. C u a n d o un mensaje Calcular_Comision se
enva al objeto Ingeniero, la operacin correspondiente asociada con Ingeniero se activa.
Actualmente la sobrecarga se aplica slo a operaciones. Aunque es posible extender
la propiedad a atributos y relaciones especficas del modelo propuesto. La sobrecarga no
es una propiedad especfica de los lenguajes orientados a objetos. Los lenguajes tales como
C y Pascal soportan operaciones sobrecargadas. Algunos ejemplos son los operadores de
asignacin de valores.

Figura 2 3 . 3 2 .

Sobrecarga.

En la mayora de los lenguajes, los operadores aritmticos + - y * se utilizan


para sumar, restar o multiplicar nmeros enteros o reales. Estos operadores funcionan
incluso a u n q u e las implementaciones de aritmtica entera y real (coma flotante) sean
bastante diferentes. El compilador genera cdigo objeto para invocar la implementacin
apropiada basada en la clase (entero o coma flotante) de los operandos.
As, por ejemplo, las operaciones de E/S (Entrada/Salida) se utilizan con frecuencia
para leer nmeros enteros, caracteres o reales. En Pascal read(x) se puede utilizar, siendo
x un entero, un carcter o un real. Naturalmente, el cdigo m q u i n a real ejecutado para
leer una cadena de caracteres es m u y diferente del cdigo m q u i n a para leer enteros.
read(x) es una operacin sobrecargada que soporta tipos diferentes. Otros operadores tales como los de asignacin (:= en Pascal o = en C) son sobrecargados. Los mismos
operadores de asignacin se utilizan para variables de diferentes tipos.
Los lenguajes de programacin convencionales soportan sobrecarga para algunas de
las operaciones sobre algunos tipos de datos, como enteros, reales y caracteres. Los sistemas orientados a objetos dan un poco ms en la sobrecarga y la hacen disponible para
operaciones sobre cualquier tipo objeto.
Por ejemplo, en las operaciones binarias se pueden sobrecargar para nmeros complejos, arrays, conjuntos o listas que se hayan definido c o m o tipos estructurados o clases.
As, el operador binario + se puede utilizar para sumar las correspondientes partes reales e imaginarias de los nmeros complejos. Si Al y A2 son dos arrays de enteros, se puede
definir:
A := Al + A2

para sumar:
A[i] := Al[i] + A2[i]

{para todo i}

De m o d o similar, si SI y S2 son dos conjuntos de objetos, se puede definir:


S := SI + S2

como unin de dos' conjuntos SI y S2.


Cmo se asocia una operacin particular o mensaje a urt mtodo? La respuesta es
mediante la ligadura dinmica (dynarnic binding) que se ver posteriormente.

900

Programacin

23.10.

en Turbo/Borland

Programacin

Pascal 7

orientada a objetos: modelo objeto y relaciones

901

LIGADURA DINAMICA

Los lenguajes 0 0 tienen la caracterstica de poder ejecutar ligadura tarda (dinmica), al


contrario que los lenguajes imperativos, que emplean ligadura temprana (esttica). Por
consiguiente, los tipos de variables, expresiones y funciones se conocen en tiempo de
compilacin para estos lenguajes imperativos. Esto permite el enlazar entre llamadas a
procedimientos y los procedimientos utilizados que se establecen cuando se cumple el
cdigo. En un sistema O O esto requerir el enlace entre los mensajes y que los mtodos
se establezcan en tiempo dinmico.
En el caso de ligadura dinmica o tarda, el tipo se conecta directamente al objeto.
Por consiguiente, el enlace entre el mensaje y el mtodo asociado slo se puede conocer
en tiempo de ejecucin.
La ligadura esttica permite un tiempo de ejecucin ms rpido que la ligadura dinmica, que necesita resolver estos enlaces en tiempo de ejecucin. Sin embargo, en ligadura esttica se ha de especificar en tiempo de compilacin las operaciones exactas a
que responder una invocacin del mtodo o funcin especfica, as c o m o conocer sus
tipos.
Por el contrario, en la ligadura dinmica simplemente se especifica u n mtodo de un
mensaje, y las operaciones reales que realiza este mtodo se determinan en tiempo de
ejecucin. Esto permite definir funciones o mtodos virtuales.

23.10.1.

Funciones o mtodos virtuales

Las funciones virtuales en C++ permiten especificar u n mtodo c o m o virtual en la definicin de una clase particular. La implementacin real del mtodo se realiza en las subclases. En este caso, por consiguiente, la seleccin del mtodo se hace en tiempo de compilacin, pero el cdigo real del m t o d o utilizado se d e t e r m i n a utilizando ligadura
dinmica o tarda en tiempo de compilacin.
Esto permite definir el mtodo de un n m e r o de formas diferentes para cada u n a de
las diferentes clases. Consideremos la jerarqua de clases definida por la Figura 23.33.
Aqu el mtodo virtual se define en la clase FIGURA y el cdigo procedimental real utilizado se define en cada una de las subclases CIRCULO, CUADRADO, RECTANGULO y LINEA. Ahora,
si un mensaje se enva a una clase especfica, se ejecuta el cdigo asociado con ella. Esto
contrasta con un enfoque ms convencional que requiere definir los procedimientos por
defecto, con nombres diferentes, tales como Dibujar_circulo, Dibujar_cuadrado, etc. Tambin se requerir utilizar una llamada al n o m b r e de la funcin especfica cuando sea necesario.

23.10.2.

Polimorfismo

La capacidad de utilizar funciones virtuales y ejecutar sobrecarga conduce a u n a caracterstica i m p o r t a n t e de los sistemas 0 0 , conocida c o m o polimorfismo,
que esencialmente permite desarrollar sistemas en los que objetos diferentes puedan responder de
modo diferente al mismo mensaje.
El polimorfismo, en su concepcin bsica, se encuentra en casi todos los lenguajes
de programacin. El polimorfismo, en su expresin m s simple, es el uso de u n n o m -

Cdigo para
dibujar en circulo

Figura 2 3 . 3 3 .

Mtodos o funciones virtuales.

bre o un smbolo p o r ejemplo, un operador para representar o significar ms de


una accin. As, en C, Pascal y F O R T R A N entre otros lenguajes los operadores
aritmticos representan un ejemplo de esta caracterstica. El smbolo +, c u a n d o se utiliza con enteros representa un c o n j u n t o de instrucciones m q u i n a , distinto de c u a n d o
los operadores son valores reales de doble precisin. De igual m o d o , en algunos lenguajes el smbolo + sirve para realizar sumas aritmticas o bien para concatenar (unir)
cadenas.
La utilizacin de operadores o funciones de formas diversas, dependiendo de c o m o
estn operando, se d e n o m i n a polimorfismo (mltiples formas). C u a n d o un operador
existente en el lenguaje tal como +, = o * se le asigna la posibilidad de operar sobre un
nuevo tipo de dato, se dice q u e est sobrecargado. La sobrecarga es una clase de polimorfismo, que tambin es una caracterstica importante de POO. U n uso tpico de los
operadores aritmticos es la sobrecarga de los mismos, para actuar sobre tipos de datos
definidos por el usuario (objetos) adems de sobre los tipos de datos predefinidos. Supongamos que se tienen tipos de datos que representan las posiciones de puntos en la
pantalla de un computador (coordenadas x e y). En un lenguaje orientado a objetos, se
puede realizar la operacin aritmtica
posicionl = origen + posicion2

donde las variables posicionl, posicion2 y origen representan cada una posiciones de
puntos, sobrecargando el operador ms (+) para realizar suma de posiciones de p u n t o s
{x, y). Adems de esta operacin de suma se podran realizar otras operaciones, tales como
resta, multiplicacin, etc., sobrecargando convenientemente los operadores - , *, etc.
En un sentido ms general el polimorfismo supone que un m i s m o mensaje puede
producir acciones (resultados) totalmente diferentes cuando se reciben por objetos diferentes. Con polimorfismo u n usuario puede enviar un mensaje genrico y dejar los detalles de la implementacin exacta para el objeto que recibe el'mensaje. El polimorfismo
se fortalece con el mecanismo de herencia.

902

Programacin

en Turbo/Borland

Pascal 7

Supongamos un tipo objeto llamado vehculo y tipos de objetos derivados llamados


b i c i c l e t a , automovil, moto y embarcacin. Si se e n v a u n m e n s a j e c o n d u c i r al o b j e t o ve-

hiculo, cualquier tipo que herede de vehiculo puede tambin aceptar ese mensaje. Al igual
que sucede en la vida real el mensaje conducir reaccionar de modo diferente en cada
objeto, debido a que cada vehculo requiere una forma distinta de conducir.

RESUMEN
Las tcnicas de programacin modular y estructurada han sido consideradas buenas y necesarias
para el desarrollo de productos software de alta calidad. En los ltimos aos, sin embargo, el trmino orientado a objetos se est asociando con buenos y eficientes productos de software y su
uso est cada vez ms extendido. La mayora de los desarrollos de software del futuro se realizarn
con tcnicas orientadas a objetos y, por consiguiente, la transicin de la programacin estructurada
a la programacin orientada a objetos es vital para cualquier profesional o estudiante de informtica.
Los trminos clase y objeto se utilizan, fundamentalmente, para describir conceptos orientados
a objetos de A O O (Anlisis Orientado a Objetos), D O O (Diseo Orientado a Objetos) y P O O
(Programacin Orientada a Objetos). U n objeto es una cosa o concepto que se utiliza para
describir entidades especficas relacionadas con el sistema que se est construyendo. Ejemplos de
objetos en un sistema bancario son clientes y cajeros automticos. Asociado con cada objeto existe
un conjunto de atributos (datos) y comportamiento (operaciones) del mismo.
Una clase es una plantilla o prototipo que describe los atributos y operaciones comunes que se
aplican a un conjunto de objetos relacionados que pertenecen a esa clase. Un objeto especfico se
considera una instancia de una clase y se identifica por un nombre o identificador numrico. As,
por ejemplo, Jos Luis McCoy es un objeto de la instancia (objeto) de la clase Cliente. Otra clase
puede ser Cajero_Automtico (CA) y un objeto de esta clase es el cajero n. 2323 que est situado en
la calle Cantn n. 23 de Carchelejo, pueblo de la provincia de Jan en Andaluca.
Cuando se crea un objeto, se asocia con un conjunto de atributos y operaciones. Los atributos
de Cliente p u e d e n ser NombreCliente,
TipoCuenta,
NumeroCuenta,
NumeroldentijicacionPersonal (NIP) para usar la tarjeta de crdito en el cajero automtico. Las operaciones de un objeto
Cliente pueden ser AbrirNuevaCuenta,
DarBajaCliente,
CalcularSaldo,
LeerTarjetaCA,
Verificar NIP, EntregarDinero, ImprimirRecibo, etc.
Las propiedades fundamentales de la orientacin a objetos son: abstraccin de datos, encapsulamiento, ocultacin de la informacin, herencia, polimorfismo y ligadura dinmica. Una clase es
un nivel alto de abstraccin que consta de una coleccin de objetos (instancias de la clase) que
pueden contener implcita una jerarqua. Esta jerarqua se manifiesta, esencialmente, en la propiedad de la herencia, que a su vez puede ser simple y mltiple, segn que cada clase tenga un nico
ascendiente o ms de un ascendiente. U n ejemplo de una relacin de herencia simple se aprecia
entre las clases Polgono, Rectngulo, Cuadrado y una relacin de herencia mltiple aparece en la
jerarqua Becario, Trabajador, Estudiante, dado que un becario es un estudiante que realiza un
trabajo remunerado que compatibiliza con sus estudios.
Polimorfismo se refiere a la propiedad de que un objeto puede existir como una instancia de
diferentes clases en tiempo de ejecucin. El concepto de polimorfismo se ilustra en la jerarqua de
clases Polgono (superclase, ascendiente), Tringulo, Rectngido y Hexgono (subclases, descendientes). El mtodo o funcin Area que calcula la superficie de un rectngulo, tringulo o hexgono, es una funcin polimrfica ya que tiene diferentes implementaciones en cada objeto, puesto
que tres instancias diferentes de la misma funcin miembro Area se puede referir a tres clases diferentes (una para cada tipo de polgono).
El concepto de ligadura utilizado en una conexin o enlace de un lenguaje de programacin se
refiere a la ligadura de un mensaje (llamada de una operacin asociada con un objeto) y el cdigo
que se ejecuta cuando se recibe el mensaje. En un lenguaje de programacin con ligadura esttica,

Programacin

orientada

a objetos:

modelo

objeto

y relaciones

903

todas las referencias se determinan en tiempo de compilacin. La ligadura dinmica o tarda, significa que el cdigo que se ejecuta en respuesta a un mensaje no se determinar hasta el momento
de la ejecucin. La herencia, polimorfismo y ligadura dinmica estn estrechamente relacionadas,
de modo que la ejecucin de una llamada a una operacin se asocia con una referencia polimrfica
que depende del tipo de referencia esttica o dinmica.
Turbo/Borland Pascal soporta las propiedades bsicas del paradigma orientado a objetos, como
se ver en el siguiente captulo.

EJERCICIOS
23.1.

Identificar los tipos de objetos que pueden aparecer en un sistema de tratamiento de textos.

23.2.

Deducir los objetos vlidos que aparecen en un sistema de archivos del sistema operativo
Windows 95.

23.3.

Realizar un modelo de objetos que simule el juego de ajedrez.

23.4.

Deducir las jerarquas de herencia que aparecen en las siguientes relaciones:

23.5.

U n a persona juega en un cierto equipo deportivo durante todo el ao.


Los modems, teclados y monitores son dispositivos de una computadora.
U n a carretera conecta dos ciudades.
Los ficheros contienen registros.
Un camin es un vehculo y un remolque es un camin.

U n a red de computadoras tiene cuatro terminales conectados a ella, numerados de 1 a 4.


Existen tres usuarios registrados a la red, A, B y C. A est actualmente conectado a los terminales 1 y 3, y C est conectado al terminal 4.
a) Dibujar un diagrama de objetos que represente los posibles objetos y las relaciones que
existen entre ellos.
b) Aadir al diagrama los mensajes que se pueden enviar en respuesta a una peticin a la
red para determinar el nmero de terminales conectados.

23.6.

Una herramienta de dibujo permite el trazado de diferentes tipos de objetos: objetos primitivos y objetos compuestos. Los objetos primitivos son: arco, elipse, polilnea, polgono,
caja y texto. Un objeto primitivo se puede mover, rotar, recortar vertical u horizontal, copiar o borrar. Un objeto compuesto se compone de objetos primitivos. Los objetos primitivos que constituyen u n o compuesto no se pueden modificar individualmente, pero se
pueden manipular como una entidad; es decir, un objeto compuesto se puede mover, rotar,
etctera. Dibujar un diagrama de clases que represente el modelo anterior.

23.7.

Representar el modelo de objetos que representa al personal que trabaja en una universidad
desde alumnos a personal administrativo. U n a vez representados los objetos y sus relaciones, enumere los atributos y operaciones de los objetos ms significativos.

23.8.

Representar el modelo de objetos de un concesionario de automviles y motocicletas que


comercializan vehculos de diferentes marcas europeas, americanas y asiticas. Cada objeto
debe tener nombre, atributos y operaciones.

23.9.

Dibujar un diagrama de clases que represente una biblioteca de una universidad.

23.10. Dibujar un diagrama de clases que represente los diferentes modelos de aviones que existen
en el mundo. Represente el estado y el comportamiento de cada objeto y a continuacin
los posibles mensajes que se pueden enviar entre los diferentes objetos.

Programacin orientada a objetos con Turbo Pascal 7

24.1.

CAPITULO

PROGRAMACION ORIENTADA
A OBJETOS CON TURBO PASCAL 7

LA ESTRUCTURA DE LOS OBJETOS: SINTAXIS

Los objetos se representan en la mayora de los lenguajes de programacin c o m o estructuras de datos. A nivel de programa, los objetos se representan como registros en Pascal.
En Pascal estndar o versiones de T u r b o Pascal anteriores a la 5.5 los datos se definen en estructuras y se manipulan con procedimientos y funciones. Por el contrario, en
Turbo Pascal 5.5 los datos y los procedimientos se combinan en objetos. U n objeto contiene tanto las caractersticas de una entidad (sus datos) y su comportamiento o funcionamiento (sus procedimientos). As como la ecuacin fundamental de la programacin
estructurada en Pascal es el conocido ttulo de una obra de Niklaus Wirth:
algoritmos + estructuras de datos = programas

CONTENIDO
24.1.
24.2.
24.3.
24.4.
24.5.
24.6.
24.7.
24.8.
24.9.
24.10.

La estructura de los objetos: sintaxis


Secciones pblica y privada
Definicin de objetos mediante unidades
La herencia
Los mtodos
Objetos dinmicos
Polimorfismo
Constructores y destructores
Procedimientos new y dispose
Mejoras en Programacin Orientada a Objetos

RESUMEN
EJERCICIOS
El concepto de programacin orientada a objetos, POO (ObjectOriented programming, OOP), no es nuevo; lenguajes clsicos como
Smalltalk se basan en ella. Sin embargo s es nueva la inclusin de
POO en Turbo Pascal. La programacin orientada a objetos se basa
en la idea natural de la existencia de un mundo lleno de objetos, de
modo que la resolucin del problema se realiza en trminos de objetos. En consecuencia, un lenguaje se dice que est basado en objetos si soporta objetos como caracterstica fundamental del lenguaje.
POO entraa una metodologa de programas, que comienza a tener una gran utilidad en la ingeniera del software. El diseo y la programacin POO ayuda considerablemente a los ingenieros de los
programas. Aunque los lenguajes orientados a objetos tpicos son
Smalltalk y Actor, hoy da existen dos lenguajes que estn profundizando en el concepto POO: C++ y Turbo Pascal.
En este captulo se tratan los conceptos bsicos de la programacin orientada al objeto (o a objetos) y cmo se pueden implementar los mismos en las versiones de Turbo Pascal. Como sntesis
indicar que Turbo Pascal 5.5 slo incluye cuatro palabras reservadas
nuevas: object, constructor, destructor y virtual. Turbo Pascal 6.0 incluy prvate y Turbo Pascal 7.0 ha incluido publ ic e i nherited.

la ecuacin bsica en POO es


cdigo + datos = objeto
En T u r b o Pascal las caractersticas o atributos de un objeto se definen de un m o d o
similar a un registro. La diferencia principal es q u e un registro consta totalmente de
campos, mientras que un objeto tiene campos y procedimientos o funciones (mtodos)
asociados con ellos.
El primer paso al trabajar con objetos es declarar un tipo objeto. La sintaxis de una
declaracin de un tipo objeto es similar a la seccin de interfaz de una unidad y la declaracin de un tipo registro. El formato general para declarar un tipo objeto es:
identifcador-tipo = object
declaracin de campos

declaracin de mtodos

end;

donde identificador-tipo
es un identifcador del n o m b r e del objeto; declaracin de campos tiene el mismo formato que la declaracin usual de variables y declaracin de mtodos
es una cabecera de las funciones o procedimientos [mtodos).
Los objetos son tipos de datos definidos por el usuario. Estos tipos se llaman clases,
sus campos dato se llaman variables de instancia y sus procedimientos o funciones se
llaman mtodos. U n mtodo est asociado con un tipo de objeto especfico y no se puede
asociar con otros tipos de datos. U n a declaracin de la clase tiene el formato:
type

NombreClase = object
Campol : TipoVariablel;
Campo2 : TipoVariable2;
904

905

906

Programacin en Turbo/Borland Pasca! 7

Programacin orientada a objetos con Turbo Pascal 7

procedure NombreProcl;
procedure NombreProc2;

907

end;
function MiTipoObjeto.MiFuncion (ArgumentoFuncion :
Integer): Integer;

function NombreFuncl : TipoFuncl;


function NombreFunc2 : TipoFunc2;
end;

U n objeto es una variable que tiene una clase c o m o su tipo y se especifica con una
declaracin de la forma
var
NombreObjeto : NombreClase;

Las clases se denominan tipos objeto. Cada objeto declarado de ese tipo se refiere como
una instancia del tipo objeto. U n tipo objeto es u n a plantilla para crear objetos, al igual
que un tipo registro es una plantilla para crear registros. Se pueden declarar dos variables
del tipo NombreClase.
var
MiObjetol, Mi0bjeto2 : NombreClase;

MiObjetol y Mi0bjeto2 tienen los mismos atributos (los mismos campos) y tienen acceso
a los mismos mtodos (NombreProcl, NombreProc2, NombreFuncl, etc.). La declaracin de las
dos variables tales c o m o MiObjetol y Mi0bjeto2 crean dos reas de memoria diferente que
almacenan los valores de cada u n o de los campos.
La declaracin de una variable con un tipo objeto m a n e j a la tarea de crear instancias
de la clase de objetos. Cmo se comunica el programa con los objetos que ha creado?
Se hace invocando los mtodos asociados con el tipo objeto. La llamada a los mtodos
de los objetos se llaman mensajes y tiene el f o r m a t o
NombreObjeto.NombreMetodo

Por ejemplo, para declarar un tipo objeto llamado MiTipoObjeto que tenga dos camp o s (Campol y Campo2), u n p r o c e d i m i e n t o (MiProcedimiento) y u n a f u n c i n (MiFuncion), se

recurre a la sintaxis de la declaracin del tipo:


type
MiTipoObjeto = object
Campol : Integer;
Campo2 : Real;
procedure MiProcedimiento;
function MiFuncion (ArgumentoFuncion:Integer); Integer;
end;

end;

La notacin p u n t o se utiliza aqu en el mismo sentido que cuando se utiliza para especificar un campo en u n registro o procedimiento, funcin, constante o variable en una
unidad.
Regla:
Los mtodos se definen en dos partes del programa: (1) Las cabeceras se especifican en
la declaracin del tipo de objeto: (2) La implementacin cabecera ms cuerpo fuera
de la definicin del tipo.
La comunicacin entre objetos se realiza va mensajes. Por ejemplo, se pueden declarar dos variables del tipo MiTipoObjeto:
var
MiObjetol, Mi0bjeto2 : MiTipoObjeto;

Para invocar MiProcedimiento con MiObjetol, se escribe


MiObjetol.Miprocedimiento;

Tambin invocaremos a MiProcedimiento con la otra variable de objeto


Mi0bjeto2.MiProcedimiento;

las variables de u n tipo objeto son similares a otras variables Pascal en muchos aspectos.
Por ejemplo, si se permite utilizar una variable de tipo objeto en una sentencia de asignacin tal c o m o la siguiente sentencia:
MiObjetol := Mi0bjeto2;

Esta sentencia copiar los valores de todos los campos de Mi0bjeto2 en los campos
correspondientes de MiObjetol. U n programa en T u r b o Pascal puede acceder a los campos dentro de un registro; para ello se utiliza la notacin punto para cualificar el n o m b r e
de la variable. Por ejemplo, se permite escribir una sentencia tal como
MiObjetol.Campol := 1;

La declaracin real de los mtodos de objetos es a continuacin de la seccin de declaracin de procedimientos del programa. La diferencia entre la declaracin de un procedimiento y de una funcin, es que el identificador de tipo debe preceder al identificador de f u n c i n o p r o c e d i m i e n t o en la cabecera. P o r ejemplo, la declaracin de

Esta sentencia producir que el contenido de Campol en MiObjetol se reemplaza con el


valor 1.

Miprocedimiento y MiFuncion es:

Declarar un objeto Estudiante que contiene los campos Nombre, N o t a l y Nota2 de dos
asignaturas y una funcin que calcule la media de ambas nbtas, as como un procedimiento que informe de dicha media.

procedure MiTipoObjeto.MiProcedimiento;

Ejemplo 2 4 . 1 .

908

Programacin en Turbo/Borland Pascal 7

Programacin orientada a objetos con Turbo Pascal 7

type
Estudiante = Object
nombre : string;
notal : integer;
nota2 : integer;
procedure Iniciar (nm:string; SI, S2:integer);
function Media : real;
procedure Informar;
end;

909

Al e j e c u t a r el p r o g r a m a la s a l i d a s e r
Mortimer calculo de la media 7.5
Mackoy calculo de la media 7.0

l ina sanable de un tipo oblato so conoee c o m o una instiinua. L as instancias tic los objetos
= st il y Fstc? I a llamada al procedimiento Fs/1 informir pasa el mensaje Inoimar al ob-

U n a v a r i a b l e o b j e t o M i E s t u d i a n t e l , q u e es d e l t i p o e s t u d i a n t e se d e c l a r a c o m o
var MiEstudiantel, MiEstudiante2 : Estudiante;
Ejemplo 2 4 . 2
Ejercicio 2 4 . 1

Consideremos
un programa

U n p r o g r a m a q u e hace u s o c o m p l e t o de la clase Estudiante:


program CalcularNotas;
type
{objeto declarado}
Estudiante = Object
nombre : string;
notal : integer;
nota2 : integer;
procedure Iniciar (nm:string, SI, S2:integer);
function Media : real;
procedure Informar;
end;
procedure Estudiante.Iniciar (nm:string; SI, S2:integer);
begin
nombre : = nm
:= SI
notal
:= S2
nota2
end;
function Estudiante.Media -: real
begin
Media := (notal + nota2)/2
end;

{mtodo definido}

un registro
de juegos.

denominado

que se desea

definir

para

disear

type
NaveEspacial = record
Longitud,
Misiles,
Velocidad,
Altitud : Integer;
Activar : Boolean;
end;
var
Icaro, Neptuno : NaveEspacial;
E l f u n c i o n a m i e n t o o c o m p o r t a m i e n t o d e l r e g i s t r o se d e f i n e c o n p r o c e d i m i e n t o s y
f u n c i o n e s q u e r e a l i z a n las t a r e a s t p i c a s d e u n a NaveEspacial: d e s p e g a r , a c e l e r a r , etc.
procedure Despegar;
begin
{...}
end;
procedure Acelerar;
begin
{...}
end;

procedure Estudiante.Informar;
begin
WriteLn (nombre, 'calculo de la media' ,Media:5:l)
end;

procedure Frenar;
begin
{}
end;

var Estdl, Estd2 : Estudiante;


variables
begin {main} cuerpo del programa
Estdl.Iniciar ('Mortimer' , 8, 7);
Estdl.Informar;
Estd2.Iniciar ('Mackoy', 9, 5);
Estd2.Informar
end.

procedure Aterrizar;
begin
{...}
end;

declaradas

NaveEspacial

E l o b j e t o NaveEspacial c o r r e s p o n d i e n t e al r e g i s t r o d e i g u a l n o m b r e s e r e p r e s e n t a c o n
la s i n t a x i s s i g u i e n t e :

910

Programacin en Turbo/Borland Pascal 7


type
NaveEspacial = object
Longitud,
Misiles,
Velocidad,
Altitud : Integer;
Activar : Boolean
procedure Despegar;
procedure Aterrizar;
procedure Acelerar;
procedure Frenar;
end;

Cmo se declaran los procedimientos y funciones en POO? La declaracin de los subprogramas se realiza con mtodos que son rutinas asociadas con un tipo objeto particular
y se consideran como una parte de la definicin de un tipo objeto. En el apartado 24.5
se estudiarn con ms detalle los mtodos.
Para poder utilizar los objetos es preciso asignar un nombre al objeto en la seccin
de declaracin como variables estticas o como punteros asignados a las pilas dinmicas
(se ver ms adelante).
var
Nave : NaveEspacial

A c c e s o a los c a m p o s
Se puede acceder a los campos de datos del objeto tal como se accede a los campos de
un registro ordinario, bien mediante la sentencia with o mediante el signo punto.
Nave.Longitud := 425
with Nave do
begin
Misiles
:= 12;
Velocidad := 30;

end;

Ejemplo 2 4 . 3
El objeto NaveEspacial con las variables y procedimientos definidos se declara en la seccin Type y en la seccin en la que se definen las rutinas ordinarias.
type
naveEspacial = object
Longitud,
Misiles,
Velocidad,
Altitud : Integer;
Activar : Boolean;

Programacin orientada a objetos con Turbo Pascal 7


procedure
procedure
procedure
procedure
procedure
end;

911

Iniciar;
Despegar;
Acelerar;
Frenar;
Aterrizar

La declaracin de los procedimientos en el cuerpo del programa se realiza con el


nombre del objeto y una extensin separada con un punto con el nombre del procedimiento
procedure NaveEspacial.Iniciar;
begin
Activar
:= false;
Longitud := 254;
Misiles
:= 7
end;
procedure Naveespacial.Despegar;
begin
Activar := true
end;

y as sucesivamente. U n a vez que un objeto ha sido definido se pueden declarar variables


utilizando el nombre del objeto.
var
A, B : NaveEspacial;

En los programas se puede escribir el segmento de cdigo


with B do
begin
Iniciar;
Despegar;
Acelerar;
Aterri zar
end;

o bien acceder a determinados campos con


B.Activar := true;

24.1.1.

Encapsulamiento

El encapsulamiento consiste en la creacin de objetos que funcionan como unidades


completas. La combinacin de caractersticas y mtodos (cdigo y datos) dentro del
mismo tipo objeto se denominan encapsulamiento. En el siguiente ejemplo los cuatro
procedimientos estn encapsulados dentro de Libro.

912

Programacin en Turbo/Borland Pascal 7


type
Cadl = string [ 8 0 ] ;
Libro = object
Autor, Titulo, Codigo : Cadl
Precio
: Integer;
{mtodos asociados a Libro}
procedure Iniciar (A, T, C : Cadl; Pr ; Integer);
procedure Escribir
procedure Leer;
procedure Listar
end;
{Libro}

Programacin orientada a objetos con Turbo Pascal 7

pblicos. Dentro de cada seccin pblica o privada, todos los campos dato deben preceder a todos los campos mtodo, tal como se describe en las secciones pblicas y privadas. Por ejemplo, el siguiente tipo objeto tiene tres secciones pblicas y dos secciones
privadas:
type Muestra = object
procedure darNombre (NuevoNombre: string);
function ObtenerNombre : string;
private:
Nombre : string;
public:
Direccin : string;
procedure VerDireccion;
private:
Altura : integer;
Peso
: integer;
public:
function CalcularPeso (valor:integer):boolean;
end;

El programador nunca necesita acceder directamente a los campos dato de un objeto.


En el ejemplo anterior, los objetos listados contienen slo cuatro campos de datos: Autor,
Titulo, Codigo y Precio. Para facilitar el acceso a estos campos, el objeto define cuatro
procedimientos, cada uno de los cuales puede informar o alterar el valor de un campo.

24.2.

SECCIONES PUBLICA Y PRIVADA

Las versiones 5 y 6.0 permitan declarar secciones privadas que servan para restringir el
acceso a cualquiera de los campos de datos y mtodos; esto se consegua definiendo una
seccin privada (mediante la clusula private). Posteriormente, la versin 7.0 incorpor
la posibilidad de declarar explcitamente la seccin pblica con la palabra reservada public. Cuando no se indica expresamente la seccin private, toda la seccin correspondiente es pblica, que son todas los tratadas anteriormente.

Regla

Declaracin de una clase

Declaracin de un objeto

type NombreClase = object


{seccin publica}
public
campos datos pblicos
mtodos pblicos
{seccin privada}
private
campos dato privados
mtodos privados
end;
{objeto}

Los campos y mtodos privados son accesibles slo dentro de la unidad o programa
que contiene la definicin del tipo de objeto. Normalmente y con el objeto de conseguir
la ocultacin de datos, se debe recurrir a la seccin privada. Despus de la primera seccin pblica (sin etiquetar) y la seccin privada (opcional) introducida con el identificador private, se puede incluir otra seccin de componentes pblicos. Para hacer esta
operacin, insertar la palabra reservada o clusula public y a continuacin los componentes pblicos. Despus de eso, se puede insertar el identificador prvate y ms componentes privados, y a continuacin insertar el identificador publ i c y ms componentes

913

Normalmente un lino objeto tiene sus campos datos privados y todos o casi todos sus mtodos pblicos, constituyendo la inlerla/ de objeto.

Seccin pblica
Seccin privada

Contiene los campos dato y los mtodos disponibles al resto de los


mdulos.
Contiene campos y mtodos que slo estn disponibles para los subprogramas que contienen la definicin del tipo de objetos.
Se recomienda que los campos sean privados.

Ejemplo 2 4 . 3 .
Declaracin de algunos tipos objetos
1.

type Edad = object


procedure Iniciar;
procedure Avanzar (Cantidad:word);
function CalcularAnyos:word;
procedure imprimir;
private
Meses:word;
end;

914
2.

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7


type TipoCirculo = object
procedure Iniciar (R:real);
function Radio : real;
function Dimetro:real;
function Area:real;
function Circunferencia:real;

24.3.
{inicia circulo y radio}
{Devuelve el radio}
{Devuelve el dimetro}
{Devuelve el area}
(devuelve la
circunferencia}

private
EIRadio:real;
end; {objeto}

Una vez declarado el tipo de objeto TipoCirculo se puede declarar una variable objeto
var MiCirculo : TipoCirculo;

que se llama una instancia del tipo TipoCirculo. Recuerde que las solicitudes a
un objeto se llaman mensajes y son simplemente llamadas a procedimientos o
funciones. Por consiguiente, un objeto responde a un mensaje actuando sobre
sus datos. Asimismo recuerde tambin que los mtodos se han de implementar
posteriormente en el programa o, si el objeto es parte de una unidad, en la seccin de implementacin de la unidad.
Implementacin de los m t o d o s
Cuando se implementa un mtodo su nombre se cualifica con el tipo de dato del objeto.
As, en el caso del objeto TipoCirculo el mtodo Dimetro se i m p l e m e n t a de la forma si-

guiente:
function TipoCirculo.Dimetro : real;
begin
Dimetro := 2.0 * EIRadio
end;

Observe que el nombre de la funcin es TipoCirculo.Dimetro y no simplemente Dimetro. Dentro del cuerpo del subprograma que define un mtodo del objeto, se pueden
referenciar los campos dato del objeto y otros mtodos sin tal cualificacin. Sin embargo, cuando se invoca un mtodo desde el exterior la definicin del objeto, esto es, de
otras partes del programa, se debe cualificar el nombre del mtodo con una variable objeto. Por ejemplo, se puede escribir
MiCirculo.Iniciar (4.25);
WriteLn (MiCirculo.Dimetro);

para iniciar un objeto de radio 4.25 y visualizar su dimetro: se puede utilizar, al igual
que con registros, la sentencia with, tal como
with MiCirculo do
begin
Iniciar (4.225);
WriteLn (Dimetro)
end;

915

DEFINICION DE OBJETOS MEDIANTE UNIDADES

La definicin de un objeto dentro de una o ms unidades proporciona normalmente un


medio adecuado para utilizar objetos en otros programas. Cuando se define un objeto
dentro de una unidad, la seccin privada del objeto est oculta al programa que utiliza
la unidad.

Ejemplo 2 4 . 4 .
La siguiente unidad contiene la definicin del objeto TipoCirculo examinado
mente.

anterior-

unit UnCirculo;
interface
type
TipoCirculo = object
procedure Iniciar (R: real);
function Radio
: real;
function Dimetro : real;
function Area
: real;
function Circunferencia : real;
procedure VerEstadisticas; {estadsticas del circulo}
private
Elradio : real;
end;
implementation
procedure TipoCirculo.Iniciar (R : real);
begin
EIRadio := R
end;
{TipoCirculo.Iniciar}
function TipoCirculo.radio : real;
begin
Radio := EIRadio
end;
{TipoCirculo.Radio}
function TipoCirculo.Dimetro : real;
begin
Dimetro := 2.0 * EIRadio
end;
{TipoCirculo.Dimetro}
function TipopCirculo.Area : real;
begin
Area := Pi * sqr (Elradio)
end;
{TipoCirculo.Area}
function TipoCirculo.Circunferencia : real;
begin
Circunferencia := Pi * Dimetro
end;
{TipoCirculo.Circunferencia}

916

Programacin

en Turbo/Borland

procedure TipoCirculo.VerEstadsticas;
begin
WriteLn;
WriteLn ('Radio = ', Radio:6:1);
WriteLn ('Dimetro =
Dimetro:6:1);
WriteLn ('Circunferencia =
Circunferencia:12 :1) ;
WriteLn ('Area =
Area:12:l);
end;
{TipoCirculo.VerEstadisticas}
end.

24.3.1.

Programacin

Pascal 7

{unidad}

Uso de un tipo objeto

El siguiente programa muestra cmo utilizar una unidad

orientada a objetos con Turbo Pascal 7

917

\ o es usual que un tipo objeto tcuya Unas estas partes pe o esta peimitido. Noimalmcnte
un objeto tendr todos o la mayora de sus campos dato privados \ todos o la mayora de
sus mtodos pblicos

24.4.

LA HERENCIA

La herencia es una propiedad (mecanismo) que permite a un objeto heredar propiedades


de otra clase de objetos. La herencia permite a un objeto contener sus propios procedimientos o funciones y heredar los mismos de otros objetos.
Regla

Solo tipos objetos pueden heiedar caiaUeristicas de olios tipos objeto. 1 a heiencia no es
posihle paia olas eslrucluias de datos (tales como registros)

program DemostrarUsoUnidad;
uses Circulo;

Ejemplo 2 4 . 5

var MiCirculo : TipoCirculo;

Se desea disear una aplicacin bancaria teniendo presente los diferentes tipos de cuentas: Ahorro, Corriente, Financiera, Plazo Fijo. Describir las posibles relaciones de herencia.

begin {programa principal}


{establecerradio}
MiCirculo.Iniciar (6.25);
{visualizar radio; dimetro, circunferencia, area}
MiCirculo.VerEstadisticas ;
end.

Dado que la definicin del tipo objeto est dentro de la unidad que utiliza este programa, se puede invocar cualquier mtodo del objeto dentro del programa, pero no se
puede acceder al campo dato privado del objeto mtodo del objeto dentro del programa,
pero no se puede acceder al campo dato privado del objeto El Radio.

Reglas d e d i s e o d e un o b j e t o
Aunque no son rigurosas las reglas de diseo, s que es recomendable seguir algunos criterios a la hora de construir sus tipos objetos. Estas reglas son:
1.
2.

Los campos pblicos preceden a los campos privados y dentro de cada u n o de


estos dos grupos, los campos dato preceden a los mtodos.
El orden de los campos debe ser:
a. Todos los campos datos pblicos.
b. Todas las cabeceras de mtodos pblicos.
c. El identificador (clusula) private.
d. Todos los campos dato privados.
e. Todos los mtodos privados.

La cuenta de ahorro a Plazo Fijo son casos especiales de cuentas de ahorro. Cada tipo
de cuenta contiene u n nombre de cliente, un nmero de cuenta, un saldo y una tasa de
inters. Las cuentas corrientes y financieras permiten extender cheques mientras que las
cuentas de ahorro no lo permiten. Las cuentas de ahorro y corriente son subclases de
Cuenta y las cuentas de Plazo Fijo son una subclase de las cuentas de ahorro.
Definicin de tipos ascendientes/descendientes
La propiedad herencia permitir definir tipos objetos descendientes o ascendientes (antepasados) de u n tipo objeto dado. La herencia hace las tareas de programacin ms f-

918

Programacin en Turbo/Borland PascaI 7

Programacin orientada a objetos con Turbo Pascal 7

ciles, ya que se pueden crear sus objetos de modo creciente. Es decir, se puede definir un
tipo general de objeto y se utiliza c o m o u n a parte de objetos especficos sin necesidad de
tener que aclarar todos los campos individuales nuevamente.
Para definir un tipo objeto descendiente, basta con incluir el n o m b r e del tipo ascendiente dentro de un parntesis despus de la palabra reservada object.

La herencia en POO es similar a la tcnica de registros anidados en Turbo Pascal. Permite


que un nuevo objeto herede las caractersticas de un antepasado.

La propiedad de la herencia hace las tareas de programacin m u c h o ms fciles y


ms flexibles. N o se piensa escribir cada una de las caractersticas explcitamente para
cada elemento, ya que los elementos pueden heredar caractersticas de otros.
Por ejemplo, si se trata de representar informacin sobre animales, se puede diferenciar entre mamferos, pjaros, insectos, etc., que compartirn caractersticas c o m u n e s de
animales. Los pjaros son descendientes del objeto Animales, y, por el contrario, Animales es ascendiente o antepasado de pjaros. De igual m o d o , Aguilas es u n descendiente de Pjaros y en consecuencia de Animales.
Para definir un tipo objeto que hereda de un ascendiente se debe incluir el n o m b r e
del tipo ascendiente dentro de un parntesis y despus la palabra reservada object.

nombre tipo descendiente

Figura 2 4 . 2 .

Declaracin s u b c l a s e
type NombreClase2 = object (NombreClasel)
nuevaVarlnstl : TipoNuevaVarl;
nuevaVarInst2 : TipoNuevavar2;
procedure NuevoNombreProcl;
procedure NuevoNombreProc2;
function NuevoNombreFuncl;
function NuevoNombreFunc2;
end;

- object (nombre ascendiente)

Cuando una clase se deriva de otra clase se le d e n o m i n a subclase y a la vez raz, clase
base o superclase.
U n a subclase hereda todas las variables de instancias y mtodos de la superclase y a
continuacin se definen los nuevos. La declaracin de una subclase difiere de la de una
clase, slo en u n a cosa, el n o m b r e de la clase base aparece entre parntesis despus de la
palabra reservada object.

Duracin de NombreClasel.

Ejemplo
Declarar la jerarqua de las clases siguientes
type
TipoClase = string[20];
CadenaNOmbre = string[30];

Figura 2 4 . 3 .

Jerarqua de clases.

Nuevas variables
de instancia

Nuevos
mtodos

919

920

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7


Persona =

object
Nombre : CadenaNombre;
procedure CambiarNombre (NuevoNombre :
CadenaNombre);

end;
{persona}
Estudiante = object {persona)
Clase : TipoClase;
Media : real;
procedure ImprimirRegistro;
end;
procedure Persona.CambiarNombre (NuevoNombre:CadenaNombre)
begin
{Persona.CambiarNombre}
Nombre := NuevoNombre;
end;
{Persona.CambiarNombre}
procedure Estudiante.ImprimirRegistro;
begin
{acciones}
end;
Ejemplo
var
Pl, P2 : Persona;
El, E2 : Estudiante;
As u n a i n s t a n c i a El d e c l a r a d a del t i p o E s t u d i a n t e se p u e d e m a n i p u l a r del m o d o siguiente
El.Nombre := 'Pepe Mackoy';
WriteLn (El.Nombre);
El.CambiarNombre ('Luis Carrigan');
WriteLn (El.Nombre);
El t i p o e s t u d i a n t e t i e n e m s c a m p o s d a t o q u e el t i p o Persona. L a s i n s t a n c i a s El y E2
t i e n e n los c a m p o s d e d a t o s l l a m a d o s Clase y Media, as c o m o el c a m p o d a t o l l a m a d o Nombre. E l t i p o h e r e d a el m t o d o CambiarNombre d e l a c l a s e Persona, p e r o p u e d e t a m b i n t e n e r
o t r o s m t o d o s q u e se a p l i c a n s l o al t i p o E s t u d i a n t e t e n d r el m t o d o I m p r i m i r R e g i s t r o
a d e m s d e l m t o d o CambiarNombre q u e se h e r e d a d e l t i p o Persona.

Ejemplo 2 4 . 6
Tipos

objetos
type

relacionados

entre s por la propiedad

de la herencia.

Coordenadas = object
{coordenadas ascendiente}
X, Y : integer
end;
Pixel = object (Coordenadas) {Punto, descendente}
Visible : Boolean
end;

921

E n este e j e m p l o se p u e d e n d e f i n i r d e s c e n d i e n t e s d e l t i p o P i x e l , y a s u v e z d e s c e n d i e n tes d e l t i p o d e s c e n d e n t e d e P i x e l , y as s u c e s i v a m e n t e . P i x e l es d e s c e n d i e n t e d e C o o r d e n a d a s . A l a i n v e r s a C o o r d e n a d a s es a n t e p a s a d o i n m e d i a t o d e P i x e l .

l ' n tipo objeto puede tener cualquier numero Je descendientes inmediatos, pero slo un
antepasado inmediato.

Ejemplo 2 4 . 7
Definicin
de un tipo objeto escrito con los campos Autor,
cacin, Nmero
de pginas
y de los objetos descendientes
y Folleto, cuya estructura
se muestra
en la Figura 24.5.

program Demo;
type
Cad80
= string [80];
CadlO
= string [10];
Escrito = object
Autor, Titulo,Codigo
Anno, Paginas
end;
Libro
= object (Escrito)
Editorial : Cad80;
Precio
: real
end;
Articulo = object (Escrito)
Periodico, Seccin :
Fecha
:
end;
{Articulo}
Folleto = object (Escrito)
Tema : Cad80
end;
{Folleto}
var
MiEsc
: Escrito;
MiLibro
: Libro;
MiArticulo : Articulo;
MiFolleto
: Folleto;
begin
{codigo}

Ttulo, Cdigo,
Libro, Artculo

: Cad80;
: Integer;

Ao de publi(de peridico)

{Escrito}

Cad80;
CadlO

end.
E n el c a m p o A r t i c u l o , a d e m s d e t o d o s l o s c a m p o s d e l o b j e t o e s c r i t o , se e n c u e n t r a n
d e f i n i d o s l o s c a m p o s P e r i o d i c o , Seccin y Fecha. A u n q u e l o s c a m p o s n u n c a se m e n c i o n a n e x p l c i t a m e n t e e n l a d e f i n i c i n d e A r t i c u l o , e s t e t i p o t e n d r c a m p o s d e c a d e n a Cad80
y CadlO, a d e m s d e l o s p r o p i o s d e l t i p o E s c r i t o .

922

Programacin

en Turbo/Borland

Programacin

Pascal 7

24.4.2.

orientada a objetos con Turbo Pascal 7

923

Herencia con inherited

Esta nueva palabra reservada se puede utilizar para representar al ascendiente, iriherited,
se utiliza en la llamada de u n mtodo heredado de un objeto ascendiente [padre) a partir
de un objeto descendiente (hijo). En las versiones anteriores era necesario especificar el
nombre preciso del padre para activar u n o de sus mtodos. Con la nueva versin 7.0,
basta situar la palabra clave inherited delante de la llamada al mtodo. Esta caracterstica evitar las modificaciones ulteriores del cdigo de una aplicacin si la jerarqua de
una biblioteca de objetos se modifica.
En las versiones 5.X/6.0/7.0 se realizar la activacin de un mtodo especificado mediante el designador de mtodo cualificado. Este tipo de llamada se conoce como una
activacin de mtodo cualificado. Su diagrama de sintaxis es:

Figura 2 4 . 4 .

Descendiente del objeto Escrito.

Los campos heredados se representan todos al mismo nivel. Por ejemplo, si Mi Libro
es de tipo Libro, los siguientes campos son vlidos
MiLibro.Editorial
MiLibro.Precio

MiLibro.Autor
MiLibro.Titulo

MiLibro.Codigo
MiLibro.Paginas

Reglas
C liando se espeufita que un tipo objeto es un descendiente de otro tipo, la clase descendiente hereda todas las caractersticas de la clase ascendiente, asi como cualquier clase heredada por el tipo ascendiente o sus antecedoies.

Se puede transportar la herencia a otros niveles de descendientes. Por ejemplo, se


puede definir Tcnico como un objeto derivado de Libro (por ejemplo, libro tcnico).
{Definir un tipo objeto que herede las caractersticas de
Libro que a su vez hereda caractersticas de Escrito. Una
variable Tcnico tendr ocho campos, siete campos de Libro,
cinco de Escrito y un campo mas llamado especialidad}
type Tcnico = object (Libro)
especialidad : Cad80;
end;
var
LiTec : Tcnico;

Los siguientes campos son vlidos:


LiTec.Autor;
LiTec.Titulo;
LiTec.Paginas;

As, por ejemplo, imaginemos que se tiene un tipo Tdibujo, del cual se deriva TDibujo3D.
N o r m a l m e n t e para acceder al procedimiento m t o d o Dibujar del ascendiente se debe
utilizar al m t o d o cualificado y en consecuencia el format o TDi bu jo. Dibujar. Sin embargo, ahora con la versin 7.0 c o m o inherited es opcional se puede utilizar tambin
inherited Dibujar. Cul es la ventaja? Si en una etapa posterior la jerarqua de objetos
se modifica, no ser necesario modificar el cdigo de la aplicacin. As, si el mtodo Di bujar se mueve a un objeto llamado TGraficos en una etapa posterior, no tiene que cambiar las funciones del descendiente que cuenta con ellos.
C l u s u l a inherited
Cuando se inicializa un objeto derivado o descendiente (subclase), el primer paso a dar
es la llamada al mtodo Iniciar de su ascendiente inmediato (superclase). Esta operacin
ayuda a evitar cdigo duplicado ahorrando al mtodo Iniciar del objeto descendiente la
inicializacin de los campos de datos definidos en el objeto ascendiente. La palabra reservada inherited permite llamar al mtodo, Iniciar del ascendente sin conocer el nombre del ascendiente. Es decir, suprimiendo la jerarqua de tipos del objeto persona-Estudiante
type
Edades = 0..12 0;
Persona = object
Apellido : string [25];
Nombre
: string [20];
Edad
: Edades;
procedure Iniciar;
,
procedure PonerNombre (NombreNuevo, ApellidoNuevo:string);
end;

924

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7

925

Figura
Visualizar

Crculo
Figura 2 4 , 5 .

Jerarqua Persona-Estudiante.

V
Figura 2 4 . 6 .
Estudiante = object (Persona)
Grupo
: string[10]
Profesor : string[30];
Curso
: integer;
procedure Iniciar;
end;

Los procedimientos Iniciar pueden ser stos:


procedure Persona.Iniciar;
begin
Apellido := ' 1 ;
Nombre
:= '';
Edad
:= 0;
end;
procedure Estudiante.Iniciar;
begin
inherited Iniciar;
Grupo
Profesor
Curso
0;
end;

En general inherited permite referirse a mtodos del ascendiente {su superclase) sin
utilizar el nombre del tipo ascendiente como un cualificador. Otro ejemplo puede ser la
jerarqua Figura-Di bu jar.
El mtodo Circulo.Visualizar contiene la llamada al mtodo Figura.Visualizar para
referenciar al mtodo Visualizar definido en el tipo objeto Figura ascendiente de Circulo.
Utilizando inherited la llamada comparable al mtodo correspondiente ser:
inherited Visualizar

Visualizar

J e r a r q u a d e t i p o s d e o b j e t o s Figura-Circulo.

I a palabra reseivaila nhprted no se puede utilizaren mtodos de objetos que no tengan un


tipo ascendiente o supe:clase

24.5.

LOS METODOS

U n a caracterstica importante en programacin orientada a objetos es la capacidad para


especificar mtodos cuando se define u n objeto. U n mtodo es una rutina asociada con
un tipo objeto especificado. Esta rutina est disponible a cualquier objeto y objetos descendientes. En esencia es u n a parte de una definicin del tipo objetos.

Un mtodo es un procedimiento
o funcin que est asociado a un tipo de objeto. No se pueden asociar mtodos con otros tipos de datos.

Los procedimientos

y funciones

declaradas

dentro de un objeto se conocen como mtodos.

Los mtodos se definen en dos partes en el programa: las cabeceras de los procedimientos y funciones se especifican en la declaracin del tipo objeto, y la implementacin
(esto es, cabecera ms cuerpo) de estos subprogramas aparece" fuera de la definicin de
tipo.

926

Programacin

24.6.

en Turbo/Borland

Pascal 7

OBJETOS DINAMICOS

U n programa puede tener variables dinmicas de un tipo objeto y punteros a tales instancias de objetos dinmicos. T u r b o Pascal proporciona diversas caractersticas especiales que se aplican a objetos dinmicos. Se pueden asignar dinmicamente campos de un
objeto, de hecho se pueden asignar objetos completos dinmicamente.

24.6.1.

Programacin

927

que son equivalentes a la siguiente forma ampliada de new:


new (P, Iniciar ('PepeMackoy');
Ejemplo
Asignar instancias dinmicamente

de TipoCirculo mediante sentencias

type PtrTipoCirculo = "TipoCirculo;


var PtrMiCirculo : PtrTipoCirculo;

Asignacin de objetos dinmicos

Cuando a un objeto se le asigna memoria en tiempo de compilacin y permanece asignada durante la ejecucin del programa es un ejemplo de objeto asignado estticamente.
En contraste, la memoria de un objeto asignado dinmicamente se asigna durante la ejecucin del programa y slo permanece asignada mientras se desee.
Los objetos dinmicos se asignan mediante el uso del identificador estndar new.
Cuando se crea una variable dinmica con una llamada a new, ha de ser seguida por
u n a llamada a un constructor. Para facilitar el proceso, la operacin new ha sido ampliada de m o d o que pueda ser llamada con dos parmetros: una variable puntero como
primer parmetro y una llamada al constructor como segundo parmetro.

orientada a objetos con Turbo Pascal 7

Crear a continuacin una instancia del objeto dinmico utilizando el procedimiento


new

new (PtrMiCirculo)
o la funcin new
PtrMiCirculo := new (PtrTipoCirculo)
Si el tipo objeto contiene mtodos virtuales, c o m o es el caso de
llamar a su constructor:

Formato

TipoCirculo,

se debe

PtrMiCirculo".Iniciar(5.5)
type
tipo_objeto = object
nombre:string;
constructor nombre_constructor ;
end;
ptr_tipo_objeto = "tipo_objeto;
constructor tipo_objeto,nombre_constructor;
begin
{acciones}
end;
var
varp : ptr_tipo_objeto;
begin
new (varp);
varp".nombre_constructor ;
{o bien}
new (varp, nombre_constructor) ;
{o bien}
varp := new (ptr_tipo_objeto,nombre_constructor) ;

Suponga que P es una variable puntero, iniciar es un constructor de variables dinmicas de su tipo de dominio. U n a nueva variable dinmica se puede crear e inicializar
con las siguientes dos llamadas:
new(P);
P". Iniciar ('Pepe Mackoy');

T u r b o Pascal extiende new para incorporar las etapas anteriores. Se puede escribir o
bien
new(PtrMiCirculo, Iniciar(5.5))
o bien
PtrMiCirculo := new(PtrTipoCirculo, Iniciar(5.5))

24.6.2.

Liberacin de memoria y destructores

Cuando se desea liberar la memoria asignada a objetos dinmicos se ha de utilizar el procedimiento d i s D O s e


Formato
Dispose (varp);
Dispose (varp, destructor);

Ejemplo
Dispose(x);
Dispose(x, Done);

928

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7

Los objetos asignados dinmicamente que contienen mtodos virtuales se deben definir de un mtodo especial - l l a m a d o destructor- dentro del objeto. El destructor, que
por convenio se suele nombrar por Done (Terminado), realiza todas las tareas necesarias
para liberar el objeto.
Para liberar un objeto dinmico que tiene mtodos virtuales, se utiliza el formato
ampliado del procedimiento dispose:

implementation
constructor Item.Iniciar;
begin
Enlace := nil;
end;
destructor Item.Terminado;
begin
end;

dispose (PtrMiCirculo, Done);

Si el objeto contiene campos asignados dinmicamente, el destructor del objeto debe


llamar tambin a dispose.
Un objeto puede heredar su destructor desde un objeto ascendiente. U n objeto puede
tener varios destructores para tratar diversas situaciones, pero se llama slo a un destructor por instancia del objeto. Los destructores pueden ser o bien estticos o virtuales, aunque son recomendables los destructores virtuales para asegurar que futuros descendientes del objeto pueden liberarse por s mismos correctamente. Los destructores son
necesarios slo para objetos asignados dinmicamente u objetos con campos asignados
dinmicamente.

procedure Item.Imprimir;
begin
end;
procedure Pila.Inicializar;
begin
Cima := nil;
end;
procedure Pila.Meter (Elem : ItemPtr);
begin
Elem
Enlace := Cima;
Cima := Elem;
end;

Problema 2 4 . 1 .
La unidad PilaPrueba es una pila implementada utilizando objetos dinmicos. La pila se
implementa como una lista enlazada. El puntero Cima apunta a la cabeza de la lista enlazada que sirve tambin como elemento superior de la pila. Las operaciones meter y sacar se realizan insertando y borrando nodos en la cabeza (cima) de la lista.

procedure Pila.Sacar (var ElemSup: ItemPtr);


begin
ElemSup := Cima;
Cima := Cima "^.Enlace;
end;

{$R}
unit PilaPr; {pilaPrueba}
{pila generica}
interface
type ITemPtr = ^Item;
Item = object
constructor Iniciar;
destructor Terminado; virtual;
procedure Imprimir; virtual;
private
Enlace : ItemPtr;
end;
Pila = object
procedure Inicializar;
procedure Meter (Elem : ItemPtr);
procedure Sacar (var ElemSup : ItemPtr);
function vacia : boolean;
procedure LiberarPila;
private
Cima : ItemPtr;
end;

function Pila.Vacia : boolean;


begin
Vacia := (Cima = nil);
end;
procedure Pila.LiberarPila;
var
Aux : ItemPtr;
begin
while Cima < > nil do
begin
Aux
:= Cima;
Cima := Cima
Enlace;
dispose (Aux, Terminado);
end;
end;
end.

929

930

Programacin en Turbo/Borland Pascal 7

24.6.3.

La clusula

Self

En la definicin/declaracin de un mtodo existe siempre un parmetro implcito con el


identificador Self, que corresponde a un parmetro formal variable que posee el tipo objeto. En el bloque del mtodo, Self representa la instancia cuyo componente mtodo fue
designada para activar el mtodo. Por consiguiente, cualquier cambio realizado a los valores de los campos de Sel f se reflejan en la instancia.
Esta propiedad de Self se manifiesta de modo prctico del modo siguiente: los identificadores de campos de un objeto no se pueden redefinir como parmetros formales o
identificadores locales en ninguno de los mtodos del objeto. Es posible, sin embargo,
para los identificadores que no son parte del objeto, tener el mismo nombre que los
identificadores de campo del objeto. Para referir a un campo de un objeto que tenga el
mismo nombre que otro identificador del mismo mbito, el identificador de campo del
objeto puede ser cualificado por el identificador Self. Dentro de un mtodo, Self siempre se refiere a la instancia del objeto que hace la llamada del mtodo. Por ejemplo, en
el tipo objeto Figura
type
F i g u r a = object
Forma
: String;
Area, Perimetro : Real;
constructor ObtenerFigura;
procedure CalculoArea; virtual;
procedure CalculoPerimetro; virtual;
procedure Visualizar; virtual;
end;

dentro del mtodo Figura.CalculoArea una asignacin al campo Area del objeto se puede
escribir como:
Self.Area := 25.0;

Problema 2 4 . 2
Escribir un programa que represente la jerarqua de objetos: Figura, Crculo y Rectngulo.
La jerarqua de estos tres objetos es

Programacin orientada a objetos con Turbo Pascal 7


O b j e t o Figura

CamposDato;

Mtodos

Objeto Circulo

CamposDato
Mtodo

Objeto Rectngulo CamposDato

Area
Permetro
Forma
CalculoArea
CalculoPerimetro
Visualizar
Radio
CalculoArea
CalculoPerimetro
Visualizar
Altura
Anchura
CalcularArea
CalcularPerimetro
Visualizar

tipo real
tipo real
tipo cadena
superficie figura
permetro figura
ver la figura
tipo real

tipo real
tipo real

unit FigGeo;
interface
type
Figura = object
Tipo
: String
(tipo de figura}
Area
: Real;
Perimetro : Real ;
constructor ObtenerFigura;
procedure CalculoArea; virtual;
procedure CalculoPerimetro; virtual;
procedure Visualizar; virtual;
end
{Figura}
Rectngulo = object (Figura)
Altura, Anchura : Real;
constructor Iniciar (Alt, Anch: Real);
procedure CalculoArea; virtual;
procedure calculoPerimetro; virtual;
procedure Visualizar; virtual;
end;
{Rectngulo}
Circulo

object (Figura)
Radio
: Real;
constructor Iniciar (R : Real);
procedure CalculoArea; virtual;
procedure CalculoPerimetro; virtual;
procedure Visualizar; virtual;
end;
{circulo}

implementation
constructor Figura.ObtenerFigura;
{inicializa objetos del tipo figura}
begin
Write('Introduzca nombre de la figura: 1 );
ReadLn (Tipo)
end;

931

932

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7

Radio := R
end;
{iniciar}

procedure Figura.CalculoArea; {asigna valor cero


a Areaj

procedure Circulo.CalculoArea;
{Clculo de la superficie del crculo}
begin
Area := 3.1416 * Radio * radio
end;
{CalculoArea}

begin
Area := 0.0
end;
{CalculoArea}
procedure Figura.CalculoPerimetro; {asigna
valor cero a Permetro}

procedure Circulo.CalculoPerimetro;
{clculo de la longitud de la circunferencia}
begin
Perimetro := 2 * 3.1416 * radio
end;
{CalculoArea}

begin
Perimetro := 0.0
end;
{CalculoPerimetero}
procedure
begin
WriteLn
WriteLn
WriteLn
end;

Figura.Visualizar;
('El tipo de figura e s : T i p o ) ;
('El area es
Area:4:2);
('El perraetero es
Perimetero:4:2);

{implementaciones del tipo objeto Rectngulo}


constructor Rectngulo.Iniciar (Alt, Anch:Real);
{inicializa objetos de tipo rectngulo}
begin
Tipo
:= 'Rectngulo';
Altura
:= Alt;
Anchura := Anch
end;
procedure Rectngulo.CalculoArea;
{clculo del rea de objetos rectngulo}
begin
Area := Altura * Anchura
end;
procedure Rectngulo.CalculoPerimetro;
{clculo del permetro del rectngulo}
begin
Perimetro : = 2 * (Anchura + Altura)
end;
procedure Rectngulo.Visualizar;
{Visualiza los datos del objeto rectngulo}
begin
Figura.Visualizar;
WriteLn ('La anchura es:', Anchura : 5 : 2 ) ;
WriteLn ('La altura es:', Altura:6:2) ;
end;
{implementaciones del tipo objeto Circulo}
constructor Circulo.Iniciar (R:Real);
{inicializa objetos de tipo Circulo}
begin
Tipo :=
'Circulo';

933

end.

procedure Circulo.Visualizar;
begin
Figura.Visualizar;
WriteLn ('El radio es:', radio:6:2)
end;
{Visualizar}
{Final de Unidad FigurasGeom}

El mtodo Visualizar podra implementarse de forma que comenzara por llamar a


los m t o d o s CalculoArea y C a l c u l o P e r i m e t r o y, a c o n t i n u a c i n , p r e s e n t a r a l o s r e s u l t a d o s
o b t e n i d o s . A u n q u e CalculoArea y C a l c u l o P e r i m e t r o se h a n r e d e f i n i d o y s o n d i s t i n t o s e n

cada objeto, es posible definir Visualizar una sola vez, como se muestra en el siguiente
programa, constituyendo un ejemplo de polimorfismo:
unit FigGeo;
interface
type
figura = object
tipo
.- string;
area
: real,
perimetro : real;
constructor ObtenerFigura;
procedure CalculoArea; virtual;
procedure CalculoPerimetro; virtual;
procedure visualizar;
end;
rectngulo = object(Figura)
altura, anchura : real;
constructor iniciar (alt, anch : real);
procedure CalculoArea; virtual;
procedure CalculoPerimetro; virtual;
end;
circulo = object (figura)
radio : real;
constructor iniciar (r : real);
procedure CalculoArea; virtual;
,
procedure CalculoPerimetro; virtual;
end;

934

Programacin en Turbo/Borland Pascal 7


implementation
constructor Figura.ObtenerFigura;
begin
Write( 1 Introduzca el nombre de la figura:');
P.eadLn (tipo)
end;
procedure Figura.CalculoArea;
begin
area := 0.0
end;
procedure Figura.CalculoPerimetro;
begin
perimetro := 0.0
end;
procedure Figura.Visualizar;
begin
CalculoArea;
CalculoPerimetro;
WriteLn('El tipo defigura es:',tipo);
WriteLn('El rea es:
',area:4:2);
WriteLn('El perimetro es:
perimetro: 4 : 2
end;
constructor Rectngulo.iniciar(alt, anch : real)
begin
tipo := 'Rectngulo';
altura := alt;
anchura : = anch
end;
procedure Rectngulo.CalculoArea ;
begin
area := altura * anchura
end;
procedure Rectngulo.CalculoPerimetro;
begin
perimetro := 2 * (altura + anchura)
end;
constructor Circulo.iniciar (r : real);
begin
tipo := 'Circulo');
radio := r
end;
procedure Circulo.CalculoArea;
begin
area := 3.141516 * radio * radio
end;
procedure Circulo.CalculoPerimetro;
begin
perimetro := 2 * 3.141516 * radio
end;
end.

Programacin orientada a objetos con Turbo Pascal 7

935

Program llamaobj;
uses FigGeo;
var
ladol, lado2 : real;
r
: rectngulo;
radio
: real;
c
: circulo;
begin
ReadLn (ladol, lado2);
r. iniciar (ladol, lado2) ;
r. visualizar;
ReadLn(radio);
c. iniciar(radio);
c. visualizar
end.

24.7.

POLIMORFISMO

El polimorfismo y la ligadura de tipos dinmica (en tiempo de ejecucin) son dos caractersticas especficas de la programacin orientada a objetos. Polimorfismo significa que
el mismo operador se puede utilizar con diferentes tipos de objetos que respondern del
modo apropiado a ese programador. Por ejemplo, el operador + es polimrfico (se dice
tambin que est sobrecargado) en Pascal ya que indica concatenacin, suma o unin,
en funcin de los operandos.
El polimorfismo en su acepcin ms usual se refiere a un mtodo de un objeto que
tendr el mismo nombre que un mtodo de su objeto ascendente. As, en la jerarqua de
tipos objetos de la Figura 24.8, el mtodo Dibujar se define el de la clase Figura pero se
declara (implementa) en las clases u objetos derivados; dado que el procedimiento Dibujar ser distinto segn se trate de una figura Circulo, triangulo, Cuadrado o Elipse.
La herencia y la ligadura tarda o postergada o tambin dinmica significa que la
decisin de la eleccin del mtodo adecuado (correspondiente a un objeto) se determina
en tiempo de ejecucin. La ligadura dinmica es la caracterstica que permite postergar
la ligadura de un tipo objeto a un identificador de instancia hasta el momento de la ejecucin. Esta caracterstica es la que posibilita el hecho del polimorfismo y que ciertos
mtodos se comporten de modo polimrfico.
El hecho prctico ms sobresaliente del polimorfismo reside en el hecho de que con
ligadura dinmica se ejecute slo una versin del mtodo, aunque luego las implementaciones sern diferentes. Para permitir que se pueda dar el polimorfismo es necesario
hacer el mtodo correspondiente virtual en lugar de un mtodo esttico que es el sistema
tradicional.
Consideremos el ejemplo anterior de la jerarqua de tipos de objeto Figura. Cada figura puede ser un objeto de un tipo de datos diferente. Por ejemplo, un rectngulo puede
constar de altura, anchura y centro, mientras que un crculo puede constar de un centro
y un radio. En un programa bien diseado todos los objetos sern descendientes de un
tipo ascendente llamado Figura. Supongamos ahora que se desea dibujar una figura en
la pantalla. Cada mtodo de dibujo de una figura de la jerarqua ser diferente, pero pueden tener todos ellos el mismo nombre Dibujar. Es decir, los mtodos se llamarn en

936

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7

937

Objetol

procedure MetodoA
begin
MetodoB
end;
Dibujar

Dibujar
Figura 2 4 . 7 .

Dibujar

(...);

Dibujar

Jerarqua de objetos.
procedure MetodoB
begin

todas las figuras Dibujar. Ahora bien, si R es una instancia de un objeto rectngulo y C es
una instancia de un objeto crculo, entonces R. Di bu j a r y c. Di bu j a r sern mtodos implementados con cdigos diferentes. Ahora bien, el tipo ascendiente Figura puede tener mtodos que se apliquen a todas las figuras. Por ejemplo, puede tener un mtodo denominado Centrar que mueva una figura al centro de la pantalla. De este m o d o Figura.Centrar
puede utilizar el mtodo Dibujar para volver a dibujar la figura en el centro de la pantalla. Con cualquier otra figura el m t o d o Dibujar deber ser implementado en cada u n a
de ellas y el sistema prctico es declarar los mtodos virtuales.

(.. . ) ; virtual

end;

Obj eto2

Obj eto2 es un descendiente del Obj etol

procedure MetodoB
begin
.

(...);

(...); virtual

Mtodos valales son los mtodos que utili/a T uibo Pascal para proporcionar ligadura
end;

Advertencia

En esencia cuando se construye un mtodo virtual, se est indicando al compilador Yo


no conozco cmo est implementado ese mtodo. Espere hasta que se utilice en un programa y a continuacin obtenga la implementacin
de la instancia del objeto. Esta tcnica de esperar hasta el m o m e n t o de la ejecucin para determinar la implementacin de
un procedimiento se denomina ligadura dinmica.
Reglas

Paia indicar que un mtodo es virtual, escriba simplemente la palabra ieser\ada virtual
despus de la cabecera deJ subprogiama en la definicin del tipo objeto.
( li l i|lilU lili lodo di lili 1IJ1II iW|i ln d i s i l d l i l i l i i|ik un! t .1 'lHsniM 1 nnilill l,'k MI
ir. tndn \ i i i u J di 1 isundii.iii. di K i i I inibun virtual v di 1 *, u i 11 los mi nu* p ira
metros con el objeto de evitar erroies de compilacin D e hecho, las cabeceras de todas
las implementaciones de un m t o d o virtual deben ser idnticas

La Figura 24.8. ilustra el efecto general de un mtodo virtual.

Figura 2 4 . 8 .

Llamada a mtodos virtuales.

Ejemplo
Considerar los tipos objetos TipoCirculo y TipoEsfera como una extensin o derivacin
TipoCirculo. Las declaraciones respectivas, considerando el mtodo A rea virtual son
type

TipoCirculo = object
constructor Iniciar (R : real);
function radio : real;
function Dimetro : real;
function Area : real; virtual;
function Circunferencia : real;
procedure VerEstadistica;
private
EIRadio : real;
end;
{objeto}
TipoEsfera = object (TipoCirculo)
{El constructor se hereda}

de

938

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7


f u n c t i o n Area : r e a l ; v i r t u a l ;
f u n c t i o n Volumen : r e a l ;
end;
{objeto}

24.7.1.

Constructores y destructores en objetos dinmicos

Los m t o d o s virtuales h a n de c u m p l i r u n requisito. El t i p o objeto que c o n t i e n e u n m t o d o virtual d e b e tener u n constructor, q u e es u n m t o d o de iniciacin q u e se d e b e llam a r a n t e s d e l l a m a r a u n m t o d o virtual. L o s c o n s t r u c t o r e s son s i m p l e m e n t e u n t i p o
especial d e p r o c e d i m i e n t o q u e se r e p r e s e n t a c o n la p a l a b r a reservada constructor en lugar de procedure. C a d a i n s t a n c i a de u n o b j e t o se inicia p o r u n a llamada a u n c o n s t r u c t o r
antes de q u e la instancia del o b j e t o se utilice c o n u n m t o d o virtual.

I.os tipos objetos que contiene mtodos virtuales deben definir un constructor.

Obsrvese q u e u n o b j e t o p u e d e h e r e d a r u n c o n s t r u c t o r en lugar de definirlo; d e igual


f o r m a los c o n s t r u c t o r e s p o r s m i s m o s n o p u e d e n ser virtuales. Se debe l l a m a r al const r u c t o r p o r c a d a instancia de u n objeto. P o r c o n s i g u i e n t e , si MiCirculo y TuCirculo son
instancias de TipoCirculo se d e b e r incluir la s e n t e n c i a
MiCirculo.Iniciar;
TuCirculo.Iniciar;
en su p r o g r a m a .
U n o b j e t o q u e slo tiene m t o d o s estticos p u e d e t e n e r u n constructor, y c u a l q u i e r
o b j e t o p u e d e t e n e r varios constructores.
Regla
1.

2.

El c o n s t r u c t o r h a de ser l l a m a d o a n t e s q u e se l l a m e a cualquier m t o d o virtual.


L a l l a m a d a a u n m t o d o v i r t u a l sin l l a m a r p r e v i a m e n t e al c o n s t r u c t o r p u e d e
p r o d u c i r el b l o q u e o del sistema y el c o m p i l a d o r n o tendr f o r m a de c o m p i l a r el
o r d e n en q u e los m t o d o s son l l a m a d o s .
C a d a instancia i n d i v i d u a l de u n o b j e t o d e b e ser iniciada por u n a l l a m a d a i n d e p e n d i e n t e de c o n s t r u c t o r . N o es suficiente iniciar u n a instancia de u n o b j e t o y a
c o n t i n u a c i n asignar esa i n s t a n c i a a i n s t a n c i a s adicionales.

Q u c o n s t r u y e n los constructores? C a d a t i p o de o b j e t o q u e define u n m t o d o v i r t u a l


tiene u n a tabla d e m t o d o s virtuales T M V (Virtual Method Table, VMT). P o r c a d a m t o d o virtual en el objeto, la T M V c o n t i e n e u n p u n t e r o ( a p u n t a d o r ) a las i n s t r u c c i o n e s
reales q u e i m p l e m e n t a n el m t o d o . U n a l l a m a d a al c o n s t r u c t o r establece este p u n t e r o .
P o r consiguiente, c u a n d o u n a instancia de u n o b j e t o de los p u n t e r o s T M Y a las versiones d e los m t o d o s virtuales q u e son a p r o p i a d o s a la i n s t a n c i a del objeto. C a d a t i p o de
o b j e t o slo tiene u n T M V .
P a r a c o m p r o b a r el estado de inicializacin de los m t o d o s virtuales se ha de utilizar
la directiva {$R+}. C u a n d o esta directiva est activada, u n a l l a ma da a u n m t o d o virtual

939

n o iniciado p r o d u c e u n e r r o r de c o m p r o b a c i n de rango d u r a n t e la e j e c u c i n . Si n o se
utiliza $ R + u n a l l a m a d a a u n m t o d o n o inicializado p u e d e h a c e r q u e T u r b o Pascal se
c o m p o r t e de m o d o i m p r e d e c i b l e .

24.7.2.

Anulacin de mtodos heredados

A veces, u n o b j e t o d e s c e n d i e n t e necesita realizar algn m t o d o de u n m o d o diferente a


c o m o est d e f i n i d o en el o b j e t o ascendiente. Esta a c c i n es posible m e d i a n t e la redefinicin o a n u l a c i n del m t o d o h e r e d a d o de su ascendiente. Si u n a declaracin de un
m t o d o es u n d e s c e n d i e n t e , especifica el m i s m o i d e n t i f i c a d o r del m t o d o c o m o u n a dec l a r a c i n de u n m t o d o e n el a s c e n d i e n t e , e n t o n c e s la d e c l a r a c i n en el d e s c e n d i e n t e
anula la declaracin del a s c e n d i e n t e . El m b i t o de u n m t o d o a n u l a d o se e x t i e n d e sobre
el d o m i n i o del d e s c e n d i e n t e en el q u e se h a i n t r o d u c i d o o h a s t a q u e el i d e n t i f i c a d o r del
m t o d o es n u e v a m e n t e a n u l a d o .
La a n u l a c i n de u n m t o d o esttico p u e d e c a m b i a r la cabecera del m t o d o c u a n d o
lo desee. E n contraste, u n a a n u l a c i n de u n m t o d o virtual d e b e c o r r e s p o n d e r s e exact a m e n t e el o r d e n , tipos y n o m b r e s de los p a r m e t r o s , as c o m o el tipo del resultado de
la f u n c i n , en su caso. L a a n u l a c i n debe incluir de n u e v o u n a directiva v i r t u a l .
Ejercicio
Disear e implementar
un tipo objeto Reloj, que contenga al menos los siguientes mtodos pblicos: poner la hora, recuperar la hora, imprimir el valor de la hora, adelantar el
reloj un nmero determinado
de minutos. Una vez diseado el tipo objeto Reloj dejinir y
declarar otro tipo objeto Relojradio en el que la funcin imprimir se redefina (se anide)
con una implementacin
diferente de la clase ascendiente Reloj
type
TipoHora
= 0 . . 2 3;
TipoMinuto = 0 . . 5 9 ;
Reloj = object
p r o c e d u r e A s i g n a r (H:TipoHora; M:TipoMinuto) ;
f u n c t i o n LeerHora : TipoHora;
f u n c t i o n LeerMinutos : TipoMinuto;
procedure Imprimir;
p r o c e d u r e A d e l a n t a r (M : w o r d ) ;
private
Hora
: TipoHora;
Minutos : TipoMinuto;
end;
El tipo o b j e t o d e r i v a d o (descendiente) RelojRadio
type RelojRadio = o b j e c t (Reloj)
function radio
end;

: boolean;

Se desea a n u l a r el p r o c e d i m i e n t o Imprimir q u e s i m p l e m e n t e i m p r i m e la h o r a en la
superclase Reloj, p a r a q u e e n la clase d e r i v a d a a d e m s de i m p r i m i r la h o r a , active la ra-

940

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7

dio y sintonice u n a d e t e r m i n a d a e m i s o r a . L a a n u l a c i n del m t o d o h e r e d a d o Imprimir

Mamifero

se h a r c o n la sintaxis siguiente:
type R e l o j R a d i o =
object ( R e l o j )
procedure I m p r i m i r ; {Anula e l m t o d o R e l o j . I m p r i m i r }
function S i n t o n i z a r R a d i o : b o o l e a n ; { t r u e s i r a d i o
encendida}
end;
{ i m p l e m e n t a c i n de I m p r i m i r }
procedure R e l o j R a d i o . I m p r i m i r ;
var
Numero : i n t e g e r
{ m i n u t o r e a l de l a l e c t u r a d e l r e l o j }
const
D0SPUNT0S = ' : 1 ;
begin
{nueva i m p l e m e n t a c i n d e l m t o d o }
end;
function R e l o j R a d i o . S i n t o n i z a r R a d i o ;
begin
end;
O t r o sistema m e j o r para a n u l a r el m t o d o Reoj. imprimir es
procedure R e l o j R a d i o . I m p r i m i r
begin
Reloj.Imprimir;
{restantes sentencias}
end;
Problema 2 4 . 3 .
Escribir un programa que permita hacer uso de las propiedades
de herencia y anulacin
de mtodos en una aplicacin que visualice informacin
sobre diferentes tipos de animales.
Sea el caso de la j e r a r q u a d e a n i m a l e s q u e c o n t e m p l a la clasificacin: v e r t e b r a d o s ,
mamferos y artrpodos:
program H e r e n c i a A n i m a l ;
{ p r o p o r c i o n a c a r a c t e r s t i c a s y c l a s i f i c a c i o n e s de t i p o de
animales}
uses C r t ;
type A n i m a l e s

= object
procedure D a r M e n s a j e ;
end;
V e r t e b r a d o = object ( A n i m a l e s )
procedure D a r M e n s a j e ;
end;

Artropodo

= object ( V e r t e b r a d o )
procedure D a r M e n s a j e ;
end;
= object ( A n i m a l e s )
procedure D a r M e n s a j e ;
end;

var MiAnimal
MiVertebrado
MiMamifero
MiArtropodo

:
:
:
:

Animales;
Vertebrado
Mamifero;
Artropodo;

procedure A n i m a l e s . D a r M e n s a j e ;
begin
WriteLn ( ' A n i m a l e s : ' ) ;
WriteLn ( ' P r o p i e d a d : l o s animales se pueden mover')
end;
procedure V e r t e b r a d o . D a r M e n s a j e
begin
WriteLn ( ' V e r t e b r a d o s : ' ) ;
WriteLn ( ' P r o p i e d a d : t i e n e n v e r t e b r a s
y crneo)');
Animal.DarMensaje
end;

(columna v e r t e b r a l

procedure M a m i f e r o . D a r M e n s a j e ;
begin
WriteLn ( ' M a m i f e r o s : ' ) ;
W r i t e L n ( ' P r o p i e d a d : A n i m a l v e r t e b r a d o de t e m p e r a t u r a
constante
Vertebrado.DarMensaje
end ;
procedure A r t r o p o d o . D a r M e n s a j e ;
begin
WriteLn ( ' A r t r p o d o s : ' ) ;
WriteLn ( ' P r o p i e d a d : animal i n v e r t e b r a d o ( i n s e c t o s y
araas)');

941

942

Animal.DarMensaje
end;
begin
ClrScr;
MiAnimal.DarMensaje;
WriteLn;
MiVertebrado.DarMensaje;
WriteLn;
MiMamifero.DarMensaje;
WriteLn;
MiArtropodo.Darmensaje
end.
Al e j e c u t a r el p r o g r a m a se visualizara:
Animales:
P r o p i e d a d : Los a n i m a l e s s e p u e d e n mover
Vertebrados:
P r o p i e d a d . T i e n e n v e r t e b r a s : (columna v e r t e b r a l y c r n e o )
P r o p i e d a d : Los a n i m a l e s s e p u e d e n mover
Mamferos:
P r o p i e d a d : Animal v e r t e b r a d o de t e m p e r a t u r a c o n s t a n t e
V e r t e b r a d o s : T i e n e n v e r t e b r a s (columna v e r t e b r a l y c r n e o )
P r o p i e d a d : Los a n i m a l e s s e p u e d e n mover
Artrpodos:
P r o p i e d a d . Animal i n v e r t e b r a d o ( i n s e c t o s y a r a a s )
P r o p i e d a d : Los a n i m a l e s s e p u e d e n mover

24.8.

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7

CONSTRUCTORES Y DESTRUCTORES

Los constructores
y destructores son r u t i n a s , o mtodos, q u e se asocian c o n u n o b j e t o
p a r t i c u l a r . D e s d e el p u n t o d e vista sintctico, u n mtodo, tal c o m o u n c o n s t r u c t o r , es
similar a u n p r o c e d i m i e n t o (ejecuta a l g u n a t a r e a relativa a u n o b j e t o particular).
U n c o n s t r u c t o r p u e d e inicializar los c a m p o s de u n a variable o b j e t o especfico. Este
c o n s t r u c t o r p u e d e ser utilizado p o r otros o b j e t o s que se d e f i n a n c o m o casos especiales
del o b j e t o c o n el c u a l se asoci el c o n s t r u c t o r .
El constructor advierte al c o m p i l a d o r q u e u n m t o d o p a r t i c u l a r se utilizar p a r a est a b l e c e r u n a e s t r u c t u r a d e d a t o s m a n i p u l a d a p o r un m t o d o virtual.
Ejemplo
type
Buque = object
X, Y, B l i n d a j e : i n t e g e r ;
Flanco
: char;
constructor I n i c i a r X (NuevaX : i n t e g e r )
end;

943

E n el o b j e t o CambiarX,
la d e f i n i c i n del o b j e t o p u e d e ser s i m i l a r a sta, c o n s i d e r a n d o el sufijo virtual en la cabecera del p r o c e d i m i e n t o .
type
Buque = object
X, Y B l i n d a j e : i n t e g e r ;
Flanco
: char;
constructor I n i c i a r X (NuevaX : i n t e g e r ) ;
virtual;
end;
T u r b o Pascal 5.5 p r o p o r c i o n a u n tipo especial d e m t o d o l l a m a d o destructor, d e n o m i n a d o as p o r q u e l i m p i a y d i s p o n e d e o b j e t o s a s i g n a d o s d i n m i c a m e n t e . C o m o c o n
c u a l q u i e r o t r o m t o d o , se p u e d e n d e f i n i r d e s t r u c t o r e s m l t i p l e s p a r a u n solo t i p o de objeto.
U n d e s t r u c t o r se define con t o d o s los restantes m t o d o s d e o b jeto s e n la d e f i n i c i n
de tipos objetos.
P u n t o = object ( C o o r d e n a d a s )
Visible
: Boolean;
Siguiente
: PuntoPtr;
constructor I n i t ( I n i c i a r X , I n i c i a r Y
destructor T e r m i n a d o ; v i r t u a l ;
procedure V i s u a l i z a r ; v i r t u a l ;
procedure O c u l t a r ; v i r t u a l
f u n c t i o n E s V i s i b l e : Boolean
end;

: integer);

Los d e s t r u c t o r e s p u e d e n ser h e r e d a d o s y estticos o virtuales, a u n q u e es r e c o m e n d a ble q u e sean virtuales de m o d o q u e en c a d a caso el d e s t r u c t o r c o r r e c t o se e j e c u t a r p a r a


su t i p o objeto.

Oros ejemplos
1. U n o b j e t o Di bujo se declara as:
D i b u j o = object
private
x , y , Long : I n t e g e r ;
Nombre
: String;
public
constructor C o p i a r ( v a r F : D i b u j o ) ;
constructor I n i c i a r ( F X , F Y , F l o n g : I n t e g e r ;
nombreF:String);
destructor Done; v i r t u a l , procedure V i s u a l i z a r ; v i r t u a l ;
procedure E d i t a r ; v i r t u a l ;
private
procedure V i s u a l i z a r P u n t o s ( x , y : I n t e g e r ;
end;

S:String);

944

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7

type
CadReg
= string [ 8 0 ] ;
PtrLocal = ~Local;
Local
= object
Nombre
: CadReg;
Longitud : i n t e g e r ;
N
: Real;
Constructor I n i c i a r

2. El o b j e t o Detno, q u e c o n t i e n e m t o d o s , d a t o s c o n s t r u c t o r e s y destructores, tiene tod o s los c a m p o s con carcter pblico:


Demo = object
Campol
Integer
constructor I n i c i a r ;
destructor Done;
procedure Mtodo;
end;
y u n a variable de tipo demo

CadReg;
integer;
Real);

Destructor V a c i o ;
end;

var
Instancia:Demo;

var
Test

c o n esta definicin las sentencias siguientes son legales.


Instancia.Iniciar;
Instancia.Mtodo;
WriteLn ( I n s t a n c i a . C a m p o l ) ;
Instancia.Done;
En m u c h a s ocasiones se desea evitar q u e los c a m p o s d a t o d e u n o b j e t o n o se p u e d a n
m o d i f i c a r c o n sentencias tales c o m o :
Instancia.Campol

(Cad
P
Kg

945

: PtrLocal;

Esta d e c l a r a c i n d e f i n e tres tipos: u n a c a d e n a de 80 c a r a c t e r e s , u n p u n t e r o a Local


y u n o b j e t o d e n o m i n a d o Local. Este o b j e t o t i e n e t r e s c a m p o s y d o s m t o d o s a s o c i a d o s
c o n ella.
Los c o n s t r u c t o r e s se utilizan p a r a inicializar objetos. T p i c a m e n t e la inicializacin se
basa en valores p a s a d o s c o m o p a r m e t r o s al c o n s t r u c t o r . L o s d e s t r u c t o r e s son o p u e s t o s
a los c o n s t r u c t o r e s y se utilizan p a r a limpiar objetos d e s p u s d e su uso. L o s c o n s t r u c t o r e s
son vitales p a r a utilizar m t o d o s virtuales y los d e s t r u c t o r e s s o n cruciales p a r a el uso d e
la asignacin d i n m i c a .

:= 4567;

En estos casos es preciso declarar privados dichos c a m p o s en el o b j e t o Demo.


Demo = object
constructor I n i c i a r
destructor Done;
private
Campol: I n t e g e r ;
procedure Mtodo;
end;

LOS PROCEDIMIENTOS NEW Y DISPOSE EN POO

La sintaxis de los p r o c e d i m i e n t o s New y Dispose se m o d i f i c en T u r b o Pascal 5.5 p a r a


facilitar la inicializacin y asignacin de a l m a c e n a m i e n t o d i n m i c o d e objetos. Se p u e d e
l l a ma r a estos p r o c e d i m i e n t o s tal c o m o ya conoce, p e r o t a m b i n p u e d e h a c e r l o c o n u n
segundo p a r m e t r o b i e n u n c o n s t r u c t o r o b i e n u n d e s t r u c t o r .
Los procedimientos anteriores t o m a n dos p a r m e t r o s : u n a variable d i n m i c a
n o m b r e del p u n t e r o y u n n o m b r e d e p r o c e d i m i e n t o l l a m a d a al c o n s t r u c t o r .

Las declaraciones p r i v a d a s (Campol y Mtodo) d e b e n v e n i r al final del o b j e t o . T o d a s las


restantes declaraciones e n c i m a de p r i v a t e s o n pblicas. C o n esta n u e v a d e f i n i c i n del
o b j e t o demo las c u a t r o sentencias anteriores siguen s i e n d o vlidas, p e r o las d o s s e n t e n c i a s
siguientes:
WriteLn ( I n s t a n c i a . C a m p o l ) ;
Instancia.Mtodo;
se c o m p i l a r n slo si las sentencias a p a r e c e n en el m i s m o p r o g r a m a o m o d e l o u n i d a d
q u e declare Demo.
Ejemplo 2 4 . 3
Se puede asignar almacenamiento
con una simple llamada.

24.9.

para una variable objeto e iniciar ese almacenamiento

Formato
New (P, Construir)
Dispose ( P , Destruir)
P
Construir
Destruir

variable p u n t e r o q u e a p u n t a a u n t i p o o b j e t o
llamadas a constructores y destructores de tipo
objeto

La s e n t e n c i a New i n d i c a a T u r b o Pascal q u e asigne la variable o b j e t o P y ejecute su


m t o d o c o n s t r u c t o r Construir.
L a sintaxis a m p l i a d a d e New y Dispose tiene el m i s m o e f e c t o (son e q u i v a l e n t e s ) q u e la
e j e c u c i n de las sentencias siguientes:

946

Programacin

New (P)
PA.Construir

New

Programacin

en Turbo/Borland Pascal 7

type
ObjetoNuevo
campos;
mtodos;
private
campos;
mtodos;
end;

P".Destruir;
D i s p o s e ( P) ;

Dispose

N o o b s t a n t e , la sintaxis a m p l i a d a m e j o r a la Habilidad y genera t a m b i n cdigo m s


c o r t o y eficiente, p o r lo q u e es m s r e c o m e n d a b l e su uso.
T e n i e n d o las declaraciones del E j e m p l o 21.8 se p u e d e realizar u n a l l a m a d a a New c o n
la sentencia.
New ( T e s t ,

Iniciar

('Feliz Dia1,

5,320));

L a l l a m a d a p r e c e d e n t e realiza las siguientes tareas:


Asigna espacio suficiente en la pila d i n m i c a p a r a a l m a c e n a r u n a variable d e tipo
local.
Asigna la posicin de este s e g m e n t o de m e m o r i a a Test.
Asigna los a r g u m e n t o s p a s a d o s a I n i c i a r a los c a m p o s a d e c u a d o s de Test".
Regla

La asignacin dinmica de una variable se realiza con new.


La designacin dinmica es una imagen espejo de la asignacin y se realiza con dispose.

24.10.

MEJORAS EN PROGRAMACIN ORIENTADA


A OBJETOS

T u r b o Pascal 6.0 i n t r o d u j o u n a n u e v a p a l a b r a private q u e seala la seccin p r i v a d a de


u n objeto. T u r b o Pascal 7.0 ha a a d i d o dos n u e v a s palabras reservadas: public, q u e m a r c a
la seccin p b l i c a del objeto, e i nheri ted q u e se utiliza p a r a la l l a m a d a de u n m t o d o
h e r e d a d o d e u n o b j e t o ascendiente a partir de u n o b j e t o d e s c e n d i e n t e .

24.10.1.

947

object ( a s c e n d i e n t e )
{pblicos}
{publ icos}
{privados}
{privados}

RESUMEN
En este captulo se han examinado las caractersticas orientadas a objetos que soporta Turbo Pascal. Las propiedades fundamentales de la programacin orientada a objetos son: abstraccin, encapsulamiento, herencia y polimorfismo.
Un tipo objeto o clase (en C++, Smalltalk, Java, etc.) es una estructura de datos, encapsula
datos y operaciones (mtodos: procedimientos y funciones) en una misma estructura. Un
programa orientado a objetos es una coleccin de objetos que interactan entre s.
Una definicin de un tipo objeto puede tener campos dato privados y mtodos privados, que
son accesibles slo dentro de la unidad o programa que contiene la definicin del tipo objeto. Asimismo, un tipo objeto tiene una seccin pblica donde suelen ir los mtodos pblicos que conforman la interfaz del tipo de objeto. Las palabras reservadas private y public
delimitan ambas secciones.
Los tipos objetos pueden tener relaciones de ascendientes y descendientes. Los tipos objetos
descendientes heredan campos datos y mtodos de los tipos objetos definidos anteriormente
como ascendientes.
La herencia permite definir una familia de tipos objetos con una superclase y subclases derivadas.
El polimorfismo permite utilizar el mismo nombre de un procedimiento/funcin que realiza
una operacin sobre tipos datos diferentes.
Las subclases (tipos objetos descendientes) pueden anular un mtodo declarado en una superclase duplicando el nombre del mtodo definido anteriormente.
Los mtodos polimrficos han de ser declarados virtuales. Los tipos objetos que contienen
mtodos virtuales deben incluir un mtodo de iniciacin (Iniciar) llamado constructor.
Los objetos dinmicos que se asignan en tiempo de ejecucin, utilizan variables puntero que
son similares a las variables puntero ordinarias. Los tipos objeto que contienen mtodos virtuales deben incluir un destructor, que es un mtodo de limpieza que libera el almacenamiento asignado al objeto.

La ocultacin mediante public y prvate


Sintaxis

T o d a s las declaraciones d e u n o b j e t o son pblicas, p o r defecto. N o o b s t a n t e , e n n u m e rosas o c a s i o n e s se requiere q u m t o d o s y d a t o s sean p r i v a d o s . T u r b o Pascal 6.0 y 7.0
c o n t i e n e la p a l a b r a reservada pri vate, de m o d o q u e t o d a s las declaraciones a c o n t i n u a cin de la p a l a b r a private son accesibles slo a las s e n t e n c i a s en el i n t e r i o r del m d u l o
objeto.
Los c a m p o s y m t o d o s privados son accesibles slo d e n t r o de la u n i d a d e n q u e se
d e c l a r a el o b j e t o ; se declara i n m e d i a t a m e n t e d e s p u s de los c a m p o s y m t o d o s o r d i n a rios, a c o n t i n u a c i n de la p a l a b r a reservada o p c i o n a l private. L a sintaxis c o m p l e t a de
u n a d e c l a r a c i n o b j e t o es:

orientada a objetos con Turbo Pascal 7

Declaracin

de un tipo objeto

t y p e NombreObjeto
= object
dato_publco_l
: tipol;
dato_publico_2
: tipo2;
mtodo_publicol
metodo_publico2

948

Programacin orientada a objetos con Turbo Pascal 7

Programacin en Turbo/Borland Pascal 7


private
dato_prvado_l
dato_privado_2

Un error frecuente en el trabajo con objetos procede del uso incorrecto de variables puntero
o fallos al utilizar constructores para iniciar instancias de tipo objeto.
Cuando se trabaja con tipos objetos que tienen mtodos virtuales, se debe utilizar constructores para iniciar instancias de estos tipos o cualquiera de sus descendientes.
Se deben definir siempre mtodos para manipular campos de objetos y evitar manipulacin
de campos directamente en un programa cliente.
Si se utiliza procedure en lugar de constructor para un tipo objeto que contiene un mtodo
virtual no se recibir un mensaje de error de sintaxis, pero la ejecucin probablemente se
abortar.
Se debe llamar al constructor de cada instancia de un tipo objeto que tenga mtodos virtuales. La llamada a un mtodo virtual no inicializado producir el mal funcionamiento del
programa. Para evitar este error se ha de utilizar la directiva {$R+} al menos durante las etapas de depuracin del desarrollo de programas.

: tipon+1;
: tipon+2;

mtodo_privadol;
mtodo_privado2;
end;
Tipo objeto derivado
type Empleado = o b j e c t ( P e r s o n a ) ;
Nombre : S t r i n g ;
Salario : Real;
end;
Declaracin de instancias de objetos
var
Nombre_objeto

: tipo^objeto

949

var
Pl,

EJERCICIOS
P2 : P e r s o n a ;

Declaracin de un mtodo
procedure P e r s o n a . C a l c u l a r S a l a r i o ( F a c t o r
begin

1. Escribir una unidad que represente un tipo objeto cola genrica.


2. Escribir una unidad que represente un tipo objeto lista enlazada.

; real);

end;
Mtodos virtuales
type Ventas = object
NumeroStock : i n t e g e r ;
Precio : real;
constructor I n i c i a r ( N u m : i n t e g e r ;
ElPrecio:real);
function F a c t u r a : r e a l ; v i r t u a l
function Mayor (var O t r o s : V e n t a s ) : b o o l e a n
end;
Constructores/destructores
constructor I n i c i a r ;
destructor Terminado : virtual;
new ( s i n t a x i s a m p l i a d a )
dispose ( s i n t a x i s e x t e n d i d a )

ERRORES TIPICOS DE PROGRAMACION


Cuando se implementa un mtodo de un objeto, asegrese cualificar el nombre del mtodo
con el identificador del tipo objeto mediante el operador punto. En caso contrario aparecern mensajes del compilador similar a Uknown identifier o bien Undefined forward reference.

3. Escribir un tipo objeto Figura y tipo de objetos descendientes Cuadrado, Triangulo, Circulo,
E l i p s e , R e c t n g u l o , T r i a n g u l o I s s c e l e s , T r i a n g u l o e q u i l t e r o y Hexgono.

4. Construir jerarquas de clases de personas, empleados, gerentes, informticos, programadores,


ingenieros de software, administradores, mecnicos, fontaneros, electricistas.
5. Construir jerarquas de clases de animales: a) de la actualidad; b) prehistricos.
6. Escribir una clase Punto que contenga las coordenadas cartesianas x, y, de un punto en un plano.
Deducir a partir de ella la subclase Circulo que permita calcular el radio y el rea de dicho
crculo. U n a vez declaradas dichas clases, declarar objetos MiPunto y MiCirculo.
7. Escribir un programa que haga uso de las clases Circulo y Punto.
8. Describir y justificar los objetos que se obtienen en cada uno de los casos siguientes:
a) Los habitantes de Europa y sus direcciones de correo.
b) Los clientes de un banco que tienen una caja fuerte alquilada.
c) Las direcciones de correo electrnico de una universidad.
d) Los empleados de una empresa y sus claves de acceso a sistemas de seguridad.
9. Cules sern los objetos que han de considerarse en los siguientes temas?
a) Un programa para maquetar una revista.
b) Un contestador telefnico.
c) U n sistema de control de ascensores.
d) U n sistema de subscripciones a una revista.
10. Deducir los objetos necesarios para disear un programa de computadora que permita practicar diferentes juegos de cartas.

950

Programacin en Turbo/Borland Pascal 7

PROBLEMAS
24.1. Consideremos una pila como un tipo abstracto de datos. Se trata de definir una clase que
implementa una pila de 100 caracteres mediante un array. Las funciones miembro de la clase
deben ser:
meter,

sacar,

APENDICE

pilavacia y pilalleria.

CODIGOS DE REFERENCIA

24.2. Reescribir la clase pila que utilice una lista enlazada en lugar de un array (sugerencia: utilice
otra clase para representar los modos de la lista).

Cdigo ASCII
REFERENCIAS BIBLIOGRAFICAS
Booch, Grady: Anlisis y Diseo Orientado a objetos. Addison-Weslev, Daz de Santos, 1995.
Joyanes Aguilar, L.: Programacin orientada a objetos. McGraw-Hill, Madrid, 1996.
Joyanes Aguilar, L.: C++ a su alcance, McGraw-Hill, Madrid, 1995.
O'Brien, S. K. y Nameroff, S.: Turbo Pascal 7. Manual de referencia. McGraw-Hill, 1993.
Pressman, Poger: Ingeniera del software. McGraw-Hill, 1998.
Rumbaug, James et al: Modelado y diseo orientado a objetos (metodologa OMT). Prentice Hal,
1996.
Yourdon, Ed y Coad, Peter: Object-Oriented Analysis. Prentice Hall, 1990.
Yourdon, Ed y Coad, Peter: Object-Oriented Analysis. 2.a edicin. Prentice Hall, 1991.

El cdigo ASCII (American Standard Code for Information Interchange: cdigo estndar americano para intercambio de informacin) es un cdigo que traduce caracteres
alfabticos y caracteres numricos, as como smbolos e instrucciones de control en un
cdigo binario de siete u ocho bits.
Tabla A-1. Cdigo ASCII de la computadora personal PC
Valor ASCII
0
1
7
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

Carcter
Nulo

9
V

*
Sonido (pitido, bip)

Tabulacin
Avance de lnea
Cursor a inicio
Avance de pgina
Retorno de carro
J3

&

11
<r
5

1
t
-4
Cursor a derecha

Valor ASCII
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57

Carcter
Cursor a izquierdas
Cursor arriba
Cursor abajo
Espacio
!
"

#
$
%

&
'

(
)
*

'

/
0
1
7
3
4
5
6
7
8
9
951

952

Programacin en Turbo/Borland Pascal 7

Cd.igos de referencia

Tabla A - 1 . Cdigo ASCII d e la c o m p u t a d o r a p e r s o n a l PC (continuacin).


Valor ASCII
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105

Carcter

<
=

>
0
@

A
B
C
D
E
F
G
H
I
J
K
L
M
N
O
P
Q
R
S
T
U
V
w
X
Y
Z
[

i
-

a
b
c
d
e
f
g
h
i

Valor ASCII
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153

Tabla A - 1 . C d i g o ASCII d e la c o m p u t a d o r a p e r s o n a l PC (continuacin).

Carcter

Valor ASCII

Carcter

Valor ASCII

J
k
1
m
n
0

154
155
156
157
158
159
160
16!
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201

202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249

P
q
r
s
t
u
V

w
X

y
z

|
1

O
c

t
i
i
i

ae
JE
0

y
b

Pt

,a
0
G
1
1
'/2
i

1
=
-II
n
=>

n!
j

L
-r
h
-

+
1=
II"
1C
ir

Carcter
=U=
Tr
11=

JL
T
=t=
-U_
-n(i_
tr
f=
rr

4=
_i
r

mm
1
1
mm
Ct

n
r
rr

X
cr
MT
4>
9
n
8
DO
0

n
=

>
<
f
l

953

954

Programacin en Turbo/Borland Pascal 7

Cdigos de referencia

Tabla A-1. Cdigo ASCII de la computadora personal PC (continuacin).


Valor ASCII
250
251
252

Carcter

Valor ASCII

nr

253
254
255

Carcter
2

(blanco ' F F )

955

Cdigos de exploracin de teclado


Los cdigos de exploracin de teclado son los cdigos devueltos de las teclas en el teclado
IBM-PC, tal como se ven por T u r b o Pascal.
Estas teclas son tiles cuando se trabaja a nivel de lenguaje ensamblador. Los cdigos
de exploracin de la tabla se visualizan en valores hexadecimales (dgitos 0,1,2,.
9,A.B,C,D.E,F).

Cdigos ampliados de teclas


Los cdigos ampliados de teclas se devuelven por esas teclas o combinaciones de teclas
que no se pueden representar por los cdigos ASCII listados en la Tabla A-1.
Tabla A-2.
Segundo cdigo
3
15
16-25
30-38
44-50
59-68
71
72
73
75
77
79
80
81
82
83
84-93
94-103
104-113
114
115
116
117
118
119
120-131
132
133
134
135
136
137
138
139
140

Tabla A-3.

Cdigo de exploracin
en hexadecirnal

Cdigos ampliados de teclas


Significado
NULL (caracter nulo)
Shift Tab ( - < vv)
Alt-Q/W/E/R/T/Y/U/I/O/P
Alt-A/S/D/F/G/H/I/J/K/L
Alt-Z/X/C/V/B/N/M
Teclas F1-F10 (desactivados con teclas soft)
Home (Inicio)
Cursor arriba (f)
PgUp (RePg)
Cursor a izquierdas (-)
Cursor a derechas (->-)
End (Fin)
Cursor abajo (|)
PgDn (AvPg)
Ins
Del (Supr)
F11-F20 (Shift-F 1 a Shift-FlO)
F21-F30 (Ctrl-Fl hasta FIO)
F31-F40 (Alt-Fl hasta FIO)
Ctrl-PrtSc (Ctrl-ImprPant)
Ctrl-Flecha izquierda (Ctrl*-)
Ctrl-Flecha derecha (Ctrl--)
Ctrl-End (Ctrl-Fin)
Ctrl-PgDn (Ctrl-AvPg)
Ctrl-Home (Ctrl-Inicio)
Alt-1/2/3/4/5/6/7/8/9/0/-/=
Ctrl-PgUp (Ctrl-RePg)
Fll
F12
Shift-F 11 (Mays-Fll)
Shift-F 12 (Mays-Fll)
Ctrl-Fl 1
Ctrl-Fl 2
Alt-Fl 1
Alt-Fl 2

Cdigos de exploracin del teclado

Esc
!1
@2
# 3
$4
%5
"6
&7
*8
(9
)0
+ =

Retroceso (Backspace)
Ctrl
A
S
D
F
G
H
J
K
L
"

-Shift (t-Mays)
Barra espaciadora
Caps Lock (BloqMays)
F1
F2
F3
F4
F5
F6
F7

01
02
03
04
05
06
07
08
09
0A
0B
OC
0D
0E
ID
1E
1F
20
21
22
23
24
25
26
27
28
29
2A
39
3A
3B
3C
3D
3E
3F
40
41

jeca
F8
F9
FIO
Fll
F12
Scroll Lock (BloqDespl)
-/-<

Q
w
E
R
T
Y
U
1
O
P
i[
n
Return
/ \

Z
X
c
V
B
N
M
<,
>.

?/
-Shift (->Mays)
PrtSc* (ImprPant)
Alt
7 Home (Inicio),
8 (t)
9 PgUp (Repg)

Cdigo de exploracin
en hexadecimal
42
43
44
D9
DA
46
0F
10
11
12
13
14
15
16
17
18
19
1A
IB
1C
2B
2C
2D
2E
2F
30
31
32
33
34
35
36
37
38
47
48
49

956

Programacin en Turbo/Borland Pascal 7


Tabla A-3.

Tecla
Signo menos
4 5
6
+

1 End (Fin)

Cdigos de exploracin del teclado (continuacin)

Cdigo de exploracin
en hexadecimal
4A
4B
4C
4D
4E
4F

Tecla
2J
3 PgDn (AvPg)
0 Ins
Del (Supr)
Num Lock (BloqNum)

Cdigo de exploracin
en hexadecimal

APENDICE

50
51
52
53
45

PALABRAS RESERVADAS
Pascal estndar y Turbo Pascal Borland 5 . 5 / 6 / 7
and
array
begin
case
const
div
do
downto

else
end
file
for
function
goto
if
in

label
mod
nil
not
of
or
packed
procedure

program
record
repeat
set
then
to
type
until

var
while
with

Nota
La directiva forward tiene el mismo significado en Pascal estndar que en Turbo
Pascal, pero no es ni reservada ni predefinida en Pascal estndar.

Turbo Pascal ( 4 . 0 / 5 . 0 / 5 . 5 )
absolute
external
implementation

inline
interface
interrupt

shl
shr
string

unit
uses
xor

Turbo Pascal 5 . 5
constructor
destructor
object
virtual

957

958

Programacin en Turbo/BorlandPascaTT

Turbo Pascal 6 . 0
private

APENDICE

EL EDITOR DE
TURBO PASCAL 7 . 0

Turbo Pascal 7 . 0
inherited

Directivas estndar (Turbo Pascal 6.0)


absolute
assembler
external

far
forward
interrupt

near
private
virtual

Este apndice recoge todas las rdenes de edicin disponibles en el E n t o r n o Integrado de


T u r b o Pascal 7.0.

ORDENES DEL EDITOR


Directivas estndar (Turbo Pascal 7.0)
absolute
assembler
external

far
forward
interrupt

near
private
public

Movimientos del cursor


virtual
Orden

Avanzar una pgina


Desplazar (scroll) una lnea arriba
Desplazar una lnea abajo
Carcter a la derecha
Carcter a la izquierda
Principio de lnea
Final de lnea
Principio del archivo
Final de archivo
Lnea arriba
Lnea abajo
Moverse a la posicin anterior
Palabra a la derecha
Palabra a la izquierda
Parte superior de la ventana
Parte inferior de la ventana
Principio de lnea
Retroceder una pgina
Avanzar una pgina

Teclas de
activacin
PgDn (AvPg)

Teclas
alternativas
de edicin
CTRL+C

CTRL+Z
CTRL+W
CTRL+D
CTRL+S
CTRL+QS

HOME (Inicio)

CTRL+QD

END

CTRL+QR

CTRL+PgUp
CTRL+PgDn

CTRL+QC

t
1

(Fin)

CTRL+E
CTRL+X

CTRL+QP
CTRL+*

CTRL+F

CTRL+-*-

CTRL+A

CTRL+QE
CTRL+QX

CTRL+END

HOME (Inicio)

CTRL+QS

PgUp (RePg).
PgDn (AvPg)

CTRL+R
CTRL+C

959

960

El editor de Turbo Pascal 7.0

Programacin en Turbo/Borland Pascal 7

961

Ampliacin de bloques seleccionados

Insertar y borrar

Orden

Borrar carcter en posicin cursor


Borrar carcter izquierda cursor
Inserta opciones compilador
Borrar lnea
Borrar hasta fin de lnea
Borrar hasta final de palabra
Insertar nueva lnea
Activar/desactivar modo insertar

Teclas de
activacin

Teclas
alternativas
de edicin

DEL (Supr)

CTRL+G

RETROCESO

CTRL+H

CTRL-OO

CTRL+Y

CTRL+N

Mover al principio del bloque


Mover al final del bloque
Marcar principio de bloque
Marcar final de bloque
Salir a barra de mens
Ocultar/mostrar bloque
Marcar lnea
Imprimir bloque seleccionado
Marcar palabra
Borrar bloque marcado
Copiar bloque marcado
Mover bloque marcado
Copiar en portapapeles
Cortar de cortapapeles
Borrar bloque
Sangrar bloque
Pegar de portapapeles
Leer bloques de disco
No sangrar bloque
Escribir bloque a disco

Teclas de
activacin
CTRL+QB
CTRL+QK
CTRL+KB
CTRL+KK
CTRL-KD
CTRL+KH
CTRL+KL
CTRL+KP
CTRL+KT
CTRL+KY
CTRL+KC
CTRL+KV
SHIFT+INS
CTRL+DEL
CTRL+DEL
CTRL+KI
SHIFT+INS
CTRL+KR
CTRL+KV
CTRL+KW

SHIFT+
(MAYUS-)

SHIFT+SHIFT+END

A la derecha un carcter
Fin de lnea

(MAYUS+FIN)

CTRL+V

Bloques

Orden

A la izquierda un carcter

CTRL+QY

CTRL+T
INS

Teclas
alternativas
de edicin

Teclas de
activacin

Orden

Teclas
alternativas
de edicin

Principio de lnea
Igual columna en lnea siguiente
Igual columna en lnea anterior
Avanzar pgina
Retroceder pgina
A la izquierda una palabra
A la derecha una palabra
Final de archivo
Principio de archivo

ALT+EP

SHIFT+CTRL+PgDn
SHIFT+CTRL+PgUp

Otras rdenes de edicin

Orden

CTRL+DEL (Supr)
CTRL+INS
SHIFT+DEL
CTRL+KC

SHIFT+HOME
SHIFT+I
SHIFT+t
SHIFT+PgDn (AvPg)
SHiFT+PgUp (RePg)
SHIFT+CTRL+*SHIFT+CTRL+SHIFT+CTRL+END
SHIFT+CTRL+HOME

Activar/desactivar autosangrado
Activar/desactivar tabulaciones
Salida de EID (IDE)
Encontrar posicin de marcador
Ayuda
Indice de ayuda
Insertar carcter de control
Ir a posicin ltimo error
Abortar operacin actual
Abortar operacin
Maximizar ventana
Cargar nuevo archivo
Activar/desactivar modo rellenado
Correspondencia de parejas
Guardar archivo y volver
Buscar texto
Buscar de nuevo

Teclas de
activacin

Teclas
alternativas
de edicin

CTRL+OI
CTRL+OT
ALT+X
CTRL+Qrt
F1
SHIFT+F1
CTRL+P
CTRL+QW
CTRL+U
ESC
F5
F3
CTRL+OF
CTRL+Q[,
CTRL+Q]
CTRL+KS
CTRL+QF
CTRL+L

F2

962

Programacin en Turbo/Borland Pascal 7

Orden

Teclas de
activacin

Buscar y sustituir texto


Estabiecer marcadores
Activar/desactivar modo tabulacin
Ayuda bsqueda de tpico
Deshacer
Activar/desactivar sangrado
Visualizar directivas del compilador

CTRL+QA
CTRL+O
CTRL+OT
CTRL+F1
ALT+RETROCESO
CTRL+OU
CTRL+OO

Teclas
alternativas
de edicin

APENDICE

EL ENTORNO INTEGRADO
DE DESARROLLO
TURBO PASCAL 7 . 0

ALT-EU

ORDENES DE TECLAS DE FUNCION


Tecla de funcin/
Secuencia de teclas

Descripcin

FI

Obtener ayuda sobre contexto actual.

F2

Guardar un archivo.

F3

Abrir un archivo.

F4

Ejecutar el programa y a continuacin detener en la posicin actual


del cursor.

F5

Conmuta ventana de edicin entre pantalla completa y parcial.

F6

Mover a la siguiente ventana en la lista de ventanas abiertas.

F7

Traza de un programa paso a paso.

F8

Traza de un programa paso a paso a travs de procedimientos y funciones.

F9

Construir el programa compilando todos los archivos requeridos.

FIO

Cambiar a lnea de mens.

ALT+FI

Visualizar pantalla de ayuda ms reciente.

CTRL+FI

Obtener ayuda sobre tpico del lenguaje seleccionado.

CTRL+F2

Reinicializar el programa para ejecutar desde el principio.

ALT+F3

Cerrar ventana activa.

CTRL+F3

Visualizar pila de llamada durante ejecucin del programa.

CTRL+F4

Evaluar expresin, valor o funcin durante ejecucin del programa.

ALT+F5

Cambiar entre pantalla de salida y ventana de edicin.

SHIFT+F6

Mover a ventana anterior en lista de ventanas abiertas.

CTRL+F7

Aadir variable de observacin.

CTRL+F8

Bascular punto de interrupcin.

ALT+F9

Compilar archivo.

CTRL+F9

Ejecutar programa, compilado primero si es necesario.

963

964

El entorno integrado de desarrollo Turbo Pascal 7.0

Programacin en Turbo/Borland Pascal 7

Men File (Alt-F)

ORDENES DE AYUDA
Tecla de funcin/
Secuencia de teclas

965

Descripcin

PgDn (AvPg)

Avanzar una pgina de pantalla en la informacin de ayuda.

PgUp (RePg)

Retroceder una pgina de pantalla en la informacin de ayuda.

ESC

Salida de ayuda.

FL

Llamar a ayuda sobre ayuda.

TAB/SHIFT-TAB

Moverse entre elementos iluminados en una pantalla de ayuda.

INTRO (ENTER)

Seleccionar un elemento iluminado para obtener ms ayuda sobre el


elemento.

El men File contiene rdenes para crear, abrir, cerrar e imprimir archivos. Para desplegar el m e n File, pulsar ALT-F.
m

Edit
New
Open...
Save
Save a s . . .
Save al 1

Search

Run

Compile

Debug
Tools
NONAMEOO.PAS

Options

Window

Help

F3
F2

Change d i r . . .
Print
Printer setup...
DOS s h e l l
Exit
Alt+X

MENUS
Para activar o desplegar los mens, pulse simplemente la tecla ALT, j u n t o con la primera
letra del nombre del men. Por ejemplo, para acceder al m e n File, pulsar ALT-F.
Los mens tienen diferentes tipos de entradas:
Ordenes que no requieren informacin adicional y que se ejecutan inmediatamente. Por ejemplo, la orden Save de File.
Ordenes que requieren informacin adicional y conllevan un cuadro de dilogo.
Por ejemplo, la orden ChangeDirectory... Tales rdenes se identifican con puntos
suspensivos (...) despus del nombre de la orden.
Entradas que abren otro men. Estas rdenes se identifican por un smbolo al
final de la caja entrada. Por ejemplo, la entrada Environment del m e n Options.

1:1
F l - H e l p I C r e a t e a new f i l e i n a new E d i t window

Figura D-1. Men File.


Orden

Tecla de funcin/
Secuencia de teclas

New

ALT-FN

Crea un nuevo archivo en una ventana de edicin. El archivo tiene un nombre NONAME.PAS
(xx, pareja de dgitos).

Open...

ALT-FO (F3)

Abre un archivo existente y lo carga en la ventana de edicin.

Save

ALT-FS (F2)

Guarda el archivo actual en disco.

Save a s . . .

ALT-FA

Guarda el archivo actual bajo un nuevo nombre.

Save al 1

ALT-FL

Guarda el contenido de todos los archivos que


han sido modificados desde la ltima vez que se
grabaron.

Change d i r . . .

ALT-FC

Cambia al directorio especificado en un cuadro


de dilogo.

Pri nt

ALT-FP

Imprime el contenido de la ventana de edicin


activa.

Printer s e t u p . . .

ALT-FR

Configurar impresora.

DOS shell

ALT-FD

Salida temporal del pID a un shell de DOS.

Exit

ALT-FX 0 ALT-X

Salida del EID.

Una entrada u orden de un men se puede seleccionar de una de estas dos formas:
Utilizar las flechas de movimiento de cursor (f, | ) para seleccionar la entrada
deseada y pulsar INTRO (ENTER).
Pulsar la letra iluminada (intensificada) de la entrada deseada.

Descripcin

966

Programacin en Turbo/Borland Pascal.7

El entorno integrado de desarrollo Turbo Pascal 7.0

967

Men Edit (Alt-E)

Men Search (Alt-S)

El m e n Edit permite moverse por un archivo y entre archivos. Se activa con la secuencia de teclas ALT-E.

El m e n Search contiene rdenes para encontrar textos especficos o ciertos tipos de


texto (tales como errores en tiempo de ejecucin).

File

f l

Search

Run

Undo
Redo

Alt+BkSp

Cut
Copy
Paste
Clear

Shi f t + D e l
Ctrl+Ins
Shift+Ins
Ctrl+Del

Compile

Uebug

Tools

Options

Window

File

Help

Run

Edit

Compile

Debug

Tools

Options

Window

Help

Find...
Replace...
Search again
Go t o 1 i n e number. . .
Show l a s t c o m p i l e r e r r o r . . .
Find e r r o r . . .
Find p r o c e d u r e . . .

Show e l i p b o a r d

i . i

' -

1:1
Fl-Help ! Search f o r t e x t
F l - H e l p I Undo t h e p r e v i o u s e d i t o r o p e r a t i o n

Figura D-3. Men Search.


Figura D-2. Men Edit.
Tecla de funcin/
Secuencia de teclas

Descripcin

Find...

ALT-SF

Encuentra el texto especfico, utilizando la directriz seleccionada en el siguiente cuadro de dilogo.

Replace...

ALT-SR

Busca el texto especificado en un cuadro de dilogo y sustituye este texto por


otro texto especificado.

Search again

ALT-SS
CTRL-L

Repite la ltima orden f ind o repl ace.

Orden
Orden
Undo

Tecla de funcin/
Secuencia de teclas

Descripcin

ALT-EU

Deshace (anula) el ltimo movimiento de la


orden de borrado.

Redo

ALT-ER

Anula, cancela, la ltima orden undo.

Cut

ALT-ET

Corta el bloque marcado de texto de la ventana activa y copia este bloque en el cortapapeles.

ALT-RETROCESO

SHIFT-DEL (Mays-Supr)
Copy

ALT-EC
CTRL-INS

Paste

ALT-EP
SHIFT-INS

Clear

ALT-EL
CTRL-DEL

Show el i pboard

ALT-ES

Go to 1 ine number...

ALT-SG

Copia el bloque marcado de texto de la ventana activa al cortapapeles, dejando el texto en


el archivo original.

Ir a nmero de lnea especificado en un


cuadro de dilogo.

Show last compiler e r r o r . . .

ALT-SC

Muestra el ltimo error del compilador.

Pega texto de portapapeles a la posicin del


cursor en la ventana activa.

Find e r r o r . . .

ALT-SE
ALT-F8

Encuentra la posicin del cdigo fuente correspondiente a su error en tiempo


de ejecucin.

Find procedure...

ALT-SP

Encuentra el principio del procedimiento o funcin que se especifica en


un cuadro de dilogo.

Borra (limpia) el bloque marcado de texto


desde la ventana de edicin activa.
Abre el portapapeles, de modo que se puede
editar su contenido.

968

El entorno integrado de desarrollo Turbo Pascal 7.0

Programacin en Turbo/Borland Pascal 7

Men Compile (Alt-C)

Men Run (Alt-R)


Desde este men se puede ejecutar su programa. Si es necesario, el programa se compilar automticamente antes de su ejecucin. El m e n Run se despliega con ALT-R.

El m e n Compile permite compilar programas selectivamente compilando slo aquellos


archivos que necesitan ser compilados. Este m e n se activa con ALT-C.
File

File

Edit

Search

969

QQ

Compile

Debug

Run
Step over
Trace into
Go t o c u r s o r
P ro g ram r e s e t
Parameters...

Tools

Options

Window

Edit

Search

Run

Q Q Q Q

Debug

Tools

Help

Window

Help

Alt+F9

Compile
Make
Build

Ctrl+F9
F8
F7
F4
Ctrl+F2

Options

F9

D e s t i n a t i o n Memory
Primary f i l e . . .
Clear primary f i l e
Information...

1:1
i. i
F l - H e l p I Compile s o u r c e f i l e
Run t h e c u r r e n t p r o g r a m

Fl-Help

Figura D-5. Men Compile.


Figura D-4. Men Run.
Orden

Tecla de funcin/
Secuencia de teclas

Descripcin

Run

ALT-RR
CTRL-F9

Ejecuta el programa de edicin activa, compilando previamente si fuera necesario.

Step over

ALT-RS
F8

Ejecuta el programa, en la ventana de edicin


activa, sentencia a sentencia (realiza la traza).
Salta procedimientos y funciones, lo ejecuta
como si fuera una nica sentencia.

Trace into

ALT-RT
F7

Ejecuta el programa, en la ventana de edicin


activa, sentencia a sentencia, incluyendo la
traza de los procedimientos y funciones.

Go to cursor

ALT-RG
F4

Ejecuta el programa, detenindose en la posicin actual del cursor.

Program reset

ALT-RP
CTRL-F2

Reinicializa el programa.

Parameters

ALT-RA

Especifica los parmetros que se pasan al programa cuando se ejecuta el entorno integrado
de desarrollo, desde la lnea de rdenes.

Orden

Compi1e
Make

Tecla de funcin/
Secuencia de teclas
ALT-CC
ALT-F9
ALT-CM
F9

Build

ALT-CB

Destination Memory

ALT-CD

Primary f i l e . . .

ALT-CP

Clear primary f i l e

ALT-CL

Information...

ALT-CI

Descripcin
Compila el archivo de la ventana activa de
edicin.
Constituye una versin ejecutable dej archivo
del programa principal, compilando ese archivo y otros archivos modificados utilizados
en el programa.
Igual que Make, exceptuando que esta orden
recompila archivos fuente del programa, sin
tener en cuenta si han sido o no modificados.
Especifica si la versin ejecutable de un programa se almacena en memoria (Memory) o
en disco (Disk).
Especifica el archivo principal de un programa, cuyo cdigo fuente se encuentra en archivos mltiples.
Borra el nombre principal del archivo, de
modo que las rdenes Build o Make actan
sobre el archivo en la ventana de edicin.
Obtiene informacin sobre el archivo que est
siendo compilado.'Esta informacin se visualiza en un cuadro de dilogo.

970

Programacin en Turbo/Borland Pascal 7

El entorno integrado de desarrollo Turbo Pascal 7.0

971

Men Debug (Alt-D)

Men Tools (Alt-T)

El m e n Debug contiene facilidades para depuracin de programas. Para desplegar este


men, pulse ALT-D.

Este men, nuevo en T u r b o Pascal 7.0, permite acceder a diferentes programas auxiliares que se pueden utilizar en su trabajo diario. Este m e n se visualiza pulsando ALT-T.

File

Edit

Search

Run

Compile

T o o l s

PTIONS

Window

Help
File

Breakpoints...
Cali s t a c k
Register
Watch
Output
User s c r e e n
Evaluate/modify...
Add w a t c h . . .
Add b r e a k p o i n t . . .

Edit

Search

Run

Compile

Debug

Ctrl+F3

Options
Messages
Go t o n e x t
Go t o p r e v i o u s

Alt+F5

Grep

Window

Help

Al t + F 8
Alt+F7
Shi f t + F 2

Ctrl+F4
Ctrl+F7

1:1
F l - H e l p ! S e t c o n d i t i o n a l b r e a k p o i n t s , v i e w and e d i t b r e a k p o i n t s

1*1

Figura D-6. Men Debug.


Orden
Breakpoi n t s . . .

Tecla de funcin/
Secuencia de teclas
ALT-DB

F l - H e l p i Open t h e m e s s a g e window

Accede a un cuadro de dilogo, en el cual se


pueden editar, aadir y borrar puntos de ruptura.

CTRL-F3

Abre una ventana que contiene una lista de


procedimientos y funciones actualmente llamadas en el programa que se est ejecutando.

Regi s t e r

ALT-DR

Abre la ventana Register, hacindola activa.

Watch

ALT-DW

Cali s t a c k

ALT-DC

Abre la ventana Watch en la que se especifican variables o puntos de observacin.

Go to next

ALT-TN

Salta al siguiente mensaje la ventana Messages.

Go to previous

Abre y activa la ventana de salida (Output).

ALT-DU

Abre la pantalla de usuario, que utiliza la


pantalla completa para visualizar salidas de
programas.

CTRL-F4

Add w a t c h . . .

ALT-D A
CTRL-F7

Add b r e a k p o i n t . . .

ALT-DP
CTRL-F8

Descripcin
Abre la ventana de mensajes Messages, de
modo que pueda inspeccionar salidas de programas.

ALT-DO

ALT-DE

Tecla de funcin/
Secuencia de teclas
ALT-TM

User s c r e e n

Evaluate/modify...

Orden
Messages

Output

(ALT-F5)

Figura D-7, Men Tools.

Descripcin

Evala o modifica una expresin especificada


en un cuadro de dilogo.
Aade una expresin de observacin a la ventana Watch.
Aftade un punto de ruptura en un cuadro de
dilogo.

ALT-F8

Grep

ALT-F7

Salta al mensaje anterior con la ventana Messages.

ALT-TG

Invoca a la utilidad Grep, tipo UNIX.

ALT-TP

SHIFT-F2

972

Men Options (Alt-O)

Edit

Search

Run

Tecla de funcin/
Secuencia de teclas

Orden

El men Options permite modificar su entorno de trabajo y guardar y recuperar informacin de la configuracin. Se activa pulsando ALT-O.
File

Compile

973

El entorno integrado de desarrollo Turbo Pascal 7.0

Programacin en Turbo/Borland Pascal 7

Debug
Tools
N0NAME00.PAS

Window

Help

Compiler...
Memory s i z e s . . .
Linker...
Debugger...
Directories...
Tools...

Descripcin

Open...

ALT-OO

Abre un archivo con informacin de parmetros.

Save (TURBO..TP)

ALT-OS

Guarda los parmetros de configuracin del


archivo por defecto.

Save a s . . .

ALT-OA

Guarda los parmetros de configuracin del


archivo especificado.

Men Window (Alt-W)

Environment
Open...
Save
Save a s . . .

P0IN\TURB0.TP

El m e n Window permite controlar el m o d o en que aparecen las ventanas en la pantalla


y tambin qu ventanas son visibles. El m e n Window se activa con ALT-W.
File

Edit

Search

Run

Compile

Debug

Tools

Options

||J|QJ

Help

Tile
Cascade
Cise a l l
Refresh display
Si ze/Move
Zoom
Next
Previous
Cise

F l - H e l p S e t d e f a u l t c o m p i l e r d i r e c t i v e s and c o n d i t i o n a l d e f i n e s

Figura D-8. Men Options.

Orden

Tecla de juncin/
Secuencia de teclas

List...

ALT-OC

Especificar opciones de compilacin.

ALT-OM

Especifica los tamaos de memoria por defecto (por ejemplo, de una pila) de un programa.

Linker...

ALT-OL

Especifica las opciones relativas al proceso del


enlace.

Debugger...

ALT-OB

Especifica las opciones relativas al depurador


integrador.

Directories...

ALT-OD

Especifica los directorios en los que se encuentran o escriben diferentes tipos de archivos (.EXE, .PAS, .TPU, etc.).

..

Tools...
Envi ronment/
Preferences

ALT-OT

Edita, aade o borra herramientas de programas.

ALT-OE

Especifica los parmetros del entorno EID.


Especifica propiedades especficas de la pantalla.

ALT-OEP

Shi f t + F 6
Alt+F3
Alt+0

Descripcin

Memory si z e s . . .

Compiler...

Ctrl+F5
F5
F6

1:1
F l - H e l p I A r r a n g e windows on d e s k t o p by t i l i n g

Figura D-9. Men Window.

Orden

Tecla de funcin/
Secuencia de teclas

Descripcin

Tile

ALT-WT

Encaja (en losa) todas las ventanas para que


quepan en la pantalla. La ventana seleccionada se obtiene pulsando ALT y su nmero.

Cascade

ALT-WA

Coloca en cascada las ventanas de edicin.

974

Programacin en Turbo/Borland Pasci 7

El entorno integrado de desarrollo Turbo Pascal 7.0

Tecla de funcin/
Secuencia de teclas

Orden

Descripcin

Orden

C i s e al l

ALT-VVO

Cierra todas las ventanas abiertas.

R e f r e s h di spl ay

ALT-WR

Refresca o regenera la pantalla.

Si z e / M o v e

ALT-WS
CTRL-F5

Cambia el tamao o posicin de la ventana


activa, utilizando las ventanas activas para
mover la ventana.

Zoom

ALT-WZ
F5

Se expande o reduce la ventana activa hasta el


tamao de la pantalla.

Next

ALT-WN
F6

Pasa a la siguiente ventana.

Previous

ALT-WP
SH1FT-F6

Pasa a la anterior ventana.

Cise

ALT-WC
ALT-F3

Cierra la ventana activa.

ALT-WL
ALT-O

Lista todas las ventanas abiertas.

Li s t . . .

Men Help (Alt-H)


El m e n Help p e r m i t e acceder a y u d a a travs de u n ndice d e c o n c e p t o s y n o m b r e s
especficos o a travs de u n a tabla general de contenidos. Este m e n se visualiza p u l s a n d o ALT-H.
File

Edit

Search

Run

Compile

Debug

Tools

Options

Window

Contents
Index
Topic search
Previous topic

Tecla de funcin/
Secuencia de teclas

975

Descripcin

Contents

ALT-HC

Abre la ventana de ayuda (Help), visualizando una tabla de contenidos.

Index

ALT-HI
SHIFT-F1

Abre la ventana de ayuda con un ndice de


palabras reservadas.

Topic search

ALT-HT
CTRL-Fi

Abre la ventana de ayuda para informacin


sobre la construccin de Pascal en la posicin
actual del cursor.

Previous t o p i c

ALT-HP
ALT-F1

Abre la ventana de ayuda (si ya no est abierta) en la pantalla que proporciona ayuda sobre el sistema de ayuda.

Using help

ALT-HH
FI-F1

Abre la ventana de ayuda en una pantalla que


proporciona ayuda sobre el sistema de ayuda.

Files...

ALT-HF

Especifica archivos a instalar como material


de ayuda.

Compiler d i r e c t i v e s

ALT-HD

Ayuda sobre directivas del compilador

Reserved words

ALT-HR

Ayuda de palabras reservadas de Turbo


Pascal.

Standard uni t s

ALT-HU

Ayuda sobre unidades estndar de Turbo


Pascal.

Turbo Pascal
Language

ALT-HP

Ayuda sobre el lenguaje Turbo Pascal.

Error messages

ALT-HE

Ayuda sobre mensajes de error.

About...

ALT-HA

Informacin sobre la versin actual de! entorno.

Shift+Fl
Ctrl+Fl
Alt+Fl

Using h e l p
Files. ..
Compiler d i r e c t i v e s
R e s e r v e d words
Standard units
T u r b o P a s c a l Language
Error messages
About.. .

1:1
F l - H e l p Show t a b l e of c o n t e n t s f o r o n l i n e Help

Figura D - 1 0 . Men Help.

OPCIONES DEL EID (IDE) EN LA LINEA DE ORDENES


C u a n d o se i n v o c a el e n t o r n o i n t e g r a d o de desarrollo ( E I D ) desde la lnea de rdenes, se
p u e d e n especificar ciertas opciones:
Estas o p c i o n e s c o m i e n z a n c o n u n s m b o l o / o bien con u n s m b o l o + o
Si las o p c i o n e s c o m i e n z a n c o n
se d e b e d e j a r al m e n o s u n espacio e n t r e o p c i o n e s
consecutivas.
Las o p c i o n e s estn especificadas t o d a s c o m o cdigos de u n a letra y n o son sensibles a su t a m a o .
D e p e n d i e n d o de la o p c i n , se ha de p r o p o r c i o n a r u n valor al a r g u m e n t o , p o r
e j e m p l o , u n n o m b r e de archivo, u n valor n u m r i c o , o u n signo + o - .
S i t u a n d o u n signo + o u n b l a n c o d e s p u s de u n a o p c i n se activa esa o p c i n ;
s i t u a n d o u n signo - d e s p u s de la o p c i n , se desactiva.

976

Programacin en Turbo/Borland Pascal 7

El entorno integrado de desarrollo Turbo Pascal 7.0

Las opciones de arranque utilizan esta sintaxis:

977

ESTABLECER OPCIONES DE ARRANQUE EN EL EID

TPX

[/opciones] [archivos]

modo protegido

TURBO

[/opciones] [archivos]

modo real

Se pueden tambin establecer las opciones de arranque dentro del propio EID. Para
ello:
1. Seleccione la orden Options i Environment I Startup. Se visualiza el cuadro de dilogo Startup Options.
2. Seleccione la opcin adecuada y elija el botn Ok.

U n a lnea de rdenes vlida es:


t u r b o /E 128 t e s t

Realizando estas acciones, sus opciones de arranque sern efectivas la prxima vez
que se arranque el EID.

Tabla D-1. Opciones en arranque del compilador


Opcin

Descripcin

/Cnombrearchivo

Utiliza el archivo de configuracin especificado como argumento.

/D [+ o bien -]

Trabaja en modo dual monitor.

/Ynmero

Cambia el tamao del montculo del editor al tamao especificado


(en Kb). El argumento debe ser un valor entre 28 (por defecto) y 128
(slo modo real).

/G [+ o bien -]

Activa (o desactiva) una operacin de grabacin completa de archivos durante una sesin de depuracin.

/L [+ o bien -]

Se debe especificar si se utiliza el EID en una pantalla LCD (tal como


una computadora porttil).

/N [+ o bien -]

Activa (o desactiva) verificacin de nieve en monitores CGA.

/O nmero

Cambia el tamao del montculo de solapamiento (recubrimiento) al


tamao especificado (en Kb). El argumento debe ser un valor entre
64 y 256 con 112 K por defecto (slo modo real).

/P [+ o bien -]

Se utiliza para controlar intercambio de paletas en adaptadores


EGA.

/R [+ o bien -]

Si la opcin R est activada, el EID arranca con el ltimo directorio


de trabajo en que se encontraba la ltima.

-/Scamino

Especifica un rea de intercambio rpida para archivos temporales


del EID.

/T [+ o bien -]

Desactiva esta opcin para indicar al EID que no cargue la biblioteca


en tiempo de ejecucin turbo.tpl. Si se desactiva, se debe tener disponible la unidad system.tpu.

/W nmero

Cambia el tamao del montculo de la ventana al tamao especificado (en Kb). El argumento debe ser un valor entre 24 y 64 con 32 K
por defecto (slo modo real).

/X [+ o bien -]

Desactivar esta opcin para indicar al EID que no utilice memoria


expandida (EMS) (slo modo real).

File

Edit

Search

Run

Compile

[ ]
[ ]
[ ]
[X]
[ ]
[X]

Dual m o n i t o r s u p p o r t
Graphics s c r e e n save
EGA/VGA p a l e t t e s a v e
CGA snow c h e c k i n g
LCD c o l o r s e t
Load TURBO.TPL

[X]
[ ]

Use e x p a n d e d memory
R e t u r n t o 1 a s t di r

Debug
Tools
NONAMEOO.PAS

Options

Window

Window h e a p s i z e

32

E d i t o r heap s i z e

28

Overlay heap s i z e

90

Help

Swap f i l e d i r e c t o r y
OK

1:1
F l - H e l p i Use d u a l m o n i t o r s t o run IDE and u s e r p r o g r a m on s e p a r a t e d i s p l a y s

Figura D-11. Opciones de arranque del EID.

AYUDA EN LINEA
El EID tiene un sistema de ayuda en lnea que le permite visualizar pantallas de ayuda y
que presenta informacin sobre elementos diversos del lenguaje Pascal.
As, una de las ayudas ms necesarias en el desarrollo de programas es conocer el uso
o funcin de una palabra reservada, un procedimiento o funcin predefinida. U n ejemplo tpico es la obtencin de informacin de la palabra reservada string. Para ello, si en
su pantalla est la palabra string, mueva el cursor a una de las letras de la citada palabra
y pulse CTRL-Fi. Aparece un cuadro de informacin tal como la Figura D-12.

978

El entorno integrado de desarrollo Turbo Pascal 7.0

Programacin en Turbo/Borland Pascal 7


Help
String types

979

SALIDA DEL ENTORNO INTEGRADO DE DESARROLLO (EID)


( s t r i n g : r e s e r v e d word)

Existen dos formas para abandonar T u r b o Pascal:


A s t r i n g t y p e v a r i a b l e i s a s e q u e n c e of c h a r a c t e r s w i t h a dynamic 1 e n g t h , and
a c o n s t a n t mximum s i z e b e t w e e n 1 and 2 5 5 .
Syntax:
string [constant]
OR
s t r i ng
Remarks:
A s t r i n g t y p e d e c l a r e d w i t h o u t a mximum s i z e i s g i v e n t h e s i z e 2 5 5 .
S t r i n g c o n s t a n t s a r e w r i t t e n in q u o t e s ; f o r

Figura D-12. Pantalla de ayuda de string.

En este m o m e n t o se pueden realizar dos tareas:


1. Leer la siguiente informacin sobre cadenas. Pulsar AvPg (PgDn). Aparecer otra
ventana de ayuda
example:
-'Turbo'
'That" 's a l l '

2. Pulsar TAB y se mover el cursor a la primera palabra coloreada e n amarillo


"characters" sombrendose el fondo azul. A continuacin pulse INTRO y aparecer una pantalla de ayuda relativa al tipo carcter Char.
Char type
Variables of the ordinal type Char are used to
store ASCII characters.
Otros sistemas para obtener ayuda en lnea son:
1. Seleccionar el men Help (ALT+H) y activar la opcin deseada.
2. Pulsar Fi y obtendr informacin sensible al contexto dependiendo de la tarea que
se est realizando en ese m o m e n t o : edicin, depuracin, etc.
3. Pulsar SHIFT-FI (MAYUS+FI) para visualizar la pantalla con u n ndice de T u r b o
Pascal (Turbo Help Index).

1. Salir totalmente del EID. Seleccione File I Exit. Si se han realizado cambios que
no se han guardado, aparece un cuadro de dilogo (Information) que le pide si
desea guardar su programa antes de salir.
2. Dejar el entorno temporalmente, al objeto de introducir rdenes en la lnea de
rdenes del DOS. Se selecciona File I D O S Shell. El EID permanece en memoria
pero transfiere el control al DOS. Puede entonces ejecutar rdenes DOS e incluso
ejecutar otros programas. Cuando desee retornar al EID, teclee EXIT en la lnea
de rdenes y pulse Intro (Enter)\ el entorno EID aparece en la misma posicin en
que se qued.

Operaciones ms usuales con Turbo Pascal 7

Administracin (gestin) de ventanas

APENDICE

OPERACIONES MAS USUALES CON


TURBO PASCAL 7

C u a l q u i e r a de los m e n s desplegables c o n t e n i d o s en el m e n principal ( A p n d i c e C) se


p u e d e n activar p u l s a n d o s u c e s i v a m e n t e la tecla c o n t r o l Alt y la p r i m e r a letra del n o m b r e
del m e n . P o r ejemplo, Alt-E activa el m e n desplegable Edit.

Arranque

y parada

Operacin

Orden del menii

Secuencia de teclas
(teclas calientes)

Activar el men

Ninguna orden

FIO

Dejar el entorno (ambiente) Turbo

File[Exit

ALT-X

Manipulacin de archivos

Operacin

Orden del men

Secuencia de teclas
(teclas calientes)

Cancelar un men o cuadro de


dilogo

Ninguna orden de men

TECLA ESCAPE

Aceptar un cuadro de dilogo

Ok

TECLA R E T U R N
(INTRO)

Mostrar pantalla de usuario

Debug|User s c r e e n

ALT-F5

Pasar a travs de todas las ventanas


abiertas

Window|Next

F6

Pasar a travs de todas las ventanas


abiertas en orden inverso

Window|Previous

MAYUS-F6

Listar todas las ventanas abiertas

WindowsList

ALT-F10

Redimensionar o mover la ventana


activa
Utilizar teclas de flechaMaysculas para cambiar el
tamao de la ventana
Utilizar las teclas de flechas para
mover la ventana
Pulsar la tecla RETURN cuando se
termine la operacin

Window/Size/Move

CTRL-F5

Zoom/No Zoom de la ventana


activa

Window|Zoom

F5

Cerrar la ventana activa

Window|Cise

ALT-F3

Cerrar todas las ventanas activas

Windows|Cise ALL

N I N G U N A TECLA

Ejecucin de programas

Operacin

Orden del men

Secuencia de teclas
(teclas calientes)

Operacin

Orden del men

Secuencia de teclas
(teclas calientes)

Abrir un archivo con nombre

FileOpen

F3

Compilar un programa

Compile|Compile

ALT-F9

Guardar el archivo de la ventana de


edicin activa

F i l e j Save

F2

Ejecutar un programa

Run|Run

CTRL-F9
NINGUNA TECLA

F i l e j Save as

ALT-X
NINGUNA TECLA

Fijar directivas del compilador

Options|Compiler

Guardar el archivo de la ventana de


edicin activa con un nuevo nombre

Compile j D e s t i n a t i o n

NINGUNA TECLA

Cambiar a otro destino

F i l e j Change d i r

NINGUNA TECLA

Cambiar entre compilacin en


memoria y en disco

980

982

Programacin en Turbo/Borland Pascal 7

Depurador
Operacin

Orden del ment

Secuencia de teclas
(teclas calientes)

Compilar el programa e iniciar una


sesin de depuracin

RunTrace into

F7

DIRECTIVAS DE COMPILACION

Cada pulsacin de F7 ejecuta la


siguiente lnea y actualiza la ventana
de observacin

Men Options/Compiler

Igual que orden anterior, excepto


que F8 no muestra los detalles de las
llamadas del procedimiento

Run j Step over

F8

Aadir una expresin o cambiar el


valor de una variable

Debug|Watch

NINGUNA TECLA

Evaluar una expresin o cambiar el


valor de una variable

Debug j Evaluate/modify

CTRL-F4

Ejecutar el programa pero parar en


cursor

Run | Goto cursor

F4

Aadir un punto de ruptura en


cursor

Debug j Add breakpointReturn CTRL-F8

Listar todos los puntos de ruptura

Debug j Breakpoints

NINGUNA TECLA

Quitar todos los puntos de ruptura

Debug|Breakpoints|Clear a l l

NINGUNA TECLA

Final de una sesin de depuracin

APENDICE

Run j Program r e s e t

CTRL-F2

Una directiva de compilacin es una orden abreviada que instruye al compilador para
suponer una cierta condicin o realizar una accin particular durante la fase de compilacin de un programa: en esencia, controlar la naturaleza del cdigo producido por el
compilador de T u r b o Pascal.
Existen dos medios para establecer las directivas de compilacin: un mtodo es insertar directamente las rdenes en el cdigo fuente llamadas realmente directivas del
compilador, y el otro es utilizar el m e n Options.
Las directivas de compilacin se dividen realmente en tres tipos diferentes:
Directivas conmutadores: activan/desactivan alguna condicin, mediante el nombre de la directiva y el smbolo " + " para activar, y
para desactivar:
$B+!y |$B-[
Directivas parmetros: proporcionan parmetros al compilador, tales como n o m bres de archivos o valores para asignacin de memoria.
Directivas condicionales: controlan compilacin condicional de partes del texto
fuente, basada en smbolos condicionales definibles por el usuario.
U n a directiva comienza con un $ c o m o el primer carcter despus del delimitador de
comentario, y le sigue un n o m b r e que designa la directiva.
Sintcticamente, las directivas del compilador son comentarios de propsito especial.
Si el primer carcter en u n comentario es un smbolo dlar ($), ese comentario se interpretar por el compilador c o m o una directiva. N o puede haber espacio ni otros caracteres entre el delimitador izquierdo de comentarios { o (* y el signo dlar.
{$B+}
{$1 DEMO.INC}

{IFDEF Debug}
{$endIF}

Varias directivas del compilador se pueden incluir en un nico comentario como una
lista separada por comas.
{$1-}
{$1 A:Ratero.SRC}
{$C-, R-}

{$B-}
{$V-, V-, C-}

Las directivas del compilador se corresponden con rdenes del m e n Options (Figura G - l ) .
983

984

Directivas de compilacin

Programacin en Turbo/Borland Pascal 7

File

Edit

Run

Debug

Compi1e

Las opciones (directivas) del submen Compiler del men Options controlan el
modo en que el compilador genera su cdigo objeto, y, como se ha comentado, acta de
igual m o d o que las directivas. Estas opciones y directivas lo que en realidad hacen es
adecuar la generacin del cdigo objeto a las necesidades de un programa dado. La
mayora de las opciones de Compiler son del tipo conmutador, de modo que cada
opcin tiene dos estados conmutables, se pasa de u n o a otro con slo pulsar la tecla
correspondiente. Existe un valor por defecto, para el caso de que el programador no
modifique la opcin. Para cambiar el estado de una opcin bastar pulsar la letra adecuada.
As, por ejemplo, el estado por defecto de Boolean Evaluation es Shorl Circuit. Para
cambiar de Short a Complete, simplemente pulse B. De igual modo, se puede mover la
barra luminosa hasta que ocupe la opcin a cambiar y a continuacin pulsar RETURN.
En el caso de las directivas de compilacin, el programador debe incluirlas directamente en el programa fuente; si no lo hace, se supone la opcin por defecto; caso de
activar una directiva en algn punto del programa, puede volver a desactivar/activar
cuantas veces lo desee.

Break/watch
* C:NONAME.PAS

I n s e r Inde
Linker
Environment
Directories
Parameters
Save o p t i o n s
Retrieve options

Watch
Fl-Help

F5-Zoom

F6-Switch

F7-Trace

F8-Step

F9-Make

FIQ-Menu

Figura G - 1 . Los s u b m e n s d e las o p c i o n e s d e compilacin.

El men Options contiene siete submens que controlan las diferentes caractersticas
del compilador y del entorno de desarrollo. La lista de opciones es:
Compiler
Linker
Environment
Directories

Parameters
Save options
Retrieve options

El submen de Compiler tiene las opciones equivalentes a las diferentes directivas de


compilacin. La Figura G-2 muestra la correspondencia equivalencia entre las directivas y las opciones del compilador.
File

Edit
Line 1

Run
Col 1

Compile
Insert

C:NONAME.PAS

1 Range checking
Stack checking
1/0 checking
Forc f a r c a l i s
Overlays allowed
Align data
V a r - s t r i n g checking
Boolean e v a l u a t i o n
Numeric p r o c e s s i n g
Emulation
Debug i n f o r m a t i o n
Local s y m b o l s
Conditional defines
Memory s i z e s

Off

On
On
Off
Off
Word
Strict
Short C i r c u i t
Software
On
On
On

Watch
F5-Zoom

F6-Switch

$ A + / ~ (por c/efecto:+):Align Data


Align Data es una opcin perfeccionada para mejorar la eficacia en el acceso a los datos
de las computadoras en base a los microprocesadores 8086, 80286, 80386. Se puede
elegir entre dos configuraciones: Word o Byte.
Con Word (opcin por defecto), Turbo Pascal conserva cada variable simple y cada
constante con tipo a una direccin par de la memoria. La familia de microprocesadores
8086 accede ms rpidamente a los datos situados en direcciones pares de su memoria
(los datos estn alineados por palabras).
La directiva $A c o n m u t a entre estas dos configuraciones, Word y Byte, en un programa:

Break/watch
Inde
1

Fl-Help

985

F7-Trace

F8-Step

|$A+}
{$A-}

conmuta a la configuracin Word


conmuta a la configuracin Byte
Align Data

equivale a

$B: Boolean Evaluation {por defecto,


La opcin Boolean Evaluation determina el m o d o en que Turbo Pascal evala las expresiones lgicas compuestas (con la ayuda de los operadores lgicos and y or). Esta opcin
y las directivas $B ofrecen la eleccin entre la evaluacin en cortocircuito y evaluacin
completa.
Evaluacin en cortocircuito

F9-Make

FlO-Menu

Figura G-2. C o r r e s p o n d e n c i a e n t r e d i r e c t i v a s y o p c i o n e s del c o m p i l a d o r .

{$A+} y {$A-}

opcin
directiva

Boolean Evaluation
|$B-

Short Circuit

986

Programacin en Turbo/Borland Pascal 7

Estas opciones o estado de la directiva es la opcin por defecto, y no necesita incluirse en el programa, es opcional ya que la establece el compilador. Las expresiones lgicas
se evalan hasta determinar el valor de la expresin. Por ejemplo:
la expresin a and b, si a es falso; Turbo Pascal no evala b, ya que la operacin
siempre ser falsa;
la expresin a or b, si a es verdadero; Turbo Pascal no evala b, ya que sea cual sea
su valor, el resultado final es verdadero.

Directivas de compilacin

Pascal simula estas operaciones y puede trabajar con los tipos de datos Single, Double,
Extended y Comp. El nico inconveniente es la ralentizacin de los clculos.
La opcin Emulacin (On/$E+) para emular el funcionamiento del coprocesador
exige que la opcin Numeric Processing est en el estado 8087/80287.
{$E+j
j$E-j

Ejemplo
Si n = 5, la evaluacin en cortocircuito con j $ B - } no considera la segunda parte de la
expresin, no se evala y el resultado ser falso.

Evaluacin completa
opcin
directiva

genera un cdigo de emulacin (el coprocesador numrico es opcional).


no genera un cdigo de emulacin (el coprocesador numrico es obligatorio, si se desean realizar los clculos en formato de coma flotante IEEE).

$F: Forc Far Calis (por defecto,

(n=2) and ( a / b > 1 2 5 )

Boolean Evahiation
j $B+}

Complete

Esta opcin evala todas las componentes de la expresin lgica con independencia
de los valores de los elementos iniciales.
Este modo de trabajo es el de Pascal estndar, por consiguiente si desea transportar
sus programas deber utilizar esta directiva.
$D: D e b u g Information (por defecto,

$D+)

La opcin Debug Information o su directiva equivalente $ D sirve para localizar la


posicin del error en tiempo de ejecucin en su cdigo fuente.
Si la opcin. Debug Information est activa (estado por defecto) o la directiva $D+
fijada, el compilador genera las informaciones necesarias para utilizar el depurador integrado (opcin fntegrated debugging del m e n Debug). Esta informacin de depuracin
permite localizar el origen de los errores de ejecucin. Adems, si esta opcin est activa,
se puede seguir el programa lnea a lnea (la traza).
Si la opcin de depuracin no est activa, los errores de ejecucin se visualizarn
pero no se pueden localizar las lneas causantes de los mismos.

987

j$F-})

La opcin Forc Far Calis o la directiva $F sirve para generar el cdigo que llama a
procedimientos o funciones. Existen dos tipos de llamadas: externa o lejana (FAR) e
interna o local (NEAR).
El programa principal y los subprogramas estn contenidos dentro de un nico segmento de cdigo, de m o d o que a los subprogramas se accede utilizando llamadas internas. Sin embargo, los subprogramas que se declararon en la seccin de interface de una
unidad deben ser invocados por llamadas externas, ya que pueden ser llamados desde el
segmento de cdigo del programa principal o cualquier otro segmento de cdigo de una
unidad.
U n a llamada externa contiene a la vez la direccin del segmento (de 64Kb) y la
direccin en el interior del segmento designado. Una llamada interna no contiene ms
que el desplazamiento el offset, la direccin en el interior del segmento.
La opcin por defecto es j $ F - } (offy, el compilador genera llamadas internas para
todos los procedimientos y funciones, con la excepcin de las proporcionadas al programa por unidades.
Si la opcin Forc Far Calis se activa (on) o se utiliza la directiva $F+j, todos los
procedimientos y funciones se compilan para llamadas externas.
Ejemplo
{$F+}

i$D+

equivale a

i$D-j

equivale a

$E: Emulation (por defecto,

activar informacin de depuracin


(Debug Information on)
desactivar informacin de depuracin
(Debug Information off)

|$E+|)

Las versiones 5.X, 6.0 y 7.0 tienen la propiedad de emular a los coprocesadores matemticos 8087/80287, incluso a u n q u e no estn fsicamente disponibles.
El estado por defecto de esta opcin es Activado (on). En este caso, T u r b o Pascal
comprueba si el sistema posee o no un coprocesador. Si est presente, se sirve de l para
realizar todas las operaciones en coma flotante. En caso de no estar instalado, T u r b o

P r o c e < ^ u r e ProcExterno;
begin

{se compila p a r a llamadas e x t e r n a s }

end;
{$F-}

En los programas escritos en 5.0/5.5 que utilicen recubrimientos (overlays), Borland


recomienda situar una directiva {$F+j al principio del programa y de cada unidad, a fin
de cumplir las exigencias de llamadas externas.
|$F+
j'$F-j

equivale a
equivale a

Forc Far Calis 09


Forc Far Calis off

988

Programacin en Turbo/Borland Pascal 7

$1: 1/0 Checking (por defecto,

j$l+j)

La opcin 1/0 Checking (verificacin de E/S) y la directiva $1 determinan si el compilador va a generar cdigo para detectar los errores de E/S. Esta opcin se activa por
defecto. Cuando la opcin est desactivada, el programa puede llamar a la funcin
IOResult despus de cada operacin de E/S. Si una operacin de E/S tiene xito, IOResult devuelve el valor 0. En caso de error, IOResult devuelve un cdigo de valor entero,
que representa el error. El programa puede utilizar este valor para determinar lo que
debe hacer a continuacin.
{$1+}
j$I-j

activa la verificacin de E/S.


desactiva la verificacin de E/S.

Ejemplo
Este segmento de programa presenta una solucin para prevenir errores de E/S en un
programa.
{$i->
Reset (nombre_arch)

Directivas de compilacin

$L: Local S y m b o l s (por defecto,

989

j$L+})

Para utilizar el Depurador Integrado con programas que contengan subprogramas (casi
todos!) se debe activar explcitamente la generacin de una tabla de smbolos locales,
esto es, smbolos que pertenecen al subprograma en lugar de al programa principal.

{$L+j
j$L-j

genera informaciones sobre las variables y constantes locales.


no genera informacin sobre las variables y constantes locales.

$ M < T a m a o Pila > < Mnimo Pila Dinmica > < M x i m o Pila Dinmica >
La directiva $M controla el t a m a o de las zonas de memoria pila (stack) y pila de
variables dinmicas (heap)*. Esta directiva incluye a la opcin Memory Sizes.
La directiva $M slo puede ser utilizada dentro de archivos de programas. Si se sita
una directiva en un archivo fuente de una unidad, ningn error se generar, pero la
directiva se ignorar y no tendr ningn efecto.
Formato

{$1 + }

if IOResult= 0 then
begin
end
else
WriteLn ( ' L a a p e r t u r a de ' , n o m b r e _ a r c h , ' no e s p o s i b l e ' ) ;

j$Mj

Tamao Pila, Mnimo

Nota
Para ampliacin de esta directiva, consulte el Apndice L.

$1 < nombre-arch > : Archivo de inclusin


Esta directiva con parmetros permite incluir un archivo durante la compilacin. Este es
un sistema para dividir su codigo fuente en nodulos. Cuando el compilador encuentra la
directiva SI<nombrearch>, abre el archivo de disco <nombrearch>
y comienza su
compilacin. El archivo <nombrearch>
no se lee realmente n memoria c o m o un
todo; el compilador lee simplemente lnea a lnea, compila la lnea a cdigo mquina, a
continuacin pasa y procesa la siguiente lnea.

Mximo

Pila Dinmica

Ejemplos
j$M 65520,0,32768)

Si el valor de IOResult es 0, el archivo ha sido abierto correctamente y el programa


puede leerlo. Por el contrario, si IOResult es distinto de 0, se produce un error.

Pila Dinmica,

j$M 16384,0,0}

tamao pila es 65520 bytes


mnima asignacin pila dinmica: 0 bytes
mxima asignacin pila dinmica: 32768 bytes
tamao pila dinmica: 0 bytes

La mnima cantidad de pila que se puede asignar a un programa Turbo Pascal es


1.024 bytes. Si se intenta asignar menos cantidad, se recibir un error:
E r r o r 17: I n v a l i d c o m p i l e r d i r e c t i v e s

La mxima cantidad de memoria asignable a la pila es 65.520 bytes (nmero 65336


como parece suponerse, 2"'). La asignacin por defecto a la pila es de 16.384 bytes, y, en
general, suele ser un valor suficiente para la mayora de las aplicaciones, con la excepcin de subprogramas recursivos que necesitarn ms espacio. En el caso de necesitar
ms espacio de memoria para la pila que los 16K bytes asignados por defecto, debe
incluir en el interior del programa la directiva (para el caso de 32K bytes de t a m a o de
la pila):

Nota
|$M 32768,0,0|
Para mayor ampliacin de esta directiva, consulte el Apndice L.
* El t r m i n o heap se suele traducir tambin por montculo

o montn.

990

Directivas de compilacin

Programacin en Turbo/Borland Pascal 7

En el caso de pila de variables dinmicas {heap), Turbo Pascal asigna todo el espacio
de memoria que no haya ocupado el programa. Aunque se pueden variar los tamaos de
la pila dinmica, como ya se ha expuesto, Turbo Pascal realiza automticamente diversas tareas de gestin de la pila dinmica. Un puntero contiene la direccin de memoria
de una variable almacenada en la pila, proporcionando as un medio simblico de referenciar una direccin de la pila dinmica. El programa no tiene necesidad de manipular
directamente las direcciones de memoria de la pila de variables dinmicas. No obstante,
puede ocurrir que pueda faltar memoria para crear nuevas variables dinmicas; esto
sucede cuando aparece el mensaje
Heap o v e r f l o w e r r o r

En este caso ser preciso fijar un lmite superior para el t a m a o de la pila dinmica.

$ N : Numeric Processing [por defecto,

{$N})

Existen dos grandes categoras de nmeros reales en Turbo Pascal:

991

La directiva de compilacin SO permite activar o no la opcin de compilar una


unidad tratndola como un recubrimiento.
j$0+j
{$0 j

genera cdigo de recubrimiento.


no genera cdigo de recubrimiento.

SO < nombre unidad >


Esta directiva permite especificar, cuando se compila un programa, cul de las unidades
utilizadas por el programa se situar en un archivo .OVR en lugar de un archivo
EXE.
program R e c u b r i r ;
{F+}
uses overlay, DOS, C r t , XMODEM, P r u e b a , T e s t , J u e g o ) ;
{ $ 0 XMODEM}
{$0 P r u e b a }
{$0 J u e g o }

nmeros reales por software


$ P : Open String P a r a m e t e r s (slo existe

tipo Real
nmeros reales estilo 8087
tipos Single, Doubled, Extended y Comp
Turbo Pascal 5.0/5.5 puede simular (emular) las operaciones del coprocesador matemtico (8087, 80287 y 80387) sobre un sistema que no lo contenga. Esta emulacin
tiene, sin embargo, el inconveniente de la ralentizacin de las operaciones. La directiva a
utilizar para esta emulacin es $N o su opcin equivalente Numeric Processing.

en 7.0)

Esta directiva controla el significado de parmetros variables utilizando la palabra reservada string. Su valor por defecto es {$P-}; en este estado los parmetros variables declarados utilizando la palabra reservada string son parmetros variables normales, sin embargo en el estado {$P+} son parmetros de cadena abierta.
Si desea trabajar con parmetros abiertos, incluya al principio de su cdigo fuente las
lneas siguientes:
( * A c t i v a c i n d e p a r m e t r o s a b i e r t o s *)
(* $P+)

!$N+)
j $N- j

activa la configuracin 8087/80287/80387.


activa la configuracin por software.

$ 0 : Overlays A l l o w e d (por defecto,

j $ 0 - j)

Recordemos que los recubrimientos (los overlays) son partes de un programa que residen alternativamente en la misma seccin de memoria durante la ejecucin de un programa, permitiendo ejecutar un programa ms grande que la capacidad de memoria de
la computadora.
Turbo Pascal permite el empleo de recubrimientos en los proyectos de programacin
basados en unidades. La opcin Overlays Allowed o la directiva $ 0 determinan si el
compilador debe o no generar el cdigo necesario para hacer de una unidad un recubrimiento.

{$P+}
{$P-}

equivale a
equivale a

$Q: O v e r f l o w C h e c k i n g (slo existe

Open String Parameters on


Open String Parameters off

en 7.0)

La directiva $Q controla la generacin de cdigo de verificacin de desbordamiento.


Su estado por defecto es {$Q-}. En el estado {$Q+}, ciertas operaciones aritmticas
enteras (+, - , *, Abs, Sqr, Succ y Pred) se verifican a efectos de desbordamiento y comprobar que el resultado de las operaciones aritmticas est dentro del rango soportado. Si un
fallo de desbordamiento se detecta, el programa termina y ^e visualiza un mensaje de
error en tiempo de ejecucin.
La directiva $Q normalmente se utiliza a unin con la directiva $R que activa y

992

Directivas de compilacin

Programacin en Turbo/Borland Pascal 7

desactiva la generacin del cdigo de verificacin de rango. Esta directiva ($Q) ralentiza
su programa, en consecuencia no la utilice ms que a efectos de depuracin.

{$Q+}
{$Q-}

Overflow Checking on
Overflow Checking off

equivale a
equivale a

$R: R a n g e - C h e c k i n g (por defecto,

{$R})

La opcin Range-Checking o directiva $R, cuando se activan, permiten detectar si un


ndice de un array o cadena o valores de datos escalares estn fuera del rango o intervalo
de validez; en este caso, el programa se detiene dando un error de ejecucin.
!$R+}
!$R-1
| $R+
| $R- j

Range-Checking on
Range-Checking off

equivale a
equivale a

activa la verificacin de los extremos del rango


desactiva la verificacin de los extremos del rango

$Y: S y m b o l r e f e r e n c e information ( s l o existe

993

en 7.0)

La directiva $Y activa o desactiva generacin de informacin de smbolos de referencia.


Esta informacin consiste en tablas que proporcionan los n m e r o s de lnea de todas las
declaraciones y referencias a smbolos en u n mdulo. El estado por defecto es {$Y+}.
Cuando un programa o unidad se compela en el estado {$Y+}, el hojeador (browser)
integrado de Turbo Pascal puede visualizar definicin de smbolos e informacin de
referencia para ese mdulo.
En unidades, la informacin de referencia de smbolos se registra en el archivo .TPU
j u n t o con el cdigo objeto de la unidad. La informacin de referencia de smbolos
incrementa el t a m a o de los archivos .TPU, pero no afecta al t a m a o o velocidad del
programa ejecutable.
La directiva $Y se utiliza n o r m a l m e n t e con las directivas, tambin conmutadores, $D y $L que controlan la generacin de informacin de depuracin y de smbolos
locales.
{$Y-}
{$Y+}

equivale a
equivale a

Symbol reference information on


Symbol reference information off

Nota

$V: Var-String Checking

Es conveniente activar esta opcin cuando se necesite verificar los rangos y desactivarla
despus de haber comprobado el rango.

Las cadenas tienen una longitud fsica especfica, y el tipo String tiene una longitud por
defecto de 255 bytes, o bien queda definida en string{30], string[40], etc., con la longitud
entre corchetes. Cuando se pasa un tipo string a una funcin o procedimiento por
referencia (como un parmetro var), la longitud fsica del parmetro formal y la longitud
fsica del parmetro real, se requiere sean exactamente la misma; si no es as, se producir un error en tiempo de compilacin.
La directiva j $ V - j o la opcin Relaxed permite pasar parmetros actuales (reales) de
cualquier longitud a un parmetro formal dado.
El estado por defecto de esta opcin es Strict.

$ S : S t a c k - O v e r f l o w Checking (por defecto,

j$S+|)

Normalmente, el programa ejecutable comprueba si existe espacio disponible en la pila


para variables locales y parmetros valor antes de cada llamada a una funcin o procedimiento. Si no existe espacio disponible, se producir un error en tiempo de ejecucin y
se detendr el programa.
La opcin Stack-Overflow Checking o directiva $S activa o desactiva la verificacin
de la pila. Por defecto, la opcin est activa y T u r b o Pascal asigna 16K bytes de memoria
a la pila. La opcin Memory Sizes del submen Compiler permite modificar la cantidad
de memoria de la pila para un programa dado.
$T: T y p e - C h e c k e d Pointers (slo existe

en 7.0)

La directiva $T controla los tipos de valores puntero generados por el operador @. Con el
estado {$T-}, el tipo resultado del operador @ es siempre Pointer. En otras palabras, el
resultado es un puntero sin tipos que es compatible con los tipos puntero.
C u a n d o @ se aplica a una referencia de variable en el estado {$T+}, el tipo de resultado es "T, en donde T es el tipo de la referencia de la variable. En otras palabras,
el resultado es de un tipo que es compatible slo con otros punteros al tipo de la
variable.
{$T+}
{$T}

equivalea
equivale a

Type-Checked Pointers on
Type-Checked Pointers off

V a r - S t r i n g Checking S t r i c t

En este estado, una variable pasada por referencia debe tener el mismo tipo definido
que el parmetro formal var definido en el subprograma. En el otro estado Relaxed, la
longitud de la cadena pasada al subprograma no tiene necesidad de corresponder a la
longitud definida por el parmetro formal.

$v+|
$V-}

equivale a
equivale a

Var-String Checking Strick


Var-String Checking Relaxed

COMPILACION CONDICIONAL
Turbo Pascal permite una compilacin condicional. Utilizando directivas de compilacin condicional se puede indicar al compilador que compile ciertas partes de un cdigo
fuente e ignore otras basadas en smbolos especiales. U n ejemplo aclarar este trmino.

994

Programacin en Turbo/Borland Pascal 7


begin
{ $IFDEF T e s t }
WriteLn ( ' e s t a l i n e a s e c o m p i l a ' ) ;
{$endIF}
end;

Tabla F-1, Directivas para compilacin condicional


j$DEFINE nombre]

Define un smbolo condicional nombre.

j$ELSE|

Indica el principio del bloque de cdigo que ser compilado si


la direccin correspondiente (SIFDEF, SIFNDEF. SIFOPT) es
falsa.

{SENDIF i

Indica el fin de un bloque de cdigo compilado condicionalmente.

J SIFDEF nombrej

Compila el bloque (cdigo fuente) siguiente si nombre ha sido


definido.

SIFNDEF nombre\

Compila el bloque (cdigo fuente) siguiente si nombre no ha


sido definido.

SIFOPT opcin1,

Compila el bloque siguiente nicamente si opcin ha sido configurada adecuadamente.

SUNDEF nombre]

Suprime la definicin de un smbolo (nombre) para las directivas siguientes: SIFDEF y SIFNDEF.

3. {$DEFINE T e s t }
begin
if T e s t then
WriteLn ( ' l i n e a no c o m p i l a d a ' )
end;

RESUMEN DIRECTIVAS DE COMPILACION


Esta tabla muestra la sintaxis tal como se ha de introducir en su cdigo fuente y visualizar su equivalente en la lnea de rdenes.

Directiva
Las directivas de compilacin para la compilacin condicional se muestran en la
Tabla F-1.
Las versiones de T u r b o Pascal definen automticamente los siguientes smbolos:
ver5.X
ver60
ver70
msdos
cpu86
cpu87

indica la versin correspondiente (5.0 5.5)


indica la versin 6.0
indica la versin 7.0
indica el sistema operativo (MS-DOS o PC-DOS)
especifica la familia de CPU (microprocesadoresy a que pertenece: 80 x 86
indica (si est definido) el coprocesador 8087 en el sistema.

Ejemplos

995

Directivas de compilacin

Lnea de
rdenes

Descripcin

{$A+} por defecto

/$A+

Alinea variables y constantes de tipos sobre lmites


de palabras.

{SA-}

/$A-

Alinea variables y constantes de tipos sobre lmites


de bytes.

{$B+}

/$B+

Evaluacin de expresin lgica completa.

{$B-} por defecto

,/SB-

Evaluacin de expresin Lgica a cortocircuito.

{$D+} por defecto

/$D+

Genera informacin de depuracin.

{SD-}

/$D-

Desactiva informacin de depuracin.

{DEFINE nombre}

/D nombre

Define un smbolo condicional de nombre.


Conmuta entre compilacin e ignora el cdigo fuente delimitado por {$IFxrxx} y {SENDIF}.

1. program T e s t C o n d i c i o n a l ;
uses
Printer;
begin
{$IFDEF P r i n t e r O n }
WriteLn ( I s t , ' e s t a s a l i d a va a l a i m p r e s o r a )
{$else}
WriteLn ( ' e s t a s a l i d a va a l a p a n t a l l a ' )
{$endIF}
end.

{ELSE}

{SF+}

/$F+

, Procedimientos y funciones compilados utilizan


siempre el modelo de llamada far.

Si PrinterOn est definida, se compilar y ejecutar la primera sentencia WriteLn;


en caso contrario se compilar y ejecutar la segunda sentencia WriteLn.

{SF} por defecto

,'SF-

El compilador selecciona el modelo apropiado: far o


near.

{SG+}

/SG+

Genera instrucciones 80286 para mejorar generacin de c cdigo.

2. const
Test = True;

{$E+}

/$E+

Activa evaluacin
80 x 87.

de

{SE-}

/$E

Desactiva emulacin de coprocesador numrico


80 x 87.
Termina compilacin
{SIFxrxr}.

{SENDIF}

coprocesador

condicional

numrico

del

ltimo

996

Programacin en Turbo/Borland Pascal 7

Directiva

Lnea de
rdenes

Directivas de compilacin

Descripcin

{SI+} por defecto

/$I+

Activa generacin automtica de cdigo que verifica el resultado de una llamada a un procedimiento
de E/S.

{$1--} por defecto

/$I~

Desactiva la generacin automtica de cdigo.

{SI nombrearchivo}

Incluye el archivo en la compilacin.

{IFDEF nombre}

Compila cdigo fuente que sigue si est definido


nombre.

{IFNDEF nombre}

Compila el cdigo fuente que sigue si no est definido nombre.

{IFOPT conmutador}

Compila el cdigo fuente que sigue si conmutador


est en el estado especificado.

{$L nombrearchivo}

Enlaza el archivo objeto con el programa o unidad


que se est compilando.
/$L+

Genera informacin de smbolos locales.

{$M} tamaopila,

/$Mp,

Especifica una aplicacin o minmontculo, minmont, parmetros de asignacin de maxmontculo


maxmont memoria.

{$N+}

/$N+

Genera cdigos que realiza todos los clculos de tipo


real utilizando 80 x 87.

{$N-}

/$N-

Genera cdigo que realiza todos los clculos de tipo


real mediante llamadas a bibliotecas a tiempo de ejecucin.

{$ P+}

/$P+

Activa parmetros array y cadena abierta en declaraciones de procedimiento y funcin.

- i$P-}

/$P-

Desactiva parmetros array y de cadena abiertos.

{$Q+}

/$Q+

Activa la generacin de cdigo de verificacin de


desbordamiento.

$Q-}

O
1

{$L+}

Desactiva la generacin de cdigo de verificacin de


desbordamiento.

{$0+}

/$0+

{$o-}

/$0-

Desactiva generacin de cdigos de recubrimiento.

{$R+}

/$R+

Genera cdigo de verificacin de rango.

{$R-}

/$R-

Desactiva generacin de cdigo de verificacin de


rango.

{$S+}

/$S+

Genera cdigo de verificacin de desbordamiento de


pila.

{$S-}

/$S-

Desactiva cdigo de verificacin de desbordamiento


de pila.

{$T+}

/$T+

Activa generacin de punteros comprobados de tipo


cuando se utiliza el operador @.

Activa generacin de cdigos de recubrimiento.

Directiva
{%!-}

Lnea de
rdenes
/$T-

{UNDEF nombre}
{$V+}

997

Descripcin
Desactiva generacin de punteros controlados de
tipo cuando se utiliza el operador @.
Indefine un smbolo condicional definido anteriormente.

/$v+

Activa verificacin estricta de tipo.

{$V-}

/$v-

Desactiva verificacin estricta de tipo.

{$X+}

/SX+

Activa sintaxis extendida para permitir despreciar


resultado de una llamada a funcin y soportar cadenas terminadas en nulo.

{$X-}

/$X-

Desactiva sintaxis extendida.

Depuracin de sus programas

en Turbo Pascal

999

Tabla G-1. Niveles de exactitud de un programa


Exactitud de correccin

Nivel

APENDICE

DEPURACION DE S U S PROGRAMAS
EN TURBO PASCAL
Raramente los programas funcionan bien la primera vez que se ejecutan e incluso en
numerosas ocasiones ni a la octava ni a la dcima vez. De hecho, basta pensar que un
programa es perfecto para que acto seguido nos proporcione quebraderos de cabeza en
su ejecucin. Cuando se pregunta a los programadores profesionales que resuman el
proceso de depuracin (correccin) de sus programas, la respuesta suele ser la misma:
experiencia.
Afortunadamente, la programacin en T u r b o Pascal es diferente. T u r b o Pascal proporciona un potente depurador incorporado que le ayuda a examinar el interior de un
programa mientras se est ejecutando. Con el depurador se puede seguir la pista (traza)
del flujo completo del programa, y se puede ver c o m o cambia cada variable en cada paso
del camino.
El depurador est construido en el entorno EID* de T u r b o Pascal, por lo cual se
puede editar, compilar y depurar sin dejar T u r b o Pascal. Y, adems, para programas
grandes o complejos que requieran el soporte del lenguaje mquina, Borland proporciona el programa Turbo Debugger.

TIPOS DE ERRORES
Existen tres categoras o tipos de errores: de compilacin, de ejecucin y lgicos. Los
niveles de exactitud pasos hasta su correccin final de un programa se indican en la
Tabla H - l .

Errores de compilacin
Un error de compilacin (en tiempo de compilacin) o de sintaxis ocurre cuando se
viola una regla de la sintaxis de Pascal: olvidar un punto y coma, no declarar una
variable, palabra reservada mal escrita, ausencia de argumentos, pasar un n m e r o incorrecto de parmetros a un procedimiento, asignar un valor real a una variable entera, etc.
T u r b o Pascal no compilar su programa, es decir, no generar su cdigo m q u i n a hasta
que sean reparados todos los errores de compilacin.
* En ingls. IDE (Integrated Development E n v i r o n m e n t ) .

998

No compila bien.

Compila sin errores.

Comienza su ejecucin pero se detiene con errores en tiempo de ejecucin.

Se ejecuta pero produce resultados incorrectos.

Produce resultados correctos para un conjunto pequeo de datos de entrada


normales.

Produce resultados correctos para un conjunto de datos normales de entrada


bajo todas las condiciones de ejecucin normales o esperadas.

Produce resultados correctos para datos de entrada extremos, anormales e


incorrectos, bajo condiciones de ejecucin normales, esperadas y no esperadas.

Produce resultados correctos para cualquier posible dato y condiciones de ejecucin.

La mayora de los errores de compilacin son evidentes y fciles de fijar. Cuando


T u r b o Pascal detecta uno, el proceso de compilacin se detiene y Turbo Pascal visualiza
un mensaje en la pantalla que indica la naturaleza del problema y retorna al editor con el
cursor posicionado en el lugar donde ha ocurrido el error. Simplemente debe corregir su
error y comenzar de nuevo la compilacin.
As, por ejemplo, un error tpico es olvidarse de escribir el separador p u n t o y coma al
final de una sentencia. Por ejemplo, supongamos tiene escritas las siguientes lneas:
WriteLn('Fin del mensaje')
Saludar
END;
Al compilar el programa al que pertenecen esas lneas, el compilador localizar el
error y se parar la compilacin. Retornar al editor y el cursor se posicionar debajo de
la S de Saludar (un determinado procedimiento). Asimismo en la parte superior de la
ventana de edicin se visualizar el mensaje de error:
E r r o r 85:

expected

(falta; al final de lnea WriteLn/

Todos los mensajes de error producidos por el compilador T u r b o Pascal estn numerados; en este caso, el cdigo de error correspondiente a la ausencia de un p u n t o y coma
es 85 (la lista de los mensajes de error se encuentra en el Apndice I).
El proceso de compilacin debe continuar hasta que su programa est libre de toda
clase de errores de compilacin. Durante la compilacin, T u r b o Pascal visualiza un
cuadro especial de mensajes que proporciona informacin sobre el destino de la compilacin y el nmero de lneas que se han compilado. Despus que la compilacin ha
terminado con xito, el cuadro le solicita pulsar cualquier tecla para retornar al editor.

1000

Depuracin de sus programas en Turbo Pascal

Programacin en Turbo/Borland Pascal 7

1001

Algunos de los mensajes tpicos de error y sus posibles causas se analizan a continuacin:

comentado anteriormente, el error de compilacin ocurre en la lnea inmediatamente


despus de la lnea que no contiene el p u n t o y coma.

Unkown Identifier

Precaucin

Este error significa que Turbo Pascal no puede encontrar un cierto identificador que ha
utilizado en su programa n o m b r e de una variable, constante, procedimiento o algn
otro elemento de un programa. Normalmente se produce por alguna de estas
causas:
1. Error de escritura cuando se tecle el programa. Corrija el identificador. Es un
error trivial y casi siempre fcil de corregir.
2. Olvid nombrar una unidad en la clusula U S E S de su programa; por ejemplo,
olvid poner el nombre de la unidad Crt en un programa que utiliza el procedimiento ClrScr. (Atencin! Este error en concreto no se puede producir en
las versiones anteriores a la 4, ya que no soportaban unidades.)
3. Error en la estructuracin de un programa. Esta causa de error es difcil de detectar, ya que el identificador correspondiente es inaccesible en el lugar del programa
donde se ha utilizado. Para localizar este error debe tener presente lo siguiente:
Los identificadores deben ser declarados antes de ser utilizados. Si la subrutina
(procedimiento o funcin) M utiliza l a subrutina N, entonces N debe estar definida en el programa antes que la subrutina M.
Los identificadores interiores estn ocultos al exterior de la subrutina.
Incluso dentro de una subrutina, un identificador debe declararse antes de ser
utilizado y lo mismo se cumple para el caso de subrutinas.
Missing E N D or Comment Bracket
Las causas de posibles errores de este tipo se derivan de la estructuracin de los programas: prdidas de palabras E N D (al final de sentencias compuestas, procedimientos,
funciones o programas). El mejor mtodo para localizar estos errores es el conocimiento
de la sintaxis de Pascal y el seguimiento o traza de la lgica del programa, con la ayuda
de u n lpiz que facilite las aperturas y cierres de estructuras sintcticas (BEGIND-END
y { })
Mixed-Up IFs and ELSEs
Este error se produce cuando se utilizan sentencias IF-THEN-ELSE o CASE anidadas.
La causa ms frecuente es la mala escritura de estas sentencias debido a la no previsin
por el programador de que una sentencia IF siempre trata de grabar la sentencia T H E N
y/o ELSE ms prxima. Al igual que el error "missing END or Comment Bracket", el
mejor sistema para localizar este error es seguir su lgica con un lapicero.
Expected
Este es un error trivial que se produce por el olvido de la escritura de puntos y c o m a para
separar sentencias en un programa de otras sentencias. Para corregir este error basta con
aadir un punto y coma al final de la lnea donde falta. Normalmente, como se ha

Antes de probar a ejecutar su programa, realice las siguientes dos tareas:


1. Pulse F2 para grabar la ltima versin de su programa en disco.
2. Visualice el men File y seleccione la orden Change dir. Introduzca la unidad y directorio adecuados.

Errores de ejecucin
Cuando ya se ha compilado el programa con xito, pulse ALT-R para visualizar el m e n
Run, a continuacin pulse R para ejecutar la orden Run. Para visualizar la salida del
programa, pulse ALT-F5 para utilizar la pantalla completa c o m o ventana de salida.
Los errores de ejecucin (en tiempo de ejecucin) son problemas que el compilador
no puede detectar por antici^Jo, pero que originan la parada del programa antes de su
terminacin. Valores de entrada imprevistos, clculos no vlidos (divisin por cero),
problemas en acceso a disco, etc., producen errores de ejecucin.
Los errores de ejecucin terminan el programa y visualizan un mensaje y un n m e r o
de error. Si el programa se estaba ejecutando en el interior del entorno integrado, T u r b o
Pascal retorna al editor y lleva el cursor a la lnea de cdigo en que se activ el error. Los
errores de ejecucin pueden ser u n a incomodidad, pero dado que conoce la lnea de
cdigo que estaba ejecutando cuando se p r o d u j o el error, no es difcil analizar y reparar
el problema. Algunos mensajes tpicos de error son:
Attemp to Assign Out-Of-Range Valu
Este error se produce c u a n d o se intenta utilizar tipos numricos, enumerados y subrangos que tienen un rango o intervalo limitado de valores. U n ejemplo tpico de error es
intentar asignar al entero 800 a u n a variable de tipo byte que slo t o m a valores de 0
a 255.
Failure to Handle Nonmatch in CASE Statement
Las sentencias CASE en T u r b o Pascal no son tan rgidas en su f u n c i o n a m i e n t o como lo
son en Pascal estndar. C u a n d o la variable selector de CASE t o m a valores diferentes a
los casos contemplados, T u r b o tiene dos protecciones e n lugar del error que se produce en Pascal estndar. La primera proteccin es la clusula ELSE, que sirve para
ejecutar acciones determinadas, y la segunda proteccin es que en el caso de ausencia de
ELSE el programa no se detiene y sigue en la siguiente lnea.
Failure to Initialize Variable Before Use
Algunas variables necesitan ser inicializadas al principio de su programa o subrutina,
otras no. El problema es, pues, localizar estas variables.
Las variables que se utilizan como contadores de bucles FOR no tienen que iniciali-

1 002

Depuracin de sus programas

Programacin en Turbo/Borland Pascal 7

zarse; sin embargo, las variables utilizadas para controlar los bucles W H I L E y REPEAT
deben inicializarse. Las expresiones y variables que controlan las sentencias IF y CASE
pueden o no necesitar ser inicializadas.
El mtodo ms seguro, en caso de duda, es inicializar la variable, utilizando simplemente una sentencia con su valor inicial.
S := 0;
C o n t r o l := 5;

en Turbo Pascal

1003

Loop Exit Condition Never Reached


Este error se produce cuando un programa entra en un bucle sin fin.
Loop Executes VVrong Number of Times
Este error se produce por dos posibles causas: el bucle nunca se ejecuta, cuando al menos
se debe ejecutar una vez, o se ejecuta al m e n o s una vez c u a n d o bajo ciertas condiciones
nunca se debe ejecutar. La correccin de este error es una adecuada seleccin de los
bucles WHILE o REPEAT.

Excepcin
El nico tipo de variable que debe siempre inicializarse es el puntero. Una variable
puntero se debe fijar a nil al principio de un programa o subrutina, y tambin a nil tan
pronto como se liberen y no sean ya necesarias.

File Not Found


Se trata de procesar (RESET o A P P E N D ) un archivo que no existe o bien que existe
pero en un directorio distinto al que est buscando su programa. Tal vez la solucin ms
adecuada sea asegurarse que todos los archivos necesarios en la ejecucin del programa
estn en el mismo directorio del disco.
File Not closed
Si un archivo no se cierra al final de un programa, algunos datos pueden perderse, es
decir, aquellos que se encuentren en la memoria intermedia del archivo.

Errores lgicos
Un error lgico se genera cuando el programa hace algo que no desea hacer o no hace lo
que se espera que haga. Un error lgico es un fallo de diseo del programa. Los errores
lgicos son los ms difciles de detectar y aislar.
A veces, naturalmente, un error lgico es evidente. S el primer n m e r o de una
pgina de un informe es 44, casi con seguridad que se habr olvidado inicializar su
variable contador de pginas. Los errores lgicos producen resultados incorrectos o abortan los problemas. Su deteccin requiere un anlisis exhaustivo ms que un examen de
las reglas de Pascal.
Algunos errores lgicos son:
Failure to Use VAR Parameter When Needed
Este es, seguramente, el error ms probable cometido en las subrutinas. Recuerde que si
se desea pasar una variable a una subrutina existen dos mtodos: por valor y por referencia. Cualquier variable que deba ser modificada por una subrutina debe pasarse como un
parmetro VAR, es decir, por referencia. Si se olvida pasar una variable con VAR en la
lista de parmetros, se producir este error.

EL DEPURADOR INTEGRADO TURBO PASCAL


Las versiones primitivas de T u r b o Pascal disponan de pocas herramientas para depuracin de programas; entre ellas la sentencia WriteLn, que permite visualizar el valor de
una variable en un p u n t o de su programa.
El depurador integrado de T u r b o Pascal proporciona cuatro herramientas para depuracin de programas: capacidad para seguir la ejecucin del programa lnea; capacidad
para observar el valor de una o ms variables a medida que se ejecuta el programa;
capacidad de cambiar un valor de una variable interior mientras se ejecuta el programa,
a fin de encontrar el efecto que ese cambio produce, y la capacidad de establecer puntos
de ruptura o interrupcin (breakpoints) en los que se detendr el programa cuando se
ejecute, de m o d o que se pueda inspeccionar los resultados hasta ese punto.

Preparando el depurador para su uso


Antes de comenzar a depurar un programa se deben hacer varias cosas. En primer lugar
se deben activar las directivas de compilacin {$D} y {$L}. Estos valores por defecto son
{$&+} y {$1+}. La opcin {$0} puede ser controlada por la orden Options/Compiler/Debug
Information y la opcin {$[_} puede ser controlada por Options/Compile/Local
Symbols.
Finalmente, antes de compilar su programa, debe asegurarse activar la opcin
Options/ Debugger/ Integrated Debugging q u e genera informacin de depuracin en el
archivo ejecutable.
Las caractersticas ms sobresalientes del depurador se describen en los prrafos siguientes.

Los puntos de interrupcin (breakpoints)


Se pueden marcar lneas en su programa c o m o puntos de interrupcin (breakpoints).
Cuando se ejecuta su programa y se alcanza un p u n t o de interrupcin en la banda de
ejecucin. Se pueden entonces examinar variables, comenzar la traza o ejecutar el programa hasta que se encuentre otro p u n t o de interrupcin. Se puede tambin interrumpir
en cualquier punto, pulsando CTRL-BREAK (CTRL-INTER). Esta accin tiene el efecto de
parada en la lnea fuente siguiente, c o m o si de un punto de interrupcin se tratara.

1004

Programacin en Turbo/Borland Pascal 7

Observacin/Vigilancia (Watches)
Se pueden establecer un determinado n m e r o de puntos de observacin, inspeccin o
vigilancia en la ventana Window. Cada u n o puede ser una variable, u n a estructura de
datos o una expresin.

Ir hasta el cursor (F4)


La caracterstica Go to Cursor le permite especificar un punto temporal de parada en su
programa. Para utilizar esta caracterstica, site el cursor en una lnea especfica de su
programa y pulse a continuacin F4. T u r b o Pascal ejecutar su programa hasta que se
alcanza la lnea de programa que contiene el cursor, en cuyo p u n t o el control retorna al
programador. Esta operacin facilita saltar sobre bucles y otras secciones de cdigo
tediosas.

La traza de un programa (F7)


Turbo Pascal ofrece dos medios para realizar el seguimiento de su programa; el primer
mtodo, llamado paso a paso (stepping), ejecuta u n a nica lnea de cdigo cada vez; si la
lnea llama a una subrutina, este mtodo trata esa subrutina como si fuera una nica
sentencia; este mtodo se denomina StepOver. Este mtodo se activa pulsando la tecla
de funcin F7. El segundo mtodo, traza (tracing), es similar al mtodo paso a paso,
excepto que cuando una lnea tiene una llamada a una subrutina, la subrutina se ejecuta
lnea a lnea. Este mtodo se activa pulsando F8 (Step).

La pulsacin de F7 tiene el mismo efecto que pulsar F8, excepto cuando la lnea contiene
una llamada a subrutina. En este caso, F7 ejecuta la subrutina lnea a lnea, mientras que F8
ejecuta la sentencia completa incluyendo la funcin.

UNA SESION DE DEPURACION


U n a vez que est familiarizado con el depurador integrado, es el m o m e n t o de analizar
prcticamente las tareas que lleva consigo la depuracin de un programa.

Preparacin del depurador


Antes de arrancar la depuracin de un programa, el compilador debe ser capaz de
generar la tabla de smbolos y la informacin de nmeros de lnea necesarios para sus
programas. Las directivas de depuracin del compilador $L+ y $D+ hacen estas tareas (por
defecto estn activadas). Estas directivas corresponden a las opciones de m e n Options I Compiler i Local Symbols y Options I Compiler i Debug Information, r t r i v a mente.

Depuracin de sus programas en Turbo Pascal

1 005

U n a tabla de smbolos es una pequea base de datos interna de todos los identificadores utilizados: constantes, tipos, variables, procedimientos e informacin de nmeros
de lnea. {$D+} genera tablas de nmeros de lneas que hace correspondencia del cdigo
objeto con el cdigo fuente y {$L+} genera informacin local de depuracin, que significa
crear una lista de identificadores locales a cada procedimiento o funcin, de m o d o que el
depurador puede "recordarlos" mientras est depurando. Si utiliza las directivas juntas,
grabarlas de este modo: {$D,L}.

Comienzo de la sesin de depuracin


El medio ms rpido para comenzar la depuracin es cargar el programa y ejecutar la
orden Run I Trace Into o bien pulsar la tecla de funcin F7. El programa se compila y la
barra de ejecucin se situar en el primer begin del cuerpo principal del programa. A
partir de este p u n t o se puede ir sentencia a sentencia, pulsando F7, o bien pulsar F8, con
lo que los procedimientos o funciones se ejecutan c o m o si fueran una nica sentencia,
en lugar de sentencia a sentencia como es el caso cuando se pulsa F7.
Si se conoce previamente el lugar a donde se desea llegar con la comprobacin, se
puede utilizar F4 que ejecuta el programa hasta la posicin actual del cursor y a continuacin se detiene y hace una pausa.
Otra opcin es establecer puntos de interrupcin. Lleve el cursor a la lnea donde
desea se detenga ei cursor, a continuacin seleccione Debug I Toggle Breakpoint o pulse
CTRL-F8 y a continuacin ejecute su programa (seleccione R u n i Run o pulse CTRL-F9).
Se pueden establecer varios puntos de ruptura en cuyo caso el programa se detendr
siempre que llega a cualquiera de dichos puntos.

Comenzar de nuevo una sesin de depuracin


Si est enfrascado en la depuracin de un programa y por cualquier causa desea volver a
comenzar de nuevo la depuracin, seleccione la orden Program Reset (CTRL-F2) del
men Run. Esta orden reinicializa la depuracin en la primera lnea del cuerpo principal
de su programa y realiza tambin las siguientes operaciones: cerrar todos los archivos
abiertos por su programa, limpiar (borrar) la pila de cualquier llamada de subrutinas
anidadas y libera cualquier espacio que est utilizando el montculo.
T u r b o Pascal ofrece otro mtodo de reiniciar un programa si se hacen cambios durante la depuracin. Por ejemplo, si se modifica alguna parte de un programa y se pulsa
cualquier orden de ejecucin (F7, F8, F4, CTRL-F9, etc.), se obtiene un cuadro de dilogo
con el mensaje "Source modified, rebuild (Y/N)" (modificado fuente, reconstruir, 'S/no'].
Si se pulsa Y, T u r b o Pascal reconstruye su programa y comienza la depuracin desde el
principio. Si se pulsa N, T u r b o Pascal supone que usted conoce lo que est haciendo y
contina la sesin de depuracin.

Cualquier cambio en el cdigo fuente no afecta a la ejecucin 'del programa hasta que se
vuelva a compilar.

1006

Programacin en Turbo/Borland Pascal 7

Terminar la sesin de depuracin


Mientras se est depurando un programa, Turbo Pascal sigue la pista de lo que est
haciendo, y aunque puede cargar y editar archivos diferentes mientras est depurando,
Turbo Pascal no interpreta la carga de un archivo distinto en el editor como finalizacin
de la sesin de depuracin. As pues, si desea ejecutar o depurar un programa distinto,
Turbo Pascal lo sabr por la eleccin de la orden Run I Program Reset (CTRL-F2).

Examinando variables
Probablemente una de las cosas ms interesantes que puede hacer el depurador integrado es poner una observacin o inspeccin en una o ms variables de su programa. Esta
caracterstica permite comprobar los valores de las variables a medida que progresa su
programa sin necesidad de insertar sentencias de depuracin extras en su cdigo.
Arranque el programa con F7 y pulse cuantas veces lo requiera. Cuando desee aadir
variables de observacin, elija la orden Debug I Watches I Add Watch (CTRL-F7) para
visualizar el cuadro Add Watch. Mediante la combinacin adecuada de F7 y CTRL-F7 se
pueden seguir fcilmente los valores de expresiones y variables a medida que progresa el
programa.

OTRAS NORMAS DE DEPURACION


Ahora que ha aprendido cmo utilizar el depurador, vamos a examinar otras propiedades y caractersticas que pueden facilitar la depuracin.

Escribiendo programas dneos para depuracin


El depurador integrado slo puede depurar una sentencia por lnea. La unidad de ejecucin en el depurador es una lnea y no una sentencia. Si se tiene diferentes sentencias
Pascal en una sola lnea, stas se ejecutarn juntas cuando se pulsa F7. As, por ejemplo,
Turbo Pascal permite escribir la siguiente lnea de cdigo:
t : = 5 * z ; z : = m DIV n ; s : = 4 . 2 5 ; n : = 6 ;

Depuracin de sus programas en Turbo Pasca!

1007

Las declaraciones de variable se pueden organizar tambin de modo que aquellas que
probablemente vaya a poner en la ventana Watch estn ms prximas a la sentencia
begin inicial del procedimiento o funcin. Cuando se detenga en ese procedimiento o
funcin, se puede mover rpidamente el cursor a lo largo de la lista utilizando Add
Watch (CTRL-F7) para aadir cada variable como una nueva observacin (Watch).
De modo similar, si existen expresiones que desea examinar o evaluar, con frecuencia, en ciertos puntos de su programa, es conveniente insertarlos como comentarios.
Cuando se alcance ese punto, se puede mover el cursor al comienzo de la expresin y
copiarla en el cuadro Add Watch o Evalate and Modify.
En cualquier forma, la mejor depuracin siempre es la preventiva. Un programa bien
diseado y claramente escrito no slo tendr menos errores, sino que ser ms fcil fijar
y localizar los que se produzcan. Algunas reglas interesantes a seguir en la escritura de
programas son:
Dividir los programas en mdulos. Los mdulos (unidades, procedimientos y funciones) deben tener alrededor de 25 lneas; si alguno tuviera ms de un nmero, es
conveniente romperlo de nuevo en procedimientos y funciones ms pequeas.
Siempre que sea posible codificar, probar y depurar sus programas mdulo a mdulo, antes de integrarlos en dichos programas.
Tratar de pasar la informacin slo a travs de parmetros, en lugar de utilizar
variables globales. Esta accin evita los efectos laterales y tambin hace el cdigo
ms fcil de depurar, ya que se puede examinar fcilmente toda la informacin
que procede y sale de un procedimiento o funcin dada.
Es ms rentable crear un programa que funcione correctamente en lugar de tratar
de hacerlo ms rpido.

Requisitos de memoria
El depurador integrado requiere memoria y puede suceder que en el caso de grandes
programas el espacio ocupado por el depurador puede necesitarse para programas. En
consecuencia, es conveniente utilizar tcnicas que permiten optimizar (ahorrar) la memoria.
Eliminar programas resistentes en memoria RAM, tipo SideKick.
Modificar CONFIG.SYS para eliminar controladores innecesarios (ANSI.SYS,
cachs de disco, etc.) o reducir el nmero de archivos y memorias intermedias
(FILES=20, BUFFERS=20).

Reconfigurar Turbo Pascal.


Esto significa que si hubiera algn error en alguna de esas sentencias, el depurador
integrado no ser capaz de indicar cul es la sentencia que produce el error. Por esta
causa, slo en el caso de que se tenga seguridad plena de que las sentencias son sintcticamente correctas no es conveniente poner diferentes sentencias en una lnea, siendo
mejor poner una sentencia en cada lnea
t := 5;
z : = m DIV n ;
s := 4 . 2 5 ;
r := 6;

- Si se tiene instalada memoria extendida, asegrese de que al menos estn disponibles 64 K necesarios para el editor.
- Si no se van a utilizar programas de grficos, asegrese que la opcin Graphics
Screen Save est desactivada. *
- Eliminar de TURBO.TPL cualquier unidad no utilizada.
Organizar el programa mediante recubrimientos. El programa ser ms lento pero
deja ms memoria libre para la depuracin.
Al compilar el programa, desactive las directivas de comprobacin de errores del
compilador, tales como $S y $0.

1008

Depuracin de sus programas en Turbo Pascal

Programacin en Turbo/Borland Pascal 7

La directiva {$L-} reduce el tamao de la tabla de smbolos locales. La directiva {$D-}


reserva memoria y es conveniente utilizarla si no se necesita en depuracin.

TRATAMIENTO DE ERRORES
Adems del depurador integrado, Turbo Pascal proporciona diferentes directivas del
compilador y caractersticas del lenguaje que ayudan a capturar (detectar) errores de
programacin. Algunas de estas caractersticas se describen a continuacin.

Comprobacin de errores de entrada/salida


Trate de ejecutar el programa Sumar e introduzca los valores 75 y 9z cuando se soliciten
y a continuacin pulse INTRO.
program Sumar ;
var
a , b . Suma : I n t e g e r ;
begin
WriteLn( 1 I n t r o d u z c a dos nmeros :
R e a d L n ( a , b) ;
Suma : = a + b ;
W r i t e L n ( 1 La suma e s
Suma) ;
ReadLn;
end.

);

Se obtiene un mensaje de error (el 106) y el cursor se posiciona en la sentencia.


ReadLn(a, b ) ;

El error se ha producido debido a que se esperaban dos valores enteros y uno de ellos ha
sido numrico (9z).
Cmo se puede evitar esta comprobacin de tipos de datos? Turbo Pascal puede
desactivar la verificacin automtica de errores de E/S; para ello, incluya la directiva de
compilacin {$1-} en su programa.

Comprobacin de rango
Otros errores tpicos son aquellos que implican valores fuera de rango o de lmites. Por
ejemplo, casos tpicos son: asignacin de un valor demasiado grande a un valor entero,
por ejemplo, 75534; asignar un valor a un ndice de un array fuera del rango de definicin.
La directiva {$R+} activa la verificacin de fuera de rango. Sin embargo, en ocasiones
se necesita violar los lmites del rango bien en todo el programa o en segmentos de
programa, por ejemplo cuando se trabaja con arrays asignados dinmicamente o con
funciones que actan sobre tipos enumerados como Succ y Pred. La verificacin o

1009

comprobacin de rangos se consigue situando {$R+} al principio del segmento de programa y {$R} al final del mismo segmento. Esta operacin suele ser la ms empleada, por lo
cual slo se verifican aquellos segmentos de programas donde se requiera la comprobacin de rango. Por ejemplo, en el bucle siguiente:
while Indice < 101 do
begin
Indice := Indice + 1;
{$R+}
if Listaflndice] > o then
Lista [Indice] :=-l;
{$R-}
end;

activa verificacin de rango


desactiva verificacin de rango

DEPURACION ORIENTADA A OBJETOS


Borland ha extendido las propiedades del depurador integrado para soportar depuracin
orientada a objetos dentro del entorno integrado IDE.
La depuracin orientada a objetos dentro del IDE no requiere ninguna preparacin
especial ni consideraciones especiales de cdigo. El depurador integrado soporta totalmente objetos y elementos objetos que los trata de igual modo que si fueran procedimientos, registros y funciones. Los dos sistemas de depuracin, paso a paso (stepping)
y traza (tracing), se realizan mediante llamadas a mtodos y examen de los datos
objetos.

La traza
Las llamadas a los mtodos se tratan por el depurador de modo igual que un procedimiento o funcin. Por consiguiente, la pulsacin de la tecla de funcin F8 (StepOver)
considera la llamada al mtodo como una unidad indivisible y la ejecuta sin visualizar el
cdigo interno del mtodo; mientras que F7 (Trace Into) carga el cdigo del mtodo, si
est disponible, y sigue la traza a travs de las sentencias del mtodo.

Mtodos estticos versus virtuales


No existe diferencia entre el seguimiento o traza de las llamadas a los mtodos estticos y
a los mtodos virtuales.
Las llamadas a los mtodos virtuales se resuelven en tiempo de ejecucin, pero como
la depuracin sucede en tiempo de ejecucin, no existe ambigedad y el depurador
integrador siempre conoce el mtodo correcto que debe ejecutar a continuacin.

La ventana Cali Stack


La ventana Cali Stack visualiza los nombres de los mtodos con el prefijo del tipo
objeto. Nota: el prefijo del mtodo es el tipo objeto que define el objeto, no el nombre

1010

Programacin en Turbo/Borland

Pascal 7

de la variable de la instancia objeto. Por ejemplo, la ventana Cali Stack visualizar


ScrollBar.In.it en lugar de mi o HScrol.Init.

La ventana Evalate
Normalmente, cuando un nombre de objeto se especifica en la ventana Evalate, slo se
visualizan los campos datos. En la ventana Evalate, los campos de los datos objetos se
visualizarn esencialmente en el mismo formato que un registro fecha. Se aplican los
mismos especificados del formato registro y todas las extensiones que son vlidas para
registros son aceptadas para objetos.
C u a n d o un nombre especfico de mtodo bien esttico o virtual se evala, un
valor puntero se visualiza indicando la direccin del cdigo del mtodo.
Dentro del EID, el depurador puede tambin evaluar u observar el parmetro Self
y puede seguirse la traza con especificaciones de formato y c a m p o o calificadores de
mtodo.

La ventana Watch

APENDICE

M E N S A J E S Y CODIGOS
DE ERROR
C o m o ya conoce el lector, existen tres tipos de errores: errores de sintaxis o de compilacin, errores de ejecucin y errores lgicos.

Errores de compilacin (sintaxis)


El formato de los mensajes de error en compilacin es

Cualquier objeto puede ser asignado a una ventana Watch, al igual que u n registro todos
los calificadores que son vlidos para registros son vlidos para objetos.

La orden Find Procedure


En T u r b o Pascal 6.0 la orden Find Procedure del m e n Debug permite la entrada de
expresiones que evalan a una direccin dentro del segmento del cdigo correspondiente. Esto se aplica a variables y parmetros procedurales, as c o m o a mtodos objeto.

E r r o r 16: Type I d e n t i f i e r e x p e c t e d

Errores en tiempo de ejecucin


Algunos errores en el m o m e n t o de la ejecucin hacen que el programa visualice un
mensaje de error y terminan.
Run-time

nnn
xxxx.yyyy

error nnn at xxxx:yyyy

nmero del error


direccin de error (segmento y desplazamiento)

Los errores en ejecucin se dividen en cuatro categoras:

errores
errores
errores
errores

DOS: 1-99
de E/S (I/O): 100-149
crticos: 150-199
fatales: 200-255

Lista de errores de compilacin


Turbo Pascal 5.0 a 7.0
1. Out of memory (Falta memoria).
Si Compile/Destination se pone a Memory, pngalo a Disk en el entorno integrado.
1011

1012

Programacin en Turbo/Borland Pascal 7

Si Options/Linker/Link Buffer en el entorno integrado se pone a Memory,


fijarla a Disk. Utilizar la opcin / L para enlazar al disco en el compilador de
lnea de rdenes.
Si est utilizando alguna utilidad (programa) residente en memoria, tal como
SideKick, elimnelos de la memoria.
S est utilizando TURBO.EXE, trate de utilizar en su lugar TPC.EXE.
Si ninguna solucin anterior elimina el mensaje de error, su programa o
unidad son sencillamente demasiado grandes para compilarlos con la
memoria disponible y tendr que romperlo en dos o ms unidades, ms pequeas.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.

Identifier expected (Se esperaba un identificador).


Unknow identifier (Identificador desconocido).
Duplcate identifier (Identificador duplicado).
Syntax error (Error de sintaxis).
Error in real constant (Error en constante real)
Error n integer constant (Error en constante entera)
String constant exceeds line (Constante de cadena excede la lnea)
Too many nested files (Demasiados archivos anidados).
Unexpected end of file (No se esperaba fin de archivo).
Line too long (Lnea demasiado larga).
Type identifier expected (Se esperaba identificador tipo)
Too many open files (Demasiados archivos abiertos).
Invalid file ame (Nombre de archivo no vlido).
File not found (Archivo no encontrado).
Disk full (Disco lleno).
Invalid compiler directive (Directiva del compilador no vlida).
Too many files (Demasiados archivos).
Undefined type in pointer definition (Tipo sin definir en la definicin del puntero).
Variable identifier expected (Se esperaba identificador de variable).
Error in type (Error de tipo).
Structure too large (Estructura demasiado grande).
Set base type out of range (Tipo base de conjunto fuera de rango).
File components may not be files (Existen componentes de archivo que pueden no
ser archivos).
Invalid string length (Longitud de cadena no vlida).
Type mismatch (Tipos no coinciden).
Invalid subrange base type (Tipo base de subrango invlido).
Lower bound greater than upper bound (Lmite inferior mayor que el superior).
Ordinal type expected (Se esperaba tipo ordinal).
Integer constant expected (Se esperaba constante entera).
Constant expected (Se esperaba constante).
Integer or real constant expected (Se esperaba constante real o entera).
Type identifier expected (Se esperaba identificador de tipo).
Invalid function result type (Tipo resultado de funcin no vlido).
Label identifier expected (Se esperaba identificador de etiqueta).

Mensajes

36.
37.
38.
39.
40.
41.

y cdigos de error

1013

BEGIN expected (Se esperaba BEGIN).


END expected (Se esperaba END).
Integer expression expected (Se esperaba expresin entera).
Ordinal expression expected (Se esperaba expresin ordinal).
Boolean expression expected (Se esperaba expresin booleana).
Operand types do not match operator (Tipos del operando no coinciden con operador).
42. Error in expression (Error en expresin).
43. Illegal assignment (Asignacin ilegal).
44. Field identifier expected (Se esperaba identificador de campo).
45. Object file too large (Archivo objeto d e m a s a ^ grande).
46. Undefined external (No se defini procedimiento external).
47. Invalid objet file record (Registro de archivo objeto no vlido).
48. Code segment too large (Segmento de cdigo demasiado grande).
49. Data segment too large (Segmento de datos demasiado grande).
50. DO expected (Se esperaba DO).
51. Invalid PUBLIC definition (Definicin PUBLIC no vlida).
52. Invalid EXTRN definition (Definicin E X T R N no vlida).
53. Too many EXTRN definition (Demasiadas definiciones EXTRN).
54. OF expected (Se esperaba OF).
55. INTERFACE expected (Se esperaba INTERFACE).
56. Invalid relocatable reference (Referencia reasignable no vlida)
57. THEN expected (Se esperaba THEN).
58. TO or DOWNTO expected (Se esperaba TO o DOWNTO).
59. Undefined forward (Forward no definido).
60. Too many procedures (Demasiados procedimientos).
61. Invalid typecast (Typecast no vlido).
62. Divisin by zero (Divisin por cero).
63. Invalid file type (Tipo de archivo no vlido).
64. Cannot Read or Write variables of this types (No se pueden leer o escribir variables
de este tipo).
65. Pointer variable expected (Se esperaba variable de puntero).
66. String variable expected (Se esperaba variable de cadena).
67. String expression expected (Se esperaba expresin de cadena).
68. Circular unit reference (Referencia de unidad circular).
69. Unit ame mismatch (No coincide nombre de unidad).
70. Unit versin mismatch (No coincide versin de unidad).
71. Duplcate unit ame (Nombre de unidad duplicado).
72. Unit file format error (Error en formato de archivo de unidad).
73. Implementation expected (Se esperaba implementacin).
74. Constant and case types do not match (No coinciden tipos de case y constantes).
75. Record variable expected (Se esperaba variable de registro).
76. Constant out of range (Constante fuera de rango).
77. File variable expected (Se esperaba variable de archivo).
78. Pointer expression expected (Se esperaba expresin de puntero).
79. Integer or real expression expected (Se esperaba expresin real o entera).
80. Label not within current block (La etiqueta no est dentro del bloque actual).

1014

Programacin

en Turbo/Borland

Mensajes

Pascal 7

81. Label already defined (Etiqueta ya definida).


82. Undefined label in preceding statement part (Etiqueta sin definir en la parte anterior de la sentencia).
83. Invalid @ argument (Argumento @ no vlido).
84. U N I T expected (Se esperaba UNIT).
85.
expected (Se esperaba
86.
expected (Se esperaba
87.
expected (Se esperaba
88. "(" expected (Se esperaba "(").
89. ")" expected (Se esperaba ")").
90. "=" expected (Se esperaba
91.
expected (Se esperaba ":=").
92. "[" or "(." expected (Se esperaba "[" o "(").
93. "]" or ".)" expected (Se esperaba "]" o
94.
expected (Se esperaba
95.
expected (Se esperaba
96. Too many variables (Demasiadas variables).
97. Invalid FOR control variable (Variable de control FOR no vlida).
98. Integer variable expected (Se esperaba variable entera).
99. Files are not allowed here (No se permiten archivos aqu).
100. String length mismatch (No coincide la longitud de cadena).
101. Invalid ordering of flelds (Orden de campos no vlido).
102. String constant expected (Se esperaba constante de cadena).
103. Integer or real variable expected (Se esperaba variable real o entera).
104. Ordinal variable expected (Se esperaba variable ordinal).
105. INLINE error (Error INLINE).
106. Character expression expected (Se esperaba expresin de carcter).
107. Too many relocation items (Demasiados elementos de reasignacin).
112. CASE constant out of range (Constante CASE fuera de rango).
113. Error in statement (Error en sentencia).
114. Cannot cali an interrupt procedure (No se puede invocar un procedimiento de interrupcin).
116. Must be in 8087 mode to compile this (Debe fijarse el modo 8087 para poderse compilar).
117. Target address not found (No se encuentra direccin de destino).
118. Include files are not allowed here (No se permiten archivos de inclusin).
120. NIL expected (Se esperaba NIL).
121. Invalid qualifier (Calificador no vlido).
122. Invalid variable reference (Referencia de variable n $ vlida).
123. Too many symbols (Demasiados smbolos).
124. Statement part too large (Parte de sentencia demasiado grande).
126. Files must be var parameters (Los archivos deben ser parmetros var).
127. Too many conditional symbols (Demasiados smbolos condicionales).
128. Misplaced conditional directive (Directiva condicional mal colocada).
129. ENDIF directive missing (No se encuentra directiva ENDIF).
130. Error in initial conditional defines (Error al definir condiciones iniciales).
131. Header does not match previous definition (La cabecera no coincide con la definicin previa).

132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.

y cdigos de error

1015

Critical disk error (Error crtico en el disco).


Cannot evalate this expression (No se puede evaluar esta expresin).
Expression incorrectly terminated (Expresin terminada incorrectamente).
Invalid format specifier (Especificador de formato no vlido).
Invalid indirect reference (Referencia indirecta no vlida).
Structured variables are not allowed here (No se permiten aqu las variables de estructura).
Cannot evalate without System unit (No se puede evaluar sin la unidad Sistema).
Cannot access this symbol (No se puede acceder a este smbolo).
Invalid floating-point operation (Operacin de punto flotante no vlida).
Cannot compile overlays to memory (No se pueden compilar recubrimientos a la
memoria).
Procedure or function variable expected (Se esperaba variable de funcin o procedimiento).
Invalid procedure or function reference (Referencia de funcin o procedimiento no
vlidos).
Cannot overlay this unit (No se puede recubrir esta unidad).

Turbo Pascal 6.0/7.0


146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.

File access denied (Acceso a archivo denegado).


Objet type expected (Se esperaba tipo de objeto).
Local objet types are not allowed (No se permiten tipos de objeto local).
VIRTUAL expected (Se esperaba VIRTUAL).
Method identifier expected (Se esperaba identificador de mtodo).
Virtual constructors are not allowed (No se permiten constructores virtuales).
Constructor identifier expected (Se esperaba identificador constructor).
Destructor identifier expected (Se esperaba identificador destructor).
Fail only allowed within constructors (Solamente se permite el fallo dentro de los
contructores).
Invalid combination of opcode and operands (Combinacin no vlida del cdigo de
operacin y operativo).
Memory reference expected (Referencia esperada a memoria).
Cannot add or substract relocatable symbols (No se puede sumar o restar smbolos
reubicales).
Invalid regster combination (Combinacin no vlida de registros).
286/287 instructions are not enabled (Instrucciones 286/287 no estn activas).
Invalid symbol reference (Referencia no vlida a smbolos).
Code generation error (Error en la generacin de cdigo).
ASM expected (ASM esperado).

Lista d e errores e n t i e m p o d e e j e c u c i n ( R u n - t i m e Errors)


Turbo Pascal 5.5/6.0/7.0
Errores DOS
1. Invalid function number (Nmero no vlido de funcin).
2. File not found (Archivo no encontrado).

1016
3.
4.
5.
6.
12.
15.
16.
17.
18.

Programacin en Turbo/Borland Pascal 7

Path not found (Va de acceso no encontrada).


Too many open files (Demasiados archivos abiertos).
File access denied (Acceso al archivo negado).
Invalid file handle (Manipulacin de archivo no vlida).
Invalid file access code (Cdigo de acceso al archivo no vlido).
Invalid drive number (Nmero de unidad no vlido).
Cannot remove current directory (No se puede eliminar el directorio actual).
Cannot rename across drives (No se puede renombrar entre unidades).
No more files (No ms archivos). (Slo versin 7.0.)

Errores de E/S (Entrada/Salida)


Estos errores producen la terminacin del programa si la sentencia correspondiente fue
compilada en el estado j $ I + de la directiva I. El programa contina su ejecucin, en el
estado j $1-}, y el error se puede consultar en la funcin IOResult.
100.
101.
102.
103.
104.
105.
106.

Disk read error (Error de lectura de disco).


Disk write error (Error de escritura de disco).
File not assigned (Archivo no asignado).
File not open (Archivo no abierto).
File not open for input (Archivo no abierto para entrada).
File not open for output (Archivo no abierto para salida).
Invalid numeric format (Formato numrico no vlido).

Errores crticos
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.

Disk is write-protected (Protegido contra escritura).


Unknown unit (Unidad desconocida).
Drive not ready (Unidad no preparada).
Unknown command (Orden desconocida).
CRC error in data (Error C R C en datos).
Bad drive request structure length (Longitud de estructura solicitada en unidad
errnea).
Disk seek error (Error en bsqueda de disco).
Unknown media type (Tipo de soporte desconocido).
Sector not found (Sector riv ^ncontrado).
Printer out of paper (Falta papel en la impresora).
Device write fault (Fa"o de escritura en dispositivo).
Device read fault (Fallo de escritura en dispositivo).
Hardware failure (Fallo en hardware).

Mensajes

y cdigos de error

1017

206.
207.
208.
209.
210.
211.
212.

Floating point underflow (...).


Invalid floating point operation (Operacin de coma flotante no vlida).
Overlay manager not installed (Manipulador de recubrimiento no instalado).
Overlay file read error (Error de lectura en archivos de recubrimiento).
Object not initialized (Objeto no inicializado). (Slo versiones 6.0 y 7.0.)
Cali to abstract method (Llamada a mtodo abstracto). (Slo versiones 6.0 y 7.0.)
Stream registration error (Error en registro de flujo stream). (Slo versiones 6.0
y 7.0.)
213. Collection Index out of range (Indice de Collection fuera de rango). (Slo versiones
6.0 y 7.0.)
214. Collection overflow error (Error de desbordamiento de Collection). (Slo versiones
6.0 y 7.0.)
215. Aritmetic overflow error (Error aritmtico de desbordamiento). (Slo versin 7.0.)

Manipulacin de errores de entrada/salida (E/S)


Errores de entrada/salida (E/S) son aquellos que implican la E/S en o desde un programa, archivo o dispositivo. Si el usuario introduce entradas en un formato incorrecto, o si
sucede cualquier otro error de E/S, su programa se terminar. Esta situacin se puede
plantear tambin, aunque no se produzcan errores; por ejemplo, el usuario pide abrir un
archivo que no existe utilizando reset.
Errores comunes son:
Entrada de un dato de tipo inadecuado por teclado durante la ejecucin de un programa.
Intento de lectura o escritura en un archivo no abierto.
Intento de apertura para lectura (reset) de un archivo que no existe en disco.
En lugar de terminar el programa cuando se produce un error de E/S, es preferible
que se realice alguna accin en funcin del error cometido; es decir, tratar adecuadamente el mismo. T u r b o Pascal posee la directiva I que se utiliza para desactivar la
verificacin de errores.
El formato
situado en cualquier p u n t o de un programa, evita que un programa
se termine cuando se producen errores de E/S (desactiva la verificacin de errores). La
directiva {$1+} activa la verificacin de errores.
Dado que es intil proseguir con un programa cuando se produce un error de E/S, la
mejor solucin es bifurcar a alguna parte del programa. Esta tarea se facilita mediante la
funcin IOResult.

Errores fatales
200.
201.
202.
203.
204.
205.

Divisin by zero (Divisin por cero).


Range check error (Error en comprobacin de rango).
Stack overflow error (Error de desbordamiento de pila).
Heap overflow error (Error de desbordamiento de pila).
Invalid pointer operation (Operacin de puntero no vlida).
Floating point overflow (Desbordamiento de coma flotante).

Funcin IOResult
Devuelve un valor entero que es el estado de la ltima operacin ejecutada de E/S
(nmero de error). Sin embargo, lo que se necesita es saber si ha ocurrido o no un error,
y eso se puede hacer verificando IOResult para ver si es cero o no cero (cero si no se
produce ningn error de E/S).

1018

Programacin en Turbo/Borland Pascal 7

Si IOResult es cero, n o se ha p r o d u c i d o n i n g n e r r o r y el p r o g r a m a prosigue con


normalidad.
Si IOResult d e v u e l v e u n valor distinto de cero, e n t o n c e s el p r o g r a m a d e b e bifurcar
para m a n i p u l a r el error. D e s p u s de c a d a l l a m a d a a IOResult, el valor de IOResult
se p o n e a cero.

APENDICE

GUIA DE REFERENCIA
TURBO PASCAL 7 . 0 , 6 . 0 y 5 . 5 .

Ejemplo
Verificacin

de escritura

correcta

en nombre

de archivos.

repeat
WriteLn ('Introduzca nombre de archivo:');
{$1- desactivar verificacin de errores}
ReadLn (NombreArch);
Assign (NombreVar, NombreArch);
Reset (NombreVar);
{$1+ activar errores}
Error := IOResult;
if Error o 0 then
begin
WriteLn (NombreArch,'no se puede encontrar');
WriteLn ('Pruebe de nuevo);
end
until Error=0;

LENGUAJE
Palabras reservadas
and
array
asm
begin
case
const
constructor
destructor
div
do
downto
else
end

file
for
function
goto
if
implementation
in
inherited*
inline
interface
label
mod
nil

not
object
of
or
packed
procedure
program
record
repeat
set
shl
shr
string

then
to
type
unit
until
uses
var
while
with
xor

Directivas (se pueden redefinir)


absolute
assembler
external

far
forward
interrupt

near
prvate
public*

virtual

* Slo en versin 7.0

Identificadores
WriteLn
Un_mes

Exit
CadenaReal
Nombre_Apellidos

System.MemAvail
Dia_del_Mes

Rosas
Pedro_uno

1019

1020

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

Programacin en Turbo/Borland Pascal 7

Cadenas de caracteres

cabecera
funcin

function identificador (lista de parmetros)


{declaraciones de datos }
begin
{cuerpo de la funcin}
end;

Turbo }

'Turbo'
III

;}

: cadena nula }
{espacio}

Comentarios

UNIDADES

{ C u a l q u i e r texto e n c e r r a d o entre llaves}


(* Es t a m b i n u n c o m e n t a r i o vlido *)

Unidades estndar

Lnea de programa
Las lneas de p r o g r a m a s T u r b o Pascal tienen u n a longitud m x i m a de 126 caracteres.

Estructura de un programa
cabecera

program Ejemplo;

unidades

uses Crt;

declaracin
de constantes

-const
Secreto = 1R2D2'

declaraciones
de tipos

-type
Formato = string[12]

declaraciones
de variables

-var
Respuesta : Formato;

declaraciones de procedimientos
y/o funciones

.procedure EjemploUno;
begin
{cuerpo del procedimiento]
end;

cuerpo del programa

nombre del programa


opcional

-begin
{ cuerpo principal del programa
end.

Procedimientos y funciones
cabecera
procedimiento

procedure identificador{lista de parmetros)


{declaraciones de datos }
begin
{cuerpo del procedimiento }
end;

Crt
Dos, WinDos
Graph
Graph3
Overlay
Printer
Strings
System
Turbo3

S o p o r t e d e p a n t a l l a y teclados
F u n c i o n e s de p r o p s i t o general D O S
R u t i n a s grficas
G r f i c o s c o m p a t i b l e s versin 3
I m p l e m e n t a el a d m i n i s t r a d o r de s o l a p a m i e n t o s
Acceso a la i m p r e s o r a
T r a t a m i e n t o de c a d e n a s t e r m i n a d a s en n u l o
R u t i n a s de la b i b l i o t e c a en t i e m p o de ejecu ci n
M a n t e n e r c o m p a t i b i l i d a d c o n T u r b o Pascal 3.0

Sintaxis de la unidad
unit identificador
interface lista
de unidades;
{declaraciones pblicas m s }
{cabeceras de t o d a s las s u b r u t i n a s p b l i c a s }
implementation
uses lista
de unidades
{declaraciones privadas}
{implementacin de procedimientos y funciones}
begin
{ c d i g o de i n i c i a l i z a c i n }
end.

DISPOSITIVOS
CON
PRN
AUX
LPTI
NUL

Terminal
Impresora
Dispositivo auxiliar
Impresora
Dispositivo n u l o

opcional

opcional

opcional

1021

1022

Programacin en Turbo/Borland Pascal 7

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

TIPOS DE DATOS

Registro

type Reg = record


Nombre : String [40];
Edad
: Integer;
Salario : Real;
end;

Objeto

type Punto = object


x,y : Integer;
end;

Conjunto

Letras
:= [ ' A ' j ' B ' j ' C ' . ' D ' j ' E ' ]
NoLetras := []

Puntero

type PunteroReal = ~Real;


New ( P) ;

Pchar

type Pchar = ~Char;

Tipos simples
Boolean (lgicos)

true..false

Nmeros enteros
0..255
-32 .768 . . 32 .767
2.147.483.648..2.147.483 .647
-128..127
0..65.535

Byte
Integer
Longlnt
Shortlnt
Word

Nmeros reales
39

2 .9 X 10~
1.5 x 1CT45
5.0 X 1CT324
3 .4 x 10"4932

Real
Single
Double
Extended
Comp

- 2 " +

38

. 1.7 x 10
. 3.4 x 1038
. 1 . 7 x 10308
. 1 . 1 x 104932
. 263 - 1

Carcter
C u a l q u i e r c a r c t e r ASCII

Char

Cadenas
Secuencia d e hasta 255 caracteres ASCII. Si n o se especifica u n t a m a o , se utilizar p o r d e f e c t o 255.

String

Punteros
Direccin de u n elemento dato, procedimiento o funcin.

Pointer

Tipos subrango
0 . . 99
-128..127
Lunes..Domingo

Tipos enumerados
type
Naipes ={Oros, Espadas, Bastos, Copas};

Tipos estructurados
Array

array [1.100] of Real


array [Boolean] of array [1. .10] of array [Longitud] of Real;
packed array [1..10, 1..15] of Boolean

Tipos procedimiento
type
Proc
InterX
ProcCX
Funcna

=
=
=
=

procedure;
procedure (var X,Y : Integer)
procedure (S : string);
function (X : Real) : Real;

VARIABLES Y CONSTANTES
Constantes predefinidas
true
false
maxint

verdadero
falso
entero mayor disponible en mquina

Declaracin de variables
var
x, y, z : Real;
i,j,k : Integer;
Digito : 0 . . 9 ;

Variables absolutas
var
Cad : string [40] ;
LongCad : Byte absolute Cad;

Variables predefinidas
Variable

Tipo

Input
Output

Archivo Text
Archivo Text

1023

1024

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

Programacin en Turbo/Borland Pascal 7

Variable

Tipo

ExitCode
FileMode
InOutRes
RandSeed
StackLimit

Integer
Byte
Integer
Longlnt
Word

Tipo objeto
type
Punto = object
x,y : Integer;
end;
const
Origen : Punto = (x:0; y:0);

Constantes con tipos

Tipo conjunto

Tipo simple

type
Digitos
Letras
const
Pares
Vocales

const
Mximo : Integer = 425;
Factor : Real =-12.5;
const
Min : Integer = 0;
Max : Integer = 100;
type
declaracin no vlida
Lista = array [Min..Max] of Integer;
la declaracin Lista no es vlida ya que Min y Max son constantes de tipos

Tipo cadena
const
Cabecera
: string[10] == 'Ciudades';
Nueva Linea : string[2] == # 1 3 # 1 0 ;
1
Respuesta
: string[5] == Si ;

Tipo estructurado
const
Digitos : array[0..9] of Char =
(,0,,,1,,I2I,,3,,,4,,,5,,,6,,,7,,,8,,,9I);
const
Digitos : array[0..9] of Char = '0123456789';
type
Matriz = array [0..1, 0..1, 0 . .1] of Integer;
const
Lista : Matriz =(((0,1) , (2,3)), ((4,6), (7,9)));

Tipo registro
type
Punto = record
x,y : Real;
end;
Vt tor = array [0. .1] of Punto;
const
Origen : Punto = (X:0.0; Y: 0 . 0 ) ;
Linea : Vecto = ((X:4.5; Y:1.5 ) , (X:6 . 4 ; Y : 5 . 0 ) ) ;

= set of
= set of

0. .9;
A'.. 'Z1;

: Digitos = [0,2,4,6,8];
: Letras = ['A',1B','I','01,'U'1

Tipo puntero
type
Direccin = (Izda, Dcha, Arriba, Abajo);
PNodo = ~NodoT;
NodoT = record
end;
const
SI : string[4] = 'ABAJO';
NI : NodoT = (Siguiente : nil; Symbolo : @S1; Valor : Abajo);

Tipo procedimiento
type
ProcError = procedure (CodigoError : Integer);
procedure ErrorPorOmision (CodigoError : Integer); far;
begin
WriteLn ('Error', CodigoError, ' , ' ) ;
end;
const
ManipuladorErrores : ProcError = ErrorPorOmision;

OPERADORES
Aritmticos
Operador
+
+

Sintaxis
+expresin
expresinl + expresin2
-expresin

Significado
Positivo (unitario)
Suma (binaria)
Negativo (unitario)

1025

1026

-Programacin en Turbo/Borland Pascal 7

Sintaxis

Operador

__

expresionl
expresinl
expresionl
expresinl
expresionl

/
DIV
MOD

- expresin2
* expresin2
/ expresin2
DIV expresin2
MOD expresin2

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

Significado

Operador

Resta (binario)
Multiplicacin
Divisin real
Divisin entera
Resto (mdulo)

Sintaxis

>=

Conjuntol >= Conjunto2

IN

elemento IN Conjunto2

Devuelve verdadero si:


Cada elemento de Conjunto2 est tambin en Conjuntol
El elemento elemento se encuentra en
Conjuntol.
Diferencia
Unin
Interseccin

Conjuntol - Conjunto2
Conjuntol + Conjunto2
Conjuntol* Conjunto2

+
*

Lgicos
Sintaxis

Operador
+
AND
OR
XOR

NOT expresin
expresinl AND expresin2
expresinl OR expresin2
expresinl XOR expresin2

Significado
Complemento
AND
OR inclusiva
OR exclusiva

Direccin
@

Relacinales
Operador

<

>

<
<

>
>

Sintaxis
expresinl
expresinl
expresinl
expresinl

= expresin2
< > expresin2
< expresin2
<=expresin2

expresinl > expresin2


expresinl >=expresin2

Devuelve verdadero si:

D i r e c c i n d e variable, p r o c e d i m i e n t o o f u n c i n .

Concatenacin
+

Concatena dos cadenas.

Prioridad de operadores
Prioridad

Expresiones son iguales


Expresiones no son iguales
expresinl es menor que expresin2
expresinl es menor que o igual a expresin2
expresinl es mayor que expresin2
expresinl es mayor o igual que expresin2

Operadores

1 (alta)
2
3
4 (baja)

@ NOT unitario + */ DIV, MOD, AND, SHL, SHR


binario +,
OR, XOR
=, < > , < >, <=, >=, IN

SENTENCIAS
De conjunto
Operador

Asignacin
Sintaxis

Conjuntol = Conjunto2

<

>

<

Conjuntol < > Conjunto2

Conjuntol < = Conjunto2

Devuelve verdadero si:


Conjuntol y Conjunto2 son idnticos.
Cada elemento de Conjuntol est contenido en Conjunto2, y cada elemento en
Conjuntol est contenido en Conjuntol.
Uno de los conjuntos contiene al menos
un elemento que no est en el otro conjunto.
Cada elemento del Conjuntol est tambin en Conjunto2.

<identificador>

:= <expresin>

rango := alto bajo;


cuenta := cuenta + 1;

Compuesta
begin < sentencias
begin

> end

1027

1028

Programacin en Turbo/Borland Pascal 7

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5


2. for <ndice>

GetReal ( 'Valor', ValorReal) ;


WriteLn (ValorReal);
end

Selectiva (if)
if <condicin>
then
< sentencia >
[ else
<sentencia>
];

if Cadl < > Cad2 then


begin
Cadl := Cadl + Cad2;
WriteLn( ' nueva cadena ', Cadl);
end;

Selectiva (if-anidada)
if (condicin) then
sentencia
else if (condicin) then
sentencias
else if (condicin) then
sentencia
else
sentencia

if x > y then
if x > z then
Write (x)
else
Write (z )
else
if y > z then
Write (y)
else
Write ( z) ;
WriteLn ('es el Mayor');

[else
< sentencia
end;

case N of
1,2
; WriteLn ('Primero');
3,4,5 : WriteLn ('Bronce');
7
: WriteLn ('Fin');
else
WriteLn ( 'Final' )
end;

por defecto > ]

:= < valor inicial > to < valor final > do <sentencia>

for k : = 1 to 10 do
WriteLn ( ' cuerpo de bucle');

inicial>

do <sentencia>

Sentencia repetitiva while


do

paso := i;

<sentencia>;
<sentencia>

while paso < = 10 do


= sentencia
sentencia

simple
compuesta

begin
WriteLn ( ' Pasos : ' , paso: 2 ) ;
paso := paso + 1
end;
WriteLn('fuera del bucle');
While ch < > ' 'do Read(ch) ;

Sentencia repetitiva repeat


paso := 1;
repeat
WriteLn('Pasos:',paso:2);
paso := paso + 1
until paso > 10
WriteLn('Fuera del bucle');

repeat
< sentencia >
until <condicin>

AMBITO Y LOCALIDAD
El mbito de u n i d e n t i f i c a d o r es el c o n j u n t o de m d u l o s ( p r o g r a m a s o s u b p r o g r a m a s ) en
el q u e est l e g a l m e n t e d e c l a r a d o el identificador.

Sentencia repetitiva for


1. for < indico

downto <valor

for i : = 10 downto 1
begin
Resultado : = i * Resultado;
WriteLn('Bucle', i, Resultado);
end;

while <condicin>

Selectiva mltiple (case)


case < selector > of
<lista de constantes>:
< sentencias 1 >;
< lista de constantes >:
< sentencias 2 > ;

:= <valorfinal>

1029

for j : = 1 to 10 do
begin
j := j + z;
WriteLn ('pasos
pasos : 2)
paso := paso + 1
end;
WriteLn ( ' fuera del bucle ' ) ;

program Principal
var
w, x, y, z : ...
procedure Uno ( var w : ;
var
x : ... ;
begin
end;

..
a: . . . );

variables globales
parmetros locales w,a,x

1030

Programacin en Turbo/Borland Pascal 7

procedure Dos ( c: . . .; var x . . .);


var
z,w : ... ;
begin

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5


parmetros locales c,y,x,z,w

Ejemplos:
Y
z
Tan
Pot
R

end;
begin {Principal}
Uno (y,z ) ;

1031

:=
:=
:=
:=
:=

abs(x)*2;
ArcTan(1.75);
Sin(X)/cos(x);
Exp(3 ) ;
Frac(245.123) ;

z
t
z
z
f
f

=
=
=
=
=
=

Int(345.678 )
Ln(1. 25 ) ;
ArcTan(Pi ) ;
Sin(Pi);
Sqr(3.45);
Sqrt(1.2345)

Funciones de transferencia

Dos (w,y,x);

Nombre

end;

Para eliminar posibles efectos laterales, evite utilizar variables globales en subprogramas
o identificadores idnticos para cantidades diferentes.

Descripcin

Sintaxis

Chr

Chr(x:Byte):Char;

Devuelve el carcter correspondiente al cdigo ASCII.

Ord

Ord(x):LongInt;

Nmero ordinal de un tipo ordinal.

Round

Round(x:Real):LongInt;

Redondea un valor real a entero largo.

Trunc

Trunc(x:Real):Longlnt;

Trunca un valor de tipo real a entero.

PROCEDIMIENTOS Y FUNCIONES ESTANDAR


T u r b o Pascal c o n t i e n e p r o c e d i m i e n t o s y f u n c i o n e s e s t n d a r ( i n c o r p o r a d a s o p r e d e f i n i das) y variables p r e d e c l a r a d a s en la u n i d a d System. T o d o s ellos estn d e c l a r a d o s en la
u n i d a d System, en c o n s e c u e n c i a n o necesita n i n g u n a s e n t e n c i a uses c u a n d o desee utilizar a l g u n o / a de ellos/as.

Abs

Sintaxis
Abs(x) ;

Round ( 5 . 4 49)
Tr une (-3.14)
Trunc (6.5)

Write (Chr ( i));


Ord('A')

devuelve 5
devuelve-3
devuelve 6

Procedimientos de flujo de control

Funciones aritmticas
Nombre

Ejemplos:

Devuelve el valor (positivo) absoluto de su argumento.

ArcTan

ArcTan(x:Real):Real;

Arco tangente expresado en radianes.

Cos

Cos(x:Real):Real;

Coseno del argumento en radianes.

Descripcin

Sintaxis

Nombre

Descripcin

Break

Break;

Termina una sentencia for, while o repeat.

Continu

Continu;

Contorna con la siguiente iteracin de una


sentencia for, while o repeat.

Exit

Exit;

Termina inmediatamente el bloque actual


(procedimiento, funcin o programa).

Halt

Halt [ (CodigoSalida:
Word)];

Detiene la ejecucin del programa y retorna al sistema operativo.

RunError

RunError[(CodigoError;
Byte)];

Detiene la ejecucin del programa y genera un error en tiempo de ejecucin.

Exp

Exp(x;Real):Real;

Potencia exponencial del argumento (e ).

Frac

Frac(x:Real);Real;

Parte decimal de un nmero real.

Int

Int(x:Real):Real;

Parte entera del argumento.

Ln

Ln(x:Real):Real;

Logaritmo neperiano (base e) del argumento.

Pi

Pi:Real;

Valor de Pi (3.1415926535897932385).

Sin

Sin(x:Real):Real;

Seno del argumento.

Sqr

Sqr(x);

Cuadrado del argumento.

Sqrt

Sqrt(x:Real):Real;

Raz cuadrada del argumento.

Ejemplos:
if t = ' s ' then Exit ;

if p = nil then
RunError(204);

1032

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

Programacin en Turbo/Borland Pascal 7

Funciones

Procedimientos o funciones ordinales


Sintaxis

Nombre
Dec

Descripcin

Dec(var x ;n:Longlnt]);

Decrementa una variable.

Inc

Inc(var x ;n:Longlnt]);

Incrementa una variable.

High*
Low*

High(x);
Low(x);

Devuelve el valor ms alto en el rango del


rgumento que debe ser un tipo array o un
tipo cadena.

Odd

Odd(x:Longlnt):Boolean;

Devuelve el valor ms bajo en el rango del


argumento (tipo array o cadena).

Pred

Pred(x);

Predecesor del argumento (x de tipo ordinal).

Succ

Succ(x);

Sucesor del argumento (x de tipo ordinal).

* Slo est implementado en la versin 7.0.

Ejemplos:
Dec(z);
Inc(z);

Sintaxis

Nombre
Concat

Concatena (une) cadenas.

Copy

Copy(s:string;Pos,Long:
Integer):string;

Copia una cadena dada.

Length

Length(s:string):Integer;

Longitud de una cadena.

Pos

Pos(Patrn,Fuente:string):
Integer;

Posicin de la primera ocurrencia de


una subcadena.

Ejemplos:
Cadl := 'computadora';
Delete(Cadl,4,3);

Str(Maxint,Cad);
WriteLn(Cad);

Insert{'put'Cadl,4);

Val('32425',r,e);

s :=Concat('xyz1,'LUIS');

s := Copy(s,2,3);
t := Length(Cad);

Punteros y direcciones

end;
Pred( ' z ')
Succ(1946)

Descripcin

Concat(si,s2,...,sn:string):
string;

for Dia = Low(ADia) to High (ADia) do


begin

for i : = 0 to High(x) do
s := s+ x [i] ;

1033

devuelve '4'
devuelve 1947

Sintaxis

Nombre

Descripcin

Addr

Addr(x):Pointer;

Devuelve la direccin de un objeto especificado.

Tratamiento de cadenas

Assigned*

Assigned(var P) :Boolean;

Comprueba si una variable procedimiento o puntero es nil.

Procedimientos

CSeg

CSeg:Word;

Valor actual del registro CS.

DSeg

Dseg:Word;

Valor actual del registro DS.

Of s

Ofs(x):Word;

Desplazamiento de un objeto especificado.

Ptr

Ptr(Seg,Ofs:Word):Pointer;

Convierte una base segmento y una direccin de desplazamiento a un valor


tipo puntero.

Seg

Seg(x):Word;

Direccin del segmento de una variable o rutina.

Sptr

Sptr:Word;

Valor actual del registro SP.

Sseg

Sseg:Word;

Valor actual del registro SS.

Nombre

Sintaxis

Descripcin

Delete

Delete(var s:string;
Pos, Len:Integer ) ;

Borra una subcadena a partir de una


posicin en una cadena.

Insert

Insert(var s:string; var D:


string;Pos:Integer);

Inserta una subcadena en una posicin


de una cadena.

Str

Str(I:Integer; var s:string);


Str(R:Real; var s:string);

Convierte un valor numrico a cadena.

Val

Val(s:string; var R:Real,P:


Integer);
Val(s:string; var I,P:Integer;

Convierte una cadena a su valor numrico.

* Slo en la versin 7.0.

1034

Programacin en Turbo/Borland Pascal 7

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

Ejemplos:

Procedimientos y funciones diversas

p := Addr(p);
if Assigned(p) then WriteLn('ok');
p := Ptr(Cseg, I) ;
p := Ptr(Dseg,I);
WriteLn( 1 of fset='offset=;Ofs(p2));
bajo := Ptr(0000,$046c);
WriteLn('seg(I)=',seg(I));

Procedimientos

Asignacin dinmica

1035

Nombre

Sintaxis

Descripcin

Exelude*

E x e l u d e ( v a r s:set of t ; i : t ) ;

Excluye un elemento de un conjunto.

FillChar

F i l l C h a r ( v a r x; c u e n t a : w o r d ;
valor);

Rellena un nmero determinado de


bytes contiguos con un valor especificado.

Randomize

Randomize;

Inicializa el generador de nmeros


aleatorios con una semilla.

* Slo existe en la versin 7.0.

Procedimientos

Funciones
Descripcin

Nombre

Sintaxis

Dispose

Dispose(var p:pointer[,Destructor] *) ;

Nombre

FreeMem

FreeMem (var p:pointer; Tamao: Word) ;

GetMem

GetMem (var p : pointer; Tamao : Word) ;

New

New (var p: pointer [, Init: Constructor] * ) ;

* La parte opcional (constructor/destructor) slo en la versin 7.0.

Funciones
Descripcin

Sintaxis

Nombre
MaxAvail

MaxAvail:LongInt;

Tamao del bloque disponible mayor del montculo (heap).

MemAvail

MemAvail:Longlnt;

Cantidad de memoria libre en el montculo


{heap)

Sintaxis

Hi

Hi(x):Byte;

Byte de mayor pero del argumento.

Include

I n c l u d e ( v a r s : set of t;I:T);

Incluye un elemento en un conjunto.

Lo

Lo(x):Byte;

Byte de menor pero del argumento.

Move

Move(var Fuente, Dest;Cuenta:


Word);

Copia un nmero especificado de


bytes contiguos de un rango fuente a
un rango destino.

ParamCount

ParamCount:Word;

Devuelve el nmero de parmetros


pasados en la lnea de rdenes.

ParamStr

ParamStr(Indice):string;

Parmetro de la lnea de rdenes.

Random

Random[(Rango:Word)];

Devuelve un nmero aleatorio.

Sizeof

Sizeof(x):word;

Nmero de bytes ocupado por el argumento.

Swap

Swap(x);

Intercambia los bytes ms altos y menos altos del argumento.

TypeOf

TypeOf(x):Pointer;

Devuelve un puntero a una tabla de


mtodos virtuales de tipos objeto.

UpCase

UpCase(ch:char):char;

Convierte un carcter a maysculas.

Ejemplos:
var
p:~string;
pl:~Real;

while MaxAvail do
GetMem(p,65535);

Dispose(p);
FreeMem(pl,10);

write('Existen:',MeraAvail);

Descripcin

Ejemplos:
Exelude( s, I);

GetMem(pl, 2 ) ;

FillChar(A,Sizeof(A) , z) ;

New(p);

Randomize;

1036

Programacin en Turbo/Borland Pascal 7

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

for i : = 1 to 10 do
write(Random(MaxInt):8);

1037

Nombre

Sintaxis

Descripcin

BlockRead

BlockRead(var f:file;var Buf;


Cuenta:Word[;var
Resultado:Word]);

Lee uno o ms registros de un archivo sin tipos.

BlockWrite

for i : = 1 to ParamCount do
WriteLn(i:2,':',ParamStr(i))

BlockWrite (var f : f i le ; var Buf; Escribe uno o ms registros en un


Cuenta:Word[;var
archivo sin tipos.
Resultado:Word]);

Cise

Cise (var F) ;

Cierra un archivo abierto.

WriteLn('Real..',Sizeof(Real));

Erase

Erase(var F) ;

Borra un archivo externo.

w := 240; w := Swap(w); WriteLn('w='w);

FileSize

FileSize(var F) ;Longlnt;

Devuelve el tamao actual de un


archivo (no de texto).

Flush

Flush(var F:Text);

Limpia el buffer de un archivo de


texto de salida.

Read

Read(F,VI[,V2,...Vn] ) ;

Lee uno o ms valores de un archivo.

ReadLn

ReadLn(var
F:Text;]VI[,V2,...,
Vn] ) ;

Igual que Read y despus salta al


principio de la lnea siguiente.

Reame

Rename (var F: NuevoNombre) ;

Renombra un archivo externo.

Reset

Reset(var F[:file;TamaReg:
Word] ) ;

Abre un archivo existente.

ReWr ite

ReWrite(var F [ : file;TamaReg:
Word]);

Crea y abre un archivo nuevo.

Seek

Seek(var F; N:Longlnt) ;

Mueve la posicin actual de un


archivo a un componente especificado.

SetTextBuf

SetTextBuf (var F:Text;var Buf


[; Tamao:Word]);

Asigna una memoria intermedia de


E/S a un archivo de texto.

Trncate

Trncate(var F ) ;

Trunca un archivo con tipos o sin


tipos.

Write

Write( [var F:Text;]pl[,p2, , Escribe en un archivo de texto.


pn] ) ;

WriteLn(11=',1:5,1Byte alto=',Hi(I):3);
Include(S,I);
WriteLn('byte bajo',Lo(n):6) ;
Move(car[1],car[50],50) ;

WriteLn( ' Car-.UpCase' ) ;


for ch := 'a' to 'z' do
WriteLn(ch,UpCase(ch) , ' ');

Procedimientos de tratamiento de archivos


Descripcin

Nombre

Sintaxis

ChDir

ChDir(s:string);

Cambia directorio actual.

GetDir

GetDir(D:byte; var s:string);

Obtiene directorio actual.

MkDir

MkDir(s:string);

Crea un directorio.

RmDir(s:string);

Borra un directorio vaco.

RmDir

Ejemplos:
ChDir(Camino);
GetDir(1,s ) ;
MkDir(Camino);
RmDir( ' \Aux' ) ;

Entradas/Salidas

WriteLn

Procedimientos
Nombre

Sintaxis

Descripcin

Append

Append(var f: Text);

Abre un archivo de texto, ya existente, para aadir.

Assign

Assign(var f : Nombre);

Asigna el nombre de un archivo externo a una variable archivo.

Write(f,vi,[,v2,...,vn]);

Archivos con tipos.

WriteLn([var F:Text;]pl[,p2,
...,pn]);

Igual que write y luego escribe un


fin de lnea.

Funciones
Nombre

Sintaxis

Descripcin

Eof

Eof(var F) : Boolean;

DevueK'e el estado fin de archivo.

Eoln

Eoln[(var F:Text)]:Boolean;

Devuelve el estado fin de lnea de


un archivo de texto.

1038

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

Programacin en Turbo/Borland Pascal 7

Descripcin

Sintaxis

Nombre
FilePos

FilePos(var F) :LongInt;

Posicin actual de un archivo con o


sin tipos.

IOResult

IOResult:Integer;

Estado de la ltima operacin de


E/S realizada.

SeekEof

SeekEof[(var F:Text)]:Boolean;

Estadofinde archivo de un archivo.

SeekEoln

SeekEoln[(var F:Text)];

Estado fin de lnea de un archivo.

Creacin de un archivo de registros


P r e p a r a r el sistema p a r a e n v i a r d a t o s de la e s t r u c t u r a i n t e r n a al a r c h i v o e x t e r n o
c r e a n d o y a b r i e n d o u n n u e v o a r c h i v o p a r a recibir salida de la c o m p u t a d o r a .
Rewrite ( < identificador

var Tf:Text;
F:File;
Assign(Tf,'TEST,TXT');
Rewrite(Tf);
Close(Tf);
Append{Tf);
BlockRead(F, A,10,Resultado)
BlockWrite(F,A,1,Resultado)
Erase(F)
Seek(F,FileSize(F));
Flush(F);
while not Eof (Tf) do
begin
if Eoln(Tf)
then writeLn ;
if Length( s ) > 0
then Rename ( F, S) ;

Reset(F);

de archivo>,

< identificador

Cise ( < identificador

Set Text Buf ( F, Buf f er, 512 )

Lectura de un archivo de registros

Existe ;= (IOResult = 0);


while not SeekEof(Tf) do
begin
ReadLn(Tf,S);
Inc(C2 ) ;
end
while not SeekEoln(Tf) do
begin
ReadLn(Tf,Ch) ;
write(ch);
end;

de salida>)\

Cerrar un archivo

Seek(Tf,12);
Read(Tf, ch);

FUNCIONES DEFINIDAS POR EL PROGRAMA

de archivo>);

Procedimiento Reset (Inicializar un archivo)


Reset ( < identificador

de archivo>

)\

Lectura de un archivo de registros


Read ( < identificador

de archivo>,

< identificador

de entrada>);

Final de archivo
Eof ( < identificador

de archivo>

y,

Borrar archivos

Declaracin
function < identificador > (< parmetros
< declaraciones locales >
begin
< cuerpo de la funcin >
end;

formales

>) : <tipo>;

Erase {<identificador

Funcin de posicin FilePos


FilePos ( < identificador

Preparacin de un archivo
Enlace entre u n archivo i n t e r n o y u n a r c h i v o externo.
de archivo>,

de archivo>)\

Cambiar registros en un archivo de registros

ARCHIVOS

Assign ( < identificador

de archivo >);

Almacenar datos en un archivo


Write ( < identificador

Ejemplos:

< nombre

archivo externo>);

1039

de archivo>

)\

Posicionamiento en registro
Seek ( < identificador

de archivo>,

< nmero

de registro>)\

1040

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

Programacin en Turbo/Borland Pascal 7

DIRECTIVAS DE COMPILACION
Directivas de conmutacin
Significado

Directiva

Alinear datos
Evaluacin lgica (boolena)
Informacin de depuracin
Emulacin
Forc far calis
Generacin de cdigo 80286
Verificacin de E/S
Generacin de informacin de smbolos locales
Proceso numrico
Parmetros de cadenas abiertas
Generacin de cdigo de solapamiento
Generacin de cdigo de verificacin de
desbordamiento
Verificacin de rango
Verificacin de desbordamiento de pila
Tipos de valores puntero, generados, por el operador @
Verificacin de tipos en cadenas pasados como
parmetros variables
Activa o desactiva sintaxis extendida de Turbo Pascal
Informacin de referencias a smbolos

A
B
D
E
F
G
I
L
N
P
0
Q
R
S
T
V
X
Y

Valor por
defecto

Tipo

{$A+}
{$B-}
{$D+}
{$E+}
{$F-}
{$G-}
{$1+}
{$L+}
{$N}
{$P-}
{50-}
{$Q-}

Global
Local
Global
Global
Local
Global
Local
Global
Global
Local
Local
Local

{$R-}
{$S+}
{$T}
{$V+}

Local
Local
Global
Local

{$X+}
{$Y+}

Global
Global

1041

Directiva

Significado

{$IFNDEF}
{$IF0PT c o n m u t a d o r }

Compila el texto fuente que le sigue si nombre no est definido.


Verdadero o falso de acuerdo a que la directiva conmutador est
activado o desactivado.
Indefine un smbolo condicional definido anteriormente.

{$UNDEF nombre}
{$IFxxx}

{$IFxxx}
...

{$IFDEF nombre}
<sentencias-1>

{$ENDIF}

{$ELSE}

{$ELSE}

...

<sentencias-2>

{$ENDIF}

{$ENDIF}

Smbolos condicionales
Smbolo

Significado

VER70
MSDOS
CPU86

Siempre definido, indicando versin 7.0.


Siempre definido, indicando que el sistema operativo es MS-DOS o PC-DOS.
Siempre definido, indicando que la CPU pertenece a la familia de procesadores 80 x 86.
Definido si un coprocesador matemtico est presente en tiempo de compilacin.

CPU87

CONTROL DE DISPOSITIVOS
Directivas parmetro
Directiva

Significado

Sintaxis

I
L

Archivo de inclusin
Enlaza el archivo reforzado con el programa o unidad
que se est compilando
Requisitos de asignacin de memoria: long, tamao de
la pila; min y max, tamaos mnimo y mximo del
montculo
Nombre de unidad de recubrimiento (solapamiento)

{$1 nombrearchivo}
{$L nombrearchivo}

($M long,min,max}

{DEFINE nombre}
{5ELSE}
{$ENDIF}

{$IFDEF nombre}

uses Crt, Printer;

{$0 nombreunidad}

Caracteres de control

Directivas de compilacin condicional


Directiva

Las u n i d a d e s Crt y Printer son utilizadas c o n m u c h a f r e c u e n c i a p o r los p r o g r a m a d o r e s .


Printer enva salida a su i m p r e s o r a . L a u n i d a d Crt i m p l e m e n t a u n a a m p l i a y p o t e n t e
g a m a de r u t i n a s q u e le p r o p o r c i o n a n u n control c o m p l e t o de caractersticas de su P C
tales c o m o : c o n t r o l del m o d o de pantalla, cdigos de t e c l a d o e x t e n d i d o , colores, v e n t a nas y sonido. P o r su i m p o r t a n c i a prctica p a r a el p r o g r a m a d o r , s e l e c c i o n a m o s las caractersticas m s n o t a b l e s utilizadas en p r o g r a m a c i n profesional.
R e c u e r d e q u e p a r a utilizar la u n i d a d Crt o Printer, en su p r o g r a m a , d e b e incluir la
clusula uses c o m o c u a l q u i e r o t r a u n i d a d :

Significado
Define un smbolo condicional con el nombre dado.
Conmuta entre compilacin.
Termina la compilacin condicional iniciada por la ltima directiva {$IFxxx}.
Compila el texto fuente que le sigue si est definido nombre.

Carcter

Nombre

Descripcin
Emite un sonido (pitido) del altavoz interno.

#7

BELL

#8

BS

Retrocede el cursor una columna.

#10

LF

Avanza el cursor una lnea abajo.

#13

CR

Retorna el cursor al extremo izquierdo de la lnea siguiente.

1042

Gua de referencia Turbo Pascal 7.0, 6.0 y 5.5

Programacin en Turbo/Borland Pascal 7

Teclas de edicin de entrada de lneas


Tecla de edicin

Descripcin

RETROCESO (-<-!)

Borra el ltimo carcter introducido.

ESC

Borra la lnea de entrada completa.

ENTER (Intro)

Termina lnea de entrada y almacena en almacenamiento temporal. Genera marca fin de lnea.

CTRL+S

Igual que Retroceso (Backspace).

CTRL+D

Llama un carcter de la ltima lnea introducida.

CTRL+A

Igual que Esc.

CTRL+F

Llama a la ltima lnea introducida.

CTRL+Z

Termina la ltima lnea introducida y genera una marca fin de archivo.

TextColor

TextColor(Color:Byte)

Selecciona color de carcter (Primer plano).

TextMode

TextMode(Modo:Word)

Selecciona un modo de texto especificado.

Window

Window(xl,y2,x2,y2:Byte)

Define una ventana de texto en


pantalla.

Procedimientos

Nombre

Sintaxis

Descripcin

KeyPressed

KeyPressed

Devuelve true si se ha pulsado una tecla del teclado; false


en caso contrario.

Readkey

Readkey

Lee un carcter del teclado.

WhereX

WhereX

Devuelve coordenada x de la posicin actual del cursor.

WhereY

WhereY

Devuelve coordenada Y de la posicin actual del cursor.

Ejemplos:

AssignCrt

A'ssignCrt(var F:Text)

Asocia un archivo de texto con la ventana Crt.

ClrEol

ClrEol

Borra todos ios caracteres desde la posicin del cursor hasta el final de la
lnea.

ClrScr

ClrScr

Borra la pantalla y cursor a posicin


inicial.

Delay

Delay(ms:Word)

Retarda un nmero especificado de segundos.

DelLine

DelLine

Borra la lnea que contiene el cursor y


mueve todas las lneas inferiores a l,
una lnea hacia arriba.

GotoXY

GotoXY(x,y:Bvte)

Posiciona el cursor en coordenadas


(x,y).

HighVideo

HighVideo

Selecciona caracteres de alta intensidad.

Car := Readkey;
gotoxy(l, whereY-1);

Nombre

Sintaxis

Descripcin

InsLine

InsLine

Inserta una lnea vaca en posicin


del cursor.

LowVideo

LowVideo

Selecciona caracteres de baja intensidad.

NormVideo

NormVideo

Selecciona caracteres normales.

NoSound

NoSound

Desactiva altavoz interno de la


computadora.

Sound

Sound(HZ:Word)

Arranca altavoz interno.

TextBackground

TextBackground(Color:Byte)

Selecciona color de fondo.

Descripcin

Sintaxis

Nombre

Funciones

repeat
Write(' Zz');
until KeyPressed;

Descripcin

Sintaxis

Nombre

1043

Gotoxy(1,10);
Write(1Mackoy')
ClrEol;
ReadLn(Car);

Window(1,10,60,20);
DelLine;
Write( 1 Mortimer 1 );
InsLine;

Sound(440);
Delay(500 ) ;
NoSound;

repeat
x := Succ(Random(71));
y := Succ(Random(16));
Window(x,y,x+Random(10),y+Random(10))
- TextBackground(Random8);
ClrScr;
until KeyPressed;

Diagramas de sintaxis Turbo Pascal 7.0, 6.0 y 5.5

Seccin de interface

J
APENDICE.

...

interface
seccin d e declaracin de c o n s t a n t e s

clusula u s e s

DIAGRAMAS DE SINTAXIS
TURBO PASCAL 7 . 0 , 6 . 0 Y 5 . 5 .
Programa
programa -

H2h

cabecera de programa

w - ,
J

^
L-*

bloque

clusula u s e s

HO

cabecera de
procedimiento

seccin de c a b e c e r a s d e
procedimientos y funciones

cabecera de funcin

Cabecera de programa
Seccin de implementacin
cabecera

de programa ~ " C

p r o g r a m>

identificador
parmetros de programa

lista d e
identificadores

lista d e i d e n t i f i c a d o r e s -

identificador

O
Clusula uses
clusula u s e s .

-^uses^seccin de declaracin
de procedimientos y funciones

O
Unidad
unidad-

cabecera

-*o~*

parte de interface

parte de implementacin

1044

bO

Seccin de inicializacin
s e c c i n d e inicializacin

Cabecera de unidad
c a b e c e r a de unidad -

parte de
rnicra/izacin

"GE) "i

identificador
de unidad

directiva i n l i n e

1045

1046

Programacin en Turbo/Borland Pascal 7

Diagramas de sintaxis Turbo Pascal 7.0, 6.0 y 5.5

Smbolos especiales y palabras reservadas

Seccin de declaraciones
Declaracin de etiquetas
seccin de declaracin de e t i q u e t a s -

label

J t H

dgito

Declaracin de constantes

dgito h e x a d e c i m a l

Declaracin de tipos
seccin de declaracin .
de tipos

Bloque

N
\type W >

declaracin de tipos

Declaracin de variables
seccin de declaraciones

seccin de sentencias
seccin de declaracin de variables

<E>

seccin de declaraciones

Declaracin de subprogramas
seccin de declaracin d e
procedimientos y funciones

Definicin de sentencias
seccin de sentencias-

sentencia compuesta

declaracin d e variables

1047

1048

Programacin en Turbo/Borland Pascal 7

Diagramas de sintaxis Turbo Pascal 7.0, 6.0 y 5.5

Declaracin de funciones
d e c l a r a c i n d e la f u n c i n .

c a b e c e r a d e la f u n c i n

(^

Lista de parmetros formales

c a b e c e r a d e la f u n c i n

function

>

identificador

cuerpo de la funci'j

lista d e p a r m e t r o s f o r m a l e s

LT

tipo del r e s u l t a d o

tipo del r e s u l t a d o

i d e n t i f i c a d o r del t i p o

<EE>

Declaracin de funciones
declaracin de funcin-

c a b e c e r a d e f u n c i nn >

c u e p o d e f u n c i nK

bloque

c u e r p o d e la f u n c i n -

Llamadas a la funcin

forward
externa I

directiva i n l i n e

Declaracin de procedimientos
d e c l a r a c i n d e un p r o c e d i m i e n t o -

lista d e p a r m e t r o s a c t u a l e s

cabecera de
procedimiento

c u e r p o del
procedimiento

<>

parmetro actual

O - *
p a r m e t r o actual

c a b e c e r a del p r o c e d i m i e n t o

expresin

referencia variable

Identificadores

c u e r p o del p r o c e d i m i e n t o -

bloque
interrupt

M }

1
forward
subrayado
external

directiva inline

letra
dgito

subrayado

>

1049

1050

Programacin en Turbo/Borland PascaI 7

Diagramas de sintaxis Turbo Pascal 7.0, 6.0 y 5.5

G>

subrayado

n u m e r o con signo

n u m e r o sin s i g n o

signo

identificador de
programa,
unidad,
campo

identificador

Cadenas de caracteres

identificador cualificado-

>

identificador d e unidad

cadena de caracteres

identificador

* ^ ^ 3 "

carcter de cadena

K P

Etiquetas
carcter de cadena

cualquier

carcter

excepto

secuencia d e dgitos

identificador

Nmeros

O
'

o CR

Declaraciones de constantes
secuencia de dgitos hexadecimales

dgito hex
declaracin d e c o n s t a n t e

secuencia d e dgitos

j*

identificador

e x p r e s i n

dgito

Tipos
e n t e r o sin s i g n o -

secuencia dgitos

declaracin de tipo

secuencia dgitos he,

identificador

tipo simple

tipo e s t r u c t u r a d o

real sin s i g n o -

dgito

tipo s t r i n g

dgitc

i d e n t i f i c a d o r d e tipo

factor de escala

factor de escala

~ - n
e

\ _ l

n u m e r o sin s i g n o

dgitos

T
L*.

signo

e n t e r o sin s i g n o

real sin s i g n o

Tipos simples

K >

1051

1052

Diagramas de sintaxis Turbo Pascal 7,0, 6.0 y 5,5

Programacin en Turbo/Borland Pascal 7

Tipos registro (record)

Tipos ordinales

parte fija

parte vahante
Tipos cadena

parte
vanante

tipo string

string

U Q .

e n t e r o sin s i g n o

<D1

Tipos estructurados
tipo e s t r u c t u r a d o -

tipo array

tipo s e t

lista d e c a m p o s

tipo file

Tipo conjunto (set)


tipo r e c o r d

Tipos array
/

tipo c o n j u n t o -

array >

Tipo archivo (file)


tipo a r c h i v o

t i p o ndice

t i p o ordinal

file

tpo

JO -

1053

1054

Programacin en Turbo/Borland Pascal 7

Diagramas de sintaxis Turbo Pascal 7.0, 6.0 y 5.5

Tipos puntero

Sentencia simple
tipo puntero

t/po b a s e

tipo b a s e

tenttficaor

de tipo

Tipo objeto (object)

Sentencia compuesta

tipo objeto

I ,

herencia

1 ti

lista d e c a m p o s

|t

sentencia c o m p u e s t a -

"CED-

begin

O
- - *
k

<i>
lista d e c a m p o s

>

identificador tipo o b j e t o

lista d e i d e n t i f i c a d o r e s

J
*\

O
o

tipo

l/sra d e m t o d o s

Sentencia de asignacin

lista d e m t o d o s

Sentencia procedimiento

cabecera de mtodo

OC v,rtuai y
o
cabecera de mtodo

Sentencia goto
cabecera de procedimientos
c a b e c e r a de funcin
cabecera de constructor
cabecera de destructor

Sentencia

sentencia simple

sentencia estructurada

1055

1056

Programacin en Turbo/Borland Pascal 7

Diagramas de sintaxis Turbo Pascal 7.0, 6.0 y 5.5

Sentencias condicionales o selectivas

Sentencia while

Sentencia for
sentencia for -

Sentencia if

variable d e c o n t r o l

H>

valor inicial

s e n t e n c i a if

do^ >
downto

Sentencia case
sentencia c a s e -

case

valor inicial

>

caso

expresin

variable d e control

O
.

parte e l s e

expresin

expresin

end

>

Sentencia with

parte else

i d e n t i f i c a d o r d e variable

OC

constante

VGH

sentencia

with

<e,se y
Constantes de tipos (tipeadas)

Sentencias repetitivas
declaracin de constante de tiposentencia repetitiva

identificador

sentencia r e p e a t
c o n s t a n t e de tipo .

sentencia while

s e n t e n c i a for

c o n s t a n t e array

Sentencia repeat
semencia repeat

- O

c o n s t a n t e registro

repeat^

until~^

>

contante conjunto

>
^ ^

nil

type

c o n s t a n t e d e tipo

1057

1058

Programacin en Turbo/Borland Pascal 7

Constante tipo registro


c o n s t a n t e registro

> Q - ,

identificador d e c a m p o

KX
O*-

constante de tipos

O*

APENDICE

GUIA DEL USUARIO


ISO/AIMSI PASCAL ESTANDAR

Constante tipo conjunto


c o n s t a n t e c o n j u n t o>

Q miembro constante

O
ELEMENTOS DEL LENGUAJE PASCAL

miembro constante c o n s t a n t e

K X
Constante tipo array

L o s e l e m e n t o s del l e n g u a j e Pascal nos p e r m i t e n c o n s t r u i r desde las sentencias m s simples h a s t a las m s c o m p l e j a s , as c o m o los d i s t i n t o s tipos d e datos, t a n t o p r e d e f i n i d o s
c o m o a q u e l l o s q u e s o n d e f i n i d o s p o r el usuario. Estos e l e m e n t o s incluyen c o n j u n t o de
caracteres, p a l a b r a s reservadas, i d e n t i f i c a d o r e s e s t n d a r , t i p o s de d a t o s n u m r i c o s , carcter, etc.

Conjunto de caracteres
Pascal r e c o n o c e letras, dgitos, s m b o l o s especiales y s m b o l o s palabras (palabras reservadas).

Smbolos especiales
"

* < ] : < > ( &

Palabras reservadas
Las p a l a b r a s reservadas o palabras clave son a q u e l l a s a las q u e Pascal da u n significado
fijo y p r e d e t e r m i n a d o y q u e el p r o g r a m a d o r n o p u e d e c a m b i a r . Las palabras reservadas
e n Pascal e s t n d a r s o n las siguientes: *
and
array
begin
case
const

div
do
downto
else
end

file
for
function
goto
if

in
label
mod
nil
not

of
or
packed
procedure
program

record
repeat
get
then
to

type
until
var
while
with

1059

1060

Gua del usuario ISO/ANSI Pascal estndar

Programacin en Turbo/Borland Pascal 7

1061

LA ESTRUCTURA DE UN PROGRAMA

Identificadores
U n i d e n t i f i c a d o r es u n a c o m b i n a c i n de letras y dgitos q u e d e b e c o m e n z a r c o n u n a letra y q u e p e r m i t e n al u s u a r i o especificar constantes, variables, procesos, etc. Pascal contiene ciertos i d e n t i f i c a d o r e s p r e d e c l a r a d o s o e s t n d a r , p e r o q u e a d i f e r e n c i a de las palab r a s r e s e r v a d a s p u e d e n r e d e f i n i r s e p o r el u s u a r i o , a u n q u e n o se r e c o m i e n d a esta
posibilidad.

L a e s t r u c t u r a general de u n p r o g r a m a en Pascal es:


Cabecera de programa
Declaraciones
Bloque principal

Cabecera de un programa

Cadena de caracteres

program identificador (input, output);


Secuencia de caracteres e n c e r r a d o s e n t r e apstrofos. P a r a i n c l u i r u n a p s t r o f o en u n a
c a d e n a d e b e r escribirse el a p s t r o f o d o s veces.

Declaraciones

Separadores

E n las declaraciones se d e f i n e n t o d o s aquellos e l e m e n t o s q u e luego se utilizarn d u r a n t e


la e j e c uc i n del p r o g r a m a (etiquetas, constantes, tipos de datos, variables, s u b p r o g r a m a s )
de f o r m a similar a c o m o se e f e c t a en T u r b o Pascal. P o r e j e m p l o

Espacios, r e t o r n o s de c a r r o y sentencias c o m e n t a r i o .

Comentarios
Se utilizan para d o c u m e n t a r p r o g r a m a s y se encierran e n t r e llaves {}" o entre smbolos
"(*" y
P u e d e n incluir c u a l q u i e r carcter e x c e p t o u n a llave.

type
lista_datos = array[1..Mximo] of real;

Etiquetas
Las etiquetas son e n t e r o s sin signo utilizados p a r a s e a l a r u n a s e n t e n c i a Pascal.

Directivas
Son n o m b r e s q u e sustituyen a b l o q u e s de f u n c i o n e s y p r o c e d i m i e n t o s .

TABLA DE IDENTIFICADORES ESTANDAR


Los identificadores e s t n d a r son de m u y diversos tipos. Su caracterstica f u n d a m e n t a l es
q u e p u e d e n ser r e d e f i n i d o s p o r el u s u a r i o , a u n c u a n d o esta p o s i b i l i d a d n o se r e c o m i e n d a
p o r q u e p o d r a i n d u c i r a c o n f u s i n a otros u s u a r i o s o p r o g r a m a d o r e s q u e e m p l e a r n u n
cdigo f u e n t e c o n los i d e n t i f i c a d o r e s e s t n d a r r e d e f i n i d o s .
Abs
Eoln
New
Read
Sqrt

const
Estrella = '* 1 ;
Mximo
= 100;

ArcTan
Exp
Odd
ReadLn
Succ

Boolean
False
Ord
Real
Text

Char
Get
Output
Reset
True

Chr
Input
Pack
Rewrite
Trunc

Cos
Integer
Page
Round
Unpack

Dispose
Ln
Pred
Sin
Write

Eof
Maxlnt
Put
Sqr
WriteLn

var
1
: lista_datos;
x, y : integer;
procedure Cambiar(var a, b : integer);
var
aux : integer;
begin
aux :=a;
a
: =b ;
b
:=aux
end;

Bloque o cuerpo principal


begin
sentencias
end.

1062

Gua deI usuario ISO/ANSI Pascal estndar

Programacin en Turbo/Borland Pascal 7

TIPOS DE DATOS
| Tipos de datos

simples [ | puntero ~j

ordinales

["predefinidos

interger

char

reales

array

estructurados

registro

conjunto

archivo

| definidos por el usuario

boolean I | enumerados |

subrango

Definicin de tipos
U n a sentencia de d e f i n i c i n de tipos crea u n t i p o de d a t o d e f i n i d o p o r el u s u a r i o
type
nuevo_identificador = identificador_denotador_tipo;
Las definiciones de tipo se p u e d e n utilizar p a r a crear tipos e n u m e r a d o s , s u b r a n g o ,
e s t r u c t u r a d o s y tipos p u n t e r o s , as c o m o s i n n i m o s de t i p o s simples.

Tipos simples
Los tipos simples q u e p e r m i t e Pascal son los t i p o s n u m r i c o s , i n t e g e r (enteros) y real
(reales), el tipo char (carcter), el tipo boolean (lgicos o b o o l e a n o s ) , t o d o s ellos predefin i d o s p o r el lenguaje, y los tipos e n u m e r a d o y s u b r a n g o , q u e al p o d e r s e d e f i n i r p o r el
u s u a r i o carecen d e identificadores especficos.

Tipos estructurados o compuestos


S o n t o d o s aquellos q u e se f o r m a n p o r la u n i n de otros de tipo m s s i m p l e , ya sean h o m o g n e o s o h e t e r o g n e o s . L o s m s i m p o r t a n t e s s o n los arrays, registros, c o n j u n t o s y
archivos. D a d a la gran s e m e j a n z a c o n T u r b o Pascal se m e n c i o n a r n n i c a m e n t e las diferencias.

Tipos estructurados empaquetados


Las e s t r u c t u r a s de d a t o s g r a n d e s r e q u i e r e n g r a n d e s c a n t i d a d e s de espacio d e a l m a c e n a m i e n t o . El e m p a q u e t a m i e n t o r e d u c e el espacio necesario p a r a tales e s t r u c t u r a s , a l m a c e n a n d o los d a t o s de m o d o m s eficiente, o c u p a n d o el m e n o r espacio posible.
U n tipo de d a t o se e m p a q u e t a si est p r e c e d i d o de la p a l a b r a packed e n u n a d e f i n i c i n
de tipo o en u n a declaracin d e variable. P o r e j e m p l o :

1063

type
nombre = packed array[1..10] of char;
adulto = record
n
: nombre;
sexo : (varn, hembra);
{enumerado}
edad : 18..65
{subrango}
end;
fecha = packed record
dia : 1..31;
mes : 1..12 ;
anno : 1900. .2000
end;
El i n c o n v e n i e n t e d e las e s t r u c t u r a s e m p a q u e t a d a s es la ralentizacin en la e j e c u c i n
del p r o g r a m a .

Tipos Cadena (string,)


L a s c a d e n a s son u n a secuencia de caracteres e n c e r r a d o s entre comillas y u n a variable
c a d e n a es u n a variable d e u n a clase especial de arrays e m p a q u e t a d o s c o n c o m p o n e n t e s
d e t i p o char.
U n a c a d e n a d e b e ser leda c a r c t e r a carcter, a u n q u e p u e d e ser escrita p o r u n a sent e n c i a Write o WriteLn. El siguiente p r o g r a m a ilustra el uso de c a d e n a s
program cadenas(input, output);
const
palabra = 'Hola Mundo';
type
cadenalO = packed array[1..10] of char;
cadena2 0 = packed array[1..20] of char;
var
ndice
palentrada
palsalida
ch

:
:
:
:

integer;
cadena2 0;
cadenalO;
char;

begin
for ndice ;= 1 to 20 do
begin
Read(ch);
{lectura de un caracter}
palentrada[indce] := ch
{algunas versiones de Pascal permiten leer directamente
los caracteres con las celdas de un array empaquetado,
sin necesidad de usar la variable de tipo char}
end,
palsalida := palabra;
WriteLn(palsalida,
palentrada) {escritura cadena
cbmpleta}
end.

1064

Programacin en Turbo/Borland Pascal 7

Empaquetar y Desempaquetar
El e m p a q u e t a m i e n t o de arrays p r e s e n t a v e n t a j a s en c u a n t o a la c o m p a r a c i n y escritura
directa de cadenas, p e r o el acceso a los e l e m e n t o s de u n array e m p a q u e t a d o suele ser
m s l e n t o y l a b o r i o s o q u e a los d e u n o sin e m p a q u e t a r , r e s u l t a n d o u n a s veces c o n v e niente e m p a q u e t a r y otras d e s e m p a q u e t a r arrays. Estas o p e r a c i o n e s se p u e d e n realizar
m e d i a n t e los p r o c e d i m i e n t o s p r e d e c l a r a d o s de t r a n s f e r e n c i a : Pack y Unpack.
Pack(array_sin_empaquetar, ndice, array_empaquetado)
Unpack(array_empaquetado, array_sin_empaquetar, ndice)
Pack(Array, 6, ArrayP);
Unpack(palabra,letras, 2) ;

Archivos
U n a r c h i v o e n Pascal es u n a e s t r u c t u r a de acceso secuencial c u y o s c o m p o n e n t e s son todos del m i s m o tipo. El tipo del a r c h i v o especifica el tipo de los c o m p o n e n t e s , q u e es la
clase de valores q u e se p u e d e n a l m a c e n a r en el archivo. El tipo d e c o m p o n e n t e p u e d e
ser c u a l q u i e r a excepto u n t i p o a r c h i v o o u n o e s t r u c t u r a d o q u e c o n t e n g a u n t i p o archivo.
U n a r c h i v o se declara c o m o sigue:
type
identificador = file of identificador_de_tipo;
var
nominas : identificador;
informe : text;

Gua del usuario ISO/ANSI Pascal estndar

archivos e x t e r n o s se m a n t i e n e n e n t r e las e j e c u c i o n e s del p r o g r a m a , es decir son a r c h i v o s


p e r m a n e n t e s , y d e b e n especificarse c o m o p a r m e t r o s en la c a b e c e r a del p r o g r a m a . L a
variable a r c h i v o debe ser d e c l a r a d a en la seccin de d e c l a r a c i n d e variables del p r o g r a m a . P o r e j e m p l o , p a r a u t i l i z a r u n a r c h i v o e x t e r n o d e n o m i n a d o archdatos q u e c o n t i e n e valores reales, se utilizar la siguiente d e c l a r a c i n en el p r o g r a m a principal:
var
archdatos : file of real;
Los archivos i n t e r n o s se e m p l e a n c o m o a l m a c e n a m i e n t o auxiliar d u r a n t e la ejecucin de u n p r o g r a m a , son a r c h i v o s t e m p o r a l e s q u e n o se listan en la c a b e c e r a del m i s m o .
Pascal utiliza para leer y escribir en los a r c h i v o s u n rea de m e m o r i a i n t e r m e d i a o
b u f f e r en la q u e slo cabe u n c o m p o n e n t e del a r c h i v o y s i e m p r e q u e se declara u n a variable de tipo archivo, a u t o m t i c a m e n t e , se crea o t r a c o n o c i d a c o m o la variable b u f f e r
del archivo, q u e se r e p r e s e n t a p o r el n o m b r e de la variable archivo seguido de u n a flecha
h a c i a arriba o del s m b o l o ~ y c o n s t i t u y e u n a m a n e r a de i n s p e c c i o n a r o a a d i r c o m p o n e n t e s al archivo. Pascal p r o p o r c i o n a los p r o c e d i m i e n t o s e s t n d a r Get y Put p a r a la m a n i p u l a c i n directa de la variable b u f f e r y d a d o q u e los p r o c e d i m i e n t o s Read y Write n o
estn d e f i n i d o s en todas las versiones d e Pascal e s t n d a r p a r a los a r c h i v o s q u e n o son de
texto, es posible q u e sea n e c e s a r i o utilizar en ellos Get, Put y la variable b u f f e r d e archivo.
Read (var_archivo, var_componente)
equivaldra a
var_componente := var_archivo A ;
Get(var_archivo);

o bien
var
nominas : file of identificador_de_tipo;
informe : text;

y
Write(var_archivo, var_componente)
equivaldra a

El i d e n t i f i c a d o r p r e d e f i n i d o text especifica u n t i p o especial de a r c h i v o d e caracteres


o r g a n i z a d o en lneas de texto. L a e n t r a d a d e s d e los a r c h i v o s d e t e x t o se h a c e carcter a
carcter. E n los archivos de t e x t o los p r o c e d i m i e n t o s Read y Write o f r e c e n , a d e m s de su
c a p a c i d a d p a r a realizar o p e r a c i o n e s de lectura y escritura d e caracteres, la posibilidad d e
e f e c t u a r conversin a u t o m t i c a de tipos; as, c u a n d o se e f e c t a la l e c t u r a d e u n e n t e r o o
real, el p r o c e d i m i e n t o Read e x a m i n a c a d a c a r c t e r p a r a ver d n d e c o m i e n z a y t e r m i n a el
n m e r o en la lnea y luego c o n v i e r t e los caracteres del n m e r o a u n valor n u m r i c o . E n
estos archivos las lecturas n u m r i c a s i g n o r a n los b l a n c o s h a s t a e n c o n t r a r el c o m i e n z o del
valor n u m r i c o y c o n t i n a n d e s p u s h a s t a el p r i m e r c a r c t e r n o n u m r i c o . Los proced i m i e n t o s ReadLn y WriteLn slo p u e d e n ser utilizados en a r c h i v o s d e texto.
Los archivos estndar de e n t r a d a , input, y de salida, output, estn predeclarados c o m o
de t i p o t e x t . N o d e b e n ser d e c l a r a d o s c o m o variables, ni abiertos c o n Reset o Rewrite,
p e r o s aparecer en la cabecera d e los p r o g r a m a s . Pascal i n t e r p r e t a q u e d e b e leer o escribir en ellos siempre q u e las sentencias Read o Wri te n o especifiquen u n n o m b r e de archivo.
En Pascal hay q u e c o n s i d e r a r q u e los a r c h i v o s p u e d e n ser e x t e r n o s o internos. Los

1065

var_archivoA := var_componente
Put(var_archivo)
Ejemplo:
program mezcla(articulo, nuevoart); {mezcla de archivos}
type
cadena3 = packed array[1..3] of char;
registro = record
codigo
: cadena3;
cantidad : integer;
precio
: real
end
archivo = file of registro;
var
articulo, nuevoart, auxiliar : archivo;

1066

Gua del usuario ISO/ANSI Pascal estndar

Programacin en Turbo/Borland Pascal 7


begin
Reset(articulo);
Reset(nuevoart);
Rewrite(auxiliar);
while not eof(articulo) and not eof(nuevoart) do
begin
if articulo?.codigo < nuevoartt.codigo then
begin
auxiliart := arti culot;
get(articulo)
end
else
begin
auxiliart := nuevoartt;
get(nuevoart)
end;
Put(auxiliar)
end;
while not eof(articulo) do
begin
auxiliart := articulot;
Put(auxiliart);
get(articulo)
end;
while not eof(nuevoart) do
begin
auxiliart := nuevoartt;
Put(auxiliart);
get(nuevoart)
end;
Rewrite(articulo) ;
Reset(auxiliar);
while not eof(auxiliar) do
begin
articulot := auxiliart;
Put(articulot);
get(auxiliar)
end
end.

1067

Por ejemplo:
var
test : tinteger;
define la variable t e s t c o m o u n a variable p u n t e r o q u e a p u n t a a valores enteros. P a r a
acceder al e n t e r o al q u e a p u n t a test, se utiliza la sintaxis
test"

o bien

test

TIPOS COMPATIBLES
Los tipos d e b e n ser c o m p a t i b l e s en ciertas operaciones. Los tipos son c o m p a t i b l e s si u n a
de las siguientes c o n d i c i o n e s es v e r d a d e r a :
1. Los tipos han sido definidos equivalentes en una sentencia de declaracin de tipos.
As.
type
estado = boolean;
hace a estado y boolean tipos c o m p a t i b l e s .
2. U n tipo es un subrango de otro. P o r e j e m p l o , si
type
alfabeto = 'a'..'z';
a l f a b e t o y char s o n tipos c o m p a t i b l e s .
3. Ambos tipos subrango son del mismo tipo base. P o r e j e m p l o , si:
type
bajo = 1..50 ;
alto = 51..500;
bajo y a l t o son t i p o s c o m p a t i b l e s ya q u e a m b o s son s u b r a n g o de tipo entero.
4. Ambos tipos son tipos cadena con el mismo nmero de componentes.

Punteros

type
nombre = packed array[1..5]of char;
palabra = packed array [ 1 . 5 ] of char;

U n a variable de tipo p u n t e r o es u n a variable c u y o valor es u n a direccin. Esa direccin


es la posicin de u n valor en m e m o r i a . L a s variables d i n m i c a s se p u e d e n crear y destruir en t i e m p o d e ejecucin. A las variables d i n m i c a s se accede m e d i a n t e p u n t e r o s .
L a sintaxis p a r a declarar u n t i p o p u n t e r o es:

nombre y pal abra son c o m p a t i b l e s ya q u e a m b o s son c a d e n a s de caracteres de cinco


caracteres de longitud.

identificar = ttipo;

5. Los tipos son tipos conjunto con tipos base c o m p a t i b l e s / P o r e j e m p l o , los tipos definidos por:

1068

Programacin en Turbo/Borland Pascal 7

Gua del usuario ISO/ANSI Pascal estndar

1069

ENTRADAS Y SALIDAS BASICAS

type
dgitos = set of '0' . . 1 9 ';
intervalo = set of * 4 ' . . ' 6 ' ;
d i g i t o s e i n t e r v a l o son c o m p a t i b l e s ya q u e t a n t o las variables c o m o los tipos conj u n t o son del t i p o base char.
6. Los tipos no pueden ser compatibles si uno est empaquetado y el otro no. Slo
pueden ser compatibles si ambos estn empaquetados.

La e n t r a d a de u n p r o g r a m a es la i n f o r m a c i n real o d a t o s q u e el p r o g r a m a procesa. La
salida constituye el r e s u l t a d o del p r o g r a m a .

Salida con WriteLn y Write


Los f o r m a t o s generales son:
Write (lista de elementos);
WriteLn (lista de elementos);
WriteLn;

OPERADORES
C o n s t i t u y e n los e l e m e n t o s esenciales q u e t r a n s f o r m a n y p e r m i t e n procesar la i n f o r m a cin. Pascal e s t n d a r utiliza los m i s m o s o p e r a d o r e s q u e T u r b o Pascal y el o r d e n d e prioridad en las expresiones t a m b i n es anlogo.

C o n estos f o r m a t o s la salida es e n v i a d a al archivo e s t n d a r d e salida (output).

Entrada (lectura) con Read y ReadLn


Los f o r m a t o s generales son:

Operador

Prioridad

Clasificacin

not

Ms alta (se evala primero)

negacin lgica

* . /, div, mod, and

operadores de multiplicacin

-f, , or

operadores de adicin

< , < = , =, < > , > = , > , in


Ms baja (se evala el ltimo)

operadores de relacin

Otras operaciones
Operador

Operacin

i'ipus de pcrandos

Tipo de resultado

asignacin

cualquier tipo
asignable

ninguno

ndice de array

array

tipo componente

Asignacin
=

Acceso a variables
[,

seleccin de campo

record (registro)

tipo de campo

identificacin

puntero

tipo dominio

acceso a buffer

archivo

tipo componente

Construccin
[,

construccin de
conjunto

tipo base

conjunto

.,

construccin de
cadenas

char

cadena

Read (lista de variables);


ReadLn (lista de variables);
ReadLn;
C o n estos f o r m a t o s los p r o c e d i m i e n t o s Read y ReadLn leen d a t o s del a r c h i v o de ent r a d a e s t n d a r (input) y los a s i g n a n a las variables especificadas e n la lista.
El c o m p o r t a m i e n t o del p r o c e d i m i e n t o Read d e p e n d e del t i p o d e variable q u e se est
l e y e n d o y p r e s e n t a ciertas diferencias c o n el q u e tiene en T u r b o Pascal. C u a n d o la variable es d e t i p o c h a r se lee u n c a r c t e r d e la e n t r a d a y se le asigna a la variable; si el carcter
ledo es u n a m a r c a de fin de lnea se asigna u n carcter en b l a n c o a la variable. C u a n d o
la variable es n u m r i c a se leen u n a serie de caracteres y se a s i g n a n a la variable, s i e m p r e
q u e la sucesin se a j u s t e a la sintaxis c o r r e s p o n d i e n t e al t i p o de variable; los espacios en
blanco, t a b u l a d o r e s y m a r c a s d e fin d e lnea q u e p u d i e r a n p r e c e d e r a la serie se saltan.
ReadLn se c o m p o r t a de f o r m a similar a Read, pero, t r a s la l e c t u r a del l t i m o p a r m e tro, salta al p r i n c i p i o de la siguiente lnea.

Sentencias
Las s e n t e n c i a s c o n s t i t u y e n el v e r d a d e r o cdigo ejecutable de u n p r o g r a m a . Existen diferentes tipos de s e n t e n c i a s q u e se o r g a n i z a n en g r u p o s c o n caractersticas afines. P o r su
s e m e j a n z a c o n T u r b o Pascal slo se e f e c t u a r u n a e n u m e r a c i n d e los diferentes grupos.

Sentencia de asignacin.
Asigna el valor de u n a e x p r e s i n a la variable s i t u a d a a
la i z q u i e r d a del o p e r a d o r de asignacin.
Sentencia procedimiento.
Se utilizan p a r a l l a m a r a p r o c e d i m i e n t o s e s t n d a r y definidos p o r el u s u a r i o . Los p r o c e d i m i e n t o s se l l a m a n p o r su n o m b r e seguido p o r
u n a lista de a r g u m e n t o s e n t r e parntesis. El n m e r o d e e l e m e n t o s en la lista de

1070

Programacin en Turbo/Borland Pascal 7


a r g u m e n t o s d e b e c o r r e s p o n d e r s e c o n el n m e r o d e p a r m e t r o s en la d e f i n i c i n del
procedimiento.
Sentencia compuesta. G r u p o s de sentencias s i t u a d o s entre las p a l a b r a s begin y end.
Sentencia with. P e r m i t e a b r e v i a r la n o t a c i n necesaria para el acceso a los c a m p o s
d e variables t i p o registro.
Sentencia i f - t h e n - e l s e . Realiza diferentes acciones en f u n c i n de u n a c o n d i c i n o
e x p r e s i n lgica.
Sentencia case. E j e c u t a u n a s e n t e n c i a e n t r e varias en f u n c i n del valor de u n a expresin especificada. A l g u n a s versiones de Pascal tienen u n a clusula othervn se p a r a
especificar las a c c i o n e s q u e se llevarn a c a b o c u a n d o el valor d e la variable q u e se
c o m p r u e b a n o c o i n c i d a c o n n i n g u n o de los r e s e a d o s en la lista de p r u e b a s . U n a
s e n t e n c i a case p u e d e sustituirse p o r varias de tipo i f a n i d a d a s e n la r a m a el se.
Sentencia de bifurcacin incondicional.
La s e n t e n c i a goto salta a u n a s e n t e n c i a etiq u e t a d a p a r a q u e c o n t i n e p o r este p u n t o la e j e c u c i n d e p r o g r a m a . P r c t i c a m e n t e n o se utiliza n u n c a .
Sentencia while. R e p i t e u n a s e n t e n c i a m i e n t r a s q u e u n a c o n d i c i n sea v e r d a d e r a .
L a c o n d i c i n se c o m p r u e b a a n t e s d e q u e se e j e c u t e la sentencia.
Sentencia r e p e a t . E j e c u t a u n a s e n t e n c i a h a s t a q u e u n a c o n d i c i n especificada sea
v e r d a d e r a . L a c o n d i c i n se c o m p r u e b a tras la ejecucin de la sentencia.
Sentencia for. E j e c u t a u n a s e n t e n c i a u n n m e r o especfico de veces. U t i l i z a r n to
o down-to p a r a especificar si la variable de c o n t r o l d e b e i n c r e m e n t a r s e o d e c r e m e n tarse en c a d a iteracin.

PROCEDIMIENTOS Y FUNCIONES DEFINIDOS POR EL USUARIO


Los p r o c e d i m i e n t o s y f u n c i o n e s s o n r u t i n a s ( s u b p r o g r a m a s ) q u e realizan acciones especficas. L a d i f e r e n c i a e n t r e p r o c e d i m i e n t o s y f u n c i o n e s es q u e las f u n c i o n e s d e v u e l v e n
u n valor a travs de su p r o p i o n o m b r e , m i e n t r a s q u e los p r o c e d i m i e n t o s n o .

Declaracin de un procedimiento
procedure nombre_procedimiento (lista de declaracin de
parmetros formales);
declaraciones
begin
sentencias
end;

Llamada a un procedimiento
nombre_procedmento (lista de parmetros actuales);

Declaracin de una funcin


function nombre_funcion (lista de declaracin de parmetros
formales): tipo;

Gua del usuario ISO/ANSI Pascal estndar

1071

declaraciones
begin
sentencias
nombre_funcin : = valor de la funcin
end;

Llamada a una funcin


variable := nombre_funcin (lista de parmetros actuales);
Es posible e f e c t u a r la l l a m a d a d e n t r o de u n a s e n t e n c i a y u n a e x p r e s i n .

Parmetros variables
Los p a r m e t r o s variables son p a r m e t r o s f o r m a l e s utilizados p a r a r e p r e s e n t a r u n p a r m e t r o real (actual) c u y o valor p u e d e c a m b i a r d u r a n t e la ejecu ci n del p r o c e d i m i e n t o .
Los p a r m e t r o s variables se d e c l a r a n i n c l u y e n d o la p a l a b r a reservada var a n t e s q u e el
n o m b r e d e los p a r m e t r o s e n la cabecera. L o s p a r m e t r o s actuales c o r r e s p o n d i e n t e s debern ser variables y su tipo p o d r ser c u a l q u i e r a .
Ejemplo:
procedure cambiar (var m, n: integer);
var
aux : integer;
begin
if m > n then
begin
aux := n;
n := m;
m := aux
end
end;

Parmetros valor
Los p a r m e t r o s v a l o r c o n s t i t u y e n variables i n d e p e n d i e n t e s c o n s u p r o p i a u b i c a c i n e n
m e m o r i a , q u e r e c i b e n el v a l o r del a r g u m e n t o al c o m i e n z o de la e j e c u c i n del s u b p r o g r a m a y se d e c l a r a n e n la c a b e c e r a de la r u t i n a p o r u n a lista de i d e n t i f i c a d o r e s seguidos
p o r sus tipos. Este tipo p u e d e ser c u a l q u i e r a e x c e p t o u n a r c h i v o o u n t i p o e s t r u c t u r a d o
q u e contenga u n a r c h i v o c o m o c o m p o n e n t e .
Ejemplo:
function superficie (longitud, anchura: real): real;
begin
longitud := 12 * longitud;
(convertir pies
a pulgadas}
anchura := 12 * anchura;
superficie := longitud * anchura
end;

1072

Programacin en Turbo/Borland Pascal 7

Parmetros funcin

Gua del usuario ISO/ANSI Pascal estndar

1073

Lgicas

Los p a r m e t r o s funcionales son p a r m e t r o s formales q u e se utilizan p a r a representar u n a


f u n c i n , p a r m e t r o actual, q u e se p u e d e utilizar d u r a n t e la e j e c u c i n de la r u t i n a q u e se
declara. Es decir, los p a r m e t r o s f u n c i o n a l e s p e r m i t e n pasar u n a f u n c i n a u n a r u t i n a .

eof(f)

Devuelve true si se alcanza el final del archivo f . En caso contrario


devuelve false

eoln(f)

Devuelve true si se alcanza el final de una lnea en f . En caso contrario devuelve false (f debe ser un archivo de texto)

odd(x)

Devuelve true si la expresin es impar, false si es par, x debe ser


una expresin entera

Parmetros procedurales
Los p a r m e t r o s p r o c e d u r a l e s son a los p a r m e t r o s f u n c i o n a l e s c o m o los p r o c e d i m i e n t o s
son a las f u n c i o n e s . El p a r m e t r o f o r m a l r e p r e s e n t a u n p r o c e d i m i e n t o , p a r m e t r o actual, q u e se p u e d e utilizar d u r a n t e la ejecucin de la r u t i n a q u e se ha declarado.

Directiva forward

PROCEDIMIENTOS INTRINSECOS
Los p r o c e d i m i e n t o s intrnsecos o e s t n d a r se l l a m a n u t i l i z a n d o i d e n t i f i c a d o r e s predefinidos. Existen tres categoras: t r a t a m i e n t o de archivos, asignacin d i n m i c a y t r a n s f e r e n cia.
Procedimientos

Descripcin

Las rutinas d e f i n i d a s p o r el u s u a r i o d e b e n ser declaradas antes de ser referenciadas. L a


directiva forward p e r m i t e alterar esta n o r m a , i n d i c a n d o al c o m p i l a d o r q u e la d e f i n i c i n
de la r u t i n a v e n d r m s a d e l a n t e en el p r o g r a m a . Es necesaria c u a n d o dos r u t i n a s son

Tratamiento
de archivos

m u t u a m e n t e recursivas.

close(x)

Cierra el archivo f No pertenece a Pascal estndar, pero lo implementan muchas versiones de compiladores de Pascal.

Get(f)

Obtiene el valor del siguiente componente del archivo / e n su variable de buffer de archivo.

FUNCIONES INTRINSECAS
Las f u n c i o n e s intrnsecas o p r e d e f i n i d a s se l l a m a n p o r identificadores p r e d e f i n i d o s y se
dividen en c u a t r o categoras: n u m r i c a s , transferencia, ordinales y lgicas.
Funciones

Descripcin

Numricas
abs(x)
arctan(x)
cos(x)
exp(x)

Devuelve
Devuelve
Devuelve
Devuelve

sin(x)
sqr(x)
sqrt(x)

el valor absoluto de x
el ngulo en radianes (entre -pi/2 y pi/2)
el coseno de x (x en radianes)
ex (e = 2.718282)

Devuelve el seno de x (x en radianes)


Devuelve el cuadrado de x
Devuelve la raz cuadrada positiva de x, x debe ser mayor o igual a
cero
Redondea x (de tipo real) al entero ms prximo
Trunca la expresin x (de tipo real) y devuelve la parte entera

Ordinales

pred(x)

Devuelve el carcter cuyo ordinal es x


Devuelve el entero que es el nmero ordinal del valor de x, x puede
ser cualquier tipo ordinal
Devuelve el valor cuyo nmero ordinal es el precedente al valor de x

succ< x)

Devuelve el valor cuyo nmero ordinal es el siguiente al valor de x

chr(x)
ord(x)

Sita el siguiente texto escrito en un a r c h i v o / e n una nueva pgina.

Put(f)

Escribe el buffer del archivo, 7% en el archivo f Despus de una llamada a Put (f), el valor de la funcin eof (f) ser verdadero y el valor d t f ~ indefinido.

Read(f,v)

Lee elementos de un archivo 0 del terminal. La lista de variables son


de tipo entero, real, char 0 un subrango de estos tipos. N o est permitida la entrada directa de tipos enumerados, lgicos 0 cadena.
Funciona igual que Read pero el puntero del archivo avanza al primer carcter de la siguiente lnea y se utiliza slo con archivos de texto.
Si las variables a leer se omiten se avanza el puntero del archivo.

ReadLn(f,v)

Reset(f)

Abre un archivo / p a r a lectura y pone el puntero del archivo a la primera posicin del archivo.

Rewrite(f)

Crea un a r c h i v o / 0 b o r r a / s i ya existe, lo abre para escritura y pone


el puntero a la primera posicin del archivo.

Write(f,e)

Escribe un elemento 0 una lista de elementos al final del archivo.


Funciona igual que write, pero aade un retorno de carro y slo se
utiliza con archivos de texto. Si los elementos a escribir se omiten se
escribe un retorno de carro.

WriteLn(f,e)

De transferencia
round(x)
trunc(x)

Page(f)

Asignacin
dinmica
New(p)

Dispose(p)

Asigna dinmicamente espacio de almacenamiento a una nueva variable apuntada. Si p es la variable puntero, p' es la variable creada
por el procedimiento new.
Elimina una variable creada por el procedimiento new. Si p es la variable puntero, el procedimiento dispose suprime la variable p".

1074

Programacin en Turbo/Borland Pascal 7

Transferencia
(empaquetamiento)
Pack(a,i,b)
Unpack

Empaqueta el array a, comenzando en la posicin i, en el array, empaquetado b.


Desempaqueta el array empaquetado b en el array a, comenzando
en la posicin i.

C o n s t r u y a u n p r o g r a m a q u e p e r m i t a g e n e r a r u n a a g e n d a con n m e r o s d e telfono, as
c o m o realizar c o n s u l t a s .

Codificacin
program ejercicio_apC_03(input, output);
const
Max = 10;
type
nombre
= packed array [1..15] of char;
telefono = packed array [1..11] of char;
conocidos = array [l..Max] of nombre;
tlfnos
= array [l..Max] of telefono;
var
amigo
: conocidos;
numero
: tlfnos;
auxtfno
: telefono;
auxamigo : nombre;
unamigo
: nombre;
i, j
: 1..Max;
terminado : boolean;
otra
: char;
procedure buscar(humano: nombre; listal: conocidos; lista2:
tlfnos);
var
encontrado : boolean;
primero, ultimo, central: l..Max;
begin
encontrado := false;
primero :=1;
ultimo :=Max;
while not encontrado and (primero <= ultimo) do
begin
central := (primero + ultimo) div 2;.
if humano = listal[central] then
encontrado := true
else
if humano > listal[central] then
primero := central+1
else
ultimo := central-1
end;

Gua del usuario ISO/ANSI Pascal estndar


if encontrado then
WriteLn('Su telefono es: ', lista2[central])
else
WriteLn('No consta en la agenda 1 )
end;
procedure /leerp(var persona :nombre);
var
i : integer;
ch : char;
begin
i := 1;
while i <= 15 do
begin
if not eoln then
begin
Read(ch);
persona[i] := ch;
end
else
persona[i] := 1 1 ;
i := i+1
end;
ReadLn
end;
procedure leern(var nura : telefono);
var
i : integer;
ch : char;
begin
i := 1;
while i <= 11 do
begin
if not eoln then
begin
Read(ch) ;
num[i]:=ch;
end
else
num[i] := 1 ' ;
i := i+1
end;
ReadLn
end;
begin
for i := 1 to Max do
begin
Write(1 Introduce nombre ');
Leerp(amigo[i]);
Write('Introduce telefono ');

1075

1076

Gua del usuario ISO/ANSI Pascal estndar

Programacin en Turbo/Borland Pascal 7


Leern(numero[i])
end;
for i := 1 to Max-1 do
for j := i+1 to Max do
if amigo[] > amigo[i] then
begin
auxamigo := amigo[i];
auxtfno := numero[i];
amigo[i] := amigo[j];
numero[i] := numerofj];
amigo[j] := auxamigo;
numero[j] := auxtfno
end;
repeat
Write('Introduce la persona a buscar ');
Leerp(unamigo);
buscar(unamigo, amigo, numero);
WriteLn('Otra persona? (s/n) ');
ReadLn(otra);
terminado := otra = 'n'
until terminado
end.

S u p u e s t a la siguiente e n t r a d a de datos
-3 * 12.4
averige la salida q u e o b t e n d r a tras la ejecucin del p r o g r a m a q u e se m u e s t r a a c o n t i n u a c i n . Observe las d i f e r e n c i a s con T u r b o Pascal.
program ejercicio_apC_04(input, output);
var
el, c2, c3, c4 : char;
il, i2, i3
: integer;
begin
ReadLn(cl,il,c2,c3,i2,c4,i3);
WriteLn(il,c3,i3 ) ;
end.

Ejecucin
3*4
Escriba u n p r o g r a m a q u e p e r m i t a efectuar u n a copia u n a r c h i v o de texto en otro.

Codificacin
program ejercicio_apC_05(inicio, destino);
var
inicio, destino : text;
letra
: char;

1077

begin
Reset(inicio);
Rewrite(destino);
while not eof(inicio) do
begin
while not eoln(inicio) do
begin
Read(inicio, letra);
Write(destino, letra)
end;
ReadLn(inicio);
WriteLn(destino)
end
end.
D i s e e u n p r o g r a m a p a r a realizar la a c t u a l i z a c i n de las c u e n t a s de los clientes d e u n
b a n c o . Se recibir c o m o e n t r a d a el n m e r o de c u e n t a y el saldo p a r a c a d a cliente, a d e m s de la c a n t i d a d a ingresar o a reintegrar al m i s m o . L a a c t u a l i z a c i n t e n d r en c u e n t a :
Si es u n ingreso, se a c u m u l a r en el saldo y se i n t r o d u c i r c o m o c a n t i d a d positiva.
Si es u n reintegro o retirada de f o n d o s , se restar del saldo y se i n t r o d u c i r c o m o
c a n t i d a d negativa.
D e c a d a n m e r o d e c u e n t a se c o m p r o b a r su Habilidad s e g n la siguiente t c n i c a .
El l t i m o dgito d e d i c h o n m e r o d e b e ser la s u m a de los a n t e r i o r e s m d u l o 8 p a r a
q u e d i c h o n m e r o sea correcto. El n m e r o de c u e n t a t e n d r u n m x i m o d e 10
dgitos.
Se pide o b t e n e r c o m o salida el n m e r o d e c u e n t a y el saldo a c t u a l i z a d o , si el n m e r o
de c u e n t a es e r r n e o se d e b e i n d i c a r y n o se h a r n i n g u n a o p e r a c i n .

Codificacin
program ejercicio_apC_06(input, output);
type
nmeros = array [1..10] of 0..9;
cuenta = record
numcuenta : nmeros;
saldo
: real
end ;
lista
= array [1..200] of cuenta;
var
cliente : lista;
m
: integer; {no se desea llenar completamente el array}
procedure inicializar(var b: lista);
var
i, j : integer;
begin
for i := 1 to 200 do
with b[i] do

1078

Gua del usuario ISO/ANSI Pascal estndar

Programacin en Turbo/Borland Pascal 7


begin
for j := 1 to 10 do
numcuenta[j] := 0;
end
end;
function correcto(j: integer; nc: nmeros): boolean;
var
k, suma : integer;
begin
for k := 1 to j - 1 do
suma := suma + nc[k];
if suma mod 8 = nc[j] then
correcto := true
else
correcto := false
end;
procedure actualizar(var uncliente: cuenta; j: integer)
var
k
: integer;
cantidad : real;
begin
Write('Cantidad: (+)ingreso, (-)reintegro ');
ReadLn(cantidad)
With uncliente do
begin
for k := 1 to j do
Write(numcuenta[k]:1);
saldo := saldo + cantidad;
WriteLn(1 Saldo
saldo:8:2)
end
end;
procedure leer(var b: lista; var lm: integer);
var
i, j: integer;
d
: char;
{se leer el nmero de cuenta
como caracteres}
begin
repeat
i := i + 1;
with b[i] do
begin
Write('Deme el numero de cuenta ');
j := 0;
while not eoln and (j < 10) do
begin
j := j + 1;
Read(d);
numcuentafj] := ord(d) - ord('O')
end;

ReadLn;
Write('Deme el saldo ');
ReadLn(saldo)
end;
if correcto(j, b[i].numcuenta) then
actualizar(b[i, j )
else
WriteLn('Numero incorrecto')
until eof or (i = 2 00);
lm := i
end;
begin
inicializar(cliente);
leer(cliente, lim)
end.

Ejercicios resueltos
C o d i f i q u e u n p r o g r a m a q u e m u e s t r e el d i b u j o de u n p i n o en pantalla.

Codificacin
program ejercicio_apC_01(output);
var
i, j : integer;
begin
for i := 1 to 2 5 do
writeln;
for i := 1 to 10 do
begin
write{' 1 :40i);
for j:= 1 to 2*i-l do
write('*');
writeln
end;
for i := 1 to 5 do
begin
write(1**' :40) ;
writeln
end
end.
D i s e e u n p r o g r a m a q u e i n d i q u e si u n n m e r o e n t e r o es capica.

Codificacin
program ejercicio_apC_02(input, output);
var
numero,

1079

1080

Programacin en Turbo/Borland Pascal 7


copia,
alreves,
resto
: integer;
begin
Write(1 Introduzca un numero en el rango de los enteros
ReadLn(numero);
copia := numero;
alreves := 0;
while numero o 0 do
begin
resto := numero mod 10;
alreves := alreves * 10;
alreves := alreves + resto;
numero := numero div 10
end;
if alreves = copia then
WriteLn ('El numero es capica')
else
WriteLn ('El numero no es capica')
end.

APENDICE

PASCAL ESTANDAF
(ANSI PASCAL)
versus TURBO PASCAL 5 . 5 a 7 . 0
T u r b o Pascal sigue las n o r m a s de Pascal e s t n d a r , c o n u n a serie de excepciones y mejoras q u e lo c o n f i g u r a n c o m o u n e n t o r n o d e p r o g r a m a c i n especial. T u r b o Pascal 5.5 ha
a a d i d o las caractersticas p r o p i a s de la programacin
orientada a objetos.

Mejoras de Turbo Pascal


(no existen en Pascal estndar)
Las siguientes caractersticas son p r o p i a s de T u r b o Pascal 5.5 a 7.0 y n o existen en Pascal
A N S I (estndar):
N u e v a s palabras reservadas en T u r b o Pascal:
absolute
external
implementation
inline

interface
interrupt
shl
shr

string
unit
uses
xor

U n i n d e n t i f i c a d o r p u e d e c o n t e n e r caracteres s u b r a y a d o s (Paga-mes

Nombre-Apellidos

Inters-Anual

Constantes:
E n t e r a s (se p u e d e n escribir en n o t a c i n h e x a d e c i m a l , c o n p r e f i j o $).
D e cadena-, son c o m p a t i b l e s con tipos string y p u e d e n c o n t e n e r caracteres de control y otros caracteres n o i m p r i m i b l e s
N u e v o s tipos enteros:
shortint

longint

byte

word

N u e v o s tipos reales:
single

double

extended

comp

1082

Programacin en'Turbo/Borland Pascal 7

Pascal estndar (ANSI Pascal) versus Turbo Pascal 5.5. a 7.0

T u r b o Pascal i n c o r p o r a tipos string.


Las d e c l a r a c i o n e s de c o n s t a n t e s , tipos, variables, p r o c e d i m i e n t o s y f u n c i o n e s p u e d e n
ocurrir c u a l q u i e r n m e r o d e veces en cualquier o r d e n en u n b l o q u e .
T u r b o Pascal i n c o r p o r a t i p o s p r o c e d i m i e n t o .
Las variables se p u e d e n d e c l a r a r en direcciones de m e m o r i a a bs ol ut a utilizando u n a
clusula absolute.
Las variables t i p o string se p u e d e n i n d e x a r c o m o arrays p a r a acceder i n d i v i d u a l m e n t e
a caracteres d e u n a c a d e n a .
T u r b o Pascal i n c o r p o r a tres n u e v o s o p e r a d o r e s lgicos: xor, shl y shr.
Los o p e r a d o r e s not, and, or y xor se p u e d e n utilizar con o p e r a n d o s tipo e n t e r o para
ejecutar o p e r a c i o n e s lgicas bitwise.
El o p e r a d o r + se p u e d e utilizar p a r a c o m p a r a r cadenas.
Los o p e r a d o r e s relacinales se p u e d e n utilizar p a r a c o m p a r a r c a d e n a s .
T u r b o Pascal i n c o r p o r a el o p e r a d o r @, q u e sirve para o b t e n e r la direccin de u n a
variable, un p r o c e d i m i e n t o o u n a f u n c i n .
Los valores t i p o string p u e d e n ser e n t r a d a y salida con los p r o c e d i m i e n t o s e s t n d a r
Read, ReadLn,
Write y WriteLn.
La sentencia case p e r m i t e rangos d e c o n s t a n t e s en la lista de etiquetas case, y posee
u n a parte o p c i o n a l else.
T u r b o P a s c a H n c o r p o r a u n i d a d e s p a r a p r o g r a m a c i n m o d u l a r y c o m p i l a c i n separada.
T u r b o Pascal i n c o r p o r a los siguientes n u e v o s p r o c e d i m i e n t o s y f u n c i o n e s especficas
de t r a t a m i e n t o de archivos:
Append
BlockRead
BlockWrite
ChDir

Clase
Erase
FilePos
FileSize

Flush
GetDir
MkDir
Rename

RmDir
Seek
SeekEos
SeekEoln

T u r b o Pascal i n c o r p o r a las siguientes n u e v a s f u n c i o n e s y p r o c e d i m i e n t o s :


Addr
Concat
Copy
CSeg
DSeg
Dec
Delete
Exit
FillChar
Frac
FreeMem

GetMem
Halt
Hi
Inc
Insert
Int
Lenght
Lo
Mark
MaxAvail
MemAvail

Move
Ofs
ParamCount
ParamStr
Pi
Pos
Ptr
Random
Randomize
Release
RunError

Sptr
Seg
SizeOf
SSeg
Str
Swap
UpCase
Val

Arrays a b i e r t o s e n T u r b o Pascal 7.0 y n u e v a s f u n c i o n e s H i g h y Low.


C a d e n a s t e r m i n a d a s en n u l o , similares a las c a d e n a s en C. Slo en versin
cal 7.0.

N u e v a s sentencias de c o n t r o l i n c o n d i c i o n a l : break y continu. Slo en versin


Pascal 7.0.

1083
Turbo

Caractersticas de Pascal estndar no existentes


en Turbo Pascal
Identificador

es:

Pascal estndar:
T u r b o Pascal:

u n i d e n t i f i c a d o r p u e d e ser de c u a l q u i e r longitud y t o d o s los


caracteres son significativos.
un i d e n t i f i c a d o r p u e d e ser de c u a l q u i e r longitud, p e r o slo son
significativos los 63 p r i m e r o s caracteres.

En Pascal estndar, un c o m e n t a r i o p u e d e c o m e n z a r con { y finalizar con *) o viceversa. En T u r b o Pascal los c o m e n t a r i o s d e b e n c o m e n z a r y t e r m i n a r c o n el m i s m o conj u n t o de smbolos.
En Pascal estndar, u n a variable file (archivo) tiene u n a variable buffer ( m e m o r i a
i n t e r m e d i a ) asociada, q u e se identifica p o r el s m b o l o ~ d e s p u s d e la variable file. En
T u r b o Pascal, u n a variable a r c h i v o n o tiene u n a variable buffer asociada, y si escribe
un " despus de la variable, c o m e t e r un error.
Pascal e s t n d a r d e f i n e los p r o c e d i m i e n t o s Get y Put, q u e se utilizan p a r a leer y escribir
en archivos. N o estn d e f i n i d o s en T u r b o Pascal.
E n Pascal e s t n d a r se d e f i n e n los p r o c e d i m i e n t o s Pack y Unpack q u e se utilizan p a r a
empaquetar y desempaquetar
variables e m p a q u e t a d a s . Estos p r o c e d i m i e n t o s no estn
d e f i n i d o s en T u r b o Pascal.
E n Pascal e s t n d a r , si el valor del selector e n u n a s e n t e n c i a case n o es igual a cualquiera de las c o n s t a n t e s case, se p r o d u c e u n error. En T u r b o Pascal n o se p r o d u c e error;
en su lugar se ignora la s e n t e n c i a case, e x c e p t o q u e t e n g a la clusula else.
En Pascal, u n a lectura (Read) d e un a r c h i v o d e texto c o n u n a variable tipo char asigna
u n b l a n c o a la variable si Eoln era true a n t e s de Read. En T u r b o Pascal se asigna a la
variable u n carcter r e t o r n o de c a r r o (ASCII 13).
En Pascal, u n a lectura (Read) de u n a r c h i v o de texto c o n variables tipos e n t e r o o real
cesa t a n p r o n t o c o m o el siguiente carcter del a r c h i v o n o es p a r t e de un n m e r o o
e n t e r o con signo. E n T u r b o Pascal la lectura cesa c u a n d o el siguiente c a r c t e r del
archivo es u n b l a n c o o u n carcter de control.
En Pascal est d e f i n i d o el p r o c e d i m i e n t o e s t n d a r Page q u e p r o d u c e u n salto de
pgina (pasa a u n a n u e v a pgina). Este p r o c e d i m i e n t o n o est d e f i n i d o en T u r b o
Pascal; sin e m b a r g o , se p u e d e realizar c o n la sentencia W r i t e (F, Chr(12)).
Page(F)

equivale a

Write(F,Chr(12))

REFERENCIA BIBLIOGRAFICA
Borland: Language Guide, Programmer's Reference, User's Guide 6.0 y 7.0,
ce Guide 5.0 y 5.5.
Turbo Pas-

Turbo

Pascal Referen-

Bibliografa

BIBLIOGRAFIA

BORLAND: Object-OrientedProgrammingGuide.
Turbo Pascal 5.5, 1989; Reference Guide 5.0; User's
Guide 5.0. Borland International, 1989. Turbo Pascal 4.0. Borland International, 1988. Language Guide, 7.0/6.0. User's Guide 7.0/6.0. Programmer's Reference 7.0/6.0. Turbo Vision 6.0/
7.0.
BORRAS, GISBERG, DOPAZO, NIETO: Programacin en Turbo Pascal 4.0. Mestral, 1988.
COLLAZO, MORALES, MORENO: Estructuras de datos. Daz de Santos, 1987.
CUEVA LOVELLE, J. M . , GARCA FUENTE, M.A P . A . , LPEZ PREZ, B., LUENGO DIEZ, M . A C . ,

ALONSO REQUEJO, M.: Introduccin a la programacin estructurada y orientada a objetos. Universidad de Oviedo. (Los autores): Oviedo, 1994.
D'ALARCO y SUTHERLAND: Problem Solving with Pascal. MacMillan, 1988.
DALE/WEEMS: Pascal. McGraw-Hill, 1989.
DOUGLAS, BRUCE: Using Turbo and IBM Pascal. Brady, 1986.
DUNTEMAN: Complete Turbo Pascal. 3.a edicin, Scott, Foresman and Company, 1989.
FEIBEL: Turbo Pascal Disk Tutor. McGraw-Hill, 1990. Turbo Pascal 7 Handbook. McGraw-Hill,
1992.

FLOYD, MICHAEL: Turbo Pascal with objects. Dr. Dobb's Journal. Julio 1989. Vol. 14, nm. 7.
en Pascal. McGraw-Hill, 1987.

HALE, EASTON: Applied Data Structures Using Pascal. Heath and Company, 1987.
JENSEN, K., y WIRTH, N.: Pascal. Manual del usuario e informe. El Ateneo. Buenos Aires, 1985.
JONES y HARROW: Problem Solving Using Turbo Pascal. Prentice Hall, 1986.
JOYANES AGUILAR, LUIS: Fundamentos

de programacin.

2.A ed., M c G r a w - H i l l , M a d r i d , 1996.

Metodologa de la programacin. McGraw-Hill, 1986. Turbo Pascal 6.0 a su alcance. McGrawHill, 1992. Problemas de Metodologa de la Programacin. McGraw-Hill, 1991. Turbo Pascal
7. Manual de bolsillo. McGraw-Hill, 1991. Turbo/Borland Pascal. Iniciacin y referencia.
McGraw-Hill, 1997.
JOYANES, L., HERMOSO, A., y ZAHONERO, I.: Pascal y Turbo Pascal. Un enfoque prctico.
McGraw-Hill, 1995.
JOYANES, L., RODRGUEZ, L., y FERNNDEZ, M.: Fundamentos

de programacin.

Libro de proble-

mas. McGraw-Hill, 1996; Fundamentos de programacin. Libro de problemas en Pascal y Turbo


Pascal. McGraw-Hill, 1997.
JOYANES, L., y ZAHONERO, I.: Estructura de datos. Madrid: McGraw-Hill, 1998.
KNUTH, D. E.: The art of Computer Programming. Volumen 2. Sorting and Searching. Addison
Wesley, 1973.
KOFFMAN: Pascal. Addison Wesley, 1985, 1989.
KRUSE: Estructura de datos y diseo de programas. Prentice Hall, 1988.
LIPSCHUTZ, SEYMOUR: Estructura

de datos. McGraw-Hill, 1986.

LOOMIS, MARY: Data Management and Files Structures. 2.a edicin. Prentice Hall, 1989.
MALLOZZI, JOHN: Turbo Pascal for program design. McGraw-Hill, 1989.
MILLER: Advanced Programming Design and Structure. Using Pascal. Addison Wesley, 1986.
O'BRIEN: Turbo Pascal. Manual de Referencia. McGraw-Hill, 1989.
O'BRIEN: Turbo Pascal 5.5. The Complete Reference. McGraw-Hill, 1989. Turbo Pascal 6. The
Complete Reference. McGraw-Hill, 1991.
RIVIERE, J.: Turbo Pascal et son environement. Dunod, 1988.
SAVITCH, WALTER: Pascal. B e n j a m n Cummings, 1987.

1084

SOLOW, D A N I E L : Thinking in Pascal. A System approach. McGraw-Hill, 1989.


SWAN, TOM: Mastering Turbo Pascal. Hayden Book Company, 1986. Mastering Turbo Pascal 5.5.
Hayden Books, 1990. Third Edition. Mastering Turbo Pascal 6.0. Hayden Books, 1991. Fourth
Edition.
THARP, ALAN L.: File Organization and Processing. Wiley Sons, 1988.

THOMAS, DA VE y WEGNER, PETER: Object-Oriented Upgrades. Byte. Marzo, 1989. Vol. 14. n m . 13.
TREMBLAY, DE DOUREK, BUNT: Introduction to Computer Science. McGraw-Hill, 1989.

ALONSO AMO y MORALES LOZANO: Tcnicas de programacin.


P a r a n i n f o , 1988.
ARMICI, JEAN CLAUDE: Turbo Pascal, versin 4. Editions LSI, 1986.

GOTTFRIED, BYRON: Programacin

1085

URDELL, JON: Clash of Object-Oriented Pascals. Byte. Julio, 1989. Volumen 14, nmero 7.
WIRTH: Algoritmos + Estructuras de datos = Programas. Ediciones del Castillo, 1986.
WOOD: Using Turbo Pascal. McGraw-Hill, 1989.

Indice

INDICE

Abs, 253
abstraccin, 459. 835, 846, 855
de control, 846
de datos, 846
ADT, 834
aleatorios, 269
algoritmo, 14, 473
diseo, 17
mbito, 224, 226
procedimientos anidados, 226
reglas de, 224
anlisis del problema, 16
And, 116, 315
Append, 579
apuntador. Vase puntero, 681
rbol, 733
altura, 735, 739
aridad, 735
ascendiente, 734
binario, 736-739
completo, 738
equilibrado, 737
lleno, 740
no completo, 738
camino, 734
de expresin, 742
construccin. 745
grado, 735
hijo, 733-735
hoja, 733-735
nivel, 735, 739
nodo, 733-735
padre, 733-735
recorrido, 741
en orden, 741
postorden, 741
preorden, 741
subrbol, 734, 738
rbol binario, 736
completo, 739
de bsqueda, 752-764
concepto, 752
creacin, 753
implementacin, 756
recorrido, 757
disjunto, 737
equilibrado, 737
hijo derecho, 736

1086

hijo izquierdo, 736


hoja, 736
implementacin, 747
lleno, 740
nodo, 737
terminal, 737
no equilibrado, 738
profundidad, 739
recorrido, 741
en orden, 741, 748
implementacin, 751
postorden, 741, 750
preorden, 741, 748
subrbol, 737
tipo, 737
Arctan, 259
archivo, 51, 564, 1038
abrir, 51
acceso aleatorio, 582, 584
actualizar, 592
aleatorio, 565, 582, 588, 590
aadir, 579
apertura, 574, 585
asignacin, 573, 585
binario, 583
borrar, 606
cierre, 586
declaracin, 572, 584, 598
directo, 565
escritura, 565
file, 567
fin de archivo, 585
funciones, 569
lectura, 575
mantenimiento, 586
operaciones, 585
ordenacin de, 611
procedimientos, 569 .
programa, 9
renombrar, 606
sin tipos, 604
texto, 467, 572, 610
tipo char, 572
tipos, 565
tratramiento, 572, 595-603
aritmtica, 129
lgica, 129
array, 332, 333

abierto, 366
bidimensional, 352
como parmetro, 345
declaracin, 352
manipulacin, 354
concepto, 334
declaracin, 335
de registro, 531, 552-556
directiva, 349
ndice, 339
mezcla, 612
multidimensional, 351, 361
operaciones, 341
copia, 343
escritura, 341
lectura, 341
unidimensional, 334
variable, 336
vectores, 334
copia, 343
escritura, 341
lectura, 341
valor mximo, 348
valor mnimo, 348
ASCII, 951
asercin, 451
aserto, 451
asignacin de memoria, 701, 1034
Assign, 573, 585
AssignCrt, 81
Assigned, 701
Atn, 257
Ayuda en lnea, 977

bandera, 127, 158


BlockRead, 605
BlockWrite, 605
Bloque, 223
Break, 174
Breakpoint, 1003
bucle, 148, 150, 163
anidados, 171, 174
comparacin, 163
condicionales, 155, 156
control del, 168
controlado por condicin, 156
controlado por contador, 55 .
cuerpo, 149
diseo, 152
infinito. 153, 165
invariante, 455
iteracin, 149
repeat, 172
terminacin, 154
variable de contro, 166
while, 172

bsqueda, 501
anlisis, 501-505
binaria, 501, 505-509, 544-546
binaria recursiva, 649
dicotmica, 501
eficiencia, 505
hash, 501, 544, 547
lineal, 544-546
byte, 5

cadena, 380
abierta, 399
acceso a, 395
asignacin, 384
de caracteres, 1020, 1060
compatibilidad, 394
concatenacin, 386
conversin, 392
copiar, 391
declaracin, 381
funciones, 386, 407
insertar, 389
longitud, 381, 384, 387
nula, 394
operaciones, 385-386
parmetros, 399
posicin, 390
procedimientos, 386, 408
propiedades, 394
representacin, 383
terminada en nulo, 401
tratamiento, 1032
vaca, 394
calidad del software, 442
Case, 131, 141
CD-ROM, 9
centinela, 127, 157
ciclo, 148
ciclo de vida del software, 443, 444
anlisis, 444
codificacin, 446
diseo, 445
implementacin, 446
integracin, 446
mantenimiento, 448
obsolescencia, 448
pruebas, 446
verificacin, 447
clase, 876, 881, 905
abstracta, 895
declaracin, 912
estructura interna, 888
instancia, 889
seccin privada, 912
seccin pblica, 912
subclase, 919
clave, 547

1087

1088

Indice

Programacin en Turbo/Borland Pascal 7

ClrEol, 419, 821


ClrScr, 90, 420, 821
codificacin, 20, 474
cdigos de referencia, 951
cola, 670
aplicaciones, 671
declaracin, 673
con listas enlazadas, 727
realizacin, 671
con arrays, 671
con registros, 67J
tipos, 676
colisiones, 549
comentarios, 20, 96, 1060
compilacin, 21
compilacin condicional, 993-995
complemento, 164
compresibilidad, 461
computador/a, 2
computadora, 2
multimedia, 9
condiciones,
compuestas, 159
conjuntos, 309
asignaciones, 310
como parmetros, 318
comparacin, 314
concepto, 323
declaraciones, 310
diferencia, 313
escritura, 318
interseccin, 313
lectura, 316
operaciones, 313, 323
procedimientos especiales, 326
relacin in, 311
unin, 313
constantes, 60, 71, 1023-1024
con nombre, 72
expresin, 73
literales, 71
lgicas, 128
constructor, 938
Continu, 174, 176
control de dispositivos, 1041
conversin de claves, 547
Copv, 391
Cos, 257-258
crisis del software, 440
CRT, 3
Char, 292, 306, 308, 397, 398
array de, 397-398
CheckBreak, 419
CheckEof, 419
CheckSnow, 418
*
Chr, 263

DateTime, 809
Dec, 267
Delay, 434, 822
Delete, 388
DelLine, 420, 822
depuracin, 475, 998, 1004, 1005
normas, 1008
orientada a objetos, 1009
depurador, 477
integrado de Turbo / Pascal, 1003
destructor, 927, 938, 942
diagramas de flujo, 18
diagramas de sintaxis, 1044
directivas de compilacin, 60, 68, 239, 240, 983,
1019, 1040, 1060
$A, 985
$B, 985
$D, 986
$E, 986
$F, 987
$1, 988
$M, 989
$N, 990
SO, 991
$P, 991
$Q, 991
$R, 992
$S, 992
ST, 992
$Y, 993
$V, 993
disco duro, 8
disco magntico, 7
diseo,
descendente, 25-26, 195, 232
modular
DiskFree, 811
DiskSize, 811
Dispose, 694, 704, 927, 945
dispositivos. 3, 10, 608, 1021
copia blanda, 4
copia dura, 3
entrada, 2, 3
salida, 2-3
disquete, 8
Div, 315
Divide y vencers, 196
documentacin, 449, 463
DosExitCode, 812
Downto, 167, 168

Edicin, 49
editor de Turbo Pascal, 959
efectos laterales, 221-222
eficiencia, 463, 478, 635
EID, 35, 975
Eiflfel, 862

ejecucin, 21
else, 119
encapsulamiento, 459, 856, 911
entorno Integrado de Desarrollo, 963
Entorno Integrado de Desarrollo, 35
entrada de datos, 89
enumerados, 297
aplicaciones, 301
escritura, 299
lectura, 295
Eof, 571
Eoln, 571
errores,
de compilacin, 998, 1011
de E/S, 593, 595
de sintaxis, 475
en tiempo de ejecucin, 476, 1001, 1011, 1015
lgicos, 477, 1001
mensajes, 1011
tpicos, 241
tratamiento, 1008
E/S, 2, 1069
estilo de programacin, 463
estructuras de control, 27, 109, 148
estructuras de datos, 332
clasificacin, 333
concepto, 333
dinmicas, 680-681
estticas, 680-682
repetitivas, 28
secuenciales, 28
selectivas, 28, 109
estructuras repetitivas,
eleccin de, 177-178
etiquetas, 60
Exec, 812
Exp, 254
expresiones,
en cortocircuito, 128
lgicas, 128

fiabilidad, 461
FilePos, 589
FileSize, 589
fin_mientras, 150
FindFirst,
FindNext, 814
Flag, 127
for, 149, 165, 167, 171, 184
anidados, 173
forward, 230, 637
Frac, 254
funciones, 20, 1020,1031, 1035-1036, 1038, 1070
aritmticas, 253
conversin, 251
decremento, 26-7
definidas por el usuario, 273

designador, 275
especiales, 264
exponenciales, 254
incremento, 267
intrnsecas, 1072
logartmicas, 254
llamada, 275
matemticas, 251
ordinales, 261
predefinidas, 250
recursiva, 621
trigonomtricas, 257
virtuales, 900
Function, 610
Fusin, 509, 612

GetDate, 93, 814


GetFAttr, 814
GetFTime, 815
GetlntVec, 815
Getmen, 704, 705
GetTime, 92
GotoXY, 91, 420, 822

hardware, 2
herencia, 890, 917, 923
definicin, 980
mltiple, 891, 894
simple, 891, 893, 918
tipos, 891
Heap, 703
Hi, 265
High, 368
HighVideo, 422, 822, 83

identificador, 58, 222, 227, 1019, 1060


mbito, 222, 228
estcandar, 60
if, 117, 122, 139
if-then, 117, 139
if-then-else, 139
implementation
impresin, 88
impresora, 3, 609
in, 311-312
Inc. 267
Include, 791
ingeniera de software, 438
inherited, 923
initialization
InsLine, 421, 822
instanciacin, 837
Int, 254
integer, 65
intercalacin, 509-511

1089

1090

Programacin en Turbo/Borland Pascal 7

interfaz, 462
interrupcin, 1003
interruptor, 127, 158
Intr, 815
I/O, 2
IOResult, 594, 831

jerarqua de clases, 890, 919


Keep, 816
kb, 6
KB, 6
KeyPressed. 433, 822

Length, 387, 407


lenguajes, 12
alto nivel, 14
bajo nivel, 13
de programacin, 12
ensamblador, 13
mquina, 12
lenguales de POO. 859
clasificacin, 861
evolucin, 860
UFO, 661
ligadura dinmica, 899, 935
ligadura esttica, 899, 935
lnea de programa, 60, 1020
lista circular, 721
versus lista enlazada, 722
lista doblemente enlazada, 723
diseo, 725
tipos, 724
lista enlazada, 706
concepto, 707
creacin, 710
doblemente, 723
eliminacin, 714
implementacin, 708
insertar, 716, 719
operaciones, 710
recorrido, 712, 719
representacin grfica, 709
Ln, 255
LO, 266
LongFilePos, 831
LongSeek, 832
loop, 148
Low, 368
LowVideo, 421, 823, 832

llamadas a procedimientos, 229

mapa de memoria, 702


mark, 704. 705

Indice
MaxAvail, 704, 706, 832
MemAvail, 704, 706, 832
memoria, 5
auxiliar, 7
central, 5-6
externa, 7
interna, 5
principal, 5
mensaje, 839, 875, 883-886, 906
mensajes de error, 1011
mens, 41, 45, 14, 964
Compile, 969
Edit, 966
File, 965
Help, 974
Options, 972
Run, 968
Search, 967
Tools, 971
Window, 973
mtodos, 875, 905, 913, 925
implementacin, 914
virtuales, 900
mezcla, 509, 646
mientras, 150, 602
mod, 315
modelo objeto, 872
modificabilidad, 460
modularidad, 459, 840, 856
mdulo, 16, 196, 198, 770, 837, 840, 843, 870
acoplamiento, 844
cohesin, 844
monitor, 3
montculo, 703
MsDOS, 816
multimedia, 9

nemotcnicos, 13
new, 685, 704, 945
nil, 696
NormVideo, 422, 823
NoSound, 435, 823
not, 315

object, 905, 918


objetos, 838, 872
atributos, 886
beneficios, 864
constructor, 938
definicin, 877, 915
destructor, 938
dinmicos, 926, 938
duracin, 879
ejemplos, 873
estructura, 886
identificacin, 878

mensajes, 883
mtodos, 886
modelo, 868
sintaxis, 905
octeto, 5
ocultacin de datos, 882
ocultacin de la informacin, 837, 843
Odd, 265
OdrSetBuf,
OMT, 873, 889
OOP, 838
operaciones, 83
bsicas, 90
de E/S, 83
operaciones usuales con Turbo Pascal, 980
operadores
aritmticos, 1025
div, 80
mod, 80
de conjuntos, 1026
de relacin, 110
lgicos, 113, 1026
orden de evaluacin, 112
prioridad, 81, 115, 315
relacinales, 1026
or, 116
Ord, 262
ordenacin, 484
burbuja, 486-493
de un array de registros, 552
externa, 646
insercin, 495-498
por mezcla, 646
quicksort, 642
rpida, 642
seleccin, 493-495
Shell, 498-501
ordenador, 2
rdenes de edicin, 959-962
orientacin a objetos, 839
Overlay, 795
overlays, 792
OvrClearBuf, 795
OvrGetBuf, 795
Ovrlnit, 795
OvrlnitEMS, 795

PackTime, 816
palabras reservadas, 59, 957, 1019, 1059
pantalla, 424
control, 428
coordenadas, 426
de texto, 424
paquete, 856
parmetros, 206
abiertos, 216, 398
actuales, 208

array, 398
cadena abierta, 216, 399
con tipo, 216
constantes, 216
correspondencia, 208
efectos laterales, 221
entrada, 207
formales, 208
lista, 206, 208
paso, 346
salida, 207
sin tipo, 216
sintaxis, 213
tipo procedimiento
valor, 210, 213, 215
variablr sin tipo, 277
variable, 210, 211, 213, 216, 346
Pascal estndar, 28, 957, 1059
estructura de un programa, 1061
versus Turbo Pascal, 29, 1081
Pi, 265
pila, 660
concepto, 661
realizacin, 664
polimorfismo, 857, 900, 935
POO, 838, 868, 871
portablidad, 442, 481
Pos, 390
postcondicin, 452
precondicin, 452
Pred, 262, 264, 305
prvate, 946
procedimientos, 199, 299, 1029-1030,
1035-1036, 1070
anidados, 226
declaracin, 199, 201
de conjuntos, 326
diseo, 205
intrnsecos, 1073
llamada, 200, 229
orden de ejecucin, 200
predefinido, 576
ventajas, 204
procedure, 278
procesador, 2
programa, 56
programacin
con expresiones lgicas, 126
depuracin, 463
documentacin, 463
errores tpicos de, 138
estructurada, 25, 27, 869
estilo, 95, 101, 463
interactiva, 94
modular, 195, 198,232
orientada a objetos, 34, 863, 971, 904
programacin orientada a objetos, 868
programa, 2, 28, 40

1091

1092

Programacin en Turbo/Borland Pascal 7

ciclo de desarrollo, 40
comopilacin, 23, 49
correccin, 457
de utilidad, 11
depuracin, 471, 475
documentacin, 24, 470
edicin, 49
eficiencia, 463
ejecucin, 51
ejecutable, 22
estructura, 55
exactitud, 457
fuente, 22
grabacin, 49
legibilidad, 468
mantenimiento, 24
modular, 25
objeto, 22, 58
principios de diseo, 458
puesta a punto, 99, 136, 180, 241, 281, 328
369, 556, 616, 655, 767, 729
verificacin, 23
PROLOG, 839
prueba de programas, 453
pseudocdigo, 18
public, 946
puesta a punto de programa, 99, 136, 180. 241
281, 328, 369, 556, 616, 655, 676, 729
puntero, 681, 1033, 1066
asignacin, 692
concepto, 682
declaracin, 682
iniciacin, 692
naturaleza dinmica, 697
operaciones, 685
tipo genrico, 700
variables, 690
punto de interrupcin, 1003
Quicksort, 642-646

{ R},296
radian, 257
Random, 269
Randomize, 271
RandSeed, 272
Read, 575
Readkey, 431
Readkey, 823
ReadLn, 89, 575, 1069
real, 66
recursin mutua, 653
recursivida, 620, 654
contra, 654
indirecta, 637
naturaleza, 620

Indice
pros, 654
seguimiento, 629-631
sntesis, 628, 654
recursivo
funciones, 621-625
procedimientos, 625-628
recursos abstractos, 26
redirecciones, 579
refiamiento sucesivo, 196
registro, 515
acceso, 518
array, 531
anidado, 521-527
jerrquico, 521
operaciones, 518
parmetros, 527-531
tipo de dato, 516
variable, 517
variante, 534-543
With, 520
release, 704, 705
repeat, 149, 161, 163, 177-179, 184
repetir, 161
reset, 574, 585, 604
resolucin de problemas, 14
reusabilidad, 890
reutilizacin, 858, 890
rewrite, 574, 585, 604
Round, 252
salida, 2
Seek, 588
Self, 930
sentencia
asignaicn, 77, 1027
break, 174. 175
case, 131
compuesta, 120, 1027
continu, 174
de control incondicional, 174
else, 131
estructurada, 76
exit, 174
for, 174-175
halt, 174
if, 14
mltiple, 1028
repeat, 174-175
repetitiva, 1028-1029
selectiva, 1028
simples, 76
while, 174-175
set, 323
SetDate, 93-94, 816
SetFAttr, 817
SetFTime, 817
SetlntVec, 81.8

SetTime, 93, 818


Sin, 257-258
Sistema operativo, 10
sobrecarga, 898
softwre, 438
calidad, 442
ciclo de vida, 443
crisis, 440
solapamiento, 791, 794
sonido, 434
Sound, 435
Sqr, 256
Sqrt, 256
Stack, 661
Stepwise, 196
Str, 392
StrCat, 403, 826
StrComp, 403, 826
StrCopy, 403, 826
StrDispose, 403, 826
StrECopy, 404, 826
StrEnd, 404, 827
StrIComp, 424, 827
String, 380, 825
StrLCat, 404, 827
StrLComp, 404, 827
StrLCopy, 404, 827
StrLen, 404, 827
StrLIComp, 405, 828
StrLower, 405, 828
StrMove, 405, 828
StrNew, 405, 828
StrPas, 405, 828
StrPCopy, 406, 828
StrPas, 405, 828
StrPos, 406, 829
StrRScan, 406, 829
StrScan, 406, 829
StrUpper, 406, 829
subclase, 919
subprograma, 195-198
recursivo, 633
subrango, 294-297, 302
Succ, 262, 264, 305
Swap, 266
tabla, 352
TAD, 834, 849
teclado, 3, 39, 430
teclas de edicin, 1042
teclas de funcin, 39, 963
terminal, 3
tecnologas de objetos, 864
testing, 474
tiempo, 434
tipos abstractos de datos, 834, 849
estructura, 849

en Turbo Pascal, 851


implementacin, 850
pila, 853
tipos de datos, 62, 845, 1022, 1062
cadena, 71, 1024
carcter, 69
clasificacin, 62
compatibilidad, 364
compatibles, 1067
conversin, 364
definicin, 1062
definiciones, 290
definidos por el usuario, 70
enumerados, 290, 297, 1022
lgicos, 70, 126, 293
objeto, 1025
ordinales, 291
procedimiento, 280, 1023, 1025
procedure, 278
registro, 1024
simples, 1022, 1062
subrango, 291, 294
variables lgicas, 126
tipos de errores, 998
TO, 864
Torres de Hanoi, 650-653
tratamiento de errores, 1008-1009
Trunc, 252
Turbo Pascal, 30, 33, 39, 1019
arranque, 41
entorno de programacin, 38
instalacin, 36
salida, 41
type, 335, 516
UCP, 2, 7
unidad estndar, 57, 805, 1021
Crt, 805
DOS, 808
funciones, 811
procedimientos, 811
tipos, 809
variables, 809
Printer, 806
variables, 807
System, 806
uses, 805
unidad, 402, 770, 805
aritmtico lgica, 7
declaracin, 57
cabecera, 771, 772
compilacin, 776, 791
concepto, 771
construccin, 778
creacin, 774 <
Crt, 414, 783, 819
archivos, 819

1093

1094

Programacin en Turbo/Borland PascaI 7

constantes, 416, 820


funciones, 416, 821
procedimientos, 416, 821
tipos, 820
variables, 416, 820
declaracin, 779
definicin de un objeto, 915
Dos, 784
estndar, 779
estructura, 771, 775, 789
excepciones, 791
Graph, 786
identificador, 788
implementacin, 771-772
iniciacin, 771, 774
initialization, 771
interface, 772
interfaz, 772
Overlay, 795
Printer, 785
sintaxis, 796, 1021
sntesis, 789
Strings, 771, 825
System, 783
Turbo3, 830
uso circular, 781
uso, 779
utilizacin, 782
ventajas, 774
unit, 771
UnpackTime, 818
until. 162, 177-179

Upcase, 393
uses, 771, 780
usuario, 478
manual. 478
Val, 392
valores lgicos, 127
false, 127
falso, 127
true, 127
verdadero, 127
var, 74, 210
variable, 73, 1023
absoluta, 1023
declaracin, 1023
global. 218-221, 870
local, 218-221, 870
lgicas, 113
predefinidas, 1023
ventana, 42-45, 423
verificacin, 45
virtual, 900, 935

while, 149-152, 161, 163, 183


WhereX, 427
WhereY, 427
Window, 423
Wirth, 54, 332
Write, 85, 575, 1069
WriteLn, 84, 1069

También podría gustarte