Programación C y C

++

1

Programación
Lenguaje C y C++

M. C. Gastón Dehesa Valencia

2

Programación C y C++

Derechos Reservados © 2002 por Gastón Dehesa Valencia Todos los Derechos Reservados. Se autoriza para que este material pueda ser leida y reproducida por los estudiantes que la requieran. En este libro se han incluido programas y descripciones gráficas por su valor educacional. Han sido debidamente probados pero no se garantizan para ningún propósito en particular. El editor no proporciona ninguna garantía o representación, ni acepta ninguna responsabilidad con respecto a los programas y descripciones gráficas. Muchos de los nombres utilizados por los fabricantes o vendedores de software para distinguir sus productos son marcas registradas. El editor tiene toda la intención de proporcionar la información de la marca registrada acerca de los fabricantes y los productos mencionados en este libro. Una lista de las designaciones de marcas registradas se muestra más adelante en esta página.

Marcas Registradas C++ Builder es una marca registrada por Inprise Corporation. Turbo C++ es una marca registrada por Borland International, Inc. MS-Windows™ es una marca registrada por Microsoft Corporation MS-DOS es una marca registrada por Microsoft Corporation Visual C++ es una marca registrada por Microsoft Corporation

Dedico esta obra a mi familia Por que representan una fuente de Energía inagotable, que me impulsa a emprender nuevos proyectos.

Programación C y C++

3

Contenido
1.- Introducción al Lenguaje C Historia del lenguaje Estructura de un programa Compilación y Ligado Tipos de Datos y Modificadores Operadores Entrada y Salida de Datos Especificadores de clase de almacenamiento Ejercicios 2.- Sentencias de control de programa Sentencias de Selección Sentencias de Iteración Sentencias de Salto Ejercicios 3.- Arreglos y Apuntadores Que son los arreglos Arreglos Unidimensionales Cadenas Arreglos Bidimensionales Apuntadores Punteros y Arreglos Inicialización de Apuntadores Funciones de Asignación Dinámica Ejercicios 4.- Funciones y Estructuras Funciones Pase de parámetros Estructuras Arreglos de Estructuras Ejercicios 5.- Programación Orientada a Objetos Que es la POO Definición de una clase Tipos de Accesos a una clase Tipos de Usuarios Relación entre Usuarios y Tipos de Accesos Clases Amigas Datos Estáticos Constructores y Destructores

Herencia y Polimorfismo Clases Derivadas Herencia Simple y Múltiples Problema y solución de la Herencia Múltiples Constructores y Destructores en clases Derivadas Polimorfismo Sobrecarga de funciones Funciones virtuales Clases Abstractas Ejercicios .4 Programación C y C++ Ejercicios 6..

Cada tema expuesto viene acompañado de uno o más ejercicios. Este libro esta organizado de la siguiente forma: En los cuatro primeros capítulos se aborda la programación estándar y en los capítulos 5 y 6 los conceptos básicos de la programación orientada a objetos.Programación C y C++ 5 Prologo Este libro puede ser utilizado como guía para el examen de admisión de la Maestría en Informática que el Instituto en Computación y Electrónica Dehesa ofrece en lo que se refiere a Programación. En archivo empaquetado que acompaña al libro encontrará un directorio por cada unidad con los ejercicios desarrollados. Los programas que contiene el libro fueron probados usando compiladores de Borland. el nombre del archivo aparece como comentario al inicio de cada listado de programa. Espero que al terminar de leer este libro se cubran las expectativas planteadas. cualquier comentario o sugerencia acerca del contenido del material lo puede hacer a la siguiente dirección de correo electrónico: gastondv@hotmail.com .

6 Programación C y C++ Capitulo 1 Introducción al Lenguaje C • • • • • • • • Historia del lenguaje Estructura de un programa Compilación y Ligado Tipos de Datos y Modificadores Operadores Entrada y Salida de Datos Especificadores de clase de almacenamiento Ejercicios .

Sin embargo. En 1972 . Este leguaje está inspirado en el lenguaje B escrito por Ken Thompson en 1970 con intención de recodificar el UNIX.0 C++ Builder 5. En lo que se podría decir que era un milagro. creando el lenguaje C y rescribiendo el UNIX en dicho lenguaje. que en la fase de arranque estaba escrito en ensamblador.0 La mayoría de los compiladores actuales soportan la programación en C Estándar. inspirado en el lenguaje Simula67 adiciono las características de la programación orientada a objetos (incluyendo la ventaja de una biblioteca de funciones orientada a objetos) y lo denomino C con clases. inspirado en el lenguaje BCPL concebido por Martín Richard en 1967. La novedad que proporciono él lenguaje C sobre el B fue el diseño de tipos y estructuras de datos. dos de estos imperios son: Microsoft Borland Visual C++ Ver 6. como no existía ningún estándar. Dennis Ritchie. En 1980 Bjarne Stroustrup de los laboratorios Bell de Murray Hill. en vista a su transportabilidad a otras maquinas. Con la popularidad de las microcomputadoras se crearon muchas implementaciones de C. toma el relevo y modifica el lenguaje B. Para remediar la situación. Su eficiencia y claridad han hecho que el lenguaje ensamblador apenas haya sido utilizado en UNIX. New Jersey. Para 1983 dicha denominación cambio a la de C++. .Programación C y C++ HISTORIA DEL LENGUAJE 7 El Lenguaje C nació en los Laboratorios Bell de AT&T y ha sido estrechamente asociado con el sistema operativo UNIX. Con este nuevo enfoque surge la nueva metodología que aumenta las posibilidades de la programación bajo nuevos conceptos. B era un lenguaje evolucionado e independiente de la máquina. aparecieron discrepancias. Actualmente muchas empresas se dedican a vender el Compilador del lenguaje C. el Instituto de Estándares Americano (ANSI) estableció un comité a mediados de 1983 para crear un estándar que definiera al lenguaje C. Este comité ANSI termino el proceso de formalización en 1990. los códigos fuentes aceptados por la mayoría de esas implementaciones eran altamente compatibles. ya que su desarrollo se realizo en este sistema y debido a que tanto UNIX como el propio compilador de C y la casi totalidad de los programas y herramientas de UNIX. C Orientado a Objetos y la Programación Visual. fueron escritos en C.

//Definición e implementación del Programa Principal void main() {int Radio.cpp contiene las 5 partes del que se compone un programa escrito en el lenguaje C. A manera de ejemplo considérese el siguiente programa: //*Est_Prog. getch().cpp //Definición de archivos de cabecera #include <conio.Definición de constantes y variables globales 3. Area_Cir(Radio).Definición de archivos de cabeceras 2.. %8.Area).. } La idea de presentar un programa no muy pequeño de entrada a diferencia de como lo hacen otros autores es para que el estudiante en su primer día conozca gran cantidad de información sobre el Lenguaje C. printf("\n\n CALCULO DEL AREA DE UN CIRCULO"). scanf("%i". clrscr()..2f".Definición e implementación del programa principal ( main() ) 5.8 Programación C y C++ ESTRUCTURA DE UN PROGRAMA Un programa escrito en lenguaje C tiene la siguiente estructura.h> #include <stdio. printf("\n Radio: ").. El programa Est_Pro.h ambos son archivos de .h y el stdio.1416 float Area.h> //Definición de Constantes y Variables Globales #define PI 3.Implementación de funciones del usuario. en la sección de Definición de archivos de cabecera se presentan los archivos conio. printf("BIEN BENIDO AL LENGUAJE C")..Definición de Funciones del usuario 4. aunque no necesariamente debe contener todos los puntos: 1. printf("\n El Area es.&Radio). } //Implementación de funciones del Usuario void Area_Cir(int R) { Area= 2*PI*R*R. //Definición de funciones del usuario void Area_Cir(int R).

h> para uso de funciones relacionadas con cadenas <time.h> para uso de funciones de entrada/salida standard. aunque el significado es que el identificador PI toma el valor de 3. recuerde que una variable global perdura a lo largo de la ejecución de todo el programa y puede ser vista.h> para uso de funciones de entrada/salida por teclado o consola <alloc.h> para uso de funciones de manipulación de memoria. La siguiente lista muestra algunos de los archivos de cabeceras que más se usan así como una breve descripción de su contenido.h> para la asignación dinámica de memoria <graphics> para uso de funciones relacionadas con gráficas <io.h> para uso de funciones matemáticas.1416. modificable desde cualquier parte del programa o función. por que solo de esta forma el compilador puede conocer de forma adelantada la existencia de los mismos. En la sección de definición de constantes y variables globales se encuentra otra directiva de preprocesamiento conocido como #define que permite definir la constante. de esta forma se evita que la función principal este saturada de código.h> para uso de funciones de hora y fecha. En este . <mem. el lenguaje C es un lenguaje estructurado lo cual significa que un programa según su tamaño se dividirá en varios módulos conocidos como funciones. En la sección de definición de funciones del usuario se requiere definir todas las funciones que se implementen por el programador. observe que después del identificador PI no existe un signo =. de esta forma el compilador incluirá durante la compilación las variables. aquí se define Area de tipo real (float). Para definir un archivo de cabecera se usa una directiva de preprocesamiento llamado #include seguido del archivo de cabecera encerrado entre signos < > ó “ ” según el lugar donde este se encuentre.Programación C y C++ 9 cabecera definidos por el lenguaje. existen un gran numero de ellos que acompaña al compilador según la versión y fabricante por lo regular hallados en el directorio \Include. <conio. <iostream.h> para uso de funciones de entrada/salida de bajo nivel <math. <stdio. constantes y funciones que se encuentren en el archivo y que sean usados por el programa en desarrollo. los archivos de cabecera definidos en esta sección que pertenezcen al compilador deberán estar entre los signos < > y aquellos que el propio programador cree para sus aplicaciones entre comillas “ “ lo cual le indicara al compilador que busque el archivo en el directorio de trabajo y no en el directorio por defauld de archivos de cabecera (include). para la definición de las variables globales basta con indicar su tipo de dato y el identificador seguido de punto y coma. es decir antes de llamar a una función primero el compilador necesita saber de su existencia en caso contrario no podría resolver esta referencia provocando un error en tiempo de compilación. <string.h> para uso de funciones de entrada/salida por flujos.

1416*5*5. se detectara un error en tiempo de enlace y no en tiempo de compilación tema que se tratará en la siguiente sección.10 Programación C y C++ ejemplo se define solamente una función. Si una función se define y se llama desde alguna parte del programa y no esta implementado.1416*R*R . en este caso la función Area_Cir() solamente tiene una línea de código que se encarga de asignar a la variable global Area . Finalmente en la sección de Implementación de funciones se tendrá la implementación de todas las funciones que el programador halla definido en la sección correspondiente. si el usuario introdujo un Radio =5 entonces sería: 2*3. . el resultado de multiplicar 2*3. por lo que es indispensable que éste exista. Una descripción de lo que ocurre en el ejemplo es el siguiente: Se define una variable local Radio de tipo entero Borra la pantalla Se Imprimen mensajes en pantalla Lee un dato de tipo entero almacenándolo en la variable Radio Llama a la función Area_Cir() pasándole como argumento el Radio leído Imprime la variable Area calculada en la función Espera la entrada de una tecla para terminar Como puede observarse el orden de los comandos es el orden o secuencia en que estos se ejecutan. La función principal (main()) es el primero que se ejecuta cuando inicia un programa. en él se establece la lógica o secuencia que seguirá el programa durante su ejecución. Area_Cir() sin tipo de retorno (void) y recibe como parámetro un entero( El radio del circulo).

cpp conio. es por esta razón que si una función definido por el usuario no esta implementada en el programa ni tampoco en una librería se detectará en tiempo de enlace.exe Archivo2.h Archivo2.lib. De lo anterior se deduce entonces que un archivo de cabeceras (*.lib Figura 1. o programa ejecutable (.h COMPILACION Princip.obj Cl.Durante este proceso se examina el o los programas fuente de la aplicación. por lo que se integran al programa en tiempo de enlace.lib.. de no existir se genera un archivo objeto (. lo cual es muy cierto y veamos algunas diferencias: Característica Archivo de Cabecera Tipo Texto Cuando se usa Tiempo de Compilación Contenido Definiciones Archivo de Librería Binario Tiempo de ligado Implementaciones compiladas Tabla 1. los archivos de cabecera para hallar errores de sintaxis. 1 Diferencias entre un archivo de Cabecera y uno de Librería .Lib).LIB) para formar un solo programa independiente.Programación C y C++ COMPILACIÓN Y LIGADO 11 Para crear un archivo ejecutable (Código maquina relocalizable) se realiza mediante dos etapas o tiempos que son: Compilación y ligado.EXE). Ligado.obj LIGADO Extern. etc. Cl.lib Mathl. 1 Proceso de Compilación y Ligado de un programa en C La implementación de las funciones halladas en los archivos de cabecera predefinidos por el lenguaje se encuentran en librerías (Mathl.OBJ) por cada programa fuente.cpp stdio. Para aclarar lo anterior observe la siguiente figura: Princip.h) es diferente de un archivo de librerías (*. Compilación.Durante este proceso se unen todos los programas objetos del que se conforme la aplicación. así como los archivos de librería (..) incluidos también en el software del compilador.

en ocasiones algunos archivos de cabecera se cargan en el ambiente de programación y se debe tener la precaución de no modificarlos para no producir incongruencias entre el archivo de cabecera y el archivo de librería. de funciones o de nuevos tipos .. así que el compilador para cada uno de estos sistemas operativos almacenara en algunos casos un mismo tipo de dato con longitud diferente. etc. mientras que Windows 98.12 Programación C y C++ Es frecuente que se confundan los términos archivo de librería con archivo de cabecera. el diseñador a partir de estas puede crear nuevos tipos y nuevas instrucciones. Durante la escritura de un programa es frecuente probar una y otra vez si se esta haciendo lo correcto. estructuras de decisión. Tipos de datos Un tipo de dato en C es la manera como el compilador almacena la información en la memoria. 2 Palabras Reservadas del Lenguaje Las palabras reservadas deben escribirse siempre en minúsculas. Windows NT son de 32 bits. . la tabla y dibujo anterior precisamente tiene la finalidad de hacer notar que son diferentes. Windows 2000. por ejemplo el sistema operativo MS-DOS es un sistema de 16 bits.Estas palabras son las siguientes: asm delete goto public this auto do huge register union break double if return unsigned case else int Short virtual carch enum interrupt signet void char extern long sizeof volatile class far near static while const float new struct continue for private switch defauld friend protected template Tabla 1. y que no pueden ser usadas por el usuario como nombre de variables. Palabras reservadas Las palabras reservadas del compilador son todas aquellas palabras que se usan para especificar tipos de variables. al final de cuentas están directamente relacionados entre si . más adelante se presenta una tabla de los tipos de datos para un sistema de 16 bits. para ello se usa la ejecución paso a paso de un programa (Depuración). estructuras cíclicas. TIPOS DE DATOS Y MODIFICADORES Todo lenguaje de programación suministra al diseñador de software un conjunto de tipos de datos y un conjunto de instrucciones.

esta variedad de tipos nos obliga a ser demasiado cuidadosos a la hora de usar algunos operadores de asignación. imagínese que se desea diseñar un programa de nómina que .147. 3 Tipos de Datos Básicos de un sistema de 16 bits Midificadores Los modificadores son palabras reservadas que se le adicionan a los tipos para modificarles su tamaño y/o su rango.483. algunos tipos predefinidos para un sistema de 16 bits son. estos son: Signed unsigned long short Estas son algunas de las combinaciones que se pueden presentar: Tipo unsigned char Char unsigned int short int Int unsigned long int long int Float double float # de Bits Intervalo 8 0 a 255 8 -127 a 127 16 0 a 65535 16 Lo mismo que int 16 -32.768 a 32.Programación C y C++ 13 C se distingue por ser un lenguaje con demasiados tipos.7E308 Tabla 1.295 32 -2. existen otros lenguajes como PASCAL que cuentan con unos pocos tipos.147.767 32 0 a 4. este tamaño define un rango de operación que limita los números que se puede almacenar en una variable. Antes de empezar a describir los tipos disponibles en el lenguaje estudiemos un poco lo que es una variable.7E-308 a 1. 12 dígitos de precisión void 0 Sin valor Tabla 1. Las variables siempre pertenecen a un tipo de datos.4E-38 a 3.648 a 2.294.483. 4 Tipos de Datos con modificadores en un Sistema de 16 Bits Como se puede observar cada tipo tiene un tamaño en bits. este tipo de datos puede ser alguno de los tipos predefinidos por el lenguaje o definido por el usuario. 6 dígitos de precisión double 64 Aprox.967.647 32 3. Tipos de datos # de Bits Intervalo char 8 -127 a 127 int 16 -32768 a 32767 long 32 0 a 4294967295 float 32 Aprox.4E38 64 1.

tal vez el tipo más apropiado será unsigned long que almacena valores entre 0 y 4294967295.147. En este libro con la finalidad de evitar las complicaciones del ambiente del compilador se abordarán los aspectos básicos de la programación estándar y orientado a objetos usando un compilador que se ejecuta bajo el MS-DOS (Hasta el capitulo 6). En un compilador operado en el sistema operativo MS-DOS x tomaría el valor de 2. el compilador almacenaría los datos con tamaños diferentes. Como se deduce en consecuencia que la longitud en bytes de un tipo dato depende del sistema operativo y del compilador que se use. Para el caso de un Sistema Operativo de 32 bits.294.4E381 64 2. Comentarios . para conocer con precisión la longitud en bytes de una variable de un tipo de dato se puede utilizar el operador sizeof.967. la parte restante del libro estará basado en el ambiente Windows para conocer la programación Visual con C++. pero que pasaría si escogiéramos el tipo unsigned int para la variable sueldo.483.767 32 -2.147.295 16 -32.648 32 Lo mismo que unsigned int 32 Lo mismo que int 32 1.8E3082 Tabla 1.2E-308 a 1. este sería el caso: Tipo unsigned char char unsigned int short int int unsigned long int long int float double float # de Bits Intervalo 8 0 a 255 8 -128 a 126 32 0 a 4.2E-38 a 3.14 Programación C y C++ va ha manejar los sueldos de los empleados.648 a 2. Por ejemplo: int x. en el momento que almacenemos un valor superior a 65535 el contenido quedará truncado. mientras que en Windows 98 el valor de 4. piense en el tipo de datos que usaría para la variable sueldo.483. 5 Tipos de Datos con moficadores en un sistema de 32 bits Al examinar la tabla anterior se puede observar que int es lo mismo que long int mientras que para un sistema de 16 bits estos tienen diferente longitudes y por lo tanto diferentes intervalos. Bueno.768 a 32. seguramente pensó en un tipo unsigned int. x=sizeof(int)). ya que los sueldos pueden ser superiores a 65535. ¿será el tipo unsigned int el más apropiado? Bueno tal vez contestará que no. si observamos la tabla anterior el tipo unsigned int almacena valores entre 0 y 65535.

Promedio. int Incremento = 10. Donde: clase representa un especificador de clase de almacenamiento (se explica posteriormente). El tipo determina los valores que puede tomar así como las operaciones que con ella pueden realizarse. tipo determina el tipo de variable (char. . Cada variable de un programa. char Archivo[] = ”Datos.Programación C y C++ 15 Un comentario es una secuencia de caracteres utilizada para explicar el código fuente y no se toma en cuenta durante la compilación (No se considera como código). Una variable que se declara al inicio del programa es considerada como variable global y es accesible desde cualquier parte del programa. float. Sintaxis: [clase] tipo identificador[. Por lo contrario una variable declarada dentro de una función se considera como variable local y es accesible solamente dentro de este. char Car.) identificador Indica el nombre de la variable.dbf”. Ejemplos: int Suma. Existen dos formas para definir un comentario: • Secuencia de caracteres encerrados entre los símbolos /* y */ • Comienza con los caracteres // y termina al final de la línea. Variables Es una posición de memoria de cierta longitud según el tipo de dato cuyo valor puede ser modificado a lo largo de la ejecución de un programa . //Se declara la variable x de tipo entero inicializándola con 92 char car=x. a diferencia de otros lenguajes. Conversión de Tipos de datos Cuando se trabaja con datos de diferentes tipos es frecuente mezclarlos durante una expresión o asignación. La declaración consiste en enunciar el nombre de la variable y asociarle un tipo. que es el equivalente del código ASCII. C realiza la conversión de tipos compatibles de manera automática. etc. int.identificador]. es decir a la variable car se le asigna el carácter ’\’ . //car es de tipo carácter y se le asigna el valor de un entero x En este ejemplo se da la conversión automática de tipos. Una variable puede ser inicializada cuando se declara: char car = ’\0’ . debe declararse antes de ser utilizada. Nombre[40]. Por ejemplo: int x=92.

Tabla 1. En la siguiente tabla se presentan los de uso más común . por lo tanto los 8 bits más significativos del entero se perderán. |= Asignar operador OR x|=0x02. Miembro directo P. | OR a nivel de bits XOR a nivel de bits C=A∧B. ~ NOT a nivel de bits A=~D. Esto se debe a que un entero es de 16 bits (en MS-DOS) mientras que un char es 8 bits. :: Resol. algunos solamente lo soportan durante una expresión este es el caso del C++ Builder. &= Asig. += Asignar y sumar x+=10. en este caso car tomaría el valor de ‘\0’. -Decremento x--.16 Programación C y C++ Cuando se presenten casos de conversión de tipos se debe tener en cuenta que es posible la perdida de datos. OPERADORES DE APUNTADORES * Indirección Int *Ap. . *= Asignar y multiplicar x*=10. es decir el carácter nulo. Supóngase que x=256 en lugar de 92. trabajan con variables y se encargan de muchas otras tareas que los programadores nunca llevan a cabo. por ejemplo: int x. No todos los compiladores soportan la conversión de tipos durante las asignaciones. ∧ << Desp. operador AND x&=0x02. OTROS ++ Incremento x++.Borar(). 6 Operadores de C++ más usados . & Dirección x=&Ap. buscan igualdades. Sustracción x=x-z. //OK La conversión se da en la expresión. para solucionar este problema la asignación se debe realizar de manera indirecta: x = Edit1->Text*1. OPERADORES LÓGICOS && AND Lógico if (x&&0xFF) || OR Lógico if (x||0xFF) NOT Lógico If (!Soltero) ! OPERADORES RELACIONALES == Igual que if (x==y) Diferente que != < Menor que > Mayor que <= Menor o igual que >= Mayor o igual que OPERADORES DE CLASE Y ESTRUCT. realizan asignaciones. de alcance Punto::Dibujar() -> Miembro indirecto P->Dibujar(). a la derecha C=A>>2. //Error No se puede convertir una cadena a entero Como Edit1->Text es una propiedad de tipo cadena (Arreglo de caracteres) no se puede llevar a cabo la conversión de manera directa. /= Asignar y dividir x/=10. >> Desp. Operador Descripción Ejemplo OPERADORES ARITMÉTICOS + Adición x=x+z. x= Edit1->Text. Operador Descripción Ejemplo OPERADORES DE ASIGNACIÓN = Asignación x=10. % Modulo o resto x=x%z. * Multiplicación x=x*z / División x=x/z. a la izquierda B=A<<3. OPERADORES Los operadores se utilizan para manipular datos: ejecutan cálculos. OPERADORES A NIVEL DE BITS & AND a nivel de bits C=A&B. -= Asignar y restar x-=10.

por lo que deberá utilizar paréntesis para hacer más explicito el orden de evaluación. Izquierda Izquierda – Derecha Izquierda – Derecha Izquierda – Derecha Izquierda – Derecha Izquierda – Derecha Izquierda – Derecha Izquierda – Derecha Izquierda – Derecha Izquierda – Derecha Izquierda – Derecha Derecha – Izquierda Izquierda – Derecha Tabla 1..8/4*6 2*6 12 b).-3+4% 5/2 -3+4/2 -3+2 -1 8*6/4 48/4 12 3*6/4 18/4 4 28/(3*4) 28/12 2 . Nivel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Operadores () [] -> :: . Por ejemplo: A= x + y – 2 / 2 + z. Asociatividad Izquierda – Derecha Derecha . Todos los operadores situados entre líneas tienen el mismo nivel de prioridad..5 d). y describe como se asocia cada operador (de izquierda a derecha o de derecha a izquierda).0/4 0. C y C++ tienen reglas específicas para determinar el orden de evaluación. tampoco lo será para alguien que lea el código. 7 Prioridad y Asociatividad de operadores de C++ Ejemplos: a).. En la siguiente tabla lista los operadores de C y C++ de mayor a menor prioridad.(float) 2/4 2.Programación C y C++ Prioridad y orden de Procedencia 17 La prioridad de los operadores define el orden en que se evalúa una expresión cuando tiene distintos operadores.2) / (2 + z). Lo más sencillo de recordar es que la multiplicación y división tienen prioridad sobre la suma y la resta.& * * / % + << >> < <= > >= = != & ∧ | && || = *= -= *= %= < <= > >= &= ∧= |= . ! ~ ++ -. A partir de esto. Tendrá un significado distinto dependiendo de cómo se agrupen los paréntesis: A= x + (y .3/4*6 0*6 0 c).. si una expresión no le resulta clara.

