Como programar c c++ y java 4ta edición deitel deitel

1154

Transcript of Como programar c c++ y java 4ta edición deitel deitel

  • CUARTA EDICIN

    CMO PROGRAMAR EN

    C/C++y Java

  • CUARTA EDICIN

    CMO PROGRAMAR EN

    C/C++y Java

    Harvey M. DeitelDeitel & Associates, Inc.

    Paul J. DeitelDeitel & Associates, Inc.

    TRADUCCIN

    Jorge Octavio Garca PrezIngeniero en Computacin

    Universidad Nacional Autnoma de Mxico

    REVISIN TCNICA

    Arturo del ngel RamrezJefe de Departamento de la Divisin de Sistemas

    Facultad de Ingeniera Mecnica y ElctricaUniversidad Autnoma de Nuevo Len

    M. en C. Gabriela Azucena Campos GarcaProfesora de tiempo completo

    Departamento de Sistemas de Informacin, Divisin de Profesional y GraduadosInstituto Tecnolgico y de Estudios Superiores de Monterrey

    Campus Estado de Mxico

    M. en C. Sergio Fuenlabrada VelzquezIng. Mario Alberto Sesma Martnez

    Ing. Mario Oviedo GaldeanoIng. Juan Alberto Segundo Miranda

    Profesores InvestigadoresAcademia de Computacin

    Unidad Profesional Interdisciplinaria de Ingeniera, Ciencias Sociales y AdministrativasInstituto Politcnico Nacional

  • Authorized translation from the English language edition, entitled C How to Program, Fourth Edition, by Harvey M. Deitel and Paul J.Deitel, published by Pearson Education, Inc., publishing as PRENTICE-HALL, INC., Copyright 2004. All rights reserved.

    ISBN 0-13-142644-3

    Traduccin autorizada de la edicin en idioma ingls, titulada C How to Program, Fourth Edition, por Harvey M. Deitel y Paul J. Deitel,publicada por Pearson Education, Inc., publicada como PRENTICE-HALL INC., Copyright 2004. Todos los derechos reservados.

    Esta edicin en espaol es la nica autorizada.

    Edicin en espaol:Editor: Guillermo Trujano Mendoza

    e-mail: [email protected] de desarrollo: Miguel B. Gutirrez HernndezSupervisor de produccin: Enrique Trejo Hernndez

    Edicin en ingls:Vice President and Editorial Director: Marcia J. HortonSenior Acquisitions Editor: Kate HargettAssistant Editor: Sarah ParkerEditorial Assistant: Michael GiacobbeVice President and Director of Production and Manufacturing, ESM: David W. RiccardiExecutive Managing Editor: Vince OBrienManaging Editor: Tom ManshreckProduction Editor: Chirag ThakkarProduction Editor, Media: Bob EngelhardtDirector of Creative Services: Paul BelfantiCreative Director: Carole AnsonArt Director: Geoff CassarChapter Opener and Cover Designer: Dr. Harvey Deitel and David MerrellManufacturing Manager: Trudy PisciottiManufacturing Buyer: Lisa McDowellMarketing Manager: Pamela Shaffer

    CUARTA EDICIN, 2004

    D.R. 2004 por Pearson Educacin de Mxico, S.A. de C.V. Atlacomulco 500-5o. pisoCol. Industrial Atoto53519, Naucalpan de Jurez, Edo. de Mxicoe-mail: [email protected]

    Cmara Nacional de la Industria Editorial Mexicana.Reg. Nm. 1031.

    Prentice Hall es una marca registrada de Pearson Educacin de Mxico, S.A. de C.V.

    Reservados todos los derechos. Ni la totalidad ni parte de esta publicacin pueden reproducirse, registrarse o transmitirse, por un sistemade recuperacin de informacin, en ninguna forma ni por ningn medio, sea electrnico, mecnico, fotoqumico, magntico o electropti-co, por fotocopia, grabacin o cualquier otro, sin permiso previo por escrito del editor.

    El prstamo, alquiler o cualquier otra forma de cesin de uso de este ejemplar requerir tambin la auto-rizacin del editor o de sus representantes.

    ISBN 970-26-0531-8

    Impreso en Mxico. Printed in Mexico.1 2 3 4 5 6 7 8 9 0 - 07 06 05 04

    2004

  • A Marcia Horton,

    Directora Editorial de Ingeniera y Ciencias de la Computacin en Prentice Hall:

    Ha sido un privilegio y un placer elaborar el programa depublicaciones de Deitel contigo a lo largo de los ltimos 18 aos.Gracias por ser nuestra mentora y nuestra amiga.

    Harvey y Paul Deitel

  • Contenido

    Prefacio xvii

    1 Introduccin a las computadoras, a Internet y a la World Wide Web 1

    1.1 Introduccin 21.2 Qu es una computadora? 31.3 Organizacin de computadoras 41.4 Evolucin de los sistemas operativos 51.5 Computacin personal, distribuida y cliente-servidor 51.6 Lenguajes mquina, lenguajes ensambladores y lenguajes de alto nivel 61.7 FORTRAN, COBOL, Pascal y Ada 71.8 Historia de C 71.9 La biblioteca estndar de C 81.10 C++ 91.11 Java 91.12 BASIC, Visual Basic, Visual C++, C# y .NET 101.13 La tendencia clave del software: Tecnologa de objetos 101.14 Conceptos bsicos de un ambiente tpico de programacin en C 111.15 Tendencias de hardware 131.16 Historia de Internet 141.17 Historia de la World Wide Web 151.18 Notas generales acerca de C y de este libro 15

    2 Introduccin a la programacin en C 232.1 Introduccin 242.2 Un programa sencillo en C: Impresin de una lnea de texto 242.3 Otro programa sencillo en C: Suma de dos enteros 272.4 Conceptos de memoria 312.5 Aritmtica en C 322.6 Toma de decisiones: Operadores de igualdad y de relacin 35

    3 Desarrollo de programas estructurados en C 493.1 Introduccin 503.2 Algoritmos 50

  • 3.3 Pseudocdigo 513.4 Estructuras de control 513.5 La instruccin de seleccin if 533.6 La instruccin de seleccin if...else 543.7 La instruccin de repeticin while 573.8 Formulacin de algoritmos: Ejemplo prctico 1 (repeticin controlada por contador) 583.9 Formulacin de algoritmos mediante mejoramiento arriba-abajo, paso a paso: 60

    Ejemplo prctico 2 (repeticin controlada por centinela)3.10 Formulacin de algoritmos mediante mejoramiento arriba-abajo, paso a paso: 66

    Ejemplo prctico 3 (estructuras de control anidadas)3.11 Operadores de asignacin 703.12 Operadores de incremento y decremento 70

    4 Control de programas en C 894.1 Introduccin 904.2 Fundamentos de la repeticin 904.3 Repeticin controlada por contador 914.4 Instruccin de repeticin for 924.5 Instruccin for: Notas y observaciones 944.6 Ejemplos de la utilizacin de la instruccin for 954.7 Instruccin de seleccin mltiple, switch 984.8 Instruccin de repeticin dowhile 1044.9 Instrucciones break y continue 1054.10 Operadores lgicos 1074.11 La confusin entre los operadores de igualdad (==) y los de asignacin (=) 1094.12 Resumen sobre programacin estructurada 111

    5 Funciones en C 1275.1 Introduccin 1285.2 Mdulos de programa en C 1285.3 Funciones matemticas de la biblioteca 1295.4 Funciones 1305.5 Definicin de funciones 1315.6 Prototipos de funciones 1355.7 Encabezados 1375.8 Llamada a funciones: Llamada por valor y llamada por referencia 1385.9 Generacin de nmeros aleatorios 1385.10 Ejemplo: Un juego de azar 1435.11 Clases de almacenamiento 1465.12 Reglas de alcance 1485.13 Recursividad 1515.14 Ejemplo sobre cmo utilizar la recursividad: Serie de Fibonacci 1545.15 Recursividad versus iteracin 157

    6 Arreglos en C 1776.1 Introduccin 1786.2 Arreglos 1786.3 Declaracin de arreglos 1796.4 Ejemplos de arreglos 1806.5 Cmo pasar arreglos a funciones 1936.6 Ordenamiento de arreglos 1976.7 Ejemplo prctico: Clculo de la media, la mediana y la moda a travs de arreglos 199

    viii Contenido

  • 6.8 Bsqueda en arreglos 2036.9 Arreglos con mltiples subndices 209

    7 Apuntadores en C 2337.1 Introduccin 2347.2 Definicin e inicializacin de variables de apuntador 2347.3 Operadores para apuntadores 2357.4 Llamada a funciones por referencia 2377.5 Uso del calificador const con apuntadores 2417.6 Ordenamiento de burbuja mediante llamadas por referencia 2477.7 El operador sizeof 2507.8 Expresiones con apuntadores y aritmtica de apuntadores 2527.9 Relacin entre apuntadores y arreglos 2547.10 Arreglos de apuntadores 2587.11 Ejemplo prctico: Simulacin para barajar y repartir cartas 2597.12 Apuntadores a funciones 263

    8 Caracteres y cadenas en C 2878.1 Introduccin 2888.2 Fundamentos de cadenas y caracteres 2888.3 La biblioteca de manipulacin de caracteres 2908.4 Funciones de conversin de cadenas 2958.5 Funciones de entrada/salida de la biblioteca estndar 2998.6 Funciones de manipulacin de cadenas de la biblioteca de

    manipulacin de cadenas 3038.7 Funciones de comparacin de la biblioteca de manipulacin de cadenas 3058.8 Funciones de bsqueda de la biblioteca de manipulacin de cadenas 3078.9 Funciones de memoria de la biblioteca de manipulacin de cadenas 3138.10 Otras funciones de la biblioteca de manipulacin de cadenas 316

    9 Entrada/Salida con formato en C 3299.1 Introduccin 3309.2 Flujos 3309.3 Formato de salida con printf 3309.4 Impresin de enteros 3319.5 Impresin de nmeros de punto flotante 3329.6 Impresin de cadenas y caracteres 3349.7 Otros especificadores de conversin 3359.8 Impresin con ancho de campos y precisiones 3369.9 Uso de banderas en la cadena de control de formato de printf 3389.10 Impresin de literales y secuencias de escape 3419.11 Formato de entrada con scanf 342

    10 Estructuras, uniones, manipulaciones de bitsy enumeraciones en C 355

    10.1 Introduccin 35610.2 Definicin de estructuras 35610.3 Inicializacin de estructuras 35810.4 Acceso a miembros de estructuras 35910.5 Uso de estructuras con funciones 36010.6 typedef 361

    Contenido ix

  • 10.7 Ejemplo: Simulacin de alto rendimiento para barajar y repartir cartas 36110.8 Uniones 36410.9 Operadores a nivel de bits 36610.10 Campos de bits 37410.11 Constantes de enumeracin 377

    11 Procesamiento de archivos en C 38711.1 Introduccin 38811.2 Jerarqua de datos 38811.3 Archivos y flujos 39011.4 Creacin de un archivo de acceso secuencial 39011.5 Lectura de datos desde un archivo de acceso secuencial 39511.6 Archivos de acceso aleatorio 40011.7 Creacin de un archivo de acceso aleatorio 40011.8 Escritura aleatoria de datos en un archivo de acceso aleatorio 40211.9 Lectura de datos desde un archivo de acceso aleatorio 40511.10 Ejemplo prctico: Programa de procesamiento de transacciones 406

    12 Estructuras de datos en C 42112.1 Introduccin 42212.2 Estructuras autorreferenciadas 42312.3 Asignacin dinmica de memoria 42312.4 Listas ligadas 42412.5 Pilas 43212.6 Colas 43712.7 rboles 443

    13 El preprocesador de C 47113.1 Introduccin 47213.2 La directiva de preprocesador #include 47213.3 La directiva de preprocesador #define: Constantes simblicas 47213.4 La directiva de preprocesador #define: Macros 47313.5 Compilacin condicional 47413.6 Las directivas de preprocesador #error y #pragma 47513.7 Los operadores # y ## 47613.8 Nmeros de lnea 47613.9 Constantes simblicas predefinidas 47613.10 Afirmaciones 477

    14 Otros temas de C 48114.1 Introduccin 48214.2 Cmo redireccionar la entrada/salida en sistemas UNIX y Windows 48214.3 Listas de argumentos de longitud variable 48314.4 Uso de argumentos en la lnea de comandos 48514.5 Notas sobre la compilacin de programas con mltiples archivos fuente 48614.6 Terminacin de un programa mediante exit y atexit 48814.7 El calificador de tipo volatile 48914.8 Sufijos para las constantes enteras y de punto flotante 48914.9 Ms acerca de los archivos 49014.10 Manipulacin de seales 49214.11 Asignacin dinmica de memoria: Las funciones calloc y realloc 49414.12 Saltos incondicionales con goto 494

    x Contenido

  • 15 C++ como un Mejor C 50115.1 Introduccin 50215.2 C++ 50215.3 Un programa sencillo: Suma de dos enteros 50315.4 Biblioteca estndar de C++ 50515.5 Archivos de encabezados 50515.6 Funciones inline 50715.7 Referencias y parmetros de referencias 50915.8 Argumentos predeterminados y listas de parmetros vacas 51215.9 Operador unario de resolucin de alcance 51415.10 Sobrecarga de funciones 51615.11 Plantillas de funciones 517

    16 Clases y abstraccin de datos en C++ 52516.1 Introduccin 52616.2 Implementacin del tipo de dato abstracto Hora mediante una clase 52716.3 Alcance de una clase y acceso a los miembros de una clase 53216.4 Separacin de la interfaz y la implementacin 53416.5 Control de acceso a miembros 53716.6 Funciones de acceso y funciones de utilidad 54016.7 Inicializacin de los objetos de una clase: Constructores 54316.8 Uso de argumentos predeterminados con constructores 54316.9 Uso de destructores 54716.10 Invocacin de constructores y destructores 54716.11 Uso de datos miembro y funciones miembro 55016.12 Una trampa sutil: Retorno de una referencia a un dato miembro privado 55516.13 Asignacin mediante la copia predeterminada de miembros 55716.14 Reutilizacin de software 558

    17 Clases en C++: Parte II 56717.1 Introduccin 56817.2 Objetos y funciones miembro const (constantes) 56817.3 Composicin: Objetos como miembros de clases 57517.4 Funciones y clases friend (amigas) 58017.5 Uso del apuntador this 58317.6 Asignacin dinmica de memoria mediante los operadores new y delete 58817.7 Clases miembro static (estticas) 58917.8 Abstraccin de datos y ocultamiento de informacin 594

    17.8.1 Ejemplo: Un tipo de dato abstracto Arreglo 59517.8.2 Ejemplo: Un tipo de dato abstracto Cadena 59517.8.3 Ejemplo: Un tipo de dato abstracto Cola 596

    17.9 Clases contenedoras e iteradores 596

    18 Sobrecarga de operadores en C++ 60318.1 Introduccin 60418.2 Fundamentos de la sobrecarga de operadores 60418.3 Restricciones de la sobrecarga de los operadores 60618.4 Funciones de operadores como miembros de una clase miembro versus funciones 607

    de operadores como funciones amigas (friend)18.5 Sobrecarga de los operadores de insercin y de extraccin de flujo 60818.6 Sobrecarga de operadores unarios 61118.7 Sobrecarga de operadores binarios 611

    Contenido xi

  • 18.8 Ejemplo prctico: Una clase Arreglo 61218.9 Conversin entre tipos 62218.10 Sobrecarga de ++ y -- 623

    19 Herencia en C++ 63119.1 Introduccin 63219.2 Herencia: Clases base y clases derivadas 63319.3 Miembros protected 63519.4 Conversin de apuntadores de clases base en apuntadores de clases derivadas 63519.5 Uso de funciones miembro 64119.6 Cmo redefinir los miembros de una clase base en una clase derivada 64119.7 Herencia pblica, protegida y privada 64519.8 Clases base directas e indirectas 64619.9 Uso de constructores y destructores en clases derivadas 64619.10 Conversin de objetos de clases derivadas a objetos de clases base 65019.11 Ingeniera de software con herencia 65019.12 Composicin versus herencia 65219.13 Relaciones usa un y conoce un 65219.14 Ejemplo prctico: Punto, Circulo y Cilindro 652

    20 Funciones virtuales y polimorfismo en C++ 66520.1 Introduccin 66620.2 Tipos de campos e instrucciones switch 66620.3 Funciones virtuales 66620.4 Clases base abstractas y clases concretas 66720.5 Polimorfismo 66820.6 Nuevas clases y vinculacin dinmica 67020.7 Destructores virtuales 67020.8 Ejemplo prctico: Herencia de interfaz y de implementacin 67120.9 Polimorfismo, funciones virtuales y vinculacin dinmica tras bambalinas 678

    21 Entrada/salida de flujo en C++ 68521.1 Introduccin 68721.2 Flujos 687

    21.2.1 Archivos de encabezado de la biblioteca iostream 68821.2.2 Clases y objetos para la entrada/salida de flujo 688

    21.3 Salida de flujo 68921.3.1 Operador de insercin de flujo 68921.3.2 Operadores para la insercin/extraccin de flujo en cascada 69121.3.3 Salida de variables char * 69221.3.4 Salida de caracteres por medio de la funcin miembro put; 693

    funciones put en cascada21.4 Entrada de flujo 693

    21.4.1 Operador de extraccin de flujo 69321.4.2 Funciones miembro get y getline 69621.4.3 Funciones miembro de istream: peek, putback e ignore 69821.4.4 E/S con seguridad de tipos 698

    21.5 E/S sin formato por medio de read, gcount y write 69821.6 Manipuladores de flujo 699

    21.6.1 Base de un flujo de enteros: dec, oct, hex, y setbase 69921.6.2 Precisin de punto flotante (precision, setprecision) 70021.6.3 Ancho de campo (setw, width) 701

    xii Contenido

  • 21.6.4 Manipuladores definidos por el usuario 70321.7 Estados de formato de flujo 704

    21.7.1 Banderas de estado de formato 70421.7.2 Ceros a la derecha y puntos decimales (ios::showpoint) 70521.7.3 Justificacin (ios::left, ios::right, ios::internal) 70621.7.4 Relleno (fill, setfill) 70821.7.5 Base de un flujo de enteros (ios::dec, ios::oct, ios::hex,

    ios::showbase) 70921.7.6 Nmeros de punto flotante; notacin cientfica (ios::scientific,

    ios::fixed) 71021.7.7 Control de maysculas/minsculas (ios::uppercase) 71121.7.8 Cmo establecer y restablecer las banderas de formato (flags,

    setiosflags, resetiosflags) 71221.8 Estados de error de flujo 71321.9 Unin de un flujo de salida con un flujo de entrada 715

    22 Plantillas en C++ 72722.1 Introduccin 72822.2 Plantillas de clases 72822.3 Plantillas de clases y parmetros sin tipo 73222.4 Plantillas y herencia 73422.5 Plantillas y amigas 73422.6 Plantillas y miembros estticos 735

    23 Manejo de excepciones en C++ 73923.1 Introduccin 74023.2 Cundo debe utilizarse el manejo de excepciones 74223.3 Otras tcnicas de manejo de errores 74223.4 Fundamentos del manejo de excepciones en C++: try, throw y catch 74323.5 Un ejemplo sencillo de manejo de excepciones: La divisin entre cero 74423.6 Cmo arrojar una excepcin 74623.7 Cmo atrapar una excepcin 74723.8 Cmo relanzar una excepcin 75023.9 Especificaciones de las excepciones 75123.10 Cmo procesar excepciones inesperadas 75223.11 Cmo desenrollar una pila 75223.12 Constructores, destructores y manejo de excepciones 75323.13 Excepciones y herencia 75423.14 Cmo procesar fallas de new 75423.15 La clase auto_ptr y la asignacin dinmica de memoria 75823.16 Jerarqua de la biblioteca estndar de excepciones 760

    24 Introduccin a las aplicaciones y a los applets de Java 76924.1 Introduccin 77024.2 Fundamentos de un entorno tpico de Java 77124.3 Notas generales acerca de Java y de este libro 77324.4 Un programa sencillo: Impresin de una lnea de texto 77524.5 Otra aplicacin en Java: Suma de enteros 78124.6 Applets de ejemplo del Java 2 Software Development Kit 786

    24.6.1 El applet Tictactoe 78624.6.2 El applet Drawtest 78824.6.3 El applet Java2D 789

    Contenido xiii

  • 24.7 Un applet sencillo en Java: Cmo dibujar una cadena 79124.8 Dos ejemplos ms de applets: Cmo dibujar cadenas y lneas 79724.9 Otro applet de Java: Suma de enteros 798

    25 Ms all de C y C++: Operadores, mtodosy arreglos en Java 815

    25.1 Introduccin 81625.2 Tipos de datos primitivos y palabras reservadas 81625.3 Operadores lgicos 81725.4 Definiciones de mtodos 82225.5 Paquetes de la API de Java 82625.6 Generacin de nmeros aleatorios 83025.7 Ejemplo: Un juego de azar 83325.8 Mtodos de la clase JApplet 84025.9 Declaracin y asignacin de arreglos 84125.10 Ejemplos del uso de arreglos 84225.11 Referencias y parmetros de referencias 85125.12 Arreglos con mltiples subndices 852

    26 Programacin orientada a objetos con Java 86526.1 Introduccin 86626.2 Implementacin del tipo de dato abstracto Hora con una clase 86726.3 Alcance de una clase 87426.4 Creacin de paquetes 87426.5 Inicializacin de los objetos de una clase: Constructores 87726.6 Uso de los mtodos obtener y establecer 87826.7 Uso de la referencia this 88426.8 Finalizadores 88626.9 Miembros estticos de una clase 886

    27 Programacin orientada a objetos en Java 89927.1 Introduccin 90027.2 Superclases y subclases 90227.3 Miembros protected 90327.4 Relacin entre objetos de superclases y objetos de subclases 90427.5 Conversin implcita de un objeto de una subclase en un objeto de una superclase 91027.6 Ingeniera de software con herencia 91127.7 Composicin versus herencia 91127.8 Introduccin al polimorfismo 91227.9 Campos de tipo e instrucciones switch 91227.10 Mtodo de vinculacin dinmica 91227.11 Mtodos y clases final 91327.12 Superclases abstractas y clases concretas 91327.13 Ejemplo de polimorfismo 91427.14 Nuevas clases y vinculacin dinmica 91527.15 Ejemplo prctico: Herencia de interfaz y de implementacin 91627.16 Ejemplo prctico: Creacin y uso de interfaces 92127.17 Definiciones de clases internas 92627.18 Notas sobre las definiciones de clases internas 93627.19 Clases envolventes para tipos primitivos 936

    xiv Contenido

  • 28 Grficos en Java y Java2D 94528.1 Introduccin 94628.2 Contextos grficos y objetos grficos 94828.3 Control del color 94928.4 Control de fuentes 95528.5 Cmo dibujar lneas, rectngulos y elipses 95928.6 Cmo dibujar arcos 96328.7 Cmo dibujar polgonos y polilneas 96528.8 La API Java2D 96728.9 Figuras en Java2D 968

    29 Componentes de la interfaz grfica de usuario de Java 98129.1 Introduccin 98229.2 Generalidades de Swing 98329.3 JLabel 98529.4 Modelo de manejo de eventos 98829.5 JTextField y JPasswordField 990

    29.5.1 Cmo funciona el manejo de eventos 99429.6 JTextArea 99529.7 JButton 99829.8 JCheckBox 100129.9 JComboBox 100429.10 Manejo de eventos del ratn 100629.11 Administradores de diseo 1010

    29.11.1 FlowLayout 101129.11.2 BorderLayout 101329.11.3 GridLayout 1016

    29.12 Paneles 101829.13 Creacin de una subclase autocontenida de JPanel 102029.14 Ventanas 102529.15 Uso de mens con marcos 1026

    30 Multimedia en Java: Imgenes, animacin y audio 104530.1 Introduccin 104630.2 Cmo cargar, desplegar y escalar imgenes 104730.3 Cmo cargar y reproducir clips de audio 104930.4 Cmo animar una serie de imgenes 105230.5 Tpicos de animacin 105630.6 Cmo personalizar applets por medio de la etiqueta param de HTML 105730.7 Mapas de imgenes 106230.8 Recursos en Internet y en la World Wide Web 1064

    Apndices

    A Recursos en Internet y en Web 1069A.1 Recursos para C/C++ 1069A.2 Tutoriales de C++ 1070A.3 Preguntas frecuentes de C/C++ 1070A.4 comp.lang.c++ 1070A.5 Compiladores de C/C++ 1071A.6 Recursos para Java 1071A.7 Productos de Java 1072

    Contenido xv

  • A.8 FAQs de Java 1072A.9 Tutoriales de Java 107A.10 Revistas de Java 1073A.11 Applets de Java 1073A.12 Multimedia 1074A.13 Grupos de noticias de Java 1074

    B Recursos en Internet y en Web para C99 1075B.1 Recursos para C99 1075

    C Tablas de precedencia de operadores 1077

    D Conjunto de caracteres ASCII 1083

    E Sistemas de numeracin 1085E.1 Introduccin 1086E.2 Cmo expresar nmeros binarios en nmeros octales y nmeros hexadecimales 1089E.3 Conversin de nmeros octales y nmeros hexadecimales a nmeros binarios 1090E.4 Conversin de nmeros binarios, octales o hexadecimales a nmeros decimales 1090E.5 Conversin de nmeros decimales a nmeros binarios, octales o hexadecimales 1091E.6 Nmeros binarios negativos: Notacin de complemento a dos 1092

    F Recursos de la biblioteca estndar de C 1097F.1 Recursos para la biblioteca estndar de C 1097

    ndice 1099

    xvi Contenido

  • Prefacio

    Bienvenido a ANSI/ISO C, C++ y Java Estndar! En Deitel & Associates escribimos tanto libros de texto denivel universitario como libros profesionales sobre lenguajes de programacin, y trabajamos arduamente paramantenerlos actualizados mediante un flujo constante de nuevas ediciones. Escribir la cuarta edicin de este librofue un placer. Este libro, as como su material de apoyo, contiene todo lo que los maestros y estudiantes necesi-tan para lograr una experiencia informativa, interesante, educativa, desafiante y entretenida. Pusimos a tono laescritura, la pedagoga, el estilo para codificar y el paquete de accesorios del libro. Adems, en este prefacio in-cluimos un Recorrido a travs del libro, el cual ayudar a los profesores, estudiantes y profesionales a tener unaidea ms clara de la amplia cobertura que este libro proporciona sobre la programacin en C, C++ y Java.

    En este prefacio planteamos las convenciones que utilizamos en este libro, tales como la presentacin dela sintaxis de los cdigos de ejemplo, el lavado de cdigo y el resaltado de segmentos importantes de ste,para ayudar a que los estudiantes se enfoquen en los conceptos clave que se presentan en cada captulo. Tam-bin presentamos las nuevas caractersticas de la cuarta edicin de Cmo programar en C.

    El libro incluye el software de Microsoft, Visual C++ 6.0 Introductory Edition. Para brindar ms apoyoa los programadores principiantes, ofrecemos varias de nuestras nuevas publicaciones de Dive-Into Series,las cuales pueden descargar gratuitamente desde www.deitel.com. Dicho material, en ingls, explica cmocompilar, ejecutar y depurar programas en C, C++ y Java, utilizando diversos entornos de desarrollo.

    Aqu explicamos la suite completa de materiales educativos que apoyan a este libro, para ayudar a los pro-fesores que utilicen este libro como texto en un curso a maximizar la experiencia educativa de sus estudiantes.Dicha suite incluye un CD, en ingls, llamado Instructors Resource, el cual contiene las soluciones a los ejerci-cios de los captulos del libro y un archivo llamado Test-Item File con cientos de preguntas de opcin mltipley sus respuestas. En el sitio Web de este libro (www.peasoneducacion.net/deitel), estn disponiblesrecursos adicionales para el profesor, entre los cuales se incluyen el Syllabus Manager y Lecture Notes, diapo-sitivas de PowerPoint. De igual manera los estudiantes, encontrar diapositivas de PowerPoint y material deapoyo adicional.

    Este libro fue revisado por un equipo de acadmicos distinguidos y profesionales de la industria, que in-cluye a los principales miembros del comit de estndares de C; listamos sus nombres y sus lugares de traba-jo para que tenga una idea de cuan cuidadosamente se examin el libro. El prefacio concluye con informacinsobre los autores y sobre Deitel & Associates, Inc. Si al leer este libro le surge alguna duda, envenos un correoelectrnico a [email protected]; le responderemos de inmediato. Visite con regularidad nuestro sitioWeb, www.deitel.com, e inscrbase en el boletn de noticias Deitel Buzz Online, en www.deitel.com/newsletter/subscribe.html. Utilizamos el sitio Web y el boletn para mantener actualizados anuestros lectores, con respecto a todas las publicaciones y servicios Deitel.

  • Caractersticas de Cmo programar en C, cuarta edicinResaltado de cdigo y de entradas de usuarioHemos agregado bastante cdigo resaltado para facilitar a los lectores la identificacin de los segmentos repre-sentativos de cada programa. Esta caracterstica ayuda a los estudiantes a revisar rpidamente el material cuan-do se preparan para exmenes o para algn laboratorio. Tambin resaltamos en nuestra pantalla los dilogosque los usuarios introducen, para diferenciarlos de las salidas de programa.

    Lavado de cdigoLavado de cdigo es el trmino que utilizamos para aplicar comentarios, para utilizar identificadores im-portantes, para aplicar sangra y espaciado vertical que nos sirven para separar unidades importantes de un pro-grama. Este proceso da como resultado programas que son ms fciles de leer y de autodocumentar. Hemosagregado comentarios amplios y descriptivos a todo el cdigo, incluyendo un comentario antes y despus decada instruccin principal de control, para ayudar a que el estudiante comprenda claramente el flujo del progra-ma. Le hicimos un buen lavado a todo el cdigo fuente de los programas de este texto y de los accesorios.

    Para promover buenas prcticas de programacin, actualizamos todo el cdigo fuente de los programascorrespondientes a la parte de C de este libro con nuevos estndares de codificacin. Las definiciones de va-riables ahora se ubican en lneas separadas para facilitar su lectura, y cada instruccin de control tiene una lla-ve que abre y una que cierra, incluso si resulta redundante. Esto ayudar al lector cuando desarrolle programaslargos y complejos. Cada prototipo de funcin ahora coincide con la primera lnea de la definicin de funcin,incluyendo los nombres de los parmetros (lo cual ayuda a documentar el programa y a reducir errores, en es-pecial si se trata de programadores principiantes).

    Uso de terminologa/presentacinHemos actualizado el uso de la terminologa a lo largo del texto, para cumplir con los diversos estndares y es-pecificaciones del lenguaje.

    Mtodo de enseanzaMuchos maestros creen que la complejidad de C, y muchas otras dificultades, hacen que este tema no esconveniente para un primer curso de programacin; siendo que ese primer curso es precisamente el objetivo deeste libro. Si no, por qu habramos escrito este libro?

    Durante dos dcadas, el Dr. Harvey M. Deitel imparti cursos introductorios a la programacin a nivel uni-versitario, en los que enfatizaba el desarrollo de programas claramente escritos y bien estructurados. Mucho delo que se ensea en estos cursos son los principios bsicos de la programacin estructurada, con nfasis en eluso efectivo de instrucciones de control y en la funcionalidad. Nosotros presentamos este material exactamen-te en la misma forma en que Harvey Deitel lo hizo en sus cursos universitarios y los estudiantes se sienten mo-tivados por el hecho de que aprenden un lenguaje que les ser til en cuanto entren en la industria.

    Nuestro objetivo es claro: producir un libro de texto de programacin en C para cursos introductorios de pro-gramacin de nivel universitario, para estudiantes con poca o ninguna experiencia en el tema, pero que aun asofrezca un riguroso y profundo tratamiento de la teora y la prctica que exigen los cursos tradicionales de C. Paralograr estos objetivos hicimos un libro ms grande que otros textos de C; esto se debe a que nuestro textotambin ensea pacientemente los principios de la programacin estructurada. Cientos de miles de estudiantesalrededor del mundo han aprendido C con ediciones anteriores de este libro.

    Esta cuarta edicin contiene una gran coleccin de ejemplos, ejercicios y proyectos sobre muchos campos,los cuales estn diseados para dar a los alumnos la oportunidad de resolver problemas reales muy interesan-tes, y el cdigo de los ejemplos del texto fue probado en varios compiladores.

    El libro se concentra en los principios de la buena ingeniera de software y hace hincapi en la claridad delos programas. Somos maestros que enseamos temas de vanguardia en salones de clases de la industria alre-dedor del mundo y este texto pone nfasis en la buena pedagoga.

    Mtodo del cdigo activo (Mtodo LIVE-CODE)Este libro contiene diversos ejemplos reales; cada nuevo concepto se presenta en el contexto de un programacompleto, que funciona, y que es seguido de inmediato por una o ms ejecuciones de ejemplo que muestran la

    xviii Prefacio

  • entrada/salida del programa. Este estilo ejemplifica la forma en que enseamos y escribimos sobre programa-cin. A este mtodo de enseanza y de escritura le llamamos mtodo de cdigo activo o Mtodo LIVE-CODE.Utilizamos lenguajes de programacin para ensear lenguajes de programacin. Leer los ejemplos que apa-recen en este texto es muy parecido a escribirlos y ejecutarlos en una computadora.

    Acceso a World Wide WebTodo el cdigo fuente (en ingls) de los ejemplos que aparecen en este libro (y en nuestras dems publicacio-nes) se encuentra disponible en Internet en el siguiente sitio Web:

    www.deitel.com

    Registrarse es rpido y sencillo, y las descargas son gratuitas. Modificar los ejemplos e inmediatamente ver losefectos de esos cambios es una excelente manera de mejorar su aprendizaje.

    ObjetivosCada captulo comienza con una serie de objetivos que le informan al estudiante lo que debe esperar, y una vezque termina el captulo, le brinda la oportunidad de determinar si los cumpli. Dicha serie de objetivos repre-senta una base slida y una fuente positiva de reafirmacin.

    FrasesDespus de los objetivos de aprendizaje aparecen una o ms frases; algunas son simpticas, otras filosficas, ylas ms ofrecen ideas interesantes. Hemos observado que los estudiantes disfrutan al relacionar las frases conel material del captulo. Es probable que aprecie ms algunas de las frases, despus de leer los captulos.

    Plan generalEl plan general del captulo ayuda al estudiante a revisar el material de manera ordenada. Lo que tambin leayuda a darse una idea de lo que ver, y a establecer un ritmo de aprendizaje cmodo y efectivo.

    SeccionesCada captulo est organizado en pequeas secciones que tratan temas clave de C, C++ o Java.

    13,280 lneas de en 268 programas de ejemplo (con los resultados del programa)Mediante nuestro mtodo de cdigo activo, presentamos caractersticas de C, C++ y Java en el contexto de pro-gramas completos que funcionan. Despus de cada programa, aparece una ventana que contiene las salidas quese producen. Esto permite al estudiante confirmar que los programas funcionan como se esperaba. Relacionarlas salidas de un programa con las instrucciones que producen dichas salidas es una excelente forma de apren-der y de reforzar conceptos. Nuestros programas ejercitan muchas caractersticas de C, C++ y Java. Leer cui-dadosamente el libro es parecido a introducir y ejecutar estos programas en una computadora.

    469 Ilustraciones/FigurasEn este libro incluimos diversos diagramas, grficos e ilustraciones. Las explicaciones que presentan los captu-los 3 y 4 sobre instrucciones de control muestran diagramas de flujo cuidadosamente dibujados. [Nota: Nosotrosno enseamos a utilizar diagramas de flujo como herramientas de desarrollo de programas, sin embargo, utili-zamos una breve presentacin orientada a los diagramas de flujo para especificar la precisa operacin de lasinstrucciones de control de C.] El captulo 12, Estructuras de datos, utiliza grficos de lneas para ilustrar lacreacin y cmo mantener vinculadas listas, colas, pilas y rboles binarios. El resto del libro est bastante ilus-trado.

    768 tips de programacinHemos incluido siete clases de tips de programacin para ayudar a los estudiantes a que se enfoquen en aspec-tos importantes del desarrollo, prueba, depuracin, rendimiento y portabilidad de los programas. Resaltamoscientos de estos tips como Errores comunes de programacin, Tips para prevenir errores, Buenas prcticas deprogramacin, Observaciones de apariencia visual, Tips de rendimiento, Tips de portabilidad y Observacionesde ingeniera de software. Estos tips y prcticas representan lo mejor de lo que hemos podido cosechar durante

    Prefacio xix

  • seis dcadas (combinadas) de experiencia docente y en programacin. Una de nuestras alumnas, estudiante dematemticas, nos dijo que pensaba que este mtodo era como resaltar axiomas, teoremas y corolarios en librosde matemticas, ya que proporciona una base slida para construir un buen software.

    259 Errores comunes de programacin

    Los estudiantes que aprenden un lenguaje, en especial si se trata de su primer curso de programacin, tienden acometer con frecuencia ciertos errores. Poner atencin en los apartados de Errores comunes de programacin lesayuda a evitar cometer los mismos errores, y de paso reduce las largas filas afuera de la oficina del maestro.

    132 Buenas prcticas de programacin

    Las Buenas prcticas de programacin son tips para escribir programas claros. Estas tcnicas ayudan a los estu-diantes a producir programas ms legibles, autodocumentados y fciles de mantener.

    49 Tips para prevenir errores

    Cuando diseamos por primera vez esta clase de tip, pensamos que lo utilizaramos estrictamente para decirlea la gente cmo probar y depurar programas, por lo que en ediciones anteriores se les conoci como Tips deprueba y depuracin. De hecho, muchos de los tips describen aspectos de C, C++ y Java que reducen la proba-bilidad de que se produzcan errores, lo que simplifica los procesos de prueba y depuracin. Adems, a lo largo dellibro cambiamos muchas de las Buenas prcticas de programacin por tips de esta clase.

    32 Observaciones de apariencia visual

    En la parte de Java de este libro proporcionamos Observaciones de apariencia visual para resaltar convencionesde interfaz grfica de usuario. Estas observaciones ayudan a los estudiantes a disear sus propias interfaces gr-ficas de usuario para que cumplan con las normas de la industria.

    68 Tips de rendimiento

    Segn nuestra experiencia, ensear a los estudiantes a escribir programas claros y comprensibles es, por mucho,el objetivo ms importante para un primer curso de programacin. Sin embargo, los estudiantes quieren escribirprogramas que se ejecuten lo ms rpidamente posible, que utilicen la menor cantidad de memoria, que necesi-ten el menor nmero de teclazos y que destaquen de alguna otra manera. Los estudiantes realmente se preocupanpor el rendimiento y quieren saber qu pueden hacer para mejorar sus programas. Por lo tanto, resaltamos lasoportunidades para mejorar el rendimiento de los programas, es decir, cuando hacemos que los programas se eje-cuten ms rpido o cuando minimizamos la cantidad de memoria que ocupan.

    38 Tips de portabilidad

    El desarrollo de software es una actividad compleja y cara. Las empresas que desarrollan software con frecuenciadeben producir versiones personalizadas para una variedad de computadoras y sistemas operativos. Por ello, enla actualidad se pone gran nfasis en la portabilidad; es decir, en producir software que se ejecute en diversos sis-temas operativos con pocos o ningn cambio. Mucha gente ofrece C, C++ y Java como lenguajes apropiados parael desarrollo de software portable. Algunas personas asumen que si implementan una aplicacin en uno de los len-guajes, dicha aplicacin automticamente ser portable. ste simplemente no es el caso. Lograr la portabilidadrequiere un diseo muy cuidadoso ya que existen muchas dificultades para ello. Nosotros incluimos varios Tips deportabilidad para ayudar a los estudiantes a escribir cdigo portable. Desde su concepcin, Java fue diseadopara maximizar la portabilidad, sin embargo, los programas en Java tambin pueden necesitar modificaciones paratener esa funcionalidad.

    189 Observaciones de ingeniera de software

    Las Observaciones de ingeniera de software resaltan las tcnicas, las cuestiones arquitectnicas, los asuntos dediseo, etctera, que afectan la arquitectura y construccin de los sistemas de software, en especial de los sistemasa gran escala. Mucho de lo que el estudiante aprenda aqu ser til en cursos ms avanzados y en la industria,cuando comience a trabajar con sistemas reales grandes y complejos. C, C++ y Java son lenguajes de ingenierade software especialmente efectivos.

    ResumenCada captulo finaliza con elementos pedaggicos adicionales. En todos los captulos presentamos un Re-sumen completo en forma de lista que ayuda al estudiante a revisar y a reforzar los conceptos clave. Cada cap-tulo contiene un promedio de 37 puntos de resumen.

    xx Prefacio

  • TerminologaIncluimos una seccin de terminologa que contiene una lista en orden alfabtico de los trminos importan-tes definidos en el captulo para reforzar an ms los conceptos. Cada captulo contiene un promedio de 73trminos.

    Resumen de tips, prcticas y erroresAl final de cada captulo repetimos las Buenas prcticas de programacin, los Errores comunes de programa-cin, las Observaciones de apariencia visual, los Tips de rendimiento, los Tips de portabilidad, las Obser-vaciones de ingeniera de software y los Tips para prevencin de errores.

    728 Ejercicios de autoevaluacin y sus respuestas (la cuenta incluye partes separadas)Incluimos amplias secciones de Ejercicios de autoevaluacin y de Respuestas a los ejercicios de autoevalua-cin para que el alumno estudie por su cuenta. Esto le brindar la oportunidad de conocer el material y de pre-pararse para intentar los ejercicios regulares.

    993 Ejercicios (la cuenta incluye partes separadas; 1722 ejercicios en total)Cada captulo finaliza con un conjunto importante de ejercicios que incluyen un sencillo repaso de la termi-nologa y los conceptos importantes; la escritura de instrucciones especficas de un programa; la escritura depequeas partes o funciones y clases de C++/Java; la escritura de funciones completas, clases de C++/Javay programas; as como la escritura de proyectos finales importantes. El gran nmero de ejercicios permite a losprofesores disear sus cursos de acuerdo con las necesidades especficas de sus alumnos, as como modificarlas tareas del curso cada semestre. Los maestros pueden utilizar estos ejercicios para asignar tareas en casa, pa-ra aplicar exmenes cortos o para aplicar exmenes importantes.

    Un extenso ndice Hemos incluido un extenso ndice al final del libro, el cual ayudar al estudiante a localizar cualquier trmino oconcepto por palabra clave. El ndice es til tanto para la gente que lee el libro por primera vez como para losprogramadores que ya ejercen y que utilizan el libro como referencia. La mayora de los trminos de las sec-ciones de Terminologa aparecen en el ndice (junto con muchas otras entradas de cada captulo) por lo que elestudiante puede revisar estas secciones para asegurarse de que ha cubierto el material clave de cada captulo.

    Software incluido con este libroAl escribir este libro utilizamos varios compiladores de C. En su mayora, los programas del texto funcionarnen todos los compiladores C de ANSI/ISO y de C++, incluyendo el compilador Visual C++ 6.0 IntroductoryEdition que acompaa a este libro.

    El material de C (captulos 2 a 14) sigue el ANSI C estndar publicado en 1990. Vea los manuales de re-ferencia de su sistema para obtener ms detalles sobre el lenguaje, o para obtener una copia del ANSI/ISO9899: 1990, American National Standard for Information Systems, Programming Language C, del AmericanNational Standards Institute, 11 West 42nd Street, New York, New York 10036.

    En 1999, ISO aprob una nueva versin de C, C99, la cual an no es muy conocida. El Apndice B con-tiene una lista completa de los recursos Web de C99. Si desea ms informacin sobre C99 o le interesa adquiriruna copia del documento de estndares de C99 (ISO/IEC 9899;1999), visite el sitio Web del American Natio-nal Standards Institute (ANSI) en www.ansi.org.

    El material de C++ est basado en el lenguaje de programacin C++, tal como lo desarroll el Co-mit acreditado de estndares INCITS, en su parte de tecnologa de la informacin y su comit tcnico J11, enel lenguaje de programacin C++, respectivamente. La International Standards Organization (ISO) aprob loslenguajes C y C++.

    Todo buen programador debe leer cuidadosamente dichos documentos y revisarlos con frecuencia. Estosdocumentos no son manuales, sin embargo, definen sus respectivos lenguajes con el extraordinario nivel deprecisin de quienes implementaron ese compilador y que los grandes desarrolladores requieren.

    Prefacio xxi

  • Los captulos que manejan Java estn basados en el lenguaje de programacin Java de Sun Microsystems.Dicha empresa proporciona una implementacin de Java 2 Platform llamada Java 2 Software Development Kit(J2SDK), el cual incluye el conjunto mnimo necesario de herramientas para escribir software en Java. Ustedpuede descargar la versin ms reciente de J2SDK desde:

    java.sun.com/j2se/downloads.html

    La informacin relacionada con la instalacin y configuracin de J2SDK se encuentra en:

    developer.java.sun.com/developer/onlineTraining/new2java/gettingstartedjava.html

    Nosotros revisamos cuidadosamente nuestra presentacin, comparndola con estos documentos. Nuestrolibro pretende ser til tanto en niveles introductorios como intermedios, por lo que no pretendimos cubrir to-das las caractersticas analizadas en estos extensos documentos.

    Manuales de la serie DIVE-INTO para ambientes populares de C, C++ y JavaHemos lanzado nuestros nuevos manuales de la serie DIVE-INTO para ayudar a nuestros lectores a iniciarseen muchos de los ambientes de desarrollo de programas. Puede descargar gratuitamente estos manuales desde:

    www.deitel.com/books/downloads.html.

    Actualmente contamos con las siguientes publicaciones de la serie:

    DIVE-INTO Microsoft Visual C++ 6. DIVE-INTO Microsoft Visual C++ .NET. DIVE-INTO Borland C++ Builder Compiler (versin de lnea de comandos). DIVE-INTO Borland C++ Builder Personal (versin IDE). DIVE-INTO GNU C++ on Linux. DIVE-INTO GNU C++ via Cygwin on Windows (Cygwin es un emulador UNIX para Windows que in-

    cluye el compilador GNU de C++). DIVE-INTO Forte for Java Community Edition 3.0. DIVE-INTO SunOne Studio Community Edition 4.0.

    Cada uno de estos manuales muestra cmo compilar, ejecutar y depurar aplicaciones de C, C++ y Java en esecompilador en particular. Muchos de estos documentos tambin proporcionan instrucciones paso a paso, coninstantneas de la pantalla para ayudar a los lectores a instalar el software. Cada documento plantea informa-cin general sobre el compilador y la documentacin en lnea.

    Paquete de accesorios para la cuarta edicin de Cmo programar en CEste libro cuenta con diversas ayudas para los profesores. El CD llamado Instructors Resource (IRCD) contieneel Manual del instructor con las soluciones a mayora de los ejercicios que aparecen al final de cada captulo. Es-te CD, en idioma ingls, est disponible nicamente para los profesores, a travs de los representantes de Pear-son Educacin. [NOTA: Por favor no nos escriba para solicitar este CD; su distribucin est limitada es-trictamente a profesores universitarios que utilicen este libro como texto en sus clases. Los profesorespueden obtener el manual de soluciones nicamente a travs de los representantes de esta empresa.] Losaccesorios para este libro tambin incluyen un archivo llamado Test Item File, el cual contiene preguntas de op-cin mltiple. Adems, pueden disponer de diapositivas de PowerPoint que contienen todo el cdigo y las figu-ras del libro, as como una lista de los elementos que resumen los puntos clave del texto. Los profesores puedenadaptar estas diapositivas de acuerdo a sus necesidades. Pueden descargar estas diapositivas desde www-.deitel.com donde encontrarn recursos adicionales tiles tanto para profesores como para estudiantes.Adicionalmente, en el sitio Web Companion de este libro encontrar el Syllabus Manager, material que leayudar a los profesores a planear sus cursos interactivamente y a crear programas de estudios en lnea.

    Los estudiantes tambin se ven beneficiados con la funcionalidad del sitio Web Companion. Los recursosespecficos del libro para los estudiantes incluyen:

    Diapositivas de PowerPoint susceptibles de personalizar. Cdigo fuente de todos los programas de ejemplo.

    xxii Prefacio

  • Material de referencia de los apndices del libro (tales como tablas de precedencia de operadores, con-juntos de caracteres y recursos Web).

    Los recursos especficos de cada captulo, disponibles para los estudiantes incluyen:

    Objetivos del captulo. Lo ms destacado (por ejemplo, el resumen del captulo). Plan general. Tips (por ejemplo, Errores comunes de programacin, Buenas prcticas de programacin, Tips de

    portabilidad, Tips de rendimiento, Observaciones de apariencia visual, Observaciones de ingenierade software y Tips para prevenir errores).

    La gua de estudio en lnea, la cual contiene ejercicios adicionales de respuestas cortas para autoeva-luacin (por ejemplo, preguntas cuya respuesta es verdadero o falso) y sus respuestas, lo que propor-ciona al estudiante una retroalimentacin inmediata.

    El Sitio Web Companion con todo el material anterior, en idioma ingls, se encuentra en

    www.pearsoneducacion.net/deitel.

    Iniciativas DEITEL para aprendizaje electrnicoLibros electrnicos y soporte para dispositivos inalmbricosLos dispositivos inalmbricos tendrn un papel muy importante en el futuro de Internet. Dadas las recientesmejoras al ancho de banda y al surgimiento de tecnologas 2.5 y 3G, eso es lo que se vislumbra; dentro de unoscuantos aos, ms personas accedern a Internet por medio de dispositivos inalmbricos que por medio decomputadoras de escritorio. Deitel & Associates est comprometida con la accesibilidad inalmbrica y hemospublicado Wireless Internet & Mobile Business How to Program. Estamos investigando nuevos formatos elec-trnicos, tales como libros electrnicos inalmbricos, para que los estudiantes y profesores tengan acceso alcontenido virtualmente en cualquier momento y en cualquier lugar. Para enterarse de las actualizaciones peri-dicas de estas iniciativas, suscrbase al boletn de noticias DEITEL Buzz Online, en www.deitel.com/newsletter/subscribe.html, o visite www.deitel.com.

    Boletn de noticias DEITEL Buzz OnlineSuscrbase a nuestro correo electrnico gratuito de noticias, DEITEL Buzz Online, que incluye comentarios sobrelas tendencias y desarrollos de la industria, vnculos hacia artculos y recursos gratuitos de nuestras publicacio-nes actuales y futuras, calendarios de liberacin de productos, erratas, retos, ancdotas, informacin sobre nues-tros cursos empresariales de entrenamiento dirigidos por profesores, y mucho ms. Para suscribirse visite:

    www.deitel.com/newsletter/subscribe.html

    La nueva serie para desarrolladores (DEITEL Developer)Deitel & Associates, Inc., hizo el compromiso importante de cubrir las tecnologas de punta para los profesio-nales de la industria del software, a travs del lanzamiento de nuestra DEITEL Developer Series. Los primeroslibros de la serie son Web Services A Technical Introduction y Java Web Services for Experienced Program-mers. Estamos trabajando en ASP .NET with Visual Basic .NET for Experienced Programmers, ASP .NET withC# for Experienced Programmers, y en muchos ms. Para saber sobre actualizaciones continuas de las publi-caciones actuales y las venideras de la serie DEITEL Developer, visite www.deitel.com o suscrbase anuestro boletn de noticias.

    Recorrido a travs del libroEl libro se divide en cuatro partes principales. La primera, captulos 1 a 14, presenta un meticuloso tratamien-to del lenguaje de programacin C, el cual incluye una introduccin formal a la programacin estructurada.La segunda parte (captulos 15 a 23), nica entre los libros de texto de C, presenta un tratamiento completosobre C++ y la programacin orientada a objetos, suficiente para un curso universitario de posgrado. La terce-

    Prefacio xxiii

  • ra parte (tambin nica entre los libros de C), captulos 24 a 30, presenta una introduccin meticulosa a Java,la cual incluye programacin de grficos, programacin de la interfaz grfica de usuario (GUI) utilizandoJava Swing, programacin multimedia y programacin basada en eventos. La cuarta parte, apndices A a F, pre-senta una variedad de materiales de referencia que apoyan al texto principal.

    Parte 1: Programacin por procedimientos en CCaptulo 1 Introduccin a las computadoras, a Internet y a la World Wide Web Explica qu son

    las computadoras, cmo funcionan y cmo se programan. Introduce la idea de la programacin estructurada yexplica por qu este conjunto de tcnicas motivaron una revolucin en la forma de escribir los programas. Elcaptulo brinda una breve historia del desarrollo de los lenguajes de programacin, desde los lenguajes mqui-na y los lenguajes ensambladores hasta los lenguajes de alto nivel; tambin explica los orgenes de C, C++ yJava. El captulo incluye una introduccin a los ambientes tpicos de programacin en C. Nosotros analizamosel gran inters que se ha suscitado en Internet con el advenimiento de la World Wide Web y el lenguaje de pro-gramacin Java.

    Captulo 2 Introduccin a la programacin en C Proporciona una introduccin concisa a la escri-tura de programas en C. Presenta un tratamiento detallado de las operaciones aritmticas y para la toma de deci-siones en C. Despus de estudiar este captulo el estudiante sabr cmo escribir programas sencillos, perocompletos, en C.

    Captulo 3 Desarrollo de programas estructurados Tal vez ste sea el captulo ms importante dellibro, en especial para estudiantes serios de ciencias de la computacin. ste introduce la idea de los algorit-mos (procedimientos) para resolver problemas; explica la importancia de la programacin estructurada paraproducir programas que sean claros, corregibles, que se puedan mantener y que probablemente funcionen alprimer intento; introduce las instrucciones de control bsicas de la programacin estructurada, es decir, instruc-ciones de secuencia, de seleccin ( if e ifelse ) y de repeticin (while); explica la tcnica de refinamien-to arriba-abajo, paso a paso, que es importante para producir programas estructurados adecuados, y presenta lapopular herramienta para programar, el pseudocdigo estructurado. Los mtodos y tcnicas utilizados en elcaptulo 3 son aplicables a la programacin estructurada en cualquier lenguaje de programacin, no slo en C.Este captulo ayuda al estudiante a desarrollar buenos hbitos de programacin y a prepararse para lidiar contareas de programacin ms importantes a lo largo del libro.

    Captulo 4 Control de programas en C Mejora las nociones de la programacin estructurada eintroduce instrucciones adicionales de control. Examina detalladamente la repeticin y compara los ciclos con-trolados por un contador y los ciclos controlados por centinelas. Introduce la instruccin for como un medioconveniente para implementar ciclos controlados por contador; presenta la instruccin de seleccin switchy la instruccin de repeticin dowhile. El captulo concluye con una explicacin de los operadores lgicos.

    Captulo 5 Funciones en C Explica el diseo y la construccin de mdulos de programa. Las capa-cidades relacionadas con las funciones en C incluyen funciones de la biblioteca estndar, funciones definidaspor el programador, recursividad y capacidades de llamadas por valor. Las tcnicas que presentamos en el ca-ptulo 5 son bsicas para producir y apreciar los programas estructurados adecuadamente, en especial los pro-gramas grandes y el software que los programadores de sistemas y de aplicaciones podran desarrollar en larealidad. Presentamos la estrategia de divide y vencers como un medio efectivo para resolver problemascomplejos, dividindolos en componentes ms sencillos que interactan entre s. Los estudiantes disfrutan eltratamiento de nmeros aleatorios y la simulacin, y aprecian la explicacin del juego de azar con dados, el cualutiliza de manera elegante las instrucciones de control. En este captulo introducimos la enumeracin, y en elcaptulo 10 proporcionamos una explicacin ms detallada. El captulo 5 ofrece una slida introduccin a la re-cursividad, e incluye una tabla que resume docenas de ejemplos de recursividad y ejercicios distribuidos en elresto del libro. Algunos libros dejan la recursividad para un captulo posterior; sin embargo, nosotros pensa-mos que es mejor cubrir este tema de manera gradual a lo largo del texto. Los diversos ejercicios incluyenvarios problemas clsicos de recursividad como el de la torre de Hanoi.

    Captulo 6 Arreglos en C Explica la estructuracin de datos en arreglos, o grupos de elementos dedatos relacionados del mismo tipo. El captulo presenta diversos ejemplos, tanto de un solo subndice, comode dos subndices. Es bien sabido que estructurar datos de manera adecuada es tan importante como utilizarefectivamente instrucciones de control al desarrollar programas bien estructurados. Los ejemplos investigan

    xxiv Prefacio

  • distintas formas comunes de manipulacin de arreglos, la impresin de histogramas, el ordenamiento de datos,el paso de arreglos a funciones, y una introduccin al campo del anlisis de encuestas (con estadstica simple).Una caracterstica de este captulo es la cuidadosa explicacin de las tcnicas elementales de ordenamiento ybsqueda, y la presentacin de la bsqueda binaria como una enorme mejora de la bsqueda lineal. Los ejerci-cios que aparecen al final del captulo incluyen diversos problemas interesantes y desafiantes, como las tcni-cas mejoradas de ordenamiento, el diseo de un sistema de reservaciones para una aerolnea, una introduccinal concepto de los grficos de tortuga (que se hicieron famosos gracias al lenguaje LOGO), y los problemas delrecorrido del caballo y las ocho reinas, que muestran la idea de la programacin heurstica, la cual se utilizaampliamente en el campo de la inteligencia artificial.

    Captulo 7 Apuntadores en C Presenta una de las caractersticas ms poderosas y difciles de domi-nar del lenguaje C: los apuntadores. El captulo proporciona explicaciones detalladas acerca de los operadorespara apuntadores, de las llamadas por referencia, de las expresiones con apuntadores, de la aritmtica con apun-tadores, de la relacin entre apuntadores y arreglos, de los arreglos de apuntadores y de los apuntadores a fun-ciones. Los ejercicios del captulo incluyen una encantadora simulacin de la clsica carrera entre la tortuga yla liebre, barajar y repartir cartas y cmo manejar algoritmos y recorridos recursivos a travs de laberintos.Tambin incluimos una seccin especial llamada Cmo construir su propia computadora. Esta seccin expli-ca la programacin en lenguaje mquina y contina con un proyecto que involucra el diseo y la implementa-cin de un simulador de una computadora que permite al lector escribir y ejecutar programas en lenguajemquina. Esta caracterstica nica del libro le ser especialmente til a aquel lector que desee comprender cmofuncionan en realidad las computadoras. Nuestros estudiantes disfrutan este proyecto y a menudo implemen-tan mejoras sustanciales, muchas de las cuales se las sugerimos en los ejercicios. En el captulo 12, otra sec-cin especial gua al lector a travs de la construccin de un compilador; el lenguaje mquina que produce elcompilador se ejecuta despus en el simulador de lenguaje mquina producido en el captulo 7.

    Captulo 8 Caracteres y cadenas en C Trata de los fundamentos del procesamiento de datos nonumricos. El captulo incluye un recorrido a travs de las funciones para procesamiento de caracteres y cade-nas, disponibles en las bibliotecas de C. Las tcnicas que explicamos aqu se utilizan ampliamente en la cons-truccin de procesadores de palabras, en software para diseo y composicin de pginas, y en aplicaciones deprocesamiento de texto. El captulo incluye una variedad de ejercicios que exploran las aplicaciones de proce-samiento de texto. El estudiante disfrutar los ejercicios sobre escritura de poemas humorsticos de cinco ver-sos, escritura de poemas al azar, conversin del espaol a latn vulgar, generacin de palabras de siete letrasque equivaldran a un nmero telefnico dado, justificacin de texto, proteccin de cheques, escritura del mon-to de un cheque en palabras, generacin de cdigo Morse, conversiones mtricas y letras de cambio. El ltimoejercicio reta al estudiante a utilizar un diccionario computarizado para crear un generador de crucigramas.

    Captulo 9 Formato de datos de entrada/salida en C Presenta todas las poderosas capacidades deformato de printf y scanf. Aqu explicamos las capacidades de printf para el formato de resultados,tales como redondeo de valores de punto flotante a un nmero dado de lugares decimales, alineacin de colum-nas de nmeros, justificacin a la derecha y a la izquierda, insercin de informacin literal, cmo forzar un signode suma, impresin de ceros, uso de notacin exponencial, uso de nmeros octales y hexadecimales, y control deanchos de campo y precisiones. Explicamos todas las secuencias de escape de printf para el movimiento delcursor, la impresin de caracteres especiales y cmo ocasionar una alerta audible. Examinamos todas lascapacidades de scanf para el formato de datos de entrada, incluyendo la entrada de tipos especficos de datosy cmo evitar caracteres especficos en un flujo de entrada. Explicamos todos los especificadores de conver-sin de scanf para la lectura de valores decimales, octales, hexadecimales, de punto flotante, de carcter yde cadena. Tambin explicamos la introduccin de datos para que coincidan (o no) con los caracteres de unconjunto. Los ejercicios del captulo virtualmente prueban todas las capacidades de formato para datos deentrada/salida.

    Captulo 10 Estructuras, uniones, manipulaciones de bits y enumeraciones en C Presenta di-versas caractersticas importantes. Las estructuras son como los registros en otros lenguajes de programacin,los cuales agrupan elementos de datos de varios tipos. En el captulo 11 utilizamos las estructuras para formararchivos que consisten en registros de informacin. En el captulo 12, utilizamos las estructuras junto con losapuntadores y la asignacin dinmica de memoria para formar estructuras dinmicas de datos, como listasligadas, colas, pilas y rboles. Las uniones permiten que un rea de memoria sea utilizada por diferentes tipos

    Prefacio xxv

  • de datos en diferentes momentos; compartir la memoria de este modo puede reducir los requerimientos de me-moria de un programa o sus requerimientos de almacenamiento secundario. Las enumeraciones proporcionanun medio conveniente para definir constantes simblicas tiles; esto ayuda a escribir programas ms autodocu-mentados. Las poderosas capacidades para la manipulacin de bits en C permiten a los programadores escribirprogramas que ejerciten capacidades de hardware de ms bajo nivel. Esto ayuda a los programas a procesar ca-denas de bits, encender o apagar bits especficos y a almacenar informacin de manera ms compacta. Dichascapacidades, que con frecuencia slo se encuentran en lenguajes ensambladores de bajo nivel, son valoradaspor programadores que escriben software de sistemas como sistemas operativos y software para redes. Una ca-racterstica del captulo es la simulacin revisada y de alto rendimiento de cmo barajar y repartir cartas. staes una excelente oportunidad para el profesor para enfatizar la calidad de los algoritmos.

    Captulo 11 Procesamiento de archivos en C Explica las tcnicas utilizadas para el procesamientode archivos de texto con acceso secuencial y acceso aleatorio. El captulo comienza con una introduccin a lajerarqua de datos como bits, bytes, campos, registros y archivos. Despus presenta la visin de C con respec-to a los archivos y los flujos. Explica los archivos de acceso secuencial utilizando programas que muestran c-mo abrir y cerrar archivos, cmo almacenar datos en un archivo de manera secuencial, y cmo leer los datosde un archivo de manera secuencial. Tambin explica los archivos de acceso aleatorio utilizando programas quemuestran cmo crear un archivo de manera secuencial para acceso aleatorio, cmo leer y escribir datos en unarchivo con acceso aleatorio, y cmo leer datos de manera secuencial desde un archivo al que se accedi demanera aleatoria. El cuarto programa de acceso aleatorio combina muchas de las tcnicas de acceso a archivos,tanto secuencial como aleatorio, en un programa completo de procesamiento de transacciones.

    Captulo 12 Estructuras de datos en C Explica las tcnicas utilizadas para crear y manipular estruc-turas de datos dinmicas. El captulo comienza con explicaciones sobre las estructuras autorreferenciadas y laasignacin dinmica de memoria, y contina con una explicacin sobre cmo crear y mantener distintas estruc-turas de datos dinmicas, las cuales incluyen listas ligadas, colas (o lneas de espera), pilas y rboles. Para cadatipo de estructura de datos presentamos programas completos y funcionales, y mostramos ejemplos de los re-sultados. El captulo ayuda a los estudiantes a dominar los apuntadores. Incluye muchos ejemplos que utilizanla indireccin (o desreferencia) y la doble indireccin, un concepto particularmente difcil. Uno de los proble-mas al trabajar con apuntadores es que a los estudiantes se les dificulta visualizar las estructuras de datos ycmo se entrelazan sus nodos. El ejemplo del rbol binario es una maravillosa conclusin al estudio de losapuntadores y de las estructuras de datos dinmicas. Este ejemplo crea un rbol binario, refuerza la eliminacinde duplicados, e introduce los recorridos recursivos del rbol en preorden, inorden y posorden. Los estudiantestienen un sentido genuino de la responsabilidad cuando estudian e implementan este ejemplo; particularmenteaprecian el poder ver que el recorrido inorden despliega los valores de los nodos en orden. El captulo inclu-ye una amplia coleccin de ejercicios. Lo ms destacado de los ejercicios es la seccin especial de Cmoconstruir su propio compilador. Los ejercicios guan al estudiante a travs del desarrollo de un programa deconversin de expresiones de infijo a posfijo, y de un programa de evaluacin de expresiones posfijo. Despusmodificamos el algoritmo de evaluacin de expresiones posfijo para generar cdigo en lenguaje mquina. Elcompilador coloca este cdigo en un archivo (utilizando las tcnicas del captulo 11). Los estudiantes puedenejecutar el lenguaje mquina producido por sus compiladores en los simuladores de software que construyeronen los ejercicios del captulo 7.

    Captulo 13 El preprocesador de C Proporciona explicaciones detalladas sobre las directivas delpreprocesador. El captulo incluye informacin sobre la directiva #include (la cual ocasiona que se incluyauna copia del archivo especificado en la posicin de la directiva en el archivo de cdigo fuente, antes de queel archivo se compile) y la directiva #define que crea constantes simblicas y macros. El captulo explica lacompilacin condicional para permitir al programador controlar la ejecucin de las directivas del preprocesa-dor y la compilacin del cdigo del programa. Tambin explica el operador #, el cual convierte su operando enuna cadena, y el operador ## que concatena dos tokens. Aqu presentamos constantes simblicas predefinidas,tales como _LINE_, _FILE_, _DATE_ y _TIME_. Por ltimo presentamos la macro assert del archivo deencabezado assert.h. La macro assert es muy valiosa en la evaluacin, depuracin, verificacin y vali-dacin de programas.

    Captulo 14 Otros temas de C Presenta temas adicionales que incluyen diversos conceptos que porlo general no se cubren en cursos introductorios. Nosotros mostramos cmo redirigir la entrada de programas

    xxvi Prefacio

  • para que provengan de un archivo, cmo redirigir la salida de un programa para que se ubique en un archivo,cmo redirigir la salida de un programa para que sea la entrada de otro (a lo que se le llama canalizacin),tambin a aadir la salida de un programa a un archivo existente, a desarrollar funciones que utilicen listas deargumentos de longitud variable, a pasar argumentos de lneas de comandos a la funcin main y utilizarlos enun programa, a compilar programas cuyos componentes se encuentran en mltiples archivos, a registrar fun-ciones con atexit para que se ejecuten al terminar el programa, a terminar la ejecucin de un programa conla funcin exit, cmo utilizar los calificadores de tipo const y volatile, cmo especificar el tipo de unaconstante numrica mediante los sufijos de entero y de punto flotante, a utilizar la biblioteca de manejo de se-ales para atrapar eventos inesperados, cmo crear y utilizar arreglos dinmicos con calloc y realloc, ya utilizar uniones como una tcnica para ahorrar espacio.

    Parte 2: Programacin basada y orientada a objetos y programacin genrica en C++Captulo 15 C++ como un mejor C Presenta las caractersticas no orientadas a objetos de C++.

    Estas caractersticas mejoran el proceso de escribir programas por procedimientos. El captulo explica loscomentarios de una sola lnea, el flujo de entrada/salida, las declaraciones, la creacin de nuevos tipos de da-tos, los prototipos de funcin y la verificacin de tipo, las funciones inline (como reemplazo de macros), losparmetros por referencia, el calificador const, la asignacin dinmica de memoria, los argumentos predeter-minados, el operador unario de resolucin de alcance, la sobrecarga de funciones, las especificaciones de enla-zado y las plantillas de funciones.

    Captulo 16 Las clases de C++ y la abstraccin de datos Comienza nuestra explicacin sobre laprogramacin orientada a objetos. El captulo representa una maravillosa oportunidad para ensear la abstrac-cin de datos de manera correcta, es decir, a travs de un lenguaje (C++) expresamente dedicado a imple-mentar tipos de datos abstractos (ADTs, Abstract Data Types). En aos recientes, la abstraccin de datos se havuelto un tema importante en los cursos de computacin introductorios. Los captulos 16 a 18 incluyen un tra-tamiento slido de la abstraccin de datos. El captulo 16 explica la implementacin de ADTs como las clases(class) de estilo de C++ y por qu este mtodo supera al uso de structs; tambin explica cmo acceder amiembros class, cmo separar la interfaz de la implementacin, cmo utilizar funciones de acceso y de uti-lera, cmo inicializar objetos con constructores, cmo destruir objetos con destructores, cmo asignar demanera predeterminada la copia de un miembro de un objeto, y la reutilizacin de software. Uno de los ejerci-cios del captulo desafa al lector a desarrollar una clase para nmeros complejos.

    Captulo 17 Las clases de C++. Parte II Contina con el estudio de las clases y la abstraccin dedatos. El captulo explica cmo declarar y utilizar objetos constantes, funciones miembro constantes, la com-posicin (el proceso de construir clases que tienen como miembros a objetos de otras clases), funciones y clasesfriend, las cuales tienen derechos especiales de acceso a los miembros private y protected de lasclases, el apuntador this, el cual permite a un objeto saber su propia direccin, la asignacin dinmica dememoria, miembros static de la clase para contener y manipular todos los datos de la clase, ejemplos de po-pulares tipos de datos abstractos (arreglos, cadenas y colas), clases contenedoras e iteradores. Los ejercicios delcaptulo piden al estudiante que desarrolle una clase para cuentas de ahorros y una clase para almacenar con-juntos de nmeros enteros. Tambin explicamos la asignacin dinmica de memoria con new y delete. EnC++ estndar, cuando new falla, ste regresa un apuntador 0. Nosotros utilizamos este estilo estndar en loscaptulos 17 a 22. Dejamos para el captulo 23 la explicacin del nuevo estilo de la falla de new, en la que aho-ra new arroja una excepcin. Motivamos la explicacin de los miembros static de la clase con un ejem-plo que se basa en un videojuego. A lo largo del libro y en nuestros seminarios profesionales enfatizamos laimportancia de esconder los detalles de implementacin a los clientes de una clase.

    Captulo 18 Sobrecarga de operadores en C++ ste es uno de los temas ms populares de nuestroscursos de C++. Los estudiantes realmente disfrutan este material, ya que coincide perfectamente con la expli-cacin de los tipos de datos abstractos de los captulos 16 y 17. La sobrecarga de operadores permite a los pro-gramadores indicar al compilador cmo utilizar operadores existentes con objetos de nuevos tipos de clases.C++ ya sabe cmo utilizar estos operadores con objetos de tipos predefinidos, tales como enteros, nmeros depunto flotante y caracteres. Sin embargo, suponga que creamos una nueva clase llamada cadena; qu signi-ficara el signo +, si se utilizara entre objetos de tipo cadena? Muchos programadores utilizan el signo + concadenas para que indique una concatenacin. El captulo explica los fundamentos de la sobrecarga de opera-

    Prefacio xxvii

  • dores, las restricciones de dicha sobrecarga, la sobrecarga con funciones miembro de la clase frente a la so-brecarga con funciones no miembro, la sobrecarga de operadores unarios y binarios, y la conversin de tipos.Una caracterstica del captulo es un importante ejemplo prctico que incluye una clase arreglo, una clase paraenteros muy grandes y una clase para nmeros complejos (las dos ltimas aparecen con todo el cdigo fuente enlos ejercicios). Este material difiere de lo que generalmente se hace en los lenguajes de programacin y de loque se presenta en la mayora de los cursos. La sobrecarga de operadores es un tema complejo, sin embargo, esmuy enriquecedor. Utilizar inteligentemente la sobrecarga de operadores le ayuda a dar estilo a sus clases.Con las tcnicas de los captulos 16, 17 y 18, es posible crear una clase Fecha que, si la hubiramos utilizado enlas dos ltimas dcadas, habramos podido eliminar fcilmente una parte importante del llamado problema delao 2000. Uno de los ejercicios anima al lector a aumentar la sobrecarga de operadores a la clase Complejopara lograr una buena manipulacin de los objetos de esta clase con smbolos de operadores (como en matemti-cas), en lugar de utilizar llamadas a funciones, como el estudiante hizo en los ejercicios del captulo 17.

    Captulo 19 Herencia en C++ Trata con una de las capacidades fundamentales de los lenguajes deprogramacin orientada a objetos. La herencia es una forma de reutilizacin de software, en la que las nuevasclases se desarrollan rpidamente y absorben fcilmente las capacidades de clases existentes y agregan demanera adecuada nuevas capacidades. El captulo explica las nociones de las clases base y de las clases deri-vadas, los miembros protected, la herencia public, protected y private, las clases base directas,las clases base indirectas, los constructores y destructores en clases base y en clases derivadas, y la ingenierade software con herencia. El captulo compara la herencia (relacin es un) con la composicin (relacintiene un), e introduce las relaciones utiliza un y conoce a. Una caracterstica del captulo es que presentamuchos ejemplos prcticos importantes. En particular, un ejemplo que implementa la jerarqua de la clase pun-to, crculo, cilindro. El ejercicio pide al estudiante que compare la creacin de nuevas clases por medio de he-rencia, con las creadas por medio de la composicin, para que ample las diferentes jerarquas de herencia queexplicamos en el captulo, para que escriba una jerarqua de herencia para cuadrilteros, trapezoides, parale-logramos, rectngulos y cuadrados, y para que genere una jerarqua ms general de formas bidimensionales ytridimensionales.

    Captulo 20 Funciones virtuales y polimorfismo en C++ Trata con otra de las capacidades funda-mentales de la programacin orientada a objetos, es decir, con el comportamiento polimrfico. Cuando muchasclases estn relacionadas con una clase base comn a travs de la herencia, cada objeto de clase derivada debetratarse como un objeto de clase base. Esto permite que los programas se escriban de una manera general e in-dependiente de los tipos especficos correspondiente a los objetos de clase derivada. Es posible manejar nuevostipos de objetos con el mismo programa, lo que hace que los programas puedan ampliarse. El polimorfismopermite a los programas eliminar la compleja lgica de switches (indicadores), a favor de una lgica mssencilla en lnea recta. Por ejemplo, el administrador de pantalla de un videojuego puede enviar un mensajede dibujo a cada objeto de una lista ligada de objetos a dibujarse. Cada objeto sabe cmo dibujarse a s mismo.Es posible agregar un nuevo objeto al programa sin modificarlo, siempre y cuando ese nuevo objeto sepa c-mo dibujarse a s mismo. Este estilo de programacin por lo general se utiliza para implementar las interfacesgrficas de usuario ms populares de hoy en da. El captulo explica la mecnica para lograr un comportamien-to polimrfico a travs de las funciones virtuales. Aqu se hace la distincin entre las clases abstractas(desde las cuales no se pueden obtener instancias para objetos) y las clases concretas (desde las que se puedenobtener instancias para objetos). Las clases abstractas son tiles para proporcionar una interfaz heredable a lasclases, a travs de toda la jerarqua. Una caracterstica del captulo es su ejemplo prctico sobre el polimorfis-mo de la jerarqua del punto, crculo y cilindro que explicamos en el captulo 19. Los ejercicios del captulopiden al estudiante que explique algunas cuestiones conceptuales y mtodos, que aada clases abstractas a lajerarqua de formas y que desarrolle un paquete bsico de grficos mediante funciones virtuales y progra-macin polimrfica. Nuestra audiencia profesional insisti en que explicramos de manera precisa cmo seimplementa el polimorfismo en C++, y qu costos de memoria y tiempo de ejecucin uno debe pagar cuan-do se programa con esta poderosa capacidad. Nosotros respondimos desarrollando una ilustracin en la seccintitulada Polimorfismo, funciones virtuales y vinculacin dinmica Bajo la cubierta, que muestra las vta-bles (tablas de funciones virtuales) que el compilador de C++ construye automticamente para apoyar el estilode programacin polimrfico. Nosotros dibujamos estas tablas en las clases en las que explicamos la jerar-qua de formas punto, crculo y cilindro. Nuestras audiencias expresaron que esto les proporcion la informa-

    xxviii Prefacio

  • cin para decidir que el polimorfismo era un estilo de programacin apropiado para cada nuevo proyecto queenfrentaran. Incluimos esta presentacin en la seccin 20.9 y la ilustracin de la vtable en la figura 20.2. Estu-die cuidadosamente esta presentacin, ya que sta le ayudar a comprender mejor lo que ocurre en la compu-tadora cuando programe con herencia y polimorfismo.

    Captulo 21 Entrada/salida de flujo en C++ Contiene un completo tratamiento de entradas/salidasorientadas a objetos de C++. El captulo explica las diferentes capacidades en E/S de C++, incluyendo resulta-dos con el operador de insercin de flujo, entradas con el operador de extraccin de flujo, E/S con seguridadde tipo (una buena mejora sobre C), E/S con formato, E/S sin formato (para rendimiento), manipuladores deflujo para controlar la base numrica del flujo (decimal, octal o hexadecimal), nmeros de punto flotante, con-trol de anchos de campo, manipuladores definidos por el usuario, estados de formato de flujo, errores de estadode flujo, E/S de objetos de tipos definidos por el usuario y vinculacin de flujos de salida con flujos de entra-da (para garantizar que los indicadores de comandos realmente aparezcan antes de solicitar al usuario que intro-duzca una respuesta). El amplio conjunto de ejercicios pide al estudiante que escriba varios programas queprueben la mayora de las capacidades de E/S que explicamos en el texto.

    Captulo 22 Plantillas de C++ Explica una de las ms recientes adiciones a C++. En el captulo 15presentamos las plantillas de funciones. Las plantillas de clases permiten al programador capturar la esencia deun tipo de dato abstracto (como pilas, arreglos o colas), y crear, con una mnima adicin de cdigo, versionesde ese ADT (tipo de dato abstracto) para tipos particulares (como una cola de enteros, una cola de flo-tantes, una cola de cadenas, etctera). Por esta razn, las plantillas de clases con frecuencia se conocen comotipos parametrizados. El captulo explica el uso de parmetros de tipo y sin tipo, y considera la interaccin en-tre plantillas y otros conceptos de C++, como herencia y miembros friend y static. Los ejercicios desa-fan al estudiante a escribir una variedad de plantillas de funciones y de plantillas de clase, y a emplearlas enprogramas completos.

    Captulo 23 Manejo de excepciones en C++ Explica una de las ms recientes mejoras al lenguajeC++. El manejo de excepciones permite al programador escribir programas que son ms fuertes, ms toleran-tes a fallas y ms apropiados para ambientes de negocios crticos. El captulo explica cundo es adecuado elmanejo de excepciones; presenta los fundamentos del manejo de excepciones mediante bloques try, ins-trucciones throw y bloques catch; indica cmo y cundo relanzar una excepcin; explica cmo escribir laespecificacin de una excepcin y cmo procesar excepciones inesperadas; y explica los importantes vnculosentre las excepciones y los constructores, los destructores y la herencia. Explicamos el relanzamiento de ex-cepciones e ilustramos las dos formas en que new puede fallar cuando la memoria est agotada. Antes del an-teproyecto de C++ estndar, new fallaba y devolva un 0, as como en C, cuando malloc falla devuelve unapuntador NULL. Mostramos el nuevo estilo de la falla de new, mediante el lanzamiento de una excepcinbad_alloc (mala asignacin). Mostramos cmo utilizar set_new_handler para especificar una fun-cin personalizada, a la que se llamar para lidiar con situaciones de agotamiento de memoria. Explicamos laplantilla de clase auto_ptr para garantizar que la memoria asignada de manera dinmica sea adecuadamenteeliminada para evitar fugas de memoria.

    Parte 3: Programacin orientada a objetos, interfaz grfica de usuario manejada por eventos y programa-cin multimedia y de grficos en Java

    Captulo 24 Introduccin a aplicaciones y subprogramas de Java Presenta un ambiente de progra-macin tpico de Java y proporciona una ligera introduccin a aplicaciones de programacin y subprogramas(applets) en el lenguaje de programacin Java. Algunas de las entradas y salidas se llevan a cabo mediante unnuevo elemento de interfaz grfica de usuario (GUI) llamado JOptionPane que proporciona ventanas pre-definidas (llamadas dilogos) para entrada y salida. JOptionPane maneja la salida de datos hacia ventanasy la entrada de datos desde ventanas. El captulo presenta los subprogramas de Java utilizando muchos de losejemplos que vienen con el Java 2 Software Development Kit (J2SDK). Nosotros utilizamos el visor de subpro-gramas (appletviewer) (una utilera que viene con el J2SDK) para ejecutar diversos ejemplos de sub-programas. Despus escribimos subprogramas de Java que realizan tareas parecidas a las aplicaciones escritasal principio del captulo, y explicamos las similitudes y las diferencias entre stos y las aplicaciones. Despusde estudiar este captulo, el estudiante entender cmo escribir sencillas, pero completas, aplicaciones y sub-programas (applets) de Java. Los siguientes captulos utilizan tanto subprogramas como aplicaciones parademostrar conceptos adicionales de programacin.

    Prefacio xxix

  • Captulo 25 Ms all de C y C++: operadores, mtodos y arreglos Se enfoca tanto en las simili-tudes como en las diferencias que existen entre Java, C y C++. El captulo explica los tipos primitivos en Javay en qu difieren de C/C++, as como algunas diferencias en terminologa. Por ejemplo, lo que en C/C++ seconoce como funcin, en Java se conoce como mtodo. El captulo tambin contiene una explicacin sobre losoperadores lgicos: && (AND lgico), & (AND lgico booleano), || (OR lgico), | (OR lgico booleano in-cluyente), ^(OR lgico booleano excluyente), y aplicaciones ! (NOT). Motivamos y explicamos el tema de lasobrecarga de mtodos (como una comparacin con la sobrecarga de funciones de C++). En este captulo tam-bin presentamos eventos y manejo de eventos (elementos requeridos para programar interfaces grficas deusuario). Los eventos son notificaciones de cambios de estado como el clic de botones, el clic del ratn, eloprimir alguna tecla, etctera. Java permite a los programadores responder a diferentes eventos, codificandomtodos llamados manejadores de eventos. Tambin presentamos arreglos en Java, los cuales se procesan comoobjetos hechos y derechos. Esto representa una evidencia adicional del compromiso de Java de casi un 100%de orientacin a objetos. Analizamos la estructuracin de datos en arreglos, o grupos de elementos relaciona-dos del mismo tipo. El captulo presenta diversos ejemplos tanto de arreglos con un solo subndice como dearreglos con dos subndices.

    Captulo 26 Programacin basada en objetos en Java Comienza nuestra explicacin ms a fondosobre clases. El captulo se enfoca en la esencia y en la terminologa de las clases y los objetos. Qu es un ob-jeto?, qu es una clase de objetos?, cmo luce el interior de un objeto?, cmo se crean los objetos?, cmose destruyen?, cmo se comunican los objetos entre s?, por qu las clases son como un mecanismo naturalpara empacar software como componentes reutilizables? El captulo explica la implementacin de tipos de da-tos abstractos como clases de estilo Java, el acceso a miembros de la clase, cmo forzar el ocultamiento deinformacin con variables de instancias private, cmo separar la interfaz de la implementacin, cmo uti-lizar mtodos de acceso y de utilidad, la inicializacin de objetos mediante constructores, y el uso de construc-tores sobrecargados. El captulo tambin explica la declaracin y el uso de referencias constantes, la composi-cin (el proceso de construir clases que tienen como miembros referencias hacia objetos), la referencia thisque permite a un objeto conocerse a s mismo, la asignacin dinmica de memoria, los miembros staticde una clase para que contengan y manipulen datos de la clase, y ejemplos de tipos de datos abstractos popula-res, como pilas y colas. El captulo tambin presenta la instruccin package, y explica cmo crear paquetesreutilizables. Los ejercicios del captulo retan al estudiante a desarrollar clases para nmeros complejos, nme-ros racionales, horas, fechas, rectngulos, enteros grandes, una clase para jugar gato, una clase para cuentas deahorros y una clase para mantener conjuntos de enteros.

    Captulo 27 Programacin orientada a objetos en Java Explica las relaciones entre clases de ob-jetos, y la programacin con clases relacionadas. Cmo podemos aprovechar las similitudes entre clases deobjetos para minimizar el trabajo necesario para construir sistemas de software grandes? Qu es el polimorfis-mo? Qu significa programar en general, en lugar de programar en especfico? Cmo es que programaren general facilita la modificacin de sistemas y la adicin de nuevas caractersticas con un mnimo esfuerzo?Cmo podemos programar para toda una categora de objetos, en lugar de programar individualmente paracada tipo de objeto? El captulo lidia con una de las capacidades ms importantes de los lenguajes de progra-macin orientada a objetos, la herencia, que es una forma de reutilizacin de software en la que las nuevas cla-ses se desarrollan rpida y fcilmente, absorbiendo las capacidades de clases existentes y agregando nuevascapacidades adecuadas. El captulo explica las nociones de las superclases y las subclases, de miembros pro-tected, de superclases directas, de superclases indirectas, del uso de constructores en superclases y subcla-ses, y de la ingeniera de software con herencia. Nosotros presentamos clases internas que ayudan a esconderdetalles de implementacin. Las clases internas se utilizan con mayor frecuencia para crear manejadores deeventos de la GUI. Las llamadas clases internas pueden declararse dentro de otras clases, y son tiles para defi-nir manejadores de eventos comunes para diversos componentes de la GUI. Las clases internas annimas sedeclaran dentro de mtodos, y se utilizan para crear un objeto, por lo general un manejador de eventos para uncomponente especfico de la GUI. El captulo compara la herencia (relaciones es un ) con la composicin (re-laciones tiene un). Una caracterstica del captulo es el ejemplo prctico que presenta sobre la implementacinde una jerarqua de clases punto, crculo, cilindro. El ejercicio pide al estudiante que compare la creacin denuevas clases mediante herencia y mediante composicin, que ample las jerarquas de herencia que expli-camos en el captulo, que escriba una jerarqua de herencia para cuadrilteros, trapezoides, paralelogramos,

    xxx Prefacio

  • rectngulos y cuadrados, y que genere una jerarqua ms general de formas bidimensionales y tridimensionales.El captulo explica el comportamiento polimrfico. Cuando muchas clases estn relacionadas a travs de laherencia con una superclase comn, cada objeto de la subclase puede tratarse como un objeto de la superclase.Esto permite que los programas se escriban de manera general e independiente de los tipos especficos de los ob-jetos de la subclase. Es posible manejar nuevos tipos de objetos con el mismo programa, lo que hace que losprogramas puedan ampliarse. El polimorfismo permite a los programas eliminar la compleja lgica de swit-ches (indicadores), a favor de una lgica ms sencilla en lnea recta. Por ejemplo, el administrador depantalla de un videojuego puede enviar un mensaje de dibujo a cada objeto de una lista ligada de objetos a di-bujarse. Cada objeto sabe cmo dibujarse a s mismo. Es posible agregar un nuevo objeto al programa sin mo-dificarlo, siempre y cuando ese nuevo objeto sepa cmo dibujarse a s mismo. Este estilo de programacin porlo general se utiliza para implementar las interfaces grficas de usuario ms populares de hoy en da. El cap-tulo hace la distincin entre las clases abstractas (desde las cuales no se pueden obtener instancias paraobjetos) y las clases concretas (desde las que se pueden obtener instancias para objetos). El captulo tambinintroduce las interfaces (conjuntos de mtodos que deben ser definidos por cualquier clase que implementela interfaz).

    Captulo 28 Grficos en Java y Java2D Comienza una secuencia de tres captulos que presenta lachispa multimedia de Java. La programacin tradicional en C y C++ est bastante limitada al modo de carac-teres de entrada/salida. Algunas versiones de C++ se apoyan en bibliotecas de clases que dependen de laplataforma, las cuales pueden hacer grficos; sin embargo, si utiliza estas bibliotecas, es posible que sus apli-caciones no sean portables. Las capacidades de los grficos de Java son independientes de la plataforma y, porlo tanto, son portables, y decimos portables en toda la extensin de la palabra. Usted puede desarrollar subpro-gramas de Java con muchos grficos, y distribuirlos a sus colegas por la World Wide Web a cualquier parte, yellos podrn ejecutarlos bien en las plataformas locales de Java. Nosotros explicamos contextos grficos y obje-tos grficos; dibujar cadenas, caracteres y bytes; control de colores y fuentes; manipulacin de pantalla ymodos de pintura; y trazado de lneas, rectngulos, redondeado de rectngulos, rectngulos tridimensionales,valos, arcos y polgonos. Presentamos la API Java2D, nueva en Java 2, el cual proporciona poderosas herra-mientas de manipulacin de grficos. El captulo tiene muchas figuras que minuciosamente ilustran cada unade estas capacidades grficas con ejemplos de cdigo activo, con atractivos resultados en pantalla, con tablascaractersticas detalladas y con dibujos lineales detallados.

    Captulo 29 Componentes de la interfaz grfica de usuario de Java Presenta la creacin desubprogramas (applets) y aplicaciones con interfaces grficas de usuario (GUIs) amigables con el usuario. Estecaptulo se enfoca en los nue