contenido de la lecciÓn 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf ·...

28
MIGUEL Á. TOLEDO MARTÍNEZ FUNDAMENTOS – LECCIÓN 5 5-1 CONTENIDO DE LA LECCIÓN 5 ESTRUCTURA GENERAL DE UN PROGRAMA C++ 1. Introducción 2 2. Modelo de memoria de una computadora 2 3. Estructura de un programa C++ 4 3.1. Sección del preprocesador 5 3.1.1. La Directiva #define 5 3.1.2. La Directiva #include 6 3.2. La sección función principal 8 3.2.1. El enunciado void main ( void ) 8 3.2.2. La palabra void 9 3.2.3. El símbolo de agrupación {} 9 4. Uso de la palabra cout para visualizar salida por pantalla 10 4.1. Ejemplo 5.1, 5.2 10 5. Sugerencia de depuración 12 6. Examen breve 5-1 13 7. Diseño descendente con funciones C++ 13 8. Examen breve 5-2 15 9. Solución de problema : Estado de cuenta de una cuenta de ahorros 16 9.1. Problema 16 9.2. Definición del problema 16 9.3. Planeación de la solución 16 9.4. Codificación del programa 18 10. Lo que necesita saber 21 11. Preguntas y problemas 22 11.1. Preguntas 22 11.2. Problemas 22

Upload: others

Post on 27-Sep-2020

10 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-1

CONTENIDO DE LA LECCIÓN 5

ESTRUCTURA GENERAL DE UN PROGRAMA C++ 1. Introducción 2 2. Modelo de memoria de una computadora 2 3. Estructura de un programa C++ 4

3.1. Sección del preprocesador 5 3.1.1. La Directiva #define 5 3.1.2. La Directiva #include 6

3.2. La sección función principal 8 3.2.1. El enunciado void main( void ) 8 3.2.2. La palabra void 9 3.2.3. El símbolo de agrupación {} 9

4. Uso de la palabra cout para visualizar salida por pantalla 10 4.1. Ejemplo 5.1, 5.2 10

5. Sugerencia de depuración 12 6. Examen breve 5-1 13 7. Diseño descendente con funciones C++ 13 8. Examen breve 5-2 15 9. Solución de problema: Estado de cuenta de una cuenta de ahorros 16

9.1. Problema 16 9.2. Definición del problema 16 9.3. Planeación de la solución 16 9.4. Codificación del programa 18

10. Lo que necesita saber 21 11. Preguntas y problemas 22

11.1. Preguntas 22 11.2. Problemas 22

Page 2: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-2

LECCIÓN 5

ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN

En la lección 4, usted creó varios programas en C++. Hasta ese momento su meta no era entender los enunciados C++, sino más bien, comprender el proceso de crear, com-pilar, vincular y ejecutar programas en C++. Como verá, la mayoría de los programas en C++ siguen el mismo formato, comienzan con uno o más enunciados (directivas) #include, una línea con void main( void ) y luego un conjunto de enunciados agrupados por llaves ({ }). En esta lección aprenderá lo que hacen estos enunciados.

Objetivos de esta lección: • Saber como esta organizada la memoria de la computadora. • Comprender el propósito de los enunciados #define e #include. • Reconocer la sección función principal de un programa C++. • Comprender el propósito de void main( void ). • Comprender el porque utilizando cout se visualiza la salida en la pantalla. • Comprender y utilizar la estructura general de un programa C++ en lo general y sus

funciones en lo particular, para la construcción de programas, ya sean procedimenta-les u orientados a objetos.

Cuando crea un programa en C++, se trabaja en términos de enunciados, no de ins-trucciones. En lecciones posteriores aprenderá el enunciado de asignación, el cual asigna valores a las variables; el enunciado if que permite a su programa tomar decisiones, y así sucesivamente. Por lo pronto, nos referiremos al contenido de su programa como los enun-ciados del programa. MODELO DE MEMORIA DE UNA COMPUTADORA Con el fin de comprender ciertos aspectos de la programación, es esencial saber cómo está organizada la memoria de las computadoras. La memoria se divide habitua l-mente en dos partes: memoria principal y almacenamiento secundario (v.g., unidades de disco y cinta). La memoria principal se asume que tiene acceso directo. Esto es, un acceso a cualquier posición de la memoria principal necesita una cantidad de tiempo fija, inde-pendiente de los accesos anteriores. El tiempo de acceso para la memoria principal es va-rias órdenes de magnitud más rápido que el tiempo de acceso al almacenamiento secunda-rio. Por esta razón, es preferible implementar estructuras de datos en memoria principal –nos referiremos a éstas como estructuras internas de datos. En general, el almacenamiento secundario será usado sólo si una estructura de datos es demasiado grande para estar en la memoria principal. Nos referiremos a las estructuras de datos que residen en almacena-miento secundario como estructuras externas de datos. A continuación vamos a considerar un modelo de la memoria principal que es útil para explicar cómo es asignada cuando una estructura de datos es creada, y cómo es desa-signada cuando una estructura de datos no se necesita más. Este modelo será útil cuando hablemos del concepto de recursividad.

Page 3: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-3

En primer lugar, hagamos una distinción entre estructuras de datos estáticas y di-námicas. Una estructura de datos se dice que es estática si se le asigna una cantidad fija de memoria antes de la ejecución del programa (i.e. durante la compilación). La cantidad de memoria asignada a una estructura de datos estática no cambia durante la ejecución del programa. Si no sabemos por anticipado cuánta memoria será requerida por una estructura de datos durante la ejecución del programa, entonces puede usarse una estructura de datos dinámica para asignar memoria a medida que sea necesitada –esto se conoce como asig-nación dinámica de memoria. Con una estructura de datos dinámica, la cantidad de me-moria que puede usar la estructura de datos no queda determinada durante la compilación. Con este comentario en mente, podemos referirnos al modelo mostrado en la figura 5.1 mientras tratamos el tema de la asignación de memoria. Resulta útil considerar este modelo como un arreglo unidimensional de posiciones de almacenamiento (o bytes) que está dividido en tres partes. A las variables que se mantendrán en la memoria a lo largo de la ejecución del programa se les asigna memoria estática. La cantidad de espacio asignado para la memoria estática se determina durante la compilación, y esa cantidad no cambia durante la ejecución del programa. Memoria alta Memoria baja

Figura 5.1 Un modelo lógico de la memoria principal . En este modelo, la memoria se considera como un arreglo unidimensional de bytes que está dividido en tres partes –memoria estática, memoria libre y pila de ejecución.

El sistema de la computadora mantiene una pila de ejecución en la zona baja de la

memoria (memoria baja). La cantidad de espacio que la pila de ejecución utiliza variará durante la ejecución del programa. Las flechas que salen de la pila de ejecución en la figu-ra 5.1 indican que la pila de ejecución crece hacia la memoria alta y decrece hacia la me-moria baja. Cada vez que un procedimiento es invocado en un programa, un registro de activación se crea y se almacena en la memoria de la computadora en la pila de ejecución. Este registro de activación contiene espacio de almacenamiento para todas las variables

Memoria estática

Memoria libre

Pila de ejecución

Page 4: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-4

declaradas en el procedimiento, así como una copia de, o una referencia a, los parámetros que están siendo pasados al procedimiento. Adicionalmente, un registro de activación de-be contener alguna información que especifique dónde debe continuar la ejecución del pro-grama cuando el procedimiento se complete. A la terminación del procedimiento, el regis-tro de activación asociado será eliminado de la pila de ejecución, y el control del programa volverá al punto especificado en el registro de activación.