Entrada y Salida Estándar Para la entrada y Salida de datos con formato se utilizan dos funciones hallados en el archivo de cabecera stdio. El espicificador de formato empieza con un % y va seguido por el código del formato.h : printf() y scanf(). Esta información constituye los datos de entrada del algoritmo que definen nuestro programa y es mediante ellos que se obtendrá la salida o solución correspondiente: De ahí la importancia de proporcionar adecuadamente los valores o datos de aquellas variables del programa que deba leer la computadora. Lista_argumentos). Debe haber exactamente el mismo número de argumentos que especificadores de formato y ambos deben coincidir en su orden de aparición de izquierda a derecha. La cadena de control está formada por dos tipos de elementos . En la siguiente tabla se muestra una gran variedad de especificadores de formato. El segundo elemento contiene especificadores de formato que definen la forma en que se muestran los argumentos posteriores. El primer elemento es el carácter que se mostrará en la pantalla. los cuales se analizaran posteriormente. Salida por pantalla Printf(char *cadena_de_control. En esta sección se analizan los dos primeros métodos. Código %c %d %i %e Formato Carácter Entero en decimales con signo Entero decimales con signo Notación científica .18 Programación C y C++ ENTRADA Y SALIDA DE DATOS (ESTÁNDAR Y FLUJOS) Prácticamente todos los programas requieren procesar información proveniente de fuentes externas para obtener la solución de un problema específico. El sistema operativo MS-DOS soporta dos métodos de entrada y salida de datos que son: • Entrada y Salida Estándar • Entrada y salida por flujos El sistema operativo Windows la entrada y salida por pantalla lo hace a través de un conjunto de controles visuales. además de la importancia de incluir mensajes en las ordenes de salida que nos indiquen la naturaleza o nombre de los resultados obtenidos.

En el caso de cadenas. por tal motivo los nombres de ellas van precedidas del símbolo & (con lo que se indica que se usan apuntadores). los nombres de las variables son en si mismos apuntadores y no requieren dicho símbolo. Esta función direcciona automáticamente la lectura de valores por el teclado de la microcomputadora. 8 Especificadores de Formato Ejemplo: printf(“El Lado es: %i El Area del Cuadrado es: %f”. 9 Secuencias de Escape Entrada por teclado Scanf(char *cadena_de_control. El lenguaje C emplea apuntadores en lectura de toda cantidad numérica debido a que asigna dichos valores a través de las direcciones de las variables. Area). conocidos como secuencia de escape Secuencia de escape \a \b \f \n \r \t \v \\ Acción realizada Alarma Retroceso Avance de pagina Nueva Linea Retorno de carro Tabulación (horizontal) Tabulación (vertival) Barra inclinada Tabla 1.Lado.Programación C y C++ %f %h %o %s %x Punto flotante) Entero corto Octal sin signo Cadena de caracteres Hexadecimal sin signo 19 Tabla 1. así el mensaje sería: El Lado es: 5 El Area del Cuadrado es: 25 También en la cadena de control pueden existir una serie de caracteres que permitan formatear la salida. Lista_argumentos). Si la variable Lado=5 por lo tanto la variable Area=25. Ejemplo: . Como se aprecia el formato es idéntico al printf().

Edad. getch().h una serie de funciones que permiten específicamente leer y escribir datos de tipo carácter y cadena.2f". espera un salto de carro. Existen en el archivo de cabecera stdio. Escribe una cadena en pantalla. printf("\n EDAD: ").h> void main() {char Nom[40]. printf("%s %i %4. printf("\n PESO: ").cpp Muestra el uso de las funciones printf() y scanf() */ #include <conio.Peso). mientras que la variable Nom que es un arreglo de caracteres (cadena) no lo requiere. no espera un salto de carro. printf("IDENTIFIQUESE POR FAVOR"). la función printf() hace uso frecuentemente de la secuencia de escape \n para cambiar de línea. scanf("%s".40 Observe que al leer las variables Edad y Peso de tipo entero y real respectivamente se utiliza el operador & que indica dirección.&Peso). int Edad. Lee un carácter con eco. float Peso. En la siguiente tabla se sintetizan: Función getchar() getche() getch() putchar() gets() puts() Operación Lee un carácter del teclado. printf("\n\n NOMBRE: "). scanf("%f".&Edad). clrscr().h> #include <stdio.4 SUS DATOS SON: Juvenal 36 50. printf("\n\n SUS DATOS SON: "). 10 Funciones complementarias de E/S . scanf("%i". por ejemplo el penúltimo printf() hace que se deje una línea en blanco. Escribe un carácter en pantalla. no espera un salto de carro. Lee un carácter sin eco. } La Salida del programa después de ejecutarla sería: IDENTIFIQUESE POR FAVOR NOMBRE: Juvenal EDAD: 36 PESO: 50. Tabla 1. no es la finalidad de este libro profundizar en este tema más sin embargo se considera necesario conocer de su existencia.20 Programación C y C++ /*ES-Estan.Nom.Nom). Lee una cadena del teclado.

h> #include <iostream. ya que este solamente tomaría la primera . dos de estos objetos son: cin y cout.cpp //En lugar de stdio. • El operador de extracción (>>) lee informaciones del flujo cin a la izquierda del operador y las almacena en las variables indicadas a la derecha.h que contiene funciones que realizan operaciones de Entrada/Salida. clrscr(). int Edad. Donde: • cin Usado para entrada de datos • cout Usado para salida de datos Para el manejo de de estos dos objetos se utilizan dos operadores: • El operador de inserción (<<) transmite sus argumentos situados a la derecha hacia el flujo cout. cout<<Nom<<" "<<Edad<<" "<<Peso. cin>>Edad. este archivo tiene la ventaja sobre el stdio.h por ser una implementación orientada a objetos.Programación C y C++ 21 Entrada y Salida por flujos C++ proporciona el archivo de cabecera iostream. cin>>Nom. float Peso.h> void main() {char Nom[40].cpp pero en lugar de usar printf() y scanf() se usara cout y cin. } La Salida del programa después de ejecutarla sería identica al a salida del programa ES-Estan. A manera de ejemplo rescribiremos el programa ES-Estan. en cuyo caso no sería conveniente utilizar cin sola. cout<<"IDENTIFIQUESE POR FAVOR". getch().h Cuando se lee un arreglo de caracteres como la variable Nom puede ocurrir que el usuario escriba más de una palabra (Una línea). cin>>Peso. cout<<"\n\n NOMBRE: ". /*ES-Flujo. cout<<"\n EDAD: ".cpp*/ #include <conio. cout<<"\n PESO: ". cout<<"\n\n SUS DATOS SON: ".

identificador].22 Programación C y C++ palabra. debe haber alguna forma de hacer conocer a todos los archivos las variables globales requeridas por el programa. La clase de almacenamiento precede a la declaración de la variable. 40). compilados por separado con el fin de acelerar la compilación y ayudar a la gestión de grandes proyectos. lo que significa que el compilador no sabe que variable se va ha usar cada vez. las variables globales se deben de declarar sólo una vez. el compilador imprimirá un mensaje de error indicando que se ha duplicado un nombre de variable. Otro aspecto importante de los flujos. es que los operadores << y >> efectúan automáticamente las conversiones necesarias. Lo mismo ocurre si declaran todas las variables globales necesitadas por el programa en cada archivo. Si se declaran dos variables globales con el mismo nombre en el mismo archivo. ESPECIFICADORES DE CLASE DE ALMACENAMIENTO Aunque este tema esta ligado más con el tema de Variables se dejo para esta sección porque se requiere de los conocimientos anteriores para comprenderlo con más claridad. usarán el cout y el cin para la entrada y salida de datos en pantalla. Num es el número máximo de caracteres que desea leer con getline() Ejemplo: cin.getline(Cadena. Sin embargo al abordar el tema de la programación visual se dejará de usar. Para leer más de una palabra se puede utilizar la función getline() de la siguiente forma: cin. • extern Dado que C permite enlazar juntos módulos de un programa. Existen cuatro especificadores de clase de almacenamiento sopórtados por C: • extern • static • register • auto Los especificadores le indican al compilador cómo debe almacenar la variable. //Se puede almacenar hasta 40 caracteres en Nom En la penúltima línea se observa que se pueden concatenar varios operadores << en una sola línea. Donde: Cadena es cualquier arreglo de caracteres que se haya definido con anterioridad y que contiene la cadena de entrada. Aunque el compilador no daría ningun mensaje de error en tiempo de . Los ejemplos que se mostraran a partir de esta parte del libro en adelante. num).getline(Nom. Su forma general es: [clase] tipo identificador[.

cpp proyecto:exten.prj */ #include <conio.prj */ #include <conio. Se puede llevar a cabo con cualquiera de los dos métodos: El primero consiste en realizar la compilación y enlazado mediante la línea de comandos del MS-DOS el segundo creando un proyecto de esta aplicación para que los detalles los efectúe el propio ambiente del software. cout<<"\nIII UNIDAD: ". cin>>C1.cpp proyecto:exten. } void main() { clrscr(). /*Archivo2. cout<<"\n\nEl Promedio es: "<<Prom.C2. El primer método es un tanto rudimentario ya que consume una gran cantidad de tiempo para llevarlo a cabo. Prom=(C1+C2+C3)/3.cpp la variable global Prom se encuentra dafinida en el archivo Princip.h> float Prom. .C3. La solución está en declarar todas las variables globales en un archivo y usar declaraciones extern en los otros. cin>>C3. Promedio(). sin embargo el segundo es mucho más eficiente y es el que se explicará a continuación.Programación C y C++ 23 compilación .cpp. //Ojo void Promedio() {int C1.cpp y Archivo2.h> #include <iostream. getch(). cout<<"\nCALCULO DEL PROMEDIO DE CALIFCACIONES". El problema aparecería al intentar enlazar los modulos. Observe que la función Promedio() se define unicamente en Princip. } La Salida del programa después de ejecutarla sería: CALCULO DEL PROMEDIO DE CALIFCACIONES ESCRIBA LAS 3 CALIFICACIONES DEL ALUMNO I UNIDAD: 80 II UNIDAD: 90 III UNIDAD: 100 El Promedio es: 90 El programa anterior esta compuesto por los archivos Princip. cout<<"\nII UNIDAD: ". cout<<"\nESCRIBA LAS 3 CALIFICACIONES DEL ALUMNO". Tal vez se preguntará ¿pero como se puede lograr que dos archivos fuentes conformen un solo programa?. El Enlazador mostraría el mensaje de error “Identificador duplicado” por que no sabría que variable usar. void Promedio().cpp.cpp sin embargo se utiliza tambien en el Archivo2. cin>>C2. para indicar al compilador que se trata de la misma variable se usa el expecificador extern en su declaración. esto no trae ningún problema durante la compilación porque es durante el enlace que se resuelve la referencia hacia esta función. cout<<"\n\nI UNIDAD: ".h> #include <iostream. Ejemplo: /*Princip.cpp y se implementa en Archivo2. realmente se intenta crear dos o más de cada variable.h> extern float Prom.

cpp y seleccionar “Add”.Escribir el código en cada programa fuente Para abrir un archivo fuente que pertenesca al proyecto basta con posicionarse sobre él en la ventana Project y obrimir <Enter> se abre la venta de edición donde se podrá escribir todo el código necesario como muestra la siguiente figura.cpp y seleccionar el boton “Add” se observa como el nombre del archivo aparece ahora en la ventana projects.Ejecutar el programa del compilador C:\tc>tc 3.. escribir el nombre del segundo archivo: Archivo2. los pasos a seguir diferirán unos de otros dependiendo del fabricante y versión. para el programa anterior con esto basta...24 Programación C y C++ Creación de Proyectos En la mayoría de los ambientes de programación modernos se considera este método.. para poder compilar y enlazar de manera directa y transparente para el programador el programa Extern.prj. 6.. no olvide guardar los cambios que se realizan . y escribir en la caja de dialogos c:\tc\ejerc-I y OK 4.Crear un directorio de trabajo estando en el directorio del compilador C:\tc>md ejerc-I 2. Pasos: 1.En el ambiente definir como directorio de trabajo el directorio recien creado Seleccionar File | Change dir. a manera de ejemplo se explicará como se lleva a cabo la creación de proyectos usando el Software de Borland ver.Crear el proyecto. 1.Agregar los archivos fuentes al proyecto Estando en la ventana project oprimir la tecla <Insert> en la caja de dialogos escribir el nombre del primer archivo fuente: Princip.0 para MS-DOS.. este proceso puede seguir para cada archivo fuente que se desee agregar. El nombre que se le da a un proyecto será el mismo que tendrá el programa ejecutable despues de su compilación y ligado...prj y seleccionar el botón OK 5. por defauld se guarda en el directorio de trabajo Seleccionar Project | Open Project… escribir en la caja de dialogos extern.

2. La diferencia clave entre una variable local static y una variable global es que la variable local static es una variable local que retiene su valor entre llamadas de funciones. Ejemplo: /*Estatic1.x<5. • static Las varibles static son variables permanentes dentro de una función o archivo según si se declaran como locales o globales respectivamente.h> void serie(). getch(). el compilador crea un almacenamiento permanente para ella de forma muy parecida que cuando crea almacenamiento para una variable global. } .h> #include <iostream..Ejecutar el programa Con las teclas <Ctrl>+<F9> se compila.x++) serie().Ventana de BorlandC 1. clrscr(). for (x=0.cpp */ #include <conio.0 para manejo de proyectos 7. void main() {int x. Variables static locales Cuando se aplica el modificador static a una variable local. enlaza y ejecuta el programa si no aparecen errores.Programación C y C++ 25 Figura 1..

al incrementarse durante la segunda llamada a la función serie() ahora tendrá 20 y así sucesivamente. cout<<"\t"<<cont. //ojo void Inicia_Semilla(int i) { cont=i. Esto significa que aunque la variable es global. return(cont). en la siguiente llamada a la función serie() como no se destruye la variable cont este retiene su valor. la siguienta línea la incrementa a 10 y es el primer valor que se visualiza despues de un tabulador. Variables static globales Cuando se aplica el modificador static a una variable global. } /*Staticg2. estando así libre de efectos secundarios. ) cada vez que se llame a la función serie() se creara un espacio para el y al finalizar se destruirá por lo que el resultado sería: 10 10 10 10 10 Las variables static son muy importantes en la creación de funciones independientes. Ejemplo: /*Staticg1. } . clrscr(). Static. Static.h> #include <iostream.prj */ static int cont. Si no se permitiera usar static entonces habría que usar variables globales y las variables globales dejan la puerta abierta a posibles efectos secundarios.x<5.x++) cout<<"\t"<<serie(). Inicia_Semilla(0). ya que existen varios tipos de rutinas que deben preservar su valor entre llamadas. getch(). De no definir la variable cont como static (int cont=0.cpp.prj */ #include <conio. } La salida de este programa será: 10 20 30 40 50 static Aunque aun no se ha abordado el tema de la instrucción for se utiliza en el programa para ilustrar el efecto del especificador static. //Variable Local cont=cont+10. void main() {int x.26 Programación C y C++ void serie() {static int cont=0.h> void Inicia_Semilla(int i). for (x=0. las rutinas de otros archivos no la reconocerán ni alterarán su contenido directamente. int serie().cpp. se indica al compilador que cree una variable global conocida únicamente en el archivo en el que se declara. } int serie() { cont=cont+10. Cuando se llama a la función serie() por primera vez se crea el espacio de almacenamiento para la variable cont y se inicializa con 0.

Esta es visible solamente en el bloque en el que es declarada. este será vista y modificada solamente en el propio archivo. Esto significaba que las operaciones debían de realizarse con mayor rapidez. al definir x con el especificador register el ciclo se lleva a cabo lo más rápido que se pueda. . Ejemplo: void imprime_Caracter() { register int x. lo cual impide que se pueda acceder desde otro archivo. lo anterior es aplicado a cualquier tipo de dato. El especificador de almacenamiento auto declara una variable con existencia local.cpp aunque usando una técnica diferente.Programación C y C++ 27 En el archivo Staticg2. El especificador registers solo puede aplicarse a variables locales y a los parámetros de una función. que es donde se almacena normalmente las variables. Actualmente el estándar ANSI simplemente establece “que el acceso al objeto sea lo más rápido posible”. to N. x++) cout <<leer_puerto(). • register El especificador de almacenamiento register originalmente pedía al compilador que mantuviera el valor de una variable en un registro de la CPU en lugar de en memoria. } En este ejemplo se imprimen N caracteres en pantalla retornados por una función Leer_puerto(). La salida del programa será exactamente igual que el archivo Estatic1.cpp se define la variable cont como variable global static. • auto Cuando se define una variable sin indicar su especificador. for (x=0. por eso se requiere de una función adicional para poder inicializarla desde otro archivo. por defauld su especificador es auto.

printf ("\n\n NOMBRE DEL EMPLEADO: ").2f".nombre.h> void main () { char nombre[40].&Altura). scanf("%f". Area).cpp */ #include <stdio. /* Sueldo. } 2. printf("\n\nTECLEE LA BASE: "). /* Area. Area=(Base*Altura)/2.. Sueldo. clrscr().&chr). &hrst). scanf("%f".28 Programación C y C++ EJERCICIOS RESUELTOS 1. scanf ("%f"."). printf("\n EL SUELDO DE %s es de: $ %8. printf ("\n COSTO POR HORA: "). gets(nombre).Usando la entrada salida estándar escribir un programa que calculé el área de un triangulo a partir de su base y altura usando la formula: Area=(Base*Altura)/2. printf("\nEl EL AREA ES: %8.h> void main () { float Altura.Sueldo). solicitando su nombre. printf("\nPRESIONE <ENTER> PARA TERMINAR").h> #include <conio. hrst. printf ("\n CALCULA EL SUELDO DE UN EMPLEADO"). printf("\nTECLEE LA ALTURA: "). Sueldo=hrst*chr.2f". scanf ("%f". Número de horas trabajadas y el costo por hora. getch(). float chr. getch(). printf ("CALCULA EL AREA DE UN TRIANGULO.cpp # include <stdio. printf ("\n HORAS TRABAJADAS: "). } .&Base).. clrscr().h> # include <conio.Area.Usando la entrada salida estándar escribir un programa que calcule el sueldo de un empleado.Base.

Programación C y C++ 29 3.cpp # include <stdio. clrscr(). printf("\n EL COSTO DE VENTA DE %s ES: $ %8.cpp */ # include <iostream.2)+pow(B. o sea: C2 = a 2 + b 2. getch(). /* Hipotenu. descripcion. gets (descripcion). } 4. printf ("\n\n DESCRIPCION DEL ARTICULO: "). CVenta=Temp + Temp*. Temp. C. printf ("\n CALCULA EL PRECIO DE VENTA DE UN ARTICULO. CVenta. Temp= (CosP+(CosP*1. cout<<"\n CATETO B:".h> # include <conio.h> # include <conio. scanf("%f". printf ("\n COSTO DE PRODUCCION: "). C= sqrt (pow(A. CVenta). float CosP. C 2 = A2 + B2. clrscr().15. cout<<"\n CATETO A:" . cout<<"CALCULO DE LA HIPOTENUSA". El precio de venta se calcula añadiéndole al costo el 120% como utilidad y el 15% de impuesto.h> # include <math. } . cout<<"\n LA HIPOTENUSA ES: "<<C.2)).2)).h> //Por las funciones matemáticas void main () { float A."). cin>>B.. B.Programa que calcula el precio de venta de un artículo . getch(). aplicando el teorema de Pitágoras. &CosP).2f". cin>>A. /*Preventa.h> void main () { char descripcion[40]. – Usando la entrada salida por flujos escribir un programa que lee la longitud de los lados A y B de un triangulo y calcule la hipotenusa (C).

c. cout<<"\n EQUIVALENCIA A GRADOS ". cout<<"\nSEGUNDO PRODUCTO:". getch(). void main() { clrscr(). archivos que calcule el costo total de venta de 3 productos. cin>>b.cpp proyecto: Venta.".Programa que lee una temperatura en grados Fahrenheit e imprime su equivalente en grados Celsius. cin>>a. cout<<"\n CONVIERTE GRADOS FAHRENHEIT A CELSIUS. } 6.Utilizando el especificador extern.h> #include <iostream.h> # include <conio.30 Programación C y C++ 5. Celsius= (Fahr-32)*5/9.prj */ #include <conio. Rankine=Fahrenheit+460. cout<<"\nTERCERO PRODUCTO:". cout<<"INTRODUSCA LOS PRECIOS DE LOS 3 PRODUCTOS:". clrscr(). Donde: Celsius=(Fahrenheit-32)x5/9. externa //Variable void func1() { float a. Kelvin.cpp deberá leer el precio de los 3 productos vendidos por un comerciante y calculará el total de ventas que tuvo En el archivo Venta1. cout<<"\n CELSIUS : "<<Celsius.h> void main () { float Fahr. KELVIN. Y RANKINE. cin>>c.cpp deberá imprimir el resultado.h> extern float Vta. Celsius. getch().. cout<<"\n KELVIN : "<<Kelvin. cout<<"\n GRADOS FAHRENHEIT:". Rankine. /*Venta1. Vta=a+b+c.h> #include <iostream. escriba un programa compuesto por 2 Kelvin=Celsius+273. func1().b. cout<<"\n\nPRIMER PRODUCTO: ". /*Fahrenhe. } . Kelvin=Celsius+273. cout<<"\n RANKINE : "<<Rankine.cpp Proyecto: Venta. En el archivo Venta2.. } /*Venta2. cin>>Fahr. kelvin. y Rankine.h> float Vta.cpp */ # include <iostream.prj */ #include <conio. void func1(). Rankine=Fahr+460. cout<<"\n EL TOTAL DE VENTAS ES:$ "<<Vta.

cout<<"\nLOS INTERESES SON : "<<Interes.Interes. getch().. cout<<"\nINVERSION :".h> float Inversion. cout<<"CALCULO DE INTERESES\n\n ". cin>>Inversion. Calcula2(). } void main() { clrscr().prj extern float Inversion. Interes=Inversion*Taza*N. Calcula().h> extern float Inversion. /*Banco1. cout<<"\nTAZA DE INTERES : ". void Calcula2() { Deuda=Interes+Inversion.Deuda.Programación C y C++ 31 7. cout<<"\n\nLA DEUDA SERIA : "<<Deuda. Interes.prj */ # include <iostream. cin>>Taza.cpp mostrará en pantalla tanto el Interés como la deuda calculados. cout<<"\nCUANTOS AÑOS: ".cpp proyecto: Banco.cpp Proyecto: Banco. } . void Calcula2(). int N.Interes. void Calcula() { float Taza. /* Banco2.cpp Proyecto: Banco. La taza de interés y el número de años. void Calcula().h> # include <iostream.Deuda. calculando el Interés simple a partir de estos datos En el archivo Banco3.Utilizando el especificador extern escriba un programa compuesto por 3 archivos que calcule el interés simple y la deuda de un Préstamo a una taza de interés en N años: En el archivo Banco2. cin>>N. } // Banco3.prj */ # include <conio.cpp calculará la deuda acumulada En el archivo Banco1.cpp Leerá la Inversión.

10. Elaborar un programa que lea el artículo y su costo.. 1.Utilizando el especificador extern. el punto medio entre los dos números. escriba un programa compuesto por 2 archivos que calcule la distancia que recorre la luz en un tiempo dado. Elabore un programa que lea un número de pies y calcule e imprima su equivalente en yardas.32 Programación C y C++ EJERCICIOS PROPUESTOS. Elaborar un programa que lea una temperatura en grados centígrados y obtenga e imprima la temperatura Fahrenheit equivalente. Elaborar un programa que calcule e imprima el costo de un terreno cuadrado o rectangular. de acuerdo con las siguientes equivalencias: 1 pie = 12 pulgadas. Una temperatura en grados centígrados (C) se puede convertir a su equivalente Fahrenheit (F) con la fórmula: F = 9/5 C + 32 . es decir. impuesto y precio de venta. Elaborar un programa que lea dos números enteros y positivos e imprima la media aritmética. pulgadas. .cpp deberá imprimir el resultado. 3. Elaborar un programa que lea una cantidad de horas e imprima su equivalente en minutos. la longitud en metros. . 8. la utilidad es el 200% y el impuesto es el 15%.54 cms. Area= 4 Π r2 Volumen = 4/3 Π r3 7. calcular e imprimir el artículo. calcule e imprima el volumen y el área. Elaborar un programa que lea el radio (r) de una esfera. 4. 5. 6. centímetros y metros. En el archivo Luz2. Z= 1 / 2Π e –w2/2 9. utilidad. 2. segundos y días. 1 metro = 100 cm. 1 yarda = 3 pies.. 1 pulgada =2. y el costo del metro cuadrado. calcular e imprimir la cantidad a pagar en pesos por la cantidad de dólares indicada.cpp deberá leer el tiempo en segundos y calculará la distancia recorrida (Distancia = Velocidad* Tiempo) En el archivo Luz..Elaborar un programa que lea el valor de w e imprima el valor de z. teniendo como datos la anchura.Elaborar un programa que lea la cantidad de dólares a comprar y el tipo de cambio en pesos (costo de un dólar en pesos).

.Programación C y C++ 33 Capitulo 2 Sentencias de control de programa • • • • Sentencias de Selección Sentencias de Iteración Sentencias de Salto Ejercicios En este capitulo se discute el conjunto de sentencias de control de programa que el lenguaje C soporta .

} Si al evaluar la expresión. La cláusula else se puede añadir a la sentencia if cuando la expresión es falsa y se desean ejecutar sentencias distintas. cout<<"PROPORCIONE SU EDAD: ". entre las que se incluyen if y switch Muchas sentencias de C se basan en una prueba condicional que determina la acción que se ha de llaver acabo. } Ejemplo: /*IF. if (expresion es verdadera) { sentencia_1.h> #include <iostream. cin>>Edad. sentencias_2. ésta es verdadera se ejecutan las sentencias del bloque (un bloque comienza con { y termina en }). if (Edad<18) cout<<"\n Aun es menor de edad". sentencias_2. • if. clrscr().34 Programación C y C++ SENTENCIAS DE SELECCIÓN A las sentencia de selección tambien se les conoce como sentencia condicional. } else { sentencia_11. if-else La sintaxis de esta sentencia es: if (expresion es verdadera) { sentencia_1. else cout<<"\n Es mayor de edad". } . incluyendo los números negativos. El 0 es el único valor falso. en caso contrario se ejecutan las sentencias a continuación del bloque. sentencias_22. Una expresión condicional tiene como resultado un valor cierto o falso. En C cualquier valor distinto de cero es cierto. getch().h> void main() {int Edad.cpp Determina si una persona es mayor o menor de edad usando la Instrucción if*/ #include <conio.

