libro -introduccion a ciencias de la computacion con java

Upload: frank-richard-palomino-cardenas

Post on 09-Jul-2015

2.432 views

Category:

Documents


2 download

TRANSCRIPT

Introduccin a Ciencias de la o Computacin I o(con Java)

Elisa Viso G. Canek Pelez V. aFacultad de Ciencias, UNAM

Indice general1. Introduccin o 1.1. Conceptos generales . . . . . . . . 1.2. Historia . . . . . . . . . . . . . . 1.3. Sistemas numricos . . . . . . . . e 1.4. La arquitectura de von Neumann 1.5. Ejecucin de programas . . . . . o 1.6. Caracter sticas de Java . . . . . . 2. El 2.1. 2.2. 2.3. 1 2 3 6 13 25 27 29 29 41 46 55 55 62 90

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

proceso del software Qu es la programacin? . . . . . . . . . . . . . . . . . . . . . . . e o Diseo orientado a objetos . . . . . . . . . . . . . . . . . . . . . . . n Diseo estructurado . . . . . . . . . . . . . . . . . . . . . . . . . . . n

3. Clases y objetos 3.1. Tarjetas de responsabilidades . . . . . . . . . . . . . . . . . . . . . 3.2. Programacin en Java . . . . . . . . . . . . . . . . . . . . . . . . . o 3.3. Expresiones en Java . . . . . . . . . . . . . . . . . . . . . . . . . . .

4. Manejo de cadenas y expresiones 99 4.1. Manejo de cadenas en Java . . . . . . . . . . . . . . . . . . . . . . . 99 4.2. Implementacin de una base de datos . . . . . . . . . . . . . . . . . 104 o 4.3. Una clase Menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 5. Datos estructurados 141 5.1. La clase para cada registro . . . . . . . . . . . . . . . . . . . . . . . 142 5.2. La lista de registros . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 6. Herencia 6.1. Extensin de clases . . . . . . . . . . . . . . . . . . . . . . . . . . . o 6.2. Arreglos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6.3. Aspectos principales de la herencia . . . . . . . . . . . . . . . . . . 167 167 171 189

II

INDICE GENERAL 6.4. 6.5. 6.6. Polimorsmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Clases abstractas . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196

7. Administracin de la memoria durante ejecucin o o 199 7.1. El stack y el heap . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 7.2. Recursividad . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223 8. Ordenamientos usando estructuras de datos 8.1. Base de datos en un arreglo . . . . . . . . . . . . . . . . . . . . . . 8.2. Mantenimiento del orden con listas ligadas . . . . . . . . . . . . . . 8.3. *Ordenamiento usando rboles . . . . . . . . . . . . . . . . . . . . . a 9. Manejo de errores en ejecucin o 9.1. Tipos de errores . . . . . . . . . . . . . 9.2. La clase Exception . . . . . . . . . . . . 9.3. Cmo detectar y cachar una excepcin o o 9.4. Las clases que extienden a Exception . 9.5. El enunciado nally . . . . . . . . . . . 9.6. Restricciones para las excepciones . . . 9.7. Recomendaciones generales . . . . . . . 239 239 258 265 289 289 294 296 305 311 316 319 321 321 324 324 329 333 352 353 367 395 410 411 411 412 415 418 424

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

. . . . . . .

10.Entrada y salida 10.1. Conceptos generales . . . . . . . . . . . . 10.2. Jerarqu de clases . . . . . . . . . . . . a 10.3. Entrada y salida de bytes . . . . . . . . 10.4. Entrada y salida de carcteres . . . . . . a 10.5. El manejo del men de la aplicacin . . . u o 10.6. Redireccionamiento de in, out y err . . . 10.7. Persistencia de la base de datos . . . . . 10.8. Escritura y lectura de campos que no son 10.9. Lectura y escritura de objetos . . . . . . 10.10. Colofn . . . . . . . . . . . . . . . . . . o 11.Hilos de ejecucin o 11.1. Qu es un hilo de ejecucin? . . . . e o 11.2. La clase Thread . . . . . . . . . . . . 11.3. La interfaz Runnable . . . . . . . . . 11.4. Sincronizacin de hilos de ejecucin . o o 11.5. Comunicacin entre hilos de ejecucin o o

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . cadenas . . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

INDICE GENERAL 11.6. 11.7. 11.8. 11.9. 11.10. 11.11. Alternativas para la programacin de procesos . o Abrazo mortal (deadlock ) . . . . . . . . . . . . Cmo se termina la ejecucin de un proceso . . o o Terminacin de la aplicacin . . . . . . . . . . . o o Depuracin en hilos de ejecucin . . . . . . . . . o o Otros temas relacionados con hilos de ejecucin o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

III

432 435 439 446 449 451

Indice de guras1.1. 1.2. 1.3. 1.4. 1.5. 1.6. 1.7. 1.8. Arquitectura de von Neumann . . . . . . . . . . . . . . . . Proceso para ejecutar un programa escrito en ensamblador Codicacin en ensamblador de frmulas matemticas. . . o o a Enteros en signo y magnitud. . . . . . . . . . . . . . . . . Nmeros en complemento a 2 . . . . . . . . . . . . . . . . u Suma de dos nmeros con complemento a 2 . . . . . . . . u Sumando 1 al mximo entero positivo . . . . . . . . . . . . a Notacin de punto jo. . . . . . . . . . . . . . . . . . . . . o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 15 17 19 21 21 22 23 30 40 48 49 49 50 50 50 51 51 52 53 54 58 58 59 60 61 64 64 65

2.1. Proceso del software. . . . . . . . . . . . . . . . . . . . . . . . . . 2.2. Arbol de herencia en clases. . . . . . . . . . . . . . . . . . . . . . 2.3. Uso de llaves para denotar composicin. . . . . . . . . . . . . . . o 2.4. Iteracin en diagramas de Warnier-Orr. . . . . . . . . . . . . . . . o 2.5. Seleccin en diagramas de Warnier-Orr. . . . . . . . . . . . . . . . o 2.6. Diagramas de Warnier-Orr para secuencia. . . . . . . . . . . . . . 2.7. Diagramas de Warnier-Orr para iteracin. . . . . . . . . . . . . . o 2.8. Diagrama de Warnier-Orr para seleccin. . . . . . . . . . . . . . . o 2.9. Estado inicial de todo diagrama de Warnier-Orr. . . . . . . . . . . 2.10. Diagrama inicial para encontrar factores primos. . . . . . . . . . . 2.11. Diagrama de Warnier-Orr para procesar cada k. . . . . . . . . . . 2.12. Diagrama para determinar si k es primo. . . . . . . . . . . . . . . 2.13. Diagrama de Warnier-Orr para obtener factores primos de un entero. 3.1. 3.2. 3.3. 3.4. 3.5. 3.6. 3.7. 3.8. Tarjetas de clasicacin y acceso. . . . . . . . . . . . o Tarjeta de responsabilidades de la clase Reloj . . . . Tarjeta de responsabilidades para la clase Manecilla. Tarjeta de colaboraciones de la clase Manecilla. . . Tarjeta de colaboraciones de la clase Reloj. . . . . . Encabezado de una interfaz. . . . . . . . . . . . . . . Sintaxis para el xaccesoy. . . . . . . . . . . . . . . . . Reglas para la formacin de un xidenticadory. . . . . o . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

VI

INDICE DE FIGURAS 3.9. Encabezado de una clase. . . . . . . . . . . . . 3.10. Encabezado para los mtodos de acceso. . . . e 3.11. Especicacin de parmetros. . . . . . . . . . o a 3.12. Encabezado de un constructor. . . . . . . . . 3.13. Declaracin de un atributo . . . . . . . . . . . o 3.14. Acceso a atributos o mtodos de objetos . . . e 3.15. Sintaxis para la implementacin de un mtodo o e 3.16. Declaracin de variables locales . . . . . . . . o 3.17. El enunciado de asignacin . . . . . . . . . . . o 3.18. Construccin de objetos . . . . . . . . . . . . o 3.19. Invocacin de mtodo . . . . . . . . . . . . . . o e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 69 71 76 79 81 83 84 87 88 88 105 111 112 114 116 117 118 119 120 121 121 124 125 126 127 128 130 131 132 142 150 151 152 152 153 154 155

4.1. Tarjeta de responsabilidades para Curso. . . . . . . . . . . . . . . 4.2. Tarjeta de responsabilidades para Curso. . . . . . . . . . . . . . . 4.3. Diagrama de Warnier-Orr para los constructores. . . . . . . . . . 4.4. Diagrama de Warnier-Orr para regresar el contenido de un campo. 4.5. Encontrar el nmero de registro al que pertenece una subcadena. . u 4.6. Edicin del i-simo registro, si es que existe. . . . . . . . . . . . . o e 4.7. Algoritmos para listar el curso. . . . . . . . . . . . . . . . . . . . 4.8. Enunciado compuesto while. . . . . . . . . . . . . . . . . . . . . . 4.9. Encontrar el l mite de 21 , dado . . . . . . . . . . . . . . . . . . n 4.10. Sumar nmero mientras no me den un 1 . . . . . . . . . . . . . u 4.11. Enunciado compuesto do . . . while . . . . . . . . . . . . . . . . . 4.12. Algoritmo para agregar un estudiante. . . . . . . . . . . . . . . . 4.13. Posibles situaciones para eliminar a un registro. . . . . . . . . . . 4.14. Algoritmo para eliminar a un estudiante de la lista. . . . . . . . . 4.15. Enunciado compuesto condicional . . . . . . . . . . . . . . . . . . 4.16. Mtodo que encuentra TODOS los que contienen a una subcadena. e 4.17. Men para uso de la clase Curso. . . . . . . . . . . . . . . . . . . u 4.18. Enunciado switch. . . . . . . . . . . . . . . . . . . . . . . . . . . 4.19. Enunciado break. . . . . . . . . . . . . . . . . . . . . . . . . . . . 5.1. 5.2. 5.3. 5.4. 5.5. 5.6. 5.7. 5.8. Ilustracin de una lista . . . . . . . . . . . . . . . . . . . o Contando los registros de una lista . . . . . . . . . . . . Procesando los registros de una lista . . . . . . . . . . . Agregando al principio de la lista . . . . . . . . . . . . . Esquema del agregado un registro al principio de la lista Agregando al nal de la lista . . . . . . . . . . . . . . . . Agregando al nal de la lista . . . . . . . . . . . . . . . . Imprimiendo todos los registros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

INDICE DE FIGURAS 5.9. Imprimiendo registros seleccionados . . . . . . 5.10. Patrn de bsqueda de un registro que cumpla o u 5.11. Eliminacin de un estudiante . . . . . . . . . o 5.12. Eliminacin de un registro en una lista . . . . o . . . . . con . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

VII

156 157 159 160 174 174 174 175 176 177 177 177 179 184 188 194 200 203 203 205 206 209 209 210 210 211 212 213 214 215 215 216 217 218 219 219 220 221

6.1. intr s primos = {2,3,5,7,11}; . . . . . . . . . . . . . . . 6.2. oat [ ] vector = { 3.14, 8.7, 19.0}; . . . . . . . . . . . 6.3. String [ ] cadenas = { S No}; . . . . . . . . . . . , 6.4. Declaracin del contenido de un arreglo de objetos . . . o 6.5. int r s primos = new intr5s; . . . . . . . . . . . . . . . 6.6. EstudianteBasicor s estudiantes = . . . . . . . . . . . . . 6.7. oatr s vector = oatr3s; . . . . . . . . . . . . . . . . 6.8. Stringr s cadenas = new Stringr2s; . . . . . . . . . . . . 6.9. Reasignacin de arreglos . . . . . . . . . . . . . . . . . o 6.10. Acomodo en memoria de un arreglo de dos dimensiones 6.11. Ejecucin de la clase Arreglos . . . . . . . . . . . . . o 6.12. Jerarqu de clases . . . . . . . . . . . . . . . . . . . . a

