P. 1
Programacion c

Programacion c

|Views: 795|Likes:
Publicado pordiabliux

More info:

Published by: diabliux on Mar 26, 2011
Copyright:Attribution Non-commercial

Availability:

Read on Scribd mobile: iPhone, iPad and Android.
download as PDF, TXT or read online from Scribd
See more
See less

07/07/2015

pdf

text

original

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

.4 Programación C y C++ Ejercicios 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 .

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. el nombre del archivo aparece como comentario al inicio de cada listado de programa. En archivo empaquetado que acompaña al libro encontrará un directorio por cada unidad con los ejercicios desarrollados.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. Los programas que contiene el libro fueron probados usando compiladores de Borland. cualquier comentario o sugerencia acerca del contenido del material lo puede hacer a la siguiente dirección de correo electrónico: gastondv@hotmail. Espero que al terminar de leer este libro se cubran las expectativas planteadas.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 .

En 1972 . como no existía ningún estándar. . La novedad que proporciono él lenguaje C sobre el B fue el diseño de tipos y estructuras de datos. En 1980 Bjarne Stroustrup de los laboratorios Bell de Murray Hill. Dennis Ritchie. en vista a su transportabilidad a otras maquinas.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. Para 1983 dicha denominación cambio a la de 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. los códigos fuentes aceptados por la mayoría de esas implementaciones eran altamente compatibles. inspirado en el lenguaje BCPL concebido por Martín Richard en 1967. Su eficiencia y claridad han hecho que el lenguaje ensamblador apenas haya sido utilizado en UNIX. En lo que se podría decir que era un milagro. Actualmente muchas empresas se dedican a vender el Compilador del lenguaje C. B era un lenguaje evolucionado e independiente de la máquina. toma el relevo y modifica el lenguaje B. que en la fase de arranque estaba escrito en ensamblador. aparecieron discrepancias. Para remediar la situación. Este leguaje está inspirado en el lenguaje B escrito por Ken Thompson en 1970 con intención de recodificar el UNIX. Con la popularidad de las microcomputadoras se crearon muchas implementaciones de C.0 La mayoría de los compiladores actuales soportan la programación en C Estándar. creando el lenguaje C y rescribiendo el UNIX en dicho lenguaje. 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. dos de estos imperios son: Microsoft Borland Visual C++ Ver 6. Este comité ANSI termino el proceso de formalización en 1990. fueron escritos en C. 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.0 C++ Builder 5. Sin embargo. C Orientado a Objetos y la Programación Visual. Con este nuevo enfoque surge la nueva metodología que aumenta las posibilidades de la programación bajo nuevos conceptos. New Jersey.

printf("\n El Area es.8 Programación C y C++ ESTRUCTURA DE UN PROGRAMA Un programa escrito en lenguaje C tiene la siguiente estructura.cpp //Definición de archivos de cabecera #include <conio.Definición e implementación del programa principal ( main() ) 5. A manera de ejemplo considérese el siguiente programa: //*Est_Prog. //Definición e implementación del Programa Principal void main() {int Radio. en la sección de Definición de archivos de cabecera se presentan los archivos conio..h> #include <stdio. clrscr().. printf("BIEN BENIDO AL LENGUAJE C").2f"..h> //Definición de Constantes y Variables Globales #define PI 3.Implementación de funciones del usuario. getch().Definición de Funciones del usuario 4.Definición de archivos de cabeceras 2.Definición de constantes y variables globales 3. printf("\n Radio: ").1416 float Area. El programa Est_Pro.. scanf("%i". //Definición de funciones del usuario void Area_Cir(int R). } 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. aunque no necesariamente debe contener todos los puntos: 1.h y el stdio. printf("\n\n CALCULO DEL AREA DE UN CIRCULO"). %8.Area)..&Radio). Area_Cir(Radio). } //Implementación de funciones del Usuario void Area_Cir(int R) { Area= 2*PI*R*R.h ambos son archivos de .cpp contiene las 5 partes del que se compone un programa escrito en el lenguaje C.

h> para uso de funciones de entrada/salida por teclado o consola <alloc. aquí se define Area de tipo real (float). En la sección de definición de funciones del usuario se requiere definir todas las funciones que se implementen por el programador. modificable desde cualquier parte del programa o función.h> para uso de funciones de entrada/salida por flujos.h> para uso de funciones de hora y fecha.h> para uso de funciones de entrada/salida de bajo nivel <math.h> para uso de funciones matemáticas. <stdio. <conio. recuerde que una variable global perdura a lo largo de la ejecución de todo el programa y puede ser vista.1416. 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. 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.h> para uso de funciones de manipulación de memoria. de esta forma se evita que la función principal este saturada de código. En este .h> para la asignación dinámica de memoria <graphics> para uso de funciones relacionadas con gráficas <io. 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. 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. por que solo de esta forma el compilador puede conocer de forma adelantada la existencia de los mismos.h> para uso de funciones relacionadas con cadenas <time. constantes y funciones que se encuentren en el archivo y que sean usados por el programa en desarrollo. observe que después del identificador PI no existe un signo =. 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). La siguiente lista muestra algunos de los archivos de cabeceras que más se usan así como una breve descripción de su contenido. <iostream. de esta forma el compilador incluirá durante la compilación las variables.Programación C y C++ 9 cabecera definidos por el lenguaje.h> para uso de funciones de entrada/salida standard. aunque el significado es que el identificador PI toma el valor de 3. 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. para la definición de las variables globales basta con indicar su tipo de dato y el identificador seguido de punto y coma. <mem.

el resultado de multiplicar 2*3.1416*R*R . 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. La función principal (main()) es el primero que se ejecuta cuando inicia un programa.1416*5*5. 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. por lo que es indispensable que éste exista. Area_Cir() sin tipo de retorno (void) y recibe como parámetro un entero( El radio del circulo). 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 . si el usuario introdujo un Radio =5 entonces sería: 2*3. en él se establece la lógica o secuencia que seguirá el programa durante su ejecución. 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. .