. sentencia_22. else Mayor=C. cout<<"El Mayor es: "<<Mayor.h> #include <iostream. } • switch La sentencia switch permite evaluar una expresión y tomar diversas acciones en función del resultado de la expresión. //Probar con otros valores int Mayor. se ejecuta la sentencia asociada con ella y se pasa por alto el resto de la escala.h> void main() {clrscr()... sentencia_12. break. sentencia_12..C=15. .. Switch (expresión entera) { case constante_1: sentencia_11. if ((A>B) &&(A>C)) Mayor=A. Ejemplo: /*IF2.. else if ((B>A) && (B>C)) Mayor=B.Programación C y C++ 35 Si el usuario escribe un número menor que 18 entonces se muestra el mensaje “Aun es menor de edad” y si escribe un número igual o mayor que 18 entonces el mensaje será “Es mayor de edad”. case constante_2: sentencia_21.. int A=3.cp Encuentra el mayor de 3 números*/ #include <conio. ..B=10. default: sentencia_11. getch(). break. } .. Se pueden anidar if evaluándose de arriba hacia abajo tan pronto como se encuentre una condición cierta. .

se ejecutarán las sentencias que vienen a continuación de la sentencia opcional default. cout<<"\n 2. cin>>L. El conjunto de sentencias case no necesita ser encerradas entre llaves. Coincide con el valor de expresión_entera. Si ninguno de la valores de constante_1. break.. op=getche(). Necesita utilizar una sentencia break después de cada conjunto de sentencias ejecutables. case '2': cout<<"\n\n Base:".36 Programación C y C++ La siguientes reglas se aplican en el uso de la sentencia switch • • • Expresión entera. cout<<"\n Opcion:".B.h> #include <iostream. cout<<"\n Altura:". cin>>B. etc. cout<<" CALCULO DE AREAS"..RECTANGULO". float Area. . una llamada a función o una expresión.R. int L. cin>>H. cout<<"\n 3. cout<<"\n 1.. break. switch (op) { case '1': cout<<"\n\n Lado:". como 3 o ‘b’. clrscr(). la ejecución del programa se reanudará en las siguientes etiquetas case.H. La sentencia switch no funciona con datos de tipo coma flotante El valor después de cada etiqueta case debe ser una constante entera o carácter. puede ser una constante. Area=L*L.h> void main() {char op.TRINGULO". • • Ejemplo: /*Switch. La sentencia break hace que la ejecución del programa se reanude después del final de la sentencia switch actual.CIRCULO". una variable. Si no se utiliza la sentencia break. o bien una expresión que se evalúe a una constante como ‘a’ +’32’. Area=(B*H)/2.cpp Calcula el área de figuras Geométricas usando la Instrucción switch*/ #include <conio. constante_2.

SENTENCIAS DE ITERACIÓN Entre las sentencias de iteración se incluyen for. default:cout<<"\n\n OPCION NO VALIDA".. cin>>R. Cualquier sentencia de iteración tiene tres partes importantes que son: Inicialización. aunque cada sentencia de iteración debe usarse preferente según la situación en la mayoría de los casos se puede adaptar cualquiera de las tres a cualquier situación. while y do-while. break.TRINGULO 3. calcula el Area con la formula (B*H)/2. 2 ó 3. reanudándose este al final del switch donde se encuentra la instrucción if que evalúa si la opción seleccionada esta en el intervalo de 1 a 3 para desplegar el contenido del Area calculada. } La salida de una ejecución sería: CALCULO DE AREAS 1. getch(). for(exp_inicialización. si el usuario selecciona la opción 2 entonces solicita la Base y la Altura del triangulo almacenando los datos en las variables B y H respectivamente.. Area=2*3.CIRCULO Opcion:2 Base:10 Altura:20 El Area es: 100 37 Dependiendo de la opción seleccionada por el usuario será el conjunto de sentencias que se ejecuten. puede introducir cualquier otro valor diferente de 1.. en este caso se ejecuta la sentencia hallada después del default y al final del programa no se imprimiría el Area. condición e incremento. } if ((op>='1')&&(op<='3')) cout<<"\n El Area es: "<<Area.1416*R*R.RECTANGULO 2. expresión_incremento) . El programa al no limitar los valores posibles que el usuario puede seleccionar (Validación). la construcción adecuada es la sentencia for.Programación C y C++ case '3': cout<<"\n\n Radio:". en este punto se interrumpe la secuencia de ejecución de sentencias por la presencia de la instrucción break. • for Cuando se desea ejecutar una sentencia simple o compuesta. condición. repetitivamente un número de veces conocido.

transfiriendo el control a la línea de código que lee una tecla. Ini=0. las instrucciones dentro del ciclo son ignoradas y la ejecución continúa con la instrucción al final del ciclo. int x. Tras esto se prueba la condición. Fin. Inc=5. la instrucción o instrucciones dentro del ciclo son ejecutados. getch(). .cpp Efectúa ciclos según Ini. La secuencia de eventos es el siguiente: No. //Probar con otros valores for (x=Ini.. Inc */ #include <conio.h> void main() {clrscr(). Cuando se encuentra la instrucción for se ejecuta primero la expresión de inicialización. Cuando se necesitan ejecutar varias instrucciones dentro del ciclo se hacen necesarias definir el bloque con las llaves {} Ejemplo: /*for. } La salida sería: 0 5 10 15 El programa efectúa un total de 5 ciclos. Siempre que condición se evalúa como verdadero. Sin embargo si condición toma el valor Falso. Ciclo 1 2 3 4 5 x 0 5 10 15 20 condicion 0<20 5<20 10<20 15<20 20<20 Acción Imprime 0 Imprime 5 Imprime 10 Imprime 15 Fin ciclo for. Generalmente esta instrucción realiza la inicialización de la variable de control de ciclo. Fin=20.x=x+Inc) cout<<"\t"<<x. no volviendo a ejecutarse más. Después de entrar en el ciclo y ejecutar todas las instrucciones dentro de éste se ejecuta expresión_incremento.38 Programación C y C++ instrucción.h> #include <iostream.x<Fin. aunque en este último la condición se hace falsa por lo que finaliza.

x++) { cout<<"\n". y así hasta que y=5 imprime 5. Debido a esto se pueden ejecutar de cero a muchas veces.Programación C y C++ for anidados 39 Un ciclo for puede colocarse dentro de otro. esto significa que la condición es evaluada antes de entrar a ejecutar las instrucciones dentro del cuerpo del ciclo.h> #include <iostream. int fin1=6. while (condicion) { instrucción_1.x<=fin1. for (y=1. • while La sentencia while es un ciclo de verificación preliminar. en este caso el ciclo interno se ejecutará totalmente cada vez que se ejecute el ciclo que lo contiene. fin2=5. Ejemplo: /*for2. int x.h> void main() {clrscr(). luego y=2 y se imprime 2.y. en el siguiente ciclo la condición se hace falsa dándose por terminado el ciclo interno.y++) cout<<x*y<<"\t". instrucción_2. } . //Probar con otros valores for (x=1. } getch(). este proceso se sigue hasta que la condición del ciclo externo se hace falsa.cpp Imprime tabla de multiplicación */ #include <conio. } La salida sería: 1 2 3 4 5 6 2 4 6 8 10 12 3 6 9 12 15 18 4 8 12 16 20 24 5 10 15 20 25 30 Por cada valor que toma x en el ciclo for externo se efectúa totalmente el ciclo for interno es decir y inicialmente toma el valor de 1 y se imprime 1*1=1.y<=fin2. pero el ciclo externo incrementa su valor y ejecuta nuevamente el ciclo interno.

//Inicialización while (x>fin) { cout<<x<<"\t". do { Instrucción_1. es decir al ciclo se entra al menos una vez . Como los ciclos do-while se ejecutan como mínimo una vez. es mejor utilizarlos en aquellas aplicaciones en las que se quiere entrar al ciclo.inc=10. } while(condición). int x=ini.h> #include <iostream. y la condición del ciclo se prueba al cabo de la primera iteración. } } La salida sería: 50 40 30 20 //Decremento 10 • do-while Difiere tanto de for como de while en que es un ciclo de verificación posterior. . x=x-inc.40 Programación C y C++ La inicialización de un ciclo while por lo regular se realiza antes de ella y el incremento dentro del bloque.h> void main() {int ini=50.cpp Visualiza números en orden descendente */ #include <conio.fin=0. /*While. Instrucción_2.

do { cout<<" MENU". en caso contrario desplegará nuevamente el menú de opciones. De ellas. cout<<"\n 3.h> void main() {clrscr(). cout<<"\n 2. cout<<"\n 1. cout<<"\n 4. } La salida del programa sería: MENU 1.-Altas 2. break y continue.Programación C y C++ Ejemplo: /*Do-While. se puede usar return y goto en cualquier parte del programa .cpp Menu de Opciones */ #include <conio.-Salir".3.-Bajas". do { op=getch(). . Las sentencias break y continue se deben usar junto con una sentencia de ciclo.h> #include <iostream.-Consultas".2.-Bajas 3. cout<<"\nOpcion:". • return La sentencias return se usa para volver de una función.4) se vuelve a leer sin salir del ciclo interior. Solamente si el usuario selecciona la opción ‘4’ la condición del ciclo exterior será falsa y finalizará. char op. //Código adicional } while (op!='4').-Consultas 4.-Salir Opcion: 41 En este ejemplo se utilizan dos ciclos do-while anidados. SENTENCIAS DE SALTO C tiene cuatro sentencias que llevan a cabo un salto incondicional: return. Se trata de una sentencia de salto porque hace que la ejecución vuelva (salte atrás) al punto en que se hizo la llamada a la función. } while(op!='1'&&op!='2'&&op!='3'&&op!='4'). goto.-Altas". de tal forma que si el usuario selecciona una opción distinta a las permitidas (1. El ciclo exterior controla la terminación del programa y el ciclo interior valida la opción seleccionada por el usuario.

42 Programación C y C++ Return (expresión) Donde: el valor de expresión se devuelve como valor a la función. cout<<"\n"<<x. Ejemplo: /*goto.. la función termina tan pronto como encuentra el primer return. Inicio: x++. o para saltar a otra parte de un programa. Se puede usar para finalizar un case en una sentencia switch. saltando la evaluación condicional normal del ciclo.h es parecida a return aunque este en lugar de afectar a una función afecta a todo el programa. } • break La sentencia break tiene dos usos. • goto La sentencia goto se puede usar para realizar ciclos usando una etiqueta. También se puede usar para forzar la terminación inmediata de una bucle.cp */ #include <conio.h> void main() {clrscr().h> #include <iostream. Sentencia_2. Sin embargo. Etiqueta: Setencia_1. . el ciclo finaliza inmediatamente. La función exit() definido en el archivo de cabecera stdio. . int x=0. if (x<10) goto Inicio. Cuando se encuentra la sentencia break dentro de un ciclo. actualmente no es recomendable su uso por que hace ilegible el código. goto Etiqueta. Una función declarada como void no debe contener una sentencia return. Se puede usar tantas sentencias return como se quiera en una función.. más adelante en el tema de funciones se podrán apreciar ejemplos. Donde: Etiqueta es cualquier etiqueta valida anterior o posterior al goto.

h> #include <iostream.cpp Imprime los números del 0 al 50 que sean múltiplos de 4 */ #include <conio. for (x=0.h> #include <iostream.h> void main() { clrscr().h> void main() { clrscr(). int x. continue. if (car==27) break.) //Ciclo infinito { car=getche(). en vez de forzar la terminación. forza una nueva iteración del ciclo y salta cualquier código que exista abajo en el bloque. } } 43 • continue La sentencia continue funciona de una forma algo similar a break.cpp Lee caracteres hasta que se pulse la tecla <esc> */ #include <conio.. cout<<x<<" ". Ejemplo: /*continue.x<50. for(. cout<<"PULSE <Esc> PARA TERMINAR\n\n". char car.x++) { if (x % 4) //Cualquier valor diferente de cero es verdadero continue. } } La salida del programa es: 0 4 8 12 16 20 24 28 32 36 40 44 48 . Sin embargo.Programación C y C++ Ejemplo: /*break.

44

Programación C y C++

EJERCICIOS RESUELTOS 1.- Programa para calcula la calificación final de un alumno, teniendo como datos N calificaciones parciales (3). Imprime el nombre, la calificación final y un comentario de “Aprobado” si obtiene 70 o más y “Reprobado” en caso contrario.
/*Alumno.cpp */ #include <stdio.h> #include <conio.h> #include <iostream.h> #define N 3 void main() { clrscr(); float Prom,SumCal=0,Cal; int x; char Nom[40]; cout<<"DETERMINA SI UN ALUMNO APRUEBA O NO"; cout<<"\n\nNOMBRE DEL ALUMNO: "; gets(Nom); for (x=1;x<=N;x++) { cout<<"\n CALIFICACION No "<<x<<": "; cin>>Cal; SumCal=SumCal+Cal; } Prom= SumCal/N; cout<<"\nEL ALUMNO "<<Nom<<" TIENE EL PROMEDIO DE: " <<Prom<<" Y ESTA:"; if(Prom>=70) cout<<"\n\nAPROBADO"; else cout<<"\n\nREPROBADO"; } getch();

Programación C y C++

45

2.- En un hotel se hace un descuento del 10% si el cliente se hospeda más de 5 días, el 15% si se hospeda más de 10 días y del 20% si se hospeda más de 15 días. Programa que lee el número de días y el precio diario de la habitación e imprima el subtotal a pagar, el descuento y el total a pagar.
/*Hotel.cpp */ #include <conio.h> #include <iostream.h> void main() { clrscr(); float CosHabi,Dias,Desc,SubTotal,Total; cout<<"CALCULA EL COSTO DE UNA HABITACION DE UN HOTEL"; cout<<"\n\nCOSTO DE LA HABITACION: "; cin>>CosHabi; cout<<"No. DE DIAS: "; cin>>Dias; SubTotal=CosHabi*Dias; if (Dias<=5) Desc=0; else if (Dias>5 && Dias<=10) Desc=SubTotal*.10; else if (Dias>10 && Dias<=15) Desc=SubTotal*.15; else Desc=SubTotal*.20; Total=SubTotal-Desc; cout<<"\nSUB-TOTAL: "<<SubTotal; cout<<"\nDESCUENTO: "<<Desc; cout<<"\n _______ "; cout<<"\nTOTAL: "<<Total; }

46

Programación C y C++

3.- Programa que calcula el salario de un empleado, Según el número de horas trabajadas por semana y el salario por hora. Si el número de horas trabajadas es menor o igual a 40 se paga la cuota normal por hora. Si el número de horas rebasa las 40 horas reglamentarias, el excedente se paga como tiempo extra: 1 a 10 hrs. Extras se paga al doble de la cuota por hora 11 a 20 hrs. Extras se paga al triple de la cuota por hora 21 ó más hrs. Extras se paga al cuádruple de la cuota por hora En ningún caso el número de horas trabajadas por semana podrá ser superior a 80.
/*Salario.cpp */ #include <stdio.h> #include <conio.h> #include <iostream.h> void main() { clrscr(); float SalSem, SalHra, SalTE=0,SalBase; int Hrs; char Nom[40]; cout<<"CALCULA EL SALARIO SEMANAL DE UN TRABAJADOR"; cout<<"\n\nNOMBRE DEL TRABAJADOR: "; gets(Nom); cout<<"\nNo. DE HORAS TRABAJADAS POR SEMANA: "; do{ //Valida el intervalo de Hrs permitidas cin>>Hrs; } while(Hrs<0 || Hrs>80); cout<<"\nSALARIO POR HORA:"; cin>>SalHra; if (Hrs<=40) { SalBase=Hrs*SalHra; SalSem=SalBase; } else { SalBase=40*SalHra; if (Hrs>40 && Hrs <=50) SalTE=(Hrs-40)*SalHra*2; else if (Hrs>50 && Hrs <=60) SalTE=(Hrs-40)*SalHra*3; else SalTE=(Hrs-40)*SalHra*4; SalSem=SalBase+SalTE; } cout<<"\nTRABAJADOR: "<<Nom; cout<<"\nSALARIO BASE: "<<SalBase; cout<<"\nSALARIO POR TIEMPO EXTRA: "<<SalTE; cout<<"\n _______ "; cout<<"\nSALARIO TOTAL SEMANAL: "<<SalSem; }

.y). gotoxy(x1.cout<<"−". cin>>x1>>y1>>x2>>y2.cout<<"⌐". y1. gotoxy(x2.y. solicitar las coordenadas x1.y2).h> void main() { clrscr(). cout<<"DIBUJA UN RECTANGULO EN PANTALLA SEGUN COORDENADAS".x++) //Dibuja Línea horizontal { gotoxy(x.Y2 MODO TEXTO ". //Para las Esquinas gotoxy(x2.Escribir un programa para dibujar un rectángulo en modo texto en la pantalla.y<y2.y1 47 x2.cpp */ #include <conio.y).Y1.y2.cout<<"┘". x2 y y2. } gotoxy(x1.x2.y2).cout<<"−". según la siguiente figura: x1.cout<<"¬".cout<<"└".x1.cout<<"⏐".y1). gotoxy(x2. int x.y1.X2.x<x2. gotoxy(x.y2 /*Rectang.Programación C y C++ 4.h> #include <iostream.y++) //Dibuja línea Vertical { gotoxy(x1.y1). cout<<"SEPARADOS POR UN ESPACIO: \n". for (x=x1.y1).y2). } .cout<<"⏐". cout<<"\nESCRIBA LAS COORDENADAS X1. } for (y=y1+1.

. debe tener 70 o más en cada una de las tres calificaciones.. Elabore un programa que lea estos datos e imprima: Nombre del cliente.Programa que dibuje una secuencia de N rectangulos (5) a partir de un rectangulo cuyas coordenadas sean proporcionados por el usuario. Tipo de cliente (1. Total a pagar. Cuando el cliente realiza una compra se generan los datos siguientes: Nombre del cliente.Una librería vende libros con las condiciones siguientes: Si el cliente es tipo 1 se le descuenta el 30%. en caso de ser mayor que 100 el descuento adicional es de 10%..En un almacén de ventas de trajes si se compra uno se hace el 50% de descuento. 5. 4. ancho y precio por metro cuadrado.Reescriba el programa del ejercicio resulto 1 pero sin usar ciclos 7. si el cliente es tipo 2 se le descuenta el 20%. la calificación final será el promedio.. 1. si el terreno tiene más de 500 metros cuadrados el descuento es de 17% y si tiene más de 1000 el descuento es de 25%. 3. si compra 2 el 55%. . En caso de haber reprobado uno o más exámenes ordinarios. costo por libro. Descuento y el Neto a pagar. el descuento y el total a pagar. 2.2. se hace un descuento adicional de 5%. si compra 3 el 60% y si compra más de 3 el 65%. cantidad de libros. Si el terreno tienen más de 400 metros cuadrados se hace un descuento de 10%. 6. si el cliente es tipo 3 se le descuenta 10%. Elaborar un programa que lea la cantidad de trajes y el precio unitario (todos tienen el mismo precio) e imprima el subtotal a pagar. la calificación final será NA (NO ACREDITADO).. los rectangulos siguientes se irán haciendo más pequeños en forma proporcional cada vez.48 Programación C y C++ EJERCICIOS PROPUESTOS. pero además: Si la cantidad de libros solicitada es mayor que 50..Elabore un programa para calcular e imprimir el precio de un terreno del cual se tienen los siguientes datos: largo..3).Igual que el ejercicio anterior.Elaborar un programa que lea los datos de un estudiante: nombre y tres calificaciones parciales e imprimir el nombre y la calificación final de acuerdo a lo siguiente: Para aprobar el curso.

por esta razón se integran en este capitulo. punteros y cadenas de caracteres son conceptos relacionados en el lenguaje C. .Programación C y C++ 49 Capitulo 3 Arreglos y Apuntadores • • • • • • • • • Que son los arreglos Arreglos unidimensionales Cadenas Arreglos bidimensionales Apuntadores Punteros y arreglos Inicialización de apuntadores Funciones de asignación dinámica Ejercicios Los arreglos.

el tamaño total en bytes se calcula: Tatal en bytes =sizeof(tipo)*tamaño = sizeof(nombre_ arreglo).90. //Tam=40 • Inicialización de un arreglo Cuando se crea un arreglo sólo se puede utilizar constantes para inicializarlo e aquí algunos ejemplos: int Calif[4]={80. Para un arreglo unidimensional. por tanto el primer elemento de la variable anterior sería Calif[0] y el último elemento Calif[29]. La dirección más baja corresponde al primer elemento y la dirección más alta al último elemento. int Tam. Es responsabilidad del programador realizar este tipo de operaciones para no escribir o modificar porciones de memoria que no le pertenecen al arreglo.34. En C todos los arreglos tienen el 0 como índice de su primer elemento.45.10}. Ejemplo: #define N 30 int Calif[N]. float real[5]={23.75. ARREGLOS UNIDIMENSIONALES A los arreglos unidimensionales también se les conoce como listas.50 Programación C y C++ QUE SON LOS ARREGLOS Un arreglo es una colección de variables del mismo tipo que se referencia por un nombre común.90.100}. La cantidad de memoria requerida para guardar un arreglo esta directamente relacionada con su tipo y su tamaño.1. Tam=sizeof (Salario). El tamaño puede omitirse cuando se inicializa el arreglo. . cuando se declara como un parámetro en una función o cuando se hace referencia a un arreglo declarado en otra parte del programa. En C todos los arreglos constan de posiciones de memoria contiguas. nombre Es el identificador del arreglo tamaño Especifica el número de elementos del arreglo. El lenguaje C no checa los límites de un arreglo. Ejemplo: float Salario[10]. A un elemento específico de un arreglo se accede mediante un índice.70. Donde: tipo Indica el tipo de datos de los elementos del arreglo.75. Tipo nombre[Tamaño]. Los arreglos pueden tener una o más dimensiones. es recomendable que el tamaño sea definido como una constante para garantizar no rebasar el límite del arreglo. La declaración de la variable anterior hace que el compilador reserve espacio de memoria para almacenar 30 datos de tipo entero. Tipo nombre[].

//inicializa la semilla for (x=0. getch().h> //por random() y randomize() #define N 10 void main() { clrscr().x++) { Aleat[x]=random(100).cpp Visualiza el contenido de un arreglo */ #include <conio. } La salida es 90 80 100 70 La asignación anterior contempla los cuatro elementos del arreglo desde el índice 0 hasta el índice 3.x. Cal[0]=90. } //Encuentra el número mayor en el arreglo for (x=0.Cal[2]=100. randomize(). char Cadena[11]=”HOLA AMIGOS”.h> #include <iostream. Cal[3]=70.’e’.x.cpp.h> #include <iostream.x<N. cout<<"\n\nEl mayor es: "<<Mayor.h> #include <stdlib. int Aleat[N]. entre 0 y 100 cout<<" "<<Aleat[x].’d’.x++) if (Aleat[x]>Mayor) Mayor=Aleat[x]. char Cadena2[]=”PROGRAMACIÓN EN LENGUAJE C”.x<N. for (x=0.’b’.’f’}.x++) cout<<"\t"<<Cal[x].*/ #include <conio. Cal[1]=80.cpp.’c’. //genera números aleat. } .x<N. int Mayor=0. int Cal[N].cpp Determina el número mayor que existe en un arreglo unidimensional generados aleatoriamente. durante la impresión se utiliza la constante N para limitar el número de iteraciones que efectúa el ciclo for /*Arreglo3. 51 Para comprender mejor el manejo de los arreglos se presentan a continuación algunos ejemplos: /*Arreglo2.Programación C y C++ char Caracter[]={‘a’.h> #define N 4 void main() { clrscr().

18.3. } if (ind!=x) //Intercambia el elemento menor a la posición x { temp=A[x].x<N. } La salida del programa es: 3 18 23 24 29 37 41 59 64 79 El método de ordenación por selección separa el elemento con menor valor y lo intercambia con el primer elemento.23. int A[N]={79.temp. El intercambio continúa hasta llegar a los dos últimos elementos.h> #define N 10 void main() { clrscr().41.y<N. .37.52 Programación C y C++ En cada ejecución del programa la secuencia de números aleatorios cambia. A[x]=A[ind]. //Arr.x++) { menor=A[x]. for (x=0. ind=y.24. A[ind]=temp.ind. ind=x.y++) //Recorre la lista y determina if (A[y]<menor) //el menor { menor=A[y].cpp Ordena un arreglo unidimensional en forma ascendente aplicando el método de selección */ #include <conio. de los N-1 elementos se busca el siguiente elemento con menor valor y se intercambia con el segundo elemento y así sucesivamente. Después. por lo consiguiente también la salida.x<N-1.59.64.x++) cout<<" "<<A[x]. aquí se presenta una de ellas: 79 24 59 18 41 37 64 3 23 29 El mayor es: 79 /*Arreglo4.x. for (y=x+1. } } for (x=0. inicializado int menor.29}.h> #include <iostream.y. getch().

