PROGRAMACION ORIENTADA A OBJETOS - Ingeniero Castañeda PDF
PROGRAMACION ORIENTADA A OBJETOS - Ingeniero Castañeda PDF
PROGRAMACION ORIENTADA A OBJETOS - Ingeniero Castañeda PDF
CAPITULO I
Ing.Ricardo Castañeda
2
PROGRAMACION ORIENTADA A OBJETOS 2013
Definición De Algoritmo.- Un algoritmo es la descripción ordenada paso a paso de la solución de un problema o
el desarrollo de un proceso.
Los algoritmos se pueden clasificar en tres tipos:
1. Algoritmo literal: Nos permite la comunicación de persona a persona una de sus formas más conocidas es el
SEUDOCÓDIGO.
2. Algoritmo gráfico: Nos permite visualizar la lógica de la solución. Se le conoce también como DIAGRAMA DE
FLUJO
3. Algoritmo codificado: Nos permite la comunicación entre la persona y la máquina (Computadora) . Se le conoce
como PROGRAMA.
Lenguajes De Programación Los lenguajes de programación nos permiten construir programas para
aplicaciones especificas, estos lenguajes normalmente tienen su ámbito de aplicación o sea tienen diferentes
enfoques, por ejemplo los dos primeros lenguajes fueron el FORTRAN y el COBOL.
FORTRAN.- Su nombre proviene de, FORmula TRANslation, es un lenguaje científico creado especialmente
para la realización de cálculos.
COBOL.- Su nombre proviene de COmmon Busines Oriented Lenguaje, es un lenguaje para manejo de
información comercial creado especialmente para la realización de procesos.
Actualmente tenemos una variedad de lenguajes, desde bajo nivel hasta alto nivel, una breve descripción seria:
1. Lenguaje de maquina: Es una secuencia de bits, que realmente son señales eléctricas (normalmente 0
voltios y 5 voltios) que para el computador serán los ceros y unos llamados también bits, por ejemplo:
01011001 00001101
La programación con este lenguaje es muy dificultosa y normalmente se recurre a otro lenguaje nemotécnico
llamado ensamblador.
2. Lenguaje ensamblador: donde las instrucciones y los dispositivos se reemplazan por códigos nemotécnicos
con lo cual se facilita tremendamente la programación, dependiendo del procesador, tendríamos por ejemplo:
mov ah,9
int 21h
mov ah,10
………….
push cs
El ensamblador depende de la arquitectura del procesador pero normalmente existen bastantes similitudes
en todos los ensambladores.
3. Lenguaje de alto nivel: Nos permiten realizar muchas operaciones con pocas instrucciones, estas
instrucciones se parecen al lenguaje que usamos comúnmente (en idioma ingles), por ejemplo: begin, end,
program, if, else etc.
Tenemos el Pascal, FoxPro Java, Visual Basic, Visual FoxPro etc.
Un lenguaje interesante es el lenguaje “C” que es el que nosotros vamos a utilizar, este lenguaje es de nivel
intermedio pues tiene rutinas que realizan procedimientos complejos con una sola instrucción así como
también el manejo casi al nivel de máquina, por lo tanto es de nivel intermedio.
Tipos de Programación
La programación ha evolucionado desde la primera vez que fue utilizada y se ha modificado sobre todo por la
opinión y contribución de los expertos programadores, la secuencia ha sido:
1. Programación lineal
Se colocan todas las sentencias en el programa principal, a medida que la aplicación realiza nuevas tareas y se
Programación Lineal
Programa 1xxx, con mas
Programa 1xxx tareas
……………….. ………………..
…………………. ………………….
…………………… …………………
………………….. …………………
…………………… …………………..
…………………….. ……………………
…………………….. ……………………..
Fin ……………………..
……………………
…………………..
……………………
……………………..
……………………..
Fin
Programación estructurada
Programa principal
Subprog01 Subprog01
Subprog02
Subprog02
Subprog03
Subprog03
Subprog01.1
Programa Subprog01, con
principal mas tareas
Subprog01 Subprog01.2
Subprog02 Subprog02
Subprog03
Subprog03
Ing.Ricardo Castañeda
4
PROGRAMACION ORIENTADA A OBJETOS 2013
El algoritmo es la piedra fundamental de la programación pues los programas y el sistema en general será tan bueno
como buenos sean los algoritmos utilizados para la construcción de este.
En realidad un algoritmo es la descripción de una secuencia de solución que normalmente está compuesta por los
siguientes bloques:
INICIALIZACION – LECTURA – PROCESO – ESCRITURA Esta estructura es como un esqueleto que siempre
tenemos que tomar en cuenta cuando desarrollamos un algoritmo. Gráficamente lo consideramos como sigue:
INICIALIZAR
LEER
PROCESAR
ESCRIBIR
Seudocódigo y diagrama de flujo
El seudocódigo es un algoritmo literal cuya semejanza con el lenguaje de programación (código) lo hace muy útil para
la fase de previa a la escritura del programa después el programa podrá fácilmente ser escrito; veamos un ejemplo:
Ejemplo 1.1
ALGORITMO
/* Permite verificar si una nota es aprobatoria o no */
nota es entera
1.- Leer (nota)
2.- Si (nota >=10)
Entonces
2.1. Escribir ( “Aprobatoria”)
Sino
2.2. Escribir (“Desaprobatoria”)
Fin-si
3.- Fin
PROGRAMA
/* Codigo: poo01e1
programa creado por Ricardo Castañeda de la Rosa
Fecha: 17 de marzo de 2013
objetivo: programa que verifica si una nota ingresada por teclado es aprobatoria o no
datos de entrada : nota
salida : mensaje de aprobacion o desaprobacion*/
# include<iostream.h>
# include<conio.h>
void main( )
{ int nota;
clrscr();
cout << "Nota = "; cin>> nota;
if ( nota >=10)
cout<< "Aprobatoria";
else
EJECUCION
cout<< "Desaprobatoria";
getch( ); }
En cambio el objetivo del diagrama de flujo es visualizar rápidamente la lógica del algoritmo.
INICIO
Leer (Nota)
¿Nota >= 10?
V F
Escribir Escribir
“Aprobado” “Desaprobado”
FIN
Diagrama de Flujo
Pero las tres herramientas representan lo mismo y por eso también se clasifican como:
Algoritmo literal (seudocódigo) Permite la comunicación Persona – Persona
Algoritmo codificado (programa) Permite la comunicación Persona – Computadora
Algoritmo gráfico (diagrama de flujo) Visualiza la lógica.
Como vemos cada tipo de algoritmo tiene su propia utilidad, pero nos damos cuenta que son herramientas paralelas.
Objetos_Datos de Entrada/Salida
Los procesos estándares casi siempre transforman los objetos _ datos de entrada en objetos _ datos de salida. Todas
las variables se definen como almacenadores de datos de entrada o como almacenadores de resultados o en
algunos casos como variables intermedias. Los procesos transformadores normalmente tienen componentes de los
siguientes procesos básicos:
o Procesos secuenciales.
o Procesos de decisión.
o Procesos de repetición.
Procesos Directos o Secuenciales
Los procesos por defecto son secuenciales o directos y su objetivo es realizar un cálculo o un procedimiento. Son los
casos más comunes pero tienen poca inteligencia incorporada y sirven en problemas sencillos.
Ejemplo 1.2: Escriba un algoritmo que nos permita leer dos datos y hallar su media.
ALGORITMO
dato1, dato2 son enteros
media es real
1.- Leer (dato1)
2.- Leer (dato2)
3.- media (dato1 + dato2)/2
4.- Escribir (media)
5.- Fin
Ing.Ricardo Castañeda
6
PROGRAMACION ORIENTADA A OBJETOS 2013
ALGORITMO
total_horas, semanas, días y horas son enteros.
resto es entero
1.- Leer (total_horas)
PROGRAMA
/* CODIGO:POO1E3
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2013
OBJETIVO: PROGRAMA QUE LEE UNA CANTIDAD EN HORAS Y LAS ESCRIBE COMO SEMANAS, DIAS Y
HORAS.
DATOS DE ENTRADA : total_horas
SALIDA : semanas, dias,horas.*/
#include <iostream.h>
#include <conio.h>
int total_horas, semanas, dias , horas;
int resto;
void main ()
{ clrscr();
cout<<"INGRESE DATOS"<<endl;
cout<< " TOTAL DE HORAS = ";
cin>> total_horas;
semanas = total_horas / 168;
resto = total_horas % 168;
dias = resto/24;
horas = resto%24;
cout<< " SEMANAS = "<<semanas<<endl;
cout<< " DIAS = "<<dias<<endl;
cout<< " HORAS = "<<horas<<endl; getch(); }
EJECUCION:
/* CODIGO: POOC1E4
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2013
OBJETIVO: Programa secuencial que calcula una función de la forma
f1(x) = A*x^2 +B*x +C ; los coeficientes A, B y C serán leídos, asi como el argumento x */
#include <iostream.h>
#include <conio.h>
void main( )
{ float A,B,C;
float x, f1;
clrscr( );
cout<< "Ingrese coeficientes de A*x^2 +B*x +C "<< endl;
cout<< " A = "; cin>>A;
cout<< " B = "; cin>>B;
cout<< " C = "; cin>>C;
cout<< " Ingrese argumento x = "; cin>>x;
f1= A*x*x+B*x+C;
cout<< " f1(x) = "<< f1; getch(); }
Ing.Ricardo Castañeda
8
PROGRAMACION ORIENTADA A OBJETOS 2013
Estructuras de Decisión Simple (Si) .- Nos permite derivar el control hacia uno de dos puntos del algoritmo.
Forma General
Si (Condición)
Entonces
...............
...........(Bloque1)
...............
[Sino
...............
...........(Bloque2)
............]
Fin Si
Funcionamiento.- Se evalúa la condición, si esta se cumple (es verdadera) se ejecuta el bloque 1 (Entonces) si esta
no se cumple se ejecuta el bloque 2 (sino), en caso de que este exista, luego se pasa a la siguiente instrucción.
Nota: La forma sin el else se utiliza bastante y por eso la indicamos.
Si (Condición)
Entonces
...............
Fin Si
Ojo que esta es la primera forma solo que sin la parte opcional else.
Ejemplo 1.6: Veremos tres casos con las mismas variables pero con diferentes valores. El funcionamiento del Si se
visualizara de acuerdo a la salida.
Segmento de Algoritmo Segmento de Algoritmo Segmento de Algoritmo
Nota = 15 Nota = 9 Nota = 8
Escribir(“FIN”)
Aprobado Desaprobado
FIN FIN FIN
Ejemplo 1.7: Escriba un algoritmo que lea cuatro valores y me muestre el menor.
ALGORITMO
Dato1, dato2, dato3, dato4, Menor1, Menor2 y MenorT son enteros
1.- Leer(dato1,dato2, dato3, dato4)
2.- Si ( dato1 < dato2)
Entonces
2.1 Menor1 dato1
Sino
2.2 Menor1 dato2
FinSi
Ing. Ricardo Castañeda
9
FACULTAD DE INGENIERIA MECANICA 2013
3.- Si ( dato3 < dato4)
Entonces
3.1 Menor2 dato3
Sino
3.2 Menor2 dato4
FinSi
4.- Si ( Menor1 < Menor2)
Entonces
4.1 MenorT Menor1
Sino
4.2 MenorT Menor2
FinSi
5.- Escribir( “El menor total es =“, Menort)
6.- FIN
PROGRAMA
/* CODIGO: POOC1E7
FECHA: 17 DE MARZO DE 2013
OBJETIVO: Programa que muestra el menor de 4 valores */
# include<iostream.h>
# include<conio.h>
void main( )
{ int dato1, dato2, dato3, dato4,menor1, menor2, menort;
clrscr( );
cout<< " dato1="; cin>> dato1;
cout<< " dato2="; cin>> dato2;
cout<< " dato3="; cin>> dato3;
cout<< " dato4="; cin>> dato4;
if ( dato1<dato2)
menor1 = dato1;
else
menor1 = dato2;
if ( dato3<dato4)
menor2 = dato3;
else
menor2 = dato4;
if ( menor1<menor2)
menort = menor1;
else
menort =menor2;
cout<< " El menor total es ="<<menort;
getch( ); }
Ing.Ricardo Castañeda
10
PROGRAMACION ORIENTADA A OBJETOS 2013
Ejemplo 1.8: Escriba un programa que lea los datos de un cilindro y si son positivos y calcule el área y el volumen.
Solucion:
ALGORITMO
/* Halla área y volumen de un cilindro */
radio, altura, Pi son reales
area1, area, volumen son reales
1.- Leer(radio)
2.- Leer(altura)
3.- Pi = 3.1416
4.- Si ( (radio > 0) i (altura > 0)
Entonces
4.1 area1 Pi*radio2
4.2 area2*Pi*radio*altura+ 2*area1
4.3 volumen area1*altura
4.4 Escribir(area, volumen)
FinSi
5.- FIN
PROGRAMA
/* CODIGO: POOC1E8
FECHA: 17 DE MARZO DE 2013
OBJETIVO: Programa que halla el volumen y area de un cilindro
Datos de Entrada:: RADIO Y ALTURA
Salida: AREA Y VOLUMEN.*/
# include<iostream.h>
# include<conio.h>
# include<math.h>
void main( )
{ float radio, altura, pi , area, volumen, area1;
clrscr( ); pi = 3.1416;
cout<< " radio = "; cin>> radio; cout<< " altura = "; cin>>altura;
if ( (radio > 0 ) && (altura > 0) )
{area1 = pi * pow (radio,2);
area = 2*pi*radio*altura+2*area1;
volumen = area1 * altura;
cout<< "Area = "<<area<<endl; cout<< "Volumen = "<<volumen; }
getch( );}
EJECUCION
1 Si (Condición1)
Entonces
1.1 ...............
1.2 Si (Condicion2)
Entonces
1.2.1............
1.2.2............
Sino
1.2.3.................
1.2.4..................
FinSi(Anidado)
Sino
1.3..............
1.4.............
FinSi(Externo)
Aquí vemos que la estructura de decisión con la condición2, estará anidada en la estructura de decisión con la
condición1, veamos un ejemplo.
Ejemplo 1.9: Escriba el algoritmo que me permita leer una nota y escribir la condición académica del alumno en el
curso:
De 0 a 6 condición “Reprobado”
De 6 a 10 condición “Desaprobado”
De 10 a 16 condición “Aprobado”
De 16 a 20 condición “Excelente”
Solucion:
ALGORITMO
/* Discrimina nota*/
nota es entera
1. Leer ( nota)
2.-Si (nota<10)
Entonces
2.1 Si (nota>=6)
Entonces
2.1.1 Escribir(“Desaprobado”)
Sino
2.1.2 Escribir(“Reprobado”)
FinSi
Sino
2.2 Si (nota>=16)
Ing.Ricardo Castañeda
12
PROGRAMACION ORIENTADA A OBJETOS 2013
Entonces
2.2.1 Escribir(“Excelente”)
Sino
2.2.2 Escribir(“Aprobado”)
FinSi
FinSi
3.- FIN
PROGRAMA
/* CODIGO: POOC1E9
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2013
OBJETIVO: Lee nota e imprime condicion academica.*/
# include<iostream.h>
# include <conio.h>
void main( )
{ int nota ;
clrscr( );
cout << "Ingrese Nota => ";
cin>> nota;
if(nota <10)
if(nota>= 6)
cout<< "Desaprobado";
else
cout<< "Reprobado";
else
if(nota>=16)
cout<< "Excelente";
else
cout<< "Aprobado";
getch( ); }
EJECUCION
Estructuras de Decisión Múltiple (case).- Nos permite derivar el control hacia uno de varios puntos del algoritmo.
Forma General
Case (Índice)
1: ...............
(Bloque1)
2: ...............
Ing. Ricardo Castañeda
13
FACULTAD DE INGENIERIA MECANICA 2013
(Bloque2)
3: ...............
(Bloque3)
n: ...........
(Bloque n)
Sino : ........
(Bloque por defecto)
Fin Case
Funcionamiento.- Se evalúa el índice y si:
Vale 1 se ejecuta el bloque 1.
Vale 2 se ejecuta el bloque 2.
Vale n se ejecuta el bloque n.
Si cae fuera del rango [1,n} se ejecuta el bloque por defecto(sino).
A continuación se pasa a la siguiente instrucción.
Veamos un ejemplo:
Ejemplo 1.10: Escriba un algoritmo que lea los dos operandos ( valor1 y valor2) lea también el operador (+, - , * ó /) y ejecute la operación
indicada.
Solucion:
ALGORITMO
valor1, valor2, resultado son reales
operador es carácter
1. Leer ( valor1)
2.- Leer(valor2)
3.- Leer(operador)
4.- Case (operador)
“+” : resultado valor1 + valor2
escribir(“resultado = ”, resultado)
“– “: resultado valor1 – valor2
escribir(“resultado = ”, resultado)
“ * “: resultado valor1 * valor2
escribir(“resultado =”, resultado)
“/ “: resultado valor1 / valor2
escribir(“resultado =”, resultado)
sino: escribir( “ No es operación”)
Fin Case
5.- FIN
Ing.Ricardo Castañeda
14
PROGRAMACION ORIENTADA A OBJETOS 2013
PROGRAMA
/* CODIGO: POOC1E10
FECHA: 17 DE MARZO DE 2013
OBJETIVO: Lee operandos y operador y realiza la operacion.*/
# include<iostream.h>
# include<conio.h>
void main( )
{ float v1, v2,res; char operador;
clrscr( );
cout<< " v1 v2="; cin>> v1>>v2;
cout<< " operador ="; cin>> operador;
switch( operador)
{case '+': res=v1+v2;
cout<<"resultado="<<res;break;
case '-' :res=v1-v2;
cout<<"resultado="<<res;break;
case '*' : res=v1*v2;
cout<<"resultado="<<res;break;
case '/' : res=v1/v2;
cout<<"resultado="<<res;break;
default : cout<< " No es operación"; }
getch( ); }
EJECUCION
Ejemplo 1.11: Escriba un algoritmo que lea un numero entre 30 y 50 y lo imprima en letras.
Por ejemplo: lee 35 e imprime “treinta y cinco”.
Solucion:
ALGORITMO
/* Lee un numero entre 30 y 50 y lo convierte a letras */
numero, dec, uni son enteros
1. Leer ( numero)
2.- Si ( (numero>=30) i ( numero<=50))
Entonces
2.1 dec numero/10
2.2 uni numero%10
2.3 Case (dec)
3 : Escribir( “ Treinta”)
4 : Escribir (“ Cuarenta”)
5 : Escribir (“ Cincuenta”)
/* CODIGO: POOC1E11
FECHA: 17 DE MARZO DE 2013
OBJETIVO: Lee numero entre 30 y 50 en numeros y los transforma en letras. */
#include<iostream.h>
#include<conio.h>
void main( )
{int numero, dec, uni;
clrscr( );
cout<< " Numero = "; cin>> numero;
if ( (numero >= 30) && (numero<= 50))
{ dec = numero / 10; uni = numero % 10;
switch( dec)
{case 3 : cout<< "Treinta "; break;
case 4 : cout<< "Cuarenta "; break;
case 5 : cout<< "Cincuenta "; }
switch( uni)
{case 1 : cout<< "y uno"; break;
case 2 : cout<< "y dos"; break;
case 3 : cout<< "y tres"; break;
case 4 : cout<< "y cuatro"; break;
case 5 : cout<< "y cinco"; break;
case 6 : cout<< "y seis"; break;
case 7 : cout<< "y siete"; break;
case 8 : cout<< "y ocho"; break;
case 9 : cout<< "y nueve";
} }
else
cout<< " Fuera del rango";
getch( ); }
Ing.Ricardo Castañeda
16
PROGRAMACION ORIENTADA A OBJETOS 2013
EJECUCION
1.12.2. Estructura Hacer - Mientras.- Nos permite ejecutar varias veces un conjunto de instrucciones, esta
estructura repetitiva primero ejecuta y después prueba la condición.
Forma General
Hacer
.........................
...........................
(Bloque sentencias)
......................
Mientras(Condición)
Ing.Ricardo Castañeda
18
PROGRAMACION ORIENTADA A OBJETOS 2013
Funcionamiento.- Primero se ejecuta el bloque de sentencias y después se evalúa la condición, si esta se cumple
(es verdadera) se ejecuta nuevamente el bloque, se evalúa nuevamente la condición y si esta se sigue cumpliendo
se vuelve a ejecutar el bloque y así se seguirá repitiendo mientras la condición sea verdadera, si en alguna
evaluación la condición ya no se cumple termina la repetición y se pasa a la siguiente instrucción.
La diferencia con el bloque mientras es el orden en la evaluación de la condición (expresión
booleana en general) y la ejecución del bloque asociado.
MIENTRAS HACER – MIENTRAS
PROBAR EJECUTAR
EJECUTAR
PROBAR
Ejemplo 1.13: Escriba un algoritmo que lea 10 valores y me muestre la suma y el promedio de ellos.
Solucion:
ALGORITMO
/* Halla suma y promedio de 10 valores leídos.
Utiliza la estructura repetitiva el Hacer-Mientras */
valor, suma , cont son enteros
promedio es real
1.- cont 0
2.- suma 0
3.- Hacer
3.1.-Leer(valor)
3.2.- suma suma + valor
3.3.-cont cont + 1
Mientras(cont <10)
4.- promedio suma/10.0
5.- Escribir ( “Suma = “, suma)
6.- Escribir ( “ Promedio =”, promedio)
7.- Fin
PROGRAMA
/* CODIGO: POOC1E13
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2013
OBJETIVO: Hallar suma y promedio de 10 valores leídos, con el do while */
# include<iostream.h>
# include<conio.h>
void main( )
{ int valor, suma, cont;
Ing. Ricardo Castañeda
19
FACULTAD DE INGENIERIA MECANICA 2013
float promedio;
clrscr( );
cont =suma= 0;
do { cout<< " valor = "; cin >> valor;
suma = suma + valor;
cont ++;
} while ( cont<10);
promedio = suma/10.0;
cout << " Suma = "<< suma<< endl;
cout << " Promedio = " << promedio; getch( ); }
EJECUCION
Ejemplo 1.14: Escriba un algoritmo que permita mostrar un menú vertical, indicando las opciones en forma general.
Solucion:
ALGORITMO
/* Muestra menú vertical en forma general */
opcion es caracter
1. Hacer
1.1 LimpiarPantalla ( )
1.2 Escribir ( “MENU VERTICAL”)
1.3 Escribir ( “1.- Tarea 1 ”)
1.4 Escribir ( “2.- Tarea 2 ”)
1.5 Escribir ( “3.- Tarea 3 ”)
1.6 Escribir ( “4.- Tarea 4 ”)
1.7 Escribir ( “5.- Salir ”)
1.8 Escribir ( “Opcion =>”)
1.9 Leer (opcion)
1.10 case ( Opcion)
1.10.1 ‘1’: Funcion1()
1.10.2 ‘2’: Funcion2()
1.10.3 ‘3’: Funcion3()
1.10.4 ‘4’: Funcion4()
FinCase
Mientras ( opcion <> ‘5’)
2. FIN
Ing.Ricardo Castañeda
20
PROGRAMACION ORIENTADA A OBJETOS 2013
PROGRAMA
/* CODIGO: POOC1E14
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2013
OBJETIVO: Muestra un menu vertical general */
# include<iostream.h>
# include<conio.h>
void main( )
{ char opcion;
do
{ clrscr( );
gotoxy(30,2);cout<<"MENU VERTICAL";
gotoxy(30,6);cout<<"1.- Tarea 1";
gotoxy(30,7);cout<<"2.- Tarea 2";
gotoxy(30,8);cout<<"3.- Tarea 3";
gotoxy(30,9);cout<<"4.- Tarea 4";
gotoxy(30,10);cout<<"5.- Salir";
gotoxy(30,16);
cout<<"Opcion --> ";
cin >> opcion;
switch ( opcion)
{ case '1': clrscr();
cout << " Tarea 1";
getch();
break;
case '2': clrscr();
cout << " Tarea 2";
getch();
break;
case '3': clrscr();
cout << " Tarea 3";
getch();
break;
case '4': clrscr();
cout << " Tarea 4";
getch();
break;
}
} while (opcion!='5');
}
1.12.3 Estructura Para.- Nos permite ejecutar varias veces un conjunto de instrucciones un número fijo de veces.
Forma General
Para vc = vi, vf, vinc
.........................
...........................
....(Bloque Para)
........................
Fin Para
Donde: vc variable de control, llamado también índice del Para.
vi valor inicial es el primer valor que toma la variable de control.
vf valor final, es el ultimo valor con el que el lazo para se ejecutara.
vinc valor incremento, valor en el cual se incrementa la variable de control después de cada lazo.
Funcionamiento.- El funcionamiento del lazo Para se explica mediante un algoritmo.
ALGORITMO DE FUNCIONAMIENTO DEL LAZO PARA
(Considerando incremento positivo)
1 Si ( vi > vf )
Entonces
1.1 Ir a paso (6)
FinSi
2 vc vi
3 Se ejecuta rango del lazo para
4 vc vc + vinc
5 Si ( vc <= vf )
Entonces
5.1 Ir a paso (3 )
6 FIN
Ing.Ricardo Castañeda
22
PROGRAMACION ORIENTADA A OBJETOS 2013
Ejemplo 1.15: Que imprime el siguiente algoritmo
1 Para i = 1,12,2
Escribir ( i)
Fin Para
2 Escribir (“ FIN”)
Solución:
De acuerdo a lo dicho y considerando lo siguiente:
vc es i : vi = 1 : vf = 12: vinc = 2
Imprimirá:
1
3
5
7
9
11
FIN
Ejemplo 1.16: Escriba un algoritmo que lea 10 valores y me muestre la suma y el promedio de ellos.
Solucion:
ALGORITMO
/* Halla suma y promedio de 10 valores leídos, ojo no usa contador, pero ”i” cumple esa función */
valor, suma , i son enteros
promedio es real
1. Suma 0
2. Para i = 1,10 // El incremento unitario se puede omitir
2.1. Leer(valor)
La variable i es una variable de control pero es interna, nosotros no podemos modificar su valor.
Ing.Ricardo Castañeda
24
PROGRAMACION ORIENTADA A OBJETOS 2013
PROBLEMAS
ALGORITMOS SECUENCIALES
1.- Escriba un algoritmo que lea una cantidad en grados centígrados y lo muestre como grados Fahrenheit.
Implemente el algoritmo el Borland C++ para visualizar los datos de entrada y la emisión de resultados
Solución:
ALGORITMO
grados_c , grados_f son reales
1. INICIO
2. Leer (grados_c)
3. grados_f 32 + (9/5)*grados_c
4. Escribir(grados_f)
5. FIN
PROGRAMA
/* CODIGO: POOC1PROB1
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2013
OBJETIVO: LEER UNA CANTIDAD EN GRADOS CENTIGRADOS Y MOSTRAR SU EQUIVALENTE EN GRADOS FARENHEIT*/
#include<iostream.h>
#include<conio.h>
void main()
{
float grados_c,grados_f;
clrscr();
cout<<"Ingrese grados centigrados--> ";
cin>>grados_c;// Lee grados Centigrados
grados_f = 32+(9.0/5.0)*grados_c; //Calcula el equivalente en grados Farenheit
cout<< " En grados farenheit sera : "<< grados_f;//Muestra los grados Farenheit
getch();// nos permite visualizar el resultado, la función getch() pide un caracter
}
EJECUCION
2.- Dado los datos de planilla de un empleado, nombre, código, sueldo bruto mensual, horas extras y días faltos
(asumiendo que el descuento sobre el total es de 15%); escriba un algoritmo que procese esta información y me
muestre el sueldo neto que el empleado recibirá.
Implemente el algoritmo el Borland C++ para visualizar los datos de entrada y la emisión de resultados
Solución
Solución:
ALGORITMO
/*Declaración de Variables*/
getch();
}
EJECUCION
4.- Escriba un algoritmo que lea cuatro prácticas y halle el promedio. Las reglas son:
a) De no rendir alguna práctica el valor almacenado en esa práctica será 99.
b) De promediarse algún 99 el valor tomado para el promedio será de 0.
c) De existir algún 99 se promediara las otras tres prácticas.
d) De haber rendido las cuatro prácticas se eliminara la menor.
Solución:
ALGORITMO
/*Declaración de Variables*/
p1, p2, p3, p4, menor1, menor2, menort son enteras
promedio es real
INICIO
1. Leer (p1)
2. Leer (p2)
5.- Escriba un algoritmo que me permita hallar la fecha del día siguiente dada la fecha de un día cualquiera.
Ejemplo: Lee 31/12/2006
Escribe 01/01/2007
Lee 30/06/2005
Escribe 01/07/2005
Lee 15/07/2007
Escribe 16/07/2007
Solución:
ANALISIS
Tenemos tres casos
1.- Fin de año: en este caso hay que comprobar si el mes es 12 (Diciembre) y el día es 31; en este caso se
Ing.Ricardo Castañeda
32
PROGRAMACION ORIENTADA A OBJETOS 2013
2.- Fin de mes: en este caso hay que comprobar si es el último día del mes o sea puede ser mes 6 y día 30 ó
mes 7 y día 31 o mes 2 y día 29 pero en año bisiesto; en este caso se inicializa el día, el mes se incrementa
3.- El caso no es ni fin de año ni fin de mes: se incrementa día; mes y año permanecen igual.
ALGORITMO
/*Declaración de Variables*/
día, mes, año son enteras
cond1,cond2,cond3,cond4 son enteras
1. INICIO
2. Leer (día)
3. Leer (mes)
4. Leer (año)
5. cond1 (día=31) i (mes=12) /*Condición cambio de año*/
6. cond2 (día=31) i ((mes=1)o(mes=3)o(mes=5)o(mes=7)o(mes=8)o(mes= 10))/*Cambio de mes.(31 días)*/
7. cond3 (día=30) i ((mes=4)o(mes=6)o(mes=9)o(mes=11))/*Cambio de mes.(30 días)*/
8. cond4 ((día=28) i (mes=2) i (año%4)!=0)) o ((día=29) i (mes=2) i (año%4)= 0))/*Cambio de mes. febrero*/
9. Si (cond1)
Entonces
9.1. día 1
9.2. mes1
9.3. añoaño+1
Sino
9.4. Si (cond2 o cond3 o cond4)
Entonces
9.4.1. día 1
9.4.2. mesmes +1 Sino
9.4.3. díadia+1
FinSi
FinSi
10. Escribir(dia,mes.año)
11. FIN
PROGRAMA
/* CODIGO:POOC1PROB5
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA : 17 DE MARZO DE 2013
OBJETIVO: LEE UNA FECHA Y ESCRIBE FECHA DEL DIA SIGUIENTE */
#include<iostream.h>
#include<conio.h>
void main()
{ int dia, mes, a , cond1,cond2,cond3,cond4;
clrscr();
cout<<"Ingrese dia entre 1 y 31 ==> "; cin>>dia;
Ing. Ricardo Castañeda
33
FACULTAD DE INGENIERIA MECANICA 2013
cout<<"Ingrese mes entre 1 y 12 ==> "; cin>>mes;
cout<<"Ingrese año entre 1900 y 2010 ==> "; cin>>a;
cond1 = (dia==31)&&(mes==12); /*Condición cambio de año*/
cond2 = (dia==31)&&((mes==1)||(mes==3)||(mes==5)||(mes==7)||(mes==8)||(mes==10));
cond3 = (dia==30)&&((mes==4)||(mes==6)||(mes==9)||(mes==11));
cond4 = ((dia==28)&&(mes==2)&&((a%4)!=0))|| ((dia==29) && (mes==2) && ((a%4)== 0));
if (cond1)
{ dia=1;
mes=1;
a =a+1; }
else
if(cond2 || cond3 || cond4)
{ dia = 1;
mes =mes +1; }
else
dia = dia+1;
cout<< "EL DIA SIGUIENTE ES ==> "<<dia<<"/"<<mes<<"/"<<a;
getch(); }
EJECUCION
Ing.Ricardo Castañeda
36
PROGRAMACION ORIENTADA A OBJETOS 2013
9.2. denominadordenominador*contador
9.3. termino numerador/denominador
9.4. expx expx +termino
9.5. contador contador +1
9.6. error abs(termino*x/(contador+1))
Fin Mientras
10. Escribir(exp(x), expx) /* Muestro valor de librería y valor calculado.
11. FIN
PROGRAMA
/* CODIGO: POOC1PROB7
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 17 DE MARZO DE 2013
OBJETIVO: CALCULA LA SERIE EXPONENCIAL CON 3 DIGITOS DECIMALES EXACTOS */
#include<iostream.h>
#include<conio.h>
#include<math.h>
void main()
{ int contador , denominador;
float expx,error,maxerror,termino, numerador,x;
clrscr();
maxerror= 0.0005;
error = 1;
expx = 1;
numerador = 1;
denominador = 1;
contador = 1;
cout<<"Ingrese valor x (0.0 y 1.0)==> "; cin>>x;
while (error>maxerror)
{ numerador = numerador *x;
denominador = denominador*contador;
termino = numerador/denominador;
expx = expx + termino;
contador = contador + 1;
error = fabs(termino*x/(contador +1)); }
cout<<endl<<endl;
cout<< "El valor calculado por programa es : "<<expx<<endl;
cout<< "El valor calculado con la función de biblioteca es:"<<exp(x)<<endl;
getch(); }
EJECUCION
7. Escriba un algoritmo que nos permita hallar la fecha del dia anterior, dada la fecha de cualquier dia.
Ing.Ricardo Castañeda
38
PROGRAMACION ORIENTADA A OBJETOS 2013
CAPITULO II
void main( )
{……….
...........
…………
}
Directivas del Preprocesador: Permite que se realicen ciertas tareas antes que la compilación se efectúe.
Las directivas son normalmente #include y #define.
Ejemplo:
# include <math.h> // incluye el archivo fuente en C++ de las librerías matemáticas
# include <conio.h> // incluye el archivo fuente de manejo de pantalla
# define PI 3.1416 // indica que PI es equivalente a 3.1416
También:
# include <nombre_archivo> // Busca en directorio por defecto
# include “nombre_archivo”// Busca en directorio actual y luego en directorio por defecto
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
La función main(). Es el punto de inicio de la ejecución de un programa
En programas simples todo el código se coloca en el programa. Veamos un 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( )
{ }
Signos de puntuación: Los puntos y comas terminan una sentencia, las llaves agrupan instrucciones,
las comas separan elementos iguales etc.
{ leer(a1,a2,a3);
procesar(a1, a2, a3);
escribir(a3); }
Separadores.- Espacios en blanco, tabulaciones, retornos de carro y avances de línea.
Archivos de cabecera.- Nos permiten incluir archivos al momento de compilación.
2.4 Tipos de Variables estándar en C++.- Datos estándar quiere decir aceptados por todos, en C++ tenemos
como en la mayoría de lenguajes enteros, reales y carácter.
Entero int 9 digitos 4 bytes
long 9 digitos 4 bytes
Ing.Ricardo Castañeda
42
PROGRAMACION ORIENTADA A OBJETOS 2013
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
2.6 Variables.- Se le asigna una posición 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 dirección. Su forma general es:
PROGRAMA
EJECUCION
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: POOC2E2
FECHA: 18 DE MARZO DE 2013
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();}
Ing.Ricardo Castañeda
44
PROGRAMACION ORIENTADA A OBJETOS 2013
2.8 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 carácter nueva línea (decimal 10) y \t será tabulación horizontal. La tabla es:.
Secuencia Valor Símbolo Que hace
\a 0x07 BEL Sonido audible (bell)
\b 0x08 BS Retroceso (backspace)
\f 0x0C FF Salto de formato (formfeed)
\n 0x0A LF Saltar una línea (linefeed)
\r 0x0D CR Retorno de carro (carriage return)
\t 0x09 HT Tabulación horizontal (H Tab)
\v 0x0B VT Tabulación vertical (V Tab)
Veamos el ejemplo 3.- PROGRAMA
/* CODIGO: POOC2E3
FECHA: 18 DE MARZO DE 2013
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,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;
cout<<"\t Ingrese cantidad de valores : ";cin>>n;
EJECUCION
cout<<"\t Ingrese incremento de x : ";cin>>dx;
cout<<"\n\n"; cout<<"\t\tx";
cout<<"\t\tf(x) \n"; cout<<"\t\t__";
cout<<"\t\t____ \n\n";
for(i=1;i<=n;i++)
{ fx= A*x*x+B*x+C;
cout<<"\t\t"<<x;
cout<<"\t\t"<<fx<<"\n";
x=x+dx; }
getch() ; }
EJECUCION
Manipulación y formato de datos de salida.- El precisar con cuantos decimales debe mostrarse nuestros datos de
salida y que ancho y otras características 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 función 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 línea y cambia de flujo
ends Inserta un cero nulo al final de la
cadena.
flush Vacía el flujo
setbase(int n) Establece la conversión de base.
Ing.Ricardo Castañeda
46
PROGRAMACION ORIENTADA A OBJETOS 2013
resetiosflags(long f) Limpia el formato especificado por f.
setiosflag( long f) Establece formato especificado por
f.
setfill(int c) Rellena con el carácter c.
setprecision(int n) Establece precisión de punto flotante
a n.
setw(int n) Establece el ancho de campo a w.
Ejemplo 4.- Veamos un ejemplo de dec,oct y hex.
PROGRAMA
/* CODIGO: POOC2E4
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Utilizacion de manipuladores de flujo de salida */
#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
cout<<"Numero octal........"<<oct<<numero<<endl;//base octal
cout<<"Numero hexadecimal.."<<hex<<numero<<endl;//base hexadecimal
getch();
}
EJECUCION
Ejemplo 5.- Veamos un ejemplo que maneje la precisión de salida de un valor real.
PROGRAMA
/* CODIGO: POOC2E5
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Muestra el uso del manipulador setprecision( )
para indicar el número de dígitos decimales del valor flotante.*/
#include <iostream.h> //Para cout
#include <iomanip.h> //Para setprecision( )
#include <conio.h> //Para getch()
void main( void )
{ float valor = 3.1416;
cout << setiosflags( ios::fixed );
cout << setprecision( 0 ) << valor << endl;
cout << setprecision( 1 ) << valor << endl;
cout << setprecision( 2 ) << valor << endl;
cout << setprecision( 3 ) << valor << endl;
cout << setprecision( 4 ) << valor << endl;
cout << setprecision( 5 ) << valor << endl;
cout << setprecision( 6 ) << valor << endl;
getch(); }
EJECUCION
Ing.Ricardo Castañeda
48
PROGRAMACION ORIENTADA A OBJETOS 2013
PROBLEMAS
1. Dado un numero “n” se pide calcular la cantidad de cifras impares y de cifra pares que tiene “n”. Utilizar
variables globales.
PROGRAMA
/* CODIGO: POOC2PROB1
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Lee un numero y halla cuantos cifras pares y cifras pares componen el numero. */
int num,cifra;
int contp, conti; // 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; }
gotoxy(30,6);cout<<"Cifras pares : "<<contp;
gotoxy(30,7);cout<<"Cifras impares: "<<conti;
getch(); }
EJECUCION
Nota: Observe algunos detalles, las variables son globales, por lo tanto los contadores se inicializan automáticamente
desde cero. Además num es una variable entera solo debe permitir valores de 5 cifras pero se sobrepasa, quiere
decir que el tipo entero ocupa más de dos bytes (4 bytes).
Ing. Ricardo Castañeda
49
FACULTAD DE INGENIERIA MECANICA 2013
2.- Escribamos un programa que nos permita realizar operaciones con números complejos, este programa realizara la
suma, resta y multiplicación con números complejos, la división se deja como tarea para el estudiante.
PROGRAMA
/* CODIGO: POOC2PROB2
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Halla suma, resta y multiplicación de números complejos */
# include<iostream.h>
# include<conio.h>
void main( )
{ float ar, ai, br, bi, rr ,ri;
char opcion;
do
{ clrscr( );
gotoxy(30,2);
cout<<"OPERACIONES CON COMPLEJOS";
gotoxy(30,6);cout<<"1.- Suma ";
gotoxy(30,7);cout<<"2.- Resta ";
gotoxy(30,8);cout<<"3.- Multiplicación ";
gotoxy(30,9);cout<<"4.- División ";
gotoxy(30,10);cout<<"5.- Salir ";
gotoxy(30,16);
cout<<"Opcion --> ";
cin >> opcion;
switch ( opcion)
{ case '1': clrscr();
gotoxy(30,2); cout<<"SUMA";
gotoxy(30,6);cout<<"ar = "; cin >> ar;
gotoxy(30,7);cout<<"ai = "; cin >> ai;
gotoxy(30,8);cout<<"br = "; cin >> br;
gotoxy(30,9);cout<<"bi = "; cin >> bi;
rr = ar + br;
ri = ai + bi;
gotoxy ( 30,22); cout << " rr = " << rr;
gotoxy ( 30,23); cout << " ri = " << ri;
getch();
break;
case '2': clrscr();
gotoxy(30,2); cout<<"RESTA";
gotoxy(30,6);cout<<"ar = "; cin >> ar;
gotoxy(30,7);cout<<"ai = "; cin >> ai;
gotoxy(30,8);cout<<"br = "; cin >> br;
Ing.Ricardo Castañeda
50
PROGRAMACION ORIENTADA A OBJETOS 2013
gotoxy(30,9);cout<<"bi = "; cin >> bi;
rr = ar - br;
ri = ai - bi;
gotoxy ( 30,22); cout << " rr = " << rr;
gotoxy ( 30,23); cout << " ri = " << ri;
getch();
break;
case '3': clrscr();
gotoxy(30,2); cout<<"MULTIPLICACION";
gotoxy(30,6);cout<<"ar = "; cin >> ar;
gotoxy(30,7);cout<<"ai = "; cin >> ai;
gotoxy(30,8);cout<<"br = "; cin >> br;
gotoxy(30,9);cout<<"bi = "; cin >> bi;
rr = (ar*br) - (ai*bi);
ri = (ar*bi) + (ai*br);
gotoxy ( 30,22); cout << " rr = " << rr;
gotoxy ( 30,23); cout << " ri = " << ri;
getch();
break;
case '4': clrscr();
cout << " tarea ";
getch();
break; }
} while ( opcion!='5'); }
EJECUCION
3.- Escriba un programa que utilice la definición del tipo enumerado color, e imprima el color escogido.
PROGRAMA
/* CODIGO: POOC2PROB3
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Maneja tipo enumerado */
# include<iostream.h>
# include<conio.h>
void main( )
{ enum color {rojo,verde,amarillo,azul,negro};
color c1=rojo,c2 = amarillo, c3 = negro;
switch(c1)
{ case 0:cout<<"ROJO"<<endl;break;
case 1:cout<<"VERDE"<<endl;break;
case 2:cout<<"AMARILLO"<<endl;break;
case 3:cout<<"AZUL"<<endl;break;
case 4:cout<<"NEGRO"<<endl;break; }
switch(c2)
{ case 0:cout<<"ROJO"<<endl;break;
case 1:cout<<"VERDE"<<endl;break;
case 2:cout<<"AMARILLO"<<endl;break;
case 3:cout<<"AZUL"<<endl;break;
case 4:cout<<"NEGRO"<<endl;break; }
switch(c3)
{ case 0:cout<<"ROJO"<<endl;break;
case 1:cout<<"VERDE"<<endl;break;
case 2:cout<<"AMARILLO"<<endl;break;
case 3:cout<<"AZUL"<<endl;break;
case 4:cout<<"NEGRO"<<endl;break; }
getch();}
EJECUCION
Ing.Ricardo Castañeda
52
PROGRAMACION ORIENTADA A OBJETOS 2013
4.- Elaborar un programa que haga cálculos para generar una boleta de ventas incluyendo el IGV, considere el uso
de salida formateada y también la función gotoxy().
PROGRAMA
/* CODIGO: POOC2PROB4
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Maneja la función gotoxy y presenta resultados de una boleta de ventas con una salida formateada. */
# include<iostream.h>
# include<conio.h>
# include<iomanip.h>
void main( )
{ char producto[30];
float precio,cantidad,igv,total,sumatotal;
int n,i;
clrscr();
cout<<" Ingrese cantidad de productos ==> ";
cin>>n;
clrscr();
gotoxy(6,4);cout<<"LISTADO DE COMPRAS";
gotoxy(58,4);cout<<"BOLETA DE PAGOS" ;
gotoxy(58,6);cout<<"Producto";
gotoxy(58,7);cout<<"========";
gotoxy(68,6);cout<<"Precio";
gotoxy(68,7);cout<<"======";
cout<<setiosflags(ios::fixed);
cout<<setiosflags(ios::showpoint);
cout<<setprecision(2);
cout<<setiosflags(ios::right);
total=0;
for(i=1;i<=n;i++)
{ gotoxy(2,8+i);cout<<"Producto "<<i<<" : ";cin>>producto;
gotoxy(24,8+i);cout<<"Precio "<<i<<" : ";cin>>precio;
gotoxy(40,8+i);cout<<"Cantidad "<<i<<" : ";cin>>cantidad;
gotoxy(58,8+i);cout<<"| "<<setw(5)<<producto;
gotoxy(67,8+i);cout<<"| "<<setw(5)<<precio*cantidad;
total =total+precio*cantidad; }
igv=total*0.19;
sumatotal=total+igv;
gotoxy(58,8+i);cout<<"------------------";
CAPITULO III
Ing.Ricardo Castañeda
54
PROGRAMACION ORIENTADA A OBJETOS 2013
3 INTRODUCCION
3.1 EXPRESIONES Y OPERADORES
Expresiones.- Una expresión es una secuencia de operadores y operandos, aunque también podemos
tener algunas expresiones que salen de este formato. Ejemplo : a = *c; p1 = &c; numero ++.
Operadores aritméticos.- Nos permiten realizar las operaciones aritméticas básicas sean del tipo real
(float) o entero, considerando que en lenguaje “C” se define el tipo de operación por los operandos, si al
menos un operando es del tipo float la operación se realizara en el modo real.
Ejemplo : 4%3 será 1 y 3%4 será 3 ; 10/4 será 2 y 10/4.0 será 2.5
En el primer caso la división es 1 y el resto 1.
En el segundo caso la división es 0 y el resto 3
En el tercer caso la división es 2 y en el cuarto caso la división es 2.5 (Modo real)
Operadores de incremento y decremento.- Los operadores ++ y - - suman o restan 1 a su argumento. Por
ejemplo a++ y ++a producen el mismo efecto. Sobre el argumento pero :
int numero, valor ;
valor = 6;
Ing. Ricardo Castañeda
55
FACULTAD DE INGENIERIA MECANICA 2013
numero = valor++; //Asigna a numero 6 a numero y luego incrementa valor a 7
numero = ++valor; // Incrementa valor a 7 y luego asigna 7 a numero
Lo mismo sucede con cont - - y - - cont
Operadores relacionales.- Relacionan operandos enteros o reales pero su resultado es booleano, estos son:
Ejemplo 1 : Escriba un programa que lea un numero y lo muestre invertido. Si lee 2345 debe escribir 5432.
PROGRAMA
/* CODIGO: POOC3E1
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA:18 DE MARZO DE 2013
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 => ";
Ing.Ricardo Castañeda
56
cin >> numero;
while ( numero >= 10)
{ digito = numero % 10;
PROGRAMACION ORIENTADA A OBJETOS 2013
EJECUCION
/* CODIGO: POOC3E2
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 de MARZO DE 2013
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 dirección de a contenida en p1
cout << dec; // vuelve al formato decimal
p1 =&b; // p1 toma la dirección de b
cout << "Nuevo valor apuntado por p1==> "<<*p1; // muestra valor almacenado en el campo apuntado por p1(b)
getch(); }
EJECUCION
devuelve
Operador el mayor
Coma, valor de v1 ),Operador[
Operador( , v2 ], Operador : .-
Coma combina expresiones a> b , c > 10 // a mayor que b , c mayor que 10
( ) Llama a funciones y también altera prioridad
[ ] Acompaña a los arrays
:: Indica ámbito void empleado :: planilla ( ) // indica la función planilla perteneciente a
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
a. 2,3 o 12 pierde el juego
b. 7 u 11 gana el juego
c. Otra suma vuelve a jugar
b) A partir de la segunda jugada el jugador sigue las reglas
a. Si repite la primera suma gana
b. Obtiene 7 pierde
PROGRAMA
/* CODIGO: POOC3E3
FECHA: 18 DE MARZO DE 2013
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 ) )
Ing.Ricardo Castañeda
58
cout << " Gano juego" ;
else if ( (juego1 == 2) || (juego1 == 3 ) || ( juego1== 12))
cout << " Perdio juego";
PROGRAMACION ORIENTADA A OBJETOS 2013
EJECUCION
Funcionamiento:
Ing. Ricardo Castañeda
59
FACULTAD DE INGENIERIA MECANICA 2013
Se evalúa la condición, si esta se cumple se ejecuta el bloque 1, caso contario se ejecuta el bloque 2, si existe.
Finalmente pasa el control de ejecución 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
{ ………………………..;
………………………..;
…………………………;
………………………….;
}
Podemos observar que el if con condicion2 esta anidado en el if con condicion1 y que el if con condicion3(que tiene a
su vez tiene parte else) está también anidado en el if con condicion1.
Ejemplo 4.- Programa que lee un número y me muestra si es múltiplo de 3, 4 o 5.
/* CODIGO: POOC3E4
FECHA: 18 DE MARZO DE 2013
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
Ing.Ricardo Castañeda
60
if (numero >99)
if(numero %3==0)
cout<<" Numero de tres cifras y multiplo de 3";
PROGRAMACION ORIENTADA A OBJETOS 2013
EJECUCION
Ejemplo 5.- Programa que lee tres notas y halla el promedio eliminando la menor y duplicando la mayor.
PROGRAMA
/* CODIGO: POOC3E5
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Ejemplo de if que lee tres notas y calcula mayor, menor y halla
promedio, duplicando la mayor y eliminando 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;
Ing. Ricardo Castañeda
61
if (nota2>mayor)
mayor = nota2;
if (nota3>mayor)
FACULTAD DE INGENIERIA MECANICA 2013
EJECUCION
Ejemplo 6.- Escriba un programa que lea 20 edades y me indique cuantos son :
Bebes (0-5años)
Niños (5-12 años)
Adolescentes (12-16 años)
Jóvenes (16-25)
Adultos (25-50)
Mayores (50 a mas)
PROGRAMA
/* CODIGO: POOC3E6
FECHA: 18 de MARZO DE 2013
OBJETIVO: Ejemplo que lee 20 edades y me indique cuantos son :Bebes (0-5años),Niños (5-12 años), Adolescentes (12-16 años),
Jóvenes (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 niños
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)
Ing.Ricardo Castañeda
62
PROGRAMACION ORIENTADA A OBJETOS 2013
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; }
//Mostrando resultados
cout<<contb<< " bebes"<<endl;
cout<<contn<< " niños"<<endl;
cout<<conta<< " adolescentes"<<endl;
cout<<contj<< " jovenes"<<endl;
cout<<contd<< " adultos"<<endl;
cout<<contm<< " mayores"<<endl;
getch(); }
EJECUCION
Sentencia switch.- Deriva el control hacia uno de varios puntos del programa, permite realizar una selección
múltiple.
Forma General
switch ( expression)
{ case const 1 : ................... ;
....................;
Ing.Ricardo Castañeda
64
PROGRAMACION ORIENTADA A OBJETOS 2013
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 término de la instrucción switch.
ESTRUCTURAS DE REPETICION
Sentencia while.- Nos permite ejecutar repetidamente un grupo de sentencias hasta que el valor de la
expresión se hace cero (condición falsa)
Forma General
while ( expresión)
{................... ;
.....................;
.....................;
}
Funcionamiento:
La expresión booleana o condición se evalúa y el bucle se repite mientras la condición es verdadera. El bucle while
nunca iterara si la condición comprobada es inicialmente falsa.
Ejemplo 8:
PROGRAMA
/* CODIGO: POOC3E8
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
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(); }
.
Ing. Ricardo Castañeda
65
FACULTAD DE INGENIERIA MECANICA 2013
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 condición y por lo tanto se sale del bucle while, a esta variable denominada cont se le
conoce también como variable de control del bucle while, esta variable necesariamente debe ser modificada dentro del rango del while pues
de no suceder esto estaríamos en un lazo infinito.
Sentencia do-- while.- Las sentencias se ejecutan repetidamente hasta que el valor de la expresión se
hace cero (falso)
Forma General
do
{................... ;
.....................;
.....................;
} while ( expresión);
Funcionamiento:
Se ejecutan las sentencias y a continuación se evalúa la expresión, 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 condición (expresión) sea
falsa(cero) y el control pasa a la sentencia siguiente.
Ejemplo 9:
El siguiente ejemplo visualiza los números, cuadrados y cubos de los 20 primeros números:
PROGRAMA
/* CODIGO: POOC3E9
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
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)<<" "<<pow(numero,3) << endl ;
numero++;
}
while (numero < 21);
getch(); }
Ing.Ricardo Castañeda
66
PROGRAMACION ORIENTADA A OBJETOS 2013
EJECUCION
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 iteración de un bucle un número determinado de veces. El lazo for tiene tres partes:
exp1, inicializa las variables de control del bucle; exp2, es la condición que determina si el bucle realiza otra iteración;
la última parte del bucle for es la cláusula que incrementa o decrementa las variables de control del bucle.
Exp1 se utiliza para inicializar la variable de control de bucle; a continuación exp2 se evalúa, 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 iteración
continúa hasta que exp2 es falsa (cero), en cuyo momento el control pasa a la sentencia siguiente al bucle.
Ejemplo 10: Imprimir todos los primos de dos dígitos.
PROGRAMA
/* CODIGO: POOC3E10
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Imprime los primos menores que 100 o sea dos digitos. Usando el lazo repetitivo for */
# include<iostream.h>
# include<conio.h>
void main( )
{ int i,j , primo;
for(i=10; i<100; i++)
{ primo = 1;
for ( j=2;j<i ;j++)
if ( i%j==0)
{primo = 0;
break; }
if(primo == 1)
cout<<i<<endl; }
getch(); }
Ing. Ricardo Castañeda
67
FACULTAD DE INGENIERIA MECANICA 2013
EJECUCION
PROBLEMAS
ESTRUCTURAS DE CONTROL
Ing.Ricardo Castañeda
68
PROGRAMACION ORIENTADA A OBJETOS 2013
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: POOC3PROB1
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
OBJETIVO: LEE TRES NOMBRES Y EDADES E IMPRIME LOS NOMBRES EN FORMA CRECIENTE POR 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;
getch( );
Ing. Ricardo Castañeda
69
FACULTAD DE INGENIERIA MECANICA 2013
}
B) RESULTADOS:
2. Escriba un programa que lea un nombre y su respectiva edad, esta información debe procesarse e imprimirse el
nombre y el periodo al cual pertenece la persona.
SOLUCION:
PROGRAMA
/* CODIGO: POOC3PROB2
PROGRAMA CREADO POR RICARDO CASTAÑEDA DE LA ROSA
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Lee nombres y edades e imprime el periodo en el que se encuentra la persona*/
# include<iostream.h>
# include<conio.h>
void main( )
{
int edad;
char nombre[40];
clrscr( );
cout<< " Ingrese nombre ==> "; cin>> nombre;
cout<< " Ingrese edad ==> "; cin>> edad;
if ( (edad>0)&&(edad<=100))
switch(edad)
{ case 1 , 2, 3 , 4 , 5 , 6 , 7 , 8 , 9: cout<<nombre<<" es un niño"<<endl;
break;
case 10 , 11 , 12 , 13 , 14 , 15 , 16: cout<<nombre<<" es un adolescente"<<endl;
break;
case 17 , 18 , 19 , 20 , 21: cout<<nombre<<" es un joven"<<endl;
break;
default :cout<<nombre<<" es un adulto"<<endl;
}
else
Ing.Ricardo Castañeda
70
PROGRAMACION ORIENTADA A OBJETOS 2013
cout<<"Error ingrese una edad valida";
getch( ); }
EJECUCION
3. Escriba un programa que imprima todos los números de tres cifras que sean capicúas y cuya suma de sus dígitos
sea par.
Solucion:
PROGRAMA
/* CODIGO: POOC3PROB3
FECHA: 18 DE AGOSTO DE 2013
OBJETIVO: Muestra todos los numeros de tres digitos capicuas y cuya suma de estos es par */
# include<iostream.h>
# include<conio.h>
void main( )
{ int i , num,numinv, sumadigitos, digito;
clrscr( );
cout<< " Lista de numeros capicúas y suma dígitos par"<<endl<<endl;
for (i=100; i<=999;i++)
{ num = i;
sumadigitos=0;
numinv=0;
while(num>=10)
{ 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( ); }
4. En la UNI se rinde examen de admisión y de un grupo de 20 postulantes para cuatro facultades cuyos codigos
son: Codigo Facultad
‘S’ Ing. De Sistemas
‘M’ Ing. Mecánica
‘Q’ Ing. Química
‘A’ Ing. Ambiental
La Universidad aplica tres tipos de exámenes a sus postulantes. Los postulantes que obtengan por lo menos dos
exámenes aprobados (mayor o igual a 11) son admitidos caso contrario son rechazados. En base a esto se pide
diseñar un algoritmo que permita:
a) Mostrar por cada postulante el mensaje admitido o rechazado.
b) Presentar el número de ingresantes pro facultad.
Solución:
PROGRAMA
/* CODIGO: POOC3PROB4
FECHA: 18 DE MARZO DE 2013
OBJETIVO: LISTA INGRESANTES POR FACULTAD DE UN EXAMEN DE ADMISION */
# include<iostream.h>
# include<conio.h>
# include<ctype.h>
Ing.Ricardo Castañeda
72
PROGRAMACION ORIENTADA A OBJETOS 2013
# 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;}
}
else
cout<<"Postulante rechazado"<<endl; }
cout<< " Ingresaron a Ing. Sistemas = "<<conts<<endl;;
cout<< " Ingresaron a Ing. Mecánica = "<<contm<<endl;
cout<< " Ingresaron a Ing. Química = "<<contq<<endl;
cout<< " Ingresaron a Ing. Ambiental= "<<conta<<endl;
getch( );}
5. Se desea leer un conjunto de numeros enteros de tres cifras hasta encontrar un número negativo. Luego mostrar
la cantidad de veces que aparece el digito 3 en todos los números positivos leídos.
Solucion:
PROGRAMA
/* CODIGO: POOC3PROB5
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Muestra veces que aparece el digito 3 en los números leídos antes de encontrar un negativo.*/
# include<iostream.h>
# include<conio.h>
# include<stdlib.h>
# include<time.h>
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;
Ing.Ricardo Castañeda
74
PROGRAMACION ORIENTADA A OBJETOS 2013
getch( ); }
EJECUCION
6. De un experimento de física se tienen que leer “N” temperaturas( entre positivas y negativas) luego averiguar el
numero de apariciones de la menor temperatura negativa.
Solucion:
PROGRAMA
/* CODIGO: POOC3PROB6
FECHA: 18DE MARZO DE 2013
OBJETIVO: Muestra la mayor de las temperaturas negativas y cuantas veces se presenta.*/
# include<iostream.h>
# include<conio.h>
# include<ctype.h>
# 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( ); }
EJECUCION
Ing. Ricardo Castañeda
75
FACULTAD DE INGENIERIA MECANICA 2013
EJERCICIOS PROPUESTOS
1. Escriba un programa que simule un juego de dados como en el ejemplo de este capítulo 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 trío , un full (3 iguales y dos iguales) o póker ( cuatro iguales)
3. Escriba un programa que me permita descubrir una clave de cuatro dígitos 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 común divisor y el mínimo común múltiplo de dos valores
enteros.
6. Se realizan elecciones entre tres partidos politicos, escriba un programa que me permita indicar el ganador y si
además supera el 50% será el ganador oficial en primera vuelta.
Ing.Ricardo Castañeda
76
PROGRAMACION ORIENTADA A OBJETOS 2013
CAPITULO IV
FUNCIONES EN LENGUAJE “C + +”
4 Definición.- Es un conjunto de instrucciones agrupadas que tienen un nombre común y que realizan un cálculo
(o proceso) especifico. Todo programa en lenguaje “C” se desarrolla basándose en funciones, estas
posteriormente pueden formar una librería particular.
4.1 Funciones Predefinidas (De biblioteca) Aquí tenemos una serie de funciones, debemos considerar que al
invocarlas debemos seguir las siguientes reglas:
Consideremos la Función sqrt
Syntax
#include <math.h>
double sqrt(double x);
Ing. Ricardo Castañeda
77
FACULTAD DE INGENIERIA MECANICA 2013
Retorna el valor absoluto de una variable entera, y cuando se incluye la librería stdli.h tambien considera
valores bcd. La función fabs(double x) considera valores reales.
Ejemplo 1.- escriba un programa que lee tres valores y me imprime el mayor valor absoluto.
PROGRAMA
/* CODIGO: POOC4E1
FECHA: 18DE MARZO DE 2013
OBJETIVO: ejemplo DE LA FUNCION ABS() Y FABS()*/
#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 = fabs(valor2);
z = fabs(valor3);
if (x>y)
mayor= x;
else
mayor=y;
Ing.Ricardo Castañeda
78
PROGRAMACION ORIENTADA A OBJETOS 2013
if (z>mayor)
mayor= z;
cout<<"El mayor será: "<<mayor;
getch(); }
EJECUCION
Syntax
#include <math.h>
double ceil(double x);
long double ceill(long double x);
double floor(double x);
long double floorl(long double x);
Ceil retorna el entero no menor que x, o sea 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
/* CODIGO: POOC4E2
FECHA: 18 DE MARZO DE 2013
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;
Syntax
#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 en radianes, argumento y retorno son double.
Ejemplo 3.- Escriba un programa que calcule un el seno y coseno de un triangulo rectángulo notable y
compruebe que seno y coseno de los ángulos complementarios de un triangulo rectángulo son iguales.
PROGRAMA
/* CODIGO: POOC4E3
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Ejemplo de las funciones SIN() y COS().*/
#include <iostream.h>
#include <conio.h>
#include <math.h>
void main()
{ double anga,angb,senoa,cosenob;
clrscr();
anga=37*3.1416/180;
senoa=sin(anga);
angb=53*3.1416/180;
cosenob=cos(angb);
cout<<"El seno de a= "<<senoa<<endl;
cout<<"El coseno de b= "<<cosenob; getch(); }
EJECUCION
Función exp()
Syntax
#include <math.h>
double exp(double x);
Ing.Ricardo Castañeda
80
long double expl(long double x);
PROGRAMACION ORIENTADA A OBJETOS 2013
Syntax
#include <stdio.h>
char *gets(char *s);
Captura una cadena que puede contener espacio en blanco del flujo estándar.
Función printf()
Syntax
#include <stdio.h>
int printf(const char *format[, argument, ...]);
Ing.Ricardo Castañeda
82
PROGRAMACION ORIENTADA A OBJETOS 2013
float nota;
clrscr();
cout<<"Ingrese nombre ==> "; gets(nombre);
cout<<"Ingrese nota ==> "; cin>>nota;
printf("El alumno %s \n",nombre);
printf("Tiene %6.2f de nota",nota);
getch();
}
EJECUCION
Función clock()
Syntax
#include <time.h>
clock_t clock(void);
Ejemplo 7.- Escribe un programa que nos permita trabajar con la función clock.
PROGRAMA
/* CODIGO: POOC4E7
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Maneja la función 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<<" "; }
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);
printf("El tiempo transcurrido fue: %f\n", (fin -inicio ) / CLK_TCK);
getch(); }
Ing. Ricardo Castañeda
83
FACULTAD DE INGENIERIA MECANICA 2013
EJECUCION
Función time()
Syntax
#include <time.h>
time_t time(time_t *timer);
Ejemplo 8.- Escribe un programa que nos permita trabajar con la función time. Explicar.
PROGRAMA
Borland C++ 5.0 Programmer's Guide
/* CODIGO: POOC4E8
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Maneja la función 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
La función cuenta los segundos transcurridos desde 1 enero 70 hasta el día actual.
Funciones que generan números aleatorios
Son las funciones randomize(), rand() y random (num).. Veamos su sintaxis de cada una de ellas.
Función rand()
Syntax
#include <stdlib.h>
int rand(void);
Genera números aleatorios entre 0 y RAND_MAX, constante definida en stdlib.h
Función randomize()
Syntax
Ing.Ricardo Castañeda
84
#include <stdlib.h>
#include <time.h>
void randomize(void);
PROGRAMACION ORIENTADA A OBJETOS 2013
Syntax
#include <stdlib.h>
int random(int num);
Retorna valores entre 0 y num – 1.
Ejemplo 9.- Generar números aleatorios entre un cota mínima y una cota máxima.
PROGRAMA
/* CODIGO: POOC4E9
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Genera valores aleatorios entre dos valores dados */
#include <stdlib.h>
#include <iostream.h>
#include <time.h>
#include <conio.h>
Void main(void)
{ int cota_minima,cota_maxima, i ,nro_terminos;
clrscr();
cout<<"Ingrese cota minima: ";cin>>cota_minima;
cout<<"Ingrese cota maxima: ";cin>>cota_maxima;
cout<<"Ingrese Nro. Terminos: ";cin>>nro_terminos;
randomize();
for(i=0; i<=nro_terminos; i++)
cout<<(cota_minima+random(cota_maxima+1-cota_minima))<<endl;
getch();}
EJECUCION
Syntax
#include <math.h>
double atof(const char *s);
long double _atold(const char *s);
Convierte de cadena a número de punto flotante.
Función atoi()
Syntax
#include <stdlib.h>
int atoi(const char *s);
Convierte de cadena a número entero.
Función atol()
Syntax
#include <stdlib.h>
long atol(const char *s);
Convierte de cadena a numero long (entero largo).
Función itoa()
Syntax
#include <stdlib.h>
char *itoa(int value, char *string, int radix);
Convierte un entero a cadena.
Función ecvt()
Syntax
#include <stdlib.h>
char *ecvt(double value, int ndig, int *dec, int *sign);
Convierte una cadena a punto flotante..
Ing.Ricardo Castañeda
86
PROGRAMACION ORIENTADA A OBJETOS 2013
4.2 Funciones Definidas por el Usuario.- También podemos crear nuestras propias funciones y como
mencionamos al inicio de este capítulo posteriormente podemos formar nuestra librería partícula. La estructura
de una función definida por el usuario es :
Forma General
Tipo nombrefuncion ( lista de parámetros)
{................... ;
.....................;
.....................;
[return(.....);]
.....................;
}
Donde:
Tipo .............. Tipo de valor que devuelve la función en algunos
casos no devuelven ningún valor y el tipo será
void (no devuelve).
nombrefuncion ......Identificador de la función
Lista de parámetros...Establecen la comunicación entre la función que
realiza la llamada y nuestra función
return( ) .....Permite retornar un valor a la función que realizo la
llamada, si la función es de tipo void no retorna valor.
Ejemplo10:
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;
}
return(sw); }
La llamada será
If ( primo(a))// a necesariamente es entero
Cout<< a << “ Es primo”<< endl;
Ejemplo 11:
void leer ( long *código, char nombre[40], char dirección[50])
{ // programa de lectura
clrscr();
cout << “ingrese código: “; cin>>*codigo;
cout << “ Ingrese nombre: “;gets(nombre); //Función de lectura
cout << “Ingrese dirección: “; gets(direccion); }
La llamada será leer( &code, name, dire);
void main( )
{ int valor1, valor2;
……………………;
……………………….;
S = suma( valor1, valor2);
…………………………;
…………………………..;
…………………………..;
// LA FUNCION SUMA DESARROLLADA
{
int resultado;
resultado = operando1+operando2;
return (resultado) ;
}
4.2.2 Comunicación entre funciones.- La comunicación se puede realizar de dos maneras:
Vía variables Globales
Vía argumentos parámetros
a) Vía variables globales.- Se realiza cuando declaran más variables en un área de acceso público o sea que
todas las funciones pueden acceder estas variables. Un esquema de esto seria
#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);
Ing.Ricardo Castañeda
88
PROGRAMACION ORIENTADA A OBJETOS 2013
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;
getch( ); }
La comunicación es a través de las variables a, b y c. El problema es que las funciones son dependientes de las
variables. Y para cada grupo de variables hay que desarrollar funciones, para independizar las funciones de las
variables se utiliza comunicación argumentos – parámetros, que independiza las variables de los procedimientos.
Llamada por valor y llamada por referencia.- Cuando una función es llamada se le debe enviar una lista de
argumentos que son los que establecen la comunicación entre los dos módulos. La pregunta es, ¿Que Argumentos
enviar? Los argumentos enviados pueden ser valores o direcciones dependiendo del parámetro: 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 parámetro y el segundo al ser variables solamente piden valores enteros pero el tercer parámetro al ser
tipo puntero pide una dirección de una variable simple de tipo float. L a llamada será:
main() f2()_
a1 35 p1
a2 40 p2
a3 p3
a4 p4
Se ejecuta la función hasta que la primera sentencia return es alcanzada o termina la función.
4.3 Funciones Inline.- Este tipo de funciones que se insertan directamente le dan mayor velocidad a la
ejecución, la forma de indicar una function de este tipo es colocando el especificador inline antes de la
definición de la función. Veamos el formato:
inline tipo_devuelto nombre_funcion (parámetros)
{………….;
………….;
Instrucciones;
}
La llamada será normal como a las otras funciones, pero en el cuerpo de la función no podrá haber:
Variables de tipo static
Sentencias de bucle.
Sentencia switch
Ing.Ricardo Castañeda
90
PROGRAMACION ORIENTADA A OBJETOS 2013
Go to
Ejemplo 12.- veamos un ejemplo de uso de una función inline
PROGRAMA
/* CODIGO: POOC4E12
FECHA: 18 DE MARZO DE 2013
OBJETIVO: UTILIZA FUNCIONES INLINE. */
#include <iostream.h>
#include <conio.h>
#include <math.h>
inline float fi (float x)
{ float ff;
ff= pow(x,2)-3*x+5;
return (ff); }
void main(void)
{ float xmin,xmax,deltax,fx,x;
clrscr();
cout<<"Ingrese x mínimo: ";cin>>xmin;
cout<<"Ingrese x máximo: ";cin>>xmax;
cout<<"Ingrese variación de x: ";cin>>deltax;
x=xmin;
while( x<=xmax)
{ fx=fi(x);
cout<< "f(x)= "<<fx<<endl;
x=x+deltax; }
getch();}
EJECUCION
Fíjense que es una función con un cálculo simple pues retorna el valor de la función para un argumento dado.
4.4 Funciones Recursivas.- Una función recursiva es una función que se llama así misma para resolver un
cálculo o proceso.
/* CODIGO: POOC4E13
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Halla factorial en forma recursiva */
# include<iostream.h>
# include<conio.h>
int facto (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
4.5 Punteros a funciones.- También podemos devolver la dirección de una función, veamos int (*fpun) (int ) será
la declaración de un puntero a función que recibe un int y devuelve un int; en cambio int *fp(int ) será el
prototipo de una función que recibe un int y devuelve puntero a int.
Ejemplo 14.- Escriba un programa usando el concepto de puntero a función.
PROGRAMA
/* CODIGO: POOC4E14
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Ejemplo de puntero a función. */
# include<iostream.h>
Ing.Ricardo Castañeda
92
PROGRAMACION ORIENTADA A OBJETOS 2013
# include<conio.h>
int* funcion1 ( int num)
{ cout <<num<<endl;
return(&num); }
int funcion2 (int num)
{ cout<<num<<endl;
return(num*2); }
void main( )
{ int i,j ;
clrscr();
i=4;
j = funcion2(i); // Imp rime 4
funcion2(funcion2(j));// Primera llamada imprime 8 y en la segunda imprime 16
int (*pf1)(int)=&funcion2;
pf1(i); //Imprime 4
int* (*pf2)(int)=&funcion1;
pf2(j); //Imprime 8
getch();
}
EJECUCION
PROBLEMAS
Problema 1.- EJEMPLO DE FUNCIONES QUE SE COMUNICAN MEDIANTE VARIABLES GLOBALES.
1.- Suponga que tiene un numero “num” y una aproximación a su raíz cuadrada. Para obtener una aproximación
más exacta a la raíz cuadrada real se puede utilizar la formula: aproximaciónnueva = (n/
aproximaciónanterior)+aproximaciónanterior)/2. Utilizando esta información, escriba un programa que solicite al
usuario un número y una suposición inicial de su raíz cuadrada. Con los datos el programa calculara una
aproximación de la raíz cuadrada que sea exacta hasta 0.00001.
Solución:
/* CODIGO: POOC4PROB1
FECHA: 16 de agosto de 2007
OBJETIVO: Halla raíz cuadrada por aproximación*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
#define ERROR 0.00001
float num,raiz,aprox;
void leer();
void procesar();
Ing. Ricardo Castañeda
93
FACULTAD DE INGENIERIA MECANICA 2013
void mostrar();
main()
{ leer();
procesar();
mostrar(); }
void leer( )
{ clrscr();
cout<<"Ingrese el numero cuya raíz cuadrada desea ";
cin>>num;
cout<<"Ingrese un valor aproximado de la raíz ";
cin>>aprox; }
void procesar( )
{ do{ raiz=aprox;//almacenar la aproximación
aprox=(num/raiz + raiz)/2.0;//calcular nueva aproximación
cout<<"Nueva Aproximación "<<aprox<<endl;
}while(fabs(aprox-raiz)>ERROR);
getch();
}
void mostrar()
{ cout<<endl<<endl;
cout<<"La Raiz cuadrada es "<<aprox<<endl;
getch(); }
EJECUCION
2.- Escriba un programa que utilizando comunicación vía argumentos y parámetros, pueda calcular la nota final,
considerando que el promedio de prácticas se halla eliminando la menor nota de las cuatro prácticas, la nota final
se hallara
Promedio de prácticas = (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: POOC4PROB2
FECHA: 18DE MARZO DE 2013
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 );
Ing.Ricardo Castañeda
94
PROGRAMACION ORIENTADA A OBJETOS 2013
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);
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 prácticas 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
/*Programa principal*/
void main( )
{ float x0,x1;
clrscr();
cout<<"Ingrese intervalo donde se encuentra la raiz"<<endl;
cout<<"Ingrese xmin : ";cin>>x0;
cout<<"Ingrese xmax : ";cin>>x1;
cout<< " RAIZ = "<< bisecar( x0,x1);
getch();
}
/* Funciones*/
float fcub(float x)
{ return( pow(x,3) - pow(x,2) - x -1);}
Ing.Ricardo Castañeda
96
PROGRAMACION ORIENTADA A OBJETOS 2013
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.
Código : Código del empleado es una cadena de 11 caracteres.
Sueldo bruto : Sueldo mensual que percibe el empleado.
Faltas : Se le descontara 1/30 del sueldo bruto por cada falta.
Horas extras : Se le pagara (1/(30*8))*1.5 por cada hora extra.
Seguro : Por afp (1) será 13 % de descuento del total a percibir
Por ssp(2) será 11% de descuento del total a percibir.
Por ninguna(0) será 7% de descuento del total a percibir.
Bonificaciones: Tiempo de servicio (0=no,1=si), 5% del bruto.
PROGRAMA
/* CODIGO: POOC4PROB4
FECHA: 18 DE MARZO DE 2013
OBJETIVO: CALCULO DE PLANILLA PARA UN TRABAJADOR.*/
# include<iostream.h>
# include<stdio.h>
# include<conio.h>
void leer( char nombre[40], char código[11],float *sueldob,int *faltas,int *horase,int *seguro,int *bonif);
float calcular_neto(float sueldob,int faltas,int horase,int seguro,int bonif,float *descuento);
void imprimir_boleta(char n[40],char c[11],float descuento,float sueldon);
void main( )
{ char name[40],code[11];
float sb,de,sn;
int fa,he,seg,bon;
clrscr();
leer(name,code,&sb, &fa,&he,&seg,&bon);
sn = calcular_neto(sb,fa,he,seg,bon,&de);
imprimir_boleta(name,code,de,sn);
getch(); }
/* Funciones*/
void leer( char nombre[40], char codigo[11],float *sueldob,int *faltas,int *horase,int *seguro,int *bonif)
EJECUCION
Ing.Ricardo Castañeda
98
PROGRAMACION ORIENTADA A OBJETOS 2013
5.- Escriba un programa que halle un número 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: POOC4PROB5
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Halla fibonacci en forma recursiva */
#include<iostream.h>
#include<conio.h>
#include<math.h>
void leer(int *n);
int fib(int n);
/* Función principal*/
main()
{ int m;
leer(&m);
cout<<"\n El numero es = "<<fib(m);
getch(); }
/* Funciones */
void leer(int *n)
{ clrscr();
cout<<"Ingrese n=> "; cin>>(*n); }
int fib( int n)
{ if(n<=1)
return(1);
else
return(fib(n-1)+fib(n-2)); }
EJECUCION
6.- Escriba un programa que halle los factores primos de un número en forma recursiva.
PROGRAMA
/* CODIGO: POOC4PROB6
FECHA: 18 DE MARZO DE 2013
EJERCICIOS PROPUESTOS
1. Escriba un programa que utilizando funciones pueda realizar operaciones con números complejos: Suma, Resta,
Multiplicación y División. Cada operación debe realizarse con funciones además de la lectura y escritura. Debe
trabajar con un menú.
2. Escriba un programa que calcule áreas, debe calcular áreas para cuadrados, rectángulos, triángulos y círculos;
cada calculo debe realizarse con una función.
3. Escriba un programa que resuelva el mismo problema de planilla (problema 4)pero considere que hay tres tipos
de bonificaciones.
Ing.Ricardo Castañeda
100
PROGRAMACION ORIENTADA A OBJETOS 2013
Tiempo de servicio (5%)
Carga familiar (5%)
Remuneración por dirección (10%)
4. Escriba un programa que utilizando el concepto de puntero a funciones evalúe una función 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 exámenes
considere, que el sistema de evaluación puede ser:
Sistema A : promedio de prácticas es el promedio de las cuatro practicas y el promedio final es la suma de los
dos exámenes mas el promedio de prácticas divididos entre tres.
Sistema B : promedio de prácticas es el promedio de tres practicas eliminando la menor y el promedio final es
la suma del primer examen más el segundo examen duplicado el promedio de prácticas divididos entre
cuatro.
6. Escriba un programa que resuelva el problema de las torres de Hanói para n discos utilizando una función
recursiva. En las torres de Hanói se trata de pasar “n discos” de un eje “Origen” a un eje “Destino” utilizando un
eje auxiliar. Las reglas son :
Solo se puede mover un disco a la vez.
Nunca un disco de mayor diámetro puede estar sobre un disco de menor diámetro.
CAPITULO V
Ing.Ricardo Castañeda
102
PROGRAMACION ORIENTADA A OBJETOS 2013
ARREGLOS EN LENGUAJE “C”
5.1 Definición.- Un arreglo es una colección de elementos del mismo tipo; por lo tanto es una estructura
homogénea. Su declaración se realiza indicando al compilador sus características que son tipo, nombre y
tamaño. Ejemplo:
int datos[10]; la información que se entrega al compilador será:
Nombre del arreglo: datos
Tipo de componente: variable simple entera
Tamaño 10 elementos
Nombre de las componentes:
datos[0]
datos[1]
datos[2]
datos[3]
datos[4]
datos[5]
datos[6]
datos[7]
datos[8]
datos[9]
5.2 Acceso a elementos.- Los elementos de un arreglo se designan con un subíndice 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] 20
a[1]
25
a[2]
35
a[3] 40
5.3 Operaciones con Arrays unidimensionales (vectores).- Las operaciones iníciales son las de lectura y
escritura, las cuales vamos a ver en el siguiente programa ejemplo:
5.4 Ejemplo 1.- Lee e imprime un vector de “n” elementos.
PROGRAMA
/* CODIGO: POOC5E1
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Entrada y salida de un vector */
# include<iostream.h>
# include<conio.h>
void main( )
{ int vector[50],n,i;
clrscr();
Operaciones con arreglos: Las demás operaciones las analizaremos algorítmicamente y después los
presentaremos en un menú en los problemas desarrollados.
Las operaciones más importantes con arreglos unidimensionales son :
Adición
Eliminación
Búsqueda
Ordenamiento
ADICION: La operación de adición nos permite ingresar un elemento al vector de “n” componentes que están siendo
utilizadas.
Inicialmente tenemos: Vector A
N=6
A [1] A [2] A [3] A [4] A [5] A[6] A[7]
3 5 12 20 15 25
J= 4
X 14
Ing.Ricardo Castañeda
104
PROGRAMACION ORIENTADA A OBJETOS 2013
A[1] = 3, A[2] = 5, A[3] = 12, A[4] = 14, A[5] = 20, A[6] = 15, A[7] = 25.
Para realizar esta operación necesitamos tres pasos:
a) Realizar un corrimiento de una posición hacia la derecha de todos los valores desde la posición “N” (N=6) hasta
la posición “J” (J=4), el resultado sería:
N=6
A [1] A [2] A [3] A [4] A [5] A[6] A[7]
3 5 12 20 20 15 25
El algoritmo es:
Para i = N,J,-1
A[i+1] A[i]
Fin Para
b) Adicionar el elemento X en la posición J
A[J] X
El resultado seria
N=6
A [1] A [2] A [3] A [4] A [5] A[6] A[7]
3 5 12 14 20 15 25
c) Actualizar “N”
N = N +1
N=7
A [1] A [2] A [3] A [4] A [5] A[6] A[7]
3 5 12 14 20 15 25
Las instrucciones en Borland “C” serán:
cout<<"Ingrese posición de inserción: ";
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;
ELIMINACION: La operación de eliminación nos permite sacar un elemento del vector de “n” componentes que están
siendo utilizadas.
Inicialmente tenemos: Vector A
N=6
A [1] A [2] A [3] A [4] A [5] A[6]
3 5 12 20 15 25
J= 3
n = n - 1;
BUSQUEDA: La operación de búsqueda es una de las más importantes. En todo proceso real siempre se buscara un
elemento dentro de un conjunto, o sea buscaremos información dentro de la data, labor fundamental en informática.
La operación buscara un elemento X en un vector A de N elementos.
N=6
A [1] A [2] A [3] A [4] A [5] A[6]
3 5 12 20 15 25
X 19
Tenemos que tener en cuenta que la búsqueda terminara cuando encontremos el elemento buscado o cuando
llegamos al final de la estructura.
Algorítmicamente seria:
Ing.Ricardo Castañeda
106
PROGRAMACION ORIENTADA A OBJETOS 2013
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
3.- Si ( x == A[i])
Entonces
3.1Escribir( “Valor hallado en posición “, pos)
Sino
3.2 Escribir( “Valor no hallado”)
Fin si
Las instrucciones en Borland “C” serán:
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 posición: "<<pos;
else
cout<< " Valor no hallado ";
ORDENAMIENTO: La operación de ordenamiento se realiza por etapas, en nuestro algoritmo por comparación
trataremos de poner el menor valor en la posición superior, pero en cada etapa ya no participa el menor ya
encontrado en la etapa anterior.
El método busca colocar el primer menor en la posición 1 en la etapa 1.
Colocar el segundo menor en la posición 2 en la etapa 2.
colocar el tercer menor en la posición 3 en la etapa 3.
En general se trata de colocar el i’esimo menor en la posición “i” en la etapa “i”.
Veamos
ETAPA 1
OBJETIVO. Llevar el menor 1(menor total) a la primera posición.
¿A[1] > A [2]? Si la respuesta es sí, se intercambian posiciones entre A[1] y A[2], como en este caso
A [1] A [2] A [3] A [4] A [5] A[6] A[7]
9 3 2 7 6 4 5
ETAPA 3
OBJETIVO. Llevar el menor 3 (tercer menor ) a la tercera posición
Verificar que en la tercera etapa ya no participa el primer menor y el segundo menor, ya alcanzaron su posición final.
A [3] A [4] A [5] A[6] A[7]
9 7 6 4 5
¿A[3] > A [4]?. Si. Intercambiar entre A[3] y A[4]
ETAPA 4
OBJETIVO. Llevar el menor 4 (Cuarto menor ) a la cuarta posición
Ing.Ricardo Castañeda
108
PROGRAMACION ORIENTADA A OBJETOS 2013
¿A[4] > A [5]?. Si
ETAPA 5
A[6] A[7]
9 7
¿A[5] > A [6]?. Si
A[6] A[7]
7 9
Volvemos a verificar el vector y tendremos
Planteando la i’esima etapa dentro de las n-1 etapas, en forma algorítmica tenemos.
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 ;
}
PROGRAMA
/* CODIGO: POOC5E2
FECHA: 18 DE MARZO DE 2013
OBJETIVO: ADICIONAR UN ELEMENTO AL FINALIZAR EL VECTOR */
# include<iostream.h>
# include<conio.h>
void main( )
{ int vector[50],n,i,x;
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;
Ing.Ricardo Castañeda
110
PROGRAMACION ORIENTADA A OBJETOS 2013
for ( i=1; i<=n;i++)
{ cout<< vector[i]<< endl; }
getch();
clrscr();
cout<<" Ingrese el valor para adicionar ";cin>>x;
vector[n+1]=x;
n=n+1;
cout<<" NUEVA SALIDA "<<endl<<endl;
for ( i=1; i<=n;i++)
{ cout<< vector[i]<< endl; }
getch(); }
EJECUCION
PROGRAMA
/* CODIGO: POOC5E3
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Realizar una búsqueda binaria sobre un vector ordenado */
# include<iostream.h>
# include<conio.h>
void main( )
{ int vector[50],n,i,x;
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();
PROGRAMA
/* CODIGO: POOC5E4
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Ordenamiento x1<=x2<=x3.... */
# include<iostream.h>
# include<conio.h>
void main( )
{ int vector[50],n,i;
int cambio,temp;
clrscr();
//Lectura
cout << " Ingrese n => "; cin >> n;
for (i=1;i<=n;i++)
{ cout<< " Ingrese valor "<< i<<" : ";
cin>> vector[i]; }
clrscr();
Ing.Ricardo Castañeda
112
PROGRAMACION ORIENTADA A OBJETOS 2013
//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
/* CODIGO: POOC5PROB1
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Halla la moda de un conjunto de números 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);
// Función
mo=moda (a,quen);realiza la lectura
escritura(mo); }
Ing.Ricardo Castañeda
116
PROGRAMACION ORIENTADA A OBJETOS 2013
b[1]=a[1];
rep[1]=1;
for( i=2;i<=n;i++)
if(a[i-1]==a[i])
rep[nsr]=rep[nsr]+1;
else
{ nsr=nsr+1;
b[nsr]=a[i];
rep[nsr]=1; }
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); }
// Función que presenta el resultado
void escritura(int mo)
{ clrscr();
cout<< " La moda es ="<< mo;
getch(); }
EJECUCION
1.- Lectura
2.- Adición
3.- Eliminación
4.- Búsqueda
5.- Ordenar
6.- Escritura
7.- Salir
/* CODIGO: POOC5PROB2
FECHA: 18 DE MARZO DE 2013
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);
void sorteo(int v[50], int n);
void escritura(int v[50], int n);
void main( )
{ int vector[50];
int n;
char opcion;
clrscr();
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.- Busqueda";
gotoxy(30,9);
cout<< "5.- Ordenar";
gotoxy(30,10);
cout<<"6.- Escritura";
gotoxy(30,11);
cout<< "7.- Salir";
gotoxy(25,16);
cout<< "Ingrese opcion ==> ";
cin>>opcion;
switch(opcion)
{ case '1' : lectura(vector, &n);break;
case '2' : adicion(vector, &n);break;
Ing.Ricardo Castañeda
118
PROGRAMACION ORIENTADA A OBJETOS 2013
case '3' : eliminacion(vector, &n);break;
case '4' : busqueda(vector, n);break;
case '5' : sorteo(vector, n);break;
case '6' : escritura(vector, n);break;
}
}while(opcion != '7');
}
void lectura(int v[50], int *n)
{ int i; clrscr();
cout << " Ingrese n => ";
cin >> *n;
for ( i=1; i<=(*n);i++)
{ cout<< " Ingrese valor "<< i<<" : "; cin>> v[i]; }
}
void adicion(int v[50], int *n)
{ int i,j,x;
clrscr();
cout<<"Ingrese posición de inserción: "; 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 posición 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 posición: "<<pos;
else
cout<< " Valor no hallado ";
Ing. Ricardo Castañeda
119
FACULTAD DE INGENIERIA MECANICA 2013
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; }
getch(); }
EJECUCION
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 mérito las tres mejores notas
SOLUCIÓN
PROGRAMA
/* CODIGO: POOC5PROB3
OBJETIVO: halla las tres mejores notas de un grupo de alumnos y las muestra junto con los nombres*/
# include<iostream.h>
# include<conio.h>
# include<stdio.h>
# include<string.h>
void lectura(int vectornot[50], char vectornom[50][40], int *n);
void orden(int vectornot[50],char vectornom[50][40], int n);
Ing.Ricardo Castañeda
120
PROGRAMACION ORIENTADA A OBJETOS 2013
void escritura(int vectornot[50],char vectornom[50][40], int n);
void main( )
{ int vectornot[50];
char vectornom[50][40];
int n;
clrscr();
lectura(vectornot,vectornom,&n);
orden(vectornot,vectornom, n);
escritura(vectornot, vectornom,n); }
void lectura(int vectornot[50],char vectornom[50][40], int *n)
{ int i;
clrscr();
cout << " Ingrese n => "; cin >> *n;
{ int i,j,temp1;
char temp2[40];
for (j=i+1;j<=n;j++)
{ temp1 = vectornot[i];
vectornot[i] = vectornot[j];
vectornot[j] = temp1 ;
strcpy(temp2,vectornom[i]);
strcpy(vectornom[i],vectornom[j]);
strcpy(vectornom[j],temp2) ; } }
{int i;
{ gotoxy(37,3+i);
EJECUCION
Nota: Este programa trabaja con el concepto de vectores paralelos o sea que la información de los vectores está
relacionada por el subíndice esto significa que la nota 5 pertenece al alumno que tiene el nombre 5, por lo tanto la
información se debe manejar en paralelo para que siga siendo consistente.
4.- Escriba un programa que halla el determinante de una matriz.
SOLUCIÓN:
PROGRAMA
/* CODIGO: POOC5PROB4
FECHA: 18 DE MARZO DE 201
OBJETIVO: Calcula determinante*/
#include<iostream.h>
#include<conio.h>
#include<math.h>
#include <stdlib.h>
#include <time.h>
void main()
{float m[50][50],m1[50][50];
int n;
int i,j,k,l;
clrscr();
cout<<"Ingrese el orden de la matriz:";cin>>n;
randomize();
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
m[i][j]=random(5)+5;
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<m[i][j]<<" ";
Ing.Ricardo Castañeda
122
PROGRAMACION ORIENTADA A OBJETOS 2013
cout<<endl;
}
getch();
for (i=1;i<=n;i++)
for (j=1;j<=n;j++)
m1[i][j]=m[i][j];
float det;
det=m[1][1];
for(k=1;k<=(n-1);k++)
{ l=k+1;
for(i=l;i<=n;i++)
for(j=l;j<=n;j++)
m[i][j]=(m[k][k]*m[i][j]-m[k][j]*m[i][k])/m[k][k];
det=det*m[k+1][k+1];
}
cout<<endl;
cout<<"Determinante = "<<det<<endl;
getch();
}
EJECUCION
5.- Escribir un programa que realice operaciones sobre la matriz, pero utilizando funciones dentro de una estructura.
PROGRAMA
/* CODIGO: POOC5PROB5
FECHA: 18 DE MARZO DE 2013
OBJETIVO: Utilizar funciones dentro de estructura, muestra valor central e
Intercambia diagonal principal por columna central es una matriz de orden 5 */
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<time.h>
struct opmatriz
{ int a[6][6];
void generar( ) //no le entrego xq a[6][6](parámetro) está dentro
{ int i,j,k,primo,x;
randomize();
Ing. Ricardo Castañeda
123
FACULTAD DE INGENIERIA MECANICA 2013
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
{ do { primo=1;
x=7+random(71);
for(k=2;k<x;k++)
if( (x%k)==0 )
{primo=0;
break; }
}while(primo==0);
a[i][j]=x; } }
void mostrarcentral ( )
{ cout<<endl;
cout<<a[3][3]<<endl;
getch(); }
void intercambiar ( )
{ int temp,i;
for(i=1;i<=5;i++)
{ temp=a[i][i];
a[i][i]=a[i][3];
a[i][3]=temp; } }
void escribir ( )
{ int i,j;
for(i=1;i<=5;i++)
{cout<<endl;
for(j=1;j<=5;j++)
cout<<" "<<a[i][j]; }
getch(); } };
void main( )
{ opmatriz x;
x.generar ( );
x.escribir ( );
x.mostrarcentral ( );
x.intercambiar ( );
x.escribir ( );}
EJECUCION
Ing.Ricardo Castañeda
124
PROGRAMACION ORIENTADA A OBJETOS 2013
6.- Escribir un programa que lea un vector numérico y lo rote hacia la derecha, de tal manera que el primer termino
pase al segundo lugar, el segundo al tercero y así consecutivamente y finalmente el último pase a ser primero.
PROGRAMA
/* CODIGO: POOC5PROB6
FECHA: 18 DE MARZO DE 2013
Objetivo: rota a la derecha los "n" elementos de un arreglo
Entrada: vector v[]
Salida: vector v[] rotado */
#include<iostream.h>
#include<conio.h>
void main()
{ int v[10];
int i,n;
clrscr();//limpia pantalla
cout<<endl<<endl;
cout<<"INGRESE N = "; cin>>n;
for (i=1;i<=n;i++)
{ cout<<" V["<<i<< "]: ";cin>>v[i];}
// Rotación
for (i=n;i>=1;i--)
v[i+1]=v[i];
v[1]=v[n+1];
cout << "VECTOR ROTADO = "<<endl;
for(i=1;i<=n;i++)
cout<<" V["<<i<< "]: "<<v[i]<<endl;
getch();
}
EJECUCION
Ing.Ricardo Castañeda
126
PROGRAMACION ORIENTADA A OBJETOS 2013
CAPITULO VI
6 Ahora veremos un caso especial de arrays, que es un tipo estandarizado. Se trata de las cadenas de caracteres
o "strings" (en inglés).
Una cadena en C es un conjunto de caracteres, o valores de tipo "char", terminados con el carácter nulo, es decir el
valor numérico 0. Internamente se almacenan en posiciones consecutivas de memoria. Este tipo de estructuras
recibe un tratamiento especial, y es de gran utilidad y de uso continuo.
La manera de definir una cadena es la siguiente:
char <identificador> [<longitud máxima>]
Nota: En este caso los corchetes no indican un valor opcional, sino que son realmente corchetes, por eso están en
negrita.
Cuando se declara una cadena hay que tener en cuenta que tendremos que reservar una posición para almacenar
el carácter nulo, de modo que si queremos almacenar la cadena "ahora", tendremos que declarar la cadena como:
char cad1[6];
Cinco caracteres para "ahora" y uno extra para el carácter '\0'.
También será posible hacer referencia a cada uno de los caracteres individuales que componen la cadena,
simplemente indicando la posición. Por ejemplo el tercer carácter de nuestra cadena de ejemplo será la ‘o’,
podemos hacer referencia a él como cad1[2]. Los índices tomarán valores empezando en el cero, así el primer
carácter de nuestra cadena sería cad1[0], que es la ‘a'.
Una cadena puede almacenar informaciones como nombres de personas, mensajes de error, números de teléfono, .
La asignación directa sólo está permitida cuando se hace junto con la declaración. Por ejemplo:
char cad1;
cad1 = “ahora”, producirá un error.
Producirá un error en el compilador, ya que una cadena definida de este modo se considera una constante, como
veremos en el capítulo de "arrays" o arreglos.
Lo que sí se puede hacer es: char cad1[6] = "ahora".
Existen muchas funciones para el tratamiento de cadenas, como veremos, que permiten compararlas, copiarlas,
calcular su longitud, imprimirlas, visualizarlas, guardarlas en disco, etc. Además, frecuentemente nos encontraremos
a nosotros mismos creando nuevas funciones que básicamente hacen un tratamiento de cadenas.
6.1 Lectura de una cadena del teclado
#include <iostream.h>
Veamos el siguiente código:
main ()
{char cad [80];
cout << “introduzca una cadena:”; // lectura del teclado cin » cad;
cin >> cad;
cout << “Su cadena es:”;
cout << cad;
return 0; }
Esta lectura del teclado, leerá una cadena hasta que se encuentra el primer carácter blanco. Así, cuando se lee “Hola
que tal” la primera cadena, en cad sólo se almacena Hola. Para resolver el problema, utilizará la función gets () que
lee una cadena completa.
La sintaxis de la función gets será:
Ing.Ricardo Castañeda
128
PROGRAMACION ORIENTADA A OBJETOS 2013
#include <stdio.h>
char *gets(char *s)
Descripción: Captura una cadena desde el stdin. Esta cadena es tomada de una línea y colocada en s, en el fin de
línea se pondrá el carácter ‘\n’. esto nos permite considerar algunos blancos intermedios que de otra manera no se
considerarían.
El programa anterior quedaría así:
#include <iostream.h>
#include <stdio.h>
main()
{ char cad[80];
cout « “Introduzca una cadena:”;
gets (cad);
cout « Su cadena es:”; cout << cad;
return 0; }
Ejemplo 1.- Escriba un programa que ingrese nombres y apellidos a una variable, usando cin y usando la función
gets y compare resultados al imprimirlos.
PROGRAMA
/* CODIGO: POOC6E1
Fecha : 18 de marzo de 2013
objetivo: compara la lectura de cadenas con cin y con gets
entrada: vector nombre_apellidos char 80, leído por cin y por gets
salida: escritura con cin y con gets de una cadena de caracteres.*/
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void main()
{ char nombre_apellidos1[50],nombre_apellidos2[50];
clrscr();//limpia pantalla
cout<<"Ingrese nombres y apellidos : "; cin>>nombre_apellidos1;
cout<<"Ingrese nombres y apellidos : "; gets(nombre_apellidos2);
cout<<endl<<endl;
cout<<"Salida del nombre y apellidos leídos con cin : "<<nombre_apellidos1<<endl;
cout<<"Salida del nombre y apellidos leídos con gets: "<<nombre_apellidos2;
getch(); }
EJECUCION
#include<stdio.h>
char *strncpy(char *dest, const char *origen,size_t maxlen)
Copia un numero de bytes de origen a destino.
Retorna destino.
Ejemplo 2.- Escriba un programa que ingrese nombres y código sabiendo que en el código los cuatro primeros
caracteres son el año de ingreso, mostrar en la salida el nombre y el año de ingreso.
PROGRAMA
/* CODIGO: POOC6E2
fecha : 18 DE MARZO DE 2013
objetivo: Copia cadenas completas o parte de una cadena
entrada: nombre y código
salida: nombre, año de ingreso */
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
void main()
{ char nombre[50],codigo[10];
char nomsal[50],ingreso[5];
clrscr();//limpia pantalla
cout<<"Ingrese nombre: "; gets(nombre);
cout<<"Ingrese cOdigo: "; gets(codigo);
strcpy(nomsal,nombre);
strncpy(ingreso,codigo,4);
ingreso [4]='\0';
cout<<endl<<endl;
cout<<"Nombre : "<<nomsal<<endl;
cout<<"Año de Ingreso : "<<ingreso;
getch(); }
EJECUCION
Ing.Ricardo Castañeda
130
PROGRAMACION ORIENTADA A OBJETOS 2013
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
void main()
{ int agno,merito;
Ing.Ricardo Castañeda
132
PROGRAMACION ORIENTADA A OBJETOS 2013
char agnoc[5],meritoc[5],letras[3];
char codigo[13]="";
clrscr();
cout<<"Ingrese un año: ";cin>>agno;
cout<<"Ingrese orden de merito: ";cin>>merito;
cout<<"Ingrese 2 caracteres: ";cin>>letras;
cout<<agno<<endl;
cout<<merito<<endl;
cout<<letras<<endl;
itoa(agno,agnoc,10);
itoa(merito,meritoc,10);
cout<<agnoc<<" Cadena de longitud: "<<strlen(agnoc)<<endl;
cout<<meritoc<<" Cadena de longitud: "<<strlen(meritoc)<<endl;
cout<<letras<<" Cadena de longitud: "<<strlen(letras)<<endl;
strcat(codigo,agnoc);
strcat(codigo, meritoc);
strcat(codigo,letras);
cout<<"Codigo Generado= "<<codigo<<endl;
cout<<"Cadena de longitud: "<<strlen(codigo)<<endl;
getch(); }
EJECUCION
6.3 Vectores de cadenas: Cuando queremos trabajar con un arreglo de cadenas en realidad vamos a
trabajar con una matriz de caracteres, veamos esto, declaremos la variable codigo:
char codigo[3][4]
Se grafica
a 1 2 \0 b 2 2 \0 c 3 4 \0
Donde
codigo [0] “a12”
codigo [1] “b22”
codigo [2] “c34”
o sea que podemos trabajar con las cadenas, codigo[0], codigo[1], codigo[2] y todas las funciones estudiadas
se aplicaran a estas filas de las matrices de caracteres que viene a ser las cadenas que trabajaran como
argumentos de estas funciones.
Ejemplo 5.- Escribir un programa básico que nos permita lee un vector de cadenas donde almacenemos un
conjunto de “n” cursos
Ejemplo 6.- Escribir un programa básico que nos permita lee un vector de cadenas donde almacenemos un
conjunto de “n” nombres y después lo ordene en forma alfabética.
PROGRAMA
/* CODIGO: POOC6E6
fecha : 18 DE MARZO DE 2013
objetivo: Ordenamiento alfabético de nombres
entrada: Ingresa un arreglo de nombres
salida: Muestra los nombres ingresados ordenados alfabéticos */
#include<iostream.h>
Ing.Ricardo Castañeda
134
PROGRAMACION ORIENTADA A OBJETOS 2013
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
void main()
{ int i,j,n;
char nombre[40][30],temp[30];//Puede almacenar hasta 40 nombres
clrscr();
cout<<"Ingrese numero de nombres ==> ";cin>>n;
for(i=1;i<=n;i++)
{ cout<<"Ingrese apellidos y nombres["<<i<<"]: ";
gets(nombre[i]);
}
//salida
clrscr();
gotoxy(35,2);cout<<" NOMBRES ";
for(i=1;i<=n;i++)
{ gotoxy(33,4+i);cout<<nombre[i];}
getch();
//ordenamiento de nombres
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(strcmp(nombre[i],nombre[j])>0)
{strcpy(temp,nombre[i]);
strcpy(nombre[i],nombre[j]);
strcpy(nombre[j],temp);
}
clrscr();
gotoxy(35,2);cout<<" NOMBRES ORDENADOS";
for(i=1;i<=n;i++)
{ gotoxy(33,4+i);cout<<nombre[i];}
getch();
}
EJECUCION
1.- Tenemos dos vectores de cadenas, el primero almacena códigos de los cursos de 5 caracteres de longitud y el
segundo almacena los nombres de los cursos, escriba usted un programa que lea un codigo y realice una búsqueda,
si encuentra el curso debe mostrar el nombre y si no lo encuentra un mensaje de no hallado.
PROGRAMA
/* CODIGO: POOC6PROB1
fecha : 18 DE MARZO DE 2013
objetivo: BUSQUEDA EN UN VECTOR PARALELO
entrada: INGRESA CODIGO DE UN CURSO
salida: NOMBRE DEL CURSO O MENSAJE DE BUSQUEDA FALLIDA */
#include<iostream.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
void main()
{ int i,j,n;
char codcur[50][6],nomcur[50][30],codx[6];
clrscr();
cout<<"Ingrese numero de cursos ==> ";cin>>n;
for(i=1;i<=n;i++)
{ cout<<"Ingrese Codigo del Curso["<<i<<"]: ";gets(codcur[i]);
cout<<"Ingrese Nombre del Curso["<<i<<"]: ";gets(nomcur[i]); }
clrscr();
gotoxy(35,2);cout<<" BUSQUEDA ";
gotoxy(30,5);cout<<"INGRESE CODIGO DEL CURSO A BUSCAR: ";cin>>codx;
for(i=1;i<=n;i++)
if (strcmp(codx,codcur[i])==0)
{ j=i; break; }
if (strcmp(codx,codcur[j])==0)
{ gotoxy(30,6);
cout<<" NOMBRE DEL CURSO ENCONTRADO : "<<nomcur[j]; }
else
{ gotoxy(30,20); cout<<" CODIGO NO HALLADO........................."; }
getch(); }
EJECUCION
Ing.Ricardo Castañeda
136
PROGRAMACION ORIENTADA A OBJETOS 2013
2.- Deseamos generar Emails para un grupo de alumnos de la facultad de Ingeniería Mecánica (FIM), esto lo
haremos utilizando los dos primeros caracteres del nombre y el primer apellido mas la cadena “@fim.edu.pe”, por
ejemplo si el nombre es José cárdenas, el email generado seria: [email protected], utilice las funciones
necesaria que hemos revisado para generar los emails de un grupo de “n” alumnos de la facultad de ingeniería
mecánica (FIM).
PROGRAMA
/* CODIGO: POOC6PROB2
fecha : 18 DE MARZO DE 2013
objetivo: Genera un Email para cada alumno FIM
entrada: nombre y apellido
salida: Email */
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
void main()
{ char nombre[10][15],apellido[10][15];
char cadena1[10][3],cadena2[12]="@fim.edu.pe";
char email[10][30];
int i,n;
clrscr();//limpia pantalla
cout<<"Ingrese numero de alumnos ==> ";cin>>n;
for(i=1;i<=n;i++)
{ cout<<"Ingrese Nombre["<<i<<"] : ";gets(nombre[i]);
cout<<"Ingrese Apellido["<<i<<"]: ";gets(apellido[i]);
strncpy(cadena1[i],nombre[i],2);
cadena1[i][2]= '\0';
strcpy(email[i],"");
strcat(email[i],cadena1[i]);
strcat(email[i],apellido[i]);
strcat(email[i],cadena2);}
clrscr();
gotoxy(35,2);cout<<" Emails ";
for(i=1;i<=n;i++)
{ gotoxy(33,4+i);cout<<email[i];}
getch(); }
EJECUCION
Ing.Ricardo Castañeda
138
PROGRAMACION ORIENTADA A OBJETOS 2013
EJECUCION
EJERCICIOS PROPUESTOS
1. Escribir un programa que lea el codigo de un alumno compuesto por año que ingreso + puesto que ingreso y
una letra y halle el año de ingreso y además orden de merito para “n” alumnos. Ejemplo lee “2005193c” y
muestra año de ingreso = 2005 y orden de merito 193. No olvidar que esto se tiene que realizar para líos “n”
alumnos.
2. Dados tres vectores paralelos, el primero con el codigo de n alumnos el segundo con el codigo del curso en el
que están matriculados y el tercero con la nota, escribir un programa que liste todos los aprobados además
del promedio total de un curso particular.
3. Se tiene un conjunto de códigos, escriba un programa que me permita encriptarlos intercambiando sus
caracteres y además tiene que mostrar también la rutina que los desencripta.
4. Escribir el código necesario para leer un conjunto de “n” cadenas de caracteres e imprimir cuantas veces se
presenta cada vocal.
5. Se tiene una vector de nombres, otro de direcciones y un último vector de teléfonos, se desea escribir un
listado de todos los que tienen celular. El listado debe incluir nombre y dirección.
CAPITULO VII
Ing.Ricardo Castañeda
140
PROGRAMACION ORIENTADA A OBJETOS 2013
REGISTROS EN LENGUAJE “C”
7 Definición.- Un registro o una estructura en lenguaje “C” es una colección de variables simples que pueden
contener diferentes tipos de datos. Es un tipo de dato definido por el usuario.
7.1 Modelamiento de un registro de acuerdo a las entidades del mundo real: Cuando se crea un registro
se utiliza las 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, como estas entidades dan origen a sus respectivos registros.
ENTIDAD REGISTRO
ALUMNO REGALU
Vemos que cada característica de la entidad alumno se convierte en un campo del registro regalu.
Continuemos con la entidad curso:
ENTIDAD REGISTRO
CURSO REGCUR
Vemos claramente que los campos son las características 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
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 Castañeda”);
strcpy( persona1.direccion, “ San Borja, Los alamos 257”);
strcpy( persona2.direccion, “ Surco, leoncio Prado 820”);
7.4 Inicialización 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;
Ing.Ricardo Castañeda
142
PROGRAMACION ORIENTADA A OBJETOS 2013
c2.largo = 3;
c3.ancho = 1;
7.5 Asignación de estructuras.- Podemos intercambiar información entre dos estructuras directamente de
registro a registro.
Ejemplo: De los casos anteriores es válido decir:
persona2 = persona1;
c1 = c3;
Los contenidos de los correspondientes campos de persona1 se copiaran en persona2, los de c3 en c1.
Estructuras anidadas.- Se pueden anidar estructuras dentro de otras estructuras.
Ejemplo: struct fecha
{ int dia;
int mes;
int año; }
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
Dirección cadena de 40 caracteres
PROGRAMA
/* CODIGO: POOC7E1
FECHA: 21 DE MARZO DE 2013
OBJETIVO:PROGRAMA QUE LEE Y ESCRIBE UN ARREGLO DE REGISTROS*/
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<iomanip.h>
struct persona
{ char dniper[10]; // DNI DE LA PERSONA
char nomper[30]; // NOMBRE DE LA PERSONA
char dirper[40]; // DIRECCION DE LA PERSONA };
void main( )
{ int i,n;
persona p[50];
clrscr();
cout<< " Cuantos registros va a procesar ==> ";
cin >>n;
for(i=1;i<=n;i++)
{cout<< " REGISTRO "<<i<<" :"<<endl<<endl;
cout<< " DNI = ";cin>>p[i].dniper;
cout<< " NOMBRE = ";gets(p[i].nomper);
Ing.Ricardo Castañeda
144
PROGRAMACION ORIENTADA A OBJETOS 2013
{ 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();
}
else
{ gotoxy(26,18);cout<<"Por favor ingrese datos...." ;
gotoxy(26,6);cout<<" Ingrese nombre ==> ";gets(n[i].nomalu);
gotoxy(26,7);cout<<" Ingrese examen parcial ==> ";cin>>n[i].examen1;
gotoxy(26,8);cout<<" Ingrese examen final ==> ";cin>>n[i].examen2;
gotoxy(26,9);cout<<" Ingrese Promedio Prac. ==> ";cin>>n[i].promediop;
n[i].notafinal=(n[i].examen1+2*n[i].examen2+2*n[i].promediop)/5.0;
}
}
}
cout<<setiosflags(ios::left);
Ing. Ricardo Castañeda
145
FACULTAD DE INGENIERIA MECANICA 2013
// Salida de resultados
clrscr();
cout<< " LISTADO DE ALUMNOS "<<endl;
cout<< "==================== "<<endl;
cout<<setw(10)<<"CODIGO";
cout<<setw(20)<<"NOMBRE";
cout<<setw(11)<<"EX.PARCIAL";
cout<<setw(11)<<"EX.FINAL ";
cout<<setw(11)<<"PROM.PRAC.";
cout<<setw(11)<<"NOTA FINAL"<<endl;
cout<< "========================================================================= "<<endl;
for(i=1;i<=nr;i++)
{cout<<setw(10)<<n[i].codalu;
cout<<setw(20)<< n[i].nomalu;
cout<<setw(11)<< n[i].examen1;
cout<<setw(11)<< n[i].examen2;
cout<<setw(11)<< n[i].promediop;
cout<<setw(11)<< n[i].notafinal<<endl;
} getch();
}
EJECUCION
Ing.Ricardo Castañeda
146
PROGRAMACION ORIENTADA A OBJETOS 2013
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.
Realizar balances mensuales de la tienda de abarrotes para manejar la contabilidad eficientemente.
SOLUCION:
PROGRAMA
/* CODIGO: POOC7PROB1
FECHA: 21 DE MARZO DE 2013
OBJETIVO: Pograma que crea un menú para manejo de registros que procesan stock de una tienda de abarrotes */
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
struct item
{ int codite; // código del producto
char desite[20]; // descripción del producto
char ubiite[4]; // ubicación del producto
float nunite; // número de unidades del producto
int tunite;// tipo de unidades kilo(1), litro(2), c/u(3)
float pruite; // precio por cada unidad del producto
};
void lectura(item prod[50], int *n);
void adicion(item prod[50], int *n);
void eliminacion(item prod[50], int *n);
void busqueda(item prod[50], int n);
void orden1(item prod[50], int n);
void escritura(item prod[50], int n);
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";
Ing.Ricardo Castañeda
150
PROGRAMACION ORIENTADA A OBJETOS 2013
2. Dada la siguiente estructura(registro)
codigo entero
nombre char 40
nivel char //solo existe A,B,C
sueldo real
a) Declarar la estructura.
b) Escribir el menú
Leer
Adicionar
Eliminar
Escribir
Salir
c) Escribir las funciones Leer, adicionar, eliminar y escribir.
SOLUCIÓN
PROGRAMA
/* CODIGO: POOC7PROB2
FECHA: 21 DE MARZO DE 2013
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; // código del empleado
char nomemp[40]; // nombre del empleado
char nivemp; // nivel remunerativo del empleado A,B,C
float sueemp; // sueldo del empleado
};
void leer(empleado p[50], int *n);
void adicionar (empleado p[50], int *n);
void eliminar (empleado p[50], int *n);
void escribir(empleado p[50], int n);
void main( )
{ empleado v[50];
int num;
char opcion;
clrscr();
do { clrscr();
gotoxy(26,2); cout<< "MANTENIMIENTO EMPLEADOS";
gotoxy(30,5); cout<< "1.- Leer";
gotoxy(30,6); cout<< "2.- Adicionar";
3. Se desea escribir un programa que procese el examen sustitutorio de "n" alumnos, considerar el siguiente
registro:
struct notas
{ char codalu [10]; // Código del alumno
char codcur [7]; // Código del curso
float pp ; // Promedio de prácticas
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
pp=(ep+2ef+pp)/4
c. El examen sustitutorio solo se considera si pp 6.0
d. Al considerar el examen sustitutorio este reemplazara al examen no rendido
o al más desfavorable de haber rendido los dos.
Ing.Ricardo Castañeda
154
PROGRAMACION ORIENTADA A OBJETOS 2013
e. Ordenar los promedios finales por merito y a quien corresponde.*/
PROGRAMA
/* CODIGO: POOC7PROB3
FECHA: 21 DE MARZO DE 2013
OBJETIVO: Programa que procesa notas, considerando las pruebas no rendidas como 99, para cálculos el 99 se transforma en cero */
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
#include<iomanip.h>
struct notas
{
char codalu[10];
char codcur[7];
float pp;
int ep;
int ef;
int es;
float pf;
};
void leer( notas libreta[50] , int *n);
void promedio ( notas nota[50] , int n);
void orden( notas nota[50] , int n);
void main( )
{ int num;
notas registro[50];
cout<<"REGISTRO"<<endl;
leer ( registro , &num );
promedio ( registro , num );
orden( registro , num ); }
void leer( notas libreta[50] , int *n)
{ int i;
clrscr();
cout<<"REGISTRO DE NOTAS"<<endl<<endl;;
cout<<"Numero de alumnos: ";cin>>*n;
cout<<endl;
for(i=1;i<=*n;i++)
{ cout<<"CODIGO ALUMNO: ";cin>>libreta[i].codalu;
cout<<"CODIGO CURSO: ";cin>>libreta[i].codcur;
cout<<"PROM. PRACTICAS: ";cin>>libreta[i].pp;
cout<<"EX. PARCIAL: ";cin>>libreta[i].ep;
cout<<"EX. FINAL: ";cin>>libreta[i].ef;
cout<<"EX. SUSTITUTORIO: ";cin>>libreta[i].es; }
Ing. Ricardo Castañeda
155
FACULTAD DE INGENIERIA MECANICA 2013
}
void promedio ( notas nota[50] , int n)
{ int i,condicion1,condicion2,condicion3;
for(i=1;i<=n;i++)
{ condicion1=(nota[i].es!=99);
condicion2=(nota[i].ep==99);
condicion3=(nota[i].ef==99);
if (nota[i].ep==99) nota[i].ep=0;
if (nota[i].ef==99) nota[i].ef=0;
nota[i].pf = ( nota[i].pp + nota[i].ep + 2*nota[i].ef )/4.0;
if( condicion1 )
{
if(nota[i].pp>=6.0)
{
if ( condicion2 || condicion3 )
{
if(condicion2)
nota[i].pf=( nota[i].pp+nota[i].es+2*nota[i].ef) /4.0;
if(condicion3)
nota[i].pf=( nota[i].pp+2*nota[i].es+nota[i].ep) /4.0;
}
else
if ( (nota[i].pp+nota[i].es+nota[i].ef*2)>(nota[i].pp+nota[i].ep+nota[i].es*2) )
nota[i].pf=(nota[i].pp+nota[i].es+nota[i].ef*2)/4.0;
else
nota[i].pf=(nota[i].pp+nota[i].ep+nota[i].es*2)/4.0;
}
}
}
}
void orden( notas nota[50] , int n)
{
int i,j;
notas temp;
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if( nota[i].pf<nota[j].pf )
{ temp=nota[i];
nota[i]=nota[j];
nota[j]=temp; }
clrscr( );
cout<<setiosflags(ios::fixed);
cout<<setiosflags(ios::showpoint);
Ing.Ricardo Castañeda
156
PROGRAMACION ORIENTADA A OBJETOS 2013
cout<<setprecision(2);
cout<<setiosflags(ios::left);
cout<<" LISTADO POR ORDEN DE MERITO"<<endl;
cout<<" ==========================="<<endl;
cout<<endl<<endl;
cout<<setw(10)<<"|CODIGO ";
cout<<setw(7)<<"|CURSO ";
cout<<setw(8)<<"|PROM.FINAL|"<<endl;
cout<<"==========================="<<endl;
for(i=1;i<=n;i++)
{cout<<setw(10)<<nota[i].codalu;
cout<<setw(7)<<nota[i].codcur;
cout<<setw(8)<<nota[i].pf<<endl; }
getch(); }
EJECUCION
4.- Se desea escribir un programa que procese una agenda electrónica de clientes por dia de la semana, y elaborar
para el dia de la semana, un reporte alfabético de a-z.
SOLUCION
PROGRAMA
/* CODIGO: POOC7PROB4
FECHA: 21 DE MARZO DE 2013
OBJETIVO: Elaborar una agenda electrónica de sus clientes por dia de la semana, y elaborar para el dia de la
semana, un reporte alfabético */
#include<iostream.h>
#include<conio.h>
#include<string.h>
#include<stdio.h>
struct clientes
{char nomcli[40];
char diasem[10];
char temcli[35];
};//variable definida por el usuario
struct agedia
{ char nomcli[40];
char temcli[35]; };
Ing.Ricardo Castañeda
158
PROGRAMACION ORIENTADA A OBJETOS 2013
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 código;
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 registro.
struct notas
{ char codalu [10]; // Código del alumno
char codcur [7]; // Código 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).
pp ep 2 * ef
b. El promedio final se halla pf
4
c. El examen sustitutorio solo se considera si pp 6.0
d. Al considerar el examen sustitutorio este reemplazara al examen no rendido o al mas desfavorable de
haber rendido los dos.
e. Ordenar los promedios finales por merito.
3. Se desea escribir un programa que procese la planilla de “n” trabajadores, considerar el registro dado.
struct empleado
{ int codemp; // Código del empleado
char nomemp [40]; // Nombre del empleado
float sb ; // Sueldo Bruto
int diasf; // Días faltos
int horase ; // Horas extras
float descuentos ; // Descuentos
float sn; // Sueldo Neto }
Para hallar los descuentos y el sueldo neto de cada trabajador debe considerar lo siguiente:
13% de descuento del sueldo bruto por seguro social.
Descuento por cada día falto.
50% de bonificación por cada hora extra.
CAPITULO VIII
Ing.Ricardo Castañeda
160
PROGRAMACION ORIENTADA A OBJETOS 2013
8 CONCEPTOS DE LA PROGRAMACIÓN ORIENTADA A OBJETOS.-La programación orientada a objetos
existe desde la creación de los primeros lenguajes de programación. Los conceptos que se manejan de
abstracción de datos, herencia y Polimorfismo se manejaban en estos lenguajes, pero con el desarrollo del
lenguaje “C” y la programación visual se utiliza este tipo de programación con mayor profusión.
Programación estructurada, la programación estructurada se basa en la creación de una función principal y
una serie de rutinas(funciones) llamadas desde la función principal, que hacen que el desarrollo sea horizontal
contrastando con la programación lineal cuyo desarrollo es vertical. También podemos indicar que la informática
en su parte de programación era: Programa = Algoritmo + Estructura de datos. La ventaja de este modelo
era importante pero todavía se seguía manejando por separado el estado del sistema que descansa en la
estructura de datos y los procedimientos que actúan sobre el sistema, tampoco hay una consistencia de datos,
esto queda librado al criterio del programador, estas desventajas y otras más se van a superar con la
programación orientada a objetos.
8.1 Programación orientada a objetos.- La programación orientada a objetos es la ultima modificación, donde
ya se incorporan algunos aspectos tomando como modelo la vida real.
Tipos de Datos Abstractos
Algunos autores describen la programación orientada a objetos como programación de tipos de datos
abstractos y sus relaciones. Vamos a tratar de estudiar este aspecto de modelo de la vida real con mas
detalles en el concepto de “Tipos de Datos Abstractos”
Creando modelos.- La informática y la automatización en general trata de resolver o facilitar la vida real
creando programas y aplicaciones para esto. Sin embargo, los problemas de la vida real no están
claramente definidos por qué primeramente hay que crear un modelo de las entidades que actúan en la vida
real, entonces lo primero que se tiene que hacer es tratar de obtener tu propia perspectiva abstracta, o
modelo, del problema. Este proceso de modelado se llama abstracción y se ilustra en la Figura 8.1.
PROBLEMA
ABSTRACCION
MODELO
Figura 8.1
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 información es
necesaria, que funciones necesitamos que trabajen: Algunas propiedades serian
DNI
Nombre
ESTRUCTURA DE DATOS
Ing.Ricardo Castañeda
162
PROGRAMACION ORIENTADA A OBJETOS 2013
4. Poder hacer instancias múltiples del tipo..
Tipos básicos de operaciones en un TDA.
Las operaciones básicas que deberíamos tener pueden ser:
Constructores: Crean una nueva instancia del tipo.
Transformación: Cambian el valor de uno o más elementos de una instancia del tipo.
Observación: Accesamos sin modificarlos.
Iteradores: Procesa componentes en forma secuencial.
Tipos Genéricos de Datos Abstractos
Los TDAs se usan para definir un nuevo tipo a partir del cual se pueden crear instancias. Como se mostró
en el ejemplo de la lista, algunas veces estas instancias deberían operar del mismo modo sobre otros tipos
de datos. Por ejemplo, uno puede pensar en listas de manzanas, carros o aún listas. La definición
semántica de una lista siempre es la misma. Solamente el tipo de los elementos de datos cambia de
acuerdo al tipo sobre el cuál debía operar la lista..
Esta información adicional podría ser especificada por un parámetro genérico que es especificado al
momento de la creación de la instancia. Así, una instancia de un TDA genérico es en la práctica una
instancia de una variante particular del TDA. Una lista de manzanas puede ser por lo tanto declarada como
sigue :
List<Apple> listOfApples;
Los corchetes angulares encierran ahora el tipo de datos para el cuál una variante del TDA genérico List
sería creada. listOfApples ofrece la misma interface que cualquiera otra lista, pero opera en instancias del
tipo Apple.
Conceptos de Orientación a Objetos
Las secciones anteriores introducen ya algunos conceptos "de orientación a objetos". Sin embargo, éstos
fueron aplicados de una manera teórica, ahora pasemos ya a visualizar las características del C++ y les
damos nombres tal y como se usan en los lenguajes de programación orientada a objetos existentes.
Las características de C++ como lenguaje orientado a objetos son:
o Abstracción
Variables de instancia
Métodos de instancia
Variables de clase
Métodos de clase
o Encapsulación
De variables: privada, pública y protegida.
De métodos: privada, pública y protegida
o Herencia
Sencilla y múltiple
Unidades genéricas
Polimorfismo
Teniendo en cuenta los conceptos de herencia y Polimorfismo tenemos todo el panorama de la
programación orientada a objetos. La comunicación entre objetos es por medios de mensajes que viene a
ser la forma de invocar a un objeto. Hemos dicho que un objeto tiene características llamadas atributos y
Ing. Ricardo Castañeda
163
FACULTAD DE INGENIERIA MECANICA 2013
procedimientos llamados métodos. Los mensajes tienen un método (procedimiento) que se ejecutara
cuando es invocado.
class rectangulo
{ private:
int largo;
int ancho;
public:
void set_largo( int l)
{ largo = l;}
void set_ancho( int a)
{ ancho = a;}
int get_largo( )
{ return(largo);}
int get_ancho( )
{ return(ancho);}
int calcular_ área( )
{ int A;
A = largo * ancho;
return ( A);}
};
Ing.Ricardo Castañeda
164
PROGRAMACION ORIENTADA A OBJETOS 2013
Representación Gráfica
Clase Rectángulo
Largo
Ancho Datos
Set_largo
Set_ancho Métodos
Calcular _area
Figura 8.4
Posteriormente nosotros podemos declarar un objeto de la clase rectángulo de la siguiente manera:
rectángulo R1;
Esto significa que R1 tendrá 4 componentes
R1.largo dato miembro de tipo entero.
R1.ancho dato miembro de tipo entero
R1.set_largo(int l) función miembro que nos permite asignar un valor a un dato miembro.
R1.set_ancho(int a) función miembro que nos permite asignar un valor a un dato miembro.
R1.get_largo( ) función miembro que nos permite devolver valor de dato miembro
R1.get_ancho( ) función miembro que nos permite devolver valor de dato miembro
R1.calcular_area( ) función miembro que calcula el área y devuelve el valor.
PROGRAMA
/* CODIGO: POOC8E1
FECHA: 21 DE MARZO DE 2013
OBJETIVO: Desarrollar un ejemplo básico de POO */
#include<iostream.h>
#include<conio.h>
class rectangulo
{ private:
int largo;
int ancho;
public:
void set_largo( int l)
{ largo = l;}
void set_ancho( int a)
{ ancho = a;}
int get_largo( )
{ return(largo);}
int get_ancho( )
{ return(ancho);}
int calcular_area( )
Ing. Ricardo Castañeda
165
FACULTAD DE INGENIERIA MECANICA 2013
{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.set_largo(L);
r1.set_ancho(A);
cout<<"El área es : "<<r1.calcular_area();
getch(); }
EJECUCION
8.4 Herencia: Característica mediante la cual podemos reutilizar una declaración 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 también adiciona.Ver ejemplo 4.
8.5 Polimorfismo: Característica que nos permite crear funciones que utilizando un mismo nombre responderán
de forma diferente de acuerdo a la clase a la cual pertenecen. Por ejemplo: Dada la siguiente declaración de
claseen el ejemplo 2:
PROGRAMA
/* CODIGO: POOC8E2
FECHA: 21 DE MARZO DE 2013
OBJETIVO: Desarrollar un ejemplo básico de POO */
#include<iostream.h>
#include<conio.h>
class rectangulo
{ private:
int largo;
int ancho;
public:
void set_largo( int l)
{ largo = l;}
void set_ancho( int a)
{ ancho = a;}
int get_largo( )
Ing.Ricardo Castañeda
166
PROGRAMACION ORIENTADA A OBJETOS 2013
{ return(largo);}
int get_ancho( )
{ return(ancho);}
int area( )
{ int A;
A = largo * ancho;
return ( A); }
};
class cuadrado
{ private:
int lado;
public:
void set_lado( int l)
{ lado = l;}
int get_lado( )
{ return(lado);}
int area( )
{ int A;
A = lado * lado;
return ( A);
} };
void main( )
{ rectangulo R1;
cuadrado C1;
R1.set_largo( 5);
R1.set_ancho( 4);
C1.set_lado(4);
clrscr();
cout << R1.area( )<<endl;
cout << C1.area( )<<endl;
getch(); }
EJECUCION
PROGRAMA(B)
/* CODIGO: POOC8PROB1B
FECHA: 21 DE MARZO DE 2013
OBJETIVO: Segundo programa ejemplo tenemos la estructura pero ya tenemos una componente función miembro de la estructura y por lo
tanto ya tiende a una clase*/
#include <iostream.h>
#include<conio.h>
struct notas
{ float nota1;
float nota2;
Ing.Ricardo Castañeda
168
PROGRAMACION ORIENTADA A OBJETOS 2013
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( );
}
EJECUCION
PROGRAMA(C)
/* CODIGO: POOC8PROB1C
FECHA: 21 DE MARZO DE 2013
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 set_nota1(float n1)
{ nota1 = n1; }
void set_nota2(float n2)
{ 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.set_nota1( a1);
Ing. Ricardo Castañeda
169
FACULTAD DE INGENIERIA MECANICA 2013
n.set_nota2( a2);
cout << " El promedio es = " << n.calcula_prom ( );
getch( ); }
EJECUCION
2.- Escriba un programa que defina la clase cuadrado y cubo además debe calcular el área del cuadrado, el área del
cubo y el volumen.
SOLUCIÓN
PROGRAMA
/* CODIGO: POOC8PROB2
FECHA: 21 DE MARZO DE 2013
OBJETIVO: Programa que define la clase cuadrado y cubo, calculando el área del cuadrado, el área del cubo y el volumen. */
#include <iostream.h>
#include<conio.h>
class cuadrado
{ private:
int lado;
public:
void set_lado( int l )
{ lado = l; }
int area( )
{ int A;
A = lado * lado;
return ( A); } };
class cubo
{ private:
int lado;
public:
void set_lado( int l )
{ lado = l; }
int area( )
{ int A;
A = 6*lado * lado;
return ( A); }
int volumen( )
{ int A;
A = lado*lado * lado;
return ( A); } };
void main( )
Ing.Ricardo Castañeda
170
PROGRAMACION ORIENTADA A OBJETOS 2013
{ cuadrado C1;
cubo C2;
int LADO;
clrscr();
cout<< "Ingrese Lado del cuadrado: ";
cin>> LADO;
C1.set_lado(LADO);
cout<< "Ingrese Lado del Cubo: ";
cin>> LADO;
C2.set_lado(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 teléfono. El programa debe crear la clase y declarando objetos de esta clase ingreasr
datos y después mostrarlos.
2) Escribir un programa que considere la clase anterior y declare un vector de objetos de esa clase, además
debe poder consultar este vector de objetos y listar los dni y nombres que viven en un determinado distrito.
3) Se tiene la clase empleado con código, sueldo, nombre y categoría, escribir las declaraciones de datos
miembros y crear las funciones miembro, de lectura, mostrar_datos y asignación de sueldos, esta ultima debe
realizarse de la siguiente manera:
Categoría A sueldo de 4500 mensual
Categoría B sueldo de 4000 mensual
Categoría C sueldo de 3000 mensual
Categoría D sueldo de 2000 mensual
4) Escriba un programa que trabaje con la clase anterior pero con vectores de objetos y que visualize todos los
empledaos por categoría..
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 código, nombre, costo y duración en horas.
CAPITULO IX
Ing.Ricardo Castañeda
172
PROGRAMACION ORIENTADA A OBJETOS 2013
9 CLASES Y CONSTRUCTORES.-
9.1 SECCIONES Y FUNCIONES MIEMBRO
9.1.1 Secciones.- Los miembros de una clase que son variables y métodos (datos y funciones) pueden ser
públicos (public), protegidos (protected) y privados (private). Las secciones privadas y protegidas tienen
como objetivo el ocultamiento de datos. A los miembros de la sección 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 públicos 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 estén definidas y en cualquier clase derivada de la clase original. De acuerdo a lo dicho la
declaración de una clase en forma general será:
class nombre_clase
{
private:
datos miembro
funciones miembro
…………………..
protected:
datos miembro protegidos
funciones miembro protegidos
…………………………………..
public:
datos miembro publicos
funciones miembro publicos
} …………………………………
9.1.2 Funciones miembro.- Las funciones miembro con componentes de una clase y normalmente se
definen dentro de la clase como funciones de línea(inline). Pero también podemos definir el cuerpo de
la función fuera de la clase. El ámbito de una función se debe indicar por el operador ámbito (:: ) con el
nombre de la clase. Ej:
PROGRAMA
/* CODIGO: POOC9E1
FECHA: 21 DE MARZO DE 2013
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 set_practica1( int p1);
void set_practica2( int p2);
float promedio( ); };
void nota :: set_practica1( int p1) { practica1 = p1;}
void nota :: set_practica2( int p2) { practica2 = p2;}
float nota :: promedio(void)
{ return ((practica1+practica2)/2.0); }
9.1.3 Constructores y Destructores.- Cuando se menciono a los punteros se dijo que se puede crear
variables apuntadas en forma dinámica (en ejecución), para crear estas se utiliza el operador new y para
liberarlas el operador delete, en la POO existen mecanismos similares. Cuando se crea un objeto es
llamado un método que se denomina constructor y al terminar (salir) se llama a otro método conocido como
destructor.
9.1.4 Constructor.- Es un método especial que construye objetos. Un constructor es llamado para crear
una instancia de ese objeto asignando espacio a un objeto pude también asignar valores a sus miembros
datos. El constructor realiza una inicialización automática y no devuelve ningún valor. Tiene el mismo
nombre que la clase con la cual está asociada. Puede tener parámetros como cualquier otra función 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; }
};
Tipos de constructores: Los constructores pueden ser:
Constructores sin argumento
Constructores con argumento
Constructores de copia
Ing.Ricardo Castañeda
174
PROGRAMACION ORIENTADA A OBJETOS 2013
Esto lo veremos en el ejemplo:
class nota
{ private : int dato;
public:
nota( )
{ }
nota(int d )
{ dato = d; }
nota( nota&y )
{ dato = y.dato; }
};
Ejemplo 2.- De un ejemplo de constructores con la estructura indicada
PROGRAMA
/* CODIGO: POOC9E2
FECHA: 23 DE MARZO DE 2013
OBJETIVO: Programa que muestra los diferentes tipos de constructores*/
#include <iostream.h>
#include<conio.h>
#include<stdio.h>
#include<string.h>
class nota
{ private : int dato;
public:
nota( ) { } //CONSTRUCTOR SIN ARGUMENTOS
nota(int d )//CONSTRUCTOR CON ARGUMENTOS
{ dato = d; }
nota( nota&y )//CONSTRUCTOR DE COPIA
{ dato = y.dato; }
void set_dato(const int val){dato=val;}
int get_dato() { return dato; }
};
void main()
{ nota d1, d2(5), d3(d2);
d1.set_dato(7);
cout<<"dato1 = "<<d1.get_dato()<<endl;
cout<<"dato2 = "<<d2.get_dato()<<endl;
cout<<"dato3 = "<<d3.get_dato()<<endl;
getch(); }
EJECUCION
Ing.Ricardo Castañeda
176
PROGRAMACION ORIENTADA A OBJETOS 2013
complejo c2;
complejo c3(c1);
cout<<"Parte real de c1= "<<c1.get_r()<<endl;
cout<<"Parte imaginaria de c1= "<<c1.get_i()<<endl;
cout<<"Parte real de c2= "<<c2.get_r()<<endl;
cout<<"Parte Imaginaria de c2= "<<c2.get_i()<<endl;
cout<<"Parte Real de c3= "<<c3.get_r()<<endl;
cout<<"Parte Imaginaria de c3= "<<c3.get_i()<<endl;
getch(); }
EJECUCION
Constructor new y destructor delete Estos dos operadores también construyen y destruyen, que es una
forma de decir también 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: Manejo de new y delete
PROGRAMA
/* CODIGO: POOC9E4
FECHA: 23 DE 2013
OBJETIVO: Programa ejemplo de new y delete */
#include <iostream.h>
#include <conio.h>
void main( )
{int *p1, *p2;
p1 = new int;//asigna la dirección 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 dirección 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 ( );}
PROGRAMA
/* CODIGO: POOC9PROB1
FECHA: 23 DE MARZO DE 2013
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];
Ing.Ricardo Castañeda
178
PROGRAMACION ORIENTADA A OBJETOS 2013
float hotemp;
float phoemp;
float pagemp;
public:
void set_codemp( int c);
void set_nomemp( char n[40]);
void set_hotemp( float h);
void set_phoemp( float p);
float pago_neto( ); };
void empleado::set_codemp( int c)
{ codemp=c; }
void empleado::set_nomemp( char n[40])
{ strcpy(nomemp,n); }
void empleado::set_hotemp( float h)
{ hotemp=h; }
void empleado::set_phoemp( float p)
{ phoemp=p; }
float empleado::pago_neto( )
{ return ((hotemp*phoemp)*0.89);}//considerando un 11% de descuento
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; emp1.set_codemp(codigo);
cout<<"Ingrese nombre del trabajador --> "; gets(nombre); emp1.set_nomemp(nombre);
cout<<"Ingrese Horas trabajadas --> "; cin>>horas_trabajadas;emp1.set_hotemp( horas_trabajadas);
cout<<"Ingrese Pago por Hora --> "; cin>>pago_hora; emp1.set_phoemp(pago_hora);
sueldo_neto= emp1.pago_neto();
cout<<"Neto a pagar = "<<sueldo_neto;
getch(); }
EJECUCION
PROGRAMA
/* CODIGO: POOC9PROB2
FECHA: 23 DE MARZO DE 2013
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 ( ) { }
// función 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
Ing.Ricardo Castañeda
180
PROGRAMACION ORIENTADA A OBJETOS 2013
3.- Desarrollar un programa que trabaje con aritmetica de punteros y maneje polinomios pudiendo desarrollar
operaciones simples con estos polinomios.
SOLUCION
PROGRAMA
/* CODIGO: POOC9PROB3
FECHA: 23 DE MARZO DE 2013
OBJETIVO: Programa que maneja la Aritmética 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++; //en aritmética de punteros se asigna p1++ para
p2++; } //suma 1 CAMPO!! al puntero no una unidad
cout<<pola<<endl;
cout<<polb<<endl;
cout<<pola+polb;
getch(); }
EJECUCION
CAPITULO X
Ing.Ricardo Castañeda
182
PROGRAMACION ORIENTADA A OBJETOS 2013
10. CLASES DERIVADAS
10.1. Definición.- La forma sintáctica 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 implicación de que
los miembros son públicos 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:
10.2. 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 set_nombre (char n[30])
{ strcpy (nombre, n); }
void set_dni ( char d[9])
{ strcpy (dni, d); }
char* get_nombre ( )
{ return(nombre);}
char* get_dni ( )
{ return(dni);}
};
class empleado : public persona // CLASE DERIVADA
{ private:
int codigo;
float sueldo;
public:
void set_codigo( int c)
{ codigo = c; }
void set_sueldo(float s)
{ sueldo = s; }
int get_codigo()
{ return (código);}
float get_sueldo { return(sueldo);}
};
Ing.Ricardo Castañeda
184
PROGRAMACION ORIENTADA A OBJETOS 2013
class cuadrado
{ protected:
int lado;
public:
virtual int área ( )
{ return (lado * lado); }
};
class cubo: public cuadrado
{ public:
int área ( )
{ return ( 6 * lado * lado); } };
PROBLEMAS
1.- Construya un programa orientado a objetos que utilice la clase base persona, con su datos miembro nombre y
DNI, además de considerar las funciones miembro asignar y mostrar; derivada de esta clase se manejara la clase
empleado que añade datos miembro código y sueldo, y redefina las funciones de la clase base.
SOLUCION
PROGRAMA
/* CODIGO: POOC10PROB1
FECHA: 24 DE MARZO DE 2013
OBJETIVO: Programa que declara 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 // CLASE BASE
{ protected:
char nombre[30];
char dni[9];
public:
void set_nombre (char n[30])
{ strcpy (nombre, n); }
void set_dni ( char d[9])
{ strcpy (dni, d); }
char* get_nombre ( )
{ return(nombre);}
char* get_dni ( )
{ return(dni);} };
class empleado : public persona // CLASE DERIVADA
{ private:
int codigo;
float sueldo;
public:
void set_codigo( int c)
Ing. Ricardo Castañeda
185
FACULTAD DE INGENIERIA MECANICA 2013
{ codigo = c; }
void set_sueldo(float s)
{ sueldo = s; }
int get_codigo()
{ return (codigo);}
float get_sueldo( ) {return(sueldo);} };
void main ( )
{ persona p1;
empleado e1;
char name[30];
char di[9];
int code;
float sb;
clrscr( );
cout << " Ingrese Nombre => "; gets(name);
cout << " Ingrese DNI => "; cin >> di;
p1.set_nombre( name);
p1.set_dni( di);
cout << " Ingrese Nombre => "; gets(name);
cout << " Ingrese DNI => "; cin >> di;
cout << " Ingrese Codigo => "; cin >> code;
cout << " Ingrese sueldo bruto => "; cin >> sb;
e1.set_nombre( name);
e1.set_dni( di);
e1.set_codigo( code);
e1.set_sueldo( sb);
cout<<"Nombre: "<< p1.get_nombre( )<<endl;
cout<<"DNI : "<<p1.get_dni( )<<endl;
cout<<"Nombre: "<< e1.get_nombre( )<<endl;
cout<<"DNI : "<<e1.get_dni( )<<endl;
cout<<"Nombre: "<< e1.get_codigo( )<<endl;
cout<<"DNI : "<<e1.get_sueldo( )<<endl;
getch( ); }
EJECUCION
Ing.Ricardo Castañeda
186
PROGRAMACION ORIENTADA A OBJETOS 2013
2.- Escriba un programa que simule un procesamiento de notas con dos sistemas de evaluación diferentes, el sistema
A : promedio de prácticas = (p1+p2+p3)/3.0. Nota final = (exapar + exafin + propra)/3.0 y el sistema B :
promedio de prácticas = (p1+p2+p3+p4)/4.0; Nota final = (exapar + 2*exafin +2* propra)/5.0.
Use clases derivadas para este fin.
SOLUCION:
PROGRAMA
/* CODIGO: POOC10PROB2
FECHA: 23 DE MARZO DE 2013
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;
int exafin ;
float propra;
float notafin;
public:
void set_code( char c[10]) { strcpy(code, c); }
void set_name(char n[40]) { strcpy( name,n); }
void set_exapar( int ep) { exapar = ep; }
void set_exafin( int ef) { exafin = ef; }
char* get_codigo( ) { return(code); }
char* get_name( ) { return(name); }
int get_exapar( ) { return(exapar); }
int get_exafin( ) { return(exafin); }
float get_propra( ) { return(propra); }
float get_notafin( ) { return(notafin); }
};
class sistemaA : public notas
{ public:
int p1, p2 , p3;
public :
void calcula_notafin ( )
{ propra = (p1+p2+p3)/3.0;
notafin = (exapar + exafin + propra)/3.0; }
};
3.- Desarrolle un programa que nos muestre claramente el concepto de Herencia múltiple, esto debe hacerlo
derivando una nueva clase de dos clases bases.
SOLUCION:
PROGRAMA
/* CODIGO: POOC10PROB3
FECHA: 23 DE MARZO DE 2013
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:
Ing. Ricardo Castañeda
189
FACULTAD DE INGENIERIA MECANICA 2013
char codcur[7];
char nomcur[30];
float notcur;
};
class matricula: public alumno, public curso
{ private:
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;
gotoxy(31,8); cout<< "Nombre : "<<nomalu;
gotoxy(31,10); cout<< "Cod. Curso : "<<codcur;
gotoxy(31,12); cout<< "Curso : "<<nomcur;
gotoxy(31,14); cout<< "Nota : "<<notcur;
gotoxy(31,16); if (ok ==1)
cout<<"MATRICULADO";
else
cout<<"MATRICULA PENDIENTE";
getch();
}
};
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<<"CODIGO : ";gets(codigo);
Ing.Ricardo Castañeda
190
PROGRAMACION ORIENTADA A OBJETOS 2013
gotoxy(31,8); cout<<"NOMBRE : ";gets(nombre);
gotoxy(31,10); cout<<"COD. CURSO : ";gets(ccurso);
gotoxy(31,12); cout<<"CURSO : ";gets(ncurso);
gotoxy(31,14); cout<<"NOTA : ";cin>>nota;
gotoxy(31,16); cout<<"PAGO : ";cin>> pago;
gotoxy(31,18); cout<<"MATRICULA SI=1 NO=0 : ";cin>>sm;
alu1.asignar(codigo,nombre,ccurso,ncurso,nota,pago,sm);
alu1.mostrar();
}
EJECUCION
Ing.Ricardo Castañeda
192
PROGRAMACION ORIENTADA A OBJETOS 2013
CAPITULO XI
Ing.Ricardo Castañeda
194
PROGRAMACION ORIENTADA A OBJETOS 2013
La palabra reservada operator.- Para hacer que un operador de C++ actúe como un operador definido
por el usuario, se debe utilizar la palabra reservada operator. El formato de sobrecarga es:
Tipo operator <op> ( lista de argumentos)
Los operadores que se pueden sobrecargar son:
Operadores Unarios.
Operador * (Indireccion)
Operador -> (Indireccion)
Operador +
Operador -
Operador ++
Operador --
Operadores Binarios.
Operador +
Operador -
Operador *
Operador /
Operador %
Operador <<
Operador >>
Operador &
Operador ^
Operador |
Operador []
Operador ()
Operadores De Asignación
Operador =
Operador +=
Operador -=
Operador *=
Operador /=
Operador %=
Operador <<=
Operador >>=
Operador &=
Operador ^=|
Operador |=
Ejemplo de sobrecarga.-
#include <iostream.h>
#include <conio.h>
class duplicado
{public:
int x;
duplicado operator++ ()
{ x = x + x; return *this; }
getch(); }
11.2.3. Sobrecarga de funciones.- Cuando una función tiene más de una definición decimos que es una
función sobrecargada. Sabemos que dos o más funciones pueden tener el mismo nombre pero para estar
sobrecargadas no deben diferir en el tipo de sus argumentos o el número de sus argumentos.
Es muy importante considerar que bastante común es sobrecargar las funciones constructoras.
/ * Ejemplo
Ejemplo dede sobrecarga
sobrecarga de funciones
de funciones */
# include<iostream.h>
# include<conio.h>
class vector
{ private:
float xm, ym;
public:
vector ( float x = 0, float y = 0)
{ xm = x;
ym = y; }
void vervector ( );
void leervector ( float &x, float &y)
{ x = xm;
y = ym; }
};
void vector :: vervector( )
{ cout << xm << “ “ <<ym<<endl; }
vector operator+ ( vector &a, vector &b)
{ float xa, ya, xb, yb;
leervector (xa, ya);
leervector (xb, yb);
return vector ( xa+ xb, ya+ yb); }
void main ( )
{ vector u(3,1), v(4,2),s;
s = u + v;
s.vervector ( ); // debe salir 7,3
getch(); }
Ing.Ricardo Castañeda
196
PROGRAMACION ORIENTADA A OBJETOS 2013
PROBLEMAS
1.- Construya un programa orientado a objetos desarrolle el polimorfismo utilizando el concepto de función virtual.
SOLUCION
PROGRAMA
/* CODIGO: POOC11PROB1
FECHA: 23 DE MARZO DE 2013
OBJETIVO: Ejemplo de Polimorfismo con funciones virtuales */
#include<iostream.h>
#include<conio.h>
class figura
{ protected:
float par1;
public:
void set_par1( 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); } };
void main ( )
{ circulo cir1;
cuadrado cua1;
float a1;
clrscr();
cout<<"Ingrese radio circulo=> "; cin>> a1;
cir1.set_par1(a1);
cout<< " Área = "<< cir1. area()<< endl;
cout<<"Ingrese lado cuadrado=> "; cin>> a1;
cua1.set_par1(a1);
cout<< " Area = "<< cua1. area();
getch(); }
EJECUCION
main( )
{ clase a(5,7); clase b(3,4); clase c;
c=a+b; //x de a más x de b ; y de a más y de b
c.visualizar( ); //c=operator +b;
getch(); }
EJECUCION
3.- Construya un programa que sobrecargue una función utilizando dos tipos de datos diferentes, la función debe ser
simple.
SOLUCION
Ing.Ricardo Castañeda
198
PROGRAMACION ORIENTADA A OBJETOS 2013
PROGRAMA
/* CODIGO: POOC11PROB3
FECHA: 23 DE MARZO DE 2013
OBJETIVO: Función 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()
{ 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: POOC11PROB4
FECHA: 23 DE MARZO DE 2013
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 común 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 inicialización 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()
{j=0;}
Ing. Ricardo Castañeda
199
FACULTAD DE INGENIERIA MECANICA 2013
base::base(int n)
{j=n;}
base::getx()
{return j;}
main()
{ int i;
base v1[10];//declaracion del array sin inicialización
base v2[10]={1,2,3,4,5,6,7,8,9,10}; //declaracion del Array con Inicializaciones
for(i=0;i<10;i++)
{ cout<<"v1["<<i<<"]-> "<<v1[i].getx()<<' ';cout<<endl;
cout<<"\t v2["<<i<<"]-> "<<v2[i].getx()<<" ";}
getch(); }
EJECUCION
Ing.Ricardo Castañeda
200
PROGRAMACION ORIENTADA A OBJETOS 2013
CAPITULO XII
Ing.Ricardo Castañeda
202
PROGRAMACION ORIENTADA A OBJETOS 2013
Supongamos que llamamos a este programa "streams.cpp", y que pretendemos que se autoimprima en pantalla:
PROGRAMA
//POOC12E2
#include <iostream>
#include <fstream>
using namespace std;
int main() {
char cadena[128];
ifstream fe("streams.cpp");
while(!fe.eof()) {
fe >> cadena;
cout << cadena << endl;
}
fe.close();
cin.get();
return 0;
}
El resultado quizá no sea el esperado. El motivo es que el operador >> interpreta los espacios, tabuladores y retornos
de línea como separadores, y los elimina de la cadena de entrada.
PROBLEMA 1.- Escribir Un programa que cree un archivo de texto donde se almacene el código y las cuatro notas de
prácticas de 10 alumnos. Escribir también el programa que las lea.
PROGRAMA 1
//POOC12E3
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
void main()
{char *nomarch="practicas.txt";
ofstream f01;
int practica[4];
char nombre[10];
f01.open(nomarch);
for(int i=0;i<10;i++)
{ cout << " Ingrese nombre: ";
gets(nombre);
cout<< " Ingrese practica 1: ";cin>>practica[0];
cout<< " Ingrese practica 2: ";cin>>practica[1];
cout<< " Ingrese practica 3: ";cin>>practica[2];
cout<< " Ingrese practica 4: ";cin>>practica[3];
f01 << nombre << ' '
<< practica[0]<<' '
Ing. Ricardo Castañeda
203
FACULTAD DE INGENIERIA MECANICA 2013
<< practica[1]<<' '
<< practica[2]<<' '
<< practica[3]<<endl; }
f01.close(); }
PROGRAMA 2
//POOC12E4
#include <iostream.h>
#include <fstream.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
void main()
{char *nomarch="practicas.txt";
ifstream f02;
int practica[10][4];
char nombre[10][10];
f02.open(nomarch);
for(int i=0;i<10;i++)
{ f02>>nombre[i];
f02>>practica[i][0];
f02>>practica[i][1];
f02>>practica[i][2];
f02>>practica[i][3]; }
f02.close();
for(int i=0;i<10;i++)
{ cout<<nombre[i]<<' '<<practica[i][0]<<' '<<practica[i][1]<<' '
<<practica[i][2]<<' '<<practica[i][3]<<endl; }
getch(); }
PROBLEMA 2.- Escribir un programa que pueda crear un archivo simple con salida formateada y otro que lea dicho
archivo.
PROGRAMA 1
//POOC12E5
/* Abrir archivo y luego escribir en el archivo */
#include <fstream>
#include <stdlib.h>
#include <iomanip.h>
#include <conio.h>
int main()
{ char nomarch[10]="dato1.txt";
ofstream f03; //salida
//abrir archivo para escritura
f03.open(nomarch);
if (f03.fail()) //verificar si se abrio con éxito
{ cerr<<"El archivo "<<nomarch<<" no se puede abrir con éxito\n"
Ing.Ricardo Castañeda
204
PROGRAMACION ORIENTADA A OBJETOS 2013
<<" verifique si el archivo en realidad existe\n";
getch();
exit(1); }
//establecer los formatos del flujo de archivo de salida de datos
f03<<setiosflags(ios::fixed)
<<setiosflags(ios::showpoint)
<<setprecision(2);
//enviar datos al archivo
f03<<"CPU "<<600.80<<endl
<<"DISCOD "<<400.00<<endl
<<"TECLADO "<<50.70<<endl
<<"MOUSE "<<15.00<<endl
<<"IMPRESORA "<<300.00;
//cerrar archivo
f03.close();
cout<<"Los datos se guardaron con éxito en el archivo: "<<nomarch<<endl;
getch();
return 0;}
PROGRAMA 2
//POOC12E6
/* Abrir un archivo para escritura y luego leer y
desplegar los datos contenidos en el */
#include <fstream>
#include <stdlib.h>
#include <iomanip.h>
#include <conio.h>
int main() //archiv4.cpp
{ char nomarch[10]="dato1.txt";
char descripcion[15];
int ch;
float precio;
ifstream f04;
//abrir archivo para lectura
f04.open(nomarch);
if (f04.fail()) //verificar si se abrio con éxito
{ cout<<"El archivo no se puede abrir con éxito\n"
<<" verifique si el archivo en realidad existe\n";
getch();
exit(1); }
//establecer los formatos del flujo de archivo de salida de datos
cout<<setiosflags(ios::fixed)
<<setiosflags(ios::showpoint)
<<setprecision(2);
Ing.Ricardo Castañeda
206
PROGRAMACION ORIENTADA A OBJETOS 2013
12.3. Programas básicos de creación y lectura de un archivo de nombres
a) // Programa que crea un archivo de nombres llamado nombres.dat en A
//POOC12E7
-#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<fstream.h>
void main()
{ ofstream f1;
char nomper[30];
int i,n;
f1.open("C:nombres.dat",ios::out|ios::binary);
clrscr();
cout<< " Ingrese numero de registros a crear => ";
cin >>n;
for(i=1;i<=n;i++)
{ cout<<"Ingrese nombre"<<i<<": ";
gets(nomper);
f1.write(nomper,sizeof(nomper)); }
f1.close(); }
EJECUCION
c) /* POOC12E8
FECHA: 23 DE MARZO DE 2013*/
#include<iostream.h>
#include<conio.h>
#include<stdio.h>
#include<fstream.h>
void main()
{ ifstream f2;
char nomper[30];
f2.open("C:nombres.dat",ios::in|ios::binary);
clrscr();
cout<< " Lista de nombres"<<endl;
cout<< "==============="<<endl<<endl;
Ing. Ricardo Castañeda
207
FACULTAD DE INGENIERIA MECANICA 2013
while(!(f2.eof()))
{ f2.read(nomper,sizeof(nomper));
If(!(f2.eof()))
cout<<nomper<<endl; }
getch();
f2.close(); }
EJECUCION
12.4. Operaciones con archivos.- Sabemos que un archivo es una colección de registros y cada registro
es un conjunto de variables con un nombre común pero con su propio identificador
Las operaciones con archivos son en realidad operaciones sobre sus registros que son las componentes
unitarias de los archivos. Estas son:
Creación
Eliminación
Adición
Modificación
Consulta
Proceso
El detalle de cada operación la veremos en los problemas resueltos.
12.5. Archivos binarios con acceso aleatorio.- Si nosotros utilizamos registros como las componentes
naturales de un archivo entonces al tener estos registros una longitud fija podremos realizar operaciones con
acceso aleatorio o directo. Podemos manejar el acceso el acceso directo mediante la función seekg( ) que
nos permite acceder al archivo de un modo directo. La función seekg() pertenece a la clase ifstream.
Forma General
flujoarch.seekg( desplazamiento, origen)
Donde:
desplazamiento: indica a cuantos bytes (con signo) se desea acceder con respecto al origen
origen: representa un valor predefinido en ios.(Ver tabla)
Constante Significado
ios:: beg Principio del archivo
ios:: cur Posición actual del archivo
ios:: end Fin del archivo
Ing.Ricardo Castañeda
208
PROGRAMACION ORIENTADA A OBJETOS 2013
Ejemplos:
a) Posicionarse al inicio del archivo alumnos.dat que reside en el disco A.
Solucion: indicaremos las líneas principales del programa
struct regalu
{ char codalu[10];
char nomalu[40];
char diralu[40];
}
fstream f01;
f01.open(“A:alumnos.dat”,ios::in|ios::out|ios::binary);
f01.seekg(ios::beg)
b) Posicionarse en el segundo registro del archivo anterior:
tamano= sizeof(regalu);
f01.seekg(tamano*(2-1),ios::beg)
c) Posicionarse en el registro anterior al registro actual:
f01.seekg(-tamano,ios::cur);
PROBLEMAS
1.- Construya un programa que nos permita crear un archivo, cuyo registro contenga los siguientes campos:
Registro de almacen:
codalm char[8] …………..Codigo del item de almacen
desalm char[40] …………Descripción del item de almacen
codpro char[8] …………Codigo del proveedor del almacen
ubialm char[4] …………..Ubicación del item dentro del almacen ej:A17, D121
nunalm entero ………… Stock del producto(item).
coualm real ……………Costo unitario del ítem
SOLUCION
PROGRAMA
/* CODIGO: POOC12PROB1
FECHA: 23 DE MARZO DE 2013
OBJETIVO: Programa crea archivo de almacen */
/* PROGRAMA QUE CREA UN ARCHIVO COMPUESTO DE REGISTROS */
# include<iostream.h>
# include<conio.h>
# include<fstream.h>
# include<stdio.h>
struct almacen
{ char codalm[8] ; // código del ítem
char desalm[40] ; // descripción del ítem
char codpro[8] ; // código del proveedor
2.- Construya un programa que nos permita leer el archivo anteriormente creado.
SOLUCION
Ing.Ricardo Castañeda
210
PROGRAMACION ORIENTADA A OBJETOS 2013
PROGRAMA
/* CODIGO: POOC12PROB2
FECHA: 23 DE MARZO DE 2013
OBJETIVO: Programa lee archivo de almacen */
# include<iostream.h>
# include<conio.h>
# include<fstream.h>
struct almacen
{ char codalm[8] ; // código del ítem
char desalm[40] ; // descripción del ítem
char codpro[8] ; // código del proveedor
char ubialm [4] ; // ubicación del ítem
int nunalm ; // número de unidades del ítem
float coualm ; } ;// costo unitario del ítem
void main( )
{ int cont=2;
almacen registro ;
fstream fluent;
clrscr( );
fluent.open( "C:stock.dat", ios :: in | ios:: binary); // Se abre archivo para lectura
gotoxy(2,cont);cout<< "CODIGO DESCRIPCION PROVEEDOR UBICACION #UNIDADES COSTO/UNIT ";
cont=cont+1;
gotoxy(2,cont);cout<< "================================================================";
cont=cont+2;
while ( ! fluent.eof( ) )
{ fluent.read( ( unsigned char *) ®istro, sizeof(registro)); // se lee registro
if (!fluent.eof())
{gotoxy(2,cont);cout <<registro.codalm;
gotoxy(10,cont);cout <<registro.desalm ;
gotoxy(30,cont);cout<<registro.codpro;
gotoxy(40,cont);cout<<registro.ubialm ;
gotoxy(50,cont);cout<<registro.nunalm ;
gotoxy(63,cont);cout<<registro.coualm ;
cont=cont+1;} }
getch(); fluent.close ( ); }
EJECUCION
/* CODIGO: POOC12PROB12
# include<iostream.h>
# include<conio.h>
# include<fstream.h>
# include<string.h>
struct almacen
{ char codalm[8] ;
char desalm[40] ;
char codpro[8] ;
char ubialm [4] ;
int nunalm ;
float coualm ; } ;
struct lista
{ char desalm[40] ;
char codpro[8] ; };
void main( )
{ almacen registro ;
fstream fr;
int i,n=0;
lista l[50];
clrscr( );
fr.open( "A:stock.dat", ios :: in | ios:: binary);
gotoxy(4,3);cout<< "CODIGO DESCRIPCION"<<endl;
while ( ! fr.eof( ) )
{fr.read( ( unsigned char *) ®istro, sizeof(registro));
if (! fr.eof())
{ n = n +1;
strcpy(l[n].desalm,registro.desalm);
strcpy(l[n].codpro,registro.codpro); }
}
for( i = 1; i <=n; i++)
{ gotoxy(4,i+3);cout <<l[i].codpro;
Ing.Ricardo Castañeda
212
PROGRAMACION ORIENTADA A OBJETOS 2013
gotoxy(14,i+3);cout <<l[i].desalm; }
getch(); fr.close ( ); }
EJECUCION
4.- Escriba un programa que me permita crear y mostrar el archivo de proveedores, el registro debe tener la siguiente
estructura:
Registro proveedor
codpro char[8]………………Código del proveedor
nompro char[40] …………….Nombre del proveedor
teluro char[9] ……………..Teléfono del proveedor
Solucion
PROGRAMA
/* CODIGO: POOC12PROB4
FECHA: 22 DE MARZO DE 2013
OBJETIVO: CREA Y MUESTRA ARCHIVO DE PROOVEDORES*/
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<stdio.h>
struct proveedor
{ char codpro[8] ; // código del proveedor
char nompro [40] ; // nombre proveedor
char telpro[9] ; // teléfono del proveedor
};
void main( )
{proveedor buf ;
EJECUCION
Ing.Ricardo Castañeda
214
PROGRAMACION ORIENTADA A OBJETOS 2013
5.- Escriba un programa que me permita consultar el proveedor de un producto (item) de almacen. Este programa
debe manejar dos archivos que tienen la siguiente estructura:
Registro proveedor
codpro char[8]………………….Código del proveedor
nompro char[40] ………………..Nombre del proveedor
teluro char[9] …………………Teléfono del proveedor
Registro de almacen:
codalm char[8] …………..Codigo del item de almacen
desalm char[40] …………Descripción del item de almacen
codpro char[8] …………Codigo del proveedor del almacen
ubialm char[4] ………….Ubicación del item dentro del almacen ej:A17, D121
nunalm entero …………..Stock del producto(item).
coualm real ……………Costo unitario del ítem
PROGRAMA
/* CODIGO: POOC12PROB5
FECHA: 23 DE MARZO DE 2013
OBJETIVO: CONSULTA ITEM DE ALMACEN PARA INDICARME CUAL ES EL PROVEEDOR DEL PRODUCTO*/
#include<iostream.h>
#include<conio.h>
6.- Escriba un programa que liste todos los proveedores de los productos del stock.
Ing.Ricardo Castañeda
216
PROGRAMACION ORIENTADA A OBJETOS 2013
PROGRAMA
/* CODIGO: POOC12PROB6
FECHA: 23 DE MARZO DE 2013
OBJETIVO: Consulta item de almacen para indicarme cual es el proveedor del producto, lista de proveedores */
#include<iostream.h>
#include<conio.h>
#include<fstream.h>
#include<string.h>
struct almacen
{ char codalm[8] ;
char desalm[40] ;
char codpro[8] ;
char ubialm [4] ;
int nunalm ;
float coualm ; } ;
struct lista
{ char desalm[40] ;
char codpro[8] ; };
void main( )
{ almacen registro ;
fstream fr;
int i,n=0;
lista l[50];
clrscr( );
fr.open( "C:stock.dat", ios :: in | ios::binary);
gotoxy(5,3);cout<< " CODIGO DESCRIPCION";
while ( ! fr.eof( ) )
{ fr.read( ( unsigned char *) ®istro, sizeof(registro));
if (! fr.eof())
{ n = n +1;
strcpy(l[n].desalm, registro.desalm);
strcpy(l[n].codpro, registro.codpro); }
}
for( i = 1; i <=n; i++)
{ gotoxy(5,4+i);cout << l[i].desalm ;
gotoxy(30,4+i);cout << l[i].codpro ; }
getch();
fr.close ( );
}
Ing.Ricardo Castañeda
218