Finalmente, el modelo lógico de la memoria principal de la figura 5.1 muestra una

zona de memoria libre que crece hacia la memoria baja y decrece hacia la memoria alta. La memoria que se asigna durante la ejecución (i.e., memoria asignada dinámicamente) se almacena en la memoria libre. Nótese que la pila de ejecución y la memoria libre crece la una contra la otra en este modelo. De este modo, una situación de error obvia se produce si, o bien, demasiada memoria es asignada dinámicamente sin ser desasignada, o bien, se crean demasiados registros de activación.

Mientras la asignación y desasignación de memoria en la pila de ejecución son

controladas por el sistema de la computadora, puede no ser el caso de la memoria libre. En muchos lenguajes de programación, la responsabilidad de desasignar la memoria asignada dinámicamente es del programador. Si la memoria no es devuelta por el programador, en-tonces permanece asignada en la memoria libre. Este enfoque de devolución de la memoria asignada dinámicamente se conoce como el enfoque explícito. Por el contrario, en un enfo-que implícito de la desasignación de la memoria dinámica, son las funciones de gestión de la memoria aportadas por el sistema las responsables de devolver la memoria que no va a ser necesitada más. El enfoque implícito es habitualmente denominado recogida de basura. ESTRUCTURA DE UN PROGRAMA C++

Tenemos ya algunos ingredientes básicos para empezar a escribir programas en C++. Recuerde que C++ es un lenguaje estructurado por módulos. Esta idea es evidente desde la apariencia general o estructura de un programa C++. Vea la figura 5.2. Observe que cualquier programa C++ consta de dos secciones: una sección para el preprocesador o editor y una sección para la función principal.

Es recomendable incluir un comentario en la parte superior de su programa para ex-