h> #include <iostream. char Cad[]="HOLA AMIGO".Programación C y C++ 53 CADENAS C no tiene un tipo de dato para cadenas de caracteres.c2) Función Copia c2 en c1 Concatena c2 al final de c1 Devuelve la longitud de la cadena Devuelve 0 si c1 y c2 son iguales. } La salida del programa es: OGIMA ALOH //Esta es la cadena //Longitud de la cadena Con la función strlen() se calcula la longitud de la cadena.c2) strcmp(c1.x>=0. al final del arreglo contiene el carácter nulo ‘/0’.Funciones para el manejo de cadena Ejemplos: /*Cadena.h> void main() { clrscr(). Una cadena de caracteres es un arreglo unidimensional.car) Devuelve un puntero a la primera ocurrencia de car en c1 strstr(c1. mayor que 0 si c1>c2 strchr(c1.h e aquí algunos: Nombre strcpy(c1.. L=strlen(Cad). 1. para que en el ciclo for se inicie a partir del último índice del arreglo de caracteres.c2) Devuelve un puntero a la primera ocurrencia de c2 en c1 Tabla 3. .c2) strcat(c1. decrementandolo de uno en uno hasta llegar a cero.2) strlen(c1.x--) cout<<Cad[x]. C soporta una gran variedad de funciones para el manejo de cadenas definidos en el archivo de cabecera string.x. en el cual todos sus elementos son de tipo char. en cada ciclo se imprime un carácter a la vez.h> #include <conio. int L. getch().cpp */ #include <string. for (x=L-1. menor que 0 si c1<c2.