7.1. Estructura de bloques de un programa. . . . . . . . . . . . 7.2. Diagrama de anidamiento dinmico. . . . . . . . . . . . . . a 7.3. Secuencia de llamadas en el listado 7.1. . . . . . . . . . . . 7.4. Esquema de una stack o pila. . . . . . . . . . . . . . . . . 7.5. Algoritmo para ejecutar un programa. . . . . . . . . . . . 7.6. Estado del stack al iniciarse la ejecucin de una clase. . . . o 7.7. El stack al iniciarse la llamada a main. . . . . . . . . . . . 7.8. Registro de activacin para main. . . . . . . . . . . . . . . o 7.9. El stack listo para iniciar la ejecucin de main. . . . . . . . o 7.10. El stack durante la ejecucin de main. . . . . . . . . . . . . o 7.11. El stack durante la ejecucin de A. . . . . . . . . . . . . . o 7.12. El stack antes de empezar a ejecutar B. . . . . . . . . . . . 7.13. El stack antes de empezar a ejecutar C desde la l nea #16:. 7.14. El stack al terminar de ejecutarse C(). . . . . . . . . . . . 7.15. El stack al terminar la ejecucin de B(10,3). . . . . . . . . o 7.16. El stack al terminar la ejecucin de A(10). . . . . . . . . . o 7.17. El stack antes de la ejecucin de B(3,2). . . . . . . . . . . o 7.18. El stack antes de la ejecucin de C(). . . . . . . . . . . . . o 7.19. El stack al terminar la ejecucin deC(). . . . . . . . . . . . o 7.20. El stack al terminar la ejecucin de B(3,2). . . . . . . . . . o 7.21. El stack antes de empezar la ejecucin de C(). . . . . . . . o 7.22. El stack listo para iniciar la ejecucin de main. . . . . . . . o

VIII

INDICE DE FIGURAS 7.23. Estado del stack al iniciarse la ejecucin de una clase. . . . . . . . o 7.24. Estado del stack al iniciarse la llamada de factorial desde main. . . 7.25. Estado del stack al iniciarse la llamada de factorial desde factorial. 7.26. Estado del stack al iniciarse la llamada de factorial desde factorial. 7.27. Estado del stack al iniciarse la llamada de factorial desde factorial. 7.28. Estado del stack al terminarse la llamada de factorial(1). . . . . . 7.29. Estado del stack al terminarse la llamada de factorial(2). . . . . . 7.30. Estado del stack al terminarse la llamada de factorial(3). . . . . . 7.31. Estado del stack al terminarse la llamada de factorial desde main. . 7.32. Juego de las torres de Hanoi . . . . . . . . . . . . . . . . . . . . . 7.33. Estrategia recursiva para las torres de Hanoi . . . . . . . . . . . . 7.34. Secuencia de llamadas en la torres de Hanoi . . . . . . . . . . . . 7.35. Situacin de las chas antes de la llamada . . . . . . . . . . . . . o 7.36. Movimientos /* 1 */ al /* 3 */ . . . . . . . . . . . . . . . . . . . 7.37. Movimiento /* 4 */ . . . . . . . . . . . . . . . . . . . . . . . . . . 7.38. Movimientos /* 5 */ al /* 7 */ . . . . . . . . . . . . . . . . . . . 7.39. Movimiento /* 8 */ . . . . . . . . . . . . . . . . . . . . . . . . . . 7.40. Movimientos /* 9 */ al /* 11 */ . . . . . . . . . . . . . . . . . . . 7.41. Movimiento /* 12 */ . . . . . . . . . . . . . . . . . . . . . . . . . 7.42. Movimientos /* 13 */ al /* 15 */ . . . . . . . . . . . . . . . . . . 8.1. Algoritmo para eliminar a un estudiante . . . . . . 8.2. Agregando al principio de la lista . . . . . . . . . . 8.3. Agregando en medio de la lista . . . . . . . . . . . 8.4. Agregando un registro en orden . . . . . . . . . . . 8.5. Denicin recursiva de un rbol . . . . . . . . . . . o a 8.6. Arbol binario bien organizado . . . . . . . . . . . . 8.7. Arbol que se forma si los registros vienen ordenados 8.8. Agregar un registro manteniendo el orden . . . . . 8.9. Ejemplo simple para recorridos de rboles . . . . . a 8.10. Recorrido simtrico de un rbol . . . . . . . . . . . e a 8.11. Recorrido en preorden de un rbol . . . . . . . . . . a 8.12. Bsqueda en un rbol ordenado . . . . . . . . . . . u a 8.13. Bsqueda de una subcadena . . . . . . . . . . . . . . u 8.14. Seleccin de registros que cumplen una condicin . o o 8.15. Algoritmo para encontrar el menor de un subrbol . a 8.16. Eliminacin de un nodo en un rbol . . . . . . . . . o a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224 225 226 227 228 229 230 231 231 233 233 235 236 236 236 237 237 237 238 238 255 262 263 264 266 267 269 271 273 274 276 277 278 280 283 284

9.1. Ejecucin de AritmExc . . . . . . . . . . . . . . . . . . . . . . . . 291 o 9.2. Ejecucin de ArraySE . . . . . . . . . . . . . . . . . . . . . . . . 291 o

INDICE DE FIGURAS 9.3. 9.4. 9.5. 9.6. 9.7. 9.8. 9.9. Ejecucin del programa ClassCE . . . . . . . . . . . o Deteccin y manejo de excepciones . . . . . . . . . . o Excepciones de tiempo de ejecucin cachadas con una o Ejecucin con relanzamiento de la excepcin . . . . . o o Ejecucin de CaracteristicasExtra . . . . . . . . . o Ejecucin de FinallyTrabaja . . . . . . . . . . . . . o Ejecucin de SiempreFinally . . . . . . . . . . . . . o . . . . . . . . . . . . superclase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

IX

292 296 298 300 310 312 315 322 323 323 323 325 328 329 330 330 360 363 368 375 377 385 392 406 406 413 415 417 430 435 436 438 440 443 449 450

10.1. Algoritmo para el uso de ujos de entrada . . . . . . . . . . . . . 10.2. Algoritmo para el uso de ujos de salida . . . . . . . . . . . . . . 10.3. Funcionamiento de ujo de entrada . . . . . . . . . . . . . . . . . 10.4. Funcionamiento de ujo de salida . . . . . . . . . . . . . . . . . . 10.5. Jerarqu de clases para InputStream. . . . . . . . . . . . . . . . . a 10.6. Jerarqu de clases para OutputStream. . . . . . . . . . . . . . . . a 10.7. Jerarqu de clases para Writer. . . . . . . . . . . . . . . . . . . . a 10.8. Jerarqu de clases para Reader. . . . . . . . . . . . . . . . . . . . a 10.9. Entrada/Salida con proceso intermedio (ltros) . . . . . . . . . . 10.10. lgoritmo para guardar la base de datos en disco . . . . . . . . . A 10.11. lgoritmo para leer registros desde disco . . . . . . . . . . . . . . A 10.12. ormato de un archivo binario autodescrito . . . . . . . . . . . . . F 10.13. lgoritmo para escribir archivo binario . . . . . . . . . . . . . . . A 10.14. lgoritmo para leer de archivo binario . . . . . . . . . . . . . . . A 10.15. lgoritmo para agregar registros desde archivo de acceso directo . A 10.16. lgoritmo para sobrescribir registros en archivo de acceso directo A 10.17. lgoritmo para la lectura de objetos . . . . . . . . . . . . . . . . A 10.18. scritura a un ujo de objetos . . . . . . . . . . . . . . . . . . . . E 11.1. Salida de PingPong. . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2. Salida con asignacin de nombres. . . . . . . . . . . . . . . . . . . o 11.3. Salida de RunPingPong. . . . . . . . . . . . . . . . . . . . . . . . . 11.4. Salida que produce el servidor de impresin. . . . . . . . . . . . . o 11.5. Ejecucin con desalojo voluntario. . . . . . . . . . . . . . . . . . . o 11.6. Ejecucin con la posibilidad de abrazo mortal. . . . . . . . . . . . o 11.7. Ejecucin de Apapachosa2 con abrazo mortal . . . . . . . . . . . . o 11.8. Implementacin de destroy en la mquina virtual de Java. . . . . o a 11.9. Interrupcin de un hilo de ejecucin desde el programa principal. . o o 11.10. erminacin de procesos que son demonios . . . . . . . . . . . . . T o 11.11. erminacin de procesos . . . . . . . . . . . . . . . . . . . . . . . T o

Indice de algoritmos y listados1.1. Algoritmo para pasar de base 10 a base h. . . . . . . . . . . . . . 1.2. Sumando dos nmeros representados con signo y magnitud. . . . . u 3.1. Encabezado de la interfaz para Reloj (ServiciosReloj) . . 3.2. Encabezado de la interfaz para Manecilla (ServiciosManecilla) 3.3. Acceso a atributos privados de Manecilla . . . . . . . . . . . . . 3.4. Mtodos de implementacin de la interfaz ServiciosManecilla . . e o 3.5. Mtodos de implementacin de la interfaz ServiciosReloj . . . . . e o 3.6. Mtodos de manipulacin para la interfaz ServiciosManecilla . . . e o 3.7. Mtodos de Manipulacin para la interfaz ServiciosReloj . . . . . e o 3.8. Encabezados para la implementacin de Reloj y Manecilla . . . . o 3.9. Constructores para la clase Reloj . . . . . . . . . . . . . . . . . . 3.10. Constructores para la clase Manecilla . . . . . . . . . . . . . . . . 3.11. Mtodos con la misma rma . . . . . . . . . . . . . . . . . . . . . e 3.12. Declaracin de atributos de las clases . . . . . . . . . . . . . . . . o 3.13. Encabezado para el mtodo main . . . . . . . . . . . . . . . . . . e 3.14. Acceso a atributos de los objetos . . . . . . . . . . . . . . . . . . 3.15. Bloqueo de nombres de atributos . . . . . . . . . . . . . . . . . . 3.16. Declaraciones locales en el mtodo muestra de Reloj . . . . . . . e 3.17. Versin nal del encabezado y declaraciones de muestra() . . . . o 3.18. Implementacin de los mtodos de acceso de la clase Manecilla . . o e 3.19. Constructores de la clase Reloj . . . . . . . . . . . . . . . . . . . 3.20. Constructores de la clase Manecillas . . . . . . . . . . . . . . . . 3.21. Implementacin de constructores de la clase Manecilla . . . . . . o 3.22. Implementacin de constructores de la clase Reloj . . . . . . . . . o 3.23. Mtodos de acceso de la clase Manecilla . . . . . . . . . . . . . . e 3.24. Mtodos de manipulacin de la clase Reloj . . . . . . . . . . . . . e o 3.25. Mtodos de manipulacin de la clase Manecilla . . . . . . . . . . e o 3.26. Mtodos de implementacin de la clase Reloj . . . . . . . . . . . e o 3.27. Clase usuaria de la clase Reloj . . . . . . . . . . . . . . . . . . . 4.1. Interfaz para el manejo de una base de datos . . . . . . . . . . . . . 10 . 20 . 66 . 66 . 71 . 72 . 72 . 73 . 73 . 74 . 76 . 77 . 78 . 80 . 80 . 82 . 83 . 85 . 86 . 87 . 89 . 89 . 94 . 94 . 95 . 95 . 96 . 96 . 97 . 105

XII