exe Archivo2.obj LIGADO Extern. Compilación. etc. de no existir se genera un archivo objeto (.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. 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.) incluidos también en el software del compilador. Cl. De lo anterior se deduce entonces que un archivo de cabeceras (*.Durante este proceso se unen todos los programas objetos del que se conforme la aplicación.Lib). 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. por lo que se integran al programa en tiempo de enlace. los archivos de cabecera para hallar errores de sintaxis.lib. Para aclarar lo anterior observe la siguiente figura: Princip.lib Mathl.OBJ) por cada programa fuente. 1 Diferencias entre un archivo de Cabecera y uno de Librería .LIB) para formar un solo programa independiente.EXE).h) es diferente de un archivo de librerías (*.h Archivo2. Ligado.obj Cl. así como los archivos de librería (.lib Figura 1.cpp stdio. o programa ejecutable (..lib.Durante este proceso se examina el o los programas fuente de la aplicación. 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.h COMPILACION Princip..cpp conio.

. 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. Palabras reservadas Las palabras reservadas del compilador son todas aquellas palabras que se usan para especificar tipos de variables. Windows NT son de 32 bits.12 Programación C y C++ Es frecuente que se confundan los términos archivo de librería con archivo de cabecera. 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. así que el compilador para cada uno de estos sistemas operativos almacenara en algunos casos un mismo tipo de dato con longitud diferente. y que no pueden ser usadas por el usuario como nombre de variables. Windows 2000. para ello se usa la ejecución paso a paso de un programa (Depuración).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. Durante la escritura de un programa es frecuente probar una y otra vez si se esta haciendo lo correcto. de funciones o de nuevos tipos . 2 Palabras Reservadas del Lenguaje Las palabras reservadas deben escribirse siempre en minúsculas. la tabla y dibujo anterior precisamente tiene la finalidad de hacer notar que son diferentes. mientras que Windows 98. 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. por ejemplo el sistema operativo MS-DOS es un sistema de 16 bits. el diseñador a partir de estas puede crear nuevos tipos y nuevas instrucciones. etc. estructuras cíclicas. más adelante se presenta una tabla de los tipos de datos para un sistema de 16 bits.. al final de cuentas están directamente relacionados entre si .

algunos tipos predefinidos para un sistema de 16 bits son. existen otros lenguajes como PASCAL que cuentan con unos pocos tipos.Programación C y C++ 13 C se distingue por ser un lenguaje con demasiados tipos. 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. este tipo de datos puede ser alguno de los tipos predefinidos por el lenguaje o definido por el usuario.967. 12 dígitos de precisión void 0 Sin valor Tabla 1.294. 4 Tipos de Datos con modificadores en un Sistema de 16 Bits Como se puede observar cada tipo tiene un tamaño en bits.7E-308 a 1. Antes de empezar a describir los tipos disponibles en el lenguaje estudiemos un poco lo que es una variable. este tamaño define un rango de operación que limita los números que se puede almacenar en una variable. 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.647 32 3. 6 dígitos de precisión double 64 Aprox. imagínese que se desea diseñar un programa de nómina que .483. esta variedad de tipos nos obliga a ser demasiado cuidadosos a la hora de usar algunos operadores de asignación.7E308 Tabla 1. Las variables siempre pertenecen a un tipo de datos. Tipos de datos # de Bits Intervalo char 8 -127 a 127 int 16 -32768 a 32767 long 32 0 a 4294967295 float 32 Aprox.767 32 0 a 4.648 a 2.4E38 64 1.147.483.4E-38 a 3.147.768 a 32.295 32 -2.

seguramente pensó en un tipo unsigned int.767 32 -2.483. ya que los sueldos pueden ser superiores a 65535. ¿será el tipo unsigned int el más apropiado? Bueno tal vez contestará que no.295 16 -32. si observamos la tabla anterior el tipo unsigned int almacena valores entre 0 y 65535. Como se deduce en consecuencia que la longitud en bytes de un tipo dato depende del sistema operativo y del compilador que se use.147. mientras que en Windows 98 el valor de 4. Para el caso de un Sistema Operativo de 32 bits.294. 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. tal vez el tipo más apropiado será unsigned long que almacena valores entre 0 y 4294967295. En un compilador operado en el sistema operativo MS-DOS x tomaría el valor de 2. 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. en el momento que almacenemos un valor superior a 65535 el contenido quedará truncado.768 a 32.4E381 64 2.483.2E-308 a 1.2E-38 a 3. Bueno. la parte restante del libro estará basado en el ambiente Windows para conocer la programación Visual con C++. 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). para conocer con precisión la longitud en bytes de una variable de un tipo de dato se puede utilizar el operador sizeof. Por ejemplo: int x.648 a 2.14 Programación C y C++ va ha manejar los sueldos de los empleados. piense en el tipo de datos que usaría para la variable sueldo.967. el compilador almacenaría los datos con tamaños diferentes.147. x=sizeof(int)). Comentarios .648 32 Lo mismo que unsigned int 32 Lo mismo que int 32 1.8E3082 Tabla 1. pero que pasaría si escogiéramos el tipo unsigned int para la variable sueldo.

char Car. Cada variable de un programa.identificador]. //Se declara la variable x de tipo entero inicializándola con 92 char car=x. . float. a diferencia de otros lenguajes. etc. Por ejemplo: int x=92. Una variable que se declara al inicio del programa es considerada como variable global y es accesible desde cualquier parte del programa. tipo determina el tipo de variable (char. Nombre[40].) identificador Indica el nombre de la variable. Donde: clase representa un especificador de clase de almacenamiento (se explica posteriormente). 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 . La declaración consiste en enunciar el nombre de la variable y asociarle un tipo. que es el equivalente del código ASCII. int. Sintaxis: [clase] tipo identificador[. El tipo determina los valores que puede tomar así como las operaciones que con ella pueden realizarse. Por lo contrario una variable declarada dentro de una función se considera como variable local y es accesible solamente dentro de este. es decir a la variable car se le asigna el carácter ’\’ . Una variable puede ser inicializada cuando se declara: char car = ’\0’ . int Incremento = 10. 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. //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.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). Conversión de Tipos de datos Cuando se trabaja con datos de diferentes tipos es frecuente mezclarlos durante una expresión o asignación.dbf”. C realiza la conversión de tipos compatibles de manera automática. Promedio. char Archivo[] = ”Datos. debe declararse antes de ser utilizada.

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

