HelpFeedback
Programación en C/C++. Java
Centro de información
Prólogo
Contenido
Capítulo muestra


Centro de estudiante
Programación en C/C++. Java y UML

Luis Joyanes Aguilar
Ignacio Zahonero Martínez

ISBN: 9701069498
Copyright year: 2009

Contenido






Parte I
Resolución de problemas con software 1


Capítulo 1

Introducción a las computadoras
y los lenguajes de programación 3
Introducción 3
¿Qué es una computadora? 4
Organización física de una computadora 5
Dispositivos de entrada/salida (E/S): periféricos 7
La memoria principal 8
Unidades de medida de memoria 9
Representación de la información en las computadoras 10
Representación de textos 10
Representación de valores numéricos 11
Representación de enteros 12
Representación de reales 12
Representación de caracteres 13
Redes, Web, Web 2.0 y Web 3.0 13
Compartición de recursos 14
Redes P2P, igual-a-igual (peer-to-peer) 14
Aplicaciones de las redes de comunicaciones 15
Módem 15
Internet y la World Wide Web 16
Web 2.0 y Web 3.0 17
El software (los programas) 17
Software del sistema 18
Software de aplicación 18
Sistema operativo 18
Windows Vista 20
Tipos de sistemas operativos 20
Multiprogramación/multitarea 20
Tiempo compartido (múltiples usuarios, time sharing) 21
Multiproceso 21
Lenguajes de programación 21
Traductores de lenguaje: el proceso de traducción de un programa 23
Intérpretes 23
Compiladores 23
La compilación y sus fases 24
Evolución de los lenguajes de programación 24
Paradigmas de programación 26
Lenguajes imperativos (procedimentales) 26
Lenguajes declarativos 26
Lenguajes orientados a objetos 26
Breve historia de los lenguajes de programación 27
Programación de la Web 28




Capítulo 2
Metodología de la programación
y desarrollo de software 30
Introducción 30
Fases en la resolución de problemas 30
Análisis del problema 32
Diseño del algoritmo 33
Herramientas de programación 33
Codificación de un programa 36
Documentación interna 36
Compilación y ejecución de un programa 36
Verificación y depuración de un programa 37
Documentación y mantenimiento 37
Programación estructurada 37
Datos locales y datos globales 39
Concepto y características de los algoritmos 40
Características de los algoritmos 41
Diseño del algoritmo 42
Escritura de algoritmos 44
Representación gráfica de los algoritmos 45
Pseudocódigo 46
Diagramas de flujo 47
Resumen 55
Ejercicios 55
Parte II
Programación en C 57



Capítulo 3



El lenguaje C: elementos básicos 59
Introducción 59
Estructura general de un programa en C 60
Directivas del preprocesador 61
Declaraciones globales 63
Función main() 63
Funciones definidas por el usuario 64
Comentarios 65
Creación de un programa 67
El proceso de ejecución de un programa en C 67
Depuración de un programa en C 70
Errores de sintaxis 71
Errores lógicos 71
Errores de regresión 72
Mensajes de error 72
Errores en tiempo de ejecución 72
Pruebas 73
Los elementos de un programa en C 74
Tokens (elementos léxicos de los programas) 74
Identificadores 74
Palabras reservadas 75
Comentarios 75
Signos de puntuación y separadores 75
Archivos de cabecera 75
Tipos de datos en C 76
Enteros (int) 76
Declaración de variables 77
Tipos de coma flotante (float/double) 78
Caracteres (char) 78
El tipo de dato logico 80
Escritura de valores lógicos 81
Constantes 81
Constantes literales 81
Constantes enteras 81
Constantes reales 82
Constantes caracteres 82
Constantes de cadena 83
Constantes definidas (simbólicas) 83
Constantes enumeradas 84
Constantes declaradas const y volatile 84
Diferencias entre const y #define 84
Ventajas de const sobre #define 85
Desventaja de const frente a #define 85
Variables 85
Declaración 85
Inicialización de variables 87
Declaración o definición 87
Duración de una variable 88
Variables locales 88
Variables globales 88
Variables dinámicas 89
Entradas y salidas 89
Salida 90
Entrada 92
Salida de cadenas de caracteres 93
Entrada de cadenas de caracteres 93
Compilación de programas C en UNIX y LINUX 94
Orden de compilación cc 94
Opción -c 95
Opción -o 95
Opción -g (depuración) 96
Opción -D (define) 96
Opción -I (inclusión) 96
Opción -E (expandir) 97
Opción -O (optimizar) 97
Resumen 98
Ejercicios 98



Capítulo 4

Operadores y expresiones 100
Introducción 100
Operadores y expresiones 101
Operador de asignación 101
Operadores aritméticos 102
Asociatividad 104
Uso de paréntesis 104
Operadores de incrementación y decrementación 105
Operadores lógicos 110
Evaluación en cortocircuito 111
Asignaciones booleanas (lógicas) 113
Operadores de manipulación de bits 113
Operadores de asignación adicionales 114
Operadores de desplazamiento de bits (>>, <<) 115
Operadores de direcciones 115
Operador condicional 115
Operador coma 116
Operadores especiales: ( ), [ ] 117
El operador ( ) 117
El operador [ ] 117
Operador sizeof 117
Conversiones de tipos 118
Conversión implícita 118
Reglas 119
Conversión explícita 119
Prioridad y asociatividad 119
Resumen 120
Ejercicios 121
Problemas 123



Capítulo 5

Estructuras de selección: sentencias if y switch 126
Introducción 126
Estructuras de control 127
La sentencia if 127
Sentencia if de dos opciones: if-else 130
Sentencias if-else anidadas 133
Sangría en las sentencias if anidadas 133
Comparación de sentencias if anidadas y secuencias de sentencias if 134
Sentencia de control switch 136
Caso particular de case 140
Uso de sentencias switch en menús 140
Expresiones condicionales: el operador ?: 140
Evaluación en cortocircuito de expresiones lógicas 142
Puesta a punto de programas 143
Estilo y diseño 143
Errores frecuentes de programación 144
Resumen 145
Ejercicios 146
Problemas 148