él estudio en el: "<<C.C1).cpp Operaciones con cadena */ #include <string.4 se escribiría: Int Tabla[5][4].Est)==0) cout<<"\nAcertaste".h> #include <iostream. Un arreglo bidimensional puede verse como una tabla.x. Para definir un arreglo Tabla de enteros bidimensional de tamaño 5.h ARREGLOS BIDIMENSIONALES El termino dimensión representa la cantidad de índices utilizados para referenciar un elemento particular en un arreglo. //Copia C1 en C strcat(C. char C[N]. en su lugar se usa mejor la función gets() de stdio.h> #include <conio. //En lugar de cin.getline().C2). char C1[]="INSTITUTO ". } La salida es: Donde Estudio el autor de este libro: INSTITUTO POLITECNICO NACIONAL No Acertaste. .getline() agrega el carácter cambio de línea (‘\n’) al final de la cadena por lo que jamás abría una coincidencia con la cadena Concatenada C. Los arreglos de más de una dimensión se conocen como arreglos multidimensionales. getch().54 Programación C y C++ /*Cadena2. else cout<<"\nNo Acertaste. if (strcmp(C. char Est[N]. char C2[]="TECNOLOGICO DEL ISTMO".h> #define N 40 void main() { clrscr(). int L. //Concatena C2 en C cout<<"\nDonde Estudio el autor de este libro: ". él estudio en el: INSTITUTO TECNOLOGICO DEL ISTMO La lectura de una cadena con la función cin. así la declaración anterior denotaría una tabla de 5 filas por 4 columnas. La forma más simple de un arreglo multidimensional es el arreglo bidimensional. strcpy(C. donde el primer índice denota el número de filas y el segundo el número de columnas.h> #include <stdio. gets(Est).

y++) { Tabla[x][y]=5*cont. índice Así la definición int Tabla[5][4].cpp Lee las K calificaciones de N alumnos.cpp Asigna valores múltiplos de 5 a un arreglo bidimensional */ #define N 5 #define K 4 void main() { int Tabla[N][K]. índice * tamaño del 2º.y. for (x=0. requeriría: 2*5*4 = 40 Bytes de memoria.y<K.h> #define N 5 #define K 4 void main() . cont++. Tamaño en bytes=sizeof(tipo)*tamaño del 1er. La cantidad de memoria en bytes para almacenar un arreglo bidimensional. } } El programa utiliza dos ciclos for para asignar valores a cada uno de los elementos del arreglo.cont=0. se puede calcular aplicando la siguiente formula.x++) for(y=0.h> #include <iostream.Programación C y C++ 55 0 1 2 3 4 0 0 20 40 60 80 1 5 25 45 65 85 2 10 30 50 70 90 3 15 35 55 75 95 Tabla[1][2] Un programa que asigne valores a los elementos del arreglo bidimensional como en la tabla anterior sería: /*A_Bidim. Ejemplo: /*A_Bidim2. int x. índice (columnas) y el for externo el primer índice (filas).x<N. el aprovechamiento del grupo y visualiza los resultados */ #include <conio. calcula sus promedios. el for interno controla el 2º.

cin>>Calif[y][x].y+N+4).y++) { cout<<"\n"<<y+1. for(x=0.x++) { gotoxy(x*5+10. int x. de igual forma se puede .y+N+4). int Calif[N][K].y<N. float Prom[N]. for (y=0.y<N.x<K. } cout<<"\nAprovechamiento : "<<Aprov.y+2). cout<<"ALUMNO I II III IV\n".x++) { gotoxy(x*5+10. //Aprovechamiento de grupo //Visualización cout<<"\nALUMNO I II III IV Prom". Suma1=0. cout<<Calif[y][x].y++) { cout<<y+1. Suma1.y. for (y=0. Suma1=Suma1+Calif[y][x]. Aprov.56 Programación C y C++ { clrscr(). cout<<Prom[y]. getch(). si en lugar de 4 unidades se requiere de 5 basta con modificar este valor y todo funciona a la perfección.Suma2=0. } La salida del programa es: ALUMNO I II III IV 1 70 85 90 80 2 100 90 70 95 3 75 80 85 90 4 70 85 75 100 5 100 100 95 95 ALUMNO I II III IV Prom 1 70 85 90 80 81 2 100 90 70 95 88 3 75 80 85 90 82 4 70 85 75 100 82 5 100 100 95 95 97 Aprovechamiento : 86 El programa esta diseñado para adaptarse ante el cambio de los valores de las constantes K y N. for(x=0.x<K. } Aprov=Suma2/N. } gotoxy(x*5+10. //Promedio por alumno Suma2=Suma2+Prom[y]. } Prom[y]=Suma1/K.

entonces se dice que la primera variable apunta a la segunda. 1. Si una variable contiene la dirección de otra variable. .. Ejemplo: int *P. es decir apunta a la variable Car. Ejemplo: Int Tri[20][10][5].[Tn] Es raro que en algún programa se utilicen los arreglos de tres o más dimensiones por la cantidad de memoria que se requiere para almacenarlos.h para el control del cursor en la pantalla. El lenguaje C permite arreglos de más de dos dimensiones . si lo hay depende del compilador. un * y el nombre de la variable.Programación C y C++ 57 modificar el valor de N. que apunta a la dirección de memoria 2C03H. Normalmente... este último es una variable estática que contiene el carácter ‘A’. La forma general de declaración de un arreglo multidimensional es: Tipo nombre[T1][T2][T3]. La forma general para declarar una variable puntero es: Tipo * nombre. Dirección de memoria 2C00 2C01 2C02 2C03 Variable en memoria 2C03 *P Car ‘A’ Figura 3. en lugar de 5 alumnos puede modificarse a 10. • Declaración de un Apuntador Una declaración de un puntero consiste en un tipo base. esa dirección es la posición de otra variable de memoria. El límite. Requeriría de 2*20*10*5 = 2.000 bytes de memoria para almacenarla. en el programa se incluye la instrucción gotoxy() hallado en el archivo de cabecera conio.Una variable apuntando a otra P es una variable de tipo puntero. APUNTADORES Un puntero es una variable que contiene una dirección de memoria. Un programa bien escrito debe reunir la característica anterior para adaptarse ante un cambio sin ninguna o casi ninguna modificación en el código.

h> void main() { clrscr(). El & es un operador monario (sólo necesita un operando) que devuelve la dirección de memoria de su operando. hacerlo sería incongruente. apunta a la posición del elemento anterior. int *P. devuelve el valor de la variable localizada en la dirección que sigue. El *. de lo apuntado por P a y.58 Programación C y C++ Existen dos operadores especiales de punteros: & y *. //Incremento } } La salida sería: 0x3dc10000 0x3dc10002 0x3dc10004 0x3dc10006 0x3dc10008 . aunque C permite apuntar a una variable de un tipo distinto sin mensajes de error durante la compilación en algunos casos. o sea 10 Las variables puntero deben apuntar siempre a otra variable de su mismo tipo.x<5. int *P. //Las variables no son del mismo tipo • Aritmética de punteros Existen sólo dos operaciones aritméticas que se pueden realizar con los punteros: la suma(++) y la resta(--). P++. parece una aritmética normal. P=&x. Sin embargo.h> #include <iostream. int x. Cada vez que se decrementa. El siguiente programa ilustra este ejemplo: /*Apunta2. int *P. es el complemento de &. Cada vez que se incrementa un puntero. su valor aumenta en 2. //Asigna la dirección de x a P y=*P. Ejemplo: int x=10. apunta a la posición de memoria del siguiente elemento de su tipo base. Ejemplo: float x=10.y. for (x=0. //Asigna el cont.cpp Aritmética de punteros/ #include <conio. cuando se incrementa un puntero a entero. el resto de los punteros aumentan o decrementan en la longitud del tipo de datos a los que apuntan.x++) { cout<<P<<" ". Suponiendo los enteros de 2 bytes de longitud. P=&x. Con punteros a caracteres .

} while (P>Tope-N). int *P. El siguiente ejemplo muestra un sencillo programa para manejar una pila de enteros.h> #define N 5 void main() { clrscr(). en el primer ciclo se incrementa un elemento de tipo entero es decir un incremento de 2 por lo que ahora apunta a la dirección 0x3dc10002. //Agrega el elemento P++.h> #include <iostream. 0 para terminar:\n".Val. es decir dependerá del sistema operativo y los programas de aplicación cargados. } La salida Sería: Agregue elementos en la pila. /*Apunta3. //Incrementa el apuntador } else cout<<"Pila Llena\n". Si al probar el programa anterior las direcciones no coinciden con los aquí mostrados se debe precisamente a esta situación. do{ P--. if (Val!=0) //Agrega elementos a la pila if(P<Tope) { *P=Val. //Apunta al final de la pila cout<<"Agregue elementos en la pila. //Apunta al inicio de la pila Tope=Pila+N. y así sucesivamente por cada ciclo.Programación C y C++ 59 Al principio el apuntador P apunta a la dirección 0x3dc10000. P=Pila. } } while (Val!=0). int Pila[N]. else //Visualiza el contenido de la pila { cout<<"Contenido de la pila\n". la dirección inicial dependerá del estado de la memoria en el momento de la ejecución.*Tope. cout<<*P<<"\t". La dirección inicial de una apuntador no siempre va a ser el mismo en cada ejecución del programa. do { cin>>Val.cpp Pila de Enteros */ #include <conio. getch(). 0 para terminar: 80 .

Ap=Arr. contiene un valor desconocido.20. //Cambia el valor del tercer elemento for (x=0. Para acceder a los elementos de un arreglo se puede efectuar por cualquiera de los dos métodos: La indexación del arreglo ó la aritmética de punteros.80. Para acceder al tercer elemento del arreglo Arr.x<10. Un puntero debe ser correctamente inicializado para evitar cualquier problema. .40. *Ap. } La Salida sería: 10 20 999 40 50 60 70 80 90 100 INICIALIZACIÓN DE APUNTADORES Después de declarar un puntero y antes de asignarle un valor.x++) cout<<" "<<*(Ap+x).50. se pueden usar dos métodos: • Que apunte a una variable estática • Asignarle memoria dinámica.h> void main() { clrscr().cpp */ #include <conio. int Arr[10]={10. int *Ap. Si se intenta utilizar el puntero antes de darle el valor . Aquí Ap ha sido asignado a la dirección del primer elemento del arreglo Arr. Ejemplo: /*Apunta4. por que el nombre de un arreglo sin índice devuelve la dirección de inicio del arreglo. considérese el siguiente fragmento: int Arr[10]. se escribe: Arr[2] ó *(Ap+2).x.30.h> #include <iostream. //Apunta al inicio del arreglo *(Arr+2)=999. la ventaja del segundo método es que mejora la velocidad. probablemente se estrellara no sólo el programa sino también el sistema operativo de la computadora.100}.60 Programación C y C++ 30 95 50 10 40 Pila Llena 0 Contenido de la pila 10 50 95 30 80 PUNTEROS Y ARREGLOS Existe una estrecha relación entre los punteros y los arreglos. Ap=Arr. Ambas sentencias devuelven el tercer valor.90.60.70.

mientras que free() se utiliza para liberar estos bloques asignados. toda asignación dinámica de memoria se manipula mediante funciones tales como malloc() y free() hallados en el archivo de cabecera stdlib. FUNCIONES DE ASIGNACIÓN DINÁMICA La asignación dinámica es la forma en que un programa puede obtener memoria mientras se esta ejecutando. *P=1.cpp*/ #include <conio.h> //Por las funciones de asignación dinámica void main() { clrscr(). generalmente contiene una gran cantidad de memoria libre. ya sea una variable local o global. simple ó a un arreglo como en el programa anterior. //Libera la memoria } El mismo ejemplo pero ahora con new y delete /*As_Dina2. La función malloc() estable bloques de memoria. El segundo método es el que se aborda a continuación.h> #include <iostream. int *P. Sin embargo.h> #include <iostream. La memoria dispuesta mediante las funciones de asignación dinámica de C se obtienen del montón (La región de memoria libre que queda entre el programa y la pila). En los programas tradicionales de C.h> void main() . Por ejemplo: un procesador de textos. Pero hay ocasiones en que un programa necesita usar cantidades de memorias variables.h. *P=2. una hoja de cálculos. En el siguiente ejemplo se ilustra un programa para la asignación dinámica de memoria en C. P++. P=(int *) malloc(2*sizeof(int)). A las variables globales se le asigna memoria en tiempo de compilación. //Visualiza: 2 1 free(P). /*As_Dinam. Las variables locales usan la pila. //Asigna espacio para 2 Ent.h> #include <stdlib.Programación C y C++ 61 El primer método consiste en asignarle la dirección de otra variable previamente definida.cpp */ #include <conio. cout<<*P<<" "<<*(P-1). En C++ se define un método para signar memoria dinámica utilizando los operadores new y delete. etc. durante la ejecución de un programa no se pueden añadir variables globales o locales.

} • new El operador new está disponible inmediatamente en C++. el valor devuelto por new. //Asigna espacio para 2 Enteros (4 bytes) *P=1. Siempre que se asigne memoria. delete(Cad).cpp Verifica la cantidad de memoria dinámica libre */ #include <conio. new se puede utilizar con dos formatos: new tipo Asigna un único elemento new tipo[Número_elementos] Asigna un Arreglo. si no existe memoria disponible. for (x=1. cuando la memoria se agota el operador new retorna un 0 asignándosele a Cad. P=new int[2]. cout<<*P<<" "<<*(P-1).. //libera la memoria getch(). char *Cad. //Visualiza: 2 1 delete(P). . Ejemplo: /*As_Dina3. indicando la cantidad de memoria asignada. *P=2. de modo que no se necesita utilizar ningún archivo de cabecera.h> #include <iostream. El valor de x se muestra en pantalla. //Asigna 1 Kbyte de memoria if (Cad==0) break. } La salida es: Se detecto: 60 Kbytes de memoria libre El programa realiza un ciclo for infinito.h> void main() { clrscr(). es necesario comprobar antes de usar el puntero. } cout<<"Se detecto: "<<x<<" Kbytes de memoria libre".x++) //Ciclo infinito { Cad=new char[1024]. int x. P++. el operador new proporciona el valor 0 ó NULL. y es cuando el ciclo deja de ejecutarse por la presencia de la sentencia break.62 Programación C y C++ { int *P. en cada ciclo asigna 1 Kbyte de memoria dinámica a la variable Cad .

El bloque de memoria apartado por este puntero se libera.x++) { cout<<"\n"<<x+1<<" : ". /*Ganacia. for (x=0. } . int x.x++) cout<<"\n"<<x+1<<"\t"<<CosArt[x]<<"\t"<<Iva[x]<<"\t" <<Gan[x] <<"\t"<<Venta[x].Programación C y C++ • delete 63 El operador delete libera la memoria asignada con new. cin>>CosArt[x].cpp */ #include <conio. cout<<"ARTIC. for (x=0. //IVA por artículo Venta[x]=CosArt[x]+Gan[x]+Iva[x]. delete dirección El operador delete toma como argumento un puntero. es decir.x<N. COSTO IVA GANACIA VENTA". float CosArt[N].. GanTotal=GanTotal+Gan[x]. Venta[N]. //Ganancia por artículo Iva[x]=CosArt[x]*. Gan[N].h> #define N 5 void main() { clrscr(). cout<<"CALCULA LA GANANCIA EN LA VENTA DE "<<N<<" ARTICULOS". cout<<"\n\t\t\t_____\n\tGanancia Total= "<<GanTotal. //Ganancia total } clrscr(). //Prec.x<N.GanTotal=0.Iva[N].de Venta por art. getch(). Gan[x]=CosArt[x]*. calcule el costo de venta agregándole el 35% de ganancia más el 15% de IVA sobre el precio de compra y visualice los resultados en forma de tabla. cout<<"\nPROPORCIONE EL COSTO DE LOS ARTICULOS\n". EJERCICIOS RESUELTOS 1.Un vendedor de equipo de computo desea saber la ganancia total por la venta de N partes de computadoras. Escribir un programa que lea el costo de compra de cada uno de los N artículos.30.15.h> #include <iostream. se devuelve al sistema operativo para que pueda ser reutilizada.

este consiste en un examen escrito y un examen oral.y--) if(strcmp(Nom[y-1]. en el examen oral solamente intervienen 3 asesores que dictaminan mediante un conjunto de criterios previamente establecido la calificación del alumno. } //Método de burbuja for (x=1.x++) for(y=N-1. strcpy(Nom[y].cpp */ #include <string. En el examen escrito cada uno de los asesores registra la calificación obtenido por el alumno durante la asesoría de su materia.Temp).h> #include <iostream.Un grupo de 5 asesores desean conocer los promedios finales obtenidos por N alumnos de cierta especialidad que desean titularse por la opción VI. getch().Programa que lea los nombres de N alumnos y los ordene en forma ascendente aplicando el método de burbuja. for (x=0. char Nom[N][40].x++) cout<<"\n"<<x+1<<" : "<<Nom[x]. gets(Nom[x]).Nom[y])>0) { strcpy(Temp.x<N. int x. } 3. las calificaciones en la fase oral.x<N.h> #include <conio. e indicar con “SI” a los alumnos que aprueben y “NO” a los alumnos que reprueben. .h> #define N 5 void main() { clrscr(). cada uno de los alumnos. cout<<"ORDENA EN FORMA ASCENDENTE "<<N<<" NOMBRES ". el promedio en la fase oral y el promedio general. for (x=0.x++) { cout<<x+1<<" : ".h> #include <stdio. Para poder aprobar el examen se debe tener un promedio general superior o igual a 80%.Temp[40]..y.64 Programación C y C++ 2. } cout<<"\nLOS NOMBRES ORDENADOS SON: ". /*Burbuja.x<N. el promedio en la fase escrita.Nom[y-1]).. Escribir un programa que muestre en forma de tabla. //Intercambio de elementos strcpy(Nom[y-1].y>=x. cout<<"\nPROPORCIONE LOS NOMBRES\n". las calificaciones en la fase escrita.Nom[y]).

ALUMNO "<<x+1<<"\n".PrGrl[N]. int CalEs[N][M]. //Promedio por alumno en la fase Escrita clrscr(). cin>>CalEs[x][y]. for (x=0.x<N.y.x++) { Sum=0.x<N. 1 2 3 4 5 PrEsc. PrOr[N]. cin>>CalOr[x][y]. de Materias #define S 3 //No. 1 2 3 PrOr PrGrl. } } if (PrGrl[x]>=80) cout<<"\tSI".x++) { Sum=0. for(y=0. else cout<<"\tNO". cout<<"PROMEDIO GENERAL DE LOS ALUMNOS PARA LA TITULACION". } PrOr[x]=Sum/S. de Alumnos #define M 5 //No.y<S.x<N. //Lee Calificaciones fase Escrita Sum=Sum+CalEs[x][y].h> #include <iostream. Sum. DE LA FASE ESCRITA. cout<<"\nCAL. . cout<<"\t"<<CalOr[x][0]<<" "<<CalOr[x][1]<<" "<<CalOr[x][2]. de Sinodales void main() { clrscr().x++) { cout<<"\n"<<x<<" "<<CalEs[x][0]<<" "<<CalEs[x][1]<<" "<<CalEs[x][2]. int CalOr[N][S]. cout<<"\n MATERIAS SINODALES". cout<<" "<<CalEs[x][3]<<" "<<CalEs[x][4]<<" "<<PrEs[x].". //Promedio por alumno en la fase Oral PrGrl[x]=(PrEs[x]+PrOr[x])/2. } cout<<"\n RESULTADOS". for(y=0. } PrEs[x]=Sum/M. cout<<"CALIFICACIONES DE LA FASE ORAL. cout<<"\nNo.y<M.Programación C y C++ 65 /*OpcionVI.h> #define N 2 //No. } for (x=0. "<<x+1<<"\n". //Lee Calificaciones fase Oral Sum=Sum+CalOr[x][y]. int x. clrscr(). cout<<" "<<PrOr[x]<<"\t\t"<<PrGrl[x]. ALUMNO No.y++) { cout<<"SINODAL "<<y+1<<" : ". float PrEs[N]. for (x=0.y++) { cout<<"MATERIA "<<y+1<<" : ".cpp */ #include <conio.

66 Programación C y C++ 4. //Intercambio de elementos *(Num+y-1)=*(Num+y).x<N. Num++.y.Temp. //Asigna el numero Num++.h> #include <conio. //Finaliza el programa } cout<<"DA DE ALTA UNA SERIE DE "<<N <<" NUMEROS Y LOS ORDENA\n".y--) if(*(Num+y-1)>*(Num+y)) { Temp=*(Num+y-1). "<<x+1<<": ". comprobar la existencia de memoria al hacer la asignación dinámica. for (x=0. Num=new int [N].. //Apunta al primer elemento for (x=1. exit(0).cpp */ #include <stdlib.x. } for (x=0. int *Num. if (Num==0) //Verifica si no hay memoria dinámica { cout<<"\nNo existe memoria disponible". al finalizar el programa mostrar los números ordenados en forma ascendente utilizando el método de burbuja.x++) //Método de burbuja for(y=N-1. /*Ordenar.h> #include <iostream.x++) //Imprime el contenido del apuntador { cout<<"\n "<<*Num.Utilizando apuntadores y asignación dinámica de memoria construya un programa para dar de alta una serie de N números. } . cin>>*Num.h> #define N 5 //Numero de elementos void main() { clrscr().x<N. getch(). } delete(Num). *(Num+y)=Temp.x++) //Alta de la serie de números { cout<<"No. //Incrementa el apuntador } Num=Num-N.x<N.y>=x.

IApr.NRep=0.El Maestro de la materia de Programación III desea conocer el Índice de Aprobación y Reprobación de su grupo de N alumnos. getch(). cout<<"\nIndice de aprobacion "<<IApr<<" %". cout<<"\nIndice de Reprobacion "<<IRep<<" %". /*Indice. float NApr=0. el número de alumnos reprobados y el índice de reprobación. if (Cal[x]>=70) NApr++. int x.\n". de Aprobados "<<NApr. Cal[N]. PROPORCIONE LAS CALIFIC. } IApr=(NApr/N)*100..x++) { cout<<x+1<<": ". cout<<"\nNo. la calificación mínima que se considera como aprobatoria es de 70%.IRep. } . cout<<"\nDE "<<N<< " ALUMNOS. de Reprobados "<<NRep. else NRep++. cout<<"CALCULA EL INDICE DE APROBACION Y REPROBACION". IRep=(NRep/N)*100. cout<<"\nNo.h> #define N 5 //Número de alumnos void main() { clrscr(). Escribir un programa que lea las calificaciones del grupo de alumnos visualice el Número de alumnos aprobados. for (x=0. el índice de aprobación.Programación C y C++ 67 5.cpp */ #include <conio. cin>>Cal[x].h> #include <iostream.x<N.

Igual que el ejercicio 2 pero aplicando el método Shell 4. 5..AGREGAR MAS EJERCICIOS . Víctor.68 Programación C y C++ EJERCICIOS PROPUESTOS 1... Explique el proceso de ordenamiento.Considérese la siguiente secuencia de nombres proporcionados al programa del ejercicio resuelto 2: Ana...Tomando como base el programa del ejercicio resuelto 1. calcular además el Costo total . Raúl. Carlos. 2. Zenaido.Ordenar en forma descendente una lista de N Nombres aplicando el método de Inserción 3. El IVA total y el Precio de Venta Total de los N artículos.

Programación C y C++ 69 Capitulo 4 Funciones y Estructuras • • • • • Funciones Pase de parámetros Estructuras Arreglos de Estructuras Ejercicios .

Todo lo que se programa en C y C++ esta dentro de una función. estos incluyen a los parámetros. . y cuando finaliza. La Lista de parámetros es la lista de nombres de variables separados por comas con sus tipos asociados que reciben los valores de los argumentos cuando se llama a la función. Esto se debe a que todos los programas deben incluir la función main(). excepto si tienen el especificador static. Una función puede no tener parámetros en cuyo caso la lista de parámetros esta vacía. en este capitulo se va ha destacar la importancia de la programación modular. por lo que se crean cuando se llama a la función y perduran solamente durante la ejecución de la misma. el control es devuelto de nuevo al módulo que llamo. Aunque C++ esta orientada a objetos. y recibe como parámetro dos enteros. el control se pasa a la misma para su ejecución. las funciones siguen siendo parte de este estilo de programación ya que dentro de las clases se hayan un conjunto de funciones. Ejemplo: float Area_Triang(int Base. destruyéndose en el momento de finalizar. El valor puede ser cualquier tipo válido. incluso cuando no hay parámetros se requieren los paréntesis y la lista de parámetros puede estar sustituida por void. } La función Area_Tring retorna un valor real (observe la sentencia return). Las variables que se definan en el interior de la función son considerados como variables locales. el compilador asume que la función devuelve como resultado un entero. que es en si misma una función. para continuar con la ejecución del mismo a partir de la sentencia que efectuó la llamada. return(Area). las funciones que no devuelven ningún valor deben tener el tipo void. Sintaxis: Tipo_de_retorno Nombre_funcion (Lista de parámetros) { cuerpo de la función } Donde: Tipo_de_retorno especifica el tipo de valor que devuelve la sentencia return de la función. int Altura) { float Area.70 Programación C y C++ FUNCIONES Las funciones son la piedra angular en C y C++. cuando se llama a una función. este tema se tratará más adelante. Area=(Base*Altura)/2. Si no se especifica ningún tipo. Sin embargo. La ejecución de un programa comienza por la función main().

los cambios en los parámetros en la función no afectan a las variables que se usan en la llamada. Esto significa que los cambios hechos a los parámetros afectan a la variable usada en la llamada a la función. De esta forma . el número de argumentos debe ser igual al número de parámetros definidos en la función.Programación C y C++ • Llamada a una función La llamada a una función tiene la forma: [Variable=]Nombre_Funcion([Lista de argumentos]) 71 Donde: Variable. asignándosele a la variable A. Los valores resultantes son pasados a la función y asignados a sus correspondientes parámetros. cout<<x<<" "<<y. void main() { int x=10. La llamada a la función Area_Triang envía como argumentos los valores 10 y 15. La llamada puede prescindir del valor devuelto por la función.. //Llamada por referencia //Imprime 50 10 . dentro de la función se realiza el calculo y el resultado se retorna. int *B).15). Ejemplo: A=Area_Triang(10.cpp */ #include <conio. &y). Intercambio(&x. y se almacenan en las variables Base y Altura respectivamente que están definidos como parámetros en la implementación de la función.y=50.Especifica la variable donde va a ser almacenado el valor devuelto por la función.h> void Intercambio(int *A. La llamada por referencia copia la dirección del argumento en el parámetro.h> #include <iostream. Ejemplo: /*Referen.Es la lista de expresiones separados por comas.. Lista de argumentos. PASE DE PARÁMETROS Se pueden pasar argumentos a las funciones de dos formas: • Llamada por valor • Llamada por referencia El primer método copia el valor de un argumento en el parámetro de la función. Dentro de la función se usa la dirección para acceder al argumento usado en la llamada.

int *B) { int temp. sólo se pasa la dirección del arreglo. • Pase de arreglos como parámetros Cuando se usa un arreglo como argumento de una función.cpp Lee el salario por día de N trabajadores.72 } Programación C y C++ void Intercambio(int *A.h> #define N 5 //Definición de funciones void Leer(float SD[N]). Existen tres formas de declarar un parámetro que va a recibir un puntero a un arreglo: • Como un arreglo determinado • Como un arreglo indeterminado (sin tamaño) • Como un puntero Ejemplo: /*Ar_para. Desde la función main() se encuentran definidos las variables x. *B=temp. no una copia del arreglo entero. SalSem[N]. anteponiendo a cada variable el operador &. Cuando se llama a una función con un nombre de un arreglo. esto significa que la declaración del parámetro debe ser un tipo puntero compatible. //Variable global .h> #include <iostream. temp=*A. se pasa a la función un puntero al primer elemento del arreglo. *A=*B. float Monto=0. calcula el total a pagar por semana a cada trabajador y el monto total. al llamar a la función intercambio se pasan como argumentos sus direcciones.*/ #include <conio. void Visualizar(float *SD. y se encuentran intercambiados. Cuando se desee modificar el argumento se recomienda efectuar una llamada por referencia y si no se desea modificar el argumento entonces se hará una llamada por valor. al retorno de la función los valores de x. } La función Intercambio() recibe como parámetros dos punteros A y B e intercambia sus contenidos. void main() { float SalDia[N]. float *SS). float SS[]). void Calcular(float SD[]. y con los valores 10 y 50 respectivamente.

float SS[]) //Como arreglo Indet. 1 al 5 1 : 80 2 : 90 3 : 70 4 : 90 5 : 80 Trabajador S/Diario S/Semanal 1 80 560 2 90 630 3 70 490 4 90 630 5 80 560 Monto: 2870 El ejemplo Ar_param. cout<<" Monto: "<<Monto.SalSem).x<N. Calcular(SalDia. int x. getch(). } La salida del programa sería: Proporcione el Salario Diario del Trabajador No. } } void Calcular(float SD[].Programación C y C++ 73 Leer(SalDia).x++) { cout<<x+1<<" : ".SalSem). Visualizar(SalDia. Monto=Monto+SS[x]. cout<<"\nTrabajador S/Diario S/Semanal". En cada caso el compilador de C convierte la definición apropiadamente para recibir un puntero a entero. cin>>SD[x]. } void Leer(float SD[N]) //Arreglo como parámetro determinado { clrscr().cpp contiene tres funciones. Una explicación general del programa es el siguiente: . { int x. cout<<"Proporcione el Salario Diario del Trabajador No. for (x=0. for (x=0.float *SS) //Como apuntador { int x. que ilustran las diferentes formas de definir una arreglo como parámetro.x<N. for (x=0.x++) cout<<"\n\t"<<x+1<<"\t"<<SD[x]<<"\t"<<SS[x]. 1 al "<<N<<"\n". } } void Visualizar(float *SD.x++) { SS[x]=SD[x]*7.x<N.

Tipo variable3. La primera función que se llama es la función Leer(). sin embargo por el hecho de que las llamadas se hacen por referencia (Una dirección) es posible modificar el contenido de los argumentos dentro de la función. Cada elemento de una estructura recibe el nombre de Dato miembro. . . esto se permite porque cualquier puntero se puede indexar usando [] como si fuese un arreglo. al retornar de la función el arreglo SalDia. que índica que es el final de la sentencia. ESTRUCTURAS Una estructura es un conjunto de datos relacionados entre sí y referenciado bajo un único nombre. la más común es como un puntero.Es un identificador de la estructura que va a representar un nuevo tipo de datos definido por el programador.. estas variables son locales a la función principal por lo que no pueden ser vistas desde otra función. }. dentro de la función se le asigna por el usuario desde teclado valores a cada uno de sus elementos. . ahora ya tiene asignado valores. De las tres formas que se puede declarar un parámetro que va a recibir un puntero a un arreglo. cuando se crean los arreglos por defauld se inicializan con el valor de 0 para cada uno de sus elementos.74 Programación C y C++ En la función principal se definen los arreglos SalDia y SalSem de tipo entero y tamaño N (5). mientras que el arreglo SalSem aun no. Etiqueta. que utiliza los valores del arreglo SalDia para calcular el salario semanal y almacenarlos en el arreglo SalSem que más tarde serán usados para su visualización en pantalla. enviando como argumento el arreglo SalDia (la dirección de su primer elemento). en el interior se definen cada uno de los datos miembros (variables). Sintaxis para la definición de una estructura: struct etiqueta{ Tipo varible1. Ejemplo: Supóngase que se desea contar con información de los alumnos de una Institución: . ambos arreglos son enviados como argumento a la función Calcular(). al finalizar la estructura lleva . Se puede observar en cada implementación de las funciones que el nombre de los identificadores de los arreglos difieren del nombre que tienen desde donde se hacen las llamadas. Tipo variable2.

para hacerlo sería: Alumnos A. char Tel[15]. Hasta el momento solo se ha definido la estructura más no se ha declarado una variable de tipo estructura.Edad=20.A3. El ejemplo completo para asignar y visualizar los datos a una estructura Alumnos se muestra a continuación: /*Estruct. char Ciudad[40]. Por ejemplo. . Ejemplo: Alumnos A2. int Edad.h> #include <conio. char Nom[40].cpp*/ #include <string. (operador punto). }.h> #include <iostream. char Ciudad[40]. Sintaxis: Nombre_var_estructura.Programación C y C++ 75 struct Alumnos{ char N_Ctrl[9]. char Tel[15]. el siguiente código asigna la edad 20 al dato miembro Edad de la variable estructura A: A. La definición de la estructura representa un nuevo tipo de dato. Cuando se declara una variable de tipo estructura es cuando el compilador reserva espacio en memoria para almacenar la estructura.Dato_miembro.h> struct Alumnos{ char N_Ctrl[9]. la cantidad de memoria requerida será igual a la suma de la memoria requerida por cada uno de sus datos miembros. char Dir[40]. int Edad. en este caso se requeriría un total de 146 bytes (9+40+40+40+15+2). char Nom[40]. char Dir[40]. por lo que se pueden declarar a partir de ella el número de variables que se deseen. Los elementos individuales de la estructura se referencían utilizando el operador .An.

strcpy(A. Ejemplo: Alumnos Al[5]. /*Estruct2.cpp*/ #include <stdio.h> #include <iostream."Sanchez L¢pez Juan"). } ARREGLOS DE ESTRUCTURAS De la misma forma que se pueden crear arreglos con los tipos de datos básicos de C (int. cout<<"\n"<<A. Oax.Dir.N_Ctrl. float) tambien se pueden crear arreglos de estructura. El código anterior asigna la edad 19 a la estructura 3 de su dato miembro Edad (Recuerde que los índices de los arreglos inician con 0) Parar aclarar el uso de los arreglos de estructura he aquí un ejemplo que asigna datos a cada uno de los datos miembros de un arreglo de estructura. getch().Edad. cout<<"\n"<<A.Nom.Ciudad. //definición de la estructura . char.Ciudad. //Definición de una variable estructura //Asignación de datos strcpy(A. esto reserva 730 bytes (146*5) en memoria RAM para su almacenamiento. se debe definir primero la estructura y luego declarar una variable arreglo de dicho tipo.76 }.h> #define N 5 struct Alumnos{ char N_Ctrl[9].Edad=19. Para declarar un arreglo de estructuras.h> #include <conio.Edad=20. 37"). cout<<"\n"<<A. //Visualización cout<<"\Los datos del alumno son :".N_Ctrl. cout<<"\n"<<A. Se declara un arreglo de estructura de 5 elementos del tipo Alumnos."Av. se indexa el nombre de la estructura . A. Programación C y C++ void main() { clrscr()."). Ejemplo: Al[2]. 5 de Mayo No."Juchitan. cout<<"\n"<<A.Dir. strcpy(A.Nom. strcpy(A. Alumnos A."95190205"). Para acceder a una determinada estructura .

void main() { clrscr().Al[2].i+2).i<N. gotoxy(50. Existen los mismos dos métodos vistos anteriormente en el tema de pase de parámetros: • Llamada por valor • Llamada por referencia Cuando se pasa una estructura como argumento a una función por valor. • Pase de estructuras a funciones Los ejemplos que se han presentados sobre estructuras y arreglos de estructuras. cin>>Al[i]. lo cual significa que todos los cambios realizados en los contenidos de la estructura dentro de la función a la que se pasa no afectan a la estructura utilizada como argumento.Al[3] y Al[4]).cpp */ #include <string. for (i=0.h> struct Producto{ char Prod[40]. gets(Al[i]. Alumnos Al[N]. cuando se requiere usarlos en otras funciones se requiere de pasar la estructura como argumento a la función. float Pr_unid.h> #include <conio.Ciudad).Nom). gets(Al[i]. char Tel[15]. //Definición del arreglo de estructura int i. } } 77 Como N es igual a 5 el arreglo de estructura se crea de 5 elementos. gotoxy(18.Edad. se han definido como variables locales a la función main() y se han usado solamente dentro de esta función. gets(Al[i]. así se asignaran datos a los 5 elementos que contiene el arreglo de estructura (Al[0]. cout<<"NOMBRE No.i+2). int Edad.N_Ctrl). COTROL DIRECCION CUIDAD EDAD".i+2).h> #include <iostream. gets(Al[i].i+2). por cada ciclo que ejecuta la sentencia for se asignan valores a cada uno de los datos miembros de la estructura.i++) { gotoxy(1.i+2). gotoxy(62.Dir). gotoxy(31. Ejemplo: /*Estruct3. char Ciudad[40]. char Dir[40].Al[1]. se pasa una copia de la estructura integra.Programación C y C++ char Nom[40]. }. .

Llamada por referencia. . es decir primero se escribe el tipo de dato.h> #include <conio.78 int Cant. //Parámetro por valor void Visualizar(Producto Pr) { cout<<"\n"<<Pr.. Visualizar(P). no afectaría al argumento P . } En la función main() se crea la variable de estructura P del tipo Producto y se asignan valores a cada uno de sus datos miembros Prod. } getch().Pr_unid=1080. Programación C y C++ }.Prod. cout<<"\n"<<Pr. si dentro de la función se modificara un dato miembro. dentro la función la estructura debe definirse como un apuntador. esto significa que en la función Visualizar() se recibe una copia de la estructura asignándose a la variable Pr para su impresión en pantalla.Pr_unid.Prod.Cant. P.Cuando se desee modificar el contenido de la estructura que se usa como argumento en la llamada a una función se debe optar por una llamada por referencia. cout<<"\n"<<Pr. void Visualizar(Producto Pr). es la forma general de la definición de una variable. strcpy(P. En este caso se pasa la dirección de inicio de la estructura a la función anteponiendo a la variable el operador &.Cant=5. void main() { clrscr().cpp */ #include <string. Ejemplo: /*Estruct4. en este caso es Producto y posteriormente la variable (Pr).h> #include <iostream. P. el nombre de la variable como parámetro puede o no ser diferente del argumento. Producto P. Pr_unid y Cant posteriormente se llama a la función Visualizar() y se le pasa como argumento la estructura P. Observe la forma en que se define el parámetro de estructura en la función Visualizar().h> struct Producto{ char Prod[40]. es decir los valores asignados a cada uno de los datos miembro de P seguirían iguales al retorno de la función Visualizar(). aunque en ambos casos son diferentes."Tarjeta Madre Pentium III").

es mediante una llamada por referencia. }. Producto P. ahora se utiliza el operador -> . no abría necesidad del pase de parámetros a la función. Pr->Pr_unid=1080.Pr_unid. Visualizar(P).cpp con la diferencia de que la asignación de valores a los datos miembros de la estructura P se realiza a través de la función Leer() enviándosele como argumento la dirección de inicio de la estructura P. Altas(A). Leer(&P). al usar únicamente el nombre del arreglo sin índice. Observe la forma en que se define el parámetro de estructura en la función Leer(). } void Visualizar(Producto Pr) { cout<<"\n"<<Pr. //Arreglo de estructura //Llamada por referencia Se supone que la estructura Alumnos fue previamente definido así que A es un arreglo de estructura."Tarjeta Madre Pentium III"). int Cant. cout<<"\n"<<Pr. Ejemplo: Alumnos A[10]. getch(). se define como un apuntador. void Leer(Producto *Pr).Prod. la única forma de pasar la variable como argumento.cpp hace exactamente lo mismo que el ejemplo Estruct3. Cuando se trate de una arreglo de estructura. sin embargo esto trae la desventaja de degradar la portabilidad del programa o la independencia de la función así como producir posibles efectos secundarios. para acceder a un dato miembro de la estructura en lugar de utilizar el operador . void main() { clrscr(). Pr->Cant=5.Cant. cout<<"\n"<<Pr. } 79 //Definicón de la variable de estructura void Leer(Producto *Pr) //Parámetro por referencia { strcpy(Pr->Prod. void Visualizar(Producto Pr). } //Parámetro por valor El ejemplo Estruct4. es decir mediante una llamada por referencia. Obviamente que si una variable de estructura en lugar de que sea definido como variable local. en .Programación C y C++ float Pr_unid. se define como variable global.

Visualizar y Terminar. /*Alumnos. para manejar un arreglo de estructuras de N alumnos con los siguientes datos: Número de control. char Ciudad[40]. cout<<"\n3. dirección.h> #include <iostream. . void Altas(Alumnos A[N]). void Bajas(Alumnos A[N]). EJERCICIOS RESUELTOS 1. ciudad.-Visualizar".-Terminar". teléfono y edad. que no debe confundirse con una llamada por valor.-Altas". En la opción de altas validar si el registro esta vacío para proceder y si no indicarlo con un mensaje. cout<<"\n2. //Arreglo de estructuras Formatear(A). void Visualizar(Alumnos A[N]). Durante la visualización solamente se mostrarán los registros que ya fueron dados de alta.80 Programación C y C++ realidad se trata de la dirección de inicio del arreglo. char Dir[40].cpp */ #include <string. se puede modificar struct Alumnos{ //definición de estructura char N_Ctrl[9].h> #include <stdio.h> #define N 10 //10 Alumnos. en el proceso de bajas caso inverso. int Edad.Programa que muestre un menú de opciones en pantalla con las siguientes opciones: Altas. }. cout<<"\n1. Bajas. char Nom[40]. void main() { char op. la segunda línea por lo tanto es una llamada por referencia. cout<<"MANEJO DE UN ARREGLO DE ESTRUCTURA".-Bajas". cout<<"\n4. } while (op!='1'&&op!='2'&&op!='3'&&op!='4'). do{ clrscr(). en este caso se trata de un arreglo y en el último una estructura simple.h> #include <conio. char Tel[15]. Alumnos A[N]. nombre.. do{ op=getch(). //definición de funciones del usuario void Formatear(Alumnos A[N]).

de Control: ".Tel. gets(A[Reg-1].Edad=0. gets(A[Reg-1].Dir.Tel). gets(A[Reg-1]. cin>>Reg. break. cout<<"Edad: ". strcpy(A[x]. strcpy(A[x].Nom. cin>>A[Reg-1].Edad."\n"). valida el intervalo void Altas(Alumnos A[N]) { int Reg. strcpy(A[x].Dir). //formatea todos los registros desde 0 hasta N-1 void Formatear(Alumnos A[N]) { int x.Programación C y C++ 81 switch (op){ case '1': Altas(A).0 Para term. } while (Reg<0 || Reg>N). for(x=0.Ciudad).Ciudad. :".Nom)."\n"). } } } while (op!='4'). do{ do{ clrscr().Edad==0) { cout<<"\nNombre: ". getch(). cout<<"No.N_Ctrl. if(Reg!=0 ) if(A[Reg-1]. case '2': Bajas(A). strcpy(A[x]. //Llamada por referencia break. break. cout<<"No.x++) { strcpy(A[x]. gets(A[Reg-1]. . cout<<"Ciudad "."\n"). cout<<"Telefono: ". cout<<"Direci¢n ". entre 1 y "<<N<<".x<N."\n"). A[x]. } else { cout<<"\nRegistro Ocupado". gets(A[Reg-1]. de reg."\n"). case '3': Visualizar(A). } } //Da de alta el registro si esta vacío.N_Ctrl).