plicar el propósito del mismo. Observe que los comentarios en C++ se insertan usando do-ble diagonal hacia adelante ( // ). En la versión de C es /* y */, como lo hemos utilizado en los programas de la lección 4. La doble diagonal le indica al compilador que ignore el re-sto de la línea. De esta manera, un comentario desde el principio de una línea debe empezar con la doble diagonal. La doble línea diagonal puede aparecer en cualquier lugar de una línea, cualquier cosa después de // es ignorada por el compilador. Se hará un amplio uso de los comentarios dentro de los programas en estas lecciones para que el código C++ se do-cumente por sí mismo. Los comentarios dentro de sus programas facilitan su lectura y man-tenimiento.

Page 5: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-5

Figura 5.2. Estructura de un programa C++.

SECCIÓN DEL PREPROCESADOR

C y C++ ofrecen ciertas características del lenguaje a través del uso de un prepro-cesador que es invocado de forma automática antes de la compilación. Concretamente, el preprocesador de C/C++ se usa para modificar el código fuente antes de ser realmente compilado. Las dos directivas del preprocesador más comúnmente utilizadas son #define y #include.

LA DIRECTIVA #define

La directiva #define, que tiene el siguiente formato, se utiliza para realizar la susti-tución de macroinstrucciones (o simplemente macros, vea el anexo Constantes y Macros de esta primera parte):

#define nombre textoRemplazante

Esto indica al preprocesador que reemplace cada aparición del símbolo nombre en

el archivo fuente con el textoRemplazante. Si un valor constante es repetidamente usado en un archivo fuente, es una buena

idea dar un nombre a esta constante usando #define. Esto tiene cierto número de ventajas. Primero, es más fácil y menos probable de cometer errores, escribir el nombre de la cons-tante en lugar del valor de la constante. Adicionalmente, usar un nombre para una constan-te hace más legible el código fuente. Aún más, si deseamos cambiar el valor asociado con este nombre de constante, entonces sólo se requiere una modificación de la directiva #de-fine –el preprocesador asegura que este cambio sea reflejado automáticamente en el códi-go fuente cuando sea recompilado. Esto tiene el deseable efecto de localizar el cambio en el código fuente en un solo enunciado. La mayor desventaja de usar #define de esta mane-

// El comentario general del propósito del programa debe de ir aquí

SECCIÓN DEL PREPROCESADOR

#include <iostream.h> #include <nombreArchivo>

SECCIÓN FUNCIÓN PRINCIPAL void main( void )

{ // Empieza el bloque de la función principal

} // Final del bloque de la función principal

Lugar para declaraciones de las constantes globales.

Las definiciones variable y constante locales para main( ) van aquí

La sección de enunciados del programa va aquí

Page 6: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-6

ra es que puede dar lugar a resultados erróneos si no se usan apropiadamente los parénte-sis. Por ejemplo, considérese la sentencia del preprocesador:

#define PI 0.14159 + 3.0

Debido a la precedencia de los operadores involucrados, el uso de esta definición

en la expresión C/C++:

a = 2 * PI

asignaría 3.28318 a a, en vez de 6.28318. En los programas C++, la disponibilidad de la palabra reservada const convierte en obsoleto el uso de #define. También es posible definir macros que reciban argumentos. Por ejemplo, el si-guiente enunciado define un macroinstrucción que calcula el valor absoluto de su argu-mento:

#define abs(x) ((x) > 0 ? (x) : -(x)) Si a, b y c son variables, entonces el siguiente enunciado en el código fuente:

c = abs(a – b);

sería expandida por el procesador como:

c = ((a – b) > 0 ? (a – b) : -(a – b));

Aunque el uso de abs( ) parece una llamada a función, realmente se expande a có-digo insertado dentro del enunciado. Esto significa que con el uso de abs( ) no hay los cos-tos (mayor tiempo) adicionales asociados con la llamada a una función. En muchos casos, los ahorros pueden ser significativos, si abs( ) fuera implementada como una función sim-ple, el costo adicional de la llamada podría ser más caro que los cómputos reales ejecuta-dos en la función. De nuevo, el principal problema asociado con este uso de #define es que puede conducir a problemas si no se usan apropiadamente los paréntesis. Veremos que en C++, esta clase de macroinstrucciones no serán necesarias nunca más –su uso se convierte en obsoleto con la disponibilidad de funciones insertadas o en línea.

NOTA: Le recomendamos nuevamente que lea el anexo CONSTANTES Y MACROS al final de

esta primera parte. LA DIRECTIVA #include

La otra forma en que se usan las directivas del preprocesador es para incluir archi-

vos. Si un programa se compone de varios archivos fuente, entonces la práctica común es recoger todas las declaraciones de variables externas, prototipos de funciones y directivas #define para ese programa en un archivo aparte, denominado archivo de encabezado o ar-chivo de cabecera (en estas lecciones los llamaremos indistintamente). Este archivo de encabezado puede entonces ser incluido en los archivos fuente usando la directiva del pre-procesador #include. Al usar archivos de encabezado de esta forma se garantiza que cada

Page 7: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-7

uno de los archivos fuente de un programa recibirá el mismo conjunto de declaraciones y definiciones externas. El preprocesador reemplaza cualquier sentencia de la forma:

#include <nombreArchivo>

con el contenido del archivo nombreArchivo. Un formato alternativo es:

#include "nombreArchivo"

La diferencia entre uno y otro formato es el orden en el que el preprocesador busca nombreArchivo. Si el nombre del archivo de cabecera se incluye entre pico paréntesis, se asume que es un archivo de encabezado estándar (i.e., un archivo de encabezado suminis-trado con el compilador C/ C++), la búsqueda procede en cierto orden predefinido de direc-torios. Si el archivo de encabezado se incluye entre comillas, entonces se asume que el archivo es suministrado por el usuario, y la búsqueda comienza en el directorio actual, se-guida por una búsqueda en directorios en cierto orden predefinido. Adicionalmente, el con-venio es utilizar un sufijo .h para los nombre de archivos de encabezado. No resulta inusual que un archivo de encabezado contenga a su vez cierto número de directivas #include. Debido a este anidamiento, es posible que un archivo de encabezado sea incluido múltiples veces en un archivo fuente. Lo que conduce a errores de redeclara-ción durante la compilación. Este problema puede ser evitado colocando una directiva con-dicional del preprocesador en cada archivo de encabezado. Por ejemplo, con el fin de ga-rantizar que el archivo de encabezado mi_cabecera.h sea incluido sólo una vez en un ar-chivo fuente dado, rodearemos el contenido de mi_cabecera.h con los siguientes enuncia-dos del preprocesador: #ifndef MICABECERA #define MICABECERA /* contenido de mi_cabecera.h */ #endif La directiva condicional #ifndef se evalúa como verdadero si el nombre que le sigue no ha sido previamente definido. De este modo, la primera inclusión del archivo mi_cabecera.h define el nombre MICABECERA, e incorpora el contenido del archivo de encabezado en el archivo fuente; las siguientes inclusiones encontrarán este nombre defini-do y saltarán hasta el #endif, sin incluir el contenido del archivo.

Los compiladores C++ tienen archivos de encabezado estándar que contienen rut i-nas comunes para los programas. Consulte el manual de referencia del compilador para conocer la lista completa de estos archivos y las rutinas que contienen. Los archivos de encabezado estándar que usaremos en forma extensa son los archivos iostream.h, ioma-nip.h, stdio.h, stdlib.h, math.h, string.h, etc. También, crearemos nuestros propios archi-vos de encabezado, sobre todo cuando trabajemos con la programación orientada a objetos.

Si examina los directorios que contienen los archivos del compilador, encontrará un subdirectorio llamado include, el cual tiene varios archivos de encabezado. Cada archivo de encabezado contiene definiciones que el compilador proporciona para diferentes operacio-

Page 8: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-8

nes. Por ejemplo, hay un archivo de encabezado que proporciona definiciones para opera-ciones matemáticas y varios archivos de encabezado para operaciones de archivos.

Un último punto: no termine una declaración al preprocesador con punto y coma,

ya que una declaración al preprocesador no es ejecutable en C++. Recuerde, una declara-ción al preprocesador simplemente actúa como un editor de sustitución inteligente para el compilador.

SECCIÓN FUNCIÓN PRINCIPAL

En la sección función principal es donde se escribe el cuerpo de la solución del problema. Como verá pronto, un programa C++ es simplemente una colección de bloques de función.

Una función en C++ es un subprograma que regresa un valor simple o una serie de valores, o que realiza alguna tarea específica, como E/S.

Observe el formato que se muestra en la figura 5.2. El identificador de la función

principal es main( ). El identificador de la función principal es precedido por la palabra reservada void. La razón de esto se verá en breve. Una llave izquierda, {, debe seguir al identificador de la función principal antes que cualquier declaración o enunciado. Esta llave define el inicio del bloque de la función principal y por lo general aparece directa-mente abajo de main( ). En la parte inferior de la figura 5.2, observará una llave derecha, }. Esta llave se usa para definir el final del bloque de la función principal. En C++ siempre deberá usar una serie de llaves, { }, para definir un bloque de código. Así, la serie de llaves en la figura 5.2 define el bloque de la función principal.

Debe declarar cualquier constante global antes de main( ). Las constantes globales

son aquellas que se pueden acceder en cualquier punto del programa, a diferencia de las constantes locales, que sólo se accedan en el bloque del programa en el que fueron defini-dos. Los objetos constante y variable local se pueden declarar/definir en cualquier lugar en un bloque del programa siempre y cuando se declaren o definan antes de usarse. Se sugiere declarar los objetos constante como globales y los objetos variable como locales, siempre que sea posible. La razón para esto se hará patente cuando aprenda más acerca de la programación estructurada.

La sección de enunciados de main ( ) es el cuerpo ejecutable principal del progra-

ma. Los enunciados del programa y las declaraciones, van ahí. Cada enunciado ejecutable debe terminar con un punto y coma. Debido a que C++ es un lenguaje modular, la sección de enunciados del programa a menudo consiste en llamadas a bloques de función adicio-nal, cuya ejecución combinada realiza la tarea general del programa.

El ENUNCIADO void main( void ) Cuando crea un programa C++, su archivo fuente contendrá enunciados. El orden en que aparecen los enunciados en su programa no es necesariamente el orden en el que se ejecutarán cuando corra el programa. Todo programa C++ contiene una instrucción en el que comienza a ejecutarse. El enunciado void main( void ) indica el inicio de su programa.

Page 9: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-9

LA PALABRA void

Cuando examina diferentes programas C++, encontrará frecuentemente la palabra void. La palabra void se utiliza normalmente para especificar que una función no regresa un valor o que no transfiere alguno. Si usa el ambiente MS-DOS, el programa puede salir a DOS con un valor de salida que los archivos por lote pueden utilizar usando el comando IF ERRORLEVEL. Por ejemplo, suponga que un programa llamado NOMINA.EXE se sale con uno de los siguientes valores, dependiendo del resultado de su proceso.

Valor Significado 0 Éxito 1 No se encontró el archivo 2 Impresora sin papel

Con un archivo por lotes, puede probar la situación de su programa utilizando el

comando IF ERRORLEVEL de la siguiente manera:

NOMINA.EXE IF ERRORLEVEL O IF NOT ERRORLEVEL 1 GOTO EXITO IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 GOTO NO_ARCHIVO IF ERRORLEVEL 2 IF NOT ERRORLEVEL 3 GOTO SIN_PAPEL REM le siguen otros comandos.

La mayoría de los programas C++ que se elaborarán en estas lecciones no regresan ningún valor al sistema operativo. Por esta razón, debe escribir la palabra void antes de main, como se muestra a continuación:

void main( void ) Indica que el programa no regresa ningún valor

Más adelante aprenderá que sus programas pueden utilizar información (tal como el nombre de un archivo) que el usuario especifica en la línea de comandos cuando ejecuta el programa. Cuando un programa no utiliza información en la línea de comandos, escribe la palabra void entre los paréntesis que siguen a main, como se muestra a continuación: void main( void )

Indica que el programa no utiliza parámetros en la línea de co-

mandos.

El SÍMBOLO DE AGRUPACIÓN { }

Cuando su programa se vuelve más complejo, con frecuencia requerirá ejecutar un conjunto de enunciados un número determinado de veces y otro conjunto distinto de enun-ciados si cierta condición es verdadera. En un programa C++ deberá usar las llaves izquier-da y derecha ( { } ) para agrupar enunciados relacionados.

Page 10: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-10

USO DEL OBJETO cout PARA VISUALIZAR SALIDA POR PANTALLA Para visualizar un mensaje, el programa utiliza cout y el doble signo menor que ( << ), como se muestra a continuación:

cout << "¡Hola, C++!";

El objeto cout es una salida que C++ asocia con el dispositivo de salida del sistema operativo. Por omisión, el sistema operativo asocia la salida con el monitor. Sin embargo utilizando el operador de redireccionamiento, puede enviar la salida de un programa a un archivo o a la impresora. Por ejemplo, el siguiente comando le indica al DOS que envíe la salida del progra-ma PRIMERO.EXE a la impresora:

C:\> PRIMERO > PRN <Intro>

Nota: Este tema será ampliamente tratado en la lección 6: Como enviar mensajes a la pantalla. Veamos a continuación algunos ejemplos:

Ejemplo 5.1 Escriba un programa, IMPUESTO.CPP , que calcule el impuesto de un artículo vendido cuyo precio es $121.95. La tasa del impuesto es fija e igual a 0.07. Suponga que debe incluir un archivo del sistema llamado iostream.h para que el programa realice alguna tarea de E/S. Use la estructura del programa mostrada en la figura 5.2 y las definicio-nes del ejemplo 3.11 (página 3-35)

Solución

En el ejemplo 3.11 usamos el siguiente enunciado para calcular el impuesto de la venta: impuestoVentas = precio * TASA_IMPUESTO; Donde impuestoVentas y precio se definieron como objetos variable de punto flotante y TASA_IMPUESTO se declaró como un objeto constante con un valor de 0.07. Ingresando esta información en la estructura del programa C++ mostrado en la figura 5.2, se obtiene lo siguiente:

Page 11: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-11

Este programa calcula el impuesto de la venta de un artículo determinado. El precio del ar-tículo es de $121.95. El programa empieza con un comentario breve acerca de su propósito. Observe la estructura: una de las instrucciones del preprocesador aparece al principio, después, una constante global; enseguida la función main( ). La instrucción del preproce-sador incluye el archivo de encabezado iostream.h que contiene el objeto cout que se em-plea al final del programa para mostrar el impuesto de la venta. La función main( ) empie-za por definir los objetos variable que se usan dentro del bloque principal. El valor de $121.95 se asigna a precio, seguido por el cálculo del impuesto de las ventas. Una vez que se realiza el cálculo, el valor que resulta de los impuestos de las ventas (impuestoVentas) se muestra en la pantalla del monitor usando el objeto cout. Observe que los enunciados del programa se sangran unos tres espacios dentro del bloque de la función principal. Tal sangría se permite, aunque no es obligatoria, porque C++ igno-ra los espacios. Además, la sangría muestra en forma clara que los enunciados son parte del bloque de la función main( ). La sangría se usa para iniciar un bloque de código para que no sea confundido con otros bloques de código. Utilizaremos ampliamente las sangrías dentro de nuestros programas C++ para hacerlos más fáciles de leer y comprender. Tam-bién, observe el uso de los comentarios dentro del programa. Siéntase libre de hacer co-mentarios significativos para que el programa se documente por sí mismo.

Ejemplo 5.2 Escriba un programa, MSTRVARS.CPP, que asigne valores a tres variables (edad, salario, distanciaLuna) de clase entera, flotante y entero largo respectivamente. Posteriormente de-be mostrar el valor asignado a estas variables.

/* El siguiente programa: IMPUESTO.CPP, calcula el impuesto de un artículo vendido, cuyo precio es de $121.95. La tasa del impuesto es de 0.07. */ #include <iostream.h> // Para cout const float TASA_IMPUESTO = 0.07; // Tasa del impuesto de ventas, en decimales void main( void ) { // DEFINICION DE VARIABLES LOCALES float precio = 0.0; // Precio de venta de un artículo float impuestoVentas = 0.0; // Impuesto de las ventas calculado para un artículo // CALCULO DEL IMPUESTO DE VENTAS precio = 121.95; //Asigna $121.95 a precio impuestoVentas = precio * TASA_IMPUESTO; //MUESTRA EL IMPUESTO DE VENTAS cout << impuestoVentas << endl; } //Fin de main()

Page 12: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-12

Solución:

Nota: Se utiliza el modificador setprecision( ) para mostrar el salario, ya que de no hacerlo el re-sultado mostrado por el compilador sería de 25000.8. Posteriormente se dará más informa-ción sobre el uso de este modificador.

/* El programa siguiente: MSTRVARS.CPP, asigna valores a tres variables y posterior- mente visualiza cada valor de la variable con cout. */ #include <iostream.h> // Para cout #include <iomanip.h> // Para setprecision() void main( void ) { int edad = 32; float salario = 25000.75; long distanciaLuna = 238857; // Distancia de la tierra a la luna cout << "La edad del empleado es : " << edad << endl; cout << "El empleado gana : $" << setprecision( 7 ) << salario << endl; cout << "La distancia a la luna es de: " << distanciaLuna << " millas desde la tierra" << endl; } // Fin de main()

SUGERENCIA DE DEPURACIÓN

Ya que otros programadores pueden leer o posiblemente modificar su programa, necesita es-cribirlo lo más legible posible. Algunas técnicas para lograr este objetivo son:

•• Darle nombre significativo a las variables. •• Uso de sangrías en los enunciados. •• Uso de líneas en blanco para separar enunciados relacionados. •• Uso de comentarios que expliquen el objetivo del proceso. Los comentarios de un programa en C++ se insertan usando la doble diagonal, //. Cuando el

compilador C++ encuentra la doble diagonal, ignora el resto de la línea en el que las diagonales apare-cen, por ejemplo:

// Esta es una línea de comentarios.

Los comentarios del programa son una parte importante y deberán usarse en forma libre. Se

sugiere que los programas por lo menos incluyan los siguientes comentarios: •• El inicio del programa debe comentarse con el nombre del programador, la fe-

cha en que fue escrito, la fecha en que el programa tuvo la última revisión, y el nombre de la persona que hizo la revisión. En otras palabras, un breve registro de mantenimiento progresivo debe comentarse al inicio del programa.

•• El inicio del programa debe comentarse para explicar el propósito del mismo,

que incluye la definición del problema y los algoritmos del programa. Esto pro-porciona una perspectiva general para cualquiera que desee depurar o darle mantenimiento al programa.

Page 13: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-13

DISEÑO DESCENDENTE CON FUNCIONES C++ El diseño de C++ por sí mismo motiva el uso del diseño y la programación estruc-turada. El diseño estructurado es una metodología que requiere que el software sea elabo-rado usando un enfoque modular descendente o de arriba-abajo (top-down). La programa-ción estructurada le permite escribir los programas usando estructuras de control bien defi-nidas e independientes de los módulos del programa. Como pronto descubrirá, las reglas que se aplican a C++ lo animarán a escribir pro-gramas modulares bien organizados que sean fáciles de leer, entender, modificar y man-tener. Los programas modulares estructurados le permiten dividir y vencer un problema de programación complejo y de gran tamaño usando un enfoque descendente o de arriba-abajo (top-down). La idea es dividir un problema complejo en grupos de subproblemas más sencillos o módulos. Los módulos de programa individuales se llaman funciones, las cua-les se escriben para solucionar los subproblemas más simples. Después, los módulos fun-ción pueden fácilmente combinarse para solucionar un problema general complejo. Esta idea se muestra en la figura 5.3. Un lenguaje no estructurado, como BASIC, proporciona soluciones simples para problemas sencillos. Sin embargo, los lenguajes no estructurados necesitan soluciones complejas para problemas complejos, debido a la imposibilidad de formar módulos, o estructuras.

EXAMEN BREVE 5-1

•• Debe comentar el propósito de las instrucciones del preprocesador. •• Debe comentar el propósito de los objetos constante y variable. •• Debe comentar las secciones principales de un programa para explicar el propó-

sito general de la sección respectiva. •• Debe comentar las líneas individuales del programa cuando el propósito del có-

digo no es relativamente obvio para la aplicación. •• Todos los subprogramas (las funciones en C++) deben comentarse. •• El final de cada bloque de programa (llave derecha) debe comentarse para indi-

car que es el final de la llave.

Recuerde, alguien (incluso usted) puede tener que depurar o mantener el programa en el futuro. Un buen esquema de comentario hace esta tarea mucho más eficiente y un proceso pla-centero.

•• En los ejercicios anteriores y en los subsecuentes seguiremos parte de estas

recomendaciones. Intencionalmente se evitan algunas de ellas para no incrementar el número de hojas de estos apuntes.

Page 14: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-14

... ...

Figura 5.3. La idea divide y vencerás sustenta un lenguaje de programación estructurada como C++.

Las funciones que se crean para uso propio en un programa se llaman funciones de-finidas por el usuario. En este sentido, el usuario es usted, el programador.

Una función definida por el usuario es un bloque de enunciados o subprograma, que el programador escribe para realizar una tarea específica.

A una función se le da un nombre y se le llama o invoca usando su nombre cada

vez que se va a realizar la tarea dentro del programa. El programa que llama o invoca una función a menudo se conoce con el nombre de programa llamador.

Las funciones eliminan la necesidad de duplicar las declaraciones dentro de un

programa. Dada una tarea que se va a realizar más de una vez, las declaraciones se escri-ben sólo una vez dentro de una función. Posteriormente, se hace un llamado a la función cada vez que debe realizarse la tarea. El uso de las funciones mejora la claridad y la legibi-lidad del programa. Y lo más importante, el uso de funciones dentro de un lenguaje estruc-turado como C++ le permite solucionar problemas complejos muy grandes usando un en-foque de diseño de programa descendente.

En la figura 5.4 se muestra la estructura de un programa C++ que emplea funcio-

nes definidas por el usuario.

Problema complejo

Subproblema 1

Subproblema 2

Subproblema 3

Subproblema N

Función 1

Función 2

Solución del Programa complejo

Función N Función

3

Page 15: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-15

Figura 5.4. Estructura de un programa C++ que emplea funciones definidas por el usuario.

En ésta se observan dos funciones definidas por el usuario que se han adicionado a la función main( ). Las funciones definidas por el usuario se escriben para realizar una tarea específica requerida por el programa. Cuando la tarea respectiva debe realizarse, se hace una llamada dentro de main( ) a la función requerida.

Observe la estructura del bloque. La función main( ) es el módulo de programa

principal y funccion1( ) y funcion2( ) son submódulos del programa, que se llaman o invocan por medio de main( ) cuando se necesitan. Posteriormente aprenderá cómo escri-bir sus propias funciones. Por ahora, es importante que comprenda la idea de estructurar en forma descendente o de arriba-abajo empleada por el lenguaje C++ o cualquier otro len-guaje estructurado para ese propósito.

void main( void ) {

Llamar a la funcion1 ( ); Llamar a la funcion2 ( );

} // Fin de main( )

funcion1( ) {

} // Fin de la funcion1( )

funcion2( ) {

} // Fin de la funcion2( )

EXAMEN BREVE 5-2

Page 16: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-16

SOLUCIÓN DE PROBLEMA: ESTADO DE CUENTA DE UNA CUENTA DE AHORROS. PROBLEMA

Su banco local lo contrató para diseñar un programa estructurado que procese datos de las cuentas de ahorro. Desarrolle una serie de algoritmos relacionados con el uso del método de diseño estructurado de arriba-abajo (descendente) que se pueda codificar en un lenguaje de programación estructurada.

DEFINICIÓN DEL PROBLEMA

Salida: Este programa generará un reporte de una cuenta bancaria en base a la información proporcionada por el usuario. Ingrese el balance de la cuenta: $2345.00↵ Ingrese los depósitos de este mes: $512.56↵ Ingrese los retiros de este mes: $1378.00↵ El balance de la cuenta actualmente es: $1481.04 Los depósitos fueron: $512.56 Los retiros fueron: $1378 Entrada: balance, depositos, retiros. Procesamiento: balance = balance + depositos – retiros balance = balance + ( balance * INTERES )

PLANEACIÓN DE LA SOLUCIÓN

Con el uso del diseño estructurado, empezaremos en dividir el problema en subproblemas individua-les para solucionar el problema. Trate de identificar las tareas individuales para solucionar el pro-blema. Primero, el usuario debe ingresar los datos de la transacción requerida, las cuales incluirán el balance del mes anterior, depósitos y retiros del mes actual. Una vez que se ingresan los datos de la transacción, el programa debe adicionar los depósitos al balance de la cuenta, restar los retiros de la cuenta, calcular el interés y generar el reporte necesario. Como resultado, podemos identificar cinco tareas del programa como sigue:

•• Obtener del usuario los datos de la transacción. •• Agregar los depósitos al balance anterior de la cuenta. •• Restar los retiros del balance anterior de la cuenta. •• Calcular el interés de la cuenta. •• Generar el reporte mensual de la cuenta.

La figura 5.5 muestra el diagrama de la estructura en donde se ven los bloques necesarios para el programa:

Page 17: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-17

Figura 5.5. Diagrama de estructura para el problema bancario.

Con un enfoque algorítmico tendremos la siguiente solución: Debido a que usaremos la técnica estructurada de bloques para diseñar el programa, debemos em-plear el refinamiento paso a paso para desarrollar el algoritmo. El nivel de algoritmo inicial, estado-Cuenta( ), reflejará la definición del problema y llama a los módulos de los subprogramas individua-les o funciones como sigue:

ALGORITMO INICIAL estadoCuenta( )

INICIO Escribir( "Este programa generará un reporte de una cuenta bancaria en" , saltar( 1 ), "base a la información proporcionada por el usuario." , saltar( 2 ) ).

Llamar a la función obtenerDatos( ) para obtener los datos de la transacción. Saltar( 1 ). Llamar a la función agregarDepositos( ) para adicionar los depósitos en la cuenta.

Llamar a la función restarRetiros( ) para restar los retiros de la cuenta. Llamar a la función calcularInteres para calcular el interés de la cuenta.

Llamar a la función generarReporte( ) para mostrar el reporte de la cuenta. FIN.

El primer nivel de refinamiento requiere que mostremos un algoritmo detallado para cada módulo del subprograma o función. Estos son como sigue: PRIMER NIVEL DE REFINAMIENTO

obtenerDatos( )

Inicio Escribir ( "Ingrese el balance de la cuenta: $" ). Leer( balanceAnterior ). Escribir ( "Ingrese los depósitos de este mes: $" ). Leer( depositos ). Escribir ( "Ingrese los retiros de este mes: $" ). Leer( retiros ).

Fin.

estadoCuenta() Determinación del balance mensual de una cuenta de ahorros

obtenerDatos()

Obtención de los datos de las tra nsacciones

agregarDepositos()

Adición de los depósitos

restarRetiros()

Substracción de los retiros

calcularInteres()

Cálculo del interes

generarReporte()

Generar el reporte

balance, deposito, retiro

balance, deposito, retiro

balance, deposito

balance balance, deposito

balance balance balance balance, deposito, retiro

Page 18: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-18

agregarDepositos( ) Inicio

Calcular balanceActual = balanceAnterior + depositos. Fin. restarRetiros( ) Inicio

Calcular balanceActual = balanceActual – retiros. Fin.

calcularInteres( )

Inicio Calcular balanceActual = balanceActual + ( balanceActual * interes ).

Fin. generarReporte( ) Inicio

Escribir( “El balance de la cuenta actualmente es: $”, balanceActual , saltar( 1) ).

Escribir( “Los depósitos fu eron: $”, depositos, saltar( 1 ) ).

Escribir( “Los retiros fueron: $”, retiros, saltar( 1 ) ). Fin.

CODIFICACIÓN DEL PROGRAMA

La solución del problema anterior se puede codificar fácilmente en cualquier lenguaje de programa-ción estructurada. A continuación la codificación C++ de los algoritmos anteriores.

// El siguiente programa: ESTRUC1.CPP, muestra la naturaleza estructurada en bloques de C++. #include <iostream.h> // Para cin y cout. // Define INTERES como una constante global. const float INTERES = 0.01; // Tasa actual mensual del interés en formato decimal. // Prototipo de funciones. void obtenerDatos( float &, float &, float & ); void agregarDepositos( float &, float ); void restarRetiros( float &, float ); void calcularInteres( float & ); void generarReporte( float, float, float ); void main( void )

{ // Define las variables del argumento de la función float balance = 0.0; // Balance de la cuenta. float depositos = 0.0; // Depósitos mensuales. float retiros = 0.0; // Retiros mensuales. // Muestra el mensaje de descripción del programa. cout << "Este programa generará un reporte de una cuenta bancaria en\n" "base a la información proporcionada por el usuario." << endl << endl; // Funciones llamada obtenerDatos( balance, depositos, retiros ); agregarDepositos( balance, depositos ); restarRetiros( balance, retiros ); calcularInteres( balance ); generarReporte( balance, depositos, retiros ); } // Final de main( )

Page 19: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-19

Hasta este punto, el código parece un poco abrumador. Sin embargo, no se preocupe por los detalles de la codificación; sólo observe las cosas que se relacionan con lo que explicamos en esta lección. Primero, observe la estructura general del programa. Un comentario general sobre éste aparece en la parte superior, seguido por las instrucciones del preprocesador, y después por la función main( ), la cual es seguida por un código de función individual. Observe que el único propósito de main( ) es llamar a las funciones individuales en el orden en que se necesiten para solucionar el problema. Las funciones individuales simplemente implementan sus algoritmos respectivos usando el código C++. Segundo, observe las declaraciones/definiciones del objeto. El objeto constante INTERES se declara antes que main( ) para hacerla una constante global y, por lo tanto, accesible en todo punto del pro-grama. Esto significa que es accesible a main( ) así como a todas las otras funciones definidas en el programa. Los objetos variable balance, depositos y retiros se definen al principio de main( ). Estos objetos se listan como argumentos en las llamadas de la función. Un argumento de una función es un valor de datos que la función necesita para realizar su tarea. Más adelante se hablará de esto.

// Esta función obtiene la información mensual de la cuenta por el usuario. void obtenerDatos( float &balance, float &depositos, float &retiros ) { cout << "Ingrese el balance de la cuenta : $"; cin >> balance; cout << "Ingrese los depósitos de este mes: $"; cin >> depositos; cout << "Ingrese los retiros de este mes : $"; cin >> retiros; } // Fin obtenerDatos( ) // Esta función adiciona los depósitos mensuales al balance de la cuenta. void agregarDepositos( float &balance, float depositos ) { balance = balance + depositos; } // Fin agregarDepositos( ) // Esta función sustrae los retiros mensuales desde el balance de la cuenta. void restarRetiros( float &balance, float retiros ) { balance = balance - retiros; } // Fin restarRetiros( ) // Esta función adiciona los intereses mensuales al balance de la cuenta. void calcularInteres( float &balance ) { balance = balance + (balance * INTERES); } // Fin calcularInteres( ) // Esta función muestra el reporte mensual de la cuenta. void generaReporte( float balance, float depositos, float retiros ) { cout << endl; cout << "El balance de la cuenta actualmente es: $" << balance << endl; cout << "Los depósitos fueron : $" << depositos << endl; cout << "Los retiros fueron : $" << retiros << endl; } // Fin generarReporte( )

Page 20: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-20

Por último, observe el amplio uso de los comentarios. Se ha comentado el propósito del programa, así como el propósito de cada función. Un comentario se coloca con cada declaración constante y de-finición variable para especificar su propósito en el programa.

El código C++ anterior incluye el uso de las funciones para implementar los diferentes módulos del programa. No pasará mucho tiempo antes de que escriba programas estructurados en C++ como éste. Sin embargo, podemos implementar problemas simples como el anterior usando un enfoque lineal. El término lineal o plano surge de la idea de que aplanaremos la estructura jerárquica del programa codificando todos los pasos de programa como una secuencia de declaraciones en línea como parte de la función main( ).

A continuación la solución plana o lineal:

/* El siguiente programa: ESTRUC2.CPP, representa la solución plana o lineal para el problema bancario */ #include <iostream.h> // Para cin y cout // Se define la constante INTERES como global const float INTERES = 0.01; // Tasa actual mensual de interés en formato decimal. void main( void )

{ float balance = 0.0; // Balance de la cuenta float depositos = 0.0; // Depósitos mensuales float retiros = 0.0; // Retiros mensuales // Muestra el mensaje de descripción del programa. cout << "Este programa generará un reporte de una cuenta bancaria en\n" "base en la información proporcionada por el usuario" << endl << endl; // Obtención de la información de la cuenta mensual introducida por el usuario cout << "Ingrese el balance de la cuenta : $"; cin >> balance; cout << "Ingrese los depósitos de este mes : $"; cin >> depositos; cout << "Ingrese los retiros de este mes : $"; cin >> retiros; // Suma de los depósitos mensuales al balance de la cuenta balance = balance + depositos; // Resta de los retiros mensuales balance = balance - retiros; // Adición del interés mensual balance = balance + (balance * INTERES); // Presentación en pantalla del reporte mensual de la cuenta cout << endl; cout << "El balance de la cuenta actualmente es: $" << balance << endl; cout << "Los depósitos fueron : $" << depositos << endl; cout << "Los retiros fueron : $" << retiros << endl;

} // Fin de main( )

Page 21: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-21

Como puede observar, cada una de las declaraciones de función anteriores se ha codificado en línea como parte de main( ). Este tipo de implementación es adecuado para problemas simples como éste. Escribiendo los comentarios apropiados en el programa el código del mismo es claro y fácil de en-tender. En las siguientes lecciones, emplearemos implementaciones planas. Después, conforme los problemas sean más complejos, necesitaremos implementar los mó dulos del programa como las fun-ciones C++ y reemplazar las declaraciones del programa en línea con llamadas a aquellas funciones como lo hicimos en el programa anterior. Sin embargo, antes de poder hacer esto, necesita aprender detalles de implementación básica del lenguaje C++. Las siguientes lecciones están dedicadas a este propósito.

LO QUE NECESITA SABER

qq Los programas C++ constan de dos secciones: la sección del preprocesador (editor) y la de la función principal .

qq La sección del preprocesador contiene instrucciones que proporcionan tareas de edi-ción inteligentes en el programa.

qq La mayoría de los programas C++ comienza con el enunciado #include, el cual le indi-ca al compilador que incluya dentro del programa el contenido del archivo de encabe-zado especificado.

qq Los archivos de encabezado contienen definiciones proporcionadas por el compilador que su programa puede utilizar.

qq La línea #include <iostream.h> le dice al preprocesador de C++ que incluya en el pro-grama el archivo de encabezado de flujo de entrada/salida. Este archivo contiene infor-mación necesaria para compilar programas en los que se emplean cin y cout y los ope-radores << y >>.

qq Un archivo fuente puede consistir de muchos enunciados: el enunciado void main( void ), indica el principio del programa principal, el cual contiene el primer enunciado que el programa ejecutará.

qq La ejecución de los programas en C++ inicia en la función main( ).

qq Los comentarios de una sola línea comienzan con //. Los programadores insertan co-mentarios para documentar los programas y simplificar su lectura. Los comentarios no provocan que la computadora realice ninguna acción al ejecutarse el programa.

qq La sección enunciados del programa es el cuerpo principal ejecutable del programa y se llama el bloque de la función principal. Esta sección empieza con main( ), seguida por una llave izquierda y se cierra con una llave derecha.

qq El bloque de la función principal de un programa es donde se tiene acceso a todos los códigos C++ ejecutables.

qq Cuando su programa se vuelve más complejo, deberá agrupar enunciados relaciona-dos mediante el uso de llaves.

qq Las declaraciones de la constante global deben hacerse antes que main( ).

qq Los objetos variable locales pueden definirse en cualquier lugar en el programa antes de usarlos, pero un buen estilo sugiere que se definan al inicio del bloque de la función en donde se utilizan.

qq Los objetos constante deben declararse globales tanto como sea posible, mientras que los objetos variable deben definirse como locales tanto como sea posible.

qq La mayoría de los programas C++ utilizan el objeto cout para visualizar información en la pantalla. Sin embargo, utilizando el operador de redireccionamiento del sistema operativo, puede redireccionar la salida a un archivo, impresora o bien que sea la entra-da de un segundo programa.

qq El diseño estructurado es una metodología que requiere que el software sea diseñado con un enfoque modular de arriba-abajo o descendente.

Page 22: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-22

qq La programación estructurada permite que los programas se escriban usando estruc-turas de control bien definidas y módulos de programa independientes.

qq El lenguaje C++ facilita la programación estructurada con funciones definidas por el usuario. Éstas se codifican después de main( ) y se escriben para realizar las tareas es-pecíficas requeridas por el programa.

qq Las funciones definidas por el usuario se llaman o invocan cuando se necesitan.

PREGUNTAS Y PROBLEMAS PREGUNTAS 1. Explique cómo C++ emplea las funciones para que le permitan un diseño de programa-

ción estructurado de arriba-abajo o descendente.

2. ¿Dónde se coloca el código de funciones definidas por el usuario en un programa C++?

3. Mencione al menos tres lugares donde deben estar los comentarios en un programa C++.

4. Llene los siguientes espacios en blanco. a. Cada programa C++ inicia su ejecución en la función _______________. b. Con una ___________ se inicia el cuerpo de cada función y con una _________ se termina. c. Cada instrucción termina con _______________. d. La secuencia de escape ‘\n’ representa el carácter ____________ que provoca que el cursor se co-

loque al inicio de la siguiente línea de la pantalla. e. La instrucción _________ sirve para tomar decisiones.

5. Indique si las siguientes oraciones son verdaderas o falsas. Si son falsas, explique por qué. a. Los comentarios provocan que, al ejecutarse el programa, la computadora imprima en la pantalla el

texto que se encuentra después de //. b. La secuencia de escape ‘\n’, cuando es enviada a la salida mediante cout, causa que el cursor se co-

loque al inicio 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 una clase cuando se declaran. e. C++ considera que las variables numero y NuMeRo son iguales. f. Las declaraciones pueden aparecer en casi cualquier parte del cuerpo de una función C++.

PROBLEMAS 1. En C++ se usa el símbolo igual ( = ) para indicar una operación de asignación. Por aho-

ra, puede pensar en esto como una operación de igualación, pero después descubrirá que el significado es diferente al signo igual. De acuerdo con lo siguiente.

// Problema 5-1 #include <math.h> // Para usar sqrt( ) // Declaración de constantes const float VALOR = 2.5; void main( void ) {

Page 23: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-23

// Definición de variables int x = 0; int y = 0; float a = 0.0; float b = 0.0; }//Fin de main( )

Determine los resultados de las siguientes expresiones:

a. x = 25; i ) b= sqrt( x );

b. y = 5; i ) a = sqrt( sqrt( y ) );