Capítulo 6



Estructuras de control: bucles 150
Introducción 150
Sentencia while 151
Operadores de incremento y decremento (++, −−) 153
Terminaciones anormales de un bucle (ciclo) 154
Diseño eficiente de bucles 155
Bucles while con cero iteraciones 155
Bucles controlados por centinelas 155
Bucles controlados por indicadores (banderas) 156
La sentencia break en los bucles 158
Bucles while (true) 158
Repetición: el bucle for 160
Diferentes usos de bucles for 164
Precauciones en el uso de for 165
Bucles infinitos 166
Los bucles for vacíos 167
Sentencias nulas en bucles for 167
Sentencias break y continue 168
Repetición: el bucle do-while 169
Diferencias entre while y do-while 170
Comparación de bucles while, for y do-while 172
Diseño de bucles 172
Bucles para diseño de sumas y productos 173
Final de un bucle 173
Otras técnicas de terminación de bucle 174
Bucles for vacíos 175
Bucles anidados 176
Enumeraciones 179
Resumen 181
Ejercicios 182
Problemas 185

Capítulo 7



Funciones 189
Introducción 189
Concepto de función 190
Estructura de una función 191
Nombre de una función 193
Tipo de dato de retorno 193
Resultados de una función 194
Llamada a una función 195
Prototipos de las funciones 197
Prototipos con un número no especificado de parámetros 200
Parámetros de la función 201
Paso de parámetros por valor 201
Paso de parámetros por referencia 202
Diferencias entre paso de variables por valor y por referencia 203
Parámetros const de una función 204
Funciones en línea, macros con argumentos 205
Creación de macros con argumentos 206
Ámbito (alcance) de una variable 207
Ámbito del programa 208
Ámbito del archivo fuente 208
Ámbito de una función 209
Ámbito de bloque 209
Variables locales 209
Clases de almacenamiento 210
Variables automáticas 210
Variables externas 210
Variables registro 211
Variables estáticas 211
Concepto y uso de funciones de biblioteca 212
Funciones de carácter 213
Comprobación alfabética y de dígitos 213
Funciones de prueba de caracteres especiales 214
Funciones de conversión de caracteres 215
Funciones numéricas 215
Funciones matemáticas de carácter general 216
Funciones trigonométricas 217
Funciones logarítmicas y exponenciales 218
Funciones aleatorias 218
Funciones de fecha y hora 220
Funciones de utilidad 222
Visibilidad de una función 223
Variables locales frente a variables globales 224
Variables estáticas y automáticas 226
Variables globales estáticas 227
Compilación separada 228
Resumen 230
Ejercicios 231
Problemas 232



Capítulo 8



Arreglos (arrays), listas y tablas 234
Introducción 234
Arreglos (arrays) 235
Declaración de un arreglo 235
Subíndices de un arreglo 236
Almacenamiento en memoria de los arreglos 237
El tamaño de los arreglos 237
Verificación del rango del índice de un arreglo 238
Inicialización de un arreglo 238
Arreglos de caracteres y cadenas de texto 240
Arreglos multidimensionales 242
Inicialización de arreglos multidimensionales 243
Acceso a los elementos de los arreglos bidimensionales 244
Lectura y escritura de elementos de arreglos bidimensionales 245
Acceso a elementos mediante bucles 245
Arreglos de más de dos dimensiones 247
Proceso de un arreglo de tres dimensiones 247
Utilización de arreglos como parámetros 249
Precauciones 251
Paso de cadenas como parámetros 253
Operaciones de organización de la información en listas de datos 253
Búsqueda en listas 254
Búsqueda secuencial 254
Resumen 258
Ejercicios 258
Problemas 260



Capítulo 9



Algoritmos de ordenación y búsqueda 264
Introducción 264
Ordenación 265
Ordenación por burbuja 266
Algoritmo de la burbuja 266
Codificación del algoritmo de la burbuja 268
Análisis del algoritmo de la burbuja 269
Ordenación por selección 269
Algoritmo de selección 270
Codificación del algoritmo de selección 270
Ordenación por inserción 271
Algoritmo de ordenación por inserción 271
Codificación del algoritmo de inserción 271
Ordenación Shell 272
Algoritmo de ordenación Shell 272
Codificación del método Shell 273
Ordenación rápida (quicksort) 274
Algoritmo quicksort 275
Codificación del algoritmo quicksort 276
Análisis del algoritmo quicksort 278
Búsqueda en listas: búsqueda secuencial y binaria 278
Búsqueda binaria 279
Algoritmo y codificación de la búsqueda binaria 280
Análisis de los algoritmos de búsqueda 281
Complejidad de la búsqueda secuencial 281
Análisis de la búsqueda binaria 282
Comparación de la búsqueda binaria y secuencial 282
Resumen 283
Ejercicios 283
Problemas 285



Capítulo 10



Estructuras y uniones 287
Introducción 287
Estructuras 288
Declaración de una estructura 288
Definición de variables de estructuras 289
Otros ejemplos de definición/declaración 290
Uso de estructuras en asignaciones 290
Inicialización de una declaración de estructuras 291
El tamaño de una estructura 291
Acceso a estructuras 292
Almacenamiento de información en estructuras 292
Acceso a una estructura de datos mediante el operador punto 292
Acceso a una estructura de datos mediante el operador puntero 293
Lectura de información de una estructura 293
Recuperación de información de una estructura 294
Sinónimo de un tipo de datos: typedef 294
Estructuras anidadas 295
Ejemplo de estructuras anidadas 296
Arreglos de estructuras 299
Arreglos como miembros 300
Utilización de estructuras como parámetros 301
Uniones 302
Tamaño de estructuras y uniones 303
Campos de bit 304
Resumen 307
Ejercicios 308
Problemas 309



Capítulo 11



