961
www.FreeLibros.me

Resolucion de Problemas con C++winuxnet.com/ArchivosPDF/PDFaSubir/Resolucion_waltersav...Prepress and Manufacturing Caroline Fell Este libro está diseñado para utilizarse en un primer

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

  • www.FreeLibros.me

  • Resoluciónde problemascon C++Quinta edición

    Walter Savitch

    Traducción:Alfonso Vidal Romero Elizondo

    Ingeniero en computaciónTecnológico de Monterrey, Campus Monterrey

    Ana María Montañez Carrillo

    Licenciada en Informática

    Revisión técnica:Fabiola Ocampo Botello

    Escuela Superior de CómputoInstituto Politécnico Nacional, México

    Roberto De Luna Caballero

    Escuela Superior de CómputoInstituto Politécnico Nacional, México

    www.FreeLibros.me

  • Authorized translation from the English language edition, entitled Problem solving with C++, Fif th Edition by Walter Savitch, publishedby Pearson Education, Inc., publishing as ADDISON WESLEY, Copyright ©2005. All rights reserved.

    ISBN 0321268652

    Traducción autorizada de la edición en idioma inglés, titulada Problem solving with C++, Fif th Edition por Walter Savitch, publicada porPearson Education, Inc., publicada como ADDISON WESLEY, Copyright ©2005. Todos los derechos reservados.

    Esta edición en español es la única autorizada.

    Edición en español:Editor: Pablo Miguel Guerrero Rosas

    e-mail: [email protected] de desarrollo: Bernardino Gutiérrez HernándezSupervisor de producción: Adriana Rida Montes

    Edición en inglés:

    QUINTA EDICIÓN, 2007

    D.R. © 2007 por Pearson Educación de México, S.A. de C.V. Atlacomulco 500-5o. pisoIndustrial Atoto53519, Naucalpan de Juárez, Edo. de MéxicoE-mail: [email protected]

    Cámara Nacional de la Industria Editorial Mexicana. Reg. Núm. 1031.

    Prentice 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 sistemade recuperación de información, en ninguna forma ni por ningún medio, sea electrónico, mecánico, fotoquímico, magnético o electroóp-tico, 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 repre-sentantes.

    ISBN 10: 970-26-0806-6

    ISBN 13: 978-970-26-0806-6

    Impreso en México. Printed in Mexico.

    1 2 3 4 5 6 7 8 9 0 - 09 08 07 06

    Managing Editor Patty MahtaniExecutive Editor Susan Hartman SullivanAssistant Editor Elizabeth PaquinProduction Supervisor Marilyn LloydMarketing Manager Michelle BrownProduction Services Argosy PublishingComposition and Art Argosy Publishing

    Copy Editor Nancy KotaryProofreader Kim CoferIndexer Larry SweazyText Design Alisa Andreola/Dartmouth Publishing, Inc.Cover Design Joyce Cosentino WellsCover and Interior Image ©2004 PhotodiscPrepress and Manufacturing Caroline Fell

    www.FreeLibros.me

  • Este libro está diseñado para utilizarse en un primer curso de programación o ciencias dela computación, usando el lenguaje C++. No se requiere de una experiencia previa de pro-gramación y bastan conocimientos de matemáticas a nivel de educación media.

    Si ha utilizado la edición anterior de este libro, le recomiendo que lea la siguiente sec-ción, en la que se explican los cambios en esta quinta edición; de esta manera podrá saltar-se el resto del prefacio. Si es la primera vez que usa este libro, el resto del prefacio le serámuy útil dado que presenta un panorama general.

    Cambios en la quinta ediciónEsta quinta edición presenta la misma filosofía de programación y cubre los mismos temasque la anterior edición; por lo que puede seguir impartiendo su curso sin necesidad de mo-dificaciones. Se conservó mucho del material de la cuarta edición; pero se ha rediseñado lapresentación, se han agregado proyectos de programación a cada capítulo, y también ma-terial adicional sobre estructuras de datos. Los principales temas que se agregaron fueronsobre las colas en el capítulo 15 y un capítulo completamente nuevo que trata acerca de laSTL (Biblioteca de plantillas estándar).

    Seleccione su propio orden de temasLa mayoría de los libros de texto introductorios que utilizan C++ presentan una agenda muydetallada que deben seguir los instructores al pie de la letra para usar el libro en sus cursos.En cambio, este libro se adapta a la manera en que usted enseñe, en vez de obligarlo aadaptarse al libro. Puede cambiar con facilidad el orden en el que deben cubrirse los capí-tulos sin pérdida de continuidad. Al final de este prefacio aparece un diagrama de dependen-cias, el cual le proporciona un panorama general de los órdenes que pueden usarse paracubrir los capítulos y las secciones; además, cada capítulo tiene una sección titulada “Pre-rrequisitos” en la que se explica qué partes del libro deben cubrirse antes de estudiar esasección del capítulo. Esto permite a los instructores modificar con facilidad el orden en elque se deben cubrir los capítulos, o incluso las secciones.

    Aunque este libro utilice bibliotecas y enseñe a los estudiantes la importancia de ellas,no se requieren otras que no sean las estándar. Este libro utiliza sólo bibliotecas que se pro-porcionan con la mayoría de las implementaciones de C++.

    Introducción anticipada de clasesEste libro permite una cobertura flexible de las clases. Puede cubrirlas al principio del cur-so, o casi al final.

    Existen por lo menos dos formas en que un libro puede introducir clases de manera anti-cipada: puede enseñar a los estudiantes cómo diseñar sus propias clases en sus primeroscapítulos, o puede enseñarles tan sólo cómo utilizarlas sin definirlas. Este libro indica a los estu-diantes cómo definir sus propias clases casi desde el principio, además de cómo usarlas. Pa-ra diseñar clases con efectividad, un estudiante necesita ciertas herramientas básicas, comolas estructuras de control simples y las definiciones de las funciones. Por ende, empieza

    iii

    iii

    Prefacio

    www.FreeLibros.me

  • a cubrir estos fundamentos en los capítulos 2, 3 y 4. Después pasa en forma inmediata alas clases. En el capítulo 5 se utilizan los flujos de E/S de archivos para decirle a los estu-diantes cómo utilizar las clases. En el capítulo 6 los estudiantes aprenden a escribir sus pro-pias clases.

    Este libro utiliza una metodología ascendente para explicar las clases. Enseña a los es-tudiantes a escribir ciertas clases bastante simples, después agrega los constructores yla sobrecarga de operadores simples, luego la sobrecarga de los operadores de E/S >,y así sucesivamente. Esta metodología evita que los estudiantes se abrumen con una largalista de construcciones y conceptos complicados. No obstante, una de las metas de este li-bro es que los estudiantes escriban definiciones de clases realistas lo más pronto posible, yque no pierdan el tiempo escribiendo clases artificiales y simples. Al final del capítulo 8 losestudiantes estarán escribiendo, en esencia, los mismos tipos de clases que necesitaráncuando terminen el curso.

    Los instructores que prefieran introducir las clases en un punto avanzado del cursopodrán reorganizar el orden de los capítulos para adaptarlos a su metodología. Esto lo ve-remos en la sección titulada “Flexibilidad en el orden de los temas”, más adelante en esteprefacio.

    En el capítulo 5 se cubre brevemente la herencia, de manera que los estudiantes pue-dan estar conscientes del concepto. Sin embargo, este libro no enseña a los estudiantescómo escribir sus propias clases derivadas sino hasta más adelante, ya que los ejemplos quetienen una fuerte motivación para la herencia y las clases derivadas no se presentan connaturalidad al principio de un primer curso. El capítulo 16 indica a los estudiantes cómodefinir y utilizar clases derivadas, incluyendo el uso de funciones virtuales. Algunos instruc-tores podrían optar por dejar ese material para un segundo curso; otros querrán integraresta cobertura de la herencia en su curso. Si lo desea, puede desplazar el material sobre he-rencia para verlo antes de los capítulos que le anteceden.

    Accesibilidad para los estudiantesNo basta con que un libro presente los temas apropiados en el orden correcto. Ni siquierabasta con que sea claro y correcto cuando lo lea el instructor o algún otro programadorexperimentado: el material debe presentarse de una forma que sea accesible para los estu-diantes principiantes. Por ser éste un texto introductorio, he puesto énfasis en escribir deuna manera clara y amigable para los estudiantes. Los reportes de los muchos estudiantesque han utilizado las ediciones anteriores de este libro confirman que este estilo es uno delos más claros, e incluso hasta divertidos, para aprender.

    Estándar ANSI/ISO de C++Esta edición es 100% compatible con compiladores que cumplan con el estándar ANSI/ISOde C++ más reciente.

    Temas avanzadosMuchos “temas avanzados” se están integrando a un curso estándar de ciencias compu-tacionales de primer semestre. Aun si no forman parte de un curso, es conveniente que esténdisponibles en el texto como material de enriquecimiento. Este libro ofrece una variedad detemas avanzados que algunos pueden integrarse en otro curso o dejarse como temas de en-riquecimiento. Proporciona una amplia cobertura de las plantillas de C++, la herencia(incluyendo las funciones virtuales), el manejo de excepciones y la STL (Biblioteca de plan-tillas estándar).

    iv Prefacio

    www.FreeLibros.me

  • Cuadros de resumenCada uno de los puntos principales se resume en una sección tipo cuadro. Estas seccionesestán distribuidas a lo largo de todos los capítulos.

    Ejercicios de autoevaluaciónCada capítulo contiene muchos ejercicios de autoevaluación en puntos estratégicos, y al fi-nal de éste se proporcionan respuestas completas para todos ellos.

    Probado en el salón de clasesCientos de miles de estudiantes han utilizado las primeras cuatro ediciones de este libro.Muchos de ellos; así como sus instructores me han proporcionado sus opiniones y comenta-rios sobre lo que les funcionó y lo que no les funcionó. La mayoría de los comentarios fueronextremadamente positivos, ya que indican que a los estudiantes y sus maestros les gustómucho el formato del libro, pero me hicieron sugerencias para ciertas modificaciones.Todas estas sugerencias se consideraron con cuidado. Esa valiosa retroalimentación se uti-lizó para revisar esta edición, de manera que se adapte a las necesidades de los estudiantesy de los instructores de una mejor manera.

    Flexibilidad en el orden de los temasEste libro se escribió de manera que los instructores tuvieran una gran flexibilidad en cuan-to a la organización del material. Para ilustrar esta flexibilidad, sugerimos varias alternati-vas de cómo presentar los temas. No hay pérdida de continuidad cuando el libro se lee encualquiera de estas maneras. Si piensa reorganizar el material, tal vez sea conveniente quemueva secciones en lugar de capítulos completos. No obstante, sólo se mueven ciertas sec-ciones grandes en ubicaciones convenientes. Para ayudarle a personalizar un orden especí-fico para las necesidades de cualquier clase, al final de este prefacio aparece un diagrama dedependencias, donde cada capítulo tiene una sección titulada “Prerrequisitos”, en la que seexplica qué capítulos hay que cubrir antes de ver cada una de las secciones del libro.

    Reorganización 1: Clases casi al finalEsta versión cubre en esencia todo un curso tradicional de ANSI C antes de cubrir el temade las clases. Lo único que es muy parecido a C++ antes de introducir las clases es el uso delos flujos para la E/S. Como la E/S de flujos requiere cierto uso de espacios de nombres ybibliotecas de clases, se integra cierta cobertura mínima acerca de cómo utilizar los es-pacios de nombres predefinidos y ciertas clases de E/S de la biblioteca estándar en losprimeros capítulos.

    Fundamentos: capítulos 1, 2, 3, 4, 5 y 7 (se omite el capítulo 6, que trata de la defini-ción de las clases). Este material cubre todas las estructuras de control, las definicio-nes de funciones y la E/S de archivos básica.

    Arreglos: capítulo 10; se omite la sección 10.4, que utiliza clases.

    Cadenas tipo C: sección 11.1.

    Apuntadores y arreglos dinámicos: capítulo 12; se omite la última sección (12.3), que cu-bre material sobre las clases.

    vPrefacio

    www.FreeLibros.me

  • Recursión: capítulo 13; se omite el ejemplo de programación sobre clases con el que ter-mina el capítulo. (De manera alternativa, se puede mover la recursión hacia un puntoposterior en el curso.)

    Estructuras y clases: capítulos 6, 8 y sección 11.2.

    Compilación por separado y espacios de nombres: capítulo 9.

    Apuntadores y listas enlazadas: capítulo 15.

    También puede utilizar cualquier subconjunto de los siguientes capítulos:

    Vectores: sección 11.3.

    Plantillas: capítulo 14.

    Herencia: capítulo 16.

    Manejo de excepciones: capítulo 17.

    Biblioteca de plantillas estándar: capítulo 18.

    Reorganización 2: Clases un poco antesEsta versión cubre todas las estructuras de control y el material básico acerca de los arreglosantes de ver las clases, pero éstas se cubren un poco antes que en la reorganización anterior.

    Fundamentos: capítulos 1, 2, 3, 4, 5 y 7 (se omite el capítulo 6, que trata de la definiciónde las clases). Este material cubre todas las estructuras de control, las definiciones defunciones y la E/S de archivos básica.

    Arreglos: capítulo 10; se omite la sección 10.4, que utiliza clases.

    Cadenas tipo C: sección 11.1.

    Estructuras y clases: capítulos 6, 8 y sección 11.2.

    Compilación por separado y espacios de nombres: capítulo 9.

    Apuntadores y arreglos dinámicos: capítulo 12.

    Recursión: capítulo 13.

    Apuntadores y listas enlazadas: capítulo 15.

    También puede utilizarse cualquier subconjunto de los siguientes capítulos:

    Vectores: sección 11.3.

    Plantillas: capítulo 14.

    Herencia: capítulo 16.

    Manejo de excepciones: capítulo 17.

    Biblioteca de plantillas estándar: capítulo 18.

    Reorganización 3: las clases un poco antes,pero se cubren todas las estructuras de controlantes de las clasesEsta reorganización es casi el orden normal del libro. Sólo necesita mover el capítulo 7 detal forma que lo cubra antes del capítulo 6.

    vi Prefacio

    www.FreeLibros.me

  • Material de apoyoEl libro cuenta con material de apoyo disponible para los usuarios de este libro, y materialadicional disponible sólo para los instructores calificados.

    Material disponible para los usuarios de este libroPara acceder a estos materiales, vaya a

    http://www.pearsoneducacion.net/savitch

    ■ Se incluyen seis meses de acceso a Codemate, de Addison Wesley, con su nuevolibro de texto.

    ■ Código fuente del libro (en inglés).

    Recursos disponibles sólo para instructores calificados(en inglés)En el sitio web: www.pearsoneducacion.net/savitch, encontrará los siguientes recursos:

    ■ Acceso a CodeMate de Addison-Wesley.

    ■ Guía de recursos para el instructor: incluye sugerencias de enseñanza para cadacapítulo, cuestionarios con soluciones y soluciones para muchos proyectos deprogramación.

    ■ Banco de pruebas y Generador de pruebas.

    ■ Lecturas de PowerPoint: incluye los programas y el arte del libro.

    ■ Manual de laboratorio.

    Si requiere mayor información sobre el material de apoyo, contacte a su representante localde Pearson Educación.

    Soporte para Visual C++Además del material antes listado, este libro dispone de los siguientes materiales paraVisual C++ (en inglés):

    ■ Solución de problemas con C++: El objeto de la programación, 5ª Edición, edición para Visual C++ 6.0.

    ■ Solución de problemas con C++: El objeto de la programación, 5ª Edición,edición para Visual C++ .NET.

    ContáctenosMe gustaría mucho conocer sus comentarios para seguir mejorando este libro y hacer quese adapte mejor a sus necesidades. Por favor envíe sus comentarios (en inglés) a la siguien-te dirección de correo electrónico:

    [email protected]

    Quiero saber qué le parece el libro y si tiene sugerencias para algunas modificaciones;sin embargo, lamento informarle que no puedo proporcionar a los estudiantes un serviciode consultoría o asesoría vía correo electrónico. El volumen de correo electrónico ha aumen-tado demasiado como para poder dar este servicio. En especial, no puedo proporcionar

    viiPrefacio

    www.FreeLibros.me

  • soluciones a los ejercicios de este libro ni a cualquier otro ejercicio que le proporcione suinstructor. Es sólo que no tengo el tiempo suficiente como para responder a las numerosaspeticiones que recibo en relación con ese tipo de asistencia. Además, no quiero interferircon los planes de ningún instructor acerca de cómo deben resolver sus estudiantes los pro-blemas de programación. Como consuelo parcial a quienes desean tal ayuda, cabe señalarque este libro incluye las respuestas completas a todos los ejercicios de autoevaluación.Además, la guía del instructor (en inglés) proporciona a los instructores algunas de las res-puestas a los Proyectos de programación, pero ese material está disponible sólo para losinstructores que adopten el libro como texto.

    AgradecimientosSon muchas las personas y los grupos que me han proporcionado sugerencias, discusionesy demás ayuda para mejorar este texto. La mayor parte de la primera edición de este librola escribí mientras visitaba el Departamento de Ciencias Computacionales de la Universi-dad de Colorado, en Boulder. El resto de esa primera edición y el trabajo en las edicionessubsiguientes lo realicé en el Departamento de Ingeniería y Ciencias computacionales de laUniversidad de California en San Diego (UCSD). Estoy muy agradecido con estas institucio-nes por haber proporcionado un entorno conductivo para enseñar este material y escribireste libro.

    Extiendo un agradecimiento especial a todos los individuos que contribuyeron con suscríticas para ésta o para las ediciones anteriores y los borradores del libro. En orden alfa-bético son: Claire Bono, Andrew Burt, Karla Chaveau, Joel Cohen, Doug Cosman, ScotDrysdale, Joe Faletti, Alex Feldman, Paulo Franca, Len Garrett, Jerrold Grossman, Eitan M.Gurari, Dennis Heckman, Bob Holloway, Matt Johnson, Bruce Johnston, Thomas Judson,Paul J. Kaiser, Michael Keenan, Paul Kube, Barney MacCabe, Steve Mahaney, Michael Main,Walter A. Manrique, Anne Marchant, John Marsaglia, Nat Martin, Bob Matthews, JesseMorehouse, Donald Needham, Dung Nguyen, Joseph D. Oldham, Carol Roberts, Ken Rock-wood, John Russo, Amber Settle, Naomi Shapiro, David Teague, Jerry Weltman, John J.Westman y Linda F. Wilson.

    Deseo agradecer también a Nisar Hundewale por su trabajo en la actualización de losproyectos de programación.

    Extiendo un agradecimiento especial a los muchos instructores que utilizaron edicio-nes anteriores de este texto. Sus comentarios integran parte de la revisión más útil que re-cibió el libro.

    Agradezco a Prentice-Hall por haberme permitido adaptar cierto material de mi libroJava: An Introduction to Computer Science and Programming para que pudiera utilizar el materialadaptado en el capítulo 17 del presente libro.

    Agradezco a todas las personas de Addison-Wesley que contribuyeron tanto para queeste libro fuera una realidad. En especial deseo mencionar a Patty Mahtani, Beth Paquin,Marilyn Lloyd, Michelle Neil, Joyce Wells, Michelle Brown y Jennifer Pelland. Un agradecimien-to especial para todos ellos. Gracias a mi editora Susan Hartman Sullivan por su aliento yapoyo en esta edición y en las anteriores. El trabajo de estas finas personas fue invaluablepara poder llevar a cabo esta quinta edición.

    Agradezco a Daniel Rausch, Jen Jackowitz y a todas las personas en Argosy por suexcelente trabajo para producir el libro final impreso.

    Walter Savitch

    http://www-cse.ucsd.edu/users/savitch/

    viii Prefacio

    www.FreeLibros.me

  • Diagrama de dependenciasEl diagrama de dependencias que aparece en la siguiente página muestra los posibles órde-nes de capítulos y subsecciones. La línea que une dos cuadros indica que debe cubrirse eltema del cuadro superior antes de estudiar el material del inferior. Cualquier secuencia quesea consistente con este ordenamiento parcial podrá seguirse sin pérdida de continuidad.Si un cuadro contiene uno o varios números de sección, significa que hace referencia sóloa esas secciones y no a todo el capítulo.

    ixPrefacio

    www.FreeLibros.me

  • x Prefacio

    CUADRO P.1 Diagrama de dependencia

    Capítulo 1Introducción

    Capítulo 2Fundamentos de C++

    Capítulo 3Funciones 1

    Capítulo 4Funciones 2

    Capítulo 5Flujos de E/S

    Capítulo 13§13.1-13.2

    Recursión básica

    Capítulo 12§12.1-12.2, Apuntadores

    y arreglos dinámicos

    Capítulo 11§11.1,

    Las cadenascomo arreglos

    Una línea que une dos cuadros indica que el cuadro superior deberá cubrirse antes del inferior.

    *§17.1 contiene referencias breves ocasionales a las clases derivadas, pero esas referencias pueden omitirse.

    †§11.2 puede cubrirse antes que el capítulo 8, pero requiere los capítulos del 1 al 7.

    Capítulo 10§10.5,

    Arreglosmultidimensionales

    Capítulo 7Más flujo de control

    Capítulo 6Clases 1

    Capítulo 10§10.1-10.3

    Fundamentos de los arreglos

    Capítulo 8Clases 2

    Capítulo 10§10.4, Arreglos

    en las clases

    Capítulo 12§12.3, Arreglos

    dinámicosen las clases; destructores

    Capítulo 11†La clase string

    y los vectores

    Capítulo 16§16.1

    Clases derivadas

    Capítulo 9Compilación

    por separado yespacios de nombres

    Capítulo 14Plantillas

    Capítulo 16§16.2, §16.3

    Interacción de apuntadores y herencia

    Capítulo 15Apuntadores

    y listas enlazadas

    Capítulo 17*§17.1,

    Excepcionesbásicas

    Capítulo 18STL

    www.FreeLibros.me

  • Capítulo 1 Introducción a las computadoras y a la programación en C++ 1

    Capítulo 2 Fundamentos de C++ 35

    Capítulo 3 Abstracción de procedimientos y funciones que devuelvenun valor 97

    Capítulo 4 Funciones para todas las subtareas 155

    Capítulo 5 Flujos de E/S como introducción a los objetos y clases 199

    Capítulo 6 Definición de clases 269

    Capítulo 7 Más flujo de control 333

    Capítulo 8 Friends (amigas) y sobrecarga de operadores 403

    Capítulo 9 Compilación por separado y espacios de nombres 455

    Capítulo 10 Arreglos 491

    Capítulo 11 Cadenas y vectores 567

    Capítulo 12 Apuntadores y arreglos dinámicos 615

    Capítulo 13 Recursión 661

    Capítulo 14 Plantillas 701

    Capítulo 15 Apuntadores y listas enlazadas 729

    Capítulo 16 Herencia 771

    Capítulo 17 Manejo de excepciones 821

    Capítulo 18 Biblioteca de plantillas estándar 851

    Apéndice 1 Palabras clave de C++ 901

    Apéndice 2 Precedencia de operadores 902

    Apéndice 3 El conjunto de caracteres ASCII 904

    Apéndice 4 Algunas funciones de biblioteca 905

    Apéndice 5 La instrucción assert 912

    Apéndice 6 Funciones en línea 913

    Apéndice 7 Sobrecarga de los corchetes de índice de arreglo 914

    Apéndice 8 El apuntador this 916

    Apéndice 9 Sobrecarga de operadores como operadores miembro 918

    Índice 921

    Resumen de contenido

    www.FreeLibros.me

  • Capítulo 1 Introducción a las computadoras y a la programación en C++ 1

    1.1 Sistemas de computación 3

    Hardware 3Software 7Lenguajes de alto nivel 8Compiladores 9Nota histórica 11

    1.2 Programación y resolución de problemas 12

    Algoritmos 13Diseño de programas 14Programación orientada a objetos 15El ciclo de vida del software 17

    1.3 Introducción a C++ 18

    Orígenes del lenguaje C++ 18Programa de ejemplo en C++ 19Riesgo: Uso erróneo de la diagonal invertida \n 22Tip de programación: Sintaxis de entrada y salida 22Diseño de un programa sencillo en C++ 23Riesgo: Colocar un espacio antes del nombre de archivo include 25 Compilación y ejecución de un programa en C++ 25Tip de programación: Cómo hacer que su programa corra 26

    1.4 Prueba y depuración 28

    Tipos de errores de programación 28Riesgo: Asumir que su programa está correcto 29

    Resumen del capítulo 30

    Respuestas a los ejercicios de autoevaluación 31

    Proyectos de programación 33

    Capítulo 2 Fundamentos de C++ 35

    2.1 Variables y Asignaciones 37

    Variables 37Nombres: Identificadores 38Declaración de variables 40Instrucciones de asignación 41Riesgo: Variables no inicializadas 43Tip de programación: Utilice nombres significativos 45

    Contenido

    www.FreeLibros.me

  • 2.2 Entrada y salida 46

    Salida mediante el uso de cout 46Directivas include y espacios de nombres 47Secuencias de escape 49Tip de programación: Finalice cada programa con una \n o endl 50Formato de números con un punto decimal 50Entrada mediante cin 51Diseño de entrada y salida 53Tip de programación: Fin de línea en la E/S 53

    2.3 Tipos de datos y expresiones 55

    Los tipos int y double 55Otros tipos de números 56El tipo char 58El tipo bool 58Compatibilidad de tipos 59Operadores aritméticos y expresiones 61Riesgo: Números enteros en la división 63Más instrucciones de asignación 65

    2.4 Control de flujo sencillo 65

    Mecanismo de bifurcación sencillo 66Riesgo: Cadenas de desigualdades 71Riesgo: Uso de = en lugar de == 71Instrucciones compuestas 72Mecanismos sencillos de ciclos 74Operadores de incremento y decremento 77Ejemplo de programación: Saldo de una tarjeta de débito 79Riesgo: Ciclos infinitos 80

    2.5 Estilo de programación 83

    Sangrado 84Comentarios 84Nombres de constantes 85

    Resumen del capítulo 88

    Respuestas a los ejercicios de autoevaluación 89

    Proyectos de programación 94

    Capítulo 3 Abstracción de procedimientos y funciones que devuelven un valor 97

    3.1 Diseño descendente 99

    3.2 Funciones predefinidas 99

    Uso de funciones predefinidas 99Conversión de tipo 104Forma antigua de la conversión de tipo 105Riesgo: La división entera desecha la parte fraccionaria 106

    xiiiContenido

    www.FreeLibros.me

  • 3.3 Funciones definidas por el programador 107

    Definiciones de función 107Forma alterna para declarar funciones 111Riesgo: Argumentos en el orden equivocado 114Definición de función —resumen de sintaxis 114Más sobre la colocación de definiciones de funciones 116

    3.4 Abstracción de procedimientos 117

    La analogía de la caja negra 117Tip de programación: Cómo elegir los nombres de parámetros formales 120Caso de estudio: Compra de pizza 120Tip de programación: Utilice pseudocódigo 127

    3.5 Variables locales 128

    La analogía del programa pequeño 128Ejemplo de programación: Huerto experimental de chícharos 130Constantes y variables globales 131Los parámetros formales de llamadas por valor son variables locales 133De nuevo los espacios de nombre 134Ejemplo de programación: La función factorial 138

    3.6 Sobrecarga de nombres de función 140

    Introducción a la sobrecarga 140Ejemplo de programación: Programa para comprar pizzas revisado 143Conversión automática de tipo 146

    Resumen del capítulo 148

    Respuestas a los ejercicios de autoevaluación 149

    Proyectos de programación 152

    Capítulo 4 Funciones para todas las subtareas 155

    4.1 Funciones void 157

    Definiciones de funciones void 157Ejemplo de programación: Conversión de temperaturas 159Instrucciones return en funciones void 159

    4.2 Parámetros de llamada por referencia 164

    Una primera mirada a la llamada por referencia 164Detalles de la llamada por referencia 165Ejemplo de programación: La función intercambiar_valores 170Listas mixtas de parámetros 172Tip de programación: Qué clase de parámetros debemos usar 172Riesgo: Variables locales inadvertidas 174

    4.3 Uso de abstracción de procedimientos 176

    Funciones que llaman a funciones 176Precondiciones y postcondiciones 177Caso de estudio: Precios en el supermercado 180

    xiv Contenido

    www.FreeLibros.me

  • 4.4 Prueba y depuración de funciones 186

    Stubs y controladores 186

    Resumen del capítulo 191

    Respuestas a los ejercicios de autoevaluación 192

    Proyectos de programación 195

    Capítulo 5 Flujos de E/S como introducción a los objetos y clases 199

    5.1 Flujos y E/S de archivos básica 201¿Por qué usar archivos para E/S? 201E/S de archivos 202Introducción a clases y objetos 206Tip de programación: Verifique si se logró abrir un archivo

    satisfactoriamente 208Técnicas de E/S de archivos 209Añadir a un archivo (Opcional) 213 Nombres de archivo como entradas (Opcional) 213

    5.2 Herramientas para flujos de E/S 216Formateo de salidas con funciones de flujos 216Manipuladores 221Flujos como argumentos de funciones 225Tip de programación: Verifique el fin de un archivo 225Nota sobre Namespaces 229Ejemplo de programación: Aseo de un formato de archivo 230

    5.3 E/S de caracteres 231Las funciones miembro get y put 231La función miembro putback (Opcional) 235Ejemplo de programación: Verificación de entradas 235Riesgo: '\n' inesperado en las entradas 238La función miembro eof 241Ejemplo de programación: Edición de un archivo de texto 243Funciones de caracteres predefinidas 244Riesgo: toupper y tolower devuelven valores int 247

    5.4 Herencia 249Herencia entre clases de flujos 249Ejemplo de programación: Otra función nueva_linea 253Argumentos predeterminados para funciones (Opcional) 254

    Resumen del capítulo 256 Respuestas a los ejercicios de autoevaluación 257Proyectos de programación 264

    xvContenido

    www.FreeLibros.me

  • Capítulo 6 Definición de clases 269

    6.1 Estructuras 271Estructuras para datos diversos 271Riesgo: Olvido de un punto y coma en una definición de estructura 276Estructuras como argumentos de función 276Tip de programación: Utilice estructuras jerárquicas 277Inicialización de estructuras 279

    6.2 Clases 282Definición de clases y funciones miembro 282Miembros públicos y privados 287Tip de programación: Haga que todas las variables miembro sean privadas 293Tip de programación: Defina funciones de acceso y de mutación 295Tip de programación: Emplee el operador de asignación con objetos 297Ejemplo de programación: Clase CuentaBancaria, versión1 297Resumen de algunas propiedades de las clases 302Constructores para inicialización 304Tip de programación: Siempre incluya un constructor predeterminado 312Riesgo: Constructores sin argumentos 313

    6.3 Tipos de datos abstractos 315Clases para producir tipos de datos abstractos 315Ejemplo de programación: Otra implementación de una clase 319

    Resumen del capítulo 323Respuestas a los ejercicios de autoevaluación 324Proyectos de programación 329

    Capítulo 7 Más flujo de control 333

    7.1 Uso de expresiones booleanas 335 Evaluación de expresiones booleanas 335 Riesgo: Las expresiones booleanas se convierten en valores int 339Funciones que devuelven un valor booleano 341 Tipos de enumeración (opcional) 342

    7.2 Bifurcaciones multivía 343 Instrucciones anidadas 343Tip de Programación: Use llaves en instrucciones anidadas 343 Instrucciones if-else multivía 347Ejemplo de Programación: Impuesto sobre la renta estatal 349 La instrucción switch 352 Riesgo: Olvidar un break en una instrucción switch 356Uso de instrucciones switch para menús 357Tip de Programación: Use llamadas de función en instrucciones

    de bifurcación 357Bloques 357Riesgo: Variables locales inadvertidas 363

    xvi Contenido

    www.FreeLibros.me

  • 7.3 Más acerca de las instrucciones cíclicas de C++ 364 Repaso de las instrucciones while 364Repaso de los operadores de incremento y decremento 366 La instrucción for 369Riesgo: Punto y coma extra en una instrucción for 373¿Qué tipo de ciclo debemos usar? 375Riesgo: Variables no inicializadas y ciclos infinitos 377La instrucción break 377Riesgo: La instrucción break en ciclos anidados 377

    7.4 Diseño de ciclos 379Ciclos para sumas y productos 379Cómo terminar un ciclo 381Ciclos anidados 384Depuración de ciclos 389

    Resumen del capítulo 392Respuestas a los ejercicios de autoevaluación 393Proyectos de programación 398

    Capítulo 8 Friends (amigas) y sobrecarga de operadores 403

    8.1 Funciones amigasEjemplo de programación: Función de igualdad 405Funciones friend (amigas) 409Tip de programación: Definición de funciones de acceso y funciones amigas 411Tip de programación: Utilice funciones miembro y funciones no miembro 413Ejemplo de programación: La clase Dinero (Versión 1) 413Implementación de digito_a_int (Opcional) 420Riesgo: Ceros a la izquierda en constantes numéricas 421El modificador de parámetro const 423Riesgo: Uso inconsistente de const 424

    8.2 Sobrecarga de operadores 428Sobrecarga de operadores 428Constructores para la conversión automática de tipos 431Sobrecarga de operadores unarios 433Sobrecarga de >> y

  • Uso de #ifndef 468Tip de programación: Definición de otras bibliotecas 470

    9.2 Espacios de nombres 471Los espacios de nombres y las directivas using 471Creación de un espacio de nombres 473Calificación de los nombres 476Un punto sutil acerca de los espacios de nombres (opcional) 477Tip de programación: Elección de un nombre para un espacio de nombres 484Riesgo: Confundir el espacio de nombres global y el espacio de nombres

    sin nombre 484

    Resumen del capítulo 486Respuestas a los ejercicios de autoevaluación 486Proyectos de programación 488

    Capítulo 10 Arreglos 491

    10.1 Introducción a los arreglos 493Declaración y referencias de arreglos 493Tip de programación: Emplee ciclos for con arreglos 494Riesgo: Los índices de arreglos siempre comienzan con cero 494Tip de programación: Utilice una constante definida para el tamaño

    de un arreglo 496Arreglos en memoria 496Riesgo: Índice de arreglo fuera de intervalo 498Inicialización de arreglos 498

    10.2 Arreglos en funciones 502Variables indizadas como argumentos de funciones 502Arreglos enteros como argumentos de funciones 504El modificador de parámetros const 507Riesgo: Uso inconsistente de parámetros const 509Funciones que devuelven un arreglo 510Caso de estudio: Gráfico de producción 510

    10.3 Programación con arreglos 524Arreglos parcialmente llenos 525Tip de programación: No escatime en parámetros formales 525Ejemplo de programación: Búsqueda en un arreglo 528Ejemplo de programación: Ordenamiento de un arreglo 531

    10.4 Arreglos y clases 536Arreglos de clases 536Arreglos como miembros de clases 539Ejemplo de programación: Una clase para un arreglo parcialmente lleno 541

    10.5 Arreglos multidimensionales 545Fundamentos de arreglos multidimensionales 545Parámetros de arreglos multidimensionales 545

    xviii Contenido

    www.FreeLibros.me

  • Ejemplo de programación: Programa calificador bidimensional 547Riesgo: Uso de comas entre arreglos indizados 552

    Resumen del capítulo 553Respuestas a los ejercicios de autoevaluación 553Proyectos de programación 559

    Capítulo 11 Cadenas y vectores 567

    11.1 Un tipo de arreglo para las cadenas 569Valores y variables de cadena tipo C 569Riesgo: Uso de = y == con cadenas tipo C 572Otras funciones en 574Entrada y salida de cadenas tipo C 578Conversiones de cadena tipo C a número y entrada robusta 581

    11.2 La clase string estándar 586Introducción a la clase estándar string 587E/S con la clase string 589Tip de programación: Más versiones de getline 593Riesgo Mezcla de cin >> variable; y getline 594Procesamiento de cadenas con la clase string 595Ejemplo de programación: Prueba del palíndromo 597Conversión entre objetos string y cadenas tipo C 603

    11.3 Vectores 603Fundamentos de vectores 604Riesgo: Uso de corchetes más allá del tamaño del vector 605Tip de programación: La asignación de vectores tiene buen comportamiento 607Cuestiones de eficiencia 607

    Resumen del capítulo 609Respuestas a los ejercicios de autoevaluación 610Proyectos de programación 612

    Capítulo 12 Apuntadores y arreglos dinámicos 615

    12.1 Apuntadores 617Variables de apuntador 617Administración de memoria básica 624 Riesgo: Apuntadores colgantes 625Variables estáticas, dinámicas y automáticas 626Tip de programación: Defina tipos de apuntadores 626

    12.2 Arreglos dinámicos 628Variables de arreglo y variables de apuntador 629Cómo crear y usar arreglos dinámicos 629Aritmética de apuntadores (Opcional) 635Arreglos dinámicos multidimensionales (Opcional) 637

    xixContenido

    www.FreeLibros.me

  • 12.3 Clases y arreglos dinámicos 637Ejemplo de programación: Una clase de variables de cadena 639Destructores 640 Riesgo: Apuntadores como parámetros de llamada por valor 646Constructores de copia 648Sobrecarga del operador de asignación 652

    Resumen del capítulo 655Respuestas a los ejercicios de autoevaluación 655Proyectos de programación 657

    Capítulo 13 Recursión 661

    13.1 Funciones recursivas para realizar tareas 663Caso de estudio: Números verticales 663La recursión bajo la lupa 669 Riesgo: Recursión infinita 670Pilas para recursión 672Riesgo: Desbordamiento de la pila 673Recursión e iteración 674

    13.2 Funciones recursivas para obtener valores 675Forma general de una función recursiva que devuelve un valor 675Ejemplo de programación: Otra función de potencias 676

    13.3 Razonamiento recursivo 680Técnicas de diseño recursivo 680Caso de estudio: Búsqueda binaria-Un ejemplo de razonamiento recursivo 682Ejemplo de programación: Una función miembro recursiva 689

    Resumen del capítulo 694

    Respuestas a los ejercicios de autoevaluación 695

    Proyectos de programación 698

    Capítulo 14 Plantillas 701

    14.1 Plantillas para abstracción de algoritmos 703 Plantillas para funciones 704Riesgo: Complicaciones del compilador 707Ejemplo de programación: Una función de ordenamiento genérica 709Tip de programación: Cómo definir plantillas 713Riesgo: Uso de una plantilla con el tipo inapropiado 714

    14.2 Plantillas para abstracción de datos 714Sintaxis de plantillas de clases 715Ejemplo de programación: Una clase de arreglo 718

    Resumen del capítulo 724Respuestas a los ejercicios de autoevaluación 724Proyectos de programación 727

    xx Contenido

    www.FreeLibros.me

  • Capítulo 15 Apuntadores y listas enlazadas 729

    15.1 Nodos y listas enlazadas 731Nodos 731Listas enlazadas 735Inserción de un nodo en la cabeza de una lista 736Riesgo: Pérdida de nodos 740Búsqueda en una lista enlazada 741Los apuntadores como iteradores 743Inserción y remoción de nodos dentro de una lista 745Riesgo: Uso del operador de asignación con estructuras dinámicas de datos 747Variaciones en listas enlazadas 750

    15.2 Pilas y colas 752Pilas 752Ejemplo de programación: Una clase tipo pila 752Colas 758Ejemplo de programación: Una clase tipo cola 759

    Resumen del capítulo 764Respuestas a los ejercicios de autoevaluación 764Proyectos de programación 767

    Capítulo 16 Herencia 771

    16.1 Fundamentos de la herencia 773Clases derivadas 773Constructores en clases derivadas 782Riesgo: Uso de variables miembro privadas de la clase base 784Riesgo: Las funciones miembro privadas en efecto no se heredan 786El calificador protected 786Redefinición de funciones miembro 789Acceso a una función base redefinida 794

    16.2 Detalles de la herencia 795Funciones que no se heredan 795Operadores de asignación y constructores de copia en clases derivadas 796Destructores en clases derivadas 797

    16.3 Polimorfismo 798Vinculación postergada 798Funciones virtuales en C++ 799Funciones virtuales y compatibilidad extendida de tipos 805Riesgo: El problema de la pérdida de datos 807Riesgo: No utilizar funciones miembro virtuales 810Riesgo: Tratar de compilar definiciones de clases sin definiciones para todas

    las funciones miembro virtuales 811Tip de programación: Haga los destructores virtuales 811

    xxiContenido

    www.FreeLibros.me

  • Resumen del capítulo 813Respuestas a los ejercicios de autoevaluación 813Proyectos de programación 817

    Capítulo 17 Manejo de excepciones 821

    17.1 Fundamentos del manejo de excepciones 823Un pequeño ejemplo sobre el manejo de excepciones 823Definición de sus propias clases de excepciones 832Uso de varios bloques throw y catch 832Riesgo: Atrape la excepción más específica primero 832Tip de programación: Las clases de excepciones pueden ser triviales 837Lanzamiento de una excepción en una función 837Especificación de excepciones 838Riesgo: Especificación de una excepción en clases derivadas 842

    17.2 Técnicas de programación para el manejo de excepciones 843Cuándo lanzar una excepción 843Riesgo: Excepciones no atrapadas 844Riesgo: Bloques try-catch anidados 845Riesgo: Uso excesivo de excepciones 845Jerarquías de las clases de excepciones 845Prueba para la memoria disponible 846Volver a lanzar una excepción 846

    Resumen del capítulo 847Respuestas a los ejercicios de autoevaluación 847Proyectos de programación 848

    Capítulo 18 Biblioteca de plantillas estándar 851

    18.1 Iteradores 853Declaraciones using 853Fundamentos de los iteradores 854Tipos de iteradores 859Iteradores constantes y mutables 863Iteradores inversos 864Riesgo: Problemas del compilador 865Otros tipos de iteradores 865

    18.2 Contenedores 867Contenedores secuenciales 867Riesgo: Los iteradores y la eliminación de elementos 872Tip de programación: Definiciones de tipos en los contenedores 873Los adaptadores de contenedor stack y queue 873Los contenedores asociativos set y map 874Eficiencia 882

    xxii Contenido

    www.FreeLibros.me

  • 18.3 Algoritmos genéricos 882Tiempos de ejecución y notación tipo Big O 883Tiempos de ejecución del acceso a los contenedores 887Algoritmos modificadores de contenedores 892Algoritmos de conjuntos 892Algoritmos de ordenamiento 895

    Resumen del capítulo 896Respuestas a los ejercicios de autoevaluación 896Proyectos de programación 898

    Apéndice 1 Palabras clave de C++ 901

    Apéndice 2 Precedencia de operadores 902

    Apéndice 3 El conjunto de caracteres ASCII 904

    Apéndice 4 Algunas funciones de biblioteca 905

    Apéndice 5 La instrucción assert 912Apéndice 6 Funciones en línea 913

    Apéndice 7 Sobrecarga de los corchetes de índice de arreglo 914

    Apéndice 8 El apuntador this 916Apéndice 9 Sobrecarga de operadores como operadores miembro 918

    Índice 921

    xxiiiContenido

    www.FreeLibros.me

  • www.FreeLibros.me

  • Introducción a lascomputadoras y a la

    programaciónen C++

    1.1 Sistemas de computación 3

    Hardware 3Software 7Lenguajes de alto nivel 8Compiladores 9Nota histórica 11

    1.2 Solución de problemas y programación 12

    Algoritmos 13Diseño de programas 14Programación orientada a objetos 15El ciclo de vida del software 17

    1.3 Introducción a C++ 18

    Orígenes del lenguaje C++ 18Programa de ejemplo en C++ 19Riesgo: Uso erróneo de la diagonal invertida \n 22Tip de programación: Sintaxis de entrada y salida 22Diseño de un programa sencillo en C++ 23Riesgo: Colocar un espacio antes del nombre de archivo include 25 Compilación y ejecución de un programa en C++ 25Tip de programación: Cómo hacer que su programa corra 26

    1.4 Prueba y depuración 28

    Tipos de errores de programación 28Riesgo: Asumir que su programa es correcto 29

    Resumen del capítulo 30

    Respuestas a los ejercicios de autoevaluación 31

    Proyectos de programación 33

    11

    www.FreeLibros.me

  • 11 Introducción a lascomputadoras y a la

    programaciónen C++

    Todo el desarrollo y el manejo del análisis, ahora es posible a través de unamáquina… En cuanto aparezca una máquina analítica, forzosamente guiaráel curso de la ciencia.

    CHARLES BABBAGE (1792-1871)

    IntroducciónEn este capítulo describiremos los componentes básicos de unacomputadora, así como las técnicas básicas para diseñar y escribir unprograma. Después presentaremos un programa de ejemplo en C++, ydescribiremos su funcionamiento.

    www.FreeLibros.me

  • 1.1 Sistemas de computaciónAl conjunto de instrucciones que debe seguir una computadora se le llama programa. A lacolección de programas que utiliza una computadora se le conoce como software. La partefísica de las máquinas, la cual constituye la instalación de la computadora, se conoce comohardware. Como veremos, el concepto de hardware es muy sencillo. Sin embargo, en la actua-lidad las computadoras vienen con una amplia variedad de software, que facilita la tareade programar. Este software incluye editores, traductores y manejadores de varios tipos. Elambiente resultante es un sistema complicado y poderoso. En este libro nos ocuparemoscasi exclusivamente del software, pero un leve vistazo a la organización del hardware nosserá útil.

    HardwareExisten tres clases principales de computadoras: computadoras personales, estaciones de tra-bajo y mainframes. Una PC (computadora personal) es una computadora relativamentepequeña, diseñada para que sólo una persona la use en un momento determinado. Lamayoría de las computadoras caseras son PC, aunque éstas también se utilizan muchoen los negocios, la industria y la ciencia. Una estación de trabajo es básicamente unaPC más grande y más poderosa, a la que se podría considerar como una PC “indus-trial”. Una mainframe es una computadora aún más grande que normalmente requie-re un equipo de soporte, y por lo general la comparten varios usuarios. Las diferenciasentre PC, estaciones de trabajo y mainframes no son precisas, pero estos términos seutilizan con frecuencia y nos proporcionan información general acerca de una compu-tadora.

    Una red consiste en varias computadoras conectadas entre sí, de modo que pue-dan compartir recursos como impresoras e información. Una red puede contener esta-ciones de trabajo y una o más mainframes, así como dispositivos compartidos, comoimpresoras.

    En nuestro caso, que pretendemos aprender a programar, no tiene importancia si tra-bajamos en una PC, una mainframe o una estación de trabajo. Como veremos, la configu-ración básica de una computadora, desde nuestro punto de vista, es la misma en los trescasos.

    El hardware de la mayoría de los sistemas de computación está organizado como semuestra en el cuadro 1.1. Podemos considerar que una computadora tiene cinco componen-tes principales: los dispositivos de entrada, los dispositivos de salida, el procesador (también conocidocomo CPU, unidad central de procesamiento), la memoria principal y la memoria secundaria. LaCPU, la memoria principal, y algunas veces la memoria secundaria, normalmente se alojanen un solo gabinete. La CPU y la memoria principal forman el corazón de la computadora,y pueden considerarse como una unidad integrada. Otros componentes se conectan a lamemoria principal y operan bajo la dirección de la CPU. Las flechas del cuadro 1.1 indicanla dirección del flujo de información.

    Un dispositivo de entrada es cualquier dispositivo que permite a una persona trans-mitir información a la computadora. Es probable que sus principales dispositivos de entra-da sean un teclado y un ratón.

    Un dispositivo de salida es cualquiera que permita a la computadora transmitirnos in-formación. El dispositivo de salida más común es la pantalla, también conocida como mo-nitor. Con frecuencia hay más de un dispositivo de salida. Por ejemplo, además del moni-tor, es probable que su computadora esté conectada a una impresora para proporcionaruna salida en papel. Con frecuencia, al teclado y al monitor se les considera como una so-la unidad, llamada terminal.

    Con el fin de almacenar las entradas y contar con el equivalente a hojas de papel paraescribir cuando se realizan cálculos, las computadoras cuentan con memoria. El programa

    3Sistemas de computación

    softwarehardware

    PC, estacionesde trabajoy mainframes

    red

    dispositivosde entrada

    dispositivos de salida

    www.FreeLibros.me

  • que la computadora ejecuta se almacena bien en esta memoria. Una computadora tienedos formas de memoria, llamadas memoria principal y memoria secundaria. El programa en ejecu-ción se mantiene en la memoria principal, y ésta es, como su nombre lo indica, la memoriamás importante. La memoria principal consiste en una larga lista de ubicaciones numera-das, conocidas como ubicaciones de memoria; el número de éstas varía de una computadoraa otra, y puede ir desde algunos miles hasta varios millones, y en ocasiones hasta milesde millones. Cada ubicación de memoria contiene una cadena de ceros y unos. El contenido deestas ubicaciones puede cambiar, de modo que podemos considerar a cada ubicaciónde memoria como un diminuto pizarrón en el que la computadora puede escribir y borrar.En la mayoría de las computadoras, todas las ubicaciones de memoria contienen la mismacantidad de dígitos cero/uno. Un dígito que puede asumir sólo los valores cero o uno se co-noce como dígito binario o bit. En casi todas las computadoras, las ubicaciones de memo-ria contienen ocho bits (o algún múltiplo de ocho bits). Una porción de memoria de ochobits se conoce como byte, por lo que podemos llamar a estas ubicaciones numeradas dememoria principal como bytes. Para replantear la situación, podemos considerar a la memoriaprincipal de la computadora como una larga lista de ubicaciones de memoria numeradasllamadas bytes. El número que identifica a un byte se conoce como su dirección. Un elementode datos, por ejemplo un número o una letra, puede almacenarse en uno de estos bytes, yla dirección del byte se utiliza para localizar el dato cuando es necesario.

    4 CAPÍTULO 1 Introducción a las computadoras y a la programación en C++

    memoria principal

    bit

    byte

    dirección

    CUADRO 1.1 Componentes principales de una computadora

    Memoria principal

    Procesador (CPU)

    Memoria secundaria

    Dispositivos de entrada

    Dispositivos de salida

    www.FreeLibros.me

  • Si la computadora necesita manejar un dato que es demasiado grande para ocupar unsolo byte (por ejemplo, un número grande), utilizará bytes adyacentes para almacenar dichoelemento. En este caso, el trozo completo de memoria que almacena ese dato se conoce comoubicación de memoria. La dirección del primer byte de esta gran ubicación de memoria se uti-liza como su dirección. Por lo tanto, en la práctica podemos considerar a la memoria principalde una computadora como una larga lista de ubicaciones de memoria de tamaño variable. Eltamaño de cada una de estas ubicaciones se expresa en bytes, y la dirección del primero seutiliza como la dirección (nombre) de esa ubicación de memoria. El cuadro 1.2 muestra unarepresentación de la memoria principal de una computadora hipotética. Los tamaños delas ubicaciones de memoria no son fijos, y pueden cambiar cuando un nuevo programa seejecuta en la computadora.

    5Sistemas de computación

    ubicaciónde memoria

    CUADRO 1.2 Ubicaciones de memoria y bytes

    byte 1byte 2byte 3byte 4byte 5byte 6byte 7byte 8byte 9

    ubicación de memoria de 3 bytes con dirección 1

    ubicación de memoria de 2 bytes con dirección 4

    ubicación de memoria de 1 byte con dirección 6

    ubicación de memoria de 3 bytes con dirección 7

    Bytes y direcciones

    El hecho de que la información que se encuentra en la memoria de la computadora se repre-sente mediante ceros y unos, no necesariamente tiene importancia para usted cuando pro-grama en C++ (o en cualquier otro lenguaje de programación). Sin embargo, hay un as-pecto sobre el uso de ceros y unos que sí nos concernirá tan pronto como comencemos aescribir programas. La computadora necesita interpretar estas cadenas de ceros y unoscomo números, letras, instrucciones u otro tipo de información. La computadora realizaautomáticamente estas interpretaciones, de acuerdo con ciertos esquemas de codificación.Para cada tipo de elemento almacenado en la memoria de la computadora, se utiliza un

    La memoria principal se divide en ubicaciones numeradas llamadas bytes. El nú-mero asociado a un byte es su dirección. Para guardar un dato, como un númeroo una letra, se emplea un número de bytes consecutivos. La dirección del primerbyte del grupo se utiliza como la dirección de esta gran ubicación de memoria.

    www.FreeLibros.me

  • código diferente: uno para letras, otro para números enteros, otro para fracciones, otromás para instrucciones y así sucesivamente. Por ejemplo, en un conjunto de códigos co-múnmente utilizado, 01000001 es el código para la letra A y también para el número 65.Para saber lo que significa la cadena 01000001 en una ubicación en particular, la compu-tadora debe rastrear el código que actualmente se está utilizando para esa ubicación. Porfortuna, el programador casi nunca necesitará preocuparse por dichos códigos, y puedecon certeza razonar si las ubicaciones contienen letras, números o cualquier otra cosa.

    La memoria que hemos explicado hasta este punto es la memoria principal. Sin la me-moria principal, una computadora no puede hacer nada. Sin embargo, esta memoria enrealidad sólo se utiliza mientras la computadora sigue las instrucciones de un programa. Lacomputadora también tiene otro tipo de memoria, conocida como memoria secundaria oalmacenamiento secundario. (En este contexto, las palabras memoria y almacenamiento sonsinónimos.) La memoria secundaria es aquella que se utiliza para mantener un registropermanente de información después (y antes) de que la computadora se utilice. Algunostérminos alternos que se utilizan con frecuencia para hacer referencia a la memoria secun-daria son memoria auxiliar, almacenamiento auxiliar, memoria externa y almacenamiento externo.

    La información que se encuentra en almacenamiento secundario se mantiene enunidades llamadas archivos, los cuales pueden ser tan grandes o tan pequeños como seanecesario. Por ejemplo, un programa se almacena en un archivo del almacenamiento secun-dario y se copia en la memoria principal cuando se ejecuta el programa. En un archivo pode-mos almacenar un programa, una carta, una lista de inventario o cualquier otra unidadde información.

    Es posible agregar diversos tipos diferentes de memoria secundaria a una sola compu-tadora. Las formas más comunes de memoria secundaria son discos duros, diskettes y CD.(Los diskettes también se conocen como discos flexibles.) Los CD (discos compactos) quese utilizan en las computadoras son básicamente los mismos que se utilizan para grabary reproducir música. Los CD para computadoras pueden ser de sólo lectura, de tal formaque su computadora pueda leer pero no modificar la información del CD; también puedenser de lectura/escritura, los cuales también pueden ser modificados por la computadora.La información se almacena en discos duros y diskettes básicamente de la misma forma queen CD. Los discos duros se fijan en un lugar, y normalmente no se mueven de la unidad dediscos. Los diskettes y CD pueden sacarse fácilmente de la unidad de discos y llevarlos aotra computadora. Los diskettes y CD tienen la ventaja de no ser caros y de ser portátiles,aunque los discos duros tienen mayor capacidad para almacenar información y operan másrápidamente. También existen otras formas de memoria secundaria, pero esta lista abarcala mayoría de las formas que puede encontrar.

    Con frecuencia, a la memoria principal se le llama memoria RAM o memoria de acce-so aleatorio. Se le llama de acceso aleatorio porque la computadora puede acceder de inmedia-to a la información en cualquier ubicación de memoria. La memoria secundaria a menudorequiere un acceso secuencial, lo que significa que la computadora debe buscar en to-das (o al menos en muchas) ubicaciones de memoria, hasta que encuentre el dato quenecesita.

    El procesador (también conocido como unidad central de procesamiento, o CPU) esel “cerebro” de la computadora. Cuando se publicita una computadora, la empresa de

    6 CAPÍTULO 1 Introducción a las computadoras y a la programación en C++

    Un byte es una ubicación de memoria que puede abarcar ocho bits. ¿Qué tiene deespecial que sean ocho? ¿Por qué no diez bits? Hay dos razones por las que sonocho. En primer lugar, ocho es una potencia de 2. (8 es igual a 23.) Debido a quelas computadoras utilizan bits, los cuales sólo tienen dos valores posibles, las po-tencias de dos son más convenientes que las potencias de 10. En segundo lugar,por la razón anterior se desprende que se necesitan ocho bits (un byte) para codi-ficar un solo carácter (como una letra o algún otro símbolo del teclado).

    ¿Por qué ocho?

    memoria secundaria

    archivos

    CD, discosy diskettes

    RAM

    procesador

    www.FreeLibros.me

  • computadoras le dice qué chip contiene. El chip es el procesador. El procesador sigue las ins-trucciones de un programa y realiza los cálculos especificados por él. Sin embargo, elprocesador es un cerebro muy simple. Todo lo que puede hacer es cumplir un conjunto deinstrucciones simples proporcionadas por el programador. Instrucciones típicas para unprocesador dicen, por ejemplo, algo como “interpreta los ceros y unos como números, yluego suma el número que se encuentra en la ubicación de memoria 37 con el número quese encuentra en la ubicación de memoria 59, y coloca la respuesta en la ubicación 43”, o“lee una letra de entrada, conviértela en su código como una cadena de ceros y unos, y co-lócala en la ubicación de memoria 1298”. El procesador puede sumar, restar, multiplicar ydividir, y es capaz de transferir cosas de una ubicación de memoria a otra. Puede interpre-tar cadenas de ceros y unos como letras y enviarlas hacia un dispositivo de salida. El pro-cesador también tiene cierta habilidad primitiva para reacomodar el orden de las instruc-ciones. Las instrucciones del procesador varían de alguna manera de una computadora aotra. El procesador de una computadora moderna puede tener cientos de instrucciones dis-ponibles. Sin embargo, estas instrucciones normalmente son tan simples como las que aca-bamos de describir.

    SoftwarePor lo general, no hablamos directamente con la computadora, sino que la comunica-ción se establece a través del sistema operativo. El sistema operativo distribuye los recur-sos de la computadora para que ésta cumpla con las tareas que debe realizar. El siste-ma operativo en realidad es un programa, pero tal vez sea mejor considerarlo comonuestro principal sirviente. Él está a cargo de todos los demás programas, y les entregatodas las solicitudes que usted realiza. Si desea ejecutar un programa, usted le indica alsistema operativo el nombre del archivo que lo contiene, y éste ejecuta el programa. Siqueremos editar un archivo, le decimos al sistema operativo el nombre del archivo y élpone en marcha el editor para que trabaje en ese archivo. Para la mayoría de los usua-rios, el sistema operativo es la computadora, ya que casi nunca ven a la computadorasin su sistema operativo. Los nombres de algunos sistemas operativos son UNIX, DOS,Linux, Windows, Mac OS y VMS

    Un programa es un conjunto de instrucciones que debe seguir una computadora. Co-mo muestra el cuadro 1.3, podemos considerar que la entrada a una computadora consta

    7Sistemas de computación

    chip

    sistema operativo

    programa

    CUADRO 1.3 Vista simple de la ejecución de un programa

    Programa

    Computadora

    Datos

    Salida

    www.FreeLibros.me

  • de dos partes, un programa y algunos datos. La computadora sigue las instrucciones delprograma, y de esa forma realiza algunos procesos. Los datos son lo que nosotros con-ceptualizamos como la entrada de un programa. Por ejemplo, si el programa suma dosnúmeros, entonces los dos números son los datos. En otras palabras los datos son la en-trada al programa, y ambos, tanto el programa como los datos, se introducen a la compu-tadora (normalmente a través del sistema operativo). Siempre que le proporcionamos a lacomputadora un programa a seguir y algunos datos para el programa, se dice que estamoscorriendo el programa con esos datos, y se dice que la computadora ejecuta el programa.La palabra datos tiene un significado mucho más general que el que acabamos de dar. Enel sentido más amplio significa cualquier información disponible para la computadora. Lapalabra datos normalmente se utiliza tanto en el sentido estricto como en el sentido másamplio.

    Lenguajes de alto nivelExisten muchos lenguajes para escribir programas. En este texto explicaremos el lenguaje deprogramación C++, y lo utilizaremos para escribir programas. C++ es un lenguaje de altonivel, como lo son la mayoría de los lenguajes de programación más conocidos, como C,Java, Pascal, Visual Basic, FORTRAN, COBOL, Lisp, Scheme y Ada. Los lenguajes de altonivel se asemejan en muchos sentidos a los lenguajes empleados por la humanidad. Estándiseñados para que a la gente se le facilite escribir programas, y para que sea sencillo leer-los. Un lenguaje de alto nivel como C++ contiene instrucciones mucho más complicadasque las instrucciones sencillas que el procesador de una computadora (CPU) es capaz deseguir.

    El tipo de lenguaje que una computadora puede entender se conoce como lenguaje debajo nivel. Los detalles exactos de los lenguajes de bajo nivel varían de una computadora aotra. Una instrucción de bajo nivel típica podría ser la siguiente:

    ADD X Y Z

    Esta instrucción podría significar “suma el número de la ubicación de memoria llamadaX con el número de la ubicación de memoria llamada Y, y coloca el resultado en la ubi-cación de memoria llamada Z”. La instrucción del ejemplo anterior está escrita en lo queconocemos como lenguaje ensamblador. Aunque el lenguaje ensamblador es casi el mis-mo que el que entiende la computadora, éste debe pasar por una traducción sencilla an-tes de que la computadora pueda entenderlo. Para lograr que una computadora siga unainstrucción en lenguaje ensamblador, es necesario traducir las palabras en cadenas de ce-ros y unos. Por ejemplo, la palabra ADD puede traducirse como 0110, la X en 1001, la Yen 1010, y la Z en 1011. Entonces, la versión de la instrucción anterior que la compu-tadora finalmente sigue es:

    0110 1001 1010 1011

    Las instrucciones en lenguaje ensamblador y su traducción a ceros y unos difieren de unamáquina a otra.

    Se dice que los programas expresados en ceros y unos están escritos en lenguaje demáquina, ya que ésa es la versión del programa que la computadora (la máquina) en realidadlee y sigue. El lenguaje ensamblador y el de máquina son casi lo mismo, y la diferencia en-tre ellos no resulta importante para nosotros. La diferencia importante entre el lenguaje demáquina y los lenguajes de alto nivel como C++, es que cualquier programa escrito en unlenguaje de alto nivel debe traducirse a lenguaje de máquina, para que la computadorapueda entender y seguir el programa.

    8 CAPÍTULO 1 Introducción a las computadoras y a la programación en C++

    ejecutar unprograma

    lenguaje dealto nivel

    lenguaje debajo nivel

    lenguajeensamblador

    lenguaje demáquina

    datos

    correr unprograma

    www.FreeLibros.me

  • CompiladoresUn programa que traduce un lenguaje de alto nivel como C++ a un lenguaje de máquina,se llama compilador. Entonces un compilador es un tipo especial de programa, cuya en-trada o datos es algún programa y su salida es otro programa. Para evitar confusiones,al programa de entrada normalmente se le llama programa fuente o código fuente, y laversión traducida que produce el compilador es llamada programa objeto o código ob-jeto. La palabra código se utiliza con frecuencia para hacer referencia a un programa o auna parte de él, y este uso es particularmente común cuando se trata de programas ob-jeto. Supongamos que queremos ejecutar un programa que hemos escrito en C++. Paralograr que la computadora siga las instrucciones en C++, hagamos lo siguiente. Primero,ejecutamos el compilador utilizando nuestro programa en C++ como entrada. Observeque en este caso, nuestro programa en C++ no se toma como un conjunto de instruccio-nes. Para el compilador, dicho programa es sólo una larga cadena de caracteres. La sali-da será otra larga cadena de caracteres, que es el equivalente al lenguaje de máquina denuestro programa en C++. Después, ejecutamos este programa en lenguaje de máquina,que es lo que normalmente consideramos como los datos del programa en C++. La sali-da será lo que normalmente conceptualizamos como la salida del programa en C++. Esmás fácil visualizar el proceso básico si contamos con dos computadoras, como muestrael cuadro 1.4. En realidad, todo el proceso se lleva a cabo utilizando dos veces la mismacomputadora.

    Compilador

    El proceso completo de traducción y ejecución de un programa en C++ es un poco máscomplejo que lo que muestra el cuadro 1.4. Cualquier programa en C++ que escribamosutilizará algunas operaciones (como rutinas de entrada y salida) que alguien más ha pro-gramado antes. Estos elementos previamente programados (como rutinas de entrada y sa-lida) se han compilado con anterioridad, y tienen a sus propios códigos objeto en esperapara combinarse con el código objeto de nuestro programa para producir un programacompleto en lenguaje de máquina que puede ejecutarse en la computadora. Otro progra-ma, llamado enlazador, combina el código objeto de estas partes del programa con el có-digo objeto que el compilador produjo a partir de nuestro programa en C++. En el cuadro1.5 se muestra la interacción del compilador y el enlazador. En casos muy rutinarios, mu-chos sistemas realizarán automáticamente este enlazamiento. Por lo tanto, no tendremosque preocuparnos por él.

    Enlazamiento

    9Sistemas de computación

    compilador

    programa fuenteprograma objetocódigo

    enlazador

    Un compilador es un programa que traduce un programa escrito en lenguaje de al-to nivel, como C++, a un programa en lenguaje de máquina, que la computadorapuede entender y ejecutar de manera directa.

    El código objeto de nuestro programa en C++ debe combinarse con el código ob-jeto de las rutinas (como las de entrada y salida) que nuestro programa usa. Esteproceso de combinación de códigos objeto se conoce como enlazamiento, y lo rea-liza un programa llamado enlazador. En programas sencillos el enlazamiento po-dría ser automático.

    www.FreeLibros.me

  • 1. ¿Cuáles son los cinco componentes principales de una computadora?

    2. ¿Cuáles serían los datos para un programa que suma dos números?

    3. ¿Cuáles serían los datos para un programa que asigna calificaciones a los estudiantes de un grupo?

    4. ¿Cuál es la diferencia entre un programa en lenguaje de máquina y uno en lenguaje de alto nivel?

    5. ¿Cuál es el papel de un compilador?

    6. ¿Qué es un programa fuente?, ¿qué es un programa objeto?

    10 CAPÍTULO 1 Introducción a las computadoras y a la programación en C++

    CUADRO 1.4 Compilación y ejecución de un programa en C++ (diseño básico)

    Ejercicios de AUTOEVALUACIÓN

    www.FreeLibros.me

  • 7. ¿Qué es un sistema operativo?

    8. ¿Cuál es el objetivo de un sistema operativo?

    9. Mencione el sistema operativo que ejecutará en su computadora para preparar los programas de estecurso.

    10. ¿Qué es enlazamiento?

    11. Investigue si el compilador que utilizará en este curso enlaza automáticamente.

    11Sistemas de computación

    CUADRO 1.5 Cómo preparar la ejecución de un programa en C++

    Código completo en lenguaje de máquina, listo para su ejecución

    Código objeto del programa

    en C++Código objeto

    de otras rutinas

    Programa en C++

    Compilador

    Enlazador

    Nota históricaLa primera computadora verdaderamente programable fue diseñada por Charles Babbage,un matemático y físico inglés. Babbage comenzó el proyecto poco antes de 1822, y traba-jó en él por el resto de su vida. Aunque nunca completó la construcción de su máquina, eldiseño fue un hito conceptual en la historia de la computación. Mucho de lo que sabemossobre Charles Babbage y el diseño de su computadora proviene de los escritos de su cole-ga Ada Augusta, Condesa de Lovelace e hija del poeta Byron. Con frecuencia se dice que

    Charles Babbage

    Ada Augusta

    www.FreeLibros.me

  • ella fue la primera programadora de computadoras. Sus comentarios, citados al inicio dela siguiente sección, aún aplican en el proceso de resolución de problemas a través de unacomputadora. Las computadoras no son mágicas y no tienen, al menos hasta el momento,la habilidad de formular soluciones sofisticadas para todos los problemas que enfrenta-mos; simplemente hacen lo que el programador les ordena; llevan a cabo las soluciones alos problemas, pero el programador es quien formula el proceso de solución. Nuestraexposición sobre la programación de computadoras inicia con una explicación sobre cómoun programador plantea las soluciones.

    1.2 Solución de problemas y programaciónLa Máquina Analítica no pretende originar absolutamente nada; sólo puede hacer cualquiercosa que nosotros le ordenemos que realice, si sabemos cómo hacerlo. Puede realizar unanálisis sencillo, pero no tiene la capacidad de deducir relaciones analíticas o verdades.Su propósito es ayudarnos a poner disponibles resultados de aquello con lo que ya esta-mos familiarizados.

    Ada Augusta, Condesa de Lovelace (1815-1852)

    12 CAPÍTULO 1 Introducción a las computadoras y a la programación en C++

    Ada Augusta, Condesa de Lovelace y primera programadora de computadoras

    Un modelo de la computadora de Babbage

    Charles Babbage

    www.FreeLibros.me

  • En esta sección describiremos algunos principios generales que podemos utilizar para dise-ñar y escribir programas. Estos principios no son exclusivos de C++; son válidos sea cual seael lenguaje de programación que estemos utilizando.

    AlgoritmosAl aprender nuestro primer lenguaje de programación, es fácil hacerse a la idea de que laparte difícil de resolver un problema en una computadora es traducir las ideas en el lengua-je específico que alimentará a la computadora. En definitiva, ése no es el caso. La parte másdifícil de la resolución de problemas en computadora es descubrir el método de resolución.Una vez que se tiene el método de resolución, es cuestión de rutina el traducir el método enel lenguaje requerido, sea C++ o algún otro. Por lo tanto, resulta útil ignorar temporalmen-te el lenguaje de programación y, en su lugar, concentrarse en formular los pasos de la so-lución y escribirlos en un lenguaje normal (español), como si las instrucciones se le dierana un ser humano y no a una computadora. A la secuencia de instrucciones expresada de es-ta forma, se le conoce como algoritmo.

    A la secuencia de instrucciones precisas que lleva a una solución, se le llama algo-ritmo. Algunas palabras equivalentes son receta, método, instrucciones, procedimiento y ruti-na. Las instrucciones pueden expresarse en lenguaje de programación o en lenguajecoloquial. Nuestros algoritmos estarán expresados en español y en lenguaje de progra-mación C++. Un programa de computadora es simplemente un algoritmo expresado enun lenguaje que una computadora puede entender. Entonces, el término algoritmo es másgeneral que el término programa. Sin embargo, cuando decimos que una secuencia de ins-trucciones es un algoritmo, normalmente queremos decir que las instrucciones estánexpresadas en español, ya que si las expresáramos en un lenguaje de programación, uti-lizaríamos el término específico programa. Un ejemplo podría ayudarnos a clarificar elconcepto.

    El cuadro 1.6 contiene un algoritmo expresado en español. El algoritmo determina elnúmero de veces que un nombre específico se repite en una lista de nombres. Si la lista con-tiene el nombre de los ganadores de los juegos de fútbol de la última temporada, y el nom-bre es el de nuestro equipo favorito, entonces el algoritmo determina cuántos partidos ga-nó su equipo. El algoritmo es corto y sencillo, pero al mismo tiempo es representativo delos algoritmos que manejamos aquí.

    Las instrucciones numeradas de la 1 a la 5 de nuestro algoritmo de ejemplo deben lle-varse a cabo en el orden en que aparecen. A menos que especifiquemos lo contrario, siem-pre asumiremos que las instrucciones de un algoritmo se llevan a cabo en el orden en queaparecen (hacia abajo). Sin embargo, los algoritmos más interesantes especifican ciertoscambios en el orden, por lo general la repetición de ciertas instrucciones una y otra vez, co-mo la instrucción 4 de nuestro ejemplo.

    La palabra algoritmo tiene una larga historia. Ésta proviene del siglo IX, por el nombredel matemático y astrónomo persa al-Khowarizmi, quien escribió el famoso libro sobremanipulación de números y ecuaciones titulado Kitab al-jabr w’almugabala, que traducidoal español significa Reglas de reunión y reducción. La palabra álgebra se derivó de la palabraárabe al-jabr, que aparece en el título del libro y que con frecuencia se traduce como reu-nión o reintegración. Los significados de las palabras álgebra y algoritmo solían estar másrelacionados de lo que están en la actualidad. De hecho, hasta tiempos modernos, lapalabra algoritmo sólo se refería a reglas algebraicas para la solución de ecuaciones nu-méricas. Hoy día, la palabra algoritmo puede aplicarse a una amplia variedad de instruc-ciones para manipular tanto datos simbólicos como numéricos. Las propiedades quecalifican a un conjunto de instrucciones como un algoritmo, ahora se determinan por lanaturaleza de las instrucciones, más que por las cosas manipuladas por las instrucciones.

    13Solución de problemas y programación

    algoritmo

    algoritmo de ejemplo

    origen de la palabraalgoritmo

    www.FreeLibros.me

  • Para calificar algo como un algoritmo, un conjunto de instrucciones debe especificar porcompleto y sin ambigüedades los pasos a seguir, así como el orden en el que deben rea-lizarse. La persona o máquina que siga el algoritmo hace exactamente lo que éste indi-ca, ni más ni menos.

    14 CAPÍTULO 1 Introducción a las computadoras y a la programación en C++

    CUADRO 1.6 Un algoritmo

    Algoritmo que determina cuántas vecesse repite un nombre en una lista de nombres:

    1. Obtén la lista de nombres.

    2. Obtén el nombre que se está revisando.

    3. Establece el contador en cero.

    4. Realiza lo siguiente para cada nombre de la lista:Compara el nombre de la lista con el nombre quese está revisando, y si los nombres coinciden,entonces suma uno al contador.

    5. Avisa que la respuesta es el número que indica el contador.

    Un algoritmo es una secuencia de instrucciones precisas que llevan a una solución.

    Algoritmo

    Diseño de programasDiseñar un programa con frecuencia resulta una tarea difícil. No existe un conjuntocompleto de reglas o un algoritmo que le diga cómo escribir programas. El diseño deprogramas es un proceso creativo; sin embargo, contamos con un bosquejo del plan aseguir. En el cuadro 1.7 se presenta en forma esquemática dicho bosquejo. Como se in-dica ahí, todo el proceso de diseño de programas puede dividirse en dos fases: la fase deresolución de problemas y la fase de implementación. El resultado de la fase de resoluciónde problemas es un algoritmo, expresado en español, para solucionar el problema. Paraproducir un programa en un lenguaje de programación como C++, el algoritmo se traduceal lenguaje de programación. La producción del programa final, a partir del algoritmo,es la fase de implementación.

    El primer paso es asegurarse de que la tarea, es decir, lo que queremos que el progra-ma realice, esté especificada de forma completa y precisa. No tome este paso a la ligera. Sino sabe exactamente lo que quiere que arroje su programa, podría sorprenderse con lo queel programa produzca. Debemos asegurarnos de que sabemos qué entradas tendrá el pro-grama exactamente, y qué información se supone que debe estar en la salida, así como laforma que debe tener esa información. Por ejemplo, si el programa es de contabilidad ban-caria, debemos conocer no sólo la tasa de interés, sino también si los intereses se com-

    fase de resoluciónde problemas

    fase deimplementación

    www.FreeLibros.me

  • ponen anual, mensual, diariamente o de alguna otra forma. Si el programa es para escribirpoesías, debemos determinar si los poemas están en versos libres o si deben estar escritosen pentámetro yámbico o en alguna otra métrica.

    Muchos programadores principiantes no comprenden la necesidad de escribir unalgoritmo antes de escribir un programa en un lenguaje de programación como C++,por lo que intentan reducir el proceso omitiendo por completo la fase de resolución delproblema, o reduciéndolo sólo a la parte de definición del problema. Esto parece razo-nable; ¿por qué no “ir directo al grano” y ahorrar tiempo? La respuesta es que ¡esto noahorra tiempo! La experiencia ha demostrado que el proceso de dos fases producirá unprograma que funcione rápida y correctamente. El proceso de dos fases simplifica la fa-se de diseño del algoritmo, aislándolo de las detalladas reglas de un lenguaje de pro-gramación como C++. El resultado es que el proceso de diseño de algoritmos se vuelvemucho menos intrincado y mucho menos propenso a errores. Incluso para un progra-ma no muy grande, puede representar una diferencia de medio día de cuidadoso traba-jo y de muchos y frustrantes días en la búsqueda de errores en un programa poco en-tendible.

    La fase de implementación no es un paso trivial; habrá detalles que podrán ser de cuida-do, y en ocasiones algunos no serán de importancia, pero esta fase es mucho más sencillade lo que puede parecer en un principio. Una vez que se familiarice con C++ o con cualquierotro lenguaje de programación, la traducción de un algoritmo en español hacia un lengua-je de programación será una tarea de rutina.

    Como muestra el cuadro 1.7, las pruebas se llevan a cabo en ambas fases. Antes deescribir el programa se prueba el algoritmo, y si se descubre que éste es deficiente, en-tonces se rediseña. Esa prueba de escritorio se realiza repasando mentalmente el algorit-mo y ejecutando los pasos nosotros mismos. Con algoritmos extensos será necesario unlápiz y un papel. El programa en C++ se prueba compilándolo y ejecutándolo con algu-nos datos de muestra. El compilador genera mensajes de error cuando detecta ciertos ti-pos de errores. Para detectar otros tipos de errores, es preciso verificar que las salidassean correctas.

    El proceso que se muestra en el cuadro 1.7 es una representación idealizada del procesode diseño de programas. Es la imagen básica lo que debemos tener en mente, pero en ocasio-nes la realidad es más compleja. En realidad, los errores y deficiencias se descubren en mo-mentos inesperados, y tendrá que regresar y rehacer algún paso anterior. Por ejemplo, laspruebas del algoritmo podrían revelar que la definición del problema estaba incompleta. Ental caso, hay que retroceder y reformular la definición. En ocasiones, las deficiencias en la de-finición o en el algoritmo pueden no notarse hasta que se prueba el programa. En ese caso,debe regresar y modificar la definición del problema o el algoritmo y todo lo demás delproceso de diseño.

    Programación orientada a objetosEl proceso de diseño de programas que describimos en la sección anterior representaa un programa como un algoritmo (un conjunto de instrucciones) para manipular al-gunos datos. Ése es un punto de vista correcto, pero no siempre el más productivo. Losprogramas modernos generalmente se diseñan utilizando un método conocido comoprogramación orientada a objetos o POO. En la POO, un programa se considera como unacolección de objetos en interacción. La metodología es mucho más sencilla de enten-der cuando el programa es uno de simulación. Por ejemplo, para que un programa si-mule los rebases en una carretera, los objetos deben representar a los automóviles y alos carriles de la carretera. Cada objeto tiene algoritmos que describen cómo debencomportarse en diferentes situaciones. Programar con estilo de POO consiste en dise-ñar los objetos y los algoritmos que éstos utilizan. Cuando se programa en un marco

    15Solución de problemas y programación

    POO

    www.FreeLibros.me

  • de trabajo de POO, el término diseño de algoritmos del cuadro 1.7 se reemplazaría con lafrase diseño de objetos y sus algoritmos.

    Las principales características de la POO son el encapsulamiento, la herencia y el polimor-fismo. El encapsulamiento normalmente se describe como una forma de ocultamiento deinformación o abstracción. Esa descripción es correcta, pero tal vez una caracterizaciónmás sencilla sea decir que el encapsulamiento es una forma de simplificar la descripción delos objetos. La herencia tiene que ver con escribir un código de programación reutilizable.El polimorfismo se refiere a la forma en que un solo nombre puede tener diversos signifi-cados en el contexto de la herencia. Habiendo establecido lo anterior, debemos admitirque tienen poco significado para los lectores que no han escuchado antes sobre la POO.Sin embargo, más adelante describiremos con detalle todos estos términos. C++ contem-pla la POO a través de clases, un tipo de datos que combina tanto los datos como los al-goritmos.

    16 CAPÍTULO 1 Introducción a las computadoras y a la programación en C++

    clase

    CUADRO 1.7 Proceso de diseño de programas

    Traducción a C++

    Prueba

    Inicio

    Programa funcional

    Prueba de escritorio

    Diseño del algoritmo

    Definición del problema

    Fase de solución del problema

    Fase de implementación

    www.FreeLibros.me

  • El ciclo de vida del softwareLos diseñadores de grandes sistemas de software, como compiladores y sistemas operati-vos, dividen el proceso de desarrollo de software en seis fases, que colectivamente se cono-cen como ciclo de vida del software. Las seis fases de este ciclo de vida son:

    1. Análisis y especificación de la tarea (definición del problema).

    2. Diseño del software (diseño de objetos y algoritmos).

    3. Implementación (codificar).

    4. Prueba.

    5. Mantenimiento y evolución del sistema.

    6. Obsolescencia.

    Cuando explicamos el diseño de un programa no mencionamos las dos últimas fases an-teriores, ya que éstas ocurren una vez que el programa está terminado y en servicio. Sinembargo, siempre debemos mantenerlas en mente. Usted no podrá hacer mejoras o correc-ciones a su programa a menos que lo diseñe de tal forma que sea fácil leerlo y modificar-lo. Diseñar programas para que sean fácilmente modificables es un punto importante, queexplicaremos con detalle cuando contemos con más elementos y técnicas de programación.El significado de obsolescencia es obvio, pero no siempre es fácil aceptarlo. Cuando un pro-grama no funciona como debería y no es posible arreglarlo con un esfuerzo razonable,deberá ser descartado y reemplazado por un programa totalmente nuevo.

    17Solución de problemas y programación

    ciclo de vidadel software

    Ejercicios de AUTOEVALUACIÓN

    12. Un algoritmo es casi lo mismo que una receta, pero cierto tipo de pasos que se permitirían en una rece-ta no se permiten en un algoritmo. ¿Cuáles de los pasos en la siguiente receta serían permitidos en un al-goritmo?

    Coloque dos cucharaditas de azúcar en un recipiente.

    Agregue 1 huevo.

    Agregue 1 taza de leche.

    Agregue una onza de ron, si no tiene que conducir.

    Agregue extracto de vainilla al gusto.

    Bata hasta que la mezcla sea homogénea.

    Vierta en un hermoso vaso.

    Esparza nuez moscada.

    13. ¿Cuál es el primer paso para crear un programa?

    14. El proceso de diseño de programas puede dividirse en dos fases principales, ¿cuáles son?

    15. Explique por qué la fase de resolución del problema no debe menospreciarse.

    www.FreeLibros.me

  • 1.3 Introducción a C++El lenguaje es el único instrumento de la ciencia...

    Samuel Johnson (1709-1784)

    En esta sección le presentaremos el lenguaje de programación C++, que es el lenguaje deprogramación que utilizaremos en este libro.

    Orígenes del lenguaje C++Lo primero que la gente notó del lenguaje C++ fue su inusual nombre. Podríamos pre-guntarnos si existe un lenguaje de programación C, o un lenguaje C- o C--, o si existenlenguajes de programación llamados A y B. La respuesta a la mayoría de estas preguntases no, pero la tendencia general de la pregunta es acertada. Existe un lenguaje de pro-gramación llamado B, que no se derivó de un lenguaje llamado A, pero sí de un lengua-je llamado BCPL. El lenguaje C se derivó del lenguaje B, y C++ del lenguaje C. ¿Por quéhay dos signos + en el nombre de C++? Como verá en el siguiente capítulo, ++ es unaoperación de los lenguajes C y C++, por lo que utilizar ++ produce un buen juego de pa-labras. Los lenguajes BCPK y B no nos interesan, ya que son versiones anteriores del len-guaje de programación C. Iniciaremos nuestra descripción de C++ con una descripcióndel lenguaje C.

    El lenguaje de programación C fue desarrollado por Dennis Ritchie de AT&T BellLaboratories en la década de los 70. El primer uso que se le dio fue para escribir y darmantenimiento al sistema operativo UNIX. (Hasta ese momento, los programas en sis-temas UNIX se escribían en lenguaje ensamblador o en B, un lenguaje desarrollado porKen Thompson, quien es el creador de UNIX.) C es un lenguaje de propósito generalque puede utilizarse para escribir cualquier clase de programa, pero su éxito y popula-ridad están muy relacionados con el sistema operativo UNIX. Si necesitara mantener susistema UNIX, necesitaría utilizar C. C y UNIX se complementaron tanto que pronto nosólo los programas de sistemas, sino casi todos los programas comerciales que corríanen UNIX se escribieron en lenguaje C. C se volvió tan popular que las versiones del len-guaje se escribieron para otros sistemas operativos populares; su uso no se limita acomputadoras con UNIX. Sin embargo, a pesar de su popularidad, C no está libre dedefectos.

    El lenguaje C es peculiar debido a que es un lenguaje de alto nivel, con muchas carac-terísticas de uno de bajo nivel. C se encuentra entre los extremos de un lenguaje de muyalto nivel y uno de bajo nivel, por lo que tiene tanto sus fortalezas como sus debilidades.Como el lenguaje ensamblador (bajo nivel), los programas en C pueden manipular directa-mente la memoria de la computadora. Por otra parte, C tiene muchas características de unlenguaje de alto nivel, lo que facilita la lectura y escritura más que en el lenguaje ensamblador.Esto hace que C sea una excelente opción para escribir programas de sistemas, pero paraotros programas (y en cierto sentido incluso para programas de sistemas) C no es sencillo deentender, como otros lenguajes; además, no cuenta con muchas verificaciones automáticas,como otros lenguajes de alto nivel.

    Para superar estas y otras deficiencias de C, Bjarne Stroustrup de A