c. x = 1; i ) x = x + 1; ii) y = sqrt( x );

d. x = 2; i ) y = x + x; ii) a = ( y+1 ) * VALOR;

e. x = 2; i ) y = x + x; ii) a = y + 1 * VALOR;

2. En C++ se usa el objeto cout para mostrar un valor en la pantalla del monitor. El forma-to para esta operación es:

cout << objeto o valor variable mostrado << endl;

Observe que los símbolos << dirigen el valor y objeto variable al objeto cout. El comando endl crea un retorno y avance de línea (CRLF) y fluye la salida a la memoria temporal. Así para mostrar el valor del objeto x en un programa, use el siguiente enunciado:

cout << x << endl; Codifique el programa que se mostró en el problema 1, incluyendo los segmentos del pro-grama proporcionados. Adicione un enunciado cout para cada uno de estos segmentos para mostrar el resultado del valor del objeto variable. Para usar el objeto cout deberá incluir el archivo de encabezado iostream.h. Compile, vincule y ejecute el programa. Verifique que la salida que generará el programa es correcta de acuerdo con los cálculos respectivos del programa.

3. El conjunto de caracteres que utiliza una computadora y sus representaciones corres-pondientes en enteros se llama conjunto de caracteres de la computadora. Para impri-mir un carácter, basta con encerrarlo entre apóstrofos, como sigue:

cout << ‘A’;

Es posible imprimir el equivalente en enteros de un carácter precediéndolo de ( int ); es-to se denomina conversión de tipo (en otra lección se estudiará este concepto):

cout << ( int ) ‘A’;

Cuando se ejecuta la instrucción previa, imprime el valor 65 (en los sistemas que em-plean el llamado conjunto de caracteres ASCII). Escriba un programa que imprime el

Page 24: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-24

equivalente en enteros de algunas letras mayúsculas, minúsculas, dígitos y símbolos es-peciales. Como mínimo, determine los equivalentes en enteros de los siguientes: A B C a b c 0 1 2 $ * + / y el carácter de espacio.

4. Diseñe y codifique un programa C++ que encuentre la suma de tres valores variable decimal y muestre la suma en la pantalla del monitor. Llame a las variables a, b, c. Suponga que éstas tie-nen valores iniciales de 95.3, 78.5 y 85.2 respectivamente. Compile, vincule y ejecute su programa.

5. Amplíe el programa que escribió en el problema 4 para calcular y mostrar el promedio de los tres valores. (Nota: en C++ el símbolo / se usa para dividir). Compile, vincule y ejecute su programa.

6. Diseñe y codifique un programa C++ que encuentre la resistencia total de tres series de resistencias cuyos valores son 3.3 k, 2.2 k y 1 M. (Nota: el prefijo k representa la canti-dad 1000 y el prefijo M representa 1000000. La resistencia total de los resistores en se-rie es la suma de resistencias individuales). Muestre la resistencia total en la pantalla del monitor con la declaración cout. Incluya el archivo iostream.h en su programa para usar el objeto cout. Compile, vincule y ejecute su programa.