Apuntadores (punteros) 310
Introducción 310
Direcciones en memoria 311
Concepto de apuntador (puntero) 312
Declaración de apuntadores 313
Inicialización (iniciación) de apuntadores 314
Indirección de apuntadores 315
Apuntadores y verificación de tipos 316
Apuntadores NULL y void 316
Apuntadores a apuntadores 317
Apuntadores y arreglos 318
Nombres de arreglos como apuntadores 318
Ventajas de los apuntadores 319
Arreglos de apuntadores 320
Inicialización de un arreglo de apuntadores a cadenas 320
Apuntadores a cadenas 320
Apuntadores versus arreglos 321
Aritmética de apuntadores 322
Una aplicación de apuntadores: conversión de caracteres 323
Apuntadores constantes frente a apuntadores a constantes 324
Apuntadores constantes 324
Apuntadores a constantes 324
Apuntadores constantes a constantes 325
Apuntadores como argumentos de funciones 326
Apuntadores a funciones 327
Inicialización de un apuntador a una función 328
Aplicación de apuntadores a función para ordenación 331
Arreglos de apuntadores de funciones 332
Una aplicación de apuntadores a funciones 332
Apuntadores a estructuras 333
Resumen 334
Ejercicios 335
Problemas 337



Capítulo 12



Asignación dinámica de memoria 338
Introducción 338
Asignación dinámica de la memoria 339
Almacén libre (free store) 340
Función malloc( ) 340
Asignación de memoria de un tamaño desconocido 343
Uso de malloc( ) para arreglos multidimensionales 344
La función free( ) 345
Funciones de asignación calloc( ) y realloc( ) 346
Función calloc( ) 346
Función realloc( ) 346
Asignación de memoria para arreglos 349
Asignación de memoria interactivamente 351
Asignación de memoria para un arreglo de estructuras 352
Arreglos dinámicos 354
Comparación de los dos métodos para definir un arreglo 354
Reglas de funcionamiento de la asignación de memoria 355
Resumen 356
Ejercicios 357
Problemas 358



Capítulo 13



Cadenas 359
Introducción 359
Concepto de cadena 360
Declaración de variables de cadena 361
Inicialización de variables de cadena 361
Lectura de cadenas 362
Función gets( ) 362
Función getchar( ) 365
Función putchar( ) 365
Función puts( ) 366
La biblioteca string.h 367
Utilización del modificador const con cadenas 368
Arreglos y cadenas como parámetros de funciones 368
Asignación de cadenas 370
Función strncpy( ) 370
Longitud y concatenación de cadenas 371
Función strlen( ) 371
Funciones strcat( ) y strncat( ) 372
Comparación de cadenas 373
Función strcmp( ) 374
Función strncmp( ) 374
Conversión de cadenas a números 375
Función atoi( ) 375
Función atof( ) 376
Función atol( ) 376
Funciones strtol( ) y strtoul( ) 376
Función strtod( ) 377
Entrada de números y cadenas 378
Búsqueda de caracteres y cadenas 379
Función strchr( ) 379
La función strrchr( ) 379
Función strspn( ) 380
Función strcspn( ) 380
Función strpbrk( ) 381
Función strstr( ) 381
Función strtok( ) 382
Resumen 383
Ejercicios 383
Problemas 384



Capítulo 14



Recursividad 386
Introducción 386
La naturaleza de la recursividad 387
Funciones recursivas 390
Recursividad indirecta: funciones mutuamente recursivas 391
Condición de terminación de la recursión 392
Recursión versus iteración 393
Directrices para decidir entre iteración/recursión 394
Recursión infinita 395
Algoritmo divide y vencerás 396
Búsqueda binaria recursiva 397
Torres de Hanoi 398
Diseño del algoritmo 399
Implementación de las Torres de Hanoi 401
Consideraciones de eficiencia en las Torres de Hanoi 401
Ordenación por mezclas: Mergesort 402
Resumen 404
Ejercicios 404
Problemas 407



Capítulo 15



Entradas y salidas por archivos 409
Introducción 409
Flujos 410
Apuntador (puntero) file 410
Apertura de un archivo 411
Modos de apertura de un archivo 412
NULL y EOF 413
Cierre de archivos 413
Volcado del buffer: fflush( ) 414
Funciones de entrada/salida para archivos 415
Funciones putc( ) y fputc( ) 415
Funciones getc( ) y fgetc( ) 415
Funciones fputs( ) y fgets( ) 416
Funciones fprintf( ) y fscanf( ) 418
Función feof( ) 419
Función rewind( ) 420
Archivos binarios en C 420
Función de salida fwrite( ) 421
Función de lectura fread( ) 422
Funciones para acceso aleatorio 424
Función fseek( ) 424
Función ftell( ) 429
Cambio de posición: fgetpos( ) y fsetpos( ) 429
Datos externos al programa con argumentos de main( ) 431
Resumen 433
Ejercicios 434
Problemas 435



Parte III
Lenguaje unificado de modelado UML 437


Capítulo 16



Tipos abstractos de datos, objetos
y modelado con UML 2.0 439
Introducción 439
Programación estructurada (procedimental) 440
Limitaciones de la programación estructurada 441
Modelado de objetos del mundo real 442
Programación orientada a objetos 442
Objetos 444
Tipos abstractos de datos: clases 444
Instancias 445
Métodos 445
Ejemplos 445
Modelado e identificación de objetos 446
Estado 446
Comportamiento 447
Identidad 447
Propiedades fundamentales de la orientación a objetos 448
Abstracción 448
La abstracción en software 448
Encapsulamiento y ocultación de datos 449
Herencia 449
Reutilización o reusabilidad 450
Reutilización de código 450
Reescritura de código reusable 451
Polimorfismo 451
Modelado de aplicaciones: UML 452
Lenguaje de modelado 453
Diseño de software con UML 453
Desarrollo de software orientado a objetos con UML 454
Especificaciones de UML 454
Historia de UML 455
El futuro de UML 2.0 456
Terminología de orientación a objetos 456
Resumen 456
Ejercicios 457



