Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Programacin en
Turbo/Borland Pascal 7
3.a edicin
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
CONTENIDO
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
55
58
61
62
71
73
75
vi i
"
Captulo 4
77
79
83
90
94
95
99
103
103
107
109
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
195
198
199
206
218
221
222
230
Contenido
x
232
239
241
243
243
247
Captulo 7.
249
7.1.
7.2.
7.3.
7.4.
7.5.
7.6.
7.7.
7.8.
7.9.
7.10.
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)
278
281
281
282
285
288
290
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.
332
333
333
334
341
345
348
349
350
351
Contenido
Capitulo 10.
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.
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
438
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
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
516
520
521
527
531
534
543
544
547
552
556
Archivos
564
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
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
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
680
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
20.6.
20.7.
20.8.
Captulo 21.
771
771
774
782
786
788
789
791
Unidades estndar
805
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.
834
835
838
840
843
845
846
849
851
854
838
859
863
864
Captulo 23.
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.
904
905
912
915
917
925
926
935
942
XV
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
xvi
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.
xvii
XVii
Programacin
en Turbo/Borland
Pascal 7
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.
y tercera edicin
xix
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
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-
xxi
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 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
1.1.
y a la programacin
UCP (Procesador)
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)
1.2.
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.
' En Espaa est muy extendido el trmino ordenador para referirse a la traduccin de la palabra inglesa
computer.
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
1.2.2.
y a la programacin
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 .
Figura 1 . 5 .
C o m p u t a d o r a porttil digital.
y a la programacin
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
1.2.3.
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.
Memoria
central
Unidad de
control
Programa
Datos de
entrada
Datos de
salida
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.
3
2
1
0
Figura 1 . 6 . Memoria central d e una c o m p u t a d o r a .
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
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.
Figura 1 . 8 .
Figura 1 . 9 .
C o m p u t a d o r a multimedia.
10
1.3.
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.
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 .
12
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 .
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 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.
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.
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 )
1.4.3.
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 ' )
1.5.
y a la programacin
15
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)
1 6
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 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
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 .
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
Figura 1 . 1 6 .
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
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
Figura 1 . 1 8 .
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
y a la programacin
23
1.5,5.
Memoria
externa
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 .
24
orden, mientras que los compiladores clsicos de Pascal siguen un proceso similar al
expuesto anteriormente: compilar, enlazar y ejecutar.
1.5.6.
1.5.7.
1.6.
y a la programacin
25
PROGRAMACION MODULAR
Documentacin y mantenimiento
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
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:
1.7.2.
y a la programacin
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:
1.7.1.
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
1.7.3.
Estructuras de control
1.7.4.
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).
1.8.
y a la programacin
29
1.8.1.
Pascal
30
1.8.2.
Turbo Pascal
y a la programacin
31
Cdigo m q u i n a .
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.
y c.
RESUMEN
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:
EJERCICIOS
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)
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
CAPITULO
EL ENTORNO DE PROGRAMACION
TURBO PASCAL: COMENZANDO
LA PROGRAMACION
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
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
El entorno de programacin
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
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
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
Prestaciones
.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.
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)
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.
2.3.
El entorno
de programacin
la programacin
37
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.
38
El entorno de programacin
2.4.1.
C:\TURB0
C:\TURBO\inclu
archivos de inclusin
C:\TURBO\exe
programas compilados
C:\TURBO\unidades
C:\TURB0\obj
39
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:
2.5.1.
A a d a e s t a l n e a al a r c h i v o CONFIG.SYS:
FILES = 20
PATH=C:\TP
CTRL
ALT
Tecla de escape:
Tecla de maysculas:
ESC
SHIFT (Mays)
FI-FIO/FI 1/F12
C:\TP;).
Teclas
Nota
( uando
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
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
41
2.5.3.
c : > tpx
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\
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.
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.
El entorno de programacin
42
|2Qj
Edit
Search
Run
Compile
Debug Tools
NONAMEOO.PAS
Options
Window
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.
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 .
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.
2.6.1.
y la
La barra de mens
Ventanas
File
Edit
Search
Run
Compile
Tools
Debug
Options
Window
Help
44
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
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.
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).
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
2.6.6.
Las operaciones tpicas que se realizarn en las ventanas se reflejan en la Tabla 2.1.
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
Debug
Tools
Options
Window
47
Help
F3
F2
Change d i r . . .
Print
Printer setup
DOS shell
Exit
Al t+X
LOS MENUS
1:1
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.
F5-Zoom
F6-Switch
F7-Trace
F8-Step
F9-Make
FlO-Menu
F2-Save
F3-0pen
Alt+F9 Compile
F9-Make
Alt+FlOMenu
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 ) .
2.7.2.
2.7.3.
Ayudas interactivas
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
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).
50
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:
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
la programacin
51
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.
2.11.
EJECUCION (RUN)
El entorno de programacin
52
a t < segmento>
: <offset>
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.
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
TRATAMIENTO DE ARCHIVOS
EN LA VENTANA DE EDICION
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.
Abrir archivos
ALT-F
(se selecciona
Administracin d e a r c h i v o s
Descripcin
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
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
54
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
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)
Formato
uses
lista de idenjicadores;
lista de identijicadores
Ejemplo
Regla
Todo objeto referenciado
en un programa
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.
3.1.1.
57
La s e n t e n c i a p r o g r a m
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
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
3.2.1.
Identificadores
y minsculas
type
i nteger = char;
Identificadores
vlidos
Nombre
Letrasl
Cont
PesetasKilo
Impuesto_IVA
Impuesto_IRPF
ImpuestosTotales
ImpuestoBebidas
CANTIDAD
cantidad
Palabras reservadas
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:
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
Letras
3.2.
SalarioBruto
Salario_Bruto
Salario_Neto
Fox&Horas
F Bar
La@Luna
begi n
Eleccin
59
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
introduccin
3.2.3.
Etiquetas
Notas
{ }
o bien
>
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.
3.2.4.
a Pascal
'Luis'
'Principio'
Ejemplos
i$B+j
{$F+
'Carchelejo (Jan)'
j$I+{
{$I-j
{$IFOPT N+
ENDIFj
Identificadores estndar
integer
Read
byte
procedimientos
write
WriteLn
ReadLn
reset
read
junciones
sin
eos
ord
chr
eoln
3.2.6.
Lneas de programa
3.2.7.
Directivas de compilacin
3.3.
DIAGRAMAS DE SINTAXIS
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 $
62
Introduccin
a 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.
Tipo ordinal
Tipo real
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.
Tipos ordinales
definidos
por el usuario
integer
char
. boolean
enumerados
subrango
63
64
Introduccin a Pascal
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 ) .
3.4.2.
Tipos enteros
-32768 . . 32767
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.
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)
bit de signo
Error 7 6 : Constant out of range
Word
{.2 bytes)
Integer
(2 bytes)
Formato
Rango
0
-32768
-217483648
-128
0
.. 255
.. 32767
..2147483647
.. 127
.. 65535
8
16
32
8
16
(4 bytes)
Longnt
byte
66
Introduccin a Pascal
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.
y expo-
exponente:
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
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
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
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
68
Computadoras
sin coprocesador
Introduccin a Pascal
matemtico
(emulacin
por software)
Reglas
con coprocesador
69
matemtico
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.
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
$E+
$E_
equivale a
chr (65)
7O
Programacin
en Turbo/Borland Pascal 7
Introduccin
3.4.7.
a Pascal
71
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
# 13
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.
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
definidos
3.5.
CONSTANTES
literales
con nombres o declaradas
expresin (slo en la versin 5.0)
de tipos (tipeadas)
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.
3.5.1.
Constantes literales
U n a constante
72
Introduccin a Pascal
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
^
= expresin;
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;
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
74
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.
Todas las variables de un programa Pascal deben ser declaradas antes de ser utilizadas
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 (*, *).
Declaraciones
Diagrama
var
listavarl
listavarl
listavarN
listavarl
tipol
-(
tipol;
. tipol;
de sintaxis
" '
NumeroCodigo
Horas
Tasa
Salario
Nombre
o - c
tipo de datos
j1*^^)
tipoN
Variable
identificador
Valor
6714321
14
12
343421
'Luis Garca Garca'
3.7.
SENTENCIAS
76
3.8.
77
LA SENTENCIA DE ASIGNACION
Sentencias simples
variable
*- expresin
En Pascal el o p e r a d o r
de asignacin.
variable
:= expresin
El valor de expresin
Diagrama
se asigna a la variable.
de sintaxis
Sentencias estructuradas
variable
<E>/
./
expresin
Precaucin
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
Introduccin a Pascal
79
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 .
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
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
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'
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.
x es una variable
Lrror
3.9.
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
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
3.9.2.
81
=3.5
=3.5
=3.5
= 3.5
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
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:
U n a expresin
7 div 2 = 3
es
es
es
es
es
no
es
es
es
es
es
(A + B) / C
82
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
3.5 + 5.09
7. Evaluar
14.0/4.0
3.5 + 5.09
8.59 - 3.5
5.09
3.5
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
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)
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)
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
leer (v, z, x)
escribir (a, b, c)
84
Introduccin a Pascal
3.10.1.
de entrada
de salida
Read
Write
Ejemplos
Sentencias
WriteLn
WriteLn
WriteLn
WriteLn
WriteLn
WriteLn
WriteLn
ReadLn
WriteLn
Resultados
A := 1; B := 2; C :=3;
Nombre := 'Luis';
WriteLn (A, B, C) ;
WriteLn ('A', ' ' , 'B1, ' ' ,
'C '
WriteLn ('Hola
Nombre);
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
Formato
Supongamos
mente.
que Numl,
Num2
y Num3
tienen
los valores
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.
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
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
Introduccin a Pascal
Formato
Formato
Diagrama
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...);
Ejemplos
x := 5.265;
WriteLn (X:8:4);
WriteLn (X:8:2);
X := 14
WriteLn (X:3);
WriteLn ('A':4);
Uso de WriteLn
WriteLn (x);
produce
produce
produce
produce
5.2650
5.26
14
La ejecucin de
visualiza
WriteLn;
5 . 3254000000E+02
Diferencias
entre
Write y WriteLn
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
Formato
Salida impresora
:1
2
3
'MUSA'
'MUSA1
'MUSA'
'MUSA'
'MUSA'
2
3
4
5
M
MU
MUS
MUSA
MUSA
88
3.10.2.
Introduccin a Pascal
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.
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
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
var
ReadLn (Nombre);
ReadLn (Horas);
ReadLn (Tasas)
90
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
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 }
3.11.
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
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.
GotoXY (x, V)
3.11.1.
x v
92
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, '
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
3.11.3.
segundos,
Ejemplo
Medicin de tiempos
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 ) .
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
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.
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
Ejemplo 3 . 3
Calcular
la suma y diferencia
de dos nmeros
Ejemplo 3 . 2
Escribir
un segmento
ele programa
de una persona,
i, j : integer;
begin
das y el salario/hora.
Write
ReadLn
Write
ReadLn
Write
ReadLn
('Introduzca un nombre');
(Nombre);
('Introduzca horas trabajadas' ) ;
(Horas);
('Introduzca salario hora');
(SalarioHora
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
'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
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.
A := B-C
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;
{
{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
*)
{
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
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
:=
>=
=
>
Horas * SalarioHoras;
10000;
'Mortimer';
30000;
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.14.
1 00
Introduccin a Pascal
3.14.1.
por un programa
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;
.1
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 ;)
3.14.3.
Estilo de programacin
1 02
Introduccin a Pascal
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
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
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
Introduccin a Pascal
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)
,
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
X+-
>nn
c)
(x + y)2 (a-b)
85 Nombre
AAAAAAAAAAA
Nombre_Apellidos
Sal do-Actual
92
Universidad P o n t i f i c i a
Set 15
* 143Edad
y
y
A := ' B'
A := ' 7 '
b)
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
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 = /
ae - bd
a f - cd
v=
'
ae~ bd
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.
108
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
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
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
109
110
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
booleanas)'.
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
>
expresin
6.7315 > 6.7342
-124.2 < 0.003
8 = 8.0
o falso.
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
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
>
<
' 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.
113
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
Const
Operador
Prioridad
Error = True;
1.
2.
3.
4.
V
II
A
Jl
1!
+, -
Ejemplo 4.1
mente,
Condicin
Orden de evaluacin
Si Numl
Operador
y Num2
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.
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
Valor verdadero
Ejemplo 4 . 2
[operando
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
114
a) Operador a n d
Operando 1
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
c) Operador n o t
Operando 1
n o t Operando 1
Verdadero
Falso
Falso
Verdadero
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
not
Operando 1
Prioridad
de operadores
lgicos
1. not
2. and
3. or
* , / , d i v , mod, and
+,
<
<=
/ = ,
<
> ,
> = ,
>
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
or
/
el anlisis
de la siguiente
expresin
lgica.
116
Estructuras
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 )
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)
T
a)
f expresin lgica
then
sentencia A
else
sentencia B
c)
Figura 4 . 1 .
d)
118
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
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:
de sintaxis
4.2.1.
Sangrado (ndentacin)
4.2.2.
if
condicin
then
sentencia
if condicin then
sentencia
if condicin
then sentencia
1 20
4.2.3.
Sentencias compuestas
var
A, B, Aux : integer;
begin
ReadLn (A, B);
if A > B
then
begin
Aux := A;
A
B
end;
begin
sentencia
sentencia
sentencia
end
1;
2:
n
begin
Read(Numero);
N:=N+1;
Write('el numero es',Numero:4);
Bandera:=1
end
Seguimiento
si un nmero
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
es positivo ' )
4.2.4.
(X, 1 es negativo1);
( 'o bien es cero1 )
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
(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
123
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
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
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;
1 24
Parte de la sentencia
if x> 0
then...
else if < 0
then TotalNeg := TotalNeg+1
else
-5>0
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
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.
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
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
127
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.
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;
then
SW := true
else
sw := false
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
4.4.3.
false
if
then
Casado := true
else
Casado := false
es falso.
N:=5
X:= (N> 10) or (N<0)
false
4.4.4.
1 28
4.4.5.
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
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.
4.4.7.
Aritmtica lgica
130
131
y en expresin Pascal
tienen s i e m p r e el m i s m o valor.
4.5.
LA SENTENCIA CASE
1: sentencia
2: sentencia
1;
2;
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\
Reglas:
132
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 ('*');
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
'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
end
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:
135
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
136
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
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);
1. Los parntesis
subexpresiones
indicar
las
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)
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
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:
');
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.
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)
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
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
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.
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 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
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
1:45 PM
El programa pedir al usuario que introduzca exactamente cinco caracteres. As, por ejemplo,
las nueve en punto se introduce como
09:00
7. Escribir un programa que acepte fechas escritas de modo usual y las visualice como tres
nmeros. Por ejemplo, la entrada
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
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).
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;
Ejemplo 5 . 1
Algoritmo
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
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)
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.
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
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;
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
154
Programacin
en Turbo/Borland
Pascal 7
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.
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
{variable incorrecta}
5.4.
156
Programacin
en Turbo/Borland
Estructuras
Pascal 7
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
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
-1
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
while
while
while
while
while
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
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
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
'
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
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
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
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.
Bucles REPEAT
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
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;
<
> =
<=
>
>
< =
<=
5.7.
>
< >
< >
LA SENTENCIA FOR
5.7.1.
Incrementos de contador de f o r ( t o )
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)
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
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
^ 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.
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
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
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
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.
>
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 }
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
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
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
5.8.
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
repetir
-fin_mientras
hasta_que condicin 1
5.8.2.
-fin_nri entras
-hasta_que condicin 2
-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
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
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
La ejecucin producir:
J
5.9.
1
i
1
2
2
2
io
ii
12
10
11
12
10
11
12
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- )
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;
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.
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
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;
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 }
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:
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
{ 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.
0.2
0.4
5.12.1.
0.6
0.8
1.0
1.2
1.4
182
Programacin
en Turbo/Borland
Estructuras
Pascal 7
Saldo o
0.0 do
de control
repetitivas
183
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
: 5);
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;
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.
2.
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
Sentencia repeat
24
23
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)
1
1+
2
1
1
+ ++
3
n
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
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.
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
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.
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
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)
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
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
**
CAPITULO _.
LA PROGRAMACION MODULAR
CONTENIDO
6.1.
6.2.
6.3.
6.4.
6.5.
6.6.
6.7.
6.8.
6.9.
6.10.
6.11.
RESUMEN
EJERCICIOS
PROBLEMAS
6.1.
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.
Problema 6.1
su superficie y longitud.
Anlisis
Especificaciones de entrada
Radio:
Ejemplo 6.1
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
Superficie:
Longitud:
1.
2.
3.
4.
general
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
6.3.1.
Declararon de un procedimiento
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;
Formato
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.
201
nombreproc
Formato 2
nombreproc (lisia parmetros
modular
actuales)
procedure
'
1
function
11
1
1
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;
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 ***************
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
* 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.
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.
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
Salidas
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.
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)
**
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-
sin parmetros
Parmetros
modular
con parmetros
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)
de un rectngulo, calcula el
obtenidos al programa prin-
6.4.1.
28.00
22.00
Correspondencia de parmetros
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;
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
(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
program FC;
{Este programa transforma grados Fahrenheit en Celsius}
var
Fahr
: real;
Celsius : real;
parmetros
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.
Ejemplo 6 . 5
Escribir
sius.
un programa
211
Codificacin
parmetros valor
modular
Pascal
que convierta
temperaturas
en grados
Fahrenheit
a Cel-
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
con un procedimiento.
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.
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.
Ejemplos
program Test;
var
x, y : real;
p
: integer;
Aux : char;
de llamada vlidas
de llamada no vlida
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)
var X,Y: r e a l ) ;
Ejecucin
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.
215
Programa
modular
x,y
Mas c o o r d e n a d a s
0
6.4.4.
: 0 = No, 1 = S i ?
Parmetros
v a d a var.
Parmetros
tipo.
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
abiertos.
Se cla-
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.
6.4.5.
217
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
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
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.
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;
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
219
220
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');
program CalculoTres;
var
X,Y,Grande : real;
procedure Mayor( A,B : real; var Max : real);
begin
if A > B
then
Max := A
EFECTOS LATERALES
begin
repeat
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.
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
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
6.7.
Proc2
Cuerpo
Figura 6 . 6 . Un b l o q u e .
224
La programacin modular
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
226
La programacin modular
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
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]
6.7.2.
-Ambito
-Ambito
de w
var p, q : i n t e g e r ;
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
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
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(
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
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
LA DECLARACIN FORWARD
231
end;
{Uno}
Uno (b)
end;
end
procedure Dos;
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
{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.
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
Salida
: Saldolnicial
PROCESO
Entrada
Salida
: Saldolnicial
: SaldoActual,
INFORME
Entrada
: Saldolnicial,
Ingresos,
Pagos
SaldoActual,
Ingresos,
Pagos
"234
La programacin modular
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:
ACTUALIZAR
LEER
LEER
parmetros
de salida
TipoOper
Cantidad
ACTUALIZAR
parmetros de entrada
TipoOper
Cantidad
parmetros de entrada/salida
SaldoActual
Ingresos
Pagos
{programa principal}
235
Algoritmo
PROCESO (segundo
refinamiento)
236
La programacin modular
237
program ControlCuenta;
uses
Crt;
var
Saldolnicial, SaldoActual : real;
Ingresos, Pagos : integer;
LEER
ACTUALIZAR
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
:
:
:
:
239
begin
{programa principal}
S_inicial (Saldolnicial);
Proceso (Saldolnicial, SaldoActual, Ingresos, Pagos);
Informe (Saldolnicial, SaldoActual, Ingresos, Pagos)
end. {Programa principal;
char;
real;
real;
Integer);
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)
en cuenta');
',Inicial:8:0);
',Actual :8:0);
',
Ing :5);
Pag :5);
-40000
110000
Saldo inicial:
100000
Saldo final:
-40000
Numero de ingresos realizados:
1
Numero de pagos realizados:
1
6.10.
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
6.11.
241
6.11.1.
Tcnicas de programacin
Ejemplo
Este procedimiento se ha grabado en disco con el nombre DEMO.PAS.
procedure Demo;
begin
WriteLn ('prueba de incluir archivos')
end;
6.11.2.
begin
Demo
end.
Mayor (Numero,4.75)
242
La programacin modular
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.
EJERCICIOS
1. P R O C es un procedimiento. Puede aparecer la siguiente sentencia en el programa principal?
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
PROC ( ' A 1 , B)
var y : b o o l e a n ) ;
La programacin modular
245
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?
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
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?
h) Puede B llamar a E?
i) Puede C llamar a B?
B
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}
246
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;
program Test_Uno;
var
a, b, c : integer;
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)
247
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
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
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.
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
(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.
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
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
252
Ejemplos
Trunc (Truncamiento)
Formato
T r u n c (x)
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 *
(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.
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.
Formato
Ejemplos
R o u n d (x)
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
253
Abs
Abs
Abs
Abs
(-64)
(128)
(3.97)
(-4.25)
{devuelve
{devuelve
{devuelve
{devuelve
254
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)
Ejemplo
x
equivale a
ea'5
o bien a
2.718282 4
Ejemplo
Ln
Frac (28.44894)
devuelve 0 . 4 4 8 9 4 j
Int
Formato
Formato
Int (x)
Ln (x) es la inversa
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]
Frac (x) = x - I n t ( x ) .
7.3.3.
Exp
Ln
Potencias
Raz cuadrada
[7.1]
Sqr
Sqrt
Exp
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
Ejemplo 7.1
257
Calcular 74 25
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
Sqr (x)
Sqrt (x)
FUNCIONES TRIGONOMETRICAS
ATN
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).
{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
S i s t e m a angular s e x a g e s i m a l .
258
259
271
2 * 3 141592
I o = -=- radianes =
' 1
=0.0174533
360
360
360
1 radin = =
= 57.2958
2ti
2*3.141592
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
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) =
eos
(x)
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 .
v =
COS (Angulo) = ~
7.4.3.
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
Formato
end;
Problema 7 . 2
Escribir un programa que permita calcular el seno y el coseno de un ngulo expresado en
radianes.
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.
v = A r c T a n (x)
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
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
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
261
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
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
sabado);
es 6
es 1
es 2
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:
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)
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
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))
devuelve
devuelve
'a'
'p'
chr (12 7)
Chr (8)
264
265
Ejemplo 7 . 3
7.6.1.
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;
= >?
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
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.
7.7.
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
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)
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}
L o (x)
267
var2 := Lo ($5F3F)
Bit
AX
AX
AX
l
67
0
189
=
=
=
=
$01;
Bit;
Swap (AX);
AX + Mascara;
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.
S w a p (x)
x
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
Formatos
Dec (x [,n])
7.9.
(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
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 ) ;
NUMEROS ALEATORIOS
7.9.1.
Funcin Random
deno-
Formato
R a n d o m [ ()]
n
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
Ejemplos
7.9.2.
271
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
Random * 1 0 0 + 1
genera un nmero
R a n d o m (M) + N
genera un nmero
inclusive.
entero aleatorio
. . .
. ..
entre N y M + N = 1, ambos
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
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
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
{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.
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)
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
Programacin
en Turbo/Borland
Pascal 7
Funciones estndar
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
end
{Max3}
real) : integer;
parametro X: 1, 0 -1 para positivo, cero
:= 1;
:= 0;
:= -1;
Signo
tangente (x) =
seno (x)
coseno (x)
7.10.1.
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
(lista de parmetros
Ejemplos
Cuadrado (x)
Max3 (a, b, c)
WriteLn (Cuadrado (x))
actuales)
276
7.10.2.
Reglas
277
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.
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
{programa}
T := Cubo (3);
Ejemplo 7 . 9
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.
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.
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
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)
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
Igual
Igual
begin
Aux
A
B
:= A ;
: = B;
:= Aux
(Vector))
(integer) * N)
(integer) * 5)
: integer);
function Tan
(Angulo
begin
Tan
(Angulo) / Cos
:= Sin
:real)
: real;
(Angulo)
end.
= function
(var X, Y
(X
: real)
: integer);
: real;
: IntercambioProc;
: FunMat
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
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
: FunMat)
: real;
:= I n t e r c a m b i o ;
:= T a n ;
Las llamadas
p
(i, J)
(x)
280
son equivalentes a
Intercambio (I, J)
Ejecucin
Tan (x)
7.12.
7.11.1.
281
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
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
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
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;
283
');
284
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
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
0.0000
0.2553
0.5463
0.9316
1.5574
3.0096
14.1014
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
285
tan (Angulo)');
============');
Angulo := Inferior;
while Angulo <= Superior do
begin
WriteLn (Angulo :5 :2, Tan (Angulo):14:4);
Angulo
:= Angulo + Incremento
end
end.
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)
)
286
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
{PotenciaDos}
Llamar
Llamar
Llamar
Llamar
Llamar
Llamar
288
289
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)
m\
( 1
d o n d e m\ = l
| 1.2.3...m
t,
r
n\(m - n)\
donde
p =
a + b + c
siw<0
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
+ 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
8
CAPITULO
291
8.2.
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
8.1.
DEFINICIONES DE TIPOS
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
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
2. tipos char
Los caracteres se pueden disponer de muchas formas, pero existe una, el cdigo
ASCII, que todos cumplen.
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)
verdaderas
'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.
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
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
N o existe un
N o existe un
U n d a t o real
es el sucesor
295
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';
8.3.
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
Ejemplos
1.
1..10
2.
F',.111
3.
4.
'0'..191
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;
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
8.3.2.
Verificacin de errores
296
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.
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
Ambigedad
De igual forma, las variables pueden ser de tipo enumerado. As, por ejemplo, se puede
declarar
var
Clase
Postre
Fecha
Trabajo
Lengua
:
:
:
:
:
Vehiculos;
Frutas;
Dias;
DiasLaborables;
Lenguajes;
type
8.3.4.
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;
298
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
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')
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.
2.
3.
4.
8,4.1.
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
300
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 =
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
('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;
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)
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 =
var
Marca
: Automovil;
a?
302
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
:= 0.20;
:= 0.15;
:= 0.30
Trabajo
:= S a b a d o ;
end;
Procedimientos
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
: Arcolris;
type
:= A m a r i l l o ;
:= M o r a d o
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;
(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)
:= M i e r c o l e s ;
se visualizar 'Verde'
(Verde)
304
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')
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.
(x)
Ejemplos
Ord
Ord
Ord
Ord
(bastos)=3
( c o p a s ) = 2 , Ord
PredySucc
Ord
Ord
devuelve cero
devuelve uno
devuelve -5
es cero
devuelve 25
Lunes
\)
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
306
8.5.3.
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.
2.
es verdadera
es verdadera
es verdadera
Ejemplo 8 . 2
Escribir una funcin para convertir el carcter de un dgito a su correspondiente entero.
97
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
Algoritmo
chr (ord (Carcter)) - Carcter
Ord (Chr (S umem)) = Nmero
1.
2.
3.
4.
5.
6.
7.
Ejemplos
Chr (Ord ( ' a ' ) )
Ord (Chr ( 5 7 ) )
devuelve
a
devuelve el nmero
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:
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
: char) : integer;
308
309
Los operandos que son de tipo compatibles pueden ser manipulados por los mismos
operadores.
OtroCaracter o
OtroCaracter o
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.
Ejemplo
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.
8.6.
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;
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
Ejemplos de conjuntos
vlidos
[1,4,7]
[1 . . 3, 9 . . 12]
[]
[i+1 . . j1,4,15]
[' A1, B,' D1 .. ' G' ]
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;
Adems de las constantes tipo conjunto es posible declarar o definir variables tipo conjunto.
Primos
Formato
type
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
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.
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 := [ ]
Ejemplo 8 . 3
Se dispone de la declaracin
type
Letras = set of 'A'..'Z';
var
Maysculas : Letras;
Maysculas := ['A',
'E', 'I',
'O',
'U']
312
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.
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.
Tabla 8 . 2 .
Operacin
Unin
Notacin
algebraica
Notacin
Pascal
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
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;
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
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 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.
Tabla 8 . 4 .
[2,3,4,5,7]
Operador
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
< =
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
> =
Superconjunto
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 )
..
'N 1 ]
2. La expresin lgica
((ch >= ' a ' )
and (ch <= ' z ' ) ) o r ((ch >= ' A ' ) and (ch <= ' z ' ) )
..
'z',
'A'
..
Z1]
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
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;
8.8.2.
Lectura de conjuntos
317
Reglas
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
Ejemplo
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
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
8.8.4.
11
13
17
19
23
25
11
13
17
19
23
321
11
(var C
{ los N m e r o s que p e r m a n e c e n en
var
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;
: 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}
:= 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
Pares, Impares sern parmetros por variable que contendrn los nmeros pares e impares que se devolvern al programa principal.
procedure ConstruirConjuntos
var
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;
[0..Limite] - Impares
end;
Write
WriteLn
end;
{LeerLetras}
(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.
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;
(var L e t r a s
Centinela =
var
CarSiguiente
begin
{salida}
{caracter de
: char;
: ConjuntoLetras);
{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
3. Una vez que un tipo conjunto ha sido definido, podemos definir una variable
conjunto.
: ConjuntoLetras
' 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',
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]
S'];
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
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
(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
var
Car : Char;
begin
Assign
(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
end;
p r o c e d u r e Resultado
begin
(Cont_Vocal : Contadores);
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}
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]
8.10.3.
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];
328
8.11.
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]
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);
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
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
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)
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-
$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.
CAPITULO
INTRODUCCION A LAS
ESTRUCTURAS DE DATOS:
ARRAYS
9.1.
333
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.
RESUMEN
PROBLEMAS RESUELTOS
EJERCICIOS
PROBLEMAS
' 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)
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]
334
335
Artculo [l]
Artculo [2]
Artculo [3]
(vectores o listas)
(tablas o matrices)
contenido
(valor)
Artculo [20] -
9.3.
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
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
Ejemplo 9 . 3
337
Las variables tipo arrays son creadas utilizando la declaracin var, cuyo formato general es:
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
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]
Salarios ['J1 ]
9.3.2.
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
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;
[1]
[2]
[3]
[4]
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;
=
=
=
=
'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;
340
9.4.
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;
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]);
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
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);
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.
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
: ',Frecuencia
end.
Ejecucin
Introduzca una Linea de texto
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]
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
', Media:3:1);
{ frecuencia de letras
: CuentaCaracteres;
Caracter
: char;
begin
{Inicializar todas las frecuencias de letras a cero }
: ListaCalificaciones;
: integer;
: real;
program FrecuenciaLetras;
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
type
ListaReal = array
var
Alfa, Beta
[1..5] of real;
: ListaReal;
344
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
=
=
=
=
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;
:= 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
}
}
}
}
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
346
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
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
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 ) .
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.
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
dc^de el pmwnmta
principal
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;
348
procedure EscribirVector
(var X : Vector);
var
J : 1. . N;
begin
for J := 1 to N do
WriteLn
(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;
{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
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
Algoritmo Mximo
procedure Demo
9.7.
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
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
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
Ejemplo
const
Mximo
type
{+$R}
VentasAnuales
Indice
ListaUna
ListaDos
ListaTres
var
Cantidad
Nombre
[1992] := 1495
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;
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:
352
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;
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=
2. type
identifcador=
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.
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;
2
3
9.10.
353
3.
type
Estudiantes = array
var
Clase
: Estudiantes;
354
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
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
A[1,1]
-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
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)
Por columnas
for Columna := 1 to 4 do
for Fila := 1 t o 3 do
ReadLn
( A
[Fila, Columna]);
34
24
Las sentencias while anidadas se pueden utilizar tambin en lugar de las sentencias
for para los bucles de entrada.
356
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;
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);
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]
Ejemplo 9 . 7
Problema 9 . 5
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
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
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
Turbo Pascal no limita el nmero de dimensiones de un array, pero s que debe estar
declarado el tipo de cada subndice.
Formato
1. type
( Medias_A
[A]:3:2,'
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:
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.
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;
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
=
=
=
=
=
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
[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
: 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
esto hace que Vuelo sea un array de cuatro dimensiones de enteros o un array de tres
dimensiones de InfoVuelo.
Ejemplo 9 . 8
: = 0;
:= c + V u e l o
[Ciudad,Reserva]
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;
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
9.12.
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;
:
:
:
:
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
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
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));
M[l,2]= 2
M[2,l]= 3
M[2,2]= 4
366
4. const
Reticulado : array [1.-4,1.-3] of integer =
((1,4,8), (3,1,5), (10,12,15), (1,0,0));
367
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.
Para utilizar parmetros arrays abiertos se necesita emplear la directiva de compilacin {$P+}.
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
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
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);
: Real;
for i := 0 to High(A) do
S := S + A [i] ;
Suma := S;
end;
es:
: Integer;
9.15.
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.
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
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
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 +
end;
373
374
Visualizar
WriteLn
Visualizar
end.
Ejecucin
modelo
a =
1
4
7
2
5
8
3
6
9
b =
10
40
_70
20
50
80
30
60
90_
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
-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
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
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
378
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
"
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
379
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.
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.
10.1.
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
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.
10.2.
ReadLn
(nombre);
WriteLn
Nombre);
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
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
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
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
(MiCadena):=6;
esta sentencia establece la longitud lgica de la cadena a seis caracteres con independencia de lo que contena antes.
385
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
10.2.2.
:
:
:
:
string
string
string
string
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]
i n f o r ma t
1 2 3 4 5 6 7 8
'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
como ambas cadenas tienen igual longitud, cad4 contiene ahora la cadena 'informtita'.
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
c a d 4 : = cad2
10.2.3.
:=
longitud actual = 11
longitud mxima = 15
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 '
387
Formato
y de modo similar
Concat ( S i , S2,
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)
Si la cadena resultante es mayor que 255 caracteres, se truncan los caracteres despus
del 255.
Ejemplo s
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');
10.4.2,
10.4.
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
Ejemplo
Length ( ' e s t o e s una p r u e b a 1 )
Length('1)
proporciona
proporciona
el valor 16
cero ( c a d e n a vaca)
Nota
Tabla 10.1.
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]);
'
'
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.
El procedimiento Insertar ( i n s e r t )
Formato
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
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)
:=
: string
[18];
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.
390
10.4.5.
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
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.
Ejemplos
Ch
:= 'Esto es una cadena m u y
Ch2 := Copy (Ch, 1, 18);
Write (Ch2)
posicin de t
no existe la cadena seis
larga';
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
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
392
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)
393
Str
Este procedimiento efecta la conversin de un valor numrico en una cadena.
Formato
Reglas
expresin numrica
cadena
Para que las conversiones numricas sean vlidas, una cadena debe cumplir estas condicio-
Ejemplos
Numero := 486.45;
Str (Numero/ Ch);
W r i t e L n (Ch);
'43'
'-3.42'
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'
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
no valido
no \alido
Ejemplo
Upcase (' a')
Upcase (' n')
Upcase (' N')
devuelve
devuelve
devuelve
'A'
TV'
TV'
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\
var
Direccin
Letra
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;
10.5.
: string
: char;
: string
: char;
Direccin
:=
Letra
:= D i r e c c i n
10.5.1.
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 }
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]
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
10.5.3.
396
10.5.4.
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.
: 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
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;
[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
10.7.
integer;
'
o r
^or
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
: m
begin
1
if
DemoCadena
(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;
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 /
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 =
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
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
begin
S[0] := Chr(High(S));
FillChar (S[1] , High(S), Ch);
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
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
[0 . .x] of Char
402
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;
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
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
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
Pascal 7
StrECopy
405
StrLen
function StrECopy
function StrLen
Copia una cadena fuente en una destino, devolviendo un puntero al final de la cadena resultante.
( C a d : Pchar) : Word;
: ', StrLen
(s));
StrECopy(SI,S2 ) ;
StrLIComp
StrEnd
function StrEnd(Cad
function StrLIComp
: Pchar) : Pchar;
: Word)
: Integer;
:= StrLIComp(SI,S2,10);
StrLower
function StrIComp
function StrLower
: 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.
StrIComp
(S1,S2
(S : Pchar)
: Pchar;
:= 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;
StrLComp
:= StrMove(A,B,2);
StrNew
: 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;
: Pchar;
:= StrLComp(SI,S2,10) ;
function StrLCopy
: Pchar)
function StrPas
(Cad
: Pchar)
: String;
:= StrPas(Cad);
406
Programacin
en Turbo/Borland
Pascal 7
StrPCopy
407
RESUMEN
function
StrCopy
: S t r i n g ) : Pchar;
StrPos
f u n c t i o n StrPos(SI,S2
: Pchar) : Pchar;
:= 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,
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.
Comparacin
Concatenacin
Funciones de cadena
length
l e n g t h (cadena)
length ('cobre")
devuelve 5
408
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 ('abcdeP,3,2)
copy ('goles',2,10)
abxycd
devuelve 'cd'
devuelve 'oles'
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)
upcase ('a')
upcase ('A')
devuelve 'A'
devuelve 'A'
Procedimientos de cadena
delete
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
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
:=
:=
:=
:=
:=
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)
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
:=
:=
:=
:=
: 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 ?
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;
Cad2);
Cadena)
[I]);
411
412
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.
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.
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
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
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
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
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 .
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
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
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
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
: boolean;
: boolean;
: boolean;
41 8
D i r e c t V d e o : boolean;
LastMode
: word;
TexAttr
: byte;
WindMin
: word;
WindMax
: word;
11.2.3.
419
CheckBreak
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.
11.2.2.
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 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
11.3.
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.
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
420
11.3.2.
c i r S c r (Limpiar la pantalla)
Ejemplos
1.
Formato
Window
GotoXY
(1, 1);
2.
ClrScr
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.
InsLine
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
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
x,y
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.
422
11.3.7.
HighVideo
11.4.
423
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.
Ejemplo
uses
Crt;
begin
TextAttr := LightGray;
HighVideo
{ el color es ahora blanco }
end.
Aplicacin
TextCoior
(LightRed);
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
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)
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
: integer);
ClrScr;
W i n d o w (1,1,80,25)
end;
11.4.1.
424
WindMin
Wi ndMax
Ejemplos
TextMode (C40);
TextMode (BW80);
TextMode (Mono);
TextMode (last);
TextMode (C80);
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)
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
11.5.2.
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
'Vunu.'ro
0
1
2
3
7
256
TextColor (Color:
Parmetros Modo
Caracteres
40
40
80
80
80
Constantes
BW40
C040
BW80
C080
Mono//B/N 80 x 25
Font 8 x 8
Color
byte)\
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
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
Formato
Figura 11.1.
TextBackground ( C o l o r : byt)
expresin entera en el rango 0...7, correspondiente a una de las ocho primeras constantes de color
la sentencia GotoXY.
GotoXY (1,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
Formato
WhereX
(1);
('video inverso');
TextColor
WhereY
(Normal);
TextBackground
11.6.
WhereX
WhereY
(Black);
TextBackground
WriteLn
y WhereY.
(Black);
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.
428
11.7.
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;
I
j
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'):
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;
' )
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
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
11.8.
:= ch in ['S',
's']
11.8.1.
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
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
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
KeyPressed
Lock,
Alt,
Num-
etc.
Ejemplo
(Car = ESC);
uses
Crt;
begin
repeat
W r i t e ('$*');
u n t i l KeyPressed
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
Formato
#75
#77
#80
#0
#13
#7
#8
etc.
Nulo
Return ( I n t r o ) . E n t e r
Pitido (bip)
Retroceso
Ejemplo
Delay(600);
=
=
=
=
=
=
=
#0;
#13;
#7;
#72;
#80;
#77;
#75;
11.9.2.
Sound y NoSound
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.
11.9.1.
435
Delay
Word);
^ j
NoSound
Ejemplo
Sound(500);
NoSound;
Ejemplo 1 1 . 5
Demostracin
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
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
PROBLEMAS RESUELTOS
1.
:= 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.
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.
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.
Figura 1 2 . 1 .
Mantenimiento
67 %
Figura 1 2 . 2 .
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
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
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
12.4.
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
4
Carrano, Hellman y Verof: Data structures
Curamings Puhlishing, 1993, p. 210.
445
12.4.2.
Diseo
446
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
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 .
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
450
Ingeniera de software
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
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.
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:
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
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
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}
lpostcondicin}
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.
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}
454
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
y postcondiciones.
function EncontrarMax
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]}
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)
repeat
i : = i + i;
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
Problema 1 2 . 2
Ordenar por el mtodo seleccin
y postcondi-
ciones.
procedure OrdenarSeleccion
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 .
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
i, Suma, n s o n d e t i p o e n t e r o .
456
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
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
begin
Read (Item);
Suma := Suma + Item;
i := i + 1
end;
de un conjunto de
Suma := 0.0:
i : = 0;
Problema 1 2 . 3
: Suma es 1+2+3+..n-l+n;
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}
,
458
Programacin
en Turbo/Borland
Ingeniera de software
Pascal 7
12.7.
PRINCIPIOS DE DISEO DE S I S T E M A S
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
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
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.
approach. McGraw-Hill,
462
1 2.7.5.
Ingeniera de software
Interfaces d e usuario
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.
0..maxint;
{tipo nuevo;
Bajo..Alto;
{permanece el mismo}
array[TipoMillar] of TipoNoNeg;
tipo contiene solo enteros no negativos}
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
12.7.8.
Error de rango
12.7.7.
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.
12.8.
ESTILO DE PROGRAMACION
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
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.
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
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
Los nombres de los identificadores de objetos deben sugerir el significado del objeto al lector
del programa.
1 2.8.4.
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
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
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
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
Ingeniera de software
if<condl>
then<accionl>
else if <cond2>
then <accion2>
else<cond2> if
Regla
(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.
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
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
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
Tabla 12.1.
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.
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.
476
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;
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
nnn
xxxx: yyyy
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
12.12.5.
12.13.
EFICIENCIA
73
81
120
160
321
450
se utiliza
(T > Lista[J]) and (J < Ultimo)
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
else
WriteLn ('el elemento ',T,'no est en la lista');
WriteLn ('Bsqueda terminada');
WriteLn (I,'iteraciones')
end;
480
Ingeniera de software
I : = 1;
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)
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.
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
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.
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
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
13.2.
CONTENIDO
485
ORDENACION
implica que
implica que
si:
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
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.
23
15
A[2]
19
19
A[3]
45
23
A[4]
31
31
A[5]
15
44
Lista ordenada
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.
Anlisis
487
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
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
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
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
Mtodo
(Pseudocdigo)
desde i
desde j
489
Pasada 3: i = 3
Algoritmo
y mezcla
procedure Burbujal
var
I, J : integer;
procedure Intercambio (var X, Y : integer);
var
Aux : integer;
490
Ordenacin, bsqueda
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
1 do
- I do
+ 1] then
(A[J], A[J + 1])
fin-si
fin-desde
i * i+1
hasta-que Nolntercambio = t r u e
13.3.4.
y mezcla
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:
492
begin
for I := 1 to N do
Write (A[I] : 4);
WriteLn
end;
1 +2 + 3 + -- + (N-3)
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)
13.4.
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.
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
Pasada
493
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 .
- 2
494
El algoritmo de PosMayor debe guardar j como la posicin del elemento mayor y luego
poder intercambiar.
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
1+2+3+-+N-2+N-1
1)
1
(A" - N)
2
13.5.
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
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
Ordenarlnsercin
13.5.1.
- A )
2 to H do
end;
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
Tabla [K];
C m i n = .1 ( D - 1 + 1 + - - - + \=(N-\)
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
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
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
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
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;
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);
13.7.1.
Anlisis
502
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
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
a[98]
339412
a(99]
81467
Funcin b s q u e d a lineal
924116
a( 100]
Pseudocdigo
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
: = l;
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
504
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
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;
13.7.2.
LinealBusqueda;
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
Ordenacin, bsqueda
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 mezcla
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.
508
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
"T'T'T""
n
n
n
~~V ' ~W '
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.
JL < i
13.9.
n < 2k
2k
o bien
MEZCLA
510
4
0
78
13
97
15
78
90
96
lista A
lista B
78
97
Comparar A [/']
y Bjj. Poner el
ms pequeo en
C[k], Incrementar
los ndices apropiados
Lista A
O
k
-15
13
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
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.
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.
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)
514
14
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:
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.
RESUMEN
EJERCICIOS
PROBLEMAS
515
516
Registros
14.1.
Ejemplo 1 4 . 1
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.
tipo-reg
lista id
tipo
517
14.1.1.
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
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
Registros
Variable Empleado
Ejemplo
Nombre :
Edad :
Domicilio :
Salario :
type
Stock = record
Nmeros : integer ;
Nombre
: string [20];
Precio
: real
end;
var
Articulo, Item : Stock;
Variable Fecha
Mes:
Da:
Ao:
Septiembre
25
1983
Figura 14.2.
14.1.2.
Septiembre
25
1983
Mes
Da
Ao
A c c e s o a los c a m p o s d e un registro
:=
:=
:=
:=
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
O p e r a c i o n e s s o b r e registros
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
Registros
521
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;
variable J e f e .
14.3.
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)
522
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;
Direccin
523
Calle
Nmero
Ciudad
Provincia
Cdigo Postal
Como se ver ms tarde, se podra declarar una lista (array) de 100 empleados, con la
sentencia
Empleado
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;
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
524
Registros
Ejemplos
Empl eado. nombre. apel 1 i dos
Empleado.direccion.codigoPostal
14.3.2.
:= '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)
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
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;
persona.numero.a
persona.media.a
a
527
Ejemplo
demo
demo. demo
14.4.
es el nombre de un registro
variable entera
La Figura 14.5 muestra el registro demo, que contiene un campo tambin llamado
demo.
Ejemplo 1 4 . 5
demo
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
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;
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
60
58
Programa
program Horario;
type
Tiempo = record
Horas
: O..23;
Minutos, segundos : 0..59
end;
var
Actual : Tiempo;
Pausa
: integer;
530
50
Ejemplo 1 4 . 6
353
530
Programacin
en Turbo/Borland
Registros
Pascal 7
531
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)
Ao i9xx
: 15
: 5
: 89
14.5.
:= Ene;
:= Succ
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
[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
');
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;
');
procedure MediasEstudiante
');
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;
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
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
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.
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
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
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
Registros
Ejecucin
Nombre : John
Apellidos : Mortimer
Estado : 1 Asignatura que imparte : Programacin
Nombre : Tom
Apellidos : Carrigan
Estado : 2
Curso :3
Opcin : Tecnologia
Programa
14.6.1.
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}
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
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.
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
14.6.3.
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
14.6.5.
Aplicaciones especficas
Registros
543
Ejecucin
B
66
C
14,7.
: 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
Registros
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
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.
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
546
Programacin
14.8.1.
en Turbo/Borland
Pascal 7
Registros
Bsqueda lineal
14.9.
procedure BusquedaLineal
(Lista
.-ListaEmpleados; T : C a d i ;
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
}
}
[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
:= false;
:= 0;
: = 1;
until E n c o n t r a d o or
end;
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
var
Primero, Ultimo, Central
begin
Posicion := 0;
Primero
:= 1;
Ultimo
:= Cuenta;
repeat
: integer;
14.9.1.
*
Funcin de conversin
Indice de tabla
Clave de registro
>
75064059
(Primero > Ultimo);
[1]
2145123
[2]
1101174
[3]
75064059
[4]
14132106
[5]
2671854
[6]
45100012
548
Registros
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
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
[2]
PI
Funcin
de
conversin
75064059
[m-
T ornillo
25
432
2}
[ m - 1]
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
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
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
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 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.
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
repeat
O r d e n a d o := true;
for J := 1 t o N if L [J. .Nombre
then
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
p r o c e d u r e BurbujaMejorado
var
I, J
integer;
Aux
: Empleado;
Ordenado : boolean;
begin
I := 1;
: 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
14.10.2.
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;
14.10.3.
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
edad, estudios),
555
por
556
14.11.
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
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;
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
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;
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]
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);
560
Registros
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)
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]
s.mayor)
const
Longitud = 20
type
Cadena = string [Longitud];
Deporte = record
baloncesto,
ftbol,
atletismo : Cadena
Plazas : integer
end;
var
Competicin : Deporte;
562
Registros
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)
: (a + bi) -(c+
Resta
+ {b- d)i
+ bi
ac+ bd
be - ad
,
,
,
= - +
donde c2cP o
c + di
c2 + d2
c2 + d2
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)
/)
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.
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
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.
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.
en discos duros
15.2.1.
en directorios
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
\ directorio raiz
Ejemplo 1 5 . 2
El archivo S0RT.DAT est en el directorio
un directorio
C:\TURBO\LIB\S O RT.DAT
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
aleatorios,
LIB.
568
Archivos de texto:
(,secuenciales)
Archivos con tipo:
(aleatorios)
Archivos sin tipo:
1 5.2.3.
Archivos
Declaracin de archivos
var
ArchiDemol
ArchiDemo2
: 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):
569
var
texto : text;
Archil : file;
15.2.4.
Formato
type
nombre = file of tipo de datos
^
Ejemplos
type
type
type
type
tipo
tipo
tipo
tipo
de
de
de
de
archivo
archivo
archivo
archivo
vlida
:
Assign
ChDir
Cise
Erase
GetDir
MkDir
Rename
Reset
Rewrite
RmDir
Append
Flush
Read
Readln
SetTexBuf
Write
Writeln
BlockRead
BlockWrite
570
Archivos
Eof
IOResult
Archivos de texto
Eoln
SeekEof
SeekEoln
Precaucin
571
con eoln
,J
'
1 5.3.
15.3.1.
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
15.3.2.
Funciones eoln//eof
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 .
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
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
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.
1 5.4.1.
llamada al
procedimiento
1.
2.
3.
4.
573
Declaracin de un archivo
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);
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
15.4.3.
Apertura de archivo
Archivos
15.4.4.
575
Escritura de un archivo
Reset
Formato
Formato
f
reset (NombreArch)
NombreArch
Ejemplo
reset (MiArch);
reset (fichtext);
2. var NombreArch
archtex
: string [60];
: text;
15.4.5.
Precaucin
rewrite (f)
vi, v2,.. .
Ejemplos
Rewrite
Formato
Lectura de un archivo
Ejemplo
var
Total, Horas : real;
Archivo
: text;
Mensaje
: string [30;
begin
assign (Archivo, 'Demo');
reset
(Archivo);
ReadLn (Archivo, Mensaje, Horas);
576
Archivos
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
12
Vrcliivo de texto
d : char;
Ejemplos
Declaracin
equivale a
Read (input.x)
15.4.6.
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.
578
Archivos
1 5.4.7.
579
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
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.
1 5.5.
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
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
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
Archivos
1 5.6.
1 5.6.1.
15.6.2.
program Datos1;
var
f: file of real;
g: file of integer;
program tipificados
var
f : file of real;
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
583
program Datos2;
var
ftexto : Text;
fcadena : file of string [10];
Archivo de texto
584
Archivos
10
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.
1 5.7.1.
1. type
3. var
15.7.2.
Cliente = record
Codigo
Nombre
Direccin
Telefono
Saldo
Edad
end;
Lista
item
Asignacin de archivo
15.7.3.
el i e n t e . d a t 1 ) ;
rewrite (arch_cliente) ;
reset (f)
Reset
ReWrite
585
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.
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
read
write
eof
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;
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.
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.
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
1 5.8.2.
Archivos
Ejemplo 1 5 . 3
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.
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
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
Formato
Formato
seek (nombrearch, numreg)
nombrearch
numreg
FileSize (nombrearch)
Nota
Si el archivo esta \acio. se devuelve tero.
Ejemplo
Seek (inventario, 15)
Ejemplo
f i l e s i z e (inventario)
590
Archivos
Ejemplo 1 5 . 4
Aadir
llamado
INVENTARIO.
14.8.4.
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.
591
592
15.8.5.
Actualizar un 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
1 5.9.
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
1 / 0 E r r o r 0 1 , PC = xxxx
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
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
15.10.
595
MS-DOS
chdir (s)
mkdir (s)
rmdir (s)
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
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
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}
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
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);
Ciudad);
CodigoPostal);
Edad)
599
: 1);
600
Archivos
601
(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
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}
604
15.12.
Archivos
begin
{$1-}
Assign (F,Test);
Reset (F);
Cise (F);
{$1+}
Existir := (IOResult =0) and (Test o
end;
var
')
15.12.1.
605
BlockRead
Formatos
nombre-arch
buffer
reset
(nombre_arch, bloque)
rewrite(nombre_ arch, bloque)
bloques
bloque
BlockWrite
resultado
Ejemplo
reset {fuente, 1)
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
')
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
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
15.15.
15.14.
COMI, C0M2
ESCRITURA EN IMPRESORA
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.
Nota
i
610
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
Esc n 0
#27#78#0
activacin negrita
desactivacin negrita
Esc E
Esc F
#27 #69
#27 #70
impresin bidireccional
1
activacin subrayado
# 27 # 45 # 1
desactivacin subrayado
#27#45#0
15.17.
Cuide'
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
15,16.
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;
Mortimer
Flanagan
Carrigan
MacDonald
Sabrina
HombresG
Martnez
Mackenna
Mackoy
^Ronaldos
sort2, sort3. U n
612
Archivos
begin
{ programa principal }
WriteLn;
LeerDatos;
Sortl (L,N);
CrearArchivo
end.
(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
campos:
ttulo
autor
precio
cantidad
cdigo
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
(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 }
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.
1 5.20.
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
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.
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
618
Archivos
619
PROBLEMAS
1. Se crea un
y se desea
(CARTA)
reccin de
Nombre
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
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
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
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;
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
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:
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.
(1)
(2)
(3)
(4)
=
=
=
=
1
1
Fib (2) + Fib (1)
Fib (3) + Fib (2)
si
si
n = 0, n = 1
n > 1
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
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
');
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 ');
626
La recursividad
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
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
1 6.1.3.
Sntesis de la recursividad
La recursividad
629
1 6.1.4.
Palndromo (n-1)
n < 1
Tipos de recursividad
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
condicin de salida
n= 0
EL SEGUIMIENTO DE LA RECURSIVIDAD
Funcin Factorial
function
begin
if N =
then
else
end;
(2)
(1)
630
La recursividad
631
Funcin Fibonacci
Clculo del trmino quinto de Fibonacci: Fibonacci (5).
(0)
Fibonacci (5) =
Fibonacci (3)
Fibonacci (1)
Fibonacci (2)
= 1
= 1
= 2
Factorial = 6
Fibonacci (4)
Fibonacci (2) = 1
Fibonacci (3)
Fibonacci (1)
Fibonacci (2)
=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
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
:= n * Factorial
:= 1;
(n-1)
(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
Factorial (3)
Imprimir
^
end;
Ejemplo 1 6 . 7
retorno 3
2
>
valor encontrado
de la funcin final
program fac;
function factorial
j
1
pila
vaca
Figura 1 6 . 3 .
Anlisis
retorno 2
633
i
retorno 1
recursivo.
634
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.
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-
16.5.
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
636
La recursividad
A, = 1
A, = 1
- i
1 6.6.
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 ;
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 ) ;
637
n, n m e r o de elementos
end;
638
La recursividad
function B ( x : i n t e g e r ) : c h a r ;
639
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;
5 < >
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
:=
:=
:=
:=
:=
Impar (4)
Par (3)
Impar (2)
Par ( I )
false
640
La recursividad
end;
16.7.2.
Procedimiento BusquedaBin
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.
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
23
end
end
{else}
end
{BusquedaBin}
1 6.8.
17
31
13
15
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
31
19
23
21
643
15
nn
17
13
19
19
pivote
21
23
31
17
21
19
13
15
26
19
un
26
J=9
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
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
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
12
645
646
1 6.8.1.
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.
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.
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
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
' Ultimo
OrdMezcla
#>
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] }
649
650
Programacin
16.10.
en Turbo/Borland
Pascal 7
La recursividad
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)
(n discos)
('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
MoverTorre
(N-1,
Figura 1 6 . 4 .
T o r r e s d e Hanoi.
Poste 3
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
651
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
653
Ejecucin
Mover dos discos
al poste 2
Mover disco
grande del poste
1 al poste 3
2
3
3
2
1
2
2
3
3
1
1
3
2
3
3
(n > 1)
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
La recursividad
16.13
16.12.
655
Tcnicas de programacin
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
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
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.
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
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:
+ 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 ' ]
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
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
Figura 1 7 . 1 .
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.
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.
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
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
estado
inicial de
la pila
aadir F
suprimir
suprimir
aadir D
Funcin
PilaVacia (Pila)
PilaLlena (Pila)
Pila Elemento
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);
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
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
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
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.
665
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
Pilas y colas
Pila vaca
begin
X
1 7.3.2.
Pila llena
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
end;
Recuperar
0..MaxPila;
array [1..MaxPila] of TipoElementoPila
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;
var X {salida}
: TipoElementoPila;
var Exito {salida}: Boolean);
4>
Problema 1 7 . 1
o bien
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
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
Algoritmo
1.
2.
3.
4.
669
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;
670
Programacin
17.4.
en Turbo/Borland
Pascal 7
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)
Ejemplo 17.1
Operaciones bsicas en una cola de cuatro elementos.
CrearCola(Q)
lnsertar(Q,a)
Pilas y colas
1 7.5.
671
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.
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
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.
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;
Final = 4
Finat = 4
30
30
Frente = 3
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
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
= 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;
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
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.
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:
1 7.7.
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.
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
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
Pilas y colas
*+AB-CD
b) A B - C D
infija
5*6
5*(6+4)
C)
4+((5*7)/5)
a+b
+ab
ab+
c-d
-cd
e*f
*ef
cd-
ef*
[+AB]*C
= *+ABC
A+(B*C)
= A+[*BC]
= +A*BC
(A+B)/(C-D)
2 * ( 3 + 4 ) = 234+*
b) A B C D + / *
e)
AB+C+D+
c) A B + C 0 + +
/')
ABC++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 ) ) )
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 / / /
ABCD
d) A - B C D
e)
/+*AB-CDE
./')
/+A*BC-DE
[+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 [+,
*. /].
CAPITULO
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
680
681
Siguiente
Nodo 2
Figura 1 8 . 1 .
Siguiente
Nodo 3
Siguiente
Nodo 4
682
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
2014 (direccin)
un puntero
Por ejemplo, la variable P contiene 059164 que es la direccin de memoria donde est
la variable entera apuntada 345.
059164
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-
684
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
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;
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;
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
687
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
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);
w r i t e ( p" : i o : 2);
Atencin
p := 2 5.0;
write (p: io: 2);
asignacin no vlida
sentencia no vlida
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
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
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
Ptrl
Ptr2
Ptrl'
program PruebaSimple;
var p, q : ''integer;
x, y : integer;
begin
new(P);
P~:= 5;
x
:= p" + 1;
689
690
y == p " ;
new ( Q ) ;
q" := y + 3;
WriteLn (x,
end.
y,
Solucion
6 5 5 8
18.3.2.
PA
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);
declaraciones
P1
P2
691
692
693
Ejecucin
antes
1A
2B
3C 3C
18.3.3.
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
var
P
P : "integer;
90
New (P);
P"
:= 17;
(P)
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
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~
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
697
proporciona la salida
despus de newfP)
el puntero p no apunta a nada
7
p
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;
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
65
y la sentencia
WriteLn (ptr".nombre)
:= nil;
p" : = 5
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
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
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;
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" ) ;
las comparaciones:
if (PunteroA = PunteroB)
then < sentencia >;
if (PunteroA <> PunteroB)
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.
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
La salida ser
Concha
Concha
18.3.8.
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.
701
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.
18.6.
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
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
Figura 1 8 . 3 .
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
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.
704
705
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,
dinmica
New
Mark
Getmem
18.6.3.
de 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
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
varpunt
tamao
New y Dispose
Release (varpunt)
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
706
Ejemplo
ciones y borrados) es frecuente, las estructuras de datos estticas (los arrays) no son adecuadas para su implementacin. Las razones son varias.
Nota
18.6.6.
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
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
b)
Figura 1 8 . 6 .
708
18.7-2.
709
Datos
Siguiente
type
PunteroNodo = ^TipoNodo;
TipoNodo
= record
Info : integer;
Enlace : PunteroNodo
end;
nil
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
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
ptrTipo = ^nodoTipo
nodotipo = record
Datos : integer;
Siguiente": ptrtipo
end;
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.
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
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:
18.8.1.
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
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
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
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
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
Cabeza
anteriores
Aux
centinela
end.
18.8.2.
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
Aux
Cabeza
714
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;
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
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.
500
716
717
Cabeza
dispose(Actual);
Actual := nil;
18.8.4.
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 .
I n s e r c i n d e un n o d o e n el interior d e la lista
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.
Actual
Insercin de un n o d o en una lista enlazada.
NuevoPtr".Siguiente := Actual;
Anterior".Siguiente := NuevoPtr;
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
718
18.8.5.
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;
I n s e r t a r al f i n a l d e la l i s t a
Iniciacin
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
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
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.
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
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
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)
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.
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 .
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.
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
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;
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
18.10.1.
pila $CARPE
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 .
726
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>
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;
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
728
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.
Tcnicas de p r o g r a m a c i n
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
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
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
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
Padre
B, C
D, E, F
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
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
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.
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 .
738
Arboles
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.
(b)
Figura 1 9 . 8 .
Subrbol
izquierdo
Subrbol
derecho
Figura 1 9 . 1 1 .
Figura 1 9 . 9 .
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 .
(b)
Arbol binario: a) completo; b) no c o m p l e t o .
Figura 1 9 . 1 2 .
740
Programacin
en Turbo/Borland
Pascal 7
Arboles
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)
Figura 1 9 . 1 3 .
equilibrados.
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 .
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
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.
Figura 1 9 . 1 8 .
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 .
(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 .
744
Programacin
en Turbo/Borland
Arboles
Pascal 7
Ejemplo 1 9 . 1
(*)
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
( ^ )
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)
es decir,
( 4 * 5 ) + (6/7) - (8 + 9)
El orden de los operadores aqu es + y
((4 * 5) + (6/7)) - (8 + 9)
Por ltimo, la expresin completa entre parntesis ser
Soluciones
a.
x*(Y/-z)
b.
A + (B*-(C+D))
C.
(A*(X+Y))*C
Ejemplo 1 9 . 2
b.
(X*Y/A) + (B*C)
Soluciones
i )
vYJ
( + )
C+J
QaJ
(a)
( ^ )
(J
C*J
( x j
) (
( V )
(b)
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
747
nil
J - U -
nil
nil
nil
nil
nil
nil
nil
nil
ni!
Figura 1 9 . 2 0 .
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}
748
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 .
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
1 9 . 5 . 1 . Recorrido enorden
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 .
750
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
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
Solucin
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)
Figura 1 9 . 2 3 .
Recorrido postorden
d e un rbol binario.
752
Programacin
en Turbo/Borland
if A o nil
begin
EnOrden
WriteLn
EnOrden
end;
end;
PascaI 7
Arboles
then
(A^.Hijolzdo);
(A^.Nombre);
(A^.HijoDcho);
{operacin
{operacin
{operacin
753
Ejemplo
i}
N}
D}
4 menor q u e 30
30 menor que 55
41 mayor que 30
75 mayor que 55
85 mayor que 75
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:
754
Arboles
755
Una propiedad de los rboles binarios de bsqueda es que no son nicos para los
datos dados,
Ejemplo 1 9 . 4
Solucin
Arbollzdo (Raz, 8)
756
Arboles
757
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
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
758
Arboles
759
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;
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.
761
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
1 9 . 7 . 4 . Recorrido 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
Dcho
Dcho
Raz
tero es nil) es - 1 .
Nota
La liltiiK) de un nrhol os 1
764
Arboles
765
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
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.
(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))
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
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.)
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.
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
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
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
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.
20.3.
CREACION DE UNIDADES
cabecera de la unidad
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 .
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;
776
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.
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
para intercambiar
function Mximo;
begin
if I>J
then Mximo := I
else Mximo := j
end;
end.
program Prueba;
uses
Demol;
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}
778
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.
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}
Turbo diferencia unidades de programas por las palabras reservadas c o n las que comienzan
y acta de acuerdo con ellas.
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.
780
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;
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.
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.
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.
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
end
else
VerError ('Coordenadas XY fuera de rango')
end;
end.
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.
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
Borra la pantalla.
Detecta la pulsacin de una tecla. (
Hace sonar el altavoz interno.
Define una ventana de texto en la pantalla.
784
Ejemplo 2 0 . 4 .
Ejemplo 2 0 . 5
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.
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.
...
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
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.
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.
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
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
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.
{solo cabecera}
{solo cabecera}
implementation
{declaraciones privadas: locales a la unidad}
uses dista de unidades>
const ....
type
var
procedure
function ....
begin
end.
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
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
20.7.3.
Compilacin de unidades
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.
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.
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
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.
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.
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.
20.8.3.
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.
794
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,
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.
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)
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
OvrSetBuf
797
PROBLEMAS
OvrSetBuf (VarLonglnt)
VarLonglnt
20.8.4.
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}
- 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.
es el valor absoluto
Media cu adrada (MC)
- 2 ' f
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.
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
hash
PROBLEMAS RESUELTOS
Nota
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}
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;
Programa
de aplicacin
program DemoPrueba;
uses
Prueba;
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 ' ;
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
11
:=
:=
:=
:=
'AND';
'ARRAY';
'BEGIN';
'BOOLEAN';
802
[ 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';
803
804
REFERENCIAS BIBLIOGRAFICAS
1. Borland. Reference
CAPITULO
UNIDADES ESTANDAR
CONTENIDO
21.1.
21.2.
21.3.
21.4.
21.5.
21.6.
21.7.
21.8.
RESUMEN
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
21.1.
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
Unidades estndar
Unidades estndar
Uses
Ninguna
Ninguna
Ninguna
Ninguna
Ninguna
Ninguna
Crt
Crt
Text;
Text;
Word;
Pointer;
Pointer;
Pointer;
Word ;
Pointer;
Pointer;
Integer;
Pointer;
Longint;
Pointer;
Pointer;
Pointer;
Pointer;
Pointer;
Byte;
21.3.
LA UNIDAD PRiNTER
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
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
ExitProc
ExitCode
Cdigo de salida.
ErrorAddr
RandSeed
FileMode
M o d o de apertura de archivos
SavelntOO
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;
cuyo
808
21.4.
Unidades estndar
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
=
=
=
=
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;
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;
$D7B0;
$D7B1;
$D7B2;
$D7B33;
809
DateTime = record
Year, Month, Day, Hour, Min, Sec
end;
Word;
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;
810
Unidades estndar
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.
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
unidad
longint
: longint
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
GetlntVeo
Intr
MsDos
SetlntVec
GetDate
GetFTime
GetTime
PackTime
SetDate
SetFTime
UnpackTime
DiskFree
DiskSize
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
unidad
longint
Ejemplo
uses DOS;
812
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.
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;
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
const
{constantes
ReadOnly =
Hidden
=
SysFile
=
Volumeld =
Directory =
Archive
=
AnyFile
=
P r o c e d i m i e n t o Exec
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
Unidades estndar
815
Procedimiento FindNext
procedimiento GetFTime
Permite encontrar los archivos siguientes, que satisfacen a los criterios de bsqueda de la
SearchRec)
F
Procedimiento GetDate
Devuelve la fecha del reloj interno en el sistema operativo.
Procedimiento GetlntVec
Formato
Ao
Mes
oia
DiaSemana
rango
rango
rango
rango
1980...2099
1..12
1..21
0..6 (0 es domingo, lunes....)
Formato
Procedimiento GetTime
Procedimiento GetFAttr
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
Nolnt
Registers
816
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;
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
Formato
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
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;
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
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
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.
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
Noint
Vector
n m e r o de interrupcin (0..253)
especifica la direccin
21.6.2.
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
DateTime)
Caracteres especiales
Cuando se escribe en un archivo Output que ha sido asignado a Crt, existen caracteres
de control que tienen significados especales:
#
#
#
#
DateTime
Ventanas
7
8
10
13
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.
DateTime = record
Year, Month, Day, Hour,
Min, Sec : word
end;
RETROCESO
ESC
INTRO (ENTER)
820
CTRL - s
CTRL - D
CTRL-A
CTRL - F
CTRL - z
21.6.5.
Unidades estndar
var CheckBreak : boolean:
=
=
=
=
=
=
=
0;
1;
2;
3;
7;
-1;
256;
C40 y C80 son constantes definidas para la compatibilidad con la versin 3.0.
Las variables que siguen permiten controlar la visualzacin y el desarrollo de los programas:
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;
const
=
Black
=
Blue
=
Green
=
Cyan
=
Red
=
Magenta
=
Brown
=
LightGray
=
DarkGray
=
LightBlue
LightGreen =
=
LightCyan
=
LightRed
LightMagenta=
=
Yellow
=
White
=
Blink
12
821
21.6.6.
Procedimientos y funciones
AssignCrt
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
Delay
Delay (ms:word)
LowVideo
Ejemplo
TextColor (LightRed);
WriteLn ('este texto se visualiza en rojo claro');
LowVideo;
DeLine
GotoXY
LowVideo
DeLine
823
NormVideo
NormVideo
Fija el atributo del texto al valor que tena inmediatamente antes que el programa sea ejecutado.
Ejemplo
GotoXY(10, 15);
Write( 1 x 1 );
GotoXY(15, 10);
Write( 'y');
HighVideo
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
InsLine
KeyPressed
InsLine
KeyPressed: boolean
ReadKey: char
Sound
824
Unidades estndar
TextBackground
0
1
2
3
7
256
negro
azul
verde
can
rojo
magenta
marrn
gris claro
WhereX
WhereY: byte
Selecciona el color del carcter de primer plano, es decir, el color del texto; valores de color:
WhereX: byte
WhereY
TextColor
825
Window
21.7.
T extMode
Selecciona el modo de texto; los valores posibles del parmetro modo son:
826
Unidades estndar
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(
StrIComp
StrCat(S, 'Mackoy 1 ) ;
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 .
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);
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;
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);
StrLCopy
Libera el espacio almacenado por una cadena que fue asignada anteriormente con StrNew.
Si Cad es ni 1, no hace nada.
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;
828
Programacin en Turbo/Borland
Unidades estndar
Pascal 7
StrLIComp
StrPos
function StrPos(SI,S2 : Pchar) : Pchar;
Compara dos cadenas hasta una longitud mxima, sin tener en cuenta el t a m a o de la
letra.
t := StrLIComp(SI,S2,10 ) ;
StrLower
829
StrRScan
function StrRScan (Cad : Pchar; Car : Char) : Pchar;
WriteLn(StrLower(S) ) ;
StrMove
function StrMove(SI,S2 : Pchar; Cuenta:Word) : Pchar;
StrScan
function StrSCan (Cad : Pchar; Chr : Char) : Pchar;
StrNew
StrUpper
function StrUpper (Cad : Pchar) : Pchar;
P := StrNew(s);
StrPas
ReadLn(Cad);
WriteLn(StrUpper(Cad));
WriteLn(StrLower(Cad));
StrPCopy
function StrPCopy (Destino : Pchar; Fuente : String) : Pchar;
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
if turbo3.IOresult = o
then...
21.8.1.
Variables
Cbreak
CBreak
CBreak:=false
CBreak.-true
21.8.2.
HighVideo y
Norm Video
(procedimientos)
en la versin 4.
HighVideo
NormVideo
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
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)
832
LongFileSize
(funcin)
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)
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
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
Tipos abstractos
de datos y objetos
835
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.
836
22.1.2.
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
Procedimientos
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.
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
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
Academic Press.
1992.
3
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
22.1.6.
y objetos
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
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
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.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
Tipos abstractos
de datos y objetos
843
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 .
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.
DISEO DE MODULOS
844
22.4.1.
Acoplamiento de mdulos
Tabla 2 2 . 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
Cohesin de mdulos
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.
Grado de acopiamiento
Grado de mantenibilidad
Alto (Fuerte)
Bajo
Bajo (Dbil)
Alto
l n
"
846
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.
22.6.
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
procedimental
(por procedimientos)
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.
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
El interfaz del tipo abstracto de dato se asocia con las operaciones y datos visibles al
exterior del TAD.
849
1.
2.
de datos y objetos
Implementacin privada
Figura 2 2 . 5 .
850
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.
22.7.2.
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).
22.8.
851
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;
852
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
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 .
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
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;
uses
Pila;
var
S:Pila.Tipo;
854
855
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
Figura 2 2 . 7 .
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
Booch, Grady. Object-Oriented Analysis and Design with Applications, Benjamin/Cummings, 1994.
856
Tipos abstractos
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
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
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
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
22.11.
860
Programacin
en Turbo/Borland
Pascal 7
Algol
Tipos abstractos
de datos y objetos
861
22.11.1.
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.
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.
Figura 2 2 . 9 .
862
Programacin en Turbo/Borland
3.1.
Tipos abstractos
Pascal 7
3.2.
Eiffel
Simula
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
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
Eiffel Smalltalk
22.1 2.
de datos y objetos
863
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
864
Tipos abstractos
22.1 3.
Figura 2 2 . 1 0 .
de datos y objetos
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.
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
"
866
Programacin en Turbo/Borland
Pascal 7
Figura 2 2 . 1 2 .
1.
2.
3.
4.
5.
6.
7.
Tipos abstractos
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
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:
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.
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.
870
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).
Variables locales
Funcin A
Funcin I
Figura 2 3 . 2 .
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
23.2.
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 '.
872
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
Datos
(^Datre^)
^ ( ^ F u c i n miembro^)
Funcin
^ ( ^ F u c i n miembro^)
(^Datos^)
Pblico
Privado
Figura 23.4.
El modelo objeto.
873
(a)
(b)
Nombre
del objeto
Nombre
Atributos
Mtodos
(c)
Figura 2 3 . 5 .
Datos
y operaciones
(d)
874
Programacin
en Turbo/Borland Pascal 7
Programacin
orientada a objetos:
Seccin
privada
j
i
Alimentos
Carnes.
Frutas.
Pescados.
Verduras.
Pasteles.
Figura 23.7.
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.
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.
Objeto
Llegada
de mensajes'
Datos
^LZ]
Figura 23.9.
Mtodos
876
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
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.
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
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
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
23.3.3.
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.
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
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:
882
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 .
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.
23.3.5.
Datos internos
23.3.6.
883
23.4.
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 .
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:
885
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
Figura 23.1 6.
886
23.4.3.
Paso de mensajes
Gato
1.
2.
Mtodos
J
Objetos
Clase
Figura 2 3 . 1 8 .
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
),
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.
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
fin.
888
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.
23.6.1.
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
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 .
890
23.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.
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.
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
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
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.
int X;
int pesetas;
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.
Tipos de herencia
Figura 2 3 . 2 4 .
Herencia mltiple
Tipos de herencia.
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 -
23.7.3.
Herencia simple
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
895
de nombres
Valores
23.7.4.
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
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 .
23.7.5.
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
Figura 2 3 . 2 9 .
897
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
23.7.6.
Sintaxis
898
899
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.
para sumar:
A[i] := Al[i] + A2[i]
{para todo i}
900
Programacin
23.10.
en Turbo/Borland
Programacin
Pascal 7
901
LIGADURA DINAMICA
23.10.1.
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 .
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
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.
23.4.
23.5.
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.
23.9.
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.
24.1.
CAPITULO
PROGRAMACION ORIENTADA
A OBJETOS CON TURBO PASCAL 7
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.
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.
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
procedure NombreProcl;
procedure NombreProc2;
907
end;
function MiTipoObjeto.MiFuncion (ArgumentoFuncion :
Integer): Integer;
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
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;
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
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
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
{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;
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
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;
911
Iniciar;
Despegar;
Acelerar;
Frenar;
Aterrizar
24.1.1.
Encapsulamiento
912
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;
24.2.
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 un 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
Ejemplo 2 4 . 3 .
Declaracin de algunos tipos objetos
1.
914
2.
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
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}
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
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
Se desea disear una aplicacin bancaria teniendo presente los diferentes tipos de cuentas: Ahorro, Corriente, Financiera, Plazo Fijo. Describir las posibles relaciones de herencia.
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.
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
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.
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;
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
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
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.
923
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 .
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.
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
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;
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.
24.5.
LOS METODOS
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
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
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.
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.
Ejemplo
Dispose(x);
Dispose(x, Done);
928
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;
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.
{$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;
929
930
24.6.3.
La clusula
Self
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
CamposDato;
Mtodos
Objeto Circulo
CamposDato
Mtodo
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
Radio := R
end;
{iniciar}
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);
933
end.
procedure Circulo.Visualizar;
begin
Figura.Visualizar;
WriteLn ('El radio es:', radio:6:2)
end;
{Visualizar}
{Final de Unidad FigurasGeom}
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
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
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
procedure MetodoB
begin
.
(...);
(...); virtual
Mtodos valales son los mtodos que utili/a T uibo Pascal para proporcionar ligadura
end;
Advertencia
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
Figura 2 4 . 8 .
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
24.7.1.
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.
2.
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.
: 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
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.
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);
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
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
CadReg;
integer;
Real);
Destructor V a c i o ;
end;
var
Instancia:Demo;
var
Test
(Cad
P
Kg
945
: PtrLocal;
:= 4567;
24.9.
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
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
Iniciar
('Feliz Dia1,
5,320));
24.10.
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.
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:
Declaracin
de un tipo objeto
t y p e NombreObjeto
= object
dato_publco_l
: tipol;
dato_publico_2
: tipo2;
mtodo_publicol
metodo_publico2
948
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
; 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 )
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.
950
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
Cd.igos de referencia
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
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
Cdigos de referencia
Carcter
Valor ASCII
nr
253
254
255
Carcter
2
(blanco ' F F )
955
Tabla A-3.
Cdigo de exploracin
en hexadecirnal
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
Tecla
Signo menos
4 5
6
+
1 End (Fin)
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
far
forward
interrupt
near
private
virtual
far
forward
interrupt
near
private
public
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
961
Insertar y borrar
Orden
Teclas de
activacin
Teclas
alternativas
de edicin
DEL (Supr)
CTRL+G
RETROCESO
CTRL+H
CTRL-OO
CTRL+Y
CTRL+N
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
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
Orden
Teclas de
activacin
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
Descripcin
FI
F2
Guardar un archivo.
F3
Abrir un archivo.
F4
F5
F6
F7
F8
F9
FIO
ALT+FI
CTRL+FI
CTRL+F2
ALT+F3
CTRL+F3
CTRL+F4
ALT+F5
SHIFT+F6
CTRL+F7
CTRL+F8
ALT+F9
Compilar archivo.
CTRL+F9
963
964
ORDENES DE AYUDA
Tecla de funcin/
Secuencia de teclas
965
Descripcin
PgDn (AvPg)
PgUp (RePg)
ESC
Salida de ayuda.
FL
TAB/SHIFT-TAB
INTRO (ENTER)
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
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)
Save
ALT-FS (F2)
Save a s . . .
ALT-FA
Save al 1
ALT-FL
Change d i r . . .
ALT-FC
Pri nt
ALT-FP
Printer s e t u p . . .
ALT-FR
Configurar impresora.
DOS shell
ALT-FD
Exit
ALT-FX 0 ALT-X
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
967
El m e n Edit permite moverse por un archivo y entre archivos. Se activa con la secuencia de teclas ALT-E.
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
Descripcin
Find...
ALT-SF
Replace...
ALT-SR
Search again
ALT-SS
CTRL-L
Orden
Orden
Undo
Tecla de funcin/
Secuencia de teclas
Descripcin
ALT-EU
Redo
ALT-ER
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
ALT-SC
Find e r r o r . . .
ALT-SE
ALT-F8
Find procedure...
ALT-SP
968
File
Edit
Search
969
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
Tecla de funcin/
Secuencia de teclas
Descripcin
Run
ALT-RR
CTRL-F9
Step over
ALT-RS
F8
Trace into
ALT-RT
F7
Go to cursor
ALT-RG
F4
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
971
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
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
CTRL-F3
Regi s t e r
ALT-DR
Watch
ALT-DW
Cali s t a c k
ALT-DC
Go to next
ALT-TN
Go to previous
ALT-DU
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)
Descripcin
ALT-F8
Grep
ALT-F7
ALT-TG
ALT-TP
SHIFT-F2
972
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
Debug
Tools
N0NAME00.PAS
Window
Help
Compiler...
Memory s i z e s . . .
Linker...
Debugger...
Directories...
Tools...
Descripcin
Open...
ALT-OO
Save (TURBO..TP)
ALT-OS
Save a s . . .
ALT-OA
Environment
Open...
Save
Save a s . . .
P0IN\TURB0.TP
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
Orden
Tecla de juncin/
Secuencia de teclas
List...
ALT-OC
ALT-OM
Especifica los tamaos de memoria por defecto (por ejemplo, de una pila) de un programa.
Linker...
ALT-OL
Debugger...
ALT-OB
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
ALT-OE
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
Orden
Tecla de funcin/
Secuencia de teclas
Descripcin
Tile
ALT-WT
Cascade
ALT-WA
974
Tecla de funcin/
Secuencia de teclas
Orden
Descripcin
Orden
C i s e al l
ALT-VVO
R e f r e s h di spl ay
ALT-WR
Si z e / M o v e
ALT-WS
CTRL-F5
Zoom
ALT-WZ
F5
Next
ALT-WN
F6
Previous
ALT-WP
SH1FT-F6
Cise
ALT-WC
ALT-F3
ALT-WL
ALT-O
Li s t . . .
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
Index
ALT-HI
SHIFT-F1
Topic search
ALT-HT
CTRL-Fi
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
Files...
ALT-HF
Compiler d i r e c t i v e s
ALT-HD
Reserved words
ALT-HR
Standard uni t s
ALT-HU
Turbo Pascal
Language
ALT-HP
Error messages
ALT-HE
About...
ALT-HA
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
976
977
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.
Realizando estas acciones, sus opciones de arranque sern efectivas la prxima vez
que se arranque el EID.
Descripcin
/Cnombrearchivo
/D [+ o bien -]
/Ynmero
/G [+ o bien -]
Activa (o desactiva) una operacin de grabacin completa de archivos durante una sesin de depuracin.
/L [+ o bien -]
/N [+ o bien -]
/O nmero
/P [+ o bien -]
/R [+ o bien -]
-/Scamino
/T [+ o bien -]
/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 -]
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
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
979
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.
APENDICE
Arranque
y parada
Operacin
Secuencia de teclas
(teclas calientes)
Activar el men
Ninguna orden
FIO
File[Exit
ALT-X
Manipulacin de archivos
Operacin
Secuencia de teclas
(teclas calientes)
TECLA ESCAPE
Ok
TECLA R E T U R N
(INTRO)
Debug|User s c r e e n
ALT-F5
Window|Next
F6
Window|Previous
MAYUS-F6
WindowsList
ALT-F10
Window/Size/Move
CTRL-F5
Window|Zoom
F5
Window|Cise
ALT-F3
Windows|Cise ALL
N I N G U N A TECLA
Ejecucin de programas
Operacin
Secuencia de teclas
(teclas calientes)
Operacin
Secuencia de teclas
(teclas calientes)
FileOpen
F3
Compilar un programa
Compile|Compile
ALT-F9
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
Options|Compiler
Compile j D e s t i n a t i o n
NINGUNA TECLA
F i l e j Change d i r
NINGUNA TECLA
980
982
Depurador
Operacin
Secuencia de teclas
(teclas calientes)
RunTrace into
F7
DIRECTIVAS DE COMPILACION
Men Options/Compiler
F8
Debug|Watch
NINGUNA TECLA
Debug j Evaluate/modify
CTRL-F4
F4
Debug j Breakpoints
NINGUNA TECLA
Debug|Breakpoints|Clear a l l
NINGUNA TECLA
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
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
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
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
Break/watch
Inde
1
Fl-Help
985
F7-Trace
F8-Step
|$A+}
{$A-}
equivale a
F9-Make
FlO-Menu
{$A+} y {$A-}
opcin
directiva
Boolean Evaluation
|$B-
Short Circuit
986
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
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+)
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+|)
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
end;
{$F-}
equivale a
equivale a
988
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
Ejemplo
Este segmento de programa presenta una solucin para prevenir errores de E/S en un
programa.
{$i->
Reset (nombre_arch)
Directivas de compilacin
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
$ 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
Nota
Para ampliacin de esta directiva, consulte el Apndice L.
Mximo
Pila Dinmica
Ejemplos
j$M 65520,0,32768)
Pila Dinmica,
j$M 16384,0,0}
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
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})
991
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
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
en 7.0)
992
Directivas de compilacin
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})
Range-Checking on
Range-Checking off
equivale a
equivale a
993
en 7.0)
equivale a
equivale a
Nota
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.
j$S+|)
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
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
j$ELSE|
{SENDIF i
J SIFDEF nombrej
SIFNDEF nombre\
SIFOPT opcin1,
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;
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
Ejemplos
995
Directivas de compilacin
Lnea de
rdenes
Descripcin
/$A+
{SA-}
/$A-
{$B+}
/$B+
,/SB-
/$D+
{SD-}
/$D-
{DEFINE nombre}
/D nombre
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+
,'SF-
{SG+}
/SG+
2. const
Test = True;
{$E+}
/$E+
Activa evaluacin
80 x 87.
de
{SE-}
/$E
{SENDIF}
coprocesador
condicional
numrico
del
ltimo
996
Directiva
Lnea de
rdenes
Directivas de compilacin
Descripcin
/$I+
Activa generacin automtica de cdigo que verifica el resultado de una llamada a un procedimiento
de E/S.
/$I~
{SI nombrearchivo}
{IFDEF nombre}
{IFNDEF nombre}
{IFOPT conmutador}
{$L nombrearchivo}
{$M} tamaopila,
/$Mp,
{$N+}
/$N+
{$N-}
/$N-
{$ P+}
/$P+
- i$P-}
/$P-
{$Q+}
/$Q+
$Q-}
O
1
{$L+}
{$0+}
/$0+
{$o-}
/$0-
{$R+}
/$R+
{$R-}
/$R-
{$S+}
/$S+
{$S-}
/$S-
{$T+}
/$T+
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+
{$V-}
/$v-
{$X+}
/SX+
{$X-}
/$X-
en Turbo Pascal
999
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.
expected
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
1001
Algunos de los mensajes tpicos de error y sus posibles causas se analizan a continuacin:
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
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
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
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.
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.
1004
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.
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.
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}.
Cualquier cambio en el cdigo fuente no afecta a la ejecucin 'del programa hasta que se
vuelva a compilar.
1006
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.
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).
- 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
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.
);
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;
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.
1010
Programacin en Turbo/Borland
Pascal 7
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.
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.
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
nnn
xxxx.yyyy
errores
errores
errores
errores
DOS: 1-99
de E/S (I/O): 100-149
crticos: 150-199
fatales: 200-255
1012
Mensajes
36.
37.
38.
39.
40.
41.
y cdigos de error
1013
1014
Programacin
en Turbo/Borland
Mensajes
Pascal 7
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
y cdigos de error
1015
1016
3.
4.
5.
6.
12.
15.
16.
17.
18.
Errores crticos
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
Mensajes
y cdigos de error
1017
206.
207.
208.
209.
210.
211.
212.
Errores fatales
200.
201.
202.
203.
204.
205.
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
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
far
forward
interrupt
near
prvate
public*
virtual
Identificadores
WriteLn
Un_mes
Exit
CadenaReal
Nombre_Apellidos
System.MemAvail
Dia_del_Mes
Rosas
Pedro_uno
1019
1020
Cadenas de caracteres
cabecera
funcin
Turbo }
'Turbo'
III
;}
: cadena nula }
{espacio}
Comentarios
UNIDADES
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;
-begin
{ cuerpo principal del programa
end.
Procedimientos y funciones
cabecera
procedimiento
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
TIPOS DE DATOS
Registro
Objeto
Conjunto
Letras
:= [ ' A ' j ' B ' j ' C ' . ' D ' j ' E ' ]
NoLetras := []
Puntero
Pchar
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
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
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);
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
Sintaxis
Operador
__
expresionl
expresinl
expresionl
expresinl
expresionl
/
DIV
MOD
- expresin2
* expresin2
/ expresin2
DIV expresin2
MOD expresin2
Significado
Operador
Resta (binario)
Multiplicacin
Divisin real
Divisin entera
Resto (mdulo)
Sintaxis
>=
IN
elemento IN Conjunto2
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
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
+
Prioridad de operadores
Prioridad
Operadores
1 (alta)
2
3
4 (baja)
SENTENCIAS
De conjunto
Operador
Asignacin
Sintaxis
Conjuntol = Conjunto2
<
>
<
<identificador>
:= <expresin>
Compuesta
begin < sentencias
begin
> end
1027
1028
Selectiva (if)
if <condicin>
then
< sentencia >
[ else
<sentencia>
];
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;
for k : = 1 to 10 do
WriteLn ( ' cuerpo de bucle');
inicial>
do <sentencia>
paso := i;
<sentencia>;
<sentencia>
simple
compuesta
begin
WriteLn ( ' Pasos : ' , paso: 2 ) ;
paso := paso + 1
end;
WriteLn('fuera del bucle');
While ch < > ' 'do Read(ch) ;
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.
downto <valor
for i : = 10 downto 1
begin
Resultado : = i * Resultado;
WriteLn('Bucle', i, Resultado);
end;
while <condicin>
:= <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
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;
Ord
Ord(x):LongInt;
Round
Round(x:Real):LongInt;
Trunc
Trunc(x:Real):Longlnt;
Abs
Sintaxis
Abs(x) ;
Round ( 5 . 4 49)
Tr une (-3.14)
Trunc (6.5)
devuelve 5
devuelve-3
devuelve 6
Funciones aritmticas
Nombre
Ejemplos:
ArcTan
ArcTan(x:Real):Real;
Cos
Cos(x:Real):Real;
Descripcin
Sintaxis
Nombre
Descripcin
Break
Break;
Continu
Continu;
Exit
Exit;
Halt
Halt [ (CodigoSalida:
Word)];
RunError
RunError[(CodigoError;
Byte)];
Exp
Exp(x;Real):Real;
Frac
Frac(x:Real);Real;
Int
Int(x:Real):Real;
Ln
Ln(x:Real):Real;
Pi
Pi:Real;
Valor de Pi (3.1415926535897932385).
Sin
Sin(x:Real):Real;
Sqr
Sqr(x);
Sqrt
Sqrt(x:Real):Real;
Ejemplos:
if t = ' s ' then Exit ;
if p = nil then
RunError(204);
1032
Funciones
Nombre
Dec
Descripcin
Dec(var x ;n:Longlnt]);
Inc
Inc(var x ;n:Longlnt]);
High*
Low*
High(x);
Low(x);
Odd
Odd(x:Longlnt):Boolean;
Pred
Pred(x);
Succ
Succ(x);
Ejemplos:
Dec(z);
Inc(z);
Sintaxis
Nombre
Concat
Copy
Copy(s:string;Pos,Long:
Integer):string;
Length
Length(s:string):Integer;
Pos
Pos(Patrn,Fuente:string):
Integer;
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 i : = 0 to High(x) do
s := s+ x [i] ;
1033
devuelve '4'
devuelve 1947
Sintaxis
Nombre
Descripcin
Addr
Addr(x):Pointer;
Tratamiento de cadenas
Assigned*
Assigned(var P) :Boolean;
Procedimientos
CSeg
CSeg:Word;
DSeg
Dseg:Word;
Of s
Ofs(x):Word;
Ptr
Ptr(Seg,Ofs:Word):Pointer;
Seg
Seg(x):Word;
Sptr
Sptr:Word;
Sseg
Sseg:Word;
Nombre
Sintaxis
Descripcin
Delete
Delete(var s:string;
Pos, Len:Integer ) ;
Insert
Str
Val
1034
Ejemplos:
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 ) ;
FillChar
F i l l C h a r ( v a r x; c u e n t a : w o r d ;
valor);
Randomize
Randomize;
Procedimientos
Funciones
Descripcin
Nombre
Sintaxis
Dispose
Dispose(var p:pointer[,Destructor] *) ;
Nombre
FreeMem
GetMem
New
Funciones
Descripcin
Sintaxis
Nombre
MaxAvail
MaxAvail:LongInt;
MemAvail
MemAvail:Longlnt;
Sintaxis
Hi
Hi(x):Byte;
Include
I n c l u d e ( v a r s : set of t;I:T);
Lo
Lo(x):Byte;
Move
ParamCount
ParamCount:Word;
ParamStr
ParamStr(Indice):string;
Random
Random[(Rango:Word)];
Sizeof
Sizeof(x):word;
Swap
Swap(x);
TypeOf
TypeOf(x):Pointer;
UpCase
UpCase(ch:char):char;
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
for i : = 1 to 10 do
write(Random(MaxInt):8);
1037
Nombre
Sintaxis
Descripcin
BlockRead
BlockWrite
for i : = 1 to ParamCount do
WriteLn(i:2,':',ParamStr(i))
Cise
Cise (var F) ;
WriteLn('Real..',Sizeof(Real));
Erase
Erase(var F) ;
FileSize
FileSize(var F) ;Longlnt;
Flush
Flush(var F:Text);
Read
Read(F,VI[,V2,...Vn] ) ;
ReadLn
ReadLn(var
F:Text;]VI[,V2,...,
Vn] ) ;
Reame
Reset
Reset(var F[:file;TamaReg:
Word] ) ;
ReWr ite
ReWrite(var F [ : file;TamaReg:
Word]);
Seek
Seek(var F; N:Longlnt) ;
SetTextBuf
Trncate
Trncate(var F ) ;
Write
WriteLn(11=',1:5,1Byte alto=',Hi(I):3);
Include(S,I);
WriteLn('byte bajo',Lo(n):6) ;
Move(car[1],car[50],50) ;
Nombre
Sintaxis
ChDir
ChDir(s:string);
GetDir
MkDir
MkDir(s:string);
Crea un directorio.
RmDir(s:string);
RmDir
Ejemplos:
ChDir(Camino);
GetDir(1,s ) ;
MkDir(Camino);
RmDir( ' \Aux' ) ;
Entradas/Salidas
WriteLn
Procedimientos
Nombre
Sintaxis
Descripcin
Append
Append(var f: Text);
Assign
Assign(var f : Nombre);
Write(f,vi,[,v2,...,vn]);
WriteLn([var F:Text;]pl[,p2,
...,pn]);
Funciones
Nombre
Sintaxis
Descripcin
Eof
Eof(var F) : Boolean;
Eoln
Eoln[(var F:Text)]:Boolean;
1038
Descripcin
Sintaxis
Nombre
FilePos
FilePos(var F) :LongInt;
IOResult
IOResult:Integer;
SeekEof
SeekEof[(var F:Text)]:Boolean;
SeekEoln
SeekEoln[(var F:Text)];
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
de salida>)\
Cerrar un archivo
Seek(Tf,12);
Read(Tf, ch);
de archivo>);
de archivo>
)\
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
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>)\
ARCHIVOS
de archivo >);
Ejemplos:
< nombre
archivo externo>);
1039
de archivo>
)\
Posicionamiento en registro
Seek ( < identificador
de archivo>,
< nmero
de registro>)\
1040
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 }
{$UNDEF nombre}
{$IFxxx}
{$IFxxx}
...
{$IFDEF nombre}
<sentencias-1>
{$ENDIF}
{$ELSE}
{$ELSE}
...
<sentencias-2>
{$ENDIF}
{$ENDIF}
Smbolos condicionales
Smbolo
Significado
VER70
MSDOS
CPU86
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}
{$0 nombreunidad}
Caracteres de control
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
#10
LF
#13
CR
1042
Descripcin
RETROCESO (-<-!)
ESC
ENTER (Intro)
Termina lnea de entrada y almacena en almacenamiento temporal. Genera marca fin de lnea.
CTRL+S
CTRL+D
CTRL+A
CTRL+F
CTRL+Z
TextColor
TextColor(Color:Byte)
TextMode
TextMode(Modo:Word)
Window
Window(xl,y2,x2,y2:Byte)
Procedimientos
Nombre
Sintaxis
Descripcin
KeyPressed
KeyPressed
Readkey
Readkey
WhereX
WhereX
WhereY
WhereY
Ejemplos:
AssignCrt
A'ssignCrt(var F:Text)
ClrEol
ClrEol
Borra todos ios caracteres desde la posicin del cursor hasta el final de la
lnea.
ClrScr
ClrScr
Delay
Delay(ms:Word)
DelLine
DelLine
GotoXY
GotoXY(x,y:Bvte)
HighVideo
HighVideo
Car := Readkey;
gotoxy(l, whereY-1);
Nombre
Sintaxis
Descripcin
InsLine
InsLine
LowVideo
LowVideo
NormVideo
NormVideo
NoSound
NoSound
Sound
Sound(HZ:Word)
TextBackground
TextBackground(Color:Byte)
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;
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
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
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
(^
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
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
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
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
Tipos array
/
tipo c o n j u n t o -
array >
t i p o ndice
t i p o ordinal
file
tpo
JO -
1053
1054
Tipos puntero
Sentencia simple
tipo puntero
t/po b a s e
tipo b a s e
tenttficaor
de tipo
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
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
> Q - ,
identificador d e c a m p o
KX
O*-
constante de tipos
O*
APENDICE
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
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.
Cabecera de un programa
Cadena de caracteres
Declaraciones
Separadores
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 .
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;
1062
TIPOS DE DATOS
| Tipos de datos
simples [ | puntero ~j
ordinales
["predefinidos
interger
char
reales
array
estructurados
registro
conjunto
archivo
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.
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 .
:
:
:
:
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
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;
o bien
var
nominas : file of identificador_de_tipo;
informe : text;
y
Write(var_archivo, var_componente)
equivaldra a
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
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;
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
1069
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 .
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.
Operador
Prioridad
Clasificacin
not
negacin lgica
operadores de multiplicacin
-f, , or
operadores de adicin
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
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
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);
1071
declaraciones
begin
sentencias
nombre_funcin : = valor de la funcin
end;
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
Parmetros funcin
1073
Lgicas
eof(f)
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)
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
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)
Ordinales
pred(x)
succ< x)
chr(x)
ord(x)
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)
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)
Write(f,e)
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
Transferencia
(empaquetamiento)
Pack(a,i,b)
Unpack
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;
1075
1076
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
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
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.
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
Clase
Erase
FilePos
FileSize
Flush
GetDir
MkDir
Rename
RmDir
Seek
SeekEos
SeekEoln
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
1083
Turbo
es:
Pascal estndar:
T u r b o Pascal:
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.
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-
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
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.
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
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
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
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
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
1089
1090
interfaz, 462
interrupcin, 1003
interruptor, 127, 158
Intr, 815
I/O, 2
IOResult, 594, 831
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
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
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
1093
1094
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