3/4*6 0*6 0 c). Nivel 1 2 3 4 5 6 7 8 9 10 11 12 13 14 Operadores () [] -> :: ...(float) 2/4 2.0/4 0.8/4*6 2*6 12 b). ! ~ ++ -.5 d). Tendrá un significado distinto dependiendo de cómo se agrupen los paréntesis: A= x + (y . Lo más sencillo de recordar es que la multiplicación y división tienen prioridad sobre la suma y la resta.2) / (2 + z). 7 Prioridad y Asociatividad de operadores de C++ Ejemplos: a).-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 . Por ejemplo: A= x + y – 2 / 2 + z.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. Todos los operadores situados entre líneas tienen el mismo nivel de prioridad.& * * / % + << >> < <= > >= = != & ∧ | && || = *= -= *= %= < <= > >= &= ∧= |= . y describe como se asocia cada operador (de izquierda a derecha o de derecha a izquierda). 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. C y C++ tienen reglas específicas para determinar el orden de evaluación. En la siguiente tabla lista los operadores de C y C++ de mayor a menor prioridad. Asociatividad Izquierda – Derecha Derecha .. A partir de esto. por lo que deberá utilizar paréntesis para hacer más explicito el orden de evaluación.. tampoco lo será para alguien que lea el código. 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. los cuales se analizaran posteriormente. El segundo elemento contiene especificadores de formato que definen la forma en que se muestran los argumentos posteriores. 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 . El espicificador de formato empieza con un % y va seguido por el código del formato.h : printf() y scanf(). 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. Salida por pantalla Printf(char *cadena_de_control. además de la importancia de incluir mensajes en las ordenes de salida que nos indiquen la naturaleza o nombre de los resultados obtenidos. Lista_argumentos). 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. El primer elemento es el carácter que se mostrará en la pantalla.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. En esta sección se analizan los dos primeros métodos. En la siguiente tabla se muestra una gran variedad de especificadores de formato. Código %c %d %i %e Formato Carácter Entero en decimales con signo Entero decimales con signo Notación científica .

9 Secuencias de Escape Entrada por teclado Scanf(char *cadena_de_control. por tal motivo los nombres de ellas van precedidas del símbolo & (con lo que se indica que se usan apuntadores). Lista_argumentos). 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. Esta función direcciona automáticamente la lectura de valores por el teclado de la microcomputadora. Ejemplo: . los nombres de las variables son en si mismos apuntadores y no requieren dicho símbolo. 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. Como se aprecia el formato es idéntico al printf(). 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. 8 Especificadores de Formato Ejemplo: printf(“El Lado es: %i El Area del Cuadrado es: %f”.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. Si la variable Lado=5 por lo tanto la variable Area=25.Lado. Area). En el caso de cadenas.

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

Programación C y C++ 21 Entrada y Salida por flujos C++ proporciona el archivo de cabecera iostream. /*ES-Flujo.cpp //En lugar de stdio.h> #include <iostream.cpp*/ #include <conio. 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. clrscr(). cout<<"IDENTIFIQUESE POR FAVOR". cout<<"\n PESO: ". A manera de ejemplo rescribiremos el programa ES-Estan. este archivo tiene la ventaja sobre el stdio. cout<<"\n\n SUS DATOS SON: ". cin>>Peso. getch(). cout<<Nom<<" "<<Edad<<" "<<Peso. float Peso. dos de estos objetos son: cin y cout. cin>>Nom. int Edad.h> void main() {char Nom[40]. • 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. cout<<"\n\n NOMBRE: ". cin>>Edad. } La Salida del programa después de ejecutarla sería identica al a salida del programa ES-Estan. ya que este solamente tomaría la primera .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).cpp pero en lugar de usar printf() y scanf() se usara cout y cin. cout<<"\n EDAD: ".h que contiene funciones que realizan operaciones de Entrada/Salida. en cuyo caso no sería conveniente utilizar cin sola.h por ser una implementación orientada a objetos.

num). Si se declaran dos variables globales con el mismo nombre en el mismo archivo. 40). Lo mismo ocurre si declaran todas las variables globales necesitadas por el programa en cada archivo. compilados por separado con el fin de acelerar la compilación y ayudar a la gestión de grandes proyectos. Num es el número máximo de caracteres que desea leer con getline() Ejemplo: cin.getline(Cadena. el compilador imprimirá un mensaje de error indicando que se ha duplicado un nombre de variable. Aunque el compilador no daría ningun mensaje de error en tiempo de . 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.identificador]. 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. //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. Los ejemplos que se mostraran a partir de esta parte del libro en adelante.22 Programación C y C++ palabra. La clase de almacenamiento precede a la declaración de la variable. es que los operadores << y >> efectúan automáticamente las conversiones necesarias. • extern Dado que C permite enlazar juntos módulos de un programa. las variables globales se deben de declarar sólo una vez. Su forma general es: [clase] tipo identificador[. Otro aspecto importante de los flujos. usarán el cout y el cin para la entrada y salida de datos en pantalla. Para leer más de una palabra se puede utilizar la función getline() de la siguiente forma: cin. Donde: Cadena es cualquier arreglo de caracteres que se haya definido con anterioridad y que contiene la cadena de entrada.getline(Nom. debe haber alguna forma de hacer conocer a todos los archivos las variables globales requeridas por el programa. lo que significa que el compilador no sabe que variable se va ha usar cada vez. Sin embargo al abordar el tema de la programación visual se dejará de usar.

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