Capítulo 17



Diseño de clases y objetos:
representaciones gráficas en UML 459
Introducción 459
Diseño y representación gráfica de objetos en UML 460
Representación gráfica en UML 462
Características de los objetos 463
Estado 463
Múltiples instancias de un objeto 465
Evolución de un objeto 465
Comportamiento 466
Identidad 468
Los mensajes 468
Tipos de mensajes 469
Responsabilidad y restricciones 470
Diseño y representación gráfica de clases en UML 470
Representación gráfica de una clase 472
Declaración de una clase 474
Especificación de una clase 474
Formato 474
Reglas de visibilidad 476
Sintaxis 478
Declaración de objetos de clases 479
Formato 479
Sintaxis 480
Acceso a miembros de la clase: encapsulamiento 480
Formato 481
Declaración de métodos 483
Notación y asignación de valores a los miembros 483
Tipos de métodos 487
Constructores 487
Constructor por defecto 488
Formato 489
Destructores 490
Implementación de clases en C++ 492
Archivos de cabecera y de clases 492
Opciones de compilación 492
Clases compuestas 493
Recolección de basura 494
El método finalize( ) 494
Formato 494
Resumen 495
Ejercicios 497



Capítulo 18



Relaciones entre clases: delegaciones, asociaciones,
agregaciones, herencia 499
Introducción 499
Relaciones entre clases 500
Dependencia 500
Asociación 501
Multiplicidad 503
Restricciones en asociaciones 504
Asociación cualificada 505
Asociaciones reflexivas 505
Diagrama de objetos 505
Enlaces 505
Clases de asociación 506
Criterios de diseño 507
Asociaciones ternarias 508
Asociaciones cualificadas 508
Asociaciones reflexivas 509
Restricciones en asociaciones 510
Enlaces 511
Agregación 511
Restricciones en las agregaciones 513
Composición 513
Jerarquía de clases: generalización y especialización 514
Jerarquías de generalización/especialización 516
Herencia: clases derivadas 519
Herencia simple 519
Herencia múltiple 520
Niveles de herencia 520
Declaración de una clase derivada 523
Consideraciones de diseño 524
Accesibilidad y visibilidad en la herencia 524
Herencia pública 525
Formato 525
Herencia privada 525
Herencia protegida 526
Un caso de estudio especial: herencia múltiple 527
Características de la herencia múltiple 529
Ambigüedades 529
Clases abstractas 530
Operaciones abstractas 531
Resumen 532
Ejercicios y problemas 533
Parte IV
Programar en C++ 535



Capítulo 19



De C a C++ 537
Introducción 537
El primer programa C++ 538
Comentarios en C++ 539
El preprocesador de C++ y el archivo iostream 539
Entrada y salida 540
Archivos de cabecera 541
Espacios de nombres 541
Entrada y salida: cin y cout 543
Manipuladores de final de línea 543
Sentencias C++ 543
Tipos de datos nativos 543
Tipos de datos básicos/primitivos 544
Tipos integrales 544
Tipos con signo 544
Tipos de coma flotantes (reales) 545
Constantes literales 545
Variables simbólicas 546
Tipos punteros 546
Declaración de punteros 547
Tipos constantes 548
Referencias 548
Nombres de tipos definidos: typedef 548
Tipos enumeración 548
Arreglo (array) 549
Tipos carácter 549
Cadenas 550
Operadores 550
Operadores aritméticos 551
Operadores relacionales y lógicos 551
Operadores relacionales (<, <=, ==, >, >=, !=) 552
Operadores lógicos 552
Operadores de asignación 553
Operadores incremento y decremento 553
Operadores de manipulación de bits 554
Operador condicional 554
Operador sizeof 555
Operador coma 555
Evaluación de expresiones compuestas 556
Conversiones de tipos 557
Conversión en asignaciones 557
Conversión en expresiones 558
Conversiones en pasos de argumentos 558
Conversiones explícitas 558
STATIC_CAST 559
CONST_CAST 559
DYNAMIC_CAST 559
REINTERPRET_CAST 559
Operador new 560
Sintaxis completa del operador new 560
Operador delete 561
Estructuras de control 562
Secuencia y sentencias compuestas 562
Selección y repetición 562
Sentencia if 562
Estilo de escritura 563
Sentencias if anidadas 563
Sentencia switch 564
Sentencia while 565
Sentencia do-while 566
Sentencia for 566
For versus while 567
Sentencias break y continue 568
Estructura de break y continue 568
Funciones 568
Funciones de biblioteca 569
Definición de una función (función definida por el usuario) 570
Argumentos de la función: paso por valor y por referencia 571
Paso por valor 571
Paso por referencia 572
La sentencia return 572
El entorno de desarrollo C++ 573
Convenio para dar nombre a los programas 573
Funciones, clases y objetos 573
La directiva #include 573
La sentencia using y el espacio de nombres std 576
Resumen 577
Ejercicios 577
Problemas 579



Capítulo 20



Clases y objetos 581
Introducción 581
Clases y objetos 582
¿Qué son objetos? 582
¿Qué son clases? 583
Definición de una clase 583
¿Control de acceso a los miembros: público o privado? 586
Las funciones son públicas y los datos privados 587
Objetos de clases 588
Acceso a miembros de la clase: encapsulamiento 589
Datos miembro (miembros dato) 591
Definición de una función miembro fuera de la clase 593
Funciones miembro 594
Llamadas a funciones miembro 596
Mensajes 596
Tipos de funciones miembro 597
Funciones en línea y fuera de línea 597
La palabra reservada inline 599
Nombres de parámetros de funciones miembro 599
Implementación de clases 600
Archivos de cabecera y de clases 600
Opciones de compilación 601
Constructores 601
Caso particular 602
Constructor por defecto 602
Constructores alternativos 603
Constructores sobrecargados 604
Constructor de copia 604
Inicialización de miembros en constructores 605
Destructores 606
Clases compuestas 607
Sobrecarga de funciones miembro 608
Errores de programación frecuentes 608
Resumen 612
Ejercicios 613
Problemas 617



