Escolar Documentos
Profissional Documentos
Cultura Documentos
Programacin
Lenguaje C y C++
Programacin C y C++
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
Programacin C y C++
Contenido
1.- Introduccin al Lenguaje C
Historia del lenguaje
Estructura de un programa
Compilacin 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 Seleccin
Sentencias de Iteracin
Sentencias de Salto
Ejercicios
3.- Arreglos y Apuntadores
Que son los arreglos
Arreglos Unidimensionales
Cadenas
Arreglos Bidimensionales
Apuntadores
Punteros y Arreglos
Inicializacin de Apuntadores
Funciones de Asignacin Dinmica
Ejercicios
4.- Funciones y Estructuras
Funciones
Pase de parmetros
Estructuras
Arreglos de Estructuras
Ejercicios
5.- Programacin Orientada a Objetos
Que es la POO
Definicin de una clase
Tipos de Accesos a una clase
Tipos de Usuarios
Relacin entre Usuarios y Tipos de Accesos
Clases Amigas
Datos Estticos
Constructores y Destructores
Programacin C y C++
Ejercicios
Programacin C y C++
Prologo
Este libro puede ser utilizado como gua para el examen de admisin de la
Maestra en Informtica que el Instituto en Computacin y Electrnica
Dehesa ofrece en lo que se refiere a Programacin.
Este libro esta organizado de la siguiente forma: En los cuatro primeros
captulos se aborda la programacin estndar y en los captulos 5 y 6 los
conceptos bsicos de la programacin orientada a objetos.
Cada tema expuesto viene acompaado de uno o ms ejercicios, el nombre del
archivo aparece como comentario al inicio de cada listado de programa. Los
programas que contiene el libro fueron probados usando compiladores de
Borland.
En archivo empaquetado que acompaa al libro encontrar un directorio por
cada unidad con los ejercicios desarrollados.
Espero que al terminar de leer este libro se cubran las expectativas planteadas,
cualquier comentario o sugerencia acerca del contenido del material lo puede
hacer a la siguiente direccin de correo electrnico: gastondv@hotmail.com
Programacin C y C++
Capitulo 1
Introduccin al Lenguaje C
Programacin C y C++
Programacin C y C++
ESTRUCTURA DE UN PROGRAMA
Un programa escrito en lenguaje C tiene la siguiente estructura, aunque no
necesariamente debe contener todos los puntos:
1.- Definicin de archivos de cabeceras
2.- Definicin de constantes y variables globales
3.- Definicin de Funciones del usuario
4.- Definicin e implementacin del programa principal ( main() )
5.- Implementacin de funciones del usuario.
A manera de ejemplo considrese el siguiente programa:
//*Est_Prog.cpp
//Definicin de archivos de cabecera
#include <conio.h>
#include <stdio.h>
//Definicin de Constantes y Variables Globales
#define PI 3.1416
float Area;
//Definicin de funciones del usuario
void Area_Cir(int R);
//Definicin e implementacin del Programa Principal
void main()
{int Radio;
clrscr();
printf("BIEN BENIDO AL LENGUAJE C");
printf("\n\n CALCULO DEL AREA DE UN CIRCULO");
printf("\n Radio: ");
scanf("%i",&Radio);
Area_Cir(Radio);
printf("\n El Area es; %8.2f",Area);
getch();
}
//Implementacin de funciones del Usuario
void Area_Cir(int R)
{
Area= 2*PI*R*R;
}
Programacin C y C++
10
Programacin C y C++
11
Programacin C y C++
COMPILACIN Y LIGADO
Archivo2.cpp
stdio.h
conio.h
COMPILACION
Cl.lib
Princip.obj
Archivo2.obj
Mathl.lib
LIGADO
Extern.exe
Archivo de Librera
Binario
Tiempo de ligado
Implementaciones
compiladas
12
Programacin C y C++
Programacin C y C++
13
# de Bits
Intervalo
8
0 a 255
8
-127 a 127
16
0 a 65535
16
Lo mismo que int
16
-32,768 a 32,767
32
0 a 4,294,967,295
32
-2,147,483,648 a 2,147,483,647
32
3.4E-38 a 3.4E38
64
1.7E-308 a 1.7E308
14
Programacin C y C++
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,294,967,295
16
-32,768 a 32,767
32
-2,147,483,648 a 2,147,483,648
32
Lo mismo que unsigned int
32
Lo mismo que int
32
1.2E-38 a 3.4E381
64
2.2E-308 a 1.8E3082
Programacin C y C++
15
Variables
Es una posicin de memoria de cierta longitud segn el tipo de dato cuyo
valor puede ser modificado a lo largo de la ejecucin de un programa .
Sintaxis:
[clase] tipo identificador[,identificador];
Donde:
clase representa un especificador de clase de almacenamiento (se
explica posteriormente).
tipo determina el tipo de variable (char, int, float, etc.)
identificador Indica el nombre de la variable.
Una variable que se declara al inicio del programa es considerada
como variable global y es accesible desde cualquier parte del programa. Por
lo contrario una variable declarada dentro de una funcin se considera como
variable local y es accesible solamente dentro de este.
Cada variable de un programa, debe declararse antes de ser utilizada.
La declaracin consiste en enunciar el nombre de la variable y asociarle un
tipo. El tipo determina los valores que puede tomar as como las operaciones
que con ella pueden realizarse.
Ejemplos:
int Suma, Promedio;
char Car, Nombre[40];
16
Programacin C y C++
OPERADORES
Los operadores se utilizan para manipular datos: ejecutan clculos, buscan
igualdades, realizan asignaciones, trabajan con variables y se encargan de
muchas otras tareas que los programadores nunca llevan a cabo. En la
siguiente tabla se presentan los de uso ms comn .
Operador
Descripcin
Ejemplo
OPERADORES ARITMTICOS
+
Adicin
x=x+z;
Sustraccin
x=x-z;
*
Multiplicacin
x=x*z
/
Divisin
x=x/z;
%
Modulo o resto
x=x%z;
OPERADORES LGICOS
&&
AND Lgico
if (x&&0xFF)
||
OR Lgico
if (x||0xFF)
NOT Lgico
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.
::
Resol. de alcance
Punto::Dibujar()
->
Miembro indirecto P->Dibujar();
.
Miembro directo
P.Borar();
Operador
Descripcin
Ejemplo
OPERADORES DE ASIGNACIN
=
Asignacin
x=10;
+=
Asignar y sumar
x+=10;
-=
Asignar y restar
x-=10;
*=
Asignar y multiplicar x*=10;
/=
Asignar y dividir
x/=10;
&=
Asig. operador AND x&=0x02;
|=
Asignar operador OR x|=0x02;
OPERADORES A NIVEL DE BITS
&
AND a nivel de bits
C=A&B;
|
OR a nivel de bits
XOR a nivel de bits
C=AB;
<<
Desp. a la izquierda
B=A<<3;
>>
Desp. a la derecha
C=A>>2;
~
NOT a nivel de bits
A=~D;
OPERADORES DE APUNTADORES
*
Indireccin
Int *Ap;
&
Direccin
x=&Ap;
OTROS
++
Incremento
x++;
-Decremento
x--;
17
Programacin C y C++
Prioridad y orden de Procedencia
Operadores
() [] -> :: .
! ~ ++ -- & *
* / %
+ << >>
< <= > >=
= !=
&
|
&&
||
= *= -= *= %= < <= > >= &= = |=
,
Asociatividad
Izquierda Derecha
Derecha . 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
8*6/4
48/4
12
3*6/4
18/4
4
28/(3*4)
28/12
2
18
Programacin C y C++
Formato
%c
Carcter
%d
%i
%e
Notacin cientfica
Programacin C y C++
%f
Punto flotante)
%h
Entero corto
%o
%s
Cadena de caracteres
%x
19
Accin realizada
Alarma
Retroceso
Avance de pagina
Nueva Linea
Retorno de carro
Tabulacin (horizontal)
Tabulacin (vertival)
Barra inclinada
20
Programacin C y C++
/*ES-Estan.cpp
Muestra el uso de las funciones printf() y scanf()
*/
#include <conio.h>
#include <stdio.h>
void main()
{char Nom[40];
int Edad;
float Peso;
clrscr();
printf("IDENTIFIQUESE POR FAVOR");
printf("\n\n NOMBRE: ");
scanf("%s",Nom);
printf("\n EDAD: ");
scanf("%i",&Edad);
printf("\n PESO: ");
scanf("%f",&Peso);
printf("\n\n SUS DATOS SON: ");
printf("%s %i %4.2f",Nom,Edad,Peso);
getch();
}
La Salida del programa despus de ejecutarla sera:
IDENTIFIQUESE POR FAVOR
NOMBRE: Juvenal
EDAD:
36
PESO:
50.4
SUS DATOS SON:
Juvenal
36
50.40
Observe que al leer las variables Edad y Peso de tipo entero y real
respectivamente se utiliza el operador & que indica direccin, mientras que la
variable Nom que es un arreglo de caracteres (cadena) no lo requiere, la
funcin printf() hace uso frecuentemente de la secuencia de escape \n para
cambiar de lnea, por ejemplo el penltimo printf() hace que se deje una lnea
en blanco.
Existen en el archivo de cabecera stdio.h una serie de funciones que
permiten especficamente leer y escribir datos de tipo carcter y cadena, no es
la finalidad de este libro profundizar en este tema ms sin embargo se
considera necesario conocer de su existencia. En la siguiente tabla se
sintetizan:
Funcin
getchar()
getche()
getch()
putchar()
gets()
puts()
Operacin
Lee un carcter del teclado; espera un salto de carro.
Lee un carcter con eco; no espera un salto de carro.
Lee un carcter sin eco; no espera un salto de carro.
Escribe un carcter en pantalla.
Lee una cadena del teclado.
Escribe una cadena en pantalla.
Programacin C y C++
21
void main()
{char Nom[40];
int Edad;
float Peso;
clrscr();
cout<<"IDENTIFIQUESE POR FAVOR";
cout<<"\n\n NOMBRE: ";
cin>>Nom;
cout<<"\n EDAD: ";
cin>>Edad;
cout<<"\n PESO: ";
cin>>Peso;
cout<<"\n\n SUS DATOS SON: ";
cout<<Nom<<" "<<Edad<<" "<<Peso;
getch();
}
La Salida del programa despus de ejecutarla sera identica al
a salida del programa ES-Estan.cpp
22
Programacin C y C++
Donde:
Cadena es cualquier arreglo de caracteres que se haya definido con
anterioridad y que contiene la cadena de entrada.
Num es el nmero mximo de caracteres que desea leer con getline()
Ejemplo:
cin.getline(Nom, 40); //Se puede almacenar hasta 40 caracteres en Nom
extern
Programacin C y C++
23
/*Archivo2.cpp proyecto:exten.prj
*/
#include <conio.h>
#include <iostream.h>
float Prom;
void Promedio();
void Promedio()
{int C1,C2,C3;
cout<<"\nESCRIBA LAS 3
CALIFICACIONES DEL ALUMNO";
cout<<"\n\nI UNIDAD:
";
cin>>C1;
cout<<"\nII UNIDAD:
";
cin>>C2;
cout<<"\nIII UNIDAD: ";
cin>>C3;
Prom=(C1+C2+C3)/3;
}
void main()
{
clrscr();
cout<<"\nCALCULO DEL PROMEDIO DE
CALIFCACIONES";
Promedio();
cout<<"\n\nEl Promedio es:
"<<Prom;
getch();
}
La Salida del programa despus de ejecutarla sera:
CALCULO DEL PROMEDIO DE CALIFCACIONES
ESCRIBA LAS 3 CALIFICACIONES DEL ALUMNO
I UNIDAD: 80
II UNIDAD: 90
III UNIDAD: 100
El Promedio es: 90
24
Programacin C y C++
Creacin de Proyectos
En la mayora de los ambientes de programacin modernos se considera este
mtodo, los pasos a seguir diferirn unos de otros dependiendo del fabricante
y versin, a manera de ejemplo se explicar como se lleva a cabo la creacin
de proyectos usando el Software de Borland ver. 1.0 para MS-DOS, para
poder compilar y enlazar de manera directa y transparente para el
programador el programa Extern.prj. El nombre que se le da a un proyecto
ser el mismo que tendr el programa ejecutable despues de su compilacin y
ligado. Pasos:
1.- Crear un directorio de trabajo estando en el directorio del compilador
C:\tc>md ejerc-I
Programacin C y C++
25
static
Las varibles static son variables permanentes dentro de una funcin o archivo
segn si se declaran como locales o globales respectivamente.
Variables static locales
Cuando se aplica el modificador static a una variable local, el compilador crea
un almacenamiento permanente para ella de forma muy parecida que cuando
crea almacenamiento para una variable global. La diferencia clave entre una
variable local static y una variable global es que la variable local static es
una variable local que retiene su valor entre llamadas de funciones.
Ejemplo:
/*Estatic1.cpp */
#include <conio.h>
#include <iostream.h>
void serie();
void main()
{int x;
clrscr();
for (x=0;x<5;x++)
serie();
getch();
}
26
Programacin C y C++
void serie()
{static int cont=0;
//Variable Local
cont=cont+10;
cout<<"\t"<<cont;
}
La salida de este programa ser:
10
20
30
40
50
static
/*Staticg2.cpp, Static.prj */
#include <conio.h>
#include <iostream.h>
void Inicia_Semilla(int i)
{
cont=i;
}
int serie()
{
cont=cont+10;
return(cont);
}
Programacin C y C++
27
28
Programacin C y C++
EJERCICIOS RESUELTOS
1.- Usando la entrada salida estndar escribir un programa que calcul el rea
de un triangulo a partir de su base y altura usando la formula:
Area=(Base*Altura)/2.
/* Area.cpp */
#include <stdio.h>
#include <conio.h>
void main ()
{
float Altura,Base,Area;
clrscr();
printf ("CALCULA EL AREA DE UN TRIANGULO.");
printf("\n\nTECLEE LA BASE:
");
scanf("%f",&Base);
printf("\nTECLEE LA ALTURA: ");
scanf("%f",&Altura);
Area=(Base*Altura)/2;
printf("\nEl EL AREA ES: %8.2f", Area);
printf("\nPRESIONE <ENTER> PARA TERMINAR");
getch();
}
Programacin C y C++
29
a 2 + b 2.
/* Hipotenu.cpp */
# include <iostream.h>
# include <conio.h>
# include <math.h> //Por las funciones matemticas
void main ()
{
float A, B, C;
clrscr();
cout<<"CALCULO DE LA HIPOTENUSA";
cout<<"\n CATETO A:" ;
cin>>A;
cout<<"\n CATETO B:";
cin>>B;
C= sqrt (pow(A,2)+pow(B,2));
30
Programacin C y C++
Kelvin=Celsius+273,
Rankine=Fahrenheit+460.
/*Fahrenhe.cpp */
# include <iostream.h>
# include <conio.h>
void main ()
{
float Fahr, Celsius, Kelvin, Rankine;
clrscr();
cout<<"\n CONVIERTE GRADOS FAHRENHEIT A CELSIUS, KELVIN, Y
RANKINE.";
cout<<"\n GRADOS FAHRENHEIT:";
cin>>Fahr;
Celsius= (Fahr-32)*5/9;
Kelvin=Celsius+273;
Rankine=Fahr+460;
cout<<"\n EQUIVALENCIA A GRADOS ";
cout<<"\n CELSIUS : "<<Celsius;
cout<<"\n KELVIN : "<<Kelvin;
cout<<"\n RANKINE : "<<Rankine;
getch();
}
6.- Utilizando el especificador extern, escriba un programa compuesto por 2
/*Venta2.cpp
proyecto: Venta.prj */
#include <conio.h>
#include <iostream.h>
#include <conio.h>
#include <iostream.h>
float Vta;
void func1();
void main()
{
clrscr();
func1();
cout<<"\n EL TOTAL DE
VENTAS ES:$ "<<Vta;
getch();
}
//Variable
void func1()
{
float a,b,c;
cout<<"INTRODUSCA LOS PRECIOS DE
LOS 3 PRODUCTOS:";
cout<<"\n\nPRIMER PRODUCTO: ";
cin>>a;
cout<<"\nSEGUNDO PRODUCTO:";
cin>>b;
cout<<"\nTERCERO PRODUCTO:";
cin>>c;
Vta=a+b+c;
}
Programacin C y C++
31
/* Banco2.cpp
Proyecto: Banco.prj */
# include <conio.h>
# include <iostream.h>
# include <iostream.h>
extern float Inversion, Interes;
float Inversion,Interes,Deuda;
void Calcula();
void Calcula2();
void Calcula()
{
float Taza;
int N;
cout<<"\nINVERSION :";
cin>>Inversion;
cout<<"\nTAZA DE INTERES : ";
cin>>Taza;
cout<<"\nCUANTOS AOS: ";
cin>>N;
Interes=Inversion*Taza*N;
}
void main()
{
clrscr();
cout<<"CALCULO DE INTERESES\n\n
";
Calcula();
Calcula2();
cout<<"\nLOS INTERESES SON :
"<<Interes;
cout<<"\n\nLA DEUDA SERIA :
"<<Deuda;
getch();
}
// Banco3.cpp
Proyecto: Banco.prj
extern
float Inversion,Interes,Deuda;
void Calcula2()
{
Deuda=Interes+Inversion;
}
32
Programacin C y C++
EJERCICIOS PROPUESTOS.
1. Elaborar un programa que calcule e imprima el costo de un terreno
cuadrado o rectangular, teniendo como datos la anchura, la longitud en
metros, y el costo del metro cuadrado.
2. Una temperatura en grados centgrados (C) se puede convertir a su
equivalente Fahrenheit (F) con la frmula:
F = 9/5 C + 32 .
Elaborar un programa que lea una temperatura en grados centgrados
y obtenga e imprima la temperatura Fahrenheit equivalente.
3. Elabore un programa que lea un nmero de pies y calcule e imprima su
equivalente en yardas, pulgadas, centmetros y metros, de acuerdo con
las siguientes equivalencias:
1 pie = 12 pulgadas, 1 yarda = 3 pies, 1 pulgada =2.54 cms. , 1 metro =
100 cm.
4. Elaborar un programa que lea el artculo y su costo; la utilidad es el
200% y el impuesto es el 15%; calcular e imprimir el artculo, utilidad,
impuesto y precio de venta.
5. Elaborar un programa que lea dos nmeros enteros y positivos e
imprima la media aritmtica, es decir, el punto medio entre los dos
nmeros.
6. Elaborar un programa que lea el radio (r) de una esfera, calcule e
imprima el volumen y el rea.
Area= 4 r2
Volumen = 4/3 r3
7. Elaborar un programa que lea una cantidad de horas e imprima su
equivalente en minutos, segundos y das.
8.- Elaborar un programa que lea el valor de w e imprima el valor de z.
Z= 1 /
2 e w2/2
33
Programacin C y C++
Capitulo 2
Sentencias de Seleccin
Sentencias de Iteracin
Sentencias de Salto
Ejercicios
34
Programacin C y C++
SENTENCIAS DE SELECCIN
A las sentencia de seleccin tambien se les conoce como sentencia
condicional, entre las que se incluyen if y switch
Muchas sentencias de C se basan en una prueba condicional que
determina la accin que se ha de llaver acabo. Una expresin condicional
tiene como resultado un valor cierto o falso. En C cualquier valor distinto de
cero es cierto, incluyendo los nmeros negativos. El 0 es el nico valor falso.
if, if-else
Ejemplo:
/*IF.cpp
Determina si una persona es mayor o menor de edad
usando la Instruccin if*/
#include <conio.h>
#include <iostream.h>
void main()
{int Edad;
clrscr();
cout<<"PROPORCIONE SU EDAD: ";
cin>>Edad;
if (Edad<18)
cout<<"\n Aun es menor de edad";
else
cout<<"\n Es mayor de edad";
getch();
}
Programacin C y C++
35
switch
36
Programacin C y C++
Expresin entera, puede ser una constante, una variable, una llamada a
funcin o una expresin. La sentencia switch no funciona con datos de
tipo coma flotante
El valor despus de cada etiqueta case debe ser una constante entera o
carcter, como 3 o b, o bien una expresin que se evale a una
constante como a +32.
Necesita utilizar una sentencia break despus de cada conjunto de
sentencias ejecutables. La sentencia break hace que la ejecucin del
programa se reanude despus del final de la sentencia switch actual. Si
no se utiliza la sentencia break, la ejecucin del programa se reanudar
en las siguientes etiquetas case.
El conjunto de sentencias case no necesita ser encerradas entre llaves.
Si ninguno de la valores de constante_1, constante_2, etc. Coincide con
el valor de expresin_entera, se ejecutarn las sentencias que vienen a
continuacin de la sentencia opcional default.
Ejemplo:
/*Switch.cpp
Calcula el rea de figuras Geomtricas
usando la Instruccin switch*/
#include <conio.h>
#include <iostream.h>
void main()
{char op;
int
L,B,H,R;
float Area;
clrscr();
cout<<" CALCULO DE AREAS";
cout<<"\n 1.- RECTANGULO";
cout<<"\n 2.- TRINGULO";
cout<<"\n 3.- CIRCULO";
cout<<"\n Opcion:";
op=getche();
switch (op)
{
case '1': cout<<"\n\n Lado:";
cin>>L;
Area=L*L;
break;
case '2': cout<<"\n\n Base:";
cin>>B;
cout<<"\n Altura:";
cin>>H;
Area=(B*H)/2;
break;
Programacin C y C++
37
SENTENCIAS DE ITERACIN
Entre las sentencias de iteracin se incluyen for, while y do-while. Cualquier
sentencia de iteracin tiene tres partes importantes que son: Inicializacin,
condicin e incremento, aunque cada sentencia de iteracin debe usarse
preferente segn la situacin en la mayora de los casos se puede adaptar
cualquiera de las tres a cualquier situacin.
for
38
Programacin C y C++
instruccin;
La salida sera:
0
10
15
x
0
5
10
15
20
condicion
0<20
5<20
10<20
15<20
20<20
Accin
Imprime 0
Imprime 5
Imprime 10
Imprime 15
Fin ciclo for..
Programacin C y C++
39
for anidados
Un ciclo for puede colocarse dentro de otro, en este caso el ciclo interno se
ejecutar totalmente cada vez que se ejecute el ciclo que lo contiene.
Ejemplo:
/*for2.cpp
Imprime tabla de multiplicacin */
#include <conio.h>
#include <iostream.h>
void main()
{clrscr();
int x,y;
int fin1=6, fin2=5;
//Probar con otros valores
for (x=1;x<=fin1;x++)
{
cout<<"\n";
for (y=1;y<=fin2;y++)
cout<<x*y<<"\t";
}
getch();
}
La salida sera:
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 efecta totalmente el ciclo
for interno es decir y inicialmente toma el valor de 1 y se imprime 1*1=1,
luego y=2 y se imprime 2, y as hasta que y=5 imprime 5, en el siguiente
ciclo la condicin se hace falsa dndose por terminado el ciclo interno, pero el
ciclo externo incrementa su valor y ejecuta nuevamente el ciclo interno, este
proceso se sigue hasta que la condicin del ciclo externo se hace falsa.
while
40
Programacin C y C++
//Decremento
10
do-while
Programacin C y C++
41
Ejemplo:
/*Do-While.cpp
Menu de Opciones */
#include <conio.h>
#include <iostream.h>
void main()
{clrscr();
char op;
do
{ cout<<" MENU";
cout<<"\n 1.-Altas";
cout<<"\n 2.-Bajas";
cout<<"\n 3.-Consultas";
cout<<"\n 4.-Salir";
cout<<"\nOpcion:";
do
{
op=getch();
}
while(op!='1'&&op!='2'&&op!='3'&&op!='4');
//Cdigo adicional
}
while (op!='4');
}
La salida del programa sera:
MENU
1.-Altas
2.-Bajas
3.-Consultas
4.-Salir
Opcion:
42
Programacin C y C++
Return (expresin)
break
La sentencia break tiene dos usos. Se puede usar para finalizar un case en una
sentencia switch. Tambin se puede usar para forzar la terminacin inmediata
de una bucle, saltando la evaluacin condicional normal del ciclo.
Cuando se encuentra la sentencia break dentro de un ciclo, el ciclo
finaliza inmediatamente.
Programacin C y C++
43
Ejemplo:
/*break.cpp
Lee caracteres hasta que se pulse la tecla <esc> */
#include <conio.h>
#include <iostream.h>
void main()
{ clrscr();
char car;
cout<<"PULSE <Esc> PARA TERMINAR\n\n";
for(;;)
//Ciclo infinito
{
car=getche();
if (car==27)
break;
}
}
continue
44
Programacin C y C++
EJERCICIOS RESUELTOS
1.- Programa para calcula la calificacin final de un alumno, teniendo como
datos N calificaciones parciales (3). Imprime el nombre, la calificacin final y
un comentario de Aprobado si obtiene 70 o ms 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();
Programacin C y C++
45
46
Programacin C y C++
Programacin C y C++
4.- Escribir un programa para dibujar un rectngulo en modo texto en la
pantalla, solicitar las coordenadas x1, y1, x2 y y2, segn la siguiente figura:
x1,y1
x2,y2
/*Rectang.cpp */
#include <conio.h>
#include <iostream.h>
void main()
{ clrscr();
int x,y,x1,y1,x2,y2;
cout<<"DIBUJA UN RECTANGULO EN PANTALLA SEGUN COORDENADAS";
cout<<"\nESCRIBA LAS COORDENADAS X1,Y1,X2,Y2 MODO TEXTO ";
cout<<"SEPARADOS POR UN ESPACIO: \n";
cin>>x1>>y1>>x2>>y2;
for (x=x1;x<x2;x++)
//Dibuja Lnea horizontal
{
gotoxy(x,y1);cout<<"";
gotoxy(x,y2);cout<<"";
}
for (y=y1+1;y<y2;y++)
//Dibuja lnea Vertical
{
gotoxy(x1,y);cout<<"";
gotoxy(x2,y);cout<<"";
}
gotoxy(x1,y1);cout<<""; //Para las Esquinas
gotoxy(x2,y1);cout<<"";
gotoxy(x1,y2);cout<<"";
gotoxy(x2,y2);cout<<"";
}
47
48
Programacin C y C++
EJERCICIOS PROPUESTOS.
1.- Elabore un programa para calcular e imprimir el precio de un terreno del
cual se tienen los siguientes datos: largo, ancho y precio por metro cuadrado.
Si el terreno tienen ms de 400 metros cuadrados se hace un descuento de
10%, si el terreno tiene ms de 500 metros cuadrados el descuento es de 17%
y si tiene ms de 1000 el descuento es de 25%.
2.- Una librera vende libros con las condiciones siguientes: Si el cliente es
tipo 1 se le descuenta el 30%, si el cliente es tipo 2 se le descuenta el 20%, si
el cliente es tipo 3 se le descuenta 10%. Cuando el cliente realiza una compra
se generan los datos siguientes: Nombre del cliente, Tipo de cliente (1,2,3),
cantidad de libros, costo por libro. Elabore un programa que lea estos datos e
imprima: Nombre del cliente, Total a pagar, Descuento y el Neto a pagar.
3.- Igual que el ejercicio anterior, pero adems:
Si la cantidad de libros solicitada es mayor que 50, se hace un descuento
adicional de 5%; en caso de ser mayor que 100 el descuento adicional es de
10%.
4.- Elaborar un programa que lea los datos de un estudiante: nombre y tres
calificaciones parciales e imprimir el nombre y la calificacin final de
acuerdo a lo siguiente: Para aprobar el curso, debe tener 70 o ms en cada
una de las tres calificaciones, la calificacin final ser el promedio. En caso
de haber reprobado uno o ms exmenes ordinarios, la calificacin final ser
NA (NO ACREDITADO).
5.- En un almacn de ventas de trajes si se compra uno se hace el 50% de
descuento, si compra 2 el 55%, si compra 3 el 60% y si compra ms de 3 el
65%. Elaborar un programa que lea la cantidad de trajes y el precio unitario
(todos tienen el mismo precio) e imprima el subtotal a pagar, el descuento y
el total a pagar.
6.- Reescriba el programa del ejercicio resulto 1 pero sin usar ciclos
7.- Programa que dibuje una secuencia de N rectangulos (5) a partir de un
rectangulo cuyas coordenadas sean proporcionados por el usuario, los
rectangulos siguientes se irn haciendo ms pequeos en forma proporcional
cada vez.
49
Programacin C y C++
Capitulo 3
Arreglos y Apuntadores
50
Programacin C y C++
Inicializacin de un arreglo
Programacin C y C++
51
char Caracter[]={a,b,c,d,e,f};
char Cadena[11]=HOLA AMIGOS;
char Cadena2[]=PROGRAMACIN EN LENGUAJE C;
Para comprender mejor el manejo de los arreglos se presentan a continuacin
algunos ejemplos:
/*Arreglo2.cpp.cpp
Visualiza el contenido de un arreglo */
#include <conio.h>
#include <iostream.h>
#define N 4
void main()
{ clrscr();
int Cal[N],x;
Cal[0]=90; Cal[1]=80;Cal[2]=100; Cal[3]=70;
for (x=0;x<N;x++)
cout<<"\t"<<Cal[x];
getch();
}
La salida es
90
80
100 70
52
Programacin C y C++
/*Arreglo4.cpp
Ordena un arreglo unidimensional en forma ascendente
aplicando el mtodo de seleccin */
#include <conio.h>
#include <iostream.h>
#define N 10
void main()
{ clrscr();
int A[N]={79,24,59,18,41,37,64,3,23,29}; //Arr. inicializado
int menor,temp,ind,x,y;
for (x=0;x<N-1;x++)
{
menor=A[x];
ind=x;
for (y=x+1;y<N;y++)
//Recorre la lista y determina
if (A[y]<menor)
//el menor
{
menor=A[y];
ind=y;
}
if (ind!=x) //Intercambia el elemento menor a la posicin x
{
temp=A[x];
A[x]=A[ind];
A[ind]=temp;
}
}
for (x=0;x<N;x++)
cout<<" "<<A[x];
getch();
}
La salida del programa es:
3 18 23 24 29 37 41 59 64 79
Programacin C y C++
53
CADENAS
C no tiene un tipo de dato para cadenas de caracteres. Una cadena de
caracteres es un arreglo unidimensional, en el cual todos sus elementos son de
tipo char, al final del arreglo contiene el carcter nulo /0. C soporta una gran
variedad de funciones para el manejo de cadenas definidos en el archivo de
cabecera string.h e aqu algunos:
Nombre
strcpy(c1,c2)
strcat(c1,2)
strlen(c1,c2)
strcmp(c1,c2)
Funcin
Copia c2 en c1
Concatena c2 al final de c1
Devuelve la longitud de la cadena
Devuelve 0 si c1 y c2 son iguales; menor que 0 si c1<c2;
mayor que 0 si c1>c2
strchr(c1,car) Devuelve un puntero a la primera ocurrencia de car en c1
strstr(c1,c2)
Devuelve un puntero a la primera ocurrencia de c2 en c1
Tabla 3. 1.- Funciones para el manejo de cadena
Ejemplos:
/*Cadena.cpp */
#include <string.h>
#include <conio.h>
#include <iostream.h>
void main()
{ clrscr();
int L,x;
char Cad[]="HOLA AMIGO";
L=strlen(Cad);
for (x=L-1;x>=0;x--)
cout<<Cad[x];
//Esta es la cadena
//Longitud de la cadena
getch();
}
La salida del programa es:
OGIMA ALOH
54
Programacin C y C++
/*Cadena2.cpp
Operaciones con cadena */
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define N 40
void main()
{ clrscr();
int L,x;
char C1[]="INSTITUTO ";
char C2[]="TECNOLOGICO DEL ISTMO";
char C[N];
char Est[N];
strcpy(C,C1);
//Copia C1 en C
strcat(C,C2);
//Concatena C2 en C
cout<<"\nDonde Estudio el autor de este libro: ";
gets(Est);
//En lugar de cin.getline();
if (strcmp(C,Est)==0)
cout<<"\nAcertaste";
else
cout<<"\nNo Acertaste, l estudio en el: "<<C;
getch();
}
La salida es:
Donde Estudio el autor de este libro: INSTITUTO POLITECNICO NACIONAL
No Acertaste, l estudio en el: INSTITUTO TECNOLOGICO DEL ISTMO
Programacin C y C++
0
1
2
3
4
0
0
20
40
60
80
1
5
25
45
65
85
2
10
30
50
70
90
55
3
15
35
55
75
95
Tabla[1][2]
El programa utiliza dos ciclos for para asignar valores a cada uno de
los elementos del arreglo, el for interno controla el 2. ndice (columnas) y el
for externo el primer ndice (filas).
La cantidad de memoria en bytes para almacenar un arreglo
bidimensional, se puede calcular aplicando la siguiente formula.
Tamao en bytes=sizeof(tipo)*tamao del 1er. ndice * tamao del 2. ndice
As la definicin int Tabla[5][4]; requerira: 2*5*4 = 40 Bytes de
memoria.
Ejemplo:
/*A_Bidim2.cpp
Lee las K calificaciones de N alumnos, calcula sus promedios,
el aprovechamiento del grupo y visualiza los resultados */
#include <conio.h>
#include <iostream.h>
#define N 5
#define K 4
void main()
56
Programacin C y C++
{ clrscr();
int Calif[N][K];
float Prom[N], Aprov;
int x,y, Suma1,Suma2=0;
cout<<"ALUMNO
I
II
III IV\n";
for (y=0;y<N;y++)
{
cout<<y+1;
Suma1=0;
for(x=0;x<K;x++)
{
gotoxy(x*5+10,y+2);
cin>>Calif[y][x];
Suma1=Suma1+Calif[y][x];
}
Prom[y]=Suma1/K;
//Promedio por alumno
Suma2=Suma2+Prom[y];
}
Aprov=Suma2/N;
//Aprovechamiento de grupo
//Visualizacin
cout<<"\nALUMNO
I
II
III IV Prom";
for (y=0;y<N;y++)
{
cout<<"\n"<<y+1;
for(x=0;x<K;x++)
{
gotoxy(x*5+10,y+N+4);
cout<<Calif[y][x];
}
gotoxy(x*5+10,y+N+4);
cout<<Prom[y];
}
cout<<"\nAprovechamiento : "<<Aprov;
getch();
}
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
Programacin C y C++
57
*P
Car
Direccin de
memoria
2C00
2C01
2C02
2C03
Variable en
memoria
2C03
Declaracin de un Apuntador
58
Programacin C y C++
Aritmtica de punteros
Existen slo dos operaciones aritmticas que se pueden realizar con los
punteros: la suma(++) y la resta(--). Cada vez que se incrementa un puntero,
apunta a la posicin de memoria del siguiente elemento de su tipo base. Cada
vez que se decrementa, apunta a la posicin del elemento anterior. Con
punteros a caracteres , parece una aritmtica normal. Sin embargo, el resto de
los punteros aumentan o decrementan en la longitud del tipo de datos a los que
apuntan. Suponiendo los enteros de 2 bytes de longitud, cuando se incrementa
un puntero a entero, su valor aumenta en 2. El siguiente programa ilustra este
ejemplo:
/*Apunta2.cpp
Aritmtica de punteros/
#include <conio.h>
#include <iostream.h>
void main()
{ clrscr();
int x;
int *P;
for (x=0;x<5;x++)
{
cout<<P<<" ";
P++;
//Incremento
}
}
La salida sera:
0x3dc10000 0x3dc10002 0x3dc10004 0x3dc10006 0x3dc10008
Programacin C y C++
59
60
30
95
50
10
40
Pila Llena
0
Contenido de la pila
10
50
95
30
Programacin C y C++
80
PUNTEROS Y ARREGLOS
Existe una estrecha relacin entre los punteros y los arreglos, considrese el
siguiente fragmento:
int Arr[10], *Ap;
Ap=Arr;
Aqu Ap ha sido asignado a la direccin del primer elemento del arreglo Arr,
por que el nombre de un arreglo sin ndice devuelve la direccin de inicio del
arreglo. Para acceder al tercer elemento del arreglo Arr, se escribe:
Arr[2] *(Ap+2);
Ambas sentencias devuelven el tercer valor. Para acceder a los elementos de
un arreglo se puede efectuar por cualquiera de los dos mtodos: La indexacin
del arreglo la aritmtica de punteros, la ventaja del segundo mtodo es que
mejora la velocidad. Ejemplo:
/*Apunta4.cpp */
#include <conio.h>
#include <iostream.h>
void main()
{ clrscr();
int Arr[10]={10,20,30,40,50,60,70,80,90,100};
int *Ap,x;
Ap=Arr;
//Apunta al inicio del arreglo
*(Arr+2)=999;
//Cambia el valor del tercer elemento
for (x=0;x<10;x++)
cout<<" "<<*(Ap+x);
}
La Salida sera:
10 20 999 40 50 60 70 80 90 100
INICIALIZACIN DE APUNTADORES
Despus de declarar un puntero y antes de asignarle un valor, contiene un
valor desconocido. Si se intenta utilizar el puntero antes de darle el valor ,
probablemente se estrellara no slo el programa sino tambin el sistema
operativo de la computadora.
Un puntero debe ser correctamente inicializado para evitar cualquier
problema, se pueden usar dos mtodos:
Que apunte a una variable esttica
Asignarle memoria dinmica.
Programacin C y C++
61
62
Programacin C y C++
{ int *P;
P=new int[2];
//Asigna espacio para 2 Enteros (4 bytes)
*P=1;
P++;
*P=2;
cout<<*P<<" "<<*(P-1);
//Visualiza: 2 1
delete(P);
//libera la memoria
getch();
}
new
Programacin C y C++
63
delete
EJERCICIOS RESUELTOS
1.- Un vendedor de equipo de computo desea saber la ganancia total por la
venta de N partes de computadoras. Escribir un programa que lea el costo de
compra de cada uno de los N artculos, calcule el costo de venta agregndole
el 35% de ganancia ms el 15% de IVA sobre el precio de compra y visualice
los resultados en forma de tabla.
/*Ganacia.cpp */
#include <conio.h>
#include <iostream.h>
#define N 5
void main()
{ clrscr();
int x,GanTotal=0;
float CosArt[N], Gan[N],Iva[N], Venta[N];
cout<<"CALCULA LA GANANCIA EN LA VENTA DE "<<N<<" ARTICULOS";
cout<<"\nPROPORCIONE EL COSTO DE LOS ARTICULOS\n";
for (x=0;x<N;x++)
{
cout<<"\n"<<x+1<<" : ";
cin>>CosArt[x];
Gan[x]=CosArt[x]*.30;
//Ganancia por artculo
Iva[x]=CosArt[x]*.15;
//IVA por artculo
Venta[x]=CosArt[x]+Gan[x]+Iva[x]; //Prec.de Venta por art.
GanTotal=GanTotal+Gan[x];
//Ganancia total
}
clrscr();
cout<<"ARTIC. COSTO
IVA
GANACIA VENTA";
for (x=0;x<N;x++)
cout<<"\n"<<x+1<<"\t"<<CosArt[x]<<"\t"<<Iva[x]<<"\t"
<<Gan[x] <<"\t"<<Venta[x];
cout<<"\n\t\t\t_____\n\tGanancia Total= "<<GanTotal;
getch();
}
64
Programacin C y C++
2.- Programa que lea los nombres de N alumnos y los ordene en forma
ascendente aplicando el mtodo de burbuja.
/*Burbuja.cpp */
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define N 5
void main()
{ clrscr();
char Nom[N][40],Temp[40];
int x,y;
cout<<"ORDENA EN FORMA ASCENDENTE "<<N<<" NOMBRES ";
cout<<"\nPROPORCIONE LOS NOMBRES\n";
for (x=0;x<N;x++)
{
cout<<x+1<<" : ";
gets(Nom[x]);
}
//Mtodo de burbuja
for (x=1;x<N;x++)
for(y=N-1;y>=x;y--)
if(strcmp(Nom[y-1],Nom[y])>0)
{
strcpy(Temp,Nom[y-1]); //Intercambio de elementos
strcpy(Nom[y-1],Nom[y]);
strcpy(Nom[y],Temp);
}
cout<<"\nLOS NOMBRES ORDENADOS SON: ";
for (x=0;x<N;x++)
cout<<"\n"<<x+1<<" : "<<Nom[x];
getch();
}
Programacin C y C++
65
/*OpcionVI.cpp */
#include <conio.h>
#include <iostream.h>
#define N 2
//No. de Alumnos
#define M 5
//No. de Materias
#define S 3
//No. de Sinodales
void main()
{ clrscr();
int CalEs[N][M];
int CalOr[N][S];
float PrEs[N], PrOr[N],PrGrl[N];
int x,y, Sum;
cout<<"PROMEDIO GENERAL DE LOS ALUMNOS PARA LA TITULACION";
for (x=0;x<N;x++)
{ Sum=0;
cout<<"\nCAL. DE LA FASE ESCRITA, ALUMNO No. "<<x+1<<"\n";
for(y=0;y<M;y++)
{
cout<<"MATERIA "<<y+1<<" : ";
cin>>CalEs[x][y];
//Lee Calificaciones fase Escrita
Sum=Sum+CalEs[x][y];
}
PrEs[x]=Sum/M;
//Promedio por alumno en la fase Escrita
clrscr();
}
for (x=0;x<N;x++)
{ Sum=0;
cout<<"CALIFICACIONES DE LA FASE ORAL, ALUMNO "<<x+1<<"\n";
for(y=0;y<S;y++)
{
cout<<"SINODAL "<<y+1<<" : ";
cin>>CalOr[x][y];
//Lee Calificaciones fase Oral
Sum=Sum+CalOr[x][y];
}
PrOr[x]=Sum/S;
//Promedio por alumno en la fase Oral
PrGrl[x]=(PrEs[x]+PrOr[x])/2;
clrscr();
}
cout<<"\n
RESULTADOS";
cout<<"\n
MATERIAS
SINODALES";
cout<<"\nNo. 1 2 3 4 5 PrEsc. 1 2 3 PrOr
PrGrl.";
for (x=0;x<N;x++)
{ cout<<"\n"<<x<<" "<<CalEs[x][0]<<" "<<CalEs[x][1]<<" "<<CalEs[x][2];
cout<<" "<<CalEs[x][3]<<" "<<CalEs[x][4]<<" "<<PrEs[x];
cout<<"\t"<<CalOr[x][0]<<" "<<CalOr[x][1]<<" "<<CalOr[x][2];
cout<<" "<<PrOr[x]<<"\t\t"<<PrGrl[x];
if (PrGrl[x]>=80)
cout<<"\tSI";
else
cout<<"\tNO";
66
Programacin C y C++
//Numero de elementos
void main()
{ clrscr();
int *Num,x,y,Temp;
Num=new int [N];
if (Num==0)
//Verifica si no hay memoria dinmica
{
cout<<"\nNo existe memoria disponible";
exit(0);
//Finaliza el programa
}
cout<<"DA DE ALTA UNA SERIE DE "<<N
<<" NUMEROS Y LOS ORDENA\n";
for (x=0;x<N;x++)
//Alta de la serie de nmeros
{
cout<<"No. "<<x+1<<": ";
cin>>*Num;
//Asigna el numero
Num++;
//Incrementa el apuntador
}
Num=Num-N;
//Apunta al primer elemento
for (x=1;x<N;x++)
//Mtodo de burbuja
for(y=N-1;y>=x;y--)
if(*(Num+y-1)>*(Num+y))
{
Temp=*(Num+y-1);
//Intercambio de elementos
*(Num+y-1)=*(Num+y);
*(Num+y)=Temp;
}
for (x=0;x<N;x++)
//Imprime el contenido del apuntador
{
cout<<"\n "<<*Num;
Num++;
}
delete(Num);
getch();
Programacin C y C++
67
//Nmero de alumnos
void main()
{ clrscr();
int x, Cal[N];
float NApr=0,NRep=0,IApr,IRep;
cout<<"CALCULA EL INDICE DE APROBACION Y REPROBACION";
cout<<"\nDE "<<N<< " ALUMNOS, PROPORCIONE LAS CALIFIC.\n";
for (x=0;x<N;x++)
{
cout<<x+1<<": ";
cin>>Cal[x];
if (Cal[x]>=70)
NApr++;
else
NRep++;
}
IApr=(NApr/N)*100;
IRep=(NRep/N)*100;
cout<<"\nNo. de Aprobados "<<NApr;
cout<<"\nIndice de aprobacion "<<IApr<<" %";
cout<<"\nNo. de Reprobados "<<NRep;
cout<<"\nIndice de Reprobacion "<<IRep<<" %";
getch();
}
68
Programacin C y C++
EJERCICIOS PROPUESTOS
1.- Tomando como base el programa del ejercicio resuelto 1, calcular adems
el Costo total , El IVA total y el Precio de Venta Total de los N artculos.
2.- Ordenar en forma descendente una lista de N Nombres aplicando el
mtodo de Insercin
3.- Igual que el ejercicio 2 pero aplicando el mtodo Shell
4.- Considrese la siguiente secuencia de nombres proporcionados al
programa del ejercicio resuelto 2: Ana, Carlos, Zenaido, Ral, Vctor.
Explique el proceso de ordenamiento.
69
Programacin C y C++
Capitulo 4
Funciones y Estructuras
Funciones
Pase de parmetros
Estructuras
Arreglos de Estructuras
Ejercicios
70
Programacin 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 funcin. Esto se debe a que todos los programas
deben incluir la funcin main(), que es en si misma una funcin. Aunque C++
esta orientada a objetos, las funciones siguen siendo parte de este estilo de
programacin ya que dentro de las clases se hayan un conjunto de funciones,
este tema se tratar ms adelante, en este capitulo se va ha destacar la
importancia de la programacin modular.
La ejecucin de un programa comienza por la funcin main(), cuando
se llama a una funcin, el control se pasa a la misma para su ejecucin; y
cuando finaliza, el control es devuelto de nuevo al mdulo que llamo, para
continuar con la ejecucin del mismo a partir de la sentencia que efectu la
llamada.
Sintaxis:
Tipo_de_retorno Nombre_funcion (Lista de parmetros)
{
cuerpo de la funcin
}
Donde:
Tipo_de_retorno especifica el tipo de valor que devuelve la sentencia
return de la funcin. El valor puede ser cualquier tipo vlido. Si no se
especifica ningn tipo, el compilador asume que la funcin devuelve como
resultado un entero, las funciones que no devuelven ningn valor deben tener
el tipo void. La Lista de parmetros 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 funcin. Una funcin puede no tener
parmetros en cuyo caso la lista de parmetros esta vaca. Sin embargo,
incluso cuando no hay parmetros se requieren los parntesis y la lista de
parmetros puede estar sustituida por void.
Ejemplo:
float Area_Triang(int Base, int Altura)
{
float Area;
Area=(Base*Altura)/2;
return(Area);
}
Programacin C y C++
71
72
Programacin C y C++
}
void Intercambio(int *A, int *B)
{
int temp;
temp=*A;
*A=*B;
*B=temp;
}
//Variable global
Programacin C y C++
73
Leer(SalDia);
Calcular(SalDia,SalSem);
Visualizar(SalDia,SalSem);
getch();
}
void Leer(float SD[N])
//Arreglo como parmetro determinado
{ clrscr();
int x;
cout<<"Proporcione el Salario Diario del Trabajador No. 1 al
"<<N<<"\n";
for (x=0;x<N;x++)
{
cout<<x+1<<" : ";
cin>>SD[x];
}
}
void Calcular(float SD[],float SS[]) //Como arreglo Indet.
{ int x;
for (x=0;x<N;x++)
{
SS[x]=SD[x]*7;
Monto=Monto+SS[x];
}
}
void Visualizar(float *SD,float *SS)
//Como apuntador
{ int x;
cout<<"\nTrabajador S/Diario
S/Semanal";
for (x=0;x<N;x++)
cout<<"\n\t"<<x+1<<"\t"<<SD[x]<<"\t"<<SS[x];
cout<<"
Monto: "<<Monto;
}
La salida del programa sera:
Proporcione el Salario Diario del Trabajador No. 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
74
Programacin C y C++
Programacin C y C++
75
struct Alumnos{
char N_Ctrl[9];
char Nom[40];
char Dir[40];
char Ciudad[40];
char Tel[15];
int Edad;
};
Hasta el momento solo se ha definido la estructura ms no se ha
declarado una variable de tipo estructura, para hacerlo sera:
Alumnos A;
Cuando se declara una variable de tipo estructura es cuando el
compilador reserva espacio en memoria para almacenar la estructura, la
cantidad de memoria requerida ser igual a la suma de la memoria requerida
por cada uno de sus datos miembros, en este caso se requerira un total de 146
bytes (9+40+40+40+15+2).
La definicin de la estructura representa un nuevo tipo de dato, por lo
que se pueden declarar a partir de ella el nmero de variables que se deseen.
Ejemplo:
Alumnos A2,A3,An;
Los elementos individuales de la estructura se referencan utilizando el
operador . (operador punto). Sintaxis:
Nombre_var_estructura.Dato_miembro;
Por ejemplo, el siguiente cdigo asigna la edad 20 al dato miembro
Edad de la variable estructura A:
A.Edad=20;
El ejemplo completo para asignar y visualizar los datos a una estructura
Alumnos se muestra a continuacin:
/*Estruct.cpp*/
#include <string.h>
#include <conio.h>
#include <iostream.h>
struct Alumnos{
char N_Ctrl[9];
char Nom[40];
char Dir[40];
char Ciudad[40];
char Tel[15];
int Edad;
76
Programacin C y C++
};
void main()
{ clrscr();
Alumnos A; //Definicin de una variable estructura
//Asignacin de datos
strcpy(A.N_Ctrl,"95190205");
strcpy(A.Nom,"Sanchez Lpez Juan");
strcpy(A.Dir,"Av. 5 de Mayo No. 37");
strcpy(A.Ciudad,"Juchitan, Oax.");
A.Edad=20;
//Visualizacin
cout<<"\Los datos del alumno son :";
cout<<"\n"<<A.N_Ctrl;
cout<<"\n"<<A.Nom;
cout<<"\n"<<A.Dir;
cout<<"\n"<<A.Ciudad;
cout<<"\n"<<A.Edad;
getch();
}
ARREGLOS DE ESTRUCTURAS
De la misma forma que se pueden crear arreglos con los tipos de datos bsicos
de C (int, char, float) tambien se pueden crear arreglos de estructura. Para
declarar un arreglo de estructuras, se debe definir primero la estructura y
luego declarar una variable arreglo de dicho tipo. Ejemplo:
Alumnos Al[5];
Se declara un arreglo de estructura de 5 elementos del tipo Alumnos,
esto reserva 730 bytes (146*5) en memoria RAM para su almacenamiento.
Para acceder a una determinada estructura , se indexa el nombre de la
estructura . Ejemplo:
Al[2].Edad=19;
El cdigo 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.
/*Estruct2.cpp*/
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define N 5
struct Alumnos{
char N_Ctrl[9];
//definicin de la estructura
Programacin C y C++
77
char Nom[40];
char Dir[40];
char Ciudad[40];
char Tel[15];
int Edad;
};
void main()
{ clrscr();
Alumnos Al[N];
//Definicin del arreglo de estructura
int i;
cout<<"NOMBRE
No. COTROL
DIRECCION
CUIDAD EDAD";
for (i=0;i<N;i++)
{
gotoxy(1,i+2); gets(Al[i].Nom);
gotoxy(18,i+2); gets(Al[i].N_Ctrl);
gotoxy(31,i+2); gets(Al[i].Dir);
gotoxy(50,i+2); gets(Al[i].Ciudad);
gotoxy(62,i+2); cin>>Al[i].Edad;
}
}
78
};
Programacin C y C++
int Cant;
getch();
79
Programacin C y C++
float Pr_unid;
int Cant;
};
void Leer(Producto *Pr);
void Visualizar(Producto Pr);
void main()
{ clrscr();
Producto P;
Leer(&P);
Visualizar(P);
getch();
}
//Definicn de la variable de
estructura
//Arreglo de estructura
//Llamada por referencia
80
Programacin C y C++
EJERCICIOS RESUELTOS
1.- Programa que muestre un men de opciones en pantalla con las siguientes
opciones: Altas, Bajas, Visualizar y Terminar, para manejar un arreglo de
estructuras de N alumnos con los siguientes datos: Nmero de control,
nombre, direccin, ciudad, telfono y edad. En la opcin de altas validar si el
registro esta vaco para proceder y si no indicarlo con un mensaje; en el
proceso de bajas caso inverso. Durante la visualizacin solamente se
mostrarn los registros que ya fueron dados de alta.
/*Alumnos.cpp */
#include <string.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#define N 10
struct Alumnos{
//definicin de estructura
char N_Ctrl[9];
char Nom[40];
char Dir[40];
char Ciudad[40];
char Tel[15];
int Edad;
};
//definicin de funciones del usuario
void Formatear(Alumnos A[N]);
void Altas(Alumnos A[N]);
void Bajas(Alumnos A[N]);
void Visualizar(Alumnos A[N]);
void main()
{ char op;
Alumnos A[N];
//Arreglo de estructuras
Formatear(A);
do{
clrscr();
cout<<"MANEJO DE UN ARREGLO DE ESTRUCTURA";
cout<<"\n1.-Altas";
cout<<"\n2.-Bajas";
cout<<"\n3.-Visualizar";
cout<<"\n4.-Terminar";
do{
op=getch();
}
while (op!='1'&&op!='2'&&op!='3'&&op!='4');
Programacin C y C++
switch (op){
case '1': Altas(A);
//Llamada por referencia
break;
case '2': Bajas(A);
break;
case '3': Visualizar(A);
break;
}
}
}
while (op!='4');
81
82
Programacin C y C++
}
}
while(Reg!=0);
}
//Da de baja el registro si esta ocupado, valida el intervalo
void Bajas(Alumnos A[N])
{ int Reg;
do{
do{
clrscr();
cout<<"PROCESO DE BAJAS";
cout<<"\nNo. de registro entre 1 y "<<N<<", 0 Para
terminar :";
cin>>Reg;
}
while (Reg<0 || Reg>N);
if(Reg!=0 )
if(A[Reg-1].Edad!=0)
{
strcpy(A[Reg-1].N_Ctrl,"\n");
strcpy(A[Reg-1].Nom,"\n");
strcpy(A[Reg-1].Dir,"\n");
strcpy(A[Reg-1].Ciudad,"\n");
strcpy(A[Reg-1].Tel,"\n");
A[Reg-1].Edad=0;
cout<<"\n Registro "<<Reg<<" dado de baja ";
getch();
}
else
{
cout<<"\nRegistro Vaco";
getch();
}
}
while(Reg!=0);
}
//Visualiza la estructura en forma de tabla si ya fue dada de
alta
void Visualizar(Alumnos A[N])
{ int x,y=2;
clrscr();
cout<<"No. Nombre
No.Ctrl Direccin
Ciudad
Telefono Edad";
for (x=0;x<N;x++)
if (A[x].Edad!=0)
{
gotoxy(1,y);cout<<x+1<<" "<<A[x].Nom;
gotoxy(17,y);cout<<A[x].N_Ctrl;
gotoxy(27,y);cout<<A[x].Dir;
gotoxy(44,y);cout<<A[x].Ciudad;
gotoxy(59,y);cout<<A[x].Tel;
gotoxy(69,y);cout<<A[x].Edad;
y++;
}
getch();
Programacin C y C++
}
83
84
Programacin C y C++
Programacin C y C++
85
void Saldo()
//Visualiza el Saldo
{
clrscr();
cout<<"EL SALDO ES: "<<Sal;
getch();
}
void Retiro()
//Proceso de Retiro
{int Cant;
do{
clrscr();
cout<<"BIENBENIDO A LA OPCION DE RETIRO";
cout<<"\n Cantidad: ";
cin>>Cant;
if (Cant>Sal)
{
cout<<"\nRebasa su Saldo";
getch();
}
}
while (Cant>Sal && Sal!=0);
if (Sal!=0)
Sal=Sal-Cant;
Saldo();
}
//Variable global.-
Altas();
Grado();
Especialidad();
Inicializa();
Arreglo de estructura
86
Programacin C y C++
void main()
{ char op;
Inicializa();
do{
clrscr();
cout<<"CONTROL ESCOLAR";
cout<<"\n1.- Altas";
cout<<"\n2.- Consulta por Grado";
cout<<"\n3.- Consulta por Especialidad";
cout<<"\n4.- Salir";
do{
cout<<"\n\nOpcion:";
op=getch();
}
while (op!='1'&&op!='2'&&op!='3'&&op!='4');
switch(op){
case '1':Altas();
//Pasa la direccin de inicio
break;
case '2':Grado();
break;
case '3':Especialidad();
break;
}
}
while (op!='4');
}
void Inicializa() //Inicializa la estructura
{ int x;
for (x=0;x<N;x++)
{
strcpy(E[x].Nom,'\0');
E[x].Edad=0;
E[x].Esp=0;
E[x].Grado=0;
}
}
void Altas()
//Proceso de Alta
{ int reg;
do{
clrscr();
cout<<"PROCESO DE ALTAS";
cout<<"\n Registro del 1 al "<<N<<"
do{
cin>>reg;
}
while (reg>N || reg<0);
if (reg!=0)
{
reg--;
if (E[reg].Edad==0)
{
cout<<"\nNombre: ";
gets(E[reg].Nom);
cout<<"Edad: ";
Programacin C y C++
cin>>E[reg].Edad;
cout<<"Especialidad:(1 a "<<C<<" ) ";
cin>>E[reg].Esp;
cout<<"Grado:(1 a "<<G<<" ) ";
cin>>E[reg].Grado;
}
else
{
cout<<"\nEl registro tiene datos";
getch();
}
reg++;
}
}
while (reg!=0);
}
void Grado()
//Consulta por Grado
{ int gr,x;
clrscr();
cout<<"CONSULTA POR GRADO";
cout<<"\n GRADO DEL 1 al "<<G<<" : ";
do{
cin>>gr;
}
while (gr>G || gr<0);
cout<<"\nLOS ALUMNOS DEL "<<gr<<" GRADO SON:";
cout<<"\n\nNombre
Edad
Especialidad";
for (x=0;x<N;x++)
if (E[x].Grado==gr)
cout<<"\n"<<E[x].Nom<<"\t\t"<< E[x].Edad<<"\t\t"<<
E[x].Esp;
getch();
}
void Especialidad()
//Consulta por Especialidad
{ int es,x;
clrscr();
cout<<"CONSULTA POR ESPECIALIDAD";
cout<<"\n\n ESPECIALIDAD DEL 1 al "<<C<<" : ";
do{
cin>>es;
}
while (es>C || es<0);
cout<<"\nLOS ALUMNOS DE LA ESPECIALIDAD "<<es<<" SON:";
cout<<"\nNombre
Edad
Grado";
for (x=0;x<N;x++)
if (E[x].Esp==es)
cout<<"\n"<<E[x].Nom<<"\t\t"<< E[x].Edad<<"\t\t"<<
E[x].Grado;
}
getch();
87
88
Programacin C y C++
EJERCICIOS PROPUESTOS.
1.- Complementar el ejercicio resuelto Cajero.cpp para que ante un deposito
la cantidad no rebase los $3,000.00 y ante un retiro no sea superior a
$2,000.00 en cada proceso.
2.- Complementar el ejercicio resuelto Escolar.cpp para que adems de las
opciones que maneja contenga la opcin de Bajas.
3.- Rescribir el programa Alumnos.cpp , con un ligero cambio: En lugar de
que la variable de tipo estructura sea una variable local a la funcin main()
que sea una variable global.
4.- En una tienda de videos se desea llevar el control de las pelculas para
tener a la mano los siguientes datos: Titulo, duracin, mes y ao de compra.
Escribir un programa que una vez dado de alta cada una de las N pelculas, los
muestre ordenados por su fecha de compra.
5.- Programa para calcular el rea de las siguientes figuras geomtricas:
Rectngulo, Circulo, Trapecio. Por cada figura se contar con una funcin
que retornar el rea calculada, usar un men de opciones.
6.- Una tienda de ferretera desea contar con informacin de los artculos que
vende tales como: Nombre, Precio unitario y Existencia, Si la existencia esta
por debajo del punto de pedido (PP = 3), deber generar una ficha de compra
que contenga los Nombres y cantidades (PP + 6) de artculos que desea
adquirir.
89
Programacin C y C++
Capitulo 5
Que es la POO
Definicin de una clase
Tipos de Accesos a una clase
Tipos de Usuarios
Relacin entre Usuarios y Tipos de
Accesos
Clases Amigas
Datos Estticos
Constructores y Destructores
Ejercicios
La programacin Orientada a Objetos a revolucionado la tcnica del
anlisis y diseo de programas, la mayora de lenguajes de
programacin actuales utiliza esta tcnica, de aqu la importancia de
conocerlo. En esta unidad y el siguiente se abordan los conceptos
bsicos para poder utilizarlo.
90
Programacin C y C++
QUE ES LA POO
La Programacin Orientada a Objetos es una tcnica o estilo de programacin
que utiliza objetos como bloque esencial de construccin. En la programacin
convencional, los programas se dividen en funciones y datos, mientras que en
la POO, un programa se divide en componentes que contienen funciones y
datos, donde cada componente se considera un objeto.
Objeto
Es cualquier entidad que se pueda imaginar, que contiene datos y funciones. A
los datos se les conoce como datos miembros y a las funciones como
funciones miembros mtodos .
Un objeto tiene tres propiedades que son: Estado, Comportamiento e
Identidad, 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, es decir la serie de operaciones que se pueden
realizar con l, la identidad es lo que hace un objeto diferente uno de otro.
Ejemplo:
Objeto
Datos
Funciones
Persona
Nombre
Comer()
Ciudad
Trabajar()
Edad
Dormir()
Peso
Si los datos miembros tienen asignados valores tales como:
Nombre = Juvenal, Ciudad = Juchitan, Oax., Edad = 35 y Peso = 50
representaran en su conjunto el estado del objeto. Las tres funciones seran el
comportamiento que pudiera tener ese objeto, finalmente el objeto Persona es
muy amplio por que podramos hablar de: Amelia, Daniel, Ranulfo, etc. Cada
una de esta personal son distintas unas de otra y por tanto representaran la
identidad. En el lenguaje C la identidad bsicamente estara definida por un
bloque de memoria, en cada bloque de memoria se almacenara un objeto
distinto.
Los datos y las funciones se encapsulan en una nica entidad, conocida
como clase (class) en el lenguaje C.
DEFINICIN DE UNA CLASE
Una clase es un estructura de datos definido por el programador que adems
de contar con datos miembros, contiene tambin funciones miembros, es por
ello que se dice una clase es la evolucin de una estructura.
Sintaxis:
Programacin C y C++
91
Class Nombre{
Dato_miembro1;
Dato_miembro2;
...
funcin_miembro_1();
funcin_miembro2();
...
}
Ejemplo:
class Empleado{
char Nom[40];
float Salario;
void Asignar(char *N,float S);
void Calcular();
};
El ejemplo muestra una clase llamada Empleado con los datos miembros Nom
y Salario, y funciones miembros Asignar() y Calcular(), esto es solamente la
definicin de la clase, cuando se define una variable de esa clase es cuando se
crea una instancia de la clase o un objeto de la clase. Ejemplo:
Empleado E; //Definicin de un Objeto de la clase Empleado.
Observe la sintaxis que es exactamente igual que la sintaxis para la definicin
de una variable, en el tema de estructuras se observaron varios ejemplos
similares.
Un objeto es por lo tanto una variable de un clase en particular. Para acceder a
un dato miembro de la clase o a una funcin miembro de la clase se usa el
operador . (operador punto) al igual que una estructura si el objeto es esttico
y si es un puntero entonces se usa el operador -> (Operador flecha).
Podra pensarse que para asignar el valor de 1500 al dato miembro Salario se
podra realizar de la siguiente manera:
void main()
{
Empleado E;
//Definicin de un Objeto de la clase Empleado.
E.Salario=1500; //Error
}
Sin embargo dentro de una clase cada uno de sus miembros tienen un control
de acceso, y en este caso si dentro de la clase no se especifica ninguno por
default es del tipo privado, que impide que se pueda manipular desde
cualquier otra parte que no sea la clase misma. Para entender lo anterior
primero analicemos los diferentes tipos de Accesos de una clase
92
Programacin C y C++
Tipos de Usuarios
La propia Clase
Clases derivadas
Usuarios gener.
*
Private
*
*
Protected
*
*
*
Public
Tabla 5. 2.- Relacin entre usuarios y tipos de accesos
La tabla se puede interpretar de la siguiente forma, Los usuarios que
son considerados como la propia clase tendrn privilegios sobre todos los
datos y funciones miembros de la clase, independientemente del tipo de
acceso, los usuarios de clases derivadas solamente tendrn privilegios sobre
los datos y funciones miembros que tengan el acceso del tipo protected y
Programacin C y C++
93
public, finalmente los usuarios genricos tendrn privilegio sobre los datos y
funciones miembros que tengan el tipo de acceso public.
Tener privilegios sobre un dato o funcin miembro, significa poder
usarlos. Ahora se puede entender por que el objeto que se define en la funcin
main() no puede directamente acceder a un dato miembro de la clase si este
dato tiene el tipo de acceso private. Para poder tener el privilegio se requiere
definir un tipo de acceso public.
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 genrico se hace
a travs de las funciones miembros.
Ejemplo:
/*Clase.cpp */
class Empleado{
char Nom[40];
float Salario;
public:
void Asignar(char *N,float S);
void Calcular();
};
//falta implementacin de funciones miembros
void main()
{
Empleado E;
E.Asignar("Juan Prez",120);
}
94
Programacin C y C++
Tipo_de_retorno Nombre_Clase::Nombre_Funcion(Lista_de_parmetros)
{
...//Cdigo
}
El siguiente ejemplo muestra la implementacin de la funcin Asignar()
dentro de la clase, y la funcin Calcular() mediante una implementacin
independiente.
/*Clase2.cpp */
#include <string.h>
#include <conio.h>
#include <iostream.h>
class Empleado{
char Nom[40];
float Salario;
public:
//implementacin dentro de la clase
void Asignar(char *N,float S) {strcpy(Nom,N);Salario=S;}
void Calcular();
};
//Implementacin independiente
void Empleado::Calcular()
{ float S;
S=Salario*7;
cout<<"El salario Semanal de: "<<Nom<<" :"<<S;
}
void main()
{ clrscr();
Empleado E;
E.Asignar("Juan Prez",120);
E.Calcular();
}
La salida del programa es:
El salario Semanal de: Juan Prez :840
Programacin C y C++
95
CLASES AMIGAS
Una clase puede conceder privilegios de acceso a sus zonas privadas a
otra funcin o clase. Tal acceso se debe indicar explcitamente declarando la
otra clase o funcin miembro del tipo amiga (friend). Las amigas se tratan
como si fueran miembros de la clase, y tienen acceso no restringido a las
zonas privadas y publicas de los objetos.
Funciones amigas
Una funcin amiga es una funcin no miembro de una clase que puede tener
acceso a los datos y funciones miembros privadas de una clase. Las funciones
amigas se declaran anteponiendo la palabra reservada friend a la definicin de
la funcin. Sintaxis:
Classs Nombre_clase{
...
friend tipo_retorno Nombre(Lista de parmetros);
...
}
Ejemplo:
96
Programacin C y C++
/*AmigaF.cpp */
#include <conio.h>
#include <iostream.h>
class Prueba{
int z;
public:
int Verz(){return z;}
friend void f1(Prueba *Obj,int a);
};
//Implementacin de funcin amiga
void f1(Prueba *Obj, int a)
{
Obj->z=a;
}
void main()
{ clrscr();
Prueba P;
f1(&P,20);
cout<<P.Verz();
getch();
}
Programacin C y C++
97
En este caso todas las funciones de la clase amiga pueden acceder a las
partes privadas de la otra clase. Una clase amiga debe ser declarada antes de
que se pueda ser designada como amiga.
Ejemplo:
//Pendiente
DATOS ESTTICOS
Un dato miembro esttico significa que existe solo una instancia de ese
miembro y es compartido por todos los objetos de una clase , existe incluso si
se define ningn objeto de esa clase. Para definir un dato miembro esttico se
le antepone a la definicin de la variable la palabra reservada static.
A un dato miembro esttico se le asigna una zona fija de
almacenamiento en tiempo de compilacin, al igual que una variable global,
por ello se debe definir fuera de la clase.
Ejemplo:
/*Estatic.cpp */
#include <conio.h>
#include <iostream.h>
class Datos{
static int Cont;
//Dato miembro esttico
int v;
public:
void asignac(int c){Cont=c;}
void asignav(int x){v=x;}
int verc(){return Cont;}
int verv(){return v;}
};
int Datos::Cont;
void main()
{ clrscr();
Datos d1,d2;
//Creacin de dos objetos
d1.asignac(10);
d2.asignac(20);
d1.asignav(255);
d2.asignav(500);
cout<<d1.verc()<<"\t"<<d2.verc();
cout<<"\n"<<d1.verv()<<"\t"<<d2.verv();
}
La salida es:
20
20
255 500
En la funcin 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, se observa que la salida del programa muestra el mismo
98
Programacin C y C++
valor para el dato miembro esttico, esto significa que no son variables
distintos para cada objeto que se cree a partir de la clase sino que es el mismo,
mientras que en el caso del dato miembro v los valores son diferentes.
CONSTRUCTORES Y DESTRUCTORES
Las clases pueden tener cualquier nmero de funciones miembros, pero dos
funciones especiales se pueden declarar: el constructor y el destructor.
C++ ofrece un mecanismo para inicializar objetos, cuando se crean a
travs de funciones constructores y un mecanismo correspondiente para
destruir objetos cuando ya no se necesitan dentro de su mbito a travs de una
funcin destructor.
Los constructores y destructores son funciones miembros especiales
que contienen la mayora de las clases. Las clases pueden declarar uno o ms
constructores para inicializar automticamente los objetos de las clases. Las
clases pueden tambin declarar solamente un destructor que se llama para
realizar la limpieza cuando un objeto sale de mbito. Los constructores y
destructores siguen reglas muy estrictas de sintaxis.
Constructores
//Primer Constructor
//Segundo constructor
99
Programacin C y C++
//Implementacin 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
//2 objetos
100
Programacin 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 funcin constructora.
En ambos constructores se asigna memoria dinmica al dato miembro
Nom y no se observa en ningn lugar del cdigo 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 funcin destructor, tema
que se trata a continuacin.
Destructores
Un destructor es una funcin miembro con igual nombre que la clase, pero
precedido por una carcter (). Un destructor realiza la funcin opuesta de un
constructor, limpiando el almacenamiento asignado a los objetos cuando se
crean. Las funciones destructores tienen las siguientes caractersticas:
Tiene el mismo nombre que la clase, precedido por una tilde ()
No retorna ningn valor
No tiene parmetros
Una clase solamente puede tener como mximo un destructor.
Se llama automticamente 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
};
Programacin C y C++
101
EJERCICIOS RESUELTOS
1.- Escribir un programa que cuente el nmero de objetos que se crean a partir
de una clase, usando un dato miembro esttico y un constructor.
/*Estatic2.cpp*/
#include <conio.h>
#include <iostream.h>
class Modelo{
static int Cont;
//Dato miembro esttico
public:
Modelo(){Cont++;}
//Constructor
int VerC(){return Cont;}
};
int Modelo::Cont=0;
//Definicin e inicializacin
void main()
{ clrscr();
Modelo Ob1,Ob2,Ob3;
cout<<Ob1.VerC();
//Visualiza 3
Modelo Ob4,Ob5;
cout<<"\t"<<Ob1.VerC(); //Visualiza 5
}
102
Programacin C y C++
gotoxy(x1,y1);cout<<"";
gotoxy(x2,y1);cout<<"";
gotoxy(x1,y2);cout<<"";
gotoxy(x2,y2);cout<<"";
}
void main()
{ clrscr();
Rect R;
//Se crea un objeto
R.Dibujar();
//se dibuja con valores por defecto
R.Asignar(30,8,50,16);
R.Dibujar();
getch();
}
//Constructor
Programacin C y C++
{int Cant;
do{
clrscr();
cout<<"BIENBENIDO A LA OPCION DE RETIRO";
cout<<"\n Cantidad: ";
cin>>Cant;
if (Cant>Sal)
{
cout<<"\nRebasa su Saldo";
getch();
}
}
while (Cant>Sal && Sal!=0);
if (Sal!=0)
Sal=Sal-Cant;
Saldo();
}
void main()
{ char op;
Cajero C; //Se crea el objeto
do{
clrscr();
cout<<"CAJERO AUTOMATICO";
cout<<"\n1.- Depsito";
cout<<"\n2.- Retiro";
cout<<"\n3.- Saldo";
cout<<"\n4.- Salir";
do{
cout<<"\n\nOpcion:";
op=getch();
}
while (op!='1'&&op!='2'&&op!='3'&&op!='4');
switch(op){
case '1':C.Deposito();
break;
case '2':C.Retiro();
break;
case '3':C.Saldo();
break;
}
}
while (op!='4');
}
103
104
Programacin C y C++
4.- Escribir un programa que maneje una clase Hora con datos miembros tales
como horas, minutos y segundos y funciones para la asignacin visualizacin
de los datos, deber contar con dos constructores.
/*Hora.cpp*/
#include <iostream.h>
#include <conio.h>
class Hora{
int Hra;
int Min;
int Seg;
public:
Hora(){Hra=0;Min=0;Seg=0;} //Primer Constructor
Hora(int H,int M,int S);
//Segundo constructor
void Asigna();
void Ver();
};
//Implementacin de funciones miembros
Hora::Hora(int H,int M,int S)
{
Hra=H;
Min=M;
Seg=S;
}
void Hora::Asigna()
{
cout<<"\nHora: ";
cin>>Hra;
cout<<"Minutos: ";
cin>>Min;
cout<<"Segundos: ";
cin>>Seg;
}
void Hora::Ver()
{
cout<<"\nLa hora es: "<<Hra<<":"<<Min<<":"<<Seg;
}
//Funcin principal
void main()
{ clrscr();
Hora H(9,14,10); //Creacin de un objeto
H.Ver();
H.Asigna();
H.Ver();
getch();
}
Programacin C y C++
105
106
Programacin C y C++
EJERCICIOS PROPUESTOS
1.- A partir del ejercicio resuelto 2 (Rectang.cpp) realice las modificaciones
necesarias para dibujar una secuencia de 10 rectngulos en la pantalla
iniciando por uno pequeo, hasta terminar con el ltimo que llene totalmente
la pantalla, repetir este proceso cclicamente hasta que se pulse la tecla <Esc>.
2.- Rescribir el ejercicio resuelto Escolar.cpp y Alumnos.cpp presentado en el
capitulo anterior pero ahora utilizando las tcnicas de la programacin
Orientada a objetos.
3.- Explique que constructor utiliza el objeto creado en el ejercicio resuelto
Hora.cpp, y cual utilizara si se crea el siguiente objeto: Hora H2; en cada
caso que valores toman los datos miembros.
4.- Complementar el ejercicio resuelto Complejo.cpp para que adems de
convertir nmeros en su forma rectangular a polar haga tambin conversin de
polar a rectangular.
Programacin C y C++
107
Capitulo 6
Herencia y Polimorfismo
Clases Derivadas
Herencia Simple y Mltiples
Problema y solucin de la Herencia Mltiples
Constructores y Destructores en clases
Derivadas
Polimorfismo
Sobrecarga de funciones
Funciones virtuales
Clases Abstractas
Ejercicios
La herencia y el polimorfismo son dos caractersticas de la programacin
Orientada a objetos.
La herencia se aplica para extender y reutilizar el cdigo existente por
medio de la creacin 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
Programacin 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. Adems, se puede aadir 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
ms clases. Por lo consiguiente se puede construir jerarquas 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
Clase base
Rectang
Clases Derivadas
R_Relle
109
Programacin C y C++
Herencia Simple
C
Herencia Mltiple
//Clase Base
110
Programacin C y C++
//Clase Base
//Cambiar a private y compilar
class B:public A{
//Clase derivada
int b1;
public:
void Asignar(int a,int b){a1=a;b1=b;}
void Ver(){cout<<a1<<" "<<b1;}
};
void main()
{
B Obj;
Obj.Asignar(10,20);
Obj.Ver();
}
//Visualiza 10
20
111
Programacin C y C++
Una clase derivada hereda datos y funciones miembros de su clase base. Los
miembros heredados se pueden utilizar con objetos de clase derivada, Si un
miembro heredado se redefine en una clase derivada , el nombre redefinido
oculta el nombre heredado. Para llamar a un miembro ocultado es necesario
utilizar el operador ::.
Ejemplo:
/*FunOcult.cpp */
#include <conio.h>
#include <iostream.h>
class B{
public:
void Funcion(){cout<<"\nFuncin B";}
};
class D:public B{
public:
void Funcion(){cout<<"\nFuncin D";}
void F2();
};
void D::F2()
{
Funcion();
B::Funcion();
}
void main()
{
clrscr();
D Obj;
Obj.F2();
}
//1a. funcin
//2a. funcin
112
Programacin C y C++
113
Programacin C y C++
// Herencia Multiple
114
Programacin C y C++
115
Programacin C y C++
A
2. Solucin
1. Solucin
D
Ejercicio:
El siguiente rbol de herencia, contiene un conjunto de clases con atributos de
tipo entero: a).- Definir las clases, b).- Que atributos tendran los objetos que
se definan a partir de cada clase.
116
Programacin C y C++
a1,a2
b1
c1
d1
e1
f1,f2
G
g1
A
T
R
I
B
U
T
O
S
A
a1
a2
B
b1
C
c1
OBJETOS
D
a1
a2
d1
E
a1
a2
b1
e1
F
c1
f1
f2
G
a1
a2
b1
d1
e1
c1
f1
f2
g1
Programacin C y C++
117
POLIMORFISMO
El polimorfismo es la propiedad por la cual los objetos que pertenecen a
clases diferentes pueden responder al mismo mensaje (funcin) de diferentes
formas. Por ejemplo, supngase que se dispone de las clase Rectngulo,
Circulo, Triangulo, Cilindro, cuyos objetos representan las figuras
geomtricas, los objetos de estas clases pueden contener una funcin Area()
que calcule el rea correspondiente. Sin embargo la respuesta al mensaje area
ser diferente para cada uno de los objetos. Una caracterstica esencial del
polimorfismo es que se pueden enviar mensajes sin conocer la clase de objeto
recipiente. Por ejemplo se puede tener una lista de los posibles objetos que
pueden aparecer en la pantalla, para visualizar cualquiera de ellos basta con
118
Programacin C y C++
enviar el mensaje Show() para que se visualice, sin tener que preocuparse de
cada objeto de la lista.
En C++, el polimorfismo se implementa por medio de sobrecarga de
funciones y con funciones virtuales.
SOBRECARGA DE FUNCIONES
Consiste en definir dos ms funciones con el mismo nombre aunque con
diferencias en el nmero o tipo de parmetros que reciben, as la funcin que
se llame ser el que coincida con nmero y tipo de argumento. Esto permite
que una funcin se comporte de una forma u otra dependiendo de los
argumentos, de aqu el comportamiento polimrfico. Al permitir que una clase
tenga ms de un constructor es un caso de sobrecarga de funciones.
Ejemplo:
/*Sob_Fun.cpp */
#include <string.h>
#include <conio.h>
#include <iostream.h>
class Matematico{
public:
int
Sumar(int A, int B){return A+B;}
float Sumar(float A, float B){return A+B;}
char * Sumar(char *A, char *B){strcat(A,B);return A;}
};
void main()
{ Matematico M;
float f1=25.3,f2=34.9;
cout<<"\n"<<M.Sumar(10,20);
cout<<"\n"<<M.Sumar(f1,f2);
cout<<"\n"<<M.Sumar("Hola ", "Amigo");
}
La salida del programa es
30
60.200001
Hola Amigo
Programacin C y C++
119
Cilindro
Altura;
virtual float Area();
120
Programacin C y C++
};
//funcin que proporciona el comportamiento polimrfico
float Area (Circulo Obj)
{
return(Obj.Area()); //Segn el objeto recibido es la funcin
}
// que se llama
void main()
{ Circulo C(5);
//Objeto Circulo
Cilindro Cl(10,5);
//Objeto Cilindro
cout<<"Area del Circulo: "<<Area(C);
//Imprime 78.54
cout<<"\nArea del Cilindro: "<<Area(Cl); //Imprime 314.16
}
En C++ las funciones virtuales siguen una regla precisa: la funcin debe ser
declarada como virtual en la primera clase que esta presente, (en la clase
base). Una funcin virtual es una funcin que se declara en la clase base como
virtual y se redefine en una ms clases derivadas. Las funciones virtuales,
son especiales ya que cuando se accede a una de ellas usando una referencia a
un objeto de una clase derivada, C++ determina en tiempo de ejecucin a qu
funcin llamar en funcin del tipo de objeto apuntado.
CLASES ABSTRACTAS
Una clase abstracta es aquella que slo se puede utilizar como clase base; no
se puede utilizar para declarar objetos. Desde el punto de vista del lenguaje ,
una clase es una clase abstracta si tiene al menos una funcin vitual pura.
Una funcin virtual pura es aquella cuya declaracin no est seguida
por una implementacin; es decir, que la clase base no puede implementar y
que se inicializan a cero. Sintaxis:
Virtual void func_pura()=0;
El uso de una clase abstracta no es estrictamente necesaria, la ventaja
de una clase abstracta reside en la elegancia de combinar las caractersticas
comunes de una serie de clases especiales en una clase base que no se utiliza
para crear un objeto.
Una clase abstracta se utiliza en los casos donde exista polimorfismo,
partiendo del echo de que las funciones virtuales que existan en el rbol de
herencia solamente se debe definir en la clase base, si esta clase base es una
clase genrica y no se requiere la definicin de objetos a partir de ella
entonces se debe definir como clase abstracta.
Programacin C y C++
121
Ejemplo:
Se desea escribir un programa que maneje los datos de los Alumnos y
Maestros segn la siguiente tabla:
Datos
Funciones
Alumno
Nombre
Direccin
No. de Control
Especialidad
Alumnos()
void Ver()
OBJETOS
Maestro
Nombre
Direccin
Plaza
Departamento
Maestro()
void Ver()
Se aprecia que los datos Nombre y Direccin, as como la funcin Ver() son
comunes a los dos objetos, se puede crear una clase genrica al que se le
llame Persona que contenga estos tres miembros, y con la finalizad de darle el
comportamiento polimrfico definir la funcin Ver() como virtual. En este
caso no se pretende definir ningn objeto de la clase Persona por lo que
deber ser una clase abstracta, o sea la funcin Ver() ser definida como una
funcin virtual pura. El rbol de herencia queda de la siguiente forma.
Persona
Nom, Dir;
virtual void Ver()=0
Alumno
NCtrl, Esp;
void Ver();
Maestro
Plaza, Depto;
void Ver();
122
Programacin C y C++
char NCtrl[15];
char Esp[30];
public:
Alumno(char *N,char *D,char *Ct,char *E);
void Ver();
};
//Implementacin de funciones miembros de la clase Alumno
Alumno::Alumno(char *N,char *D,char *Ct,char *E):Persona(N,D)
{
strcpy(NCtrl,Ct);
strcpy(Esp,E);
}
void Alumno::Ver()
{
cout<<"\n\nDATOS DEL ALUMNO";
cout<<"\n"<<Nom;
cout<<"\n"<<Dir;
cout<<"\n"<<NCtrl;
cout<<"\n"<<Esp;
}
class Maestro:public Persona{
char Plaza[30];
char Depto[40];
public:
Maestro(char *N,char *D,char *P,char *Dp);
void Ver();
};
//Implementacin de funciones miembro de la clase Maestro
Maestro::Maestro(char *N,char *D,char *P,char *Dp):Persona(N,D)
{
strcpy(Plaza,P);
strcpy(Depto,Dp);
}
void Maestro::Ver()
{
cout<<"\n\nDATOS DEL MAESTRO";
cout<<"\n"<<Nom;
cout<<"\n"<<Dir;
cout<<"\n"<<Plaza;
cout<<"\n"<<Depto;
}
//Funcin que proporciona el comportamiento polimrfico
void Ver(Persona *P)
//El parmetro debe ser un apuntador
{
P->Ver();
}
void main()
{ //Persona P; //Error no se puede crear un objeto
Alumno A("Juan Prez","Av. Jurez", "93190203", "Informtica");
Maestro M("Juvenal","Av. Hidalgo","Titular A","Sistemas y Computacin");
Ver(&M);
Programacin C y C++
123
Ver(&A);
}
La salida del Programa es:
DATOS DEL MAESTRO
Juvenal
Av. Hidalgo
Titular A
Sistemas y Computacin
DATOS DEL ALUMNO
Juan Perez
Av. Juarez
93190203
Informtica
124
Programacin C y C++
EJERCICIOS RESUELTOS
1.- Complementar el ejercicio resuelto Rectang.cpp desarrollado en el
capitulo anterior, para que adems de la clase Rect (Rectngulo) contenga
tambin otra clase deriva que le permita dibujar rectngulos rellenados.
/*RectRell.cpp */
#include <conio.h>
#include <iostream.h>
class Rect{
protected:
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;}
};
//Implementacin independiente de funciones
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<<"|";
}
gotoxy(x1,y1);cout<<"";
gotoxy(x2,y1);cout<<"";
gotoxy(x1,y2);cout<<"";
gotoxy(x2,y2);cout<<"";
}
class RecRell:public Rect{
char Car;
public:
RecRell():Rect(){Car='';}
//Llama al constructor base
void Dibujar();
void Asignar(int x,int y, int j,int k,char c);
};
//Implementacin independiente
void RecRell::Dibujar()
{ int x,y;
Rect::Dibujar();
//A Que funcin se llama?
for (y=y1+1;y<y2;y++)
//rellena el rectngulo
for (x=x1+1;x<x2;x++)
{
Programacin C y C++
125
gotoxy(x,y);cout<<Car;
}
void RecRell::Asignar(int x,int y, int j,int k,char c)
{
Rect::Asignar(x,y,j,k);
Car=c;
}
void main()
{ clrscr();
Rect R;
//Objeto
RecRell Rell;
//Objeto
R.Asignar(10,8,30,16);
R.Dibujar();
//Dibuja
Rell.Dibujar();
//Dibuja
Rell.Asignar(50,8,70,16,177);
Rell.Dibujar();
}
de la clase Rect
de la clase RecRell
un rectngulo
un rectngulo rellenado
TBase
SalDa, Ant;
Leer(); Visualizar();
PagarSalario();
Trabajador
Nom, Dir,
Leer();
Visualizar();
TEventual
HonoHra;
Leer(); Visualizar();
PagarSalario();
126
Programacin C y C++
127
Programacin C y C++
cout<<"AOS DE SERVICIO: ";
cin>>Ant;
}
void TBase::Visualizar()
{
cout<<"\nTRABAJADOR DE BASE";
Trabajador::Visualizar();
cout<<"\n"<<SalDia;
cout<<"\n"<<Ant;
}
void TBase::PagarSalario()
{ float SalSemanal;
SalSemanal=SalDia*7 + Ant*0.02*SalDia*7;
cout<<"\nSalario semanal: "<<SalSemanal;
}
//Ms el 2% por ao
128
Programacin C y C++
3.- Suponga que en una situacin 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.
Solucin:
rbol de herencia:
Base
b1
Der1
a1
A
a2
Der2
d1
B
b2
D
d2
C
c2
Definicin de clases
class Base{
private:
int b1;
};
class Der1:public virtual Base{
private:
int a1;
};
class Der2: public Base{
private:
int d1;
};
class A:public Base,public Der1{
int a2;
};
129
Programacin C y C++
EJERCICIOS PROPUESTOS
1.- Cual es la salida en pantalla del programa RectRell.cpp
2.- Muestre un ejemplo de la salida en pantalla del programa Trabaj.cpp
3.- Modifique el ejercicio resuelto Trabaj.cpp te tal forma que se utilice
polimorfismo mediante funciones virtuales (Deber proporcionar la misma
salida en pantalla).
4.- Suponga que en una situacin 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