INDICE DE ALGORITMOS Y LISTADOS 4.2. Posicin de un registro que contenga una subcadena (Consultas) . . o 4.3. Posicin de un registro a partir de otra posicin (Consultas) . . . . o o 4.4. Clase que maneja listas de cursos (Curso) . . . . . . . . . . . . . . 4.5. Constructores para la clase Curso . . . . . . . . . . . . . . . . . . 4.6. Mtodo que regresa toda la lista (Curso) . . . . . . . . . . . . . . e 4.7. Clculo de la posicin donde empieza el i-simo registro (Curso) . . a o e 4.8. Mtodos que regresan el contenido de un campo (Curso) . . . . . . e 4.9. Mtodo que da el primer registro con subcadena (Curso) . . . . . . e 4.10. Mtodo que da el siguiente registro con subcadena (Curso) . . . . . e 4.11. Edicin de un registro individual (Curso) . . . . . . . . . . . . . . o 4.12. Clculo del l a mite de una sucesin . . . . . . . . . . . . . . . . . . o 4.13. Suma de nmeros le u dos . . . . . . . . . . . . . . . . . . . . . . . 4.14. Mtodo que lista todo el curso (Curso) . . . . . . . . . . . . . . . e 4.15. Mtodo que agrega un estudiante a la lista (Curso) . . . . . . . . . e 4.16. Mtodo que elimina al registro i (Curso) . . . . . . . . . . . . . . e 4.17. Mtodo que lista a los que cazan con . . . (Curso) . . . . . . . . . . e 4.18. Ejemplo de identicacin del estado civil de un individuo . . . . . . o 4.19. Encabezado de la clase Menu y el mtodo daMenu (MenuCurso) . e 4.20. Mtodos para agregar estudiante a la base de datos (MenuCurso) . e 4.21. Mtodo que reporta estudiante inexistente (MenuCurso) . . . . . . e 4.22. Mtodo principal de la clase MenuCurso . . . . . . . . . . . . . . e 5.1. Atributos de la clase Estudiante . . . . . . . . . . . . . . . . . . 5.2. Constructores para la clase Estudiante . . . . . . . . . . . . . . . 5.3. Mtodos de acceso y actualizacin de la clase Estudiante . . . . . e o 5.4. Mtodos que arman y actualizan registro completo (1) (Estudiante) e 5.5. Mtodos que arman y actualizan registro completo (2) (Estudiante) e 5.6. Atributos de la clase ListaCurso . . . . . . . . . . . . . . . . . . 5.7. Constructores para la clase ListaCurso 1/2 . . . . . 5.7. Constructores para la clase ListaCurso 2/2 . . . . . 5.8. Mtodos que dan valores de los atributos (ListaCurso) . . . . . . . e 5.9. Recorrido de una lista para contar sus registros (ListaCurso) . . . . 5.10. Modica el nmero de grupo (ListaCurso) . . . . . . . . . . . . . . u 5.11. Agregar un registro al principio de la lista (ListaCurso) . . . . . . . 5.12. Agregar un registro al nal de la lista (ListaCurso) . . . . . . . . . 5.13. Imprimiendo toda la lista (ListaCurso) . . . . . . . . . . . . . . . . 5.14. Imprimiendo registros seleccionados (ListaCurso) . . . . . . . . . . 5.15. Mtodo que busca un registro (ListaCurso) . . . . . . . . . . . . . e 5.16. Eliminacin de un registro en una lista (ListaCurso) . . . . . . . . . o 5.17. Men para el manejo de la lista (MenuLista) . . . . . . . . . . . . u 6.1. Superclase EstudianteBasico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 108 111 113 113 114 115 116 117 118 120 122 123 125 127 129 133 134 137 138 140 142 143 144 145 146 148 148 149 149 150 151 153 154 155 156 158 161 162 168

INDICE DE ALGORITMOS Y LISTADOS 6.2. Encabezado para la subclase EstudianteCurso . . . . . . . . . . . 6.3. Clculo de n! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . a 6.4. Codicacin de iteracin for con while . . . . . . . . . . . . . . . o o 6.5. Construccin de un tringulo de nmeros . . . . . . . . . . . . . . o a u 6.6. Arreglos como parmetros y valor de regreso . . . . . . . . . . . . a 6.7. Campos y constructor de EstudianteCurso . . . . . . . . . . . . 6.8. Mtodos nuevos para la subclase EstudianteCurso . . . . . . . . e 6.9. Redenicin del mtodo getRegistro() . . . . . . . . . . . . . . . o e 6.10. Registros en un arreglo . . . . . . . . . . . . . . . . . . . . . . . . 6.11. Otra versin del mtodo getRegistro . . . . . . . . . . . . . . . . o e 6.12. Clases abstractas y concretas . . . . . . . . . . . . . . . . . . . . 6.13. Interfaz para manejar una lista . . . . . . . . . . . . . . . . . . . . 6.14. Herencia con una interfaz . . . . . . . . . . . . . . . . . . . . . . 7.1. Clase que ilustra el anidamiento dinmico . . . . . . . . . . . . . . a 7.2. La funcin factorial . . . . . . . . . . . . . . . . . . . . . . . . . o 7.3. Factorial calculado iterativamente . . . . . . . . . . . . . . . . . . 7.4. Mtodos para las torres de Hanoi . . . . . . . . . . . . . . . . . . e 8.1. Superclase con informacin bsica de estudiantes (InfoEstudiante) . o a 8.2. Extendiendo la clase InfoEstudiante (EstudianteLista) . . . . . . . 8.3. Extensin de InfoEstudiante con calicaciones (EstudianteCalifs) . o 8.4. Base de datos implementada en un arreglo (CursoEnVector) . . . . 8.5. Corrimiento de registros hacia la derecha e izquierda CursoEnVector) 8.6. Mtodos de acceso y manipulacin e o (CursoEnVector) . . . 8.7. Mtodo de acceso al nmero de registros e u (CursoEnVector) . . 8.8. Agregando registros a la base de datos (CursoEnVector) . . . . . . 8.9. Quitando a un estudiante de la base de datos (CursoEnVector) 8.10. Bsqueda de subcadena en campo del arreglo (CursoEnVector) . . . u 8.11. Listar todos los registros de la base de datos (CursoEnVector) . . . 8.12. Listando los que cumplan con algn criterio (CursoEnVector) . . . . u 8.13. Denicin de la clase Estudiante para los registros (Estudiante) . . o 8.14. Agregar un registro manteniendo el orden (ListaCurso) . . . . . . . 8.15. Clase ArbolEstudiante para cada registro o nodo (ArbolEstudiante) . 8.16. Agregar un registro en un rbol binario ordenado (ArbolOrden) . . . a 8.17. Listado de la base de datos completa (ArbolOrden) . . . . . . . . . 8.18. Recorrido simtrico del rbol (ArbolOrden) . . . . . . . . . . . . . e a 8.19. Bsqueda del registro con el nombre dado (ArbolOrden) . . . . . . u 8.20. Bsqueda de subcadena en determinado campo (ArbolOrden) . . . u 8.21. Listado de registros que contienen a subcadena (ArbolOrden) . . . . 8.22. Localizacin del padre de un nodo (ArbolOrden) . . . . . . . . . . o 8.23. Localiza al menor del subrbol derecho (ArbolOrden) . . . . . . . . a . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

XIII

170 181 182 183 187 189 190 191 192 193 195 197 197 202 224 232 234 240 243 244 248 250 251 251 252 254 256 257 258 259 263 268 272 275 275 277 278 280 282 283

XIV

INDICE DE ALGORITMOS Y LISTADOS 8.24. Eliminacin de un nodo en el rbol (ArbolOrden) . . . . . . . . . . . 285 o a 9.1. Ejemplo de una excepcin aritmtica . . . . . . . . . . . . . . . . . 290 o e 9.2. Ejemplo de una excepcin de la subclase ArrayStoreException . . . 291 o 9.3. Programa que lanza una excepcin ClassCastException . . . . . . 292 o 9.4. Manejo de una excepcin a travs de la superclase (CatchExc) . . . . 297 o e 9.5. La excepcin es cachada y relanzada . . . . . . . . . . . . . . . . . 299 o 9.6. Creacin de excepciones propias . . . . . . . . . . . . . . . . . . . . 300 o 9.7. Deteccin de excepciones propias (DivPorCeroUso) . . . . . . . . . . 300 o 9.8. Declaracin de excepcin propia . . . . . . . . . . . . . . . . . . . . 302 o o 9.9. Clase que usa la excepcin creada . . . . . . . . . . . . . . . . . . . 302 o 9.10. Excepciones del programador (I) . . . . . . . . . . . . . . . . . . . . 303 9.11. Uso de excepciones del programador (I) . . . . . . . . . . . . . . . . 303 9.12. Excepciones del programador y su uso (II) (BaseDeDatos) . . . . . . 304 9.13. Denicin de Excepciones propias (RegNoEncontradoException) . . . . 306 o 9.14. Denicin de excepciones propias (ejemplo) (Ejemplo) . . . . . . . . 307 o 9.15. Excepciones creadas por el programador (MiExcepcion2) . . . . . . . 308 9.16. Uso de excepciones creadas por el programador (CaracteristicasExtra) 309 9.17. Ejemplo con la clusula nally (Excepcin) . . . . . . . . . . . . . . 311 a o 9.18. Ejemplo con la clusula nally (uso) . . . . . . . . . . . . . . . . . 312 a 9.19. Otro ejemplo con la clusula nally (Switch) . . . . . . . . . . . . . 313 a 9.20. Otro ejemplo con la clusula nally (OnOException1) . . . . . . . . 313 a 9.21. Otro ejemplo con la clusula nally (OnOException2) . . . . . . . . 313 a 9.22. Otro ejemplo con la clusula nally (OnOSwitch) . . . . . . . . . . 314 a 9.23. Otro ejemplo con la clusula nally (ConFinally) . . . . . . . . . . . 314 a 9.24. Anidamiento de bloques try (CuatroException) . . . . . . . . . . . . 314 9.25. Anidamiento de bloques try (SiempreFinally) . . . . . . . . . . . . . 315 9.26. Manejo de excepciones con herencia . . . . . . . . . . . . . . . . . . 316 10.1. Mtodo que solicita al usuario nombre de archivo (MenuListaIO) . . . 360 e 10.2. Cdigo para guardar la base de datos (MenuListaIO) . . . . . . . . . 361 o 10.3. Opcin para leer registros desde disco (MenuListaIO) . . . . . . . . . 363 o 10.4. Opcin de agregar registros a un archivo en disco (MenuListaIO) . . . 365 o 10.5. Declaraciones de ujos binarios (MenuListaIO) . . . . . . . . . . . . 371 10.6. Opciones de leer y escribir a archivo binario (MenuListaIOReg) . . . . 372 10.7. Salto de bytes en lectura secuencial (MenuListaIOReg) . . . . . . . . 379 10.8. Lectura de nombre de archivo y su apertura (case LEERDIRECTO) . . 386 10.9. Clculo del tamao del registro (case LEERDIRECTO) . . . . . . . . 387 a n 10.10. eticin del nmero de registro al usuario (case LEERDIRECTO) . . . 388 P o u 10.11. osicionamiento de apuntador de archivo y lectura (case LEERDIRECTO)390 P 10.12. pcin de modicar registros (case GUARDARDIRECTO) . . . . . . . 393 O o 10.13. ambios a InfoEstudiante (InfoEstudianteSerial) . . . . . . . . . . . 402 C