Capítulo 21



Clases derivadas: herencia y polimorfismo 619
Introducción 619
Clases derivadas 620
Declaración de una clase derivada 622
Consideraciones de diseño 624
Tipos de herencia 624
Herencia pública 625
Herencia privada 627
Herencia protegida 628
Operador de resolución de ámbito 629
Constructores-inicializadores en herencia 629
Sintaxis del constructor 630
Sintaxis de la implementación de una función miembro 631
Destructores 632
Herencia múltiple 633
Características de la herencia múltiple 634
Ambigüedades 634
Dominación (prioridad) 636
Inicialización de la clase base 637
Ligadura 638
Funciones virtuales 639
Ligadura dinámica mediante funciones virtuales 640
Polimorfismo 641
El polimorfismo sin ligadura dinámica 642
El polimorfismo con ligadura dinámica 642
Uso del polimorfismo 643
Ligadura dinámica frente a ligadura estática 644
Ventajas del polimorfismo 644
Resumen 645
Ejercicios 645



Capítulo 22



Genericidad: plantillas (templates) 648
Introducción 648
Genericidad 649
Conceptos fundamentales de plantillas en C++ 650
Terminología 651
Plantillas de funciones 651
Fundamentos teóricos 652
Definición de plantilla de funciones 653
Plantilla de función class 656
Un ejemplo de plantilla de funciones 656
Un ejemplo de función plantilla 659
Plantillas de función ordenar y buscar 659
Una aplicación práctica 660
Problemas en las funciones plantilla 661
Plantillas de clase 661
Definición de una plantilla de clase 662
Instanciación de una plantilla de clases 664
Utilización de una plantilla de clase 664
Declaración de la plantilla Pila 665
Implementación de la pila 665
Instanciación de la plantilla de clases 665
Argumentos de plantilla 666
Aplicación de plantillas de clase 666
Una plantilla para manejo de pilas de datos 667
Definición de las funciones miembro 668
Utilización de una clase plantilla 668
Instanciación de una clase plantilla con clases 671
Uso de las plantillas de funciones con clases 671
Modelos de compilación de plantillas 672
Modelo de compilación de inclusión 673
Modelo de compilación separada 673
Plantillas frente a polimorfismo 674
Resumen 675
Ejercicios 676
Capítulo 23
Sobrecarga de operadores 677
Introducción 677
Sobrecarga 678
Operadores unitarios 679
Sobrecarga de operadores unitarios 681
Otro ejemplo de un operador unitario sobrecargado 682
Versiones prefija y postfija de los operadores ++ y − − 683
Sobrecargar un operador unitario como función miembro 684
Sobrecarga de un operador binario como una función amiga 684
Operadores de incremento y decremento 686
Operadores binarios 688
Sobrecarga de operadores binarios 688
Sobrecarga de un operador binario como función miembro 688
Ejemplo de sobrecarga de un operador binario 689
Otro ejemplo de sobrecarga de un operador binario 690
Sobrecarga de un operador binario como una función amiga 691
Operadores + y – 692
Sintaxis 694
Sobrecarga de operadores de asignación 694
Sobrecargando el operador de asignación 696
Operadores como funciones miembro 697
Operador [ ] 698
Sobrecargando el operador de llamada a funciones ( ) 699
Sobrecarga de operadores de inserción y extracción 699
Sobrecarga de flujo de salida 699
Sobrecarga de flujo de entrada 700
Clase cadena 702
Clase cadena (string) 702
Funciones amigas 703
Aplicación 705
Sobrecarga de new y delete: asignación dinámica 706
Sobrecarga de new 706
Sobrecarga del operador delete 707
Conversión de datos y operadores de conversión forzada de tipos 707
Conversión entre tipos básicos 708
Conversión entre objetos y tipos básicos 708
Funciones de conversión 708
Constructores de conversión 710
Manipulación de sobrecarga de operadores 711
Una aplicación de sobrecarga de operadores 712
Resumen 714
Ejercicios 715



Capítulo 24



Excepciones 717
Introducción 717
Condiciones de error en programas 718
¿Por qué considerar las condiciones de error? 718
El tratamiento de los códigos de error 719
Manejo de excepciones en C++ 720
Inconvenientes 720
El mecanismo de manejo de excepciones 720
Clases de excepciones 721
Partes de la manipulación de excepciones 721
El modelo de manejo de excepciones 722
El modelo de manejo de excepciones 722
Diseño de excepciones 724
Bloques try 724
Normas 725
Lanzamiento de excepciones 726
Captura de una excepción: catch 727
Formatos 727
Funcionamiento 728
Especificación de excepciones 730
Especificación de excepciones vacía 731
Excepciones imprevistas 732
Aplicaciones prácticas de manejo de excepciones 733
Calcular las raíces de una ecuación de segundo grado 733
Control de excepciones en una estructura tipo pila 734
Resumen 735
Ejercicios 736



Parte V
Programar en Java 739


Capítulo 25