Crear el proyecto.Crear un directorio de trabajo estando en el directorio del compilador C:\tc>md ejerc-I 2..En el ambiente definir como directorio de trabajo el directorio recien creado Seleccionar File | Change dir.0 para MS-DOS. 6..prj y seleccionar el botón OK 5. 1..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.prj..cpp y seleccionar el boton “Add” se observa como el nombre del archivo aparece ahora en la ventana projects. para poder compilar y enlazar de manera directa y transparente para el programador el programa Extern..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. y escribir en la caja de dialogos c:\tc\ejerc-I y OK 4. por defauld se guarda en el directorio de trabajo Seleccionar Project | Open Project… escribir en la caja de dialogos extern. Pasos: 1..cpp y seleccionar “Add”. a manera de ejemplo se explicará como se lleva a cabo la creación de proyectos usando el Software de Borland ver.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. El nombre que se le da a un proyecto será el mismo que tendrá el programa ejecutable despues de su compilación y ligado. escribir el nombre del segundo archivo: Archivo2. este proceso puede seguir para cada archivo fuente que se desee agregar. los pasos a seguir diferirán unos de otros dependiendo del fabricante y versión.Ejecutar el programa del compilador C:\tc>tc 3. no olvide guardar los cambios que se realizan ... para el programa anterior con esto basta.

} .. 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. for (x=0. el compilador crea un almacenamiento permanente para ella de forma muy parecida que cuando crea almacenamiento para una variable global. Variables static locales Cuando se aplica el modificador static a una variable local.h> #include <iostream.Programación C y C++ 25 Figura 1.Ejecutar el programa Con las teclas <Ctrl>+<F9> se compila. Ejemplo: /*Estatic1. clrscr(). void main() {int x.. enlaza y ejecuta el programa si no aparecen errores.0 para manejo de proyectos 7.h> void serie(). 2. getch().Ventana de BorlandC 1.x++) serie().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.cpp */ #include <conio.

estando así libre de efectos secundarios. } int serie() { cont=cont+10. Inicia_Semilla(0). las rutinas de otros archivos no la reconocerán ni alterarán su contenido directamente. Variables static globales Cuando se aplica el modificador static a una variable global. la siguienta línea la incrementa a 10 y es el primer valor que se visualiza despues de un tabulador.cpp. } . return(cont). De no definir la variable cont como static (int cont=0. clrscr().prj */ static int cont. } 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.h> #include <iostream. getch(). //Variable Local cont=cont+10. cout<<"\t"<<cont. int serie(). ya que existen varios tipos de rutinas que deben preservar su valor entre llamadas. se indica al compilador que cree una variable global conocida únicamente en el archivo en el que se declara. } /*Staticg2.h> void Inicia_Semilla(int i).26 Programación C y C++ void serie() {static int cont=0.x<5. en la siguiente llamada a la función serie() como no se destruye la variable cont este retiene su valor. ) 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. //ojo void Inicia_Semilla(int i) { cont=i. 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. for (x=0. void main() {int x.prj */ #include <conio.cpp. Static.x++) cout<<"\t"<<serie(). Esto significa que aunque la variable es global. al incrementarse durante la segunda llamada a la función serie() ahora tendrá 20 y así sucesivamente. 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. Ejemplo: /*Staticg1. Static.

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

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

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

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

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

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

.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 .

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

. else Mayor=C. else if ((B>A) && (B>C)) Mayor=B. int A=3.. default: sentencia_11. sentencia_22.. . if ((A>B) &&(A>C)) Mayor=A. } • switch La sentencia switch permite evaluar una expresión y tomar diversas acciones en función del resultado de la expresión..C=15. sentencia_12. cout<<"El Mayor es: "<<Mayor.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”.B=10.h> void main() {clrscr(). //Probar con otros valores int Mayor.. se ejecuta la sentencia asociada con ella y se pasa por alto el resto de la escala. getch(). . .h> #include <iostream. Se pueden anidar if evaluándose de arriba hacia abajo tan pronto como se encuentre una condición cierta. Switch (expresión entera) { case constante_1: sentencia_11. case constante_2: sentencia_21. } . Ejemplo: /*IF2... sentencia_12.. break.. break.cp Encuentra el mayor de 3 números*/ #include <conio.

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

en este caso se ejecuta la sentencia hallada después del default y al final del programa no se imprimiría el Area.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.. la construcción adecuada es la sentencia for. condición e incremento. while y do-while. condición. cin>>R. expresión_incremento) .Programación C y C++ case '3': cout<<"\n\n Radio:". El programa al no limitar los valores posibles que el usuario puede seleccionar (Validación). break. 2 ó 3. Cualquier sentencia de iteración tiene tres partes importantes que son: Inicialización.RECTANGULO 2. Area=2*3. 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. getch(). • for Cuando se desea ejecutar una sentencia simple o compuesta... calcula el Area con la formula (B*H)/2. } if ((op>='1')&&(op<='3')) cout<<"\n El Area es: "<<Area. 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. repetitivamente un número de veces conocido. puede introducir cualquier otro valor diferente de 1.1416*R*R. } La salida de una ejecución sería: CALCULO DE AREAS 1.TRINGULO 3. 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. SENTENCIAS DE ITERACIÓN Entre las sentencias de iteración se incluyen for. for(exp_inicialización. default:cout<<"\n\n OPCION NO VALIDA". en este punto se interrumpe la secuencia de ejecución de sentencias por la presencia de la instrucción break.

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

for (y=1. pero el ciclo externo incrementa su valor y ejecuta nuevamente el ciclo interno.y++) cout<<x*y<<"\t". } getch().cpp Imprime tabla de multiplicación */ #include <conio. fin2=5. } 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. este proceso se sigue hasta que la condición del ciclo externo se hace falsa. en el siguiente ciclo la condición se hace falsa dándose por terminado el ciclo interno. esto significa que la condición es evaluada antes de entrar a ejecutar las instrucciones dentro del cuerpo del ciclo. int fin1=6. } .y<=fin2. y así hasta que y=5 imprime 5.x++) { cout<<"\n". while (condicion) { instrucción_1. int x.h> #include <iostream. instrucción_2.x<=fin1. 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.y. • while La sentencia while es un ciclo de verificación preliminar. Ejemplo: /*for2.h> void main() {clrscr(). en este caso el ciclo interno se ejecutará totalmente cada vez que se ejecute el ciclo que lo contiene. //Probar con otros valores for (x=1. luego y=2 y se imprime 2.

} while(condición). /*While. y la condición del ciclo se prueba al cabo de la primera iteración.h> void main() {int ini=50. Instrucción_2. } } 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.inc=10.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. es decir al ciclo se entra al menos una vez .h> #include <iostream.cpp Visualiza números en orden descendente */ #include <conio. int x=ini. Como los ciclos do-while se ejecutan como mínimo una vez. x=x-inc.fin=0. do { Instrucción_1. //Inicialización while (x>fin) { cout<<x<<"\t". . es mejor utilizarlos en aquellas aplicaciones en las que se quiere entrar al ciclo.

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

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

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

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; }

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

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

. 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. por esta razón se integran en este capitulo.

Tipo nombre[Tamaño]. En C todos los arreglos constan de posiciones de memoria contiguas.75. ARREGLOS UNIDIMENSIONALES A los arreglos unidimensionales también se les conoce como listas. Tam=sizeof (Salario).75. Ejemplo: float Salario[10].90.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. //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. por tanto el primer elemento de la variable anterior sería Calif[0] y el último elemento Calif[29]. El tamaño puede omitirse cuando se inicializa el arreglo. el tamaño total en bytes se calcula: Tatal en bytes =sizeof(tipo)*tamaño = sizeof(nombre_ arreglo).100}. int Tam. A un elemento específico de un arreglo se accede mediante un índice. 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. Es responsabilidad del programador realizar este tipo de operaciones para no escribir o modificar porciones de memoria que no le pertenecen al arreglo.10}. La cantidad de memoria requerida para guardar un arreglo esta directamente relacionada con su tipo y su tamaño.1. float real[5]={23. .90. es recomendable que el tamaño sea definido como una constante para garantizar no rebasar el límite del arreglo. Tipo nombre[]. Donde: tipo Indica el tipo de datos de los elementos del arreglo. Los arreglos pueden tener una o más dimensiones. En C todos los arreglos tienen el 0 como índice de su primer elemento. El lenguaje C no checa los límites de un arreglo.45. La dirección más baja corresponde al primer elemento y la dirección más alta al último elemento.34. La declaración de la variable anterior hace que el compilador reserve espacio de memoria para almacenar 30 datos de tipo entero. Para un arreglo unidimensional. nombre Es el identificador del arreglo tamaño Especifica el número de elementos del arreglo. Ejemplo: #define N 30 int Calif[N].70.

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

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

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

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

