PEARSON
EITEL
DEITEL DEITEL
http://alexyniorlls.blogspot.com 2 of 1380.
CUARTA EDICIÓN
CÓMO PROGRAMAR EN
C++
http://alexyniorlls.blogspot.com 3 of 1380.
http://alexyniorlls.blogspot.com 4 of 1380.
CUARTA EDICIÓN
CÓMO PROGRAMAR EN
Harvey M. Deitel Paul J. Deitel TRADUCCIÓN Alfonso Vidal Romero Elizondo Ingeniero en Sistemas Electrónicos ITESM-Campus Monterrey Jorge Octavio García Pérez Ingeniero en Computación Universidad Nacional Autónoma de México REVISIÓN TÉCNICA M. en C. Gabriela Azucena Campos García Profesora del Departamento de Sistemas de Información ITESM-Campus Estado de México
MÉXICO • ARGENTINA • BRASIL • COLOMBIA • COSTA RICA • CHILE • ECUADOR ESPAÑA • GUATEMALA • PANAMÁ • PERÚ • PUERTO RICO • URUGUAY • VENEZUELA
http://alexyniorlls.blogspot.com 5 of 1380.
_________________________ / Dal<» de catalogación bibliográfica
DEITEL, HARVEY M. y DF.ITEL, PAUL J.
Cuarta edición Cómo programar en C++ PEARSON EDUCACIÓN. México. 2003 ISBN: 970-26-0254-8 Área: Universitarios
Formato: 18.5 X 23.5 cm
Páginas: 1376
Authorized translation froni the English language edition. enlitled C ++ / / oh - lo Progrum. Fourth Edition. by Dr. Har\-ey M. Deitel and Paul J. De ite L published by Pearson Education, Inc., publishing as PRENTICE HALL. INC.. Copyright ©2003. All rights reserved. ISBN 0-13-038474-7 Traducción autorizada de la edición en idioma ingles, titulada C ++ How to Prvgram, Fourth Fdition, por Dr. Harvey M. Deitel y Paul J. Deitel, publicada por Ptarson Education, Inc., publicada como PRENT1CE HALL INC., Cop>-right ©2003. Todos los derechos reservados. Esta edición en español es la única autorizada.
Edición en español: Editor:
Guillemo Trujano Mendoza e-mail: guülermodrujaoo^1pcan»m*d..cotB Miguel B. Gutiérrez Hernández Editor de desarrollo: Supervisor de producción: Enrique Trejo Hernández
Edición en inglés: Vice Presidenl and Editorial Director. ECS: Murcia J. Hartón Acquisilions Editor: Petra J. Recler Assistant E ditor Sarah Burrows Projcct Manager: Jennifer Cappello Vice Presiden! and Director o í Produclion and Manufacturing. ESM: David W. U c e a ré Exccutivc Managing Editor: Vince O ’Brien Production Editor: Chirag Thakkar Director of Creative Services: Paul Belfanti Creative Director: Carole Anson Chaptcr Opcncr and Covcr Dcsigncr: Tomara l~ Sew nam , la u ra Treibeck, Dr. Harvey Deitel Manufacturing Manager. Trudy Pisciotti Manufacturing Buyer: Lisa McDowell Marketing Manager: Pamela Sltaffer Marketing Assistant: Barrie Reinhold
CUARTA EDICIÓN. 2003 D.R. © 2003 por Pearson Educación de México, S.A. de C.V. Atlacomulco 500-5o. piso Col. Industrial Atoto 53519, Naucalpan de Juárez, Edo. de México e-mail: editorial, universidades @ pearsoned.com Cámara Nacional de la Industria Editorial Mexicana. Reg-Núm. 1031. Prcntice Hall es una marca registrada de Pearson Educación de México. S.A. de C.V. Reservados todos los derechos. Ni la totalidad ni parte de esta publicación pueden reproducirse, registrarse o transmitirse, por un sistema de recuperación de información, en ninguna forma ni por ningún medio, sea electrónico, mecánico, fotoquímico, magnético o clcctroóptico, por fotocopia, grabación o cualquier otro, sin permiso previo por escrito del editor. El préstamo, alquiler o cualquier otra forma de cesión de uso de este ejemplar requerirá también la autorización del editor o de sus representantes. ISBN 970-26-0254-8
®
Impreso en México. Printed in México. 1 2 3 4 5 6 7 8 9 0 - 05 0 4 0 3 0 2
http://alexyniorlls.blogspot.com 6 of 1380.
PARA Don Kostuch: Por su constante dedicación a la excelencia en la enseñanza y al escribir sobre C++ y la tecnología de objetos. Gracias por ser nuestro mentor, colega y amigo. Gracias por haber sido durante una década nuestro revisor más crítico y. aún así, el más constructivo. Es un privilegio para nosotros ser sus estudiantes. Harvey y Paul Deitel
http://alexyniorlls.blogspot.com 7 of 1380.
http://alexyniorlls.blogspot.com 8 of 1380.
Contenido
Prefacio
1
xxxiii
Introducción a las co m p u tad oras y a la p ro gra m a ció n en C + +
1.1 Introducción 1.2 ¿Qué es una computadora? 1.3 Organización de las computadoras 1.4 Evolución de los sistemas operativos 1.5 Computación personal, distribuida y diente-servidor 1.6 Lenguajes máquina, lenguajes ensambladores, yde alto nivel 1.7 Historia de C y C++ 1.8 La Biblioteca estándar de C++ 1.9 Java 1.10 Visual Basic, Visual C++ y C# 1.11 Otros lenguajes de alto nivel 1.12 Programación estructurada 1.13 La tendenda clave del software: tecnología deobjetos 1.14 Conceptos básicos de un ambiente típico C++ 1.15 Tendendas de hardware 1.16 Historia de Internet 1.17 Historia de la World Wide Web 1.18 El Consorcio World Wide Web (W3C) 1.19 Notas generales acerca de C++ y de este libro 1.20 Introducdón a la programación en C++ 1.21 Un programa sencillo: imprimir una línea de texto 1.22 Otro programa sencillo: suma de dos enteros 1.23 Conceptos de memoria 1.24 Aritmética 1.25 Toma de dedsiones: operadores de igualdad y dereladón http://alexyniorlls.blogspot.com 9 of 1380.
1 2 4 5 6 7 7 8 10 11 11 13 13 14 15 17 18 19 20 20 21 21 26 30 31 34
Contenido
VIII
1.26 1.27
Acerca de los objetos: introducción a la tecnología de objetos y al Lenguaje Unificado de Modelado (UML™) Recorrido a través del libro
2
Estructuras d e control
2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8
Introducción Algoritmos Seudocódigo Estructuras de control Estructura de selección i f Estructura de selección i £ / e l s e Estructura de repetición w h ile Cómo formular algoritmos: ejemplo práctico 1 (repetición controlada por un contador) 2.9 Cómo formular algoritmos mediante el mejoramiento de arriba a abajo, paso a paso: ejemplo práctico 2 (repetición controlada por un centinela) 2.10 Cómo formular algoritmos mediante el mejoramiento de arriba a abajo, paso a paso: ejemplo práctico 3 (estructuras de control anidadas) 2.11 Operadores de asignación 2.12 Operadores de incremento y decremento 2.13 Fundamentos de la repetición controlada por un contador 2.14 Estructura de repetición f o r 2.15 Ejemplos de la utilización de la estructura f o r 2.16 Estructura de selección múltiple s w i tc h 2.17 Estructura de repet ición d o / wh i 1 e 2.18 Instrucciones b r e a k y c o n t i nue 2.19 Operadores lógicos 2.20 La confusión entre los operadores de igualdad ( - - ) y de asignación (-) 2.21 Resumen sobre programación estructurada 2.22 (Ejemplo práctico opcional) Acerca de los objetos: cómo identificar las clases de un sistema a partir de un problema establecido
3 3.1 3.2 3.3 3.4 3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15
Funciones
40 44
70 71 72 72 73 76 77 81 83 86 94 98 99
102 104 109 113
120 122 124 127 128 133
169
Introducción Componentes de un programa en C++ La biblioteca de funciones matemáticas Funciones Definición de funciones Prototipos de función Archivos de encabezado Cómo generar números aleatorios Ejemplo: un juego de azar y la introducción de enum Clases para almacenamiento Reglas de alcance Recursi viciad Ejemplo sobre cómo utilizar la rccursividad: la serie de Fibonacci Recursividad versus iteración Funciones con listas de parámetros vacías http://alexyniorlls.blogspot.com 10 of 1380.
170 170 171 173 174 178 180 182 188 192 195 198
202 206 208
Contenido
3.16 3.17 3.18 3.19 3.20 3.21 3.22
IX
Funciones inline Referencias y parámetros por referencia Argumentos predeterminados Operador unario de resolución de alcance Sobrecarga de funciones Plantillas de función (Ejemplo práctico opcional) Acerca de los objetos: identificación de los atributos de las clases
4
Arreglos
4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10
Introducción Arreglos Declaración de arreglos Ejemplos del uso de arreglos Cómo pasar arreglos a funciones Ordenamiento de arreglos Ejemplo práctico: cálculo de la media, la mediana y la moda mediante arreglos Búsqueda en arreglos: búsqueda lineal y búsqueda binaria Arreglos con múltiples subíndices (Ejemplo práctico opcional) Acerca de los objetos: cómo identificar las operaciones de una clase
5
A puntadores y c a d e n a s Introducción Declaración e inicialización de variables de apuntador Operadores para apuntadores Llamada a funciones por referencia Uso de const con apuntadores Ordenamiento burbuja mediante las llamadas por referencia Expresiones con apuntadores y aritmética de apuntadores Relación entre apuntadores y arreglos Arreglos de apuntadores Ejemplo práctico: simulación para barajar y repartir cartas Apuntadores a funciones Introducción al procesamiento de caracteres y texto 5.12.1 Fundamentos de los caracteres y de las cadenas 5.12.2 Funciones para el manejo de cadenas de la biblioteca de manipulación de cadenas (Ejemplo práctico opcional) Acerca de los objetos: colaboración entre objetos
6
C la se s y ab stracción d e datos
6.1 6.2 6.3 6.4
Introducción Definiciones de estructura Acceso a los miembros de una estructura Implementación del tipo Tiempo definido por el usuario mediante una estructura al estilo C Implementación del tipo de dato abstracto Tiempo mediante una clase Alcance de una clase y acceso a los miembros de la dase
6.5 6.6
225
252
5.1 5.2 5.3 5.4 5.5 5.6 5.7 5.8 5.9 5.10 5.11 5.12
5.13
209 211 215 217 219 222
http://alexyniorlls.blogspot.com 11 of 1380.
253 253 255 256 272 276 278 283 289 2%
319 320 320 322 325 329 336 341 344 349 350 355 360 360 362 370
404 405 406 407 408 411 418
Separación de la interfaz y la ¡mplementación Control de acceso a los miembros Funciones de acceso y funciones de utilidad Inicialización de los objetos de una clase: constructores Uso de argumentos predeterminados con constructores Destructores Invocación de constructores y destructores Uso de las funciones set (establecer) y get (obtener) Trampa sutil: retomo de una referencia a un dato miembro privado Asignación predeterminada de miembros Reutilización de software (Ejemplo práctico opcional) Acerca de los objetos: Comienzo de la programación de las clases para el simulador del elevador
420 424 426 430 430 435 435 439 445 448 450
Clases: Parte II
168
Introducción Objetos y funciones miembro const (constantes) Composición: objetos como miembros de clases Funciones y clases friend Uso del apuntador this Administración de memoria dinámica con los operadores now y delate Miembros de clase static Abstracción de datos y ocultamicnto de información 7.8.1 Ejemplo: tipo de dato abstracto Arreglo 7.8.2 Ejemplo: tipo de dato abstracto Cadena 7.8.3 Ejemplo: tipo de dato abstracto Cola Clases contenedoras e iteradores Clases proxy (Ejemplo práctico opcional) Acerca de los objetos: programación de las clases para el simulador del elevador
469 469 478 485 489 495 497 502 504 504 505 505 506
451
509
So b re c a rg a d e operadores: objetos d e tipo c a d e n a y d e tipo arreglo
>46
Introducción Fundamentos de la sobrecarga de operadores Restricciones en cuanto a la sobrecarga de operadores Funciones de operador como miembros de la clase o como funciones friend Sobrecarga de los operadores de inserción y de extracción de flujo Sobrecarga de operadores unarios Sobrecarga de operadores binarios Ejemplo práctico: la clase Arreglo Conversión entre tipos Ejemplo práctico: la clase Cadena Sobrecarga de ♦♦ y de — Ejemplo práctico: la clase Fecha Las clases string y vector de la biblioteca estándar
547 548 549 550 552 555 555 556 568 569 581 582 588
http://alexyniorlls.blogspot.com 12 of 1380.
Contenido
XI
9
Programación orientada a objetos:herencia
609
9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10
Introducción Clases base y clases derivadas Miembros protected Relación entre las clases base y las clases derivadas Ejemplo práctico: jerarquía de herencia de tres niveles Constructores, destructores y clases derivadas Relaciones "Usa un” y “Conoce a” Herencia public, protected y prívate Ingeniería de software con herencia (Ejemplo práctico opcional) Acerca de los objetos: incorporación de la herencia al simulador del elevador
610 611 614 614 637 642 648 648 648
10
Programación orientada a objetos:polimorfismo
10.1 10.2
Introducción Relaciones entre los objetos en una jerarquía de herencia 10.2.1 Invocación de funciones de clases base a partir de objetos de clases derivadas 10.2.2 Dirigir los apuntadores de clases derivadas a objetos de clases base 10.2.3 Llamadas a funciones miembro de clases derivadas mediante apuntadores de clases base 10.2.4 Funciones virtual Ejemplos de polimorfismo Campos de tipos y estructuras switch Gases abstractas Caso de estudio: herencia de interfaz y de imple mentación Polimorfismo, funciones virtual y vinculación dinámica “tras bambalinas” Destructores virtuales Caso de estudio: sistema de nómina utilizando polimorfismo e información de tipos en tiempo de ejecución con dynamic_cast y typeid
10.3 10.4 10.5 10.6 10.7 10.8 10.9
7 7 Plantillas
650
662 663 664 665 670 672 673 679 680 680 682 695 699 699
718
11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8
Introducción Plantillas de funciones Sobrecarga de plantillas de funciones Plantillas de clases Plantillas de clases y parámetros sin tipo Plantillas y herencia Plantillas y frienda Plantillas y miembros atatic
12
Entrada/salida de flujo en C++
737
12.1 12.2
Introducción Flujos 12.2.1 Comparación entre flujo clásico y flujo estándar 12.2.2 Archivos de encabezado de la biblioteca iostream 12.2.3 Clases y objetos de entrada/salida de flujo
739 739 740 740 741
http://alexyniorlls.blogspot.com 13 of 1380.
719 720 723 723 730 731 731 732
XII
12.3
Contenido
12.9
Salida de flujo 12.3.1 Salida de variables tipo ch&r * 12.3.2 Salida de caracteres utilizando la función miembro put Entrada de flujo 12.4.1 Las funciones miembro get y gat lina 12.4.2 Las funciones miembro de istream: peek, putback e ignore 12.4.3 E/S con seguridad de tipos E/S sin formato utilizando read. write y gcount Manipuladores de flujo 12.6.1 Base de flujo integral: dec. oct. hex y setbase 12.6.2 Precisión de punto flotante (precisión, setprecision) 12.6.3 Anchura de campos (width. setw) 12.6.4 Maní puladores defi nidos por el programador Estados de formato de flujo y manipuladores de flujo 12.7.1 Ceros a la derecha y puntos decimales ( showpoint) 12.7.2 Alineación (laft, right c intamal) 12.7.3 Relleno (fill, setfill) 12.7.4 Base integral de flujo (dec. oct, hex. showbase) 12.7.5 Números de punto flotante; notación científica y fija (scientific, fixed) 12.7.6 Control de mayúsculas/minúsculas (uppercase) 12.7.7 Especificación de formato booleano (boolalpha) 12.7.8 Establecer y restablecer el estado del formato mediante la función miembro flags Estados de error de flujo Enlazar un flujo de salida a un flujo de entrada
12.4
12.5 12.6
12.7
12.8
13
Manejo de excepciones
13.1 13.2 13.3 13.4 13.5 13.6 13.7 13.8 13.9 13.10 13.11 13.12 13.13
Introducción Generalidades acerca del manejo de excepciones Otras técnicas para el manejo de errores Ejemplo simple del manejo de excepciones: dividir entre cero Volver a lanzar una excepción Especificaciones de excepciones Procesamiento de excepciones inesperadas Limpieza de la pila Constructores, destructores y manejo de excepciones Excepciones y herencia Procesamiento de fallas con new La clase auto_ptr y la asignación dinámica de memoria Jerarquía de excepciones de la biblioteca estándar
74
Procesamiento de archivos
14.1 14.2 14.3 14.4 14.5
Introducción Jerarquía de datos Archivos y flujos Creación de un archivo de acceso secuencial Cómo leer datos de un archivo de acceso secuencial http://alexyniorlls.blogspot.com 14 of 1380.
743 743 744 744 745 748 748 748 749 750 751 752 754 755 756 757 759 760 761 762 763 764 766 768
779 780 781 783 784 788 789 790 790 792 793 793 797 800
808 809 809 811 812 816
Contenido
XIII
14.6 14.7 14.8 14.9 14.10 14.11 14.12
Actualización de archivos de acceso secuencial Archivos de acceso aleatorio Creación de un archivo de acceso aleatorio Cómo escribir datos en forma aleatoria en un archivo de acceso aleatorio Cómo leer datos secuencialmcnte desde un archivo de acceso aleatorio Ejemplo: un programa para procesar transacciones Entrada/salida de objetos
823 824 824 829 831 834 841
15
La clase s t r i n g y el procesamiento de flujos de cadena
15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 15.10 15.11 15.12
Introducción Asignación y concatenación de objetos tipo string Comparación de objetos tipo string Subcadcnas Intercambio de objetos string Características de la dase string Buscar cadenas y caracteres en un objeto string Sustitución de caracteres en un objeto string Inserción de caracteres en un objeto string Conversión a cadenas ch&r * estilo C Itcradores Procesamiento de flujos de cadena
16
Programación Web con CG I
16.1 16.2 16.3 16.4 16.5 16.6 16.7 16.8 16.9 16.10 16.11 16.12 16.13 16.14 16.15 16.16 16.17
Introducción Tipos de peticiones HTTP Arquitectura de multinivel Acceso a los servidores Web El servidor HTTP Apache Cómo pedir documentos de XHTML Introducción a CGI Transacción HTTP simple Secuencia de comandos CGI simple Envío de datos de entrada a una secuencia de comandos CGI Uso de formularios en XHTML para enviar datos de entrada Otros encabezados Ejemplo práctico: una página Web interactiva Cookies Archivos del lado del servidor Ejemplo práctico: carrito de compras Recursos en Internet y Web
17 17.1 17.2 17.3 17.4 17.5
Estructuras de datos Introducción Gases autorreferenciadas Asignación de memoria y estructuras de datos dinámicas Listas enlazadas Pilas http://alexyniorlls.blogspot.com 15 of 1380.
850 851 852 855 857 858 859 862 864 866 867 869 870
880 881 882 882 883 884 885 885 886 888 895 897 905 905 909 915 921 936
942 943 944 945 945 960
XIV
Contenido
17.6 17.7
Colas Árboles
965 969
18 18.1 18.2 18.3 18.4 18.5 18.6 18.7 18.8 18.9 18.10 18.11 18.12
Introducción Definición de estructuras Inicialización de estructuras Uso de estructuras con funciones typedef Ejemplo: simulación de alto rendimiento para barajar y repartir cartas Operadores a nivel de bits Campos de bits Biblioteca para manejo de caracteres Funciones de conversión de cadenas Funciones de búsqueda de la biblioteca para manejo de cadenas Funciones de memoria de la biblioteca para manejo de cadenas
79
El preprocesador
Bits, caracteres, cadenas y estructuras
19.1 Introducción 19.2 La directiva «inelude del preprocesador 19.3 La directiva «define del preprocesador: constantes simbólicas 19.4 La directiva «define del preprocesador: macros 19.5 Compilación condicional 19.6 Las directivas «error y «pragma del prcproccsador 19.7 Los operadores # y «# 19.8 Números de línea 19.9 Constantes simbólicas predefinidas 19.10 Afirmaciones
20
Temas relacionados con el código heredado de C
20.1
Introducción Redirección de la entrada/salida en sistemas UNIX y DOS Listas de argumentos con longitudes variables Uso de los argumentos de la línea de comandos Notas sobre la compilación de programas con varios archivos de código fuente Terminación de un programa con exit y atexit Calificador de tipo volátil© Sufijos para constantes enteras y de punto flotante Manejo de señales Asignación dinámica de memoria con c&lloc y realloc La ramificación incondicional: goto Uniones Especificaciones de enlazado
20.2
20.3 20.4 20.5 20.6 20.7 20.8
20.9 20.10 20.11 20.12
20.13 21
Biblioteca estándar de plantillas (STL)
21.1
Introducción a la Biblioteca estándar de plantillas (STL) 21.1.1 Introducción a los contenedores 21.1.2 Introducción a los ¡teradores http://alexyniorlls.blogspot.com 16 of 1380.
1000 1001 1001
1003 1004 1004 1005 1007 1017 1020 1026 1031 1036
1053 1054 1054 1055 1056 1057 1058 1059 1059 1060 1060
1065 1066 1066 1067 1070 1071 1073 1075 1075 1075 1078 1079 1080 1084
1090 1092 1094 1098
Contenido
XV
21.6 21.7 21.8
Introducción a los algoritmos 21.1.3 Contenedores de secuencia 21.2.1 Contenedor de secuencia vector 21.2.2 Contenedor de secuencia list 21.2.3 Contenedor de secuencia deque Contenedores asociativos 21.3.1 Contenedor asociativo multiset 21.3.2 Contenedor asociativo set 21.3.3 Contenedor asociativo multimap 21.3.4 Contenedor asociativo map Adaptadores de contenedores 21.4.1 Adaptador stack 21.4.2 Adaptador queue 21.4.3 Adaptador priority_queue Algoritmos 21.5.1 fill, fill_n, generate y generate.n 21.5.2 equal, mismatch y lexicographical_compare 21.5.3 remove, remove_if, remove_copyy remove_copy_if 21.5.4 replace, replace_if,replace_copy y replace_copy_i£ 21.5.5 Algoritmos matemáticos 21.5.6 Algoritmos básicos de búsqueda y ordenamiento 21.5.7 swap, iter_swap y swap_rauges 21.5.8 copy_backward, merge, un ique y reverse inplace_merge, unique_copy y reverse_copy 21.5.9 21.5.10 Operaciones de conjuntos 21.5.11 lowe r_bound, upper bound y equal_range 21.5.12 Heapsort 21.5.13 min y max 21.5.14 Algoritmos que no se cubren en este capítulo La clase bitset Objetos de función Recursos de la STL en Internet y la Web
22
Otros temas
22.1 22.2 22.3 22.4 22.5 22.6 22.7 22.8 22.9 22.10 22.11
Introducción El operador const_cast El operador reinterpret_cast Espacios de nombres Palabras reservadas de los operadores Constructores explicit Miembros de clases mutable Apuntadores a miembros de clases ( . * y - >*) Herencia múltiple Herencia múltiple y clases base virtual Comentarios finales
A
Tabla de precedencia de los operadores
21.2
21.3
21.4
21.5
1103 1105 1105 1113 1117 1119 1119 1122 1124 1126 1128 1128 1130 1132 1133 1134 1136 1138 1141 1144 1148 1150 1152 1154 1156 1160 1162 1165 1166 1168 1172 1175
1183
http://alexyniorlls.blogspot.com 17 of 1380.
1184 1184 1185 1186 1190 1192 1197 1199 1201 1205 1210
1214
XVI
B
Contenido
Conjunto de caracteres ASCII
1216 1217
C
Sistemas numéricos
C.l C.2 C.3 C.4 C.5 C. 6
Introducción Abreviatura de los números binarios como números octalcs y hcxadccimalcs Conversión de números ocíales y hexadecimales a números binarios Conversión de un número binario, octal o hcxadccimal a decimal Conversión de un número decimal a binario, octal o hcxadccimal Números binarios negativos: notación de complemento a dos
D
Recursos de C++ en Internet y Web
D. 1 D.2 D.3 D.4 D.5 D.6 D.7
Recursos Tutoriales FAQs Visual C++ Grupos de noticias Compiladores y herramientas de desarrollo Biblioteca de plantillas estándar
1218 1221 1222 1222 1223 1225
1230 1230 1232 1233 1233 1233 1234 1234
E
Introducción a XHTML
El E2 E3 E4 E5 E6 E7 E8 E9 E 10 E 11 E 12 E 13 E 14
Introducción Edición de XHTML El primer ejemplo de XHTML Encabezados Vínculos Imágenes Caracteres especiales y más interrupciones de línea Listas desordenadas Listas anidadas y ordenadas Tablas básicas de XHTML Tablas intermedias de XHTML y formato Formularios básicos de XHTML Formularios más complejos de XHTML Recursos en Internet y en World Wide Web
F
Caracteres especiales XHTML
1274
Bibliografía
1275
índice
1281
http://alexyniorlls.blogspot.com 18 of 1380.
1236 1237 1237 1238 1240 1242 1245 1249 1250 1251 1252 1257 1259 1262 1269
Ilustraciones
1
Introducción a las computadoras y a la programación en C++
1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15
Ambiente típico de desarrollo de C++. 16 Programa que imprime texto. 22 Secuencias de escape. 24 Impresión en una línea mediante instrucciones separadas con cout. 25 Impresión de varias líneas mediante una sola instrucción con cout. 25 Programa de suma. 26 Ubicación de memoria que muestra el nombre y el valor de la variable enterol. 30 Ubicaciones de memoria después de almacenar los valores de enterol y entero2. 31 Ubicaciones de memoria después de calcular la suma de enterol y entero2. 31 Operadores aritméticos. 31 Precedencia de operadores aritméticos. 33 Orden en el cual se evalúa un polinomio de segundo grado. 35 Operadores de igualdad y de relación. 35 Operadores de igualdad y de relación. 36 Precedencia y asociatividad de los operadores que hemos explicado hasta elmomento. 39
2
Estructuras de control
2.1 2.2 2.3 2.4 2.5 2.6
Diagrama de actividad de una estructura de secuencia. Palabras reservadas de C++. Diagrama de actividad de la estructura de selección simple if. Diagrama de actividad de la estructura de selección doble if/else. Diagrama de actividad de la estructura de repetición while. Algoritmo en seudocódigo para calcular el promedio de una clase, el cual utiliza una repetición controlada por un contador. Problema correspondiente al cálculo del promedio de una clase, el cual utiliza una repetición controlada por un contador. Algoritmo en seudocódigo del problema correspondiente al cálculo del promedio de una clase mediante la repetición controlada por un centinela.
2.7 2.8
http://alexyniorlls.blogspot.com 19 of 1380.
1
70 73 75 77 78 82 83 84 89
Problema correspondiente al cálculo del promedio de una clase mediante el uso de una repetición controlada por un centinela. Algoritmo en seudocódigo del problema de resultados de examen. Estructuras de control anidadas: problema de resultados de exámenes. Operadores aritméticos de asignación. Operadores de incremento y decremento. Prcincrcmcnto y posincremento. Precedencia de los operadores explicados hasta este punto. Repetición controlada por un contador. Repetición controlada por un contador mediante la estructura for. Componentes del encabezado de la estructura for. Diagrama de actividad de la estructura de repetición for. Sumatoria mediante for. Cálculo del interés compuesto mediante for. Evaluación de múltiples calificaciones expresadas en letras, mediante la estructura switch. Diagrama de actividad de la estructura de selección múltiple switch con instrucciones break. Estructura do/while. Diagrama de actividad de la estructura de repetición do/while. Instrucción break para interrumpir una estructura for. Instrucción continué que termina una iteración de la estructura for. Tabla de verdad del operador lógico && (AND lógico). Tabla de verdad del operador lógico | | (OR lógico). Tabla de verdad del operador ! (negación lógica). Precedencia y asociatividad de operadores. Estructuras de secuencia de entrada sencilla/salida sencilla, selección y repetición de C++. Reglas para formar programas estructurados. Diagrama de actividad más sencillo. Aplicación repetida de la regla 2 de la figura 2.33 al diagrama de actividad más sencillo. Aplicación repetida de la regla 3 de la figura 2.33 al diagrama de actividad más sencillo. Diagrama de actividad con sintaxis no permitida. Diagrama caso-uso para el sistema del elevador. Lista de sustantivos en el enunciado del problema. Representación de una clase en UML. Asociaciones entre clases de un diagrama de clases. Valores de multiplicidad. Diagrama completo de las clases del simulador del elevador. Diagrama de objetos de un edificio vacío.
89 96 96 99 100
100 102
103 104 105 108 109 111 114 118 121 121 122
123 125 125 126 127 129 130 130 130 131 132 139 140 142 142 143 144 145
Fundones
69
Relación jerárquica función jefe/función trabajador. Biblioteca de funciones matemáticas. Función cuadrado, definida por el programador. Función mayor, definida por el programador.
172 172 174 177
http://alexyniorlls.blogspot.com 20 of 1380.
lustraciones
XIX
3.5 3.6 3.7 3.8 3.9 3.10 3.11 3.12 3.13 3.14 3.15 3.16 3.17 3.18 3.19 3.20 3.21 3.22 3.23 3.24 3.25 3.26 3.27 3.28 3.29 3.30 3.31 3.32
180 181 183 184 186 188 191 196 200 200 202 205 207 208 210 212 213 214 216 217 219 221 223 225 226 228 228
Jerarquía de promoción de tipos de datos integrados. Archivos de encabezado de la biblioteca estándar. Escala y cambio de enteros producidos por 1 ♦ r an d () % 6. Tiro de un dado de seis lados 6,000 veces. Randomización del programa de dados. Simulación del juego “craps” Salidas de ejemplo para el programa “craps”. Ejemplo de alcance. Evaluación recursiva de 5!. Cálculo de factoriales mediante una función recursiva. Números de Fibonacci generados mediante una función recursiva. Conjunto de llamadas recursivas al método F ib o n a c c i. Resumen de los ejemplos y ejercicios sobre recursividad que aparecen en el libro. Funciones que no toman argumentos. Función i n l i n e que calcula el volumen de un cubo. Paso de argumentos por valor y por referencia. Cómo inicializar una referencia. No inicializar una referencia local ocasiona un error de sintaxis. Argumentos predeterminados de una función. Operador unario de resolución de alcance. Definición de funciones sobrecargadas. Destrucción de nombres para permitir la vinculación segura de tipos. Uso de una plantilla de función. Palabras y frases descriptivas en el enunciado del problema. Diagrama de clase que muestra los atributos. Diagrama de estados para las clases B o to n P is o y B o to n E e le v a d o r. Diagrama de estados para la clase E le v a d o r . Diagrama de actividad que modela la lógica del elevador correspondiente a la presión de los botones del piso. 3.33 Programa de ejemplo para el ejercicio 3.2. 3.34 Las torres de Hanoi para el caso con cuatro discos.
4
Arreglos
4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15
Arreglo de 12 elementos. Precedencia y asociatividad de operadores. Inicialización en ceros de los elementos de un arreglo y su impresión. Inicialización de los elementos de un arreglo mediante una declaración. Generación de valores a colocarse en los elementos de un arreglo. Inicialización y uso de una variable constante. Las variables c o n s t deben inicial izarse. Cálculo de la suma de los elementos de un arreglo. Programa para desplegar un histograma. Programa de tiro de dados mediante el uso de arreglos en lugar de s w i t ch. Programa de encuesta a estudiantes. Arreglos de caracteres procesados como cadenas. Inicialización de un arreglo s t a t i c y uno automático. Paso de arreglos y de elementos individuales de un arreglo a funciones. Calificador de tipo c o n s t aplicado a un parámetro de arreglo.
230 237 247
252
http://alexyniorlls.blogspot.com 21 of 1380.
254 255 256 257 259 260 260 261 262 263 265 268 270 273 275
XX
lustTaclones
4.16 Ordenamiento de un arreglo mediante el método burbuja. 4.17 Programa de análisis de una encuesta. 4.18 Muestra de la ejecución del programa de análisis de datos de una encuesta. 4.19 Búsqueda lineal en un arreglo. 4.20 Búsqueda binaria en un arreglo ordenado. 4.21 Arreglos con doble subíndice con tres filas y cuatro columnas. 4.22 Inicialización de arreglos multidimensionales. 4.23 Manipulación de un arreglo con doble subíndice. 4.24 Frases para cada clase de nuestro simulador del elevador. 4.25 Diagrama de clase que incluye los atributos y las operaciones. 4.26 Diagrama de secuencia que modela los pasos que repite el edificio durante la simulación. 4.27 Diagrama de secuencia para el proceso de planificación. 4.28 Las 36 posibles salidas para el tiro de dos dados. 4.29 Comandos de gráficos de tortuga. 4.30 Los ocho movimientos posibles del caballo. 4.31 Los 22 cuadros eliminados al colocar una reina en la esquina superior izquierda.
5
Apuntadores y cadenas
5.1 5.2 5.3 5.4 5.5 5.6 5.7
Referencia directa e indirecta hacia una variable. Representación gráfica de un apuntador que apunta a una variable en memoria. Representación de y y p tr Y en memoria. Operadores de apuntadores & y *. Precedencia y asociatividad de operadores. Paso por valor utilizado para elevar al cubo el valor de una variable. Paso por referencia con un apuntador como argumento utilizado para elevar al cubo el valor de una variable. Análisis del paso por valor del programa de la figura 5.6. Análisis del paso por referencia (con apuntadores como argumentos) del programa de la figura 5.7. Conversión de una cadena a mayúsculas. Impresión de una cadena, carácter por carácter, mediante el uso de un apuntador no constante a un dato constante. Intento de modificar datos a través de un apuntador no constante a un dato constante. Intento para modificar un apuntador constante a un dato no constante. Intento de modificar un apuntador constante a un dato constante. Ordenamiento por el método burbuja mediante paso por referencia. Cuando el operador s i z e o f se aplica al nombre de un arreglo, éste devuelve el número de bytes en el arreglo. Uso del operador s i z e o f para determinar los tamaños de los tipos de datos estándar. El arreglo v y la variable de apuntador p tr V que apunta a v. El apuntador p tr V después de la aritmética de apuntadores. Referencia a elementos de un arreglo mediante el nombre de arreglo y apuntadores. Copia de cadenas mediante la notación de arreglos y la de apuntadores. Representación gráfica del arreglo p a lo . Representación de un arreglo con dos subíndices de una baraja.
5.8 5.9 5.10 5.11 5.12 5.13 5.14 5.15 5.16 5.17 5.18 5.19 5.20 5.21 5.22 5.23
http://alexyniorlls.blogspot.com 22 of 1380.
277 279 282 284 286 290 290 293 297 298 300 302 311 313 314 316
319 321 322 322 323 324 326 327 328 329 331 332 333 334 335 336 339 340 342 342 345 347 349 350
Ilustraciones
XXI
5.24 5.25 5.26 5.27 5.28 5.29 5.30 5.31 5.32 5.33 5.34 5.35 5.36 5.37 5.38 5.39 5.40 5.41 5.42 5.43 5.44
Programa para barajar y repartir cartas. Programa de ordenamiento multipropósito mediante apuntadores a funciones. Arreglo de apuntadores a funciones. Funciones para la manipulación de cadenas de la biblioteca estándar. Funciones strepy y stracpy. Funciones strcat y atraeat. Funciones stremp y straemp. Función atrtok. Función atrlen. Lista modificada de verbos y frases para las clases del sistema. Colaboraciones que ocurren en el sistema del elevador. Diagrama de colaboración para cargar y descargar pasajeros. Arreglo baraja no revuelto. Ejemplo del arreglo baraja revuelto. Reglas de movimiento para la tortuga y la liebre. Códigos de operación del lenguaje máquina Simplctron (LMS). Ejemplo 1 de LMS. Ejemplo 2 de LMS. Un vaciado de muestra. Arreglo con dos subíndices, el cual representa un laberinto. Alfabeto en clave Morse.
352 355 358 363 364 365 366 368 370 371 371 373 386 386 386 388 389 389 392 396 402
6
Clases y abstracción de datos
6.1
Creación de una estructura, establecimiento de sus miembros e impresión de la estructura. Definición de la clase Tiempo. Implementación dd tipo de dato abstracto Tiempo como una clase. Acceso a los datos y funciones miembro de un objeto a través de cada tipo de manipulador del objeto, del nombre del objeto, de la referencia al objeto y de un apuntador al objeto. Definición de la clase Tiempo. Definiciones de las funciones miembro de la clase Tiempo. Programa para probar la clase Tiempo. Los miembros privados de una clase no son accesibles fuera de la misma. Definición de la clase Vendedor. Definiciones de las funciones miembro de la clase Vendedor. Demostración de una función de utilidad. Case Tiempo que contiene un constructor con argumentos predeterminados. Definiciones de las funciones miembro de la clase Tiempo, incluyendo un constructor que toma argumentos. Constructor con argumentos predeterminados. Definición de la clase CreaYDestraye. Definiciones de las funciones miembro de la clase CreaYDestraye. Orden en el que se llama a los constructores y a los destructores. Definición de la clase Tiempo con funciones establecer y obtener. Definiciones de la función miembro de la clase Tiempo, incluyendo a las funciones establecer y obtener. Funciones establecer y obtener que manipulan un dato privado de un objeto.
6.2 6.3 6.4
6.5 6.6 6.7 6.8 6.9 6.10 6.11 6.12 6.13 6.14 6.15 6.16 6.17 6 .18 6.19 6.20
http://alexyniorlls.blogspot.com 23 of 1380.
404 408 411 413
419 421 421 422 425 427 428 429 431 431 433 436 437 438 440 441 443
XXII
lustTaclones
6.21 6.22 6.23 6.24 6.25 6.26 6.27 6.28 6.29 6.30 6.31 6.32 6.33 6.34 6.35 6.36 6.37
Retomo de una referencia a un dato miembro privado. Retomo de una referencia a un dato miembro privado. Retomo de una referencia a un dato miembro privado. Asignación predeterminada de miembros. Diagrama de clases que incluye atributos y operaciones. Lista de manipuladores para cada clase. Archivo de encabezado de la clase Campana. Archivo de encabezado de la clase Reloj . Archivo de encabezado de la clase Persona. Archivo de encabezado de la clase Puerta. Archivo de encabezado para la clase Luz. Archivo de encabezado de la clase Edificio. Archivo de encabezado de la clase BotonElevador. Archivo de encabezado de la clase BotonPiso. Archivo de encabezado de la clase Bitácora. Archivo de encabezado de la clase Piso. Archivo de encabezado de la clase Elevador.
7
Clases: Parte II
7.1 7.2
Definición de la clase Tiempo con funciones miembro const . Definición de las funciones miembro de la clase Tiempo, incluyendo las funciones miembro const. Objetos y funciones miembro const. Inicializador de miembros utilizado para inicializar una constante de un tipo de dato integrado. Intento incorrecto de inicializar una constante de un tipo de dato integrado mediante una asignación. Definición de la clase Pecha. Definición de las funciones miembro de la clase Fecha. Definición de la clase Empleado que muestra la composición. Definición de las funciones miembro de la clase Empleado. incluyendo a un constructor con una lista de inicializadores de miembros. Inicializadores de los objetos miembro. Las funciones amigas pueden acceder a los miembros privados de una clase. Las funciones no amigas/no miembro no tienen acceso a miembros privados. Uso implícito y explícito del apuntador this para acceder a los miembros de un objeto. Definición de la clase Tiempo modificada para permitir llamadas en cascada a funciones miembro. Definición de las funciones miembro de la clase Tiempo modificadas para permitir las llamadas en cascada a funciones miembro. Llamadas en cascada a funciones miembro. Definición de la clase Empleado con un dato miembro static para dar seguimiento al número de objetos Empleado en memoria. Definición de las funciones miembro de la clase Empleado. Dato miembro estático que da seguimiento al número de objetos de una clase. Definición de la clase implementación.
7.3 7.4 7.5 7.6 7.7 7.8 7.9 7.10 7.11 7.12 7.13 7.14 7.15 7.16 7.17 7.18 7.19 7.20
446 446 447 449 452 452 453 454 454 455 456 456 457 458 458 459 461
468
http://alexyniorlls.blogspot.com 24 of 1380.
471 471 473 475 476 479 480 481 482 483 486 488 490 491 492 494 498 499 501 506
XXIII
Ilustraciones
7.21 7.22 7.23 7.24 7.25 7.26 7.27 7.28 7.29 7.30 7.31 7.32 7.33 7.34 7.35 7.36 7.37 7.38 7.39 7.40 7.41 7.42 7.43 7.44 7.45 7.46
Definición de la clase Interfaz. Definición de las funciones miembro de la clase Interfaz. Implementación de una clase proxy. Simulación del elevador. Archivo de encabezado de la clase Edificio. Archivo de implementación de la clase Edificio. Archivo de encabezado de la clase Reloj. Archivo de implementación de la clase Reloj. Archivo de encabezado para la clase Bitácora. Archivo de implementación de la clase Bitácora. Archivo de encabezado para la clase Campana. Archivo de implementación de la clase Campana. Archivo de encabezado para la clase Luz. Archivo de implementación de la clase Luz. Archivo de encabezado de la clase Puerta. Archivo de implementación de la clase Puerta. Archivo de encabezado de la clase BotonElevador. Archivo de implementación de la clase BotonElevador. Archivo de encabezado para la clase BotonPiso. Archivo de implementación de la clase BotonPiso. Archivo de encabezado para la clase Elevador. Archivo de implementación de la clase Elevador. Archivo de encabezado de la clase Piso. Archivo de implementación de la clase Piso. Archivo de encabezado para la clase Persona. Archivo de implementación de la clase Persona.
8
Sobrecarga de operadores: objetos de tipo cadena y de tipo arreglo
8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8
Operadores que pueden sobrecargarse. Operadores que no pueden sobrecargarse. Operadores de inserción y de extracción de flujo sobrecargados. Definición de la clase Arreglo con operadores sobrecargados. Definición de las funciones miembro y friend de la clase Arreglo. Programa de prueba para la clase Arreglo. Definición de la clase Cadena con sobrecarga de operadores. Definición de las funciones miembro y las funciones friend de la clase Cadena. Programa de prueba para la clase Cadena. Definición de la clase Fecha mediante operadores de incremento sobrecargados. Definición de las funciones miembro y friend de la clase Fecha. Programa de prueba para la clase Fecha. Clase string de la biblioteca estándar. Clase vector de la biblioteca estándar. Definición de la clase Complejo. Definición de las funciones miembro de la clase Complejo. Números complejos. Definición de la clase IntOrande.
8.9 8.10 8.11 8.12 8.13 8.14 8.15 8.16 8.17 8.18
http://alexyniorlls.blogspot.com 25 of 1380.
507 507 508 511 511 512 514 514 515 516 519 519 520 520 522 522 524 525 526 526 528 530 535 536 538 539
546 549 549 552 557 558 561 569 571 574 582 583 586 588 592 601 602 603 604
XXIV
lustTaclones
8.19 8.20
Definición de las funciones miembro y amigas de la clase intQrande. Enteros grandes.
9
Programación orientada a objetos: herencia
9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9 9.10 9.11
Ejemplos de herencia. Jerarquía de herencia para MiembrosDeLaComunidad universitaria. Jerarquía de herencia para Formas. Archivo de encabezado de la clase Punto. La clase Punto representa un par de coordenadas x-y. Programa de prueba para la clase Punto. Archivo de encabezado de la clase Circulo. La clase Circulo contiene una coordenada x-y y un radio. Programa de prueba de la clase Circulo. Archivo de encabezado de la clase Circulo2. No es posible acceder a los datos privados de la clase base desde una clase derivada. Archivo de encabezado de la clase Punto2. La clase Punto2 representa un par de coordenadas *->’ como datos protected. Archivo de encabezado de la clase Circulo3. La clase Circulo3 hereda las propiedades y el comportamiento de la clasePunto2 . Es posible acceder a los datos protegidos de la clase base desde una clase derivada. Archivo de encabezado de la clase Punto3. La clase Punto3 utiliza funciones miembro para manipular sus datos private. Archivo de encabezado de la clase Circulo!. La clase Circulo! hereda las propiedades y el comportamiento de la clase Punto3, la cual no proporciona datos protected. Los datos private de la clase base son accesibles a la clase derivada mediante una función miembro public o protected heredada por la clase derivada. Archivo de encabezado de la clase Cilindro. La clase cilindro hereda las propiedades y el comportamiento de la clase Circulo! y redefine a la función miembro obtieneArea. Programa de prueba de la jerarquía Punto/Circulo/Cilindro. Archivo de encabezado de la clase Punto!. La clase base Punto! contiene un constructor y un destructor. Archivo de encabezado de la clase Circulo5. La clase Circuios hereda las propiedades y el comportamiento de la clasePunto! . Orden de llamadas a constructores y destructores. Resumen de accesibilidad de los miembros de la clase base en una clase derivada. Los atributos y las operaciones de las clases BotonElevador y BotonPiso. Diagrama de clases que incorpora la herencia al simulador del elevador. Archivo de encabezado de la clase Boton. Archivo de implementación de la clase Boton; clase base para BotonElevador y BotonPiso. Archivo de encabezado de la clase BotonElevador. Definición de las funciones miembro para la clase BotonElevador. Archivo de encabezado de la clase BotonPi so. Definición de las funciones miembro para la clase BotonPiso.
9.12 9.13 9.14 9.15 9.16 9.17 9.18 9.19 9.20 9.21 9.22 9.23 9.24 9.25 9.26 9.27 9.28 9.29 9.30 9.31 9.32 9.33 9.34 9.35 9.36 9.37 9.38
http://alexyniorlls.blogspot.com 26 of 1380.
604 607
609 612 613 614 615 616 617 618 619 621 622 623 625 625 627 627 629 631 632 633 634 636 638 639 640 643 643 644 645 647 649 651 652 653 653 654 655 656 656
lustraclones
XXV
10
Programación orientada a objetos: polimorfismo
10.1 10.2 10.3 10.4 10.5
Archivo de encabezado de la clase P u n to . La clase Punto representa un par de coordenadas x-y. El archivo de encabezado de la clase C ir c u lo . La clase Circulo que hereda de la clase Punto. Asignación de direcciones de objetos de clase base y clase derivada a apuntadores de clase base y clase derivada. Dirigir un apuntador de clase derivada a un objeto de clase base. Intento de invocar funciones que sólo existen en la clase derivada mediante un apuntador de la clase base. El archivo de encabezado de la clase P u n to declara a la función imprimir como virtual. El archivo de encabezado de la clase Circulo declara a la función imprimir como virtual. Demostración del polimorfismo mediante la invocación de una función virtual de una clase derivada a través de un apuntador de la clase base que apunta a un objeto de la clase derivada. Definición de la interfaz polimórfica para las clases de la jerarquía de Figura. El archivo de encabezado de la clase base abstracta Figura. La clase base abstracta Figura. Archivo de encabezado de la clase P u n to . El archivo de implcmcntación de la clase P u n to . El archivo de encabezado de la clase C ir c u lo . Laclase C i r c u l o que hereda de laclase P u n to . El archivo de encabezado de la clase Cilindro. El archivo de implementación de la clase Cilindro. Demostración del polimorfismo mediante una jerarquía encabezada por una clase base abstracta. El flujo de control de la llamada a una función virtual. Jerarquía de clases para la aplicación polimórfica de nómina de empleados. El archivo de encabezado de la clase Empleado. Archivo de implcmcntación de la clase Empleado. El archivo de encabezado de la clase EmpleadoAsalariado. Archivo de implcmcntación de la clase EmpleadoAsalariado. Archivo de encabezado de la clase EmpleadoPorHoras. El archivo de implementación de la clase EmpleadoPorHoras. Archivo de encabezado de la clase EmpleadoPorComision. Archivo de implementación de la clase EmpleadoPorComision. Archivo de encabezado de la clase EmpleadoBaseMasComision. Archivo de implementación de la clase EmpleadoBaseMasComision. Programa controlador de la jerarquía de la clase Empleado.
10.6 10.7 10.8 10.9
10.10
10.11 10.12 10.13 10.14 10.15 10.16 10.17 10.18 10.19 10.20 10.21 10.22 10.23 10.24 10.25 10.26 10.27 10.28 10.29 10.30 10.31 10.32 10.33
11
Plantillas
11.1 11.2 11.3 11.4
Espccializacioncs de la plantilla de función imprimirArreglo. Plantilla de la clase Pila. Programa de prueba para la plantilla de clase Pila. Piso de un objeto de la plantilla de Pila a una plantilla de función.
662 665 666 667 667 669 671 672 675 675
676 683 684 684 685 686 687 688 690 691 692 697 700 701 701 703 704 705 705 707 708 709 710 711
718
http://alexyniorlls.blogspot.com 27 of 1380.
721 724 726 728
XXVI
12 12.1 12.2 12.3 12.4 12.5 12.6 12.7 12.8 12.9 12.10 12.11 12.12 12.13 12.14 12.15 12.16
12.17 12.18 12.19 12.20 12.21 12.22
lustTaclones
Entrada/salida de flujo en C++ Porción de la jerarquía de plantillas de E/S de flujo. Porción de la jerarquía de plantillas de E/S de flujo que muestra las plantillas principales de procesamiento de archivos. Imprimir la dirección almacenada en una variable c h a r *. Las funciones miembro g e t . p u t y e o f . Introducción de una cadena utilizando c i n con extracción de flujo, en comparación con la introducción de una cadena mediante c i n . g e t . Introducción de datos tipo carácter con la función miembro g e t l i n o de c i n . E/S sin formato mediante las funciones miembro r e a d . g c o u n t y w r i t e . Los manipuladores de flujo hex. o c t . d e c y s e t b a s e . La precisión de los valores de punto flotante. La función miembro w id th de la clase i o s j b a s e . Manipuladores de flujo no parametrizados, definidos por el usuario. Los manipuladores de flujo de estado de formato incluidos en < i o s t ream>. Control de la impresión de ceros a la derecha y puntos decimales para valores d o u b le . Alineación a la izquierda y a la derecha con los manipuladores de flujo l e f t y r i g h t . Cómo imprimir un entero con cspaciamiento intemo y el signo positivo. Uso de la función miembro f i l l y del manipulador de flujo s e t f i l l para cambiar el carácter de relleno para los campos que sean más grandes que los valores a imprimir. El manipulador de flujo show base. Valores de punto flotante mostrados en los formatos predeterminado, científico y fijo. El manipulador de flujo u p p e r c a e e . Los manipuladores de flujo b o o la lp h a y n o b o o la lp h a . La función miembro f l a g s . Evaluación de los estados de error.
73
Manejo de excepciones
13.1
Ejemplo de manejo de excepciones que lanza excepciones al intentar dividir entre cero. Volverá lanzar una excepción. Limpieza de la pila. new devolviendo 0 al fallar. new lanzando la excepción b a d _ a l l o c al fallar. s e t_ n e w _ h a n d le r especificando la función a llamar cuando falle new. El objeto a u t o _ p t r administra la memoria asignada en forma dinámica.
13.2 13.3 13.4 13.5 13.6 13.7
74
Procesamiento de archivos
14.1 14.2 14.3 14.4 14.5 14.6
Jerarquía de datos. La forma en que C++ ve a un archivo de n bytes. La porción de la jerarquía de plantillas de E/S de flujos. Creación de un archivo secuencial. Modos de apertura de archivos. Combinaciones de teclas para indicar el fin del archivo en varios sistemas computacionales populares. http://alexyniorlls.blogspot.com 28 of 1380.
737 741 743 743 745 746 747 749 750 751 753 754 755 756 757 758
759 761 762 763 764 765 767
779 785 788 791 793 795 797 798
808 810 811 812 813 814 815
XXVII
Ilustraciones
14.7 14.8 14.9 14.10 14.11 14.12 14.13 14.14 14.15
Cómo leer e imprimir un archivo secuencia!. Programa de investigación de créditos. La forma en que C++ ve a un archivo de acceso aleatorio. El archivo de encabezado de DatosCliente. La clase DatosCliente representa la información crediticia de un cliente. Creación de un archivo de acceso aleatorio en forma secuencial. Cómo escribir en un archivo de acceso aleatorio. Cómo leer un archivo de acceso aleatorio en forma secuencial. Programa de cuentas bancarias.
75
La clase s t r i n g y el procesamiento de flujos de cadena
15.1 15.2 15.3 15.4 15.5 15.6 15.7 15.8 15.9 15.10 15.11 15.12
Demostración de las operaciones de asignación y concatenación con objetos string. Comparación de objetos tipo string. Demostración de la función miembro substr de string. Uso de la función swap para intercambiar dos objetos string. Impresión de las características de un objeto string. Demostración de las funciones f ind de string. Demostración de las funciones erase y replace. Demostración de las funciones miembro insert de la clase string. Conversión de objetos tipo string a cadenas estilo C y arreglos de caracteres. Uso de un iterador para mostrar un objeto string. Uso de un objeto ostringstream asignado en forma dinámica. Demostración de la entrada desde un objeto istringstream.
76
Programación Web con CG I
16.1 16.2 16.3 16.4
Modelo de una aplicación de tres niveles. Monitor del servidor Apache. El proceso de pedir la página prueba . html al servidor Apache. El cliente interactuando con el servidor y el servidor Web. Paso 1: La petición get, OET /libros/descargas.html HTTP/1.1. Su primera secuencia de comandos CGI. Paso 1: I-a petición get, OET /cgi-bin/horalocal.cgi HTTP/1.1. La salida de horalocal . egi cuando se ejecuta desde la línea de comandos. Cómo recuperar las variables de entorno mediante la función getenv. Cómo leer los datos de entrada de query _ s t r in q . Elementos de un formulario de XHTML. Uso de OET con un formulario de XHTML. Uso de POST con un formulario de XHTML. Portal interactivo para crear una página Web protegida por contraseña. Manejador de portal interactivo. Documento de XHTML que contiene un formulario para enviar datos al servidor mediante el método post. Cómo escribir una cookic. Programa para leer cookies de la computadora del cliente. Documento de XHTML para leer la información de contacto de un usuario. Creación de un archivo del lado del servidor para almacenar los datos de los usuarios. El contenido del archivo de datos clientes . txt.
16.5 16.6 16.7 16.8 16.9 16.10 16.11 16.12 16.13 16.14 16.15 16.16 16.17 16.18 16.19 16.20
http://alexyniorlls.blogspot.com 29 of 1380.
817 819 825 825 826 828 829 832 835
850 853 855 858 858 859 862 865 866 867 869 871 873
880 883 885 885 887 889 891 892 893 896 898 899 901 906 907 910 911 914 916 917 921
XXVIII
lustTaclones
16.21 Programa que muestra una página de inicio de sesión. 16.22 Secuencia de comandos CGI que permite a los usuarios comprar un libro. 16.23 Secuencia de comandos CGI que permite a los usuarios ver el contenido de sus carritos. 16.24 Programa para cerrar sesión. 16.25 E lc o n te n id o d e c a ta lo g o .tx t.
77
Estructuras d© datos
17.1 17.2 17.3 17.4 17.5 17.6 17.7 17.8 17.9 17.10 17.11 17.12 17.13 17.14 17.15 17.16 17.17 17.18 17.19 17.20 17.21 17.22 17.23 17.24 17.25 17.26 17.27
Dos objetos de una clase autorrefercnciada enlazados entre sí. Una representación gráfica de una lista. Definición de la plantilla de clase N o d o L is ta . Definición de la clase de plantilla L i s t a . Manipulación de una lista enlazada. La operación i n e e r t a r A l F r e n t e representada en forma gráfica. La operación i n s e r t a r A l F i n a l representada en forma gráfica. La operación q u i t a r D e l F r e n t e representada en forma gráfica. La operación q u it & r D e lF r e n te representada en forma gráfica. Definición de la plantilla de clase Pila. Un programa simple sobre el uso de pilas. La plantilla de clase P i l a con un objeto L i s t a compuesto. Definición de una plantilla de clase llamada C o la . Programa para procesar colas. La representación gráfica de un árbol de búsqueda binaria. Un árbol de búsqueda binaria. La definición de la plantilla de clase N odoA rbol. Definición de la plantilla de clase A r b o l. Creación y recorrido de un árbol binario. Un árbol de búsqueda binaria. Un árbol de búsqueda binaria con 15 nodos. Comandos simples. Programa de Simple que determina la suma de dos enteros. Programa de Simple que encuentra el mayor de dos números. Calcular los cuadrados de varios enteros. Cómo escribir, compilar y ejecutar un programa en lenguaje Simple. Las instrucciones de LMS producidas después de la primera pasada del compilador. 17.28 Tabla de símbolos para el programa de la figura 17.27. 17.29 Código no optimizado del programa de la figura 17.27. 17.30 Código optimizado para el programa de la figura 17.27.
18
Bits, caracteres, cadenas y estructuras
18.1
Posible alineación de almacenamiento para una variable de tipo E jem p lo , mostrando un área indefinida en la memoria. Simulación de alto rendimiento para barajar y repartir cartas. La salida del programa de simulación de alto rendimiento para barajar y repartir cartas. Operadores a nivel de bits. Cómo imprimir un entero sin signo en bits.
18.2 18.3 18.4 18.5
http://alexyniorlls.blogspot.com 30 of 1380.
922 929 931 935 937
942 945 946 947 948 952 956 957 958 959 961 962 964 966 967 969 970 970 971 974 976 980 987 988 988 988 989 992 992 997 997
1000 1003 1005 1007 1008 1009
Ilustraciones
XXIX
18.6 18.7 18.8 18.9 18.10 18.11 18.12 18.13 18.14 18.15 18.16 18.17
1010 1011 1013 1013 1014 1014 1016 1016 1017 1019 1020
18.18 18.19 18.20 18.21 18.22 18.23 18.24 18.25 18.26 18.27 18.28 18.29 18.30 18.31 18.32 18.33 18.34 18.35 18.36 18.37 18.38 18.39
Resultados de comparar dos bits con el operador AND a nivel de bits (&). Los operadores AND, OR inclusivo, OR exclusivo y complemento a nivel de bits. Ejemplo de la salida del programa de la figura 18.7. Combinación de dos bits con el operador OR inclusivo a nivel de bits ( |) . Combinación de dos bits con el operador OR exclusivo a nivel de bits (A). Operadores de desplazamiento a nivel de bits. Operadores de asignación a nivel de bits. Precedencia y asociatividad de operadores. Uso de campos de bits para almacenar un juego de cartas. Ejemplo de la salida del programa de la figura 18.14. Las funciones de la biblioteca para el manejo de caracteres. Las funciones i s d i g i t , i s a l p h a . is a ln u m c i s x d i g i t para manejo de caracteres. Las funciones is l o w e r , i s u p p e r . t o l o w e r y t o u p p e r para manejo de caracteres. Las funciones i s s p a c e . i s c n t r l , i s p u n c t , i s p r i n t n e i s g r a p h para manejo de caracteres. Las funciones de conversión de cadenas de la biblioteca de utilerías generales. 1.a función a t o f de conversión de cadenas. La función a t o l de conversión de cadenas. La función a t o l de conversión de cadenas. La función s t r t o d de conversión de cadenas. La función s t r t o l de conversión de cadenas. La función s t r o t o u l de conversión de cadenas. Las funciones de búsqueda de la biblioteca para manejo de caracteres. La función s t r e h r para buscar en cadenas. La función s t r e s p n para buscar en cadenas. La función s t r p b r k para buscar en cadenas. La función s t r r c h r para buscar en cadenas. La función s t r s p n para buscar en cadenas. La función s t r s t r para buscar en cadenas. Las funciones de memoria de la biblioteca para manejo de cadenas. La función memepy para manejo de memoria. La función memmove para manejo de memoria. La función mememp para manejo de memoria. La función memchr para manejo de memoria. La función m em set para manejo de memoria.
19
El preprocesador
19.1
Las constantes simbólicas predefinidas.
20
Temas relacionados con el código heredado de C
20.1 20.2 20.3 20.4 20.5 20.6
El tipo y las macros definidas en el encabezado < c s td a r g > . Uso de listas de argumentos con longitud variable. Uso de los argumentos de la línea de comandos. Uso de las funciones e x i t y a t e x i t . Las señales definidas en el encabezado < c s ig n a l> . Uso del manejo de señales. http://alexyniorlls.blogspot.com 31 of 1380.
1021 1023 1025 1026 1027 1027 1028 1029 1030 1030 1031 1032 1033 1034 1034 1035 1036 1037 1038 1038 1039 1040 1041
1053 1060
1065 1067 1068 1070 1074 1076 1076
XXX
20.7 20.8 20.9 20.10
lustTaclones
Uso de goto. Imprimir el valor de una unión en ambos tipos de datos miembro. Uso de una unión anónima. Ejemplo de salida para el ejercicio 20.8.
21
Biblioteca estándar de plantillas (STL)
21.1 21.2 21.3 21.4 21.5 21.6 21.7 21.8 21.9 21.10 21.11 21.12 21.13 21.14 21.15
Clases contenedoras de la Biblioteca estándar. Funciones comunes de los contenedores de la STL. Archivos de encabezado de los contenedores de la Biblioteca estándar. Elementos typedef encontrados en los contenedores de primera clase. Iteradores de flujos de entrada y salida. Categorías de iteradores. Jerarquía de categorías de iteradores. Tipos de iteradores soportados por cada contenedor de la Biblioteca estándar. Elementos typedef de los iteradores. Operaciones de iteradores para cada tipo de ¡terador. Algoritmos alteradores de secuencia. Algoritmos no alteradores de secuencia. Algoritmos numéricos del archivo de encabezado
. La plantilla de clase vector de la Biblioteca estándar. Funciones de manipulación de elementos de la plantilla de clase vector de la Biblioteca estándar. Tipos de excepciones de la STL. Plantilla de clase liet de la Biblioteca estándar. Plantilla de clase deque déla Biblioteca estándar. Plantilla de clase multiset de la Biblioteca estándar. Plantilla de clase set de la Biblioteca estándar. Plantilla de clase multimap de la Biblioteca estándar. Plantilla de clase map de la Biblioteca estándar. Clase de adaptador stack de la Biblioteca estándar. Plantilla de clase del adaptador queue de la Biblioteca estándar. La clase de adaptador priority_queue de la Biblioteca estándar. IjOS algoritmos £111. £ill_n, genérate y generate_n. Los algoritmos equal.mismatch y lexicographical_compare. Los algoritmos remo ve. remove_if, remove_copy y remove_copy_if . Los algoritmos replace. replace_i£, replace_copy y replace_copy_i£. Algoritmos matemáticos de la Biblioteca estándar. Algoritmos básicos de búsqueda y ordenamiento de la Biblioteca estándar. Demostración de swap. iter_swap y swap ranges. Demostración de copy_backward, merge, unique y reverse. Demostración de inplace_merge. unique_copy y reverse_copy. Operaciones set de la Biblioteca estándar. Los algoritmos lowerbound. upper_bound y equal_range. Uso de las funciones de la Biblioteca estándar para realizar el algoritmo heapsort. Los algoritmos min ymax. Los algoritmos que no se cubren en este capítulo. La dase bit set y la Criba de Eratóstenes.
21.16 21.17 21.18 21.19 21.20 21.21 21.22 21.23 21.24 21.25 21.26 21.27 21.28 21.29 21.30 21.31 21.32 21.33 21.34 21.35 21.36 21.37 21.38 21.39 21.40
http://alexyniorlls.blogspot.com 32 of 1380.
1079 1082 1083 1089
1090 1094 1095 1096 1097 1098 1100 1100 1101 1101 1102 1104 1104 1104 1106 1109 1112 1113 1118 1120 1123 1124 1126 1129 1131 1132 1 134 1136 1139 1142 1144 1148 1150 1152 1155 1157 1160 1163 1165 1166 1170
Ilustraciones
XXXI
21.41 Objetos función de la Biblioteca estándar. 21.42 Objeto función binaria.
1172 1173
22
Otros temas
22.1 22.2 22.3 22.4
Demostración del operador const_cast. Demostración del operador reinterpret_cast. Demostración del uso de los espacios de nombres. Las palabras reservadas de los operadores como alternativas al uso de sus símbolos. Demostración de las palabras reservadas de los operadores. Constructores con un solo argumento y conversiones implícitas: arreglo.h. Constructores con un solo argumento y conversiones implícitas: arreglo . cpp. Constructores con un solo argumento y conversiones implícitas: f ig22_08 . cpp. Demostración de un constructor explicit: arreglo.h. Demostración de un constructor explicit: arreglo.cpp. Demostración de un constructor explicit: fig22_ll.cpp. Demostración de un miembro de datos mutable. Demostración de los operadores . * y -> *. Demostración de la herencia múltiple: basel .h. Demostración de la herencia múltiple: base2 .h. Demostración de la herencia múltiple: derivada .h. Demostración de la herencia múltiple: derivada . cpp. Demostración de la herencia múltiple: £ig22_18.cpp. Herencia múltiple para formar la clase iostream. Intento de llamar polimórfícamente a una función con herencia múltiple. Uso de las clases base virtual. Espacios de nombres para el ejercicio 22.10.
22.5 22.6 22.7 22.8 22.9 22.10 22.11 22.12 22.13 22.14 22.15 22.16 22.17 22.18 22.19 22.20 22.21 22.22
A
Tabla de precedencia de los operadores
A. 1
Tabla de precedencia de los operadores.
B
Conjunto de caracteres ASCII
B. 1
El conjunto de caracteres ASCII.
C
Sistemas numéricos
C. 1 C.2 C.3 C.4 C.5 C.6 C.7 C.8 C.9 C. 10
Dígitos de los sistemas numéricos binario, octal, decimal y hexadecimal. Comparación de los sistemas binario, octal. decimal y hexadecimal. Valores posicionales en el sistema numérico decimal. Valores posicionales en el sistema numérico binario. Valores posicionales en el sistema numérico octal. Valores posicionales en el sistema numérico hexadecimal. Equivalentes en decimal, binario, octal y hexadecimal. Conversión de un número binario en decimal. Conversión de un número octal en decimal. Conversión de un número hexadecimal en decimal.
D
Recursos de C++ en Internet y Web http://alexyniorlls.blogspot.com 33 of 1380.
1183 1184 1186 1187 1190 1191 1192 1193 1193 1195 1195 1196 1198 1199 1201 1202 1202 1203 1204 1206 1206 1208 1212
1214 1214
1216 1216
1217 1219 1219 1219 1220 1220 1221 1221 1223 1223 1223
1230
XXXII
lustTaclones
E
Introducción a XHTML
E1 E2 E3 E4 E5 E6 E7 E8 E9 E 10 E li E 12 E 13 E 14
El primer ejemplo de XHTML Los elementos de encabezado, de hl hasta h6. Vínculos hacia otras páginas Web. Creación de un vínculo a una dirección de correoelectrónico. Cómo colocar imágenes en archivos de XHTML. Uso de imágenes como anclas de vínculos. Inserción de caracteres especiales en XHTML. Listas desordenadas en XHTML. Listas anidadas y ordenadas en XHTML. Tabla de XHTML. Tabla compleja de XHTML. Formulario simple con campos ocultos y un cuadro de texto. Formulario con áreas de texto, cuadros de contraseñay casillas de verificación. Formulario que incluye botones de opción y listas desplegables.
F
Caracteres especiales XHTML
F.l
Caracteres especiales XHTML.
http://alexyniorlls.blogspot.com 34 of 1380.
123ó 1238 1241 1242 1244 1245 1247 1249 1251 1252 1255 1257 1260 1263 1266
1274 1274
Prefacio
¡Bienvenidos a ANSI/ISO C++ Estándar! En Dcitcl & Associates, escribimos libros de texto de nivel universitario, así como libros profesionales, sobre lenguajes de programación, y trabajamos mucho para que los libros publicados se mantengan actualizados a través de un flujo constante de nuevas ediciones. Escribir la cuarta edición de este libro fue un placer. Este libro y el material de apoyo inclu yen todo lo que los maestros y los estudiantes necesitan para tener una experiencia educativa intere sante, informativa, entretenida y desafiante con respecto a C++. Esta publicación concuerda con la última versión del estándar ANSI/ISO de C++ (uno de los estándares de la comunidad de compu tación más importantes del mundo) y con el diseño orientado a objetos de la última versión de UML (Lenguaje Unificado para Modelado) del Object Management Group (OMG). Pusimos a tono la es critura, la pedagogía, nuestro estilo para codificar, el paquete de accesorios del libro, y además in cluimos un análisis importante de las aplicaciones de desarrollo para Internet y Web. También, en el capítulo 1, le ofrecemos una sección integral llamada Recorrido a través del libro, que ayudará a los maestros, a los estudiantes y a los profesionales a darse cuenta de la rica cobertura que este libro ha ce de la programación orientada a objetos con C++. del diseño orientado a objetos con UML y de la programación en general. Si está evaluando el libro, consulte las páginas 44 a 56 de la sección Re corrido a través del libro. Ya sea usted maestro, estudiante, profesional experimentado o programador principiante, este li bro tiene mucho que ofrecerle. C++ es un lenguaje de programación de clase mundial que se utiliza para desarrollar aplicaciones de cómputo de alto rendimiento. En nuestro caso, comparamos cuida dosamente nuestro borrador con el documento estándar ANSI/ISO de C++,1el cual define a C++, y tuvimos el privilegio de contar con Stevc Clamagc como revisor, quien labora en Sun Microsystems y quien encabeza el comité J 16 de ANSI, responsable de la evolución del C++ estándar. Como re sultado. los programas que genere estudiando este texto deben adaptarse fácilmente a cualquier com pilador compatible con ANSI/ISO. En este prefacio planteamos información general de Cómo programar en C++, la cuarta edición de este libro, la cual ayuda a los maestros a maximizar la experiencia relacionada con el aprendiza 1. Puede disponer de una copia electrónica en formato PDF del documento estándar de C++, número 1SO-IEC 148821998. por una módica cantidad, en w * b s t o r « . a n a l . o r g / a n s i d o c s t o r a / d e f a u l t . a s p . asimismo si k> desea puede obtener una copia impresa.
http://alexyniorlls.blogspot.com 35 of 1380.
XXXIV
Prefacio
je de C++ de sus estudiantes. Explicamos las convenciones que utilizamos, tal como la presentación de la sintaxis del código de los ejemplos, para “lavar código”, y para resaltar segmentos importantes de código, lo que ayuda a los estudiantes a enfocar su atención en los conceptos clave que introducimos en cada capítulo. También planteamos las nuevas características de la cuarta edición de este libro, in cluyendo el primer tratamiento que hicimos sobre arreglos y cadenas como objetos, un tratamiento mejorado sobre programación orientada a objetos, desarrollo de aplicaciones Web con CGI, el ejem plo práctico mejorado del diseño orientado a objetos (DOO) con UML, sobre la simulación de un elevador, y el amplio uso de los diagramas UML que se han actualizado de acuerdo con la versión 1.4 de los estándares de UML. El libro incluye un CD con el software de Microsoft Visual C++® 6.0 Introductory Edition. Pa ra que los programadores principiantes obtengan soporte adicional, ofrecemos seis de nuestras pu blicaciones Dive -Into ™ Series para que las descarguen gratuitamente de www.deitel.com. * Es te material, en inglés, explica cómo compilar, ejecutar y depurar programas en C++, utilizando di versos ambientes de desarrollo populares de C++. Además, en este sitio damos una idea general del paquete completo de materiales auxiliares para maestros y estudiantes que utilicen la cuarta edición de este libro. Dichos materiales, también en in glés, incluyen un CD llamado Instructor’s Resource, el cual contiene las soluciones a los ejercicios planteados en los capítulos del libro, así como el archivo Test-Item que contiene cientos de pregun tas de opción múltiple y sus respectivas respuestas. Para los maestros que deseen mantener sesiones cerradas de laboratorio (o asignar tareas altamente estructuradas), les proporcionamos la opción de adquirir el manual C++ in the lab. Esta publicación incluye actividades previas al laboratorio, ejer cicios de laboratorio y actividades posteriores al laboratorio, que han sido cuidadosamente elabo radas. Este prefacio también analiza la cuarta edición del C++ Multimedia Cyber Classroom, que es la versión multimedia, en inglés, de la versión original de este libro. Esta herramienta de aprendiza je contiene “recorridos” con audio a través de los programas, animaciones sobre la ejecución de pro gramas y cientos de ejercicios y soluciones. Analizamos diversas herramientas Deitel™ de aprendizaje en línea, incluyendo una explica ción del contenido de Blackboard, CourseCompass y WebCT de la serie Course Management Sys tems, cada uno de los cuales apoya el material de este libro. Este libro fue revisado por 52 distinguidos académicos y profesionales de la industria; men cionamos sus nombres y en dónde laboran para que tenga una idea de qué tan cuidadosamente examinaron el libro. FJ prefacio concluye con información sobre los autores y sobre Deitel & Asso ciates, Inc. Cuando lea este libro, si surge alguna pregunta, envíenos un correo electrónico a del ta 10deitel.can; le responderemos inmediatamente. Visite con regularidad nuestro sitio Web, www.deitel.com.y asegúrese de registrarse para el correo de noticias DeíTEL™ Ruyz On une , en www.deitel.com/newsletter/8ubscribe.Nosotros utilizamos el sitio Web y las noti cias para mantener al día a nuestros lectores, con respecto a las publicaciones y servicios Dfjtel.
Características de Cóm o programar en C++, cuarta edición Este libro contiene, entre otras características, las siguientes: Resaltado de código y de entradas de usuario En este libro, hemos agregado mucho código resaltado. Al revisar nuestro código, eliminamos la ma yoría de los fragmentos de código “redundante” que aparecían en el texto de la tercera edición. Di •
Todo el material complementario referido en este prefacio, disponible en los sitios Web mencionados, está en idio ma inglés y es responsabilidad de sus autores.
http://alexyniorlls.blogspot.com 36 of 1380.
Prefacio
XXXV
chos fragmentos los mantuvimos en la primera parte del libro como una herramienta pedagógica que ayudara a los principiantes. Queremos que el lector vea, en contexto, todas las características del nuevo código, por lo que en el capítulo 3 nuestras revisiones al código simplemente hacen referen cia a los números de línea de los segmentos del nuevo código que se encuentran en los programas fuente. Para facilitar a los lectores la detección de los segmentos destacados, los hemos resaltado. Esta característica ayuda a los estudiantes a revisar el material rápidamente, cuando se preparan para algún examen o laboratorio. “IAvado de código” Lavado de código es el término que utilizamos para aplicar comentarios, para utilizar identificadores importantes, para aplicar sangría y espaciado vertical para separar unidades importantes de un programa. Este proceso da como resultado programas que son más fáciles de leer y que sirven como autodocumentación. Hemos hecho un amplio “lavado” a todo el código de los programas fuente de este texto, del manual de laboratorio, de los accesorios y del Cyber Classmom. Introducción inicial a la biblioteca estándar: objetos stringy vector Los lenguajes de programación orientada a objetos por lo general ofrecen la capacidad de crear obje tos string y array utilizando una instancia de las bibliotecas de clases o de clases definidas por el programador. También es importante que los estudiantes de C++ se familiaricen con el estilo C, arre glos y cadenas basados en apuntadores, debido a la gran cantidad de código heredado de C y del pri mer C++ que encontrarán en la industria. En este libro mostramos los tres medios para crear cadenas y arreglos. En los capítulos 4 y 5 mostraremos el tradicional estilo C. basado en apuntadores, para arreglos y cadenas, respectivamente. En el capítulo 8, creamos nuestras propias clases definidas por el usuario Arreglo y Cadena. Al final del capítulo 8 introducimos las bibliotecas de clases vec tor y string, las cuales explicamos detalladamente en los capítulos 15 y 21 respectivamente. El material del capítulo 15, que trata sobre string, podría enseñarse en cualquier momento, después de cubrir el capítulo 8. El material del capítulo 21, que trata sobre vector (y sobre otros aspectos del STL), también podría enseñarse después del capítulo 8, aunque nosotros recomendamos que vea primero el capítulo 11, Plantillas. El proceso para ponera punto la programación orientada a objetos (capítulos 9 y 10) Ésta es una de las mejoras más importantes de esta nueva edición. Hemos realizado una actualiza ción muy precisa a los capítulos 9 y 10. I
XXXVI
Prefacio
y utilizando las funciones miembro públicas de la clase base (que fueron heredadas por la clase derivada) para manipular los datos privados de la clase base, a partir de la clase derivada. Seguimos la quinta parte con una jerarquía de clase de tres niveles que emplea las técnicas de ingeniería de software introducidas al principio del capítulo, y termina éste con una explicación de los tres tipos de herencia aceptados por C++, y con una explicación general de la ingeniería de software con he rencia. Pedagogía rediseñada para el capítulo 10, programación orientada a objetos: polimorfismo. El nuevo capítulo 10 se basa en los conceptos de herencia que presentamos en el capítulo 9, y se en foca en las relaciones entre clases de una jerarquía de clases. El capítulo 10 utiliza una secuencia de cuatro ejemplos para presentar las poderosas capacidades de procesamiento que estas relaciones per miten. Comenzamos con un ejemplo que ¡lustra la relación “es un” entre un objeto de clase deriva da y su tipo de clase base. Esta relación permite que al objeto de clase derivada se le trate como un objeto de su clase base. Mostramos que podemos dirigir un apuntador de clase base hacia un objeto de clase derivada y llamar a las funciones de la clase base en esc objeto. En nuestro segundo ejem plo demostramos que lo contrario no es posible (un objeto de clase base no se considera como un objeto del tipo de la clase derivada), y mostramos que los errores de compilación ocurren si un pro grama intenta manipular de esta manera un objeto de clase base. Nuestro tercer ejemplo demuestra que las únicas funciones que pueden ser llamadas mediante un apuntador de clase base son aquellas definidas por la clase base. El ejemplo muestra que intentar llamar funciones que sean sólo de cla ses derivadas da como resultado mensajes de error. El último ejemplo de la secuencia introduce el polimorfismo con funciones virtuales, lo cual permite a un programa procesar objetos de clases re lacionadas mediante una jerarquía de clases como objetos de su tipo de clase base. Cuando se llama a una función virtual por medio de un apuntador (o referencia) de clase base, quien es invocada es la versión específica de la clase derivada de esa función. El capítulo continúa con un ejemplo prác tico sobre polimorfismo en el que procesamos un arreglo de objetos que tienen en común una clase base abstracta, la cual contiene el conjunto de funciones comunes a cada clase de la jerarquía. Des pués de este ejemplo continuamos con una explicación exhaustiva sobre cómo funciona “tras bam balinas" el polimorfismo. Concluimos con un ejemplo práctico que demuestra cómo un programa que procesa objetos de manera polimórfica puede realizar procesamiento de tipo específico mediante la determinación, al tiempo de ejecución, del tipo de objeto que actualmente está siendo procesado. Desarrollo de aplicaciones Web con CGI El nuevo capítulo 16, Programación Web con CGI, contiene todo lo que los lectores necesitan para comenzar a desarrollar sus propias aplicaciones basadas en Web, las cuales ejecutarán en Internet.2 Los lectores aprenderán a construir aplicaciones conocidas como de n capas, en las cuales la funcio nalidad provista por cada capa puede distribuirse ya sea en diferentes computadoras, a través de In ternet, o ejecutarse en la misma computadora. En particular, nosotros construimos una aplicación de tres capas para una librería en línea. La información de la librería se almacena en la capa de datos de la aplicación. En aplicaciones industriales, la capa de datos por lo general es una base de datos co mo Oracle, Microsoft ®SQL Server o MySQL. Por simplicidad, para acceder a esta información uti lizamos archivos de texto y empleamos las técnicas de procesamiento de archivos del capítulo 14. El usuario introduce peticiones y recibe respuestas en la capa cliente de la aplicación, la cual es gene ralmente una computadora que ejecuta un navegador como Microsoft Internet Explorer o Netscape®. Por supuesto, los navegadores Web saben cómo comunicarse con sitios Web a través de Internet. La 2. Existen otras tecnologías para desarrollar aplicaciones basadas en Web. Quienes trabajan en Java utilizan servlets de Java y JavaServer Pagcs. Quienes trabajan en plataformas de Windows utilizan Active Server Pages (ASP). Pa ra este libro nosotros elegimos CGI ponqué tanto el C++ estándar como el CGI son plataformas independientes.
http://alexyniorlls.blogspot.com 38 of 1380.
Prefacio
XXXVII
capa media contiene tanto un servidor Web como un programa en C++ específico de la aplicación (por ejemplo, nuestra aplicación de la librería). El servidor Web se comunica con el programa en C++ (y viceversa) a través del protocolo CGI (Interfaz Común de Puerta de Enlace). Nosotros utili zamos el servidor Apache HTTP como nuestro servidor Web, el cual se puede descargar gratuita mente de wvw.apache.org. El servidor Web sabe cómo comunicarse con la capa cliente a través de Internet mediante el Protocolo de Transferencia de Hipertexto (HTTP). Analizamos el papel cru cial que desempeña el servidor Web en la programación Web y proporcionamos un ejemplo sencillo que solicita una página Web de un servidor Web. También explicamos el CGI, y la forma en que per mite que un servidor Web se comunique con la capa superior y con scripts CGI (es decir, con nues tros programas en C++). Nosotros proporcionamos un ejemplo sencillo que obtiene la hora y la fe cha desde el servidor y las presenta en un navegador. En nuestros ejemplos basados en formularios utilizamos botones, campos para contraseñas, casillas de verificación y campos de texto. Presenta mos un ejemplo de un portal interactivo para una agencia de viajes, el cual muestra tarifas de vuelos a distintas ciudades. Los miembros del club de viaje pueden registrarse y ver las tarifas con descuen tos. También explicamos diversos métodos para almacenar datos específicos del cliente, los cuales incluyen campos ocultos (es decir, información almacenada en una página Web, pero no representa da por el navegador Web) y cookies (pequeños archivos de texto que el navegador almacena en la máquina del cliente). Los ejemplos del capítulo concluyen con un ejemplo práctico de e-business co rrespondiente a una librería en línea que permite a los usuarios agregar libros a un carrito electróni co de compras. Este ejemplo práctico contiene diversos scripts CGI que interactúan entre sí para for mar una aplicación completa. 1.a librería en línea está protegida con una contraseña, por lo que los usuarios primero deberán registrarse para poder acceder a ella. XHTML El Consorcio World Wide Web (W3C) declaró al Lenguaje de Marcado de Hipertexto (HTML) co mo un legado de la tecnología que no sufrirá mayor desarrollo. HTML está siendo reemplazado por el Lenguaje de Marcado de Hipertexto Extendido (XHTML); una tecnología basada en XML que rá pidamente se está convirtiendo en el estándar para describir contenido Web. Nosotros utilizamos XHTML en el capítulo 16 y el apéndice E presenta una introducción a XHTML. Si usted no está fa miliarizado con XHTML. vea el apéndice E antes de leer el capítulo 16. Lenguaje Unificado de Modelado (UML) FJ Lenguaje Unificado de Modelado (UML) se ha convertido en el lenguaje de modelado gráfico preferido para el diseño de sistemas orientados a objetos. En la edición anterior de este libro utiliza mos UML solamente en secciones opcionales, y empleamos segmentos convencionales de diagra mas de flujo y diagramas de herencia para reforzar las explicaciones. Ahora hemos transformado por completo los diagramas del libro para que sean compatibles con UML 1.4. En particular, hemos ac tualizado todas las cifras del ejemplo práctico correspondiente a la simulación UML/DOO de un ele vador; convertimos todos los diagramas de flujo del capítulo 2. Estructuras de control, en diagramas de actividad UML; y convertimos todos los diagramas de herencia de los capítulos 9, 12, 14 y 22 en diagramas de clase UML. Esta cuarta edición cuidadosamente puso a punto los ejemplos prácticos opcionales (pero ampliamente recomendados) que presentamos acerca del diseño orientado a objetos utilizando UML. En el ejemplo práctico, implcmcntamos por completo la simulación de un elevador. En las secciones “Acerca de los objetos” que se encuentran al final de los capítulos 1 a 7 y 9, presentamos una introducción paso a paso sobre el diseño orientado a objetos mediante UML. Presentamos un subconjunto simplificado y conciso del UML que guiará al lector a través de su primera experiencia con el diseño, la cual está preparada para programadores o diseñadores orientados a objetos que apchttp://alexyniorlls.blogspot.com 39 of 1380.
XXXVIII
Prefacio
ñas inician. El ejemplo práctico está completamente resuelto. No se trata de un ejercicio, sino de una experiencia completamente educativa que concluye con un detallado recorrido por el código de C++. En cada uno de los primeros cinco capítulos nos concentramos en la metodología “convencional" de la programación estructurada, ya que los objetos que construimos utilizarán estos pedazos de pro gramas estructurados. Concluimos cada capítulo con una sección llamada “Acerca de los objetos”, en las que presentamos una introducción a la orientación a objetos mediante el UML. Estas secciones ayudarán a los estudiantes a desarrollar una forma de pensar orientada a objetos, para que puedan utilizar de inmediato los conceptos de programación orientada a objetos que comenzarán a aprender en el capítulo 6. En la primera de estas secciones (final del capítulo 1), introducimos conceptos bási cos (es decir, “pensamiento en objetos”) y terminología (es decir, "expresión en objetos”). En las secciones opcionales “Acerca de los objetos” que se encuentran al final de los capítulos 2 a 5, con sideramos temas más importantes conforme abordamos problemas que suponen un reto con las téc nicas del diseño orientado a objetos (DOO). En dichas secciones analizamos un problema típico que requiere del desarrollo de un sistema, que se determinen los objetos necesarios para ¡mplcmcntar di cho sistema, así como los atributos que estos objetos deben tener, el comportamiento que estos ob jetos deben mostrar y especificar cómo deben ¡nteractuar entre sí para satisfacer los requerimientos del sistema. Nosotros logramos todo esto incluso antes de explicar cómo desarrollar programas en C++ orientados a objetos. En las secciones “Acerca de los objetos” que aparecen al final de los ca pítulos 6, 7 y 9, desarrollamos una ¡mplcmcntación en C++ para un sistema orientado a objetos que diseñamos en los primeros capítulos. Este proyecto nos permitió incorporar temas que no explica mos en ninguna otra sección del libro, esto es, la interacción de objetos, una explicación detallada sobre los manejadores, la filosofía de utilizar referencias o apuntadores, y el uso de declaraciones forward para evitar problemas de inclusión circular. Este ejemplo práctico ayudará a que los estu diantes se preparen para los tipos de proyectos importantes que encontrarán en la industria. Nosotros empleamos un proceso de diseño orientado a objetos cuidadosamente desarrollado, para producir un diseño basado en UML para el simulador de un elevador. A partir de este diseño creamos una implementación importante en C++ utilizando conceptos clave de programación, la cual incluyó clases, objetos, encapsulado, visibilidad, composición y herencia. Un poco más sobre el ejemplo práctico (opcional) correspondiente a la simulación de un elevador Este ejemplo práctico se introdujo en la tercera edición de este libro, y fue cuidadosamente ajustado para la cuarta edición. Hicimos que todos los diagramas UML fueran compatibles con la versión 1.4, reorganizamos muchos de los diagramas para hacerlos más claros, hicimos un lavado de código pa ra toda la solución C++ que presentamos en el libro y pusimos a punto las explicaciones para una mayor claridad y precisión. El ejemplo práctico fue remitido a un distinguido equipo de revisores de DOO/UML, el cual incluyó líderes en el campo provenientes de Rational (los creadores del UML) y de Object Management Group (responsables de mantener y evolucionar el UML). En el capítulo 2, comenzamos la primera fase del diseño orientado a objetos (DOO) para el simu lador de un elevador, identificando las clases necesarias para ¡mplcmcntar dicho simulador. También introducimos el ejemplo del uso del UML, los diagramas de clase y de objeto, y los siguientes con ceptos: asociaciones, multiplicidad, composición, roles y vínculos. En el capítulo 3 determinamos muchos de los atributos de clases necesarios para implementar el simulador. También introducimos la gráfica de estado de UML y los diagramas de actividad, así como los eventos y acciones que se rela cionan con estos diagramas. En el capítulo 4, determinamos muchas de las operaciones (comporta mientos) de las clases en la simulación del elevador. También presentamos el diagrama de secuencia UML y el concepto de mensajes enviados entre objetos. En el capítulo 5 determinamos la colabora ción (conjuntos de interacciones entre objetos del sistema) necesaria para implementar el sistema del elevador y representar estas interacciones mediante el diagrama de colaboración UML.. También in http://alexyniorlls.blogspot.com 40 of 1380.
Prefacio
XXXIX
cluimos una bibliografía y una lista de recursos en Internet y en Web que contienen las especifica ciones de UML 1.4 y otros materiales de referencia, recursos generales, manuales, preguntas más frecuentes, artículos, documentos oficiales y software. En el capítulo 6, utilizamos el diagrama de clase UML desarrollado en secciones anteriores para bosquejar los archivos de encabezados de C++ que definen nuestras clases. También introducimos el concepto de identificadores a objetos del siste ma, y comenzamos a estudiar cómo implementar ¡dentificadores en C++. En el capítulo 7, presenta mos un programa completo en C++ correspondiente al simulador de un elevador (aproximadamente 1200 líneas de código) y un recorrido detallado a través del código. El código surge directamente del diseño basado en UML que creamos en secciones anteriores, y emplea nuestras mejores prácticas de programación. También explicamos la asignación dinámica de memoria, la composición, la inte racción de objetos vía ¡dentificadores, y cómo utilizar declaraciones forward para evitar los proble mas de inclusión circular. En el capítulo 9, actualizamos el diseño y la implemcntación de la simu lación del elevador para incorporar herencia y sugerir modificaciones adicionales. Biblioteca estándar de plantillas (STL) Es probable que éste sea uno de los capítulos más importantes del libro, en términos del valor que le dé a la reutilización de software. La STL define componentes poderosos, basados en plantillas y componentes rcutilizablcs que ¡mplcmcntan muchas estructuras de datos y algoritmos comunes, uti lizados para procesar dichas estructuras de datos. El capítulo 21 presenta la STL y explica sus tres componentes clave: contenedores, iteradores y algoritmos. Los contenedores STL son estructuras de datos capaces de almacenar objetos de cualquier tipo de dato. También mostramos que existen tres categorías de contenedores: contenedores de primera clase, adaptadores y contenedores cercanos. Los iteradores STL, que son similares a los apuntadores (pero más seguros), se utilizan para mani pular los elementos contenedores STL. De hecho, los arreglos estándar pueden manipularse como contenedores STL, si se utilizan apuntadores estándar como iteradores. Mostramos que manipu lar contenedores con iteradores es una práctica conveniente y proporciona un enorme poder de expre sión cuando se combina con algoritmos STL; en algunos casos, se reducen muchas líneas de código a una sola instrucción. Los algoritmos STL son funciones que realizan la manipulación común de datos, tal como búsqueda, clasificación, comparación de elementos (o de estructuras completas de da tos), etcétera. Existen aproximadamente 70 algoritmos ¡mplcmcntados en la STL; éstos incluyen operaciones comunes de los contenedores, como búsqueda de un elemento, clasificación, compara ción, eliminación, reemplazo de elementos y muchas más. La mayoría de estos algoritmos utilizan iteradores para acceder a los elementos contenedores. Nosotros mostramos que cada contenedor de primera clase soporta tipos específicos de iteradores, algunos de los cuales son más poderosos que otros. El tipo de iterador soportado por un contenedor determina si el contenedor puede utilizarse con un algoritmo específico. Los iteradores encapsulan el mecanismo utilizado para acceder a los elementos contenedores. Este encapsulado permite que muchos de los algoritmos STL se apliquen a una variedad de contenedores, sin tomar en cuenta la implemcntación subyacente del contenedor. Mientras los iteradores de un contenedor soporten los requerimientos mínimos del algoritmo, dicho algoritmo puede procesar los elementos de esc contenedor. Esto también permite que los programadores generen algoritmos que puedan procesar los elementos de diversos tipos de contenedores. Una ventaja de la STL es que los programadores pueden reutilizar los contenedores, iteradores y algorit mos STL para implementar representaciones y manipulaciones comunes de datos. Esta rcutilización ahorra tiempo y recursos importantes para desarrollo.
Método de enseñanza Nuestra ¡dea es que este libro sea utilizado a niveles principiantes e intermedios. No hemos intenta do cubrir cada una de las características del C++ estándar. C++ reemplazó a C como el lenguaje de http://alexyniorlls.blogspot.com 41 of 1380.
XL
Prefacio
elección para la ¡mplementación de los sistemas de alto rendimiento de la industria. Sin embargo, la programación en C continúa siendo una habilidad valiosa c importante debido a la gran cantidad de código heredado de C que debe mantenerse en la industria. Aquí señalamos problemas y explicamos procedimientos para lidiar con ellos de manera efectiva y esperamos que los estudiantes se sientan muy motivados por el hecho de que están aprendiendo un lenguaje de vanguardia (C++) y un para digma de programación de vanguardia (programación orientada a objetos), lo cual será útil tan pron to dejen el ambiente de la escuela. Este libro contiene una rica colección de ejemplos, ejercicios y proyectos, obtenidos de muchos campos de acción y diseñados para proporcionar a los estudiantes la oportunidad de resolver proble mas interesantes y reales. Los ejemplos del libro fueron probados en diversos compiladores: en Mi crosoft Visual C++ 6, en Microsoft Visual C++ .NFT, en dos versiones de Borland C++ Builder y en dos versiones del GNU C++. En su mayoría, los programas de este texto funcionarán en todos los compiladores compatibles con los estándares ANSI/ISO: los pocos problemas que encontramos pue de verlos en nuestro sitio Web (www.deitel.co«n). Cuando fue posible, también anunciamos los arreglos necesarios que permiten que los programas funcionen en un compilador en particular. El libro se concentra en los principios de la buena ingeniería de software y pone énfasis en la claridad de los programas. Nosotros somos educadores que enseñamos temas que están a la vanguar dia en salones de clases de la industria alrededor del mundo. Este texto pone énfasis en la buena pe dagogía. Método del código activo (Método L ive -Coue™) Este libro contiene numerosos ejemplos “reales”. Cada nuevo concepto se presenta en el contexto de un ejemplo completo, que funciona, y que es seguido de inmediato por una o más ejecuciones de ejemplo que muestran la entrada/salida del programa. Este estilo ejemplifica la forma en que ense ñamos y en que escribimos sobre programación, y es el centro de nuestros Cyber Classroorns y de nuestros cursos de capacitación basados en Web. Nosotros llamamos a este método de enseñanza y de escritura Método del código activo (o Método L/VE-CODE™). Utilizamos lenguajes de progra mación para enseñar lenguajes de programación. Leer los ejemplos del texto es muy parecido a es cribirlos y a ejecutarlos en una computadora. Acceso a World Wide Web Si lo considera útil, puede descargar las versiones originales (en inglés) de los ejemplos de este li bro (y del resto de las publicaciones de los autores) del siguiente sitio Web: w w w .d e it9 l.c o m
Registrarse es fácil y rápido, y las descargas son gratuitas. Modificar los ejemplos y de inmediato ver los efectos de dichas modificaciones es una forma muy buena de mejorar su experiencia educa tiva en C++. Objetivos Cada capítulo comienza con objetivos que informan a los estudiantes lo que deben esperar, y les brin da la oportunidad, después de leer el capítulo, de determinar si cumplieron los objetivos planteados. Los objetivos sirven como edificadores confiables. Frases A los objetivos de cada capítulo Ies sigue una serie de frases; algunas son graciosas, otras son filo sóficas y algunas más ofrecen ideas interesantes. Hemos descubierto que los estudiantes disfrutan re lacionando las frases con el material del capítulo. Vale la pena que a las frases les dé una segunda leída después de leer los capítulos. http://alexyniorlls.blogspot.com 42 of 1380.
Prefacio
XU
Plan general El plan general del capítulo permite a los estudiantes abordar el material de manera ordenada. Jun to con los objetivos del capítulo, el plan general ofrece a los estudiantes un panorama de los temas a tratar para establecer un ritmo cómodo y efectivo de aprendizaje. 20,704 líneas de código, en 267 programas de ejemplo (con la salida de los programas) Presentamos características de C++ en un contexto de programas completos en C++. Estos progra mas varían en su longitud: desde unas cuantas líneas hasta ejemplos importantes con cientos de lí neas de código. Cada programa va seguido por una ventana que contiene los resultados obtenidos al ejecutar dicho programa. Esto permite al estudiante confirmar que los programas funcionan como se esperaba. El proceso de comparar las operaciones de salida con las instrucciones del programa que producen esas operaciones es una excelente manera de aprender y reforzar los conceptos estudiados. Nuestros programas están diseñados para ejercitar las diversas características de C++. Todos los ejemplos están disponibles en el CD que acompaña a este libro. 598 Ilustraciones/Figuras Incluimos una abundante cantidad de gráficas, dibujos y salidas de programa. Hemos convertido to dos los diagramas de flujo en diagramas de actividad en UML. Además, utilizamos diagramas de cla se en UML en los capítulos 9, 10, 12, 14 y 22 para modelar las relaciones entre las clases a través del texto. 601 Tips de programación Incluimos seis tipos de tips de programación para ayudar a los estudiantes a enfocarse en aspectos importantes del desarrollo de programas, prueba y depuración, rendimiento y portabilidad. Resalta mos cientos de estos tips como Buenas prácticas de programación. Errores comunes de programa ción, Tips de rendimiento, Tips de portabilidad. Observaciones de ingeniería de software y Tips de prueba y depuración. Estos tips y prácticas representan lo mejor que hemos podido recabar a lo lar go de seis décadas (combinadas) de experiencia en la programación y la enseñanza. Uno de nuestros estudiantes, un especialista en matemáticas, recientemente nos comentó que siente que este método es similar al de resaltar axiomas, teoremas y corolarios en los libros de matemáticas, debido a que proporciona una base sólida sobre la cual se puede construir buen software. 90 Buenas p rá ctica s de p rogram ación Las buenas prácticas de programación son tips que llaman la atención hacia técnicas que ayudan a los estudiantes a crear programas que sean más legibles, auto documentados y fáciles de mantener. Cuan do enseñamos cursos introductorios partí no programadores, mtmifestamos que la “moda ” de cada curso es la “claridad", y les decimos a los estudiantes que resallaremos (en estas Buenas prácticas de programación) las técnicas para escribir programas que sean más claros, más fáciles de entender y de mantener.
198 Errores c o m u n e s d e p ro g ra m a ció n Los estudiantes que están aprendiendo un lenguaje (especialmente en su primer curso de programa ción) tienden con frecuencia a cometer ciertos tipos de errores. Al poner atención en estos Errores co munes de programación se reduce la probabilidad de que los esludiimtes comettm los mismos errores ¡y hace más corlas las filas afuera de las oficinas de los profesores!
88 Tips d e rendimiento En nuestra experiencia, enseñar a los estudiantes a escribir programas más claros y comprensibles es por mucho, la meta principal de un primer cuno de programación. Pero los estudiantes quieren escri bir los programas que corran más rápido, que utilicen la menor cantidad de memoria, que requieran
http://alexyniorlls.blogspot.com 43 of 1380.
Prefacio
XUI
el menor número de teclctzos o que destaquen de alguna manera. Los estudiantes realmente se preocu pan por el rendimiento y quieren saber qué es lo que pueden hacer para producir los programas más eficientes. Por ello incluimos los tips de rendimiento que resaltan las oportunidades para mejorar el rendimiento de los programas, hacer que tos programas se ejecuten más rápido o minimizar la canti dad de memoria que ocupan.
36 Tips de portabilidad F.l desarrollo de software es una actividad compleja y cara, leu empresas que desarrollan software a menudo producen versiones personalizadas para distintas computadoras y sistemas operativos. De ma nera que. actualmente, existe un fuerte énfasis en la portabilidad. es decir, en producir software que funcione en una variedad de computadoras con pocos o (de ser posible) ningún cambio. Algunos pro gramadores (uumen que si implementcm una aplicación en C+ + estándar, la aplicación será portable. Éste simplemente no es el caso, legrar la portabilidad requiere un diseño cuidadoso. Existen muchas dificultades. Incluimos los tips de portabilidad para ayudar a los estudiantes a escribir código porta ble y para proporcionar la comprensión de cómo C++ alcanza su alto grado de portabilidad.
149 O b se rv a c io n e s d e ingeniería d e software F.l paradigma de la programación orientada a objetos requiere de una completa reconsideración sobre la manera en que construimos los sistemtts de software. C++ es un lenguaje efectivo para lograr una buena ingeniería de software. Las Observaciones de ingeniería de software resaltan los asuntos de ar quitectura y diseño, esto afecta la construcción de sistemas de software, especialmente los de grtm es cala. Mucho de lo que los estudiantes aprenden aquí será útil en cursos de más alto nivel y, sobre to do, en la industria, cuando el estudiante comience a trabajar con sistemas grandes, complejos, en el mundo real.
38 tips d e pru e b a y d e puración Cuando diseñamos este "tipo de tip", pensamos que éstos contendrían sugerencias que plantearan es trictamente errores y cómo eliminarlos de los programas. De hecho, muchos de los tips describen as pectos de C++ que evitan que sucedan errores en los programas, lo que simplifica el proceso de prue ba y depuración.
Resumen (875 punios de resumen) Cada capítulo termina con elementos pedagógicos adicionales. Presentamos un resumen completo, en forma de lista, sobre el capítulo. Esto ayuda al estudiante a revisar y a reforzar conceptos clave. Cada capítulo contiene un promedio de 40 puntos de resumen. Terminología (1782 términos) En la sección Terminología incluimos una lista ordenada alfabéticamente de los términos importan tes definidos en el capítulo. De nuevo, esto sirve como un refuerzo adicional. Cada capítulo contie ne en promedio 81 términos. Cada término también aparece en el índice, por lo que el lector puede localizar rápidamente términos y definiciones. 555 ejercicios de autoevaluación y sus respuestas (la cuenta incluye partes separadas) En estas secciones incluimos diversos ejercicios de autoevaluación así como sus respuestas, para que los estudiantes practiquen el autocstudio. Esto proporciona la oportunidad de familiarizarse con el material y de prepararse para intentar resolver los ejercicios regulares. 800 ejercicios (las soluciones se encuentran en el mamutl del maestro; la cuenta incluye partes separadas) Cada capítulo concluye con un conjunto importante de ejercicios que incluyen un sencillo recorda torio de terminología y conceptos importantes; escritura de instrucciones específicas C++; escritura de pequeñas porciones de funciones o clases C++; escritura de funciones, clases y programas comhttp://alexyniorlls.blogspot.com 44 of 1380.
Prefacio
XUII
pletos C++; y escritura de proyectos finales. El gran número de ejercicios permite a los maestros di señar sus cursos de acuerdo con las necesidades específicas de sus alumnos, y modificar las asigna turas del curso cada semestre. Los maestros pueden utilizar estos ejercicios para asignar tareas, rea lizar exámenes cortos y los exámenes principales. Las soluciones de los ejercicios se incluyen en el CD del maestro, el cual está disponible sólo para profesores, a través de los representantes de Pearson Educación. [NOTA: No nos escriba para solicitamos el CD del maestro. La distribución de este accesorio está limitada estrictamente a profesores universitarios que tienen como texto de sus cursos este libro. Los profesores sólo pueden obtener el manual de soluciones a través de los representantes de esta empresa.] Los estudiantes y los lectores profesionales pueden obtener la solución de aproximadamente la mitad de los ejercicios si compran la cuarta edición del C++ Mul timedia Cyber Classroom, producto en inglés que ofrece además muchas otras opciones muy valio sas, y es ideal ya sea para autocstudio o como referencia. También encontrará en nuestro sitio Web (www.deitel.com) otros productos de apoyo a la cuarta edición de este libro, los cuales están dispo nibles en tiendas de libros en línea como www. in f o r m I T . com. Aproximadamente 5,000 entradas de índice (con aproximadamente 7,700 referencias de página) Hemos incluido un extenso índice al final del libro. Mediante este recurso, los lectores pueden bus car cualquier término o concepto por palabra clave. El índice es útil para la gente que lee el libro por primera vez, y es especialmente útil para los programadores profesionales que utilizan el libro como referencia. Estas entradas de índice también aparecen como hipervínculos en la cuarta edición del C+ + Multimedia Cyber Classroom. “Doble indexación” de todos los ejemplos de C++ de L ive -CODE™ Este libro contiene 267 ejemplos de código activo (Live-Code™), los cuales hemos “indexado dos veces”. Por cada programa del libro, tomamos el título del ejemplo y lo agregamos al índice alfabé tico como un elemento independiente y como un subíndice de la entrada “Ejemplos”. Esto facilita encontrar ejemplos que demuestren características particulares. Cada uno de los títulos de las figu ras también aparece en la sección de Ilustraciones (después de la sección Contenido), al principio del libro.
Software incluido con ©st© libro La cuarta edición de Cómo programar en C++, incluye el Microsoft Visual C++ 6 Introductory Edition. Quisimos incluir el nuevo ambiente de desarrollo de Microsoft, Visual C++.NET: sin embargo, Microsoft aún no lo tenía disponible para incluirlo con libros de texto; pero visite con regularidad el sitio Web de los autores, donde publicaremos la información sobre cómo pueden obtener dicho soft ware tanto estudiantes como profesionales; habrá instrucciones específicas para cada uno. Otra opción que está disponible es el paquete que contiene el Mctrowcrks CodcWarrior (ISBN#0-13-101151-0); para mayor información sobre esta opción, escriba a d e i t e l 9 d e i t e l . c o m . Compiladores gratuitos de C++ y versiones de evaluación de compiladores de C++ en Web Esta sección presenta información general sobre los compiladores de C++ que están disponibles en Web. Nosotros explicamos sólo aquellos que son gratuitos o que son versiones de evaluación. Man tenga presente que, en muchos casos, la versión de evaluación de un software no puede utilizarse una vez que el periodo de prueba ha concluido. Una organización conocida que desarrolla software libre es GNU Project (w w w .g n u .o rg ), la cual fue originalmente creada para desarrollar un sistema operativo libre, parecido a UNIX. GNU ofrece recursos de desarrollo que incluyen editores, depuradores y compiladores. Muchos desaírohttp://alexyniorlls.blogspot.com 45 of 1380.
Prefacio
xuv
Madores utilizan los compiladores gcc (GNU Compiler Collection), los cuales puede descargar de g c c .g n u .o r g . Este producto contiene compiladores de C, C++, Java y otros lenguajes. El compi lador gcc es un compilador de línea de comandos (es decir, no proporciona una interfaz gráfica de usuario). Muchos sistemas Linux y UNIX vienen con el compilador gcc instalado. Red Hat desarro lló Cygwin (w w w .cygw in.com ). un emulador que permite a los desarrolladores utilizar comandos de UNIX sobre Windows. Cygwin incluye el compilador gcc. Intel proporciona versiones de evaluación de 30 días para sus compiladores de línea de coman dos de C++ para Windows y Linux. Los treinta días del periodo de prueba también incluyen apoyo gratuito al cliente. Puede encontrar información sobre ambos compiladores en d e v e l o p e r . i n t e l . c o m / s o f t w a r e / p r o d u c t s / g l o b a l / e v a l .htm . Borland proporciona un producto de desarrollo de C++ basado en Windows llamado C++Builder ( v n iw .b o r la n d .c o m /c b u ild e r /c p p c o m p /in d e x .h tm l) . Puede descargar gratuitamente el compilador básico de C++Builder (un compilador de línea de comandos). Borland también pro porciona diversas versiones del C++Builder que contienen interfaces gráficas de usuario (GUIs). Estas GUIs son conocidas de manera más formal como ambientes integrados de desarrollo (IDEs) y, a diferencia de los compiladores de línea de comandos, permiten que el dcsarrollador edite, depure y pruebe programas rápidamente. Por medio de un IDE, muchas de las tareas que involucran coman dos tediosos ahora pueden ejecutarse mediante menús y botones. Algunos de estos productos están disponibles en versiones de evaluación gratuitas. Para mayor información sobre C++Buildcr, visite www.borland.com/products/downloada/download_cbuild9r.html
Para quienes desarrollan en Linux, Borland proporciona el ambiente de desarrollo Borland Kylix. Puede descargar el Borland Kylix Opcn Edition, el cual incluye un IDE, de www.borland.com/producta /downloads/download_kylix.html
Para descargar los productos disponibles de Borland es necesario registrarse en el sitio Web. El compilador Digital Mars de C++ (w w w .d ig ita lm a r8 .c o m ), está disponible para Win dows y DOS, c incluye manuales y documentación. Los lectores pueden descargar una versión del compilador ya sea de línea de comandos o IDE. El sistema de desarrollo DJGPP C/C++ está dispo nible para su ejecución en computadoras que ejecuten DOS. DJGPP significa DJ’s GNU Programming Platform, en donde DJ es por DJ Delorie, el creador de DJGPP. Puede encontrar información sobre el DJGPP en w w w .d e lo r ie .c a m /d jg p p . Los lugares de donde puede descargar el com pilador se mencionan c n w w w .d e l o r i e .c o m / d j g p p / g e t t i n g .h t m l . M a n u a le s de la serie DtVE-lNTÓ™ p a ra a m b ien tes pop u la res de C++
Hemos lanzado nuestros nuevos manuales de la SERIE D ivf.-Into™ para ayudar a los lectores a ini ciarse en muchos de los ambientes de desarrollo de programas en C++. Puede descargar gratuitamen te dichos manuales de w w w .d e ite l.c o m /b o o k s /d o w n lo a d s . htm l. Actualmente contamos con las siguientes publicaciones de la serie Dive-Inio ™: •
D lVE-lN lü M icrosoft® Visual C+ +® 6
• •
Dive-Into Microsoft® Visual C+ + K.NET Dive-Into Borland™ C++Builder™ Compiler (versión de línea de comandos)
•
Dive-Into Borland™ C++Builder™ Personal (versión IDE)
•
Dive-Into GNU C++ on Linux
•
Dive-Into GNU C++ vía Cygwin on Windows (Cygwin es un emulador UNIX para Win dows que incluye el compilador GNU de C++). http://alexyniorlls.blogspot.com 46 of 1380.
Prefacio
XLV
Cada uno de estos manuales muestra cómo compilar, ejecutar y depurar aplicaciones C++ en ese compilador en particular. Muchos de estos documentos también proporcionan instrucciones paso a paso con instantáneas de la pantalla que ayudan a los lectores a instalar el software. Cada documen to plantea información general sobre el compilador y la documentación en línea.
Accesorios para la cuarta edición de cóm o program ar en C++ Este libro cuenta con diversos accesorios, en inglés, para los profesores. El CD llamado Instructor's Resource (IRCD) contiene el Manual del maestro con las soluciones a la gran mayoría de los ejerci cios que se encuentran al final de cada capítulo, y un archivo llamado Test Item File con preguntas de opción múltiple (aproximadamente dos por cada sección del libro). Además, incluye diapositivas de PowerPoint® con todo el código y las figuras del libro, así como una lista de los elementos que resu men los puntos clave del texto; todo esto susceptible de ser adaptable a las necesidades del profesor. Parte de estas diapositivas pueden descargarse del sitio web www.d e i t e l . c o m : estas diapositivas ofrecen recursos tanto para los profesores como para los estudiantes.
C++ in the Lab Este manual de laboratorio (cuyo título completo es C++ in the Lab, Lab Manual to Accompany C++ Howto Program, Fourth Edition; ISBN 0-13-038478-X) complementa a este libro (Cómo pro gramar en C++) y a la cuarta edición del C+ + Multimedia Cyber Classroom. y proporciona una serie de tareas de laboratorio diseñadas para reforzar la comprensión del estudiante en cuanto al material de lectura. Este manual de laboratorio está diseñado para laboratorios cerrados; estas sesiones de labo ratorio por lo regular son clases programadas y cuentan con la asesoría de un profesor. Los laborato rios cerrados proporcionan un ambiente excelente para el aprendizaje, ya que los estudiantes pueden utilizar los conceptos presentados en clase para resolver problemas de laboratorio cuidadosamente diseñados y los profesores tienen más posibilidades de evaluar la comprensión de sus estudiantes con respecto al material, dando seguimiento al progreso de éstos en el laboratorio. Este manual también puede utilizarse para laboratorios abiertos, para tareas y para autoestudio. C++ in the Lab se enfoca en los capítulos 1 a 14 y 17 de este libro. Cada capítulo del manual se divide en 3 partes: Actividades previas al laboratorio (Prelab Activities), Ejercicios de laboratorio (lab Exercises) y Actividades posteriores al laboratorio (Postlab Activities).3 Cada capítulo contie ne objetivos que introducen los temas clave del laboratorio, y una lista de asignaciones que permite a los estudiantes marcar cuáles ejercicios ha asignado el maestro. Cada página del manual de labo ratorio está perforada, por lo que los estudiantes pueden enviar sus respuestas (en caso de ser necesa rio). Nuevamente, es prudente mencionar que todo el material complementario mencionado en este prefacio se encuentra en idioma inglés. Las soluciones a los ejercicios de las secciones antes mencionadas se encuentran en forma elec trónica. Los profesores pueden obtener estos materiales si los solicitan a los representantes de esta editorial: las soluciones no están disponibles para los estudiantes. A c t iv id a d e s p re v ia s a l la b o ra to rio
Se pretende que las actividades de la sección Prelab Activities sean resueltas por los estudiantes des pués de estudiar cada capítulo del presente libro. Estas actividades prueban la comprensión de los 3. Las prácticas de los capítulos II a 14 y 17 no contienen los amplios conjuntos de actividades que están disponi bles en los capítulos anteriores. No obstante, los maestros podrán dirigir de manera efectiva las prácticas de labo ratorio mediante los ejercicios que hemos incluido sobre estos temas más complejos. Los maestros que tengan re querimientos especiales deben escribirá d a i t a l 9 d a i t a l . c o m .
http://alexyniorlls.blogspot.com 47 of 1380.
XLVI
Prefacio
estudiantes con respecto al material presentado en el libro de texto, y los prepara para los ejercicios de programación de la sesión del laboratorio. (Estas actividades pueden terminarse antes o durante la sesión de laboratorio, a preferencia del maestro.) Los ejercicios se enfocan en terminología y con ceptos de programación importantes, y son efectivos para autoevaluación. Las actividades previas al laboratorio incluyen ejercicios de asociación, ejercicios de llenar espacios en blanco, preguntas de respuestas cortas, ejercicios de prognunación (éstos solicitan a los estudiantes que determinen qué es lo que hacen pequeños segmentos de código, sin ejecutar el programa) y ejercicios de corrección de código (éstos piden a los estudiantes que identifiquen y corrijan todos los errores de pequeños segmentos de código). E je rc ic io s d e la b o ra to rio
La sección más importante en cada capítulo es la que corresponde a Lab Exercises. Estos ejercicios enseñan a los estudiantes cómo aplicar el material aprendido en Cómo programar en C++, 4a edi ción, y los preparan para escribir programas en C++. Cada laboratorio contiene uno o más ejercicios y un problema de depuración. Los ejercicios de laboratorio contienen lo siguiente: •
Los objetivos del laboratorio (Lab Objetives) resaltan los conceptos específicos en los cua les se enfocan los ejercicios de esta sección.
•
Las descripciones del problema (Problcm Dcscriptions) proporcionan los detalles de los ejercicios y las indicaciones que ayudan a los estudiantes a implementar el programa.
•
Las salidas de muestra (Sample Outputs) ilustran el comportamiento esperado del progra ma, el cual favorece la descripción de los problemas y ayuda a los estudiantes a escribir sus programas.
•
Las plantillas de programa (Program Templates) toman los programas completos de C++ y reemplazan líneas clave de código con comentarios que describen el código faltante. Los tips para la solución del problema (Problcm-Solving Tips) resaltan los puntos clave que los estudiantes necesitan considerar cuando resuelven los ejercicios de laboratorio. Las preguntas y actividades de seguimiento (Follow-Up Questions and Activitics) piden a los estudiantes que modifiquen las soluciones de los ejercicios, que escriban nuevos progra mas que sean similares a sus ejercicios de laboratorio o expliquen las opciones de implementación que se plantearon cuando se solucionaron los ejercicios de laboratorio. Los problemas de depuración (Debugging Problems) consisten de bloques de código que contienen errores de sintaxis y/o errores lógicos. Esto alerta a los estudiantes sobre los ti pos de errores que pueden encontrar durante el proceso de programación.
• •
•
A c t iv id a d e s p o ste rio re s a l la b o ra to rio
Por lo general, los profesores asignan actividades posteriores al laboratorio para reforzar los concep tos importantes o para que los estudiantes adquieran mayor experiencia en programación fuera del laboratorio. La sección Postlab Activitics examina el conocimiento del alumno sobre el material pre vio al laboratorio y los ejercicios de laboratorio, y pide al alumno que aplique sus conocimientos para crear programas desde cero. Esta sección proporciona dos tipos de actividades de programa ción: ejercicios de código y retos de programación. Los ejercicios de código son cortos y sirven co mo repaso después de que las actividades previas al laboratorio y a los ejercicios de laboratorio se han cumplido. Estos ejercicios piden a los estudiantes que escriban programas o segmentos de pro gramas que utilicen los conceptos importantes del libro. Los retos de programación permiten a los http://alexyniorlls.blogspot.com 48 of 1380.
Prefacio
XLVII
estudiantes que apliquen el conocimiento que adquirieron en clase para ejercicios sustanciales de programación. Las indicaciones, las salidas de muestra y/o el pscudocódigo se proporcionan para ayudar a los estudiantes a resolver estos problemas. Los estudiantes que completan de manera exitosa los retos de programación de un capítulo ciertamente han dominado el material del capítulo, luis res puestas a los retos de programación están disponibles para su descarga desde w w w .d e ite l .com.
C++ Multimedia Cyber Classroom, 4a edición, y The Com plete C++ Training Course, 4a edición Hemos actualizado nuestra versión multimedia opcional del libro —The C++ Multimedia Cyber Classroom. 4/e (CD para Windows®)— con bastante audio adicional, incluyendo el nuevo material sobre programación Web con CGI. Este recurso esta cargado con características electrónicas que son ideales tanto para aprendizaje como de referencia. El ISBN de este producto es 0-13-100253-8. Los Cyber Classrooms de Dcitel™ por lo general están disponibles en CD y distintos tipos de formatos en Web. El CD con este manual proporciona una introducción en la cual los autores revisan las caracte rísticas de los Cyber Classroom. Los 267 programas de ejemplo de C++ en realidad “cobran vida” con L ive-Code™ dentro del Cyber Classroom. Si usted quiere modificar un programa y ver el efec to de sus cambios, al hacer clic en el icono del disco flexible el código fuente “despega” del CD y “cae dentro” de uno de sus propios directorios, de manera que pueda editarlo, recompilar el progra ma e intentar con su nueva versión. Además, el Cyber Classroom contiene el texto original (en in glés) de Cómo programaren C++, 4“edición, en un formato especial para búsqueda de texto. Además, el Cyber Classroom proporciona exámenes de autocvaluación (con respuestas) para cada capítulo del libro. Estos exámenes son poderosas características que permiten a los usuarios medir su comprensión de los conceptos de programación que presentan los capítulos. Cada pregunta del exa men tiene un hipervínculo a la sección, dentro del libro, de donde se deriva la pregunta. Esto permite a los usuarios revisar el material apropiado del capítulo antes o después de responder a la pregunta. Además, proporciona un cuadro que presenta los resultados, por capítulo, de cada examen del usuario. El Cyber Classroom se basa en formato estilo navegador, de manera que recuerda las secciones que usted visitó recientemente y le permite moverse hacia adelante o hacia atrás entre ellas. Las mi les de entradas del índice están hipervinculadas al texto correspondiente. Las entradas de la tabla de contenido son vínculos dinámicos, de manera que al hacer clic en el nombre del capítulo o sección lo llevará de inmediato al texto de referencia. A los estudiantes les fascinará el hecho de que el Cyber Classroom ofrece las soluciones de cer ca de la mitad de los ejercicios del libro. Además, el hecho de poder ejecutar los programas adicio nales es una buena manera de enriquecer su aprendizaje con código activo. Para una lista completa de los Cyber Classrooms y Complete Training Courses, visite el sitio Web de los autores en: w w w .d e ite l. com o w w w .I n f o r m I T .c o m /d e ite l.
La serie Course M anagem ent Systems: Blackboard™ , W e b C rM, C o u r s e C o m p a s s y Premium CourseCom passSM Parte del contenido de la serie Como programar, de Deitel, entre ellos este libro, se ha integrado en varios de los populares textos de la serie Course Management Systems, como en Blackboard, CourscCompass y WebCT. Estos textos ayudan en la creación, el manejo y el uso de sofisticadas herramien tas y programas de educación basadas en Web. Con este material, creado por y para profesores, los maestros pueden alionarse horas de introducción de datos. Blackboard, CourseCompass y WebCT ofrecen: http://alexyniorlls.blogspot.com 49 of 1380.
XLVIII
Prefacio
•
Características para crear y personalizar cursos en línea, tales como zonas para colocar información del curso (por ejemplo, planes de estudio, anuncios, asignaturas, grados, evalua ciones de rendimiento y seguimiento del progreso), herramientas de administración de clases y estudiantes, herramientas para reportes, rastreo de páginas, un calendario y asignaturas. Herramientas de comunicación para ayudar a crear y mantener relaciones ¡nterpersonales entre los estudiantes y los maestros, incluidos los salones de conversación, pizarras electró nicas, documentación compartida, boletines electrónicos y correo electrónico privado. Herramientas de evaluación flexibles, que permiten al profesor crear cuestionarios en línea y exámenes ligados de manera directa al texto, y en el que los resultados y el seguimiento son efectivos. Todos los exámenes pueden introducirse dentro del libro de grado para una eficiente administración del curso. Además, WcbCT permite a los instructores administrar el tiempo de los cuestionarios en línea.
•
•
•
El Material de apoyo para los instructores se encuentra en formato para impresión y para consulta en línea.
Además de las herramientas que se encuentran en Blackboard y WebCT, CourseCompass incluye: •
•
•
La página de inicio de CourseCompass. la cual hace el curso tan fácil como navegar en este libro. Una tabla de contenido que se expande, permite a los maestros ver el contenido del curso al instante y vincularse con cualquier sección. Secciones de ayuda en línea “How do I” , están disponibles para los usuarios que requie ren sitios con ayuda personalizada sobre los cursos, incluso las instrucciones paso a paso para agregar diapositivas de PowerPoint, video y más. Guia del instructor Quick Start, ofrece a los profesores la opción de crear cursos en línea mediante un sencillo proceso paso a paso.
Para demostraciones gratuitas en línea, y aprender más acerca de la serie Course Management Systems, que cuenta con material de apoyo para este libro, visite las siguientes páginas Web: • • •
Blackboard: w w w .b la c k b o a rd .c o m . WcbCT: www. w e b e t. com. CourseCompass: w w w .coursecom pa8S .ccaa.
Reconocimientos Uno de los mayores placeres al escribir un libro de texto es el de reconocer el esfuerzo de mucha gente, cuyos nombres quizá no aparezcan en la portada, pero cuyo arduo trabajo, cooperación, amis tad y comprensión fue crucial para la elaboración de este libro. Mucha gente en Deitel & Associa tes, Inc. dedicó largas horas a este proyecto. •
Tem Nieto, egresado del Massachusetts Institute of Technology y director de desarrollo de productos en Deitel & Associates, fue coautor de los capítulos 15, 20 y 22, y la sección es pecial “Construya su propio compilador" del capítulo 17. Además, contribuyó en el Manual del maestro y en el C++ Multimedia Cyber Classroom, 4aedición, y desarrolló el manual de laboratorio para el estudiante. C+ + in the Lab, y el manual del profesor correspondiente.
•
Ben Wiedermann, egresado de la Boston University con título en Ciencias de la computa ción, fue el líder de desarrollo, programador y escritor junto con el Dr. Harvey M. Deitel en el ejemplo práctico de UML correspondiente a los capítulos 1 a 7 y 9. http://alexyniorlls.blogspot.com 50 of 1380.
Prefacio
XLIX
•
Sean E. Santry, egresado del Boston College con títulos en Ciencias de la computación y Filosofía, es director de desarrollo de software en Dcitcl & Associates. Sean trabajó en el código y el recorrido a través de los códigos del ejemplo práctico de UML, y ayudó a cer tificar la precisión técnica de los capítulos 2 a 5, 8, 9. 11, 12, 16 y 21.
•
Jonathan Gadzik, egresado de la Columbia University School of Engineering and Applied Science con un título en Ciencias de la computación, contribuyó con las secciones “Acerca de los objetos”, el prefacio y los capítulos 1, 9 a 14 y 16; además, Jon actualizó todos los diagramas IJML de los capítulos 2, 9, 12 y 14 a la versión 1.4.
•
Cheryl Yaeger, egresada de la Boston University con un título en Ciencias de la computa ción, es directora de Desarrollo .NET en Dcitcl & Associates. Cheryl ayudó a certificar la precisión técnica de los capítulos 17, 19 y 20.
•
Christi Kclscy, egresada de la Purdue University con un título en Administración y una especialización en Sistemas de información, es directora de desarrollo de negocios en Deitel & Associates. Christi trabajó en el apéndice sobre Recursos de Internet y Web para C++, aplicó las correcciones al manuscrito original y contribuyó en el prefacio.
•
Laura Treibick, egresada de la University of Colorado en Boulder con un título en Fotogra fía y Multimedia, es directora de Multimedia en Deitel & Associates. Ella mejoró muchas de las gráficas del texto, asesoró en el diseño de la portada del libro y auditó el índice.
•
Christina Courtemarche. egresada de la Boston University con un título en Ciencias de la computación, certificó la precisión técnica de los capítulos 9, 11, 13 y 15. Bctsy Duwaldt, directora editorial en Deitel & Associates, es egresada del Metropolitan Sta te Collage of Denver con un título en Comunicaciones digitales (con énfasis en edición y escritura). Betsy editó el prefacio y el apéndice D. Barbara Deitel aplicó las correcciones al manuscrito. Ella hizo esto en paralelo con sus ex tensas responsabilidades financieras y administrativas en Deitel & Associates. Abbey Deitel, presidenta de Deitel & Associates, es egresada de la Camegie Mellon Uni versity con un título en Administración industrial. Ella reclutó personal adicional de tiem po completo y becarios durante el 2002 y alquiló, equipó y amuebló nuestras nuevas ofici nas generales para crear el ambiente de trabajo en el cual se produjo la cuarta edición de Cómo programar en C+ + , y nuestras otras publicaciones de Deitel en el 2002. Ella sugirió el título Cómo programar..., para la serie y contribuyó con este prefacio.
•
• •
También queremos agradecer a los participantes del Intemship Program4 en Deitel & Associa tes. Inc.: •
Emanuel Achildiev, estudiante de segundo año de Ciencias de la computación en la Northeastem University, trabajó en los anexos de los capítulos 6 y 8 y evaluó los programas de ejemplo sobre diversas plataformas.
4. Este programa competitivo ofrece un número limitado de puestos asalariados a los estudiantes del área de Boston en las carreras de Ciencias de la computación. Tecnologías de la información. Mercadotecnia. Administración e In gles. Los estudiantes trabajan tiempo completo en nuestras oficinas corporativas en Maynard, Massachusctts durante el verano y (para aquellos que se encuentran en el área de Boston) por tiempo parcial durante el periodo académi co. También ofrecemos puestos de tiempo completo para prácticas profesionales para estudiantes interesados en lomar un semestre de descanso en la escuela para obtener experiencia en la industria. Los puestos comunes de tiem po completo están disponibles para los egresados. Para mayor información, contáctenos en a b b e y .d e i t e l 9 d e i t e l . c o m y visite nuestro sitio Web. w w w .d e ite l.c o m .
http://alexyniorlls.blogspot.com 51 of 1380.
Prefacio
L
•
Kalid Azad, estudiante del último año de Ciencias de la computación en la Princeton Univcrsity, trabajó en los anexos del libro, así como en el Power Point Instructor Lecture No tes y el Test Item File.
•
Nicholas Cassie, estudiante de segundo año de Ciencias de la computación en la Northeastem University, trabajó en los materiales anexos para los capítulos 4, 10 a 12 y 14 y evaluó los programas de ejemplo en diversos compiladores de C++.
•
Thiago da Silva, estudiante de segundo año de Ciencias de la computación en la Northeastem University, evaluó los programas de todo el libro en varios compiladores de C++. Tam bién contribuyó en el material de apoyo en línea DtVE-lNTO que muestra cómo escribir, compilar y depurar programas en diversos ambientes de desarrollo de C++.
•
Mike Dos’Santos, con especialidad en Ciencias de la computación en la Northeastem Uni versity, produjo el material anexo para los capítulos 7, 9 y 13, e hizo un extenso trabajo en C+ + in the lab.
•
Brian Fostcr, estudiante de segundo año de Ciencias de la computación en la Northeastem University, evaluó los programas de ejemplo en distintos compiladores de C++. También contribuyó en el material de apoyo en línea de Dive-Ihto que muestran cómo escribir, com pilar y depurar programas en distintos ambientes de desarrollo en C++.
•
Audrey Lee. egresada del Wellesley College y aspirante al doctorado en Ciencias de la com putación en la University oí Massachusctts, Amhcrst, trabajó en los anexos del libro, inclu yendo PowerPoint Instructor Lecture Notes, el C+ + Multimedia Cyber Classroom, 4a edi ción y el Test Item File.
•
Jimmy Nguyen, estudiante de segundo año de Ciencias de la computación en la Northeas tem University. trabajó en los anexos para los capítulos 5, 15 y 17. También evaluó los pro gramas del libro en distintos compiladores de C++.
•
Matthew Rubino, estudiante de segundo año de Ciencias de la computación en la Northeas tem University, evaluó los programas en varios compiladores de C++. También contribuyó en el material de apoyo en línea de DlVE-lNTO.
Queremos agradecer a uno de nuestros colegas de negocios, quien contribuyó en la elaboración del libro. Chris Poirier, un consultor independiente, coautor del capítulo 16. Además Chris es un ex perto en FrameMaker Developer Kit (FDK). También queremos agradecer a Justin Liberman, quien investigó las direcciones URL del apéndice D. Somos afortunados al haber trabajado en este proyecto con un talentoso y dedicado equipo de editores profesionales en Prcntice Hall. Apreciamos de manera especial el extraordinario esfuerzo de nuestra editora de Ciencias de la computación, Petra Recter y su jefa, nuestra mentora en la edi ción, Marcia Horton, directora editorial de la división de Ciencias de la computación c ingeniería de Prenticc Hall. Vmcc O'Brien hizo un estupendo trabajo en el manejo de la producción del libro. Sarah Burrows administró la publicación del extenso paquete adicional del libro. Pamela Shaffcr, ge rente ejecutiva de marketing para Ciencias de la computación, desarrolló el extenso programa de marketing del libro. El C++ Multimedia Cyber Classroom. 4/e, fue desarrollado en paralelo con este libro. Sincera mente apreciamos la perspicacia, experiencia y habilidad técnica de nuestros editores de medios electrónicos, Mark Tabú y Karen Malean. Ellos, con el administrador de proyecto Mike Ruel, hicie ron un gran trabajo en la edición de C++ Multimedia Cyber Classroom, 4aedición y The Complete C++ Training Course. 4“edición. http://alexyniorlls.blogspot.com 52 of 1380.
Prefacio
U
Debemos un agradecimiento especial a la creatividad de Tamara Newnam ( s m a r t _ a r t 9 e a r t h l i n k . n e t ) . Tammy creó la portada y la encantadora criatura que comparte con usted los tips de programación. Barbara Deitel contribuyó con los nombres de los bichos de la portada. Queremos extender una nota especial de agradecimiento a Steve Clamage de Sun Microsystems, presidente del Comité Técnico J 16 de ANSI, el grupo responsable del desarrollo y evolución del es tándar para C++. Las contribuciones de Steve a este libro (y las ediciones anteriores) son profundas. Nos beneficiamos de manera importante con sus profundos comentarios y su gran entendimiento de C++. Steve desea que los libros que describen C++ sean correctos y toma parte de su ocupada agen da profesional para ayudarnos a nosotros y a otros autores de C++ a “ponerlos a punto". Nuestro sin cero agradecimiento a un consumado profesional. Queremos reconocer el esfuerzo de nuestros 52 revisores de la cuarta edición y extender una nota especial de agradecimiento a Jcnnifcr Capcllo de Prcntice Hall, quien condujo este extraordina rio esfuerzo de revisión. Revisores de la cuarta edición Revisores del material de C++ Ammar Abuthuraya (Microsoft) Richard Albright (University of Delaware) Rob Andrews (Desarrollador independiente de software) Peter Becker (Dinkumware, Ltd.) Cari Bumham (HostingResolve.com) Jimmy Chen (Salt Lake Community Collage) Ram Choppa (Baker Hughes) Stcphcn Clamage (Presidente de ANSI J16; Sun Microsystems) Nathan Clegg (Geerbox) Eric Crampton (Automatcd Trading Dcsk) Timothy Culp (Harris Corporation) Joel Davis (DinaaliSystems) Christophe de Dincchin (Hewlett-Packard) Vincent Drake (Borland) Lars Mar ius Garshol (Ontopian) John Godel (EPOCH Technical Services) Ric Heishman (Northern Virginia Community College) Anne Horton (AT&T) James Huddleston (Consultor independiente) Rcx Jacschkc (Consultor independiente) Clark Jefcoat (ProObject) Vivek Kajale (University of Texas, Arlington) Sam Kohn (New York Institute of Technology) Don Kostuch (You can C Oeariy Now) Stan Kurkovsky (Columbus State University) Meng Lee (Co-creador de STL; Hewlett-Packard) Sean McGrath (Propylon) Robert Myers (Florida State University) Ami Neiman (DeVry University-Fremont) David Papurt (Contratista independiente; conferencista y autor de C++) Garren Pease (LeamFrame, Inc.) Wolfgang Pclz (University of Akron) http://alexyniorlls.blogspot.com 53 of 1380.
Ul
Prefacio
Tom Pennings (Borland) Prashant Ranc (Univcrsity of Texas) Shailesh Ratadia (Microsoft) Kroum Savadjiev (Purkinjc Inc.) Vicki Scott (Metrowerks, Inc.) Richard Scabrook (Annc Arundcl Community Collcgc) Gary Sibbitts (St. I^ouis Community College) Vladimir Toncar (Kerio Technologies) Owcn Urkov (Borland) Reid Wilkes (Microsoft) Revisores del ejemplo práctico (UML/DOO) de este libro Brian Cook (Zurich Insurance) Ron Felice (Omniware Development) Tcrry Hull (Enterprise Componen! Technologies, Inc) Don Kostuch (You can C Clearly) Grant Larscn (Rational Software) Davyd Norris (Rational Software) Kcndall Scott (Consultor independiente) Cameron Skinner (Embarcadero Technologies; OMG) Mark Taubc (Raytheon) Stephen Tockey (Construx Software; OMG) Bing Xuc (Siemens Applied Automation) Con un calendario muy apretado, estos revisores escrutaron cada aspecto del libro c hicieron incon tables sugerencias para mejorar la precisión e integridad de la presentación. Cómo ponerse en contacto con Deitel & Associates Agradeceremos sus comentarios, críticas, correcciones y sugerencias para mejorar este libro. Envíe su correspondencia a: daitel9daitttl.com
Responderemos oportunamente. Apoyo a clientes Envíe todas sus preguntas respecto al software y a la instalación al departamento de soporte técnico de Pearson Educatión a: • • •
Por teléfono: 1-800-Ó77-6337 Por correo electrónico: m e d ia . s u p p o r t& p e a r s o n e d . c o n En Web: 2 47 . p r e n h a l l . com
Remita sus preguntas respecto al lenguaje C++ a d e i t el@ d ei t e l . com. Bien, esto es todo por ahora. Bienvenido al excitante mundo de C++, la programación estructu rada, UML, programación general con STL y la programación Web en C++ con CGI. Esperamos que disfrute este vistazo a la programación moderna de computadoras. ¡Buena suerte! Dr. Harvey M. Deitel Paul J. Deitel http://alexyniorlls.blogspot.com 54 of 1380.
Prefacio
Ull
A ce rca de los autores Dr. Ilarvey M. Deitel. Presidente y director en jefe de estrategia (SCO) de Deitel & Associates. Inc. Tiene 41 años de experiencia en el campo de la computación, esto incluye un amplio trabajo aca démico y en la industria. El Dr. Deitel obtuvo la licenciatura y la maestría en el iMassachusetts Institute of Technology y el doctorado en la Boston University. Trabajó en los primeros proyectos de sistemas operativos de memoria virtual en IBM y el M1T que desarrollaron técnicas que en la actua lidad están ampliamente implementadas en sistemas tales como UNIX. Linux y Windows XP. Tiene 20 años de experiencia en la enseñanza universitaria, que incluye un puesto vitalicio y el haber ser vido como presidente del departamento de Ciencias de la computación en el Boston Collcgc antes de fundar, con su hijo Paul J. Deitel, Deitel & Associates, Inc. Él y Paul son los coautores de varias doce nas de libros y paquetes multimedia, y están escribiendo muchos más. Con publicaciones traducidas al Japonés, Ruso, Español, Chino tradicional. Chino simplificado. Koreano, Francés, Polaco, Ita liano, Portugués, Griego, Urdú y Turco, los textos de Deitel se han ganado el reconocimiento inter nacional. El Dr. Deitel lia impartido seminarios profesionales para grandes empresas, organizaciones gubernamentales y diversos sectores del ejército. Paul J. Deitel. CEO y director técnico en jefe de Deitel & Associates. Inc., es egresado del Sloan School of Management del Massachusctts Institute of Technology. A través de Deitel & Associates, Inc., ha impartido cursos de C, C++, Java, Internet y sobre World Widc Web a clientes de la industria, como Compaq, Sun Microsystems, White Sands Missile Range, Rogue Wave Software, Boeing, Dell, Stratus. Fidclity, Cambridge Technology Partncrs, Open Environment Corporation, One Wave, Hypcrion Software, Lucent Technologies, Adra Systems, Entergy, CableData Systems, NASA (en el centro es pacial Kennedy), National Severe Storm Laboratory, IBM y muchas otras empresas. Ha sido con ferencista de C++ y Java para la Boston Chapter de la Association for Computing Machinery, y lia impartido cursos sobre Java para comunicación satelital a través de una empresa de cooperación entre Deitel & Associates, Prcnticc Hall y Technology Education NetWork. Él y su padre, el Dr. Harvcy M. Deitel, son los autores de los libros de Ciencias de la computación con más ventas del mundo.
A cerca de Deitel & Associates, Inc. Deitel & Associates, Inc. es una empresa reconocida a nivel mundial dedicada al entrenamiento y creación de contenidos especializados en educación para tecnología de software para Intemct/World Wide Web, tecnología de software para e-business/e-commerce, tecnología de objetos y lenguajes de programación. La empresa proporciona cursos guiados sobre programación en Intcmct/Wcb, progra mación inalámbrica para Internet, tecnología de objetos, y lenguajes y plataformas importantes de programación, como C, C++, Visual C++.NET, Visual Basic®.NET, C#, Java, Java avanzado, XML, Perl, Python y otros. Los fundadores de Deitel & Associates, Inc, son el Dr. Harvey M. Deitel y Paul J. Deitel. Sus clientes incluyen muchas de las empresas de cómputo más grandes del mundo, agen das gubernamentales, sectores del ejército y organizariones de negodos. A lo largo de sus 27 años de sociedad editorial con Prentice Hall, Deitel & Associates, Inc., ha publicado libros de texto de vanguardia sobre programación, libros profesionales, multimedia interactiva en CD como los Cyber Classrooms, Complete Training Courses, e-books, e-Matter, cursos basados en Web y sistemas de administración de cursos de contenido electrónico para CMSs tales como WebCT, Blackboard y CourseCompass. Deitel & Associates, Inc., y los autores pueden ser contactados mediante correo electrónico en: .coa
http://alexyniorlls.blogspot.com 55 of 1380.
Prefacio
uv
Para conocer más acerca de Deitel «feAssociates. Inc., sus publicaciones y su currículo corpora tivo mundial en línea visite: www.deitel.com
Los pedidos por volumen para empresas c instituciones académicas deberán hacerse de manera directa con los representantes de Pearson Educación.
El Consorcio World Wide Web (W3C) \ \ r y *4 Deitel «fe Associates, Inc., es miembro del Consorcio World Wide Web (W3C o YY V World Wide Web Consortium). El W3C fue fundado en 1994 “para desarrollar proV T tocolos comunes para la evolución de la World Wide Web”. Como miembro del MEMBER W3C, Deitel «fe Associates, Inc., tiene un lugar en el W3C Advisory Committcc (el representante de nuestra empresa es nuestro CEO, Paul Deitel). Los miembros del Advisory Committcc ayudan a definir la “dirección estratégica” del W3C en reuniones alrededor del mundo. Además, las empresas miembro ayudan a desarrollar las recomendaciones de estándares para las tecnologías Web (tales como XHTML, XML, y muchas otras), a través de la participación en las ac tividades y grupos del W3C. La membresía del W3C es para empresas y organizaciones importan tes. Para obtener información sobre cómo convertirse en miembro del W3C visite: www. w 3 . o r g / C o n s o r t i u m / P r o s p e c t u ■ / J o i n i n g . h t m
http://alexyniorlls.blogspot.com 56 of 1380.
Introducción a las computadoras y a la programación en C+4 Objetivos • Comprender los conceptos básicos de la ciencia de la computación. • Familiarizarse con los diferentes tipos de lenguajes de programación. • Comprender un típico entorno de desarrollo en C++. • Escribir programas sencillos en C++. • Utilizar instrucciones sencillas de entrada y salida. • Familiarizarse con los tipos de datos fundamentales. • Utilizar los operadores aritméticos. • Comprender la precedencia de los operadores aritméticos. • Escribir instrucciones condicionales sencillas. Ims grandes ideas requieren un gran lenguaje. Aristófanes Nuestra vida es malgastada por el detalle... simplificar, simplificar. Henry David Thoreau objetivo sublime deberé llevar a cabo a tiempo. S. Gilbert
http://alexyniorlls.blogspot.com 57 of 1380.
2
Introducción a las computadoras y a la programación en C++
Capítulo 1
Plan general 1.1
Introducción
1.2
¿Q u é ©s un a c o m p u ta d o ra ?
1.3
O rga n iza ció n d e las co m p u ta d o ra s
1.4
Evolución d© los sistem as operativos
1.5
C o m p u ta ció n personal, distribuida y cliente-servidor
1.6
Lenguajes m áquina, lenguajes ensam b ladores, y d e alto nivel
1.7
Historia d e C y C + +
1.8
La Biblioteca estándar d e C + +
1.9
Ja va
1.10
Visual Basic, Visual C + + y C #
1.11
O tros lenguaje s d e alto nivel
1.12
P rogram ación estructurada
1.13
La te n d e n cia cla ve del software: te cn o lo gía d e objetos
1.14
C o n c e p to s b á sic o s d e un am b iente típico C + +
1.15
Tendencias d e hardw are
1.16
Historia d e Internet
1.17
Historia d e la W orld W ide W eb
1.18
El C o n so rc io W orld W ide W eb (W 3C)
1.19
N otas gen erales a c e rc a d e C + + y d e este libro
1.20
Introducción a la p ro g ra m a ció n e n C + +
1.21
Un p ro gra m a sencillo: im prim ir un a línea d e texto
1.22
O tro p rogram a sencillo: sum a d e d o s enteros
1.23
C o n c e p to s d e m em oria
1.24
Aritm ética
1.25
Tom a d e decisiones: op e rad ore s d e ig u a ld a d y d e relación
1.26
A c e rc a d e los objetos: introducción a la te cn o lo gía d e objetos y al Lenguaje Unificado d e M o d e la d o (UM L™)
1.27
Recorrido a través del libro
Resumen • Terminología • Ejercicios de autoevaluación • Respuestas a los ejercicios de autoevaluación • Ejercicios
1.1 Introducción ¡Bienvenidos a C++! Hemos trabajado duro para crear lo que creemos será una experiencia educati va informativa y entretenida para usted. C++ es un lenguaje desafiante que generalmente se enseña sólo a los programadores experimentados, de manera que este libro es único entre los libros de tex to de C++: http://alexyniorlls.blogspot.com 58 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación en C++
3
•
Es apropiado para gente con orientación técnica que cuente con poca o nada de experiencia en programación.
•
Es apropiado para programadores experimentados que deseen conocer más profundamente el lenguaje.
¿Cómo puede un libro atraer a ambos grupos? La respuesta es que la parte central del libro po ne énfasis en la claridad de los programas, a través de las técnicas comprobadas de programación estructurada y de programación orientada a objetos (los principiantes aprenden a programar bien desde el principio). Hemos intentado escribir de manera clara y directa. El libro contiene cientos de programas en C++ y muestra los resultados que arrojan cuando dichos programas se ejecutan en una computadora. Nosotros llamamos a esto “el método del código activo”. Todos estos programas de ejemplo se encuentran en el CD-ROM que acompaña al libro. Además, los ejemplos originales, en inglés, se encuentran disponibles en la cuarta edición de nuestro producto interactivo en CD-ROM, C++ Multinu'dia Cyber Classroom. Este producto, totalmente en inglés, contiene un gran número de hipervínculos, descripciones en audio de los programas de ejemplo del libro, la opción de buscar una copia electrónica del libro y las soluciones de cerca de la mitad de los ejercicios. Las caracterís ticas del Cyber Classroom y la información para ordenarlo se encuentran en el prefacio de este libro. Los cinco primeros capítulos presentan los fundamentos de las computadoras, la programación de computadoras y el lenguaje de programación C++. Los principiantes que han tomado nuestros cursos nos han dicho que el material de los capítulos 1 a 5 contienen los fundamentos sólidos para un tratamiento más profundo de C++ en los capítulos restantes. Los programadores experimentados por lo general leen rápidamente los cinco primeros capítulos, y encuentran que el tratamiento de C++ en el resto del libro es riguroso y desafiante. La mayoría de la gente está de alguna manera familiarizada con las cosas excitantes que se pue den hacer con una computadora. Mediante este libro de texto, usted aprenderá a programar las compu tadoras para que hagan dichas cosas. El software (las instrucciones que usted escribe para ordenar a la computadora que realice acciones y tome decisiones) es quien controla a las computadoras (a me nudo llamadas hardware). C++ es uno de los lenguajes de desarrollo de software más populares en la actualidad. Este libro presenta una introducción a la programación en la versión de C++ estanda rizado, llevada a cabo en los Estados Unidos a través del American National Standards Institute (AN SI, Instituto nacional estadounidense de estándares), y a nivel mundial a través de las acciones de la International Organization for Standardizaron (ISO).1 El uso de las computadoras se ha incrementado en casi cualquier campo de trabajo. En una era de aumentos constantes de costos, los costos de cómputo han disminuido de manera dramática de bido al rápido desarrollo en la tecnología de hardware y software. Las computadoras que ocupaban grandes habitaciones y que costaban millones de dólares, hace 25 o 30 años, ahora son colocadas en las superficies de pequeños chips de silicio, más pequeños que una uña y con un costo de quizá unos cuantos dólares cada uno. De manera irónica, el silicio es uno de los materiales más abundantes en el planeta (es uno de los ingredientes de la tierra común). La tecnología de los chips de silicio ha vuelto tan económica a la tecnología de computación que cientos de miles de computadoras de uso general se encuentran actualmente ayudando a la gente en las empresas, en la industria, en el gobier no y en sus vidas personales. Dicho número podría duplicarse en unos cuantos años.
I. De acuerdo con el sitio Web de la ISO (ww. iso.org/iso/an/aboutiao/introduction/irtiatialSO. html), ISO son las iniciales de la organización, empleadas a nivel mundial para evitar acrónimos diferentes para cada traducción de la International Organization forStandardization.
http://alexyniorlls.blogspot.com 59 of 1380.
4
Introducción a las computadoras y a la programación en C++
Capítulo 1
A través de los años, muchos programadores aprendieron la metodología de programación de nominada programación estructurada. Usted aprenderá tanto la programación estructurada como la novedosa y excitante programación orientada a objetos. ¿Por qué enseñamos ambas? Ciertamente, la programación orientada a objetos será la metodología clave de programación para la siguiente dé cada. Usted creará y trabajará con muchos objetos en este curso. Sin embargo, descubrirá que la es tructura intema de esos objetos a menudo se construye mejor utilizando técnicas de programación estructurada. Además, en ocasiones la lógica para manipular los objetos se expresa mejor mediante la programación estructurada. En la actualidad, existe una migración masiva de sistemas basados en C a sistemas basados en C++. También existe una gran cantidad de código denominado “heredado de C”. C ha sido amplia mente utilizado durante un cuarto de siglo. Una vez que la gente aprende C++, descubre que es más poderoso que C, y a menudo elige migrar a C++. Esta gente comienza por convertir sus sistemas he redados a C++. Luego, utilizan las diferentes características de C++, generalmente conocidas como "mejoras a C mediante C++”, para mejorar el estilo de sus programas en C. Por último, aprovechan las características de la programación orientada a objetos de C++ para descubrir por completo los beneficios del lenguaje. En los primeros cinco capítulos del libro usted aprenderá sobre la programación estructurada en C++, la “parte C” de C++ y las “mejoras a C mediante C++”. En el resto del libro penetrará en la programación orientada a objetos en C++. Sin embargo, no deseamos que espere hasta el capítulo 6 para que pueda apreciar las ventajas de la orientación a objetos. Por lo tanto, cada uno de los prime ros cinco capítulos concluyen con una sección denominada “Acerca de los objetos". Estas secciones introducen los conceptos básicos y la terminología relacionada con la programación orientada a ob jetos. Cuando lleguemos al capítulo 6, Clases y abstracción de datos, estará preparado para utilizar C++ para crear objetos y escribir programas orientados a objetos. El primer capítulo contiene cuatro partes. La primera introduce los conceptos básicos de las computadoras y los programas de cómputo. La segunda lo pone a escribir algunos programas senci llos en C++. La tercera parte le ayuda a “pensar acerca de los objetos", mientras que la última ex plora el resto del libro. ¡De manera que ahí lo tiene! Está a punto de comenzar una ruta de desafíos y recompensas. Mientras tanto, si desea comunicarse con nosotros, envíenos un correo electrónico a deitelGdeitel.con
o explore nuestra página Web en www.deitttl.com
1.2 ¿Q u é ©s una com putadora? Una computadora es un dispositivo capaz de realizar cálculos y tomar decisiones lógicas a velocida des de millones (incluso de miles de millones) de veces más rápidas que los humanos. Por ejemplo, muchas de las computadoras personales actuales pueden realizar miles de millones de sumas por segundo. Una persona con una calculadora podría requerir toda una vida para completar el mismo número de operaciones que una computadora personal realiza en un segundo. (Puntos a consideran ¿cómo sabría que la persona realizó los cálculos de manera correcta? ¿Cómo sabría que la compu tadora sumó los números de manera correcta?) ¡Las supercomputadoras actuales más rápidas pueden realizar miles de millones de sumas por segundo! ¡Y en los laboratorios de investigación se encuen tran otras que pueden realizar billones de instrucciones en un segundo! http://alexyniorlls.blogspot.com 60 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación en C++
5
Las computadoras procesan los Jatos bajo el control de conjuntos de instrucciones llamadas profiramos de cómputo. Estos programas de cómputo guían a la computadora a través de conjuntos ordenados de acciones especificadas por gente llamada programadores de computadoras. Una computadora está compuesta por varios dispositivos (tales como el teclado, el monitor, el “ratón”, discos, memoria, CD-ROM y unidades de procesamiento) conocidos como hardware. A los programas de cómputo que se ejecutan dentro de una computadora se les denomina software. Los cos tos de las piezas de hardware han disminuido de manera expectacular en años recientes, al punto en el que las computadoras personales se han convertido en artículos domésticos. Desafortunadamente, los costos para el desarrollo de programas se incrementan de manera constante conforme los progra madores desarrollan aplicaciones más complejas y poderosas, sin que exista una mejora significativa en la tecnología para el desarrollo de software. En este libro aprenderá métodos comprobados para el desarrollo de software que pueden reducir sus costos (programación estructurada, mejoramiento paso a paso, uso de funciones, programación basada en objetos, programación orientada a objetos, diseño orientado a objetos y programación genérica).
1.3 Organización de las com putadoras Independientemente de la apariencia física, casi siempre las computadoras pueden representarse me diante seis unidades o secciones lógicas. Éstas son: 1. Unidad de entrada. Ésta es la sección “receptora” de la computadora. Obtiene información (datos y programas de cómputo) desde varios dispositivos de entrada y pone esta informa ción a disposición de las otras unidades para que la información pueda procesarse. En la actualidad, la mayor parte de la información se introduce a través del teclado y el ratón. Actualmente, la información también puede introducirse hablando con su computadora, digitalizando las imágenes y mediante la recepción de información desde una red, como Internet. 2. Unidad de salida. Ésta es la sección de “embarque” de la computadora. Toma información que ya ha sido procesada por la computadora y la coloca en los diferentes dispositivos de salida, para que la información esté disponible fuera de la computadora. La mayor parte de la información de salida de las computadoras se despliega en el monitor, se imprime en papel, o se utiliza para controlar otros dispositivos. También, las computadoras pueden dar salida a su información a través de redes, tales como Internet. 3. Unidad de memoria. Ésta sección funciona en la computadora como un “almacén” de acce so rápido, pero con relativa baja capacidad. Retiene la información que se introduce a través de la unidad de entrada, de manera que la información pueda estar disponible de manera in mediata para procesarla cuando sea necesario. La unidad de memoria también retiene la información procesada hasta que ésta pueda ser colocada en los dispositivos de salida por la unidad de salida. Con frecuencia, a la unidad de memoria se le llama memoria o memo ria primaria. 4. Unidad aritmética y lógica (ALU). Ésta es la sección de "manufactura” de la computadora. Es la responsable de realizar cálculos tales como suma, resta, multiplicación y división. Contiene los mecanismos de decisión que permiten a la computadora hacer cosas como, por ejemplo, comparar dos elementos de la unidad de memoria para determinar si son iguales o no. 5. Unidad central de procesamiento (CPU). Ésta es la sección “administrativa” de la compu tadora: es quien coordina y supervisa la operación de las demás secciones. La CPU le indica a la unidad de entrada cuándo debe grabarse la información dentro de la unidad de memo ria, le indica a la ALU cuándo debe utilizarse la información de la unidad de memoria para http://alexyniorlls.blogspot.com 61 of 1380.
6
Introducción a las computadoras y a la programación en C++
Capítulo 1
los cálculos y le indica a la unidad de salida cuándo enviar la información desde la unidad de memoria hacia ciertos dispositivos de salida. Muchas de las computadoras actuales contienen múltiples unidades de procesamiento, y, por lo tanto, pueden realizar múlti ples operaciones de manera simultánea (a estas computadoras se les conoce como multipro cesudaras). 6. Unidad secundaria de almacenamiento. Éste es el “almacén” de alta capacidad y de larga duración de la computadora, l-os programas o datos que no se encuentran en ejecución por las otras unidades, normalmente se colocan dentro de dispositivos de almacenamiento secundario (tales como discos) hasta que son requeridos de nuevo, posiblemente horas, días, meses o incluso años después. El tiempo para acceder a la información en alma cenamiento secundario es mucho mayor que el necesario para acceder a la de la memoria principal, pero el costo por unidad de memoria secundaria es mucho menor que el corres pondiente a la unidad de memoria principal.
1.4 Evolución de los sistemas operativos Las primeras computadoras eran capaces de realizar solamente una tarea o trabajo a la vez. A esta forma de operación de la computadora a menudo se le conoce como procesamiento por lotes (batch) de un solo usuario. La computadora ejecuta un solo programa a la vez, mientras procesa los datos en grupos o lotes. En estos primeros sistemas, los usuarios generalmente asignaban sus trabajos aun cen tro de cómputo que lo introducía en paquetes de tarjetas perforadas. A menudo tenían que esperar ho ras, o incluso días, antes de que sus resultados impresos regresaran a sus escritorios. Los sistemas de software denominados sistemas operativos fueron desarrollados para hacer más fácil el uso de la computadora. Los primeros sistemas operativos administraban la suave transición entre tareas. Esto minimizó el tiempo necesario para que los operadores de computadoras pasaran de una tarea a otra, y por consiguiente incrementó la cantidad de trabajo, o el flujo de datos, que las computadoras podían procesar. Conforme las computadoras se volvieron más poderosas, se hizo evidente que un proceso por lotes para un solo usuario rara vez aprovechaba todos los recursos de la computadora de manera efi ciente, debido al tiempo que se malgastaba esperando a que los lentos dispositivos de entrada/salida completaran sus tareas. Se pensó que era posible realizar muchas tareas o trabajos que podrían com partir los recursos de la computadora y lograr un uso más eficiente de ésta. A esto se le conoce co mo multiprogramación. La multiprogramación significa la operación “simultánea” de muchas tareas dentro de la computadora (la computadora comparte sus recursos entre los trabajos que compiten por su atención). En la década de los sesenta, muchos grupos en la industria y en las universidades marcaron los rumbos de los sistemas operativos de tiempo compartido. El tiempo compartido es un caso especial de la multiprogramación en el cual los usuarios acceden a la computadora a través de terminales; por lo general, dispositivos compuestos por un teclado y un monitor. En un típico sistema de cómputo de tiempo compartido puede haber docenas o incluso cientos de usuarios compartiendo la compu tadora al mismo tiempo. 1.a computadora en realidad no ejecuta los procesos de todos los usuarios a la vez. La computadora hace el trabajo tan rápido que puede proporcionar el servicio a cada usuario varias veces por segundo. Así, los programas de los usuarios aparentemente se ejecutan de manera simultánea. Una ventaja del tiempo compartido es que el usuario recibe respuestas casi inmediatas a las peticiones, en vez de tener que esperar los resultados durante largos periodos, como en los co mienzos de la computación. http://alexyniorlls.blogspot.com 62 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación en C++
7
1.5 Com putación personal, distribuida y cliente-servidor En 1977, Apple Computer popularizó el fenómeno de la computación personal. Al principio era el sue ño de todo aficionado. Las computadoras se hicieron lo suficientemente económicas para que la gente las pudiera adquirir para su uso personal o para negocios. En 1981, IBM, el vendedor de computado ras más grande del mundo, introdujo la PC de IBM. Literalmente, de la noche a la mañana, la compu tación personal se posicionó en las empresas, en la industria y en las instituciones gubernamentales. Sin embargo, estas computadoras eran unidades "independientes" (la gente hacía el trabajo en su propia máquina y transportaba sus discos de un lado a otro para compartir información). Aunque las primeras computadoras personales no eran lo suficientemente poderosas para compartir el tiem po entre muchos usuarios, estas máquinas podían interconectarse mediante redes, algunas veces me diante líneas telefónicas y otras mediante de redes de área local {LANs) dentro de la empresa. Esto derivó en el fenómeno denominado computación distribuida; en la cual la computación de la empre sa, en vez de realizarse dentro de un centro de cómputo, so distribuye a través de redes a los sitios en donde se realiza el trabajo de la empresa. Las computadoras personales eran lo suficientemente poderosas para manejar los requerimientos de cómputo de usuarios individuales, y para manejar las tarcas básicas de comunicación que involucraba la transferencia de información entre una compu tadora y otra, de manera electrónica. Las computadoras personales actuales son tan poderosas como las máquinas de un millón de dólares de hace apenas una década. Las máquinas de escritorio más poderosas (denominadas esta ciones de trabajo) proporcionan al usuario enormes capacidades. La información se comparte de ma nera muy sencilla a través de redes de computadoras, en donde algunas computadoras denominadas servidores de archivos ofrecen un lugar común de almacenamiento para programas y datos que podrían ser utilizados por computadoras cliente distribuidas a través de la red, de ahí el término de computación cliente/senidor. C++ se ha utilizado ampliamente para crear software para sistemas operativos, para redes de computadoras y para aplicaciones cliente-servidor distribuidas. Los siste mas operativos actuales más populares tales como UNIX. Linux, y los sistemas basados en Windows de Microsoft, proporcionan el tipo de capacidades que explicamos en esta sección.
1.6 Lenguajes máquina, lenguajes ensambladores, y de alto nivel Los programadores escriben instrucciones en diversos lenguajes de programación, algunos de estos lenguajes los comprende directamente la computadora, mientras que otros requieren pasos interme dios de traducción. En la actualidad se utilizan cientos de lenguajes de computación, los cuales se dividen en tres tipos generales: 1. Lenguajes máquina. 2. lenguajes ensambladores. 3. lenguajes de alto nivel. Cualquier computadora puede entender de manera directa sólo su propio lenguaje máquina. FJ lenguaje máquina es el “lenguaje natural” de una computadora en particular y está definido por el diseño del hardware de dicha computadora. Por lo general, los lenguajes máquina consisten en cade nas de números (que finalmente se reducen a unos (1) y ceros (0)) que instruyen a las computadoras para realizar sus operaciones más elementales, una por una. Los lenguajes máquina son dependien tes de la máquina, es decir, un lenguaje máquina en particular puede utilizarse solamente en un tipo de computadora. Los lenguajes máquina son difíciles de comprender para los humanos, como puede ver en el programa de lenguaje máquina de la siguiente sección, el cual suma el pago de las horas extras al sueldo base y lo almacena en el sueldo bruto. http://alexyniorlls.blogspot.com 63 of 1380.
8
Introducción a las computadoras y a la programación en C++
Capítulo 1
+1300042774 ♦1400593419 ♦1200274027
Conforme las computadoras se volvieron más populares, se hizo evidente que la programación en lenguaje máquina era demasiado lenta, tediosa y propensa a errores. En lugar de utilizar las cadenas de números que las computadoras pueden entender de manera directa, los programadores comenzaron a utilizar abreviaturas del inglés para representar las operaciones básicas de la computadora. Estas abreviaturas del inglés formaron la base de los lenguajes ensatnbladores. Se desarrollaron progra mas traductores llamados ensambladores, para convertir programas en lenguaje ensamblador a lengua je máquina a la velocidad de la computadora. La siguiente sección muestra un programa en lenguaje ensamblador que también suma el pago por horas extras al sueldo base y almacena el resultado en el sueldo bruto, pero de manera más clara que su equivalente en lenguaje máquina: LOAD ADD STORE
SUELDOBASE SUELDOEXTRA SUELDOBRUTO
Aunque dicho código es más claro para los humanos, será incomprensible para las computadoras, hasta que los ensambladores lo traduzcan a lenguaje máquina. El uso de las computadoras se incrementó rápidamente con la llegada de los lenguajes ensam bladores, pero éstos aún requerían muchas instrucciones para llevar a cabo las tarcas más sencillas. Para acelerar el proceso de programación se desarrollaron los lenguajes de alto nivel, en los que ins trucciones individuales llevan a cabo tarcas importantes. Los programas traductores, denominados compiladores, convierten programas escritos en lenguajes de alto nivel en lenguaje máquina. Los lenguajes de alto nivel permiten a los programadores escribir instrucciones que se parecen mucho al inglés común, y contienen la notación matemática común. Un programa de nómina escrito en un len guaje de alto nivel podría contener una instrucción como la siguiente: ■u«ldobruto - sueldobase ♦ sualdoextra
Obviamente, los lenguajes de alto nivel son mucho más recomendables, desde el punto de vista del programador, que los lenguajes máquina y ensamblador. C y C++ son los lenguajes de alto nivel más poderosos y más ampliamente utilizados. El proceso de compilación de un programa escrito en lenguaje de alto nivel a un lenguaje má quina puede tardar un tiempo considerable. Los programas intérpretes se desarrollaron para que pudieran ejecutar programas de alto nivel sin necesidad de compilar dichos programas a lenguaje máquina. Aunque la ejecución de los programas compilados es más rápida que los programas inter pretados, los intérpretes son populares dentro de ambientes de desarrollo de programas, en los cua les los programas se modifican de manera frecuente conforme se adicionan nuevas características y se corrigen los errores. Una vez que un programa es desarrollado, una versión compilada puede eje cutarse de manera más eficiente.
1.7 Historia de C y C++ C++ evolucionó de C, el cual, a su vez, evolucionó de dos lenguajes de programación anteriores, BCPL y B. En 1967, Martin Richards desarrolló BCPL como un lenguaje para escribir software pa ra sistemas operativos y compiladores. Ken Thompson modeló muchas de las características de C en su lenguaje B. luego del desarrollo de su contraparte BCPL y, en 1970, utilizó B para crear las pri meras versiones del sistema operativo UNIX en los laboratorios Bell, sobre una computadora DEC PDP-7. Tanto BCPL como B eran lenguajes “sin tipo” (cada dato ocupaba una “palabra” en memo http://alexyniorlls.blogspot.com 64 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación en C++
9
ria y, por ejemplo, el trabajo de procesar un elemento como un número completo o un número real era responsabilidad del programador). El lenguaje C evolucionó a partir de B; dicha evolución estuvo a cargo de Dennis Ritchic en los laboratorios Bell y, en 1972, se ¡mplcmentó en una computadora DEC PDP-11. C utiliza muchos con ceptos importantes de BCPL y B cuando agrega tipos de datos y otras características. Inicialmente, C se hizo muy popular como lenguaje de desarrollo para el sistema operativo UNIX. En la actualidad, la mayoría de los sistemas operativos están escritos en C y/o C++, y C se encuentra disponible para la mayoría de las computadoras, y es independiente del hardware. Con un diseño cuidadoso, es posible escribir programas en C que sean portables para la mayoría de las computadoras. Para fines de la década de los setenta, C evolucionó en lo que ahora se conoce como “C tradi cional”, ‘‘C clásico", o “C de Kemigham y Ritchie". La publicación que en 1978 Prentice Hall hicie ra del libro de Kemighan y Ritchie, El lenguaje de programación C, atrajo mucho la atención de la gente a dicho lenguaje. La amplia utilización de C para distintos tipos de computadoras (en ocasiones llamadas plata formas de hardware) ocasionó, desafortunadamente, muchas variantes. Éstas eran similares, pero a menudo incompatibles, lo que se volvió un problema serio para los desarrolladores que necesitaban escribir programas que se pudieran ejecutar en distintas plataformas. Entonces, se hizo evidente la necesidad de una versión estándar de C. En 1983, se creó el comité técnico X3J11 bajo la supervisión del American National Standards Committcc on Computers and Information Processing (X3), para “proporcionar una definición del lenguaje clara c independiente de la computadora”. En 1989, el estándar fue aprobado. ANSI cooperó con la International Organization for Standardization (ISO) para estandarizar C a nivel mundial; el documento conjunto del estándar se publicó en 1990 y se le conoce como ANSI/ISO 9899: 1990. Las copias de este documento pueden solicitarse a la ANSI. La segunda edición del libro de Kemighan y Ritchie, publicada en 1988, menciona esta versión deno minada ANSI C, una versión del lenguaje que actualmente se utiliza a nivel mundial. Tip de p o rtab ilid o d 1.1 Debido a que C es un lenguaje ampliamente disponible, independiente de la plataforma, y estandari zado, las aplicaciones escritas en C a menudo pueden ejecutarse sobre un amplio rango de sistemas de cómputo con muy pocas o ninguna modificación.
A principios de la década de los ochenta, Bjarne Stroustrup desarrolló una extensión de C en los laboratorios Bell: C++. C++ proporciona un conjunto de características que “pulen" al lenguaje C; pero lo más importante, proporciona la capacidad de una programación orientada a objetos. Una revolución se está gestando en la comunidad del software. Escribir software rápida, correc ta y económicamente es aún una meta escurridiza, en una época en la que la demanda de nuevo y más poderoso software se encuentra a la alza. Los objetos son, esencialmente, componentes reutilizables de software que modelan elementos reales. Los desarrolladores de software están descubrien do que utilizar una metodología de diseño e implementación modular y orientada a objetos puede hacer más productivos a los grupos de desarrollo de software, que mediante las populares técnicas de programación anteriores, tales como la programación estructurada. Los programas orientados a objetos son más fáciles de comprender, corregir y modificar. Se han creado muchos otros lenguajes orientados a objetos, incluyendo a Smalltalk, desarrollado por Xerox en su Centro de Investigaciones de Palo Alto (PARC). Smalltalk es un lenguaje orientado a objetos puro (literalmente todo es un objeto). C++ es un lenguaje híbrido (en él es posible programar tanto en estilo C, como en estilo orientado a objetos, o en ambos). http://alexyniorlls.blogspot.com 65 of 1380.
10
Introducción a las computadoras y a la programación en C++
Capítulo 1
1.8 La Biblioteca estándar de C++ Los programas de C++ constan de piezas llamadas clases y funciones. Usted puede programar cada pieza que necesite para formar un programa en C++. Sin embargo, la mayoría de quienes programan en C++ aprovechan la ventaja de su rica colección de clases y funciones existentes dentro de la bi blioteca estándar de C++. Además, en realidad existen dos partes que se deben aprender en el “mun do" de C++. La primera es aprender el lenguaje C-»-+ en sí mismo; la segunda es aprender a utilizar las funciones y clases de la biblioteca estándar de C++. A través de este libro, explicaremos muchas de estas clases y funciones. El libro de Plaugcr2 es una lectura obligada para los programadores que necesiten comprender más profundamente las funciones de la biblioteca de C de ANSI que se inclu yen en C++, cómo emplearlas y cómo utilizarlas para escribir código portable. Los fabricantes de los compiladores generalmente proporcionan las bibliotecas estándares de clases. Muchas bibliotecas de clases para propósitos especiales puede adquirirlas de fabricantes de software independientes. O b se rv a c ió n d e ingeniería d e softw are 1.1 Utilice un “método de construcción en bloques " para crear programas. Evite reinveniar la rueda. Uti lice, si es posible, piezas existentes (a esto se le denomina "reutilización de software ” y es vital para la programación orientada a objetos).
O b se rv a c ió n d e ingeniería de softw are 1.2 Cuando se programa en C+ +, generalmente se utilizan los siguientes bloques de construcción: clases y funciones de la biblioteca estándar de C++. clases y funciones creadas por uno mismo, y clases y funciones populares de diversos proveedores adicionales.
[Nota: Incluimos muchas de estas Observaciones de ingeniería de software a través de todo el tex to para explicar conceptos que afectan o mejoran la arquitectura y la calidad de un sistema de software en general, y, en particular, de sistemas de software grandes. También resaltamos las Rueños prácticas de programación (prácticas que le pueden ayudar a escribir programas más claros, más comprensibles, de fácil mantenimiento, y más fáciles de probar y corregir), los Errores comunes de programación (pro blemas de los que se tiene que cuidar, de manera que no los cometa dentro de sus programas), Tips de rendimiento (técnicas que le ayudarán a escribir programas que se ejecuten más rápido y ocupen menos memoria), Tips de portabilidad (técnicas que le ayudarán a escribir programas que se ejecuten, con po ca o ninguna modificación, en una variedad de computadoras) y Tips de prueba y depuración (técnicas que le ayudarán a corregir errores en sus programas, y lo más importante, técnicas que le ayudarán a es cribir en primera instancia, programas libres de errores). Muchas de estas técnicas y prácticas sólo son guías; usted deberá, sin duda alguna, desarrollar su propio estilo de programación preferido.] 1.a ventaja de crear sus propias funciones y clases es que sabrá exactamente cómo funcionan y podrá examinar el código de C++. La desventaja es el tiempo y esfuerzos que acompañan al diseño, el desarrollo y el mantenimiento para que las nuevas funciones y clases sean correctas y para que operen de manera eficiente. Tip d e rendim iento 1.1 Utilizar las funciones y clases de la biblioteca estándar en lugar de escribir sus propias versiones pue de mejorar el rendimiento del software, esto se debe a que dicho software está escrito cuidadosamen te para que se ejecute de manera eficiente y correcta
Tip d e p o rtab ilid ad 1.2 Utilizar las funciones y clases de la biblioteca estándar en lugar de escribir las suyas propias puede mejorar la portabilidad del programa, debido a que este software se incluye en casi todas las implementaciones de C++. 2. P. J. Plaugcr, The Standard C Library (F.nglcwood Cliffs, NJ: Prcnticc Hall, 1992).
http://alexyniorlls.blogspot.com 66 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
11
1.9 Java Mucha gente cree que el próximo campo importante en el que los microprocesadores tendrán un im pacto profundo es en los dispositivos electrónicos inteligentes para uso doméstico. Al reconocer es to, Sun Microsystems patrocinó, en 1991, un proyecto de investigación de la empresa denominado Green. El proyecto desembocó en el desarrollo de un lenguaje basado en C y C++, al que su crea dor, James Gosling, llamó Oak, debido a un roble que tenía a la vista desde su ventana en las ofici nas de Sun. Posteriormente se descubrió que ya existía un lenguaje de programación con el mismo nombre. Cuando un grupo de gente de Sun visitó una cafetería local, sugirieron el nombre Java (una variedad de café), y así se quedó. Pero el proyecto Green tuvo algunas dificultades. El mercado para los dispositivos electrónicos inteligentes de uso doméstico no se desarrollaba tan rápido como Sun había anticipado. Peor aún, un contrato importante por el que Sun había competido, se le otorgó a otra empresa. De manera que el proyecto corría peligro de ser cancelado. Pero para su buena fortuna, la popularidad de World Widc Web explotó en 1993 y la gente de Sun se dio cuenta de inmediato del potencial de Java para crear contenido dinámico para páginas Web. Sun anunció formalmente a Java en una exposición profesional que tuvo lugar en mayo de 1995. De inmediato, Java generó interés dentro de la comunidad de negocios debido a la fenomenal explo sión de la World Wide Web. En la actualidad, Java se utiliza para crear páginas Web con contenido dinámico e interactivo, para desarrollar aplicaciones a gran escala, para aumentar la funcionalidad de los servidores Web (las computadoras que proporcionan el contenido que vemos en los navegadores Web), para proporcionar aplicaciones para dispositivos domésticos (como teléfonos celulares, loca lizadores y asistentes digitales personales) y más. En 1995, estábamos siguiendo el desarrollo de Java. En noviembre de 1995, asistimos a una con ferencia sobre Internet que tuvo lugar en Boston. Un representante de Sun Microsystems dio una ani mada presentación sobre Java. Mientras la plática se llevaba a cabo, se hizo evidente para nosotros que Java tendría un papel importante en el desarrollo de páginas Web interactivas y con multimedia. Sin embargo, inmediatamente vimos un potencial mucho mayor para el lenguaje. Vimos a Java como un buen lenguaje para enseñar a los estudiantes de primer año de programa ción la esencia de las gráficas, imágenes, audio, vídeo, bases de datos, redes, computación de múl tiples subproccsos y de colaboración. Entonces trabajamos en la primera edición de Cómo progra mar en Java el cual se publicó a tiempo para el inicio de clases en otoño de 19%. Ahora vamos en la quinta edición de esa obra. Además de su prominencia para desarrollar aplicaciones para Internet e intranets. Java se ha convertido en el lenguaje de elección para implcmentar software para dispositivos que se comunican a través de una red (tales como teléfonos celulares, localizadores y asistentes electrónicos persona les). ¡No se sorprenda si su nuevo equipo de sonido y otros dispositivos de su hogar pueden conec tarse entre sí mediante el uso de tecnología Java!
1.10 Visual Basic, Visual C++ y C# El desarrollo de aplicaciones para Windows en lenguajes tales como C y C++ demostró ser un pro ceso difícil y engorroso. Cuando Bill Gates fundó Microsoft Corporation, implantó BASIC en muchas de las primeras computadoras personales. BASIC (Beginner’s All-Purpose Symbolic Instruction Code, Código de instrucciones simbólicas de uso general para principiantes) es un lenguaje de pro gramación desarrollado a mediados de la década de los sesenta por los profesores John Kemcny y Tilomas Kurtz del Dartmouth College como un lenguaje para escribir programas sencillos. El pro pósito principal de BASIC era familiarizar a los principiantes con las técnicas de programación. luí http://alexyniorlls.blogspot.com 67 of 1380.
12
Introducción a las computadoras y a la programación en C++
Capítulo 1
evolución natural de BASIC a Visual Basic se introdujo en 1991 como resultado del desarrollo de la interfaz gráfica de usuario (GUI) denominada Windows, a finales de la década de los ochenta y principios de los noventa. Aunque Visual Basic se derivó del leguaje de programación BASIC, es un lenguaje radicalmen te distinto que ofrece características muy poderosas, como interfaces gráficas de usuario, manejo de eventos, acceso a la Win32 API (Interfaz de programación de aplicaciones de 32 bits de Windows), programación orientada a objetos y manejo de errores. Visual Basic es una de las interfaces de pro gramación visuales y orientadas a eventos más populares. I-a versión más reciente de Visual Basic, denominada Visual Basic .N ET' está diseñada para la nueva plataforma de programación de Microsoft: .NET. Las primeras versiones de Visual Basic pro porcionaban las capacidades de la programación orientada a objetos, pero Visual Basic .NFT ofrece orientación a objetos de manera avanzada y hace uso de la poderosa biblioteca de componentes de software reutilizable dentro de .NET. Visual C++ es una implcmcntación de Microsoft de C++, la cual incluye extensiones propias de Microsoft al lenguaje. En un principio, la programación de gráficos y GUI con Visual C++ se implementaba mediante la MFC (Microsoft Foundation Classes). Actualmente, con la introducción de .NET, Microsoft proporciona una biblioteca común para implementar GUls, gráficos, redes, múlti ples subprocesos y otras opciones. Esta biblioteca se comparte entre Visual Basic, Visual C++ y C#, el nuevo lenguaje de Microsoft. El avance en las herramientas de programación (por ejemplo, C++ y Java) y en los dispositivos electrodomésticos (por ejemplo, los teléfonos celulares) creó problemas y nuevos requerimientos. 1.a integración de componentes de software de varios lenguajes resultó difícil, y los problemas de ins talación eran comunes debido a que las nuevas versiones de los componentes compartidos eran incompatibles con el viejo software. Los dcsarrolladorcs descubrieron también que necesitaban apli caciones para Web que se pudieran acceder y utilizar mediante Internet. Como resultado de la popu laridad de los dispositivos electrónicos móviles, los dcsarrolladorcs de software se dieron cuenta de que sus clientes no estaban restringidos a sus computadoras de escritorio y descubrieron la necesi dad de software que fuera accesible para todos y que estuviera disponible a través de casi cualquier tipo de dispositivo. Para cubrir estas necesidades, Microsoft anunció su iniciativa .NET y el lengua je de programación CU. En la plataforma .NET las aplicaciones para Web pueden distribuirse a una gran variedad de dis positivos (incluso teléfonos celulares). Esta plataforma ofrece un nuevo modelo de desarrollo de software que permite que las aplicaciones creadas en lenguajes de programación distintos se comu niquen entre sí. El lenguaje de programación C#, desarrollado en Microsoft por Anders Hcjlsbcrg y Scott Wiltamuth. fue diseñado especialmente para la plataforma .NET como un lenguaje que permi tiera a los programadores migrar fácilmente a .NET. Esta migración se hace fácil debido a que C# tiene sus raíces en C, C++ y Java, con la adaptación de las mejores características de cada uno y la adición de otras nuevas propias de este lenguaje. Debido a que C# se construyó con base en lengua jes bien desarrollados y ampliamente utilizados, aprender C# es fácil y agradable. C# es un lenguaje de programación visual, manejador de eventos, y completamente orientado a objetos, en el que los programas se crean mediante el uso de un Ambiente Integrado de Desarrollo (IDE). Con el IDE, los programadores pueden crear, ejecutar, probar y corregir programas de C# de manera conveniente, y por tal motivo, reducir el tiempo requerido para crear un programa funcional en una fracción del tiempo que se necesitaría si no se utilizara el IDE. El proceso de crear de mane ra rápida una aplicación mediante un IDE se denomina Desarrollo Rápido de Aplicaciones (RAD).3 3. El lector que se interese en Visual Basic .NET podría considerar el libro. Visual Basic .NET. de David Chappell o Visual Basic .NET de Duncan Mackenzie, ambos publicados por esta editorial.
http://alexyniorlls.blogspot.com 68 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
13
C# también permite un nuevo grado de interoperabilidad: los componentes de software de dife rentes lenguajes pueden intcractuar como nunca antes. Los dcsarrolladorcs pueden empacar incluso software viejo, para que funcione con nuevos programas en C#. Además, las aplicaciones C# pue den interactuar vía Internet.
1.11 Otros lenguajes de alto nivel Se han desarrollado cientos de lenguajes de alto nivel, pero solamente unos cuantos han conseguido una amplia aceptación. Entre 1954 y 1957 IBM Corporation desarrolló FORTRAN (FORmula TRANslator), para utilizarlo en aplicaciones científicas y de ingeniería que requerían cálculos mate máticos complejos. Actualmente, FORTRAN se utiliza ampliamente, en especial en aplicaciones para ingeniería. COBOL (COmmon Business Oriented Languaje, Lenguaje común orientado a negocios) fue de sarrollado en 1959 por fabricantes de software, el gobierno de Estados Unidos y usuarios de compu tadoras de la industria. COBOL se utiliza en aplicaciones comerciales que requieren una manipulación eficiente y precisa de grandes volúmenes de datos. Mediante algunas estimaciones, más de la mitad de todo el software de negocios aún se programa en COBOL. El profesor Niklaus Wirth diseñó Pascal más o menos al mismo tiempo en que se diseñó C, y su diseño tenía como objetivo el uso académico, fin la siguiente sección, hablaremos más sobre Pascal.
1.12 Program ación estructurada Durante la década de los sesenta, muchos de los grandes esfuerzos para el desarrollo de software en contraron severas dificultades. Los itinerarios de software generalmente se retrasaban, los costos re basaban en gran medida a los presupuestos y los productos terminados no eran confiables. La gente comenzó a darse cuenta de que el desarrollo de software era una actividad mucho más compleja de lo que habían imaginado. Las actividades de investigación en la década de los sesenta dieron como resultado la evolución de la programación estructurada (un método disciplinado para escribir pro gramas que son más claros, fáciles de probar y corregir, y más fáciles de modificar que los no es tructurados, en el capítulo 2 explicaremos los principios de la programación estructurada. Y en los capítulos 3 a 5 desarrollaremos muchos programas estructurados. Uno de los resultados más tangibles de esta investigación fue el desarrollo del lenguaje de pro gramación Pascal por Niklaus Wirth, en 1971. Pascal, cuyo nombre se debe al aniversario de los sete cientos años del nacimiento del filósofo y matemático Blas Pascal, fue diseñado para la enseñanza de la programación estructurada en ambientes académicos; y de inmediato se convirtió en el lengua je de programación favorito en varias universidades. Desafortunadamente, el lenguaje carecía de muchas de las características necesarias para poder utilizarse en aplicaciones comerciales, industria les y gubernamentales, de manera que no ha sido muy aceptado fuera de las universidades. El lenguaje de programación Ada se desarrolló bajo el patrocinio del Departamento de Defensa de los Estados Unidos (DoD) durante la década de los setenta y principios de la década de los ochen ta. Cientos de lenguajes se utilizaron para producir los sistemas de software masivos de comando y control del departamento de defensa. El departamento de defensa quena un lenguaje único que pudie ra cubrir la mayoría de sus necesidades. Pascal fue elegido como base, pero al final, el lenguaje Ada fue muy diferente a Pascal. El nombre del lenguaje es en honor de Lady Ada Lovelace, hija del poe ta Lord Byron. A I^ady Lovelace se le atribuye el haber escrito el primer programa para computado ras en el mundo, a principios de la década de los ochenta (para la Máquina Analítica, un dispositivo de cómputo creado por Charles Babbage). Una de las características importantes de Ada se denomi na multitareas; esto permite a los programadores especificar que ocurrirán varias tarcas en paralelo. http://alexyniorlls.blogspot.com 69 of 1380.
14
Introducción a las computadoras y a la programación en C++
Capítulo 1
Los otros lenguajes de alto nivel más populares que hemos explicado (incluyendo C y C++) general mente permiten al programador escribir programas que realizan solamente una actividad a la vez.
1.13 La tendencia clave del software: tecnología de objetos Uno de los autores, HMD, recuerda la gran frustración que sentían las empresas de desarrollo de software, especialmente aquellas que desarrollaban proyectos a gran escala. Durante sus años de es tudiante, en los veranos. HMD tuvo el privilegio de trabajar en una empresa líder en la fabricación de computadoras como parte de los equipos de desarrollo de sistemas operativos con tiempo compar tido y memoria virtual. Ésta fue una gran experiencia para un estudiante universitario. Sin embargo, en el verano de 1967, la realidad llegó cuando la empresa “decidió” producir de manera comercial el sistema en el que cientos de personas habían trabajado durante muchos años. Era difícil poner a punto este software. El software es un “asunto complejo”. Las mejoras a la tecnología de software comenzaron a aparecer con los beneficios de la denomi nada programación estructurada (y las disciplinas relacionadas como el análisis y diseño de siste mas estructurados) que se realizaba en la década de los setenta. Pero no fue hasta que la tecnología de la programación orientada a objetos se hizo popular en la década de los noventa, que los desarro lladores de software sintieron que tenían las herramientas necesarias para realizar mayores adelan tos en el proceso de desarrollo de software. En realidad, la tecnología de objetos data de mediados de la década de los sesenta. El lenguaje de programación C++, desarrollado en AT&T por Bjarne Stroustrup a principios de la década de los ochenta, se basa en dos lenguajes: C, el cual se desarrolló inicial mente en AT&T para implementar el sistema operativo UNIX, a principios de la década de los setenta; y Simula 67, un lenguaje de programación para simulación desarrollado en Europa y liberado en 1967. C++ absorbió las carac terísticas de C y adicionó las capacidades de Simula para crear y manipular objetos. Ni C ni C++ se crearon originalmente para ser utilizados fuera de los laboratorios de investigación de AT&T. Sin embargo, se desarrollaron con rapidez. ¿Qué son los objetos y por qué son tan especiales? En realidad, la tecnología de objetos es un esquema de compactación que permite crear unidades útiles de software. Éstas son grandes y al tamente enfocadas a ámbitos de aplicación particulares. Existen objetos de datos, de tiempo, de che ques, de facturas, de audio, vídeo, de archivo, de registro, y otros más. De hecho, casi cualquier sustantivo puede representarse razonablemente como un objeto. Vivimos en un mundo de objetos. Sólo mire a su alrededor. Existen automóviles, aviones, gen te, animales, edificios, semáforos, elevadores, y otras cosas. Antes de la aparición de los lenguajes orientados a objetos, los lenguajes de programación (tales como FORTRAN, Pascal, Basic y C) se basaban en acciones (verbos), en lugar de cosas u objetos (sustantivos). Los programadores, que vi ven en un mundo de objetos, programan primordial mente mediante el uso de verbos. Este cambio de paradigma complicó la escritura de programas. Ahora, con la disponibilidad de los lenguajes orien tados a objetos tales como Java y C++, los programadores siguen viviendo en un mundo orientado a objetos y pueden programar de una manera orientada a objetos. Éste es un proceso más natural de programación, y ha dado como resultado un mayor grado de productividad. Un problema fundamental con la programación basada en procedimientos es que las unidades de programación no reflejan de manera fácil y efectiva a las entidades del mundo real; así, estas uni dades no son particularmente reutilizables. Con gran frecuencia los programadores deben comenzar “de nuevo” cada nuevo proyecto y escribir código similar “desde cero". Esto significaba un gasto de tiempo y de dinero, ya que la gente tenía que “reinventar las cosas” repetidamente. Mediante la tec nología de objetos, las entidades de software creadas (llamadas clases), si se diseñan apropiadamen te tienden a ser mucho más reutilizables en proyectos futuros. Con las bibliotecas de componentes http://alexyniorlls.blogspot.com 70 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
15
reutilizables. tales como la MFC {Microsoft Foundation Classes) y las creadas por Rogue Wave y muchas otras empresas dcsarrolladoras de software, se puede reducir la cantidad del esfuerzo reque rido para ¡mplementar ciertas clases de sistemas (comparadas con el esfuerzo que se hubiera requeri do para reinventar estas capacidades en nuevos proyectos). Algunas empresas indican que la reutilización de software no es, de hecho, el principal benefi cio que obtienen de la programación orientada a objetos. Más bien, mencionan que la programación orientada a objetos tiende a producir software que es más comprensible, mejor organizado y fácil de mantener, modificar y corregir. Esto puede ser importante debido a que se estima que el 80% de los costos de software no están asociados con los esfuerzos originales para el desarrollo de software, es tán asociados con la continua evolución y mantenimiento de esc software durante su vida útil. Cualesquiera que sean los beneficios que se perciban de la programación orientada a objetos, es claro que ésta será la metodología clave de la programación para las siguientes décadas. La ventaja de crear su propio código es que usted sabrá exactamente cómo funciona. Será capaz de examinar el código. La desventaja es el tiempo y esfuerzos que implica el diseño c ¡mplcmcntación de nuevo código. O b se rva ció n d e ingeniería de softw are 1.3 Las amplias bibliotecas de clases de componentes de software reutilizable se encuentran disponibles en Internet y en World Wide Web. Muchas de estas bibliotecas están disponibles de manera gratuita
1.14 Conceptos básicos de un ambiente típico C++4 En general, en C++ los sistemas ++ consisten en tres partes: un ambiente de desarrollo de progra mas, el lenguaje y la biblioteca estándar de C++. La siguiente explicación define un ambiente de de sarrollo típico para C++ como el que muestra la figura 1.1. Generalmente, los programas en C++ pasan a través de seis fases para ejecutarse (figura 1.1). Éstas son: edición, preproceso, compilación, enlace, carga y ejecución. La primera fase consiste en editar un archivo. Esto se lleva acabo mediante un programa de edición. El programador captura el programa en C++ mediante un editor y hace las correcciones necesarias. Entonces, el archivo del programa fuente se almacena en un dispositivo secundario de almacena miento tal como un disco. Los nombres de programa en C++ a menudo terminan con las extensiones • cpp. ,c x x . . e c o .C (observe que C se encuentra en mayúscula). Vea la documentación especí fica para su ambiente en C-h -, para mayor información sobre los nombres de extensiones de archi vo. Dos de los editores más utilizados en UNIX son v i , y em acs. Los paquetes de software de C++ para Windows de Microsoft, tales como C++ de Borland, Code Warrior de Metrowerks y Visual C++ de Microsoft, contienen editores internos que están integrados dentro del ambiente de progra mación. Asumimos que el lector sabe cómo editar un programa. En la siguiente fase, el programador introduce el comando para compilar el programa. El com pilador traduce el programa C++ a código en lenguaje máquina (también denominado código obje to). En un sistema C++. un programa preprocesador ejecuta de manera automática antes de que el compilador comience la traducción. El preprocesador de C++ obedece a comandos denominados di rectivas del preprocesador, los cuales indican que se ejecutarán ciertas manipulaciones en el progra ma antes de la compilación. Estas manipulaciones usualmente incluyen la compilación de otros 4. Fn nuestro sitio Web www.dttital.cora/booka/downloada.html. proporcionamos las publicaciones Dfjtel™ Dive I vto™ para ayudarle a utilizar distintas herramientas de programación populares para C-m -, inclu yendo Borland* C-M-Buildcr™, Microsoft* Visual C-m -* 6, Microsoft* Visual C++*. NET, ambientes GNU C-m para Linux y GNU C-m - para Cygwin™ UNIX* para Windows®. Pondremos a su disposición otras publicaciones Dive Into™ a petición de los maestros.
http://alexyniorlls.blogspot.com 71 of 1380.
16
Introducción a las computadoras y a la programación en C++
Capítulo 1
B programador crea el programa dentro del editor y lo almacena en disco.
0 programa preprocesador procesa el código.
B compilador creo código objeto y to almacena en disco. 0 enlazodor relaciona el código objeto con las bibliotecas, crea un archivo ejecutable y lo almacena en disco. Memoria
B cargador coloca el programa en memoria.
Memoria principal
La CPU toma ca da Instrucción y la ejecuta, posiblemente almacena nuevos valores de datos mientras el programo se ejecuto.
Figura 1.1
Ambiente típico d e desarrollo d e C++.
archivos de texto y realizan distintos reemplazos de texto. En los primeros capítulos, explicaremos las directivas más comunes del preprocesador; una explicación detallada de todas las características del preprocesador aparecen en el capítulo 19. El preprocesador se invoca mediante el compilador, antes de que el programa sea convertido en lenguaje máquina. La siguiente fase se denomina enlace. Por lo general, los programas en C++ contienen referen cias a las funciones y datos definidos en alguna parte, tales como las bibliotecas estándar o las bi bliotecas privadas de grupos de programadores que trabajan en un proyecto en particular. El código objeto producido por el compilador de C++ contiene, por lo general, “huecos”, debido a estas partes http://alexyniorlls.blogspot.com 72 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
17
faltantes. Un enlazador enlaza el código objeto con el código correspondiente a las funciones faltantcs para producir una imagen ejecutable (sin piezas faltantes). Si el programa se compila y se enla za de manera correcta, se produce una imagen ejecutable. Ésta es la imagen ejecutable de nuestro programa b i e n v e n i d a . cpp. La siguiente fase se denomina carga. Antes de que el programa se pueda ejecutar, éste debe car garse en memoria. Esto se lleva a cabo mediante el cargador, el cual toma la imagen ejecutable del disco y la transfiere a la memoria. Se cargan también los componentes adicionales de las bibliotecas compartidas que soportan el programa. Finalmente, la computadora, bajo el control de la CPU, ejecuta el programa, una instrucción a la vez. Los programas no siempre funcionan al primer intento. Cada uno de los procedimientos puede fallar debido a distintos errores, los cuales explicaremos. Por ejemplo, un programa en ejecución po dría intentar hacer una división entre cero (una operación ¡legal en las computadoras, así como en la aritmética). Esto ocasionaría que la computadora desplegara un mensaje de error. El programador volvería entonces a la fase de edición, haría las correcciones necesarias y procedería de nuevo a tra vés de las siguientes fases para determinar cuáles correcciones funcionan correctamente. Error c o m ú n de p ro g ra m a ció n 1.1 Errores como la división entre cero ocurren durante la ejecución del programa, así que estos errores son denominados errores en tiempo de ejecución. Gene raímente, la división entre cero es un error fatal, es decir, un error que ocasiona la terminación inmediata del programa sin haber realizado de manera exitosa su trabajo, lo s errores no fatales permiten al programa la ejecución completa, en su mayo ría con resultados incorrectos. (Nota: en algunos sistemas, la división entre cero no es un error fatal. Revise la documentación de su sistema.)
La mayoría de los programas en C++ introducen y/o arrojan datos. Ciertas funciones en C++ toman su entrada desde c i n (el flujo estándar de entrada; se pronuncia “c-in,r) la cual es, por lo ge neral, el teclado, pero el c i n puede conectarse a otro dispositivo. Por lo general, los datos son arro jados hacia c o u t (el flujo estándar de salida) el cual, por lo general, es el monitor, pero el c o u t puede conectarse a otro dispositivo. Cuando decimos que un programa imprime un resultado, normal mente nos referimos a que el resultado se despliega en el monitor. Los datos pueden ser arrojados hacia otros dispositivos tales como discos e impresoras de alta velocidad. Existe también un flujo es tándar de errores denominado c e r r . El flujo c e r r (por lo general conectado al monitor) se utiliza para desplegar los mensajes de error. Es común para los usuarios destinar los datos de salida norma les, es decir, el c o u t. hacia un dispositivo distinto al monitor y mantener el c e r r asignado al mo nitor, de manera que el usurario pueda estar informado de los errores de manera inmediata.
1.15 Tendencias de hardware 1.a comunidad de programadores se desarrolla junto con el flujo dramático y continuo de avances en el hardware, el software, y las tecnologías de comunicación. En general, cada año la gente espera pa gar más por la mayoría de los servicios y productos. Lo contrario ha sido el caso en los campos de las computadoras y las comunicaciones, especialmente con respecto a los costos de mantenimiento de estas tecnologías. Por muchas décadas, y sin expectativas de cambio alguno en un futuro próxi mo, los costos de hardware han disminuido de manera rápida, si no precipitada. Éste es un fenóme no de la tecnología. Cada uno o dos años, las capacidades de las computadoras, especialmente la can tidad de memoria con la que cuentan para ejecutar los programas, la cantidad de almacenamiento secundario (como el almacenamiento en disco) que tienen para almacenar los programas y los datos por un largo periodo, y sus velocidades de proceso (la velocidad a la cual las computadoras ejecutan sus programas, es decir, hacen su trabajo) tienden a duplicarse. Lo mismo es verdad en el campo de http://alexyniorlls.blogspot.com 73 of 1380.
18
Introducción a las computadoras y a la programación en C++
Capítulo 1
las comunicaciones cuyos costos han ¡do en picada, especialmente en años recientes con la enorme demanda por ancho de banda de comunicaciones, la cual atrae una enorme competencia. No cono cemos de otros campos en los que la tecnología se mueva tan rápidamente y los costos disminuyan de la misma forma. Cuando el uso de las computadoras explotó en la década de los sesenta y en la de los setenta, se dijo mucho respecto a las grandes mejoras en la productividad humana que la computación y las co municaciones traerían como consecuencia. Pero estas mejoras no se materializaron. Las empresas gastaban vastas sumas en computadoras y, ciertamente, en su uso efectivo, pero sin materializar la productividad que se había estado esperando. Fue la invención de la tecnología del chip-micropro cesador y su gran despegue a finales de la década de los setenta y principios de la de los ochenta lo que sentó las bases para mejorar la productividad en la década de los noventa y en el nuevo milenio.
1.16 Historia de internet A finales de la década de los sesenta, uno de los autores (HMD) era un estudiante egresado del MIT. Sus investigaciones dentro del proyecto Mac del MIT (ahora el laboratorio de ciencias de la compu tación), la casa del Word Wide Web Consortium), era patrocinada por ARPA (Advanced Research Projects Agency of the Department of Defense). ARPA patrocinó una conferencia en la que algunas docenas de estudiantes del proyecto se reunieron en la universidad de Illinois, en Urbana-Champaign, para conocer y compartir sus ¡deas. Durante esta conferencia, ARPA difundió el anteproyecto para conectar en red a las principales computadoras de una docena de universidades e institutos de inves tigación patrocinados por ARPA. Éstas se conectarían mediante líneas de comunicación que opera ban, en ese entonces, a la sorprendente velocidad de 56 Kb (es decir, 56,0(X) bits por segundo), esto en una época en la que la mayoría de la gente (de los pocos que podían estarlo) se conectaba me diante las líneas telefónicas a las computadoras a un rango de velocidad de 110 bits por segundo. HMD recuerda lúcidamente la emoción en aquella conferencia. Investigadores de Harvard hablaron acerca de comunicar la Univac 1108, “una supercomputadora” de la universidad de Utah, con todo el país, para manejar los cálculos relacionados con sus investigaciones sobre gráficos por computa dora. Se comentaron muchas otras posibilidades intrigantes. La investigación académica estaba a punto de dar un paso gigantesco hacia adelante. Poco después de esta conferencia, ARPA procedió con la implantación de lo que pronto se convirtió en ARPAnet, el abuelo de la Internet actual. Las cosas resultaron diferentes a lo que se había planeado originalmente. En lugar de que el principal beneficio fuera el que los investigadores pudieran compartir sus computadoras, se hizo evi dente que el permitir simplemente que los investigadores se comunicaran de una manera rápida y fácil entre ellos, por medio de lo que se llamó correo electrónico (,e-rnail), iba a ser el principal be neficio de ARPAnet. Esto es verdad incluso en la actualidad, en donde el correo electrónico facilita la comunicación de todo tipo de personas alrededor del mundo. Una de las principales metas de ARPA, con respecto a la red, era permitir que múltiples usua rios enviaran y recibieran información al mismo tiempo, y sobre las mismas rutas de comunicación (tal como líneas telefónica). 1.a red operaba mediante una técnica denominada intercambio Je pa quetes, en la cual un dato digital se enviaba en pequeños paquetes. Los paquetes contenían datos, in formación de la dirección, información para control de errores y la información de la secuencia. La información sobre la dirección se utilizaba para establecer la ruta de los paquetes a su destino. La in formación de secuencia se empleaba para ayudar a reensamblar los paquetes (los cuales, debido a los complejos mecanismos de ruteo, en realidad pueden llegar en desorden) en su orden original para presentarlos en su destino. Los paquetes de muchas personas se mezclaban en las mismas líneas de comunicación. La técnica de intercambio de paquetes redujo de manera importante los costos de transmisión, comparados con los costos de las lincas de comunicación dedicadas. http://alexyniorlls.blogspot.com 74 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
19
La red se diseñó para operar sin un control central. Esto significaba que si una porción de la red fallaba, las porciones restantes podrían ser capaces de enviar paquetes, de los remitentes a los desti natarios. a través de rutas alternativas. Los protocolos para la comunicación a través de ARPAnet se hicieron conocidos como TCP (Transmission Control Protocol). TCP aseguraba que los mensajes se enrutaran apropiadamente del remitente al destinatario, y que los mensajes llegaran intactos. En paralelo con la primera evolución de Internet, las empresas de todo el mundo estaban ins talando sus propias redes de comunicación, tanto intraempresarial (dentro de la empresa), como interempresarial (entre las empresas). Apareció una gran cantidad de hardware y software para re des. Uno de los desafíos era lograr la intercomunicación. ARPA lo logró mediante el desarrollo de IP (Internet Protocol), y con ello creó la verdadera “red de redes”, la arquitectura actual de Internet. A la combinación de ambos protocolos se le denomina TCP/IP. Inicialmcntc, el uso de Internet estaba limitado a las universidades y a los institutos de investi gación; entonces, la milicia se convirtió en un usuario importante. En algún momento, el gobierno permitió el acceso a Internet con fines comerciales. De entrada, hubo recelo por parte de las co munidades militares y de investigación, pensaban que el tiempo de respuesta se haría más lento con forme “la red" se saturara de usuarios. De hecho, ha ocurrido lo contrario. La gente de negocios rápidamente so dio cuenta de que haciendo uso efectivo de Internet, podrían afinar sus operaciones y ofrecer nuevos y mejores servicios a sus clientes. Como resultado, los ejecutivos de negocios gas taron grandes cantidades de dinero para desarrollar y mejorar Internet. Esto generó una feroz com petencia entre los proveedores de dispositivos de comunicación, hardware y software para cubrir la demanda. El resultado es que el ancho Je banda (es decir, la capacidad de transmisión de informa ción de las líneas de comunicación) sobre Internet ha crecido enormemente y los costos han ¡do en picada.
1.17 Historia d© la World Wid© Web 1.a World Wide Web permite a los usuarios de computadoras, localizar y ver documentos basados en multimedia (es decir, documentos con texto, gráficos, animación, audio y/o vídeo) de casi cualquier tema. Aunque Internet se desarrolló hace más de tres décadas, la introducción de World Wide Web fue un suceso relativamente reciente. En 1990, Tim Berners-Lee de la CERN (Europcan Organization for Nuclear Research) desarrolló la World Wide Web y los distintos protocolos de comunicación que forman su esqueleto. Tanto Internet como World Wide Web estarán en la lista de las creaciones más importantes y profundas de la humanidad. En el pasado, la mayoría de las aplicaciones de cómputo se ejecutaban sobre computadoras “independientes", es decir, computadoras que no estaban conectadas entre sí. Las aplicaciones actuales pueden ser escritas para comunicar a cientos miles de computadoras alre dedor del mundo. Internet mezcla las tecnologías de comunicación y computación. Hace más fácil nuestro trabajo. Hace que la información esté disponible de manera instantánea y conveniente a ni vel mundial. Hace posible que los individuos y los pequeños negocios puedan exponerse a nivel mundial. Está modificando la naturaleza de la forma en que se llevan a cabo los negocios. La gente puede buscar los mejores precios y virtual mente cualquier producto o servicio. Las comunidades con intereses especiales pueden mantenerse en contacto entre sí. Los investigadores pueden dar aviso de manera instantánea de los últimos avances a nivel mundial. Esta nueva edición de Cómo programar en C++ incluye, en el capítulo 16, Programación Web mediante CGI. Después de leer este capítulo, usted podrá desarrollar aplicaciones de cómputo que se puedan ejecutar en World Wide Web. http://alexyniorlls.blogspot.com 75 of 1380.
20
Introducción a las computadoras y a la programación en C++
Capítulo 1
1.18 El Consorcio World Wide Web (W3C) En octubre de 1994, Tim Bemers-Lee fundó una organización llamada World Wide Web Consortium (W3C) que se dedica al desarrollo de tecnologías independientes c intcropcrablcs para World Wide Web. Una de las metas principales del W3C es que Web sea de uso universal, independientemente de las discapacidades, el idioma o la cultura. El W3C es una organización para la estandarización, y está compuesta por tres hosts, el Massachusetts Institute of Technology (MIT), el INRIA (Instituí National de Rccherche en Informatiquc et Automatiquc) de Francia y la Kcio Univcrsity of Japan. y alrededor de 400 miembros, que incluyen a Deitel & Associates, Inc. Los miembros proporcionan la principal fuente de ingresos para el W3C y proporcionan la dirección estratégica del consorcio. Para obtener más información acerca de W3C, visite www.w3.org. Las tecnologías Web estandarizadas por el W3C son llamadas Recomendaciones. Luis Recomen daciones actuales del W3C incluyen al Extensible HyperText Markup Lenguaje (Lenguaje de marca do de hipertexto extendido. XHTML™), Cascading Styie Sheets (Hojas de estilo en cascada, CS$™) y el Extensible Markup Language (Lenguaje de marcado extendible, XML). Las Recomendaciones no son en realidad productos de software, pero los documentos especifican el rol. la sintaxis y las re glas de la tecnología. Antes de convertirse en una Recomendación del W3C, un documento pasa a través de tres etapas principales: Anteproyecto, el cual, como su nombre lo indica, especifica un ante proyecto en evolución; Recomendación candidato, una versión estable del documento y que la in dustria puede empezar a implementar; y Recomendación propuesta, una recomendación candidata que se considera madura (es decir, se ha implementado y probado durante un tiempo), y que está lis ta para considerarse con el estatus de Recomendación del W3C. Para obtener información detallada acerca del proceso de las Recomendaciones del W3C, vea “6.2 The W3C Recommendation track” en www.w3.org/Consortium/Procaaa/Procaaa-19991111/procaBa.htnlffRacaCR
1.19 Notas generales acerca de C++ y de este libro C++ es un lenguaje complejo. Los programadores experimentados de C++ están orgullosos de poder hacer un uso excéntrico, deformado y complejo del lenguaje. Ésta es una práctica de programación pobre. Hace que los programas sean más difíciles de leer, que se comporten de manera extraña, más difíciles de probar y corregir, y más difíciles de adaptar a requerimientos cambiantes. Este libro es tá destinado a los programadores principiantes, de manera que buscamos la claridad en los progra mas. La siguiente es nuestra primera “buena práctica de programación". Buena p ráctica d e p ro g ra m a ció n 1.1 Escriba sus programas en C++ de manera directa y simple. A esto se le llama algunas veces KIS ("keep it simple", manténgalo simple). No “estire" el lenguaje, intentando emplearlo de manera ex traña
Usted ha escuchado que C y C++ son lenguajes portables, y que los programas escritos en C y C++ pueden ejecutarse en muchas computadoras diferentes. La portabilidad es una meta escurridi za. El documento del C estándar de ANSI contiene una larga lista de temas acerca de la portabilidad. y se han escrito libros completos que explican la portabilidad. Tip d e p o rtab ilid ad 1.3____________________________________________________ Aunque es posible escribir programas portables, existen muchos problemas entre los diferentes compi ladores de C y C++, y las diferentes computadoras que pueden hacer que la portabilidad sea difícil de conseguir. Escribir programas en C y C++ no gararuiza la portabilidad. A menudo, el programador tendrá que enfrentarse directamente con las variaciones entre los compiladores y las computadoras.
http://alexyniorlls.blogspot.com 76 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
21
Hemos hecho una revisión cuidadosa del documento estándar para C++ ANSI/ISO y compara do nuestra presentación contra éste, para que sea completa y acertada. Sin embargo, C++ es un len guaje rico, y existen algunas sutilezas en el lenguaje y algunos temas avanzados que no cubrimos. Si usted requiere detalles técnicos adicionales sobre C++, le sugerimos que lea el documento de C++ estándar. Puede solicitar este documento desde la página Web de ANSI w«bator«.ansi.org/ansidocstore/default.asp
El título del documento es “Information Technology - Programming Languagcs - C++”, y su núme ro de documento es INCITS/ISO/LEC 14882-1998. Hemos incluido una bibliografía extensa de libros y documentos sobre C++ y sobre programación orientada a objetos. También incluimos un apéndice de recursos para C++ que contiene muchos sitios en Internet y en la World Wide Web relacionados con C++ y la programación orientada a objetos. Muchas de las características de las versiones actuales de C++ no son compatibles con implementaciones anteriores de C++, de manera que puede encontrarse con que algunos de los programas de este libro no funcionan en versiones anteriores del compilador de C++. Buena p ráctica d e p ro g ra m a ció n 1.2 le a los manuales de la versión de C++ que está utilizando. Repise con frecuencia estos manuales pa ra asegurarse de que conoce la rica colección de características de C+ + y que las está utilizando de manera correcta.
Bue na p rá ctica d e p ro g ra m a ció n 1.3 Su computadora y su compilador son buenos maestros. Si después de leer su manual del lenguaje C+ +, no está seguro de cómo funciona alguna característica de C++. experimente con un "pequeño pro grama de prueba" y vea qué es lo que sucede. Establezca las opciones de su compilador en el “máxi mo número de alertas". Estudie cada mensaje que genere el compilador y corrija los prognunas para eliminar los mensajes.
1.20 Introducción a la program ación en C++ El lenguaje C++ facilita un método de diseño de programas estructurado y disciplinado. Ahora, ha remos una introducción al lenguaje C++ y presentaremos distintos ejemplos que ilustrarán muchas de las características importantes de C++. Analizamos cada ejemplo instrucción por instrucción. En el capítulo 2 presentaremos una explicación detallada de programación estructurada en C++. Des pués. utilizaremos este método estructurado hasta el capítulo 5. A partir del capítulo 6, estudiaremos la programación orientada a objetos en C++. De nuevo, debido a la gran importancia de la progra mación orientada a objetos en este libro, cada uno de los cinco primeros capítulos concluye con una sección llamada “Acerca de los objetos”. Estas secciones especiales introducen los conceptos de la orientación a los objetos y presentan un ejemplo práctico que reta al lector a diseñar c implemcntar un programa orientado a objetos en C++. El diseño completo y la implementación en C++ están incluidos en estas secciones especiales. No obstante que el ejemplo práctico es opcional, le recomen damos ampliamente que lo estudie.
1.21 Un program a sencillo: imprimir una línea de texto C++ emplea una notación que puede parecer extraña para los no programadores. Ahora, considere mos un programa sencillo que imprime una línea de texto. El programa y su salida se muestran en la figura 1.2. Este programa muestra muchas de las características importantes del lenguaje C++. Ex plicaremos con detalle cada línea del programa. http://alexyniorlls.blogspot.com 77 of 1380.
22
Introducción a las computadoras y a la programación en C++
1 2 3 4 5 6 7 8 9 10 11 12
Capítulo 1
// Pig. 1.2* fig01_02.cpp // Primer programa en C++. •inelude // la función main comienza la ejecución del programa int main() { ■tdiicout << " IBienvenido a C++I\n" j return 0;
// indica que el programa terminó satisfactoriamente
} // fin de la función main
1Bienvenido
Figura 1.2
a C++I
Programa que Imprime texto.
Lincas 1 y 2 / / P ig . 1.2* fig 0 1 _ 0 2 .cp p / / P rim er programa en C++. cada línea comienza con / / . lo que indica que el resto es un comentario. Los programadores inser tan comentarios para documentar los programas y para mejorar la claridad de lectura de éste. Los co mentarios también ayudan a entender su programa. Los comentarios no provocan que la computadora realice acción alguna durante la ejecución del programa. El compilador de C++ ignora los comenta rios y no se genera código máquina. El comentario P r im a r p ro g ra m a a n C++ describe el pro pósito del programa. Un comentario que comienza con / / s e denomina comentario de una sola línea debido a que el comentario termina al final de la línea en curso. [Nota: Los programadores de C++ también podrían utilizar los comentarios con estilo C, los cuales (que pueden contener varias líneas) comienzan con /* y terminan con * /, pero esta práctica se ha desalentado.] Buena práctica d e p ro g ra m a ció n 1.4 Cada programa debe comenzar con un comentario que describa el propósito del programa, el autor, y la fecha y hora en que se creó.5
Línea 3 •inelude
es una directiva del preprocesador, la cual es un mensaje para el preprocesador de C++. luis líneas que comienzan con # son procesadas por el preproccsador para incluir en el programa el contenido del archivo de encabezado deflujo de entrada/salida (input/output stream headerfile, < io s tr e a m > ). Este archivo debe estar incluido dentro de cualquier programa que arroje datos al monitor, o que in troduzca datos desde el teclado mediante el estilo de flujo de entrada/salida de C++. La figura 1.2 arroja datos al monitor, como veremos pronto. Más adelante explicaremos con más detalle el conte nido de i o s t r e a m
5. En los programas de este libro no mostramos el autor, la fecha y la hora, ya que resultaría demasiado redundante. http://alexyniorlls.blogspot.com 78 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
23
____ Error c o m ú n d o p ro g ra m a ció n 1.2 Si olvida incluir el archivo < io m t r m a m > en un programa que introduce datos desde el teclado o arro ja datos al monitor, esto ocasionará que el compilador arroje un mensaje de error.
Línea 5 // la función main comienza la ejecución del programa
es otra línea de comentario individual que indica que la ejecución del programa comienza a partir de la siguiente línea. Línea 6 i n t m ain () es parte de todo programa en C++. El par de paréntesis después de main indica que main es un blo que de construcción de programas llamado función. Los programas en C++ contienen una o más funciones, una de las cuales debe ser main. El ejemplo de la figura 1.2 contiene solamente una fun ción. Los programas en C++ comienzan con la ejecución de la función main, incluso si main no es la primera función del programa. La palabra clave int a la izquierda de main indica que main “devuelve” un valor entero (un número). Explicaremos qué significa para una función “devolver un valor”, cuando expliquemos a fondo las funciones en el capítulo 3. Por ahora, simplemente incluya la palabra clave int a la izquierda de main en cada uno de sus programas. La llave izquierda, {, (línea 7) debe iniciar el cuerpo de cada función. Una llave derecha, co rrespondiente. >. (línea 12) debe finalizar el cuerpo de la función. La línea 8 • td s s c o u t << * i B ienvenido a C ++!\n"; solicita a la computadora que imprima sobre la pantalla la cadena de caracteres contenida entre las comillas. La línea completa, que incluye std: :cout, el operador « , la cadena * i Bienvenido a C++ 1\n" y el punto y coma (;), se llama instrucción. Cada instrucción termina con un punto y coma (también conocido como terminador de la instrucción). La salida y la entrada en C++ se lle van a cabo mediante flujos de caracteres. Además, cuando la instrucción anterior se ejecuta, envía el flujo de caracteres (Bienvenido a C++1 al objeto de flujo estándar de salida, std sscout, el cual, por lo general, se “conecta" a la pantalla. Explicaremos con detalle las distintas característi cas de std: :cout en el capítulo 12, Entrada/Salida de Flujo en C++. Observe que colocamos stdx : antes de cout. Esto es necesario cuando utilizamos la directi va de prcproccsador # inelude . La notación std: : cout especifica que estamos utilizando un nombre, en este caso cout, que pertenece al “espacio de nombre" std. Los espacios de nombres son una característica avanzada de C++. Explicaremos los espacios de nombres a fondo en el capítulo 22. Por ahora, usted sencillamente debe recordar incluir std: : antes de cada men ción de cout, cin y cerr en un programa. Esto puede ser engorroso; en la figura 1.14, intro dujimos la instrucción using, lo cual nos permitirá omitir std: : antes de utilizar un espacio de nombre de std. El operador << es conocido como operador de inserción de flujo. Cuando se ejecuta este pro grama, el valor a la derecha del operador, el operando derecho, se inserta en el flujo de salida (ob serve que el operador apunta en la dirección hacia donde se dirigen los datos). Por lo general, los caracteres del operando derecho se imprimen en el orden exacto en el que aparecen entre las comi llas. Sin embargo, observe que los caracteres \n no se imprimen en pantalla. La diagonal invertida ( \) es conocida como un carácter de escape. Indica que un carácter "especial" debe aparecer. Cuan do una diagonal invertida se encuentra dentro de una cadena de caracteres, el siguiente carácter se combina con la diagonal invertida para formar una secuencia de escape. La secuencia de escape \n http://alexyniorlls.blogspot.com 79 of 1380.
24
Introducción a las computadoras y a la programación en C++
Capítulo 1
significa nueva línea. Ésta ocasiona que el cursor (es decir, el indicador de posición en la pantalla) se mueva al principio de la siguiente línea en la pantalla. Algunas secuencias de escape adicionales aparecen en la figura 1.3. Error co m ú n d e p ro g ra m a ció n 1.3 Omil ir el punto y coma al final de la instrucción es un error de sintaxis. Un error de sintaxis se pre senta cuando el compilador no puede reconocer una instrucción. Por lo general, el compilador arroja un mensaje de error para ayudar al programador a localizar y corregir la instrucción incorrecta !¿>s errores de sintaxis son violaciones del lenguaje. A los errores de sintaxis también se les llama errores de compilación o errores en tiempo de compilación debido a que aparecen durante la fase de compi lación.
1.a línea 10 return 0;
// indica que el programa terminó satisfactoriamente
se incluye al final de cada función m ain. La palabra clave r e t u r n es una de las distintas formas que utilizaremos para salir de una función. Cuando la instrucción r e t u r n se utiliza al final de m ain , como se muestra aquí, el valor 0 indica que el programa terminó de manera exitosa. En el ca pítulo 3. explicaremos con detalle las funciones, y las razones para incluir esta instrucción serán más claras. Por ahora, simplemente incluya esta instrucción en cada programa, o el compilador podría producir un mensaje de advertencia en algunos sistemas. La llave derecha,), (línea 12) indica el fi nal de la función m ain. Buena práctica d e p ro g ra m a ció n 1.5
Muchos programadores hacen que el último carácter impreso por una función sea una nueva línea ( \n | Esto asegura que la función dejará el cursor de la ptmtalla colocadt>al principio de una nue va línea. Convenciones de esta naturaleza refuerzan la reutilización de software, una meta clave en los ambientes de desarrollo de software. Buena práctica d e p ro g ra m a ció n 1.6 Establezca sangrías en el cuerpo de cada función un nivel hacia adentro de la llave que define el cuer po de la función. Esto hará que la estructura funcional de un programa resalte y ayude a que los pro gramas sean más fáciles de leer.
Buena práctica d e p ro g ra m a ció n 1.7 Establezca una convención para el tamaño de la sangría que usted prefiera, y aplique de manera uni form e esta convención. Puede utilizar la tecla de tabulación para crear la sangría, pero los saltos de tabulación pueden variar. Le recomendamos el uso de saltos de tabulación de 1/4 de pulgada o (preferi blemente) tres espacios para formar los niveles de las sangrías.
Secuencia de escape
Descripción
\n
Nueva línea. Coloca el cursor de la pantalla al principio de la siguiente línea. Tabulador horizontal. Mueve el cursor de la pantalla a la siguiente posición del fa bulador. Retomo de carro. Posiciona el cursor de la pantalla al principio de la línea actual; no avanza a la siguiente línea. Alerta. Sonido de la campana del sistema. Diagonal invertida. Se utiliza para imprimir un carácter de diagonal invertida. Comillas. Imprime en la pantalla el carácter comillas.
\t \r \a
\\
F ig u ra 1.3
S e c u e n c ia s d e e sca p e .
http://alexyniorlls.blogspot.com 80 of 1380.
Introducción a las computadoras y a la programación en C-m -
Capitulo 1
25
El mensaje iBienvenido a C++1 puede ser impreso de distintas maneras. Por ejemplo, la figura 1.4 utiliza diversas instrucciones de inserción de flujo (líneas 8-9), no obstante, producen una salida idéntica al de la figura I.2.6 Esto funciona debido a que cada instrucción de inserción de flujo continúa la impresión a partir de donde la instrucción anterior dejó de imprimir. La primera inser ción de flujo imprime Bienvenidos seguido por un espacio, y la segunda inserción de flujo comien za la impresión en la misma línea inmediatamente después del espacio en blanco. En general, C++ permite al programador expresar las instrucciones de distintas maneras. Una sola instrucción puede imprimir varias líneas utilizando caracteres de nueva línea, como en la línea 8 de la figura 1.5. Cada vez. que aparece la secuencia de escape \n (nueva línea) en el flujo de salida, el cursor de la pantalla se coloca al principio de la siguiente línea. Para obtener una línea en blanco en la salida, coloque dos caracteres de nueva línea uno tras otro como en la figura 1.5. 1 2 3 4 5 6
// Fig. 1.4: fig01_04.cpp // Impresión da una linea con varias instrucciones. iinclude
7
{
// la función main comienza la ejecución del programa int main()
8 9 10 11
std::cout << "Bienvenido "j std: :cout << "a C-n-INn"; return 0;
// indica que el programa terminó satisfactoriamente
12 13
) // fin de la función main
Bienvenido a C++I Figura 1.4
Impresión en un a línea mediante Instrucciones separadas co n cout.
1 2
// Fig. 1.5: fig01_05.cpp // Impresión de varias líneas con una sola instrucción.
3
iin c lu d e
4
5 6 7
/ / l a fu n ció n m ain comienza l a e je c u c ió n d e l programa i n t m ain() {
8 9
std::cout << "Bienvenido\na\n\nC++I\n";
10 11 12
r e tu r n 0;
/ / in d ic a que e l program a term in ó s a tis f a c to r ia m e n te
> // fin de la función main
Bienvenido a C++1 Figura 1.5
Impresión de varias líneas mediante un a sola Instrucción co n cout.
6. A partir de este punto, resaltaremos con pantalla las características clave que se introducen en cada programa. http://alexyniorlls.blogspot.com 81 of 1380.
26
Introducción a las computadoras y a la programación en C++
Capítulo 1
1.22 Otro programa sencillo: suma de dos enteros Nuestro siguiente programa utiliza el objeto de flujo de entrada s t d : t c l n y el operador de extrac ción de flujo, >>, para obtener dos enteros que introduce el usuario desde el teclado, calcula la su ma de estos valores y arroja el resultado mediante a t d r : c o u t. La figura 1.6 muestra el programa y la salida del ejemplo. Los comentarios de las líneas 1 y 2 // Pig. 1.6: fig01_06.cpp // Programa de suma.
indican el nombre del campo y el propósito del programa. La directiva del preprocesador de C++ •Inelude
de la línea 3 incluye el contenido del archivo de encabezado i o s t r e a m dentro del programa. Como mencionamos anteriormente, la ejecución de cada programa comienza con la función m ain. La llave izquierda señala el inicio del cuerpo de m ain y la llave correspondiente derecha se ñala el final de m ain.
1 2 3 4 5 6 7 8 9 10
// Pig. 1.6: fig01_06.cpp // Programa de suma. tinclude // la función main comienza la ejecución del programa int main() { int enterol; // primer número que introduce el usuario int entero2; // segundo número que introduce el usuario int suma; // variable en la que se almacenará la suma
11 12 13 14 15 16 17 18
atd::cout << "Digite el primerentero\n"; std::cin >> enterol;
// indicador // lee un entero
std::cout << "Digite el segundo entero\n”; std::cin >> entero2;
// indicador // lee un entero
suma - enterol + entero2;
// asignación del resultado a suma
19 20 21 22 23 24
std: :cout «
"La ruma es " «
return 0;
// indica que el programa terminó satisfactoriamente
suma «
std::endl; // impresión de suma
) // fin de la función main
Digite el primer entero 45 Digite el segundo entero 72 La suma es 117 F ig u ra 1.6
Program a d© sum a.
http://alexyniorlls.blogspot.com 82 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación en C-m -
27
Las líneas 8 a 10 int enterol; int entero2; int suma;
// primer número que introduce el usuario // segundo número que introduce el usuario // variable en la que se almacenará la suma
son declaraciones. Las palabras e n t e r o l . e n t e r o 2 y exima son nombres de variables. Una va riable es un sitio de la memoria de la computadora en donde se puede almacenar un valor para que lo utilice un programa. Esta declaración especifica que las variables e n t e r o l , e n t e r o 2 y suma son datos de tipo i n t . lo cual significa que estas variables almacenan valores enteros, es decir, nú meros completos tales como el 7, -11, 0, 31914. Todas las variables deben declararse mediante un nombre y un tipo de dato, antes de que puedan utilizarse en un programa. Se pueden declarar muchas variables del mismo tipo dentro de una misma declaración, o mediante varias declaraciones. Podría mos declarar las tres variables dentro de una sola declaración de la siguiente manera: int enterol, entero2, suma;
sin embargo, esto hace que el programa sea más difícil de leer y nos impide proporcionar comenta rios que describan el propósito de cada variable dentro del programa. Si se declara más de un nom bre en una declaración (como se muestra aquí), los nombres se separan por comas ( ,) . A esto se le denomina lisia separada por comas. Buena p rá ctica d e p rogram ación 1.8 Algunos programadores prefieren declarar cada variable en una línea aparte. Este formato permite la fácil inserción de comentarios descriptivos a la derecha de cada declaración.
Pronto explicaremos los tipos de datos d o u b le (para especificar números reales; es decir, núme ros con punto decimal como 3.4, 0.0, -11.19) y c h a r (para especificar un dato de tipo carácter, una variable c h a r puede almacenar una letra minúscula, una letra mayúscula, un dígito o un carácter es pecial como x, $.7, *, etcétera). Buena p ráctica d e p ro g ra m a ció n 1.9 Coloque un espacio después de cada coma ( , ) para hacer más claro el programa.
Un nombre de variable puede ser cualquier identificador válido. Un identificador es una serie de caracteres que consta de letras, dígitos y guiones bajos (_), y que no comienza con un dígito. C++ es sensible a mayúsculas y minúsculas, las letras mayúsculas y las minúsculas son diferentes, de ma nera que al y Al son idcntificadores diferentes. Tip de portabilidad 1.4 C++ permite identificadores de cualquier longitud, pero su sistema y/o su propia implementación de C++ podría imponer algunas restricciones acerca de la longitud de los identificadores. Utilice identi ficadores de 31 caracteres o menos para asegurar la portabilidad.
Buena p ráctica d e p ro g ra m a ció n 1.10 B ija nombres de variables con significado, esto ayuda a que el programa sea "autodocumentado", es decir, será más fá cil comprender el programa simplemente con leerlo, en lugar de tener que leer los manuales o utilizar demasiados comentarios.
Buena p rá ctica d e p ro g ra m a ció n 1.11 Evite los identificadores que comienzan con guión bajo y doble guión bajo, debido a que los compila dores de C+ + podrían utilizar nombres como ésos para sus propios fines internos. Esto evitará que los nombres que usted elija se confundan con los nombres que el compilador elige.
http://alexyniorlls.blogspot.com 83 of 1380.
28
Introducción a las computadoras y a la programación en C++
Capítulo 1
La declaración de variables puede colocarse casi en cualquier parte de una función, pero deben aparecer antes de que sus variables correspondientes se utilicen en el programa. Por ejemplo, en el programa de la figura 1.6, la declaración int enterol;
podría colocarse inmediatamente antes de la línea std::cin >> enterol;
la declaración int entero2;
podría colocarse inmediatamente antes de la línea ■td::cin >> entero2;
y la declaración int suma;
podría colocarse inmediatamente antes de la línea suma - enterol ♦ entero2;
Buena práctica d e p ro g ra m a ció n 1.12 Coloque siempre una línea en blanco erare una declaración y las instrucciones ejecutables adyacen tes. Esto hace que las declaraciones resalten en el programa y contribuye a la claridad del programa. Buena práctica d e p ro g ra m a ció n 1.13 Si usted prefiere colocar las declaraciones al principio de una función, separe dichtis declaraciones de las instrucciones ejecutables correspondientes a esa función mediante un espacio en blanco, para re saltar donde terminan las declaraciones y comienzan las instrucciones ejecutables.
Línea 12 ■td::cout << "Digite el primer entero\n";
// indicador
imprime la cadena Digite el primer entero (también conocida como cadena literal o li teral) en la pantalla y coloca el cursor al principio de la siguiente línea. A este mensaje se le llama indicador, debido a que instruye al usuario para que Heve a cabo una acción específica. Nos gusta pronunciar la instrucción anterior de la siguiente manera “cout recibe la cadena de caracteres "Digite el primer enteroNn"". La línea 13 std::cin >> enterol;
// lee un entero
utiliza el objeto de flujo de entrada cin (del espacio de nombre std) y el operador de extracción de flujo, >>, para obtener un valor desde el teclado. El uso del operador de extracción de flujo con std: :cin toma una entrada de caracteres desde la entrada estándar, la cual normalmente es el te clado. Pronunciaremos la instrucción anterior de la siguiente manera, “std: :cin asigna un valor a enterol" o simplemente “std: :cin asigna a enterol”. Cuando la computadora ejecuta la instrucción anterior, espera a que el usuario introduzca un valor para la variable enterol. El usuario responde al digitar un entero (como caracteres) y pre siona la tecla Entrar (en ocasiones llamada tecla de Retomo) para enviar los caracteres a la compu tadora. Entonces, la computadora convierte la representación del número en caracteres a un entero, http://alexyniorlls.blogspot.com 84 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
29
y asigna este número (o valor) a la variable e n t e r o l . Cualquier referencia posterior a e n t e r o l en este programa utilizará el mismo valor. Los objetos de flujo s t d : : c o u t y s t d : : c i n facilitan la interacción entre el usuario y la computadora. Debido a que esta interacción se asemeja a un diálogo, a menudo se le denomina compu tación conversacional o computación interactiva. La línea 15 std::cout << "Dígita el segundo entero\n"; // Indicador
imprime, en la pantalla, las palabras D í g i t a e l se g u n d o e n t e r o , y coloca el cursor al prin cipio de la siguiente línea. Esta instrucción indica al usuario que realice una acción. La línea 16 std::cin >> entero2;
// lee un entero
obtiene, por parte del usuario, un valor para la variable e n te r o 2 . La instrucción de asignación de la línea 18 suma - enterol + entero2;
// asignación del resultado a suma
calcula la suma de las variables e n t e r o l y e n t e r o 2 , y asigna el resultado a la variable suma me diante el uso del operador de asignación - . La instrucción se lee como “suma obtiene el valor de e n t e r o l + e n t e r o 2 ”. 1.a mayoría de los cálculos se realizan dentro de instrucciones de asig nación. A los operadores - y + se les conoce como operadores binarios debido a que cada uno con tiene dos operandos. En el caso del operador ♦, los dos operandos son e n t e r o l y e n t e r o 2 . En el caso del operador - , los dos operandos son suma y el valor de la expresión e n t e r o l e n te ro 2 . Buena p ráctica d e p ro g ra m a ció n 1.14 Coloque espacios a cada lado de un operador binario. Esto hace que el operador resalte y hace más claro el programa
La línea 20 stds xcout «
"La suma as
"
suma << std:iendl; // impresión de suma
«
despliega la cadena La suma e s . seguida por el valor numérico de la variable suma, seguido por s t d : t e n d í ( e n d l es la abreviación para “end line", fin de línea, e n d l también es un espacio de nombre de s t d ) conocido también como manipulador de flujo. El manipulador s t d : : e n d l arro ja una nueva línea y “desaloja el buffer de salida”. Esto sencillamente significa que, en algunos sis temas donde se acumulan las salidas en la máquina hasta que exista la suficiente información para que “valga la pena” desplegarla en pantalla, s t d : t e n d í obliga a que cualquier resultado almace nado se despliegue en ese momento. Observe que la instrucción anterior arroja distintos valores de diferentes tipos. El operador de inserción de flujo “sabe” cómo sacar cada parte de los datos. Al uso de varios operadores de inser ción de flujo (<<) dentro de una misma instrucción se le conoce como concatenación, encadena miento u operaciones de inserción de flujo en cascada. Por lo tanto, no es necesario tener varias ins trucciones de salida para poder sacar varias porciones de datos. Los cálculos pueden hacerse en instrucciones de salida. Podríamos combinar las instrucciones de las líneas 18 y 20 dentro de la instrucción std::cout << "La suata as
"
«
enterol + entero2 << std: tendí;
con lo que eliminamos la necesidad de la variable suma. http://alexyniorlls.blogspot.com 85 of 1380.
30
Introducción a las computadoras y a la programación en C++
Capítulo 1
La llave derecha, ), informa a la computadora el final de la función m ain. Una poderosa característica de C++ es que los usuarios pueden crear sus propios tipos de datos (explicaremos esta capacidad en el capítulo 6). Entonces, los usuarios pueden “enseñar’ a C++ cómo introducir y obtener valores con estos nuevos tipos de datos mediante el uso de los operado res >> y << (a esto se le conoce como sobrecarga de operadores, un tema que explicaremos en capítulo 8).
1.23 Conceptos de memoria Los nombres de variables tales como e n t e r o l . e n t e r o 2 y suma en realidad son espacios de la memoria de la computadora. Toda variable tiene un nombre, un tipo, un tamaño y un valor. En el programa de suma correspondiente a la figura 1.6, cuando se ejecuta la instrucción s t d : : c i n >> e n te r o l; de la línea 13, los caracteres que dígita el usuario se convierten en un entero que se coloca dentro de una parte de la memoria, a la cual el compilador le asigna el nombre e n t e r o l . Suponga que el usuario dígita el número 45 como el valor para e n t e r o l . La computadora colocará 45 dentro de la ubicación e n t e r o l , como puede ver en la figura 1.7. Siempre que un valor se coloca en una posición de memoria, dicho valor sobrescribe el valor previo en esa ubicación. De regreso en nuestro programa de suma, cuando la instrucción de la línea 16 ■ td t ic in >> e n te ro 2 ; se ejecuta, suponga que el usuario introduce un valor 72. Este valor se coloca en la ubicación e n t e r o 2 . y la memoria aparece como en la figura 1.8. Observe que estas ubicaciones no son necesa riamente adyacentes en memoria. Una vez que el programa obtiene los valores para e n t e r o l y e n t e r o 2 , suma estos valores y coloca el resultado en la variable suma. La instrucción suma - e n t e r o l + e n te ro 2 ; que realiza la suma también reemplaza cualquier valor que estuviera almacenado en suma. Esto ocurre cuando la suma calculada de e n t e r o l y e n t e r o 2 se coloca en la ubicación suma (sin importar cuál sea el valor de sum a en esc momento; esc valor se pierde). Una vez que se calcula suma, la memoria aparece como en la figura 1.9. Observe que los valores de e n t e r o l y e n t e r o 2 aparecen de manera exacta, tal como aparecían antes del cálculo de suma. Estos valores se uti lizaron, pero no se destruyeron, cuando la computadora realizó el cálculo. Por lo tanto, cuando un valor se lee fuera de una ubicación de memoria, el proceso es indestructible.
e n te r o l
Figura 1.7
45
Ubicación d e memoria q u e muestra el nom bre y el valor d e la variable
e n te ro l. http://alexyniorlls.blogspot.com 86 of 1380.
Introducción a las computadoras y a la programación en C-m -
Capitulo 1
Rgura 1.8
enterol
45
en tero 2
72
31
Ubicaciones d e memoria después d e alm acenar los valores d e e n t e r o l y
e n te ro 2
enterol entero2 suma
Rgura 1.9
Ubicaciones d e memoria después d e calcular la sum a d e e n t e r o l y
e n te ro 2
1.24 Aritmética La mayoría de los programas realiza cálculos aritméticos. La figura 1.10 resume los operadores arit méticos. Observe el uso de distintos símbolos especiales que no se emplean en álgebra. El asterisco (*) indica una multiplicación y el signo Je porcentaje (%) es el operador de módulo, el cual explica remos más adelante. Todos los operadores aritméticos de la figura 1.10 son binarios, es decir, ope radores que requieren dos operandos. Por ejemplo, la expresión e n t e r o l + e n t e r o 2 contiene el operador binario + y los dos operandos e n t e r o l y e n te r o 2 . División entera (es decir, tanto el numerador como el denominador son enteros) arroja un cociente entero; por ejemplo, la expresión 7 / 4 arroja 1 y la expresión 1 7 / 5 arroja 3. Observe que en la división entera se descarta cualquier parte fraccionaria (es decir, se trunca), no existe el re dondeo. C++ proporciona un operador módulo, %, el cual proporciona el residuo de una división entera. El operador módulo puede utilizarse sólo con operandos enteros. La expresión x % y produce el re siduo de x dividido entre y. Además, 7 % 4 produce 3 y 17 % 5 produce 2. En los siguientes capí tulos, explicaremos muchas aplicaciones interesantes del operador módulo, tal como determinar si un número es múltiplo de otro (un caso especial de esto es determinar si un número es par o impar).
Operación en C++
Operador a ritméIco
Suma Resta Multiplicación
♦
f+ 7
f+7
*
p-c bm
p - c b * m
División Módulo
/
x / y o £. o x + y
x / y
rmods
r % s
R g u r a 1.10
Expresión algebraica
O p e ra d o re s aritméticos.
http://alexyniorlls.blogspot.com 87 of 1380.
Expresión en C++
32
Introducción a las computadoras y a la programación en C++
Capítulo 1
____Error co m ú n d e p ro g ra m a ció n 1.4 Intentar utilizar el operador módulo.
con operadores no enteros es un error de sintaxis.
Las expresiones aritméticas en C++ se deben introducir en la computadora en línea recta. Por lo tanto, expresiones tales como “a dividida entre b ” deben escribirse a / b de tal forma que todas las constantes, variables y operadores aparezcan en línea recta. Generalmente, la notación alge braica: a_ b
no es aceptada por los compiladores, aunque existen algunos paquetes especiales de software que permiten una notación más natural para expresiones matemáticas complejas. Los paréntesis se utilizan en las expresiones de C++ de la misma forma que en las expresiones algebraicas. Por ejemplo, para multiplicar a veces la cantidad b c, escribimos: a * { b ♦ c ) C++ aplica los operadores en expresiones aritméticas en una secuencia precisa determinada por las siguientes reglas de precedencia de los operadores, las cuales generalmente son las mismas que las del álgebra: 1. Los operadores de expresiones que se encuentran entre pares de paréntesis se evalúan pri mero. Además, los paréntesis pueden utilizarse para forzar el orden de evaluación y esta blecer cualquier secuencia deseada por el programador. Los paréntesis tienen el “nivel más alto de precedencia”. En el caso de paréntesis anidados, o incrustados, los operadores dentro del par de paréntesis más internos se aplican primero. 2. Las operaciones de multiplicación, división y módulo se aplican a continuación. Si una ex presión contiene varias operaciones de multiplicación, división y módulo, los operadores se aplican de izquierda a derecha. Se dice que la multiplicación, la división y el módulo se en cuentran en el mismo nivel de precedencia. 3. Las operaciones de suma y resta se aplican al final. Si una expresión contiene varias opera ciones de suma y de resta, los operadores se aplican de izquierda a derecha. L.a suma y la resta tienen el mismo nivel de precedencia. Las reglas de precedencia de los operadores permiten a C++ aplicar los operadores en el orden correcto. Cuando decimos que ciertos operadores se aplican de derecha a izquierda, nos referimos a la asociatividad de los operadores. Por ejemplo, en la expresión a «■ b ♦ c los operadores de suma (♦) se asocian de izquierda a derecha. Veremos que algunos operadores se asocian de derecha a izquierda. La figura 1.11 resume las reglas de precedencia de operadores. Esta tabla se ampliará al incluir operadores de C++. Una tabla de precedencia de operadores completa se incluye en los apéndices. Ahora, consideremos varias expresiones para aclarar las reglas de precedencia de los operado res. Cada ejemplo muestra una expresión algebraica y su equivalente en C++. El siguiente es un ejemplo de una expresión aritmética (el promedio) de cinco términos: http://alexyniorlls.blogspot.com 88 of 1380.
Introducción a las computadoras y a la programación ©n C++
Capitulo 1
33
Operadoras)
Operación(es)
Orden de evaluación (precedencia)
( )
Paréntesis
Su contenido se evalúa primero. Si los paréntesis están anidados, la expresión que se encuentra dentro del par más interno es la que se evalúa primero. Si existen varios pares de paréntesis “en el mismo nivel” (es decir, no ani dados). se evalúan de izquierda a derecha.
*, / , o%
Multiplicación División Módulo
Éstos se evalúan en segundo lugar. Si existen varios, se evalúan de izquierda a derecha.
♦0-
Suma Resta
Éstos se evalúan al final. Si existen varios, se evalúan de izquierda a derecha.
Rgura 1.11
Precedencia d e operadores aritméticos.
a+b+c+d+e 5 C++:
m - ( a + b
+ c + d + e ) / 5j
Los paréntesis son necesarios debido a que la división tiene un nivel de precedencia mayor que la suma. La cantidad completa (a + b + c + d + e ) debe dividirse entre 5. Si los paréntesis se omi ten de manera errónea, obtenemos a + b + c + d + e / 5, lo cual se evalúa como a + b + c + d + -|El siguiente ejemplo muestra la ecuación de una línea recta: Álgebra: C++:
y = mx + b y - m * x ♦ b;
En este caso no se requieren paréntesis. La multiplicación se aplica primero debido a que la multi plicación tiene un nivel de precedencia más alto que la suma. El siguiente ejemplo contiene operaciones de módulo (*), multiplicación, división, suma y resta: Álgebra: C++:
z = pr%q+w/x-y * -
p
* r
*6 q
♦
w /
x
-
y ;
®© © © © ®
Los números dentro de los círculos que se encuentran debajo de la instrucción indican el orden en el que C++ aplica los operadores. La multiplicación, el módulo y la división se aplican primero y de izquierda a derecha (es decir, se asocian de izquierda a derecha), debido a que tienen un nivel de pre cedencia más alto que la suma y la resta. La suma y la resta se aplican después. Éstas también se aplican de izquierda a derecha. http://alexyniorlls.blogspot.com 89 of 1380.
34
Introducción a las computadoras y a la programación en C++
Capítulo 1
No todas las expresiones con varios pares de paréntesis contienen paréntesis anidados. Por ejem plo, la expresión: a * (b ♦ c) ♦ c * (d ♦ •)
no contiene paréntesis anidados. En cambio, se dice que los paréntesis se encuentran "al mismo ni vel”. Para comprender mejor las reglas de precedencia de los operadores, considere la forma en que se evalúa un polinomio de segundo grado. / ■
a
-
x
-
x
♦
o
-
x
+
© © © © © ©
c;
Los números dentro de los círculos que se encuentran debajo de la instrucción indican el orden en el cual C++ aplica los operadores. En C++ no existe un operador aritmético para la exponcnciación, de manera que representamos x2 como x * x. Muy pronto explicaremos la función pow (“powcr”, potencia) de la biblioteca estándar, la cual lleva a cabo la cxponcnciación. Debido a algunos detalles sutiles relacionados con los tipos de datos que requiere la función pow. posponemos la ex plicación de pow hasta el capítulo 3. Error co m ú n d e p ro g ra m a ció n 1.5 Algunos lenguajes de programación utilizan operadores • • o A para representar la exponenciación. C++ no acepta este tipo de operador; utilizarlos ocasiona un error de sintaxis.
Suponga que las variables a, b, c y x se inicial izan de la siguiente manera: a - 2 , b - 3 , c « 7 y x - 5. La figura 1.12 muestra el orden en el que se aplican los operadores del polinomio de segun do grado anterior. A la instrucción de asignación anterior se le pueden colocar paréntesis, que aunque no son ne cesarios, pueden hacer más clara la expresión: y " ( a * x # x ) « - ( b * x ) + c ;
Buena práctica d e p ro g ra m a ció n 1.15 Como en álgebra, es bueno colocar paréntesis ru>necesarios dentro de una expresión para hacerla más clara. Estos paréntesis redundantes son, por lo general, utilizados para agrupar subexpresiones den tro de una gnm expresión y hacer dicha expresión más clara Al partir una instrucción muy grande en u/ uj secuencia de instrucciones más cortas y sencillas, se promueve la claridad.
1.25 Toma de decisiones: operadores de igualdad y de relación Esta sección introduce una versión simple de la estructura i f de C++, la cual permite que un progra ma tome decisiones basadas en la verdad o falsedad de alguna condición. Si la condición se cumple (es decir, la condición es verdadera), se ejecuta la instrucción en el cuerpo de la estructura i f . Si la condición no se cumple (es decir, la condición es falsa), no se ejecuta la instrucción en el cuerpo de la estructura. Más adelante veremos un ejemplo. Las estructuras condicionales i f . pueden formarse mediante el uso de operadores de igualdad y operadores de relación, los cuales resumimos en la figura 1.13. Todos los operadores de relación tienen el mismo nivel de precedencia y se asocian de izquierda a derecha. Ambos operadores de igualdad tienen el mismo nivel de precedencia, el cual es menor que el nivel de precedencia de los operadores de relación. Los operadores de igualdad se asocian también, de izquierda a derecha. http://alexyniorlls.blogspot.com 90 of 1380.
Introducción a las computadoras y a la programación en C-m -
Capitulo 1
Paso 1. y
2 * 5 * 5 « - 3 * 5
+ 7;
2 * 5 « 8 [SOI
Paso 2. y
50+3
5(
r
Figura 1.12
(Suma más a la izquierda)
65 ♦ 7 / 65 ♦ 7 es
Paso 6. y
(Im multiplicación se realiza antes que la suma)
50 ♦ 15 ♦ 7/ 50 ♦ 15 es
Paso 5. y
(Multiplicación más a la izquierda)
* 5 + 7 ; 5 es
Paso 4. y
(Multiplicación más a la izquierda)
10 * 5 ♦ 3 * 5 ♦ 7 ; 10 * 5 • •
Paso 3. y
35
í
72;
(Última suma)
(Última operación, coloca 72 en y)
Orden en el cual se evalúa un polinomio d e segundo grado.
O perador alg eb raico estándar d e Ig u d d a d o d e re la d ó n
O p erador d e Igualdad o d e re la d ó n d e C++
Ejemplo d e una condición en C++
Significado d e la condición en C++
>
>
x e s mayor que y
<
<
* > y * < y
£
>■
x >- y
x es mayor o igual que y
£
<-
x <- y
x es menor o igual que y
-1-
x — y
x es igual que y
x
x no es igual que y
Operadores de relación
Operadores de igualdad = * H g u r a 1.13
1- y
O p e ra d o re s d e Ig u a ld a d y d e relación.
http://alexyniorlls.blogspot.com 91 of 1380.
x es menor que y
36
Introducción a las computadoras y a la programación en C++
Capítulo 1
Error co m ú n d e p ro g ra m a ció n 1.6 Un error de sintaxis ocurrirá si alguno de los operadores »■». / « >my
Error co m ú n d e p ro g ra m a ció n 1.7 Por lo general, cambiar el orden del par de símbolos de los operadores /■, > • y < - (escribirlos co mo » /. *■> v ■<• respectivamente) provoca un error de sintaxis. En algunos casos, escribir /■ como - / no es un error de sintaxis, pero con certeza será un error lógico que tendrá efecto a! momento de la ejecución. Un error lógico fatal ocasiona que el programafalle y termine de manera prematura. Un error lógico no fatal permite a un programa continuar la ejecución, pero podría producir resultados incorrectos.
Error co m ú n d e p ro g ra m a ció n 1.8 Confundir el operador de igualdad, ■», con el operador de asignación. puede ocasionar errores ló gicos. E l operador de igualdad debe leerse como “es igual que", y el operador de asignación debe leerse “recibe” o “recibe el \xilor" o “se le asigna el valor". Algunas personas prefieren leer el ope rador de igualdad como “doble igualdad Como veremos muy pronto, el confundir estos operadores no necesariamente ocasionará errores de sintaxis fáciles de corregir; pueden ocasionar errores lógi cos en extremo sutiles.
F1 siguiente ejemplo utiliza seis instrucciones i f para comparar dos números introducidos por el usuario. Si la condición en cualquiera de estas instrucciones i f se satisface, la instrucción de sa lida asociada con ese i f se ejecuta. La figura 1.14 muestra el programa y los diálogos de entrada y salida de tres ejecuciones de ejemplo.
1
2 3 4 5 6 7 8 9 10 11
12 13 14 15 16 17 18 19 20 21
//
F ig .
1 .1 4 :
f ig 0 1 _ 1 4 .c p p
// Uso de instrucciones if, operadores // de relación, y operadores de igualdad. finelude using std::cout; using std::cin; using std::endl;
// // //
el programa utiliza cout el programa utiliza cin el programa utiliza endl
// la función main comienza la ejecución del programa int main () {
int numl; int num2;
// primer número que introduce el usuario // segundo número que introduce el usuario
cout << "Digite dos enteros, y le diréNn" << "las relaciones que satisface: "j cin >> numl >> num2; // lee dos enteros if ( numl ■ - numl ) cout << numl << * es igual que * << numl << endl;
22 23 24 25
if ( numl 1■ numl ) cout << numl << ** no es igual que " << numl << endl;
R g u ra 1.14
O p e ra d o re s d e Ig u a ld a d y d e relación. (Parte 1 d e 2.)
http://alexyniorlls.blogspot.com 92 of 1380.
Introducción a las computadoras y a la programación en C-m -
Capitulo 1
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
if
If
lf
if
( n u m l < num 2 ) c o u t << n u m l << * e s m e n o r q u e
"
«
num2 << e n d l ;
( n u m l > num 2 ) c o u t << n u m l << " e s m a y o r q u e
"
«
num 2 << e n d l ;
( num l <■ num 2 ) c o u t << n u m l << n e s m e n o r o i g u a l q u e « num 2 << e n d l ;
"
( n u m l >■ num 2 ) c o u t << n u m l << w e s m a y o r o i g u a l q u e « num 2 << e n d l ;
"
re tu rn } //
fin
0; de
// la
in d ic a q u e e l p ro g ra m a te rm in ó
D ig ite d o s e n te r o s , y le d ir é la s re la c io n e s que s a tis f a c e : 22 n o e s i g u a l q u e 12 22 e s m a y o r q u e 12 22 e s m a y o r o i g u a l q u e 12
figura 1.14
s a tis fa c to ria m e n te
f u n c i ó n m a in
D ig ite d o s e n te ro s , y le d ir é la s re la c io n e s que s a tis f a c e ; 3 no e s ig u a l que 7 3 e s m enor q u e 7 3 e s m enor o ig u a l que 7
D ig ite d o s la s re la c io 7 e s ig u a l 7 e s m enor 7 e s m ayor
37
e n te ro s , y le d ir é n e s que s a tis f a c e : que 7 o ig u a l que 7 o ig u a l que 7
3 7
22
12
7 7
Operadores de Igualdad y d e relación. (Parte 2 d e 2.)
Las líneas 6 a 8 u s in g u s in g u s in g
s td ::c o u t; s t d : : c in ; s td ::e n d l;
// // //
e l p ro g ra m a u t i l i z a e l p ro g ra m a u t i l i z a e l p ro g ra m a u t i l i z a
cout c in endl
son instrucciones u s in g q u e eliminan la necesidad de repetir el prefijo s t d : :. Una vez que inclui mos las instrucciones u s in g . podemos escribir c o u t en lugar de s t d : :c o u t , c i n en lugar de http://alexyniorlls.blogspot.com 93 of 1380.
38
Introducción a las computadoras y a la programación en C++
Capítulo 1
s t d : x c in y e n d l en lugar de a t d : s e n d l. respectivamente, en el resto del programa. [Nota: a partir de este punto, cada ejemplo contendrá una o más instrucciones u s in g .] Buena práctica d e p ro g ra m a ció n 1.16 Coloque instrucciones u m ín g inmediatamente después de las f i n c l u d • a las que hacen referencia.
Las líneas 13 a 14 in t in t
n u m l; num 2;
/ / p r i m a r n ú m e ro q u e i n t r o d u c e e l u s u a r i o / / s e g u n d o n ú m e ro q u e i n t r o d u c e e l u s u a r i o
declaran las variables utilizadas en el programa. Recuerde que las variables pueden declararse en una o en varias declaraciones. El programa utiliza operaciones de extracción de flujo en cascada (línea 18) para introducir dos enteros. Recuerde que tenemos permitido escribir c i n (en lugar de s t d : x cin ), gracias a la línea 7. Primero se lee el valor de la variable n u m l , después se lee el valor de la variable n u m 2 . La estructura i f de las líneas 20 a 21 i f ( n u m l ■ - num2 ) c o u t << n u m l << " e s i g u a l q u s
"
<< num 2 << s n d l ;
compara los valores de las variables num l y num2 para hacer pruebas de igualdad. Si los valores son iguales, la instrucción de la línea 21 despliega una línea de texto que indica que los números son iguales. Si las condiciones son v e r d a d e r a s en una o más de las estructuras i f . las cuales comien zan las líneas 23, 26, 29, 32 y 36, las instrucciones correspondientes c o u t despliegan una línea de texto. Observe que cada estructura i f de la figura 1.14 tiene una sola instrucción en su cuerpo, y que cada uno de ellos tiene sangría. Sangrar el cuerpo de una estructura i f mejora la legibilidad de un programa. En el capítulo 2 mostramos cómo especificar estructuras i f que tengan cuerpos con múl tiples instrucciones (esto es, encerrando las instrucciones del cuerpo entre pares de llaves, { }). Buena práctica d e p ro g ra m a ció n 1.17 Coloque sangrías en las instrucciones del cuerpo de la estructura í t para hacer más visible su cuer po, ademáis de hacerla más clara.
Buena práctica d e p rogram ación 1.18 En un programa no debe haber más de una instrucción por línea.
Error co m ú n d e p ro g ra m a ció n 1.9 Colocar un punto y coma inmediatamente después del paréntesis derecho de la condición en una estructura I f , a menudo es un error lógico (aunque no es un error de sintaxis). F.l punto y coma oca sionará que el cuerpo de la estructura i f quede vacío, de manera que la estructura i f no ejecutará acción alguna sin importar si la condición es o no v m r d s d m r a . Peor aún, el cuerpo de la instrucción original de la estructura i f será ahora una instrucción en la misma secuencia que la estructura i f y se ejecutará siempre, lo que provocará que el programa produzca resultados incorrectos.
En la figura 1.14, observe el uso de los espacios. Por lo general, en las instrucciones de C++, los caracteres blancos tales como el tabulador, nueva línea, y el espacio son ignorados por el compila dor (éstos no se ignoran si aparecen dentro de cadenas). De esta manera, las instrucciones se pueden dividir en varias líneas y pueden ser espaciadas de acuerdo con las preferencias del programador. Es http://alexyniorlls.blogspot.com 94 of 1380.
Introducción a las computadoras y a la programación en C-m -
Capitulo 1
39
un error de sintaxis dividir los identificadores. cadenas (tal como "hola") y constantes (tal como el número 1000) en varias líneas. Error c o m ú n d e p ro g ra m a ció n 1.10 Es un error de sintaxis dividir un identificador mediante la inserción de caracteres blancos (por ejem plo, escribir a a i n como n a in ).
Buena p rá ctica d e p ro g ra m a ció n 1.19 Una instrucción muy grande puede dividirse en varias líneas. Si una sola instrucción debe dividirse en varias líneas, elija puntos de división que tengan sentido, tal como una coma dentro de una lista sepa rada por comas, o después de un operador en una expresión muy grande. Si una instrucción se divide en dos o más líneas, coloque sangrías a las líneas subsecuentes y alinéelas a la derecha.
La figura 1.15 muestra la precedencia de los operadores que presentamos en este capítulo. Los operadores se muestran de arriba hacia abajo en orden de precedencia decreciente. Observe que todos estos operadores, con excepción del operador de asignación se asocian de izquierda a de recha. La suma es asociativa por la derecha, de manera que una expresión como x + y + z se eva lúa como si se escribiera (x ♦ y ) ♦ z. El operador de asignación - se asocia de derecha a izquier da, de manera que una expresión como x ■ y - 0 se evalúa como si se escribiera x ■ (y - 0) , la cual, como veremos pronto, primero asigna 0 a y, y después asigna el resultado de dicha asignación (0) a x. Buena p ráctica d e p ro g ra m a ció n 1.20 Revise la tabla de precedencia de operadores cuando escriba expresiones que contengan muchos ope radores. Confirme que los operadores de la expresión se realizan en el orden que usted espera Si no está seguro acerca del orden de evaluación de una expresión compleja divida la expresión en instruc ciones mtís pequeñas o utilice paréntesis para forzar el orden de manera exacta tal como lo haría en una expresión algebraica. Recuerde que algunos operadores como la asignación ( m) se asocian de de recha a izquierda y no de izquierda a derecha.
Hemos explicado muchas características importantes de C++, incluso el despliegue de datos en la pantalla, la introducción de datos desde el teclado, la realización de cálculos y la toma de decisio nes. En el capítulo 2, fundamentamos estas técnicas al introducir la programación estructurada. Us ted se familiarizará con las técnicas de aplicación de sangrías, y estudiaremos cómo especificar y modificar el orden en el cual se ejecutan las instrucciones, a lo que se le llama flujo de control.
Operadores
A socialvidad
Upo
O
izquierda a derecha
paréntesis
izquierda a derecha
multiplicativos
izquierda a derecha
aditivos
izquierda a derecha
inserción/extracción de flujo
izquierda a derecha
relaciónales
izquierda a derecha
igualdad
derecha a izquierda
asignación
*
/
*
♦ <<
>>
<
<-
—
I-
■ Figura 1.15
>
>-
Precedencia y asoclativldad d e los operadores q u e hem os explicado hasta el momento.
http://alexyniorlls.blogspot.com 95 of 1380.
40
Introducción a las computadoras y a la programación en C++
Capítulo 1
1.26 Acerca de los objetos: introducción a la tecnología de objetos y al Lenguaje Unificado de M odelado (UML™) Comenzaremos nuestra introducción a la orientación a objetos. Veremos que la orientación a obje tos es una manera natural de pensar acerca del mundo real y de escribir programas de cómputo. En cada uno de los cinco primeros capítulos nos concentramos en la metodología “convencio nal” de la programación estructurada, debido a que los objetos que construimos estarán compuestos, en parte, por piezas de programación estructurada. Entonces, finalizamos cada capítulo con una sec ción llamada “Acerca de los objetos”, en la cual presentamos una cuidadosa introducción guiada por la programación orientada a objetos. Nuestra meta en estas secciones "acerca de los objetos” es la de ayudarle a desarrollar una forma de pensar orientada a objetos, de manera que pueda utilizar de inmediato los conocimientos sobre programación orientada a objetos que comenzará a recibir en el capítulo 6. Además, lo introducimos al Lenguaje Unificado de Modelado (UML). El UML es un len guaje gráfico que permite a la gente que construye sistemas (por ejemplo, arquitectos de software, ingenieros de sistemas, programadores, etcétera), a representar sus diseños orientados a objetos me diante el uso de una notación visual común. En esta sección (1.26), introducimos los conceptos básicos (es decir, “pensar en objetos”) y la terminología (es decir, “hablar de objetos”). En las secciones “acerca de los objetos”, al final de los capítulos 2 al 5, explicaremos temas más sustanciales mientras atacamos un desafiante problema con las técnicas del diseño orientado a objetos (DOO). Analizaremos un problema de ejemplo, que requiere la construcción de un sistema, determinar los objetos necesarios para implementar el siste ma, determinar los atributos que deben tener los objetos, determinar el comportamiento que estos ob jetos necesitan exhibir y especificar cómo deben ¡nteractuar estos objetos entre sí para lograr los requerimientos del sistema. Hacemos todo esto incluso antes de haber aprendido a escribir progra mas orientados a objetos en C++. En las secciones opcionales “acerca de los objetos”, al final de los capítulos 6, 7 y 9, explicaremos una imple mentación en C++ del sistema que diseñamos en los ca pítulos anteriores. Este ejemplo práctico le ayudará a introducirse en las prácticas utilizadas en la industria. Aun que nuestro ejemplo práctico es una versión a escala de un problema a nivel industrial, cubrimos mu chas de las prácticas comunes en la industria. Si usted es estudiante, y su profesor no planea incluir este ejemplo práctico en su propio curso, considere cubrir este ejemplo práctico por su cuenta. Cree mos que bien valdrá la pena que revise este interesante proyecto. Usted tendrá una sólida introduc ción al diseño orientado a objetos con UML, y afinará sus habilidades para leer código mediante un recorrido a través de un programa en C++ de 1200 líneas escrito cuidadosamente, que resuelve el problema que presentamos en el ejemplo práctico. Comenzamos nuestra introducción a la programación orientada a objetos con la terminología clave de ésta. Mire a su alrededor en el mundo real. Por donde quiera que voltee los puede ver, ¡ob jetos!. gente, animales, plantas, automóviles, edificios, computadoras, etcétera. Los humanos pensa mos en términos de objetos. Tenemos la maravillosa habilidad de abstracción que nos permite ver imágenes en pantalla como objetos tales como gente, aviones, árboles, y montañas, en lugar de pun tos individuales de color. Podemos, si lo deseamos, pensar en términos de playas en vez de granos de arena, bosques en vez de árboles, y casas en lugar de ladrillos. Quizá nos inclinamos a dividir los objetos en dos categorías: objetos animados y objetos inani mados. Los objetos animados están “vivos” de alguna manera. Se mueven y hacen cosas. Los obje tos inanimados, como las toallas, parecen no hacer nada en absoluto. Parecen sólo “están ahí”. Sin embargo, todos los objetos tiene algo en común. Todos tienen atributos, como tamaño, forma, color, peso, etcétera, que los describen. Todos exhiben un comportamiento, o realizan operaciones (por ejemplo, una bola rueda, rebota, se infla y se desinfla; un bebé llora, duerme, gatea, camina y par http://alexyniorlls.blogspot.com 96 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
41
padea; un automóvil acelera, frena y gira; una toalla absorbe agua, etcétera) que especifican lo que hacen. Los humanos aprendemos acerca de los objetos al estudiar sus atributos y al observar su com portamiento. Objetos diferentes pueden tener atributos similares y comportamientos similares. Por ejemplo, se pueden hacer comparaciones entre bebés y adultos, y entre humanos y chimpancés. Los automóviles, camiones, vagones y patinetas tienen mucho en común. La program ación orientada a objetos (POO) toma como modelo a los objetos reales para su contraparte en software. Toma ventaja de las relaciones entre clases, en donde objetos de cierta cla se, tal como una clase de vehículos, tiene atributos y operaciones similares. Toma ventaja de las re laciones de herencia, e incluso de las relaciones de herencia m últiple, en donde las nuevas clases de objetos creadas se derivan mediante la absorción de atributos y operaciones de clases existentes y mediante la adición de sus propias características únicas. Un objeto de la clase C o n v e r t i b l e cier tamente tiene las características de la clase más general A u t o m ó v i l , pero el techo del C o n v e r t i b l e puede quitarse o ponerse. La programación orientada a objetos nos brinda una forma natural de ver el proceso de progra mación, a saber, mediante el m odelado de objetos reales, sus atributos y comportamiento. L.a pro gramación orientada a objetos proporciona también comunicación entre los objetos. Tal como las personas se envían m ensajes entre sí (por ejemplo, un sargento que le ordena a un soldado que se co loque en posición de firm es), los objetos también se comunican mediante mensajes. La programación orientada a objetos encapsula datos (atributos) y funciones (operaciones) en paquetes llamados o b jeto s ; los datos y las funciones de un objeto están íntimamente ligados. Los ob jetos tienen la propiedad d e o c u lta r inform ación. Esto significa que aunque los objetos pueden saber cómo comunicarse con otros a través de interfaces bien definidas, por lo general, los objetos no sa ben cómo se implcmcntan otros objetos, los detalles de implcmcntación se ocultan dentro de los mis mos objetos. Con seguridad, es posible manejar un automóvil de manera efectiva sin tener que co nocer a fondo los detalles de cómo funcionan internamente los sistemas del motor y la transmisión. Por supuesto, el manejo sería mucho más difícil y menos popular si se requiriera tal conocimiento. También, veremos por qué el ocultamiento de información es crucial para la buena ingeniería de soft ware. En C y en otros lenguajes d e program ación p o r procedim ientos, la programación tiende a ser orientada a a cciones ; mientras que en C++, la programación tiende a ser orientada a objetos. En C, la unidad de programación es lafunción. En C++, la unidad de programación es la clase, a través de la cual se obtienen las instancias. En C++, las clases contienen funciones que implementan el compor tamiento, y datos que implementan los atributos de la clase. Los programadores de C se concentran en escribir funciones. Los programadores agrupan acciones dentro de funciones que realizan alguna tarca común, y agrupan funciones para formar programas. Ciertamente, los datos son importantes en C, pero la ¡dea es que los datos existen primordialmente para apoyar las acciones que realizan las funciones. Los verbos en una especificación de sistema ayu dan al programador en C a determinar un conjunto de funciones que trabajan juntas para implementar el sistema. Los programadores en C++ se concentran en crear sus propios tipos definidos por el usuario llamados clases y com ponentes. Cada clase contiene datos, así como un conjunto de funciones que manipulan esos datos. En C++, a los componentes de datos de una clase se Ies llama datos m iem bro. En C++, a las funciones que componen una clase se les llama fu n cio n es m iem bro (por lo general, en otros lenguajes de programación orientados a objetos, como Java, se les denomina m étodos). Tal como a una instancia de un tipo predefinido como i n t se le llama variable, a una instancia de un tipo definido por el usuario (es decir, una clase) se le llama objeto. El programador utiliza tipos pre definidos (y otros tipos definidos por el usuario) como “bloques de construcción”, para construir http://alexyniorlls.blogspot.com 97 of 1380.
42
Introducción a las computadoras y a la programación en C++
Capítulo 1
tipos definidos por el usuario (clases). El foco de atención en C++ se centra en las clases (desde las que se crean los objetos) en vez de funciones. Los sustantivos en una especificación de sistema ayu dan al programador de C++ a determinar el conjunto de clases desde el que se crean los objetos que trabajan juntos para ¡mplementar un sistema. Las clases son a los objetos lo que los planos son a las casas. Podemos construir muchas casas a partir de un plano, y podemos crear instancias de muchos objetos a partir de una clase. Además, las clases pueden tener relación con otras clases. Por ejemplo, en el diseño orientado a objetos de un banco, la clase CajeroBanco necesita relacionarse con la clase CuentaBanco. La más simple de estas relaciones se denomina asociación. Veremos que el software empaquetado como clases puede reutilizarse en futuros sistemas de software. A menudo, grupos de clases relacionadas se empaquetan como componentes reutilizables. Tal como los corredores de bolsa dicen a sus clientes que los tres factores más importantes que afec tan los precios de la bolsa son “la ubicación, la ubicación y la ubicación", nosotros creemos que los tres factores más importantes que afectan el futuro del desarrollo de software son “la rcutilización, la reutilización y la reutilización”. Con la teoría orientada a objetos, construimos la mayoría del software del futuro mediante la combinación de "partes estándares e intercambiables” llamadas clases. Este libro le enseña cómo “elaborar clases valiosas" para reutilizar, reutilizar y reutilizar. Cada clase que usted crea tiene el potencial de convertirse en un activo valioso de software que usted y otros programadores pueden utilizar para facilitar los esfuerzos de desarrollo de software en el futuro. Introducción al análisis y diseño orientado a objetos (ADOO) y a UML En este momento, probablemente ya escribió algunos pequeños programas en C++. ¿Cómo generó el código para sus programas? Si usted es como la mayoría de los programadores principiantes, tal vez prendió su computadora y comenzó a escribir. Este método podría funcionar en proyectos pe queños, pero, ¿qué haría si se le pidiera que creara un sistema de software para controlar de manera automática las máquinas registradoras de un banco? Dicho proyecto es demasiado grande y comple jo para simplemente sentarse y comenzar a escribir. Para crear las mejores soluciones, usted debería seguir un proceso detallado para obtener un análisis de los requerimientos de su proyecto y desarrollar un diseño para satisfacer dichos requeri mientos. Usted seguiría este proceso y haría que sus superiores revisaran los resultados antes de escribir cualquier código para su proyecto. Si este proceso involucra el análisis y el diseño de su sis tema desde un punto de vista orientado a objetos, a esto se le llama proceso de análisis y diseño orientado a objetos (ADOO). Los programadores experimentados saben que no importa lo fácil que aparente ser un problema, el tiempo que se invierte en el análisis y el diseño puede evitar perder innu merables horas por abandonar un método de desarrollo de sistemas enfermo a la mitad del camino para su implementación. El ADOO es el término genérico para las ideas que existen detrás del proceso que empleamos para analizar un problema y para desarrollar un método para resolverlo. Los pequeños problemas como los de estos primeros capítulos no requieren un proceso exhaustivo. Podría ser suficiente con escribir el seudocódigo antes de escribir el código. El seudocógido es un medio informal de expre sar código de programación. En realidad no es un lenguaje de programación, pero podemos utilizar lo como un “bosquejo” que nos guíe para escribir nuestro código. En el capítulo 2, explicaremos el pseudocódigo. F.I seudocódigo puede ser suficiente para problemas pequeños, pero conforme se incrementan los problemas y aumentan los grupos de gente que resuelven estos problemas, las técnicas de ADOO se involucran más. De manera ideal, un grupo debería estar de acuerdo con un proceso estrictamen te definido para resolver el problema y una manera uniforme de comunicar los resultados de esc pro http://alexyniorlls.blogspot.com 98 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
43
ceso. Existen muchos procesos diferentes de ADOO; sin embargo, un lenguaje para comunicar los resultados de cualquier proceso ADOO se ha hecho muy popular. Este lenguaje se conoce como Lenguaje Unificado de Modelado (UML). El UML se desarrolló a mediados de la década de los no venta, bajo la dirección inicial de un trío de metodologiítas: Grady Booch, James Rumbaugh e Ivar Jacobson. Historia de UML En la década de los ochenta, un creciente número de empresas comenzó a utilizar la POO para implcmentar sus aplicaciones, y la necesidad desarrolló un proceso que derivó en el método ADOO. Muchos metodologiítas. incluso Booch. Rumbaugh, y Jacobson, desarrollaron y promovieron indi vidualmente procesos separados para satisfacer esta necesidad. Cada uno de estos procesos tenía su propia notación, o "lenguaje” (en la forma de diagramas), para transmitir los resultados del análisis y el diseño. Para principios de la década de los noventa, diferentes empresas, c incluso diferentes divisiones dentro de la misma empresa, utilizaron distintos procesos y notaciones. De manera adicional, estas empresas querían utilizar herramientas de software que soportaran sus procesos particulares. Con tantos procesos, los fabricantes de software tuvieron dificultades para proporcionar dichas herra mientas. Evidentemente, se requerían procesos y notación estándares. En 1994. James Rumbaugh se unió a Grady Booch en la Rational Software Corporation, y los dos comenzaron a trabajar para unificar sus populares procesos. Pronto, se vieron acompañados por Ivar Jacobson. En 1996, el grupo liberó la primera versión de UML para la comunidad de ingeniería de software y les pidió sus sugerencias. Al mismo tiempo, una organización conocida como Object Management Group™ (OMG™) promovió el sometimiento a un lenguaje de modelado único. El OMG es una organización no lucrativa que promueve el uso de tecnología orientada a objetos me diante guías y especificaciones para tecnologías orientadas a objetos. Muchas empresas, entre ellas HP, IBM, Microsoft, Oracle y Rational Software, reconocieron la necesidad de un lenguaje de mo delado común. Estas empresas formaron el UML Partners, en respuesta al llamado del OMG para recibir propuestas. Este consorcio desarrolló y sometió a consideración del OMG, la versión 1.1 del UML. El OMG aceptó la propuesta y, en 1997, asumió la responsabilidad de dar mantenimiento y revisión continua al UML. En el 2001, el OMG liberó la versión 1.4 de UML. En la actualidad, el OMG trabaja con la versión 2.0. El OMG es uno de los consorcios más grandes; cuenta con 800 em presas como miembros. ¿Qué es UML? El Lenguaje Unificado de Modelado es, en la actualidad, un esquema de representación gráfica am pliamente utilizado para modelar sistemas orientados a objetos. Unifica los distintos esquemas de notación que existían a finales de la década de los ochenta. Aquellos que diseñan sistemas utilizan el lenguaje (en la forma de diagramas) para modelar sus sistemas. Una de las características más atractivas de UML es su flexibilidad. UML se puede extender y es independiente de los muchos procesos de ADOO. Los modeladores en UML pueden desarrollar sistemas mediante el uso de distintos procesos, pero todos los dcsarrolladorcs pueden expresar di chos sistemas con un conjunto estándar de notaciones. El UML es un lenguaje complejo, rico en características gráficas. En nuestras secciones "Acer ca de los objetos”, representamos un subconjunto conciso y simplificado de estas características. Utilizaremos este subconjunto para guiar al usuario a través de una primera experiencia de diseño con UML pensado para los diseñadores/programadores principiantes en la orientación a objetos. Para una completa explicación de UML. revise el sitio Web del Object Management Group (vww.omg.org) y el documento de las especificaciones oficiales de UML 1.4 (www.omg.org/uml). http://alexyniorlls.blogspot.com 99 of 1380.
44
Introducción a las computadoras y a la programación en C++
Capítulo 1
The Unified Modeling Language User Guide, escrita por Booch. Rumbaugh y Jacobson. es la guía definitiva para UML. Además, han emergido distintas herramientas de modelado para que los diseña dores puedan construir sistemas mediante UML. Al final de la sección 5.13 se encuentran vínculos hacia algunas de estas herramientas. La tecnología orientada a objetos está omnipresente en la industria del software, y UML rápi damente también lo está logrando. Nuestra meta en las secciones “acerca de los objetos" es la de alentarlo a pensar de una manera orientada a objetos tan pronto, y tan frecuentemente como sea posi ble. Al principio de la sección “acerca de los objetos” al final del capítulo 2, usted aplicará la tecno logía de objetos para implcmcntar una solución para un problema importante. Esperamos que este proyecto opcional le parezca una introducción amena y desafiante al diseño orientado a objetos con UML, y a la programación orientada a objetos.
1.27 Recorrido a través del libro En esta sección, haremos un recorrido por la mayoría de las capacidades de C++ que usted es tudiará en Cómo programar en C++, 4a- edición. Capítulo 1 —Introducción a las computadoras y a la programación en C++— Explica qué son las computadoras, cómo funcionan y cómo se programan. Introduce la noción de la programa ción estructurada y explica por qué estas técnicas alentaron una revolución en la manera en que se escriben los programas. El capítulo brinda una breve historia del desarrollo de los lenguajes de pro gramación, desde los lenguajes máquina, los lenguajes ensambladores, hasta los lenguajes de alto nivel. Explica el origen del lenguaje de programación C++. El capítulo lo introduce a un ambiente típico de desarrollo de programas en C++, y brinda una concisa introducción a la escritura de progra mas en C++. Presenta un tratamiento detallado respecto a las operaciones para la toma de decisiones y operaciones aritméticas en C++. Introdujimos un nuevo, más abierto, y fácil de leer, método de “sen tir y tocar" para nuestros programas fuente, lo más notable es el uso de colores en la sintaxis para resaltar palabras reservadas, comentarios y texto general del programa, y para hacer los programas más claros. También introdujimos un nuevo fondo resaltado para llamar la atención de los lectores sobre las nuevas características que presenta cada programa. Después de estudiar este capítulo, el es tudiante comprenderá cómo escribir sencillos, pero completos, programas en C++. Explicamos la explosión del interés por Internet que se dio con el advenimiento de la World Wide Web. Explicamos los espacios de nombres y las instrucciones u s in g . Los lectores se zambullen en la orientación a objetos de la sección “acerca de los objetos”, la cual introduce la terminología básica de la tecnolo gía de objetos. Capítulo 2 —Estructuras de control— Introduce la noción de algoritmos (procedimientos) para resolver problemas. Explica la importancia de utilizar estructuras de control de manera efecti va para producir programas que sean comprensibles, corregibles, fáciles de mantener y con mayor probabilidad de hacer que funcionen apropiadamente al primer intento. Introduce la estructura de se cuencia, las estructuras de selección ( i f , i f / e l s e y s w itc h ) , y las estructuras de repetición (w h ile , d o /w h ile y f o r ) . Explica con detalle la repetición y compara los ciclos controlados por un contador y los ciclos controlados por centinelas. Explica la técnica de arriba-abajo, la corrección paso a paso, que es importante para la producción de programas estructurados apropiadamente y pre senta la popular ayuda para programar, el pseudocódigo. Los métodos y técnicas utilizados en el capítulo 2 se aplican para hacer uso efectivo de las estructuras de control en cualquier lenguaje de programación (no sólo C++). Este capítulo ayuda al estudiante a desarrollar buenos hábitos de pro gramación, como una preparación para lidiar con tareas de programación más sustanciales en el res http://alexyniorlls.blogspot.com 100 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
45
to del libro. El capítulo concluye con una explicación de los operadores lógicos, && (AND), | | (OR) y l (NOT, o negación). Introdujimos el operador s t a t i c _ c a s t , el cual es más seguro que el uso del viejo estilo de conversión de tipos de C++ heredado de C. Agregamos el ejercicio de “Peter Minuit", de manera que los estudiantes pueden ver las maravillas del interés compuesto, ¡y la compu tadora hace la mayor parte del trabajo! Explicamos las reglas de alcance para los contadores de un ciclo dentro de un ciclo f o r . En la sección opcional “acerca de los objetos”, comenzamos la pri mera fase del diseño orientado a objetos (DOO) para el simulador del elevador (identificamos las cla ses necesarias para implementar el simulador. También introducimos un ejemplo del uso de los diagramas de clase y de objetos de UML y discutimos los conceptos de asociación, multiplicidad, composición, roles y enlaces. Capítulo 3 — Funciones— Explica el diseño y la construcción de módulos de programa, las capacidades de las funciones en C++, incluidas las funciones de la biblioteca estándar, funciones de finidas por el usuario, recursividad. capacidades de las llamadas por valor y las llamadas por refe rencia. Las técnicas que se presentan en el capítulo 3 son esenciales para la producción apropiada de programas estructurados, especialmente para grandes programas y software que los programadores de sistemas y los programadores de aplicaciones desarrollan en aplicaciones de la vida real. La es trategia de “divide y vencerás” se presenta como una meta efectiva para resolver problemas comple jos al dividirlos en componentes más simples que interactúan entre sí. Los estudiantes disfrutarán el tratamiento de los números aleatorios y la simulación, y apreciarán la explicación del juego de azar con dados, el cual utiliza de manera elegante las estructuras de control. El capítulo ofrece una sóli da introducción a la recursividad, e incluye una tabla que resume las docenas de ejemplos de recur sividad y los ejercicios distribuidos a través del resto del libro. Algunos libros dejan el tema de la recursividad para los capítulos finales del libro: nosotros sentimos que este tema se cubre mejor de manera gradual a través del libro. La extensa colección de 60 ejercicios al final del capítulo inclu ye muchos problemas clásicos de recursividad tales como la torre de Hanoi. El capítulo explica las llamadas mejoras “ a C mediante C++". incluida la función i n l i n e , los parámetros de referencia, los argumentos por defecto, el operador unario de resolución de alcance, la sobrecarga de operado res y las plantillas de función. La tabla de archivos de encabezado introduce muchos de los archivos de encabezado que utilizará el lector a través del libro. En la sección opcional “acerca de los obje tos”, describimos muchos de los atributos de las clases, necesarios para implementar el simulador del elevador. También introducimos las gráficas de estado y los diagramas de actividades de UML, y los conceptos de eventos y acciones tal y como se relacionan con estos diagramas. Capítulo 4 —Arreglos— Explica la estructuración de datos en arreglos, o grupos de elemen tos de datos relacionados, del mismo tipo. El capítulo presenta numerosos ejemplos tanto de arreglos unidimensionales como de arreglos bidimensionalcs. Es bien reconocido que estructurar los datos apropiadamente es tan importante como utilizar de manera efectiva las estructuras de control en el desarrollo de programas bien estructurados. lx>s ejemplos de este capítulo investigan distintas for mas comunes de manipulación de arreglos, impresión de histogramas. ordenamiento de datos, paso de arreglos a funciones y una introducción al campo de las encuestas de datos (mediante estadísti cas simples). Una de las características de este capítulo es la explicación que da sobre las técnicas elementales de ordenamiento y la búsqueda de datos y la presentación de la búsqueda binaria como una mejora dramática respecto a la búsqueda lineal. Los 121 ejercicios al final del capítulo inclu yen una variedad de problemas interesantes y desafiantes, como las técnicas mejoradas de ordena miento, el diseño de un pequeño programa de reservaciones para una línea aérea, una introducción al concepto de los gráficos de tortuga (que se hicieron famosos en el lenguaje LOGO) y los proble mas que presentan los juegos del recorrido del caballo y las ocho reinas, los cuales introducen la idea de la programación heurística utilizada ampliamente en el campo de la inteligencia artificial. Los http://alexyniorlls.blogspot.com 101 of 1380.
46
Introducción a las computadoras y a la programación en C++
Capítulo 1
ejercicios concluyen con muchos problemas de recursividad que incluyen el ordenamiento por se lección, palíndromos, búsqueda lineal, búsqueda binaria, el problema de las ocho reinas, el desplie gue de un arreglo, el despliegue de una cadena a la inversa y encontrar el valor más pequeño de un arreglo. Este capítulo todavía utiliza arreglos al estilo de C, los cuales, como verá en el capítulo 5, son en realidad apuntadores al contenido del arreglo en memoria.7 En la sección “acerca de los ob jetos" del capítulo 4. determinamos muchas de las operaciones (comportamientos) de las clases en el simulador de un elevador. También introducimos el diagrama de secuencia de UML y el concep to de mensajes, que los objetos pueden enviarse entre sí. Capítulo 5 —Apuntadores y cadenas— Presenta una de las características más poderosas y difíciles del lenguaje C++. El capítulo proporciona explicaciones detalladas acerca de los operado res para apuntadores, de las llamadas por referencia, de las expresiones con apuntadores, de la arit mética de apuntadores, de la relación entre apuntadores y arreglos, de los arreglos de apuntadores y los apuntadores a funciones. En C++, existe una íntima relación entre los apuntadores, los arreglos y las cadenas, de manera que introducimos conceptos de manipulación de cadenas y explicamos al gunas de las funciones de manipulación de cadenas más populares, tales como getline (introdu ce una línea de texto), strepy y strnepy (copia una cadena), strcat y atrncat (concatena dos cadenas), stremp y stracmp (compara dos cadenas), strtok (“divide” una cadena en sus piezas) y str len (calcula la longitud de una cadena). Los 134 ejercicios del capítulo incluyen una simulación de la clásica carrera entre la tortuga y la liebre, barajar y repartir las cartas, la clasifica ción quicksort recursiva y recorridos recursivos a través de laberintos. Además, incluimos una sección especial titulada “Cómo construir su propia computadora”. Esta sección explica la programación en lenguaje máquina y continúa con un proyecto que involucra el diseño y la implemcntación de un simulador de una computadora que permite al lector escribir y ejecutar programas en lenguaje má quina. Esta característica única del libro le será especialmente útil a aquel lector que desee entender cómo funcionan en realidad las computadoras. Nuestros estudiantes disfrutan este proyecto y a menudo ¡mplementan mejoras sustanciales, muchas de las cuales se sugieren en los ejercicios. En el capítulo 17, otra sección especial guía al lector a través de la construcción de un compilador, el lenguaje má quina que produce el compilador se ejecuta en el simulador de lenguaje máquina construido en los ejercicios del capítulo 5 .1.a información se comunica desde el compilador hasta el simulador en ar chivos sccucnriales, los cuales explicamos en el capítulo 14. Una segunda sección especial incluye ejercicios desafiantes para la manipulación de cadenas relacionadas con el análisis de texto, el pro cesamiento de palabras, la impresión de fechas en distintos formatos, la comprobación de protección, la escritura del texto equivalente a una cifra numérica, conversiones de código Morse y del sistema métrico al sistema inglés. El lector querrá volver a revisar estos ejercicios de manipulación de texto después de estudiar la clase string en el capítulo 15. Mucha gente descubre que el tema de los apuntadores es, por mucho, la parte más difícil de un curso introductorio de programación. Los arre glos y las cadenas en C y en “C++ puro” son apuntadores al contenido de arreglos y cadenas dentro de la memoria (incluso los nombres de las funciones son apuntadores). El estudio cuidadoso de es te capítulo lo deberá recompensar con una completa comprensión del complejo tema de los apunta 7. En los siguientes capítulos, presentaremos a los arreglos como objetos completamente maduros. En el capítulo 8. utilizaremos las técnicas de sobrecarga de operadores pata elaborar una dase valiosa llamada A r r e g l o , a par tir de la cual crearemos objetos A r r e g l o , los cuales son mucho más robustos y resulta mucho más placentero programar con ellos que con los arreglos del capítulo 4. Continuaremos esa explicación introduciendo la clase predefinida de C++ llamada v e c t o r , la cual implementa una robusta estructura de datos. En el capítulo 21. La Standard Témplate Library (STL), presentaremos con detalle la clase v e c t o r , la cual, cuando se utiliza con los ¡te ñidores y los algoritmos que explicamos en el capítulo 21. crea un sólido tratamiento de los arreglos como objetos maduros.
http://alexyniorlls.blogspot.com 102 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación en C-m -
47
dores. De nuevo, explicamos los arreglos y las cadenas como objetos maduros más adelante en el li bro. En el capítulo 8, utilizamos la sobrecarga de operadores para elaborar las clases personalizadas Arreglo y Cadena. El capítulo 8 introduce además las clases str ing y vector de la Standard Library, para la manipulación de cadenas y arreglos como objetos. Explicamos con detalle estos objetos en los capítulos 15 y 21, respectivamente. El capítulo 5 está repleto de ejercicios desafiantes. Asegúrese de experimentar con nuestra Sección especial: cómo construir su propia computadora. En la sección “acerca de los objetos”, determinamos muchas de las colaboraciones (interacciones en tre los objetos en el sistema) necesarias para ¡mplementar el sistema del elevador y para representar estas colaboraciones mediante el diagrama de colaboración de UML. También incluimos una biblio grafía y una lista de recursos de la World Wide Web y de Internet que contienen las especificaciones de UML y otros materiales de referencia, recursos en general, tutoriales, preguntas más frecuentes, ar tículos, documentación oficial y software. Capítulo 6 —Clases y abstracción de datos— Comienza nuestra explicación acerca de la pro gramación orientada a objetos. El capítulo representa una magnifica oportunidad para enseñar la abs tracción de datos de “manera correcta”, a través de un lenguaje (C++) dedicado expresamente a la implemcntación de tipos de datos abstractos (ADTs). En años recientes, la abstracción de datos se lia convertido en un tema importante en los cursos básicos. De los capítulos 6 a 8 se incluye una só lida explicación de la abstracción de datos. El capítulo 6 trata la implementación de las ADTs como clases de estilo C++, y por qué este método es superior al uso de struct; también considera cómo acceder a los miembros de la clase, cómo separar la interfaz de la implementación, cómo utilizar las funciones de acceso y las funciones de utilería, la inicialización de objetos mediante cons tructores, la destrucción de objetos mediante destructores, la asignación mediante la copia por defec to de miembros del objeto y la reutilización de software. El capítulo reta al estudiante a desarrollar clases para números complejos, números racionales, tiempo, rectángulos, enteros muy grandes y el juego del gato. Por lo general, los estudiantes disfrutan de los programas de juegos. Los estudiantes que se inclinan por las matemáticas disfrutarán los ejercicios para crear la clase Complejo (para números complejo), la clase Racional (para números racionales) y la clase Enteromuygran de (para enteros muy grandes). La sección “acerca de los objetos" le pedirá que escriba un archivo de encabezado de clase para cada una de las clases del simulador del elevador. En la sección “acer ca de los objetos", utilizaremos el diagrama de clase de UML desarrollado en secciones previas pa ra bosquejar los archivos de encabezado en C++ que definirán las clases. También introduciremos el concepto de ¡dentiPicadores de los objetos, y comenzaremos con el estudio de la manera de implementar los idcntificadores en C++. Capítulo 7 —Clases, parte II— Continúa el estudio de las clases y la abstracción de datos. El capítulo explica cómo declarar y utilizar objetos constantes, funciones miembro constantes, la com posición (el proceso de construcción de clases que tienen objetos de otras clases como miembros), funciones y clases friend. las cuales tienen derechos especiales de acceso a los miembros pri vados y protegidos de las clases, el apuntador this, que permite a un objeto saber su propia dirección, la asignación dinámica de memoria, miembros estáticos de la clase para contener y manipular todos los datos de la clase, ejemplos de populares tipos de datos abstractos (arreglos, ca denas y colas), clases contenedoras e iteradores. Los ejercicios del capítulo piden al estudiante que desarrolle una clase para cuentas de ahorros y una clase para almacenar conjuntos de números ente ros. Cuando explicamos los objetos constantes, mencionamos brevemente la palabra reservada mutable, la cual, como veremos en el capítulo 22, se utiliza de manera sutil para permitir la ¡mplementación de la “invisibilidad" en los objetos const. Explicaremos la asignación dinámica de memoria mediante el uso de new y delete. Cuando new falla, el programa termina por defecto, debido a que new "arroja una excepción” en C++ estándar. El capítulo 13 explica la captura y el ma http://alexyniorlls.blogspot.com 103 of 1380.
48
Introducción a las computadoras y a la programación en C++
Capítulo 1
nejo de excepciones. Motivaremos la explicación de los miembros estáticos de clase mediante un ejemplo basado en un juego de vídeo. Enfatizaremos qué tan importante es esconder los detalles de implementación a los clientes de una clase: después, mostraremos datos privados en nuestros encabezados de clase, lo cual revela la implementación. Explicaremos las clases proxy, que propor cionan una forma de ocultar a los clientes la implementación de una clase. La sección “acerca de los objetos” le pide que incorpore la administración de memoria dinámica y la composición al simulador del elevador. Los estudiantes disfrutarán el ejercicio para la creación de la clase Con juntoEntaros. Esto motiva el tratamiento de la sobrecarga de operadores del capítulo 8. En la sección “acerca de los objetos”, presentamos el programa completo en C-h -, del simulador del elevador (aproximada mente 1,250 líneas de código) y una explicación de dicho código. El código se basa de manera di recta en el diseño UML que creamos en secciones previas, y emplea nuestras buenas prácticas de programación, incluso el correcto uso de los datos y de las funciones miembro estáticos y cons tantes. También explicaremos la asignación dinámica de memoria, la composición y la interac ción de los objetos mediante idcntificadorcs, y cómo utilizar las declaraciones forward para evitar el problema de “inclusión circular”. Capítulo 8 —Sobrecarga de operadores: objetos de tipo cadena y de tipo arreglo— Presen ta uno de los temas más populares en los cursos de C++. Los estudiantes realmente disfrutan este material. Encuentran una perfecta coincidencia con la explicación de los tipos abstractos de los ca pítulos 6 y 7. La sobrecarga de operadores permite a los programadores indicar al compilador cómo utilizar operadores existentes con objetos de tipos nuevos. C++ ya sabe cómo utilizar estos operado res con objetos de tipos predefinidos, tales como enteros, flotantes o caracteres. Pero suponga que creamos una nueva clase llamada cadena ¿cuál sería el significado del signo + cuando éste se uti lice entre objetos de tipo cadena? Muchos programadores utilizan el signo + con cadenas para indi car la concatenación. En el capítulo 8, el programador aprenderá cómo “sobrecargar” el signo +, así, cuando éste se escriba entre dos objetos de cadena dentro de una expresión, el compilador generará una llamada a la “función de operador" que concatenará las dos cadenas. El capítulo explica los fun damentos de la sobrecarga de operadores, las restricciones en la sobrecarga de operadores, la sobre carga mediante funciones de clases miembro contra la sobrecarga mediante funciones independien tes, la sobrecarga de operadores unarios y binarios, y la conversión de tipos. Una característica del capítulo es la considerable colección de ejemplos prácticos, que incluyen una clase arreglo, una cla se cadena, una clase fecha, una clase para enteros muy grandes y una clase para números complejos (las dos últimas aparecen con el código fuente de los ejercicios). Los estudiantes que se inclinan por las matemáticas disfrutarán al crear la clase polinomio en los ejercicios. Este material es diferen te al que usted revisa en la mayoría de los lenguajes de programación y en los cursos. La sobrecar ga de operadores es un tema difícil, pero muy enriquecedor. El uso de la sobrecarga de operadores le ayudará de manera atinada a agregar “brillantez” adicional a sus ciases. Las explicaciones de la clase Arreglo y de la clase Cadena son particularmente importantes para los estudiantes que pro seguirán con el uso de las clases string y vector de la biblioteca estándar, las cuales se intro ducen mediante programas de prueba que emplean string y vector para imitar las capacidades que muestran los ejemplos que usan Cadena y Arreglo. La introducción de string y vector en este punto brinda al estudiante experiencia importante para la reutilización de software mediante clases existentes, en lugar de “reinventar la rueda”. Mediante las técnicas de los capítulos 6 a 8, es posible elaborar una clase Fecha que, si hubiéramos utilizado hace veinte años, fácilmente podría mos haber eliminado una porción importante del denominado “problema del año 2000 (o Y2K)”. Los ejercicios alientan al estudiante a agregar sobrecarga de operadores a las clases Complejo. Ra cional y Enteromuygrande para permitir una manipulación más conveniente de los objetos de estas clases mediante operadores (como en matemáticas) en lugar de llamadas a función, como lo hi zo el estudiante en los ejercicios del capítulo 7. http://alexyniorlls.blogspot.com 104 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
49
Capitulo 9 — Programación orientada a objetos: herencia— Introduce una de las capacida des fundamentales de los lenguajes orientados a objetos. La herencia es una forma de reutilización de software, en la cual, los programadores crean clases que absorben una clase de datos ya existente y el comportamiento y mejora de los mismos con nuevas capacidades. FJ capítulo explica las nocio nes de las clases base y las clases derivadas, miembros protegidos, herencia pública, heren cia protegida, herencia privada, clases base directas, clases base indirectas, constructores y destructores en clases base y en clases derivadas, c ingeniería de software con herencia. FJ capítulo compara la herencia (relación “es_un”) mediante composición (relación “tiene_un”) e introduce las relaciones “utiliza_un” y “conoce_a”. Una característica del capítulo es el ejemplo que implemcnta la jerarquía de clases punto, círculo, cilindro. Con el uso de este ejemplo “mecánico”, examinamos la relación entre las clases base y las clases derivadas, y entonces mostramos cómo las clases deri vadas utilizan datos y funciones miembro heredadas. En la sección “acerca de los objetos”, actuali zamos el diseño y la implementación del simulador del elevador para incorporar la herencia. Tam bién sugerimos más modificaciones que el estudiante puede diseñar c implcmcntar. Capítulo 10 —Programación orientada a objetos: polimorfismo— Trata con otra de las capacidades fundamentales de la programación orientada a objetos, denominada comportamiento polimórfico. Cuando muchas clases están relacionadas con una clase común a través de la herencia, cada objeto de clase derivada debe ser tratado como un objeto de clase base. Esto permite que los programas se escriban, en general, de manera independiente de los tipos específicos de objetos de clase derivada. Se pueden manejar nuevos tipos de objetos mediante el mismo programa, y así, hacer que los sistemas puedan ampliarse. El polimorfismo permite a los programas eliminar la compleja lógica de switches (indicadores) a favor de una lógica “en línea recta” más sencilla. Por ejemplo, un administrador de pantalla de un juego de vídeo, puede enviar un mensaje de dibujo a cada obje to en una lista ligada de objetos. Cada objeto sabe cómo dibujarse a sí mismo. Se puede agregar un objeto de una clase nueva, sin tener que modificar dicho programa (mientras esc objeto nuevo tam bién sepa cómo dibujarse a sí mismo). Por lo general, este estilo de programación se utiliza para ¡mplcmcntar las populares interfaces gráficas de programación (GUI). El capítulo explica la mecánica para obtener un comportamiento polimórfico mediante las funciones virtuales. Se distingue en tre clases abstractas (desde las cuales no se pueden obtener instancias para objetos) y clases concre tas (desde las cuales se pueden obtener instancias para objetos). Las clases abstractas son útiles pa ra proporcionar una interfaz heredable a las clases, a lo largo de la jerarquía. Demostramos el com portamiento de las clases abstractas y el polimorfismo al revisar la jerarquía de clases del punto, el círculo y el cilindro del capítulo 9. Introducimos una clase base abstracta llamada Forma, a partir de la cual, la clase Punto hereda de manera directa, y las clases Círculo y Cilindro heredan de manera indirecta. En respuesta a esta jerarquía, nuestra audiencia profesional insistió en que pro porcionáramos una explicación más profunda de cómo se implementa el polimorfismo en C++ y, por lo tanto, cuáles son los “costos” de tiempo y memoria en los que se incurre cuando programamos mediante esta poderosa capacidad. Respondimos con el desarrollo de una explicación ilustrada y pre cisa de las viables (tablas de funciones virtuales) que construye el compilador de C++ de ma nera automática para permitir el polimorfismo. Para concluir el capítulo 10, introducimos la infor mación de tipo en tiempo de ejecución (RTTI, run-time type information) y la conversión dinámica de tipos, la cual permite a un programa determinar el tipo de un objeto en tiempo de ejecución y, en tonces, actuar en concordancia sobre dicho objeto. Mostramos esto en el contexto de una jerarquía de herencia más “natural”; muchas clases se derivan de la clase base abstracta Empleado, en la cual, cada empleado tiene una función común, ingresos, para calcular el pago semanal de un em pleado. Mediante el uso de RTTI y de la conversión dinámica de tipos, damos un pago adicional del 10% a empleados de un tipo específico, y después calculamos los ingresos para dichos empleados. Para todos los demás tipos de empleados, calculamos sus ingresos. http://alexyniorlls.blogspot.com 105 of 1380.
50
Introducción a las computadoras y a la programación en C++
Capítulo 1
Capítulo 11 —Plantillas— Explica una de las adiciones más recientes a C++. En el capítulo 3, introdujimos las plantillas de funciones. El capítulo 11 presenta un ejemplo adicional de una planti lla de función. Las plantillas de clases permiten al programador capturar la esencia de un tipo de dato abstracto (tal como una pila, un arreglo, o una cola) y crear, con una mínima adición de código, ver siones de dicha ADT para tipos particulares (tal como una cola de enteros, una cola de números flotantes, una cola de cadenas, etcétera), y para proporcionar información de un tipo específico co mo parámetro cuando se crea una instancia de dicho ADT. Por esta razón, las plantillas de clases a menudo son llamadas tipos parametrizados. El capítulo explica, mediante el uso de parámetros con tipo y parámetros sin tipo, y considera la interacción entre las plantillas y otros conceptos en C++, tales como la herencia, los miembros amigos y estáticos. Los ejercicios retan a los estudian tes a escribir una variedad de plantillas de funciones y platillas de clase, y emplearlas dentro de programas completos. Hemos mejorado enormemente el tratamiento de las plantillas en nuestra ex plicación de los contenedores, iteradores y algoritmos de la biblioteca de plantillas estándar (STL). Capítulo 12 — Entrada/Salida de flujo en C+-»— Contiene una extensa explicación de la cntrada/salida estándar orientada a objetos en C++. El capítulo explica las distintas capacidades de entrada y salida de C++, las cuales incluyen la salida mediante el operador de inserción de flujo, la entrada mediante el operador de extracción de flujo, cntrada/salida con seguridad de tipo, entrada/salida con formato, cntrada/salida sin formato (por rendimiento), manipuladores de flujo para controlar base numérica (decimal, octal, o hexadecimal), formato de números de punto flotante, con trol del ancho de campo, manipuladores definidos por el usuario, estado del formato de flujo, esta dos de error de flujo, entrada y salida de objetos de tipos definidos por el usuario y la liga de flujos de salida a flujos de entrada (para asegurar que los indicadores aparezcan antes de que el usuario ingrese las respuestas). Capítulo 13 — Manejo de excepciones— Explica cómo el manejo de excepciones permite a los programadores escribir programas robustos, con tolerancia a fallas y apropiados para ambientes críticos de negocios y de misión. El capítulo explica cuándo es apropiado el manejo de excepciones; introduce las capacidades básicas del manejo de excepciones mediante los bloques try. instruccio nes throw y bloques catch; indica cómo y cuándo relanzar una excepción; explica cómo escribir una especificación de excepción y procesar excepciones inesperadas; y explica las importantes rela ciones entre las excepciones y los constructores, y los destructores y la herencia. Los ejercicios de este capítulo muestran al estudiante la diversidad y el poder de las capacidades de manejo de excep ciones de C++. Discutimos cómo relanzar una excepción, e ¡lustramos las dos maneras en que new puede fallar cuando la memoria está agotada. Antes del borrador del estándar de C++, la falla de new regresaba 0, tal como en C mal loe regresa un apuntador NULL, si falla. Mostramos el nuevo estilo de falla de new al arrojar una excepción bad_alloc (asignación errónea). Ilustramos la for ma de utilizar set_new_handler para especificar una función personalizada que pueda ser lla mada para enfrentar situaciones de agotamiento de memoria. Explicamos cómo utilizar la plantilla de clase auto_ptr para borrar de manera implícita la asignación de memoria dinámica, y así eliminar huecos de memoria. Para concluir este capítulo, presentamos la jerarquía de excepciones de la biblioteca estándar. Capítulo 14 — Procesamiento de archivos— Explica las técnicas para el procesamiento de ar chivos de texto con acceso secuencial y acceso aleatorio. El capítulo comienza con una introducción a la jerarquía de datos desde bits, a bytes, a campos, a registros y archivos. Después, presentamos la visión de C++ con respecto a los archivos y flujos. Explicamos los archivos de acceso secuencial y construimos programas que muestran cómo abrir y cerrar archivos, cómo almacenar datos de mane ra secuencial en un archivo y cómo leer los datos de manera secuencial desde un archivo. Explica http://alexyniorlls.blogspot.com 106 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
51
mos los archivos de acceso aleatorio y construimos programas que muestran cómo crear un archivo para acceso aleatorio, cómo leer y escribir datos en un archivo con acceso aleatorio y cómo leer da tos de manera secuencial desde un archivo de acceso aleatorio. El cuarto programa de acceso alea torio combina las técnicas de acceso a archivos tanto secuenciales como de acceso aleatorio, dentro de un programa completo de procesamiento de transacciones. Los estudiantes de nuestros semina rios para la industria han mencionado que, después de estudiar el material sobre el procesamiento de archivos, fueron capaces de producir programas importantes de procesamiento de archivos que fue ron de utilidad inmediata dentro de sus empresas. Los ejercicios piden a los estudiantes que implementen una variedad de programas que construyen y procesan tanto archivos de acceso secuencial como archivos de acceso aleatorio. Capitulo 15 —1.a clase string y el procesamiento de flujos de cadena— El capítulo también explica la capacidad de C++ para introducir datos desde cadenas en memoria y arrojar datos hacia cadenas en memoria; esta capacidad a menudo se denomina procesamiento de flujos de cadenas. 1.a clase string es un componente necesario para la biblioteca estándar. Por diversas razones man tenemos la explicación de cadenas de estilo C del capítulo 5 y posteriores. Primero, fortalece el entendimiento del lector respecto a los apuntadores. Segundo, para la siguiente década o más, los programadores de C++ necesitarán ser capaces de leer y modificar la enorme cantidad de código C heredado que se ha acumulado durante los últimos veinticinco años (este código procesa cadenas co mo apuntadores, como lo hace una gran porción de código en C++ que se ha escrito en la industria durante los últimos años). F.n el capítulo 15 explicamos la asignación de string. la concatenación y la comparación. Mostramos cómo determinar distintas características para string tales como el tamaño de string. la capacidad, y si está o no vacía. Explicamos cómo modificar el tamaño de string. Consideramos varias de las funciones de búsqueda que nos permiten encontrar una subeadena dentro de string (la búsqueda dentro de string hacia delante o hacia atrás), y mostramos cómo encontrar la primera o la última ocurrencia de un carácter seleccionado dentro de una clase string. y cómo encontrar la primera o la última ocurrencia de un carácter que no está selecciona do dentro de string. Explicamos cómo remplazar, eliminar e insertar caracteres dentro de string. Explicamos cómo convertir un objeto string a una cadena char * al estilo de C. Capítulo 16 — Programación Web con CGI— Este nuevo capítulo contiene todo lo que usted necesita para desarrollar sus propias aplicaciones basadas en Web ¡I.as cuales realmente funcionarán en Internet!* Usted aprenderá cómo construir aplicaciones de n-capas. en la cual, la funcionalidad que se proporciona a cada capa se puede distribuir a computadoras separadas a través de Internet, o sobre la misma computadora. En particular, construiremos una aplicación para una librería en línea de tres capas. La información de la librería se almacena en la capa más profunda de la aplicación, también llamada capa de datos. En las aplicaciones industriales, por lo general la capa de datos es una base de datos como Oracle, Microsoft SQL Server o MySQL. Por sencillez, utilizamos archivos de texto y empleamos las técnicas de procesamiento de archivos del capítulo 14 para tener acceso a estos archivos. El usuario introduce las peticiones y recibe las respuestas en la capa más alta de la aplicación, también llamada la capa de la interfaz de usuario o la capa cliente, que por lo general es una computadora que ejecuta un navegador Web como Microsoft Internet Explorer o Netscape. Por supuesto, los navegadores Web. saben cómo comunicarse con los sitios Web a través de Internet. La capa intermedia, también llamada capa de lógica de negocio, contiene tanto un servidor Web como8 8. Existen otras tecnologías para desarrollar aplicaciones basadas en Web. Los desarrolladores en Java utilizan los scrvlcts de Java y JavaScrvcr Pagcs. Los desarrolladores en Microsoft utilizan Active Server Pagcs (ASP). Noso tros elegimos CGI para este libro, debido a que tanto el estándar de C++ como CGI son independientes de la pla taforma.
http://alexyniorlls.blogspot.com 107 of 1380.
52
Introducción a las computadoras y a la programación en C++
Capítulo 1
un programa de aplicación específico en C++ (por ejemplo, nuestra aplicación de librería). El servi dor Web se comunica con el programa de C++ (y viceversa) mediante el protocolo CGI (interfaz co mún de puerta de enlace). Este programa es denominado script CGI. Utilizamos el popular servidor Web Apache, el cual puede descargar gratuitamente desde el sitio Web de Apache, www.apa che.org. Las instrucciones de instalación de Apache para diversas plataformas populares, que incluyen Linux y sistemas Windows, están disponibles en el sitio, en www.deitel.com y en www.prenhell.com/deitel.El servidor Web sabe cómo comunicarse con la capa diente a través de Internet mediante el protocolo llamado http (protocolo de transferencia de hipertexto). Ex plicamos los dos métodos más populares de http para enviar datos al servidor Web (GET y POST). Después, explicamos el papel crucial del servidor Web en la programación Web y proporcionamos un ejemplo sencillo que solicita un documento en el lenguaje de marcación de hipertexto extendi do (XHTML)9 desde un servido Web. Explicamos CGI y cómo permite a un servidor Web comuni carse con la capa más alta y las aplicaciones CGI. Proporcionamos un ejemplo sendllo que obtiene la hora del servidor y la representa en un navegador. Otros ejemplos demuestran cómo procesar una entrada de datos del usuario basada en formularios, mediante las técnicas para procesamiento de cadenas introducidas en el capítulo 15. En nuestros ejemplos basados en formularios utilizamos bo tones, campos para contraseñas, casillas de verificación y campos de texto. Presentamos un ejemplo de un portal interactivo para una agencia de viajes, el cual despliega los precios de boletos para dis tintas ciudades. Los miembros del club de la agencia de viajes pueden acceder y revisar las tarifas con descuento. También analizamos distintos métodos para almacenar datos específicos del cliente, los cuales incluyen campos ocultos (es decir, información almacenada en la página Web, pero no re presentada por el navegador) y cookics, pequeños archivos de texto que el navegador almacena en la máquina del cliente. Los ejemplos del capítulo concluyen con un ejemplo práctico de una librería en línea que permite a los usuarios agregar libros a la canasta de compras. Este ejemplo práctico con tiene varios Scripts CGI que interactúan para formar una aplicación completa. La librería en línea está protegida mediante una contraseña, de manera que los usuarios primero deben registrarse para poder acceder. Los recursos Web del capítulo incluyen información acerca la especificación CGI, las bibliotecas CGI de C++ y sitios Web relacionados con el servidor Web de Apache. Capítulo 17 —Estructuras de datos— Explica las técnicas utilizadas para crear y manipular estructuras de datos dinámicas. El capítulo comienza con explicaciones acerca de las clases anida das y la asignación dinámica de memoria, y procede con una explicación acerca de cómo crear y dar mantenimiento a distintas estructuras de datos dinámicas, que incluyen las listas ligadas, colas (o líneas de espera), pilas y árboles. Para cada tipo de estructura de datos, presentamos programas completos y funcionales, y mostramos ejemplos de los resultados. El capítulo también ayuda al es tudiante a dominar los apuntadores. El capítulo incluye abundantes ejemplos que utilizan la indirec ción (o des referencia) y la doble indirección, conceptos particularmente difíciles. Uno de los proble mas al trabajar con apuntadores es que a los estudiantes les cuesta trabajo visualizar las estructuras de datos y cómo se entrelazan sus nodos. Incluimos ilustraciones que muestran las ligas y la secuen cia en la cual se crean. El ejemplo del árbol binario es una maravillosa conclusión para el estudio de los apuntadores y las estructuras de datos dinámicas. Este ejemplo crea un árbol binario, refuerza la eliminación de duplicados, c introduce los recorridos de árbol recursivos en prcordcn, inorden y po sorden. Los estudiantes tienen un sentido genuino de la responsabilidad cuando estudian e imple9. XíITML es un lenguaje de marcación para identificar los elementos de un documento XHTML (página Web) de manera que un navegador puede representar (es decir, desplegar) dicha página en la pantalla de su computadora. XHTML es una nueva tecnología diseñada por el Consorcio World Wide Web para remplazar el lenguaje de mar cación de hipertexto (HTML) como la principal herramienta para especificar contenido Web. En el apéndice E. introducimos XHTML.
http://alexyniorlls.blogspot.com 108 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación en C-m -
53
mentan este ejemplo. En particular, aprecian el poder ver que el recorrido inorden despliega los va lores de los nodos en orden. Incluimos una amplia colección de ejercicios. La culminación de los ejercicios es la sección especial “Cómo construir su propio compilador”. Los ejercicios guían al es tudiante a través del desarrollo de un programa de conversión de expresiones infijo a postfijo y de un programa de evaluación de expresiones postfijo. Después, modificamos el algoritmo de evaluación de expresiones postfijo para generar código en lenguaje máquina. El compilador coloca este código en un archivo (mediante el uso de las técnicas del capítulo 14). Así, los estudiantes ejecutan el lenguaje máquina producido por sus propios compiladores sobre los simuladores de software que construye ron en los ejercicios del capítulo 5. Los 47 ejercicios incluyen la búsqueda recursiva en una lista, el desplegado recursivo de una lista en orden inverso, la eliminación de un nodo de un árbol binario, el recorrido en orden de niveles de un árbol binario, la impresión de árboles, la escritura de una por ción de un compilador optimizado, la escritura de un interprete, la inserción y la eliminación en una lista ligada, la ¡mplementación de listas y colas sin apuntadores traseros, el análisis del rendimiento de la búsqueda y la clasificación de árboles binarios, la ¡mplementación de una clase de lista indexada y la simulación de un supermercado que utiliza colas de espera. Después de estudiar el capítu lo 17, el lector estará preparado para manejar contenedores, iteradores y algoritmos de STL en el capítulo 21. Los contenedores STL son estructuras de datos preempacadas en plantillas que la ma yoría de los programadores considerarán suficientes para la vasta mayoría de aplicaciones que nece sitarán implcmcntar. STL representa un paso gigantesco para lograr la visión de la reutilización. Capítulo 18 —Bits, caracteres, cadenas y estructuras— Presenta una variedad de caracterís ticas importantes. Las poderosas capacidades de C++ para la manipulación de bits permiten a los programadores escribir programas que ejerciten las capacidades de hardware de bajo nivel. Esto ayu da a los programas a procesar cadenas de bits, configurar bits específicos y almacenar información de manera más compacta. Dichas capacidades, a menudo se encuentran sólo en lenguajes ensamblado res de bajo nivel, son valiosas para los programadores que escriben sistemas de software, tales como sistemas operativos y software para redes. Como recordará, introdujimos la manipulación de cade nas al estilo C c h a r * en el capítulo 5, y en este capítulo presentamos las funciones más popula res de manipulación de cadenas. En el capítulo 18, continuamos nuestra presentación de caracteres y cadenas c h a r * al estilo C. Presentamos las distintas capacidades de la biblioteca < c c ty p e > , éstas incluyen la habilidad de evaluar un carácter para determinar si es un dígito, un carácter alfa bético, uno alfanumérico, un dígito hexadecimal, una letra minúscula o una letra mayúscula. Presenta mos las demás funciones para la manipulación de cadenas correspondientes a las diversas bibliotecas relacionadas con cadenas: como siempre, cada función se presenta en el contexto de un programa completo y funcional de C++. Las estructuras en C++ son como registros en otros lenguajes; éstos congregan elementos de datos de distintos tipos. Una característica del capítulo es su simulación de alta calidad para barajar y repartir. Ésta es una excelente oportunidad para el maestro para hacer én fasis en la calidad de los algoritmos. Los 91 ejercicios impulsan al estudiante a intentar muchas de las capacidades que explicamos en el capítulo. El ejercicio característico de este capítulo guía al es tudiante a través del desarrollo de un programa para revisión de ortografía. Los capítulos 1 a 5 y 10 a 20 son. en su mayoría, una porción de C++ “legada de C”. En particular, este capítulo presenta un tratamiento más profundo de las cadenas al estilo de C chace *, para beneficio de los programado res en C++, quienes trabajan con código legado de C. De nuevo, el capítulo 15 explica la clase string y explica la manipulación de cadenas como objetos plenamente desarrollados. Capítulo 19 —El preprocesador— Proporciona explicaciones detalladas acerca de las directi vas del preprocesador. El capítulo incluye información sobre la directiva # inelude, la cual provo ca que se incluya una copia del archivo especificado en la posición de la directiva antes de que el archivo se compile, y la directiva idefine que crea constantes simbólicas y macros. El capítulo http://alexyniorlls.blogspot.com 109 of 1380.
54
Introducción a las computadoras y a la programación en C++
Capítulo 1
explica la compilación condicional para permitir al programador controlar la ejecución de las direc tivas del prcproccsador y la compilación del código del programa. Explicamos el operador #, que convierte su operando en una cadena y el operador ##. que concatena dos tokens. También explica mos las distintas constantes simbólicas predefinidas por el preprocesador (__ LINE__,__FILE__, __DATE__,__STDC__, __TIME__y __ TIMESTAMP__ ). Por último, presentamos la macro a s s e r t del archivo de encabezado < c a s s e r t > , la cual es muy importante en la evaluación de programas, la depuración, la verificación y la validación. Capítulo 20 —Temas relacionados con el código heredado de C— Presenta temas adiciona les que incluyen temas avanzados que normalmente no se cubren en cursos introductorios. Mos tramos cómo redircccionar la entrada de un programa para que ésta provenga de un archivo, cómo redireccionar la salida de un programa para que ésta se coloque en un archivo, cómo redircccionar la salida de un programa para que sea la entrada de otro programa (canalización), y cómo mandar la salida de un programa hacia un archivo existente. Nosotros desarrollamos funciones que utilizan lis tas de argumentos de longitud variable y muestran cómo pasar argumentos de línea de comando a la función m ain y cómo utilizarlas dentro de un programa. Explicamos cómo compilar programas, cu yos componentes estén dispersos en distintos archivos, cómo registrar funciones mediante a t e x i t para que se ejecuten al final del programa, y cómo finalizar la ejecución del programa mediante la función e x i t . También explicamos los identificadores c o n s t y v o l a t i l e . especificando el tipo de una constante numérica mediante el uso de los sufijos para enteros y para números de punto flo tante, utilizando la biblioteca de manejo de señales para atrapar eventos inesperados, creando y uti lizando arreglos dinámicos con c a l l o c y r e a l l o c , utilizando las u n io n e s como una técnica de ahorro de espacio, y utilizando especificaciones de enlace cuando los programas en C++ se liguen con código heredado de C. Como lo sugiere el título, este capítulo está dedicado primordialmente a los programadores de C++ que trabajarán con código heredado de C. Capítulo 21 — Biblioteca estándar de plantillas (STL)— A lo largo del libro, explicamos la importancia de la reutilización de software. Al reconocer que los programadores de C++ utilizaron comúnmente muchas estructuras de datos y algoritmos, el comité de estandarización de C++ agregó la biblioteca de plantillas estándar (STL) a la biblioteca estándar de C++. La STL define componen tes reutilizables poderosos, basados en plantillas que implementan muchas de las estructuras de datos comunes y los algoritmos utilizados para procesar dichas estructuras de datos. La STL ofrece una prueba de concepto para la programación genérica con plantillas, la cual introdujimos en el capítu lo 11 y demostramos con detalle en el capítulo 17. Este capítulo introduce la STL y analiza sus tres componentes, contenedores (populares estructuras de datos en plantillas), iteradores y algoritmos. Los contenedores STL son estructuras de datos capaces de almacenar objetos de cualquier tipo de dato. Veremos que existen tres tipos de contenedores, contenedores de primera clase, adaptadores y contendores cercanos. Los iteradores STL, los cuales tienen propiedades similares a los apuntado res, son utilizados por los programas para manipular los elementos de un contenedor STL. De hecho, los arreglos estándares se pueden manipular como contenedores STL. mediante el uso de apuntadores estándares como iteradores. Veremos que la manipulación de contenedores con iteradores es conve niente y proporciona un tremendo poder expresivo cuando se combina con los algoritmos STL; en al gunos casos, se reducen muchas líneas de código a una sola instrucción. Los algoritmos STL son funciones que realizan manipulaciones comunes de datos tales como búsqueda, clasificación, com paración de elementos (o de estructuras completas de datos), etcétera. Existen aproximadamente 70 algoritmos implementados en la STL. La mayoría de estos algoritmos utilizan iteradores para acce der a los elementos del contenedor. Veremos que cada contenedor de primera clase permite tipos específicos de iteradores, algunos de los cuales son más poderosos que otros. Un tipo de ¡terador per mitido por un contenedor determina si el contenedor puede utilizarse con un algoritmo específico. http://alexyniorlls.blogspot.com 110 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
55
Los ¡teradores encapsulan el mecanismo utilizado para acceder a los elementos del contenedor. El cncapsulado permite aplicar muchos de los algoritmos STL a distintos contenedores, sin tomar en cuenta la implementación subyacente del contenedor. Mientras los ¡teradores del contenedor permi tan los requerimientos mínimos del algoritmo, entonces el algoritmo puede procesar los elementos del contenedor. Esto también permite a los programadores crear algoritmos que puedan procesar los elementos de diferentes tipos de contenedores. El capítulo 17 explica cómo ¡mplementar las es tructuras de datos mediante apuntadores, clases y memoria dinámica. El código basado en apunta dores es complejo, y la más ligera omisión o descuido puede provocar serias violaciones de acceso de memoria y errores de fuga de memoria, sin que el compilador se percate de ello. I-a implementa ción de estructuras de datos adicionales tales como deques, colas de prioridad, conjuntos, mapas, etcétera, requieren de un importante trabajo adicional. Además, si muchos programadores en un pro yecto grande ¡mplcmcntan contenedores y algoritmos similares para diferentes tarcas, el código se torna difícil de modificar, mantener y depurar. Una ventaja de STL, es que los programadores pue den re Utilizar los contenedores, ¡teradores y algoritmos STL para implcmcntar representaciones y manipulaciones comunes de datos. Esta reutilización da como resultado un ahorro importante en tiempo de desarrollo y recursos. Este capítulo pretende ser una introducción a la STL. No es com pleta o integral. Sin embargo, es un capítulo afable y accesible que lo convencerá de la importancia de la STL y lo animará a estudiar más. Éste podría ser uno de los capítulos más importantes del li bro, en términos de su opinión con respecto a la rcutilización de software. Capitulo 22 —Otros temas— Es una colección de temas diversos de C++. Este capítulo expli ca dos operadores de conversión de tipos, const_cast y r6interpret_cast. Estos operado res, junto con static_cast (capítulo 2) y dynamic_cast (capítulo 10), proporcionan un mecanismo más robusto para la conversión de tipos que con los operadores de conversión de tipos originales de C++ heredados de C. Explicamos los espacios de nombre, una característica particu larmente crucial para los desarrolladores de software que construyen sistemas importantes, en espe cial para aquellos que construyen sistemas a partir de bibliotecas de clases. Los espacios de nombre previenen la colisión de nombres, las cuales pueden entorpecer dichos esfuerzos importantes. Expli camos las palabras reservadas para operadores, las cuales son útiles para programadores a los que no les gustan los operadores crípticos. El uso principal de estos símbolos se da en los mercados inter nacionales, en donde ciertos caracteres no siempre están disponibles en los teclados locales. Expli camos la palabra reservada explicit. la cual previene que el compilador invoque constructores de conversión en situaciones no deseadas; los constructores de conversión explícitos sólo se pue den invocar a través de la sintaxis de los constructores, y no a través de conversiones implícitas. Explicamos la palabra reservada mutable, la cual permite modificar un miembro de un objeto constante. Previamente, esto se hacía “eliminando la conversión de tipo constante”,la cual es una práctica peligrosa. También explicamos los operadores apuntador a miembro .* y -> * , he rencia múltiple (incluyendo el problema de la “herencia diamante”) y clases base virtuales. Apéndice A —Tabla de precedencia de los operadores— Presenta el conjunto completo de operadores de C++, en la cual cada operador aparece en una línea independiente con el símbolo del operador, su nombre y su asociatividad. Apéndice B —Conjunto de caracteres ASCII— Todos los programas en este libro utilizan el conjunto de caracteres ASCII, el cual presentamos en este apéndice. Apéndice C —Sistemas numéricos— Explica los sistemas de numeración binario, octal, deci mal y hcxadccimal. Explica cómo convertir números entre bases, y explica las representaciones bi narias en complemento a 1 y complemento a 2. Apéndice D — Recursos de C++ en Internet y Web— Contiene una lista de recursos valiosos para C++, tales como demos, información acerca de los compiladores populares (incluso “software http://alexyniorlls.blogspot.com 111 of 1380.
56
Introducción a las computadoras y a la programación en C++
Capítulo 1
gratuito"), libros, artículos, conferencias, bolsas de trabajo, diarios, revistas, ayuda, cursos, FAQs (preguntas más frecuentes), grupos de noticias, cursos basados en Web, noticias de productos y he rramientas de desarrollo para C++. Apéndice E —Introducción a XHTML— Proporciona una introducción a XHTML, un len guaje de marcación para describir los elementos de una página Web de manera que el navegador, como el Microsoft Internet Explorer o Netscape, puedan representar esa página. El lector debería familiarizarse con el contenido de este apéndice antes de estudiar el capítulo 16, Programación Web con CGI. El apéndice no contiene programación en C++. Algunos de los temas clave que cubre, incluyen la incorporación de texto e imágenes dentro de un documento XHTML, el vínculo a otros documentos XHTML. la incorporación de caracteres especiales (tales como los símbolos de marca registrada) dentro de un documento XHTML, la separación en partes de un documento XHTML con líneas horizontales (llamadas reglas horizontales), la presentación de información en listas y tablas, y la recolección de información de los usuarios que navegan en la página. Apéndice F —Caracteres especiales de XHTML— Lista muchos de los caracteres especiales comúnmente utilizados en XHTML, llamados referencias a entidades de carácter. Bibliografía— Aproximadamente 100 libros y artículos para impulsar al estudiante para leer acerca de C++ y POO. índice— El libro contiene un índice integral que permite al lector localizar por palabra reserva da cualquier término o concepto a través del libro.
RESUMEN • Una computadora es un dispositivo capaz de ejecutar cálculos y tomar decisiones lógicas a velocidades de millones e incluso miles de millones de veces más rápidas de lo que los humanos lo pueden hacer. • I-as computadoras procesan datos bajo el control de programas de computadora. • A los distintos dispositivos (tales como teclado, pantalla, discos, memoria y unidades de proceso) que com ponen un sistema de cómputo, se les denomina hardware. • I-os programas de computadora que se ejecutan en una computadora se conocen como software. • La unidad de entrada es la sección “receptora" de la computadora. La mayor parte de la información se in troduce a las computadoras actuales, a través de teclados parecidos a máquinas de escribir. • La unidad de salida es la sección "emisora" de la computadora. La mayor parte de la información que emi ten las computadoras actuales la despliegan sobre la pantalla o la imprimen en papel. • La unidad de memoria es la sección de "almacenamiento" de la computadora y, a menudo, se le llama me moria o memoria principal. • La unidad de aritmética y lógica (ALU) realiza los cálculos y toma decisiones. • Ix»s programas y los datos que no están utilizando las otras unidades, por lo general se colocan en dispositi vos de almacenamiento secundario (como discos), hasta que son nuevamente requeridos. • En el proceso por lotes de un solo usuario, la computadora ejecuta un programa de manera individual, a un tiempo, mientras procesa los dalos en grupo o lotes. • Los sistemas operativos son sistemas de software que hacen más eficiente el uso de las computadoras y que obtienen el mejor rendimiento de éstas. • Los sistemas operativos con multiprogramación permiten la operación "simultánea” de muchos trabajos en la computadora; la computadora comparte sus recursos entre los trabajos. • El tiempo compartido es un caso especial de la multiprogramación, en el cual, los usuarios acceden a la computadora a través de terminales. Los programas de los usuarios parecen ejecutarse al mismo tiempo. • Mediante el cómputo distribuido, el cómputo de una empresa se distribuye a través de redes a los sitios en donde se realiza el trabajo de la empresa. http://alexyniorlls.blogspot.com 112 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
57
• Los servidores almacenan programas y datos que pueden compartirse entre computadoras cliente a lo largo de la red. de aquí el término de computación cliente/servidor. • Cualquier computadora puede entender de manera directa solamente su propio lenguaje máquina. Por lo ge neral. los lenguajes máquina consisten en cadenas de números (reducidas a ls y Os), que instruyen a la computadora para realizar sus operaciones más elementales, una a la vez. Los lenguajes máquina son depen dientes de la computadora. • Los lenguajes ensambladores se basan en abreviaturas del inglés. Los ensambladores traducen programas de lenguaje ensamblador a lenguaje máquina • Los compiladores traducen programas en lenguaje de alto nivel a lenguaje máquina Los lenguajes de alto ni vel contienen palabras en inglés y notación matemática convencional. • Los programas intérpretes ejecutan programas en lenguajes de alto nivel de manera directa sin necesidad de compilar dichos programas a lenguaje máquina • Aunque la ejecución de los programas compilados es más rápida que la de los programas interpretados, los intérpretes son populares en ambientes de desarrollo en los que los programas se recompilan frecuentemen te. conforme se agregan nuevas características y se corrigen errores. Una vez que el programa se desarrolla se puede producir una versión compilada para lograr una ejecución más eficiente. • Es posible escribir programas en C y C++ que sean portables hacia la mayoría de las computadoras. • FORTRAN (FORmulaTRANslator) se utiliza para aplicaciones matemáticas. COBOL (COmmon Business Oriented Language) se utiliza principalmente para aplicaciones comerciales que requieren una manipulación precisa y eficiente de grandes cantidades de datos. • La programación estructurada es un método disciplinado para escribir programas que sean más claros que los no estructurados, más fáciles de probar y depurar, y más fáciles de modificar. • Pascal se diseñó para enseñar programación estructurada en ambientes académicos. • Ada se desarrolló bajo el patrocinio del departamento de defensa de Estados Unidos (DOD), utilizando Pas cal como base. • La multitarea permite a los programadores especificar actividades en paralelo. • Todos los sistemas en C++ consisten en tres partes: el ambiente, el lenguaje y las bibliotecas estándar. Las funciones de la biblioteca no son parte del lenguaje C++; estas funciones realizan operaciones tales como po pulares cálculos matemáticos. • Por lo general, los programas en C++ pasan a través de seis etapas para poder ejecutarse: edición, preproce so, compilación, enlace, carga y ejecución. • El programador escribe un programa mediante un editor y hace las correcciones necesarias. En general, los nombres de archivos C++ terminan con una de las siguientes extensiones: .c p p , . c x x , . e c o .C. • Un compilador traduce un programa en C++ a código en lenguaje máquina (o código objeto; observe que es te uso del término "objeto” no tiene relación con la “programación orientada a objetos’^. • El prcprocesador obedece a las directivas del preprocesador, las cuales, por lo general, indican los archivos a incluirse en el archivo que se está compilando, y los símbolos especiales que se reemplazan con texto de pro gramación. • Un cnlazador enlaza el código objeto con el código fallante de las funciones, para producir una imagen eje cutable (sin espacios fallantes). Si el programa se compila y se enlaza de manera apropiada, se produce un archivo ejecutable. Ésta es la imagen ejecutable del programa. • Un cargador toma una imagen ejecutable desde el disco y la transfiere a la memoria. • Una computadora, bajo el control de su CPU. ejecuta un programa instrucción por instrucción. • Errores como la división entre cero pueden ocurrir durante la ejecución del programa, de manera que estos errores se denominan errores en tiempo de ejecución. • Por lo común, la división entre cero es un error fatal, es decir, un error que ocasiona que el programa finali ce de manera inmediata sin haber terminado con éxito su trabajo. Los errores no fatales permiten a los pro gramas completar su ejecución, a menudo con resultados incorrectos.
http://alexyniorlls.blogspot.com 113 of 1380.
58
Introducción a las computadoras y a la programación en C++
Capítulo 1
• Ciertas funciones de C++ toman su entrada desde cin (el flujo estándar de entrada) el cual es, por lo gene ral, el teclado, pero cin puede conectarse a otro dispositivo. La salida de datos es a través de cout (el flu jo estándar de salida), que por lo general es la pantalla, pero cout puede conectarse a otro dispositivo. • El flujo estándar de errores se refiere a cerr. El flujo c«rr (por lo general se conecta a la pantalla) se uti liza para desplegar los mensajes de error. • Existen diversas variaciones entre las diferentes implementaciones de C++ y diferentes computadoras, que hacen de la portabilidad una meta escurridiza. • C++ proporciona capacidades para la programación orientada a objetos. • Los objetos son. en esencia, componentes de software reutilizables. que son modelos de objetos de la vida real. Los objetos están hechos a partir de “originales" denominados clases. • Los cometarios de una sola línea comienzan con I I . Los programadores insertan comentarios para documen tar programas y mejorar su claridad. Los comentarios no ocasionan acción alguna de la computadora, duran te la ejecución del programa. • La línea fincluda indica al preprocesador de C++ que incluya el contenido del archivo de encabezado de flujo de cntrada/salida dentro del programa. Este archivo contiene la información necesaria para compilar los programas que utilizan «td: :cin y »td: :cout, y los operadores << y >>. • Los programas en C++ comienzan su ejecución en la función xnain. • El objeto de salida de flujo ■ td : : cout. por lo general conectado a la pantalla, se utiliza para arrojar datos. Es posible arrojar diversos elementos de datos, concatenándolos mediante el operador de inserción de flujo (<<). • El objeto de entrada de flujo «td: : cin, por lo general conectado al teclado, se utiliza para introducir datos. Es posible introducir diversos elementos de datos, concatenándolos mediante el operador de extracción de flujo ( » ) . • Todas las variables de un programa en C++ deben declararse antes de poder utilizarse. • Un nombre de variable en C++ es cualquier identificador válido. Un identificador es una serie de caracteres que pueden consistir en letras, dígitos y guiones bajos (_ ). Los identificadores no pueden comenzar con un dígito. Los identificadores en C++ pueden tener cualquier longitud; sin embargo, algunos sistemas y/o im plementaciones pueden imponer algunas restricciones en cuanto a la longitud de los identificadores. • C++ es sensible a mayúsculas y minúsculas. • La mayoría de los cálculos se realizan dentro de instrucciones de asignación. • Toda variable almacenada en la memoria de la computadora tiene un nombre, un valor, un tipo y un tamaño. • Siempre que un valor se ubica en una parte de la memoria, éste reemplaza al valor que se encontraba ante riormente en ese lugar de la memoria. • Cada vez que se lee un valor de la memoria, el proceso es no destructivo, es decir, se lee una copia del valor y el valor original permanece sin cambio, en la ubicación de memoria. • C++ evalúa las expresiones aritméticas en una secuencia precisa, determinada por las reglas de precedencia de los operadores y su asociatividad. • La instrucción if permite a un programa tomar una decisión cuando se cumple cierta condición. El formato para una instrucción If es
if ( condición ) instrucción ; Si la condición es verdadera, se ejecuta la instrucción en el cuerpo de if. Si la condición no se cumple, es decir, si la condición es falsa, se salta la ejecución de la instrucción. • Por lo general, las condiciones en las instrucciones if se forman utilizando los operadores de igualdad y de relación. El resultado de utilizar estos operadores siempre es falso o verdadero.
http://alexyniorlls.blogspot.com 114 of 1380.
Introducción a las computadoras y a la programación ©n C-m -
Capitulo 1
59
• Las instrucciones u s in g u s in g u s in g
std ::c o u t; ■ td ::c in ; s td :r e n d í;
son instrucciones u s i n g que eliminan la necesidad de repetir el prefijo s t d : :. Una vez que incluimos es tas instrucciones u s i n g , podemos escribir c o u t en lugar de s t d : : c o u t , c i n en lugar de s t d : : c i n , y e n d l en lugar s t d : : s n d l . respectivamente, en el resto del programa. • La orientación a objetos es una manera natural de pensar acerca del mundo y de escribir programas de computadora. • Los objetos tiene atributos (como tamaño, forma, color, peso y aspecto), y exhiben comportamiento. • Los humanos aprendemos acerca de los objetos mediante el estudio de sus atributos y la observación de su comportamiento. • Objetos distintos pueden tener muchos atributos iguales y exhibir un comportamiento similar. • La programación orientada a objetos (POO) modela objetos del mundo real con contrapartes en software. To ma ventaja de las relaciones entre clases, en donde los objetos de cierta clase tiene las mismas características y comportamientos. Aprovecha las relaciones de herencia e incluso las relaciones de herencia múltiple, en donde las d ases redén creadas se derivan mediante la herenda de las características de clases existentes, aun que contiene características únicas propias, • La programadón orientada a objetos propordona una manera intuitiva de ver el proceso de programación, a saber, mediante el moddado de objetos reales, sus atributos y sus comportamientos. • La POO también modela la comunicadón entre los objetos mediante mensajes. • La POO encapsula los datos (atributos) y las funciones (comportamiento) dentro de los objetos. • Los objetos tienen la propiedad de ocultar informadón. Aunque los objetos pueden saber cómo comunicar se entre sí a través de interfeces bien definidas, los objetos por lo general no están autorizados para saber los detalles de la implementadón de otros objetos (para eliminar dependencias innecesarias). • El ocullamicnto de información es crucial para una buena ingeniería de software. • En C y en otros lenguajes de programadón por procedimientos, la programación tiende a ser orientada a acdones. En realidad, los datos son importantes en C. pero la visión es que los datos existen primordial mente para permitir las acciones que realizan las fundones. • Los programadores en C++ se concentran en la creación de sus propios tipos definidos denominados clases. Cada clase contiene datos, así como el conjunto de funciones que manipulan los datos. Los componentes de dálos de una clase se denominan dalos miembro. Los componentes de función de una clase se denominan funciones miembro o métodos.
TERMINOLOGIA / / comentarios / * . . . * / comentarios abstracción acción activos de software análisis análisis y diseño orientado a objetos (ADOO) asodadón asodatividad de derecha a izquierda asodatividad de izquierda a derecha asodatividad de operadores asodatividad del operador
atribulo atributos de un objeto biblioteca estándar de C++ Booch, Grady C C++ cadena carácter de escape ( \ ) carácter de nueva línea ( \n ) caracteres blancos claridad clase
http://alexyniorlls.blogspot.com 115 of 1380.
60
Introducción a las computadoras y a la programación en C++
comentario ( / / ) compilador componente comportamiento comportamiento de un objeto computación diente/servidor computadón distribuida computadora condición CPU cuerpo de una fundón dato miembro datos decisión declaradón dependiente de la máquina diseño diseño orientado a objetos (DOO) dispositivo de entrada dispositivo de salida división entera editor “elaboradón de clase importantes" encapsulado enlazar entrada/salida (E/S) error de compilación error de sintaxis error en tiempo de compiladón error en tiempo de ejecudón error fatal error lógico error no fetal estado estándar ANSI/ISO de C estándar ANSI/ISO de C++ estructura i f flujo de control fundón función miembro hardware herencia herenda múltiple identificador independiente de la máquina indicador instandar instrucdón
int integer (int) intérprete
iostream
Capítulo 1
iterfaz Jacobson. Ivar lenguaje de alto nivel lenguaje de programación lenguaje de programación por procedimientos lenguaje ensamblador lenguaje máquina Lenguaje Unificado de Modelado (UML) lista separada por comas
main memoria memoria prindpal mensaje método modelado muí ti procesador multitareas nombre de variable Object Management Group (OMG) objeto objeto c a r r objeto cin objeto cout objeto estándar de entrada (cin) objeto estándar de error ( c a r r ) objeto estándar de salida (cout) ocultamicnto de informadón operador operador binario operador de asignadón (■) operador de multiplicadón (*) operador módulo ( \ ) operadores aritméticos operadores de igualdad ■■ “es igual que" I - “no es igual que” operadores de reladón < “es menor que" <■ “es menor o igual que" > “es mayor que" > - “es mayor o igual que" operando palabras reservadas paréntesis O paréntesis anidados precedencia preprooesador programa de computadora programa traductor prograniadón estructurada programadón orientada a acdones programadón orientada a objetos (POO)
http://alexyniorlls.blogspot.com 116 of 1380.
Introducción a las computadoras y a la programación ©n C-m -
Capitulo 1
programación por procedimientos Ral ional Software Corporation reglas de precedencia de operadores requerimientos reutilización reutilización de software Rumbaugh, James secuencia de escape sensibilidad a mayúsculas y minúsculas servidor de archivos seudocódigo software
std::cerr std::cin std::cout std::sndl
61
sustantivos en una especificación de sistema tenninador de instrucción ( ; ) terminador de instrucción ( ; ) punto y coma ubicación de memoria UML Partners unidad aritmética y lógica (ALU) unidad central de procesamiento (CPU)
using using using using using
std::cerr; std::cin; std::cout; std::endl;
valor de la variable variable verbos en una especificación de sistema
EJERCICIOS DE AUTOEVALUACIÓN 1.1
Complete las siguientes oraciones: a)
La empresa que popularizó la computación personal f u e _______________ .
b) l a computadora que legitimó la computación personal en los negocios y en la industria f u e ______ . c)
Las computadoras procesan datos bajo el control de conjuntos de instrucciones llam adas______ de computadora.
d) Las seis unidades lógicas clave de una computadora s o n _______ , _______ , _______ . _________, ----------- y ------------e)
Los tres tipos de lenguajes que explicamos en el capítulo son __________, ___________ y
0
Los programas que traducen programas de alto nivel a lenguaje máquina se denominan_______ ,
g) C es ampliamente conocido como el lenguaje de desarrollo del sistema operativo__________. h) El lenguaje________ fue desarrollado por Wirth para enseñar programación estructurada en las universidades. i)
1.2
El Departamento de Defensa de los Estados Unidos desarrolló el lenguaje Ada con una capacidad llamada____________, la cual permite a los programadores especificar que se pueden procesar mu chas actividades en paralelo.
Complete las siguientes oraciones, las cuales tienen que ver con el ambiente C++. a) Por lo general, los programas en C++ se introducen en una computadora mediante el uso de un pro grama _________ . b) En un sistema en C++, un programa_______ se ejecuta antes de que comience la fase de traduc ción del compilador. c)
FJ programa_______ combina la salida del compilador con distintas funciones de la biblioteca para producir una imagen ejecutable.
d) El programa________ transfiere la imagen ejecutable de un programa en C++ desde un disco hacia la memoria.
http://alexyniorlls.blogspot.com 117 of 1380.
62
1.3
Introducción a las computadoras y a la programación en C++
Capítulo 1
Complete cada una de las siguientes oraciones. a) Todo programa en C++ inicia su ejecución en la función_____ .
1.4
b)
L a ______ comienza el cuerpo de toda función y ________ termina el cuerpo de toda función.
c)
Toda instrucción termina c o n ______ .
d)
I-a secuencia de escape \ n representa el carácter_____ , el cual ocasiona que el cursor se coloque al principio de la siguiente línea.
e)
La instrucción____ se utiliza para tomar decisiones.
Indique si las siguientes oraciones son falsas o verdaderas. Si es falsa, explique por qué. Asuma que se está utilizando la instrucción using std: :cout. a) Los comentarios provocan que la computadora imprima una línea de texto sobre la pantalla, des pués de / / . cuando se ejecuta el programa. b) La secuencia de escape \n. cuando se extrae mediante cout, ocasiona que el cursor se ubique al principio de la siguiente línea de la pantalla. c)
Todas las variables deben ser declaradas antes de utilizarse.
d) A todas las variables se les debe asignar un tipo, cuando se declaran. e)
Para C++ las variables numbar y NuHbEr son idénticas.
0
Las declaraciones pueden aparecer casi en cualquier parte dentro del cuerpo de una función en C++.
g) El operador módulo ( \ ) se puede utilizar sólo con operandos enteros. h) Los operadores aritméticos *, / , i) 1.5
+ y - tienen todos el mismo nivel de precedencia.
Un programa en C++ que despliega tres líneas de salida debe contener instrucciones de salida que emplean cout.
Escriba una sola instrucción en C++ para llevar a cabo lo siguiente (asuma que no se utilizan instruc ciones using): a)
Declare las variables c. estaEsUnaVariable. q76354 y numero para que sean enteros.
b)
Indique al usuario que introduzca un dígito. Termine su mensaje de indicación con dos puntos ( i) seguidos por un espacio y deje el cursor ubicado después del espacio.
c)
Lea un entero del usuario desde el teclado y almacene el resultado en la variable entera adad.
d) Si la variable numaro no es igual a 7. despliegue *E1 número de la variable no es
igual a 7".
1.6
e)
Despliegue en una línea el mensaje "Este es un programa en C++".
0
Despliegue, en dos líneas, el mensaje "Este es un programa en C++", donde la prime ra línea termina en C++.
g)
Despliegue el mensaje "Este es un programa en C++", con cada palabra del mensaje en líneas separadas.
h)
Despliegue el mensaje "Este es un programa en C++" con cada palabra del mensaje se parados por un tabulador.
Escriba una instrucción (o comentario) para llevar a cabo cada una de las siguiente acciones (asuma que se utilizan instrucciones using): a)
Defina que el programa calcule el producto de tres enteros.
b)
Declare las variables * . y. * y resultado de tipo entero.
c)
Indique al usuario que introduzca tres enteros.
d)
Lea tres enteros desde el teclado y almacénelos en las variables x . y y *.
e)
Calcule el producto de los tres enteros contenidos en las variables x. y y z. y asigne el resultado a la variable rasultado.
0
Despliegue "El producto as ".seguido del valor de la variable rasultado.
g)
Devuelva un valor desde main que indique que el programa terminó de manera exitosa.
http://alexyniorlls.blogspot.com 118 of 1380.
Introducción a las computadoras y a la programación ©n C-m -
Capitulo 1
63
1.7
Mediante el uso de las instrucciones que escribió en el ejercicio 1.6. escriba un programa completo que calcule y despliegue el producto de tres enteros. [Nota: usted tendrá que escribir las instrucciones using necesarias.]
1.8
Identifique y corrija los errores de cada una de las siguientes instrucciones (asuma que se utiliza la ins trucción uaing std: : cout): a) if ( c < 7 ),b)
1.9
cout << * c •» menor que 7\n"; if ( c - > 7 ) cout << *c es igual o mayor que 7 \rx " ;
Llene el espado vacío con el “término de objetos” correcto de cada una de las siguientes oraciones: a) Los humanos podemos ver hada la pantalla del televisor y ver puntos de colores, o podemos retro ceder y ver a tres personas sentadas en una mesa de conferencias; éste es un ejemplo de una capa cidad llamada_________ . b) Si vemos un automóvil como un objeto, el hecho de que sea convertible es un atributcVcomportamiento (elija u no)__________del automóvil. c) El hecho de que un automóvil pueda acelerar o desacelerar, dar vuelta a la izquierda o a la derecha, o ir hada adelante y hada atrás es un ejemplo d e _________ del automóvil. d) Cuando una nueva clase hereda las características de distintas clases diferentes, a esto se le deno mina herencia_________ . e) Los objetos se comunican entre s í enviándose__________ f) lx)s objetos se comunican entre s í mediante d uso d e ___________bien definidas. g) Por lo general, a un objeto no se le permite saber cómo están imple mentados otros objetos; a esta propiedad se le llam a__________. h) L a__________en una especificación de sistema ayuda al programador de C++ a determinar las clases que se requerirán para implementar el sistema. i) Los componentes de dalos de una clase se llam an_________, y a los componentes de función de una clase se les llam a______________ . j) A una ¡nstanda de un tipo definido por el usuario se le llam a__________.
RESPUESTAS A LOS EJERCICIOS DE AUTOEVALUACIÓN 1.1
a) Apple, b) La PC de IBM. c) Programas, d) Unidad de entrada, unidad de salida, unidad de memoria, unidad aritmética y lógica, unidad central de proceso, unidad de almacenamiento secundario, e) Lenguajes máquina, lenguajes ensambladores, lenguajes de alto nivel. 0 compiladores. g)UN IX . h) Pascal, i) multitareas.
1.2
a)
editor,
1.3 1.4
a)
m ain b) Llave izquierda ({). c) Llave derecha ()). d) Punto y coma, e) Nueva linca. 0 i* -
a)
Falso. Los comentarios no ocasionan acción alguna cuando se ejecuta el programa. Se utilizan pa ra documentar los programas y mejorar su claridad. Verdadero. Verdadero. Verdadero. Falso. C++ es sensible a mayúsculas y minúsculas, de manera que estas variables son únicas. Verdadero. Verdadero. Falso. Los operadores *, / y %tienen la misma precedencia, y los operadores ♦ y - tienen una pre cedencia más baja. Falso. Una instrucción individual que contenga cout con varias secuencias de escape \n puede desplegar diferentes líneas.
b) c) d) e) 0 g) h) i)
b) preprocesador,
c) enlazador.
d) cargador.
http://alexyniorlls.blogspot.com 119 of 1380.
64
Introducción a las computadoras y a la programación en C++
Capítulo 1
1.5
a) int o , aEsUnaVariablo, q76354, numero; b) std::cout << "Introduzca un entero: * j C) stdsscin >> edad; d) if ( numero I» 7 ) std::cout << "El número de la variable no ee igual a 7\n" j e) std::cout << "Este es un programa en C*+\n"f 0 stdsscout << "Este es un\n programa en C++\n*; g) std::cout << "Este\nes\nes\nun\nprograma\nen\nC>+\n”; h) std: :cout << "Este\tes\tun\tprograma\ten\tC+-f\n";
1.6
a) // Calcula el producto de tres enteros b) int x; int y; int z; int result; c) cout << "Introduzca tres enteros: " j d) cin >> x >> y >> z; e) resultado ■ x * y * z; 0 cout << "El producto es " « resultado << endl; g) retura 0;
1.7
// Calcula el producto de tres enteros •inelude using std::cout; using std::cin; using std::endl; int main() <
int x; int y; int z; int resultado; cout << "Introduzca tres enteros: "; cin >> x >> y >> z; resultado ■ x * y * z; cout << "El producto es " << resultado << endl; retura 0 ) // fin de la ftinción main 1.8
1.9
a)
Error: el punto y coma después del paréntesis derecho de la condición en la instrucción i £ . Correc ción: elimine el punto y coma después del paréntesis derecho. [Nota: el resultado de este error es que la instrucción de salida se ejecutará sea o no verdadera la condición de la instrucción if.] F.I punto y coma después del paréntesis derecho se considera una instrucción nula (o vacía), es decir, una instrucción que no realiza acción alguna. Aprenderemos más de la instrucción nula en el s i guiente capítulo. b) Error: El operador de relación - > . Corrección: Modifique - > por > -. a) abstracción, b) atributo, c) comportamiento, d) múltiple, e) mensajes. 0 interfaces, g) ocultamiento de información, h) sustantivos, i) datos miembro; funciones miembro o métodos, j) objetos.
http://alexyniorlls.blogspot.com 120 of 1380.
Introducción a las computadoras y a la programación ©n C-m -
Capitulo 1
65
EJERCICIOS 1.10
Gasifique cada uno de los siguientes elementos, indique si es hardware o software: a)
CPU.
b) compilador de C++. c) ALU. d) prcproccsador de C++. e)
unidad de entrada.
0
programa editor.
1.11
¿Por qué quema escribir un programa en un lenguaje independiente de la máquina, en lugar de escri bir uno en un lenguaje dependiente de la máquina? ¿Por qué es más apropiado un lenguaje indepen diente de la máquina para escribir cierto tipo de programas?
1.12
Complete cada una de las siguientes oraciones: a)
¿Qué unidad lógica de la computadora recibe información desde el exterior para ser utilizada por la computadora?____________ .
b) Al proceso para instruir a la computadora a resolver problemas específicos se le lla m a __________. c)
¿Qué tipo de lenguaje de computadora utiliza abreviaturas del inglés para las instrucciones en len guaje máquina?____________ . ó) ¿Qué tipo de unidad lógica de la computadora envía la información que ha sido procesada por la computadora hacia los distintos dispositivos, de manera que la información puede utilizarse fuera de la computadora?______________ e) ¿Qué unidad lógica de la computadora retiene la información?____________ . f)
¿Qué unidad lógica de la computadora realiza los cálculos?____________ .
g) ¿Qué unidad lógica de la computadora toma decisiones lógicas?_____________ . h) El nivel de un lenguaje de computadora más conveniente para que el programador escriba progra mas de manera más rápida y sencilla e s ? _________. i) j) 1.13
El único lenguaje que una computadora entiende de manera directa es e l _____________ . ¿Cuál unidad de la computadora coordina las actividades de todas las demás unidades lógicas?
Explique el significado de cada uno de los siguientes objetos: a) std::cin b)
a td :: cou t
c)
std ::c « r r
1.14
¿Por qué en la actualidad existe tanta atención centrada en la programación orientada a objetos en ge neral. y en C++ en particular?
1.15
Complete las siguientes oraciones: a)
___________se utilizan para documentar un programa y mejorar su claridad.
b) El objeto utilizado para desplegar información en la pantalla e s _________. c)
Una instrucción de C++ que toma una decisión e s ______ .
d) Por lo general, los cálculos se realizan mediante instrucciones d e ___________ . e) El ob jeto__________ introduce valores desde el teclado. 1.16
Escriba una instrucción en C++ o una línea que cumpla con cada una de las siguientes indicaciones: a) Despliegue el mensaje * Introduzca dos números*'. b) Asigne el producto de las variables b y c a la variable a. c)
Indique que un programa realiza un cálculo de ejemplo para nómina (es decir, utilice texto que ayu de a documentar el programa).
d) Introduzca tres valores enteros desde el teclado, y asígnelos a las variables enteras a. b y c.
http://alexyniorlls.blogspot.com 121 of 1380.
66
1.17
Introducción a las computadoras y a la programación en C++
Capítulo 1
Indique cuáles de las siguicnics afirmaciones son verdaderas y cuales son falsas. Si es falsa, explique su respuesta. a) Los operadores en C++ se evalúan de izquierda a derecha. b) Todos los siguientes son nombres de variables válidos: _sub_ffuion_, m928134, t5, j7,
sus ventas. su_cu«nta_total. a. b. c, x, z2. c) La instrucción cout << "a - 5; es un típioo ejemplo de una instrucción de asignación. d) Una expresión aritmética válida sin paréntesis se evalúa de izquierda a derecha e) Todos los siguientes son nombres de variables no válidos: 3g. 87. 67h2, h22. 2h. 1 .1 8
1 .1 9
Complete las siguientes oraciones: a) ¿Cuáles operadores aritméticos se encuentran en el mismo nivel de precedencia que la multiplica ción? __________, b) ¿Cuándo se anidan los paréntesis, cuál conjunto de paréntesis se evalúa primero en la expresión aritmética? c) A la parte de memoria de la computadora que puede contener diferentes valores en distintos mo mentos a lo largo de la ejecución de un programa se le denom ina__________. ¿Qué es lo que despliega, si despliega algo, cuando se ejecuta cada una de las siguientes instrucciones en C++? Si no se despliega nada, entonces responda "nada”. Suponga que x ■ 2 y y ■ 3. a) cout << x; b) cout << x ♦ x; c) cout << *x«"; d) cout << *x ■ * << x; e) cout << x «■ y << * - * << y ♦ xj
0
x - x ♦ y;
g) cin » x >> y; h) / / cout << "x
y « " << x
y;
i) cout << * \ n " ; 1.20
¿Cuáles de las siguientes instrucciones en C++ contienen variables cuyos valores son remplazados? a) cin >> b >> c >> d >> e >> f; b) p ■ i ♦ j ♦ k ♦ 7; c) cout << "variable» cuyos valores son remplazados"; d) cout << "a ■ 5";
1.21
Dada la siguiente ecuación algebraica y = axi + 7, ¿cuál de las siguientes instrucciones, si hay alguna, son correctas para esta ecuación?
a) y b) y c) y d) y e) y 0 y -
1.22
a a ( ( a a
* X • * X * a * X a • X * ( X * X •
* * * • X { X
X X ) ) *
X ( X X * *
♦ X * * X X
7; •f 7 ); ( X ♦ 7 )/ X ♦ 1; ) «■ i ; «■ 7);
Indique el orden de evaluación de los operadores en cada una de las siguientes instrucciones en C++, y muestre el valor de x una vez que se ejecuten las instrucciones. a) x « 7 ♦ 3 * 6 / 2 - 1 ;
b) x - 2 \ 2 + 2 * 2 - 2 / 2 /
c) x - ( 3 * 9 * < 3 * ( 9 * 3 / ( 3 ) ) ) ) f
1.23
Escriba un programa que pida al usuario que introduzca dos números, obtenga dichos números del usuario y despliegue la suma, el producto, la diferencia y el cociente de los dos números.
1.24
Escriba un programa que despliegue los números del 1 al 4 en la misma línea, con cada par de núme ros adyacentes separados por un espacio. Escriba el programa utilizando los siguientes métodos:
http://alexyniorlls.blogspot.com 122 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
67
a) Con una sola instrucción de salida y un solo operador de inserción de flujo. b) Con una sola instrucción de salida y cuatro operadores de inserción de flujo. c) Con cuatro instrucciones de salida.
1.25
Escríba un programa que pida al usuario que introduzca dos enteros, obtenga dichos números del usua rio. y despliegue el número más grande seguido de las palabras más grande". Si los números son iguales, despliegue el mensaje "Estos números son iguales".
1.26
Escríba un programa que introduzca tres números desde el teclado y despliegue la suma, el promedio, el producto, el mayor y el menor de estos números. El diálogo de pantalla debe aparecer de la siguien te forma;
1.27
Escríba un programa que introduzca el radio de un círculo y despliegue el diámetro, la circunferencia y el área. Utilice el valor constante 3.14159 para n. Haga estos cálculos dentro de instrucciones de sa lida. [Nota: en este capítulo, explicamos solamente las variables y las constantes enteras. En el capítu lo 3 explicamos los números de punto flotante, es decir, valores que tienen punto decimal.)
1.28
Escriba un programa que despliegue un rectángulo, un óvalo, una flecha y un rombo de la siguiente ma nera:
1.29
¿Qué es lo que despliega la siguiente línea de código?
cout <<
\n**#\n****\n*****\n";
1.30
Escriba un programa que introduzca cinco enteros y determine y despliegue el mayor y el menor de los enteros del grupo. Utilice sólo las técnicas de programación aprendidas en el capítulo 1.
1.31
Escriba un programa que lea un entero y determine y despliegue si es par o non. (Pista: utilice el ope rador módulo. Un número par es múltiplo de 2. Cualquier múltiplo de 2 deja un residuo igual a cero cuando se divide entre 2.)
1.32
Escriba un programa que lea dos enteros y determine y despliegue si el primero es múltiplo del segun do. (Pista: utilice el operador módulo.)
1.33
Despliegue el siguiente patrón de diseño mediante ocho instrucciones de salida, después despliegue el mismo patrón utilizando el menor número posible de instrucciones.
http://alexyniorlls.blogspot.com 123 of 1380.
68
Introducción a las computadoras y a la programación en C++
Capítulo 1
1.34
Distinga entre los términos error fatal y error no fatal. ¿Por qué podría usted preferir un error fatal a un enror no fatal?
1.35
He aquí un avance. En este capítulo usted aprendió acerca de enteros y el tipo in t . Además, C++ pue de representar letras mayúsculas, letras minúsculas y una considerable variedad de símbolos especia les. C++ utiliza pequeños enteros de manera interna para representar cada carácter diferente. Al con junto de caracteres que utiliza una computadora y a sus correspondientes representaciones en enteros se le llama conjunto de caracteres. Usted puede desplegar un carácter encerrándolo en comillas sim ples como:
cout << ’A'j Usted puede desplegar el equivalente entero de un carácter mediante static_cast de la siguiente manera:
cout << atatic_caat< int >( 'A# ); a esto se le llama operación de conversión de tipo (formalmente veremos la conversión de tipo en el ca pítulo 2). Cuando se ejecuta la instrucción anterior, se despliega el valor 65 (en sistemas que utilizan el conjunto de caracteres ASCII). Escriba un programa que despliegue los equivalentes enteros de algu nas letras mayúsculas, letras minúsculas, dígitos y símbolos especiales. Como mínimo, determine los equivalentes enteros de los siguientes: A B C a b c O 1 2 $ * ♦ / y el carácter espacio.
1.36
4
1.37
Escriba un programa que introduzca un número de cinco dígitos, separe el número en sus dígitos indi viduales y despliegúelos dígitos entre sí mediante tres espacios cada uno. (Pistas: utilice la división en tera y el operador módulo.) Por ejemplo, si el usuario digita 42339 el programa deberá desplegar:
2
3
3
9
Utilice solamente las técnicas que aprendió en este capítulo para escribir un programa que calcule los cuadrados y los cubos de los números del 0 al 10. y utilice fabuladores para desplegar la siguiente ta bla de valores:
numero 0 1 2 3 4 5 6 7 8 9 10
cuadrado 0 1 4 9 16 25 36 49 64 81 100
cubo 0 1 8 27 64 125 216 343 512 729 1000
http://alexyniorlls.blogspot.com 124 of 1380.
Capitulo 1
Introducción a las computadoras y a la programación ©n C-m -
69
1.38
Responda de manera breve cada una de las siguientes preguntas “pensando en objetos": a) ¿Por qué este libro prefiere explicar primero y con detalle la programación estructurada, antes de explicar a fondo la programación orientada a objetos? b) ¿Cuáles son los típicos pasos (mencionados en el libro) de un proceso de diseño orientado a obje tos? c) ¿Cómo se puede mostrar la herencia múltiple en los seres humanos? d) ¿Qué tipos de mensajes se envía la gente entre sí? e) Los objetos se envían mensajes entre sí a través de interfaces bien definidas. ¿Qué tipos de interfa ces presenta el radio de un automóvil (objeto) a su usuario (objeto persona)?
1.39
Probablemente usted porta en su muñeca uno de los objetos más comunes en el mundo, un reloj. Ex plique cómo cada uno de de los siguientes términos y conceptos se pueden aplicar a la noción de un reloj: objeto, atributo, comportamiento, clase, herencia (por ejemplo, considere un reloj de alarma), abstracción, modelado, mensajes, cncapsulado. interfaz, información, ocultamiento, dalos miembro y funciones miembro.
http://alexyniorlls.blogspot.com 125 of 1380.
2 Estructuras de control
Objetivos • Com prender las técnicas b ásicas para la solu ció n de problem as. • D esarrollar algoritm os a través de un proceso de m ejoram iento d e arriba a abajo, paso a paso. • U tilizar las estructuras d e se lecció n i f , i f / e l s e y s w i t c h para elegir entre distintas accion es alternativas. • U tilizar las estructuras de repetición w h i l e , d o / w h i l e y f o r para ejecutar instrucciones d e m anera repetitiva dentro d e un programa. • Com prender la repetición controlada por un contador y la repetición controlada por un centinela. • U tilizar lo s operadores de increm ento, d e decrcm ento, d e asign ación y ló g ic o s. • U tilizar las instrucciones d e control d e programa bre& k y c o n t in u é .
M ovám onos todos un lugar hacia delante. L ew is C airoll
La rueda ha com pletado el círculo. W illiam Shakespeare
¿Q uién p u ed e controlar su destino? W illiam Shakespeare
La llave usada siem pre es brillante. Benjam ín Franklin
http://alexyniorlls.blogspot.com 126 of 1380.
Estructuras do control
Capitulo 2
71
Plan general 2.1 2.2
Introducción Algoritmos
2.3
Seudocócfigo
2.4 2.5 2.6
Estructuras d© control Estructura de selección i f Estructura de selección i f / e ls e
2.7 2.8
Estructura de repetición w h i l e Cóm o formular algoritmos: ejemplo práctico 1 (repetición controlada por un contador) Cóm o formular algoritmos mediante el mejoramiento de arriba a abajo, paso a paso: ejemplo práctico 2 (repetición controlada por un centinela)
2.9 2.10 2.11 2.12
Cóm o formular algoritmos mediante el mejoramiento de arriba a abajo, paso a paso: ejemplo práctico 3 (estructuras de control anidadas) Operadores de asignación Operadores de Incremento y decremento
2.13 2.14
Fundamentos de la repetición controlada por un contador Estructura de repetición f o r
2.15 2.16
Ejemplos de la utilización de la estructura f o r Estructura de selección múltiple s w i t c h
2.17 2.18
Estructura de repetición d o / w h il e Instrucciones c o n t i n u é y b r e a k
2.19 2.20
Operadores lógicos La confusión entre ios operadores de igualdad (■ ■ ) y de asignación (■)
2.21 2.22
Resumen sobre programación estructurada (Ejemplo práctico opcional) Acerca de los objetos: cóm o identificar las ciases de un sistema a partir de un problema establecido
Resumen • Terminología • Ejercicios de autoevaluación • Respuestas a los ejercicios de autoevaluación • Ejercicios
2.1 Introducción A ntes d e escribir un programa para resolver un problem a en particular, es im portante com prenderlo y contar c o n un m étodo planeado cuidadosam ente para resolver d ich o problema. C uando escriba un programa, tam bién es importante que com prenda las distintas m aneras que tien e d ispon ib les para construir bloques y em plear principios de construcción d e program as com probados. E ste capítulo exp lica todos estos tem as cuando presentam os la teoría y lo s principios de la program ación estruc turada. Las técnicas que usted aprenderá se pueden aplicar a la m ayoría de lo s lenguajes, in clu so a C ++. C uando com en cem os nuestra exp lica ció n sobre la program ación orientada a ob jetos en C ++, en el capítulo 6 , verem os q u e las estructuras d e control que estu diam os en e l capítulo 2 son útiles para construir y manipular objetos.
http://alexyniorlls.blogspot.com 127 of 1380.
72
Estructuras de control
Capítulo 2
2.2 Algoritmos C ualquier problem a d e cóm p uto se puede resolver al ejecutar una serie de a ccio n es en un orden e s p ecífico. A l procedim iento para resolver un problem a en térm inos de: 1. Las acciones que ejecuta. 2. E l orden en e l que se ejecutan estas accion es. s e le llam a algoritm o. El sigu iente ejem p lo dem uestra que es im portante especificar, en orden correc to, la ejecu ción de la s accion es. C onsidere el algoritm o “levantarse y arreglarse” q u e sig u e un ejecu tivo para levantarse de la cam a e ir al trabajo: (1 ) levantarse, (2 ) quitarse la pijam a, (3 ) tomar un baño. (4 ) vestirse, (5 ) desa yunar, (6 ) tom ar el transporte hacia el trabajo. Esta rutina logra que el ejecu tivo vaya al trabajo bien preparado para tomar d ecisio n es críti cas. Suponga que los m ism os pasos s e ejecutan ahora en un orden ligeram ente diferente: (1 ) levan tarse. (2 ) quitarse la pijam a, (3) vestirse, (4 ) tomar un baño, (5 ) desayunar, (6 ) tomar el transporte al trabajo. En este ca so , nuestro joven ejecu tivo llegará m ojado al trabajo. A la esp ecifica ció n del orden en e l cual las instrucciones (a ccio n es) se ejecutan en un programa d e com putadora, se le llam a control d e program a. Este cap ítulo investiga las capacidades de control de programas de C ++.
2.3 Seudocódigo E l seudocódigo e s un lenguaje artificial c inform al que ayuda a lo s program adores a desarrollar algoritm os. El seu d o có d ig o que presentam os en este libro es particularm ente útil para desarrollar al goritm os que se convertirán en p orciones estructuradas de programas en C++. El seu d o có d ig o es sim ilar al lenguaje cotidiano; es conveniente y a ccesib le para el usuario, aunque en realidad no e s un lenguaje d e program ación. El seu d ocód igo n o s e puede ejecutar en las com putadoras, sin em bargo, ayuda al programador a “elaborar" un programa antes d e intentar escribirlo en un lenguaje de program ación, co m o C ++. E ste capítulo proporciona m uchos ejem p los de có m o utilizar d e m anera efectiv a el seu d o có d ig o para desarrollar programas en C ++. El estilo d e seu d o có d ig o que presentam os co n siste solam ente e n caracteres, de manera que los program adores pueden capturar el seu d ocód igo de manera efectiva, m ediante cualquier programa de ed ición . La com putadora puede producir sobre pedido una co p ia recién im presa d el programa en seu d ocód igo. U n programa en seud ocód igo, preparado con cuidado, puede convertirse con facilidad en su programa correspondiente en C ++. En m uchos ca so s, esto requiere sim plem ente reem plazar las instrucciones en seu d ocód igo co n su s equivalentes e n C ++. Por lo general, el seu d o có d ig o describe únicam ente las instrucciones ejecutables, es decir, las a ccion es que ocurren después de q u e e l programador convierte un programa en seu d ocód igo a C ++ y el programa s e ejecuta en la com putadora. Las declaraciones no son instrucciones ejecutables. Por ejem p lo, la declaración
int i; le indica al com pilador el tipo de la variable i e instruye al com pilador para que reserve esp a cio en m em oria para la variable. Esta declaración no realiza acción alguna, tal co m o una entrada, salida o cálcu lo, a ser ejecutada cuando se ejecuta el programa. A lg u n o s program adores elig en listar las va riables y m encionar su propósito al principio de la representación d el seu d o có d ig o d e un programa.
http://alexyniorlls.blogspot.com 128 of 1380.
Estructuras do control
Capitulo 2
73
2.4 Estructuras de control Por lo general, las instrucciones dentro de un programa se ejecutan una tras otra, en el orden en el cual se escribieron. A esto se le llam a ejecución secuencial. Varias de las instrucciones en C ++, las cu a les explicarem os m uy pronto, permitirán al programador esp ecificar que la sigu ien te instrucción a ejecutarse debe ser otra, en lugar de la sigu ien te en la secuencia. A esto se le denom ina transferen
cia de control. Durante la década d e los sesenta, se hizo evid en te q u e el uso indiscrim inado de las transfe rencias de control era el origen d e m uchas de la s dificultades q u e experim entaban lo s grupos de d e sarrollo de softw are. A quien se señ aló com o culpable fu e a la instrucción g o t o , la cual perm ite al programador especificar la transferencia de control a uno de lo s m uchos p osibles d estin os dentro de un programa. La noción de la llam ada program ación estructurada se h izo ca si un sin ónim o de la
“elim inación d e l goto”. Las in vestigacion es de B ohm y Jacop in i1 dem ostraron que los programas s e podían escribir sin instrucciones goto. El reto d e la época para lo s program adores fue el cam b io d e sus estilo s a una “program ación con m en os goto”. Fue hasta la década de lo s setenta que lo s program adores tom a ron en serio a la program ación estructurada. L os resultados fueron im presionantes cuando lo s gru pos d e desarrollo reportaron reducciones en tiem po de desarrollo, m ayor incidencia de entregas en tiem po de sistem as y m ayores resultados en la term inación d e proyectos com p letos. La clave para estos é x ito s e s que los programas estructurados son m ás claros, m ás fá ciles d e depurar, probar y m o dificar, y, lo mejor, e s m ás probable que estén libres de errores. El trabajo de Bohm y Jacopini dem ostró q u e todos los programas podían escribirse solam ente en térm inos d e estructuras d e control, e s decir, de la estructura de secuencia, de la estructura de s e lección y de la estructura de repetición. La estructura de secu en cia está incluida en C ++. A m enos q u e se le indique lo contrario, la com putadora ejecutará las instrucciones e n C + + una tras otra, en el orden en el que s e escribieron. El diagram a de actividad d e U M L de la figura 2.1 ilustra una estruc tura de secu en cia típica en la que se realizan d os cálcu los en orden. C + + perm ite tener tantas a cc io nes co m o d eseem o s en una estructura d e secu en cia. C o m o verem os pronto, en donde quiera que se co lo q u e una acción individual, p odem os colocar varias a ccion es en secu en cia. L os diagram as d e actividad son parte del Lenguaje U nificado de M odelado (U M L ), un estándar de la industria para m odelar sistem as de softw are. Un diagram a de actividad m odela el flu jo de tra-
fistíu ccló n C++ correspondiente:'
total - total ♦ grado;
hstrucclón C++ correspondiente:^
contador - contador
fig u r a 2.1
1;
Diagrama de actividad d e una estructura d e secuencia.
1. Bohm. C. y G. Jacopini. "Flow Diagnuns. Turing Machines, and Languages with Only Two Formation Rules”, Communications o f the ACM. Vol.9,No. 5, Mayo de 1966, páginas 336-371.
http://alexyniorlls.blogspot.com 129 of 1380.
74
Estructuras do control
Capítulo 2
bajo (tam bién llamado la actividad) de una porción de un sistem a de software. D ichos flujos de traba j o pueden incluir una porción de un algoritm o, tal co m o la estructura d e secu en cia de la figura 2.1. L os diagram as de actividad están com p u estos por sím b o lo s de propósito esp ecia l, tales co m o los sím b olos de estado de acción (un rectángulo con sus lados izquierdo y derecho rem plazados con arcos hacia fuera), diam antes y pequeño círcu lo s; esto s sím b o lo s están conectados m ediante flech a s de transición, la s cu ales representan el flujo d e la actividad. C om o el seud ocód igo. lo s diagram as d e actividad ayudan a lo s program adores a desarrollar y a representar algoritm os, aunque m uchos program adores prefieren el seu d ocód igo. L os diagram as de actividad claram ente muestran có m o operan las estructuras d e control. C onsidere el diagram a d e actividad para la estructura d e secu en cia d e la figura 2.1. El diagrama d e actividad con tien e d o s estados de acción que representan a ccio n es a realizar. C ada estado d e ac ción contiene una expresión d e acción, por ejem p lo, “sum a grado a total" o “sum a 1 a contador", que esp ecifica una acción particular a realizar. Otras a ccio n es podrían incluir cá lcu lo s u operaciones de entrada/salida. Las flechas en el diagram a de actividad s e llam an flechas d e transición. Estas flechas representan transiciones, las cu ales indican el orden en el ocurren las a ccio n es representadas por los estad os de las accion es; el programa que im plem enta las actividades que m uestra el diagram a d e ac tividad de la figura 2 .1 , prim ero sum a grado a total y d esp u és sum a 1 a contador. El círculo sólido ubicado en la parte superior del diagram a de actividad representa el estado ini cia l d e la actividad, es decir, el in icio d el flujo de trabajo antes de que el programa realice la s a cti vidades m odeladas. El círculo só lid o rodeado por una circunferencia que aparece en la parte inferior d el diagram a de actividad representa el estado fin a l, e s decir, el final del flujo d e trabajo d esp u és de que e l programa realiza sus actividades. O bserve en la figura 2.1 los rectángulos co n las esquinas superiores derechas dobladas. En U M L , a éstos s e le s llam an notas. Las notas son com entarios co n ex p lica cio n es q u e describen el pro p ósito de lo s sím b o lo s del diagrama. L as notas se pueden utilizar en cualquier diagram a d e UML, n o s ó lo e n lo s diagram as de actividad. La figura 2.1 utiliza notas U M L para mostrar el c ó d ig o C ++ a sociad o con cada estado de acción e n el diagram a de actividad. U na línea punteada con ecta cada nota con el elem en to q u e describe dicha nota. A q u í, utilizam os las notas co n este propósito, e s d e cir, para ilustrar có m o s e relaciona e l diagram a co n el có d ig o C ++. C + + proporciona tres tipos de estructuras de selecció n . 1.a estructura de se lecció n i f realiza (seleccio n a ) una acción s i la con d ición (predicado) e s verdadera, o ev ita la acción si la con d ición es falsa. La estructura de se lecció n if/else realiza una a cció n si la con d ición es verdadera, o reali za una acción diferente si la con d ición e s falsa. La estructura de se lecció n switch realiza una o m uchas a ccio n es d iferentes, dependiendo del valor d e una expresión entera. La estructura de se lecció n i f es una estructura d e selección simple-, ésta seleccion a o ignora una sola acción. La estructura de selección if /else es una estructura de selección doble; ésta se lec cio na entre d o s diferentes acciones. La estructura de selección switch e s una estructura de selección m últip le; ésta se lec cio n a la acción a realizar, a partir de m uchos estados de acción diferentes. C + + proporciona tres tipos d e estructuras d e repetición (tam bién llam adas estructuras de ciclo, o ciclos); éstas son while. do/while y for. Cada una d e las palabras if. else, switch. while. do y for son palabras re s e ñ a d a s de C ++. Estas palabras están reservadas por e l lenguaje de program ación C + + para im plcm entar diversas características, tales co m o las estructuras d e co n trol de C ++. Las palabras reservadas no pueden utilizarse co m o identificadores, es decir, co m o nom bres d e variables. La figura 2.2 con tien e una lista com pleta d e palabras reservadas d e C ++.
____Error común de programación 2.1 Utilizar una palabra reseñada como identificador. es un error de sintaxis.
http://alexyniorlls.blogspot.com 130 of 1380.
Estructuras do control
Capitulo 2
75
Palabras reservadas de C++ Palabras reservadas comunes a los lenguajes de programación C y C++
auto continua enum
braak default extern
if short switch
int signad typadaf while
▼olatile
case do
char
float long sizeof unión
double for register static unsigned
catch
class
explicit namespace public this typename
falsa new reinterpret cast throw using
const else goto return struct void
Palabras reservadas sólo para C ++
asm dalata inlina prívate static cast try
bool dynanic cast mutable protected templete typeid
const cast friend operator trué virtual
wchar_t Figura 2 .2
R elabras re serv a d a s d e C++.
Error común de programación 2.2 Escribir una palabra reseñada con una letra mayúscula es un error de sintaxis. Todas las palabras resenadas de C++ contienen solamente letras minúsculas. C + + tiene s ó lo sie te estructuras de control: una de secu en cia, tres tipos de selección (if, if/else y switch) y tres tipos d e repetición (while. for y do/while). Cada programa en C + + com b ina tantas de estas estructuras de control co m o sea apropiado para el algoritm o que im plem enta el programa. A s í co m o en la estructura d e secu en cia de la figura 2.1 , p odem os m odelar cada estructura d e control c o m o un diagram a de actividad. C ada diagram a co n tien e un estad o inicial y un estado final, lo s cu ales representan e l punto d e entrada y el punto de salida de la estructura de control, respectivam ente. Estas estructuras de control de entrada sencilla/salida sencilla hacen fácil la construcción de programas; las estructuras de control se conectan entre s í, al conectar el punto de salida de una estructura de control al punto de entrada de la siguiente. E sto es sim ilar a la manera en q u e un niño apila b loq u es de construcción, a sí que a esto le llam am os apilam iento de estructuras de control. En breve aprenderem os q u e existe solam ente una m anera alterna d e conectar las estructuras de control, llam ada atildam iento d e estructuras d e control.
Observación de ingeniería de software 2.1 Cualquier programa de C ++ que escribamos puede construirse a partir de sólo siete tipos de estruc turas de control (secuencia i f . i f / s l m m . s w i t c h . ir h i l s . d o / w h i l s y fo r ) . combinadas sola mente de dos maneras (apilando estructuras de control y anidando estructuras de control).
http://alexyniorlls.blogspot.com 131 of 1380.
76
Estructuras de control
Capítulo 2
2.5 Estructura de selección i f L o s programas utilizan estructuras d e se lec ció n para eleg ir entre cursos de a cció n alternativos. Por ejem p lo, suponga que la calificación m ínim a aprobatoria es 60. La instrucción de seu d o có d ig o
i f calificación d e l estudiante es m a yo r o igual a 60 Im prim e "A p ro b a d o ” determ ina si ( i f ) la condición “calificación del estudiante es m ayor o igual que 6 0 ” es v e r d a d e r a o f a l s a . S i la con d ición e s v e r d a d e r a , en ton ces s e im prim e “A probado” y s e "ejecuta” la si guiente instrucción del seud ocód igo (recuerde que el seud ocód igo no es un lenguaje de programación real). Si la con d ición e s f a l s a , la instrucción print se ignora y se ejecuta en orden la sigu ien te ins trucción. O bserve q u e la segunda línea d e esta estructura d e selecció n tien e sangría. Tal sangría es op cion al, pero se recom ienda am pliam ente debido a q u e enfatiza la estructura inherente de lo s pro gram as estructurados. Cuando usted convierte su seu d o có d ig o en có d ig o C + + , el com pilador ignora lo s espacios (co m o esp acios en blanco, tabuladores y saltos d e línea) utilizados para el sangrado y para el esp aciad o vertical.
Buena práctica de programación 2.1 El aplicar consistentemente comenciones razonables de sangrado a través de sus programas aumenta de manera importante la claridad de éstos, l e sugerimos un fabulador fijo de un tamaño aproximado de 1/4 de pulgada, o tres espacios en blanco, por sangría. La instrucción anterior i f del seu d ocód igo puede escribirse en C + + com o
lf ( calificación >- 60 ) cout << "Aprobado"; O bserve que e l cód ig o C + + corresponde en gran m edida al seu d ocód igo. Ésta e s una d e las propie dades que hace d el seu d ocód igo una herram ienta de program ación tan útil. La figura 2.3 m uestra la estructura d e se lec ció n sim p le i f . Este diagram a d e actividad con tie ne lo que quizá sea el sím b olo m ás im portante en un diagram a de ésto s, el rom bo o sím bolo de deci
sión, el cual indica q u e se tomará una decisión. Un sím b olo de d ecisión indica q u e el flujo del programa continuará a lo largo d e una ruta determ inada por lo s sím bolos de guardia que pueden ser verdaderos o falsos. Cada flecha de transición que s e desprende del sím b olo d e d ecisió n tiene una con d ición de guardia (esp ecificad a entre corchetes sobre o jun to a la flecha d e transición). S i una co n d ición de guardia en particular e s verdadera, el flujo d el programa entra al estado de acción a la que apunta dicha flecha de transición. En la figura 2.3 , si la calificación es m ayor o igual que 6 0 , el pro gram a im prim e en la pantalla “Aprobado” , y se dirige al estado final de esta actividad. Si la ca lifica ción e s m enor que 60, el programa transfiere el flujo al estado final sin desplegar el m ensaje. En el capítulo 1 aprendim os q u e la s d ecisio n es pueden basarse en co n d icio n es que contienen operadores de relación o d e igualdad. D e hecho, en C + + , una d ecisió n puede basarse en cualquier exp resión , s i la expresión es igual q u e cero, se trata co m o falsa; s i la expresión es diferente de cero, se trata co m o verdadera. El C + + estándar proporciona el tipo de d ato b o o l para variables que pueden contener só lo los valores t r u e y f a l s o . L os valores f c r u e y f a l s o son palabras reser vadas d e C ++.
Tip de potabilidad 2.1 Por compatibilidad con versiones anteriores del C++ estándar, el valor bool, truo. también se pue de representar con cualquier valor diferente de cero, y el valor bool falso también se puede repre sentar como el valor cero.
http://alexyniorlls.blogspot.com 132 of 1380.
Estructuras do control
Capitulo 2
77
ijcallflcoclón > » 60]
a
Imprimo “Aprobado
5
[calificación < 60]
4 Rgura 2.3
Diagrama d e actividad d e la estructura d e selección simple if.
O bserve que la estructura i f es d el tipo entrada sencilla/salid a sen cilla. V erem os que lo s d ia gram as d e actividad para las estructuras d e control restantes contienen adem ás estados in iciales, fle ch as d e transición, estad os d e acción q u e indican la s a ccio n es a realizarse, sím b o lo s de d ecisió n (con sus con d icion es de guardia asociadas) q u e indican las d ecisio n es a tom ar y lo s estad os finales. Esto es consistente con e l m odelo de program ación acción/decisión que hem os enfatizado. P odem os im aginar sie te cajon es, cada uno co n solam ente estructuras de control de uno de lo s sie te tipos diferentes. Estas estructuras de control están vacías. E ntonces, la tarca del programador es ensam blar un programa con tantas estructuras de control d e cada tipo co m o lo requiera el algorit m o, com binando dichas estructuras de control en s ó lo dos form as p osibles (apilado o anidado), y He nar los estados de acción y las d ecisio n es m ediante exp resion es de acción y con d icio n es de guardia de m anera apropiada para el algoritm o. E xplicarem os la variedad de form as en las cu ales se pueden escribir las a ccion es y la s d ecision es.
2.6 Estructura de selección i f / e l s e La estructura d e se lecció n if realiza una acción indicada solam en te cuando la co n d ición es ver dadera; de lo contrario, se evita dicha acción. La estructura de se lecció n perm ite al programador especificar una acción a realizar cuando la con d ición es verdadera, y una a cció n d iferente a realizar cuando la acción e s falsa. Por ejem p lo, la instrucción en seu d o có d ig o
i f calificación del estudiante es m ayor o igual que 6 0 Im prim e "A p ro b a d o ” else Im prim e " Reprobado " im prim e A probado si la calificación del estudiante es m ayor o igual que 6 0 , pero im prim e Reproba do si la calificación d el estudiante es m enor que 60. En am b os ca so s, desp ués de d esplegar e l resul tado, se “realiza” la sigu ien te instrucción en la secu en cia. L a estructura anterior if/else en seu d o có d ig o se puede escribir en C + + co m o
if ( calificación >- 60 ) cout << "Aprobado*; else cout << "Reprobado"; O bserve que el cuerpo d e alee tam bién s e encuentra sangrado. C ualquiera que sea la con ven ción que usted elija, ésta debe aplicarse d e manera con sistente a lo largo d e su s programas. Es d ifícil leer programas que no ob ed ecen con ven cion es uniform es d e espaciado.
http://alexyniorlls.blogspot.com 133 of 1380.
78
Estructuras do control
Capítulo 2
Buena práctica de programación 2.2 Sangre ambos cuerpos de instrucciones en una estructura i f / m l m •.
Buena práctica de programación 2.3 Si existen distintos niveles de sangrado, aula nivel debe sangrarse con la misma cantidad de espacios.
La figura 2.4 muestra el flujo de control de la estructura if/els®. Una v ez m ás, observe que (adem ás d el estado inicial, las flechas de transición y el estado final) los dem ás sím b o lo s dentro del diagram a d e actividad representan estados d e acció n y d ecisio n es. Im agine nuevam ente un recipien te profundo con tantas estructuras de se lecció n d o b le co m o n ecesite para construir cualquier pro gram a en C ++. El trabajo d el programador e s ensam blar estas estructuras de se lecció n (apilando o anidando) con cualquier otra estructura de control q u e requiera el algoritm o. E l programador llena lo s estados de acción y los sím b o lo s de d ecisión con exp resion es de acción y con d icion es de guar dia apropiadas para el algoritm o. C + + proporciona el operador condicional ( ? : ) , que está m uy relacionado co n la estructura
if /else. El operador condicional e s el único operador te m a rio d e C + + , es decir, que utiliza tres operandos. L os operandos, jun to con el operador co n d icion al, forman una expresión condicional. El primer operando es una con d ición , e l segundo operando e s el valor para toda la expresión co n d icio nal, si la con d ición es verdadera, y el tercer operando e s el valor para toda la expresión con d i cion al, si la con d ición es falsa. Por ejem p lo, la instrucción d e salida
cout << ( calificación >■ 60 ? "Aprobado" * "Reprobado" ); con tien e una exp resión con d icion al, calificación > - 60 ? "Aprobado" : "Repro bado". la cual arroja co m o resultado "Aprobado" si la con d ición calificación >■ 60 es verdadera, pero arroja co m o resultado la cadena "Reprobado" si la co n d ición e s falsa. En ton ces. la instrucción co n la expresión con d icion al realiza, en esen cia , lo m ism o que la estructura i f/else anterior. C om o verem os, la p recedencia de un operador con d icion al e s baja, d e manera que s e requieren paréntesis para la expresión anterior.
Buena práctica de programación 2.4 Para mayor claridad, coloque las expresiones condicionales entre paréntesis.
icalificación < 60] (calificación >= 60]
$
5
Imprime ‘ Reprobado* W
=*{ imprime ‘ Aprobado
9
<§>
Figura 2.4
Diagrama de actividad d e la estructura d e selección d o ble if /else.
http://alexyniorlls.blogspot.com 134 of 1380.
Estructuras do control
Capitulo 2
79
L os valores en una expresión con d icion al tam bién pueden ser a ccio n es a ejecutar. Por ejem p lo, la sigu ien te expresión con d icion al im prim e adem ás "Aprobado" o "Reprobado":
calificación >■ 60 ? cout << "Aprobado" i cout << "Reprobado"; La expresión con d icion al anterior se lee, “si calificación e s m ayor o igual que 60. en tonces
cout << "Aprobado" ; d e lo contrario, cout << "Reprobado". Esto tam bién e s com para b le co n la estructura if/else anterior. M ás adelante verem os que las exp resion es con d icion ales pueden aparecer en ciertos lugares en donde la s instrucciones if/else no pueden. Las estructuras i f / e l s e anidadas exam inan m últiples ca so s, al co lo ca r estructuras d e s e le c ción if/else dentro de estructuras de se lecció n if/else. Por ejem p lo, la estructura if/else del sigu ien te scu d o có d ig o d esp liega A para la s ca lifica cio n es m ayores o ig u a les que 9 0 , B para las c a li ficacion es en el rango de 80 a 89, C para ca lifica cio n es en el rango d e 7 0 a 7 9 . D para ca lifica cio n es en el rango de 6 0 a 6 9 y F para todas las dem ás calificaciones.
i f calificación del estudiante es m ayor o igual que 90 Im prim e “A ” else i f calificación d e l estudiante es m a yo r o igual que 80 Im prim e "B ” else i f calificación del estudiante es m a yo r o igual que 70 Im prim e “ C" else i f calificación d e l estudiante es m a yo r o igual que 60 Im prim e “D ” else Im prim e “F ” Este seu d ocód igo se puede escribir en C + + co m o
if ( calificación >- 90) cout << "A"; else if ( calificación >« 80) cout << "B"; alaa if ( calificación >■ 70) cout << "C"; alaa if ( calificación >- 60) cout << *D"; alaa cout << "F";
// 90 y superior
// 80-89
// 70-79
// 60-69 // menor que 60
Si calificaciones m ayor o igual que 9 0 . las primeras cuatro con d icio n es serán verdaderas, pero solam en te s e ejecutará la instrucción cout que se encuentra después de la primera con d ición . D esp u és d e que se ejecuta cout, el programa s e salta la parte else d e las estructuras if/else que se encuentran “afuera”. M uchos program adores de C + + prefieren escribir la estructura if/else an terior com o
http://alexyniorlls.blogspot.com 135 of 1380.
80
Estructuras de control
Capítulo 2
if ( calificación >■ 90) cout « "A*; else if ( calificación >■ 80) cout << "B"; else if ( calificación >■ 70) cout << "C»; else if ( calificación >■ 60) cout « "D*/ else cout << "F-;
// 90 y superior // 80-89 // 70-79 // 60-69 // menor que 60
L as dos form as son idénticas excep to por el espaciado y las sangrías, las cu ales ignora el co m p ila dor. La segunda form a e s m ás popular debido a que evita sangrar el có d ig o más hacia la derecha. Tal sangrado a m enudo deja p oco esp acio en una línea, lo que hace q u e ésta se divid a y la lectura del có d ig o sea m enos clara.
Tip d© rendimiento 2.1 Una estructura if/else anidada puede ejecutarse mucho más rápidamente que una serie de estruc turas de selección simple i f , debido a la posibilidad que existe de terminar antes de la estructura una vez que se cumple la condición.
Tip de rendimiento 2.2 En una estructura i f / e l a m anidada, evalúe las condiciones que tengan más probabilidad de ser ver daderas al principio de la estructura l f / m l m a anidada. Esto permitirá que la estructura i f/ m l m m se ejecute más rápidamente y termine antes, que si em lúa primero los casos de menor ocurrencia. La estructura de se lecció n if só lo permite una instrucción en su cuerpo. D e manera sim ilar, las partes if y else de una estructura if/else aceptan só lo una instrucción en su cuerpo, respectiva m ente. Para incluir varias instrucciones en el cuerpo de un if o en la partes de un if/else, en cierre las instrucciones entre llaves ( { y }). Un conjunto de instrucciones contenidas en un par de llaves se denom ina instrucción com puesta o bloque. D e ahora en adelante, utilizarem os el término “bloque”.
Observación de ingeniería de software 2.2 Un bloque puede colocarse en cualquier parte de un programa en donde se puede colocar una sola ins trucción. El sigu iente ejem plo incluye un b loqu e dentro d e la parte else de una estructura if/else.
if ( calificación >- 60 ) cout << "Aprobado.\n•> alsa ( cout << "Reprobado.\n"; cout << "Deberá tomar nuevamente este curso.Nn"; ) En este caso, s i calificación e s m enor que 6 0 , el programa ejecuta las d os instrucciones e n el cu erpo de else y d esp liega
Reprobado. Deberá tomar nuevamente este curso. O bserve las llaves q u e rodean las d os instrucciones en la cláusula else. E stas llaves son im portan tes. Sin ellas, la instrucción
cout << "Deberá tomar nuevamente este curso.\n";
http://alexyniorlls.blogspot.com 136 of 1380.
Estructuras do control
Capitulo 2
81
estaría fuera d el cuerpo de la parte else d el if, y se ejecutaría sin importar si la calificación es m enor que 6 0 o no.
Error común de programación 2.3 Olvidar una o las dos llaves que delimitan un bloque, puede ocasionar errores de sintaxis o lógicos dentro de un programa
Buena práctica de programación 2.5 Colocar siempre las llaves en una estructura if/alae (o en cualquier estructura de control) ayuda a prevenir su omisión accidental, en especial, cuando posteriormente se agregan instrucciones a una cláusula it o alma. Para evitar la omisión de una o ambas llaves, algunos programadores prefieren escribir la llave inicial y la final de los bloques antes de escribir las instrucciones individuales dentro de ellas. A s í co m o un bloque se puede colocar en cualquier parte en donde una instrucción individual puede colocarse, tam bién es p osible no tener instrucción alguna; a esto se le co n o ce co m o instruc ción vacía (o instrucción nula). La instrucción nula se representa colocan do un punto y com a ( ; ) en donde norm alm ente se colocaría una instrucción.
Error común de programación 2.4 Colocar un punto y coma después de la condición de la estructura if, provoca un error lógico en las estructuras de selección simple, y un error de sintaxis en las estructuras de selección doble if/alaa (cumulo la parte if en realidad contiene una instrucción en el cuerpo).
2.7 Estructura de repetición w faile Una estructura de repetición (tam bién llam ada estructura cíclica o ciclo ) perm ite al programador especificar que un programa debe repetir una a cció n m ientras alguna con d ición perm anezca verda dera. La instrucción de scu d ocód igo
W hile existan artículos en m i lista d e com pras C om pra el siguiente artículo y elim ínalo de m i lista describe la repetición que ocurre durante un salida de com pras. La co n d ició n , “existan artículos en mi lista d e com pras” puede ser falsa o verdadera. Si e s verdadera, en tonces se realiza la acción , “C om pra el sigu ien te artículo y elim ínalo d e mi lista”. Esta a cció n se realizará de manera repetida m ientras la con d ición sea verdadera. La instrucción contenida dentro de la estructura d e repetición w h i l a constituye el cuerpo de while, el cual puede ser una instrucción individual o un bloque. En algún m om ento, la con d ición será falsa (cuando e l últim o artículo d e la lista d e com pras sea adqui rido y elim inad o de la lista). En este punto, la repetición term ina, y se ejecuta la primera instrucción de seu d ocód igo después de la estructura d e repetición. C om o un ejem plo de un while real, con sid ere un segm ento de programa d iseñ ado para en con trar la primera potencia de 2, m ayor q u e 1000. Suponga q u e se inicializa co n 2 a la variable entera
producto. Cuando la sigu ien te estructura d e repetición while termina su ejecu ción , producto contendrá la respuesta deseada: int producto ■ 2; while ( producto <- 1000 ) producto - 2 * producto;
http://alexyniorlls.blogspot.com 137 of 1380.
82
Estructuras de control
Capítulo 2
C uando com ien za la ejecu ción de la estructura while, el valor de producto es 2. Cada repe tición d e la estructura while m ultiplica producto por 2 , d e manera que producto tom a los valores 4. 8. 16, 32, 6 4 , 128, 2 5 6 , 5 12 y 1024 sucesivam ente. Cuando producto se transform a en 1024, la con d ición d e la estructura while, producto < - 1000, se tom a falsa. Esto termina la repetición, el valor final de producto es 1024. La ejecu ción d el programa continúa co n la sigu ien te instrucción después d e while.
Error común de programación 2.5 No proporcionar, dentro del cuerpo de una estructura w h ile , una acción que ocasione que en algún momento la condición de un w h i l e se transforme en falsa, por lo general ocasiona un error lógico llamado un ciclo infinito, en el cual, la estructura de repetición nunca termina. FJ diagram a d e actividad d e la figura 2.5 muestra el flujo d e control que corresponde a la estruc tura while anterior. Una v ez m ás, observe que (adem ás del estado inicial, las flechas d e transición, un estado final y d os notas) lo s ú n icos sím b olos ad icio n a les en el diagrama representan un estado de a cción y una d ecisión . A dem ás, este diagram a introduce el sím b o lo de U M L fu sió n . U M L represen ta tanto el sím b olo de fusión co m o el sím b olo d e d ecisió n co m o rom bos. El sím b o lo de fusión une d o s flujos de actividad en un sím b olo de actividad. En este diagram a, el sím b o lo de fusión une las transiciones d el estado inicial y d el estado de acción , d e manera que am bos fluyan dentro d e la d e cisió n que determ ina si el c ic lo d eb e com enzar a ejecutarse (o continuar su ejecu ción ). A unque U M L representa sím b o lo s de d ecisión y de fusión co n un rom bo, lo s sím b o lo s se pueden distinguir m e diante el número de flechas de transición “entrantes" y “salien tes”. Un sím b o lo d e d ecisión tiene una flech a d e transición que apunta al rom bo y d os flechas d e transición q u e apuntan hacia fuera del rom b o para indicar transiciones p osib les d esd e dicho punto. A dem ás, cada flecha d e transición q u e apun ta hacia afuera de un sím b olo d e decisión tiene una con d ición d e guardia junto a ella. U n sím b olo de fusión tien e dos flechas de transición que apuntan hacia el rom bo y só lo una flecha de transición que apunta d esd e el rom bo, para indicar m últiples flujos d e actividad que se fusionan para continuar la actividad. O bserve que, a d iferencia del sím b olo de d ecisión , el sím b o lo de fusión n o tien e una con traparte en el cód ig o d e C ++. Im agine un recipiente con estructuras while vacías que pueden apilarse o anidarse en otras estructuras de control para formar una im plem entación estructurada del flujo de control de un a lg o ritmo. El programador llena lo s estad os de acción y los sím b o lo s de d ecisió n con exp resion es de
fusión
V ...
decisión " k
O (p rod u cto <- 1000]
.
<>
{d u p lico e l volor de producto^
(p rod u cto > 1000) Instrucción de C++ correspondiente: p ro d u c to - 2 * p r o d u c to
Figura 2.5
Diagrama de actividad d e la estructura d e repetición while.
http://alexyniorlls.blogspot.com 138 of 1380.
Estructuras do control
Capitulo 2
83
acción y con d icio n es d e guardia apropiadas para e l algoritm o. El diagram a muestra claram ente la repetición. La flecha de transición que em erge desde el estado d e acción apunta hacia la fusión, la cual hace la transición nuevam ente hacia la d ecisión que se evalúa durante el c ic lo hasta que la condición de guardia producto > 1000 se hace verdadera. E ntonces, termina la estructura while (alcan za su estado final) y e l control pasa a la sigu iente instrucción del programa.
2.8 C ó m o formular algoritmos: ejemplo práctico 1 (repetición controlada por un contador) Para explicar la form a en q u e lo s program adores desarrollan lo s algoritm os, esta secció n y la secció n 2 .9 resuelve d os variantes de un problem a d e prom edios para una clase. C onsidere el sigu ien te enun ciado d e un problema:
Una clase de diez estudiantes tuvo una evaluación. Las calificaciones (enteros en el rango deOa 100) correspondientes a esta evaluación están disponibles. Determine el promedio de la clase para esta ewluación. El prom edio de la cla se e s igual a la sum a d e las calificacion es dividida entre el número de estudian tes. El algoritm o para resolver este problem a en una com putadora debe introducir cada una de las ca lificacion es, calcular el prom edio y d esplegar el resultado. U tilicem o s seu d ocód igo para listar las a ccio n es a ejecutar y especificar e l orden en el que s e d e ben llevar a cabo. U tilizam os la repetición controlada p o r un contador para introducir las ca lifica c io nes una por una. Esta técnica utiliza una variable llamada contador para controlar el núm ero de v eces q u e se ejecutará un grupo d e instrucciones (tam bién co n o cid o co m o el núm ero de iteraciones de un ciclo). A la repetición controlada por un contador a m enudo se le llam a repetición definida, d eb ido a que antes de que com ien ce la ejecu ción d el ciclo se c o n o c e el número de repeticiones. En este ejem plo. la repetición termina cuando el contador exced e a 10. Esta secció n presenta un algoritm o en seu d ocód igo (figura 2 .6 ) y su programa en C + + correspondiente (figura 2.7). 1.a sigu ien te secció n m uestra có m o utilizar el seu d ocód igo para desarrollar un algoritm o. O bserve las referencias en el algoritmo hacia total y hacia contador. La variable total se utiliza para acum ular la sum a de una serie de valores. La variable contador se utiliza para contar (en este caso, el núm ero de calificaciones q u e se introducen). Por lo general, una variable que se em plea para alm a cenar un total debería inicializarse a cero antes de utilizarla en un programa; de otra manera, la suma podría incluir los valores alm acenados previam ente en la ubicación d e mem oria del total.
E stablece to ta l en cero E stablece contador de calificación en cero W hile co n ta d o r d e calificación sea m e n o r o igual que diez Introduce la siguiente calificación Sum a la calificación a total Sum a u no a l contador d e calificaciones E stablece el pro m ed io de la clase en e l total dividido entre diez D espliega el prom edio d e la clase Rgura 2.6
Algoritmo en seudocódigo para calcular el promedio de una clase, el cual utiliza una repetición controlada por un contador.
http://alexyniorlls.blogspot.com 139 of 1380.
84
Estructuras de control
1
2 3
Capítulo 2
// Fig. 2.7 1 fig02_07.cpp // Programa para obtanar el promedio de una clase mediante una repetición controlada por un contador. •inelude
4 5 6
7 8 9 10 11 12
using std::cout; using std::cin; using stdt:endl; // la función main comienza la ejecución del programa int main () {
int total;
// suma de las calificaciones introducidas por el usuario int contadorCalificacion; // número de la siguiente calificación a introducir int calificación; // valor de la calificación int promedio; // promedio de las calificaciones
13 14 15 16 17 18 19 20 21 22 23
// fase de inicialización total - 0; contadorCalificacion ■ 1;
// fase de procesamiento while ( contadorCalificacion <- 10 ) { cout << "Introduzca la calificación:
// repite diez veces // indicador para entrada cin >> calificación; // lee calificación del usuario // suma calificación total - total ♦ calificación; al total contadorCalificacion - contadorCalificacion + 1; // incrementa el contador
24 25 26 27 28 29 30 31 32 33 34 35 36 37
// inicializa total // inicializa el contador del ciclo
)
// fase de terminación promedio - total / 10;
// división entera
// despliega el resultado cout << "El promedio de la clase es " << promedio << endl; return 0;
// indica que el programa terminó satisfactoriamente
) // fin de la función main
Introduzca la calificación: Introduzca la calificación: Introduzca la calificación: Introduzca la calificación: Introduzca la calificación: Introduzca la calificación: Introduzca la calificación: Introduzca la calificación: Introduzca la calificación: Introduzca la calificación: El promedio de la clase es Figura 2.7
98 76 71 87 83 90 57 79 82 94 81
Problema correspondiente al cálculo del promedio de una clase, el cual utiliza una repetición controlada por un contador.
http://alexyniorlls.blogspot.com 140 of 1380.
Estructuras do control
Capitulo 2
85
Las lín ea s 12 a 15
int total; int contadorCalificacion; int calificación; int promadio;
// aúna da las calificacionas introdu cidas por al usuario // número da la siguianta calificación a introducir // valor da la calificación // promedio da las calificacionas
declara las variables total. contadorCalif icacion, calificación y promedio d e ti po int. O bserve que las d eclaraciones anteriores aparecen dentro del cuerpo de la función main. Las variables que s e declaran dentro del cuerpo de una función son variables locales y se pueden utili zar solam ente d esd e la línea de su d eclaración, dentro de la función, hasta la llave derecha ( } ) que indica el fin d e la d efin ición de la función. La declaración de una variable local dentro de una fun ción d eb e aparecer antes de q u e la variable s e u tilice en dicha función. Las lín eas 18 a 19
total - 0; contadorCalificacion ■ 1;
// inicializa total // inicializa al contador dol ciclo
son instrucciones de asignación que in icializan total a 0 y contadorCalificacion a 1. O bserve que las variables total y contadorCalificacion se inicializan antes de que se utilicen para un cálculo. Por lo gen eral, las variables contadoras se inicializan a cero o a uno. depen diendo de su u so (presentarem os ejem p los q u e muestran cada u no d e su s usos). Una variable no inicializada con tien e un valor "basura ” (tam bién llam ado valor indefinido), es decir, el últim o valor alm acenado en la ubicación de m em oria reservada para dicha variable.
Error común de programación 2.6 S no se inicializa un contador o un total, los resultados de su programa probablemente serán incorrec tos. Esto es un ejemplo de un error lógico. Ixi mayoría de las variables inicialmente contienen valores basura.
Tip para prueba y depuración 2.1 Inicialice contadores y totales.
Buena práctica de programación 2.6 Declare cada variable en una línea separada para que los programas sean más claros. La línea 22
whila ( contadorCalificacion <■ 10 ) (
// repite diez veces
indica que la estructura while d eb e continuar m ientras el valor d e contadorCalificacion sea m enor o igual que 1 0 . Las lín eas 23 a 24
cout << "Introduzca la calificación: *; d n >> calificación;
// indicador para entrada // loa calificación del usuario
corresponden a la instrucción en seu d ocód ig o “Introduce la siguiente calificación". La primera in s trucción d esp liega en la pantalla e l indicador “Introduzca la calificación:”.La segu n da instrucción introduce el valor de la calificación d el usuario. La variable calificación no se in icializó antes en el program a, debido a q u e el programa ob tiene el valor para calificación a partir d el usuario durante cada iteración d el ciclo .
http://alexyniorlls.blogspot.com 141 of 1380.
86
Estructuras d© control
Capítulo 2
A continuación, e l programa actualiza total con la nueva calificación introducida por e l usuario. La linca 25
total » total ♦ calificación;
// suma calificación al total
sum a calificación al valor previo d e total y asign a el resultado a t o tal. Ahora, el programa se encuentra listo para increm entar la variable contadorCalificacion para prepararse y procesar la sigu ien te calificación , y a continuación leer la sigu iente ca lifica ción del usuario. 1.a línea 26
contadorC&lificacion - contadorCalificación ♦ 1; // incrementa al contador sum a 1 a contadorCalif icacion. de manera que la con d ición e n la estructura while será falsa y terminará el ciclo . C uando el c ic lo termina, la línea 30
promedio - total / 10;
// división entera
asign a el resultado del cálcu lo del prom edio a la variable promedio. La lín ea 33
cout << "El promedio de la clase es " << promedio << endl; d esp liega la cadena "El promedio de
la clase es " , seguida por el valor d e la variable
promedio. O bserve que el cá lcu lo del prom edio en el programa produce un resultado entero. D e h ech o , en este ejem p lo, la sum a de las califica cio n es es 8 1 7 , lo cu al, cu an do se divid e entre 10, debe arrojar 8 1 .7 , un núm ero con punto decim al. F.n la sigu ien te secció n verem os có m o tratar a d ich os números (llam ados núm eros de punto flotante). En la figura 2 .7 , si la línea 3 0 utilizara contadorCalif icacion e n lugar d e 10, la salida para este program a desplegaría un valor incorrecto igual a 74.
Error común de programación 2.7 Utilizar una variable controlada por un contador correspondiente a un ciclo, para realizar un cálculo que se encuentra después de dicho ciclo, a menudo ocasiona un error de desplazamiento en uno. En un ciclo controlado por un contador que aumenta en uno cada vez que se repite el ciclo, éste termina cuan do el valor de la variable de control es uno mayor que su último valor correcto (es decir, 11 en el caso de un contador de 1 a JO).
2.9 C óm o formular algoritmos mediante el mejoramiento de arriba a abajo, paso a paso: ejemplo práctico 2 (repetición controlada por un centinela) G eneralicem os el problem a para lo s prom edios de una clase. C onsidere el sigu ien te problema:
Desarrolle un programa que calcule el promedio de una clase y que procese un número arbitrario de calificaciones cada vez que se ejecuta el programa. F.n el prim er ejem p lo d e prom edio d e la clase, e l enunciado del problem a esp e cific ó el número de califica cio n es (1 0 ) por adelantado. En este ejem p lo, no se indica cuántas ca lifica cio n es introdu cirá el usuario durante la ejecu ción del programa. F.l programa debe procesar un núm ero arbitrario d e calificaciones. ¿C óm o puede determinar el programa cuándo terminar d e introducir las ca lifica cio n es? ¿C óm o sabrá cuándo calcular y desplegar el prom edio de la clase? U na manera d e resolver este problem a es utilizar un valor esp ecia l d enom inado valor centinela (tam bién llam ado valor de señal, valor de p ru eba, o bandera ), para indicar el “fin de la entrada de datos”. El usuario introduce las calificacion es hasta q u e todas las calificacion es legítim as se hayan
http://alexyniorlls.blogspot.com 142 of 1380.
Estructuras do control
Capitulo 2
87
introducido. La repetición controlada por un centinela a m enudo se d en om in a repetición indefinida, debido a q u e el número d e repeticion es no se co n o ce antes de que co m ien ce la ejecu ción del ciclo . D e form a clara, d eb e eleg irse e l valor centinela d e manera que n o s e confunda con un valor de entrada aceptable. Por lo general, las calificaciones d e un exam en son enteros positivos, así, - 1 e s un valor centinela aceptable para este problema. Por lo tanto, la ejecución del programa correspondiente al promedio de la clase podría procesar un tlujo de entrada tal co m o 9 5 , 9 6 ,7 5 , 7 4 , 89 y - 1 . Entonces el programa calcularía y desplegaría el prom edio de la cla se para las calificacion es 9 5 , 9 6 , 7 5 , 74 y 89. O b serve q u e - 1 es e l valor centinela, de manera que no entra en el cá lcu lo d el porcentaje.
Error común de programación 2.8 Elegir un valor centinela que además sea un valor legítimo de información es un error lógico. D esarrollam os el programa para e l prom edio d e la cla se m ediante una técnica llam ada m ejora m iento de arriba a abajo, p aso a p a so , una técnica que e s esen cial para e l desarrollo d e programas correctam ente estructurados. C om en zam os con una representación en scu d o có d ig o de la cima:
D eterm inar el prom edio de la clase p a ra la evaluación La cim a e s una instrucción individual q u e co n tien e la función general d el programa. C om o tal, la cim a es, en e fe cto , la presentación com pleta de un programa. D esafortunadam ente, la cim a (com o en este ca so ) rara vez contiene su ficien tes d etalles co m o para escribir un programa en C ++. Enton c e s, co m en cem o s con el p roceso de m ejoram iento. D ivid im os la cim a en series d e tareas m ás peque ñas y las listam os en el orden en e l que s e deben ejecutar. E sto arroja co m o resultado la sigu iente
p rim era m ejora. Inicializa las variables Introduce, sum a y cuenta las calificaciones de la evaluación C alcula y despliega el pro m ed io de la clase Este m ejoram iento utiliza solam en te la estructura de secu en cia; esto e s , que los pasos listados se deben ejecutar en orden: uno d esp u és d el otro.
Observación de ingeniería de software 2.3 Cada mejora, así como la cima misma es una especificación completa del algoritmo: sólo varía el ni vel de detalle.
Observación de ingeniería de software 2.4 Muchos programas se pueden dividir de manera lógica en tres fases: una fase de inicialización que inicializa las variables del programa; una fase de procesamiento que introduce los valores de los datos y ajusta las variables de programa de manera adecuada: y una fase de terminación que calcula y des pliega los resultados finales. La ob servación d e ingeniería d e softw are anterior a m enudo e s todo lo que usted necesita para realizar su primera m ejora en el p roceso de arriba a abajo. Para continuar co n el sigu iente nivel de m ejoram iento, es decir, con la segunda m ejora, nos com p rom etem os co n variables esp ecíficas. En este ejem p lo, n ecesitam os el total actual de los núm eros, una cuenta d e cuántos núm eros se proce san, una variable para recibir el valor d e cada calificación con form e el usuario la introduce, y una variable para alm acenar el prom edio calculado. La instrucción en seu d o có d ig o
Inicializa variables puede d efinirse co m o sigue:
Inicializa to ta l a cero Inicializa contador a cero
http://alexyniorlls.blogspot.com 143 of 1380.
88
Estructuras de control
Capítulo 2
O bserve que s ó lo las variables to ta l y contador deben inicializarse. antes d e que puedan utilizarse; la s variables prom edio y calificación (para el prom edio calcu lad o y la entrada d e usuario, respecti vam ente) n o necesitan inicializarse. 1.a instrucción d e scu d ocód igo
Introduce, sum a y cuenta las calificaciones de la evaluación requiere una estructura de repetición (e s decir, un c ic lo ) que introduzca de manera exitosa cada calificación. N o sab em os por adelantado cuántas calificacion es se van a procesar, d e manera que uti lizam os una repetición controlada por un centinela. El usuario ingresa calificacion es reales una por una. D esp u és de introducir la últim a calificación real, e l usuario introduce un valor centinela. El pro gram a evalúa el valor centin ela d esp u és de la introducción de cada valor, y termina el c ic lo cuando e l usuario dígita d ich o valor centinela. E ntonces, la segunda mejora a la instrucción anterior en seud ocó d ig o es
Introduce la p rim era calificación (posiblem ente el centinela) W hile el usuario n o introduzca el centinela Sum a esta calificación a l to ta l actual Sum a un o a l contador de calificación Introduce la siguiente calificación (posiblem ente el centinela) O bserve q u e en scu d ocód igo no utilizam os llaves alrededor d el conjunto de instrucciones que form an el cuerpo d e la estructura while. S im p lem ente sangram os las instrucciones bajo while para mostrar q u e pertenecen a w hile. D e nuevo, el seu d o có d ig o só lo e s una ayuda inform al para el d esa rrollo del programa. La instrucción e n scu d ocód igo
C alcula y despliega el prom edio d e la clase s e puede m ejorar co m o sigue:
i f el contador n o es igu a l q u e cero A signa e l prom edio a l to ta l dividido entre el contador D espliega e l prom edio else D espliega "N o se introdujeron calificaciones ” O bserve que so m o s cu id ad osos con la posibilidad d e la d iv isió n entre cero (por lo regular, un error lógico fa ta l que, s i no s e detecta, ocasionará que el programa falle). La segunda m ejora com pleta al seu d o có d ig o para el problem a del prom edio de la cla se aparece e n la figura 2.8.
Error común de programación 2.9 Intentar realizar una división entre cero, por lo genera! ocasiona un error fatal.
Tip para prueba y depuración 2.2 Cuando realice una división entre una expresión cuyo valor pudiera ser cero. e\'alúe de manera explí cita esta posibilidad y hágase cargo de ella de manera apropiada dentro de su programa (por ejemplo, despliegue un mensaje de error), en lugar de permitir que ocurra un error fatal. En las figuras 2.6 y 2 .8 in clu im os algunas lín ea s com p letam en te e n blanco y sangrías dentro del seu d o có d ig o para hacerlo m ás claro. Las lín eas en blanco separan los algoritm os en seu d o có d ig o en su s distintas fases, y la sangría enfatiza el cuerpo de las estructuras de control.
http://alexyniorlls.blogspot.com 144 of 1380.
Estructuras do control
Capitulo 2
89
Inicializa to ta l a cero Inicializa co n ta d o r a cero Introduce la p rim era calificación (posiblem ente e l centinela) W hile e l usuario no introduzca e l centinela Sum a esta calificación a l to ta l actual Sum a uno a l co n ta d o r de calificación Introduce la siguiente calificación (posiblem ente el cen tinela) i f el co n ta d o r no es igual que cero A sig n a el prom edio a l total dividido entre el contador D espliega el prom edio else D espliega “N o se introdujeron ca lifica cio n es”
Rgura 2.8
Algoritmo en seudocódlgo del problema correspondiente al cálculo del promedio d e una clase mediante la repetición controlada por un centinela.
El algoritm o en seu d ocód igo de la figura 2 .8 resuelve un problem a general de prom edios. Este algoritm o se desarrolló d esp u és de sólo d o s n iv eles de m ejoram iento. A lgu nas veces se requieren m ás niveles.
Observación de ingeniería de software 2.5 Termine el proceso de mejoramiento de arriba a abajo, paso a paso cuando el algoritmo en seudocó digo esté especificado con suficientes detalles, como para convertirlo a C++. Por lo regular, la implementación del prognmia en C++ es muy directa. La figura 2 .9 muestra el programa en C + + y un ejem p lo de su ejecución. A unque solam en te se introducen calificacion es con núm eros enteros, el cá lcu lo del prom edio podría producir un núm ero con punto d ecim al, un número real. El tipo int no puede representar núm eros reales. E ste progra ma introduce el tipo d e dato d o u b l e para manipular núm eros con puntos d ecim ales (tam bién llam a dos mím enos de p u n to flo ta n te ), c introduce un operador esp ecial llam ado operador d e conversión de
tipo para obligar al cálcu lo del prom edio a producir un resultado num érico de punto flotante. D es pués de la presentación d el programa explicarem os con detalle esta s características. 1
// Fig. 2.9: £ig02_09.cpp
2
// Programa que calcula al promedio de una clase mediante una repetición controlada por un centinela. •inelude
3 4 5 6
7 8 9 10 11 12
using using using using
stdz:cout; std::cin; std::endl; std::fixed;
iinclude
// manipuladores de flujo parametrizados
using std::setprecision; // asigna la precisión de la salida numérica
Rgura 2.9
Problema correspondiente al cálculo del promedio de una clase mediante el uso de una repetición controlada por un centinela. (Parte 1 de 3.)
http://alexyniorlls.blogspot.com 145 of 1380.
90
Estructuras de control
Capítulo 2
13 14 // la función main comienza la ejecución del programa 15 int main() 16 ( 17 int total; // suma de las calificaciones 18 int contadorCalificacion;// número de calificaciones introducidas 19 int calificación; // valor de la calificación
20 21
double promedio;
// número con punto decimal para el promedio
22 23 24 25 26 27 28 29 30 31 32 33 34 35
// fase de inicialización total - 0; contadorCalificacion " 0 ;
// fase de procesamiento // obtiene la primera calificación a partir del usuario cout << "Introduzca calificación, -1 para finalizar: // indicador para la entrada cin >> calificación; // lee la calificación que in troduce el usuario // repetición del ciclo hasta que el usuario introduce el valor centinela while ( calificación 1» -1 ) { total - total + calificación; // suma calificación al total contadorCalificacion - contadorCalificacion + 1; // incrementa el contador
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
// inicializa el total // inicializa el contador del ciclo
cout << "Introduzca calificación, -1 para finalizar: "; // indicador para la entrada cin >> calificación; // lee la siguiente calificación > // fin de while // fase de terminación // si el usuario introdujo al menos una calificación ... if ( contadorCalificacion !- 0 ) { // calcula el promedio de todas las calificaciones introducidas promedio- static_cast< double >( total ) / contadorCalificacion; // despliega el promedio con dos digitos de precisión cout << "El promedio de la clase es " « setprecision( 2 ) << fixed << promedio << endl; > // parte final del if correspondiente al if/else else // si no se introdujeron calificaciones, apropiado
Figura 2.9
arroja el mensaje
Problema correspondiente al cálculo del promedio de una clase mediante el uso de una repetición controlada por un centinela. (Parte 2 de 3.)
http://alexyniorlls.blogspot.com 146 of 1380.
Estructuras do control
Capitulo 2
91
56 cout << "No se introdujeron calificaciones"; 57 58 return 0; // indica que el programa terminó satisfactoriamente 59 60 } // fin de la ftinción main Introduzca calificación. Introduzca calificación. Introduzca calificación. Introduzca calificación. Introduzca calificación. Introduzca calificación. Introduzca calificación. Introduzca calificación. Introduzca calificación. El promedio de la clase
Figura 2.9
-1 -1 -1 -1 -1 -1 -1 -1 -1 es
para para para para para para para para para 82.50
finalizar: finalizar: finalizar: finalizar: finalizar: finalizar: finalizar: finalizar: finalizar:
75 94 97 88 70 64 83 89 -1
Problema correspondiente al cálculo del promedio d e una clase m ediante el uso de una repetición controlada por un centinela. (Parte 3 d e 3.)
En este ejem p lo, vem os que la estructura de control se puede apilar en cim a de otra (en secu en cia). tal co m o un niño apila b loqu es de construcción. A la estructura w h i l e (lín eas 3 3 -4 0 ) le sigu e de inm ediato una estructura i f / e l s e (lín eas 4 4 -5 6 ) en secu en cia. M ucho del c ó d ig o de e ste pro grama es idéntico al c ó d ig o d e la figura 2 .7 , d e m anera q u e n o s concentram os en sus nuevas carac terísticas y temas. La línea 21 declara la variable p r o m e d i o c o m o d o u b l e . El cam b io nos perm ite alm acenar el resultado d el cá lcu lo d el prom edio com o un núm ero de punto flotante. La línea 25 inicializa la varia ble c o n t a d o r C a l i f i c a c i o n en 0 . d eb ido a que aún no se introducen ca lificacion es. Recuerde que e ste programa utiliza una repetición basada en un centinela. Para m antener un registro preciso del número d e califica cio n es introducidas, el programa increm enta la variable c o n t a d o r C a l i f i c a c i o n solam en te cuando el usuario introduce un valor de ca lifica ció n válid o (es decir, n o un valor centin ela) y el programa com pleta el proceso de la calificación. O bserve q u e am bas instrucciones d e entrada (lín eas 3 0 y 3 8 ) están precedidas por una instruc ción de salida que indica al usuario la entrada de datos.
Buena práctica de programación 2.7 Indique al usuario cada entrada de datos por teclado. F.l indicador debe precisar la forma de ¡a entrada y cualquier valor especial de entrada. Por ejemplo, en un ciclo controlado por un centinela, los indicadores que piden la entrada de datos deben recordar a! usuario, de manera explícita, cuál es el valor centinela. C om pare la lógica d el programa basado en la repetición controlada por un centinela de la figura 2.9, con el de la repetición controlada por un contador de la figura 2.7. En la repetición controlada por un contador, leem os un valor introducido por el usuario durante cada paso por la estructura w h i l e , a través d el número esp ecificad o d e pasadas. En la repetición controlada por un centinela, leem os un valor (lín ea 3 0 ) antes de que el programa llegue a la estructura w h i l e . Este valor se utiliza para d e terminar si el flujo d e control d el programa debe entrar o n o al cuerpo de la estructura w h i l e . Si la con d ición de la estructura w h i l e e s f a l s a (es decir, el usuario digitó el centinela), el cuerpo d e la estructura w h i l e no se ejecuta (n o se introducen calificaciones). S i, por otro lado, la co n d ición es v e r d a d e r a , com ienza la ejecución d el cuerpo y se procesa el valor q u e introdujo el usuario (e s de cir, sum a esc valor al t o t a l en este ejem plo). D espués d e que el valor se procesa, s e introduce el
http://alexyniorlls.blogspot.com 147 of 1380.
92
Estructuras de control
Capítulo 2
sigu ien te valor del usuario, antes d e q u e term ine el cuerpo d e la estructura while. M ientras se lle ga a la llave derecha (}) de cierre, de la línea 4 1 , la ejecución continúa con la siguiente evaluación de la con d ición de la estructura while, utilizando el nuevo valor que el usuario introdujo justo antes, para determ inar si el cuerpo d e la estructura while debe ejecutarse de nuevo. O bserve que el sigu ien te la el se
valor siem pre es introducido por el usuario, inm ediatam ente antes de que se evalúe la condición de estructura while. E sto n os perm ite determ inar si el valor que acaba de introducir el usuario es valor centinela, a n tes de que e se valor se procese (es decir, que se su m e al total). Si el valor que introdujo e s el valor centinela, la estructura while termina y el valor no s e suma al total.
O bserve e l bloque en el c ic lo while d e la figura 2.9. Sin las llaves, las tres últim as instruccio n es en el cuerpo del c ic lo quedarían fuera d el ciclo , lo que ocasionaría que la com putadora interpre tara e l có d ig o de manera incorrecta, d e la siguiente manera:
while ( calificación I- -1 ) total • total ♦ calificación; contadorCalificacion - contadorCalificacion + 1; cout << "Introduzca calificación, -1 para finalizar» *j cin >> calificación; E sto ocasionaría un c ic lo infinito si e l usuario no introdujera - 1 para la primera ca lifica ció n . Los prom edios no siem pre arrojan resultados enteros. A m enudo, un prom edio e s un valor que con tien e una parte fraccional, tal com o 7.2 o -9 3 .5 4 1 . A esto s valores se le s c o n o c e co m o números d e punto flotante, y en C + + se representan m ediante tipos de d atos co m o f l o a t y d o u b l e . Un tipo de variable double puede alm acenar un valor d e una m agnitud m ucho m ayor y con m ayor pre cisión que float. Por esta razón, preferim os utilizar el tipo double, en lugar d e float, para representar valores de punto flotante en nuestros programas. En C + + , las constantes d e punto flotan te, tales co m o 1000.0 y .05. se crean co m o tipo double. La variable prom edio se declara de tipo double (lín ea 21) para capturar lo s resultados fracció nales de nuestros cálcu los. Sin em bargo, debido a que total y contadorCalif icacion son valores enteros, el resultado del cá lcu lo total / contadorCalificacion e s un entero. D ivi dir d os en teros da co m o resultado la división entera, en la que se pierde cualquier parte fraccional d e lo s cá lcu lo s (es decir, se trunca). En la sigu ien te instrucción:
promedio ■ total / contadorCalificacion; prim ero se realiza el cálcu lo de la d ivisión , d e m odo que la parte fraccional d el resultado se pierde antes de que éste s e asig n e a promedio. Para producir un cá lcu lo d e punto flotante a partir de valo res enteros, d eb em os crear para el cálcu lo , valores tem porales que sean núm eros d e punto flotante. C + + proporciona el operador unario de conversión de tipo para llevar a cab o esta tarea. La línea 47 utiliza el operador de con versión d e tipo static_c»st ( operando ) para crear una cop ia en punto flotante d el operando entre paréntesis, total. U tilizar e l operador d e conversión de tipo en esta forma se le denom ina conversión explícita. El valor alm acenado en la variable total e s aún un entero. E l cálcu lo con siste ahora en un valor de punto flotante (la versión tem poral dou ble de total) dividida por el entero contadorCalificacion. El com pilador de C + + solam en te sab e cóm o evaluar exp resion es en las cu ales los tipos de da tos d e lo s operandos sean idénticos. Para asegurarse de que los operandos son d el m ism o tipo, el com pilador realiza una operación llam ada prom oción (tam bién llamada conversión im plícita ) sobre lo s operadores seleccion ad os. Por ejem p lo, en una expresión que con tien e valores co n tipos d e datos int y double. C + + prom ueve los operandos int a valores double. En nuestro ejem p lo , después d e prom over contadorCalificacion a double, el cá lcu lo se realiza y el resultado de la di v isió n en punto flotante s e asigna a promedio. M ás adelante en e ste capítulo, exp licarem os todos lo s tipos d e datos estándar y su orden de prom oción.
http://alexyniorlls.blogspot.com 148 of 1380.
Estructuras do control
Capitulo 2
93
L os operadores d e conversión d e tip o están d isp o n ib les para cualquier tipo de dato. El operador s t a t i c _ c a s t se forma m ediante la palabra reservada s t a t i c _ c a s t y las lla v es triangulares (< y > ) alrededor del nom bre d el tipo d e dato. El operador d e conversión d e tipo es un operador unario, un operador que requiere solam ente un operando. En el capítulo 1, estu diam os lo s operadores aritm éticos binarios. C + + tam bién perm ite version es unitarias de lo s operadores d e sum a ( ♦ ) y res ta ( - ) , d e manera que el programador puede escribir exp resion es co m o - 7 o + 5 . L os operadores de conversión de tipo tienen una precedencia m ayor que m uchos otros operadores, tales co m o lo s o p e radores unarios + y - . Esta precedencia es m ayor que la q u e tienen lo s operadores de m ultiplicación * , / y %, y m enor q u e la de lo s paréntesis. En nuestras tablas d e precedencia, indicam os el operador de conversión d e tipo m ediante la notación s t a t i c _ c a s t < tipo> ( ) . A quí, exp licarem os brevem ente las capacidades d e form ato d e la figura 2 .9 , y co n d etalle en el cap ítu lo 21. L a llam ada setprecision( 2 ) de la lín ea 5 0 in dica que la variable double promedio d eb e desplegarse con d os d íg ito s d e precisión a la derecha d el punto d ecim al (por ejem plo, 92.37). A esta llam ada se le denom ina m anipulador param etrizable de flu jo . L os program as que utilizan estas llam adas deben contener la directiva d e preprocesador (lín ea 10)
•inelude I.a línea 12 esp ecifica que el programa utiliza el nom bre setprecision del archivo de en cab eza do . O bserve q u e endl e s un m anipulador n o param etrizable de flu jo y no requiere del archivo de en cab ezad o . Si no se esp ecifica la precisión, lo s valores de punto flo tante por lo general s e im prim en con seis dígitos de precisión (es decir, la precisión p o r defecto ), sin em bargo, en un m om ento verem os una excep ción . E l m anipulador de flujo fixed (línea 5 1 ) indica que los valores d e punto flotante deben impri m irse en e l form ato denom inado fo rm a to de pu n to fijo (en op osición con la notación científica, la cual explicarem os en el capítulo 21). Especificar el form ato de punto fijo también fuerza la im presión del punto decim al y ceros, aún cuando el valor e s un m onto entero, co m o 88.00. Sin la opción de formato de punto fijo, d ich o valor se im prim e en C + + co m o 88 sin lo s ceros y sin el punto decim al. Cuando el form ato anterior se utiliza en un programa, el valor im preso se redondea al núm ero indicado por las p osiciones decim ales, aunque el valor en m em oria perm anece igual. Por ejem p lo, lo s valores 87.946 y 6 7 .5 4 3 s e imprimen com o 87.95 y 6 7 .5 4 , respectivam ente. O bserve que también es posible forzar la aparición del punto decim al m ediante el u so del manipulador de flujo e h o w p o i n t . Si se especifica show point sin form ato fijo, en tonces no se imprimirán los ceros. C om o endl, lo s m anipu ladores de flujo fixed y showpoint son m anipuladores de flujo no param ctrizables que n o requie ren d el archivo de encabezado . A m b os se encuentran en .
Error común d© programación 2.10 Utilizar números de punto flotante de manera que se asuma que se representan de manera exacta pue de provocar resultados incorrectos. Los números de punto flotante se representan sólo de numera apro ximada en la mayoría de las computadoras. A pesar d e que lo s núm eros de punto flotante n o son siem pre “ 100% precisos”, tienen num ero sas ap licacion es. Por ejem p lo, cu an do hablam os d e una temperatura “norm al” del cuerpo de 9 8 .6 no n ecesitam os precisar un gran núm ero de dígitos. C uando v em os la temperatura en un termóm etro y leem os 9 8 .6 , en realidad podría ser 9 8 .5 9 9 9 4 7 3 2 1 0 6 4 3 . FJ punto aquí es que el referirse a este nú m ero sencillam en te com o 9 8 .6 está bien para la mayoría de la s aplicaciones. Otra manera en la que se desarrollan núm eros de punto flotante es a través de la d ivisión. C uan do d ivid im os 10 entre 3, el resultado e s 3 .3 3 3 3 3 3 3 ... donde la secu en cia d e núm eros s e repite de manera infinita. La com putadora reserva una cantidad fija de esp acio para alm acenar d ich o valor, por lo que claram ente el valor de punto flotante alm acenado solam en te e s una aproxim ación.
http://alexyniorlls.blogspot.com 149 of 1380.
94
Estructuras de control
Capítulo 2
2.10 C ó m o formular algoritmos mediante el mejoramiento de arriba a abajo, paso a paso: ejemplo práctico 3 (estructuras de control anidadas) Trabajem os con otro problem a com pleto. D e nuevo, form ularem os el algoritm o m ediante utilizando e l m ejoram iento de arriba a abajo, paso a paso, y escribirem os su programa correspondiente en C ++. H em os visto que la s estructuras d e control se pueden apilar una sobre la otra (en secu en cia ) tal com o un niño apila b loqu es d e construcción. En este ejem p lo práctico, verem os la otra forma en la que las estructuras de control se pueden conectar e n C + + , a saber, m ediante el anidam iento de una estructu ra de control dentro d e otra. C onsidere e l sigu ien te enunciado del problema:
Una escuela ofrece un curso que prepara a los estudiantes para el examen de certificación del estado como corredor de bienes raíces. El año pasado, muchos de los estudiantes que completaron el curso tomaron el examen de certificación. Naturalmente, la escuela desea saber que tan bien les fue a los es tudiantes en el examen. A usted se le pide que escriba un programa que resuma los resultados. Se le dio una lista de 10 estudumtes. Junto a cada nombre se escribe un 1 si el estudicmte aprobó el examen o un 2 si el estudiante reprobó. Su programa debe analizar los resultados del examen de la siguiente manera: 1. Introduzca cada resultado (es decir, un l o un 2). En la pcmtalla, despliegue el mensaje "In troduzca resultado ”,cada vez que el programa pida otro resultado del exttmen. 2. Cuente el número de resultados del examen de cada tipo. 3. Despliegue un resumen de los resultados, indicando el número de estudiantes que aprobaron y el número de estudiantes que reprobaron. 4. Si aprobaron más de ocho estudiantes, despliegue el mensaje “Incrementar las inscripciones ". D esp ués d e leer el enunciado d el problem a cuidadosam ente, h acem os la s sig u ien tes ob servacio n es acerca del problema: 1. F.l programa debe procesar lo s resultados d e la evaluación para 10 estudiantes. Se d eb e uti lizar una repetición controlada por un contador. 2. Cada resultado de la evaluación es un núm ero, un 1 o un 2. Cada vez q u e el programa lee un resultado, e l programa debe determ inar si el núm ero es igual a 1 o a 2. En nuestro a lg o ritmo, evaluam os el 1. Si el núm ero n o e s igual a 1, asu m im os q u e s e trata de un 2. (FJ ejer c ic io 2.2 3 considera las con secu en cia s de esta su p osición .) 3. S e utilizan d os contadores para mantener la pista de los resultados, uno para contar el nú m ero de estudiantes que aprobaron el exam en y otro para contar el núm ero de estudiantes que reprobaron el exam en. 4. D esp u és de que el programa procesó to d o s lo s resultados, debe decidir si m ás de o ch o estu diantes aprobaron el exam en. Procedam os con e l m ejoram iento de arriba a abajo, paso a paso. C om enzam os con una repre sentación del seud ocód igo de la cima:
A naliza los resultados del exam en y decid e si las inscripciones deben aum entarse U na v e z más. e s importante enfatizar q u e la cim a e s una representación com p leta d el programa, pe ro se requerirán varias m ejoras antes de que el seu d o có d ig o pueda evolucionar d e manera natural a un programa en C ++.
http://alexyniorlls.blogspot.com 150 of 1380.
Estructuras do control
Capitulo 2
95
Nuestra primera m ejora es:
Inicializa las variables Introduce d iez calificaciones y cuenta ¡os aprobados y los reprobados D espliega un resutnen de los resultados d e l exam en y decide si las inscripciones deben aum entarse A quí tam bién, aún cuando ten em os una representación com pleta del programa, e s necesario m ejorar la. Ahora, n os com p rom etem os co n variables esp ecíficas. L os contadores son n ecesarios para regis trar lo s aprobados y lo s reprobados, utilizarem os un contador para controlar el proceso d el c ic lo y necesitarem os una variable para alm acenar la entrada del usuario. L a variable en la se alm acenará la entrada del usuario no se in icializa, d eb id o a que su valor p roviene d el usuario durante cada itera ción d el ciclo . La instrucción de seud ocód igo
Inicializa variables p uede m ejorarse com o sigue:
Inicializa aprobados con cero Inicializa reprobados con cero Inicializa co n ta d o r d e estudiantes con uno O bserve que só lo se in icializan lo s contadores. La instrucción de seud ocód igo
Introduce d iez calificaciones y cuenta los aprobados y los reprobados requiere un ciclo que introduzca d e manera sucesiva el resultado d e cada exam en. A quí sab em os de antem ano que son precisam ente diez resultados, de manera que es apropiado un c ic lo controlado por un contador. D entro del c ic lo (es decir, anidado en el ciclo ), una estructura de se lecció n d oble deter minará si cada resultado d el exam en es aprobado o reprobado, e increm entará el contador apropia do. E ntonces, la mejora al seu d o có d ig o an teriores:
W hile e l co n ta d o r de estudiantes sea m en o r o igual que diez Introduce el siguiente resultado d el exam en i f el estudiante aprobó Sum a uno a aprobados else Sum a uno a reprobados Sum a uno a l contador de estudiantes O bserve el uso de líneas en blanco para terminar la estructura de control if/else y mejorar la claridad. La instrucción de seudocódigo
D espliega un resum en de los resultados del exam en y decide si las inscripciones deben a u m entarse se puede definir d e la sigu iente forma
D espliega el núm ero de aprobados D espliega el núm ero de reprobados ¡ f aprobaron m á s de ocho estudiantes D espliega "A u m en ta r inscripciones ”
http://alexyniorlls.blogspot.com 151 of 1380.
96
Estructuras de control
Capítulo 2
La segunda m ejora com pleta aparece en la figura 2.10. O bserve que las lín eas en blanco se uti lizan también para establecer e l final d e la estructura W hile para m ayor claridad. Ahora, el seu d ocód igo ha m ejorado lo su ficien te co m o para hacer la conversión a C ++. El pro gram a en C + + y d os ejem p los de la ejecu ción aparecen en la figura 2.11. Las lín eas 13 a 16 declaran las variables q u e utiliza main para procesar lo s resultados d el exa m en. O bserve que tom am os ventaja d e una característica d e C + + que permite incorporar la inicialización de la s variables en la s declaraciones (a aprobados s e le asigna 0, a reprobados s e le asign a 0 y a contadorEstudiantes se le asigna 1). En o casion es, los programas con ciclo s requieren la in icialización al principio d e cada repetición; por lo general, dicha in icialización ocurre en instrucciones d e asign ación.
Inicializa aprobados con cero Inicializa reprobados con cero Inicializa co n ta d o r de estudiantes con uno W hile e l contador de estudiantes se a m e n o r o igual que diez Introduce el siguiente resultado d e l examen i f e l estudiante aprobó S u m a uno a aprobados else S u m a uno a reprobados Sum a uno a l co n ta d o r d e estiuliatUes D espliega e l núm ero de aprobados D espliega e l núm ero de reprobados I f aprobaron m á s de ocho estudiantes D espliega "A um entar inscripciones"
Hgura 2.10
1 2 3
Algoritmo en seudocódigo del problema d e resultados d e examen.
// Fig. 2.11: fig02_ll.cpp // Análisis de loa resultados del examen. •inelude
4
5 6 7
using std::cout; using std::cin; using std::endl;
8 9 10
11 12 13
// la función main comienza la ejecución del programa int main () { // inicializa las variables en las declaraciones int aprobados > 0 ; // número de aprobados
Figura 2.11
Estructuras de control anidadas: problema de resultados de exámenes. (Parte 1 de 3.)
http://alexyniorlls.blogspot.com 152 of 1380.
Estructuras do control
Capitulo 2
14 15 16 17 18 19
int reprobados - 0; int contadorEstudiantes ■ 1; int resultado;
97
// número de reprobados // contador de estudiantes // resultado de un examen
// procesa 10 estudiantes mediante un ciclo controlado por un contador while ( contadorEstudiantes <- 10 ) {
20 21
// indica al usuario la entrada y obtiene el valor a partir del usuario cout « "Introduzca resultado (1 - aprobado, 2 - reprobado): *; cin >> resultado;
22 23 24 25
// si resultado es 1, incrementa aprobados; if/else anidado dentro de while if ( resultado ■■ 1 ) // if/else anidado dentro de while aprobados - aprobados ♦ 1;
26 27 28 29 30 31 32
sise // si resultado no es 1, incrementa reprobados reprobados ■ reprobados + 1; // incrementa contadorEstudiantes para que el ciclo termine en algún momento contadorEstudiantes ■ contadorEstudiantes + 1;
33 34 35 36 37
) // fin de while // fase de terminación; despliega el número de aprobados y de reprobados cout << "Aprobados * << aprobados << endl; cout << "Reprobados " « reprobados << endl;
38 39 40 41 42 43 44 45 46 47
/ / S i aprobaron más de 8 estudiantes, despliega "Aumentar inscripciones* if ( aprobados > 8 ) cout << "Aumentar inscripciones * << endl; return 0;
// terminación exitosa
} // fin de la función main
Introduzca resultado Introduzca resultado Introduzca resultado Introduzca resultado Introduzca resultado Introduzca resultado Introduzca resultado Introduzca resultado Introduzca resultado Introduzca resultado Aprobados 6 Reprobados 4 Figura 2.11
(1 (1 (1 (1 (1 (1 (1 (1 (1 (1
■ ■ ■ ■ ■ -
aprobado. aprobado. aprobado. aprobado. aprobado. aprobado. aprobado. aprobado. aprobado. aprobado.
2 2 2 2 2 2 2 2 2 2
■ ■ ■ ■ =
reprobado): reprobado): reprobado): reprobado): reprobado): reprobado): reprobado): reprobado): reprobado): reprobado):
l 2 2 1 1 1 2 1 1 2
Estructuras de control anidadas: problema de resultados de exámenes. (Parte 2 de 3.)
http://alexyniorlls.blogspot.com 153 of 1380.
98
Estructuras d© control
Capítulo 2
Introduzca resultado (1 Introduzca resultado (1 Introduzca resultado (1 Introduzca resultado (1 Introduzca resultado (1 Introduzca resultado (1 Introduzca resultado (1 Introduzca resultado <1 Introduzca resultado (1 Introduzca resultado (1 Aprobados 9 Reprobados 1 Aumentar inscripciones R gu ra 2.1 1
-
aprobado. aprobado. aprobado. aprobado. aprobado. aprobado. aprobado. aprobado. aprobado. aprobado.
2 2 2 2 2 2 2 2 2 2
■ ■ -
reprobado)i reprobado): reprobado)t reprobado): reprobado) i reprobado): reprobado) i reprobado): reprobado)x reprobado):
1 1 1 1 2 1 1 1 1 1
Estructuras d e control anidadas: problema d e resultados d e exámenes. (Parte 3 d e 3.)
O bserve la estructura i f / e l s © de las lín eas 26 a 30 que está anidada en la estructura w h i l e (lín ea s 19-35). El resto del programa utiliza co n cep to s q u e ya presentam os en lo s programas d e la figura 2.7 y 2.9.
B B
Buena práctica de programación 2.8
Inicializar variables locales cuando se declaran dentro de las funciones ayuda a editar errores ocasio nados por datos no inicializados.
Observación de ingeniería de software 2.6
l a experiencia muestra que la parte más difícil al resolver un problema en una computadora es el de sarrollo de algoritmos para su solución. Una vez que se especifica un algoritmo correcto, el proceso para producir un programa funcional en C++, a partir de un algoritmo, a menudo es muy sencillo.
Observación de ingeniería de software 2.7 Muchos programadores experimentados escriben prognmuis sin utilizar herramientas de desarrollo de programas como el seudocódigo. Estos programadores sienten que su meta final es resolver el proble ma en una computadora y que el escribir seudocódigo sólo retarda la producción del resultado final. Aunque este método pudiera funcionar partí problemas sencillos y conocidos, a la larga podría provo car errores graves en proyectos grandes y complejos.
2.11 Operadores de asignación C + + proporciona diversos operadores de asignación (figura 2 .1 2 ) para abreviar las exp resio n es de asign ación. Por ejem plo, la instrucción:
c - c ♦ 3; p uede abreviarse co n el opera d o r de asignación de sum a ♦ - com o: c
3;
E l operador sum a el valor d e la expresión a la derecha del operador con el valor d e la variable a la izquierda del operador, y alm acena el resultado en la variable a la izquierda d el operador. C ual quier instrucción d e la forma:
variable ■ \uriable operador expresión;
http://alexyniorlls.blogspot.com 154 of 1380.
Estructuras do control
Capitulo 2
Operador de asignación
Suponga que: i n t c -
— /Hgura 2.12
Expresión de ejemplo
3, d ■ 5 , e c +d — e *■ f /g
Explicación
■ 4 , £ ■ 6, g -
12
99
Asigna
;
7
C ■ C ♦ 7
10 a c
4 5
d -
3 9
f - f / 3 g - g * 9
1 ad 20 a e 2a £ 3ag
d -
4 e - e * 5
Operadores aritméticos d e asignación.
en la que aparece la m ism a variable en am bos lados del operador d e asign ación, y el operador es uno d e lo s operadores binarios o % (u otros que explicarem os m ás adelante en el libro), se pueden escribir de esta manera
variable operador - expresión/ A sí, la asign ación c + - 3 sum a 3 a c. La figura 2 .1 2 muestra lo s operadores aritm éticos de a sig nación, exp resion es que ejem plifican el u so d e esto s operadores y su s exp licacion es.
Tip de rendimiento 2.3 lo s programado res pueden escribir programas un poco más rápido y los compiladores pueden compi lar los programas un poco más rápido cuando se utilizan los operadores de asignación “abreviados ". Algunos compiladores generan código que se ejecuta más rápidamente cuando se utilizan operadores de asignación “abreviados
Tip de rendimiento 2.4 Muchos de los tips de rendimiento a los que nos referimos en el libro dan como resultado mejoras nomi nales, de manera que el lector puede estar tentado a ignorarlos. Cuando se hace una mejora nominal sobre código que se ejecuta muchas veces dentro de un ciclo, a menudo ocurre una mejora importan te al rendimiento.
2.12 Operadores de incremento y decrem ento A dem ás de lo s operadores aritm éticos de asign ación , C + + proporciona el operador unario de incre m ento ++ y el opera d o r unario d e decrem ento — , lo s cu a les se resum en en la figura 2.13. Si una variable c se increm enta en 1, se puede utilizar el operador de increm ento +■*■, en lugar de las exp re sio n es c ■ c ♦ l o e +■ 1. Si un operador d e increm ento o decrem ento se co lo ca antes de una variable, se le llam a preincrem ento u op erador de predecrem ento, respectivam ente. Si un operador de increm ento o decrem ento se co lo ca d esp u és d e una variable, se le llam a posincrem ento u opera d o r de posdecrem ento , respectivam ente. Preincrem entar (o prcdccrcmentar) una variable ocasiona que la variable se increm ente (o dism inuya) en 1; d esp u és de e s o , el nuevo valor d e la variables se utiliza en la expresión en la que aparece. Posincrem entar (o posdecrem entar) una variable ocasiona que el valor actual d e la variable se u tilice en la expresión en la que aparece; y desp ués, el valor de la variables se increm enta (o decrem enta) e n l . :2
2. Por ahora, solamente podemos utilizar un nombre de variable sencillo como el operando de un operador de incre mento o decremento. Más adelante veremos que estos operadores se pueden utilizar dentro de los también llama dos ¡valúes.
http://alexyniorlls.blogspot.com 155 of 1380.
100
Capítulo 2
Estructuras do control
Operador
Uamado
Expresión de ejemplo
Explicación
♦♦
preincremento
♦♦a
Incrementa a en 1. posteriormente utiliza el nuevo valor de a en la expresión en donde reside. Utiliza el valor actual de a en la expresión en la que reside, y posteriormente incrementa a en 1.
posincremento
--
predecremento
--b
Decrementa b en 1,posteriormente utiliza el valor de b en la expresión en la que reside.
pos decrcmento
b—
Utiliza el valor actual de b en la expresión en la que reside, posteriormente disminuye b en 1.
"
Rgura 2.13
Operadores d e Incremento y decrem ento.
La figura 2.14 demuestra la diferencia entre la versión de prcincrcmcnto y la versión de posincrcm ento del operador ♦ + . El posincrementar la variable c ocasiona que ésta se increm ente después de que se utiliza en la instrucción de salida. El preincrementar la variable c ocasiona que ésta se incre mente antes de que se utilice en la instrucción d e salida. El programa despliega el valor de c antes y después de que se utiliza el operador ++. El operador de decrem ento ( — ) trabaja de manera similar.
1 2 3
// Pig. 2.14: fig02_14.cpp // Preincremento y posincremento . •ineluda
A# 4
5 6
using std::cout; using std::endl;
7 8
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
// la función main comienza la ejecución del programa int main() < int c; // declara la variable // demuestra el posincremento c - 5/ // cout << c << endl; // cout << c+«- << endl; // cout << c << endl << endl; //
asigna 5 a c despliega 5 despliega 5 y después posincrementa despliega 6
// demuestra el preincremento c - 5; // asigna 5 a c cout << c << endl; // despliega 5 cout << ++c << endl; // preincrementa y después despliega 6 cout << c << endl; // despliega 6 return 0;
// indica que el programa terminó satisfactoriamente
> // fin de la función main
Rgura 2.14
Prelncremento y poslncremento. (Parte 1 de 2.)
http://alexyniorlls.blogspot.com 156 of 1380.
Estructuras de control
Capitulo 2
101
5 5 6
5 6
6
figura 2.14
Preincremento y posincremento. (Parte 2 d e 2.)
Buena práctica de programación 2.9 Los operadores uruirios deben colocarse a continuación de sus operandos, sin espacios intermedios. Las tres instrucciones de asign ación de la figura 2.11
aprobados - aprobados ♦ 1; reprobados ■ reprobados + 1; contadorEstudiantes - contadorEstudiantes + 1; pueden escribirse d e manera más con cisa con los operadores d e asignación co m o
aprobados ♦■ 1; reprobados ♦■ 1; contadorEstudiantes ♦- 1; con lo s operadores d e preincrem ento com o
♦♦aprobados; ♦♦reprobados; ♦♦contadorEstudiantes; o
con lo s operadores de posincrem ento com o
aprobados^; reprobados♦♦; contadorEstud1antes♦♦; O bserve que, cuando ocurre e l increm ento (+ + ) o el decrem ento ( — ) d e una variable en una instrucción por s í m ism a, las form as de prcincrcm cnto y p osincrem ento tienen el m ism o efecto , y las formas d e predecrementó y posdecrem ento tienen el m ism o efecto. E s só lo cuando la variable aparece en e l contexto de una expresión m ás grande que el preincrcm ento d e una variable y el posincrem cnto de una variable tienen diferentes efectos (y de manera sim ilar para el predccrem ento y el p osde crem ento).
Error común do programación 2.11 Intentar utilizar el operador de incremento o decremento en una expresión que no sea un nombre de variable sencilla por ejemplo + * ( x ♦ 1 ) , es un error de sintaxis.
Tip do rendimiento 2.5 F.l preincremento y el predecremento operan l i gercúnente más rápido que el posincremento y el posde cremento. La figura 2.15 m uestra la precedencia y la asociatividad de los operadores presentados hasta e s te punto. Los operadores se muestran de arriba hacia abajo, en orden decreciente de precedencia. La
http://alexyniorlls.blogspot.com 157 of 1380.
102
Capítulo 2
Estructuras do control
Operadores
Asociatividad
Tipo
O
izquierda a derecha
paréntesis
—
static_cast ()
izquierda a derecha
unario
—
♦
derecha a izquierda
unan o
*
/
*
izquierda a derecha
multiplicación
♦
-
izquierda a derecha
de adición
«
>>
izquierda a derecha
inserci ón/cxt raed ón
<
<- > 1-
izquierda a derecha
de relación
izquierda a derecha
igualdad
derecha a izquierda
de condición
derecha a izquierda
asignación
-?: -
>-
♦- —
Figura 2.15
*-
/-
Precedencia de los operadores explicados hasta este punto.
segunda colum na describe la asociatividad de lo s operadores en cada nivel de precedencia. Observe que el operador con d icion al ( ? : ) , lo s operadores unarios de posincrem ento ( + + ), posdecrem ento ( - - ) , sum a ( ♦ ) , resta ( - ) y con version es d e tipo, y lo s operadores d e asign ación ♦ ■ , - - , * ■ , / • y %m s e asocian de derecha a izquierda. Todos lo s d em ás operadores d e la tabla de precedencia que apa rece en la figura 2.15 se asocian d e izquierda a derecha. La tercera colum na señala lo s d istintos tipos d e operadores.
2.13 Fundamentos de la repetición controlada por un contador La repetición controlada por un contador requiere de lo siguiente: 1. e l nom bre de una variable d e control (o contador de ciclo ); 2. el valor in icial de una variable de control; 3. la con d ición que evalúa e l va lo r fin a l de la variable de control (e s decir, si el c ic lo debe co n tinuar); 4. el increm ento (o decrem ento) m ediante el cual s e m odifica la variable d e control cada vez que s e repite e l ciclo . C onsidere el sen cillo programa de la figura 2 .1 6 , e l cual despliega lo s núm eros del I al 1 0 . 1.a instrucción de la línea 11 nom bra a la variable de control (contador), la declara co m o entero, re serva esp acio para ella en m em oria y le asign a un valor inicial 1 . L as declaraciones que requieren in icialización son, en efecto, instrucciones ejecutables. En C + + , e s m ás preciso lla m a ra una d ecla ración q u e adem ás reserva m em oria, com o lo hacen las declaraciones anteriores, una definición. La declaración e in icialización de contador podría estar acom pañada tam bién de las instruc cio n es
int contador; contador - 1; U tilizam os am bos m étodos para inicial izar variables.
http://alexyniorlls.blogspot.com 158 of 1380.
Estructuras de control
Capitulo 2
1 2 3 4 5 6
103
// Fig. 2.16: fig02_16.cpp // Repetición controlada por un contador. linclude uaing atdiicout; uaing atdiiendl;
7
8 9 10 11 12 13 14 15 16 17 18 19
/ / l a función main comienza la ejecución del programa int main() { int contador - 1; // inicialización while ( contador <« 10 ) { cout << contador << endl; ♦♦contador;
// condición de la repetición // desplegar contador // incremento
} // fin de while return 0;
// indica. terminación exitosa
20 21
} // fin de la función main
La línea 15 increm enta el contador del c ic lo en 1, cada v ez que se ejecuta el ciclo . La condición de continuidad d el c ic lo (lín ea 31) en la estructura while, determ ina si el valor d e la variable de control es m enor o igual que 1 0 (el últim o valor para el cual la con d ición e s verdadera). Obser ve que el cuerpo d e esta estructura while s e ejecuta aun cuando la variable de control es 1 0 . El c ic lo termina cuando la variable d e control e s m ayor que 1 0 (es decir, contador es igual que 1 1 ). La figura 2 .1 6 se puede hacer m ás con cisa m ediante la in icialización d e contador a 0 y el reem plazo d e la estructura while con
while ( ♦♦contador <- 10 ) cout << contador << endl; Este có d ig o ahorra una línea, debido a que el increm ento se realiza de manera directa en la condición de while, antes de que se evalúe la condición. A dem ás, este có d ig o elim ina las llaves alrededor del cuerpo de while, debido a q u e ahora while co n tien e só lo una instrucción. Escribir có d ig o d e m a nera tan condensada requiere a lg o de práctica y puede hacer que lo s program as sean m ás d ifíc ile s de leer, depurar, m odificar y mantener.
http://alexyniorlls.blogspot.com 159 of 1380.
104
Estructuras do control
Capítulo 2
Error común de programación 2.12 Los valores de punto flotante son aproximados, de manera que controlar los contadores de ciclos median te variables de punto flotante puede dar como resultado valores imprecisos del contador y evaluaciones incorrectas para la terminación.
Tip para prueba y depuración 2.3 Controle los ciclos con un contador con valores enteros.
Buena práctica de programación 2.10 Coloque sangría en las instrucciones del cuerpo de cada estructura de control.
Buena práctica de programación 2.11 Coloque una línea en blanco antes y después de cada estructura de control, para hacer que resalten en el programa.
Buena práctica de programación 2.12 Demasiados niveles de anudamiento pueden hacer menos comprensible un programa. Como regla gene ral. intente evitar el uso de más de tres niveles de sangrado.
Buena práctica de programación 2.13 lo s espacios verticales arriba y debajo de las estructuras de control, y el sangrado de los cuerpos de las estructuras de control dentro de los encabezados de dichas estructuras, le dan a los programas una apariencia en dos dimensiones que mejora en gran medida su claridad.
2.14 Estructura de repetición f o r L a estructura d e repetición f o r m aneja todos lo s d etalles d e una repetición controlada por un co n tador. Para mostrar el poder d e for, perm ítanos rescribir el programa de la figura 2.16. El resulta d o se muestra en la figura 2.1 7 .
1 2 3 4
// Fig. 2.17: fig02_17.cpp // Repetición controlada por un contador mediante la estructura for. finelude
5
using std::cout;
6 7 8 9
using std:rendí;
10
11 12 13 14 15 16 17 18 19
// la función main comienza la ejecución del programa int main() {
// La inicialización, la condición de repetición y el incremento / / s e incluyen en el encabezado de la estructura for. for ( int contador - 1; contador <- 10; contador** ) cout << contador << endl; return 0;
// indica terminación exitosa
} // fin de la función main
Rgura 2.17
Repetición controlada por un contador mediante la estructura f o r . (Parte 1 de 2.)
http://alexyniorlls.blogspot.com 160 of 1380.
Estructuras de control
Capitulo 2
Figura 2.17
105
R ep etició n co n tro lad a por un co n tad o r m ed ian te la estructura f or. (P arte 2 d e 2.)
C uando com ien za la ejecu ción de la estructura f or, la variable d e control contador se d ecla ra y se in icializa en 1. E ntonces, se evalúa la con d ición de continuidad del c ic lo contador < - 1 0 . El valor inicial d e contador es 1, de manera q u e se satisface la co n d ición y la instrucción e n el cuerpo d esp liega el valor de contador, esto es, 1. E ntonces, la expresión contador* * increm en ta la variable de control contador y el c ic lo com ien za d e nuevo co n la co n d ición d e continuidad del ciclo . Ahora, la variable de control es igual a 2. a sí, no s e ha ex ced id o e l valor final y el progra ma realiza d e nuevo la instrucción del cuerpo. Este proceso continúa hasta que la variable de control contador se increm enta a 11, esto ocasionará que la con d ición de continuidad del c ic lo falle y ter m ine la repetición. El programa continúa co n la ejecu ción de la primera instrucción d esp u és de la estructura f or (en este caso, la instrucción return de la línea 17). La figura 2.18 hecha un vistazo m ás cercano a la estructura for de la figura 2.17. O bserve que la estructura "lo hace todo”, e s decir, esp ecifica cada uno de lo s elem en to s necesarios para la repe tición controlada por un contador m ediante una variable de control. Si hay m ás de una instrucción en el cuerpo de f or, se requieren llaves para encerrar el cuerpo d el ciclo . O bserve q u e la figura 2.17 utiliza una con d ición d e continuidad d el c ic lo contador <- 10. Si el programador escribió d e manera incorrecta contador < 10, en ton ces e l c ic lo se ejecutará solam en te 9 veces. Éste es un error ló g ic o frecuente d enom inado error p o r desplazam iento en uno.
Error común de programación 2.13 Utilizar un operador de relación incorrecto o usar un valor finid incorrecto en un contador de ciclo, dentro de la condición de un nrhilm o un for puede ocasionar errores por desplazamiento en uno.
Palabra reservada for
Nombre de la variable de control
Separador punto y com a necesario
Valor final de la variable de control para la cual la condición es verdadera
for ( int contador -
Voíor inicial de la variable de control
Hgura 2.18
Separador punto y com a necesario
contador** )
Condición de con tinuidad del ciclo
C o m p o n e n te s d e l e n c a b e z a d o d e la e stru ctu ra for.
http://alexyniorlls.blogspot.com 161 of 1380.
heremento de la variable de control
106
Estructuras do control
Capítulo 2
Buena práctica de programación 2.14 Utilizar el valor final en la condición de una estructura w h ilm o f o r y utilizar el operador de rela ción <■ ayuda a evitar los errores por desplazamiento en uno. Por ejemplo, en un ciclo que despliega los valores del I al 10. la condición de continuidad del ciclo debería ser c o n t a d o r <• 10, en lu gar de c o n t a d o r < 1 0 (lo cual es un error por desplazamiento en uno) o c o n t a d o r < 11 (lo cual, sin embargo, no es correcto). Muchos programadores prefieren lo que se denomina contador basado en cero, en el cual, para contar 10 repeticiones, el c o n t a d o r debe inicializarse a cero y la ev aluación de continuidad del ciclo sería c o n t a d o r < 1 0 . F1 form ato general para la estructura f o r es
for ( inicializacióm condición_continuidad ; incremento ) instrucción en donde la expresión inicialización estab lece el valor inicial de la variable de control, condiciónc o n tin u id a d es la con d ición que determ ina si el c ic lo debe continuar su ejecución (esta con d ición con tien e el valor final de la variable de control para la cual la condición es verdadera) c incremento au menta el valor de la variable. En la m ayoría de lo s c a so s, la estructura f o r se puede representar m e diante un equivalente en la estructura w h i l e , d e la sigu iente manera:
inicializacióm
whil« ( condición continuidad ) < instrucción incrementos E xiste una excep ción para esta regla, la cual explicarem os en la sección 2.18. Si la expresión de inicialización en el encabezado d e la estructura f o r declara la variable de co n trol (es decir, el tipo de la variable de control se especifica antes del nombre de la variable), la variable de control solam ente se puede utilizar dentro del cuerpo d e la estructura f o r ; la variable d e control s e rá desconocida fuera d e la estructura f o r . A este uso restringido del nombre d e la variable de control se le con oce co m o alcance de la variable. El alcance d e una variable especifica en dónde se puede uti lizar dentro de un programa. En el capítulo 3, “Funciones” , exp licam os con detalle dicho alcance.
Error común de programación 2.14 Cuando se define la variable de control de una estructura f o r en la sección de inicialización del en cabezado de la estructura f o r . utilizar dicha variable fuera del cuerpo de la estructura es un error de sintaxis.
Tip de potabilidad 2.2 En el estándar de C++, el ale (mee de las variables de control que se declaran en la sección de ini cialización de una estructura f o r , difiere del alcance en los compiladores antiguos de C++. En los compiladores prev ios al estándar, el alcance de una variable de control no termina al final del bloque definido por el cuerpo de la estructura f o r ; en lugar de eso, el alcance termina al final del blo que que encierra a la estructura f o r . El código C+ + que se creó en los compiladores previos al es tándar puede fallar cuando se compila en compiladores que cumplen con el estándar. Si usted trabaja con compiladores prev ios al estárular y desea asegurarse de que su código funcionará en compilado res que cumplen con el estándar, existen dos estrategias defensivas de programación que se pueden utilizar para prevenir este problema: declare las variables de control con nombres diferentes en cada estructura f o r , o, si usted prefiere utilizar el mismo nombre para distintas variables de control en di versas estructuras f o r , defina la variable de control antes de la primera estructura f o r . C om o verem os, las exp resion es de inicialización e increm ento pueden ser listas d e expresiones separadas por com as. Las co m a s, com o s e utilizan en estas expresiones, son operadores com a, el cual garantiza que las listas d e exp resion es se evalúan d e izquierda a derecha. El operador com a tiene
http://alexyniorlls.blogspot.com 162 of 1380.
Estructuras de control
Capitulo 2
107
el nivel de precedencia m ás bajo de todos los operadores. El valor y tipo de una lista d e exp resion es separada por com as es el valor y el tipo de la expresión m ás a la derecha de la lista d e expresiones. A m enudo, el operador com a s e utiliza en estructuras f or. Su principal a p licación es permitir al pro gram ador utilizar m últiples exp resion es d e in icia li/a ció n y /o m últip les exp resion es d e increm ento. Por ejem plo, puede haber distintas variables d e control en una so la estructura for que se deben in icia liz a re incrementar.
Buena práctica de programación 2.15 Dentro de las secciones de inicialización e incremento, cloque solamente expresiones relacionadas con ¡as variables de control. La manipulación de otro tipo de variables debe aparecer ya sea antes del ciclo (si se deben ejecutar sólo una vez como las instrucciones de inicialización), o dentro del cuerpo del ci clo (si se deben ejecutar una vez por repetición, como las instrucciones de incremento y decrcmento). Las tres exp resion es en el en cab ezado d e la estructura for son opcionales. Si se om ite condic ió n jco n tin u id a d , C + + asum e que la con d ición de continuidad del c ic lo es verdadera, y con esto , un c ic lo infinito. Se puede om itir la expresión de inicialización si la variable de control se inicializó an teriorm ente en el programa. S e puede om itir la expresión d e increm ento si el increm ento se calcu la en las instrucciones dentro del cuerpo d e for, o si no se requiere increm ento alguno. La expresión de increm ento en la estructura for actúa co m o una instrucción independiente al final del cuerpo de
for. Por lo tanto, las exp resion es contador - contador ♦ 1 contador ♦- 1 ♦♦contador contadora+ son equivalentes co m o increm ento en la estructura for. M uchos program adores prefieren conta d o r a d eb ido a que lo s c ic lo s for evalúan la expresión de increm ento desp ués de que se ejecuta el cuerpo del ciclo . Por lo tanto, la form a de posincrem ento parece ser la m ás natural. L a variable que se increm enta aquí n o aparece en exp resio n es m ás grandes, d e m anera que tanto el preincrcm ento com o el posincrem ento tiene, de hecho, el m ism o efecto . L o s d o s puntos y com a de la estructura for son obligatorios.
Error común de programación 2.15 Utilizar comas en lugar de los dos puntos y comas requeridos dentro del encabezado de í o r es un error de sintaxis.
Error común de programación 2.16 El colocar un punto y coma inmediatamente a la derecha del paréntesis de un encabezado de f o r , con d ene al cuerpo de dicha estructura en una instrucción vacía. Por lo general, éste es un error lógico.
Observación de ingeniería de software 2.8 En ocasiones, colocar un punto y coma inmediatamente después del encabezado de f o r se utiliza para crear un ciclo llamado ciclo de retardo. Dicho ciclo f o r con un cuerpo sacio también se ejecuta el nú mero indicado de veces, sin hacer otra cosa que contar. Por ejemplo, usted puede utilizar un ciclo de retardo para hacer más lento un programa que produce salidas en la pantalla demasiado rápido para que usted las vea. Las exp resion es d e inicialización , de con d ición d e continuación de flujo y d e increm ento d e una estructura f o r pueden contener exp resion es aritm éticas. P or ejem p lo, su pon ga que x ■ 2 y y 1 0 . Si x y y no s e m odifican en el cuerpo d el c ic lo , la instrucción
for ( int j ■ x; j < - 4 # x * y ; j + - y / x ) es equivalente a la instrucción
for ( int j - 2; j <- 80/ j +- 5 )
http://alexyniorlls.blogspot.com 163 of 1380.
108
Estructuras do control
Capítulo 2
El “increm ento” de una estructura for p uede ser negativo, en cu y o ca so , sería en realidad un d ecrcm ento y el c ic lo en realidad contaría hacia atrás (co m o lo m uestra la secció n 2 .15). Si la con d ición de continuidad d el c ic lo e s in icialm en te falsa, e l cuerpo de la estructura for no s e realiza. En su lugar, la ejecu ción procede con la sigu ien te instrucción f or. C on frecuencia, la variable d e control se d esp lieg a o se utiliza para lo s cá lcu lo s dentro del cu er p o de una estructura f or. pero esto no es necesario. E s com ún utilizar una variable de control para controlar la repetición sin m encionarla nunca en el cuerpo d e la estructura for.
Tip para prueba y depuración 2.4 Aunque el valor de la variable de control se puede modificar en el cuerpo de un ciclo f o r . evite ha cerlo. ya que esta práctica puede provocar errores lógicos sutiles. El diagram a de actividad de la estructura for e s sim ilar al de la estructura while. La figura 2 .1 9 m uestra el diagram a d e actividad de la estructura for correspondiente a la figura 2.17. El dia gram a hace evid en te que la inicialización ocurre una v e z q u e la evaluación d e la con d ición de co n tinuidad del c ic lo se realiza la primera v ez. y que el increm ento ocurre cada vez, después d e que se ejecuta la instrucción del cuerpo. O bserve que (adem ás d e un estado inicial, las flechas de transición, fusión, estado final y m uchas notas) el diagram a con tien e solam en te estados d e acción y una d eci sión. Im agine, de nuevo, que el programador tien e un recipiente con estructuras for vacías, tantas co m o sean necesarias para formar una im plcm entación estructurada d e un algoritm o. El progra m ador rellena lo s estad os de acción y lo s sím b olos de d ecisió n m ediante exp resion es de a cció n y con d icio n es d e guardia apropiadas para el algoritm o.
Determina si se alcanzo el valor final de una variable de control
Rgura 2.19
Diagrama d e actividad d e la estructura d e repetición for.
http://alexyniorlls.blogspot.com 164 of 1380.
Estructuras de control
Capitulo 2
2.15
109
Ejemplos de la utilización de la estructura f o r
L os sigu ien te ejem p los muestran los m étodos para m odificar las variables d e control en la estructu ra f o r . En cada caso, escribim os el en cab ezado apropiado de la estructura f o r . O bserve el cam b io en el operador d e relación para ciclo s que dism inuyen la variable d e control. a)
M od ifiq ue la variable de control d e 1 a 1 0 0 en increm entos de 1.
for ( int i - 1; i <- 100; i++ ) b)
M odifique la variable de control d e 1 0 0 a 1 en increm entos de - 1 (decrem entos d e 1 ).
for ( int i - 100; i >■ 1; i— c)
)
M odifique la variable de control d e 7 a 7 7 en pasos d e 7 .
for ( int i - 7; i <- 77; i ♦- 7 ) d)
M odifique la variable de control d e 2 0 a 2 en pasos d e - 2 .
for ( int i - 20; i >- 2; i — e)
2 )
M odifique la variable de control en la sigu ien te secu en cia d e valores: 2 , 5 . 8 . 1 1 , 1 4 , 1 7 ,
20. for ( int j - 2; j <- 2 0 ; j +- 3 ) 0
M odifique la variable d e control en la sigu iente secu en cia de valores: 9 9 , 8 8 , 7 7 , 6 6 , 5 5 , 4 4 . 3 3 , 2 2 , 1 1 , 0.
for ( int j - 99; j >■ 0 ; j -- 1 1 )
Error común de programación 2.17 No utilizar el operador de relación apropiado en la condición de continuidad de un ciclo que cuenta hacia atrás (tal como el uso incorrecto de i <■ 1 en un ciclo que disminuye hacia 1), por lo genemi es un error lógico que arrojará resultados erróneos durante la ejecución de un programa. L os dos sigu ien tes ejem p los proporcionan ap lica cio n es sen cillas para la estructura for. El pro grama d e la figura 2 .2 0 u tiliza la estructura for para sum ar todos los en teros pares d el 2 al 100. Cada iteración del c ic lo (lín ea s 14-15) sum a el valor actual d e la variable de control numero a la variable suma.
1 2 3 4 5 6
// Fig. 2.20: fig02_20.cpp // Sumatoria mediante for. finclude uaing std::cout; uaing atd::endl;
7
8 9 10
// la función main comienza la ejecución del programa int main() (
Figura 2.20
Sumatoria mediante f o r . (Parte 1 de 2.)
http://alexyniorlls.blogspot.com 165 of 1380.
110
Capítulo 2
int suma - 0;
// inicializa suma
0
u
// suma enteros pares desde 2 hasta 100 for ( int nximero • 2; <» 100; nxunero ♦- 2 ) suma ♦- numero; // suma número a suma
1
11 12 13 14 15 16 17 18 19 20
Estructuras do control
cout << "La suma es * << suma << endl; return 0;
// despliega la suma // terminación exitosa
) // fin de la función main
La suma es 2550 R gura 2.20
Sumatoria m ediante f or (Parte 2 d e 2.)
O bserve que el cuerpo de la estructura f or en la figura 2 .2 0 en realidad se podría fusionar den tro d e la parte que se encuentra más a la derecha del encabezado de f or. m ediante el u so d el o p e rador com a, d e la sigu ien te manera:
for ( int numero ■ 2 ; numero <- 100; exima ♦- numero, numero ; // cuerpo vacío
2 )
// inicialización // condición da continuidad // total e incremento
Buena práctica de programación 2.16 Aunque las instrucciones que preceden a f o r y las instrucciones del cuerpo de un f o r a menudo se pueden fusionar dentro de un encabezado f o r , hacer eso ocasiona que el programa sea más difícil de leer, mantener, modificar y corregir.
Buena práctica de programación 2.17 Limite el tamaño de los encabezados de estructura a una sola línea, si es posible. El sigu iente ejem p lo calcu la el interés com p uesto m ediante la estructura for. C onsidere el si gu ien te enunciado del problema:
Una persona invierte $1000.00 en una cuenta de ahorros con un 5% de interés. Se asume que todo el interés se deja en depósito dentro de la cuenta, calcule y despliegue el monto acumulado de la cuenta al final de cada año durante 10 años. Utilice la siguiente fórmula para determinar estos montos: a = p ( 1+ r)" donde: p es el monto de la inversión original (es decir, la inversión principal), r es la tasa de interés anual, n es el número de años y a es el monto del depósito, al final del año n. Este problema involucra un ciclo que realiza el cá lcu lo indicado para cada uno d e lo s 10 años en lo s que el dinero perm anece en depósito. La so lu ció n aparece en la figura 2.21. La estructura for (lín ea s 3 1 -4 0 ) ejecuta e l cuerpo 10 v eces, al m odificar la variable d e control d e 1 a 10, en increm entos de 1. C ++ no incluye un operador d e exponenciación, d e manera que utili zam os la funció n d e la biblioteca estándar p o w ( línea 34) para este propósito. La función pow (x, y) calcula el valor de x elevado a una potencia y. En este ejem plo, la expresión algebraica (1 + r)" se e s
http://alexyniorlls.blogspot.com 166 of 1380.
Estructuras de control
Capitulo 2
111
cribe com o p o w ( 1 . 0 + t a s a , a n i o ) . donde la variable t a s a representa a r y la variable a n i o re presenta a n. La función p o w tom a dos argumentos d e tipo d o u b l e y regresa un valor d o u b l e . E ste programa no s e podrá com pilar si no se incluye e l archivo d e encabezado (línea 15). La función pow requiere d o s argum entos double. O b serve que anio es un entero. El en ca bezado 3 incluye inform ación q u e le indica al com pilador que convierta el valor de anio a una representación temporal double, antes de llamar a la función. Esta inform ación se encuentra alm acenada en el prototipo de la fu n c ió n pow. En e l capítulo 3 exp lica m o s lo s prototipos de función. A dem ás, el capítulo 3 proporciona un resum en de otras b ibliotecas de fu n cion es m atem áticas.
Error común do programación 2.18 En general, olvidar incluir el archivo de encabezado apropiado cuando se emplean funciones de la biblioteca estándar (por ejemplo. dentro de un programa que utiliza funciones de la biblioteca de funciones matemáticas) es un error de sintaxis.
1 2 3
// Fig. 2.21* fig02_21.cpp // Cálculo del interés compuesto. •inelude
A
5 6 7 8 o 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
using uaing uaing uaing
std::cout; atd:tendí; atdttioa; atdttfixed;
•inelude uaing atd::aetw; uaing atd::aetpreciaion; •inelude
// permite al programa utilizar la función pow
// la función main comienza la int main() { double monto; double principal - 1000.0; double tasa - .05;
ejecución del programa
// monto del depósito // monto principal (al inicio) // tasa de interés
// deapliega encabezados de las columnas de la tabla cout << «Anio" << setv( 21 ) << "Monto del depósito" << andl;
R gura 2.21
Cálculo del Interés com puesto mediante for. (Parte 1 d e 2.)
3. Todas las funciones de la biblioteca estándar de C++ son parte del espacio de nombre Btd. Por esta razón, la fi
gura 2.21 debe incluir una instrucción uaing para la función pow. Una parte de la biblioteca estándar de C++ consiste en funciones, tales como pow. que C++ absorbió del lenguaje de programación C. Algunos compiladores no compilarán las instrucciones uaing para esas funciones. Sin embargo, la mayoría de los compiladores compi larán programas que no proporcionan instrucciones uaing para dichas funciones. Para permitir esta característi ca en un mayor número de compiladores, no proporcionamos la instrucción uaing para funciones de bibliotecas de C. Otra manera de corregir este problema sería utilizar el archivo de encabezado a la antigua usanza en C