7. Utilice su compilador C++ para encontrar y corregir los errores de sintaxis en el si-guiente programa:

// Problema 5-7. #include <iostream.h> // Para cout void main( void ) { // define e inicializa variables float voltaje = 0.0; // Voltaje en volts float corriente = 0.001; // Corriente en amperes float resistencia = 4700.0; // Resistencia en ohms. // Genera la descripción del mensaje del programa cout << "Este programa calcula el voltaje dado un valor de corriente de 0.001 amp\n" "y un valor de resistencia de 4700 ohms. ” << endl << endl; // Calcula el voltaje voltaje = corriente * resistencia // Muestra de resultados cout.setf( ios::fixed ); cout.precision( 3 ); cout << "Dado un valor de corriente de "<< corriente << " amperes" " y un valor de resistencia de " << resistencia << " ohms.\n" "el voltaje resultante" << voltaje << " volts. " << endl; }//Fin de main( )

8. Ingrese, compile y ejecute los siguientes programas. ¿La salida generada por el pro-grama tiene sentido, especialmente si usted es el cliente? ¡Seguro que no! Hay un error lógico en el programa. Use su depurador C++ para localizar y corregir el error lógico. (Sugerencia: observe la variable TASA)

// Problema 5-8 #include <iostream.h> // Para cin y cout