calcula sus promedios.h> #define N 5 #define K 4 void main() . índice (columnas) y el for externo el primer índice (filas). } } El programa utiliza dos ciclos for para asignar valores a cada uno de los elementos del arreglo. int x. Tamaño en bytes=sizeof(tipo)*tamaño del 1er.h> #include <iostream. cont++.x++) for(y=0.y. se puede calcular aplicando la siguiente formula. índice Así la definición int Tabla[5][4]. el aprovechamiento del grupo y visualiza los resultados */ #include <conio. requeriría: 2*5*4 = 40 Bytes de memoria.cont=0.y<K.y++) { Tabla[x][y]=5*cont.cpp Lee las K calificaciones de N alumnos.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.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º. La cantidad de memoria en bytes para almacenar un arreglo bidimensional. el for interno controla el 2º. for (x=0.x<N. Ejemplo: /*A_Bidim2.

for (y=0. de igual forma se puede .y+N+4). cout<<Prom[y]. Suma1=Suma1+Calif[y][x]. } cout<<"\nAprovechamiento : "<<Aprov.y<N.y. for (y=0. int x.x<K. Suma1. Aprov.x++) { gotoxy(x*5+10. for(x=0.56 Programación C y C++ { clrscr().y+2).x<K.y++) { cout<<"\n"<<y+1.x++) { gotoxy(x*5+10. cout<<Calif[y][x].Suma2=0. float Prom[N]. int Calif[N][K]. getch(). cin>>Calif[y][x]. } Prom[y]=Suma1/K. for(x=0. //Aprovechamiento de grupo //Visualización cout<<"\nALUMNO I II III IV Prom". Suma1=0. } gotoxy(x*5+10. } 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. } Aprov=Suma2/N.y+N+4).y++) { cout<<y+1. cout<<"ALUMNO I II III IV\n". si en lugar de 4 unidades se requiere de 5 basta con modificar este valor y todo funciona a la perfección.y<N. //Promedio por alumno Suma2=Suma2+Prom[y].

Normalmente.Una variable apuntando a otra P es una variable de tipo puntero. • Declaración de un Apuntador Una declaración de un puntero consiste en un tipo base. 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. si lo hay depende del compilador.[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. La forma general para declarar una variable puntero es: Tipo * nombre. este último es una variable estática que contiene el carácter ‘A’. Dirección de memoria 2C00 2C01 2C02 2C03 Variable en memoria 2C03 *P Car ‘A’ Figura 3. es decir apunta a la variable Car. en el programa se incluye la instrucción gotoxy() hallado en el archivo de cabecera conio. La forma general de declaración de un arreglo multidimensional es: Tipo nombre[T1][T2][T3].. El límite. El lenguaje C permite arreglos de más de dos dimensiones .000 bytes de memoria para almacenarla.Programación C y C++ 57 modificar el valor de N. Ejemplo: int *P.h para el control del cursor en la pantalla. Requeriría de 2*20*10*5 = 2. . APUNTADORES Un puntero es una variable que contiene una dirección de memoria.. esa dirección es la posición de otra variable de memoria. un * y el nombre de la variable. entonces se dice que la primera variable apunta a la segunda. 1.. en lugar de 5 alumnos puede modificarse a 10. que apunta a la dirección de memoria 2C03H. Ejemplo: Int Tri[20][10][5]. Si una variable contiene la dirección de otra variable.

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

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

se escribe: Arr[2] ó *(Ap+2). } 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.h> #include <iostream.50. int Arr[10]={10.cpp */ #include <conio. por que el nombre de un arreglo sin índice devuelve la dirección de inicio del arreglo. int *Ap.70.60. Ap=Arr. Ejemplo: /*Apunta4. //Apunta al inicio del arreglo *(Arr+2)=999.h> void main() { clrscr(). *Ap.90.80. Para acceder al tercer elemento del arreglo Arr. .40.20. la ventaja del segundo método es que mejora la velocidad. //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. Ap=Arr. Ambas sentencias devuelven el tercer valor.30.x<10. se pueden usar dos métodos: • Que apunte a una variable estática • Asignarle memoria dinámica. contiene un valor desconocido.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. Aquí Ap ha sido asignado a la dirección del primer elemento del arreglo Arr. Un puntero debe ser correctamente inicializado para evitar cualquier problema. probablemente se estrellara no sólo el programa sino también el sistema operativo de la computadora. Si se intenta utilizar el puntero antes de darle el valor . considérese el siguiente fragmento: int Arr[10].x++) cout<<" "<<*(Ap+x).

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

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

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

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

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

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

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

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

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

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

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.Especifica la variable donde va a ser almacenado el valor devuelto por la función. dentro de la función se realiza el calculo y el resultado se retorna. &y). La llamada a la función Area_Triang envía como argumentos los valores 10 y 15.15).y=50.. Los valores resultantes son pasados a la función y asignados a sus correspondientes parámetros. La llamada por referencia copia la dirección del argumento en el parámetro.h> #include <iostream. 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.h> void Intercambio(int *A. Esto significa que los cambios hechos a los parámetros afectan a la variable usada en la llamada a la función. Dentro de la función se usa la dirección para acceder al argumento usado en la llamada. Ejemplo: A=Area_Triang(10.cpp */ #include <conio.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. //Llamada por referencia //Imprime 50 10 . De esta forma . La llamada puede prescindir del valor devuelto por la función. Lista de argumentos. void main() { int x=10. los cambios en los parámetros en la función no afectan a las variables que se usan en la llamada. Ejemplo: /*Referen. asignándosele a la variable A.. el número de argumentos debe ser igual al número de parámetros definidos en la función. cout<<x<<" "<<y. Intercambio(&x.Es la lista de expresiones separados por comas. int *B).

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

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

al finalizar la estructura lleva .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).. Tipo variable3. cuando se crean los arreglos por defauld se inicializan con el valor de 0 para cada uno de sus elementos. Etiqueta. la más común es como un puntero. 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. . ahora ya tiene asignado valores. Cada elemento de una estructura recibe el nombre de Dato miembro. enviando como argumento el arreglo SalDia (la dirección de su primer elemento). esto se permite porque cualquier puntero se puede indexar usando [] como si fuese un arreglo. dentro de la función se le asigna por el usuario desde teclado valores a cada uno de sus elementos. Tipo variable2. }. al retornar de la función el arreglo SalDia. ESTRUCTURAS Una estructura es un conjunto de datos relacionados entre sí y referenciado bajo un único nombre. que índica que es el final de la sentencia. Ejemplo: Supóngase que se desea contar con información de los alumnos de una Institución: . De las tres formas que se puede declarar un parámetro que va a recibir un puntero a un arreglo. estas variables son locales a la función principal por lo que no pueden ser vistas desde otra función. . Sintaxis para la definición de una estructura: struct etiqueta{ Tipo varible1. ambos arreglos son enviados como argumento a la función Calcular().Es un identificador de la estructura que va a representar un nuevo tipo de datos definido por el programador. . 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. mientras que el arreglo SalSem aun no. 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. La primera función que se llama es la función Leer(). en el interior se definen cada uno de los datos miembros (variables).

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

Ciudad."95190205").h> #define N 5 struct Alumnos{ char N_Ctrl[9]. cout<<"\n"<<A. Para acceder a una determinada estructura .N_Ctrl. getch(). char. Alumnos A. cout<<"\n"<<A. Para declarar un arreglo de estructuras.Ciudad. Ejemplo: Alumnos Al[5]."Av. 37").h> #include <iostream. /*Estruct2.cpp*/ #include <stdio. Ejemplo: Al[2].N_Ctrl. //Visualización cout<<"\Los datos del alumno son :". } ARREGLOS DE ESTRUCTURAS De la misma forma que se pueden crear arreglos con los tipos de datos básicos de C (int. Se declara un arreglo de estructura de 5 elementos del tipo Alumnos. 5 de Mayo No.Nom.Edad=20.76 }. se indexa el nombre de la estructura .h> #include <conio. cout<<"\n"<<A.Edad=19.Dir. cout<<"\n"<<A."). //definición de la estructura . A. strcpy(A. //Definición de una variable estructura //Asignación de datos strcpy(A. strcpy(A. Oax. Programación C y C++ void main() { clrscr()."Sanchez L¢pez Juan"). float) tambien se pueden crear arreglos de estructura.Dir. 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. 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."Juchitan.Nom.Edad. strcpy(A. cout<<"\n"<<A.

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

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