INDICE DE ALGORITMOS Y LISTADOS 10.14. odicaciones a la clase Estudiante (EstudianteSerial) . . . M 10.15. onversin de (a) Estudiante a (de) EstudianteSerial . . . C o 10.16. olicitud de nombre para ujo de objetos (MenuListaIOObj) . S 10.17. eclaracin de ujo de objetos (MenuListaIOObj) . . . . . . . D o 10.18. aso de lectura de objetos (declaraciones) (MenuListaIOObj) . C 10.19. aso de lectura de objetos (MenuListaIOObj) . . . . . . . . . C 11.1. Objeto que lanza dos hilos de ejecucin . . . . . . . . . . . . o 11.2. Asignacin de nombres a los hilos de ejecucin . . . . . . . . o o 11.3. Hilos de ejecucin con la interfaz Runnable . . . . . . . . . o 11.4. Manejo sincronizado de una cuenta de cheques . . . . . . . . 11.5. Sincronizacin selectiva sobre objetos . . . . . . . . . . . . . o 11.6. Sincronizacin de variables primitivas en enunciados . . . . . o 11.7. Cola genrica con operaciones sincronizadas . . . . . . . . . e 11.8. Denicin de elementos de la cola . . . . . . . . . . . . . . . o 11.9. PrintJob: trabajo de impresin . . . . . . . . . . . . . . . . . o 11.10. ervidor de impresin que corre en un hilo propio de ejecucin S o o 11.11. ntorno en el que funciona un servidor de impresin . . . . . E o 11.12. ara vericar tiempo transcurrido. . . . . . . . . . . . . . . . P 11.13. esalojo voluntario . . . . . . . . . . . . . . . . . . . . . . . D 11.14. osibilidad de abrazo mortal . . . . . . . . . . . . . . . . . . P 11.15. brazo mortal entre hilos de ejecucin . . . . . . . . . . . . A o 11.16. so de destroy para terminar un hilo de ejecucin . . . . . . U o 11.17.nterrupcin de procesos . . . . . . . . . . . . . . . . . . . . I o 11.18. ignicado de la interrupcin en un proceso . . . . . . . . . . S o 11.19. spera para la terminacin de un coproceso . . . . . . . . . . E o 11.20. rograma principal para ejemplicar la espera . . . . . . . . . P 11.21. ericacin de terminacin con isAlive() . . . . . . . . . . . V o o 11.22. iferencia entre procesos normales y demonios . . . . . . . . D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

XV

403 404 405 406 407 407 412 414 416 419 422 422 426 427 428 428 429 432 434 435 437 440 441 443 444 445 446 447

Introduccin o

1

La disciplina de la computacin es el estudio sistemtico de proceo a sos algor tmicos que describen y transforman informacin: su teor o a, anlisis, diseo, eciencia, implementacin y aplicacin. La pregunta a n o o fundamental subyacente en toda la computacin es, Qu puede ser o e (ecientemente) automatizado? Peter Denning, 2005. Hay mucha confusin respecto a trminos que, aparentemente describen a la o e misma disciplina. Usaremos a lo largo de estas notas los trminos computacin y e o ciencias de la computacin casi indistintamente. Es necesario recalcar que estamos o usando el trmino computacin como abreviatura para ciencias de la computacin, e o o con el signicado particular que le estamos dando a este ultimo en nuestro con texto. El error ms comn es el de confundir la programacin con la computacin. a u o o La diferencia que existe entre estos dos trminos es tal vez la misma que existe e entre saber la frmula para resolver una ecuacin de segundo grado y conocer la o o teor de ecuaciones. Si bien la programacin es una parte de la computacin, a o o la computacin contempla much o simos otros aspectos que no forzosamente tienen que ver con la programacin o llevarse a cabo con una computadora. Tambin se o e utilizan los trminos de ingenier y ciencias de la computacin y, excepto por el e a o enfoque que se pudiera dar en uno u otro caso, estar amos hablando del mismo cuerpo de conocimientos. Otro trmino que se utiliza frecuentemente (sobre todo en nuestro medio) es e el de informtica. Si bien en muchos casos, se utiliza este trmino para referirse a e

2

Introduccin o

a todo lo que tiene que ver con computacin, nosotros lo entendemos ms bien o a como rerindose a aquellos aspectos de la computacin que tienen que ver con la e o administracin de la informacin (sistemas de informacin, bases de datos, etc.). o o o Al igual que la programacin, la informtica la podemos considerar contenida o a propiamente en la computacin. o El trmino ciberntica es un trmino forjado por los soviticos en los aos e e e e n cincuenta. Sus ra ces vienen de combinar aspectos biolgicos de los seres vivos o con ingenier mecnica, como es el caso de los robots, la percepcin remota, la a a o simulacin de funciones del cuerpo, etc. A pesar de que se utiliza muchas veces en o un sentido ms general, no lo haremos as en estas notas. a

1.1 Conceptos generalesEl objeto fundamental de estudio de las ciencias de la computacin son los o algoritmos y, en su caso, su implementacin. Veamos antes que nada la denicin o o de algoritmo:

Denicin 1.1 Un algoritmo es un mtodo de solucin para un problema que cumple con: o e o1. Trabaja a partir de 0 o ms datos (entrada). a 2. Produce al menos un resultado (salida). 3. Est especicado mediante un nmero nito de pasos (nitud). a u 4. Cada paso es susceptible de ser realizado por una persona con papel y lpiz a (denicin). o 5. El seguir el algoritmo (la ejecucin del algoritmo) lleva un tiempo nito o (terminacin). o Estamos entonces preocupados en ciencias de la computacin por resolver proo blemas; pero no cualquier problema, sino unicamente aqullos para los que po e damos proporcionar un mtodo de solucin que sea un algoritmo ms adelante e o a en la carrera demostrarn ustedes que hay ms problemas que soluciones, ya no a a digamos soluciones algor tmicas. La segunda parte importante de nuestra disciplina es la implementacin de o algoritmos. Con esto queremos decir el poder llevar a cabo un algoritmo dado (o diseado) de manera automtica, en la medida de lo posible. n a

1.2 Historia

3 En la seccin que sigue exploraremos la historia de estos dos conceptos y o la manera en que se distinguieron para conformar lo que hoy conocemos como ciencias de la computacin. o

1.2 Breve historia del concepto de algoritmoLa computacin es una disciplina mucho muy antigua. Tiene dos ra o ces fundamentales: La bsqueda de una sistematizacin del pensamiento, que dicho en nuestro u o terreno se interpreta como la bsqueda de algoritmos para resolver probleu mas, algunas veces generales y otras concretos. La bsqueda para desarrollar implementos o medios que permitan realizar u clculos de manera precisa y eciente. a En esta segunda ra podemos reconocer los implementos de cmputo como z o el baco chino y el baco japons, las tablillas de los egipcios para llevar la cona a e tabilidad de las parcelas cultivadas y, en general, todos aquellos mecanismos que permit de manera ms expedita, conocer un cierto valor o llevar a cabo un an a clculo. a Respecto a la bsqueda de la sistematizacin del pensamiento, en la Antigua u o Grecia se hizo una contribucin enorme en este direccin con el desarrollo del o o mtodo axiomtico en matemticas y el desarrollo de la geometr como un sistee a a a ma lgico deductivo, en el que juegan un papel mucho muy importante el modus o ponens (pA B Aq B) y el modus tollens (pA B 2B q 2A). Lo que se pretende con estos mecanismos es, a partir de un conjunto de hechos aceptados (axiomas) y mediante un cierto conjunto de reglas del juego (reglas de inferencia o de transformacin) lograr determinar la validez de nuevos hechos. o En el fondo lo que se buscaba era un algoritmo que describiera o automatizara la manera en que los seres humanos llegamos a conclusiones. Estos patrones de razonamiento se utilizan no slo en matemticas, sino en la vida diaria y han o a dado origen a una disciplina muy extensa y rigurosa que es la lgica matemtica. o a No creemos necesario remarcar el gran avance que ha tenido esta disciplina en la ultima mitad del siglo XX. Sin embargo, es importante notar que el desarro llo ha estado siempre presente, no unicamente en este ultimo per odo. Para ello presentamos en la siguiente pgina una tabla con aquellos eventos histricos que a o

4

Introduccin o

consideramos ms relevantes en el desarrollo de la computacin, con una pequea a o n anotacin de cual fue la aportacin en cada una de las instancias. o o

Cuadro 1.1

Resumen de la historia de Ciencias de la computacin o2000 AC Tablas para clculos aritmticos, como a e ra cuadradas, inters compuesto, rea ces e a de un c rculo (8/9*1/2=3.1604...) Siglo IV AC Aristteles (384-322 o Lgica formal con Modus Ponens y Moo AC) dus Tollens 825 Abu Jafar Mohammed Libro sobre recetas o mtodos para e ibn Msa u hacer aritmtica con los nmeros e u arbigos a al-Khowrizm` a 1580 Franois Vi`te c e Uso de letras para las incgnitas: surgio (1540-1603) miento del lgebra a 1614 1620 John Napier (1550-1617) Edmund Gunter (1581-1626) Galileo (1564-1642) Huesos de Napier para la multiplicacin. o El concepto de logaritmo Primer antecesor de la regla de clculo a Formulacin matemtica de la F o a sica Descubre la geometr anal a tica, posibilitando la aplicacin del lgebra a probleo a mas geomtricos, y por lo tanto a problee mas que ten que ver con movimiento an f sico Primera calculadora digital: sumaba, restaba automticamente; multiplicaba y a divid semiautomtico a a Calculadora que sobrevivi. Slo sumaba o o y restaba automticamente a Coinventor del clculo con Newton. a Primer investigador occidental de la aritmtica binaria. Inventor de la ruee da de Leibniz, que hac las 4 operacioa nes aritmticas. Fundamentos de la lgie o ca simblica o Babilonios y egipcios

Siglos XVI y XVII Siglo XVI y Descartes (1596-1650) XVII

1623

Wilhelm Schickard

1642-1644 Siglo XVII y XVIII

Blaise Pascal (1623-1662) Gottfried Wilhelm Leibniz (1646-1717)

1.2 Historia

5

Cuadro 1.1

(cont.) Resumen de la historia de Ciencias de la computacin oSiglo XIX 1800 1854 1854 1890 1893 1900 Charles Babbage (1791-1871) Ada Lovelace Mquina diferencial y mquina anal a a tica

1928

1936

1936

1939-1945

1937-1942

Primer programador de la mquina a anal tica de Babbage Pehr George Scheutz Construy un modelo de la mquina dio a ferencial de Babbage George Boole Estableci los fundamentos para el estuo (1815-1864) dio moderno de la Lgica Formal o Herman Hollerith Uso de equipo tabulador (de registro unitario) Leonardo Torres y Mquina electromecnica basada en la de a a Quevedo (1852-1936) Babbage David Hilbert Propone a los matemticas el encontrar a (1862-1943) un sistema de axiomas lgico matemtio a co unico para todas las reas de la ma a temtica a Hollerith Elaboracin de tablas de posicin de la o o luna utilizando su mquina de registro a unitario: uso cient co de herramientas pensadas para procesamiento de datos Kurt Gdel (1906-1978) Demuestra que lo que propone Hilbert o no es posible, i.e. que hay problemas matemticos inherentemente insolubles a Alan Turing Atac el problema de cuando se puede o (1912-1954) decir que se tiene un mtodo de solucin, e o que el problema no tiene solucin, etc. o Disea la Mquina de Turing n a Wallace J. Eckert con Extensin de la mquina tabuladora de o a John W. Mauchly IBM para propsitos cient o cos. Diseo n y construccin de la ENIAC, primeo ra gran computadora digital totalmente electrnica o Claude Shannon El uso del lgebra booleana para el anlia a sis de circuitos electrnicos. Liga entre la o teor y el diseo a n

6

Introduccin o

Cuadro 1.1