De C/C++ a Java 5/6 741
Introducción 741
Historia del lenguaje Java: de Java 1.0 a Java 6 742
El lenguaje de programación Java 743
Tipos de programas Java 744
Un programa sencillo en Java 745
Tipos de datos 746
Variables, constantes y asignaciones 747
Inicialización de variables 747
Inicialización de una variable en una declaración 748
Sentencias de asignación múltiples 748
Constantes 748
Definición de constantes en un método o en una clase 749
Operadores y expresiones 749
Operadores aritméticos 750
Operadores relacionales y lógicos 750
Operadores de manipulación de bits 750
Precedencia de operadores 751
Funciones matemáticas 751
Cadenas 751
Concatenación de cadenas 752
Las cadenas son inmutables 753
Subcadenas de la clase String 753
Longitud y comparación de cadenas 753
Métodos de la clase String 754
Códigos de caracteres Asci y Unicode 757
Entrada y salida 757
Salida a la consola 757
Salida formateada con printf 758
Entrada 758
Sintaxis de entrada de teclado utilizando Scanner 759
Flujo de control 760
Bloques de sentencias 760
Sintaxis de bloque de sentencias 760
Sentencias condicionales 761
Sentencias if-else multicamino 761
Bucles (lazos) 762
Sentencia while 762
Sentencia do-while 763
Sentencia for 763
Sentencias break y continue 764
Método exit( ) 765
El bucle for each 765
Arreglos (arrays) 766
Acceso a los elementos de un arreglo 767
Arreglos y objetos 767
Inicialización de arreglos y arreglos anónimos 767
Arreglos multidimensionales 768
Arreglos irregulares o triangulares 768
Listas de arreglos (ArrayList) 769
Bucle for each 769
Resumen 771
Ejercicios 771
Problemas 772



Capítulo 26



Programación orientada a objetos en Java.
Clases y objetos 774
Introducción 774
Clases y objetos 775
¿Qué son objetos? 775
¿Qué son clases? 776
Declaración de una clase 776
Objetos 777
Visibilidad de los miembros de la clase 778
Métodos de una clase 780
Implementación de las clases 782
Clases públicas 782
Paquetes 783
Sentencia package 783
import 783
Constructores 784
Constructor por defecto 785
Constructores sobrecargados 786
Recolección de objetos 787
Método finalize ( ) 787
Objeto que envía el mensaje: this 788
Miembros static de una clase 790
Variables static 790
Métodos static 791
Clase Object 792
equals ( ) 792
toString ( ) 792
Operador instanceof 793
Tipos abstractos de datos en Java 793
Implementación del TAD Conjunto 793
Aplicación del tipo abstracto de dato Conjunto 795
Resumen 796
Ejercicios 797
Problemas 799




Capítulo 27



Programación orientada a objetos en Java.
Herencia y polimorfismo 800
Introducción 800
Clases derivadas 801
Declaración de una clase derivada 803
Diseño de clases derivadas 804
Sobrecarga de métodos en la clase derivada 805
Herencia pública 806
Constructores en herencia 809
Sintaxis 810
Referencia a la clase base: super 811
Métodos y clases no derivables: atributo final 812
Conversiones entre objetos de clase base y clase derivada 812
Métodos abstractos 814
Clases abstractas 815
Ligadura dinámica mediante métodos abstractos 816
Polimorfismo 818
Uso del polimorfismo 818
Ventajas del polimorfismo 818
Interfaces 819
Implementación de una interface (interfaz) 819
Múltiples interfaces 821
Jerarquía de interface (interfaz) 821
Herencia de clases e implementación de interface 822
Variables interface 822
Resumen 823
Ejercicios 823
Problemas 824



Capítulo 28



Colecciones 826
Introducción 826
Colecciones en Java 827
Tipos de colecciones 828
Clases de utilidades: arrays y collections 829
Clase Arrays 829
Ordenación de arrays 829
Búsqueda de una clave 831
Asignación de un elemento 832
Clase Collections 832
Ordenación y búsqueda 832
Máximo y mínimo 832
Sincronización 833
Conversión a sólo lectura 833
Utilidades 833
Comparación de objetos: Comparable y Comparator 834
Comparable 834
Comparator 835
Vector y Stack 835
Vector 835
Stack 836
Iteradores de una colección 837
Enumeration 837
Iterator 839
ListIterator 840
Interfaz Collection 841
Métodos para añadir 841
Métodos para eliminar 841
Métodos de búsqueda 841
Métodos de colección 842
Listas 842
arrayList 843
linkedList 844
Conjuntos 846
AbstractSet 847
HashSet 847
Unión de conjuntos 848
Intersección de conjuntos 848
Diferencia de conjuntos 848
TreeSet 850
Constructores 850
Métodos implementados 850
Mapas y diccionarios 852
Dictionary 853
HashTable 853
Constructores 854
Métodos 854
Map 855
AbstractMap 856
HashMap 856
Constructores 857
Métodos 857
TreeMap 858
Constructores 859
Métodos 859
Colecciones parametrizadas 860
Declaración de un tipo parametrizado 861
Resumen 862
Ejercicios 863
Problemas 863



Capítulo 29



Applets y Swing: diseño de componentes gráficos 865
Introducción 865
Applets 866
Creación de un applet 867
Documento HTML para applet 869
Ciclo de vida de un applet 869
void init ( ) 869
void start ( ) 870
void stop ( ) 870
void destroy ( ) 870
Dibujar imágenes en un applet 871
void paint (Graphics g) 872
void resize (int ancho, int alto) 872
void repaint ( ) 872
Parámetros en un applet 873
Seguridad 874
Swing 874
Paquetes de las API de Java 875
Swing versus AWT 876
Crear un marco, clase JFrame 877
Métodos propios de JFrame 878
Ventanas de diálogo 880
Diálogo de selección de archivos: JFileChooser 882
Constructores de JFileChooser 883
Métodos de interés 884
Filtros de selección de archivos 884
Administrador de diseño 887
BorderLayout 887
FlowLayout 888
GridLayout 889
BoxLayout 890
BoxLayout-Box 891
Combinar gestores de posicionamiento 893
Desactivar el gestor de posicionamiento 894
Resumen 895
Ejercicios 896
Problemas 897



Capítulo 30



Multitarea y excepciones 898
Introducción 898
Manejo de excepciones en Java 899
Mecanismo del manejo de excepciones 900
El modelo de manejo de excepciones 900
Diseño de excepciones 902
Bloques try 902
Normas 903
Lanzamiento de excepciones 904
Captura de una excepción: catch 905
Funcionamiento 906
Cláusula finally 907
Clases de excepciones definidas en Java 909
RuntimeException 909
Excepciones comprobadas 910
Métodos que informan de la excepción 911
Nuevas clases de excepciones 913
Especificación de excepciones 913
Multitarea 917
Utilización de la multitarea 917
Creación de hilos 918
Criterios a seguir para elegir cómo crear un hilo 920
Estados de un hilo, ciclo de vida de un hilo 920
Prioridad entre hilos 924
Hilos daemon 926
Sincronización 926
Resumen 928
Ejercicios 929