int Cant. ahora se utiliza el operador -> . 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. getch(). } //Parámetro por valor El ejemplo Estruct4.cpp hace exactamente lo mismo que el ejemplo Estruct3. Pr->Pr_unid=1080. void Visualizar(Producto Pr)."Tarjeta Madre Pentium III").Pr_unid. cout<<"\n"<<Pr. en . }. Visualizar(P). Leer(&P). no abría necesidad del pase de parámetros a la función. } 79 //Definicón de la variable de estructura void Leer(Producto *Pr) //Parámetro por referencia { strcpy(Pr->Prod.Prod. se define como un apuntador.Programación C y C++ float Pr_unid. Observe la forma en que se define el parámetro de estructura en la función Leer().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. para acceder a un dato miembro de la estructura en lugar de utilizar el operador . Producto P. //Arreglo de estructura //Llamada por referencia Se supone que la estructura Alumnos fue previamente definido así que A es un arreglo de estructura. se define como variable global. void Leer(Producto *Pr). es decir mediante una llamada por referencia. Cuando se trate de una arreglo de estructura. cout<<"\n"<<Pr. void main() { clrscr(). Ejemplo: Alumnos A[10]. al usar únicamente el nombre del arreglo sin índice. Obviamente que si una variable de estructura en lugar de que sea definido como variable local. Pr->Cant=5. Altas(A). es mediante una llamada por referencia.Cant. la única forma de pasar la variable como argumento. } void Visualizar(Producto Pr) { cout<<"\n"<<Pr.

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

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

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

Programación C y C++ } 83 .

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

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

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

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

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

la mayoría de lenguajes de programación actuales utiliza esta técnica. de aquí la importancia de conocerlo. . En esta unidad y el siguiente se abordan los conceptos básicos para poder utilizarlo.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.

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

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

como se muestra en la siguiente tabla.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. 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. se puede establecer la relación entre los tipos de usuarios y los tipos de acceso. 2. independientemente del tipo de acceso. 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. Los usuarios que son considerados como la propia clase tendrán privilegios sobre todos los datos y funciones miembros de la clase.. tal es el caso de la función main() o cualquier otra que se utilice en el programa como complemento del mismo.Publico public Tabla 5.Privado private 2.. RELACIÓN ENTRE USUARIOS Y TIPOS DE ACCESOS Una vez que se conocen los diferentes tipos de usuarios y los tipos de acceso..Relación entre usuarios y tipos de accesos La tabla se puede interpretar de la siguiente forma. finalmente una función que no pertenezca ni a la propia clase ni a una clase derivada se le conoce como usuario genérico. Tipo de Acceso Tipos de Usuarios La propia Clase Clases derivadas Usuarios gener. 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.. * Private * * Protected * * * Public Tabla 5.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 .