(cont.) Resumen de la historia de Ciencias de la computacin o1940 1937-1944 John V. Atanaso (1903-) Howard T. Aiken (1900-1937) Solucin de ecuaciones lineales sio multneas. Computadora ABC a Construccin de la MARK I que ten o a: Posibilidad de manejar nmeros u positivos y negativos Posibilidad de utilizar diversas funciones matemticas a Totalmente automtica a Posibilidad de ejecutar operaciones largas en su orden natural ENIAC. Primera computadora totalmente electrnica o Notacin para describir la circuiter de o a la computadora. Conjunto de instrucciones para la EDVAC. El concepto de programa almacenado - la nocin de que los o datos y los programas pueden compartir el almacenaje. El concepto de operacin o serial Aritmtica binaria como mecanise mo en las computadoras

1943-1945 1944

John W. Mauchly John von Neumann

1.3 Sistemas numricos eA lo largo de esta historia se han transformado notablemente los s mbolos que se usaron para denotar a los objetos de los clculos, a los algoritmos, y a los a resultados mismos. Podemos pensar, por ejemplo, en que una sumadora de las de Shickard usaba engranes como s mbolos para realizar las cuentas. El hombre primitivo usaba notacin unaria para contar: pon tantos s o a mbolos como objetos deseaba contar. Una primera abreviatura a estos mtodos se dio con sistemas e que agrupaban s mbolos. As por ejemplo, el sistema de nmeros romanos com u bina s mbolos para abreviar, y en lugar de escribir 100 rayas verticales utiliza el s mbolo C. Un concepto importante es el del nmero cero. Su origen es mucho muy anu

1.3 Sistemas numricos e

7

tiguo. Tambin los mayas ten un s e an mbolo asociado al cero. Este concepto es muy importante para poder utilizar notacin posicional. La notacin posicional o o es lo que usamos hoy en d y consiste en que cada s a, mbolo tiene dos valores asociados: el peso y la posicin. Por ejemplo, el nmero 327.15 se puede presentar o u de la siguiente manera:

EJEMPLO 1.3.2327,15

3 102 2 101 7 100 1 101 5 102

Decimos que la notacin es posicional, porque dependiendo de la posicin que o o tenga un d gito con respecto al resto de los d gitos en un nmero, se es el valor u e (o peso) que tiene. El sistema que usamos es el decimal posicional, porque es un sistema posicional que usa al nmero 10 como base. El peso que se le asigna a cada u d gito depende del d gito y de su posicin. Cada posicin lleva un peso de alguna o o potencia de 10 (decimal) asignadas, alrededor del punto decimal, de la siguiente forma: 104 103 102 101 100 | 101 102 103 . . . 10000 1000 100 10 1 | ,1 ,01 ,001 4 5 1 3 |. 6 3 0 1 0 0 |. 0 0 0 |. 0 7 5

... 4513,6 30100 ,075

Hay varias reglas que observamos respecto a la notacin posicional: oI. II.

En cada posicin se coloca un solo d o gito. Los ceros antes del primer d gito distinto de cero, desde la izquierda, no aportan nada al nmero. u Los ceros a la derecha del punto decimal y antes de un d gito distinto de cero s cuentan. No es lo mismo .75 que .00075. Los ceros a la derecha del ultimo d gito distinto de cero despus del punto e decimal no cuentan.

III.

IV.

8V. VI.

Introduccin o

Los d gitos que podemos utilizar son del 0 al 9. Cada d gito aporta su valor espec co multiplicado por el peso de la posicin o que ocupa.

Sabemos todos trabajar en otras bases para la notacin posicional. Por ejemo plo, base 8 (mejor conocida como octal ) ser de la siguiente manera: a

EJEMPLO 1.3.3... 476,18 413708 84 83 82 81 80 | 81 82 83 ... 4096 512 64 8 1 | ,125 ,15625 ,001953125 4 7 6 |. 1 318,12510 4 1 3 7 |. 214310

Tambin podemos pensar en base 16 (hexadecimal ), para lo que requerimos de e 16 s mbolos distintos. Los d gitos del 0 al 9 nos proporcionan 10 de ellos. Tenemos el problema de que con la restriccin de que cada posicin debe ser ocupada por un o o unico d gito, tenemos que inventar s mbolos (o d gitos) para 6 valores que nos faltan, y que ser del 10 al 15 inclusive. La tradicin es utilizar las letras A, B, an o C, D, E y F para los valores consecutivos 10, 11, 12, 13, 14 y 15 respectivamente. Siguiendo la notacin posicional, pero en base 16, tenemos los siguientes ejemplos: o ... 476,116 BA7C16 164 163 162 161 160 | 161 162 ... 65536 4096 256 16 1 | ,0625 ,00390625 4 7 6 |. 1 1142,062510 11 10 7 12 |. 4774010

Pasamos ahora a la base 2, que es la ms importante hoy en d en compua a tacin. Los primeros implementos de cmputo que usaban notacin posicional (los o o o a bacos, huesos de Napier, calculadoras) usaban base 10 (los bacos, en realidad, a usaban una especie de base 5. Por qu?). Mientras las calculadoras se constru e an con partes f sicas (engranes, cuentas) la base 10 no era muy distinta de cualquier otra base. Pero al intentar construir calculadoras (o computadoras) electrnicas, o la base 10 presentaba problemas de implementacin: cmo distinguir entre el 4 o o y el 5, cuando se estaba midiendo en trminos de niveles, analgicamente? Por lo e o tanto se opt, aunque no desde el principio, por usar base 2, que tiene un mapeo a o

1.3 Sistemas numricos e

9

la electrnica bastante simple. Para base 2 requerimos de dos s o mbolos, y utilizamos el 0 y el 1. El 0 se puede interpretar como ausencia y el 1 como presencia, por lo que ms all de cierto nivel se asume presencia. Esto es mucho ms sencillo que a a a ver si tenemos uno de 10 (u 8) niveles distintos. La tabla que sigue corresponde a la notacin posicional en base 2: o ... 11001101,112 1010002 27 26 25 24 23 22 21 20 | 21 22 23 . . . 128 64 32 16 8 4 2 1 | ,5 ,25 ,125 1 1 0 0 1 1 0 1 |. 1 1 1 205,7510 1 0 1 0 0 0 |. 4010

Como se puede ver, tratndose de nmeros enteros, es fcil pasar de una base a u a cualquiera a base 10, simplemente mediante la frmula o num10

0 i n

di bi

donde di se reere al d gito correspondiente en la i-sima posicin, con la posicin e o o 0 en el extremo derecho, y bi se reere a la base elevada a la potencia de la posicin o correspondiente. 1010002

0 i 5

1 25 0 24 1 23 0 22 0 21 0 20 32 0 8 0 0 0 4010Para pasar de base 10 a cualquier otra base, se utiliza el algoritmo 1.1. Hay que notar que en la l nea 7 se est concatenando un s a mbolo, por lo que si la base es mayor a 10, se tendrn que utilizar s a mbolos para los d gitos mayores que 9. As para pasar de base 10 a base 16 el nmero 857510 el algoritmo se , u ejecutar de la siguiente manera: a dividendo10 cociente10 residuo10 S mbolo residuo16 8575 535 15 F 535 33 7 7 33 2 1 1 2 0 2 2 N mero16 u F 7F 17F 217F

di 2i

10

Introduccin o

Algoritmo 1.1 Algoritmo para pasar de base 10 a base h.1: 2: 3: 4: 5: 6: 7: 8: 9:

dividendo = num10 ; divisor = h; residuo = 0; nmero = ; u repeat residuo = dividendo % divisor; nmero = pegar(residuo,nmero); u u dividendo = dividendo divisor; until (dividendo = 0);

Para que nos convenzamos que, en efecto 857510 descomponer 217F en potencias de 16: 217F16

217F16 , procedemos a

2 163 1 162 7 161 15 160 2 4096 1 256 7 16 15 8192 256 112 15 8575

En general, para pasar de una base a otra, todo lo que se tiene que hacer es la divisin en la base en la que se encuentra el nmero que queremos convertir. Por o u ejemplo, si deseamos pasar un nmero base 8 a base 6, lo har u amos de la siguiente manera:I.

Consideremos que para base 8 contamos con los d gitos del 0 al 7, mientras que para base 6 unicamente los d gitos del 0 al 5. Seguimos el algoritmo 1.1, pero haciendo la divisin y la resta en base 8. El o resultado se muestra a continuacin: o dividendo8 cociente8 residuo8 S mbolo residuo6 7535 1217 3 3 1217 155 1 1 155 22 1 1 22 3 0 0 3 0 3 3 N mero6 u 3 13 113 0113 30113

II.

1.3 Sistemas numricos e

11

Trabajemos con los dos nmeros en base 10 para corroborar que el algoritmo u trabaj bien: o

301136 75358

7 83 5 82 3 81 5 80 7 512 5 64 3 8 5 1 3584 320 24 5 393310 3 64 0 63 1 62 1 61 3 60 3 1296 0 216 1 36 1 6 3 1 3888 0 36 6 3 393310

En general, para pasar de una base B a otra base b, lo que tenemos que hacer es expresar b en base B, y despus llevar a cabo el algoritmo en base B. Cada vez e que tengamos un residuo, lo vamos a tener en base B y hay que pasarlo a base b. Esto ultimo es sencillo, pues el residuo es, forzosamente, un nmero entre 0 y b. u Cuando una de las bases es potencia de la otra, el pasar de una base a la otra es todav ms sencillo. Por ejemplo, si queremos pasar de base 8 a base 2 (binario), a a observamos que 8 23 . Esto nos indica que cada posicin octal se convertir a o a exactamente a tres posiciones binarias. Lo unico que tenemos que hacer es, cada d gito octal, pasarlo a su representacin binaria: o 75358 7 5 3 5 111 101 011 101 1111010111012

Algo similar se hace para pasar de base 16 a base 2, aunque tomando para cada d gito base 16 cuatro d gitos base 2. El proceso inverso, para pasar de base 2, por ejemplo, a base 16, como 16 24 deberemos tomar 4 d gitos binarios por cada d gito hexadecimal: 1111010111012 11112 01012 11012 1510 510 1310 F16 516 D16 F 5D Las computadoras actuales son, en su inmensa mayor digitales, esto es, que a, representan su informacin de manera discreta, con d o gitos. Operan en base 2

12

Introduccin o

(binario) ya que la electrnica es ms sencilla en estos trminos. Sin embargo, o a e hay procesos que no son discretos, como las ondas de luz o sonoras. Pero hoy en d se pueden alcanzar excelentes aproximaciones de procesos continuos mediante a d gitos binarios. Para ello se cuenta con componentes analgicos/digitales que o transforman seales analgicas (continuas) en seales digitales (discretas). Hubo n o n una poca en que se ten mucha fe en las computadoras analgicas, aquellas que e a o funcionaban con dispositivos continuos, pero prcticamente han desaparecido del a mercado, excepto por algunas de propsito muy espec o co, o las que convierten seales analgicas en seales digitales, o viceversa. n o n La siguiente pregunta que debemos hacernos es: Cules son los distintos elementos que requerimos para poder implementar un a algoritmo en una computadora digital? Cmo se representan en binario esos distintos elementos? o Pensemos, por ejemplo, en las mquinas de escribir. La orden para que se a escriba una letra determinada se lleva a cabo oprimiendo una cierta tecla. Esto es porque hay una conexin mecnica (f o a sica) entre la tecla del teclado y el dado que imprime la tecla. La primera computadora, la ENIAC, funcionaba de manera muy similar. Cada vez que se deseaba que resolviera algn problema, se alambraban u los paneles de la computadora para que hubiera conexiones f sicas entre lo que se recib en el teletipo y las operaciones que se ejecutaban. De manera similar, a las calculadoras mecnicas, al darle vuelta a una manivela, se consegu que los a a engranes seleccionados efectuaran una determinada operacin. o En las computadoras modernas, de propsito general, vienen alambradas para o reconocer ciertos patrones, de forma similar a como lo hac el telar de Jackard o la a mquina del censo de Hollerith. Cada patrn indica una operacin a realizarse. Los a o o patrones son nmeros binarios con un nmero jo de posiciones (binary digits). A u u cada conjunto de posiciones de un cierto tamao se le llama una palabra. El tamao n n de palabra es, en general, una potencia de 2: 8, 16, 32, 64, 128. A los grupos de 8 bits se les llama byte. Al conjunto de patrones distintos es a lo que se conoce como lenguaje de mquina, que por supuesto es personal de cada modelo o tipo de a computadora. Originalmente se distingu entre micro, mini y computadoras por el a tamao en bits de sus palabras. El tamao de la palabra va unido al poder de la n n o mquina: si tengo ms bits por palabra tengo ms patrones posibles, y por lo tanto a a a un lenguaje de mquina ms extenso y posibilidad de representar nmeros ms a a u a 1 grandes o con ms precisin Las primeras microcomputadores ten palabras de a o an 8 bits, mientras que las grandes computadoras ten palabras de 64 bits. Las an1