82 } } while(Reg!=0). gotoxy(59.y).N_Ctrl. y++. gotoxy(17. getch(). A[Reg-1].Edad=0."\n").Dir.Edad!=0) { strcpy(A[Reg-1].y).y). cout<<"No.cout<<A[x].Ciudad. getch(). } } while(Reg!=0). cout<<"\n Registro "<<Reg<<" dado de baja ".cout<<A[x]."\n").cout<<A[x].Tel.Nom."\n"). } //Visualiza la estructura en forma de tabla si ya fue dada de alta void Visualizar(Alumnos A[N]) { int x. do{ do{ clrscr().cout<<A[x].Edad.x++) if (A[x].Dir. if(Reg!=0 ) if(A[Reg-1].Ctrl Direcci¢n Ciudad Telefono Edad".x<N."\n").Tel.Edad!=0) { gotoxy(1. valida el intervalo void Bajas(Alumnos A[N]) { int Reg. } getch(). . gotoxy(44.y). strcpy(A[Reg-1].y=2. } while (Reg<0 || Reg>N).N_Ctrl.Ciudad. gotoxy(27.y). Nombre No. strcpy(A[Reg-1]. gotoxy(69. 0 Para terminar :".cout<<A[x]. de registro entre 1 y "<<N<<".cout<<x+1<<" "<<A[x]."\n"). } else { cout<<"\nRegistro Vac¡o". clrscr(). strcpy(A[Reg-1]. cin>>Reg. for (x=0. strcpy(A[Reg-1]. cout<<"\nNo.y). } Programación C y C++ //Da de baja el registro si esta ocupado. cout<<"PROCESO DE BAJAS".Nom.

Programación C y C++ } 83 .

cout<<"\n3.cpp */ #include <iostream. Saldo y Salir. op=getch(). cout<<"BIENBENIDO A LA OPCION DE DEPOSITO".Programa que simule un cajero automático de un banco. break..84 Programación C y C++ 2. cout<<"CAJERO AUTOMATICO". cout<<"\n4. do{ cout<<"\n\nOpcion:". cout<<"\n1. //Saldo inicial void main() { char op. switch(op){ case '1':Deposito(). Retiro. float Sal=2500. case '2':Retiro(). break. si esto ocurre se deberá mostrar el mensaje correspondiente. } while(Cant<=0). do{ cin>>Cant. } .Salir".h> void Deposito().Retiro". verificando que no se permita retirar una cantidad superior al saldo. cout<<"\n2.Saldo". El saldo inicial deberá ser igual a $2. case '3':Saldo(). cout<<"\n Cantidad: ". Sal=Sal+Cant... Después de realizar un deposito y un retiro se mostrará el saldo actualizado. break..Depósito". clrscr(). Saldo().h> #include <conio.500. void Retiro().. } } while (op!='4'). } while (op!='1'&&op!='2'&&op!='3'&&op!='4'). } void Deposito() //Proceso de Deposito {int Cant.00. Al iniciar el programa presentará una pantalla con las siguientes opciones: Deposito. do{ clrscr(). void Saldo(). /*Cajero.

int Edad. cin>>Cant. cout<<"\n Cantidad: ". especialidad y grado. getch(). cada especialidad puede tener un máximo de 13 grados ó semestres y desea llevar el control de alumnos para manejar los datos tales como nombre del alumno.h> #include <iostream. } 85 3. do{ clrscr(). cout<<"BIENBENIDO A LA OPCION DE RETIRO". }.h> #define N 5 //Población de alumnos #define G 13 //Grado ó semestres permitidos #define C 6 //Carreras ó Especialidad struct Est{ char Nom[40]. if (Sal!=0) Sal=Sal-Cant. void void void void //Variable global. Saldo(). if (Cant>Sal) { cout<<"\nRebasa su Saldo". Est E[N]. Grado().h> #include <stdio. cout<<"EL SALDO ES: "<<Sal. int Esp. } void Retiro() //Proceso de Retiro {int Cant.. /*Escolar. Escribir un programa que permita dar de alta una población de N alumnos y consultas por especialidad y grado. Especialidad(). edad.h> #include <conio. int Grado. Inicializa().Programación C y C++ void Saldo() //Visualiza el Saldo { clrscr().Arreglo de estructura Altas(). .Una institución de nivel superior cuenta con 6 carreras ó especialidades.cpp */ #include <string. } } while (Cant>Sal && Sal!=0). getch().

do{ clrscr(). switch(op){ case '1':Altas(). gets(E[reg]. } } while (op!='4').x<N.Esp=0. E[x]..Altas".'\0'). .. do{ cout<<"\n\nOpcion:". if (reg!=0) { reg--.Consulta por Grado". cout<<"\n Registro del 1 al "<<N<<" do{ cin>>reg. do{ clrscr(). case '2':Grado(). for (x=0. cout<<"\n3. case '3':Especialidad(). } while (reg>N || reg<0).Edad=0. E[x]. cout<<"Edad: ". break. cout<<"\n4. break. if (E[reg].Consulta por Especialidad". } } void Altas() //Proceso de Alta { int reg. op=getch().. cout<<"\n2.Nom). cout<<"PROCESO DE ALTAS".x++) { strcpy(E[x].Nom. } while (op!='1'&&op!='2'&&op!='3'&&op!='4'). //Pasa la direcci¢n de inicio break.Salir". 0 para terminar: "..Edad==0) { cout<<"\nNombre: ". Inicializa(). } void Inicializa() //Inicializa la estructura { int x. cout<<"\n1.Grado=0. E[x].86 Programación C y C++ void main() { char op. cout<<"CONTROL ESCOLAR".

clrscr(). getch().Edad<<"\t\t"<< E[x]. } getch(). } void Grado() //Consulta por Grado { int gr.Edad<<"\t\t"<< E[x]. cout<<"\n\nNombre Edad Especialidad". for (x=0. getch(). 87 . cout<<"\nLOS ALUMNOS DE LA ESPECIALIDAD "<<es<<" SON:". cout<<"\nNombre Edad Grado". do{ cin>>es. } while (es>C || es<0). clrscr(). for (x=0.x++) if (E[x].Edad.Esp==es) cout<<"\n"<<E[x]. cout<<"\nLOS ALUMNOS DEL "<<gr<<" GRADO SON:".x<N. } while (gr>G || gr<0).Programación C y C++ cin>>E[reg].x.Esp.Grado. cout<<"Grado:(1 a "<<G<<" ) ".x++) if (E[x]. } } while (reg!=0).Grado. } reg++. cout<<"Especialidad:(1 a "<<C<<" ) ". cin>>E[reg].Nom<<"\t\t"<< E[x]. } else { cout<<"\nEl registro tiene datos". } void Especialidad() //Consulta por Especialidad { int es. cout<<"CONSULTA POR ESPECIALIDAD".x.Nom<<"\t\t"<< E[x]. cout<<"\n GRADO DEL 1 al "<<G<<" : ".Grado==gr) cout<<"\n"<<E[x]. cin>>E[reg].Esp. cout<<"\n\n ESPECIALIDAD DEL 1 al "<<C<<" : ".x<N. do{ cin>>gr. cout<<"CONSULTA POR GRADO".

Rescribir el programa Alumnos. Precio unitario y Existencia.En una tienda de videos se desea llevar el control de las películas para tener a la mano los siguientes datos: Titulo.Una tienda de ferretería desea contar con información de los artículos que vende tales como: Nombre.00 y ante un retiro no sea superior a $2. deberá generar una ficha de compra que contenga los Nombres y cantidades (PP + 6) de artículos que desea adquirir..88 Programación C y C++ EJERCICIOS PROPUESTOS. ... Si la existencia esta por debajo del punto de pedido (PP = 3). Escribir un programa que una vez dado de alta cada una de las N películas. Circulo. 6. con un ligero cambio: En lugar de que la variable de tipo estructura sea una variable local a la función main() que sea una variable global. mes y año de compra.Complementar el ejercicio resuelto Escolar. usar un menú de opciones. los muestre ordenados por su fecha de compra.Programa para calcular el área de las siguientes figuras geométricas: Rectángulo.cpp . 1.00 en cada proceso..cpp para que ante un deposito la cantidad no rebase los $3. 3. Por cada figura se contará con una función que retornará el área calculada.000.Complementar el ejercicio resuelto Cajero.cpp para que además de las opciones que maneja contenga la opción de Bajas..000. 4. 5.. Trapecio. duración. 2.

la mayoría de lenguajes de programación actuales utiliza esta técnica. En esta unidad y el siguiente se abordan los conceptos básicos para poder utilizarlo. de aquí la importancia de conocerlo.Programación C y C++ 89 Capitulo 5 Programación Orientada a Objetos • • • • • • • • • Que es la POO Definición de una clase Tipos de Accesos a una clase Tipos de Usuarios Relación entre Usuarios y Tipos de Accesos Clases Amigas Datos Estáticos Constructores y Destructores Ejercicios La programación Orientada a Objetos a revolucionado la técnica del análisis y diseño de programas. .

mientras que en la POO.90 Programación C y C++ QUE ES LA POO La Programación Orientada a Objetos es una técnica o estilo de programación que utiliza objetos como bloque esencial de construcción. Las tres funciones serían el comportamiento que pudiera tener ese objeto. A los datos se les conoce como datos miembros y a las funciones como funciones miembros ó métodos . Un objeto tiene tres propiedades que son: Estado. finalmente el objeto Persona es muy amplio por que podríamos hablar de: Amelia. la identidad es lo que hace un objeto diferente uno de otro. que contiene datos y funciones. Ranulfo. • Objeto Es cualquier entidad que se pueda imaginar. Ejemplo: Objeto Datos Funciones Persona Nombre Comer() Ciudad Trabajar() Edad Dormir() Peso Si los datos miembros tienen asignados valores tales como: Nombre = ”Juvenal”. donde cada componente se considera un objeto. Oax. un programa se divide en componentes que contienen funciones y datos. es decir la serie de operaciones que se pueden realizar con él. Comportamiento e Identidad. Edad = 35 y Peso = 50 representarían en su conjunto el estado del objeto. conocida como clase (class) en el lenguaje C. En el lenguaje C la identidad básicamente estaría definida por un bloque de memoria. Cada una de esta personal son distintas unas de otra y por tanto representarían la identidad. Daniel. etc. el comportamiento esta definido por el conjunto de funciones miembro que tenga el objeto. los programas se dividen en funciones y datos. DEFINICIÓN DE UNA CLASE Una clase es un estructura de datos definido por el programador que además de contar con datos miembros. Ciudad = ”Juchitan.”. es por ello que se dice una clase es la evolución de una estructura. Sintaxis: . en cada bloque de memoria se almacenaría un objeto distinto. En la programación convencional. contiene también funciones miembros. Los datos y las funciones se encapsulan en una única entidad. El estado es el valor que guardan los datos miembros en un instante dado.