La implementación dentro de la definición de la clase se realiza inmediatamente después de definir la función. } En la definición de la clase Empleado al principio no se define ningún tipo de acceso.120). Ejemplo: /*Clase. void Calcular(). incluyendo la función main(). finalmente los usuarios genéricos tendrán privilegio sobre los datos y funciones miembros que tengan el tipo de acceso public. }.float S). significa poder usarlos. float Salario. mientas que un implementación independiente se realiza fuera de la definición de la clase siguiendo la siguiente regla de sintaxis: .Programación C y C++ 93 public. //falta implementación de funciones miembros void main() { Empleado E. Las funciones Asignar() y Calcular() tienen el tipo de acceso public. Para poder tener el privilegio se requiere definir un tipo de acceso public. 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. 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. 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.cpp */ class Empleado{ char Nom[40]. es decir se pueden acceder desde cualquier parte del programa.Asignar("Juan Pérez". 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. public: void Asignar(char *N. E. 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. 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.

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

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

f1(&P. friend class nombre_clase..96 Programación C y C++ /*AmigaF. .} friend void f1(Prueba *Obj. Prueba P. entonces la segunda clase debe definirse como amiga de la primera.cpp */ #include <conio.. cout<<P. } . Este es solo un mecanismo para conceder con todos los derechos sobre los datos y funciones miembros privados y públicos de la clase. public: int Verz(){return z. 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. //Implementación de función amiga void f1(Prueba *Obj. Las razones fundamentales para utilizar funciones amigas es que algunas funciones necesitan acceso privilegiado a más de una clase. } void main() { clrscr().Verz(). precisamente porque una función amiga no es una función miembro de la clase.h> class Prueba{ int z. Sintaxis: Classs Nombre_clase{ . int a) { Obj->z=a.. 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. 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.. getch(). Si todas las funciones miembro de una clase son funciones amigas de una segunda clase. } //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.20).int a). }.h> #include <iostream.

public: void asignac(int c){Cont=c.} }. A un dato miembro estático se le asigna una zona fija de almacenamiento en tiempo de compilación.verv(). se observa que la salida del programa muestra el mismo . } 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.d2.} void asignav(int x){v=x.verc().verv()<<"\t"<<d2. al igual que una variable global. cout<<"\n"<<d1. //Dato miembro estático int v. int Datos::Cont. Para definir un dato miembro estático se le antepone a la definición de la variable la palabra reservada static. Datos d1. d2. cout<<d1.asignac(10).asignav(500).} int verv(){return v.cpp */ #include <conio.} int verc(){return Cont. Una clase amiga debe ser declarada antes de que se pueda ser designada como amiga. //Definición del dato miembro estático void main() { clrscr().verc()<<"\t"<<d2.asignac(20).asignav(255).h> #include <iostream. d2.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. por ello se debe definir fuera de la clase. d1. Ejemplo: /*Estatic.h> class Datos{ static int Cont. 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 . //Creación de dos objetos d1. existe incluso si se define ningún objeto de esa clase.

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

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<<"³"; }

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

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

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

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

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

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.

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

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

112 Programación C y C++ Una clase derivada hereda todos los datos y funciones miembros de la clase base excepto los siguientes: 1. Funciones amigas 4.} //Error No encontrado void Ver(){cout<<b<<" "<<d. 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. } */ void main() { Derivada Obj(30. public: Base(int x){b=x.cpp */ #include <conio.} }.} }. pero el compilador detecta el error por no poder encontrarlo. 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 . Obj. class Derivada:public Base{ int d. } En la implementación del constructor de la clase Derivada. Ejemplo: /*NoHeren.d=y. int y){Base(x). Destructores 3. Constructores 2.50).Ver(). se intenta llamar al constructor de la clase Base. Funciones estáticas 5.h> #include <iostream. int y):Base(x) { d=y.h> class Base{ protected: int b. /*Forma correcta de poder llamar a un constructor de una clase base Derivada::Derivada(int x. public: Derivada(int x.

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