Page 25: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-25

// Declaración de constante const float TASA = 7.0 ; // Tasa de interés en forma de porcentaje void main( void ) { // Definición de variables float costo = 0.0; // Costo del artículo float impuesto = 0.0; // Impuesto de ventas float totalCosto = 0.0; // Costo total del artículo // Muestra del mensaje de descripción del programa cout << "Este programa calculará el costo total de los artículos de ventas" << endl; // Obtener el costo a través del usuario cout << "Ingrese el costo del artículo vendido: $"; cin >> costo; // Cálculo del interés impuesto = TASA * costo; costoTotal = costo + impuesto; // Muestra el resultado cout.setf( ios::fixed ); cout.setf( ios::showpoint ); cout.precision( 2 ); cout << "El costo total de los artículos es: $" << costoTotal << endl; } //Fin de main( )

9. ¿Cuál es el propósito de la declaración cin >> en el programa 8? 10. La siguiente es una versión mejorada del programa mostrado en el problema 7. Ingre-

se, compile, vincule y ejecute este programa usando su compilador C++. // Problema 5-10. #include <iostream.h> // Para cout #include <iomanip.h> // Para setw( ) void main( void ) { // define e inicializa variables float voltaje = 0.0; // Voltaje en volts float corriente = 0.001; // Corriente en amperes float resistencia = 4700.0; // Resistencia en ohms. // Genera la descripción del mensaje del programa cout << "Este programa calcula el voltaje dado un valor de corriente de 0.001 amp\n" "y un valor de resistencia de 4700 ohms. " << endl << endl; // Calcula el voltaje voltaje = corriente * resistencia; // Muestra de encabezados cout << "\n\n\n\n" << setw( 20 ) << "RESISTENCIA" << setw( 20 ) << "CORRIENTE" << setw( 20 ) << "VOLTAJE\n"