. y en este caso si dentro de la clase no se especifica ninguno por default es del tipo privado. y funciones miembros Asignar() y Calcular(). void Calcular(). (operador punto) al igual que una estructura si el objeto es estático y si es un puntero entonces se usa el operador -> (Operador flecha).... }. Para entender lo anterior primero analicemos los diferentes tipos de Accesos de una clase . } Ejemplo: class Empleado{ char Nom[40].Programación C y C++ Class Nombre{ Dato_miembro1. función_miembro2(). float Salario. Ejemplo: Empleado E. //Error } Sin embargo dentro de una clase cada uno de sus miembros tienen un control de acceso. Dato_miembro2.. E. esto es solamente la definición de la clase. Un objeto es por lo tanto una variable de un clase en particular.float S). void Asignar(char *N. en el tema de estructuras se observaron varios ejemplos similares. Podría pensarse que para asignar el valor de 1500 al dato miembro Salario se podría realizar de la siguiente manera: void main() { Empleado E. Para acceder a un dato miembro de la clase o a una función miembro de la clase se usa el operador . que impide que se pueda manipular desde cualquier otra parte que no sea la clase misma. 91 El ejemplo muestra una clase llamada Empleado con los datos miembros Nom y Salario. cuando se define una variable de esa clase es cuando se crea una instancia de la clase o un objeto de la clase. . //Definición de un Objeto de la clase Empleado. //Definición de un Objeto de la clase Empleado. función_miembro_1().Salario=1500. Observe la sintaxis que es exactamente igual que la sintaxis para la definición de una variable.

.Privado private 2.Publico public Tabla 5. que puede ser: • La propia Clase • Clases derivadas • Usuarios genéricos Toda función que se encuentre definido dentro de una clase se le conoce como usuarios de la propia clase. * Private * * Protected * * * Public Tabla 5. se puede establecer la relación entre los tipos de usuarios y los tipos de acceso. RELACIÓN ENTRE USUARIOS Y TIPOS DE ACCESOS Una vez que se conocen los diferentes tipos de usuarios y los tipos de acceso. y las funciones que se encuentren en una clase derivada (Se trata en el tema de Herencia) se les conoce como usuarios de la clase derivada.Protegido protected 3. los usuarios de clases derivadas solamente tendrán privilegios sobre los datos y funciones miembros que tengan el acceso del tipo protected y . tal es el caso de la función main() o cualquier otra que se utilice en el programa como complemento del mismo.. finalmente una función que no pertenezca ni a la propia clase ni a una clase derivada se le conoce como usuario genérico..92 Programación C y C++ TIPOS DE ACCCESOS A UNA CLASE Existen tres niveles de privilegio de acceso que se asocian con una palabra reserva que son: Tipo de Acceso Palabra reservada 1.Relación entre usuarios y tipos de accesos La tabla se puede interpretar de la siguiente forma. Los usuarios que son considerados como la propia clase tendrán privilegios sobre todos los datos y funciones miembros de la clase.. como se muestra en la siguiente tabla. independientemente del tipo de acceso. 2. 1 Tipos de Acceso de una clase TIPOS DE USUARIOS El código de un programa puede hallarse en diferentes puntos y según el lugar donde se encuentre se le conoce como una clase de usuario. Tipo de Acceso Tipos de Usuarios La propia Clase Clases derivadas Usuarios gener.

La implementación dentro de la definición de la clase se realiza inmediatamente después de definir la función. Una función miembro de la clase se puede implementar de dos formas: • Implementación dentro de la definición de la clase • Implementación independiente.Asignar("Juan Pérez". Ahora se puede entender por que el objeto que se define en la función main() no puede directamente acceder a un dato miembro de la clase si este dato tiene el tipo de acceso private. void Calcular(). Tener privilegios sobre un dato o función miembro. se detecta un error pero ahora en tiempo de enlace porque ninguna de las funciones se encuentran implementados. Para poder tener el privilegio se requiere definir un tipo de acceso public. float Salario. E. significa poder usarlos.120). sin embargo dentro de la función principal después de crear el objeto y llamar a la función miembro Asignar() mediante la sintaxis conocida pasando los dos argumentos necesarios. En la practica por lo regular se acostumbra definir a los datos miembros de la clase con el tipo de acceso private y a las funciones miembros como public y la forma de acceder a los datos como usuario genérico se hace a través de las funciones miembros. public: void Asignar(char *N. } En la definición de la clase Empleado al principio no se define ningún tipo de acceso.cpp */ class Empleado{ char Nom[40]. esto significa que los datos Nom y Salario tienen un tipo de acceso private y por lo tanto solo se podrán acceder desde la propia clase.Programación C y C++ 93 public. Ejemplo: /*Clase. mientas que un implementación independiente se realiza fuera de la definición de la clase siguiendo la siguiente regla de sintaxis: . Las funciones Asignar() y Calcular() tienen el tipo de acceso public. }. finalmente los usuarios genéricos tendrán privilegio sobre los datos y funciones miembros que tengan el tipo de acceso public. incluyendo la función main(). es decir se pueden acceder desde cualquier parte del programa. //falta implementación de funciones miembros void main() { Empleado E.float S).

h> class Empleado{ char Nom[40].N). E. mediante un puntero a carácter N y un dato real S ambos son asignados a los datos miembros Nom y Salario respectivamente.cpp se implementa dentro de la clase Empleado la función Asignar() que recibe como parámetro el nombre y el salario de un empleado. } La salida del programa es: El salario Semanal de: Juan Pérez :840 En general se recomienda una implementación dentro de la clase cuando el código de la función es pequeño (de 1 a 4 líneas de código). E. este calcula el salario semanal a partir del salario diario asignado previamente al dato miembro .Asignar("Juan Pérez". } void main() { clrscr().94 Programación C y C++ Tipo_de_retorno Nombre_Clase::Nombre_Funcion(Lista_de_parámetros) { .} void Calcular(). /*Clase2.120). //Implementación independiente void Empleado::Calcular() { float S.Calcular().cpp */ #include <string..h> #include <conio. cout<<"El salario Semanal de: "<<Nom<<" :"<<S. y la implementación independiente cuando el código asociado a la función es más grande. float Salario. }. Por otro lado la función Calcular() se implementa de manera independiente .h> #include <iostream. y la función Calcular() mediante una implementación independiente. Observe como los datos miembros que tienen acceso privado pueden accederse desde una función que se encuentra en la misma clase.. Empleado E. S=Salario*7.float S) {strcpy(Nom. En el programa clase2.Salario=S.//Código } El siguiente ejemplo muestra la implementación de la función Asignar() dentro de la clase. public: //implementación dentro de la clase void Asignar(char *N.

} Ejemplo: . E->Asignar("Juan Pérez". Empleado *E. así en la función main() primero se llama a la función Asignar() para que los datos miembros se inicialicen y posteriormente a la función Calcular() que calcula y visualiza el resultado. Sintaxis: Classs Nombre_clase{ . • Funciones amigas Una función amiga es una función no miembro de una clase que puede tener acceso a los datos y funciones miembros privadas de una clase.. } CLASES AMIGAS Una clase puede conceder privilegios de acceso a sus zonas privadas a otra función o clase. getch()... . Tal acceso se debe indicar explícitamente declarando la otra clase o función miembro del tipo amiga (friend). si el objeto es estático y el operador -> si es dinámico. Recuerde que para acceder o llamar a una función miembro de una clase se usa el operador . El siguiente fragmento de código muestra el mismo programa solamente que ahora en la función mian() se define el objeto como una variable de tipo puntero (dinámico). Las variables locales de una función miembro de una clase no son considerados como datos miembros de la clase.120).. y tienen acceso no restringido a las zonas privadas y publicas de los objetos.cpp usa el operador . Las amigas se tratan como si fueran miembros de la clase. Las funciones de la clase se pueden llamar desde cualquier otra parte en el orden que el programador decida o convenga.Programación C y C++ 95 Salario guardando el resultado en una variable local S que se utiliza para la visualización en pantalla. el programa Clase2. Las funciones amigas se declaran anteponiendo la palabra reservada friend a la definición de la función. /*Clase3. friend tipo_retorno Nombre(Lista de parámetros). E->Calcular(). para llamar a una función miembro por que el objeto se define como una variable estática.cpp */ void main() { clrscr().

cout<<P. public: int Verz(){return z.int a)...cpp */ #include <conio. Prueba P. } . Las razones fundamentales para utilizar funciones amigas es que algunas funciones necesitan acceso privilegiado a más de una clase. } void main() { clrscr().h> #include <iostream.96 Programación C y C++ /*AmigaF. friend class nombre_clase. . int a) { Obj->z=a.} friend void f1(Prueba *Obj. }.. Se puede apreciar en la implementación de la función f1() que no obedece a la regla de sintaxis para la implementación independiente de una función miembro de la clase. entonces la segunda clase debe definirse como amiga de la primera. Este es solo un mecanismo para conceder con todos los derechos sobre los datos y funciones miembros privados y públicos de la clase. Para poder acceder a los datos miembros privados de una clase en una función amiga se requiere pasar como argumento un objeto de asa clase para que a través de él se pueda acceder al dato miembro privado.h> class Prueba{ int z.Verz(). por ello la función f1() tiene como parámetros un puntero a un objeto de la clase Prueba y un dato de tipo entero.20). } //Definición del objeto //Llamada a la función amiga Como la función f1() se declara como amiga de la clase Prueba se puede acceder al miembro privado z.. precisamente porque una función amiga no es una función miembro de la clase. Sintaxis: Classs Nombre_clase{ . //Implementación de función amiga void f1(Prueba *Obj. f1(&P. getch(). Si todas las funciones miembro de una clase son funciones amigas de una segunda clase.

d2.asignav(255). d2. Ejemplo: /*Estatic.verc(). //Creación de dos objetos d1. se observa que la salida del programa muestra el mismo . //Dato miembro estático int v.asignav(500).cpp */ #include <conio.asignac(20). public: void asignac(int c){Cont=c.verv()<<"\t"<<d2.verv(). Ejemplo: //Pendiente DATOS ESTÁTICOS Un dato miembro estático significa que existe solo una instancia de ese miembro y es compartido por todos los objetos de una clase . Datos d1.asignac(10). cout<<"\n"<<d1. por ello se debe definir fuera de la clase. int Datos::Cont. //Definición del dato miembro estático void main() { clrscr().verc()<<"\t"<<d2. Para definir un dato miembro estático se le antepone a la definición de la variable la palabra reservada static. al igual que una variable global. existe incluso si se define ningún objeto de esa clase.} }. cout<<d1. Una clase amiga debe ser declarada antes de que se pueda ser designada como amiga. } La salida es: 20 20 255 500 En la función principal se crean dos objetos y cada objeto llama a cada una de las funciones miembros de la clase para asignar valores a los datos miembros Cont y v sin embargo.} void asignav(int x){v=x.Programación C y C++ 97 En este caso todas las funciones de la clase amiga pueden acceder a las partes privadas de la otra clase.} int verc(){return Cont.} int verv(){return v.h> class Datos{ static int Cont.d2. A un dato miembro estático se le asigna una zona fija de almacenamiento en tiempo de compilación. d1.h> #include <iostream.

Ejemplo: /*Const. //Primer Constructor //Segundo constructor . Producto(char *N. cuando se crean a través de funciones constructores y un mecanismo correspondiente para destruir objetos cuando ya no se necesitan dentro de su ámbito a través de una función destructor. public: Producto().int P). C++ ofrece un mecanismo para inicializar objetos. Las clases pueden también declarar solamente un destructor que se llama para realizar la limpieza cuando un objeto sale de ámbito.98 Programación C y C++ valor para el dato miembro estático. Los constructores y destructores siguen reglas muy estrictas de sintaxis.int C. Las clases pueden declarar uno o más constructores para inicializar automáticamente los objetos de las clases. pero dos funciones especiales se pueden declarar: el constructor y el destructor.h> #include <conio. CONSTRUCTORES Y DESTRUCTORES Las clases pueden tener cualquier número de funciones miembros. Los constructores y destructores son funciones miembros especiales que contienen la mayoría de las clases. float Precio. esto significa que no son variables distintos para cada objeto que se cree a partir de la clase sino que es el mismo. mientras que en el caso del dato miembro v los valores son diferentes. void Ver().cpp */ #include <string. int Cantidad. El constructor por defecto no tiene parámetros y simplemente asigna ceros a los datos miembros de la clase. }. Se caracteriza por: • Tener el mismo nombre de la clase que inicializa • No retornar ningún valor • Puede admitir parámetros como cualquier otra función • Pueden existir más de un constructor.h> #include <iostream. el constructor genera uno por defecto. • Constructores Un constructor es una función que permite inicializar los datos miembros cuando se crean el objeto.h> class Producto{ char *Nom. e incluso no existir Si no se define ningún constructor de una clase.

Programación C y C++
//Implementación de funciones miembros Producto::Producto() { Nom=new char[50]; strcpy(Nom,"Ninguno"); Cantidad=0; Precio=0; } Producto::Producto(char *N,int C,int P) {int L; L=strlen(N); Nom=new char[L]; strcpy(Nom,N); Cantidad=C; Precio=P; } void Producto::Ver() { cout<<"\n"<<Nom; cout<<"\n"<<Cantidad; cout<<"\n"<<Precio; } void main() { clrscr(); Producto P,Pro("Disco Duro 20 GBytes",4,1600); Pro.Ver(); P.Ver(); getch(); } La salida del programa es: Disco Duro 20 Gbytes 4 1600 Ninguno 0 0

99

//2 objetos

El programa Const.cpp consta de una clase llamada Producto con 2 constructores, el primer constructor no tiene ningún parámetro mientras que el segundo constructor cuenta con tres parámetros, ambos constructores e inclusive la función Ver() se encuentran implementados de manera independiente, siguiendo la regla de sintaxis ya conocida, observe que efectivamente los constructores llevan el mismo nombre que la clase, que no retornan ningún valor, que pueden tener parámetros y que existe más de uno. Cuando se define un objeto de la clase Producto, según el número y tipo de argumentos que contenga, será la función constructora que se llamará, así en la función main() al definir primeramente el objeto P sin ningún argumento el compilador llama a la primera función constructora que

100

Programación C y C++

inicializa los datos miembros con los valores “Ninguno”, 0,0 para Nom, Cantidad y Precio respectivamente. El segundo objeto llamado Pro con tres argumentos llama a la segunda función constructora. En ambos constructores se asigna memoria dinámica al dato miembro Nom y no se observa en ningún lugar del código que se libere, de no hacerlo cada vez que el programa se ejecute desperdiciara este espacio de memoria, el lugar apropiado para liberar esta memoria es en una función destructor, tema que se trata a continuación. • Destructores

Un destructor es una función miembro con igual nombre que la clase, pero precedido por una carácter (∼). Un destructor realiza la función opuesta de un constructor, limpiando el almacenamiento asignado a los objetos cuando se crean. Las funciones destructores tienen las siguientes características: • Tiene el mismo nombre que la clase, precedido por una tilde (∼) • No retorna ningún valor • No tiene parámetros • Una clase solamente puede tener como máximo un destructor. • Se llama automáticamente por el compilador cuando el objeto sale de ámbito. Ejemplo:
/*Const2.cpp */ class Producto{ char *Nom; int Cantidad; float Precio; public: Producto(); //Primer Constructor Producto(char *N,int C,int P); //Segundo constructor void Ver(); ~Producto(){delete (Nom);} //Destructor };

Este fragmento de código es una pequeña modificación a la clase Producto del programa Const2.cpp, se incluye un destructor implementado dentro de la misma función. El programa puede funcionar con el resto del código sin ningún problema por que el destructor no se debe llamar en ninguna parte del programa, más bien el compilador lo llama en forma automática cuando los objetos P y Pro salen de ámbito, es decir cuando finaliza la función main()

Programación C y C++ EJERCICIOS RESUELTOS

101

1.- Escribir un programa que cuente el número de objetos que se crean a partir de una clase, usando un dato miembro estático y un constructor.
/*Estatic2.cpp*/ #include <conio.h> #include <iostream.h> class Modelo{ static int Cont; //Dato miembro estático public: Modelo(){Cont++;} //Constructor int VerC(){return Cont;} }; int Modelo::Cont=0; void main() { clrscr(); Modelo Ob1,Ob2,Ob3; cout<<Ob1.VerC(); //Definición e inicialización

//Visualiza 3

Modelo Ob4,Ob5; cout<<"\t"<<Ob1.VerC(); //Visualiza 5 }

2.- Programa para dibujar rectángulos en modo texto.
/*Rectang.cpp */ #include <conio.h> #include <iostream.h> class Rect{ int x1,y1,x2,y2; public: Rect(){x1=35;y1=10;x2=45;y2=14;} //Constructor void Dibujar(); void Asignar(int x,int y,int j,int k){x1=x;y1=y;x2=j; y2=k;} }; //Implementación independiente void Rect::Dibujar() { int x,y; for (x=x1;x<x2;x++) { gotoxy(x,y1);cout<<"Ä"; gotoxy(x,y2);cout<<"Ä"; } for (y=y1+1;y<y2;y++) { gotoxy(x1,y);cout<<"³"; gotoxy(x2,y);cout<<"³"; }

}.Asignar(30. Rect R.50.y2).y1). } void main() { clrscr(). void Retiro().Dibujar(). } while(Cant<=0).} void Deposito(). cout<<"EL SALDO ES: "<<Sal. } 3.8. do{ cin>>Cant.h> #include <conio. clrscr().cout<<"Ú". Saldo(). void Saldo().Dibujar(). /*Cajero2. cout<<"BIENBENIDO A LA OPCION DE DEPOSITO".cout<<"¿". } void Cajero::Retiro() .cout<<"Ù". //Constructor //Implementación de funciones miembros void Cajero::Deposito() {int Cant.cout<<"À".y2).cpp presentado en el capitulo anterior pero ahora utilizando las técnicas de la programación Orientada a objetos. gotoxy(x2.h> class Cajero{ float Sal. //Se crea un objeto R. R. cout<<"\n Cantidad: ". getch().102 Programación C y C++ gotoxy(x1.16).cpp */ #include <iostream. //Llamada a una función miembro } void Cajero::Saldo() { clrscr()..Rescribir el ejercicio resuelto Cajero. Sal=Sal+Cant. public: Cajero(){Sal=2500. gotoxy(x2. //se dibuja con valores por defecto R. gotoxy(x1.y1). getch().

cout<<"BIENBENIDO A LA OPCION DE RETIRO". } } while (op!='4'). do{ cout<<"\n\nOpcion:". } void main() { char op. cin>>Cant. op=getch()..Retiro().. switch(op){ case '1':C. cout<<"\n1. case '3':C.Programación C y C++ {int Cant. if (Sal!=0) Sal=Sal-Cant.Deposito(). if (Cant>Sal) { cout<<"\nRebasa su Saldo". getch(). break. cout<<"\n Cantidad: ". break.. cout<<"\n4. break. Saldo(). cout<<"\n3. case '2':C.Saldo".Saldo(). } } while (Cant>Sal && Sal!=0). //Se crea el objeto do{ clrscr().Salir". cout<<"\n2. } 103 . cout<<"CAJERO AUTOMATICO". do{ clrscr().Retiro". Cajero C.Depósito".. } while (op!='1'&&op!='2'&&op!='3'&&op!='4').

Escribir un programa que maneje una clase Hora con datos miembros tales como horas. int Seg. } //Función principal void main() { clrscr(). H. void Ver(). //Creación de un objeto H. } void Hora::Asigna() { cout<<"\nHora: ".Ver().int S).Min=0. } void Hora::Ver() { cout<<"\nLa hora es: "<<Hra<<":"<<Min<<":"<<Seg. Seg=S. getch().Asigna(). int Min. deberá contar con dos constructores.h> #include <conio.104 Programación C y C++ 4.} //Primer Constructor Hora(int H. } . //Segundo constructor void Asigna(). Hora H(9.cpp*/ #include <iostream..int S) { Hra=H.int M.14. }. Min=M.Seg=0. cout<<"Segundos: ". /*Hora.10).h> class Hora{ int Hra.int M. cout<<"Minutos: ". cin>>Min. minutos y segundos y funciones para la asignación visualización de los datos. H. public: Hora(){Hra=0. cin>>Hra. //Implementación de funciones miembros Hora::Hora(int H. cin>>Seg.Ver().

AngPolar(). cin>>x.h> #include <conio.} void Asignar().temp. float MagPolar(). cout<<"Coordenada en el eje Y: ".MagPolar()<<" Angulo: "<<C.Programa que permita convertir números en su forma rectangular a polar. cout<<"Magnitud:"<<C. Ang=asin(x/MagPolar())*180/M_PI. } float Complejo::AngPolar() { float Ang.2)). } float Complejo::MagPolar() { float Mag. } .Programación C y C++ 105 5. getch().Asignar(). //Implementación independiente de funciones miembros void Complejo::Asignar() { cout<<"\ncoordenada en el eje X: ". }.y.y=y1. //por hallarse en radianes } //Función principal void main() { clrscr(). //Por Pitagoras return(Mag). cout<<"Magnitud:"<<C. //Conversión a grados return(Ang). Crear una función que devuelva la magnitud y otra el ángulo en grados /*Complejo.int y1){x=x1.2)+pow(y. C.MagPolar()<<" Angulo: "<<C.h> class Complejo{ int x.cpp */ #include <math. public: Complejo(int x1.5).h> #include <iostream.AngPolar().. Complejo C(5. Mag= sqrt (pow(x. float AngPolar(). cin>>y.

.Rescribir el ejercicio resuelto Escolar.cpp para que además de convertir números en su forma rectangular a polar haga también conversión de polar a rectangular..cpp presentado en el capitulo anterior pero ahora utilizando las técnicas de la programación Orientada a objetos. repetir este proceso cíclicamente hasta que se pulse la tecla <Esc>. hasta terminar con el último que llene totalmente la pantalla.cpp.106 Programación C y C++ EJERCICIOS PROPUESTOS 1. 4..cpp) realice las modificaciones necesarias para dibujar una secuencia de 10 rectángulos en la pantalla iniciando por uno pequeño. en cada caso que valores toman los datos miembros. 3..Explique que constructor utiliza el objeto creado en el ejercicio resuelto Hora.A partir del ejercicio resuelto 2 (Rectang.cpp y Alumnos.. 2.Complementar el ejercicio resuelto Complejo. y cual utilizaría si se crea el siguiente objeto: Hora H2.

Programación C y C++

107

Capitulo 6

Herencia y Polimorfismo
Clases Derivadas Herencia Simple y Múltiples Problema y solución de la Herencia Múltiples Constructores y Destructores en clases Derivadas Polimorfismo Sobrecarga de funciones Funciones virtuales Clases Abstractas • Ejercicios
La herencia y el polimorfismo son dos características de la programación Orientada a objetos. La herencia se aplica para extender y reutilizar el código existente por medio de la creación de clases a partir de clases ya existentes, conocidos como clases derivadas. El polimorfismo permite que los objetos se comporten de diferentes formas cuando aparentemente se llaman a las mismas funciones.

108

Programación C y C++

CLASES DERIVADAS Se conoce como clase derivada a aquella clase que se crea a partir de otra u otras clases ya existentes. La clase derivada hereda las estructuras de datos y funciones de la clase original. Además, se puede añadir nuevos miembros a las clases derivadas y los miembros heredados pueden ser modificados. Una clase utilizada para derivar nuevas clases se le denomina clase base. Una clase derivada puede ser utilizada como una clase base para derivar más clases. Por lo consiguiente se puede construir jerarquías de clases ó árboles de herencia en la que cada clase sirve como base de una nueva clase. En la siguiente figura se presenta un diagrama de un árbol de herencia.
Punto Circulo Rectang Clase base Clases Derivadas

R_Relle

Figura 6. 1.- Árbol de herencia Esta figura se basa en la idea de la herencia, donde cada uno de los círculos o elipses representan una clase. Índica que las clases Circulo y Rectang son clases derivadas de la clase base Punto y que a su vez la clase R_Relle es una clase derivada de la clase base Rectang. Los programadores de POO pueden crear bibliotecas de clases útiles que serán el núcleo de muchos programas, como en el caso de los lenguajes visuales, que ya traen una serie de librerías para el manejo de ventanas, menús, cajas de diálogos, gráficos, bases de datos, etc. El usuario puede utilizar el contenido de esas bibliotecas de clases para crear nuevas clases o su aplicación, minimizando de esta forma el tiempo de desarrollo. HERENCIA SIMPLE Y MÚLTIPLES Dependiendo de cuantas clases bases tenga una clase derivada se pueden distinguir en el lenguaje C++ como: Herencia simple ó herencia múltiple. Herencia Simple Es aquella en la que cada clase derivada hereda de una única clase base. Herencia Múltiple Es aquella en la cual una clase derivada tiene más de una clase base

Programación C y C++

109

En la siguiente figura se muestra un árbol de herencia donde se presentan los dos tipos de herencia.
A B

Herencia Simple C D E F

G

H

Herencia Múltiple

Figura 6. 2.- Herencia simple y Múltiple La declaración de una clase derivada tiene la siguiente regla de sintaxis: class Nombre_Derivada : <Tipo de acceso> clase base{ ... } El operador : permite derivar de una clase base. El tipo de acceso puede ser cualquiera de los tres conocidos public, private o protected. Ejemplo: class Punto{ private: int x,y; public: ... };

//Clase Base

class Rectang: public Punto{ //Clase derivada int x2,y2; public: Dibujar(); ... }; La clase Rectang es una clase derivada de la clase base Punto, esto significa que los datos y funciones miembros que existen en la clase base pertenecen también a la clase derivada además de los propios, así la clase Rectang contiene los atributos heredados x, y, además de x2, y2 que son los propios.

} }. Los miembros private de la clase base son privados a la clase derivada. es por ello que en la mayoría de los casos se opta por utilizar al crear una clase derivada este tipo de acceso.110 Programación C y C++ • Tipo de acceso a la clase base Cuando una clase hereda de otra. 1. la clase derivada hereda los datos y funciones públicos y protegidos de la clase base.20).h> #include <iostream. solo tiene que especificar los datos y funciones adicionales a la clase derivada. Es decir se hereda desde la clase derivada. La clase A solamente tiene el atributo a1 con tipo de acceso publico.Asignar(10..} void Ver(){cout<<a1<<" "<<b1. }. } //Visualiza 10 20 En este ejemplo la clase B se deriva de la clase A con acceso publico.int b){a1=a.Tipos de Acceso durante la derivación Al especificar el tipo de acceso public sobre una clase base significa que los miembros heredados pasan a la clase derivada con el mismo tipo de acceso que fueron definidos en la clase base.Ver(). public: void Asignar(int a. //Clase Base //Cambiar a private y compilar class B:public A{ //Clase derivada int b1.b1=b. será la forma en que se reciban los datos y funciones miembros en la clase derivada. void main() { B Obj. Obj. :protected clase base Los miembros public y protected de la clase base son miembros protegidos de la clase derivada. Ejemplo: /*Acceso. Obj. Tipo de Acceso Descripción Los tipos de acceso definidos en las clase base son los :public clase base mismos en clase derivada Todos los datos y funciones miembros de la clase base :private clase base se convierten en privados para la clase derivada. Tabla 6. sin embargo según el tipo de acceso en la derivación.h> class A{ public: int a1. Si en lugar de que el tipo de acceso sea publico fuera .cpp */ #include <conio. Por consiguiente.

Si un miembro heredado se redefine en una clase derivada . ni por los usuarios genéricos ni las otras clases derivadas. • Que cosas se heredan y que cosas no Una clase derivada hereda datos y funciones miembros de su clase base. Ejemplo: /*FunOcult. función //2a. Estos miembros no son accesibles por los usuarios genéricos. pero las clases que se deriven posteriormente podrán acceder a estos miembros normalmente. los miembros públicos. }. Obj.F2().h> class B{ public: void Funcion(){cout<<"\nFunción B". } //1a. también se heredaría en la clase derivada. privados y protegidos de la clase base no son accesibles por las funciones miembros de la clase derivada. class D:public B{ public: void Funcion(){cout<<"\nFunción D".h> #include <iostream. sin embargo si se cambia a privado ya no. En la derivación privada. } void main() { clrscr(). Los miembros heredados se pueden utilizar con objetos de clase derivada. B::Funcion().Programación C y C++ 111 protegido. función //Llama a la segunda función //Llama a la primera función . Para llamar a un miembro ocultado es necesario utilizar el operador ::. el nombre redefinido oculta el nombre heredado. En la derivación protegida los miembros públicos y protegidos de la clase base se comportan como miembros protegidos de la clase derivada. D Obj.cpp */ #include <conio. void D::F2() { Funcion(). esto se puede hacer porque la clase B hereda el atributo de la clase base A. En la implementación de las funciones Asignar() y Ver() de la clase derivada B observe como se accesa directamente al dato miembro a1 que pertenece a la clase base A como si fuera parte de la clase B.} }.} void F2().