Parte VI
Estructura de datos en C, C++ y Java 931


Capítulo 31



Organización de datos en un archivo 933
Introducción 933
Registros 934
Clave 934
Registro físico (bloque) 934
Organización de archivos 934
Organización secuencial 935
Organización directa 937
Archivos con función de direccionamiento hash 940
Funciones hash 941
Características de un archivo con direccionamiento hash 941
Archivos secuenciales indexados 947
Partes de un archivo secuencial indexado 948
Proceso de un archivo secuencial indexado 948
Tipos de datos 948
Creación 949
Altas 949
Bajas 951
Consultas 952
Salida del proceso 952
Inicio del proceso 953
Ordenación de archivos: ordenación externa 954
Fusión de archivos 955
Clasificación por mezcla directa 956
Codificación del algoritmo mezcla directa 957
Resumen 960
Ejercicios 960
Problemas 961



Capítulo 32



Listas, pilas y colas en C 963
Introducción 963
Listas enlazadas 964
Clasificación de las listas enlazadas 965
Operaciones en listas enlazadas 966
Declaración de un nodo 966
Puntero de cabecera y cola 967
El puntero nulo 968
Construcción de una lista 968
Inserción de un elemento en una lista 970
Insertar un nuevo elemento en la cabeza de una lista 970
Inserción de un nodo al final de la lista 973
Inserción de un nodo entre dos nodos de la lista 973
Búsqueda de un elemento de una lista 975
Borrado de un nodo en una lista 977
Concepto de pila 980
Operaciones en una pila 981
El tipo Pila implementado con arrays 981
Declaración del tipo Pila 982
Implementación de las operaciones sobre pilas 983
El tipo Pila implementado como una lista enlazada 984
Tipos de datos para una pila con listas enlazadas 985
Implementación de las operaciones de pilas con listas enlazadas 986
Concepto de cola 988
Tipo Cola implementado con arrays 988
El tipo Cola implementado con arreglos (arrays) circulares 989
Codificación del tipo Cola con un array (arreglo) circular 991
El tipo Cola implementado con una lista enlazada 993
Declaración de tipos de datos y operaciones 993
Codificación de las funciones de una Cola con listas 994
Resumen 995
Ejercicios 996
Problemas 997



Capítulo 33



Flujos y archivos en C++ 1000
Introducción 1000
Flujos (streams) 1001
Flujos de texto 1002
Flujos binarios 1002
Las clases de flujo de E/S 1002
Archivos de cabecera 1004
La biblioteca de clases iostream 1004
La clase streambuf 1004
Jerarquía de clases ios 1004
Flujos estándar 1005
Entradas/salidas en archivos 1005
Entradas/salidas en un buffer de memoria 1005
Archivos de cabecera 1006
Entrada/salida de caracteres y flujos 1006
Clases istream y ostream 1006
Clase istream 1006
Declaración 1006
Indicadores de estado 1007
Variables de estado de ios 1007
Clase ostream 1009
El operador << 1009
Manipulador de salida 1010
Salida a la pantalla y a la impresora 1010
Operadores de inserción en cascada 1011
Las funciones miembro put ( ) y write ( ) 1012
Impresión de la salida en una impresora 1012
Lectura del teclado 1013
Lectura de datos carácter 1014
Lectura de datos cadena 1015
Funciones miembro get ( ) y getline ( ) 1015
La función getline 1018
Problemas en la utilización de getline( ) 1020
Formateado de salida 1021
Manipuladores 1021
Bases de numeración 1023
Rellenado de caracteres 1025
Precisión de números reales 1025
Indicadores de formato 1026
Uso de setiosflags( ) y resetiosflags( ) 1026
Las funciones miembro setf ( ) y unsetf ( ) 1029
Archivos C++ 1029
Apertura de archivos 1029
Apertura de un archivo sólo para entrada 1031
E/S en archivos 1031
La función open 1032
Consejo 1033
La función close 1033
Otras funciones miembro 1034
Lectura y escritura de archivos de texto 1034
E/S binaria 1037
Funciones miembro get y put 1037
Función put ( ) 1038
Formato 2 de get ( ) 1038
Funciones read y write 1039
Caracteres leídos 1040
Detección de EOF 1040
Acceso aleatorio 1040
Resumen 1043
Ejercicios 1044
Problemas 1045


Capítulo 34


Listas, Pilas y Colas en C++ 1047
Introducción 1047
Tipo abstracto de datos Lista 1048
Especificación formal del TAD Lista 1048
Operaciones de listas enlazadas, clase Lista 1049
Clase Nodo 1049
Clase Lista, construcción de una lista 1050
Inserción en una lista 1052
Insertar en la cabeza de la lista 1052
Inserción al final de la lista 1052
Insertar entre dos nodos de la lista 1053
Buscar un elemento y recorrer una lista enlazada 1053
Borrado de un nodo 1054
Lista doblemente enlazada 1055
Nodo de una lista doblemente enlazada 1056
Clase ListaDoble 1056
Insertar un nodo en una lista doblemente enlazada 1057
Insertar después de un nodo 1057
Eliminar un nodo de una lista doblemente enlazada 1057
Listas enlazadas genéricas 1058
Declaración de la clase ListaGenérica 1058
Iterador de ListaGenerica 1060
Tipo abstracto de datos Pila 1061
Especificaciones del tipo Pila 1061
Clase Pila con arreglo (array) 1061
Pila genérica con listas enlazadas 1063
Clase PilaGenerica y NodoPila 1063
Implementación de las operaciones 1065
Poner un elemento en la pila 1065
Eliminación del elemento cima 1065
Vaciado de la pila 1066
Tipo abstracto de datos Cola 1066
Especificaciones del tipo abstracto de datos Cola 1066
Colas implementadas con arrays 1067
Cola con un arreglo (array) circular 1068
Clase Cola con array circular 1069
Cola genérica con una lista enlazada 1072
Clase ColaGenerica 1072
Añadir un elemento a la cola 1072
Sacar elemento frente de la cola 1073
Vaciado de la cola 1073
Bicolas: colas de doble entrada 1073
BicolaGenerica con listas enlazadas 1074
Implementación de las operaciones de BicolaGenerica 1074
Añadir un elemento a la bicola 1074
Sacar un elemento de la bicola 1075
Número de elementos de la bicola 1075
Resumen 1076
Ejercicios 1076
Problemas 1077