Page 26: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-26

<< setw( 20 ) << "-----------" << setw( 20 ) << "---------" << setw( 20 ) << "------" << endl; // Muestra de resultados cout.setf( ios::fixed ); cout.precision( 3 ); cout << ‘\n’ << setw( 20 ) << resistencia << setw( 20 ) << corriente << setw( 20 ) << voltaje << endl; } //Fin de main( )

11. En relación a las palabras marcadas a colores en los siguientes incisos, que correspon-den a algún cout en el programa del problema 10. Conteste las siguientes preguntas. a. ¿Cuál es el propósito del carácter ‘\n’ en estas declaraciones? b. ¿Cuál es el propósito del comando endl en estas declaraciones? c. ¿Cuál es el propósito de la función setw( ) en estas declaraciones? d. ¿Cuál es el propósito de la declaración cout.setf( ios::fixed ) en este programa? e. ¿Cuál es el propósito de la declaración cout.precision( 3 ) en este programa?

12. ¿Cuál es la diferencia de la salida generada por el problema 10 en relación con la del problema 7?

Page 27: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-27

EXAMEN BREVE 5-1 1. Cualquier programa C++ consta de 2 secciones llamadas _______________________ y

_________________________. 2. Escriba una instrucción #include que incluya un archivo de cabecera estándar de nombre

stdlib.h dentro de un programa. Suponga que el archivo de cabecera se localiza en el directorio predeterminado del sistema.

3. Un subprograma que regresa un valor, una serie de valores, o que realiza alguna tarea especí-fica en C++ se llama____________________________.

4. ¿Dónde se declaran las constantes globales en un programa C++? 5. ¿Dónde se definen los objetos variables locales en un programa C++? 6. Cierto o falso: los objetos constantes se deben declarar como globales tanto como sea posible,

mientras que los objetos variable se deben declarar como locales tanto como sea posible. 7. Los comentarios se insertan en un programa C++ con:

1. Llaves izquierda y derecha como: {COMENTARIO}

2. Un punto y coma como: ;COMENTARIO.

3. Un asterisco como: *COMENTARIO.

4. Dobles diagonales como: // COMENTARIO . 8. Determine al menos cuatro lugares donde su programa debe incluir comentarios.

EXAMEN BREVE 5-2 1. Una metodología que requiere que el software sea diseñado usando un enfoque modular de

arriba-abajo se llama ____________________________. 2. En C++ los módulos de programa individuales se implementan con el uso de

_____________________. 3. En C++ el código de función definido por el usuario se coloca.

a) Antes que main( ). b) Dentro de main( ) c) Después de main( ) d) Ninguna de las anteriores

RESPUESTAS EXAMEN BREVE 5-1 1. Cualquier programa C++ consta de 2 secciones llamadas editor de texto o preprocesador y la

sección de función principal. 2. #include <stdlib.h> 3. Un subprograma que regresa un valor sencillo o una serie de valores, o que realiza alguna tarea

específica en C++ se llama función. 4. Las constantes globales deben declararse antes del identificador de la función principal

main( ), para que sean accesibles para el programa completo.

Page 28: CONTENIDO DE LA LECCIÓN 5azul2.bnct.ipn.mx/c/fundamentos/archivos (.pdf)/leccion 5.pdf · ESTRUCTURA GENERAL DE UN PROGRAMA C++ INTRODUCCIÓN En la lección 4, usted creó varios

MIGUEL Á. TOLEDO MARTÍNEZ

FUNDAMENTOS – LECCIÓN 5 5-28

5. Los objetos variable se pueden definir en cualquier lugar dentro del programa siempre y cuan-do éstos se definan antes de ser usados; sin embargo, el buen estilo dicta que se definan al prin-cipio del bloque de la función en el que se utilizan.

6. Cierto. Las constantes deben declararse tan globales como se pueda, mientras que las variables, tan locales como sea posible.

7. Los comentarios se insertan dentro de un programa C++ usando una doble diagonal, como lo siguientes: // COMENTARIO.

8. Determine al menos cuatro lugares donde su programa debe incluir comentarios. •• Al principio del programa se debe comentar el nombre del programador, las fechas en que el

programa se escribió y en la que fue revisado por última vez, así como el nombre de la persona que hizo la revisión.

•• Las instrucciones al preprocesador y su propósito deben de comentarse.

•• Las constantes y las variables también deben ser comentadas, así como también su propósito.

•• Deben de comentarse las secciones más importantes del programa para explicar el propósito general de la sección respectiva.

•• Las líneas individuales del programa deben comentarse cuando el propósito del código no sea obvio en relación con la aplicación.

•• Todos los subprogramas más importantes (funciones en C++) deben comentarse, al igual que la función del programa principal.

•• El final de cada bloque del programa (llave derecha) debe comentarse para indicar que la llave es el final.

RESPUESTAS EXAMEN BREVE 5-2 1. Una metodología que requiere que el software sea diseñado usando un enfoque modular de

arriba hacia abajo se llama diseño estructurado. 2. En C++ los módulos de programa individuales se implementan con el uso de funciones. 3. En C++ el código de función definido por el usuario se coloca después de main( )