. Este problema puede tener dos soluciones. } La clase A contiene el atributo a1 que se hereda por separado a las clases B y C.} //Error de ambigüedad }. El compilador no sabría cual es la copia que se estaría referenciando. class D:public B. es por eso que el compilador detecta el error en la función Asignar(). class C:public A{ }.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. Ejemplo: /*Pro_Mul. public C{ public: void Asignar(int x){a1=x. Obj.h> #include <iostream. void main() { D Obj. }.Asignar(10). hasta aquí todo esta bien. 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.cpp */ #include <conio. class B:public A{ }.h> class A{ protected: int a1. sin embargo cuando la clase D hereda de las clases B y C el atributo a1 se hereda por duplicado. provocando que los atributos de A se creen por duplicado.

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

}. public B{ Protected: Int e1. b)..a2. }. }. 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.f2 G g1 a). }..Atributos de los Objetos A a1 a2 B b1 C c1 class E: virtual public A.a2 B b1 C c1 D d1 E e1 F f1. }. public E. class D: virtual public A { protected: int d1.Descripción de un problema real 2. class F: public C{ Protected: Int f1..116 Programación C y C++ A a1.. public F{ Int e1. }.Obtención de los objetos que existen en el dominio del problema 3. aunque el orden no es el apropiado. class B{ protected: int b1. }.f2. class C{ protected: int c1. • Pasos para el desarrollo de un Programa Orientada a Objetos 1. class G: public D.Definición de clases class A{ protected: int a1.Definición de los miembros de cada objeto ..

El orden en que se ejecutan los constructores de las clases bases. Por ejemplo se puede tener una lista de los posibles objetos que pueden aparecer en la pantalla. Circulo.Desarrollo del árbol de herencia 5. para visualizar cualquiera de ellos basta con . el constructor de la clase base se llama siempre antes que el constructor de la clase derivada.Base2(w) Aquí se llama al constructor Base1 y se le pasa el valor entero x y el constructor Base2 el valor entero w. Sin embargo la respuesta al mensaje area será diferente para cada uno de los objetos. int y. cuyos objetos representan las figuras geométricas.. Por ejemplo. los constructores de la clase base se llaman antes que se ejecute el constructor de la clase derivada.Definición e implementación de clases y funciones miembros 6. Cilindro. es el orden en que están listados en la declaración de la clase derivada. 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. supóngase que se dispone de las clase Rectángulo. Al igual que con herencia simple.. Triangulo. por lo pronto se continuará con las bases. Una característica esencial del polimorfismo es que se pueden enviar mensajes sin conocer la clase de objeto recipiente.. 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. 117 Al finalizar este capitulo se presenta un ejemplo. 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. Derivada::Derivada(int x. 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.Aplicación que use las clases. este método se amplía de un modo lógico para el caso de clases base múltiples. Derivada::Derivada(int x. En el ejemplo anterior primero se ejecuta Base1 y luego Base2. CONSTRUCTORES Y DESTRUCTORES EN CLASES DERIVADAS Al crear clases derivadas con una sola clase base. int w):Base1(x). El destructor de la clase derivada se llama primero que el destructor de la clase base. La relación entre el destructor de la clase derivada y el destructor de la clase base se mantiene.Programación C y C++ 4.

Esto permite que una función se comporte de una forma u otra dependiendo de los argumentos. En C++. float B){return A+B. permitiendo sumar dos enteros. "Amigo"). cout<<"\n"<<M.h> #include <iostream. } La salida del programa es 30 60. char *B){strcat(A.Sumar(10.h> class Matematico{ public: int Sumar(int A.Sumar("Hola ". int B){return A+B. dos reales ó concatenar dos cadenas.200001 Hola Amigo En la clase Matemático se define la función Sumar() sobrecargada (tres veces).3. Al permitir que una clase tenga más de un constructor es un caso de sobrecarga de funciones. void main() { Matematico M.h> #include <conio. 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. de aquí el comportamiento polimórfico.9. cout<<"\n"<<M. el polimorfismo se implementa por medio de sobrecarga de funciones y con funciones virtuales.} char * Sumar(char *A.return A. 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.} }. sin tener que preocuparse de cada objeto de la lista.B).Sumar(f1.f2=34.20). .118 Programación C y C++ enviar el mensaje Show() para que se visualice.cpp */ #include <string. cout<<"\n"<<M.} float Sumar(float A.f2). así la función que se llame será el que coincida con número y tipo de argumento. float f1=25. Ejemplo: /*Sob_Fun.

Cilindro Altura. public: Circulo(int r){Radio=r. virtual float Area(). conteniendo las funciones virtuales y el comportamiento polimórfico. class Cilindro:public Circulo{ int Altura. 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).cpp */ #include <conio. Supóngase que se desea un programa para calcula el área de círculos y cilindros. public: Cilindro(int r.} . si se desea ligadura dinámica se debe preceder a la declaración de la función la palabra reservada virtual. virtual float Area(). Figura 6.. las funciones tienen ligadura estática.Funciones virtuales El programa completo se muestra en el siguiente listado. int h):Circulo(r){Altura=h.Programación C y C++ 119 En C++ por defecto. virtual float Area() La ligadura dinámica tiene sentido en C++. 3.} }.} //Constructor float Area(){return(2*PI*Radio*Altura +2*PI*Radio*Radio). /*Polimor.} //Constructor virtual float Area(){return(PI*Radio*Radio). Circulo Radio.1416 class Circulo{ protected: int Radio.h> #include <iostream.h> #define PI 3.

(en la clase base).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. Desde el punto de vista del lenguaje . //Objeto Cilindro cout<<"Area del Circulo: "<<Area(C).120 }. Una función virtual pura es aquella cuya declaración no está seguida por una implementación. que la clase base no puede implementar y que se inicializan a cero. //Imprime 78. Sintaxis: Virtual void func_pura()=0. //Imprime 314. 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. CLASES ABSTRACTAS Una clase abstracta es aquella que sólo se puede utilizar como clase base.5). partiendo del echo de que las funciones virtuales que existan en el árbol de herencia solamente se debe definir en la clase base. C++ determina en tiempo de ejecución a qué función llamar en función del tipo de objeto apuntado. 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. El uso de una clase abstracta no es estrictamente necesaria. no se puede utilizar para declarar objetos. //Objeto Circulo Cilindro Cl(10.54 cout<<"\nArea del Cilindro: "<<Area(Cl). . Una clase abstracta se utiliza en los casos donde exista polimorfismo. Las funciones virtuales. es decir. son especiales ya que cuando se accede a una de ellas usando una referencia a un objeto de una clase derivada. Programación C y C++ //función que proporciona el comportamiento polimórfico float Area (Circulo Obj) { return(Obj. //Según el objeto recibido es la función } // que se llama void main() { Circulo C(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.Area()). una clase es una clase abstracta si tiene al menos una función vitual pura.

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

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

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

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

Dibujar().8. . //Dibuja Rell. Car=c. Leer().k).char c) { Rect::Asignar(x.Programación C y C++ gotoxy(x. //Objeto RecRell Rell. TEventual HonoHra.int k.y.int y. PagarSalario().Asignar(10. Visualizar().cout<<Car. Visualizar().Resuelva el siguiente problema.16. R.Asignar(50. Visualizar(). 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.177). aplicando los pasos para el desarrollo de un programa orientado a objetos: Una empresa desea generar fichas de su personal de base y eventual. //Dibuja Rell. PagarSalario(). Rect R. int j.Dibujar(). } de la clase Rect de la clase RecRell un rectángulo un rectángulo rellenado 2. Ant.16). 125 } } void RecRell::Asignar(int x.j. TBase SalDía.70.30..Dibujar(). //Objeto R. Leer(). } void main() { clrscr().8. Dir. Leer(). Trabajador Nom. Rell.y).

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

PagarSalario(). //*8d hrs * 7 días cout<<"\nSalario semanal: "<<SalSemanal. B. cout<<"\n"<<SalDia. } . } void TEventual::Visualizar() { cout<<"\nTRABAJADOR EVENTUAL". } 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". Trabajador::Visualizar(). cin>>Ant.02*SalDia*7. cout<<"\n"<<Ant. } void TBase::PagarSalario() { float SalSemanal. //Objeto Trabajador Eventual B. } void TBase::Visualizar() { cout<<"\nTRABAJADOR DE BASE". } void TEventual::PagarSalario() { float SalSemanal. Trabajador::Leer().Leer(). B.Leer(). E. } // Programa principal void main() { TBase B. cin>>HonoHra. Trabajador::Visualizar(). cout<<"\nSalario semanal: "<<SalSemanal.PagarSalario(). E. SalSemanal=SalDia*7 + Ant*0.Programación C y C++ cout<<"AÑOS DE SERVICIO: ". cout<<"SALARIO POR HORA: ". SalSemanal=HonoHra*8*7. E. //Objeto Trabajador de Base TEventual E.Visualizar(). cout<<"\n"<<HonoHra.Visualizar().

}. class Der2: public Base{ private: int d1. }. }. class D: public Der2{ int d2. }.public Der2{ private: int b2.public Der1{ int a2. 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. class Der1:public virtual Base{ private: int a1.. }. . class B: public Der1. }.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 A:public Base.128 Programación C y C++ 3. }. class C: public B{ int c2.

Proponer un problema y resolverlo aplicando los pasos para el desarrollo de un programa orientado a objetos.Cual es la salida en pantalla del programa RectRell. | .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.Programación C y C++ 129 EJERCICIOS PROPUESTOS 1. 5....cpp te tal forma que se utilice polimorfismo mediante funciones virtuales (Deberá proporcionar la misma salida en pantalla).cpp 2.Muestre un ejemplo de la salida en pantalla del programa Trabaj.Modifique el ejercicio resuelto Trabaj... 4.

You're Reading a Free Preview

Descarga
scribd
/*********** DO NOT ALTER ANYTHING BELOW THIS LINE ! ************/ var s_code=s.t();if(s_code)document.write(s_code)//-->