Capítulo 35



Archivos y flujos en Java 1079
Introducción 1079
Flujos y archivos 1080
Clase File 1080
Información de un archivo 1081
Flujos y jerarquía de clases 1083
Archivos de bajo nivel: FileInputStream y FileOutputStream 1083
Archivos de datos: DataInputStream y DataOutputStream 1085
Flujos PrintStream 1090
Archivos de caracteres: flujos de tipo Reader y Writer 1091
Leer archivos de caracteres: InputStreamReader, FileReader
y BufferedReader 1091
InputStreamReader 1091
FileReader 1091
BufferedReader 1092
Flujos que escriben caracteres: Writer, PrintWriter 1093
PrintWriter 1093
Archivos de objetos 1095
Clase de objeto persistente 1095
Flujos ObjectOutputStream 1096
Flujos ObjectInputStream 1096
Archivos de acceso directo 1098
RandomAccessFile 1099
Constructor 1099
Métodos de posicionamiento 1100
getFilePointer( ) 1100
seek ( ) 1100
length( ) 1100
Proceso que crea y añade registros en un archivo directo 1100
Consultas de registros en un archivo directo 1103
Codificación 1103
Resumen 1106
Ejercicios 1106
Problemas 1107



Capítulo 36



Listas, Pilas y Colas en Java 1108
Introducción 1108
Tipo abstracto de datos (TAD) Lista 1109
Clasificación de las listas enlazadas 1109
TAD Lista 1110
Clase Lista 1110
Definición de la clase Lista 1112
Inserción de un elemento en una lista 1114
Insertar un nuevo elemento en la cabeza de la lista 1114
Insertar entre dos nodos de la lista 1114
Búsqueda en listas enlazadas 1116
Borrado de un nodo de una lista 1116
Lista ordenada 1117
Clase ListaOrdenada 1118
Lista doblemente enlazada 1119
Clase Lista Doble 1120
Insertar un elemento en una lista doblemente enlazada 1120
Eliminar un elemento de una lista doblemente enlazada 1121
Lista circular 1122
Clase Lista Circular 1123
Eliminar un elemento en una lista circular 1123
Recorrer una lista circular 1124
Tipo abstracto de datos Pila 1124
Especificaciones de una pila 1125
Pila dinámica implementada con Vector 1126
Pila implementada con una lista enlazada 1127
Clase Pila y NodoPila 1128
Implementación de las operaciones 1128
Tipo abstracto de datos Cola 1130
Especificaciones del tipo abstracto de datos Cola 1130
Cola con un array circular 1131
Clase Cola con array circular 1132
Cola implementada con una lista enlazada 1133
Declaración de Nodo y Cola 1133
Resumen 1135
Ejercicios 1136
Problemas 1137



Apéndice A
Códigos de numeración 1139
Representación de la información en las computadoras 1139
Representación de textos 1139
Representación de valores numéricos 1140
Representación de enteros 1141
Representación de caracteres 1142
Representación de imágenes 1142
Representación de sonidos 1142


Apéndice B
Códigos ASCII y UNICODE 1144
Código ASCII 1144
Código Unicode 1147
Referencias Web 1147
Bibliografía 1147


Apéndice C
Prioridad de operadores JAVA 1148
Apéndice D
Bibliografía 1150
D.1 Fundamentos y metodología de la programación 1150
D.2 Algoritmos y estructuras de datos 1151
D.3 Programación orientada a objetos 1152
D.4 Ingeniería de software 1152
D.5 UML 1152
D.6 C 1153
D.7 C++ 1154
D.8 Java 1155
Apéndice E
Recursos de programación en la Web 1156
E1 Recursos Web de C/C++ 1156
Instalación del compilador Microsoft Visual C++ 2005 Express Edition 1156
Instalación de Dev-C++ de Bloodshed Software (Compilador y Entorno
Integrado de Desarrollo) 1156
E.1.1 Estándares de C 1156
E.1.2 Compiladores y herramientas de desarrollo 1157
E.1.3 C y C++ 1157
E.1.4 Sitios Web de C++ 1158
E.1.5 Recursos importantes de C/C++ 1159
E.2 Sitios de Java de “excelencia” 1160
E.2.1 Instalación del JDK (Java Development Kit) 1160
E.2.2 Compiladores y Herramientas de desarrollo de Sun Microsystems 1161
E.2.3 Compiladores 1162
E.2.4 Editores y Entornos Integrados de Desarrollo (IDE) 1163
E.2.5 Recursos y productos software 1163
E.2.6 Productos, tutoriales y FAQ 1164
E.2.7 Applets Java 1164
E.2.8 Sitios de interés Web y libros sobre Java 1164
E.3 Revistas de informática/computación de propósito general
y/o con secciones especializadas de programación y en lenguajes
de programación C/C++/Java 1164
E.4 Editoriales especializadas en programación (técnicas y lenguajes) 1165
E.5 Organizaciones internacionales de computación 1166
E.6 Compiladores 1166
E.6.1 Compiladores y lenguajes de programación gratuitos de diferentes lenguajes 1166
Índice analítico 1167


To obtain an instructor login for this Online Learning Center, ask your local sales representative.. If you're an instructor thinking about adopting this textbook, request a free copy for review.