En breve veremos la representacin de datos en la computadora. o

1.4 La arquitectura de von Neumann

13

supercomputadoras, que surgieron alrededor de 1985, ten palabras de 128 bits an y posibilidades de proceso en paralelo. El tamao de la palabra tambin le da velocidad a una computadora, pues n e indica el nmero de bits que participan electrnicamente en cada operacin. u o o

1.4 La arquitectura de von NeumannSe le llama arquitectura de una computadora a la organizacin qu tiene en sus o e componentes electrnicos, y la manera como stos estn integrados para funcionar. o e a Lo que se conoce como arquitectura de von Neumann es una organizacin muy o parecida a la de Babbage: tenemos un procesador central el molino de Babbage en el que se ejecutan las operaciones aritmticas y de comparacin (lgicas); una e o o memoria central que se utiliza para almacenar datos, resultados intermedios y el programa a ejecutarse; tenemos unidades de entrada y salida (input/output) que sirven para darle a la computadora el programa y los datos y recibir los resultados; por ultimo, tenemos memoria externa o auxiliar, como discos, diskettes, cintas magnticas, que nos sirven para almacenar, ya sean datos o programas, de una e ejecucin a otra, sin tener que volver a realizar el proceso, o sin que tengamos que o volverlos a proporcionar. Un esquema de una computadora con arquitectura de von Neumann se muestra en la gura 1.1. Las echas que van de un componente a otro pueden tener distintas formas de funcionar y muy diversas capacidades. Una de las formas en que funciona es lo que se conoce como un bus. Por ejemplo, si la capacidad de la l nea que va de memoria al procesador es de menos de 1 palabra, aunque la computadora tenga palabras muy grandes, la velocidad de la mquina se va a ver afectada. a La memoria est cuadriculada, o dividida en celdas. Cada celda ocupa una a posicin dentro de la memoria, aunque en principio cada una es igual a cualquier o otra: tiene el mismo nmero de bits y las mismas conexiones. Se puede ver como un u vector de celdas, cuyo primer elemento tiene el ndice cero. Se habla de posiciones altas y posiciones bajas rerindose a aqullas que tienen e e ndices grandes o pequeos respectivamente. En cada celda de memoria se puede colocar (escribir, n copiar) una instruccin, un nmero, una cadena de carcteres, etc. o u a El proceso mediante el que se ejecuta un programa es el siguiente:I.

Se coloca el programa en la memoria de la computadora (se carga, load ).

14II.

Introduccin o

La unidad de control en el procesador se encarga de ver cul es la siguiente a instruccin. Esta aparece, simplemente, como un patrn de bits (un cdigo o o o de mquina). a La Unidad de Control se encarga de ejecutar la instruccin, valindose para o e ello de cualquiera de los componentes de la mquina. a

III.

Figura 1.1

Arquitectura de von Neumann

Memoria auxiliarDiscos

Memoria Central

Procesador centralUnidad de control Unidad aritmtica e Unidad lgica o Cache

Dispositivos de entradaTeclado, scanner, usb

Dispositivos de salidaMonitor, impresora, usb, bocinas

El tipo de instrucciones que tiene una computadora incluyen instrucciones para sumar, restar, multiplicar, dividir, copiar, borrar, recorrer el patrn de bits, o

1.4 La arquitectura de von Neumann

15

comparar y decidir si un nmero es mayor que otro, etc. En realidad son instrucu ciones que hacen muy pocas cosas y relativamente sencillas. Recurdese que se e hace todo en sistema binario.

Lenguajes de programacin oUn lenguaje de programacin es aqul que nos permite expresar un problema o e de tal manera que podamos instalarlo (cargarlo) en la computadora y se ejecute. Hasta ahora slo hemos visto el lenguaje de mquina, y ste era el unico disponible o a e con las primeras computadoras de propsito general. o

Figura 1.2

Proceso para ejecutar un programa escrito en ensamblador

(4) (3)Datos para el programa Programa a ejecutar Programa ensamblador (binario) Unidad de control Programa objeto (binario)

(5) (2) MEMORIA (6)Resultados

(1)

16

Introduccin o

Programar en binario es, en el mejor de los casos, sumamente tedioso y complicado. El programador (que es quien escribe los programas) tiene que tener un conocimiento muy profundo de la computadora para la que est programando. a Adems de eso, tiene que ejercer un cuidado extremo para no escribir ningn 1 a u por 0, o para no equivocarse de direccin. Lo primero que se hizo fue escribir en o octal, ya que era un poco ms claro que binario. El siguiente paso fue asociar a nemnicos a las instrucciones, asociando a cada patrn de bits un nombre o o o identicador: add, sub, mul, div, etc. A esto se le llam lenguaje ensamblador. Se o construy un programa, llamado ensamblador, que se encargaba de traducir los o nemnicos de este estilo y las direcciones escritas en octal a binario. Este programa o no es algo complicado de hacer. Tanto el programa ensamblador como el programa a traducir se alimentaban, cargados en tarjetas perforadas ver gura 1.2. El primer paquete era el programa ensamblador, escrito en binario; a continuacin o se presentaba el programa que se deseaba traducir, como datos del primero. La computadora contaba con un tablero, en el que se le indicaba que empezara a cargar el programa ensamblador, y una vez cargado (1), empieza a ejecutarlo. El programa ensamblador indicaba que ten que traducir las siguientes tarjetas (o a cinta perforada), conforme las fuera leyendo (2), y producir tarjetas con el programa en binario (3) o, ms adelante, cargar el programa binario a memoria para a ser ejecutado (4); al ejecutarse el programa en binario, se le los datos (5) y se an produc el resultado (6). a El siguiente paso en lenguajes de programacin fue el de los macroensambladoo res, que asignaban etiquetas a las posiciones de memoria que se estaban utilizando para acomodar los datos y resultados intermedios, y las posiciones donde iba a quedar el cdigo. El proceso de traduccin era sencillo, ya que se agregaban a o o las tablas de traduccin del cdigo los equivalentes en octal. Tambin se permit o o e a construir secuencias pequeas de cdigo, a las que nuevamente se les asociaba un n o nombre o identicador, y que pod presentar parmetros. A estas secuencias se an a les llamaba macros y de ah el nombre de macroensamblador. Las computadoras se estaban utilizando tanto con nes cient cos como comerciales. En el uso cient co era muy comn expresar frmulas matemticas, que u o a ten que despedazarse en operaciones bsicas para poderse llevar a cabo ver an a gura 1.3. El siguiente paso importante fue el de permitirle a un programador que especicara su frmula como se muestra en la parte izquierda de la gura 1.3. El o primer lenguaje de uso generalizado orientado a esto fue FORTRAN For mula Translator, alrededor de 1956. Pocos aos despus se desarroll un lenguaje para n e o usos comerciales, donde lo que se deseaba es poder manejar datos a distintos niveles de agregacin. Este lenguaje se llamaba COBOL COmon B ussiness Oriented o Language. Ambos lenguajes, o versiones modernizadas, sobreviven hasta nuestros

1.4 La arquitectura de von Neumann

17

Figura 1.3

Codicacin en ensamblador de frmulas matemticas. o o a

Frmula o b c2b 2a

Programa simplicado 4acdef def def def def def def def x1 a b c ac a2 b2 rad 100 102 104 106 108 110 112 114 mul mul mul mul add sqrt sub div b2 b ac a ac 4 a2 2 rad ac rad rad x1 rad x1 x1 b c ac a b2 b a2

x1

d as. Estos lenguajes ten un formato tambin ms o menos estricto, en el sentido an e a de que las columnas de las tarjetas perforadas estaban perfectamente asignadas, y cada elemento del lenguaje ten una posicin, como en lenguaje ensamblador. a o El proceso por el que tiene que pasar un programa en alguno de estos lenguajes de programacin para ser ejecutado, es muy similar al de un programa escrito o en lenguaje ensamblador, donde cada enunciado en lenguaje de alto nivel se traduce a varios enunciados en lenguaje de mquina (por eso el calicativo de a alto nivel, alto nivel de informacin por enunciado), que es el unico que puede o ser ejecutado por la computadora. Hacia nales de los aos 50 se dise un lenguaje, ALGOL ALGorithmic n no Oriented Language que result ser el modelo de desarrollo de prcticamente o a todos los lenguajes orientados a algoritmos de hoy en d como Pascal, C, C++, a, Java y muchos ms. No se pretende ser exhaustivo en la lista de lenguajes, basa te mencionar que tambin en los aos 50 surgi el lenguaje LISP, orientado a e n o inteligencia articial; en los aos 60 surgi BASIC, orientado a hacer ms fcil n o a a el acercamiento a las computadoras de personas no forzosamente con antecedentes cient cos. En los aos 60 surgi el primer lenguaje que se puede considerar n o orientado a objetos, SIMULA, que era una extensin de ALGOL. En los aproxio madamente 50 aos que tienen en uso las computadoras, se han diseado y usado n n ms de 1,000 lenguajes de programacin, por lo que pretender mencionar siquiera a o a los ms importantes es una tarea titnica, y no el objetivo de estas notas. a a

18

Introduccin o

Representacin de la informacin o oAcabamos de ver que la representacin de los programas debe ser, eventualo mente en lenguaje de mquina, o sea, en binario. Tambin tenemos restricciones a e similares para el resto de la informacin, como son los datos, los resultados intero medios y los resultados nales. Al igual que con los lenguajes de programacin, o si bien la computadora slo tiene la posibilidad de representar enteros positivos o en binario, debemos encontrar la manera de poder representar letras, nmeros de u varios tipos, como enteros negativos, reales, racionales, etc. Para ello se sigue una lgica similar a la del lenguaje de mquina. o a