Obj. Destructores 3.} //Error No encontrado void Ver(){cout<<b<<" "<<d. la forma correcta de poder llamar a un constructor de una clase base desde una clase derivada es hacerlo en el constructor de la clase derivada utilizando el operador : al final de la definición del constructor como .h> class Base{ protected: int b. int y){Base(x). pero el compilador detecta el error por no poder encontrarlo. Datos estáticos Si en una clase base de una clase derivada se encuentran cualquiera de los componentes anteriores se debe tener presente que desde la clase derivada no se podrán acceder de manera directa. public: Base(int x){b=x.h> #include <iostream.50).Ver(). Constructores 2. public: Derivada(int x.} }. int y):Base(x) { d=y.} }. Funciones estáticas 5. Ejemplo: /*NoHeren. class Derivada:public Base{ int d. } */ void main() { Derivada Obj(30. } En la implementación del constructor de la clase Derivada. /*Forma correcta de poder llamar a un constructor de una clase base Derivada::Derivada(int x.112 Programación C y C++ Una clase derivada hereda todos los datos y funciones miembros de la clase base excepto los siguientes: 1.d=y. Funciones amigas 4.cpp */ #include <conio. se intenta llamar al constructor de la clase Base.

los atributos que pudieran tener cada una de las clases base.. Para poder ejecutar el programa se debe comentar la implementación del constructor dentro de la clase y eliminar el comentario de la implementación independiente.. } .cpp */ #include <conio.20. • Sintaxis de Herencia Multiple Class Nombre_Derivada : <Tipo de acceso> clase base1. public: int Vera(){return a1.c1=z. class C: public A.int y. } Ejemplo: Definición del siguiente árbol de herencia class A{ }.. class B{ }. además de los propios.Programación C y C++ 113 se muestra en el programa NoHeren.} void Ver(){cout<<Vera()<<" "<<Verb()<<" "<<c1. void main() { C Obj.30). Obj.int z){a1=x.} }..} }.Asigna(10.| <Tipo de acceso> clase basen { . Obj. public: void Asigna(int x.public B{ int c1.h> #include <iostream. class B{ protected: int b1. public B{ }. class C:public A.Ver(). los tendría también la clase derivada.} }. Ejemplo: /*Multiple. | <Tipo de acceso> clase base2. A B // Herencia Multiple C En este ejemplo la clase C se deriva de la clase A y B.b1=y.h> class A{ protected: int a1.cpp. public: int Verb(){return b1.|.

class B:public A{ }. Ejemplo: A B C D En este caso la clase D hereda de manera indirecta los atributos de la clase A por dos rutas diferentes.h> #include <iostream. sin embargo cuando la clase D hereda de las clases B y C el atributo a1 se hereda por duplicado. } La clase A contiene el atributo a1 que se hereda por separado a las clases B y C.} //Error de ambigüedad }. void main() { D Obj.Asignar(10). class C:public A{ }.cpp */ #include <conio. }. public C{ public: void Asignar(int x){a1=x. Este problema puede tener dos soluciones.114 Programación C y C++ PROBLEMA Y SOLUCIÓN DE LA HERENCIA MÚLTIPLES La herencia múltiple puede introducir ambigüedades cuando se heredan de dos clases base que a su vez contiene ambas la misma clase base. Obj. hasta aquí todo esta bien. Ejemplo: /*Pro_Mul. provocando que los atributos de A se creen por duplicado. es por eso que el compilador detecta el error en la función Asignar(). . El compilador no sabría cual es la copia que se estaría referenciando. class D:public B.h> class A{ protected: int a1.

Que atributos tendrían los objetos que se definan a partir de cada clase. public C{ public: void Asignar(int x){a1=x. Crear una sola instancia de la clase base heredada de manera indirecta. Ejemplo: /*Sol_Mul. void main() { D Obj. Referenciar el atributo correctamente usando el operador :: en lugar de hacerlo directamente: Ejemplo: C::a1=x. ó B::a1=x. } Ejercicio: El siguiente árbol de herencia. }. contiene un conjunto de clases con atributos de tipo entero: a). b). .h> class A{ protected: int a1. la primera puede confundir al programador. Para implementar la segunda solución las clases derivadas que producen la intersección con la clase base deben heredar virtualmente de la clase base (Se utiliza la palabra reservada virtual).. class C: virtual public A{ }. 2. mientras que la segunda se convierte en la más idónea porque elimina totalmente la ambigüedad que pudiera existir. Solución B C 1ª. El aspecto del árbol de herencia para cada una de estas soluciones sería: A A 2ª. class B: virtual public A{ }.Asignar(10).} //OK Libre de ambigüedad }.Definir las clases.Programación C y C++ 115 1.h> #include <iostream. Obj. Solución D D B C A Aunque las dos soluciones se pueden utilizar.. class D:public B.cpp */ #include <conio.

a2. }..Descripción de un problema real 2. • Pasos para el desarrollo de un Programa Orientada a Objetos 1.f2 G g1 a).Obtención de los objetos que existen en el dominio del problema 3..Definición de los miembros de cada objeto .Atributos de los Objetos A a1 a2 B b1 C c1 class E: virtual public A.. aunque el orden no es el apropiado. b). }.Definición de clases class A{ protected: int a1.. class B{ protected: int b1. class D: virtual public A { protected: int d1.. class F: public C{ Protected: Int f1.f2. A T R I B U T O S OBJETOS D a1 a2 d1 E a1 a2 b1 e1 F c1 f1 f2 G a1 a2 b1 d1 e1 c1 f1 f2 g1 El ejercicio anterior da algunas ideas sobre el procedimiento para el desarrollo de programas reales Orientados a Objetos. class G: public D. }. }. }. }. }. class C{ protected: int c1. public F{ Int e1.a2 B b1 C c1 D d1 E e1 F f1. public B{ Protected: Int e1. public E.116 Programación C y C++ A a1.

es el orden en que están listados en la declaración de la clase derivada. supóngase que se dispone de las clase Rectángulo. int y):Base(x) En este ejemplo el dato de tipo entero x se pasa al constructor de la clase base. los objetos de estas clases pueden contener una función Area() que calcule el área correspondiente. Una característica esencial del polimorfismo es que se pueden enviar mensajes sin conocer la clase de objeto recipiente. cuyos objetos representan las figuras geométricas.Desarrollo del árbol de herencia 5. Sin embargo la respuesta al mensaje area será diferente para cada uno de los objetos.Base2(w) Aquí se llama al constructor Base1 y se le pasa el valor entero x y el constructor Base2 el valor entero w. los constructores de la clase base se llaman antes que se ejecute el constructor de la clase derivada. Por ejemplo. CONSTRUCTORES Y DESTRUCTORES EN CLASES DERIVADAS Al crear clases derivadas con una sola clase base.. Triangulo. para visualizar cualquiera de ellos basta con .Aplicación que use las clases. La relación entre el destructor de la clase derivada y el destructor de la clase base se mantiene. POLIMORFISMO El polimorfismo es la propiedad por la cual los objetos que pertenecen a clases diferentes pueden responder al mismo mensaje (función) de diferentes formas. este método se amplía de un modo lógico para el caso de clases base múltiples. int y.Definición e implementación de clases y funciones miembros 6. Circulo. 117 Al finalizar este capitulo se presenta un ejemplo. por lo pronto se continuará con las bases.. Derivada::Derivada(int x. donde se podrá apreciar cada uno de estos pasos. Los destructores de la clase base se llaman en orden inverso al que los objetos base se crearon.Programación C y C++ 4. el constructor de la clase base se llama siempre antes que el constructor de la clase derivada. Derivada::Derivada(int x. En el ejemplo anterior primero se ejecuta Base1 y luego Base2. El destructor de la clase derivada se llama primero que el destructor de la clase base. Cilindro. Además se dispone de un mecanismo para pasar los valores de los parámetros necesarios al constructor de la clase base desde el constructor de la clase derivada.. El orden en que se ejecutan los constructores de las clases bases. Al igual que con herencia simple. int w):Base1(x). Por ejemplo se puede tener una lista de los posibles objetos que pueden aparecer en la pantalla.

SOBRECARGA DE FUNCIONES Consiste en definir dos ó más funciones con el mismo nombre aunque con diferencias en el número o tipo de parámetros que reciben. char *B){strcat(A.20).118 Programación C y C++ enviar el mensaje Show() para que se visualice. así la función que se llame será el que coincida con número y tipo de argumento. de aquí el comportamiento polimórfico.9.f2=34. cout<<"\n"<<M.B). el polimorfismo se implementa por medio de sobrecarga de funciones y con funciones virtuales.h> #include <conio. float B){return A+B.3. En C++. void main() { Matematico M. FUNCIONES VIRTUALES Las funciones miembro virtuales son similares a las funciones miembro ordinarias con la diferencia importante de que las llamadas a las funciones virtuales se enlazan dinámicamente (ligadura dinámica) en tiempo de ejecución (en lugar de en tiempo de compilación) a la función que llama.h> class Matematico{ public: int Sumar(int A.h> #include <iostream. .f2).} }.cpp */ #include <string.} char * Sumar(char *A. sin tener que preocuparse de cada objeto de la lista. "Amigo"). int B){return A+B. Esto permite que una función se comporte de una forma u otra dependiendo de los argumentos. Al permitir que una clase tenga más de un constructor es un caso de sobrecarga de funciones. dos reales ó concatenar dos cadenas. float f1=25.200001 Hola Amigo En la clase Matemático se define la función Sumar() sobrecargada (tres veces).Sumar("Hola ". Ejemplo: /*Sob_Fun.return A.Sumar(f1. cout<<"\n"<<M. cout<<"\n"<<M. permitiendo sumar dos enteros.} float Sumar(float A.Sumar(10. } La salida del programa es 30 60.

public: Cilindro(int r. virtual float Area(). Cilindro Altura. 3. Supóngase que se desea un programa para calcula el área de círculos y cilindros. Figura 6. las funciones tienen ligadura estática.. si se desea ligadura dinámica se debe preceder a la declaración de la función la palabra reservada virtual. Circulo Radio. conteniendo las funciones virtuales y el comportamiento polimórfico. /*Polimor.Funciones virtuales El programa completo se muestra en el siguiente listado.} //Constructor virtual float Area(){return(PI*Radio*Radio). virtual float Area() La ligadura dinámica tiene sentido en C++. class Cilindro:public Circulo{ int Altura.h> #define PI 3.Programación C y C++ 119 En C++ por defecto.} }.} //Constructor float Area(){return(2*PI*Radio*Altura +2*PI*Radio*Radio). virtual float Area(). public: Circulo(int r){Radio=r. int h):Circulo(r){Altura=h.} .cpp */ #include <conio. aplicando las formulas correspondientes: • Área del Circulo = PI*Radio*Radio • Área del Cilindro = 2*PI*Radio*Altura + 2*PI*Radio*Radio El árbol de herencia quedaría como se muestra en la siguiente figura. sólo para objetos que son parte de una jerarquía de clases (herencia).h> #include <iostream.1416 class Circulo{ protected: int Radio.

una clase es una clase abstracta si tiene al menos una función vitual pura. Una función virtual pura es aquella cuya declaración no está seguida por una implementación. //Según el objeto recibido es la función } // que se llama void main() { Circulo C(5). Programación C y C++ //función que proporciona el comportamiento polimórfico float Area (Circulo Obj) { return(Obj. //Imprime 78. es decir.5). la ventaja de una clase abstracta reside en la elegancia de combinar las características comunes de una serie de clases especiales en una clase base que no se utiliza para crear un objeto. //Objeto Circulo Cilindro Cl(10. (en la clase base). C++ determina en tiempo de ejecución a qué función llamar en función del tipo de objeto apuntado. Sintaxis: Virtual void func_pura()=0.16 } En C++ las funciones virtuales siguen una regla precisa: la función debe ser declarada como virtual en la primera clase que esta presente. son especiales ya que cuando se accede a una de ellas usando una referencia a un objeto de una clase derivada.120 }.Area()). //Objeto Cilindro cout<<"Area del Circulo: "<<Area(C). que la clase base no puede implementar y que se inicializan a cero. Una clase abstracta se utiliza en los casos donde exista polimorfismo. El uso de una clase abstracta no es estrictamente necesaria. . si esta clase base es una clase genérica y no se requiere la definición de objetos a partir de ella entonces se debe definir como clase abstracta. Una función virtual es una función que se declara en la clase base como virtual y se redefine en una ó más clases derivadas. partiendo del echo de que las funciones virtuales que existan en el árbol de herencia solamente se debe definir en la clase base. CLASES ABSTRACTAS Una clase abstracta es aquella que sólo se puede utilizar como clase base. //Imprime 314.54 cout<<"\nArea del Cilindro: "<<Area(Cl). no se puede utilizar para declarar objetos. Desde el punto de vista del lenguaje . Las funciones virtuales.

virtual void Ver()=0 Alumno NCtrl.} virtual void Ver()=0. char Dir[40]. char *D){strcpy(Nom. En este caso no se pretende definir ningún objeto de la clase Persona por lo que deberá ser una clase abstracta. Esp. Dir. o sea la función Ver() será definida como una función virtual pura.Programación C y C++ 121 Ejemplo: Se desea escribir un programa que maneje los datos de los Alumnos y Maestros según la siguiente tabla: OBJETOS Maestro Nombre Dirección Plaza Departamento Maestro() void Ver() Datos Funciones Alumno Nombre Dirección No. así como la función Ver() son comunes a los dos objetos.h> class Persona{ //Clase Abstracta protected: char Nom[40]. public: Persona (char *N.N).cpp */ #include <string. class Alumno: public Persona{ . se puede crear una clase genérica al que se le llame Persona que contenga estos tres miembros. //Función virtual pura }. y con la finalizad de darle el comportamiento polimórfico definir la función Ver() como virtual.D). void Ver(). strcpy(Dir. void Ver(). Persona Nom.h> #include <iostream. El listado del programa es: /*Abstrac. Maestro Plaza. Depto. El árbol de herencia queda de la siguiente forma. de Control Especialidad Alumnos() void Ver() Se aprecia que los datos Nombre y Dirección.h> #include <conio.

cout<<"\n"<<Dir."Av. }.Ct). void Ver().D) { strcpy(Plaza. cout<<"\n"<<Dir. } void Alumno::Ver() { cout<<"\n\nDATOS DEL ALUMNO".char *D. } void main() { //Persona P.char *Ct. strcpy(Esp.char *P. cout<<"\n"<<Nom. cout<<"\n"<<Depto.E). public: Maestro(char *N. .Dp).char *D."Av.char *P. cout<<"\n"<<Esp. Maestro M("Juvenal". } //Función que proporciona el comportamiento polimórfico void Ver(Persona *P) //El parámetro debe ser un apuntador { P->Ver(). //Error no se puede crear un objeto Alumno A("Juan Pérez". Juárez". Ver(&M).char *E):Persona(N. strcpy(Depto. "Informática").D) { strcpy(NCtrl. char Esp[30].char *D. cout<<"\n"<<Nom. Hidalgo". public: Alumno(char *N.122 Programación C y C++ char NCtrl[15]."Titular A". cout<<"\n"<<NCtrl. cout<<"\n"<<Plaza. } void Maestro::Ver() { cout<<"\n\nDATOS DEL MAESTRO". "93190203".char *Dp). //Implementación de funciones miembro de la clase Maestro Maestro::Maestro(char *N.char *Ct. char Depto[40]. } class Maestro:public Persona{ char Plaza[30].char *Dp):Persona(N. void Ver(). //Implementación de funciones miembros de la clase Alumno Alumno::Alumno(char *N.char *E).char *D.P)."Sistemas y Computación"). }.

esta función proporciona el comportamiento polimórfico por que según el objeto que reciba como parámetro. será a la función que llamará en tiempo de ejecución. Hidalgo Titular A Sistemas y Computación DATOS DEL ALUMNO Juan Perez Av. pero el compilador detecta el error por provenir de una clase abstracta.Programación C y C++ Ver(&A). en la en la segunda llamada la dirección del objeto A. en la primera se le pasa como argumento la dirección del objeto M. . Así primero despliega los datos del maestro y luego los datos del alumno. Después de crear los dos objetos A y M con cada uno de los parámetros requeridos por sus correspondientes constructores. se llama a la función Ver() en dos ocasiones. es por ello que aparece comentado. } La salida del Programa es: DATOS DEL MAESTRO Juvenal Av. Juarez 93190203 Informática 123 En la función principal main() se puede apreciar en la primera línea el intento de definir un objeto de la clase Persona().

y). gotoxy(x1. public: RecRell():Rect(){Car='░'. //Implementación independiente void RecRell::Dibujar() { int x.h> class Rect{ protected: int x1. para que además de la clase Rect (Rectángulo) contenga también otra clase deriva que le permita dibujar rectángulos rellenados.cout<<"-".y2=14.Complementar el ejercicio resuelto Rectang.x++) { gotoxy(x.x2=j.x<x2.} //Constructor void Dibujar().y2.cpp desarrollado en el capitulo anterior. }.int y.int y. int j. for (x=x1.y++) //rellena el rectángulo for (x=x1+1.y<y2.y1=y. } class RecRell:public Rect{ char Car. void Asignar(int x.cpp */ #include <conio.y1=10. public: Rect(){x1=35.. Rect::Dibujar(). //¿A Que función se llama? for (y=y1+1.cout<<"┐". void Asignar(int x. } for (y=y1+1.y.y2).cout<<"|".int k.y. gotoxy(x2. /*RectRell.y<y2.int k){x1=x.cout<<"|".y1.cout<<"┘".} //Llama al constructor base void Dibujar().124 Programación C y C++ EJERCICIOS RESUELTOS 1.y2).y1).x2=45.y2).x<x2.h> #include <iostream. gotoxy(x. //Implementación independiente de funciones void Rect::Dibujar() { int x. gotoxy(x2.y1).cout<<"┌".y++) { gotoxy(x1. } gotoxy(x1.cout<<"-".cout<<"└".y).x2.y1).x++) { .} }. int j. gotoxy(x2.y2=k.char c).

30. Leer(). Rect R. Leer(). Ant. TBase SalDía.70..Asignar(50.int y.16. R. 125 } } void RecRell::Asignar(int x.Dibujar().16). Rell.177).y. aplicando los pasos para el desarrollo de un programa orientado a objetos: Una empresa desea generar fichas de su personal de base y eventual.Dibujar(). PagarSalario(). Solución: ♣ Obtención de objetos: Trabajador de base y Trabajador Eventual ♣ Datos y funciones miembros de los objetos: TrabajadorBase TrabajadorEventual Nombre Nombre Datos Dirección Dirección Salario/día Honorario/hora Años de antigüedad Leer() Leer() Funciones Visualizar() Visualizar() PagarSalario() PagarSalario() ♣ Árbol de herencia. int j.Dibujar().char c) { Rect::Asignar(x. Trabajador Nom.k). Leer().y). //Objeto RecRell Rell. Dir. Car=c. .j. //Objeto R. //Dibuja Rell. Visualizar(). Visualizar(). Visualizar().Asignar(10. TEventual HonoHra.Programación C y C++ gotoxy(x. } void main() { clrscr().8. } de la clase Rect de la clase RecRell un rectángulo un rectángulo rellenado 2.8.Resuelva el siguiente problema.int k. PagarSalario(). //Dibuja Rell.cout<<Car.

void PagarSalario(). }. //Implementación de funciones miembros de la clase Trabajador void Trabajador::Leer() { cout<<"\nNOMBRE: ". public: void Leer(). void Visualizar().h> //Definición de las Clases class Trabajador{ private: char Nom[40]. cout<<"\n"<<Dir.h> #include <iostream. int Ant. Trabajador::Leer(). public: void Leer().126 Programación C y C++ ♣ Definición e implementación de las clases /*Trabaj. class TBase:public Trabajador{ float SalDia. } void Trabajador::Visualizar() { cout<<"\n"<<Nom. void PagarSalario(). public: void Leer(). char Dir[40].cpp */ #include <conio.h> #include <stdio. . void Visualizar(). cout<<"DIRECCION: ". } //Implementación de funciones miembros de la clase TBase void TBase::Leer() { cout<<"\nDATOS DEL TRABAJADOR DE BASE". void Visualizar(). gets(Nom). class TEventual:public Trabajador{ float HonoHra. }. }. gets(Dir). cin>>SalDia. cout<<"SALARIO DIARIO: ".

B. cout<<"\nSalario semanal: "<<SalSemanal. Trabajador::Visualizar(). cout<<"SALARIO POR HORA: ".PagarSalario(). } . //Objeto Trabajador Eventual B. } 127 //Más el 2% por año //Implementación de funciones miembros de la clase TEventual void TEventual::Leer() { cout<<"\nDATOS DEL TRABAJADOR EVENTUAL". } void TBase::PagarSalario() { float SalSemanal.Leer(). cin>>HonoHra. cout<<"\n"<<SalDia.Visualizar().PagarSalario(). SalSemanal=SalDia*7 + Ant*0. //Objeto Trabajador de Base TEventual E. cout<<"\n"<<Ant. } // Programa principal void main() { TBase B.Programación C y C++ cout<<"AÑOS DE SERVICIO: ". //*8d hrs * 7 días cout<<"\nSalario semanal: "<<SalSemanal. SalSemanal=HonoHra*8*7.Visualizar(). } void TBase::Visualizar() { cout<<"\nTRABAJADOR DE BASE". cout<<"\n"<<HonoHra. E. } void TEventual::Visualizar() { cout<<"\nTRABAJADOR EVENTUAL". E. cin>>Ant. Trabajador::Visualizar(). } void TEventual::PagarSalario() { float SalSemanal.Leer(). E. B. Trabajador::Leer().02*SalDia*7.

class Der2: public Base{ private: int d1. }. }.Suponga que en una situación real se hallaron los siguientes objetos con sus respectivos datos miembros de tipo entero: Objetos A B C D b1 b1 b1 b1 Datos a1 a1 a1 d1 miembros a2 d1 d1 d2 b2 b2 c2 Construir el árbol de herencia y definir las clases. class C: public B{ int c2.public Der1{ int a2. class D: public Der2{ int d2. class A:public Base. class B: public Der1. }.128 Programación C y C++ 3. }.public Der2{ private: int b2.. }. class Der1:public virtual Base{ private: int a1. }. }. . Solución: ♣ Árbol de herencia: Base b1 Der1 a1 Der2 d1 A a2 C c2 B b2 D d2 ♣ Definición de clases class Base{ private: int b1.

Cual es la salida en pantalla del programa RectRell.cpp te tal forma que se utilice polimorfismo mediante funciones virtuales (Deberá proporcionar la misma salida en pantalla).. 4...Modifique el ejercicio resuelto Trabaj.Muestre un ejemplo de la salida en pantalla del programa Trabaj. 5. | ..cpp 3.Suponga que en una situación real se hallaron los siguientes objetos con sus respectivos datos miembros de tipo entero: Objetos Atributos A a1 d1 b1 a2 B a1 c1 b1 b2 C a1 c1 c2 D a1 d1 d2 Construir el árbol de herencia y definir las clases.Proponer un problema y resolverlo aplicando los pasos para el desarrollo de un programa orientado a objetos.cpp 2..Programación C y C++ 129 EJERCICIOS PROPUESTOS 1.

Sign up to vote on this title
UsefulNot useful