Separata Fundamentos Poo
Separata Fundamentos Poo
Separata Fundamentos Poo
CAPITULO I
CAPITULO I
Ing. Ricardo Castaeda De La Rosa
ABSTRACCION
MODELO
Figura 1.1
Ing. Ricardo Castaeda De La Rosa
El modelo define una perspectiva abstracta del problema. Esto implica que el modelo se enfoca
solamente en aspectos relacionados con el problema y que t tratas de definir propiedades del
problema. Estas propiedades incluyen
Los datos que son afectados
Las operaciones que son identificadas por el problema.
Vamos a plantear un caso, deseamos manejar los alumnos de un instituto. Que informacin es
necesaria, que funciones necesitamos que trabajen: Algunas propiedades serian
DNI,
Nombre
Fecha de nacimiento,
Talla
Domicilio,
Color de ojos
Color de pelo,
Telfono
pero nosotros nos abstraeremos y tomaremos solo las propiedades necesarias para resolver el
problema. Este modelo solo implica propiedades que son necesarias para cumplir con los
requerimientos de la aplicacin, por ejemplo el nombre, fecha de nacimiento y el DNI. A estas
propiedades se les llama los datos del modelo (de alumno). Ahora ya se tienen descritas a los
alumnos reales por medio de un alumno abstracto.
Definiremos algunas operaciones para manejar los alumnos:
Nombre
El modelo quedara:
Fecha de Nacimiento
DNI
Matricula_Ingresantes
Evaluacion
void main( )
{.
...........
1.2.1. Directivas del Preprocesador:Permite que se realicen ciertas tareas antes que la
compilacin se efecte. Las directivas son normalmente #include y #define.
Ing. Ricardo Castaeda De La Rosa
Ejemplo:
# include<math.h> // incluye el archivo fuente en C++ de las libreras matemticas
# include<conio.h> // incluye el archivo fuente de manejo de pantalla
# define PI 3.1416 // indica que PI es equivalente a 3.1416
Tambin:
# include<nombre_archivo> // Busca en directorio por defecto
# include nombre_archivo// Busca en directorio actual y luego en directorio por defecto
1.2.2. Declaraciones Globales: Indica que variables y funciones definidas por el usuario comunes
(accesibles) a todas las funciones del archivo fuente.
Ejemplo:#include <iostream.h>
int A,B; float C, D;
int media(int p1, int p2); // Prototipo
1.2.3. La funcin main(). Es el punto de inicio de la ejecucin de un programaEn programas
simples todo el cdigo se coloca en el programa.
Ejemplo :
# include <iostream.h>
#include <conio.h>
void main ( )
{ int a,b,c;
clrscr();
cout<< ingrese a: ;
cin>>a;
cout<< ingrese b: ;
cin>>b;
c=a+b;
cout<<La suma es:<<c<<endl;
getch();
}
void leer( )
{
}
void procesar_planillar( )
{
}
void inprimir_planillar( )
{
}
1.3.2.
Creacin de un Programa.- Para crear y ejecutar un programa hay que realizar las
siguientes etapas:
Utilizando un editor de texto escribimos el programa y lo grabamos, este programa grabado ser el
archivo fuente del programa.
Genera nombre.cpp
Traduccin del programa a lenguaje de maquina o un cdigo entendible por el computador, llamado
tambin compilacin, se genera el cdigo objeto.
Genera nombre.obj
Enlace del cdigo objeto con los cdigos de las diferentes libreras producindose el cdigo
ejecutable.
Genera nombre.exe
1.3.3.
programa como constantes, variables, funciones etc. Ejemplo: lnea, leer_datos, valor, suelo, PI.
Todo identificador est compuesto por letras, dgitos y el carcter subrayado, el primer carcter
debe de ser una letra.
Palabras reservadas.- Son identificadores que son utilizados por el sistema y no pueden ser
utilizados para otros fines. Ejemplo: char, return, break, if etc.
Comentarios.- Nos entregan informacin sobre el programa pero no son procesables. Existen
dos tipos en C
/* ........*/ Comentario se puede hacer por varias lneas
Ing. Ricardo Castaeda De La Rosa
1.5. Tipos de Variables estndar en C++.- Datos estndar quiere decir aceptados por todos, en C++
tenemos como en la mayora de lenguajes enteros, reales y carcter.
Entero
int 9 digitos
long 9 digitos
4 bytes
4 bytes
Real
float 3.4 x 10-38 a 3.4 x 1038 4 bytes
double 1.7 x 10-308 a 1.7 x 10308 8 bytes
long double 3.4 x 10-4932 a 3.4 x 103932 10bytes
char
Char
-128...... 127
Unsigned char 0..255
1 byte
1 byte
10
#define raiz2
1.4142
1.7. Variables.- Se le asigna una posicin de memoria cuyo contenido si puede ser modificado, al
contrario de las constantes que no pueden ser modificadas. La variable tiene un identificador, un
tipo de valor que almacena y una direccin. Su forma general es:
Tipo nombre [= valor];
/* CODIGO: cppcap01ejem01
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 26 DE JUNIO DE 2012
OBJETIVO: Mostrar la salida en pantalla utilizando el operador << y el flujo cout, considera constantes y variables. */
# include<iostream.h>
# include<conio.h>
#define linea1 "|---------------------------------------------------|"
#define linea2 "|---------------------------------------------------|"
void main( )
{ int i;
clrscr();
cout<<linea1<<endl;;
cout<<'|';
for (i=1;i<=20;i++)
cout<<i<<" ";
cout<<'|'<<endl;
cout<<linea2;
getch(); }
EJECUCION
11
En la lectura se asignara valores a las variables sea una por una o varias a la vez, como en el ejemplo 2.PROGRAMA
/* CODIGO: cppcap01ejem02
FECHA: 26 DE JUNIO DE 2012
OBJETIVO: Mostrar las diferentes formas de leer valores y almacenarlos en las variables */
#include<iostream.h>
#include<conio.h>
void main( )
{ int voltaje,corriente;
clrscr();
cout<<"Ingrese voltaje ==> ";cin>>voltaje;
cout<<"Ingrese corriente=> ";cin>>corriente;
cout<<"Voltaje = "<<voltaje<<endl;
cout<<"Corriente = "<<corriente<<endl;
cout<<"Ingrese voltaje y corriente separados por blancos ==> "; cin>>voltaje>>corriente;
cout<<"Potencia ==> "<<voltaje*corriente;
getch();}
EJECUCION
1.9. Secuencias de escape.- Las secuencias de caracteres en las que el primero es la barra
invertida, se denominaron secuencias de escape y nos permiten enviar ciertos caracteres
a la pantalla. Por ejemplo, \n se utiliza para representar el carcter nueva lnea (decimal
10) y \t ser tabulacin horizontal. La tabla es:.
Secuencia Valor
Smbolo
Que hace
\a
0x07
BEL
\b
0x08
BS
Retroceso (backspace)
\f
0x0C
FF
\n
0x0A
LF
\r
0x0D
CR
\t
0x09
HT
\v
0x0B
VT
12
/* CODIGO: cppcap01ejem03
FECHA: 26 DE JUNIO DE 2012
OBJETIVO: MANEJO DE SECUENCIAS DE ESCAPE */
#include<iostream.h>
#include<conio.h>
void main( )
{ // CALCULO DE VALORES PARA UNA FUNCION DE LA FORMA A*X^2+B*X+C
float x,fx,dx;
int i,n,t A,B,C;
clrscr();
cout<<"\n\t\t\t TABULANDO UNA FUNCION \n\n\n";
cout<<"\t Ingrese coeficientes A,B,C separados por blancos: ";
cin>>A>>B>>C;
cout<<"\t Ingrese valor inicial
: ";cin>>x;
EJECUCION
getch() ; }
EJECUCION
: ";cin>>dx;
13
Manipulacin y formato de datos de salida.- El precisar con cuantos decimales debe mostrarse
nuestros datos de salida y que ancho y otras caractersticas se llama dar formato a la salida. Cuando
deseamos manejar este formato lo podemos realizar de la siguiente manera:
1. Mediante el uso de funciones miembro de un objeto de flujo. Su sintaxis es la siguiente:
nombreObjetoInvocador.nombreFuncionMiembro(listaArgumentos );
cout.width( 5 );
cout.fill( '*' );
cout.precision( 3 );
2. Mediante el uso de funciones especiales llamadas manipuladores, con o sin
argumentos.
cout << flush;
cout << endl;
cout << setw( 6 ) << 12 << endl;
cout << seprecision( 2 ) << 12.325 << endl;
3. Mediante el uso de banderas (indicadores) como argumentos de la funcin miembro setf( ) del objeto
de flujo:
cout.setf( ios::fixed );
cout.setf( ios::showpoint );
Veamos la tabla de manipuladores de flujo de salida:
MANIPULADOR
FUNCION QUE REALIZA
dec
Establece la base decimal.
hex
Establece la base hexadecimal
oct
Establece la base octal.
endl
Inserta nueva lnea y cambia de flujo
ends
Inserta un cero nulo al final de la cadena.
flush
Vaca el flujo
setbase(int n)
Establece la conversin de base.
resetiosflags(long f)
Limpia el formato especificado por f.
setiosflag(
long
f)
Establece formato especificado por f.
/* CODIGO: cppcap01ejem04
setfill(int c)
Rellena con el carcter c.
FECHA: 26 DEn)
JUNIO DE 2012
setprecision(int
Establece precisin de punto flotante a n.
setw(int
n) Utilizacion de manipuladores de
Establece
el ancho
OBJETIVO:
flujo de salida
*/ de campo a w.
#include<iostream.h>
#include<conio.h>
void main( )
{ // Lee un valor y lo muestra en formato decimal, octal y hexadecimal
int numero;
clrscr();
cout<<"Ingrese un numero : ";
cin>>numero;
cout<<"Numero decimal......"<<numero<<endl;//base decimal
PROGRAMA
}
Ing. Ricardo Castaeda De La Rosa
14
LO QUE REALIZA
Justifica a la izquierda dentro de setw.
ios::rigth
ios::scientific
/* CODIGO: cppcap01ejem05
ios::fixed
ios::dec
a base 10.
para indicar el nmero de dgitos decimales Formatea
del valor flotante.*/
#include <iostream.h> //Para cout
ios::hex
Formatea a base 8.
ios::uppercase
{
float valor = 3.1416;
ios::showbase
Imprime signo
Ios::showpoint
cout<< setprecision( 2 ) << valor << endl;
cout<< setprecision( 3 ) << valor << endl;
Ejemplo 5.- Veamos un ejemplo que maneje la precisin de salida de un valor real.
cout<< setprecision( 4 ) << valor << endl;
PROGRAMA
15
EJECUCION
PROBLEMAS
1. Dado un numero n se pide calcular la cantidad de cifras impares y de cifra pares que tiene n. Utilizar
variables globales.
Ing. Ricardo Castaeda De La Rosa
16
PROGRAMA
/* CODIGO: cppcap01prob01
FECHA: 26 DE JUNIO DE 2012
OBJETIVO: Lee un numero y halla cuantos cifras pares y cifras pares componen el numero. */
int num,cifra;
int contp, cont; // contador de cifras pares y contador de cifras impares
# include<iostream.h>
# include<conio.h>
void main( )
{ clrscr( );
gotoxy(30,2); cout<<"Ingrese un numero: ";cin>>num;;
while( num!=0)
{ cifra = num%10;
if (cifra%2==0)
contp++;
else
conti++;
num=num/10;
EJECUCION
Nota: Observe algunos detalles, las variables son globales, por lo tanto los contadores se inicializan
automticamente desde cero. Adems num es una variable entera solo debe permitir valores de 5 cifras
pero se sobrepasa, quiere decir que el tipo entero ocupa ms de dos bytes (4 bytes).
2.-Escribamos
un programa que nos permita realizar operaciones con nmeroscomplejos, este programa
realizara la suma, resta y multiplicacin con nmeros complejos, la divisin se deja como tarea para el
estudiante.
PROGRAMA
/* CODIGO: cppcap01prob02
Ing. Ricardo Castaeda De La Rosa
17
18
switch(c3)
{ case 0:cout<<"ROJO"<<endl;break;
3.- Escriba un programa que utilice la definicin del tipo enumerado color, e imprima el color escogido..
case 1:cout<<"VERDE"<<endl;break;
PROGRAMA
case 2:cout<<"AMARILLO"<<endl;break;
case 3:cout<<"AZUL"<<endl;break;
case 4:cout<<"NEGRO"<<endl;break;
getch();
Ing.
} Ricardo Castaeda De La Rosa
19
EJECUCION
4.- Elaborar
un programa que simule la accin de una calculadora de bolsillo: lee una secuencia de valores
numricos separados por operadores aritmticos (+, -, *, /), y calcula el valor de la expresin definida por
esta secuencia. El resultado del clculo se produce cuando se lee el operador =.
PROGRAMA
/* CODIGO: cppcap01prob04
FECHA: 26 DE JUNIO DE 2012
OBJETIVO: Simula la accin de una calculadora de bolsillo o sealee un operando, luego el operador , a
Ing. Ricardo Castaeda De La Rosa
20
5.- Elaborar
un programa que haga clculos para generar una boleta de ventas incluyendo el IGV,
"<<setw(6)<<total;
gotoxy(53,10+i);cout<<"IGV
"<<setw(6)<<igv;
gotoxy(53,11+i);cout<<"----------------------";
gotoxy(53,12+i);cout<<"TOTAL A PAGAR "<<setw(7)<<sumatotal;
getch();
}
EJECUCION
21
22
CAPITULO II
CAPITULO II
Ing. Ricardo Castaeda De La Rosa
23
24
INSTRUCCIONES DE CONTROL EN C
2. INTRODUCCION
2.2. EXPRESIONES Y OPERADORES
2.2.1.
tambin podemos tener algunas expresiones que salen de este formato. Ejemplo : a = *c;
p1 = &c; numero ++.
2.2.2.
sean del tipo real (float) o entero, considerando que en lenguaje C se define el tipo de
operacin por los operandos, si al menos un operando es del tipo float la operacin se
realizara en el modo real.
Operador
+
+
*
/
%
++
--
Entero
Unitario mas
Unitario menos
Suma
Resta
Producto
Cociente de divisin entera
Resto de divisin entera
Incremento
Decremento
Real
.
Unitario mas
Unitario menos
Suma
Resta
Producto
Cociente real
y 3%4 ser 3 ;
10/4 ser 2
pero esta operacin se realiza de izquierda a derecha. Tambin podemos abreviar c+=5 ; que es
equivalente a c = c +5, tenemos lasiguiente tabla
Operador
+=
-=
*=
/=
%=
Abreviatura
a+=b
a-=b
a*=b
a/=b
a%=b
Sentencia
a=a+b
a=a-b
a=a*b
a=a/b
a=a%b
25
Operadores lgicos.- Son el not el and y el or, Relacionan operandos booleanos y su resultado
es booleano, estos son:
And && el and . para que sea verdadero sus dos operandos deben ser verdaderos.
Or ||
/* CODIGO: cppcap02ejem01
FECHA: 20 de JULIO DE 2012
OBJETIVO: Lee un numero y lo invierte */
# include<iostream.h>
# include<conio.h>
void main( )
{ int numero, num_inv, digito ;
clrscr( );
num_inv = 0;
cout<< " Ingrese un numero de 4 digitos => "; cin >> numero;
while ( numero >= 10)
{ digito = numero % 10;
num_inv = num_inv*10 + digito;
numero = numero / 10;
26
PROGRAMA
/* CODIGO: cppcap02ejem02
FECHA: 20 de JULIO DE 2012
OBJETIVO: Observar manejo de punteros en forma basica */
# include<iostream.h>
# include<conio.h>
void main( )
{ int *p1 ; // Declaramos una variable tipo puntero
int a, b ; //Declaramos las variables a y b del tipo entero
clrscr( );
a = 17;
b = 18;
p1 = &a; // p1 apunta hacia a
cout<< "Valor apuntado por p1 ==> "<<*p1<<endl; // Se imprime el valor apuntado por p1
cout<< "Direccion de a almacenada en p1 ==> "<<hex << p1<< endl; // Imprime la direccin de a contenida en p1
cout<< dec; // vuelve al formato decimal
p1 =&b; // p1 toma la direccin de b
cout<< "Nuevo valor apuntado por p1==> "<<*p1; // muestra valor almacenado en el campo apuntado por p1(b)
getch(); }
EJECUCION
:: Indica mbito
empleado.
Ejemplo 3.- Escriba un programa que simule un juego de dados. Las reglas son:
a) En la primera jugada si obtiene una suma de los dados de
2,3 o 12 pierde el juego ; 7 u 11 gana el juego ; Otra suma vuelve a jugar
b) A partir de la segunda jugada el jugador sigue las reglas
Si repite la primera suma gana ; Obtiene 7 pierde
PROGRAMA
/* CODIGO: cppcap02ejem03
FECHA: 20 de JULIO DE 2012
OBJETIVO: Escribir un programa que simula un juego de dados */
# include<iostream.h>
# include<conio.h>
# include<stdlib.h>
# include<time.h>
void main( )
{ int juego1, juego, dado1,dado2;
clrscr ();
randomize();
dado1 = random(6) + 1; dado2 = random(6) + 1;
juego1 = dado1 + dado2;
cout<< juego1<<endl;
if ( (juego1 == 7 ) || ( juego1 == 11 ) )
cout<< " Gano juego" ;
else if ( (juego1 == 2) || (juego1 == 3 ) || ( juego1== 12))
cout<< " Perdio juego";
else
{ do { dado1 = random(6) + 1; dado2 = random(6) + 1;
juego = dado1 + dado2;
cout<<juego<<endl;
} while ( ( juego != juego1) && ( juego != 7));
if ( juego == juego1)
cout<< "Gano juego";
else
cout<< "Perdio juego";
}
getch(); }
27
28
}]
ss
Funcionamiento:
Se evala la condicin, si esta se cumple se ejecuta el bloque 1, caso contrario se ejecuta el bloque 2, si
existe. Finalmente pasa el control de ejecucin a la siguiente sentencia(ss).
Ejemplos:
If(nota > 10)
cout<< Curso Aprobado;
If((numero%2)==0)
cout<< El numero es par;
else
cout<<El numero es impar;
Sentencia if anidada.- Se dice que una sentencia esta anidada dentro de otra cuando una de ellas (la
externa) contiene completamente las sentencias de la otra(la interna o anidada). Veamos esto:
if (condicion1)
{ .;
..;
if(condicion2)
{..;
.;
}
.;
}
else
Ing. Ricardo Castaeda De La Rosa
{ ..;
..;
.;
}
Podemos observar que el if con condicion2 esta anidado en el if con condicion1.
Ejemplo 4.- Programa que lee un nmero y me muestra si es mltiplo de 3, 4 o 5.
/* CODIGO: cppcap02ejem04
FECHA: 20 de JULIO DE 2012
OBJETIVO: Ejemplo de if anidado, programa determina si un numero es de 2, 3 o 4 cifras y si es multiplo de 3 o no */
# include<iostream.h>
# include<conio.h>
void main( )
{ int numero;
clrscr ();
cout<< " ingrese un numero ==> ";
cin>>numero;
if ((numero> 9) && (numero<10000))
{ if (numero>999)
if(numero%3==0)
cout<<" Numero de cuatro cifras y multiplo de 3";
else
cout<<" Numero de cuatro cifras y no es multiplo de 3";
else
if (numero >99)
if(numero %3==0)
cout<<" Numero de tres cifras y multiplo de 3";
else
cout<<" Numero de tres cifras y no es multiplo de 3";
else
if(numero%3==0)
cout<<" Numero de dos cifras y multiplo de 3";
else
cout<<" Numero de dos cifras y no es multiplo de 3";
}
else
cout<<"Numero fuera del rango";
getch(); }
29
30
Ejemplo 5.- Programa que lee tres notas y halla el promedio eliminando la menor y duplicando la mayor.
PROGRAMA
/* CODIGO: cppcap02ejem05
FECHA: 20 de JULIO DE 2012
OBJETIVO: Ejemplo de if que lee tres notas y calcula mayor, menor y halla promedio, duplica la mayor y elimina la menor */
# include<iostream.h>
# include<conio.h>
void main( )
{ int nota1,nota2,nota3,menor,mayor;
float promedio;
clrscr ();
cout<< " ingrese nota1 : "; cin>>nota1;
cout<< " ingrese nota2 : "; cin>>nota2;
cout<< " ingrese nota3 : "; cin>>nota3;
menor=nota1;
mayor=nota1;
if (nota2<menor)
menor = nota2;
if (nota3<menor)
menor = nota3;
if (nota2>mayor)
mayor = nota2;
if (nota3>mayor)
mayor = nota3;
//Calculando promedio
promedio= (nota1+nota2+nota3+mayor-menor)/3.0;
cout<<"El promedio es : "<<promedio;
getch(); }
Ejemplo 6.- Escriba un programa que lea 20 edades y me indique cuantos son :
Bebes (0-5aos)
Nios (5-12 aos)
Adolescentes (12-16 aos)
Jvenes (16-25)
Adultos (25-50)
Mayores (50 a mas)
31
PROGRAMA
/* CODIGO: cppcap02ejem06
FECHA: 8 de AGOSTO DE 2012
OBJETIVO: Ejemplo que lee 20 edades y me indique cuantos son :
Bebes (0-5aos),Nios (5-12 aos), Adolescentes (12-16 aos), Jvenes (16-25) , Adultos (25-50), Mayores (50 a mas) */
# include<iostream.h>
# include<conio.h>
void main( )
{ int edad,i;
int contb=0;//contador de bebes
int contn=0;//contador de nios
int conta=0;//contador de adolescentes
int contj=0;//contador de jovenes
int contd=0;//contador de adultos
int contm=0;//contador de mayores
clrscr ();
for(i=1;i<=20;i++)
{ cout<< " ingrese edad "<<i<< " : ";cin>>edad;
if ( edad>=0)
if (edad<=5)
contb=contb+1;
else if (edad<=12)
contn=contn+1;
else if(edad<=16)
conta=conta+1;
else if (edad <=25)
contj=contj+1;
else if (edad<=50)
contd=contd+1;
else
contm=contm+1; }
cout<<contb<< " bebes"<<endl;
cout<<contn<< " nios"<<endl;
cout<<conta<< " adolescentes"<<endl;
cout<<contj<< " jovenes"<<endl;
cout<<contd<< " adultos"<<endl;
cout<<contm<< " mayores"<<endl;
getch(); }
32
EJECUCION
2.3.2. Sentencia switch.- Deriva el control hacia uno de varios puntos del programa, permite
realizar una seleccin mltiple.
Forma General
switch ( expression)
{ case const1
: ................... ;
....................;
break;
case const2
: ................... ;
....................;
break;
case const3
: ................... ;
....................;
break;
case const4
: ................... ;
....................;
break;
[ default
: .....................;
.....................;]
}
Funcionamiento:
La expresin de control o selector se evala y se compara con cada una de las etiquetas de case.
La expresin selector debe ser un tipo ordinal (por ejemplo, int, char, pero no float o string). Cada
etiqueta es un valor nico, constante y cada etiqueta debe tener un valor diferente de los otros. Si el
valor de la expresin selector es igual a una de las etiquetas case por ejemplo, etiquetai- entonces la
ejecucin comenzar con la primera sentencia de la secuencia sentenciai y continuar hasta que se
Ing. Ricardo Castaeda De La Rosa
33
encuentra el final de la sentencia control switch, o hasta encontrar la sentencia break. Lo normal es que
la sentencia break termine el bloque y despus que siga la ejecucin en la siguiente sentencia switch( ).
Ejemplo 7:Escriba un programa que lea un dia de semana del 1 al 7 y lo imprima en letras . Si lee 1 debe
escribir LUNES.
PROGRAMA
/* CODIGO: cppcap02ejem07
FECHA: 8 de agosto 2012
OBJETIVO: Elige una opcin de un men simpleUso de la sentencia condicional SWITCH. */
#include <iostream.h>
#include <conio.h>
void main()
{ int dia;
clrscr();
cout<<"Introduce el dia: ";
cin>>dia;
switch(dia){
case 1: cout<<"Lunes"; break;
case 2: cout<<"Martes"; break;
case 3: cout<<"Mircoles"; break;
case 4: cout<<"Jueves"; break;
case 5: cout<<"Viernes"; break;
case 6: cout<<"Sbado"; break;
case 7: cout<<"Domingo"; break;
default:cout<<"No es un dia de semana";}
getch();}
EJECUCION
Note que el default no tiene break y es que la salida en este caso es por trmino de la instruccin switch.
ESTRUCTURAS DE REPETICION
2.3.3. Sentencia while.-Nos permite ejecutar repetidamente un grupo de sentencias hasta que el
valor de la expresin se hace cero (condicin falsa)
Forma General
while ( expresin)
{................... ;
.....................;
.....................;
}
Ing. Ricardo Castaeda De La Rosa
34
Funcionamiento:
La expresin booleana o condicin se evala y el bucle se repite mientras la condicin es verdadera. El
bucle while nunca puede iterar si la condicin comprobada es inicialmente falsa.
Ejemplo8:
PROGRAMA
/* CODIGO: cppcap02ejem08
FECHA: 16 de Julio del 2012
OBJETIVO: Ejemplo de estructura repetitiva while */
# include<iostream.h>
# include<conio.h>
# include<stdlib.h>
# include<time.h>
void main( )
{ int numero, suma = 0;
int cont = 1;
clrscr();
randomize();
while ( cont <= 100 )
{numero=random(20);
suma = suma+ numero;
cont++; }
cout<< "La media es = " << suma / 100.0;
getch(); }
EJECUCION
Comentario: Como suma es un acumulador se inicializa en cero, en cambio en este caso cont va
contando por adelantado y su valor final ser 101. Con cont igual a 101 ya no se cumple la condicin y
por lo tanto se sale del bucle while, a esta variable denominada cont se le conoce tambincomo variable
de control del bucle while, esta variable necesariamente debe ser modificada dentro del rango del while
pues de no suceder esto estaramos en un lazo infinito.
2.3.4. Sentencia do-- while.- Las sentencias se ejecutan repetidamente hasta que el valor de la
expresin se hace cero (falso)
Forma General
do
{................... ;
.....................;
.....................;
} while ( expresin);
Ing. Ricardo Castaeda De La Rosa
35
Funcionamiento:
Se ejecutan las sentencias y a continuacin se evala la expresin, y si es verdadero (distinto de cero), el
control se pasa de nuevo al principio de la sentencia do y el proceso se repite, hasta que la condicin
(expresin) sea falsa(cero) y el control pasa a la sentencia siguiente.
Ejemplo 9:
El siguiente ejemplo visualiza los nmeros, cuadrados y cubos de los 20 primeros nmeros:
PROGRAMA
/* CODIGO: cppcap02ejem09
FECHA: 8 de agosto 2012
OBJETIVO: Presenta cuadrados y cubos de los 20 primeros numeros.Usando el do while */
# include<iostream.h>
# include<conio.h>
# include<math.h>
void main( )
{ int numero=1;
do
{cout << numero << "
" <<pow(numero,2)<<"
numero++;
}while (numero < 21);
getch(); }
2.3.5. Sentencia for.- Las sentencias se ejecutan hasta que el valor de la expresion2 sea cero o
sea falso.
Forma General
for ( exp1 ; exp2 ; exp3)
{................... ;
.....................;
}
Funcionamiento:
Una sentencia for ejecuta la iteracin de un bucle un nmero determinado de veces. El lazo for
tiene tres componentes: exp1, inicializa las variables de control del bucle; exp2, es la condicin que
determina si el bucle realiza otra iteracin; la ltima parte del bucle for es la clusula que
incrementa o decrementa las variables de control del bucle.
Exp1se utiliza para inicializar la variable de control de bucle; a continuacin exp2 se evala, si es
verdadera (distinta de cero), se ejecuta la sentencia y se ejecuta exp3 y el control pasa de nuevo al
principio del bucle. La iteracin contina hasta que exp2 es falsa (cero), en cuyo momento el control
pasa a la sentencia siguiente al bucle.
36
37
Una sentencia continue slo puede ocurrir dentro del cuerpo de una sentencia for, while o do.
PROBLEMAS
ESTRUCTURAS DE CONTROL
1. Se tienen 6 datos que son los nombres y edades de tres personas, escriba un programa que lea los
tres nombres y edades e imprima los nombres considerando las edades en forma creciente.
SOLUCION:
A) PROGRAMA:
/* CODIGO: cppcap2prob01
FECHA: 10 DE FEBRERO DE 2012
OBJETIVO: LEE TRES NOMBRES Y EDADES E IMPRIME LOS NOMBRES EN FORMA CRECIENTEPOR EDAD */
# include<iostream.h>
# include<conio.h>
void main( )
{ int edad1, edad2, edad3;
char nombre1[40], nombre2[40], nombre3[40];
clrscr( );
cout<< " Ingrese nombre 1 ==> "; cin>> nombre1;
cout<< " Ingrese edad 1 ==> "; cin>> edad1;
cout<< " Ingrese nombre 2 ==> "; cin>> nombre2;
cout<< " Ingrese edad 2 ==> "; cin>> edad2;
cout<< " Ingrese nombre 3 ==> "; cin>> nombre3;
cout<< " Ingrese edad 3 ==> "; cin>> edad3;
cout<<endl<<endl<<endl;
cout<< "LOS NOMBRES POR EDADES SERA:"<<endl<<endl;
if ( edad1 < edad2)
if( edad2 < edad3)
cout<< nombre1<< " "<<nombre2<< " "<<nombre3<<endl;
else
if (edad1<edad3)
cout<< nombre1<< " "<<nombre3<< " "<<nombre2<<endl;
else
cout<< nombre3<< " "<<nombre1<< " "<<nombre2<<endl;
else
if (edad1 <edad3)
cout<< nombre2<< " "<<nombre1<< " "<<nombre3<<endl;
else
if(edad2<edad3)
cout<< nombre2<< " "<<nombre3<< " "<<nombre1<<endl;
else
cout<< nombre3<< " "<<nombre2<< " "<<nombre1<<endl;
getch( );
Ing. Ricardo Castaeda De La Rosa
38
}
B) RESULTADOS:
2. Escriba un programa que imprima todos los nmeros de tres cifras que sean capicas y cuya suma de
sus dgitos sea par.
Solucion:
PROGRAMA
/* CODIGO: cppcap02prob02
FECHA: 10 de agosto de 2012
OBJETIVO: MUESTRA TODOS LOS NUMEROS DE TRES DIGITOS CAPICUAS Y CUYASUMA DE ESTOS ES PAR */
# include<iostream.h>
# include<conio.h>
void main( )
{
clrscr( );
cout<< " Lista de numeros capicas y suma dgitos par"<<endl<<endl;
for (i=100; i<=999;i++)
{ num = i;
sumadigitos=0;
numinv=0;
while(num>=10)
Ing. Ricardo Castaeda De La Rosa
39
{ digito= num%10;
numinv = numinv*10+digito;
sumadigitos=sumadigitos + digito;
num = num/10; }
numinv = numinv*10+num;
sumadigitos=sumadigitos + num;
if( (i== numinv)&& ( (sumadigitos%2)==0))
cout<< i << endl;
} // FIN DEL FOR
getch( ); }
3. En la UNI se rinde examen de admisin y de un grupo de 20 postulantes para cuatro facultades cuyos
codigos son:
Codigo
Facultad
Ing. De Sistemas
Ing. Mecnica
Ing. Qumica
Ing. Ambiental
40
La Universidad aplica tres tipos de exmenes a sus postulantes. Los postulantes que obtengan por lo
menos dos exmenes aprobados (mayor o igual a 11) son admitidos caso contrario son rechazados. En
base a esto se pide disear un algoritmo que permita:
a) Mostrar por cada postulante el mensaje admitido o rechazado.
b) Presentar el nmero de ingresantes pro facultad.
Solucin:
PROGRAMA
/* CODIGO: cppcap02prob03
FECHA: 13 DE FEBRERO DE 2012
OBJETIVO: LISTA INGRESANTES POR FACULTAD DE UN EXAMEN DE ADMISION */
# include<iostream.h>
# include<conio.h>
# include<ctype.h>
# include<stdlib.h>
# include<time.h>
void main( )
{
int i, conts=0,contm=0,contq=0,conta =0;
int exa1, exa2, exa3, numfac;
char facultad;
clrscr( );
randomize();
for (i=1; i<=20;i++)
{ numfac = random(4)+1;
switch(numfac)
{ case 1 : facultad = 'S';break;
case 2 : facultad = 'M';break;
case 3 : facultad = 'Q';break;
case 4 : facultad = 'A';break;
}
exa1=random(20)+1;
exa2=random(20)+1;
exa3=random(20)+1;
if(((exa1>=11)&&(exa2>=11))|| ((exa1>=11)&&(exa3>=11))||((exa2>=11)&&(exa3>=11)))
{ cout<<"Postulante Admitido"<<endl;
switch(facultad)
{ case 'S' : conts=conts+1;break;
case 'M' : contm=contm+1;break;
case 'Q' : contq=contq+1;break;
case 'A' : conta =conta+1;break;
}
Ing. Ricardo Castaeda De La Rosa
41
}
else
cout<<"Postulante rechazado"<<endl;
}
cout<< " Ingresaron a Ing. Sistemas = "<<conts<<endl;;
cout<< " Ingresaron a Ing. Mecnica = "<<contm<<endl;
cout<< " Ingresaron a Ing. Qumica = "<<contq<<endl;
cout<< " Ingresaron a Ing. Ambiental= "<<conta<<endl;
getch( );
}
4. Se desea leer un conjunto de numeros enteros de tres cifras hasta encontrar un nmero negativo.
Luego mostrar la cantidad de veces que aparece el digito 3 en todos los nmeros positivos ledos.
Solucion:
PROGRAMA
/* CODIGO: cppcap02prob04
FECHA: 10 de agosto de 2012
OBJETIVO: Muestra cuantas veces se aparece el digito 3 en todos los nmeros Ledos antes de encontrar un negativo.*/
# include<iostream.h>
# include<conio.h>
# include<stdlib.h>
# include<time.h>
Ing. Ricardo Castaeda De La Rosa
42
void main( )
{ int numero,d1,d2,d3,contdigitos=0;
clrscr( );
while ( 1 )
{ cout<<"Ingrese un numero : ";
cin>>numero;
if(numero < 0 ) break;
d1= numero%10;
numero=numero/10;
d2=numero%10;
numero=numero/10;
d3 = numero;
if( d3==3) contdigitos = contdigitos+1;
if( d2==3) contdigitos = contdigitos+1;
if( d1==3) contdigitos = contdigitos+1;
}
cout<< "Numero de veces que aparece el digito 3 es = "<<contdigitos<<endl;
getch( ); }
EJECUCION
5. De un experimento de fsica se tienen que leer N temperaturas( entre positivas y negativas) luego
averiguar el numero de apariciones de la menor temperatura negativa.
Solucion:
PROGRAMA
/* CODIGO: cppcap2prob05
FECHA: 10 de agosto de 2012
OBJETIVO: Muestra la mayor de las temperaturas negativas y cuantas veces se presenta.*/
# include<iostream.h>
# include<conio.h>
# include<ctype.h>
Ing. Ricardo Castaeda De La Rosa
43
# include<stdlib.h>
# include<time.h>
void main( )
{
int temperatura, tempmayorneg=-20,conttemp=1;
int i,n;
clrscr( );
cout<<"Ingrese el valor n= ";
cin >>n;
randomize();
for (i=1;i<=n;i++)
{ temperatura= random(41)-20;
cout<< temperatura<<endl;
if( temperatura < 0)
{
if (temperatura == tempmayorneg)
conttemp= conttemp+1;
if(temperatura > tempmayorneg)
{tempmayorneg =temperatura;
conttemp= 1; }
}
}
cout<<endl<<endl;
cout<<"La temperatura es = " << tempmayorneg<<endl;
cout<<" Se presento: "<< conttemp << " Veces";
getch( );
}
6. Escriba un programa que genere enteros entre 1 y 13, y nos indique si los 4 valores son iguales o tres
son iguales o 2 y 2 son o solamente dos iguales y finalmente si los 4 son diferentes.(4 iguales elimina
3 iguales y los otros casos y as).
En este caso siempre se considera la jugada de mayor peso. Por ejemplo: Si obtenemos 3 3 4 3 se
considera tres 3 y ya no dos 3.
SOLUCIN:
PROGRAMA
/* CODIGO: cppcap2prob06
FECHA: 10 de agosto de 2012
OBJETIVO: Genera valores e indica si los cuatro son iguales o si tres soniguales o si dos a dos o si dos*/
# include<iostream.h>
# include<conio.h>
# include<ctype.h>
# include<stdlib.h>
# include<time.h>
void main ()
Ing. Ricardo Castaeda De La Rosa
44
45
Escribir un programa que visualice el manejo de punteros utilizndolos primero con variables simple y
despus con vectores numricos y char.(cadenas)
SOLUCIN:
PROGRAMA
/* CODIGO: cppcap02prob08
FECHA: 10 de agosto de 2012
OBJETIVO: PROGRAMA QUE MANEJA PUNTEROS CON VARIABLES SIMPLES Y VECTORES*/
#include<iostream.h>
#include<conio.h>
void main()
{ int a,b,c,i; int x[4];
int *p1,*p2;
char cadena1[10],cadena2[10];
char *ptc1,*ptc2;
a=10;b=9;c=19;
cout<<"USO DE PUNTEROS CON VALORES ENTEROS "<<endl;
cout<<"Valor 1: "<<a<<endl;
cout<<"Valor 2: "<<b<<endl;
cout<<"Valor 3: "<<c<<endl;
cout<<"
"<<endl;
p1=&a;
cout<<" Direccion de p1
: "<<&p1<<endl;
: "<<&p1<<endl;
: "<<*p1<<endl<<endl;
: "<<&p2<<endl;
: "<<x<<endl;
46
p2=p2+1; cout<<endl;
cout<<" CAMBIO p2=p2++"<<endl;
cout<<" Direccion de p2
: "<<&p2<<endl;
: "<<*p2<<endl;
47
EJERCICIOS PROPUESTOS
1.
Escriba un programa que simule un juego de dados como en el ejemplo de este captulo pero en cada caso debe ganar o
perder una suma, si inicialmente usted fija un pozo o sea una cantidad, el juego terminara cuando pierda todo el pozo inicial o
lo duplique.
2.
Escriba un programa que genere 5 valores al azar entre 1 y 13 (cinco cartas de una baraja de casinos) y me indique si
tenemos un par, 2 pares , un tro , un full (3 iguales y dos iguales) o pker ( cuatro iguales)
3.
Escriba un programa que me permita descubrir una clave de cuatro dgitos realizando todas las combinaciones posibles hasta
dar con la clave.
4.
Escriba un programa que lea 5 practicas de 10 alumnos halle el promedio de cada uno de ellos y me indique cual es el mejor
promedio.
5.
Escriba un programa que me permita hallar el maximo comn divisor y el mnimocomnmltiplo de dos valores enteros.
6.
Se realizan elecciones entre tres partidos politicos,escribaun programa que me permita indicar el ganador y si adems supera
el 50% ser el ganador oficial en primera vuelta.
48
CAPITULO III
49
CAPITULO III
FUNCIONES EN LENGUAJE C + +
3
Definicin.- Es un conjunto de instrucciones agrupadas que tienen un nombre comn y que realizan
un clculo (o proceso) especifico. Todo programa en lenguaje C se desarrolla basndose en
funciones, estas posteriormente pueden formar una librera particular.
3.1
Funciones Predefinidas (De biblioteca)Aqu tenemos una serie de funciones, debemos considerar
que al invocarlas debemos seguir las siguientes reglas:
Consideremos la Funcin sqrt
Syntax
#include <math.h>
double sqrt(double x);
Retorna el valor absoluto de una variable entera, y cuando se incluye la librera stdli.h tambien
considera valores bcd. La funcin fabs(double x) considera valores reales.
Ejemplo 1.- escriba un programa que lee tres valores y me imprime el mayor valor absoluto.
PROGRAMA
/* CODIGO: cppcap03ejem01
FECHA: 15 de agosto 2007
OBJETIVO: ejemplo DE LA FUNCION ABS() Y FABS()*/
Ing. Ricardo Castaeda De La Rosa
50
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
void main()
{ int valor1;
float valor2;
double valor3,x,y z,mayor;
clrscr();
cout<<"Ingrese valor 1 ==> "; cin >>valor1;
cout<<"Ingrese valor 2 ==> "; cin >>valor2;
cout<<"Ingrese valor 3 ==> "; cin >>valor3;
x = abs(valor1);
y = abs(valor2);
z = abs(valor3);
if (x>y)
mayor= x;
else
mayor=y;
if (z>mayor)
mayor= z;
cout<<"El mayor ser: "<<mayor;
getch(); }
EJECUCION
Ceil retorna el entero no menor que x, osea redondea hacia arriba y floor redondea hacia abajo.
Ejemplo 2.- Escriba un programa que calcule un promedio de 5 edades y me indique entre que
edades consecutivas se encuentra.
PROGRAMA
Ing. Ricardo Castaeda De La Rosa
51
/* CODIGO: cppcap03ejem02
FECHA: 15 de agosto 2012
OBJETIVO: Ejemplo de las funciones ceil() y floor().*/
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>
void main()
{ int edad,i;
float promedio=0,edadprom1,edadprom2;
clrscr();
for (i=1;i<=5;i++)
{cout<<"Ingrese edad "<<i<<" : ";
cin >>edad;
promedio=promedio + edad;
}
promedio=promedio/5.0;
edadprom1=floor(promedio);
edadprom2=ceil(promedio);
cout<<"La edad promedio se encuentra entre "<<edadprom1<< " y "<<edadprom2;
getch(); }
EJECUCION
#include <math.h>
double cos(double x);
long double cosl(long double x);
double sin(double x);
long double sinl(long double x);
Retornan el seno y coseno de un argumento que debe estar dado en radianes, argumento y retorno
son double.
Ejemplo 3.- Escriba un programa que calcule un el seno y coseno de un triangulo
rectngulonotable y compruebe que seno y coseno de los ngulos complementarios de un triangulo
rectngulo son iguales.
PROGRAMA
/* CODIGO: cppcap03ejem03
Ing. Ricardo Castaeda De La Rosa
52
Funcinexp()
#include <math.h>
double exp(double x);
long double expl(long double x);
EJECUCION
Funcin log()
Syntax
#include <math.h>
double log(double x);
long double logl(long double x);
Funcin log10()
Syntax
#include <math.h>
double log10(double x);
long double log10l(long double x);
Funcinpow()
Syntax
#include <math.h>
double pow(double x, double y);
long double powl(long double x, long double y);
Retorna x elevado a la y.
Ejemplo 5.- Escribir un programa y calcule una raiz cuadrada usando pow() y
usando sqrt(), comprelas.
PROGRAMA
/* CODIGO: cppcap03ejem05
FECHA: 15 de julio del 2012
OBJETIVO: Utiliza pow() y sqrt() para calcular raiz cuadrada*/
#include <iostream.h>
#include <conio.h>
#include <math.h>
Ing. Ricardo Castaeda De La Rosa
53
54
void main()
{ double x,raiz1,raiz2 ;
clrscr();
cout<<"Ingrese x ==> "; cin>>x;
raiz1 = pow(x,0.5);
raiz2=sqrt(x);
cout<<" Utilizando pow el resultado ser = "<<raiz1<<endl;
cout<<" Utilizando sqrt el resultado ser= "<<raiz2;
getch();
}
EJECUCION
Funcin gets()
Syntax
#include <stdio.h>
char *gets(char *s);
Captura una cadena que puede contener espacio en blanco del flujo estndar.
Funcin printf()
Syntax
#include <stdio.h>
int printf(const char *format[, argument, ...]);
Funcin clock()
Syntax
#include <time.h>
clock_t clock(void);
Ejemplo 7.- Escribe un programa que nos permita trabajar con la funcin clock.
PROGRAMA
/* CODIGO: cppcap03ejem07
FECHA: 15 de julio del 2012
OBJETIVO: Maneja la funcin clock*/
#include <iostream.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <dos.h>
main(void)
{ int i,a=0;
clock_t inicio, fin;
inicio = clock();
for(i=1;i<=100000;i++)
{ if(i>1)
a=i;
cout<<a<<" "; }
Ing. Ricardo Castaeda De La Rosa
55
56
clrscr();
fin = clock();
printf("El tiempo de inicio fue : %f\n", inicio / CLK_TCK);
printf("El tiempo de fin fue : %f\n", fin
/ CLK_TCK);
Funcintime()
Syntax
#include <time.h>
time_t time(time_t *timer);
Ejemplo 8.- Escribe un programa que nos permita trabajar con la funcin time.
Explicar.
PROGRAMA
/* CODIGO: cppcap03ejem08
FECHA: 15 de julio del 2012
OBJETIVO: Maneja la funcin time*/
#include <time.h>
#include <stdio.h>
#include <dos.h>
#include <conio.h>
#include <iostream.h>
void main(void)
{
time_t t;
t = time(NULL);
cout<<"El numero de segundos transcurridos desde el Enero 1, 1970 es "<<t;
getch();}
EJECUCION
Funcin rand()
Syntax
#include <stdlib.h>
int rand(void);
Funcin randomize()
Syntax
#include <stdlib.h>
#include <time.h>
void randomize(void);
Funcin random(n)
Syntax
#include <stdlib.h>
int random(int num);
57
58
int main(void)
{
int cota_minima,cota_maxima, i ,nro_terminos;
clrscr();
cout<<"Ingrese cota mnima: ";cin>>cota_minima;
cout<<"Ingrese cota mxima: ";cin>>cota_maxima;
cout<<"Ingrese Nro. Trminos: ";cin>>nro_terminos;
randomize();
for(i=0; i<=nro_terminos; i++)
cout<<(cota_minima+random(cota_maxima+1-cota_minima))<<endl;
getch();
return 0;
}
Funcin atof()
Syntax
#include <math.h>
double atof(const char *s);
long double _atold(const char *s);
Funcin atoi()
Syntax
#include <stdlib.h>
int atoi(const char *s);
Funcin atol()
Syntax
#include <stdlib.h>
long atol(const char *s);
Funcin itoa()
Syntax
#include <stdlib.h>
char *itoa(int value, char *string, int radix);
Funcinecvt()
Syntax
#include <stdlib.h>
char Castaeda
*ecvt(double
int ndig, int *dec, int *sign);
Ing. Ricardo
Devalue,
La Rosa
59
3.2
Funciones Definidas por el Usuario.- Tambin podemos crear nuestras propias funciones y como
mencionamos al inicio de este captulo posteriormente podemos formar nuestra librera partcula. La
estructura de una funcin definida por el usuario es :
Forma General
Tipo nombrefuncion ( lista de parmetros)
{................... ;
.....................;
.....................;
[return(.....);]
.....................;
}
Donde:
Tipo
nombrefuncion
......Identificador de la funcin
Ejemplo:
int primo( int p1)
{ int i, sw=1; //asumo que es primo
for( i=2; i <= (p1/2) ; i++)
if ( (p1 % i) == 0)
{ sw = 0;// si es divisible no es primo
break;
Ing. Ricardo Castaeda De La Rosa
60
}
return(sw); }
La llamada ser
If ( primo(a))// a necesariamente es entero
Cout<< a << Es primo<< endl;
Ejemplo:
void leer ( long *cdigo, char nombre[40], char direccin[50])
{ // programa de lectura
clrscr();
cout << ingrese cdigo: ; cin>>*codigo;
cout << Ingrese nombre: ;gets(nombre); //Funcin de lectura
cout << Ingrese direccin: ; gets(direccion);
}
La llamada ser leer( &code, name, dire);
/* CODIGO: cppcap03ejem10
FECHA: 16 de julio del 2012*/
#include <iostream.h>
#include <conio.h>
// PROTOTIPO DE LA FUNCION (ES EL ENCABEZADO)
int suma(int operando1, int operando2);
61
3.2.2
Va variables Globales
Va argumentos parmetros
a)Va variables globales.- Se realiza cuando declaranms variables en unrea de acceso pblico o
sea que todas las funciones pueden acceder estas variables. Un esquema de esto seria
/* CODIGO: cppcap03ejem11
FECHA: 16 de julio del 2012
#include <iostream.h>
#include <conio.h>
// VARIABLES GLOBALES
int a,b,c;
// PROTOTIPO DE LAS FUNCIONES
void leer(void);
void multiplicar(void);
void escribir(void);
void main( )
{ // La function main no utiliza variables
leer ( );
multiplicar( );
escribir( );}
// LAS FUNCIONES QUE TRABAJAN CON VARIABLES GLOBALES
void leer( )
{cout<< Ingrese a: ;
cin>> a;
cout<< Ingrese b: ;
cin>> b;}
void multiplicar( )
{ c = a*b ;}
void escribir( )
{ clrscr( );
cout<< c<<endl;
Ing.getch(
Ricardo
De La Rosa
); Castaeda
}
62
dependiendo del parmetro:Si el encabezado es void f1(int p1, int p2, float *p3)Supongamos que los
argumentos son a1, a2 y a3; entonces a1 y a2 deben necesariamente generar valores simples de tipo
entero y a3 ser obligatoriamente variable simple de tipo float, pero el primer parmetro y el segundo
al ser variables solamente piden valores enteros pero el tercer parmetro al ser tipo puntero pide una
direccin de una variable simple de tipo float. Entonces la llamada ser:
f1 ( a1, a2, &a3);
O sea se enva el contenido de a1 y de a2 pero la direccin de a3, entonces
main()
Se realiza una transferencia de valores y direcciones hacia sus respectivos parmetros. Como
f2()_
a1
p1
a2
p2
35
a3
p3
40
a4
MEMORIA
ASIGNADA
main ()
Ing.
Ricardo Castaeda
De LaA
Rosa
p4
63
Se ejecuta la funcin hasta que la primera sentencia return es alcanzada o termina la funcin.
3.3
Funciones Inline.-Este tipo de funciones que se insertan directamente le dan mayor velocidad a la
ejecucin, la forma de indicar una function de este tipo es colocando el especificador inline antes de
la definicin de la funcin. Veamos el formato:
64
{ float xmin,xmax,deltax,fx,x;
clrscr();
cout<<"Ingrese x mnimo: ";cin>>xmin;
cout<<"Ingrese x mximo: ";cin>>xmax;
cout<<"Ingrese variacin de x: ";cin>>deltax;
x=xmin;
while( x<=xmax)
{ fx=fi(x);
cout<< "f(x)= "<<fx<<endl;
x=x+deltax;
}
getch();
}
EJECUCION
Fjense que es unafuncin con un clculo simple pues retorna el valor de la funcin para un argumento
3.4
Funciones Recursivas.- Una funcin recursiva es una funcin que se llama as misma para resolver
un clculo o proceso.
Las caractersticas de la recursividad son :
En cada llamada recursiva el grado de dificultad del clculo o proceso disminuye.
Cada llamada tendr su propio espacio de memoria.
Habr una llamada no recursiva en algn instante a partir del cual se solucionara el problema
a resolver.
Si tenemos el clculo de factorial:
!N = N*!(N-1).. calcular el factorial de (N-1) es ms sencillo que calcular el factorial de N.
Adems ! 1 = 1 y ! 0 = 1 que son llamadas no recursivas y que nos permite calcular el factorial a
partir de esto.
Ejemplo 13.- Escriba un programa que halle el factorial de un numero positivo en forma recursiva.
PROGRAMA
/* CODIGO: cppcap03ejem13
FECHA: 16 de agosto de 2012
OBJETIVO: Halla factorial en forma recursiva */
Ing. Ricardo Castaeda De La Rosa
65
# include<iostream.h>
# include<conio.h>
intfacto (int num);
void main( )
{ int n;
clrscr(); cout<< " NUMERO = "; cin>> n;
cout<< " FACTORIAL = "<<facto(n);
getch();}
/* Funcion recursiva */
int facto ( int num)
{ if (num <= 1)
return(1);
else
return(num * facto(num-1)); }
EJECUCION
3.5
Punteros a funciones.- Tambin podemos devolver la direccin de una funcin, veamos int (*fpun)
(int )ser la declaracin de un puntero a funcin que recibe un int y devuelve un int; en cambio int
*fp(int ) ser el prototipo de una funcin que recibe un int y devuelve puntero a int.
66
int (*pf1)(int)=&funcion2;
pf1(i);
//Imp rime 4
int* (*pf2)(int)=&funcion1;
pf2(j);
//Imp rime 8
getch(); }
EJECUCION
PROBLEMAS
Problema 1.- EJEMPLO DE FUNCIONES QUE SE COMUNICAN MEDIANTE VARIABLES GLOBALES.
1.- Suponga que tiene un numero num y una aproximacin a su raz cuadrada. Para obtener una
aproximacin ms exacta a la raz cuadrada real se puede utilizar la formula: aproximacinnueva = (n/
aproximacinanterior)+aproximacinanterior)/2. Utilizando esta informacin, escriba un programa que
solicite al usuario un nmero y una suposicin inicial de su raz cuadrada. Con los datos el programa
calculara una aproximacin de la raz cuadrada que sea exacta hasta 0.00001.
Solucin:
/* CODIGO: cppcap03prob01
FECHA: 16 de agosto de 2012
OBJETIVO: Halla raz cuadrada por aproximacin*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
#define ERROR 0.00001
float num,raiz,aprox;
void leer();
void procesar();
void mostrar();
main()
{ leer();
procesar();
mostrar();
}
void leer( )
{ clrscr();
cout<<"Ingrese el numero cuya raz cuadrada desea ";
cin>>num;
cout<<"Ingrese un valor aproximado de la raz ";
cin>>aprox; }
void procesar( )
Ing. Ricardo Castaeda De La Rosa
67
EJECUCION
2.- Escriba un programa que utilizando comunicacin va argumentos y parmetros, pueda calcular la nota
final, considerando que el promedio de prcticas se halla eliminando la menor nota de las cuatro
prcticas, la nota final se hallara
Promedio de prcticas = (practica 1+practica 2 + practica 3 + practica 4 menor)/3.0
Nota Final = (promedio practicas+ examen parcial + 2*examen parcial)/4.0
SOLUCION:
PROGRAMA
/* CODIGO: cppcap03prob02
FECHA: 16 de agosto de 2012
OBJETIVO: Halla nota final con el sistema F*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
void leer(float &n1,float &n2,float &n3, float &n4);
float menor(float n1,float n2,float n3, float n4 );
main()
{float EXP, EXF, PFIN,EXS;
float a,b,c,d,PP,MEN;
leer(a,b,c,d);
cout<<"\n La menor practica es = "<<menor(a,b,c,d);
MEN=menor(a,b,c,d);
Ing. Ricardo Castaeda De La Rosa
68
PP=((a+b+c+d)-MEN)/3.0;
cout<<"\n Ingrese la nota del parcial :";cin>>EXP;
cout<<"\n Ingrese la nota del FINAL :";cin>>EXF;
cout<<"\n El promedio de prcticas es :"<<PP;
PFIN=(PP+EXP+2*EXF)/4.0;
cout<<"\n El Promedio Final es :"<<PFIN<<endl;//redondea por exceso
if(PFIN>=10)
cout<<"Su promedio final es: "<<PFIN<<endl;
else
if(PP>6.0)
{cout<<"Ingrese el Examen Sustitutorio: ";cin>>EXS;
if(EXP)
PFIN=(PP+EXS+2*EXF)/4.0;
if(EXF)
PFIN=(PP+EXP+2*EXS)/4.0;
cout<<"Su promedio final es: "<<PFIN<<endl;
}
getch();}
void leer(float &n1,float &n2,float &n3, float &n4)
{
cout<<"\nIngrese las practicas dejando espacio :";
cin>>n1>>n2>>n3>>n4;
}
float menor(float n1,float n2,float n3, float n4 )
{ float men;
men=n1;
if(n2<men)
men=n2;
if(n3<men)
men=n3;
if(n4<men)
men=n4;
return ( men);
}
EJECUCION
3.-
69
3
2
Este programa halla una raz positiva de la ecuacin cubica x x x 1 0 , en el intervalo [0,5]
70
else
a= medio;
}
r = a;
return( r ); }
EJECUCION
4.- Escriba un programa que calcule la planilla para un trabajador, los datos que tienen que considerarse
son:
Nombre : Nombre del empleado es una cadena de 40 caracteres.
Cdigo : Cdigo del empleado es una cadena de 11 caracteres.
Sueldo bruto : Sueldo mensual que percibe el empleado.
Faltas
71
72
EJECUCION
5.- Escriba un programa que halle un nmero de la serie de fibonacci en forma recursiva.
Para i=0 , F(0)= 0
Para i= 1 , F(1)= 1
Para i>=2 , F(i) = F(i-1) + F(i-2)
PROGRAMA
/* CODIGO: CPPCAP03PROB05
FECHA: 16 DE AGOSTO DE 2012
OBJETIVO: Halla fibonacci en forma recursiva */
#include<iostream.h>
#include<conio.h>
#include<math.h>
void leer(int *n);
int fib(int n);
/*Funcin principal*/
main()
{
Ing. Ricardo Castaeda De La Rosa
EJECUCION
6.- Escriba un programa que halle los factores primos de un nmero en forma recursiva.
PROGRAMA
/* CODIGO: CPPCAP03PROB06
FECHA: 16 DE AGOSTO DE 2012
OBJETIVO: Halla factores primos en forma recursiva */
# include<iostream.h>
# include<math.h>
# include<conio.h>
void fprimo(int num);
void main( )
{ int n;
clrscr();
do{
cout<< " NUMERO = ";
cin>> n;
}while(n<1);
Ing. Ricardo Castaeda De La Rosa
73
74
fprimo(n);
getch();
}
void fprimo( int num)
{
int nr, k =1;
if (num > 1)
{do {
k = k +1;
} while( (num % k) != 0);
cout<< " "<< k <<" ";
nr = num / k;
fprimo( nr);
}
}
EJERCICIOS PROPUESTOS
1. Escriba un programa que utilizando funciones pueda realizar operaciones con nmeros complejos:
Suma, Resta, Multiplicacin y Divisin. Cada operacin debe realizarse con funciones adems de la
lectura y escritura. Debe trabajar con un men.
2. Escriba un programa que calcule reas, debe calcular reas para cuadrados, rectngulos, tringulos y
crculos; cada calculo debe realizarse con una funcin.
3. Escriba un programa que resuelva el mismo problema de planilla (problema 4)pero considere que hay
tres tipos de bonificaciones.
Tiempo de servicio (5%)
Carga familiar (5%)
Remuneracin por direccin (10%)
4. Escriba un programa que utilizando el concepto de puntero a funciones evale una funcin para un
argumento variando en un rango de valores determinado.
5. Escriba un programa que me permita hallar la nota final de un alumno que rindi 4 practicas y 2
exmenesconsidere, que el sistema de evaluacin puede ser:
Sistema A : promedio de prcticas es el promedio de las cuatro practicas y el promedio final es la
suma de los dos exmenes mas el promedio de prcticas divididos entre tres.
Sistema B : promedio de prcticas es el promedio de tres practicas eliminando la menor y el
promedio final es la suma del primer examen ms el segundo examen duplicado el promedio de
prcticas divididos entre cuatro.
6. Escriba un programa que resuelva el problema de las torres de Hani para n discos utilizando una
funcin recursiva. En las torres de Hani se trata de pasar n discos de un eje Origen a un eje
Destino utilizando un eje auxiliar. Las reglas son :
Ing. Ricardo Castaeda De La Rosa
CAPITULO IV
Ing. Ricardo Castaeda De La Rosa
75
76
CAPITULO IV
ARREGLOS EN LENGUAJE C
4.1 Definicin.- Un arreglo es una coleccin de elementos del mismo tipo; por lo tanto es una estructura
homognea. Su declaracin se realiza indicando al compilador sus caractersticas que son tipo,
nombre y tamao. Ejemplo:
int datos[10];la informacin que se entrega al compilador ser:
Tamao 10 elementos
datos[0]
datos[1]
datos[2]
datos[3]
datos[4]
datos[5]
datos[6]
datos[7]
datos[8]
datos[9]
77
4.2 Acceso a elementos.- Los elementos de un arreglo se designan con un subndice que comienza en
cero: int a[4] : a[0], a[1], a[2], a[3].
Un arreglo se puede inicializar as : int a[4] = { 20, 25, 35, 40}
a[0]
a[1]
4.3
20
25
a[2]
35
a[3]
40
Operaciones con Arrays unidimensionales (vectores).- Las operaciones inciales son las de lectura
y escritura, las cuales vamos a ver en el siguiente programa ejemplo:
4.4
PROGRAMA
/* CODIGO: cppcap04ejem01
FECHA: 16 de agosto de 2012
OBJETIVO: Entrada y salida de un vector */
# include<iostream.h>
# include<conio.h>
void main( )
{ int vector[50],n,i;
clrscr();
//Lectura
cout << " Ingrese n => "; cin >> n;
for (i=1;i<=n;i++)
{ cout<< " Ingrese valor "<< i<<" : ";
cin>> vector[i];
}
clrscr();
//Escritura
cout<<" SALIDA "<<endl<<endl;
for ( i=1; i<=n;i++)
{ cout<< vector[i]<< endl;
}
getch(); }
EJECUCION
78
Operaciones con arreglos: Las dems operaciones las analizaremos algortmicamente y despus los
presentaremos en un men en los problemas desarrollados.
Las operaciones ms importantes con arreglos unidimensionales son :
Adicin
Eliminacin
Bsqueda
Ordenamiento
ADICION: Laoperacin de adicin nos permite ingresar un elemento al vector de n componentes que
estn siendo utilizadas.
Inicialmente tenemos: Vector A
N=6
A [1]
A [2]
A [3]
12
A [4]
A [5]
20
15
A[6]
25
J= 4
X
14
A[7]
79
a) Realizar un corrimiento de una posicin hacia la derecha de todos los valores desde la posicin N
(N=6) hasta la posicin J (J=4), el resultado sera:
N=6
A [1]
A [2]
A [3]
A [4]
A [5]
12
20
20
A[6]
15
A[7]
25
El algoritmo es:
Para i = N,J,-1
A[i+1] A[i]
Fin Para
b) Adicionar el elemento X en la posicin J
A[J] X
El resultado seria
N=6
A [1]
A [2]
A [3]
A [4]
12
14
A [5]
20
A[6]
15
A[7]
25
c) Actualizar N
N = N +1
N=7
A [1]
A [2]
A [3]
A [4]
12
14
A [5]
20
A[6]
15
A[7]
25
vector de n
80
A [1]
A [2]
A [3]
A [4]
A [5]
12
20
15
A[6]
25
J= 3
Vamos a eliminar el tercer elemento del vector.
Finalmente deberamos tener A[1] = 3, A[2] = 5, A[3] = 20, A[4] = 15, A[5] = 25.
Y N decrecera y seria 5.
Para realizar esta operacin necesitamos dos pasos:
a) Realizar un corrimiento de una posicin hacia la izquierda todos los valores desde la
posicin J+1 (J=3) hasta la posicin N (N=6).:
N=6
A [1]
A [2]
A [3]
A [4]
A [5]
20
15
25
A[6]
25
El algoritmo es:
Para i = J+1,N
A[i-1] A[i]
Fin Para
b) Actualizar N.
NN-1
El resultado seria
N=5
A [1]
3
A [2]
A [3]
20
A [4]
15
A [5]
25
BUSQUEDA: La operacin de bsqueda es una de las ms importantes. En todo proceso real siempre
sebuscara un elemento dentro de un conjunto, o sea buscaremos informacin dentro de la data, labor
fundamental en informtica.
La operacin buscara un elemento X en un vector A de N elementos.
N=6
Ing. Ricardo Castaeda De La Rosa
81
A [1]
A [2]
A [3]
12
X=A[1]? X=A[2]?
A [4]
A [5]
20
15
A[6]
A[7]
25
X=A[i]?
19
Tenemos que tener en cuenta que la bsqueda terminara cuando encontremos el elemento buscado o
cuando llegamos al final de la estructura.
Algortmicamente seria:
1.- Leer (x)
2.- Para i= 1,n
2.1 Si (A[i]==x)
Entonces
2.1.1 pos i
2.1. 2 break;
Fin si
Fin Para
3.- Si ( x == A[i])
Entonces
3.1Escribir( Valor hallado en posicin , pos)
Sino
3.2 Escribir( Valor no hallado)
Fin si
Las instrucciones en Borland C sern:
cout<<"Ingrese valor a buscar : ";
cin>> x;
for( i=1;i<=n;i++)
if ( v[i]== x)
{ pos = i;
break ; }
if ( v [i ]== x)
cout<< " Valor hallado en posicin: "<<pos;
else
cout<< " Valor no hallado ";
82
A [2]
A [3]
A [4]
A [5]
A[6]
A[7]
A [5]
A[6]
A[7]
A [5]
A[6]
A[7]
A [2]
A [3]
A [4]
A [2]
A [3]
A [4]
A [2]
9
A [3]
A [4]
A [5]
A[6]
A[7]
5
A [3]
A [4]
A [5]
6
A[6]
4
A[7]
5
83
A [4]
9
A [5]
7
A[6]
6
A[7]
4
A [4]
7
A [5]
9
A[6]
6
A[7]
4
A [4]
A [5]
A[6]
A[7]
A [4]
A [5]
A[6]
A[7]
A [5]
9
A[6]
7
A[7]
5
A [5]
7
A[6]
9
A[7]
5
A [5]
6
A[6]
9
A[7]
5
A [5]
5
A[6]
9
A[7]
6
ETAPA 5
OBJETIVO. Llevar el menor 5 (Quinto menor ) a la quinta posicin
Ing. Ricardo Castaeda De La Rosa
84
A [5]
A[6]
A[7]
9
A[5] > A [6]?. Si
A [5]
A[6]
7
A[7]
A[6]
A[7]
A[7]
9
A[7]
A [2]
A [3]
A [4]
A [5]
A[6]
A[7]
Planteando la iesima etapa dentro de las n-1 etapas, en forma algortmica tenemos.
1.- Para i= 1, n-1 // Numero de etapas
1.1.- Para j= i+1, n
1.1.1 Si ( A[i] > A[j])
Entonces
Temp A[i]
A[i] A(j)
A[j] temp
Fin si
Fin para
Fin Para
Programando en Borland C++:
int i,j,temp;
for ( i=1; i<n ;i++)
for (j=i+1;j<=n;j++)
if( v[i]> v[j])
{ temp = v[i];
v[i] = v[j];
v[j] = temp ;}
Ing. Ricardo Castaeda De La Rosa
85
86
getch(); }
EJECUCION
87
88
int inicio,final,medio,encontrado=0;
clrscr();
//Lectura
cout << " Ingrese n (Para vector ordenado) => "; cin >> n;
for (i=1;i<=n;i++)
{ cout<< " Ingrese valor "<< i<<" : ";
cin>> vector[i];
}
clrscr();
//Escritura
cout<<" SALIDA VECTOR ORDENADO "<<endl<<endl;
for ( i=1; i<=n;i++)
{ cout<< vector[i]<< endl;}
getch();
clrscr();
inicio = 1;
final = n;
cout<<"Ingrese numero a buscar ==> ";cin>>x;
while((inicio<=final)&&(!encontrado))
{medio = (inicio+final)/2;
if(x==vector[medio])
encontrado = 1;
else
if(x>vector[medio])
inicio =medio;
else
final = medio; }
cout<<endl;
cout<<"MENSAJE "<<endl;
if (encontrado)
cout<<"El numero esta en posicin: "<<medio<<endl;
else
cout<<"Valor no hallado ... ";
getch(); }
EJECUCION
89
90
//Escritura
cout<<" SALIDA "<<endl<<endl;
for ( i=1; i<=n;i++)
{ cout<< vector[i]<< endl;
}
getch();
clrscr();
cambio=1;
while (cambio)
{ cambio=0;
for(i=1;i<=n;i++)
if (vector[i]>vector[i+1])
{ temp=vector[i];
vector[i]=vector[i+1];
vector[i+1]= temp;
cambio=1;
}
}
cout<<" SALIDA ORDENADA"<<endl<<endl;
for ( i=1; i<=n;i++)
{ cout<< vector[i]<< endl;
}
getch(); }
EJECUCION
91
Definicin.- Una matriz es un arreglo de 2 dimensiones donde el primer subndice indica fila y el
segundo subndice indica columna. Consideremos la siguiente declaracin:
const float maxf=10;
const float maxc=20;
float matriz[maxf][maxc];
Estamos declarando una matriz de 10 filas por 20 columnas. La primera fila ser: matriz[0] [[0],
matriz[0][1], matriz[0][2],......................, matriz[0][19]
4.6 Operaciones con matrices: Ejemplo 6.- El procedimiento para leer una matriz ser:
PROGRAMA
/* CODIGO: cppcap04ejem06
FECHA: 16 de agosto de 2012
OBJETIVO: Lectura y Escritura de una matriz */
# include<iostream.h>
# include<conio.h>
#include <stdlib.h>
#include <time.h>
void leer(int x[20][20],int *nf, int *nc);
void mostrar(int x[20][20], int nf, int nc);
void main( )
{ int mat[20][20],nf,nc;
leer(mat,&nf,&nc);
mostrar(mat,nf,nc);
}
void leer(int x[20][20],int *nf, int *nc)
{
int i, j ;
clrscr( );
cout<<"Ingrese # filas de la matriz: "; cin>> *nf;
Ing. Ricardo Castaeda De La Rosa
92
EJECUCION
EJECUCION
93
94
PROBLEMAS
1.- Dado un vector de nmeros enteros escriba un programa que me permita hallar el nmero que ms
veces se repite (MODA).
PROGRAMA
/* CODIGO: cppcap04prob01
FECHA: 16 de agosto de 2012
OBJETIVO: Halla la moda de un conjunto de nmeros enteros */
# include <iostream.h>
# include <conio.h>
void lectura (int a[50], int *n);
void orden(int a[50], int n);
int moda (int a[50], int n);
void escritura(int mo);
void main( )
{ int a[50];
int n,mo;
clrscr();
lectura (a, &n);
orden(a, n);
mo=moda (a, n);
escritura(mo); }
// Funcin que realiza la lectura
void lectura(int a[50], int *n)
Ing. Ricardo Castaeda De La Rosa
mayor=rep[1];
k=1;
for(j=2;j<=nsr;j++)
if (rep[j] > mayor)
{ mayor = rep[j];
k=j ;
nmoda= b[k];
return(nmoda);
95
96
EJECUCION
2.- Escriba
MENU ARREGLOS
1.- Lectura
2.- Adicin
3.- Eliminacin
4.- Bsqueda
5.- Ordenar
6.- Escritura
7.- Salir
PROGRAMA
/* CODIGO: cppcap04prob02
FECHA: 16 de agosto de 2012
OBJETIVO: Programa que crea un men para manejo de operaciones
con arreglos */
# include<iostream.h>
# include<conio.h>
void lectura(int v[50], int *n);
void adicion(int v[50], int *n);
void eliminacion(int v[50], int *n);
void busqueda(int v[50], int n);
Ing. Ricardo Castaeda De La Rosa
97
98
}
void adicion(int v[50], int *n)
{ int i,j,x;
clrscr();
cout<<"Ingrese posicin de insercin: "; cin>> j;
cout<<"Ingrese valor a insertar : ";
cin>> x;
for( i=(*n);i>=j;i--)
v[i+1] = v[i];
v[j] = x;
(*n)=(*n) +1; }
void eliminacion(int v[50], int *n)
{ int i,j;
clrscr();
cout<<"Ingrese posicin de valor a eliminar : ";
cin>> j;
for( i=j+1 ; i<=(*n);i++)
v[i-1] = v[i];
(*n)=(*n) - 1; }
void busqueda(int v[50], int n)
{ int i,x, pos;
clrscr();
cout<<"Ingrese valor a buscar : ";
cin>> x;
for( i=1;i<=n;i++)
if ( v[i]== x)
{ pos = i; break ; }
if ( v [i ]== x)
cout<< " Valor hallado en posicin: "<<pos;
else
cout<< " Valor no hallado ";
getch(); }
void sorteo(int v[50], int n)
{ int i,j,temp;
for ( i=1; i<n ;i++)
for (j=i+1;j<=n;j++)
if( v[i]> v[j])
{ temp = v[i];
v[i] = v[j];
v[j] = temp ; } }
void escritura(int v[50], int n)
{int i;
clrscr();
for ( i=1; i<=n;i++)
{ cout<< v[i]<< endl; }
Ing. Ricardo Castaeda De La Rosa
EJECUCION
99
100
3.-
Escriba un programa que lea un conjunto de n nombres y n notas y me muestre en una pantalla los
nombres de los tres primeros alumnos por orden de mrito las tres mejores notas
SOLUCIN
PROGRAMA
/* CODIGO: cppcap04prob03
FECHA: 16 de agosto de 2012
OBJETIVO: HALLA LAS TRES MEJORES NOTAS DE UN GRUPO DE ALUMNOS Y LAS MUESTRA CON LOS NOMBRES*/
# include<iostream.h>
# include<conio.h>
# include<stdio.h>
Ing. Ricardo Castaeda De La Rosa
101
102
ota: Este programa trabaja con el concepto de vectores paralelos o sea que la informacin de los
vectores est relacionada por el subndice esto significa que la nota 5 pertenece al alumno que tiene el
nombre 5, por lo tanto la informacin se debe manejar en paralelo para que siga siendo consistente.
EJERCICIOS PROPUESTOS
1)
Escribir un programa que inserte un elemento dentro de un vector ordenado, considere el programa utilizando para su
solucin la estructura while.
2)
Escribir un programa que realice una bsqueda dentro de un vector ordenado, este programa debe detenerse cuando el valor
es hallado, cuando se llegue al final o cuando el valor buscado es superado.
3)
Escribir el cdigo necesario para rotar un vector en sentido antihorario o sea al revs de lo hecho en el problema 9.
4)
Se tiene una matriz de letras, escriba usted un programa para que realice la bsqueda de una cadena ingresada dentro de la
matriz(PUPILETRAS), la bsqueda debe ser de izquierda a derecha y de arriba hacia abajo en la matriz, los mensajes de
salida ser Hallado y No hallado.
5)
Escriba un programa que lea una matriz de n filas por m columnas y me imprima la transpuesta de dicha matriz.
6)
CAPITULO V
103
104
CAPITULO V
REGISTROS EN LENGUAJE C
5 Definicin.- Un registro o una estructura en lenguaje C es una coleccin de variables simples que
pueden contener diferentes tipos de datos. Es un tipo de dato definido por el usuario.
5.1 Modelamiento de un registro de acuerdo a las entidades del mundo real: Cuandose crea un
registro se utilizalas entidades(elementos relevantes del proceso) del mundo real para crear la
estructura del registro. Veamos un ejemplo. Supongamos que el proceso matricula se automatiza,
entonces cuales serian las entidades del mundo real que participan en este proceso, algunas de
ellas serian:
Alumno
Profesor
Curso
Aulas
Escuelas
Etc,
Tomemos la entidad alumno y la entidad curso y veamos como estas entidades dan origen a sus
respectivos registros.
ENTIDAD REGISTRO
ALUMNO
REGALU
CODIGO
codalu
entero largo
NOMBRE
nomalu
carcter de longitud 30
DIRECCION
diralu
carcter de longitud 40
ESCUELA
escalu
carcter de longitud 2
TELEFONO
telalu
entero largo
Vemos que cada caracterstica de la entidad alumno se convierte en un campo del registro regalu.
Ing. Ricardo Castaeda De La Rosa
105
REGCUR
CODIGO
codcur
carcter de longitud 5
NOMBRE
nomcur
carcter de longitud 30
NOTAFIN
notcur
real
Vemos claramente que los campos son las caractersticas que definen a la entidad y almacenaran
estos datos de una entidad particular.
Si nosotros visualizamos un registro, seria de la siguiente forma:
Estructura de REGALU
codalu
nomalu
diralu
escalu telalu
Estructura de REGCUR
codcur
nomcur
notcur
nomalu
diralu
escalu
telalu
7.2 Creacin y manejo de registrosEl proceso de crear una estructura o registro tiene dos etapas.
Crear un modelo de estructura
Crear la variable estructurada
Ing. Ricardo Castaeda De La Rosa
106
Ejemplo:
struct ciudadano
{ long dni; // dato miembro dni
char nombre[40];// dato miembro nombre
char direccin[50]; // dato miembro direccin
Posteriormente las variables persona1 y persona2 se definen como cualquier otra variable, en este caso
del tipo de nombre de la estructura.
ciudadano persona1, persona2; // se declaran dos variables tipo registro.
7.3 Acceso a miembros del registro.- Se realiza utilizando el nombre del registro seguido del nombre
del campo con un punto intermedio.
persona1.dni = 08234101;
persona2.dni = 91012345;
strcpy( persona1.nombre, Luis Rojas);
strcpy( persona2.nombre, Jose Castaeda);
strcpy( persona1.direccion, San Borja, Los alamos 257);
strcpy( persona2.direccion, Surco, leoncio Prado 820);
7.4 Inicializacin de estructuras.- Los campos de un registro se pueden iniciar individualmente o
todos a la vez :
Ejemplo:
struct caja
{ int largo;
int ancho;
int altura;};
Caja c1 = {4, 5,2}
caja c2, c3;
c2.largo = 3;
c3.ancho = 1;
7.5 Asignacin
de
estructuras.-
Podemos
intercambiar
informacin
entre
dos
estructuras
int ao; }
struct empleado
{ fecha dia_ingreso;
char nombre[50]; }
EJEMPLO 1.-Vamos a desarrollar un programa que lea y escriba un arreglo de n registros, cuya
estructura es :
Dni
cadena de 10 caracteres
Nombre
cadena de 30 caracteres
= ";cin>>p[i].dniper;
107
108
cout<<setw(20)<<"NOMBRE";
cout<<setw(30)<<"DIRECCION"<<endl;
cout<< "====================================================== "<<endl;
for(i=1;i<=n;i++)
{cout<<setw(10)<<p[i].dniper;
cout<<setw(20)<< p[i].nomper;
cout<<setw(30)<<p[i].dirper<<endl;
} getch(); }
EJECUCION
nombre
examen1
entero
examen2
entero
promediop
real
Promedio de practicas
notafinal
real
Nota final
Primero debe ingresar los datos de cada alumno, lanota final ser calculada,
Considerando examenn1 (peso 1), examen2 (peso2) y promediop(peso2).
Ing. Ricardo Castaeda De La Rosa
109
El codigo no puede ser repetido, esta condicin debe ser probada en cada ingreso. Finalmente presentar
resultados.
PROGRAMA
/* CODIGO: cppcap5ejem02
FECHA: 20 de agosto de 2012
OBJETIVO: Ingresa registros sin codigo repetido */
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<iomanip.h>
struct notas
{ char codalu[9]; // Codigo de alumno
char nomalu[30]; // Nombre del alumno
int examen1;
int examen2;
float promediop;
float notafinal;
};
void main( )
{ int i,nr,m,j;
notas n[50];
int swr;
clrscr();
cout<< " Cuantos registros va a leer ==> ";
cin >>nr;
for(i=1;i<=nr;i++)
{ swr=1;
while (swr)
{ swr=0;
clrscr();
gotoxy(25,2);cout<<"INGRESO DE REGISTRO DE NOTAS";
gotoxy(26,5);cout<<" Ingrese codigo
==> ";gets(n[i].codalu);
m=i-1;
for (j=1;j<=m;j++)
if (strcmp(n[i].codalu,n[j].codalu)==0)
{swr=1;
break;
}
if(swr==1)
{gotoxy(30,18);
cout<<"Error codigo repetido..........";
getch();
Ing. Ricardo Castaeda De La Rosa
110
}
else
{ gotoxy(26,18);cout<<"Por favor ingrese datos...." ;
gotoxy(26,6);cout<<" Ingrese nombre
==> ";gets(n[i].nomalu);
111
PROBLEMAS
1. Desarrollar un programa que maneje todos los productos que una tienda de abarrotes vende, siendo
nuestro objetivo principal el automatizar el proceso de una tienda de abarrotes que nos permitir
realizar las siguientes operaciones de manera eficiente:
Tener un listado actualizado del stock en todo momento
Eliminar los productos que ya no se venden.
Adicionar productos nuevos.
Consultar datos sobre un producto particular.
112
void main( )
{ item vprod[50];
int num;
char opcion;
do {clrscr();
gotoxy(30,2); cout<< "MENU ARREGLOS";
gotoxy(30,5); cout<< "1.- Lectura";
gotoxy(30,6); cout<< "2.- Adicion";
gotoxy(30,7); cout<< "3.- Eliminacion";
gotoxy(30,8); cout<< "4.- Bsqueda";
gotoxy(30,9); cout<< "5.- Ordenamiento ";
gotoxy(30,10);cout<< "6.- Escritura";
gotoxy(30,11);cout<< "7.- Salir ";
gotoxy(30,16);cout<< "Ingrese Opcion ==> ";cin >> opcion;
switch(opcion)
{ case '1' : lectura(vprod, &num);break;
case '2' : adicion(vprod, &num);break;
case '3' : eliminacion(vprod, &num);break;
case '4' : busqueda(vprod, num);break;
case '5' : orden1(vprod, num);break;
case '6' : escritura(vprod, num);break;}
}while(opcion != '7');
}
void lectura(item prod[50], int *n)
{ int i;
clrscr();
cout << " Ingrese n => ";
cin >> (*n);
for ( i=1; i<=(*n);i++)
{cout<< " Ingrese codigo "<< i<<" : "; cin>> prod[i].codite;
cout<< " Ingrese descripcion "<< i<<" : "; gets(prod[i].desite);
cout<< " Ingreseubicacin
: "<<prod[i].ubiite<<endl;
113
114
clrscr();
cout<<"Ingrese codigo : ";
cin>> codx;
for( i=1;i<=n;i++)
if(prod[i].codite == codx)
break;
if(prod[i].codite != codx)
{cout<< " Registro no existe... "; getch();}
else
{cout<< " Descripcin : "<<prod[i].desite<<endl;
cout<< " Ubicacin
: "<<prod[i].ubiite<<endl;
115
116
codigo
nombre
char 40
nivel
sueldo
real
entero
a) Declarar la estructura.
b) Escribir el men
Leer
Adicionar
Eliminar
Escribir
Salir
c) Escribir las funciones Leer, adicionar, eliminar y escribir.
SOLUCIN
PROGRAMA
/* CODIGO: cppcap05prob02
FECHA: 20 de agosto de 2012
OBJETIVO: Programa que crea un men con registros de empleados */
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<iomanip.h>
struct empleado
{ int codemp; // cdigo del empleado
char nomemp[40]; // nombre del empleado
char nivemp; // nivel remunerativo del empleado A,B,C
Ing. Ricardo Castaeda De La Rosa
117
118
switch(opcion)
{ case '1' : leer(v, &num);break;
case '2' : adicionar(v, &num);break;
case '3' : eliminar(v, &num);break;
case '4' : escribir(v, num);break; }
}while(opcion != '5');
}
void leer(empleado p[50], int *n)
{ int i;
clrscr();
cout << " Ingrese n => ";
cin >> (*n);
clrscr();
gotoxy(30,2); cout<< "LECTURA";
gotoxy(30,3); cout<< "=======";
cout<<endl<<endl;
for ( i=1; i<=(*n);i++)
{ cout<< " Ingrese Codigo del Empleado "<< i<<" : "; cin>> p[i].codemp;
cout<< " Ingrese Nombre y Apellido "<< i<<" : "; gets(p[i].nomemp);
cout<< " Ingrese Nivel Remunerativo "<< i<<" : "; cin>> p[i].nivemp;
cout<< " Ingrese Sueldo del Empleado "<< i<<" : "; cin>> p[i].sueemp;
}
}
void adicionar (empleado p[50], int *n)
{ int codx,i;
Ing. Ricardo Castaeda De La Rosa
: "; gets(aux.nomemp);
119
120
|";
cout<<setw(6)<<"NIVEL|";
cout<<setw(8)<<"SUELDO |";
cout<<endl;
cout<<"==========================================="<<endl;
for ( i=1; i<=n;i++)
{ cout<<setw(10)<<p[i].codemp;
cout<<setw(20)<<p[i].nomemp;
cout<<setw(5)<<p[i].nivemp;
cout<<setw(8)<<p[i].sueemp<<endl;
}
getch(); }
EJECUCION
121
122
3.
item
entero
nombre
char 40
cantidad entero
precio
real
a)
Declarar la estructura.
b)
Escribir el men
Leer
Adicionar
Eliminar
Escribir
Salir
c)
SOLUCION:
PROGRAMA
/* CODIGO: cppcap07prob03
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 23 de agosto de 2007
OBJETIVO:Programa que crea un men con registros de almacn */
#include<iostream.h>
#include<conio.h>
//ya no se modifica n
void main()
{ almacen stock[50];
int n;
char opc;
do{
clrscr();
gotoxy(30,5);cout<<"MENU DE ALMACEN ";
gotoxy(30,8);cout<<"1.-Leer";
gotoxy(30,9);cout<<"2.-Adicionar";
gotoxy(30,10);cout<<"3.-Eliminar";
gotoxy(30,11);cout<<"4.-Mostrar";
gotoxy(30,12);cout<<"5.-Salir";
gotoxy(35,16);cout<<"Opcion==>";
cin>>opc;
switch(opc)
{case '1': leer( stock , &n ); break;
case '2': adicionar ( stock , &n ); break;
case '3': eliminar ( stock , &n ); break;
case '4': escribir ( stock , n ); break;
}
}while(opc!='5');
}
void leer(almacen s[50] , int *n )
{ int n1;
clrscr();
gotoxy(30,5);cout<<"INGRESO DE DATOS AL ALMACEN";
gotoxy(30,8);cout<<"Ingrese el valor de n:";
cin>>n1;
*n=n1;
for(int i=1;i<=n1;i++)
{clrscr();
gotoxy(30,5);cout<<"INGRESO DE DATOS AL ALMACEN";
gotoxy(30,6);cout<<"===========================";
gotoxy(30,9);cout<<"Item: ";cin>>s[i].itealm;
gotoxy(30,10);cout<<"Nombre: ";gets(s[i].nomalm);
gotoxy(30,11);cout<<"Cantidad: ";cin>>s[i].canalm;
gotoxy(30,12);cout<<"Precio: ";cin>>s[i].prealm;
123
124
}
}
void escribir(almacen s[50] , int n )
{ clrscr();
int i;
cout<<setiosflags(ios::fixed);
cout<<setiosflags(ios::showpoint);
cout<<setprecision(2);
cout<<setiosflags(ios::left);
gotoxy(30,5);cout<<"DATOS DE ALMACEN";
gotoxy(30,6);cout<<"================";
gotoxy(30,9);cout<<setw(6)<<"|Item";cout<<setw(20)<<"|Nombre
";
cout<<setw(9)<<"|Cantidad";cout<<setw(8)<<"|Precio|";
gotoxy(30,10);cout<<"===========================================";
for(i=1;i<=n;i++)
{gotoxy(30,10+i);
cout<<setiosflags(ios::left);
cout<<"|";cout<<setw(5)<<s[i].itealm;
cout<<"|";cout<<setw(19)<<s[i].nomalm;
cout<<setiosflags(ios::right);
cout<<"|";cout<<setw(8)<<s[i].canalm;
cout<<"|";cout<<setw(7) <<s[i].prealm;}
getch();}
void eliminar(almacen s[50] , int *n )
{ int j,i;
clrscr();
cout<<"Posicion a eliminar: ";
cin>>j;
for(i=j+1;i<=*n;i++)
s[i-1]=s[i];
*n=*n-1;
}
void adicionar(almacen s[50] , int *n )
{int i,j;almacen regx;
clrscr();
cout<<"Ingrese datos de registro a adicionar: "<<endl;
cout<<"Item: ";cin>>regx.itealm;
cout<<"Nombre: ";gets(regx.nomalm);
cout<<"Cantidad: ";cin>>regx.canalm;
cout<<"Precio: ";cin>>regx.prealm;
cout<<"Ingrese posicin de insercin " ;cin>>j;
for(i=*n;i>=j;i--)
s[i+1]=s[i];
s[j]=regx;
*n=*n+1;}
EJECUCION
125
126
127
EJERCICIOS PROPUESTOS
1. Se desea realizar un mantenimiento de registros de los alumnos de COMPUTACION I, para esto
vamos a utilizar la siguiente estructura:
struct alumno{
int cdigo;
char nombre [40];
int exampar; //Examen Parcial
int examfin; //Examen Final
float pp; // Promedio de Practicas
};
En el mantenimiento considere:
a) Adicionar Registros
b) Eliminar Registros.
c) Modificar Registros.
2. Se desea escribir un programa que procese el examen sustitutorio de n alumnos, considerar el
siguiente registro.
struct notas
{ char codalu [10]; // Cdigo del alumno
char codcur [7]; // Cdigo del curso
float pp ;
// Promedio de practicas
int ep ;
// Examen parcial
int ef ;
// Examen final
int es ;
// Examen sustitutorio
float pf ;
// Promedio final
}
para hallar el promedio final (pf) debe considerarse lo siguiente:
a. Si no se ha rendido un examen (ep,ef) la nota que figura es 99(OJO).
b. El promedio final se halla
pf
pp ep 2 * ef
4
128
{ int codemp;
// Sueldo Bruto
int diasf;
// Das faltos
int horase ;
// Horas extras
float descuentos ;
float sn;
// Descuentos
// Sueldo Neto }
CAPITULO VI
129
130
CAPITULO VI
PROGRAMACION ORIENTADA A OBJETOS
6
Introduccion.-La programacin orientada a objetos existe desde la creacin de los primeros lenguajes
de programacin. Los conceptos que se manejan de abstraccin de datos, herencia y Polimorfismo se
manejaban en estos lenguajes, pero con el desarrollo del lenguaje C y la programacin visual se
utiliza este tipo de programacin con mayor profusin.
6.1
ESTRUCTURA DE DATOS
131
Definicin (Tipo de Datos Abstracto) Un tipo de datos abstracto (TDA) se caracteriza por que
tiene dos elementos diferenciados:
La interfaz de utilizacin.
La representacin
La representacin debe permanecer oculta y solo utilizaremos sus operaciones para trabajar con
los elementos.
Para construir un tipo abstracto debemos:
1. Exponer una definicin de tipo.
2.Definir las operaciones (funciones) que permitan operar con instancias de ese tipo.
3.Ocultar la representacin de los elementos del tipo de modo que solo se pueda actuar sobre
ellos con las operaciones proporcionadas..
4. Poder hacer instancias mltiples del tipo..
Tipos bsicos de operaciones en un TDA.
Las operaciones bsicas que deberamos tener pueden ser:
132
List<Apple> listOfApples;
Los corchetes angulares encierran ahora el tipo de datos para el cul una variante del TDA
genrico List sera creada. listOfApples ofrece la misma interface que cualquiera otra lista, pero
opera en instancias del tipo Apple.
Conceptos de Orientacin a Objetos
Las secciones anteriores introducen ya algunos conceptos "de orientacin a objetos". Sin
embargo, stos fueron aplicados de una manera terica, ahora pasemos ya a visualizar las
caractersticas del C++ y les damos nombres tal y como se usan en los lenguajes de
programacin orientada a objetos existentes.
Las caractersticas de C++ como lenguaje orientado a objetos son:
o
Abstraccin
Variables de instancia
Mtodos de instancia
Variables de clase
Mtodos de clase
Encapsulacin
Herencia
Sencilla y mltiple
Unidades genricas
Polimorfismo
Objeto Emisor
Objeto Receptor
6.2
133
Clases.- Un programa utiliza un grupo de objetos y estos objetos se crean utilizando un tipo de
dato denominado clase. Podemos decir que la clase es un registro (struct) evolucionado que ha
encapsulado los datos y las funciones incorporndoles adems niveles de visibilidad. En la clase
los datos son las propiedades de la entidad que este representa y las funciones son las tareas
representativas de la entidad. De esta manera las clases representan las entidades del mundo real
de una manera ms precisas que los registros. Adems las clases tienen dos caractersticas que la
hacen elementos muy eficientes en la programacin, estas son:
6.3
Herencia
Polimorfismo
Objeto.- Son las instancias de una clase, pues esta es la plantilla que nos permite crear los
Largo
Ancho
Datos
Asignar()
Mtodos
Calcular _area()
Figura 6.3
134
R1.ancho
R1.asignar(int l, int a)
funcin miembro que nos permite asignar valores a los dos datos miembro.
R1.calcular_area( )
PROGRAMA
/* CODIGO: cppcap06ejem01
FECHA: 27 de agosto de 2012
OBJETIVO: Desarrollar un ejemplo bsico de POO */
#include<iostream.h>
#include<conio.h>
class rectangulo
{ private:
int largo;
int ancho;
public:
void asignar( int l, int a)
{ largo = l;
ancho = a;
int calcular_area( )
{int A;
A = largo * ancho;
return ( A); }
};
void main()
{ int L,A;
rectangulo r1;
clrscr();
cout<<"Ingrese largo";cin>>L;
cout<<"Ingrese ancho";cin>>A;
r1.asignar(L,A);
cout<<"El rea es : "<<r1.calcular_area();
getch(); }
EJECUCION
6.4
Herencia: Caracterstica mediante la cual podemos reutilizar una declaracin de una clase y
crear otra clase. Por ejemplo: Creamos la clase estudiante.a clase estudiante_universitario
hereda de la clase estudiante y adiciona. La clase estudiante_universitario_uni hereda de la
anterior y tambin adiciona.Ver ejemplo 4.
6.5
Polimorfismo: Caracterstica que nos permite crear funciones que utilizando un mismo nombre
respondern de forma diferente de acuerdo a la clase a la cual pertenecen.
6.6
135
Secciones .- Los miembros de una clase que son variables y mtodos (datos y funciones)
pueden ser pblicos (public), protegidos (protected) y privados(private). Las secciones privadas y
protegidas tienen como objetivo el ocultamiento de datos. A los miembros de la seccin privada se
puede acceder solo por las funciones miembro de esa clase, o por otras funciones declaradas
amigas (friend) de la clase. A los miembros pblicos de una clase se pueden acceder desde fuera
de la clase, pero no se puede acceder desde una clase derivada de la clase base. Los miembros
protegidos son accesibles dentro de la clase en que estn definidas y en cualquier clase derivada de
la clase original. De acuerdo alo dicho la declaracin de una clase en forma general sera:
class nombre_clase
{
private:
datos miembro
funciones miembro
..
protected:
datos miembro protegidos
funciones miembro protegidos
..
public:
datos miembro publicos
funciones miembro publicos
EJEMPLO 2:
class rectangulo
{ private:
int largo;
int ancho;
public:
void asignar( int l, int a)
{ largo = l;
ancho = a; }
int rea( )
{ int A;
A = largo * ancho;
return ( A); }
};
class cuadrado
{ private:
Ing. Ricardo Castaeda De La Rosa
136
int largo;
public:
void asignar( int l )
{ largo = l; }
int rea( )
{ int A;
A = largo * largo;
return ( A);}
};
void main( )
{ rectangulo R1;
cuadrado C1;
R1.asignar( 5,4);
C1.asignar(4);
clrscr()
cout << R1.area( )<< endl;
cout << C1.area( )<< endl;
}
/* CODIGO: cppcap06ejem02
FECHA: 27 de agosto de 2012
OBJETIVO: Desarrollar un ejemplo bsico de POO */
#include<iostream.h>
#include<conio.h>
class rectangulo
{ private:
int largo;
int ancho;
public:
void asignar( int l, int a)
{ largo = l;
ancho = a;
int area( )
{ int A;
A = largo * ancho;
return ( A); }
};
class cuadrado
{ private:
int largo;
public:
void asignar( int l )
{ largo = l; }
Ing. Ricardo Castaeda De La Rosa
137
int area( )
{ int A;
A = largo * largo;
return ( A); }
};
void main( )
{ rectangulo R1;
cuadrado C1;
R1.asignar( 5,4);
C1.asignar(4);
clrscr();
cout << R1.area( )<<endl;
cout << C1.area( )<<endl;
getch();
}
EJECUCION
EJEMPLO 3:Escriba un ejemplo de una clase con datos pblicos. Indicando el acceso directo a los
datos miembro.
PROGRAMA
/* CODIGO: cppcap06ejem03
FECHA: 27 de agosto de 2012
OBJETIVO: Desarrollar un ejemplo bsico con datos pblicos*/
#include<iostream.h>
#include<conio.h>
class grupo
{public:
int v1;
int v2;
int v3;
public:
float promedio( )
{ return(v1+v2+v3)/3.0;}
int menor( )
{ int m,men;
if (v1<v2)
m=v1;
else
m=v2;
Ing. Ricardo Castaeda De La Rosa
138
if(m<v3)
men=m;
else
men = v3;
return(men);}
int mayor( )
{ int m,may;
if (v1>v2)
m=v1;
else
m=v2;
if(m>v3)
may=m;
else
may = v3;
return(may);}
};
void main( )
{ grupo g1;
clrscr();
cout<<"Ingrese valor 1==> ";cin>>g1.v1;
cout<<"Ingrese valor 2==> ";cin>>g1.v2;
cout<<"Ingrese valor 3==> ";cin>>g1.v3;
cout <<" El promedio es = "<<g1.promedio()<<endl;
cout <<" El menor es = "<<g1.menor()<<endl;
cout <<" El mayor es = "<<g1.mayor();
getch();
}
EJECUCION
EJEMPLO 4:Escriba un ejemplo simple de utlizacion de herencia, defina la clase alumno y derive de
esta clase, una nueva clase llamada nota, que almacenar la nota final de un alumno en un curso
determinado.
PROGRAMA
/* CODIGO: cppcap06ejem04
FECHA: 7 de Agosto de 2012
OBJETIVO: Programa que define la clase alumno y despues deriva de esta la clase nota*/
Ing. Ricardo Castaeda De La Rosa
139
140
a1.mostrar();
//Procesando datos de clase derivada (Herencia)
cout<<"Ingrese codigo del alumno: ";cin>>code;
cout<<"Ingrese nombre del alumno: ";gets(name);
cout<<"Ingrese codigo del curso : ";cin>>curse;
cout<<"Ingrese promedio final : ";cin>>promedio_fin;
n1.asignar(code,name,curse,promedio_fin);
n1.mostrar();
}
EJECUCION
PROBLEMAS
1.-
Desarrollar 3 programas de aplicacin para ver la evolucin desde la primera etapa deregistro (struct)
hasta el objeto. Los programas son:
A) Programa con registros lee 2 notas y calcula el promedio con una funcin externa al registro.
B) Programa con registros lee 2 notas y calcula el promedio con una componente funcin.
C) Programa con objetos lee 2 notas y calcula el promedio con una funcin miembro.
PROGRAMA(A)
/* CODIGO: cppcap06prob01a
FECHA: 28 de agosto de 2012
OBJETIVO: Primer programa ejemplo de una estructura clsica*/
#include<iostream.h>
#include<conio.h>
struct notas
{ float nota1;
float nota2; };
float calcula_prom (float p1, float p2);
Ing. Ricardo Castaeda De La Rosa
PROGRAMA(B)
/* CODIGO: cppcap06prob01b
FECHA: 28 DE MARZO DE 2012
OBJETIVO: Segundo programa ejemplo tenemos la estructura pero ya tenemos
una componente funcin miembro de la estructura tiende a una clase*/
#include <iostream.h>
#include<conio.h>
struct notas
{ float nota1;
float nota2;
float calcula_prom (float p1, float p2)
{return( (p1 + p2) / 2.0);}
};
void main ( )
{ notas n;
clrscr( );
cout << "ingrese 1ra. Nota => ";
cin >> n.nota1;
cout << "ingrese 2da. Nota => ";
cin >> n.nota2;
cout << " El promedio es = " << n.calcula_prom ( n.nota1, n.nota2);
getch( );
}
Ing. Ricardo Castaeda De La Rosa
141
142
EJECUCION
PROGRAMA(C)
/* CODIGO: cppcap06prob01c
FECHA: 28 de agosto de 2012
OBJETIVO: Tercer programa realiza lo mismo que los anteriores pero usando clases y objetos*/
# include <iostream.h>
# include<conio.h>
class notas
{ private:
float nota1;
float nota2;
public:
void asignar (float n1, float n2)
{ nota1 = n1;
nota2 = n2;}
float calcula_prom ( )
{ return( (nota1 + nota2) / 2.0); }
};
void main ( )
{ float a1, a2;
notas n;
clrscr( );
cout << "ingrese 1ra. Nota => "; cin >> a1;
cout << "ingrese 2da. Nota => "; cin >> a2;
n.asignar( a1, a2);
cout << " El promedio es = " << n.calcula_prom ( );
getch( ); }
EJECUCION
2.- Escriba
un programa que nos permita leer un conjunto de notas (dos notas por alumno ) de n alumnos y muestre el promedio
/* CODIGO: cppcap06prob02
FECHA: 28 de Agosto de 2012
OBJETIVO: Programa que trabaja con un vector de objetos*/
Ing. Ricardo Castaeda De La Rosa
143
144
3.- Escriba
un programa que defina la clase cuadrado y cubo adems debe calcular el rea del cuadrado, el
145
int area( )
{ int A;
A = 6*lado * lado;
return ( A); }
int volumen( )
{ int V;
V = lado*lado * lado;
return (V); }
};
void main( )
{ cuadrado C1;
cubo
C2;
int LADO;
clrscr();
cout<< "Ingrese Lado del cuadrado: ";
cin>> LADO;
C1.asignar(LADO);
cout<< "Ingrese Lado del Cubo: ";
cin>> LADO;
C2.asignar(LADO);
cout<<"Resultados del Cuadrado: "<<endl;
cout<<" Area = "<<C1.area()<<endl;
cout<<"Resultados del Cubo: "<<endl;
cout<<" Area = "<<C2.area()<<endl;
cout<<" Volumen = "<<C2.volumen()<<endl;
getch(); }
EJECUCION
EJERCICIOS PROPUESTOS
1) Escribir un programa que me permita crear la clase persona, considerando, dni,nombre, fecha de
nacimiento , distrito donde vive y telfono. El programa debe crear la clase y declarando objetos de
esta clase ingreasr datos y despus mostrarlos.
2) Escribir un programa que considere la clase anterior y declare un vector de objetos de esa clase,
adems debe poder consultar este vector de objetos y listar los dni y nombres que viven en un
determinado distrito.
146
3) Se tiene la clase empleado con cdigo, sueldo, nombre y categora, escribir las declaraciones de
datos miembros y crear las funciones miembro, de lectura, mostrar_datos y asignacin de sueldos,
esta ultima debe realizarse de la siguiente manera:
4) Escriba un programa que trabaje con la clase anterior pero con vectores de objetos y que visualize
todos los empledaos por categora..
5) Escriba un programa que me permita ingresar varios cursos creando la clase curso y finalmente me
entrege un listado. La clase curso debe considerar cdigo, nombre, costo y duracin en horas.
147
CAPITULO VII
CAPITULO VII
CONSTRUCTORES Y DESTRUCTORES
7
7.1
CLASES Y CONSTRUCTORES.Funciones miembro.- Las funciones miembro con componentes de una clase y normalmente
se definen dentro de la clase como funciones de lnea(inline). Pero tambin podemos definir el cuerpo de
Ing. Ricardo Castaeda De La Rosa
148
la funcin fuera de la clase. El mbito de una funcin se debe indicar por el operador mbito (:: ) con el
nombre de la clase. Ej:
PROGRAMA
/* CODIGO: cppcap07ejem01
FECHA: 7 de Setiembre de 2012
OBJETIVO: Programa de funciones que utilizan el operador de ambito */
#include <iostream.h>
#include <conio.h>
class nota
{ private:
int practica1;
int practica2;
public:
void asignar( int p1, int p2);
float promedio( );
};
void nota :: asignar( int p1, int p2)
{ practica1 = p1;
practica2 = p2;}
float nota :: promedio(void)
{ float prom;
prom = (practica1+practica2)/2.0;
return( prom); }
void main ( )
{
int prac1, prac2;
nota practicas;
clrscr( );
cout<< "Primera practica: "; cin >>prac1;
cout<< "Segunda practica: "; cin >>prac2;
practicas.asignar(prac1,prac2);
cout<< " El promedio sera = "<< practicas.promedio( );
getch();
}
EJECUCION
149
7.2 Constructores y Destructores.-Cuando se menciono a los punteros se dijo que se puede crear
variables apuntadas en forma dinmica(en ejecucin), para crear estas se utiliza el operador new y para
liberralas el operador delete, en la POO existen mecanismos similares. Cuando se crea un objeto es
llamado un mtodo que se denomina constructor y al terminar(salir) se llama a otro mtodo conocido
como destructor. Esto es lo que veremos a continuacin.
7.2.1
Constructor.- Es un mtodo especial que construye objetos. Un constructor es llamado para crear
una instancia de ese objeto asignando espacio a un objeto pude tambinasignar valores a sus
miembros datos. El constructor realiza una inicializacin automtica y no devuelve ningn valor.
Tiene el mismo nombre que la clase con la cual est asociada. Puede tener parmetros como
cualquier otra funcin y tener por lo tanto distintas formas. Si no se define para una clase, el
compilador generara un constructor por defecto.
Ejemplo:
class circulo
{ private:
int c_x, c_y;
double radio;
public:
// constructor
circulo( int x, int y, double r)
{ radio = r;
c_x = x;
c_y = y; }
};
Constructores de copia
150
#include <iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
class nota
{ private : int dato;
public:
nota( ) //CONSTRUCTOR SIN ARGUMENTOS
{
EJECUCION
151
}
~punto( )
{ }
};
Ejemplo 3.- De un ejemplo de constructores y de destructores, definiendo la clase complejo , que tiene
componente real y componente imaginaria.
PROGRAMA
/* CODIGO: cppcap07ejem03
FECHA: 7 de Setiembre de 2012
OBJETIVO: Programa que muestra los diferentes tipos de constructores y el destructor */
#include <iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
class complejo
{ private:
int r, i;
public:
complejo()//constructor sin argumentos
{ r = i = 0; }
complejo(const int re, const int im)//constructor con argumentos
{ r = re;
i = im;}
complejo(const complejo &comp)//constructor de copia
{
r = comp.r;
i = comp.i;}
152
EJECUCION
Constructor new y destructor deleteEstos dos operadores tambinconstruyen y destruyen, que es una
forma de decir tambin reservan y liberan memoria.
El operador new obtiene memoria del sistema operativo, y proporciona un puntero a su punto inicial. Su
sintaxis es: tipo *p ;
p = new tipo;
El operador delete libera memoria reservada con new
Ejemplo 3:De un ejemplo de manejo de new y delete
PROGRAMA
/* CODIGO: cppcap07ejem04
FECHA: 7 de agosto de 2012
OBJETIVO: Programa ejemplo de new y delete */
#include <iostream.h>
#include <conio.h>
void main( )
{int *p1, *p2;
p1 = new int;//asigna la direccin de un campo entero a p1 que es puntero
cout << " Ingrese valor = > ";
cin >> (*p1);// almacena un valor en el campo apuntado por p1
p2=p1;//p2 toma la direccin de p1
p1 = new int;
cout << " Ingrese valor = > ";
cin >> (*p1);// almacena un valor en el campo apuntado por p1
cout<<(*p1)<<endl;
cout<<(*p2)<<endl;
delete p1;//libera memoria de p1
delete p2;//libera memoria de p2
getch ( ); }
EJECUCION
153
Primero: podemos ver que el operador new busca un campo o estructura del tipo indicado, en nuestro
caso entero y cuando lo encuentra asigna la direccin al puntero respectivo y despus bloquea el
acceso de otra variable a ese campo,
Segundo: el campo no tiene nombre propio sino que se le llama campo apuntado por, en nuestro
caso, p1 y esto se indica con *p1.
Tercero: El intercambio de informacin puede ser de puntero a puntero (p2=p1) o de campo apuntado
a campo apuntado (*p1) = (p2), sera un error lo siguiente: p1 = *p2.
Cuarto: La forma correcta de liberar a la memoria es delete p1 o delete p2.
154
PROBLEMAS
1.- Desarrollar un programa que maneje la clase empleado utilizando funciones fuera de la clase y que nos
permitan manejar el operador mbito. La clase empleado tendr los siguientes datos miembro y las
funciones indicadas.
class empleado
{ private:
int codemp;
char nomemp[40];
float hotemp;
float phoemp;
float pagemp;
public:
void ingreso_datos( int c, char[40], flota h, flota p);
float pago_neto( );
};
SOLUCION
PROGRAMA
/* CODIGO: PROGCPP07001
FECHA: 10 DE MARZO DE 2012
OBJETIVO: Programa que calcula pagos considerando funciones construidas
fuera de la clase pero que trabajan con el operador mbito :: */
#include <iostream.h>
#include <conio.h>
#include <string.h>
#include <stdio.h>
class empleado
{ private:
int codemp;
char nomemp[40];
float hotemp;
float phoemp;
float pagemp;
public:
void ingreso_datos( int c, char n[40], float h, float p);
float pago_neto( );
};
void empleado:: ingreso_datos( int c, char n[40], float h, float p)
{ codemp=c;
strcpy(nomemp,n);
hotemp=h;
Ing. Ricardo Castaeda De La Rosa
155
phoemp=p;
}
float empleado:: pago_neto( )
{
float pg;
pg = hotemp*phoemp;
pg = pg*0.89;//considerando un 11% de descuento
return(pg);
}
void main()
{ int codigo;
char nombre[40];
float horas_trabajadas;
float pago_hora;
float sueldo_neto;
empleado emp1;
clrscr();
cout<<"Ingrese codigo del trabajador --> "; cin>>codigo;
cout<<"Ingrese nombre del trabajador --> "; gets(nombre);
cout<<"Ingrese Horas trabajadas
emp1.ingreso_datos(codigo,nombre,horas_trabajadas,pago_hora);
sueldo_neto= emp1.pago_neto();
cout<<"Neto a pagar = "<<sueldo_neto;
getch();
}
EJECUCION
2.-Desarrollar un programa que maneje constructores y destructores de la clase caja que tiene las
caractersticas indicadas.
class caja
{ private:
int alto;
int ancho;
int largo;
..
Ing. Ricardo Castaeda De La Rosa
156
SOLUCION
PROGRAMA
/* CODIGO: PROGCPP07002
FECHA: 10 DE MARZO DE 2012
OBJETIVO: Programa que maneja constructores de la clase caja. */
#include <iostream.h>
#include <conio.h>
class caja
{ private:
int alto;
int ancho;
int largo;
public:
// constructor
caja ( int al, int an, int l)
{ alto = al;
ancho = an;
largo = l; }
// destructor
~caja ( )
{
// funcin inline
int volumen ( )
{ return ( alto*ancho*largo);
}
};
void main ( )
{ caja caja1(2,3,4);
caja caja2(5,6,7);
clrscr( );
cout << "El volumen de la primera caja sera => " << caja1.volumen( )<<endl;
cout << "El volumen de la segunda caja sera => " << caja2.volumen( )<<endl;
getch( ); }
EJECUCION
3.-Desarrollar un programa que trabaje con aritmetica de punteros y maneje polinomiospudiendo desarrollar
operaciones simples con estos polinomios.
SOLUCION
Ing. Ricardo Castaeda De La Rosa
PROGRAMA
/* CODIGO: PROGCPP07003
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 10 DE MARZO DE 2012
OBJETIVO: Programa que maneja la Aritmtica de punteros*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main( )
{ int a[10],b[10],n,i;
float pola,polb,x;
int *p1,*p2;
clrscr( );
cout<<"Ingrese valor n: ";cin>>n;
for(i=1;i<=n;i++)
{ cout<<"Ingrese valor de a["<<i<<"]= ";cin>>a[i];
cout<<"Ingrese valor de b["<<i<<"]= ";cin>>b[i]; }
cout<<"Ingrese x: ";cin>>x;
p1=&a[1];
p2=&b[1];
//hallando polinomios
pola=0;
polb=0;
for(i=1;i<=n;i++)
{ pola=pola+(*p1)*pow(x,n+1-i);
polb=polb+(*p2)*pow(x,n+1-i);
p1++;
p2++;
}
cout<<pola<<endl;
cout<<polb<<endl;
cout<<pola+polb;
getch();
}
EJECUCION
157
158
CAPITULO VIII
159
CAPITULO VIII
HERENCIA Y CLASES DERIVADAS
8. CLASES DERIVADAS
a. Definicin.-La forma sintctica para indicar que una clase es derivada de otra clase existente
ser:
class nombre_clase: [(public| private)] clase_base
{
declaraciones de miembros
};
La palabra reservada class puede ser sustituida por la palabra reservada struct, con la
implicacin de que los miembros son pblicos por defecto.
Una de las dos palabras, public y private, en la clase derivada son opcionales, para especificar
como los miembros de la clase base tienen que ser accesibles a la clase derivada:
b. Clases derivadas: Mediante la propiedad de la herencia podemos derivar una clase de otra ya
existente. Podemos entonces indicar que las clases derivadas heredan los miembros de las
clases que les dan origen, a estas ltimas se les llama clases bases
Ejemplo 1:
class persona
// CLASE BASE
{ protected:
char nombre[30];
char dni[9];
public:
void asignar (char n[30], char d[9])
{ strcpy (nombre, n);
strcpy (dni, d); }
void mostrar ( )
{ clrscr();
gotoxy(30,3);
cout<<"DATOS
gotoxy(35,6);
cout <<"Nombre = "<<nombre;
gotoxy(35,8);
cout <<" DNI = "<<dni;
getch(); }
};
class empleado : public persona //CLASE
DERIVADA
{ private:
int codigo;
float sueldo;
public:
void asignar (char N[30], char D[9], int c, int s)
160
gotoxy(35,6);
cout << "Nombre = "<<nombre;
gotoxy(35,8);
cout <<" DNI = "<<dni;
gotoxy(35,10);
cout <<"Codigo = "<<codigo;
gotoxy(35,12);
cout <<"Sueldo = "<<sueldo<<endl;
getch();
}
};
c. Herencia mltiple.- Este concepto nos indica que una clase puede derivarse de ms de una clase, un ejemplo es el
siguiente:
class base1
{ protected:
int dato1;
public:
void asignar (int d1)
{ dato1 = d1;
}
};
class base2
{ private:
int dato2;
public:
void asignar (int d2)
{ dato2 = d2;
}
int leer ( )
{ return(dato2);
}
};
class derivada12 : public base1, private base2
{ public:
void imprimir ( )
{ cout << b1<<leer( );
}
};
161
e.
Funciones virtuales.- Esta caracterstica permite a una funcin estar definida en una clase base y su clase derivada
bajo el mismo nombre.
La declaracin de virtual solo debe hacerse en la clase base, la funcin ser llamada de acuerdo al objeto al cual est
asociada.
class cuadrado
{ protected:
int lado;
public:
virtual int rea ( )
{ return (lado * lado);
}
};
class cubo: public cuadrado
{ public:
int rea ( )
{ return ( lado * lado * lado);
}
};
PROBLEMAS
1.- Construya un programa orientado a objetos que utilice la clase base persona, con su datos miembro nombre y DNI, adems de
considerar las funciones miembro asignar y mostrar; derivada de esta clase se manejara la clase empleado que aade datos
miembro cdigo y sueldo, y redefina las funciones de la clase base.
162
SOLUCION
PROGRAMA
/* CODIGO: PROGCPP09001
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 12 DE MARZO DE 2007
OBJETIVO: PROGRAMA QUE DERIVA LA CLASE EMPLEADO QUE ES DERIVADA DE LA CLASE BASE PERSONA*/
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
class persona
{ protected:
char nombre[30];
char dni[9];
public:
void asignar (char n[30], char d[9])
{ strcpy (nombre, n);
strcpy (dni, d); }
void mostrar ( )
{ clrscr();
gotoxy(30,3);
cout<< "DATOS DE LA PERSONA - CLASE BASE";
gotoxy(35,6);
cout <<"Nombre = "<<nombre;
gotoxy(35,8);
cout <<" DNI = "<<dni;
getch(); }
};
class empleado : public persona
{ private:
int codigo;
float sueldo;
public:
void asignar (char N[30], char D[9], int c, int s)
{ strcpy (nombre, N);
strcpy (dni, D);
codigo = c;
sueldo = s;
}
void mostrar ( )
{ clrscr();
gotoxy(30,3);
cout<< "DATOS DEL EMPLEADO - CLASE DERIVADA";
gotoxy(35,6);
cout << " Ingrese Codigo => "; cin >> code;
cout << " Ingrese sueldo bruto => "; cin >> sb;
e1.asignar( name, di, code, sb);
p1.mostrar();
e1.mostrar();
getch( );
}
EJECUCION
163
164
2.- Escriba un programa que simule un procesamiento de notas con dos sistemas de evaluacin diferentes, el sistema A :
promedio de prcticas = (p1+p2+p3)/3.0. Nota final = (exapar + exafin + propra)/3.0y el sistema B : promedio de prcticas =
(p1+p2+p3+p4)/4.0;Nota final = (exapar + 2*exafin +2* propra)/5.0.
Use clases derivadas para este fin.
SOLUCION:
PROGRAMA
/* CODIGO: PROGCPP09002
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 12 DE MARZO DE 2007
OBJETIVO: PROGRAMA QUE TRABAJA CON DOS CLASES DERIVADAS SIMULANDO DOS SISTEMAS DE EVALUACION
DE NOTAS*/
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
#include<ctype.h>
class notas
{ protected:
char code[10];
char name[40];
int exapar;
: "<<exafin;
gotoxy(31,14);
cout << " Promedio Pract. : "<<propra;
gotoxy(31,16);
cout << " Nota Final
: "<<notafin;
getch();
}
};
class sistemaA : public notas
{ public:
int p1, p2 , p3;
public :
void calcula_nf ( )
{ propra = (p1+p2+p3)/3.0;
notafin = (exapar + exafin + propra)/3.0;
}
};
class sistemaB : public notas
{ public:
int p1, p2 , p3, p4;
public :
void calcula_nf ( )
{ propra = (p1+p2+p3+p4)/4.0;
notafin = (exapar + 2*exafin +2* propra)/5.0;
}
};
165
166
void main ( )
{ char a1[10];
// almacena cdigo
int a4;
char sistema;
sistemaA al1;
sistemaB al2;
clrscr( );
gotoxy(30,3);cout<<"INGRESO DE DATOS";
gotoxy(31,6);
cout<< " CODIGO : "; cin >> a1;
gotoxy(31,8);
cout<< " NOMBRE : "; gets(a2);
gotoxy(31,10);
cout<< " Examen Parcial
gotoxy(31,12);
cout<< " Examen Final
gotoxy(31,14);
cout<< " Sistema de evaluacin A/B: "; cin >> sistema;
sistema = toupper( sistema);
// calculo de promedio de prcticas y nota final
if ( sistema == 'A')
{ cout << "
al1.asignar(a1,a2,a3,a4);
al1.calcula_nf( );
al1.mostrar( ); }
if ( sistema == 'B')
{ cout << "
al2.asignar(a1,a2,a3,a4);
al2.calcula_nf( );
al2.mostrar( );
}
}
EJECUCION
167
3.-Desarrolle un programa que nos muestre claramente el concepto de Herencia mltiple, esto debe hacerlo derivando una nueva
clase de dos clases bases.
SOLUCION:
PROGRAMA
/* CODIGO: PROGCPP09003
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2007
OBJETIVO: PROGRAMA QUE TRABAJA CON HERENCIA DE DOS CLASES BASES */
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
class alumno
{ protected:
char codalu[10];
char nomalu[40];
};
class curso
{ protected:
char codcur[7];
char nomcur[30];
float notcur;
};
class matricula: public alumno, public curso
{ private:
168
float pagoma;
int ok;//1 matriculado 0 no matriculado
public:
void asignar( char ca[10], char na[40],char cc[7], char nc[30],float nt, float pm, int sm)
{strcpy(codalu,ca);
strcpy(nomalu,na);
strcpy(codcur,cc);
strcpy(nomcur,nc);
notcur =nt;
pagoma=pm;
ok=sm;
}
void mostrar()
{ clrscr();
gotoxy(30,2); cout<< "DATOS DE MATRICULA ";
gotoxy(31,6); cout<< "Codigo
: "<<codalu;
: "<<nomalu;
: "<<nomcur;
: "<<notcur;
: "<<codcur;
void main ( )
{ matricula alu1;
char codigo[10],nombre[40], ccurso[7],ncurso[30];
float nota,pago;
int sm;
clrscr();
//Ingreso de Datos
gotoxy(30,2); cout<<"INGRESO DE DATOS";
gotoxy(31,6); cout<<"COIDGO
gotoxy(31,8); cout<<"NOMBRE
: ";gets(codigo);
: ";gets(nombre);
: ";gets(ncurso);
gotoxy(31,14); cout<<"NOTA
: ";cin>>nota;
gotoxy(31,16); cout<<"PAGO
: ";cin>> pago;
EJECUCION
PROGRAMA
/* CODIGO: PROGCPP09004
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2007
OBJETIVO: PROGRAMA QUE TRABAJA CON FUNCIONES AMIGAS */
#include<iostream.h>
#include<conio.h>
#include<string.h>
169
170
class empleado
{ private:
char nombre[20];
int codigo;
public :
empleado( char *nomb, int cod) // constructor
{ strcpy (nombre,nomb);
codigo = cod;
}
friend void imprime_dat_emp(empleado c); // declaracin de funcin amiga
};
void imprime_dat_emp(empleado c)
{ cout << "Nombre del cliente : " << c.nombre<< endl;
cout << "Codigo del cliente : " << c.codigo << endl;
}
void main ( )
{clrscr( );
empleado Perez ("Juan Perez", 1111);
imprime_dat_emp(Perez);
empleado Rosas ("Nstor Rosas", 2222);
imprime_dat_emp(Rosas);
getch( );
}
EJECUCION
CAPITULO XI
171
172
CAPITULO XI
SOBRECARGA
9.
POLIMORFISMO Es la capacidad de los objetos de responder de manera diferente a las mismas ordenes, dependiendo a la
clase a la cual pertenecen. El Polimorfismo se implementa de dos maneras:
Va funciones virtuales
Por sobrecarga.
f.
VIA FUNCIONES VIRTUALES El concepto de funcin virtual ya lo vimos anteriormente, veamos ahora un ejemplo
Ejemplo:
/ * Ejemplo de Polimorfismo con funciones virtuales * /
# include<iostream.h>
# include<conio.h>
class figura
{ protected:
float par1;
public:
void asignar ( float p1)
{
par1 = p1;
}
virtual float area( )
{ return (0);}
};
class circulo : public figura
{ public:
virtual float area( )
{ return (3.1416*par1*par1);}
};
class cuadrado : public figura
{ public:
virtual float area( )
{ return (par1*par1);}
};
g.
i.
173
La palabra reservada operator.- Para hacer que un operador de C++ acte como un operador definido por el usuario,
se debe utilizar la palabra reservada operator. El formato de sobrecarga es:
Operadores Unarios.
Operador * (Indireccion)
Operador Operador ++
Operador --
Operadores Binarios.
Operador +
Operador Operador *
Operador /
Operador %
Operador <<
Operador >>
Operador &
Operador ^
Operador |
Operador []
Operadores De Asignacin
Operador =
Operador +=
Operador -=
Operador *=
Operador /=
Operador %=
Operador <<=
Operador >>=
Operador &=
Operador ^=|
Operador |=
174
// (Comprobacin)
PROBLEMAS
1.- Construya un programa orientado a objetos desarrolle el polimorfismo utilizando el concepto de funcin virtual.
SOLUCION
PROGRAMA
/* CODIGO: PROGCPP010001
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 20 DE MARZO DE 2007
OBJETIVO: Ejemplo de Polimorfismo con funciones virtuales */
#include<iostream.h>
#include<conio.h>
class figura
{ protected:
float par1;
public:
void asignar ( float p1)
{ par1 = p1; }
virtual float area( )
{
return (0) ; }
};
class circulo : public figura
{ public:
virtual float area( )
{
return (3.1416*par1*par1);
}
};
class cuadrado : public figura
{ public:
virtual float area( )
{
return (par1*par1);
175
176
}
};
void main ( )
{ circulo cir1;
cuadrado cua1;
float a1;
clrscr();
cout<<"Ingrese radio circulo=> "; cin>> a1;
cir1.asignar(a1);
cout<< " rea = "<< cir1. area()<< endl;
cout<<"Ingrese lado cuadrado=> "; cin>> a1;
cua1.asignar(a1);
cout<< " Area = "<< cua1. area();
getch();
}
EJECUCION
2.- Construya un programa que sobrecargue un operador realizando una operacin para un objeto.
SOLUCION
PROGRAMA
/* CODIGO: PROGCPP010002
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 12 DE MARZO DE 2007
OBJETIVO: Sobrecarga de operadores es la facultad que tiene un operador defuncionar de forma diferente segn el
tipo de dato con el que se utilice,
Es decir, hacer que el operador funcione con los datos que el usuario cree.
En el cuerpo de la funcinhabr que poner las operaciones que queramos
Querealice el operador */
#include<iostream.h>
#include<conio.h>
class clase
{
int x,y;
public:
clase(int x=0,int y=0);
Ing. Ricardo Castaeda De La Rosa
177
clase aux;
aux.x=x+obj.x; //x del objeto ms x que pasa
aux.y=y+obj.y;
return(aux); }
void clase::visualizar()
{
main( )
{ clase a(5,7); clase b(3,4); clase c;
c=a+b; //x de a ms x de b ; y de a ms y de b
c.visualizar( ); //c=operator +b;
getch(); }
EJECUCION
3.- Construya un programa que sobrecargue una funcin utilizando dos tipos de datos diferentes, la funcindebe ser simple.
SOLUCION
PROGRAMA
/* CODIGO: PROGCPP010003
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 20 DE MARZO DE 2007
OBJETIVO: Funcin fecha recargada */
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void fecha(char *fecha);
void fecha(int anno,int mes, int dia);
void main()
178
{ clrscr();
fecha("20/3/2007");
fecha(07,3,21);
getch();
}
void fecha(char *fecha)
{cout <<"Fecha: "<<fecha<<endl;}
void fecha(int anno,int mes, int dia)
{cout<<"Fecha: "<<dia<<"/"<<mes<<"/"<<anno;}
EJECUCION
4.- Construya un programa que sobrecargue un constructor y que nos permita inicializar un arreglo y otro constructor que no
inicialice
SOLUCION
PROGRAMA
/* CODIGO: PROGCPP01004
PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA
FECHA: 20 DE MARZO DE 2007
OBJETIVO: Vamos a trabajar sobrecargando un constructor para permitir que tanto los objetos como los arrays de objetos
aparezcan dentro de un programa, como se sabe es comn inicializar variables que inicializar arrays, de modo que para admitir
arrays de objetos sin inicializar, junto con objetos inicializados debe incluirse un constructor que permita la inicializacin y otro que
no. */
#include<iostream.h>
#include<conio.h>
class base
{ protected:
int j;
public:
base();//sin inicializador
base(int n);//con inicializador
int getx();
};
base::base()
EJECUCION
179