Carcteres aSupongamos que tenemos un tamao de palabra de 16 bits y queremos repren sentar letras o carcteres. Simplemente hacemos lo que hac a amos en la primaria cuando quer amos mandar mensajes secretos: nos ponemos de acuerdo en algn u cdigo. o El primer cdigo que se utiliz fue el BCD, que utilizaba 6 bits por carcter. o o a Con esto se pod representar 64 carcteres distintos (en 6 bits hay 64 posibles an a enteros, del 0 al 63). Con este cdigo alcanzaba para las maysculas, los d o u gitos y algunos carcteres importantes como los signos de operacin y de puntuacin. a o o Con el perfeccionamiento de las computadoras se requirieron cada vez ms a carcteres, por lo que se extendi el cdigo a 7 y 8 bits, con el cdigo ASCII, que a o o o se us mucho para transmitir informacin, y el cdigo EBCDIC que se us como o o o o cdigo nativo de muchas computadoras, respectivamente. El lenguaje Java utiliza o Unicode, que ocupa 16 bits, para representar a cada carcter. Con esto tiene la a posibilidad de utilizar casi cualquier conjunto de carcteres de much a simos de los idiomas en uso actualmente. Se requiere de programas que transformen a un carcter en su cdigo de mquia o a na y viceversa. Estos son programas sencillos que simplemente observan patrones de bits y los interpretan, o bien, observan carcteres y mediante una tabla, a los convierten al patrn de bits en el cdigo que utilice la computadora. o o Prcticamente todo manual de programacin trae una tabla de los distintos a o cdigos que corresponden a los carcteres. Estas tablas vienen con varias columnas; o a en la primera de ellas vendr el carcter, y en columnas subsecuentes su cdigo a a o en octal hexadecimal, binario, y utilizando alguno de estos esquemas para dar

1.4 La arquitectura de von Neumann

19

el cdigo que le corresponde en ASCII, EBCDIC o Unicode. Por supuesto que o requerimos de 32,768 para mostrar la codicacin de Unicode, por lo que no o lo haremos, mas que en la medida en que tengamos que conocer el de algunos carcteres espec a cos.

Nmeros enteros uYa vimos la manera en que se representan nmeros enteros en la computadora: u simplemente tomamos una palabra y usamos notacin posicional binaria para ver o el valor de un entero. Hoy en d las computadoras vienen, en su gran mayor con palabras de al a a, menos 32 bits. Eso quiere decir que podemos representar enteros positivos que van desde el 0 (32 bits apagados) hasta 232 1 (todos los bits prendidos). Pero, cmo le hacemos para representar enteros negativos? Tenemos dos opciones. La o primera de ellas es la ms intuitiva: utilizamos un bit, el de la extrema izquierda, a como signo. A esta notacin se le llama de signo y magnitud. Si ste es el caso, o e tenemos ahora 31 bits para la magnitud y 1 bit para el signo ver gura 1.4 con palabras de 16 bits.

Figura 1.4

Enteros en signo y magnitud.s 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 0 0 0 0 1 0 1 1 0 1 1 1 0 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 1 1

1467 1467

La representacin se signo y magnitud es muy costosa. Por ejemplo, cuando o se suman dos cantidades que tienen signos opuestos, hay que ver cul es la que a tiene mayor magnitud, pues la suma se puede convertir en resta de magnitudes. Veamos el algoritmo 1.2 en la siguiente pgina. a Como se puede ver, los circuitos que se requieren para sumar dos nmeros en u notacin de signo y magnitud son muy complicados, y por lo tanto muy caros. o El otro modo de codicar enteros positivos y negativos es lo que se conoce como complemento a 2. En este mtodo, al igual que con signo y magnitud, se e parte al dominio en 2 partes, los que tienen al bit de potencia ms alta en 0, y los a que lo tienen en 1; los que tienen el bit ms alto en cero son los enteros positivos, a y los que lo tienen en 1 son los enteros negativos. Para saber la magnitud del nmero, en el caso de los positivos se calcula igual que con signo y magnitud, pero u

20

Introduccin o

Algoritmo 1.2 Sumando dos nmeros representados con signo y magnitud. u1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:

Sean a y b los enteros a sumar. Sa signo de a; Ma magnitud de a. Sb signo de b; Mb magnitud de b. if Sa Sb Ssuma Sa . Msuma Ma Mb . else if Ma Mb Ssuma Sa . Msuma Ma Mb . else Ssuma Sb . Msuma Mb Ma .

en el caso de los negativos, la magnitud es la que resulta de restar la palabra de una con una posicin ms, y donde todas las posiciones originales de la palabra o a tienen 0, con un 1 en la posicin extra. Veamos algunos ejemplos en la gura 1.5 o en la pgina opuesta. a Como vemos en la gura 1.5, el bit 15 (el que corresponde a 215 ) tambin e nos indica de cierta forma, como en la notacin de signo y magnitud, cuando o tenemos un entero negativo. En el caso de 16 bits, los enteros positivos son del 0 al 215 1 32, 767 que corresponde a una palabra de 16 bits con todos menos el bit 15 prendidos ver gura 1.5, l nea (1). A partir del nmero 215 32, 768 y hasta 216 u 1 65, 535, que corresponde a todos los bits en una palabra de 16 bits prendidos, estamos representando a nmeros negativos ver en la gura 1.5, l u nea (3). En estos ultimos, el bit 15 est siempre prendido, y por eso reconocemos el signo a del nmero. La magnitud (o el valor absoluto) del nmero que estamos viendo se u u obtiene sacando el complemento a 2 de la palabra en cuestin. El complemento a o 2 se obtiene de dos maneras posibles: I. Se resta en binario de un n mero de 17 bits en la gura 1.5, l u nea (2) con ceros en todos los bits, menos el bit 16, que tiene 1. II. Se complementan cada uno de los bits de la palabra de 16 bits (se cambian los 1s por 0s y los 0s por 1s) y despus se le suma 1 a lo que se obtuvo. e Ambas maneras de obtener la magnitud (el complemento a 2) se observa en la l nea (4) de la gura 1.5. La gran ventaja de la notacin en complemento a 2 es que es sumamente fcil o a hacer operaciones aritmticas como la suma y la resta. En complemento a 2, todo lo e que tenemos que hacer es sumar (o restar) utilizando los 16 bits. Pudiera suceder,

1.4 La arquitectura de von Neumann

21

sin embargo, que el resultado no sea vlido. Por ejemplo, si sumamos dos nmeros a u positivos y el resultado es mayor que la capacidad, tendremos acarreo sobre el bit 15, dando aparentemente un nmero negativo. Sabemos que el resultado es u invlido porque si en los dos sumandos el bit 15 estaba apagado, tiene que estar a apagado en el resultado. Algo similar sucede si se suman dos nmeros negativos u y el resultado ya no cabe en 16 bits ver gura 1.6.

Figura 1.5

Nmeros en complemento a 2 u

215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 Un entero positivo en complemento a 2: 0 0 0 0 1 1 1 0 0 0 0 0 1 0 0 0 La palabra con el complemento a 2: 1 0 0 0 0 0 0 0 0

3, 592 216 65, 536

p1q p2q p3q p4q

0

0

0

0

0

0

0

0

Un entero negativo en complemento a 2: 1 0 0 0 1 1 1 0 0 La magnitud del entero original: 0 0 1 1 1 0 0 0

0

0

0

1

0

0

0

36, 360

1

1

1

1

1

1

0

0

0

29, 176

Figura 1.6

Suma de dos nmeros con complemento a 2 u215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 0 0 0 0 0 0 0 0 1 1 0 0 1 1 1 1 0 0 0 1 0 0 0 1 1 1 0 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 1 0 1 1 0 0 1 1 0 0 1 1 1 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 0 1 1 1 1 0 0 1 0 1 0 0 1 1 1 0 0 1 0 1 1 0 207 4547 4754 25 939

+

+

914

22

Introduccin o

Pueden vericar, sumando las potencias de 2 donde hay un 1, que las sumas en la gura 1.5 se hicieron directamente y que el resultado es el correcto. La desventaja del complemento a 2 es que se pueden presentar errores sin que nos demos cuenta de ello. Por ejemplo, si le sumamos 1 al mximo entero positivo a (una palabra con 0 en el bit 15 y 1s en el resto de los bits) el resultado resulta ser un nmero negativo, aquel que tiene 1s en todas las posiciones de la palabra u ver gura 1.7.

Figura 1.7

Sumando 1 al mximo entero positivo a215 214 213 212 211 210 29 28 27 26 25 24 23 22 21 20 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 32767 1

+

32768

En algunos lenguajes de programacin este tipo de errores se detectan en o ejecucin, pero en la mayor no. Hay que tener presente que la representacin o a o interna es con complemento a 2, para manejar de manera adecuada este tipo de posibles errores. Muchas veces el tamao de la palabra de una computadora no es suciente n para los nmeros que deseamos representar. Entonces, el lenguaje de programacin u o puede usar ms de una palabra para representar enteros, simplemente utilizando a notacin posicional base 216 , de manera similar a como se maneja la base 2. Se o dice entonces que la aritmtica se hace por software. e

Nmeros reales uPara representar a los nmero reales tenemos realmente dos opciones: u Punto jo: Como su nombre lo indica, el fabricante (o el lenguaje de programacin) elige una posicin entre dos bits, y lo que se encuentra a la derecha de o o esa posicin es la parte fraccionaria y lo que se encuentra a la izquierda es o la parte entera, ambos vistos como enteros en notacin posicional binaria o ver gura 1.8. Como se puede ver en la gura 1.8, se mantiene la notacin de complemento o a 2, el bit ms alto indicndonos que el nmero es negativo. a a u

1.4 La arquitectura de von Neumann

23

Figura 1.8

Notacin de punto jo. o27 26 25 24 23 22 21 20 0 1 0 0 1 1 0 1 1 0 0 1 1 0 1 1

270 0

26 25 24 23 22 21 20 1 0 0 0 0 1 1 1 0 1 0 1 1 0

77,67 100,162

Una de las ventajas de este tipo de notacin es que es muy sencillo hacer o operaciones aritmticas, pues se usa a toda la palabra como si fuera un entero e y el proceso de colocar el punto decimal se hace al nal. Sin embargo, tiene una gran desventaja que es la poca exibilidad para representar nmeros u que tengan muchos d gitos en la fraccin, o muy pocos. o Punto otante: El punto otante es otra manera de representar nmeros reales. u Bsicamente como se logra es dividiendo a la palabra en dos partes, una a para la mantisa y la otra para el exponente, utilizando lo que se conoce como notacin cient o ca. Veamos los siguientes ejemplos: 1,32456 106 1,32456 106 1,32456 103

1324560 ,00000132456 1324,56

Como podemos ver del ejemplo anterior, nos ponemos de acuerdo en cuntos a d gitos van a estar a la izquierda del punto decimal, y todos los nmeros u reales los representamos con ese nmero de enteros. A continuacin, damos u o una potencia de 10 por la que hay que multiplicar el nmero, para obtener u el nmero que deseamos. u Una abreviatura de esta notacin ser escribiendo los dos nmeros anterioo a u res de la siguiente forma: 1,32456E6 1324560 1,32456E 6 ,00000132456 1,32456E3 1324,56

24

Introduccin o

Esta representacin es much o simo ms verstil que la de punto jo, y de a a hecho es la que se usa generalmente. Al momento de representar los nmeros, u se hace en binario. Si damos mucho espacio para los exponentes tenemos la posibilidad de representar nmeros muy grandes o muy pequeos (con el u n exponente negativo). Si en cambio le damos mucho espacio a la mantisa, vamos a tener nmeros con mucha precisin (muchas cifras signicativas). u o Es conveniente encontrar un balance entre la magnitud y la precisin. Por o ejemplo, la IEEE tiene sus estndares. a Las operaciones con este tipo de nmeros son un poco ms complejas que con u a punto jo. Por ejemplo, si deseamos sumar dos nmeros, tenemos primero u que llevarlos a que tengan el mismo exponente, y una vez hecho esto se puede llevar a cabo la suma. En cambio, multiplicar dos nmeros es sumamente u fcil. Por qu? a e Al igual que en los nmeros enteros, adems de lo que nos proporcione el u a hardware de la computadora como tamao de palabra, por software se pueden n usar tantas palabras como uno quiera para representar a un entero o a un real. Cada lenguaje de programacin proporciona un conjunto de enteros y reales de o diversos tamaos. n La inmensa mayor de las computadoras utilizan complemento a 2 y mantisa a y exponente para representar nmeros. u

