¡Descarga Algoritmos y Programacion en Pascal y más Apuntes en PDF de Informática solo en Docsity!
Algoritmos y Programaci´on
en Pascal
A nuestros compa˜neros y alumnos
- Tema I Algoritmos e introducci´on a Pascal Presentaci´on xix
- Cap´ıtulo 1 Problemas, algoritmos y programas
- 1.1 Soluci´on de problemas mediante programas
- 1.2 Concepto de algoritmo
- 1.2.1 Una definici´on de algoritmo
- 1.2.2 Una definici´on formal de algoritmo
- 1.3 Aspectos de inter´es sobre los algoritmos
- 1.3.1 Computabilidad
- 1.3.2 Correcci´on de algoritmos
- 1.3.3 Complejidad de algoritmos
- 1.4 Lenguajes algor´ıtmicos y de programaci´on
- 1.5 Desarrollo sistem´atico de programas
- 1.6 Conclusi´on
- 1.7 Ejercicios
- 1.8 Referencias bibliogr´aficas
- Cap´ıtulo 2 El lenguaje de programaci´on Pascal
- 2.1 Introducci´on
- 2.2 Otros detalles de inter´es
- 2.3 Origen y evoluci´on del lenguaje Pascal
- 2.4 Pascal y Turbo Pascal
- Cap´ıtulo 3 Tipos de datos b´asicos
- 3.1 Introducci´on
- 3.2 El tipo integer viii ´Indice
- 3.3 El tipo real
- 3.4 El tipo char
- 3.5 El tipo boolean
- 3.6 Observaciones
- 3.7 El tipo de una expresi´on
- 3.8 Ejercicios
- Cap´ıtulo 4 Elementos b´asicos del lenguaje
- 4.1 Un ejemplo introductorio
- 4.2 Vocabulario b´asico
- 4.2.1 Constantes y variables
- 4.3 Instrucciones b´asicas
- 4.3.1 Asignaci´on
- 4.3.2 Instrucciones de escritura
- 4.3.3 Instrucciones de lectura
- 4.4 Partes de un programa
- 4.4.1 Encabezamiento
- 4.4.2 Declaraciones y definiciones
- 4.4.3 Cuerpo del programa
- 4.4.4 Conclusi´on: estructura general de un programa
- 4.5 Ejercicios
- Cap´ıtulo 5 Primeros programas completos
- 5.1 Algunos programas sencillos
- 5.1.1 Dibujo de la letra ‘‘C’’
- 5.1.2 Suma de dos n´umeros
- 5.2 Programas claros ⇒ programas de calidad
- 5.3 Desarrollo descendente de programas
- 5.4 Desarrollo de programas correctos
- 5.4.1 Estado de los c´omputos
- 5.4.2 Desarrollo descendente con especificaciones
- 5.5 Observaciones finales
- 5.6 Ejercicios
- Tema II Programaci´on estructurada ´Indice ix
- Cap´ıtulo 6 Instrucciones estructuradas
- 6.1 Composici´on de instrucciones
- 6.2 Instrucciones de selecci´on
- 6.2.1 La instrucci´on if-then-else
- 6.2.2 La instrucci´on case
- 6.3 Instrucciones de iteraci´on
- 6.3.1 La instrucci´on while
- 6.3.2 La instrucci´on repeat
- 6.3.3 La instrucci´on for
- 6.4 Dise˜no y desarrollo de bucles
- 6.4.1 Elecci´on de instrucciones iterativas
- 6.4.2 Terminaci´on de un bucle
- 6.4.3 Uso correcto de instrucciones estructuradas
- 6.5 Dos m´etodos num´ericos iterativos
- 6.5.1 M´etodo de bipartici´on
- 6.5.2 M´etodo de Newton-Raphson
- 6.5.3 Inversi´on de funciones
- 6.6 Ejercicios
- Cap´ıtulo 7 Programaci´on estructurada
- 7.1 Introducci´on
- 7.2 Aspectos te´oricos
- 7.2.1 Programas y diagramas de flujo
- 7.2.2 Diagramas y diagramas propios
- 7.2.3 Diagramas BJ (de B¨ohm y Jacopini)
- 7.2.4 Equivalencia de diagramas
- 7.2.5 Teoremas de la programaci´on estructurada
- 7.2.6 Recapitulaci´on
- 7.3 Aspectos metodol´ogicos
- 7.3.1 Seudoc´odigo
- 7.3.2 Dise˜no descendente
- estructuradas 7.4 Refinamiento correcto de programas con instrucciones
- 7.4.1 Un ejemplo detallado x ´Indice
- 7.4.2 Recapitulaci´on
- 7.5 Conclusi´on
- 7.6 Ejercicios
- 7.7 Referencias bibliogr´aficas
- Tema III Subprogramas
- Cap´ıtulo 8 Procedimientos y funciones
- 8.1 Introducci´on
- 8.2 Subprogramas con par´ametros
- 8.2.1 Descripci´on de un subprograma con par´ametros
- 8.2.2 Par´ametros formales y reales
- 8.2.3 Mecanismos de paso de par´ametros
- 8.2.4 Consistencia entre definici´on y llamada
- 8.3 Estructura sint´actica de un subprograma
- 8.4 Funcionamiento de una llamada
- 8.5 Ambito y visibilidad de los identificadores´
- 8.5.1 Tipos de identificadores seg´un su ´ambito
- 8.5.2 Estructura de bloques
- 8.5.3 Criterios de localidad
- 8.5.4 Efectos laterales
- 8.6 Otras recomendaciones sobre el uso de par´ametros
- 8.6.1 Par´ametros por valor y por referencia
- 8.6.2 Par´ametros por referencia y funciones
- 8.6.3 Funciones con resultados m´ultiples
- 8.7 Desarrollo correcto de subprogramas
- 8.8 Ejercicios - subprogramas Cap´ıtulo 9 Aspectos metodol´ogicos de la programaci´on con
- 9.1 Introducci´on
- 9.2 Un ejemplo de referencia
- 9.3 Metodolog´ıa de la programaci´on con subprogramas
- 9.3.1 Dise˜no descendente con subprogramas
- 9.3.2 Programa principal y subprogramas ´Indice xi
- 9.3.3 Documentaci´on de los subprogramas
- 9.3.4 Tama˜no de los subprogramas
- estructuradas 9.3.5 Refinamiento con subprogramas y con instrucciones
- 9.4 Estructura jer´arquica de los subprogramas
- 9.5 Ventajas de la programaci´on con subprogramas
- 9.6 Un ejemplo detallado: representaci´on de funciones
- 9.7 Ejercicios
- Cap´ıtulo 10 Introducci´on a la recursi´on
- 10.1 Un ejemplo de referencia
- 10.2 Conceptos b´asicos
- 10.3 Otros ejemplos recursivos
- 10.3.1 La sucesi´on de Fibonacci
- 10.3.2 Torres de Hanoi
- 10.3.3 Funci´on de Ackermann
- 10.4 Correcci´on de subprogramas recursivos
- 10.4.1 Principios de inducci´on
- 10.5 Recursi´on mutua
- 10.6 Recursi´on e iteraci´on
- 10.7 Ejercicios
- 10.8 Referencias bibliogr´aficas
- Tema IV Tipos de datos definidos por el programador
- Cap´ıtulo 11 Tipos de datos simples y compuestos
- 11.1 Tipos ordinales definidos por el programador
- 11.1.1 Tipos enumerados
- 11.1.2 Tipo subrango
- 11.2 Definici´on de tipos
- 11.2.1 Observaciones sobre la definici´on de tipos
- 11.3 Conjuntos
- 11.3.1 Operaciones sobre el tipo conjunto
- 11.3.2 Observaciones sobre el tipo conjunto
- 11.3.3 Un ejemplo de aplicaci´on xii ´Indice
- 11.4 Ejercicios
- Cap´ıtulo 12 Arrays
- 12.1 Descripci´on del tipo de datos array
- 12.1.1 Operaciones del tipo array y acceso a sus componentes
- 12.1.2 Caracter´ısticas generales de un array
- 12.2 Vectores
- 12.3 Matrices
- 12.4 Ejercicios
- Cap´ıtulo 13 Registros
- 13.1 Descripci´on del tipo de datos registro
- 13.1.1 Manejo de registros: acceso a componentes y operaciones
- 13.1.2 Registros con variantes
- 13.2 Arrays de registros y registros de arrays
- 13.3 Ejercicios
- Cap´ıtulo 14 Archivos
- 14.1 Descripci´on del tipo de datos archivo
- 14.2 Manejo de archivos en Pascal
- 14.2.1 Operaciones con archivos
- 14.3 Archivos de texto
- 14.4 Ejercicios
- Cap´ıtulo 15 Algoritmos de b´usqueda y ordenaci´on
- 15.1 Algoritmos de b´usqueda en arrays
- 15.1.1 B´usqueda secuencial
- 15.1.2 B´usqueda secuencial ordenada
- 15.1.3 B´usqueda binaria
- 15.2 Ordenaci´on de arrays
- 15.2.1 Selecci´on directa
- 15.2.2 Inserci´on directa
- 15.2.3 Intercambio directo
- 15.2.4 Ordenaci´on r´apida (Quick Sort)
- 15.2.5 Ordenaci´on por mezcla (Merge Sort)
- 15.2.6 Vectores paralelos ´Indice xiii
- 15.3 Algoritmos de b´usqueda en archivos secuenciales
- 15.3.1 B´usqueda en archivos arbitrarios
- 15.3.2 B´usqueda en archivos ordenados
- 15.4 Mezcla y ordenaci´on de archivos secuenciales
- 15.5 Ejercicios
- 15.6 Referencias bibliogr´aficas
- Tema V Memoria din´amica
- Cap´ıtulo 16 Punteros
- 16.1 Introducci´on al uso de punteros
- 16.1.1 Definici´on y declaraci´on de punteros
- 16.1.2 Generaci´on y destrucci´on de variables din´amicas
- 16.1.3 Operaciones b´asicas con datos apuntados
- 16.1.4 Operaciones b´asicas con punteros
- 16.1.5 El valor nil
- 16.2 Aplicaciones no recursivas de los punteros
- 16.2.1 Asignaci´on de objetos no simples
- 16.2.2 Funciones de resultado no simple
- 16.3 Ejercicios
- Cap´ıtulo 17 Estructuras de datos recursivas
- 17.1 Estructuras recursivas lineales: las listas enlazadas
- 17.1.1 Una definici´on del tipo lista
- 17.1.2 Inserci´on de elementos
- 17.1.3 Eliminaci´on de elementos
- 17.1.4 Algunas funciones recursivas
- 17.1.5 Otras operaciones sobre listas
- 17.2 Pilas
- 17.2.1 Definici´on de una pila como lista enlazada
- 17.2.2 Operaciones b´asicas sobre las pilas
- 17.2.3 Aplicaciones
- 17.3 Colas
- 17.3.1 Definici´on del tipo cola
- 17.3.2 Operaciones b´asicas xiv ´Indice
- 17.3.3 Aplicaci´on: gesti´on de la caja de un supermercado
- 17.4 Arboles binarios´
- 17.4.1 Recorrido de un ´arbol binario
- 17.4.2 Arboles de b´´ usqueda
- 17.4.3 Aplicaciones
- 17.5 Otras estructuras din´amicas de datos
- 17.6 Ejercicios
- 17.7 Referencias bibliogr´aficas
- Tema VI Aspectos avanzados de programaci´on
- Cap´ıtulo 18 Complejidad algor´ıtmica
- 18.1 Conceptos b´asicos
- 18.2 Medidas del comportamiento asint´otico
- 18.2.1 Comportamiento asint´otico
- 18.2.2 Notaci´on O may´uscula (una cota superior)
- 18.2.3 Notaci´on Ω may´uscula (una cota inferior)
- 18.2.4 Notaci´on Θ may´uscula (orden de una funci´on)
- 18.2.5 Propiedades de O, Ω y Θ
- 18.2.6 Jerarqu´ıa de ´ordenes de frecuente aparici´on
- 18.3 Reglas pr´acticas para hallar el coste de un programa
- 18.3.1 Tiempo empleado
- 18.3.2 Ejemplos
- 18.3.3 Espacio de memoria empleado
- 18.4 Utiles matem´´ aticos
- 18.4.1 F´ormulas con sumatorios
- 18.4.2 Sucesiones de recurrencia lineales de primer orden
- 18.4.3 Sucesiones de recurrencia de orden superior
- 18.5 Ejercicios
- 18.6 Referencias bibliogr´aficas
- Cap´ıtulo 19 Tipos abstractos de datos
- 19.1 Introducci´on
- 19.2 Un ejemplo completo
- 19.2.1 Desarrollo de programas con tipos concretos de datos ´Indice xv
- 19.2.2 Desarrollo de programas con tipos abstractos de datos
- 19.2.3 Desarrollo de tipos abstractos de datos
- 19.3 Metodolog´ıa de la programaci´on de TADs
- 19.3.1 Especificaci´on de tipos abstractos de datos
- 19.3.2 Implementaci´on de tipos abstractos de datos
- 19.3.3 Correcci´on de tipos abstractos de datos
- 19.4 Resumen
- 19.5 Ejercicios
- 19.6 Referencias bibliogr´aficas
- Cap´ıtulo 20 Esquemas algor´ıtmicos fundamentales
- 20.1 Algoritmos devoradores
- 20.1.1 Descripci´on
- 20.1.2 Adecuaci´on al problema
- 20.1.3 Otros problemas resueltos vorazmente
- 20.2 Divide y vencer´as
- 20.2.1 Equilibrado de los subproblemas
- 20.3 Programaci´on din´amica
- 20.3.1 Problemas de programaci´on din´amica
- 20.3.2 Mejora de este esquema
- 20.3.3 Formulaci´on de problemas de programaci´on din´amica
- 20.4 Vuelta atr´as
- 20.4.1 Mejora del esquema de vuelta atr´as
- 20.5 Anexo: algoritmos probabilistas
- 20.5.1 B´usqueda de una soluci´on aproximada
- 20.5.2 B´usqueda de una soluci´on probablemente correcta
- 20.6 Ejercicios
- 20.7 Referencias bibliogr´aficas
- Ap´endices
- Ap´endice A Aspectos complementarios de la programaci´on
- A.1 Subprogramas como par´ametros
- A.1.1 Ejemplo 1: derivada
- A.1.2 Ejemplo 2: bipartici´on xvi ´Indice
- A.1.3 Ejemplo 3: transformaci´on de listas
- A.2 Variables aleatorias
- A.2.1 Generaci´on de n´umeros aleatorios en Turbo Pascal
- A.2.2 Simulaci´on de variables aleatorias
- A.2.3 Ejemplos de aplicaci´on
- A.3 Ejercicios
- A.4 Referencias bibliogr´aficas
- Ap´endice B El lenguaje Turbo Pascal
- B.1 Elementos l´exicos
- B.2 Estructura del programa
- B.3 Datos num´ericos enteros
- B.4 Datos num´ericos reales
- B.5 Cadenas de caracteres
- B.5.1 Declaraci´on de cadenas
- B.5.2 Operadores de cadenas
- B.5.3 Funciones de cadenas
- B.5.4 Procedimientos de cadenas
- B.6 Tipos de datos estructurados
- B.7 Instrucciones estructuradas
- B.8 Paso de subprogramas como par´ametros
- B.9 Archivos
- B.10 Memoria din´amica
- B.11 Unidades
- B.11.1 Unidades predefinidas de Turbo Pascal
- B.11.2 Unidades definidas por el usuario
- B.11.3 Modularidad incompleta de Turbo Pascal
- Ap´endice C El entorno integrado de desarrollo
- C.1 Descripci´on del entorno
- C.2 Desarrollo completo de un programa en Turbo Pascal
- C.2.1 Arranque del entorno
- C.2.2 Edici´on del programa fuente
- C.2.3 Grabar el programa fuente y seguir editando
- C.2.4 Compilaci´on ´Indice xvii
- C.2.5 Ejecuci´on
- C.2.6 Depuraci´on
- C.2.7 Salida de Turbo Pascal
- C.3 Otros men´us y opciones
- C.3.1 Search (B´usqueda)
- C.3.2 Tools (Herramientas)
- C.3.3 Options (Opciones)
- C.3.4 Window (Ventana)
- C.3.5 Help (Ayuda)
- C.4 Ejercicios
- C.5 Referencias bibliogr´aficas
- Bibliograf´ıa
- ´Indice alfab´etico
xx Presentaci´on
En cambio, encontramos este enfoque interesante en niveles superiores de la ense˜nanza de la programaci´on, donde interesa concentrarse en los con- ceptos, m´as dif´ıciles y donde ya no supone obst´aculo alguno expresar las ideas en cualquier lenguaje de programaci´on.
El enfoque adoptado en este libro recoge ambos aspectos: por un lado, viene a cubrir la necesidad de un enfoque metodol´ogico en el aprendizaje y en el ejercicio de la programaci´on, pero tambi´en la necesidad de experimentar con programas concretos, expresarlos en un lenguaje real y hacerlos funcionar con un traduc- tor concreto. En resumen, intentamos compaginar las ventajas de los enfoques anteriores, presentando la base conceptual y metodol´ogica necesaria para desa- rrollar los algoritmos de forma razonada y disciplinada, sin olvidar por ello la conveniencia de expresarlos en un lenguaje de programaci´on, materializ´andolos y experimentando con ellos, y que el lector ha de ser instruido tambi´en en esta tarea. En relaci´on con el enfoque metodol´ogico que se impone actualmente, se con- sidera necesario atender a la correcci´on de los programas. El tratamiento que se le da en la literatura ha llevado nuevamente a dos posturas artificialmente extremas:
- Algunos autores ignoran completamente el estudio de la correcci´on, con- tent´andose con algunas comprobaciones para deducir que un programa es correcto.
- En cambio, otros adoptan un tratamiento exhaustivo, utilizando t´ecnicas formales de especificaci´on o verificaci´on.
A nuestro entender, es incuestionable la importancia de garantizar que los programas desarrollados funcionar´an de la forma deseada. Sin embargo, la ve- rificaci´on formal de los programas de cierto tama˜no es impracticable. Por ello, asumimos de nuevo una posici´on intermedia y realista consistente en los siguien- tes planteamientos:
- Plantear el desarrollo de programas correctos con el empleo de t´ecnicas semiformales.
- Limitar el estudio de la correcci´on a los elementos que resulten delicados, bien por su dificultad o por su novedad.
- Atender a la correcci´on de los algoritmos durante su desarrollo en lugar de a posteriori. Esta idea resulta ser una ayuda esencial en el aprendizaje de la programaci´on.
Presentaci´on xxi
En resumidas cuentas, este libro va dirigido a aqu´ellos que desean introdu- cirse en la programaci´on, con una base s´olida, con una buena metodog´ıa de dise˜no y desarrollo de programas correctos y con h´abitos disciplinados desde una perspectiva realista y pragm´atica. Se presentan las t´ecnicas con un cierto ni- vel de abstracci´on para identificar los conceptos esenciales e independientes del lenguaje de programaci´on empleado, y al mismo tiempo se aterriza expresando estas t´ecnicas en un lenguaje concreto. El lenguaje escogido para estas implementaciones ha sido Pascal. Esta elec- ci´on se debe a que este lenguaje es simple y tiene una sintaxis sencilla, que hace que sea f´acil de aprender, y al mismo tiempo es lo bastante completo como para plasmar las diferentes t´ecnicas y m´etodos necesarios en programas de com- plejidad media-alta. Esto lo hace una herramienta pedag´ogica id´onea para el aprendizaje de la programaci´on. A todo esto hay que sumar las numerosas im- plementaciones existentes y su accesibilidad, as´ı como su evoluci´on y continua puesta al d´ıa para permitir t´ecnicas de programaci´on actuales (por ejemplo, mo- dular u orientada a los objetos) y su gran difusi´on y aceptaci´on en el ´ambito acad´emico.
Organizaci´on del libro
El libro est´a estructurado en siete partes. En cada una de ellas se estudian las t´ecnicas y mecanismos nuevos, conceptualmente primero, detallando luego su tratamiento en Pascal y, finalmente, compaginando ambas facetas con el as- pecto metodol´ogico. Cada tema se ha dividido en varios cap´ıtulos para evitar una excesiva fragmentaci´on. En cada cap´ıtulo se ha incluido una lista de ejerci- cios propuestos de dificultad aproximadamente creciente. Al final de cada tema se desarrolla un ejemplo completo pensado para mostrar a la vez los aspectos m´as destacados del mismo, as´ı como unas pocas referencias comentadas que se sugieren como lecturas complementarias o de consulta.
Contenido
El contenido se ha seleccionado partiendo de las directrices se˜naladas en [DCG+89] y [Tur91]. Incluye los contenidos cursos CS1 y CS2 [GT86, KSW85] salvo los aspectos de organizaci´on de computadores, que se estudian en [PAO94], de los mismos autores que este libro. En el primer tema se presentan, entre otros, los conceptos esenciales de algo- ritmo, dato y programa. Se introduce el lenguaje Pascal y la estructura de los programas escritos en ´el, as´ı como los elementos b´asicos del lenguaje. Se incluyen