Limitaciones en la representacin interna oVimos ya que en la computadora no podemos representar a todos y cualquier entero: tenemos un nmero nito de enteros distintos que podemos representar, u no importa que tan grande sea la palabra de una computadora dada, ya que tenemos un nmero nito de combinaciones de 0s y 1s en cualquier tamao dado u n de palabra. Algo similar ocurre con los nmeros reales. No slo no tenemos la posibilidad u o de representar a un nmero innito de nmeros reales, sino que adems tampoco u u a tenemos la densidad de los nmeros reales. Como estamos usando binario para u representar a nmeros que nosotros manejamos y pensamos como nmeros en u u base 10, habr nmeros que no tengan un representacin exacta al convertirlos a u o a base 2 (por supuesto que estamos hablando de nmeros fraccionarios). Adiciou nalmente, al agregarle 1 a una mantisa, no obtenemos el siguiente nmero real, u ya que estamos sumando, posiblemente, en la parte fraccionaria. Por ello, no es posible tener una representacin para todos y cada uno de los nmeros reales en o u

1.5 Ejecucin de programas o

25

un intervalo dado: nuevamente, ste es un nmero innito y lo que tenemos es un e u nmero nito de combinaciones. u

1.5 Ejecucin de programas oMencionamos arriba que lo unico que puede ejecutar una computadora de hardware es un programa escrito en su lenguaje de mquina. Por lo que para que a nuestros programas escritos en Java puedan ser ejecutados, debern estar escritos a en lenguaje de mquina. a Recuerdan lo que hac amos para obtener un programa escrito en lenguaje de mquina a partir de uno escrito en ensamblador? Se lo dbamos como datos a un a a programa que traduc de enunciados en ensamblador a enunciados en lenguaje a de mquina. Algo similar hacemos cuando estamos trabajando en un lenguaje de a alto nivel. En general, tenemos dos maneras de conseguir ejecutar un programa escrito en un lenguaje de alto nivel. La primera de ellas es mediante un intrprete, y la e segunda mediante un compilador. Veamos qu queremos decir con cada uno de e estos trminos. e

Denicin 1.4 Un intrprete es un programa que una vez cargado en la memoria de una o ecomputadora, y al ejecutarse, procede como sigue: Toma un enunciado del programa en lenguaje de alto nivel, llamado el cdigo o fuente. Traduce ese enunciado y lo ejecuta. Repite estas dos acciones hasta que alguna instruccin le indique que pare, o o bien tenga un error fatal en la ejecucin. o

Denicin 1.5 Un compilador es un programa, una vez que reside en memoria y al oejecutarse, toma un programa fuente y lo traduce completo a un programa en otro lenguaje de programacin, que generalmente es lenguaje de mquina, equivalente. o a Mientras que un intrprete va traduciendo y ejecutando, el compilador no e se encarga de ejecutar, sino simplemente de producir un programa equivalente, susceptible de ser cargado a la memoria de la mquina y ejecutado. a

26

Introduccin o

A los intrpretes se les conoce tambin como mquinas virtuales, porque una e e a vez que estn cargados en una mquina, se comportan como si fueran otra compua a tadora, aquella cuyo lenguaje de mquina es el que se est traduciendo y ejecua a tando.

1.5.1.

Filosof de programacin as oDependiendo del tipo de problema que queramos resolver numrico, admie nistrativo, de propsito general, inteligencia articial, lgico tenemos distintos o o lenguajes de programacin que permiten representar de mejor manera los formao tos de los datos y los recursos que requerimos para resolver el problema. As , para procesos numricos se requiere de bibliotecas muy extensas con funciones e matemticas, un manejo sencillo de matrices y, en general, de espacios de varias a dimensiones, etc. El lenguaje que fue diseado para este tipo de problemas fue n FORTRAN, y recientemente se usa C. Si lo que queremos es resolver problemas administrativos tenemos a COBOL, que se rehusa a morir, o Visual Basic que provee una fabricacin rpida de interfaces con el usuario2 . Como representantes o a de lenguajes de propsito general tenemos Pascal, C, Algol. Para problemas que o involucran cambios de estado en los datos, o situaciones que suceden no forzosamente una despus de la otra se cuenta con lenguajes orientados a objetos como e C++, SmallTalk y Java. Para resolver problemas que involucran manejo simblico o de datos, como lo que se requiere para Inteligencia Articial, se tienen lenguajes como LISP y Scheme. Para problemas de tipo lgico se tiene ProLog. En n, casi o cualquier tipo de aplicacin que se nos ocurra, se puede disear un lenguaje de o n programacin para el cual el lenguaje que se utilice en el algoritmo sea mucho muy o cercano al lenguaje de programacin: ste es el objetivo que se persigue cuando o e se disean nuevos lenguajes de programacin. Este curso se enfocar a resolver n o a problemas que se expresan fcilmente con orientacin a objetos, y el lenguaje que a o utilizaremos es Java. Es importante darse cuenta que, nalmente, cualquier problema se puede resolver utilizando cualquier lenguaje: nalmente, todo programa tiene que traducirse a lenguaje de mquina, por lo que no importa en qu lenguaje hayamos programaa e do, terminaremos con un programa equivalente escrito en lenguaje de mquina. a El meollo del asunto es, simplemente, qu tanto trabajo nos cuesta pensar en el e problema en un lenguaje pensado para resolver otro tipo de problemas. Buscamos que el lenguaje de programacin se ajuste de manera sencilla a nuestro modo de oUna interfaz con el usuario es aquel programa que permite una comunicacin mejor entre o el usuario y el programa en la computadora. Se usa para referirse a las intefaces grcas. a2

1.6 Caracter sticas de Java

27

pensar respecto al problema que deseamos resolver.

1.6 Caracter sticas de JavaJava es un lenguaje orientado a objetos, cuyo principal objetivo de diseo es n que fuera porttil. Una manera de hacer programas escritos en Java es mediante a el siguiente truco: Se traduce el programa escrito en Java a un lenguaje de bajo nivel, tipo lenguaje de mquina, pero que no sea el de una mquina en espec a a co. Se construye (programa) un intrprete de este lenguaje de mquina, y e a entonces se ejecuta el programa en lenguaje de mquina en la mquina a a virtual de Java. Esto resulta relativamente sencillo. El lenguaje de mquina de Java se llama a bytecode. Es ms fcil construir una mquina virtual que entienda el bytecode que a a a construir un compilador para cada posible lenguaje de mquina. Adems, una vez a a que est denida la mquina virtual, se le pueden agregar capacidades al lenguaje, a a simplemente dando su transformacin a bytecode. o Por todo esto, para ejecutar un programa escrito en Java necesitamos: a. Tener un compilador de Java que traduzca de programas escritos en Java a bytecode (javac). b. Tener un intrprete de bytecode (o mquina virtual de Java) a la que se le da e a como datos el programa en bytecode y los datos pertinentes al programa.

El proceso del software

2

2.1 Qu es la programacin? e oComo ya platicamos al hablar de lenguajes de programacin, la programao cin consiste en elaborar un algoritmo, escrito en un lenguaje susceptible de ser o ejecutado por una computadora, para resolver una clase de problemas. Podemos pensar en un algoritmo como la denicin de una funcin. Una vez o o denida sta, se procede a aplicar la funcin a distintos conjuntos de argumentos e o (datos) para obtener el resultado. El proceso que nos lleva nalmente a aplicar un programa a datos determinados conlleva varias etapas, algunas de ellas repetitivas. En el estado inicial de este proceso tendremos un enunciado del problema que deseamos resolver, junto con la forma que van a tomar los datos (cuntos datos, de qu tipo). En el estado a e nal deberemos contar con un programa correcto que se puede instalar en una computadora para ser ejecutado con cualquier conjunto de datos que cumpla las especicaciones planteadas. Por ello deberemos observar los siguientes pasos (ver gura 2.1 en la siguiente pgina para el proceso del Software.1 ) a1 El diagrama que presentamos es lo que corresponde a un proceso de software en espiral, ya que se regresa una y otra vez a etapas anteriores, hasta que se pueda llegar al nal del diagrama.

30

El proceso del software

Figura 2.1

Proceso del software.Especicacin o

Anlisis y Diseo a n

Implementacin o

Validacin o

Mantenimiento

Renamiento y extensin o

Especicacin del problema: Se nos presenta el enunciado del problema y deo beremos determinar de manera precisa las especicaciones: de dnde paro timos (con qu entradas contamos) y a dnde queremos llegar (cul es el e o a resultado que deseamos obtener). Como producto de esta etapa deberemos producir tres incisos: a. Enunciado preciso del problema. b. Entradas. c. Salidas.

2.1 Qu es la programacin? e o

31

Anlisis y dise o del algoritmo: Planteamos la manera en que vamos a transa n formar los datos de entrada para obtener el resultado que buscamos, y procedemos a elaborar un modelo de la solucin. Muchas veces este modelo o involucra varios pasos intermedios (estados de los datos), o ms que un rea sultado concreto, buscamos un cierto comportamiento, como en el caso de un juego o una simulacin como la de un reloj. En estos ultimos casos o deberemos pensar en procesos sucesivos que nos lleven de un estado de cosas (estado de los datos) al estado inmediato sucesor fotos instantneas a y cul o cules son las transformaciones de los datos que nos producen el a a siguiente estado. Dependiendo del ambiente (dominio) de nuestro problema, las soluciones que diseemos debern tener distintas caracter n a sticas. La primera de ellas, que comparten todos los dominios es: a) La solucin debe ser correcta, eciente y efectiva. o La unica excepcin posible a esta reglas se presenta si estamos haciendo o un programa para ayudarnos a calcular algo, o para sacarnos de un brete momentneo o coyuntural, el programa se va a utilizar pocas veces en un a lapso corto de tiempo; tal vez hasta podemos eliminar la caracter stica de que sea eciente (haga el trabajo en un tiempo razonable, utilizando una cantidad razonable de recursos como la memoria). En los primeros aos de n las computadoras, casi todos los programas eran de este tipo: la gente los hac para s mismos, o para un grupo reducido que estaba muy al tanto de a lo que estaba pasando. Hoy en d en que las computadoras estn en todo, la mayor de la gente a, a a involucrada haciendo programas los hace para otros. Adems, el tamao a n de los sistemas ha crecido tanto, que ya casi nadie es el dueo de sus n programas, sino que se trabaja en el contexto de proyectos grandes, con mucha gente involucrada. En este tipo de situaciones, que hoy en d son a ms la regla que la excepcin, se requiere adems que los programas: a o a b) Sean modulares. Se puedan trazar claramente las fronteras entre pedazos del programa (o sistema), para que la tarea se pueda repartir. c) Tengan un bajo nivel de acoplamiento. Esta propiedad se reere a que utilicen lo menos posible del mundo exterior y entreguen lo m nimo posible: que haya poco trco entre los mdulos, de tal manera que haya la a o posibilidad de reutilizarlos.

32

El proceso del software

d) Alta cohesin, que se reere al hecho de que todo lo que est relacionado o e (funciones, datos) se encuentren juntos, para que sean fciles de localizar, a entender y modicar. Implementacin o construccin del modelo: En esta etapa deberemos trao o ducir nuestro algoritmo al lenguaje de programacin que hayamos elegido. o A esta etapa se le conoce tambin como de codicacin. Esta no es una labor e o muy dif si es que tenemos un diseo que siga la losof 2 del lenguaje de cil, n a programacin. o Asegurar la documentacin del programa: Esto no es o no deber ser o a una etapa separada del proceso, ya que lo ideal es