Sei sulla pagina 1di 222

PROGRAMACION ORIENTADA A OBJETOS

2013

UNIVERSIDAD NACIONAL DE INGENIERA


FACULTAD DE INGENIERA MECNICA

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


INDICE
1 CONCEPTOS GENERALES DE COMPUTACION..... 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 Computadora...... Componentes de una computadora..... El sistema informatico.. Algoritmos Lenguajes de Programacion... Tipos de Programacin... Diseo de Algoritmos....... Objetos_datos de Entrada/salida........ Procesos Directos o Secuenciales..... 06 06 06 06 06 07 07 09 10 10 13 16 17 21 21 22 26 29 42 44 44 45 46 46 47 47 47 49 50 53 60 60 64 73 80 82 82

2013

1.10 Esructuras de decisin simple.... 1.11 Estructuras de decisin anidada....... 1.12 Estructuras de decisin multiple....... 1.13 Estructuras Repetitivas 1.13.1 Estructuras Mientras....... 1.13.2 Estructuras Hacer Mientras........ 1.13.3 Estructuras Para Problemas... Ejercicios propuestos....... 2 ESTRUCTURA DE UN PROGRAMA BORLAND C++... 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3 Organizacion de un programa Borland C++. Estructura General de un Programa en Borland C++. Elementos de un Programa en C++.. Tipos de variables estndar en C++. Constantes. Variables.. Entrada y salida simple en C++. Secuencias de Escape.. Manipulacion y formato de datos de salida.

Problemas ESTRUCTURAS DE CONTROL EN C.. 3.1 3.2 Expresiones y operadores Estructuras de Control en Lenguaje C.....

Problemas Ejercicios propuestos....... 4 FUNCIONES EN LENGUAJE C++... 4.1 Funciones Predifinidas ( De Biblioteca)....

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


4.2 Funcines Definidas por el Usuario.. 4.2.1 4.2.2 4.3 4.4 4.5 Ubicacin del prototipo, la llamada y la funcin en lenguaje C++.. Comunicacin entre funciones. 91 92 92 94 94 95 97 104 107 107 107 107 117 117 120 130 132 132 134 137 140 143 145 145 146 146 146 147 151 163 165 165 168 168 170 170 171 175

2013

Funciones Inline.. Funciones Recursivas.. Punteros a Funciones..

Problemas.. Ejercicios Propuestos. 5 ARREGLOS EN LENGUAJE C. 5.1 5.2 5.3 5.4 5.5 Definicion.. Acceso a elementos.... Operaciones con arrays unidimensionales. Arregos de 2 dimensiones.... Operaciones con matrifes...

Problemas.... Ejercicio propuestos.... 6 CADENAS EN C++.. 6.1 6.2 6.3 Lectura de una cadena del teclado. Funciones para Manejar cadenas.. Vectores de cadenas

Problemas.... Ejercicio propuestos.... 7 REGISTROS EN LENGUAJE C++ 7.1 7.2 7.3 7.4 7.5
Modelamiento de un registro de acuerdo a las entidades del mundo real

Creacion y manejo de Registros..


Acceso a miembros del registro ... Inicializacin de estructuras .. Asignacin de estructuras ..

Problemas. Ejercicio propuestos.... 8 CONCEPTOS DE LA PROGRAMACION ORIENTADA A OBJETOS. 8.1 8.2 8.3 8.4 8.5 Programacion orientada a objetos.. Clases.... Objeto.. Herencia.... Polimorfismo....

Problemas. Ejercicio propuestos....

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


9 CLASES Y CONSTRUCTORES.. 9.1 Secciones y funciones miembro. 9.1.1 9.1.2 9.2 9.2.1 9.2.2 10 Secciones.. Funciones miembro.. Constructor.. Destructores.. 177 177 177 177 178 178 180 182 187 187 187 188 188 188 189 198 198 198 198 198 200 201 206 206 210 210 210 210 212 212 213

2013

Constructores y destructores.

Problemas. HERENCIA Y CLASES DERIVADAS.. 10.1 Definicion... 10.2 Clases Derivadas.... 10.3 Herencia multiple 10.4 Funciones amigas 10.5 Funciones virtuales Problemas.... 11 POLIMORFISMO. 11.1 Via funciones virtuales 11.2 Sobrecarga de operadores y funciones.. 11.2.1 Introduccion.... 11.2.2 Sobrecarga de operadores.... 11.2.3 Sobrecarga de funciones.. Problemas. 12 FLUJOS Y ARCHIVOS. 12.1 Archivos de texto..... 12.2 Archivos Binarios.... 12.2.1 Introduccion.. 12.2.2 Entrada/Salida por archivos... 12.2.3 Apertura de un archivo... 12.3 Operaciones con archivos.. 12.4 Archivos binarios con acceso aleatorio. Problemas.

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

CAPITULO I

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


1. CONCEPTOS GENERALES DE COMPUTACION 1.1. Computadora

2013

Es un conjunto de circuitos electrnicos, que es capaz de recibir un flujo de entrada (Datos), procesarlo de acuerdo a un conjunto de instrucciones (Programa) y emitir un flujo de salida (Resultados). 1.2. Componentes De Una Computadora De acuerdo a la definicin anterior, la computadora necesita dos elementos importantes, llamadas componentes, para conseguir sus objetivos y estas son: o Hardware.- Es la parte fsica, consiste en un conjunto de unidades conectadas entre si por los llamados buses de comunicacin, este hardware tambin se conecta con una serie de dispositivos externos que nos permiten ingresar informacin a la computadora y adems tomar informacin de ella de tal manera que sirva a nuestros fines, estos dispositivos son los llamados perifricos, estos pueden ser de entrada, salida o de entrada/salida. Las unidades mencionadas son: Unidad de Entrada Unidad Central de Procesamiento, que se compone de: o o o Unidad de Control Unidad aritmetica y lgica.

Unidad de Memoria (Memoria RAM) Unidad de salida Buses de Comunicacin

Los perifricos son: Perifricos de entrada: Teclado, Mouse, Micrfono, Scanner, cmara digital, Lector de cdigos de barras, Lpices pticos, Joystick. Perifricos de salida: Monitor, Impresora, Parlantes, Plotter, Audfonos, Fax, Data Show. Perifricos de entrada/salida: disco duro, Cd, memoria USB, disco flexible, DVD.

Software.- Es la parte lgica nos permite manejar el hardware y obtener los resultados esperados, existe 3 tipos de software: Software base: Los sistemas operativos como el DOS, Windows, UNIX . Software aplicado: Son los famosos paquetes como el Word (Procesador de texto), Excel (Hoja de clculo), Power Point y otros. Software de uso general: Son los lenguajes de programacin que nos permiten escribir programas de uso especfico. Ejemplos: Visual C, Java, Visual FoxPro.

1.3. El Sistema Informtico Un sistema informtico es un sistema que nos ayuda a automatizar procesos mediante el manejo adecuado de la informacin, la construccin de un sistema informtico lo podemos considerar en las siguientes etapas: Anlisis Diseo Programacin Implementacin 1.4. Algoritmos Los programas y los algoritmos son en realidad una misma secuencia de solucin solamente la utilizacin de cada uno de ellos tiene variantes.

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


el desarrollo de un proceso. Los algoritmos se pueden clasificar en tres tipos:

2013

Definicin De Algoritmo.- Un algoritmo es la descripcin ordenada paso a paso de la solucin de un problema o

Algoritmo literal: Nos permite la comunicacin de persona a persona una de sus formas ms conocidas es el SEUDOCDIGO. Algoritmo grfico: Nos permite visualizar la lgica de la solucin. Se le conoce tambin como DIAGRAMA DE FLUJO Algoritmo codificado: Nos permite la comunicacin entre la persona y la mquina (Computadora) . Se le conoce como PROGRAMA.

1.5. Lenguajes de Programacion.- Los programas y los Lenguajes De Programacin Los lenguajes de programacin nos permiten construir programas para aplicaciones especificas, estos lenguajes normalmente tienen su mbito de aplicacin 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 cientfico creado especialmente para la realizacin de clculos. COBOL.- Su nombre proviene de COmmon Busines Oriented Lenguaje, es un lenguaje para manejo de informacin comercial creado especialmente para la realizacin de procesos. Actualmente tenemos una variedad de lenguajes, desde bajo nivel hasta alto nivel, una breve descripcin seria: Lenguaje de maquina: Es una secuencia de bits, que realmente son seales elctricas (normalmente 0 voltios y 5 voltios) que para el computador sern los ceros y unos llamados tambin bits, por ejemplo: 01011001 00001101 La programacin con este lenguaje es muy dificultosa y normalmente se recurre a otro lenguaje nemotcnico llamado ensamblador. Lenguaje ensamblador: donde las instrucciones y los dispositivos se reemplazan por cdigos nemotcnicos con lo cual se facilita tremendamente la programacin, dependiendo del procesador, tendramos 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. Lenguaje de alto nivel: Nos permiten realizar muchas operaciones con pocas instrucciones, estas instrucciones se parecen al lenguaje que usamos comnmente (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 instruccin as como tambin el manejo casi al nivel de mquina, por lo tanto es de nivel intermedio. 1.6. Tipos de Programacin La programacin ha evolucionado desde la primera vez que fue utilizada y se ha modificado sobre todo por la opinin y contribucin de los expertos programadores, la secuencia ha sido:

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


Programacin lineal

2013

Se colocan todas las sentencias en el programa principal, a medida que la aplicacin realiza nuevas tareas y se afina el programa crece en forma vertical, antiguamente este tipo de programacin predominaba pero no es muy prctico. Programacin estructurada: Es una programacin modular donde el programa principal solo se utiliza para llamar a los mdulos que realizan las tareas, si la tarea de un modulo se vuelve ms compleja se divide en otros mdulos, aqu el crecimiento es horizontal. Los dos casos anteriores se veran as grficamente: Programacin Lineal Programa 1xxx .. . .. .. .. Fin Programa 1xxx, con mas tareas .. . .. .. .. .. .. .. Fin

Programacin estructurada
Programa principal Subprog01 Subprog02
Subprog02

Subprog01

Subprog03
Subprog03

Subprog01.1

Programa principal Subprog01 Subprog02 Subprog03

Subprog01, con mas tareas Subprog01.2 Subprog02

Subprog03

Programacin orientada a objetos Es una programacin en la cual los datos y los procedimientos se encapsulan y adems se le agrega niveles de visibilidad, para simular un poco mejor lo que ocurre en los procesos del mundo real. Aqu ya intervienen los conceptos de clases, herencia y polimorfismo, como se ver en el captulo correspondiente.

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


1.7. Diseo del algoritmo

2013

El algoritmo es la piedra fundamental de la programacin pues los programas y el sistema en general ser tan bueno como buenos sean los algoritmos utilizados para la construccin de este. En realidad un algoritmo es la descripcin de una secuencia de solucin 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. Grficamente lo consideramos como sigue:

INICIALIZAR LEER

PROCESAR
ESCRIBIR
Seudocdigo y diagrama de flujo El seudocdigo es un algoritmo literal cuya semejanza con el lenguaje de programacin (cdigo) lo hace muy til para la fase de previa a la escritura del programa despus el programa podr fcilmente 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 Castaeda 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 cout<< "Desaprobatoria"; getch( ); }

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

En cambio el objetivo del diagrama de flujo es visualizar rpidamente la lgica del algoritmo.
INICIO Leer (Nota) Nota >= 10? V Escribir Aprobado FIN F Escribir Desaprobado

Diagrama de Flujo Pero las tres herramientas representan lo mismo y por eso tambin se clasifican como: Algoritmo literal (seudocdigo) Permite la comunicacin Persona Persona Algoritmo codificado (programa) Permite la comunicacin Persona Computadora Algoritmo grfico (diagrama de flujo) Visualiza la lgica. Como vemos cada tipo de algoritmo tiene su propia utilidad, pero nos damos cuenta que son herramientas paralelas. 1.8. Objetos_Datos de Entrada/Salida Los procesos estndares 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 bsicos: o o o Procesos secuenciales. Procesos de decisin. Procesos de repeticin.

1.9. Procesos Directos o Secuenciales Los procesos por defecto son secuenciales o directos y su objetivo es realizar un clculo o un procedimiento. Son los casos ms 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 Como vemos en el ejemplo seguimos la secuencia leer, procesar, escribir. Ejemplo 1.3: Escriba un algoritmo que lea un total de horas y lo exprese en semanas das y horas. Si lee 400 horas debe escribir 2 semanas, 2 das y 16 horas.

10

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


ALGORITMO total_horas, semanas, das y horas son enteros. resto es entero 1.- Leer (total_horas) 2.- semanas total_horas/168 // Calcular Semanas 3.- resto 4.- das 5.- horas total_horas semanas*168 // resto de divisin resto/24 resto das *24 // calcular das // calcular horas

2013

6.- Escribir (semanas, das, horas) 7.- FIN PROGRAMA /* CODIGO:POO1E3 PROGRAMA CREADO POR RICARDO CASTAEDA 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:

11

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


devuelva el valor de la funcin. ALGORITMO A, B, C, x y f1 son reales 1.- INICIO 3.- Escribir("Ingrese coeficientes de A*x^2 +B*x +C ") 4.- Escribir( " A = ") 5.- Leer(A) 4.- Escribir( " B = ") 5.- Leer(B) 4.- Escribir( " C = ") 5.- Leer(C) 6.- escribir(" Ingrese argumento x = ") 7.- Leer(x) 8.- f1 A*x*x +B*x+C 9.-Escribir ( f1(x) = ,f1) 10.- FIN PROGRAMA /* CODIGO: POOC1E4 PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA FECHA: 17 DE MARZO DE 2013 OBJETIVO: Programa secuencial que calcula una funcin de la forma f1(x) = A*x^2 +B*x +C ; los coeficientes A, B y C sern ledos, 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(); }

2013

Ejemplo 1.4: Escriba un algoritmo que lea los coeficientes de una funcin cuadrtica, tambin el argumento y me

12

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


Forma General Si (Condicin) Entonces ............... ...........(Bloque1) ............... [Sino ............... ...........(Bloque2) ............] Fin Si

2013

1.10. Estructuras de Decisin Simple (Si) .- Nos permite derivar el control hacia uno de dos puntos del algoritmo.

Funcionamiento.- Se evala la condicin, 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 instruccin. Nota: La forma sin el else se utiliza bastante y por eso la indicamos. Si (Condicin) 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 Nota = 15 Si (Nota > 10) Entonces Escribir(Aprobado) FinSi Escribir(FIN) Segmento de Algoritmo Nota = 9 Si (Nota > 10) Entonces Escribir(Aprobado) FinSi Escribir(FIN) Segmento de Algoritmo Nota = 8 Si (Nota > 10) Entonces Escribir(Aprobado) Sino Escribir(Desaprobado) FinSi Escribir(FIN) Salida de Ejecucin Salida de Ejecucin Salida de Ejecucin

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 FinSi Menor1 dato2 Ing. Ricardo Castaeda

13

FACULTAD DE INGENIERIA MECANICA


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

2013

14

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

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.

# 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

15

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


completamente dentro de otra, veamos

2013

1.11. Estructuras de decisin anidada: Esto sucede cuando una estructura de decisin est contenida

1 Si (Condicin1) 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 decisin con la condicin2, estar anidada en la estructura de decisin con la condicin1, veamos un ejemplo. Ejemplo 1.9: Escriba el algoritmo que me permita leer una nota y escribir la condicin acadmica del alumno en el curso: De 0 a 6 condicin Reprobado De 6 a 10 condicin Desaprobado De 10 a 16 condicin Aprobado De 16 a 20 condicin 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)

16

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


Entonces 2.2.1 Escribir(Excelente) Sino 2.2.2 Escribir(Aprobado) FinSi FinSi 3.- FIN PROGRAMA /* CODIGO: POOC1E9 PROGRAMA CREADO POR RICARDO CASTAEDA 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

2013

1.12.

Estructuras de Decisin Mltiple (case).- Nos permite derivar el control hacia uno de varios puntos del algoritmo.

Forma General Case (ndice) 1: ............... (Bloque1) Ing. Ricardo Castaeda

17

FACULTAD DE INGENIERIA MECANICA


2: ............... (Bloque2) 3: ............... (Bloque3) n: ........... (Bloque n) Sino : ........ (Bloque por defecto) Fin Case Funcionamiento.- Se evala 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 continuacin se pasa a la siguiente instruccin. Veamos un ejemplo:

2013

Ejemplo 1.10: Escriba un algoritmo que lea los dos operandos ( valor1 y valor2) lea tambin el operador (+, - , * /) y ejecute la operacin indicada. Solucion: ALGORITMO valor1, valor2, resultado son reales operador es carcter 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 operacin) Fin Case 5.- FIN

18

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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 operacin"; } getch( ); } EJECUCION

2013

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)

19

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


Fin Case 2.4 Case (uni) 1 : Escribir( y Uno) 2 : Escribir (y Dos) 3 : Escribir (y Tres) 4 : Escribir( y Cuatro) 5 : Escribir (y Cinco) 6 : Escribir (y Seis) 7 : Escribir( y Siete) 8 : Escribir (y Ocho) 9 : Escribir (y Nueve) Fin Case Sino 2.5 Escribir( Fuera del rango) Fin Si 3.- FIN PROGRAMA /* 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( ); }

2013

20

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


EJECUCION

2013

1.13. Estructuras Repetitivas 1.13.1. Estructura Mientras.- Nos permite ejecutar varias veces un conjunto de instrucciones. Forma General Mientras (Condicin) ............................ ....(Bloque Mientras) ........................ Fin Mientras Funcionamiento.- Se evala la condicin, si esta se cumple (es verdadera) se ejecuta el bloque mientras, se vuelve a evaluar la condicin y si esta se sigue cumpliendo se vuelve a ejecutar el bloque y as se seguir repitiendo mientras la condicin sea verdadera, si en alguna evaluacin la condicin ya no se cumple termina la repeticin y se pasa a la siguiente instruccin. Ejemplo 1.12: Algoritmo que lee 10 valores y me muestra la suma y el promedio de los valores ledos. ALGORITMO /* Halla suma y promedio de 10 valores ledos */ valor, suma , cont son enteros promedio es real 1. 2. 3. cont 0 suma 0 Mientras ( cont < 10) 3.1 Leer(valor) 3.2 suma suma + valor 3.3 4. 5. 6. 7. cont cont + 1 Fin Mientras promedio suma/10.0 Escribir ( Suma = , suma) Escribir ( Promedio =, promedio) Fin

21

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


PROGRAMA /* CODIGO: POOC1E12 PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA FECHA: 17 DE MARZO DE 2013 OBJETIVO: Hallar suma y promedio de 10 valores ledos */ # include<iostream.h> # include<conio.h> void main( ) { int valor, suma, cont; float promedio; clrscr( ); cont = 0; suma = 0; while ( cont < 10 ) { cout<< " valor = "; cin >> valor; suma = suma + valor; cont = cont + 1; // cont ++ } promedio = suma/10.0; cout << " Suma = "<< suma<< endl; cout << " Promedio = " << promedio; getch( ); } EJECUCION

2013

1.13.2. Estructura Hacer - Mientras.- Nos permite ejecutar varias veces un conjunto de instrucciones, esta estructura repetitiva primero ejecuta y despus prueba la condicin. Forma General Hacer ......................... ........................... (Bloque sentencias) ...................... Mientras(Condicin)

22

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

Funcionamiento.- Primero se ejecuta el bloque de sentencias y despus se evala la condicin, si esta se cumple (es verdadera) se ejecuta nuevamente el bloque, se evala nuevamente la condicin y si esta se sigue cumpliendo se vuelve a ejecutar el bloque y as se seguir repitiendo mientras la condicin sea verdadera, si en alguna evaluacin la condicin ya no se cumple termina la repeticin y se pasa a la siguiente instruccin. La diferencia con el bloque mientras es el orden en la evaluacin de la condicin (expresin

booleana en general) y la ejecucin 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 ledos. 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 CASTAEDA DE LA ROSA FECHA: 17 DE MARZO DE 2013 OBJETIVO: Hallar suma y promedio de 10 valores ledos, con el do while */ # include<iostream.h> # include<conio.h> void main( ) { int valor, suma, cont; Ing. Ricardo Castaeda

23

FACULTAD DE INGENIERIA MECANICA


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

2013

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.10.2 1.10.3 1.10.4 FinCase Mientras ( opcion <> 5) 2. FIN Ing.Ricardo Castaeda 1: Funcion1() 2: Funcion2() 3: Funcion3() 4: Funcion4()

24

PROGRAMACION ORIENTADA A OBJETOS


PROGRAMA /* CODIGO: POOC1E14 PROGRAMA CREADO POR RICARDO CASTAEDA 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'); }

2013

25

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


EJECUCION

2013

1.13.3.

Estructura Para.- Nos permite ejecutar varias veces un conjunto de instrucciones un nmero fijo de veces.

Forma General Para vc = vi, vf, vinc ......................... ........................... ....(Bloque Para) ........................ Fin Para Donde: vc variable de control, llamado tambin 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 despus 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 3 4 5 vc vi Se ejecuta rango del lazo para vc vc + vinc Si ( vc <= vf ) Entonces 5.1 Ir a paso (3 )

26

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


6 1 FIN Ejemplo 1.15: Que imprime el siguiente algoritmo Para i = 1,12,2 Escribir ( i) Fin Para 2 Escribir ( FIN) Solucin: De acuerdo a lo dicho y considerando lo siguiente: vc es i : vi = 1 : Imprimir: 1 3 5 7 9 11 FIN vf = 12: vinc = 2

2013

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 ledos, ojo no usa contador, pero i cumple esa funcin */ 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) 2.2. Suma suma + valor

Fin Para
3. 4. 5. 6.

Promedio suma/10.0 Escribir ( Suma = , suma) Escribir ( Promedio =, promedio) Fin

PROGRAMA /* CODIGO: POOC1E16 PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA FECHA: 17 DE MARZO DE 2013 OBJETIVO: Halla la suma y el promedio utilizando una instruccion for. */ #include<iostream.h> #include<conio.h> void main( ) { int valor, suma, i; float promedio;

27

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


clrscr( ); suma = 0; cout<<"Lectura de valores: "<<endl; for ( i=1; i<=10; i++ ) { cout<< " valor"<<i<<": "; cin >> valor; suma = suma + valor; } promedio = suma/10.0; cout << " Suma = "<< suma<< endl; cout << " Promedio = " << promedio; getch( ); } EJECUCION

2013

NOTA : Observe los siguientes puntos El for ( Para) de C++ , inicializa la variable de control i (ndice), indica la condicin a verificar para ejecutar una vez ms el lazo y tambin indica el valor en que se debe incrementar la variable de control. La variable i es una variable de control pero es interna, nosotros no podemos modificar su valor. El ultimo valor de i en los dos casos ( algoritmo y programa) es 11.

28

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


PROBLEMAS ALGORITMOS SECUENCIALES

2013

1.- Escriba un algoritmo que lea una cantidad en grados centgrados y lo muestre como grados Fahrenheit. Implemente el algoritmo el Borland C++ para visualizar los datos de entrada y la emisin de resultados Solucin: ALGORITMO grados_c , grados_f son reales 1. 2. 3. 4. 5. INICIO Leer (grados_c) grados_f 32 + (9/5)*grados_c Escribir(grados_f) FIN

PROGRAMA /* CODIGO: POOC1PROB1 PROGRAMA CREADO POR RICARDO CASTAEDA 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 funcin getch() pide un caracter } EJECUCION

2.- Dado los datos de planilla de un empleado, nombre, cdigo, sueldo bruto mensual, horas extras y das faltos (asumiendo que el descuento sobre el total es de 15%); escriba un algoritmo que procese esta informacin y me muestre el sueldo neto que el empleado recibir. Implemente el algoritmo el Borland C++ para visualizar los datos de entrada y la emisin de resultados

Solucin

29

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


ALGORITMO /*Declaracion de Variables*/ nomemp es cadena subemp es real codemp es entero largo hexemp es real difemp es entero sunemp es real despor es real desfal es real destot es real bonificacin es real 1. 2. 3. 4. 5. 6. 7. 8. 1. 2. 3. 4. 5. 6. 7. 8. INICIO despor 0.15 /* Valor de descuento porcentual es de 15%*/ Leer (nomemp) Leer (codemp) Leer (subemp) Leer (hexemp) Leer (difemp) /* Leemos nombre del empleado*/ /* Leemos cdigo del empleado*/ /* Leemos sueldo bruto del empleado*/ /* Leemos horas extras mensuales*/ /* Leemos das faltos en todo el mes*/

2013

bonificacin (subemp/240)*(hexemp*1.5) /* bonificacin por horas extras*/ desfal (subemp/30)*difemp /*calculamos descuento por faltas*/ destot desfal+(subemp-desfal+ bonificacin)*despor/*Descuento total*/ sunemp subemp+ bonificacin-destot /*calculando sueldo bruto*/ Escribir(Nombre = ,nomemp) Escribir(Cdigo = ,codemp) Escribir(Descuentos= ,destot) Escribir(Neto FIN = ,sunemp)

PROGRAMA /* CODIGO: POOC1PROB2 PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA FECHA: 17 DE MARZO DE 2013 OBJETIVO: LEER DATOS DE PLANILLA DE UN EMPLEADO Y CALCULA SUELDO NETO A PAGAR */ #include<iostream.h> #include<conio.h> #include<stdio.h> void main() { char nomemp[30]; long codemp; float subemp,sunemp; float despor,desfal,destot; float bonificacion; float hexemp;

30

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


int difemp; clrscr(); despor=0.15; //Leemos datos de planilla cout<< "INGRESO DE DATOS:"<<endl<<endl; cout<<"Ingrese nombre= ";gets(nomemp); cout<<"Codigo = ";cin>>codemp; cout<<"Sueldo Bruto= ";cin>>subemp; cout<<"Dias faltos = ";cin>>difemp; cout<<"Horas extras = ";cin>>hexemp; //Calculos de planilla bonificacion = (subemp/240)*(hexemp*1.5); desfal = (subemp/30)*difemp; destot = desfal + (subemp-desfal+bonificacion)*despor; sunemp = subemp+bonificacion-destot; //Mostramos Resultados cout<<endl<<endl; cout<<"RESULTADOS:"<<endl<<endl; cout<<" Nombre: "<<nomemp<<endl; cout<<" Codigo: "<<codemp<<endl; cout<<" Descuento: "<<destot<<endl; cout<<" Neto getch(); } EJECUCION : "<<sunemp<<endl;

2013

ALGORITMOS CON ESTRUCTURAS DE DECISIN SIMPLE 3.Escriba un algoritmo que lea los coeficientes de una ecuacin cuadrtica de la forma a.x^2 + b.x + c = 0, y halle las dos races. Implemente el algoritmo el Borland C++ para ingresar los coeficientes y mostrar las races.

Solucin: ALGORITMO /*Declaracin de Variables*/

31

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


a, b, c son reales d es real raiz1, raiz2 son reales iraiz1, iraiz2 son reales 1. INICIO 2. Leer (a, b. c) 3. d b^2 4*a*c 4. Si (d >= 0) Entonces 4.1. Si (d = 0) Entonces 4.1.1. raiz1 -b/(2*a) 4.1.2. Escribir(Las dos races son iguales) 4.1.3. Escribir(Raz = ,raiz1) Sino 4.1.4. raiz1 (-b/(2*a)) + sqrt(d) 4.1.5. raiz2 (-b/(2*a)) - sqrt(d) 4.1.6. Escribir (raiz 1 = ,raiz1) 4.1.7. Escribir (raiz 2 = ,raiz2) Fin Si Sino 4.2. 4.3. 4.4. 4.5. 4.6. Fin Si 5. FIN PROGRAMA /* CODIGO: POOC1PROB3 PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA FECHA: 17 DE MARZO DE 2013 OBJETIVO: CALCULA LAS RAICES DE UNA ECUACION CUADRATICA */ #include<iostream.h> #include<conio.h> #include<math.h> void main() { float a,b,c; float d; float raiz1,raiz2; clrscr(); cout << "Ingrese coeficientes de a.x^2 + b.x + c = 0 separados por blancos: "; cin>>a>>b>>c; Escribir(Las races son imaginarias) raiz1 (-b/(2*a)) raiz2 sqrt(-d) Escribir(raiz1 = ,raiz1, +i ,raiz2) Escribir(raiz2 = ,raiz1, i ,raiz2)

2013

32

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


d= b*b - 4*a*c; if ( d >= 0) if ( d==0) { raiz1 = (-b/(2*a)); cout<< "Las dos raices son iguales"<<endl; cout<< "Raices = "<<raiz1; } else { raiz1 = (-b/(2*a)) + pow(d,0.5); raiz2 = (-b/(2*a)) - pow(d,0.5); cout<< " Raiz 1 = "<<raiz1<<endl; cout<< " Raiz 2 = "<<raiz2<<endl; } else { cout<<"Las raices son imaginarias"<<endl; raiz1=(-b/(2*a)); raiz2 = pow(-d,0.5); cout<< "Raiz 1 = "<< raiz1 << " + i"<<raiz2<<endl; cout<< "Raiz 2 = "<< raiz1 << " - i"<<raiz2<<endl; } getch(); } EJECUCION

2013

4.- Escriba un algoritmo que lea cuatro prcticas y halle el promedio. Las reglas son: a) b) c) d) De no rendir alguna prctica el valor almacenado en esa prctica ser 99. De promediarse algn 99 el valor tomado para el promedio ser de 0. De existir algn 99 se promediara las otras tres prcticas. De haber rendido las cuatro prcticas se eliminara la menor.

Solucin: ALGORITMO /*Declaracin de Variables*/ p1, p2, p3, p4, menor1, menor2, menort son enteras promedio es real INICIO 1. Leer (p1) 2. Leer (p2)

33

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


3. Leer (p3) 4. Leer (p4) 5. Si (p1= 99) Entonces 5.1. Si (p2=99) Entonces p2 0 FinSi 5.2. Si (p3=99) Entonces p3 0 FinSi 5.3. Si (p4=99) Entonces p4 0 FinSi 5.4. promedio (p2+p3+p4)/3.0 Sino 5.5. Si(p2=99) Entonces 5.5.1. Si (p3=99) Entonces p3 0 FinSi 5.5.2. Si (p4=99) Entonces p4 0 FinSi 5.5.3. promedio (p1+p3+p4)/3 Sino 5.5.4. Si (p3=99) Entonces 5.5.4.1. 5.5.4.2. 5.5.4.3. 5.5.4.4. Si (p4=99) Entonces p4 0 FinSi promedio(p1+p2+p4)/3.0 Sino Si (p4=99) Entonces 5.5.4.4.1. Sino 5.5.4.4.2. Si (p1<p2) Entonces 5.5.4.4.2.1 menor1 p1 Sino 5.5.4.4.2.2 menor1p2 FinSi 5.5.4.4.3. Si (p3<p4) Entonces 5.5.4.4.3.1 menor2 p3 Sino 5.5.4.4.3.2 menor2p4 FinSi 5.5.4.4.4. Si (menor1< menor2) Entonces 5.5.4.4.4.1 menort menor1 Sino 5.5.4.4.4.2 menortmenor2 FinSi 5.5.4.4.5. promedio (p1+p2+p3+p4-menort)/3.0 promedio (p1+p2+p3)/3.0

2013

34

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


FinSi FinSi FinSi FinSi 6. Escribir(El promedio es : ,promedio) 7. FIN PROGRAMA /* CODIGO:POOC1PROB4 PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA FECHA: 17 DE MARZO DE 2013 OBJETIVO: CALCULAR PROMEDIO DE CUATRO PRACTICAS REGLAS QUE OBEDECE EL PROGRAMA: a) b) c) d) De no rendir alguna prctica el valor almacenado en esa prctica ser 99. De promediarse algn 99 el valor tomado para el promedio ser de 0. De existir algn 99 se promediara las otras tres prcticas. De haber rendido las cuatro prcticas se eliminara la menor. */

2013

#include<iostream.h> #include<conio.h> void main() { int p1, p2, p3, p4; float promedio; int menor1, menor2, menort; clrscr(); cout<<" P1= ";cin>>p1; cout<<" P2= ";cin>>p2; cout<<" P3= ";cin>>p3; cout<<" P4= ";cin>>p4; if (p1==99) { if(p2==99) p2=0; if(p3==99) p3=0; if(p4==99) p4=0; promedio =(p2+p3+p4)/3.0; } else if(p2==99) {if(p3==99) p3=0; if(p4==99) p4=0; promedio =(p1+p3+p4)/3.0; } else if (p3==99) {if (p4==99) p4=0; promedio =(p1+p2+p4)/3.0; } else if (p4==99)

35

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


promedio = (p1+p2+p3)/3.0; else {if(p1<p2) menor1=p1; else menor1=p2; if(p3<p4) menor2=p3; else menor2=p4; if(menor1<menor2) menort=menor1; else menort=menor2; promedio=(p1+p2+p3+p4-menort)/3.0; } cout<<"El promedio es : "<<promedio; getch(); } EJECUCION (Caso 3: no rindi 1 prctica)

2013

5.- Escriba un algoritmo que me permita hallar la fecha del da siguiente dada la fecha de un da 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

Solucin: ANALISIS Tenemos tres casos 1.- Fin de ao: en este caso hay que comprobar si el mes es 12 (Diciembre) y el da es 31; en este caso se inicializa da y mes y se incrementa el ao.

36

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

2.- Fin de mes: en este caso hay que comprobar si es el ltimo da del mes o sea puede ser mes 6 y da 30 mes 7 y da 31 o mes 2 y da 29 pero en ao bisiesto; en este caso se inicializa el da, el mes se incrementa en 1 y el ao permanece igual. 3.- El caso no es ni fin de ao ni fin de mes: se incrementa da; mes y ao permanecen igual. ALGORITMO /*Declaracin de Variables*/ da, mes, ao son enteras cond1,cond2,cond3,cond4 son enteras 1. INICIO 2. Leer (da) 3. Leer (mes) 4. Leer (ao) 5. cond1 (da=31) i (mes=12) /*Condicin cambio de ao*/ 6. cond2 (da=31) i ((mes=1)o(mes=3)o(mes=5)o(mes=7)o(mes=8)o(mes= 10))/*Cambio de mes.(31 das)*/ 7. cond3 (da=30) i ((mes=4)o(mes=6)o(mes=9)o(mes=11))/*Cambio de mes.(30 das)*/ 8. cond4 ((da=28) i (mes=2) i (ao%4)!=0)) o ((da=29) i (mes=2) i (ao%4)= 0))/*Cambio de mes. febrero*/ 9. Si (cond1) Entonces 9.1. da 1 9.2. mes1 9.3. aoao+1 Sino 9.4. Si (cond2 o cond3 o cond4) Entonces 9.4.1. da 1 9.4.2. mesmes +1 Sino 9.4.3. dadia+1 FinSi FinSi 10. Escribir(dia,mes.ao) 11. FIN PROGRAMA /* CODIGO:POOC1PROB5 PROGRAMA CREADO POR RICARDO CASTAEDA 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 Castaeda

37

FACULTAD DE INGENIERIA MECANICA


cout<<"Ingrese mes entre 1 y 12 ==> "; cin>>mes; cout<<"Ingrese ao entre 1900 y 2010 ==> "; cin>>a; cond1 = (dia==31)&&(mes==12); /*Condicin cambio de ao*/ 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 }

2013

ALGORITMOS CON ESTRUCTURAS DE DECISIN MULTIPLE 6.- Escriba un algoritmo que lea el precio de un artculo y el nmero de cuotas, calculando el pago mensual de acuerdo al siguiente cuadro: - 1 cuota. 0% de inters - 2 cuotas 3% de inters. - 4 cuotas 7% de inters - 5 cuotas 9% de inters. - 10 cuotas 20% de inters. - 12 cuotas 25% de inters. - 24 cuotas 60% de inters. ALGORITMO precio, pago_mes son reales numero_c es entera 1. 2. 3. 4. INICIO Leer (precio) Leer (numero_c) Case(digito) 1: pago_mes precio escribir(pago_mes) 2: pago_mes precio*(1+0.03)/numero_c

38

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


escribir(pago_mes) 4: pago_mes precio*(1+0.07)/numero_c escribir(pago_mes) 5: pago_mes precio*(1+0.09)/numero_c escribir(pago_mes) 10: pago_mes precio*(1+0.20)/numero_c escribir(pago_mes) 12: pago_mes precio*(1+0.25)/numero_c escribir(pago_mes) 24: pago_mes precio*(1+0.60)/numero_c escribir(pago_mes) Sino: escribir(Error el numero de cuotas no es vlido) Fin Case 5. FIN

2013

PROGRAMA /* CODIGO: POOC1PROB6 PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA FECHA: 17 DE MARZO DE 2013 OBJETIVO: Lee precio de un articulo y numero de cuotas y calcula pago mensual */ # include<iostream.h> # include<conio.h> void main( ) { float precio, pago_mes; int numero_c; clrscr(); cout<< " Ingrese precio del articulo: "; cin>>precio; cout<< " Ingrese numero de cuotas: "; cin>>numero_c; switch( numero_c) { case 1: pago_mes = precio; cout<< "Pago mensual= "<<pago_mes; break; case 2: pago_mes = precio*(1+0.03)/numero_c; cout<< "Pago mensual= "<<pago_mes; break; case 4: pago_mes = precio*(1+0.07)/numero_c; cout<< "Pago mensual= "<<pago_mes; break; case 5: pago_mes = precio*(1+0.09)/numero_c; cout<< "Pago mensual= "<<pago_mes; break; case 10:pago_mes = precio*(1+0.20)/numero_c; cout<< "Pago mensual= "<<pago_mes;

39

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


break; case 12:pago_mes = precio*(1+0.25)/numero_c; cout<< "Pago mensual= "<<pago_mes; break; case 24:pago_mes = precio*(1+0.60)/numero_c; cout<< "Pago mensual= "<<pago_mes; break; default : cout<< " Error el numero de cuotas no es valido"; getch( );} EJECUCION }

2013

ALGORITMOS CON ESTRUCTURAS DE REPETICIN 7.- Escriba un algoritmo que calcule la serie exponencial con 3 dgitos decimales exactos. Solucin ANALISIS La serie exponencial es e = 1 + x/1! +x /2! + x /3! +x /n! + x Vemos que esta serie se inicializa con el valor 1. La secuencia (Regla de formacin) en el numerador es x ,x ,x .. numerador numerador *x, valor inicial 1 En el denominador es 0!, 1!, 2!, 3! o sea denominador denominador * i (i es el orden de la iteracin o tambin contador). Los 3 dgitos decimales exactos significan un error menor o igual a 0.0005(0.5 x 10 ), adems el error de la serie se estima como el primer termino despreciado o s si tomamos n trminos el error ser x Nota. x debe estar en el rango [0 1] ALGORITMO /*Declaracin de Variables*/ expx, termino, numerador, x son reales cont, denominador son enteros 1. INICIO 2. error 1 3. maxerror 0.0005 4. expx 1 5. numerador 1 6. denominador1 7. contador1 8. Leer (x) 9. Mientras (error>= maxerror) 9.1. numerador numerador*x
(n+1) -3 0 1 2 x 2 3 n (n+1)

/(n+1)!....

/(n+1)!

40

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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 librera y valor calculado. 11. FIN PROGRAMA
/* CODIGO: POOC1PROB7 PROGRAMA CREADO POR RICARDO CASTAEDA 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 funcin de biblioteca es:"<<exp(x)<<endl; getch(); }

2013

EJECUCION

41

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


EJERCICIOS PROPUESTOS

2013

1. Escriba un algoritmo y programa que lea tres valores que representen los lados de un tringulo y me indique si el tringulo es escaleno, issceles o equiltero. 2. Escriba un algoritmo que genere 4 valores al azar entre 1 y 13 (cuatro cartas de una baraja de casinos) y me indique si tenemos un par, 2 pares , un tro o un pker ( cuatro iguales). 3. Escriba un algoritmo que lea una expresin aritmtica entera y me entregue el 4. Por ejemplo lee 3 + 5 7 y escribe 1 cuando ingresamos el operador =. 5. Escriba un algoritmo y programa que lea n valores y me entregue el mayor de todos, el menor de todos y el promedio final.( n ser ledo tambin). 6. Crear un algoritmo que nos permita calcular
( )

resultado final.

7. Escriba un algoritmo que nos permita hallar la fecha del dia anterior, dada la fecha de cualquier dia.

42

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

CAPITULO II

43

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

2 ESTRUCTURA DE UN PROGRAMA BORLAND C++.


2.1 Organizacin de un Programa Borland C++: Se compone de los bloques: Directivas del PreProcesador Include Macros Datos y funciones externas Datos y Funciones Globales void main( ) {. ........... }

Directivas del Preprocesador: Permite que se realicen ciertas tareas antes que la compilacin se efecte. Las directivas son normalmente #include y #define. Ejemplo: # include <math.h> // incluye el archivo fuente en C++ de las libreras matemticas # include <conio.h> // incluye el archivo fuente de manejo de pantalla # define PI 3.1416 // indica que PI es equivalente a 3.1416 Tambin: # include <nombre_archivo> // Busca en directorio por defecto # include nombre_archivo// Busca en directorio actual y luego en directorio por defecto

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 funcin main(). Es el punto de inicio de la ejecucin de un programa En programas simples todo el cdigo 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(); }

En programas ms complejos el cdigo va en las funciones

44

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


void main ( ) { leer ( ); procesar_planilla( ); imprimir_planilla( ); } Lo visualizamos as: void main() { } void leer( ) { } void procesar_planillar( ) { } void inprimir_planillar( ) { } 2.2

2013

Estructura General de un programa en Borland C++. Introduccin .- Un programa en C++ se compone de una o ms funciones. Por lo menos debe existir la funcin main(), una funcin es un grupo de instrucciones que realizan una tarea (o tareas). Un programa nos permite incluir una serie de archivos de cabecera, que tambin contiene definiciones y otras funciones. Ejemplo : Programa que realiza una suma utilizando funciones y variables globales.

# include<iostream.h> # include<conio.h> /* Variables globales */ int operando1, operando2; int resultado; /* funciones globales, declaracin de prototipos */ void leer( ); void sumar( ); void escribir( ); void main( ) { leer ( ); sumar ( ); escribir ( ) ; } /* desarrollo de las funciones */ void leer ( ) { clrscr(); cout<< Operando1= ; cin >> operando1; cout<< Operando2= ; cin >> operando2; } void sumar ( ) { resultado = operando1 + operando2; } void escribir ( ) { clrscr(); cout<< Suma = << resultado ; getch(); }

45

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

Creacin de un Programa.- Para crear y ejecutar un programa hay que realizar las siguientes etapas: Utilizando un editor de texto escribimos el programa y lo grabamos, este programa grabado ser el archivo fuente del programa. Genera nombre.cpp Traduccin del programa a lenguaje de maquina o un cdigo entendible por el computador, llamado tambin compilacin, se genera el cdigo objeto. Genera nombre.obj Enlace del cdigo objeto con los cdigos de las diferentes libreras producindose el cdigo ejecutable. Genera nombre.exe

Compilacin, enlace y ejecucin.- El editor, el compilador y la ejecucin estn disponibles en el entorno integrado del Borland C++. El editor en el men edit El compilador en Project La ejecucin en el men debug (depuracin).

2.3

Elementos de un programa en C++.- Se compone de elementos llamados tokens, que pueden ser identificadores, palabras reservadas, comentarios, signos de puntuacin, separadores y archivos de cabecera.

Identificadores.- Cadenas de caracteres sirven para identificar cualquier elemento de un programa como constantes, variables, funciones etc. Ejemplo: lnea, leer_datos, valor, suelo, PI. Todo identificador est compuesto por letras, dgitos y el carcter subrayado, el primer carcter debe de ser una letra.

Palabras reservadas.- Son identificadores que son utilizados por el sistema y no pueden ser utilizados para otros fines. Ejemplo: char, return, break, if etc.

Comentarios.- Nos entregan informacin sobre el programa pero no son procesables. Existen dos tipos en C

/* ........*/ Comentario se puede hacer por varias lneas /* Realizado por: AAAAAAAAAA Fecha: 99/99/99 Calcula aaaaa */ // Comentario para el final de la lnea

contador = contador + 1; // Incremento unitario del contador

Signos de puntuacin: 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 lnea. Archivos de cabecera.- Nos permiten incluir archivos al momento de compilacin.

2.4

Tipos de Variables estndar en C++.- Datos estndar quiere decir aceptados por todos, en C++ tenemos como en la mayora de lenguajes enteros, reales y carcter. Entero int 9 digitos long 9 digitos 4 bytes 4 bytes Ing.Ricardo Castaeda

46

PROGRAMACION ORIENTADA A OBJETOS


Real float 3.4 x 10 a 3.4 x 10 4 bytes -308 308 double 1.7 x 10 a 1.7 x 10 8 bytes -4932 3932 long double 3.4 x 10 a 3.4 x 10 10bytes char Char -128...... 127 Unsigned char 0..255 1 byte 1 byte
-38 38

2013

2.5

Constantes.- Se clasifican en: Constantes literales. ( Escritas directamente en el programa) Enteras. 125, 100, 0x372 Reales. 1.25E-4, 75.25 Carcter. A, n Cadena. jose ruiz, ------------ Constantes definidas(Simblicas). Definidas mediante #define #define linea --------------- #define maximo 1000 #define raiz2 1.4142

Constantes enumeradas. Se utilizan para clarificar un programa, un ejemplo seria: enum frutas { naranja, papaya, fresa, limn}, inmediatamente el compilador asocia un numero de orden a cada elemento, el primero ser 0 (naranja)

Constantes declaradas. Se declara con el formato const tipo nombre = valor; ejemplo: const int dias_mes = 30; const char[ ] titulo = MENU PRINCIPAL

2.6

Variables.- Se le asigna una posicin de memoria cuyo contenido si puede ser modificado, al contrario de las constantes que no pueden ser modificadas. La variable tiene un identificador, un tipo de valor que almacena y una direccin. Su forma general es: Tipo nombre [= valor]; Ejemplo: int contador = 0, suma = 0; float raiz = 1.0; long factorial=1;

2.7

Entrada y salida simple en C++.- La entrada y salida bsica en C++ se realiza utilizando los flujos cin y cout. El flujo cin(entrada) conecta el dispositivo por defecto de enatrada(teclado) con el sistema. El flujo cout(salida) conecta el programa con el dispositivo asignado por defecto a la salida(Pantalla). Para colocar informacin en cout se utiliza el operador sobrecargado << y para tomar informacin en cin se utiliza el operador sobrecargado >>. Veamos el ejemplo 1.-

47

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

PROGRAMA

/* CODIGO: POOC2E1 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Mostrar la salida en pantalla utilizando el operador << y el flujo cout, con constantes y variables. */ # include<iostream.h> # include<conio.h> #define linea1 "|---------------------------------------------------|" #define linea2 "|---------------------------------------------------|" void main( ) { int i; clrscr(); cout<<linea1<<endl; cout<<'|'; for (i=1;i<=20;i++) cout<<i<<" "; cout<<'|'<<endl; cout<<linea2; getch(); }

EJECUCION

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

48

Ing.Ricardo Castaeda

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 carcter nueva lnea (decimal 10) y \t ser tabulacin horizontal. La tabla es:. Secuencia Valor \a \b \f \n \r \t \v 0x07 0x08 0x0C 0x0A 0x0D 0x09 0x0B Smbolo BEL BS FF LF CR HT VT Que hace Sonido audible (bell) Retroceso (backspace) Salto de formato (formfeed) Saltar una lnea (linefeed) Retorno de carro (carriage return) Tabulacin horizontal (H Tab) Tabulacin 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() ; } } Ing. Ricardo Castaeda

49

FACULTAD DE INGENIERIA MECANICA

2013

EJECUCION

2.9. Manipulacin y formato de datos de salida.- El precisar con cuantos decimales debe mostrarse nuestros datos de salida y que ancho y otras caractersticas se llama dar formato a la salida. Cuando deseamos manejar este formato lo podemos realizar de la siguiente manera: 1. Mediante el uso de funciones miembro de un objeto de flujo. Su sintaxis es la siguiente: nombreObjetoInvocador.nombreFuncionMiembro(listaArgumentos ); cout.width( 5 ); cout.fill( '*' ); cout.precision( 3 ); 2. Mediante el uso de funciones especiales llamadas manipuladores, con o sin argumentos. cout << flush; cout << endl; cout << setw( 6 ) << 12 << endl; cout << seprecision( 2 ) << 12.325 << endl; 3. Mediante el uso de banderas (indicadores) como argumentos de la funcin miembro setf( ) del objeto de flujo: cout.setf( ios::fixed ); cout.setf( ios::showpoint ); Veamos la tabla de manipuladores de flujo de salida: MANIPULADOR dec hex FUNCION QUE REALIZA Establece la base decimal. Establece la base hexadecimal

50

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


oct endl ends Establece la base octal. Inserta nueva lnea y cambia de flujo Inserta un cero nulo al final de la cadena. flush setbase(int n) resetiosflags(long f) setiosflag( long f) Vaca el flujo Establece la conversin de base. Limpia el formato especificado por f. Establece formato especificado por f. setfill(int c) setprecision(int n) Rellena con el carcter c. Establece precisin de punto flotante a n. setw(int n) Establece el ancho de campo a w.

2013

Ejemplo 4.- Veamos un ejemplo de dec,oct y hex. PROGRAMA /* CODIGO: POOC2E4 PROGRAMA CREADO POR RICARDO CASTAEDA 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

Tabla de indicadores de formato:

51

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


INDICADOR ios::left LO QUE REALIZA Justifica a la izquierda dentro de setw. ios::rigth ios::scientific Justifica a la derecha dentro de setw. Muestra nmeros en notacin cientfica. ios::fixed ios::dec ios::hex ios::oct ios::uppercase Muestra en formato de punto fijo. Formatea a base 10. Formatea a base 16. Formatea a base 8. Formatea la parte literal a mayscula. ios::showbase Ios::showpos Ios::showpoint Imprime el prefijo de base. Imprime signo Completa con ceros.

2013

Ejemplo 5.- Veamos un ejemplo que maneje la precisin 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 nmero de dgitos 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(); }

52

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


EJECUCION

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

53

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

Nota: Observe algunos detalles, las variables son globales, por lo tanto los contadores se inicializan automticamente desde cero. Adems num es una variable entera solo debe permitir valores de 5 cifras pero se sobrepasa, quiere decir que el tipo entero ocupa ms de dos bytes (4 bytes). 2.- Escribamos un programa que nos permita realizar operaciones con nmeros complejos, este programa realizara la suma, resta y multiplicacin con nmeros complejos, la divisin se deja como tarea para el estudiante. PROGRAMA /* CODIGO: POOC2PROB2 PROGRAMA CREADO POR RICARDO CASTAEDA DE LA ROSA FECHA: 18 DE MARZO DE 2013 OBJETIVO: Halla suma, resta y multiplicacin de nmeros 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.- Multiplicacin "; gotoxy(30,9);cout<<"4.- Divisin "; 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";

54

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

55

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

3.- Escriba un programa que utilice la definicin 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 } }

56

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

4.- Elaborar un programa que haga clculos para generar una boleta de ventas incluyendo el IGV, considere el uso de salida formateada y tambin la funcin gotoxy(). PROGRAMA /* CODIGO: POOC2PROB4 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Maneja la funcin 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<<"------------------"; }

57

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


gotoxy(53,9+i);cout<<"TOTAL gotoxy(53,10+i);cout<<"IGV "<<setw(6)<<total; "<<setw(6)<<igv;

2013

gotoxy(53,11+i);cout<<"----------------------"; gotoxy(53,12+i);cout<<"TOTAL A PAGAR "<<setw(7)<<sumatotal; getch(); } EJECUCION

58

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

CAPITULO III

59

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

3 ESTRUCTURAS DE CONTROL EN C
3.1 Expresiones y operadores
Expresiones.- Una expresin es una secuencia de operadores y operandos, aunque tambin podemos

tener algunas expresiones que salen de este formato. Ejemplo : a = *c; p1 = &c; numero ++.
Operadores aritmticos.- Nos permiten realizar las operaciones aritmticas bsicas sean del tipo real

(float) o entero, considerando que en lenguaje C se define el tipo de operacin por los operandos, si al menos un operando es del tipo float la operacin se realizara en el modo real.

Operador + + * / % ++ -Ejemplo : 4%3 ser 1

Entero Unitario mas Unitario menos Suma Resta Producto Cociente de divisin entera Resto de divisin entera Incremento Decremento
y 3%4 ser 3 ; 10/4 ser 2

Real . Unitario mas Unitario menos Suma Resta Producto Cociente real

y 10/4.0 ser 2.5

En el primer caso la divisin es 1 y el resto 1. En el segundo caso la divisin es 0 y el resto 3 En el tercer caso la divisin es 2 y en el cuarto caso la divisin 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; 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 de asignacin, relacin, lgicos y desplazamiento.-

Operadores de asignacin.- Consideramos el smbolo = operador de asignacin. Por ejemplo podemos colocar cont1 = cont2 = cont3 = 0; Le asignamos el valor cero a los tres contadores pero esta operacin se realiza de izquierda a derecha. Tambin podemos abreviar c+=5 ; que es equivalente a c = c +5, tenemos la siguiente tabla Operador += -= *= /= %= Abreviatura a+=b a-=b a*=b a/=b a%=b Sentencia a=a+b a=a-b a=a*b a=a/b a=a%b

Operadores relacionales.- Relacionan operandos enteros o reales pero su resultado es booleano, estos son: a == b uno si es verdadero y cero si a no es igual a b a != b uno si es verdadero y cero si a no es igual a b

60

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


a < b uno si es verdadero y cero si a no es igual a b a > b uno si es verdadero y cero si a no es igual a b a <= b uno si es verdadero y cero si a no es igual a b a >= b uno si es verdadero y cero si a no es igual a b

2013

Pero tambin podemos tener a = b > c en cuyo caso a valdr 1 si b es mayor que c y cero en caso contrario. Operadores lgicos.- Son el not el and y el or, Relacionan operandos booleanos y su resultado es booleano, estos son: Negacin ! el not lgico And && el and . para que sea verdadero sus dos operandos deben ser verdaderos. Or || el or . para que sea verdadero basta que un operando sea verdadero.

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 CASTAEDA 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 => "; cin >> numero; while ( numero >= 10) { digito = numero % 10; num_inv = num_inv*10 + digito; numero = numero / 10; } num_inv = num_inv*10 + numero ; cout << " El numero invertido sera = " << num_inv; getch(); EJECUCION }

Operadores Especiales.- Existen otros operadores que pasaremos a revisar o Operadores de Direccin.- Tenemos los siguientes *accede el campo apuntado. & Devuelve la direccin del operando Ing. Ricardo Castaeda

61

FACULTAD DE INGENIERIA MECANICA


Ejemplo 2: Escriba un programa que maneje punteros de forma bsica. PROGRAMA /* CODIGO: POOC3E2 PROGRAMA CREADO POR RICARDO CASTAEDA 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

2013

cout << "Direccion de a almacenada en p1 ==> "<<hex << p1<< endl; // Imprime la direccin de a contenida en p1 cout << dec; // vuelve al formato decimal p1 =&b; getch(); } EJECUCION // p1 toma la direccin de b cout << "Nuevo valor apuntado por p1==> "<<*p1; // muestra valor almacenado en el campo apuntado por p1(b)

. Accede a un miembro de un objeto o variable estructurada Accede a un miembro de un objeto apuntado por el operando de la izquierda.

Operador Condicional.- Su forma es

expresion_c ? expresion_v : expresion_f v1 > v2 ? v1 : v2 devuelve el mayor valor de v1 ),Operador[ , v2 Operador Coma, Operador( ], Operador : . Coma combina expresiones a> b , c > 10 // a mayor que b , c mayor que 10 ( ) Llama a funciones y tambin altera prioridad [ ] Acompaa a los arrays :: Indica mbito empleado. void empleado :: planilla ( ) // indica la funcin planilla perteneciente a

62

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

2,3 o 12 pierde el juego 7 u 11 gana el juego Otra suma vuelve a jugar

b) A partir de la segunda jugada el jugador sigue las reglas


a. b.

Si repite la primera suma gana 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 ) ) cout << " Gano juego" ; else if ( (juego1 == 2) || (juego1 == 3 ) || ( juego1== 12)) cout << " Perdio juego"; else { do { dado1 = random(6) + 1; dado2 = random(6) + 1; juego = dado1 + dado2; cout<<juego<<endl; } while ( ( juego != juego1) && ( juego != 7)); if ( juego == juego1) cout << "Gano juego"; else cout << "Perdio juego"; } getch(); } EJECUCION Ing. Ricardo Castaeda

63

FACULTAD DE INGENIERIA MECANICA

2013

3.2 ESTRUCTURAS DE CONTROL EN LENGUAJE C Son las siguientes:

Sentencia if else Sentencia switch Sentencia while Sentencia do while Sentencia for.

Sentencia if .- Nos permite derivar el control hacia uno de dos puntos del programa. Forma General if ( condicin) {......(1)............. ; .....................; } [else { .........(2)..........; ...................; }] ss

Funcionamiento: Se evala la condicin, si esta se cumple se ejecuta el bloque 1, caso contario se ejecuta el bloque 2, si existe. Finalmente pasa el control de ejecucin a la siguiente sentencia(ss). Ejemplos: If(nota > 10) cout<< Curso Aprobado;

If((numero%2)==0) cout<< El numero es par; else cout<<El numero es impar;

Sentencia if anidada.- Se dice que una sentencia esta anidada dentro de otra cuando una de ellas (la externa) contiene completamente las sentencias de la otra(la interna o anidada). Veamos esto: if (condicion1) { .; ..; ; if(condicion2) {..; .; ; }

64

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

.; } 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 tambin anidado en el if con condicion1. Ejemplo 4.- Programa que lee un nmero y me muestra si es mltiplo de 3, 4 o 5. /* CODIGO: 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 if (numero >99) if(numero %3==0) cout<<" Numero de tres cifras y multiplo de 3"; else cout<<" Numero de tres cifras y no es multiplo de 3"; else if(numero%3==0) cout<<" Numero de dos cifras y multiplo de 3"; else cout<<" Numero de dos cifras y no es multiplo de 3"; } else cout<<"Numero fuera del rango"; getch(); } EJECUCION

65

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

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 CASTAEDA 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; if (nota2>mayor) mayor = nota2; if (nota3>mayor) mayor = nota3; //Calculando promedio promedio= (nota1+nota2+nota3+mayor-menor)/3.0; cout<<"El promedio es : "<<promedio; getch(); } EJECUCION

Ejemplo 6.- Escriba un programa que lea 20 edades y me indique cuantos son :

66

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


Bebes (0-5aos) Nios (5-12 aos) Adolescentes (12-16 aos) Jvenes (16-25) Adultos (25-50) Mayores (50 a mas)

2013

PROGRAMA /* CODIGO: POOC3E6 FECHA: 18 de MARZO DE 2013 OBJETIVO: Ejemplo que lee 20 edades y me indique cuantos son :Bebes (0-5aos),Nios (5-12 aos), Jvenes (16-25),Adultos (25-50), Mayores (50 a mas) */ # include<iostream.h> # include<conio.h> void main( ) { int edad,i; int contb=0;//contador de bebes int contn=0;//contador de nios int conta=0;//contador de adolescentes int contj=0;//contador de jovenes int contd=0;//contador de adultos int contm=0;//contador de mayores clrscr (); for(i=1;i<=20;i++) { cout<< " ingrese edad "<<i<< " : ";cin>>edad; if ( edad>=0) if (edad<=5) contb=contb+1; else if (edad<=12) contn=contn+1; else if(edad<=16) conta=conta+1; else if (edad <=25) contj=contj+1; else if (edad<=50) contd=contd+1; else contm=contm+1; } //Mostrando resultados cout<<contb<< " bebes"<<endl; cout<<contn<< " nios"<<endl; cout<<conta<< " adolescentes"<<endl; cout<<contj<< " jovenes"<<endl; cout<<contd<< " adultos"<<endl; Adolescentes (12-16 aos),

67

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


cout<<contm<< " mayores"<<endl; getch(); } EJECUCION

2013

Sentencia switch.- Deriva el control hacia uno de varios puntos del programa, permite realizar una seleccin mltiple. Forma General

switch ( expression) { case const 1 : ................... ; ....................; break; case const 2 : ................... ; ....................; break; case const 3 : ................... ; ....................; break; case const 4 : ................... ; ....................; break; [ default : .....................; .....................; break;] } Funcionamiento: La expresin de control o selector se evala y se compara con cada una de las etiquetas de case. La expresin selector debe ser un tipo ordinal (por ejemplo, int, char, pero no float o string). Cada etiqueta es un valor

68

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

nico, constante y cada etiqueta debe tener un valor diferente de los otros. Si el valor de la expresin selector es igual a una de las etiquetas case por ejemplo, etiquetai- entonces la ejecucin comenzar con la primera sentencia de la secuencia sentenciai y continuar hasta que se encuentra el final de la sentencia control switch, o hasta encontrar la sentencia break. Lo normal es que la sentencia break termine el bloque y despus que siga la ejecucin en la siguiente sentencia switch( ). Ejemplo 7: Escriba un programa que lea un dia de semana del 1 al 7 y lo imprima en letras . Si lee 1 escribe LUNES. PROGRAMA /* CODIGO: POOC3E7 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Elige una opcin de un men simple usando la sentencia condicional SWITCH. */ #include <iostream.h> #include <conio.h> void main() { int dia; clrscr(); cout<<"Introduce el dia: "; cin>>dia; switch(dia){ case 1: cout<<"Lunes"; break; case 2: cout<<"Martes"; break; case 3: cout<<"Mircoles"; break; case 4: cout<<"Jueves"; break; case 5: cout<<"Viernes"; break; case 6: cout<<"Sbado"; break; case 7: cout<<"Domingo"; break; default:cout<<"No es un dia de semana"; } getch(); } EJECUCION

Note que el default no tiene break y es que la salida en este caso es por trmino de la instruccin switch.

Sentencia while.- Nos permite ejecutar repetidamente un grupo de sentencias hasta que el valor de la expresin se hace cero (condicin falsa) Forma General while ( expresin) {................... ; .....................; .....................; }

Funcionamiento:

69

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


nunca iterara si la condicin comprobada es inicialmente falsa. Ejemplo 8: PROGRAMA /* CODIGO: POOC3E8 PROGRAMA CREADO POR RICARDO CASTAEDA 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(); } EJECUCION

2013

La expresin booleana o condicin se evala y el bucle se repite mientras la condicin es verdadera. El bucle while

Comentario: Como suma es un acumulador se inicializa en cero, en cambio en este caso cont va contando por adelantado y su valor final ser 101. Con cont igual a 101 ya no se cumple la condicin y por lo tanto se sale del bucle while, a esta variable denominada cont se le conoce tambin como variable de control del bucle while, esta variable necesariamente debe ser modificada dentro del rango del while pues de no suceder esto estaramos en un lazo infinito.

Sentencia do-- while.- Las sentencias se ejecutan repetidamente hasta que el valor de la expresin se hace cero (falso) Forma General do {................... ; .....................; .....................; } while ( expresin);

Funcionamiento:

70

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

Se ejecutan las sentencias y a continuacin se evala la expresin, y si es verdadero (distinto de cero), el control se pasa de nuevo al principio de la sentencia do y el proceso se repite, hasta que la condicin (expresin) sea falsa(cero) y el control pasa a la sentencia siguiente. Ejemplo 9: El siguiente ejemplo visualiza los nmeros, cuadrados y cubos de los 20 primeros nmeros: PROGRAMA /* CODIGO: POOC3E9 PROGRAMA CREADO POR RICARDO CASTAEDA 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 << " numero++; } while (numero < 21); getch(); } EJECUCION " <<pow(numero,2)<<" "<<pow(numero,3) << endl ;

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:

71

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

Una sentencia for ejecuta la iteracin de un bucle un nmero determinado de veces. El lazo for tiene tres partes: exp1, inicializa las variables de control del bucle; exp2, es la condicin que determina si el bucle realiza otra iteracin; la ltima parte del bucle for es la clusula que incrementa o decrementa las variables de control del bucle. Exp1 se utiliza para inicializar la variable de control de bucle; a continuacin exp2 se evala, si es verdadera (distinta de cero), se ejecuta la sentencia y se ejecuta exp3 y el control pasa de nuevo al principio del bucle. La iteracin contina hasta que exp2 es falsa (cero), en cuyo momento el control pasa a la sentencia siguiente al bucle. Ejemplo 10: Imprimir todos los primos de dos dgitos. PROGRAMA /* CODIGO: POOC3E10 PROGRAMA CREADO POR RICARDO CASTAEDA 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(); } EJECUCION

Sentencias break y continue

El flujo de control ordinario de un bucle se puede romper o interrumpir mediante las sentencias break y continue. La sentencia break produce una salida inmediata del bucle flor en que se encuentra situada:

72

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


for (i = 0; i < 100; i++) { cin x; if (x < 0.0) { cout <<salir del bucle <<endl; break; } cout << sqrt(x)<< endl; } La sentencia break tambin se utiliza para salir de la sentencia switch.

2013

La sentencia continue termina la iteracin que se est realizando y comenzar de nuevo la siguiente iteracin: for (i = 0; i < 100; ++i) { cin >> x; if (x < 0.0) continue; } Advertencia: Una sentencia break puede ocurrir nicamente en el cuerpo de una sentencia for, while, do o switch. Una sentencia continue slo puede ocurrir dentro del cuerpo de una sentencia for, while o do.

PROBLEMAS
ESTRUCTURAS DE CONTROL 1. Se tienen 6 datos que son los nombres y edades de tres personas, escriba un programa que lea los tres nombres y edades e imprima los nombres considerando las edades en forma creciente . SOLUCION:

A) PROGRAMA: /* CODIGO: POOC3PROB1 PROGRAMA CREADO POR RICARDO CASTAEDA 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; Ing. Ricardo Castaeda

73

FACULTAD DE INGENIERIA MECANICA


cout<< " Ingrese nombre 2 ==> "; cin>> nombre2; cout<< " Ingrese edad 2 ==> "; cin>> edad2; cout<< " Ingrese nombre 3 ==> "; cin>> nombre3; cout<< " Ingrese edad 3 ==> "; cin>> edad3; cout<<endl<<endl<<endl; cout<< "LOS NOMBRES POR EDADES SERA:"<<endl<<endl; if ( edad1 < edad2) if( edad2 < edad3) cout<< nombre1<< " "<<nombre2<< " "<<nombre3<<endl; else if (edad1<edad3) cout<< nombre1<< " "<<nombre3<< " "<<nombre2<<endl; else cout<< nombre3<< " "<<nombre1<< " "<<nombre2<<endl; else if (edad1 <edad3) cout<< nombre2<< " "<<nombre1<< " "<<nombre3<<endl; else if(edad2<edad3) cout<< nombre2<< " "<<nombre3<< " "<<nombre1<<endl; else cout<< nombre3<< " "<<nombre2<< " "<<nombre1<<endl; getch( ); } B) RESULTADOS:

2013

2. Escriba un programa que lea un nombre y su respectiva edad, esta informacin debe procesarse e imprimirse el nombre y el periodo al cual pertenece la persona. SOLUCION: PROGRAMA /* CODIGO: POOC3PROB2 Ing.Ricardo Castaeda

74

PROGRAMACION ORIENTADA A OBJETOS


PROGRAMA CREADO POR RICARDO CASTAEDA 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 nio"<<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 } else cout<<"Error ingrese una edad valida"; getch( ); } EJECUCION :cout<<nombre<<" es un adulto"<<endl;

2013

3. Escriba un programa que imprima todos los nmeros de tres cifras que sean capicas y cuya suma de sus dgitos sea par. Solucion: PROGRAMA /* CODIGO: 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 capicas y suma dgitos par"<<endl<<endl; Ing. Ricardo Castaeda

75

FACULTAD DE INGENIERIA MECANICA


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

2013

4. En la UNI se rinde examen de admisin y de un grupo de 20 postulantes para cuatro facultades cuyos codigos son: Codigo S M Q Facultad Ing. De Sistemas Ing. Mecnica Ing. Qumica Ing.Ricardo Castaeda

76

PROGRAMACION ORIENTADA A OBJETOS


A Ing. Ambiental

2013

La Universidad aplica tres tipos de exmenes a sus postulantes. Los postulantes que obtengan por lo menos dos exmenes aprobados (mayor o igual a 11) son admitidos caso contrario son rechazados. En base a esto se pide disear un algoritmo que permita: a) Mostrar por cada postulante el mensaje admitido o rechazado. b) Presentar el nmero de ingresantes pro facultad. Solucin: PROGRAMA /* CODIGO: 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> # 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

77

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


cout<<"Postulante rechazado"<<endl; } cout<< " Ingresaron a Ing. Sistemas = "<<conts<<endl;; cout<< " Ingresaron a Ing. Mecnica = "<<contm<<endl; cout<< " Ingresaron a Ing. Qumica = "<<contq<<endl; cout<< " Ingresaron a Ing. Ambiental= "<<conta<<endl; getch( );}

2013

5. Se desea leer un conjunto de numeros enteros de tres cifras hasta encontrar un nmero negativo. Luego mostrar la cantidad de veces que aparece el digito 3 en todos los nmeros positivos ledos. Solucion: PROGRAMA /* CODIGO: POOC3PROB5 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Muestra veces que aparece el digito 3 en los nmeros ledos 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;

78

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


numero=numero/10; d3 = numero; if( d3==3) contdigitos = contdigitos+1; if( d2==3) contdigitos = contdigitos+1; if( d1==3) contdigitos = contdigitos+1; getch( ); } EJECUCION } cout<< "Numero de veces que aparece el digito 3 es = "<<contdigitos<<endl;

2013

6. De un experimento de fsica se tienen que leer N temperaturas( entre positivas y negativas) luego averiguar el numero de apariciones de la menor temperatura negativa. Solucion: PROGRAMA /* CODIGO: 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; } }

79

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


} cout<<endl<<endl; cout<<"La temperatura es = " << tempmayorneg<<endl; cout<<" Se presento: "<< conttemp << " Veces"; getch( ); } EJECUCION

2013

EJERCICIOS PROPUESTOS 1. Escriba un programa que simule un juego de dados como en el ejemplo de este captulo pero en cada caso debe ganar o perder una suma, si inicialmente usted fija un pozo o sea una cantidad, el juego terminara cuando pierda todo el pozo inicial o lo duplique. 2. Escriba un programa que genere 5 valores al azar entre 1 y 13 (cinco cartas de una baraja de casinos) y me indique si tenemos un par, 2 pares , un tro , un full (3 iguales y dos iguales) o pker ( cuatro iguales) 3. Escriba un programa que me permita descubrir una clave de cuatro dgitos realizando todas las combinaciones posibles hasta dar con la clave. 4. Escriba un programa que lea 5 practicas de 10 alumnos halle el promedio de cada uno de ellos y me indique cual es el mejor promedio. 5. Escriba un programa que me permita hallar el maximo comn divisor y el mnimo comn mltiplo de dos valores enteros. 6. Se realizan elecciones entre tres partidos politicos, escriba un programa que me permita indicar el ganador y si adems supera el 50% ser el ganador oficial en primera vuelta.

80

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

CAPITULO IV

81

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


4

2013

FUNCIONES EN LENGUAJE C++.- Es un conjunto de instrucciones agrupadas que tienen un nombre comn y que realizan un clculo (o proceso) especifico. Todo programa en lenguaje C se desarrolla basndose en funciones, estas posteriormente pueden formar una librera particular.

4.1

Funciones Predefinidas (De biblioteca) Aqu tenemos una serie de funciones, debemos considerar que al invocarlas debemos seguir las siguientes reglas: Consideremos la Funcin sqrt Syntax #include <math.h> double sqrt(double x); La funcin sqrt est incluida en la librera math.h La invocacin debe ser con el nombre o sea sqrt y el parmetro indicado o sea un valor , variable o expresin de tipo double. O sea sqrt(num), siendo habido sido declarado num como doble precision. El valor devuelto ser el indicado en el prototipo o sea double precision por ejemplo un caso sera: double r, x ; x= 5.0; r=sqrt(x); En este caso tanto la variable que servir como argumento, como la variable que recibir el resultado son del tipo indicado. A) Funciones de la librera math.h Funcin abs Syntax #include <math.h> #include <stdlib.h> int abs(int x); Retorna el valor absoluto de una variable entera, y cuando se incluye la librera stdli.h tambien considera valores bcd. La funcin fabs(double x) considera valores reales. Ejemplo 1.- escriba un programa que lee tres valores y me imprime el mayor valor absoluto. PROGRAMA /* CODIGO: 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;

82

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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; if (z>mayor) mayor= z; cout<<"El mayor ser: "<<mayor; getch(); } EJECUCION

2013

Funciones ceil y floor 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();

83

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


for (i=1;i<=5;i++) {cout<<"Ingrese edad "<<i<<" : "; cin >>edad; promedio=promedio + edad; } promedio=promedio/5.0; edadprom1=floor(promedio); edadprom2=ceil(promedio); cout<<"La edad promedio se encuentra entre "<<edadprom1<< " y "<<edadprom2; getch(); } EJECUCION

2013

Funciones sin() y cos() 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 rectngulo notable y compruebe que seno y coseno de los ngulos complementarios de un triangulo rectngulo 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);

84

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


cout<<"El seno de a= "<<senoa<<endl; cout<<"El coseno de b= "<<cosenob; getch(); } EJECUCION

2013

Funcin exp() Syntax #include <math.h> double exp(double x); long double expl(long double x); Exp() calcula el valor e elevado a la x. Ejemplo 4.- Escribir un programa con exp(x) PROGRAMA /* CODIGO: POOC4E4 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Ejemplo de las funciones exp()*/ #include <iostream.h> #include <conio.h> #include <stdio.h> #include <math.h> void main() { double expx; double x ; clrscr(); cout<<"Ingrese x ==> "; cin>>x; expx = exp(x); printf("'e' elevado a la potencia \de %lf (e ^ %lf) = %lf\n", x, x, expx); getch(); } EJECUCION

Funcin log() y log10() Syntax #include <math.h> double log(double x); long double logl(long double x); double log10(double x); long double log10l(long double x); Retorna el logaritmo natural de x y el logaritmo en base 10 de x

85

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


Funcin pow() Syntax #include <math.h> double pow(double x, double y); long double powl(long double x, long double y); Retorna x elevado a la y. Ejemplo 5.- Escribir un programa y calcule una raiz cuadrada usando pow() y usando sqrt(), comprelas. PROGRAMA /* CODIGO: POOC4E5 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Utiliza pow() y sqrt() para calcular raiz cuadrada*/ #include <iostream.h> #include <conio.h> #include <math.h> void main() { double x,raiz1,raiz2 ; clrscr(); cout<<"Ingrese x ==> "; cin>>x; raiz1 = pow(x,0.5); raiz2=sqrt(x); cout<<" Utilizando pow el resultado ser = "<<raiz1<<endl; cout<<" Utilizando sqrt el resultado ser= "<<raiz2; getch(); } EJECUCION

2013

B) Funciones de la librera stdio.h Funcin gets() Syntax #include <stdio.h> char *gets(char *s); Captura una cadena que puede contener espacio en blanco del flujo estndar. Funcin printf() Syntax #include <stdio.h> int printf(const char *format[, argument, ...]); Ejemplo 6.- Escribe una salida formateada en el flujo estndar de salida.

86

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


PROGRAMA /* CODIGO: POOC4E6 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Utilizar la funcio gets() y la funcin printf().*/ #include <iostream.h> #include <conio.h> #include <stdio.h> #include <math.h> void main() { char nombre[30]; 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

2013

Funcin clock() Syntax #include <time.h> clock_t clock(void); Ejemplo 7.- Escribe un programa que nos permita trabajar con la funcin clock. PROGRAMA /* CODIGO: POOC4E7 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Maneja la funcin clock*/ #include <iostream.h> #include <conio.h> #include <time.h> #include <stdio.h> #include <dos.h> main(void) { int i,a=0; clock_t inicio, fin;

87

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


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 getch(); } EJECUCION / CLK_TCK); printf("El tiempo transcurrido fue: %f\n", (fin -inicio ) / CLK_TCK);

2013

Funcin time() Syntax #include <time.h> time_t time(time_t *timer); Ejemplo 8.- Escribe un programa que nos permita trabajar con la funcin time. Explicar. PROGRAMA /* CODIGO: POOC4E8 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Maneja la funcin time*/ #include <time.h> #include <stdio.h> #include <dos.h> #include <conio.h> #include <iostream.h> void main(void) { time_t t; t = time(NULL); cout<<"El numero de segundos transcurridos desde el Enero 1, 1970 es "<<t; getch(); } EJECUCION

88

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


La funcin cuenta los segundos transcurridos desde 1 enero 70 hasta el da actual. Funciones que generan nmeros aleatorios

2013

Son las funciones randomize(), rand() y random (num).. Veamos su sintaxis de cada una de ellas. Funcin rand()

Syntax #include <stdlib.h> int rand(void); Genera nmeros aleatorios entre 0 y RAND_MAX, constante definida en stdlib.h Funcin randomize() Syntax #include <stdlib.h> #include <time.h> void randomize(void); Inicializa el generador de nmeros. Funcin random(n)

Syntax #include <stdlib.h> int random(int num); Retorna valores entre 0 y num 1. Ejemplo 9.- Generar nmeros aleatorios entre un cota mnima y una cota mxima. 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

89

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

C) Funciones de la librera stdlib.h Funcin atof() Syntax #include <math.h> double atof(const char *s); long double _atold(const char *s); Convierte de cadena a nmero de punto flotante. Funcin atoi() Syntax #include <stdlib.h> int atoi(const char *s); Convierte de cadena a nmero entero. Syntax #include <stdlib.h> long atol(const char *s); Convierte de cadena a numero long (entero largo). Funcin itoa() Syntax #include <stdlib.h> char *itoa(int value, char *string, int radix); Convierte un entero a cadena. Funcin ecvt() Syntax #include <stdlib.h> char *ecvt(double value, int ndig, int *dec, int *sign); Convierte una cadena a punto flotante.. Funcin atol()

90

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


4.2

2013

Funciones Definidas por el Usuario.- Tambin podemos crear nuestras propias funciones y como mencionamos al inicio de este captulo posteriormente podemos formar nuestra librera partcula. La estructura de una funcin definida por el usuario es :

Forma General Tipo nombrefuncion ( lista de parmetros) {................... ; .....................; .....................; [return(.....);] .....................; }

Donde: Tipo .............. Tipo de valor que devuelve la funcin en algunos casos no devuelven ningn valor y el tipo ser void (no devuelve). nombrefuncion ......Identificador de la funcin

Lista de parmetros...Establecen la comunicacin entre la funcin que realiza la llamada y nuestra funcin return( ) .....Permite retornar un valor a la funcin que realizo la llamada, si la funcin 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 *cdigo, char nombre[40], char direccin[50]) { // programa de lectura clrscr(); cout << ingrese cdigo: ; cin>>*codigo; cout << Ingrese nombre: ;gets(nombre); //Funcin de lectura cout << Ingrese direccin: ; gets(direccion); La llamada ser leer( &code, name, dire); }

91

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


Si las declaraciones han sido: long code; char name[40]; char dire[50]; 4.2.1 Ubicacion del prototipo, la llamada y la function en Lenguaje C++

2013

#include <iostream.h> #include <conio.h> // PROTOTIPO DE LA FUNCION (ES EL ENCABEZADO)

int suma(int operando1, int operando2); // LA LLAMADA SE REALIZA DE LA FUNCION MAIN

void main( ) { int valor1, valor2; ; .; S = suma( valor1, valor2); ; ..; ..; // LA FUNCION SUMA DESARROLLADA int suma ( int operando1, int operando2) { int resultado; resultado = operando1+operando2; return (resultado) ; } 4.2.2 Comunicacin entre funciones.- La comunicacin se puede realizar de dos maneras: Va variables Globales Va argumentos parmetros

a) Va variables globales.- Se realiza cuando declaran ms variables en un rea de acceso pblico 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);

92

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

La comunicacin es a travs 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 comunicacin argumentos parmetros, que independiza las variables de los procedimientos.

b) Va argumentos y parmetros. Esto se establece como explicamos a continuacin: Llamada por valor y llamada por referencia.- Cuando una funcin es llamada se le debe enviar una lista de argumentos que son los que establecen la comunicacin entre los dos mdulos. La pregunta es, Que Argumentos enviar? Los argumentos enviados pueden ser valores o direcciones dependiendo del parmetro: Si el encabezado es void f1(int p1, int p2, float *p3) Supongamos que los argumentos son a1, a2 y a3; entonces a1 y a2 deben necesariamente generar valores simples de tipo entero y a3 ser obligatoriamente variable simple de tipo float, pero el primer parmetro y el segundo al ser variables solamente piden valores enteros pero el tercer parmetro al ser tipo puntero pide una direccin de una variable simple de tipo float. L a llamada ser: f1 ( a1, a2, &a3); O sea se enva el contenido de a1 y de a2 pero la direccin de a3, entonces a1 y a2 ha sido llamadas por valor a3 ha sido llamada por referencia

93

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


lista de argumentos f2(a1, a2, &a3, &a4) los siguientes eventos tienen lugar:

2013

Funcionamiento de un subprograma tipo funcin .- Cuando aparecen el nombre de una funcin seguido de una Se realiza una transferencia de valores y direcciones hacia sus respectivos parmetros. Como lo visualizamos en el siguiente grfico(Suponiendo que la llamada se realizo desde main):

main() a1
35

f2()_ p1

a2

40

p2

a3

p3

a4

p4

MEMORIA ASIGNADA A main ()

MEMORIA ASIGNADA A f2()

Se ejecuta la funcin hasta que la primera sentencia return es alcanzada o termina la funcin.

Cuando termina la ejecucin de la funcin sucede lo siguiente: El control retorna al punto siguiente desde donde se realizo la llamada Sigue la ejecucin de main (En este caso).

4.3

Funciones Inline.-

Este tipo de funciones que se insertan directamente le dan mayor velocidad a la

ejecucin, la forma de indicar una function de este tipo es colocando el especificador inline antes de la definicin de la funcin. Veamos el formato: inline tipo_devuelto nombre_funcion (parmetros) {.; .; Instrucciones; } La llamada ser normal como a las otras funciones, pero en el cuerpo de la funcin no podr haber: Variables de tipo static Sentencias de bucle. Sentencia switch Ing.Ricardo Castaeda

94

PROGRAMACION ORIENTADA A OBJETOS


Go to

2013

Ejemplo 12.- veamos un ejemplo de uso de una funcin 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 mnimo: ";cin>>xmin; cout<<"Ingrese x mximo: ";cin>>xmax; cout<<"Ingrese variacin de x: ";cin>>deltax; x=xmin; while( x<=xmax) { fx=fi(x); cout<< "f(x)= "<<fx<<endl; x=x+deltax; } getch();} EJECUCION

Fjense que es una funcin con un clculo simple pues retorna el valor de la funcin para un argumento dado. 4.4 Funciones Recursivas.- Una funcin recursiva es una funcin que se llama as misma para resolver un clculo o proceso.

95

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


Las caractersticas de la recursividad son : En cada llamada recursiva el grado de dificultad del clculo o proceso disminuye. Cada llamada tendr su propio espacio de memoria.

2013

Habr una llamada no recursiva en algn instante a partir del cual se solucionara el problema a resolver.

Si tenemos el clculo de factorial: !N = N*!(N-1).. calcular el factorial de (N-1) es ms sencillo que calcular el factorial de N. Adems ! 1 = 1 y ! 0 = 1 que son llamadas no recursivas y nos permite calcular el factorial a partir de esto. Ejemplo 13.- Escriba un programa que halle el factorial de un numero positivo en forma recursiva. PROGRAMA /* CODIGO: 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.- Tambin podemos devolver la direccin de una funcin, veamos int (*fpun) (int ) ser la declaracin de un puntero a funcin que recibe un int y devuelve un int; en cambio int *fp(int ) ser el prototipo de una funcin que recibe un int y devuelve puntero a int.

Ejemplo 14.- Escriba un programa usando el concepto de puntero a funcin. PROGRAMA /* CODIGO: POOC4E14 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Ejemplo de puntero a funcin. */ # include<iostream.h>

96

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


# 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

2013

int* (*pf2)(int)=&funcion1; pf2(j); getch(); } EJECUCION //Imprime 8

PROBLEMAS Problema 1.- EJEMPLO DE FUNCIONES QUE SE COMUNICAN MEDIANTE VARIABLES GLOBALES. 1.- Suponga que tiene un numero num y una aproximacin a su raz cuadrada. Para obtener una aproximacin ms exacta a la raz cuadrada real se puede utilizar la formula: aproximacinnueva = (n/ aproximacinanterior)+aproximacinanterior)/2. Utilizando esta informacin, escriba un programa que solicite al usuario un nmero y una suposicin inicial de su raz cuadrada. Con los datos el programa calculara una aproximacin de la raz cuadrada que sea exacta hasta 0.00001. Solucin: /* CODIGO: POOC4PROB1 FECHA: 16 de agosto de 2007 OBJETIVO: Halla raz cuadrada por aproximacin*/ #include<iostream.h> #include<conio.h> #include<math.h> #define ERROR 0.00001 float num,raiz,aprox; void leer(); void procesar(); Ing. Ricardo Castaeda

97

FACULTAD DE INGENIERIA MECANICA


void mostrar(); main() { leer(); procesar(); mostrar(); } void leer( ) { clrscr(); cout<<"Ingrese el numero cuya raz cuadrada desea "; cin>>num; cout<<"Ingrese un valor aproximado de la raz "; cin>>aprox; } void procesar( ) { do{ raiz=aprox;//almacenar la aproximacin aprox=(num/raiz + raiz)/2.0;//calcular nueva aproximacin cout<<"Nueva Aproximacin "<<aprox<<endl; }while(fabs(aprox-raiz)>ERROR); getch(); } void mostrar() { cout<<endl<<endl; cout<<"La Raiz cuadrada es "<<aprox<<endl; getch(); } EJECUCION

2013

2.- Escriba un programa que utilizando comunicacin va argumentos y parmetros, pueda calcular la nota final, considerando que el promedio de prcticas se halla eliminando la menor nota de las cuatro prcticas, la nota final se hallara Promedio de prcticas = (practica 1+practica 2 + practica 3 + practica 4 menor)/3.0 Nota Final = (promedio practicas+ examen parcial + 2*examen parcial)/4.0 SOLUCION: PROGRAMA /* CODIGO: 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 );

98

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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 prcticas es :"<<PP; PFIN=(PP+EXP+2*EXF)/4.0; cout<<"\n El Promedio Final es :"<<PFIN<<endl;//redondea por exceso if(PFIN>=10) cout<<"Su promedio final es: "<<PFIN<<endl; else if(PP>6.0) {cout<<"Ingrese el Examen Sustitutorio: ";cin>>EXS; if(EXP) PFIN=(PP+EXS+2*EXF)/4.0; if(EXF) PFIN=(PP+EXP+2*EXS)/4.0; cout<<"Su promedio final es: "<<PFIN<<endl; } getch();} void leer(float &n1,float &n2,float &n3, float &n4) { cout<<"\nIngrese las practicas dejando espacio :"; cin>>n1>>n2>>n3>>n4; } float menor(float n1,float n2,float n3, float n4 ) { float men; men=n1; if(n2<men) men=n2; if(n3<men) men=n3; if(n4<men) men=n4; return ( men); } EJECUCION

2013

99

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


3.-

2013

Este programa halla una raz positiva de la ecuacin cubica x 3 x 2 x 1 0 , en el intervalo [0,5] con un error menor que 0.001.

PROGRAMA /* CODIGO: POOC4PROB3 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Halla raiz en intervalo 0-5 con error menor que 0.001 */ # include<iostream.h> # include<math.h> # include<conio.h> # define error 0.001 //# define x0 0.0 //# define x1 5.0 float fcub(float x); float bisecar(float a, float b);

/*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);}

float bisecar(float a, float b) {float r ,medio ; while ( fabs(a-b)>= error) {cout<<fabs(a-b)<<endl; medio = (a+b)/2.0; if ((fcub(a) * fcub(medio))<= 0) b= medio; else a= medio; } r = a; return( r ); }

100

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


EJECUCION

2013

4.- Escriba un programa que calcule la planilla para un trabajador, los datos que tienen que considerarse son: Nombre : Nombre del empleado es una cadena de 40 caracteres. Cdigo : Cdigo del empleado es una cadena de 11 caracteres. Sueldo bruto : Sueldo mensual que percibe el empleado. Faltas : 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 cdigo[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)

101

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


{ clrscr; cout<<"Ingrese nombre ==> ";gets(nombre); cout<<"Ingrese codigo ==> ";gets(codigo); cout<<"Ingrese sueldo bruto ==> ";cin>> (*sueldob); cout<<"Ingrese faltas ==> ";cin>> (*faltas);

2013

cout<<"Ingrese horas extras ==> ";cin>> (*horase); cout<<"Ingrese seguro (0=ninguno,1=afp,2=ssp) ==> ";cin>> (*seguro); cout<<"Ingrese bonificaciones(0=No,1=Si)==> ";cin>> (*bonif); } float calcular_neto(float sueldob,int faltas,int horase,int seguro,int bonif,float *descuento) { float neto,sumabonif,des; //calculo de bonificaciones sumabonif=0; sumabonif=sumabonif+horase*(sueldob/240)*1.5; if(bonif==1) sumabonif=sumabonif+sueldob*0.05; //calculo de descuentos des=0; des = des + (sueldob/30)* faltas; if (seguro==1) (*descuento)= (sueldob+sumabonif-des)*0.13; else if(seguro==2) (*descuento)= (sueldob+sumabonif-des)*0.11; else (*descuento)= (sueldob+sumabonif-des)*0.07; (*descuento)=(*descuento)+des; neto = sueldob - (*descuento)+ sumabonif; return (neto); }

void imprimir_boleta(char n[40],char c[11],float descuento,float sueldon) { clrscr(); cout<<" Nombre : "<<n<<endl; cout<<" Codigo : "<<c<<endl; cout<<" Descuento: "<<descuento<<endl; cout<<" Neto a >Recibir : "<<sueldon<<endl; }

EJECUCION

102

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


5.- Escriba un programa que halle un nmero de la serie de fibonacci en forma recursiva. Para i=0 , F(0)= 0 Para i= 1 , F(1)= 1 Para i>=2 , F(i) = F(i-1) + F(i-2) PROGRAMA /* CODIGO: 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); /* Funcin 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

2013

6.- Escriba un programa que halle los factores primos de un nmero en forma recursiva. PROGRAMA /* CODIGO: POOC4PROB6 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Halla factores primos en forma recursiva */ # include<iostream.h>

103

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


# include<math.h> # include<conio.h> void fprimo(int num); void main( ) { int n; clrscr(); do{ cout<< " NUMERO = "; cin>> n; }while(n<1); fprimo(n); getch(); } void fprimo( int num) { int nr, k =1; if (num > 1) {do { k = k +1; } while( (num % k) != 0); cout<< " "<< k <<" "; nr = num / k; fprimo( nr); } } EJECUCION

2013

EJERCICIOS PROPUESTOS 1. Escriba un programa que utilizando funciones pueda realizar operaciones con nmeros complejos: Suma, Resta, Multiplicacin y Divisin. Cada operacin debe realizarse con funciones adems de la lectura y escritura. Debe trabajar con un men. 2. Escriba un programa que calcule reas, debe calcular reas para cuadrados, rectngulos, tringulos y crculos; cada calculo debe realizarse con una funcin. 3. Escriba un programa que resuelva el mismo problema de planilla (problema 4)pero considere que hay tres tipos de bonificaciones. Tiempo de servicio (5%) Carga familiar (5%) Ing.Ricardo Castaeda

104

PROGRAMACION ORIENTADA A OBJETOS


Remuneracin por direccin (10%)

2013

4. Escriba un programa que utilizando el concepto de puntero a funciones evale una funcin para un argumento variando en un rango de valores determinado. 5. Escriba un programa que me permita hallar la nota final de un alumno que rindi 4 practicas y 2 exmenes considere, que el sistema de evaluacin puede ser: Sistema A : promedio de prcticas es el promedio de las cuatro practicas y el promedio final es la suma de los dos exmenes mas el promedio de prcticas divididos entre tres. Sistema B : promedio de prcticas es el promedio de tres practicas eliminando la menor y el promedio final es la suma del primer examen ms el segundo examen duplicado el promedio de prcticas divididos entre cuatro. 6. Escriba un programa que resuelva el problema de las torres de Hani para n discos utilizando una funcin recursiva. En las torres de Hani se trata de pasar n discos de un eje Origen a un eje Destino utilizando un eje auxiliar. Las reglas son : Solo se puede mover un disco a la vez. Nunca un disco de mayor dimetro puede estar sobre un disco de menor dimetro.

105

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

CAPITULO V

106

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


ARREGLOS EN LENGUAJE C

2013

5.1 Definicin.- Un arreglo es una coleccin de elementos del mismo tipo; por lo tanto es una estructura homognea. Su declaracin se realiza indicando al compilador sus caractersticas que son tipo, nombre y tamao. Ejemplo: int datos[10]; la informacin que se entrega al compilador ser:

Nombre del arreglo: datos Tipo de componente: variable simple entera Tamao 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 subndice que comienza en cero: int a[4] : a[0], a[1], a[2], a[3]. Un arreglo se puede inicializar as : int a[4] = { 20, 25, 35, 40}

a[0]

20

a[1]

25 35 40

a[2]

a[3]

5.3 Operaciones con Arrays unidimensionales (vectores).- Las operaciones inciales son las de lectura y escritura, las cuales vamos a ver en el siguiente programa ejemplo: 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();

107

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


//Lectura cout << " Ingrese n => "; cin >> n; for (i=1;i<=n;i++) { cout<< " Ingrese valor "<< i<<" : "; cin>> vector[i]; clrscr(); //Escritura cout<<" SALIDA "<<endl<<endl; for ( i=1; i<=n;i++) { cout<< vector[i]<< endl; getch(); } EJECUCION } }

2013

Operaciones con arreglos: Las dems operaciones las analizaremos algortmicamente y despus los presentaremos en un men en los problemas desarrollados. Las operaciones ms importantes con arreglos unidimensionales son : Adicin Eliminacin Bsqueda Ordenamiento

ADICION: La operacin de adicin nos permite ingresar un elemento al vector de n componentes que estn siendo utilizadas. Inicialmente tenemos: Vector A N=6 A [1] 3 A [2] 5 A [3] 12 A [4] 20 A [5] 15 A[6] 25 A[7]

J= 4 X

14

Vamos a insertar el valor x = 14 en la posicin j=4 Tener en cuenta que al insertar un nuevo valor el vector crecer en un elemento. Al finalizar los valores deberan estar en las siguientes posiciones:

108

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


A[1] = 3, A[2] = 5, A[3] = 12, A[4] = 14, A[5] = 20, A[6] = 15, A[7] = 25. Para realizar esta operacin necesitamos tres pasos:

2013

a) Realizar un corrimiento de una posicin hacia la derecha de todos los valores desde la po sicin N (N=6) hasta la posicin J (J=4), el resultado sera: N=6 A [1] 3 El algoritmo es: Para i = N,J,-1 A[i+1] A[i] Fin Para b) Adicionar el elemento X en la posicin J A[J] X El resultado seria N=6 A [1] 3 c) Actualizar N N = N +1 A [2] 5 A [3] 12 A [4] 14 A [5] 20 A[6] 15 A[7] 25 A [2] 5 A [3] 12 A [4] 20 A [5] 20 A[6] 15 A[7] 25

N=7 A [1] 3 A [2] 5 A [3] 12 A [4] 14 A [5] 20 A[6] 15 A[7] 25

Las instrucciones en Borland C sern: cout<<"Ingrese posicin de insercin: "; cin>> j; cout<<"Ingrese valor a insertar : "; cin>> x; for( i=n; i>=j; i--) v[i+1] = v[i]; v[j] = x; n = n +1; ELIMINACION: La operacin de eliminacin nos permite sacar un elemento del vector de n componentes que estn siendo utilizadas. Inicialmente tenemos: Vector A N=6 A [1] 3 A [2] 5 A [3] 12 A [4] 20 A [5] 15 A[6] 25

J= 3

109

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


Vamos a eliminar el tercer elemento del vector. Finalmente deberamos tener A[1] = 3, A[2] = 5, A[3] = 20, A[4] = 15, A[5] = 25. Y N decrecera y seria 5. Para realizar esta operacin necesitamos dos pasos: a) Realizar un corrimiento de una posicin hacia la izquierda todos los valores desde la posicin J+1 (J=3) hasta la posicin N (N=6).: N=6 A [1] 3 El algoritmo es: Para i = J+1,N A[i-1] A[i] Fin Para b) Actualizar N. N N-1 El resultado seria N=5 A [1] 3 A [2] 5 A [3] 20 A [4] 15 A [5] 25 A [2] 5 A [3] 20 A [4] 15 A [5] 25 A[6] 25

2013

Las instrucciones en Borland C sern: cout<<"Ingrese posicin de valor a eliminar : "; cin>> j; for( i=j+1 ; i<=n;i++) v[i-1] = v[i]; n = n - 1;

BUSQUEDA: La operacin de bsqueda es una de las ms importantes. En todo proceso real siempre se buscara un elemento dentro de un conjunto, o sea buscaremos informacin dentro de la data, labor fundamental en informtica. La operacin buscara un elemento X en un vector A de N elementos. N=6 A [1] 3 A [2] 5 A [3] 12 A [4] 20 X=A[i]? A [5] 15 A[6] 25

X=A[1]? X=A[2]?

19

Tenemos que tener en cuenta que la bsqueda terminara cuando encontremos el elemento buscado o cuando llegamos al final de la estructura. Algortmicamente seria: Ing.Ricardo Castaeda

110

PROGRAMACION ORIENTADA A OBJETOS


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 posicin , pos) Sino 3.2 Escribir( Valor no hallado) Fin si Las instrucciones en Borland C sern: cout<<"Ingrese valor a buscar : "; cin>> x; for( i=1;i<=n;i++) if ( v[i]== x) { pos = i; break ; } if ( v [i ]== x) cout<< " Valor hallado en posicin: "<<pos; else cout<< " Valor no hallado ";

2013

ORDENAMIENTO: La operacin de ordenamiento se realiza por etapas, en nuestro algoritmo por comparacin trataremos de poner el menor valor en la posicin superior, pero en cada etapa ya no participa el menor ya encontrado en la etapa anterior. El mtodo busca colocar el primer menor en la posicin 1 en la etapa 1. Colocar el segundo menor en la posicin 2 en la etapa 2. colocar el tercer menor en la posicin 3 en la etapa 3. En general se trata de colocar el iesimo menor en la posicin i en la etapa i. Veamos ETAPA 1 OBJETIVO. Llevar el menor 1(menor total) a la primera posicin. A[1] > A [2]? Si la respuesta es s, se intercambian posiciones entre A[1] y A[2], como en este caso A [1] 9 A [2] 3 A [3] 2 A [4] 7 A [5] 6 A[6] 4 A[7] 5

Despus del intercambio tenemos A [1] 3 A [2] 9 A [3] 2 A [4] 7 A [5] 6 A[6] 4 A[7] 5 Ing. Ricardo Castaeda

111

FACULTAD DE INGENIERIA MECANICA


A[1] > A [3]?. Si entonces. A [1] 2 9 A [2] 3 A [3] A [4] 7 A [5] 6 A[6] 4 A[7] 5

2013

A[1] > A [4]?. No A[1] > A [5]?. No A[1] > A [6]?. No A[1] > A [7]?. No ETAPA 2 OBJETIVO. Llevar el menor 2(segundo menor ) a la segunda posicin Verificar que en la segunda etapa ya no participa el primer menor , pues ya encontr su posicin final. A [2] 9 3 A [3] 7 A [4] 6 A [5] 4 A[6] 5 A[7]

A[2] > A [3]?. Si A [2] 3 9 A [3] 7 A [4] 6 A [5] 4 A[6] 5 A[7]

A[2] > A [4]?. No A[2] > A [5]?. No A[2] > A [6]?. No A[2] > A [7]?. No

ETAPA 3 OBJETIVO. Llevar el menor 3 (tercer menor ) a la tercera posicin Verificar que en la tercera etapa ya no participa el primer menor y el segundo menor, ya alcanzaron su posicin final. A [3] 9 7 A [4] A [5] 6 A[6] 4 A[7] 5

A[3] > A [4]?. Si. Intercambiar entre A[3] y A[4] A [3] 7 9 A [4] A [5] 6 4 A[6] 5 A[7]

A[3] > A [5]?. Si. Intercambiar entre A[3] y A[5] A [3] 6 9 A [4] A [5] 7 A[6] 4 A[7] 5

A[3] > A [6]?. Si. Intercambiar entre A[3] y A[6] A [3] 4 9 A[3] > A [7]?. No. ETAPA 4 OBJETIVO. Llevar el menor 4 (Cuarto menor ) a la cuarta posicin A [4] 9 7 A [5] 6 A[6] A[7] 5 A [4] 7 A [5] 6 A[6] 5 A[7]

112

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


A[4] > A [5]?. Si A [4] 7 9 A [5] 6 A[6] A[7] 5

2013

A[4] > A [6]?. Si A [4] 6 9 A [5] 7 A[6] A[7] 5

A[4] > A [6]?. Si A [4] 5 9 A [5] 7 A[6] A[7] 6

ETAPA 5 OBJETIVO. Llevar el menor 5 (Quinto menor ) a la quinta posicin A [5] 9 7 A[6] 6 A[7]

A[5] > A [6]?. Si A [5] 7 9 A[6] 6 A[7]

A[5] > A [7]?. Si A [5] 6 9 A[6] A[7] 7

ETAPA 6 Se ordenan n (7) valores en n-1 etapas (6) OBJETIVO. Llevar el menor 6 (Sexto menor ) a la sexta posicin A[6] 9 7 A[7]

A[5] > A [6]?. Si A[6] 7 9 A[7]

Volvemos a verificar el vector y tendremos A [1] 2 3 A [2] 4 A [3] A [4] 5 A [5] 6 A[6] 7 A[7] 9

Planteando la iesima etapa dentro de las n-1 etapas, en forma algortmica tenemos.

113

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


1.- Para i= 1, n-1 // Numero de etapas 1.1.- Para j= i+1, n 1.1.1 Si ( A[i] > A[j]) Entonces Temp A[i] A[i] A(j) A[j] temp Fin si Fin para Fin Para

2013

Programando en Borland C++: int i,j,temp; for ( i=1; i<n ;i++) for (j=i+1;j<=n;j++) if( v[i]> v[j]) { temp = v[i]; v[i] = v[j]; v[j] = temp ; }

PROGRAMAS BASICOS CON ARREGLOS UNIDIMENSIONALES Ejemplo 2.- Realizar una adicin al final del vector 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;

114

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

Ejemplo 3.- Realizar una bsqueda binaria sobre un vector ordenado. PROGRAMA /* CODIGO: POOC5E3 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Realizar una bsqueda 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();

115

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


inicio = 1; final = n; cout<<"Ingrese numero a buscar ==> ";cin>>x; while((inicio<=final)&&(!encontrado)) { medio = (inicio+final)/2; if(x==vector[medio]) encontrado = 1; else if(x>vector[medio]) inicio =medio; else final = medio; } cout<<endl; cout<<"MENSAJE "<<endl; if (encontrado) cout<<"El numero esta en posicin: "<<medio<<endl; else cout<<"Valor no hallado ... "; getch(); } EJECUCION

2013

Ejemplo 4.- Realizar un ordenamiento usando la definicin de vector ordenado. x1<=x2<=x3<=x4.<=xn. 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();

116

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

5.4 Arreglos de 2 dimensiones(Matrices) Una matriz es un arreglo de 2 dimensiones donde el primer subndice indica fila y el segundo subndice indica columna. Consideremos la siguiente declaracin: const float maxc = 20; float matriz [maxf] [maxc] Estamos declarando una matriz de 10 filas por 20 columnas. La primera fila ser: matriz[0] [[0], matriz[0][1], matriz[0][2],......................, matriz[0][19] 5.5 Operaciones con matrices: Ejemplo 5.- El procedimiento para leer una matriz ser: PROGRAMA /* CODIGO: POOC5E5 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Lectura y Escritura de una matriz */ # include<iostream.h> # include<conio.h> #include <stdlib.h> #include <time.h> void leer(int x[20][20],int *nf, int *nc); Ing. Ricardo Castaeda const float maxf = 10;

117

FACULTAD DE INGENIERIA MECANICA


void mostrar(int x[20][20], int nf, int nc); void main( ) { int mat[20][20],nf,nc; leer(mat,&nf,&nc); mostrar(mat,nf,nc); } void leer(int x[20][20],int *nf, int *nc) { int i, j ; clrscr( ); cout<<"Ingrese # filas de la matriz: "; cin>> *nf;

2013

cout<<"Ingrese # columnas de la matriz: "; cin>> *nc; randomize(); for(i = 1; i<=(*nf); i++) for(j =1;j<=(*nc); j++) x[i][j]=random(10); } void mostrar(int x[20][20], int nf, int nc) { int i, j ; for(i=1; i<=nf; i++) {for(j=1; j<=nc; j++) cout<<x [i] [j] << " "; cout<<endl; } getch( ); } EJECUCION

Ejemplo 6.-Procedimiento para multiplicar una matriz PROGRAMA /* CODIGO: POOC5E6 FECHA: 18 DE MARZO DE 2013 OBJETIVO: MULTIPLICACION DE MATRICES */ #include<iostream.h> #include<conio.h> #include<stdlib.h> #include<time.h> void leer(int x[20][20],int *n); void m_mat(int x[20][20],int n1,int b[20][20],int n2,int c[20][20], int *n3); void mostrar(int x[20][20],int n); void main() { int n1,n2,n3; int a[20][20],b[20][20],c[20][20]; leer(a,&n1); Ing.Ricardo Castaeda

118

PROGRAMACION ORIENTADA A OBJETOS


leer(b,&n2); m_mat(a,n1,b,n2,c,&n3); } void leer(int x[20][20],int *n) { int i,j; cout<<"Ingrese el orden de la matriz: ";cin>>*n; randomize(); for(i=1;i<=(*n);i++) for(j=1;j<=(*n);j++) x[i][j]=random(10); mostrar(x,*n); } void m_mat(int x[20][20],int n1,int b[20][20],int n2,int c[20][20], int *n3) { int i,j,k; cout<<"\nEl producto de las matrices es:"<<endl; if(n1==n2) { for(i=1;i<=n1;i++) for(j=1;j<=n2;j++) { c[i][j]=0; for(k=1;k<=n1;k++) c[i][j]=c[i][j]+x[i][k]*b[k][j]; *n3=n1; *n3=n2; mostrar(c,*n3); } else cout<<"Matrices no se pueden multiplicar";getch(); } void mostrar(int x[20][20],int n) { int i,j; for(i=1;i<=n;i++) {for(j=1;j<=n;j++) cout<<x[i][j]<<" "; cout<<endl; } getch( ); } EJECUCION }

2013

119

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


PROBLEMAS

2013

1.- Dado un vector de nmeros enteros escriba un programa que me permita hallar el nmero que ms veces se repite (MODA). PROGRAMA /* CODIGO: POOC5PROB1 FECHA: 18 DE MARZO DE 2013 OBJETIVO: Halla la moda de un conjunto de nmeros enteros */ # include <iostream.h> # include <conio.h> void lectura (int a[50], int *n); void orden(int a[50], int n); int moda (int a[50], int n); void escritura(int mo); void main( ) { int a[50]; int n,mo; clrscr(); lectura (a, &n); orden(a, n); // Funcin que realiza la lectura mo=moda (a, n); escritura(mo); } void lectura(int a[50], int *n) { int i; clrscr(); cout << " Ingrese n => "; cin >> *n; for ( i=1; i<=(*n);i++) { cout<< " Ingrese valor "<< i<<" : "; cin>>a[i]; } } // Funcion que ordena el vector void orden(int a[50], int n) { int i,j,temp; for ( i=1; i<n ;i++) for (j=i+1;j<=n;j++) if( a[i]> a[j]) { temp = a[i]; a[i] = a[j]; a[j] = temp ; } } // Funcion que halla la moda int moda(int a[50], int n) { int b[50],rep[50],nsr,i,j,k; int nmoda,mayor; clrscr(); nsr=1;

120

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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); void escritura(int mo) { clrscr(); cout<< " La moda es ="<< mo; getch(); } EJECUCION } // Funcin que presenta el resultado } }

2013

2.- Escriba Un Programa Que Maneje Un Menu De Operaciones Con Arreglos El programa debe tener el siguiente men:
MENU ARREGLOS 1.- Lectura 2.- Adicin 3.- Eliminacin 4.- Bsqueda 5.- Ordenar 6.- Escritura 7.- Salir Ingrese opcin ==> __

121

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


PROGRAMA /* 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;

2013

122

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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 posicin de insercin: "; cin>> j; cout<<"Ingrese valor a insertar : "; for( i=(*n);i>=j;i--) v[i+1] = v[i]; v[j] = x; (*n)=(*n) +1; } void eliminacion(int v[50], int *n) { int i,j; clrscr(); cout<<"Ingrese posicin de valor a eliminar : "; cin>> j; for( i=j+1 ; i<=(*n);i++) v[i-1] = v[i]; (*n)=(*n) - 1; } void busqueda(int v[50], int n) { int i,x, pos; clrscr(); cout<<"Ingrese valor a buscar : "; cin>> x; for( i=1;i<=n;i++) if ( v[i]== x) { pos = i; break ; } if ( v [i ]== x) cout<< " Valor hallado en posicin: "<<pos; else cout<< " Valor no hallado "; cin>> x;

2013

123

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


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

2013

3.- Escriba un programa que lea un conjunto de n nombres y n notas y me muestre en una pantalla los nombres de los tres primeros alumnos por orden de mrito las tres mejores notas SOLUCIN PROGRAMA /* CODIGO: POOC5PROB3 FECHA: 18 DE MARZO DE 2013 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);

124

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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; for ( i=1; i<=(*n);i++) { cout<< " Ingrese nota "<< i<<" : "; cin>> vectornot[i];

2013

cout<< " Ingrese nombre "<< i<<" : "; gets(vectornom[i]); } } void orden(int vectornot[50],char vectornom[50][40], int n) { int i,j,temp1; char temp2[40]; for ( i=1; i<n ;i++) for (j=i+1;j<=n;j++) if( vectornot[i]< vectornot[j]) { temp1 = vectornot[i]; vectornot[i] = vectornot[j]; vectornot[j] = temp1 ; strcpy(temp2,vectornom[i]); strcpy(vectornom[i],vectornom[j]); strcpy(vectornom[j],temp2) ; } }

void escritura(int vectornot[50],char vectornom[50][40],int n) {int i;

125

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


clrscr(); gotoxy(35,2); cout<<"LISTA DE MERITO"; for ( i=1; i<=3;i++) { gotoxy(37,3+i); cout<< vectornot[i]<<" "<<vectornom[i]; } getch(); EJECUCION }

2013

Nota: Este programa trabaja con el concepto de vectores paralelos o sea que la informacin de los vectores est relacionada por el subndice esto significa que la nota 5 pertenece al alumno que tiene el nombre 5, por lo tanto la informacin se debe manejar en paralelo para que siga siendo consistente. 4.- Escriba un programa que halla el determinante de una matriz. SOLUCIN: 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]<<" ";

126

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

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](parmetro) est dentro { int i,j,k,primo,x; randomize(); Ing. Ricardo Castaeda

127

FACULTAD DE INGENIERIA MECANICA


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; { 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 } } void mostrarcentral ( )

2013

128

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

6.- Escribir un programa que lea un vector numrico 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<<" // Rotacin 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<<" getch(); } EJECUCION V["<<i<< "]: "<<v[i]<<endl; V["<<i<< "]: ";cin>>v[i];}

129

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


EJERCICIOS PROPUESTOS

2013

1) Escribir un programa que inserte un elemento dentro de un vector ordenado, considere el programa utilizando para su solucin la estructura while. 2) Escribir un programa que realice una bsqueda dentro de un vector ordenado, este programa debe detenerse cuando el valor es hallado, cuando se llegue al final o cuando el valor buscado es superado. 3) Escribir el cdigo necesario para rotar un vector en sentido antihorario o sea al revs de lo hecho en el problema 9. 4) Se tiene una matriz de letras, escriba usted un programa para que realice la bsqueda de una cadena ingresada dentro de la matriz(PUPILETRAS), la bsqueda debe ser de izquierda a derecha y de arriba hacia abajo en la matriz, los mensajes de salida ser Hallado y No hallado. 5) Escriba un programa que lea una matriz de n filas por m columnas y me imprima la transpuesta de dicha matriz. 6) Escriba un programa que me permita hallar la inversa de una matriz.

130

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

CAPITULO VI

131

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


6

2013

CADENAS EN LENGUAJE C,-Ahora veremos un caso especial de arrays, que es un tipo estandarizado. Se

trata de las cadenas de caracteres o "strings" (en ingls). Una cadena en C es un conjunto de caracteres, o valores de tipo "char", terminados con el carcter nulo, es decir el valor numrico 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 mxima>] Nota: En este caso los corchetes no indican un valor opcional, sino que son realmente corchetes, por eso estn en negrita. Cuando se declara una cadena hay que tener en cuenta que tendremos que reservar una posicin para almacenar el carcter 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 carcter '\0'. Tambin ser posible hacer referencia a cada uno de los caracteres individuales que componen la cadena, simplemente indicando la posicin. Por ejemplo el tercer carcter de nuestra cadena de ejemplo ser la o, podemos hacer referencia a l como cad1[2]. Los ndices tomarn valores empezando en el cero, as el primer carcter de nuestra cadena sera cad1[0], que es la a'. Una cadena puede almacenar informaciones como nombres de personas, mensajes de error, nmeros de telfono, . La asignacin directa slo est permitida cuando se hace junto con la declaracin. 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 captulo 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. Adems, frecuentemente nos encontraremos a nosotros mismos creando nuevas funciones que bsicamente hacen un tratamiento de cadenas.

6.1

Lectura de una cadena del teclado

#include <iostream.h> Veamos el siguiente cdigo: 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 carcter blanco. As, cuando se lee Hola que tal la primera cadena, en cad slo se almacena Hola. Para resolver el problema, utilizar la funcin gets () que lee una cadena completa. La sintaxis de la funcin gets ser:

132

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


#include <stdio.h> char *gets(char *s)

2013

Descripcin: Captura una cadena desde el stdin. Esta cadena es tomada de una lnea y colocada en s, en el fin de lnea se pondr el carcter \n. esto nos permite considerar algunos blancos intermedios que de otra manera no se consideraran. El programa anterior quedara 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 funcin 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, ledo 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 ledos con cin : "<<nombre_apellidos1<<endl; cout<<"Salida del nombre y apellidos ledos con gets: "<<nombre_apellidos2; getch(); } EJECUCION

133

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

6.2 Funciones para manejar cadenas: Copia una cadena en otra cadena. strcpy #include <string.h> char *strcpy(char *destino, const char *origen) Copia la cadena de caracteres de origen a destino. Retorna destino. Copia un nmero de bytes de una cadena a otra. strncpy #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 cdigo sabiendo que en el cdigo los cuatro primeros caracteres son el ao de ingreso, mostrar en la salida el nombre y el ao de ingreso. PROGRAMA /* CODIGO: POOC6E2 fecha : 18 DE MARZO DE 2013 objetivo: Copia cadenas completas o parte de una cadena entrada: nombre y cdigo salida: nombre, ao 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<<"Ao de Ingreso : "<<ingreso; getch(); } EJECUCION Ing.Ricardo Castaeda

134

PROGRAMACION ORIENTADA A OBJETOS

2013

Compara dos cadenas. strcmp #include<string.h> int strcmp(const char *s1, const char *s2) Compara una cadena con otra, iniciando por el primer character hasta que difieran o se alcanze el final. Si s1 es menor que s2 devuelve un valor menor que 0. Si s1 es igual que s2 devuelve un valor igual a 0. Si s1 es mayor que s2 devuelve un valor mayor que 0.

Ejemplo 3.- Escriba un programa que ingrese 3 nombres y los ordene utilizando la funcin strcmp y tambin strcpy. PROGRAMA /* CODIGO: POOC6E3 fecha : 18 DE MARZO DE 2013 objetivo: Ordena tres nombres en forma alfabtica entrada: nombre1,nombre2 y nombre3 salida: las tres entradas ordenadas alfabticamente */ #include<iostream.h> #include<conio.h> #include<stdio.h> void intercambio(char na[30],char nb[30]); void main() { char nombre1[30],nombre2[30],nombre3[30]; int i; clrscr();//limpia pantalla cout<<"Ingrese nombre 1: "; gets(nombre1); cout<<"Ingrese nombre 2: "; gets(nombre2); cout<<"Ingrese nombre 3: "; gets(nombre3); for(i=1;i<=2;i++) {if (strcmp(nombre1,nombre2)>0) intercambio(nombre1,nombre2); if (strcmp(nombre2,nombre3)>0) intercambio(nombre2,nombre3); } cout<< "Nombres Ordenados "<<endl; cout<<nombre1<<endl; cout<<nombre2<<endl; cout<<nombre3<<endl; getch();

135

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


} void intercambio(char na[30],char nb[30]) { char temp[30]; strcpy(temp,na); strcpy(na,nb); strcpy(nb,temp); } EJECUCION

2013

Adiciona una cadena a otra. strcat Syntaxis #include <string.h> char *strcat(char *dest, const char *src); Descripcion Adiciona una cadena a otra, strcat adicion una copia src al final de dest. La longitud de el resultado es strlen(dest) + strlen(src).

Calcula la longitud de una cadena.strlen Syntax #include <string.h> size_t strlen(const char *s); Descripcion Calcula la longitud de una cadena. Strlen calcula la longitude de s.

Ejemplo 4.- Escriba un programa que ingrese ao de ingreso, orden de merito y dos caracteres y genere su codigo concatenando estos datos. PROGRAMA /* CODIGO: POOC6E4 fecha : 18 DE MARZO DE 2013 objetivo: Ejemplo de la funcin strlen y strcat() entrada: Ingresa un ao y orden de merito mas dos letras salida: Codigo generado */ #include<iostream.h> #include<conio.h> #include<stdlib.h> #include<string.h> void main() { int agno,merito;

136

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


char agnoc[5],meritoc[5],letras[3]; char codigo[13]=""; clrscr(); cout<<"Ingrese un ao: ";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

2013

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 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 bsico que nos permita lee un vector de cadenas donde almacenemos un conjunto de n cursos 1 2 \0 b 2 2 \0 c 3 4 \0

137

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


PROGRAMA /* CODIGO: POOC6E5 fecha : 18 DE MARZO DE 2013 objetivo: LECTURA Y ESCRITURA DE NOMBRES DE CURSOS entrada: Ingresa un arreglo de cursos salida: Muestra los cursos ingresados */ #include<iostream.h> #include<conio.h> #include<stdlib.h> #include<string.h> #include<stdio.h> void main() { int i,n; char curso[50][15];//Puede almacenar hasta 50 cursos clrscr(); cout<<"Ingrese nmero de cursos ==> ";cin>>n; for(i=1;i<=n;i++) { cout<<"Ingrese curso["<<i<<"]: "; gets(curso[i]); } //salida clrscr(); gotoxy(35,2);cout<<" CURSOS "; for(i=1;i<=n;i++) { gotoxy(33,4+i);cout<<curso[i];} getch(); } EJECUCION

2013

Ejemplo 6.- Escribir un programa bsico que nos permita lee un vector de cadenas donde almacenemos un conjunto de n nombres y despus lo ordene en forma alfabtica. PROGRAMA /* CODIGO: POOC6E6 fecha : 18 DE MARZO DE 2013 objetivo: Ordenamiento alfabtico de nombres entrada: Ingresa un arreglo de nombres salida: Muestra los nombres ingresados ordenados alfabticos */ #include<iostream.h>

138

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


#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(); }

2013

EJECUCION

139

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


PROBLEMAS

2013

1.- Tenemos dos vectores de cadenas, el primero almacena cdigos 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 bsqueda, 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 }

140

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

2.- Deseamos generar Emails para un grupo de alumnos de la facultad de Ingeniera Mecnica (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 crdenas, el email generado seria: jocardenas@fim.edu.pe, utilice las funciones necesaria que hemos revisado para generar los emails de un grupo de n alumnos de la facultad de ingeniera mecnica (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

141

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

3.- Tenemos dos vectores de cadenas, el primero tiene el nombre del alumno y el segundo tiene el curso en el cual est matriculado, se desea escribir un programa que lea el nombre de un curso y me genere un listado alfabtico de todos los alumnos matriculados en el curso. PROGRAMA /* CODIGO: POOC6PROB3 fecha : 18 DE MARZO DE 2013 objetivo: Genera un listado alfabetico de un curso entrada: nombre y curso matriculado ademas del curso para obtener el listado salida: Listado */ #include<iostream.h> #include<conio.h> #include<stdio.h> #include<string.h> void main() { char nombre[40][20],curso[40][15],cursox[15]; char lista [40][20],temp[20]; int i,j,n,n1; clrscr();//limpia pantalla cout<<"Ingrese numero de alumnos ==> ";cin>>n; for(i=1;i<=n;i++) { cout<<"Ingrese apellidos y nombres["<<i<<"]: "; gets(nombre[i]); cout<<"Ingrese nombre del curso ["<<i<<"]: "; gets(curso[i]); } cout<<"Ingrese nombre del curso";gets(cursox); //salida n1=0; for(i=1;i<=n;i++) if(strcmp(cursox,curso[i])==0) {n1=n1+1; strcpy(lista[n1],nombre[i]); clrscr(); //ordenamiento de la lista for(i=1;i<n1;i++) for(j=i+1;j<=n1;j++) if(strcmp(lista[i],lista[j])>0) {strcpy(temp,lista[i]); strcpy(lista[i],lista[j]); strcpy(lista[j],temp); clrscr(); gotoxy(35,2);cout<<" NOMBRES ORDENADOS"; for(i=1;i<=n1;i++) { gotoxy(33,4+i);cout<<lista[i];} getch(); } EJECUCION } }

142

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

EJERCICIOS PROPUESTOS 1. Escribir un programa que lea el codigo de un alumno compuesto por ao que ingreso + puesto que ingreso y una letra y halle el ao de ingreso y adems orden de merito para n alumnos. Ejemplo lee 2005193c y muestra ao de ingreso = 2005 y orden de merito 193. No olvidar que esto se tiene que realizar para los 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 estn matriculados y el tercero con la nota, escribir un programa que liste todos los aprobados adems del promedio total de un curso particular. 3. Se tiene un conjunto de cdigos, escriba un programa que me permita encriptarlos intercambiando sus caracteres y adems tiene que mostrar tambin la rutina que los desencripta. 4. Escribir el cdigo 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 telfonos, se desea escribir un listado de todos los que tienen celular. El listado debe incluir nombre y direccin.

143

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

CAPITULO VII

144

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


REGISTROS EN LENGUAJE C

2013

7 Definicin.- Un registro o una estructura en lenguaje C es una coleccin de variables simples que pueden
contener diferentes tipos de datos. Es un tipo de dato definido por el usuario. 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 ALUMNO CODIGO NOMBRE DIRECCION ESCUELA TELEFONO codalu nomalu diralu escalu telalu REGISTRO REGALU entero largo carcter de longitud 30 carcter de longitud 40 carcter de longitud 2 entero largo

Vemos que cada caracterstica de la entidad alumno se convierte en un campo del registro regalu. Continuemos con la entidad curso: ENTIDAD CURSO CODIGO NOMBRE NOTAFIN codcur nomcur notcur REGISTRO REGCUR carcter de longitud 5 carcter de longitud 30 real

Vemos claramente que los campos son las caractersticas que definen a la entidad y almacenaran estos datos de una entidad particular. Si nosotros visualizamos un registro, seria de la siguiente forma: Estructura de REGALU codalu nomalu diralu escalu telalu

Estructura de REGCUR codcur nomcur notcur

145

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


Si vemos un arreglo de estos registros se vera as codalu nomalu diralu escalu telalu

2013

7.2 Creacin y manejo de registros El proceso de crear una estructura o registro tiene dos etapas.064+70 Crear la variable estructurada Ejemplo: struct ciudadano { long dni; // dato miembro dni char nombre[40];// dato miembro nombre char direccin[50]; // dato miembro direccin }

Posteriormente las variables persona1 y persona2 se definen como cualquier otra variable, en este caso del tipo de nombre de la estructura. ciudadano persona1, persona2; // se declaran dos variables tipo registro. 7.3 Acceso a miembros del registro.- Se realiza utilizando el nombre del registro seguido del nombre del campo con un punto intermedio. persona1.dni = 08234101; persona2.dni = 91012345; strcpy( persona1.nombre, Luis Rojas); strcpy( persona2.nombre, Jose Castaeda); strcpy( persona1.direccion, San Borja, Los alamos 257); strcpy( persona2.direccion, Surco, leoncio Prado 820); 7.4 Inicializacin de estructuras.- Los campos de un registro se pueden iniciar individualmente o todos a la vez : Ejemplo: struct caja { int largo; int ancho; int altura; }; Caja c1 = {4, 5,2} caja c2, c3;

146

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


c2.largo = 3; c3.ancho = 1;

2013

7.5 Asignacin de estructuras.- Podemos intercambiar informacin entre dos estructuras directamente de registro a registro. Ejemplo: De los casos anteriores es vlido 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 ao; } struct empleado { fecha dia_ingreso; char nombre[50]; } EJEMPLO 1.- Vamos a desarrollar un programa que lea y escriba un arreglo de n registros, cuya estructura es : Dni Nombre cadena de 10 caracteres cadena de 30 caracteres

Direccin 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);

147

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


cout<< " DIRECCION= ";gets(p[i].dirper); cout<<setiosflags(ios::left); // Salida de resultados clrscr(); cout<< " LISTA DE REGISTROS "<<endl; cout<< "==================== "<<endl; cout<<setw(10)<<"DNI"; cout<<setw(20)<<"NOMBRE"; cout<<setw(30)<<"DIRECCION"<<endl; cout<< "====================================================== "<<endl; for(i=1;i<=n;i++) {cout<<setw(10)<<p[i].dniper; cout<<setw(20)<< p[i].nomper; cout<<setw(30)<<p[i].dirper<<endl; } getch(); } EJECUCION }

2013

EJEMPLO 2.- Se tiene un arreglo de registros, cuya estructura es : codigo nombre examen1 examen2 notafinal cadena de 8 caracteres Codigo de alumno cadena de 30 caracteres Nombre del alumno entero entero real Nota del examen parcial Nota del examen final promedio de practicas Nota final

promediop real

Primero debe ingresar los datos de cada alumno, la nota final ser calculada, considerando examen1 (peso 1), examen2 (peso2) y promediop(peso2). El codigo no puede ser repetido, esta condicin debe ser probada en cada ingreso. Finalmente presentar resultados. PROGRAMA /* CODIGO: POOC7E2 FECHA: 21 DE MARZO DE 2013 OBJETIVO: Ingresa registros sin codigo repetido */ #include<iostream.h> #include<conio.h> #include<stdio.h> #include<iomanip.h> struct notas

148

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


{ 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 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); ==> ";gets(n[i].codalu);

2013

149

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


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

2013

150

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


PROBLEMAS

2013

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; // cdigo del producto char desite[20]; // descripcin del producto char ubiite[4]; // ubicacin del producto float nunite; // nmero 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";

151

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


gotoxy(30,7); cout<< "3.- Eliminacion"; gotoxy(30,8); cout<< "4.- Bsqueda"; gotoxy(30,9); cout<< "5.- Ordenamiento "; gotoxy(30,10);cout<< "6.- Escritura"; gotoxy(30,11);cout<< "7.- Salir "; gotoxy(30,16);cout<< "Ingrese Opcion ==> ";cin >> opcion; switch(opcion) { case '1' : lectura(vprod, &num);break; case '2' : adicion(vprod, &num);break; case '3' : eliminacion(vprod, &num);break; case '4' : busqueda(vprod, num);break; case '5' : orden1(vprod, num);break; case '6' : escritura(vprod, num);break; } }while(opcion != '7'); } void lectura(item prod[50], int *n) { int i; clrscr(); cout << " Ingrese n => "; cin >> (*n); for ( i=1; i<=(*n);i++) { cout<< " Ingrese codigo "<< i<<" : "; cin>> prod[i].codite; cout<< " Ingrese descripcion "<< i<<" : "; gets(prod[i].desite); cout<< " Ingrese ubicacin "<< i<<" : "; cin>> prod[i].ubiite; cout<< " Ingrese # de unidades"<< i<<" : "; cin>> prod[i].nunite; cout<< " Tipo de unidad kilo(1),litro(2),c/u(3) "<< i<<" : "; cin>> prod[i].tunite; cout<< " Ingrese precio por unidad del producto"<< i<<" : "; cin>> prod[i].pruite; } } void adicion(item prod[50], int *n) { int codx,i; item reg1; clrscr(); cout<<"Ingrese codigo : "; cin>> codx; for( i=1;i<=(*n);i++) if(prod[i].codite == codx) break; if(prod[i].codite == codx) {cout<< "error codigo ya existe "; getch();} else { reg1.codite = codx; cout<< " Ingrese descripcion : "; gets(reg1.desite);

2013

152

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


cout<< " Ingrese ubicacin : "; cin>> reg1.ubiite; cout<< " Ingrese # de unidades : "; cin>> reg1.nunite; cout<< " Tipo de unidad kilo(1),litro(2),c/u(3): "; cin>> reg1.tunite; cout<< " Ingrese precio por unidad del producto: "; cin>> reg1.pruite; prod[(*n)+1] = reg1; (*n)=(*n) +1; cout<< " Registro adicionado..."; getch(); } } void eliminacion(item prod[50], int *n) { int codx,i,j; char rpta; clrscr(); cout<<"Ingrese codigo : "; cin>> codx; for( i=1;i<=(*n);i++) if(prod[i].codite == codx) { j=i; break; } if(prod[i].codite != codx) {cout<< " Registro no existe... "; getch();} else {cout<< " Descripcin : "<<prod[i].desite<<endl; cout<< " Ubicacin : "<<prod[i].ubiite<<endl; cout<< " # de unidades : "; prod[i].nunite<<endl; cout<< " Tipo de unidad kilo(1),litro(2),c/u(3): "<<prod[i].tunite<<endl; cout<< " Ingrese precio por unidad del producto: "<<prod[i].pruite<<endl<<endl; cout<<"Desea eliminar s/n"; cin>>rpta; if (toupper(rpta)=='S') { for( i=j+1 ; i<=(*n);i++) prod[i-1] = prod[i]; (*n)=(*n) - 1; } getch(); } } void busqueda(item prod[50], int n) { int codx,i; clrscr(); cout<<"Ingrese codigo : "; cin>> codx; for( i=1;i<=n;i++) if(prod[i].codite == codx) break; if(prod[i].codite != codx) {cout<< " Registro no existe... "; getch();} else

2013

153

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


{cout<< " Descripcin : "<<prod[i].desite<<endl; cout<< " Ubicacin : "<<prod[i].ubiite<<endl; cout<< " # de unidades : "<< prod[i].nunite<<endl; cout<< " Tipo de unidad kilo(1),litro(2),c/u(3): "<<prod[i].tunite<<endl; cout<< " Ingrese precio por unidad del producto: "<<prod[i].pruite<<endl; getch(); } } void orden1(item prod[50], int n) { int i, j; item temp; for ( i=1; i<n ;i++) for (j=i+1;j<=n;j++) if( prod[i].codite> prod[j].codite) { temp = prod[i]; prod[i] = prod[j]; prod[j] = temp ; } { int i; clrscr(); cout<<" CODIGO PRODUCTO UBICACION # UNIDADES TIPO PRECIO/U "; cout<<endl; cout<<endl; for ( i=1; i<=n;i++) { cout<< prod[i].codite<<" "; cout<< prod[i].desite<<" "; cout<< prod[i].ubiite<<" "; cout<< prod[i].nunite<<" "; cout<< prod[i].tunite<<" "; cout<< prod[i].pruite<<endl; } getch(); } EJECUCION } void escritura(item prod[50], int n)

2013

154

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


2. Dada la siguiente estructura(registro) codigo nombre nivel sueldo entero char 40 char //solo existe A,B,C real

2013

a) Declarar la estructura. b) Escribir el men Leer Adicionar Eliminar Escribir Salir

c) Escribir las funciones Leer, adicionar, eliminar y escribir. SOLUCIN PROGRAMA /* CODIGO: 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; // cdigo 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";

155

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


gotoxy(30,7); cout<< "3.- Eliminar"; gotoxy(30,8); cout<< "4.- Escribir"; gotoxy(30,9); cout<< "5.- Salir "; gotoxy(26,16); cout<< "Ingrese Opcion ==> "; switch(opcion) { case '1' : leer(v, &num);break; case '2' : adicionar(v, &num);break; case '3' : eliminar(v, &num);break; case '4' : escribir(v, num);break; } }while(opcion != '5'); } void leer(empleado p[50], int *n) { int i; clrscr(); cout << " Ingrese n => "; cin >> (*n); clrscr(); gotoxy(30,2); cout<< "LECTURA"; gotoxy(30,3); cout<< "======="; cout<<endl<<endl; for ( i=1; i<=(*n);i++) { cout<< " Ingrese Codigo del Empleado "<< i<<" : "; cin>> p[i].codemp; cout<< " Ingrese Nombre y Apellido "<< i<<" : "; gets(p[i].nomemp); cout<< " Ingrese Nivel Remunerativo "<< i<<" : "; cin>> p[i].nivemp; cout<< " Ingrese Sueldo del Empleado "<< i<<" : "; cin>> p[i].sueemp; } } void adicionar (empleado p[50], int *n) { int codx,i; empleado aux; clrscr(); gotoxy(30,2); cout<< "ADICION"; gotoxy(30,3); cout<< "======="; cout<<endl<<endl; cout<<"Ingrese codigo : "; cin>> codx; for( i=1;i<=(*n);i++) if(p[i].codemp == codx) break; if(i==((*n)+1)) i--; if(p[i].codemp == codx) {cout<< "Error Codigo ya existe "; getch();} else { aux.codemp = codx; cin >> opcion;

2013

156

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


cout<< " Ingrese nombre cout<< " Ingrese sueldo p[*n] = aux; getch(); } } void eliminar(empleado p[50], int *n) { int i,j, codx; char rpta; clrscr(); gotoxy(30,2); cout<< "ELIMINACION"; gotoxy(30,3); cout<< "==========="; cout<<endl<<endl; cout<<"Ingrese Codigo a Buscar : "; cin>> codx; for( i=1;i<=(*n);i++) if ( p[i].codemp == codx) { j = i; break ; } if ( p[i].codemp == codx) {cout<< " Registro Hallado "<<endl; cout<< p[j].nomemp<<" "; cout<< p[j].nivemp<<" "; cout<< p[j].sueemp<<endl; cout<<"Desea eliminar s/n => "; cin>> rpta; if((rpta == 's') || (rpta == 'S')) { if ( j!=(*n)) for( i=j+1 ; i<=(*n);i++) p[i-1] = p[i]; (*n)=(*n) - 1; }// Se elimina registro } else {cout<< " Registro no Hallado "; getch(); } } void escribir(empleado p[50], int n) {int i; clrscr(); cout<<setiosflags(ios::left); : "; gets(aux.nomemp); : "; cin>> aux.sueemp; cout<< " Ingrese nivel remunerativo: "; cin>> aux.nivemp; (*n)=(*n) +1; cout<< " Registro adicionado...";

2013

157

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


cout<<setw(10)<<"|CODIGO |"; cout<<setw(20)<<"NOMBRE cout<<setw(6)<<"NIVEL|"; cout<<setw(8)<<"SUELDO |"; cout<<endl; cout<<"==========================================="<<endl; for ( i=1; i<=n;i++) { cout<<setw(10)<<p[i].codemp; cout<<setw(20)<<p[i].nomemp; cout<<setw(5)<<p[i].nivemp; cout<<setw(8)<<p[i].sueemp<<endl; } getch(); } EJECUCION |";

2013

3. Se desea escribir un programa que procese el examen sustitutorio de "n" alumnos, considerar el siguiente registro: struct notas { char codalu [10]; // Cdigo del alumno char codcur [7]; // Cdigo del curso float pp ; int ep ; int ef ; int es ; float pf ; // Promedio de prcticas // Examen parcial // Examen final // Examen sustitutorio // 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 ms desfavorable de haber rendido los dos.

158

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


e. Ordenar los promedios finales por merito y a quien corresponde.*/ PROGRAMA /* CODIGO: POOC7PROB3 FECHA: 21 DE MARZO DE 2013

2013

OBJETIVO: Programa que procesa notas, considerando las pruebas no rendidas como 99, para clculos 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; }

159

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


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

2013

160

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


cout<<setprecision(2); cout<<setiosflags(ios::left); cout<<" cout<<" LISTADO POR ORDEN DE MERITO"<<endl; ==========================="<<endl;

2013

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 electrnica de clientes por dia de la semana, y elaborar para el dia de la semana, un reporte alfabtico de a-z. SOLUCION PROGRAMA /* CODIGO: POOC7PROB4 FECHA: 21 DE MARZO DE 2013 OBJETIVO: Elaborar una agenda electrnica de sus clientes por dia de la semana, y elaborar para el dia de la semana, un reporte alfabtico */ #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]; };

161

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


void main() { clientes agenda[100]; agedia diaria[25],temp; char diax[10]; int i,j,k,n; clrscr(); cout<<"Ingrese el nmero de clientes: "; cin>>n; for(i=1;i<=n;i++) {cout<<"Nombre: "; cout<<"Dia: "; cout<<"Tema: "; gets(agenda[i].nomcli);

2013

cin>>agenda[i].diasem; gets(agenda[i].temcli); }

//preparando agenda de un dia determinado clrscr(); cout<<"Ingrese dia: "; cin>>diax; k=0; for(i=1;i<=n;i++) if(strcmp(diax,agenda[i].diasem)==0) {k=k+1; strcpy(diaria[k].nomcli,agenda[i].nomcli); strcpy(diaria[k].temcli,agenda[i].temcli); } for(i=1;i<k;i++) for(j=i+1;j<=k;j++) if(strcmp(diaria[i].nomcli,diaria[j].nomcli)>0) {temp=diaria[i]; diaria[i]=diaria[j]; diaria[j]=temp; } gotoxy(7,14);cout<<"NOMBRE"; gotoxy(48,14);cout<<"TEMA"; for(i=1;i<=k;i++) {gotoxy(5,15+i);cout<<diaria[i].nomcli; gotoxy(48,15+i);cout<<diaria[i].temcli;} getch(); } EJECUCION

162

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


EJERCICIOS PROPUESTOS

2013

1. Se desea realizar un mantenimiento de registros de los alumnos de COMPUTACION I, para esto vamos a utilizar la siguiente estructura: struct alumno{ int cdigo; char nombre [40]; int exampar; //Examen Parcial int examfin; //Examen Final float pp; }; // Promedio de Practicas En el mantenimiento considere: a) Adicionar Registros b) Eliminar Registros. c) Modificar Registros. 2. Se desea escribir un programa que procese el examen sustitutorio de n alumnos, considerar el registro. struct notas { char codalu [10]; // Cdigo del alumno char codcur [7]; // Cdigo del curso float pp ; int ep ; int ef ; int es ; float pf ; } // Promedio de practicas // Examen parcial // Examen final // Examen sustitutorio // 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 c.

pf

pp ep 2 * ef 4

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; // Cdigo del empleado

char nomemp [40]; // Nombre del empleado float sb ; int diasf; int horase ; float descuentos ; float sn; // Sueldo Bruto // Das faltos // Horas extras // Descuentos // 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 da falto. 50% de bonificacin por cada hora extra. Ing. Ricardo Castaeda

163

FACULTAD DE INGENIERIA MECANICA

2013

CAPITULO VIII

164

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

8 CONCEPTOS DE LA PROGRAMACIN ORIENTADA A OBJETOS.-La programacin orientada a objetos


existe desde la creacin de los primeros lenguajes de programacin. Los conceptos que se manejan de abstraccin de datos, herencia y Polimorfismo se manejaban en estos lenguajes, pero con el desarrollo del lenguaje C y la programacin visual se utiliza este tipo de programacin con mayor profusin. Programacin estructurada, la programacin estructurada se basa en la creacin de una funcin principal y una serie de rutinas(funciones) llamadas desde la funcin principal, que hacen que el desarrollo sea horizontal contrastando con la programacin lineal cuyo desarrollo es vertical. Tambin podemos indicar que la informtica en su parte de programacin era: Programa = Algoritmo + Estructura de datos. La ventaja de este modelo

era importante pero todava se segua manejando por separado el estado del sistema que descansa en la estructura de datos y los procedimientos que actan sobre el sistema, tampoco hay una consistencia de datos, esto queda librado al criterio del programador, estas desventajas y otras ms se van a superar con la programacin orientada a objetos. 8.1 Programacin orientada a objetos.- La programacin orientada a objetos es la ultima modificacin, donde ya se incorporan algunos aspectos tomando como modelo la vida real. Tipos de Datos Abstractos Algunos autores describen la programacin orientada a objetos como programacin 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 informtica y la automatizacin 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 estn claramente definidos por qu primeramente hay que crear un modelo de las entidades que actan 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 abstraccin 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 informacin es necesaria, que funciones necesitamos que trabajen: Algunas propiedades serian DNI Nombre

165

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


Fecha de nacimiento, Talla Domicilio, Color de ojos Telfono

2013

pero nosotros nos abstraeremos y tomaremos solo las propiedades necesarias para resolver el problema. Este modelo solo implica propiedades que son necesarias para cumplir con los requerimientos de la aplicacin, por ejemplo el nombre, fecha de nacimiento y el DNI. A estas propiedades se les llama los datos del modelo ( alumno). Ahora ya se tienen descritas a los alumnos reales por medio de un alumno abstracto. Definiremos algunas operaciones para manejar los alumnos: Matricula de un alumno nuevo. Evaluacin del alumno en un curso.

Para resumir, la abstraccin es la estructuracin de un problema en entidades bien definidas por medio de la definicin de sus datos y operaciones. Entonces, estas entidades combinan datos y operaciones. No estn desacoplados unos de otras. Propiedades de los Tipos de Datos Abstractos El ejemplo de la seccin anterior muestra que por medio de la abstraccin t creas una entidad bien definida que puede ser adecuadamente manejada. Estas entidades definen la estructura de datos de un conjunto de elementos. Por ejemplo para cada alumno del Instituto un nombre, fecha de nacimiento y DNI. La estructura de los datos puede ser accesada solamente por medio de operaciones definidas. Este conjunto de operaciones es llamada interface y es exportada por la entidad. Una entidad con las propiedades recin descritas se conoce como un tipo de datos abstracto (TDA).

TIPO DE DATOS ABSTRACTO ESTRUCTURA DE DATOS OPERACIONES CON EL TDA


Figura 8.2 Un tipo de datos abstracto (TDA) La Figura 8.2 muestra un TDA que consiste en una estructura de datos abstracta y operaciones. Solamente las operaciones son visibles desde afuera y definen la interface. Definicin (Tipo de Datos Abstracto) Un tipo de datos abstracto (TDA) se caracteriza por que tiene dos elementos diferenciados: La interfaz de utilizacin. La representacin

La representacin debe permanecer oculta y solo utilizaremos sus operaciones para trabajar con los elementos. Para construir un tipo abstracto debemos: 1. Exponer una definicin de tipo. 2.Definir las operaciones (funciones) que permitan operar con instancias de ese tipo. 3.Ocultar la representacin de los elementos del tipo de modo que solo se pueda actuar sobre ellos con las operaciones proporcionadas..

166

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


4. Poder hacer instancias mltiples del tipo.. Tipos bsicos de operaciones en un TDA. Las operaciones bsicas que deberamos tener pueden ser: Constructores: Crean una nueva instancia del tipo.

2013

Transformacin: Cambian el valor de uno o ms elementos de una instancia del tipo. Observacin: Accesamos sin modificarlos. Iteradores: Procesa componentes en forma secuencial.

Tipos Genricos 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 deberan operar del mismo modo sobre otros tipos de datos. Por ejemplo, uno puede pensar en listas de manzanas, carros o an listas. La definicin semntica de una lista siempre es la misma. Solamente el tipo de los elementos de datos cambia de acuerdo al tipo sobre el cul deba operar la lista.. Esta informacin adicional podra ser especificada por un parmetro genrico que es especificado al momento de la creacin de la instancia. As, una instancia de un TDA genrico es en la prctica una instancia de una variante particular del TDA. Una lista de manzanas puede ser declarada como sigue : List<Apple> listOfApples; Los corchetes angulares encierran ahora el tipo de datos para el cul una variante del TDA genrico List sera creada. listOfApples ofrece la misma interface que cualquiera otra lista, pero opera en el tipo Apple. Conceptos de Orientacin a Objetos Las secciones anteriores introducen ya algunos conceptos "de orientacin a objetos". Sin embargo, stos fueron aplicados de una manera terica, ahora pasemos ya a visualizar las caractersticas del C++ y les damos nombres tal y como se usan en los lenguajes de programacin orientada a objetos existentes. Las caractersticas de C++ como lenguaje orientado a objetos son: o Abstraccin o Variables de instancia Mtodos de instancia Variables de clase Mtodos de clase

Encapsulacin De variables: privada, pblica y protegida. De mtodos: privada, pblica y protegida

Herencia Sencilla y mltiple Unidades genricas Polimorfismo

Teniendo en cuenta los conceptos de herencia y Polimorfismo tenemos todo el panorama de la programacin orientada a objetos. La comunicacin entre objetos es por medios de mensajes que viene a ser la forma de invocar a un objeto. Hemos dicho que un objeto tiene caractersticas llamadas atributos y procedimientos llamados mtodos. Los mensajes tienen un mtodo (procedimiento) que se ejecutara cuando es invocado. Ing. Ricardo Castaeda

167

FACULTAD DE INGENIERIA MECANICA


Mensaje (Se Invoca Mtodo)

2013

Objeto Emisor

Objeto Receptor

Resultado De La Ejecucin Del Mtodo Figura 8.3 8.2 Clases.- Un programa utiliza un grupo de objetos y estos objetos se crean utilizando un tipo de dato denominado clase. Podemos decir que la clase es un registro (struct) evolucionado que ha encapsulado los datos y las funciones incorporndoles adems niveles de visibilidad. En la clase los datos son las propiedades de la entidad que este representa y las funciones son las tareas representativas de la entidad. De esta manera las clases representan las entidades del mundo real de una manera ms precisas que los registros. Adems las clases tienen dos caractersticas que la hacen elementos muy eficientes en la programacin, estas son: Herencia Polimorfismo

8.3 Objeto.- Son las instancias de una clase, pues esta es la plantilla que nos permite crear los objetos de acuerdo a la declaracin de clase. Ejemplo: Dada la siguiente declaracin de clase: 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);} };

168

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


Representacin Grfica Clase Rectngulo Largo Ancho

2013

Datos

Set_largo Set_ancho Calcular _area


Mtodos

Figura 8.4 Posteriormente nosotros podemos declarar un objeto de la clase rectngulo de la siguiente manera: rectngulo R1; Esto significa que R1 tendr 4 componentes R1.largo R1.ancho R1.set_largo(int l) R1.set_ancho(int a) R1.get_largo( ) R1.get_ancho( ) R1.calcular_area( ) PROGRAMA /* CODIGO: POOC8E1 FECHA: 21 DE MARZO DE 2013 OBJETIVO: Desarrollar un ejemplo bsico 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( ) dato miembro de tipo entero. dato miembro de tipo entero funcin miembro que nos permite asignar un valor a un dato miembro. funcin miembro que nos permite asignar un valor a un dato miembro. funcin miembro que nos permite devolver valor de dato miembro funcin miembro que nos permite devolver valor de dato miembro funcin miembro que calcula el rea y devuelve el valor.

169

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


{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

2013

8.4 Herencia: Caracterstica mediante la cual podemos reutilizar una declaracin de una clase y crear otra clase. Por ejemplo: Creamos la clase estudiante.a clase estudiante_universitario hereda de la clase estudiante y adiciona. La clase estudiante_universitario_uni hereda de la anterior y tambin adiciona.Ver ejemplo 4. 8.5 Polimorfismo: Caracterstica que nos permite crear funciones que utilizando un mismo nombre respondern de forma diferente de acuerdo a la clase a la cual pertenecen. Por ejemplo: Dada la siguiente declaracin de claseen el ejemplo 2: PROGRAMA /* CODIGO: POOC8E2 FECHA: 21 DE MARZO DE 2013 OBJETIVO: Desarrollar un ejemplo bsico 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( )

170

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


{ 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

2013

Ventajas de la programacin orientada a objetos.- Son las siguientes: Facilidad de Mantenimiento: Los programas son ms fciles de leer y de entender. Facilidad de modificacin: Se pueden modificar los objetos al modificar rpidamente la herencia. Reusabilidad: Se pueden utilizar varias veces. Fiabilidad: Se utilizan modelos ya comprobados.

171

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


PROBLEMAS

2013

1.- Desarrollar 3 programas de aplicacin para ver la evolucin desde la primera etapa de registro (struct) hasta el objeto. Los programas son: A) Programa con registros lee 2 notas y calcula el promedio con una funcin externa al registro. B) Programa con registros lee 2 notas y calcula el promedio con una componente funcin. C) Programa con objetos lee 2 notas y calcula el promedio con una funcin miembro. PROGRAMA(A) /* CODIGO: POOC8PROB1A FECHA: 21 DE MARZO DE 2013 OBJETIVO: Primer programa ejemplo de una estructura clsica*/ #include<iostream.h> #include<conio.h> struct notas { float nota1; float nota2; }; float calcula_prom (float p1, float p2); void main ( ) {notas n; clrscr( ); cout << "ingrese 1ra. Nota => "; cin >> n.nota1; cout << "ingrese 2da. Nota => "; cin >> n.nota2; cout << " El promedio es = " << calcula_prom ( n.nota1, n.nota2); getch( ); } float calcula_prom (float p1, float p2) { float prom ; prom = (p1 + p2)/2.0; return(prom); } EJECUCION

PROGRAMA(B) /* CODIGO: POOC8PROB1B FECHA: 21 DE MARZO DE 2013 OBJETIVO: Segundo programa ejemplo tenemos la estructura pero ya tenemos una componente funcin 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;

172

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

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 Castaeda

173

FACULTAD DE INGENIERIA MECANICA


n.set_nota2( a2); cout << " El promedio es = " << n.calcula_prom ( ); getch( ); } EJECUCION

2013

2.- Escriba un programa que defina la clase cuadrado y cubo adems debe calcular el rea del cuadrado, el rea del cubo y el volumen. SOLUCIN 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 Castaeda

174

PROGRAMACION ORIENTADA A OBJETOS


{ cuadrado C1; cubo 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 C2; int LADO;

2013

EJERCICIOS PROPUESTOS 1) Escribir un programa que me permita crear la clase persona, considerando, dni,nombre, fecha de nacimiento , distrito donde vive y telfono. El programa debe crear la clase y declarando objetos de esta clase ingreasr datos y despus mostrarlos. 2) Escribir un programa que considere la clase anterior y declare un vector de objetos de esa clase, adems debe poder consultar este vector de objetos y listar los dni y nombres que viven en un determinado distrito. 3) Se tiene la clase empleado con cdigo, sueldo, nombre y categora, escribir las declaraciones de datos miembros y crear las funciones miembro, de lectura, mostrar_datos y asignacin de sueldos, esta ultima debe realizarse de la siguiente manera: Categora A sueldo de 4500 mensual Categora B sueldo de 4000 mensual Categora C sueldo de 3000 mensual Categora 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 categora.. 5) Escriba un programa que me permita ingresar varios cursos creando la clase curso y finalmente me entrege un listado. La clase curso debe considerar cdigo, nombre, costo y duracin en horas.

175

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

CAPITULO IX

176

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS 9


CLASES Y CONSTRUCTORES.9.1 SECCIONES Y FUNCIONES MIEMBRO

2013

9.1.1 Secciones.- Los miembros de una clase que son variables y mtodos (datos y funciones) pueden ser pblicos (public), protegidos (protected) y privados (private). Las secciones privadas y protegidas tienen como objetivo el ocultamiento de datos. A los miembros de la seccin privada se puede acceder solo por las funciones miembro de esa clase, o por otras funciones declaradas amigas (friend) de la clase. A los miembros pblicos de una clase se pueden acceder desde fuera de la clase, pero no se puede acceder desde una clase derivada de la clase base. Los miembros protegidos son accesibles dentro de la clase en que estn definidas y en cualquier clase derivada de la clase original. De acuerdo a lo dicho la declaracin 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 lnea(inline). Pero tambin podemos definir el cuerpo de la funcin fuera de la clase. El mbito de una funcin se debe indicar por el operador mbito (:: ) con el nombre de la clase. Ej: PROGRAMA /* CODIGO: 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); }

177

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


void main ( ) { int prac1, prac2; nota practicas; clrscr( ); cout<< "Primera practica: "; cin >>prac1; cout<< "Segunda practica: "; cin >>prac2; practicas.set_practica1(prac1); practicas.set_practica2(prac2); cout << " El promedio sera = "<< practicas.promedio( ); getch();} EJECUCION

2013

9.2 Constructores y Destructores.- Cuando se menciono a los punteros se dijo que se puede crear variables apuntadas en forma dinmica (en ejecucin), para crear estas se utiliza el operador new y para liberarlas el operador delete, en la POO existen mecanismos similares. Cuando se crea un objeto es llamado un mtodo que se denomina constructor y al terminar (salir) se llama a otro mtodo conocido como destructor. 9.2.1 Constructor.- Es un mtodo especial que construye objetos. Un constructor es llamado para crear

una instancia de ese objeto asignando espacio a un objeto pude tambin asignar valores a sus miembros datos. El constructor realiza una inicializacin automtica y no devuelve ningn valor. Tiene el mismo nombre que la clase con la cual est asociada. Puede tener parmetros como cualquier otra funcin y tener por lo tanto distintas formas. Si no se define para una clase, el compilador generara un constructor por defecto. Ejemplo: class circulo { private: int c_x, c_y; double radio; public: // constructor circulo( int x, int y, double r) { radio = r; c_x = x; c_y = y; } }; Tipos de constructores: Los constructores pueden ser: Constructores sin argumento Constructores con argumento Constructores de copia Ing.Ricardo Castaeda

178

PROGRAMACION ORIENTADA A OBJETOS


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( ) { { 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 } //CONSTRUCTOR SIN ARGUMENTOS nota(int d )//CONSTRUCTOR CON ARGUMENTOS

2013

179

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

Destructores: Un destructores lo opuesto a un constructor, as como el constructor separa memoria, el destructor libera esa memoria que fue asignada al objeto por el constructor. El destructor es una funcin miembro con el mismo nombre que la clase mas una tilde que se aade al principio. Una clase puede poseer un destructor que no tiene argumentos y no devuelve valores. Ejemplo: class punto { private : int x; int y; public: punto( ) { x= 0; y=0 } ~punto( ) { } }; Ejemplo 3.- De un ejemplo de constructores y de destructores, definiendo la clase complejo , que tiene componente real y componente imaginaria. PROGRAMA /* CODIGO: POOC9E3 FECHA: 23 DE MARZO DE 2013 OBJETIVO: Programa que muestra los diferentes tipos de constructores y el destructor */ #include <iostream.h> #include<conio.h> #include<string.h> class complejo { private: int r, i; public: complejo()//constructor sin argumentos { r = i = 0; } complejo(const int re, const int im)//constructor con argumentos { r = re; i = im; } complejo(const complejo &comp)//constructor de copia { r = comp.r; i = comp.i; } ~complejo() { cout<<"El destructor ha sido llamado"<<endl;getch(); }//destructor int get_r() { return r; } int get_i() { return i; } }; void main() {complejo c1(5,7);

180

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

Constructor new y destructor delete Estos dos operadores tambin construyen y destruyen, que es una forma de decir tambin reservan y liberan memoria. El operador new obtiene memoria del sistema operativo, y proporciona un puntero a su punto inicial. Su sintaxis es: tipo *p ; p = new tipo; El operador delete libera memoria reservada con new Ejemplo 3: 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 direccin de un campo entero a p1 que es puntero cout << " Ingrese valor = > "; cin >> (*p1);// almacena un valor en el campo apuntado por p1 p2=p1;//p2 toma la direccin de p1 p1 = new int; cout << " Ingrese valor = > "; cin >> (*p1);// almacena un valor en el campo apuntado por p1 cout<<(*p1)<<endl; cout<<(*p2)<<endl; delete p1;//libera memoria de p1 delete p2;//libera memoria de p2 getch ( );}

181

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


EJECUCION

2013

Analizando el ejemplo que hemos ejecutado: Primero: podemos ver que el operador new busca un campo o estructura del tipo indicado, en nuestro caso entero y cuando lo encuentra asigna la direccin al puntero respectivo y despus bloquea el acceso de otra variable a ese campo, Segundo: el campo no tiene nombre propio sino que se le llama campo apuntado por, en nuestro caso, p1 y esto se indica con *p1. Tercero: El intercambio de informacin puede ser de puntero a puntero (p2=p1) o de campo apuntado a campo apuntado (*p1) = (p2), sera un error lo siguiente: p1 = *p2. Cuarto: La forma correcta de liberar a la memoria es delete p1 o delete p2. PROBLEMAS 1.- Desarrollar un programa que maneje la clase empleado utilizando funciones fuera de la clase y que nos permitan manejar el operador mbito. La clase empleado tendr los siguientes datos miembro y las funciones indicadas. class empleado { private: int codemp; char nomemp[40]; float hotemp; float phoemp; float pagemp; public: void ingreso_datos( int c, char[40], flota h, flota p); float pago_neto( ); }; SOLUCION PROGRAMA /* CODIGO: 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];

182

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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 cout<<"Ingrese Pago por Hora sueldo_neto= emp1.pago_neto(); cout<<"Neto a pagar = "<<sueldo_neto; getch(); } EJECUCION --> "; cin>>horas_trabajadas;emp1.set_hotemp( horas_trabajadas); --> "; cin>>pago_hora; emp1.set_phoemp(pago_hora);

2013

183

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


indicadas. class caja { private: int alto; int ancho; int largo; public: .. SOLUCION 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 ( ) { // funcin inline int volumen ( ) { return ( alto*ancho*largo); } }; void main ( ) { caja caja1(2,3,4); caja caja2(5,6,7); clrscr( ); cout << "El volumen de la primera caja sera => " << caja1.volumen( )<<endl; cout << "El volumen de la segunda caja sera => " << caja2.volumen( )<<endl; getch( ); } EJECUCION }

2013

2.- Desarrollar un programa que maneje constructores y destructores de la clase caja que tiene las caractersticas

184

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


operaciones simples con estos polinomios. SOLUCION PROGRAMA /* CODIGO: POOC9PROB3 FECHA: 23 DE MARZO DE 2013 OBJETIVO: Programa que maneja la Aritmtica de punteros*/ #include<iostream.h> #include<conio.h> #include<math.h> void main( ) { int a[10],b[10],n,i; float pola,polb,x; int *p1,*p2; clrscr( ); cout<<"Ingrese valor n: ";cin>>n; for(i=1;i<=n;i++) { cout<<"Ingrese valor de a["<<i<<"]= ";cin>>a[i]; cout<<"Ingrese valor de b["<<i<<"]= ";cin>>b[i]; } cout<<"Ingrese x: ";cin>>x; p1=&a[1]; p2=&b[1]; //hallando polinomios pola=0; polb=0; for(i=1;i<=n;i++) { pola=pola+(*p1)*pow(x,n+1-i); polb=polb+(*p2)*pow(x,n+1-i); p1++; p2++; //en aritmtica de punteros se asigna p1++ para } //suma 1 CAMPO!! al puntero no una unidad

2013

3.- Desarrollar un programa que trabaje con aritmetica de punteros y maneje polinomios pudiendo desarrollar

cout<<pola<<endl; cout<<polb<<endl; cout<<pola+polb; getch(); } EJECUCION

185

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA

2013

CAPITULO X

186

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


10. CLASES DERIVADAS 10.1.

2013

Definicin.- La forma sintctica para indicar que una clase es derivada de otra clase existente ser: class nombre_clase: [(public| private)] clase_base { declaraciones de miembros

}; La palabra reservada class puede ser sustituida por la palabra reservada struct, con la implicacin de que los miembros son pblicos por defecto. Una de las dos palabras, public y private, en la clase derivada son opcionales, para especificar como los miembros de la clase base tienen que ser accesibles a la clase derivada: 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 { 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 (cdigo);} float get_sueldo { return(sueldo);} }; // CLASE BASE

187

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


10.3. un ejemplo es el siguiente: class base1 { protected: int dato1; public: void set_dato1 (int d1) { dato1 = d1; } }; class base2 { private: int dato2; public: void set_dato2 (int d2) { dato2 = d2; } int get_dato2 ( ) { return(dato2); } }; class derivada12 : public base1, private base2 { public: void imprimir ( ) { cout << b1<<get_dato2( ); } }; 10.4. Funciones amigas (friend)

2013

Herencia mltiple.- Este concepto nos indica que una clase puede derivarse de ms de una clase,

Sabemos que a un dato privado se puede acceder desde la misma clase o desde una funcin amiga. El concepto de funcin amiga se refiere a una funcin que no es miembro de esa clase, pero que necesita acceder a los miembros privados de una clase. Estas se declaran colocando su prototipo en la clase que son amigas, indicando esto don la palabra reservada friend. class empleado { private: int code; char nombre[40]; float sueldo; public: friend void planilla (empleado e1, int valor); }; void planilla (empleado e1, int valor) { e1.code =.....; e1.sueldo; } 10.5. Funciones virtuales.- Esta caracterstica permite a una funcin estar definida en una clase base y

su clase derivada bajo el mismo nombre. La declaracin de virtual solo debe hacerse en la clase base, la funcin ser llamada de acuerdo al objeto al cual est asociada.

188

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


class cuadrado { protected: int lado; public: virtual int rea ( ) { return (lado * lado); } }; class cubo: public cuadrado { public: int rea ( ) { return ( 6 * lado * lado); } PROBLEMAS };

2013

1.- Construya un programa orientado a objetos que utilice la clase base persona, con su datos miembro nombre y DNI, adems de considerar las funciones miembro asignar y mostrar; derivada de esta clase se manejara la clase empleado que aade datos miembro cdigo y sueldo, y redefina las funciones de la clase base. 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 { 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);} { private: int codigo; float sueldo; public: void set_codigo( int c) }; class empleado : public persona // CLASE DERIVADA // CLASE BASE

189

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


{ 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 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 => "; cin >> di; };

2013

190

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

2.- Escriba un programa que simule un procesamiento de notas con dos sistemas de evaluacin diferentes, el sistema A : promedio de prcticas = (p1+p2+p3)/3.0. Nota final = (exapar + exafin + propra)/3.0 y el sistema B : promedio de prcticas = (p1+p2+p3+p4)/4.0; Nota final = (exapar + 2*exafin +2* propra)/5.0. Use clases derivadas para este fin. SOLUCION: PROGRAMA /* CODIGO: 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; } };

191

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


class sistemaB : public notas { public: int p1, p2 , p3, p4; public : void calcula_notafin ( ) { propra = (p1+p2+p3+p4)/4.0; notafin = (exapar + 2*exafin +2* propra)/5.0; } }; void main ( ) { char a1[10]; int a3; int a4; // almacena cdigo //almacena examen parcial //almacena examen final char a2[40]; //almacena nombre

2013

char sistema; sistemaA al1; sistemaB al2; clrscr( ); gotoxy(30,3);cout<<"INGRESO DE DATOS"; gotoxy(31,6); cout<< " CODIGO : "; cin >> a1; gotoxy(31,8); cout<< " NOMBRE : "; gets(a2); gotoxy(31,10); cout<< " Examen Parcial gotoxy(31,12); cout<< " Examen Final gotoxy(31,14); cout<< " Sistema de evaluacin A/B: "; cin >> sistema; sistema = toupper( sistema); // calculo de promedio de prcticas y nota final if ( sistema == 'A') { cout << " cout << " cout << " Practica 1 : "; cin>>al1.p1; Practica 2 : "; cin>>al1.p2; Practica 3 : "; cin>>al1.p3; : "; cin >> a4; : "; cin >> a3 ;

al1.set_code(a1); al1.set_name(a2); al1.set_exapar(a3); al1.set_exafin(a4); al1.calcula_notafin( ); cout<<Promedio Practicas = << al1.get_propra( )<<endl; cout<<Nota Final = << al1.get_notafin( )<<endl;getch();} if ( sistema == 'B') { cout << " Practica 1 : "; cin>>al2.p1; Ing.Ricardo Castaeda

192

PROGRAMACION ORIENTADA A OBJETOS


cout << " cout << " cout << " Practica 2 : "; cin>>al2.p2; Practica 3 : "; cin>>al2.p3; Practica 4 : "; cin>>al2.p4;

2013

al2.set_code(a1); al2.set_name(a2); al2.set_exapar(a3); al2.set_exafin(a4); al2.calcula_notafin( ); cout<<Promedio Practicas = << al2.get_propra( )<<endl; cout<<Nota Final = << al2.get_notafin( )<<endl;getch();} } EJECUCION

3.- Desarrolle un programa que nos muestre claramente el concepto de Herencia mltiple, esto debe hacerlo derivando una nueva clase de dos clases bases. SOLUCION: PROGRAMA /* CODIGO: 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:

193

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


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 gotoxy(31,8); cout<< "Nombre gotoxy(31,10); cout<< "Cod. Curso gotoxy(31,12); cout<< "Curso gotoxy(31,14); cout<< "Nota 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); : "<<codalu; : "<<nomalu; : "<<codcur; : "<<nomcur; : "<<notcur;

2013

194

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


gotoxy(31,8); cout<<"NOMBRE gotoxy(31,12); cout<<"CURSO gotoxy(31,14); cout<<"NOTA gotoxy(31,16); cout<<"PAGO : ";gets(nombre); : ";gets(ncurso); : ";cin>>nota; : ";cin>> pago; gotoxy(31,10); cout<<"COD. CURSO : ";gets(ccurso);

2013

gotoxy(31,18); cout<<"MATRICULA SI=1 NO=0 : ";cin>>sm; alu1.asignar(codigo,nombre,ccurso,ncurso,nota,pago,sm); alu1.mostrar(); } EJECUCION

4.- Escribir un programa que maneje el concepto de funciones amigas: SOLUCION: PROGRAMA /* CODIGO: POOC10PROB4 FECHA: 23 DE MARZO DE 2013 OBJETIVO: PROGRAMA QUE TRABAJA CON FUNCIONES AMIGAS */ #include<iostream.h> #include<conio.h> #include<string.h> class empleado { private: char nombre[20]; int codigo; public : empleado( char *nomb, int cod) // constructor { strcpy (nombre,nomb); codigo = cod; } friend void imprime_dat_emp(empleado c); // declaracin de funcin amiga }; void imprime_dat_emp(empleado c)

195

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


{ cout << "Nombre del cliente : " << c.nombre<< endl; cout << "Codigo del cliente : " << c.codigo << endl; } void main ( ) {clrscr( ); empleado Perez ("Juan Perez", 1111); imprime_dat_emp(Perez); empleado Rosas ("Nstor Rosas", 2222); imprime_dat_emp(Rosas); getch( ); } EJECUCION

2013

196

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

CAPITULO XI

197

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


dependiendo a la clase a la cual pertenecen. El Polimorfismo se implementa de dos maneras:

2013

11. POLIMORFISMO Es la capacidad de los objetos de responder de manera diferente a las mismas ordenes,

Va funciones virtuales Por sobrecarga. 11.1. VIA FUNCIONES VIRTUALES El concepto de funcin virtual ya lo vimos anteriormente, veamos ahora un ejemplo Ejemplo:

/ * Ejemplo de Polimorfismo con funciones virtuales * / # include<iostream.h> # include<conio.h> class figura { protected: float par1; public: void asignar ( float p1) { par1 = p1; } virtual float area( ) { return (0);} }; class circulo : public figura { public: virtual float area( ) { return (3.1416*par1*par1);} }; class cuadrado : public figura { public: virtual float area( ) { return (par1*par1);} 11.2. };

SOBRECARGA DE OPERADORES Y FUNCIONES Introduccin.- La sobrecarga de operadores, nos permite definir un operador de diferente

11.2.1.

forma, es una forma de realizar el Polimorfismo. La sobrecarga es la tcnica de redefinir un existente para que trabaje con otro tipo de datos. Como sabemos no podemos crear un operador nuevo pero aquellos que ya existen podemos sobrecargarlos. 11.2.2. Sobrecarga de Operadores.- Un operador puede ser sobrecargado. Los operadores

sobrecargados cumplen las siguientes propiedades. Sobrecargados, no cambiaran su nmero de operandos (unitarios o binarios). Sobrecargados, no cambiaran su prioridad. No se pueden inventar operadores que no existan en C++.

198

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

La palabra reservada operator.- Para hacer que un operador de C++ acte como un operador definido por el usuario, se debe utilizar la palabra reservada operator. El formato de sobrecarga es: 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 Asignacin
Operador = Operador += Operador -= Operador *= Operador /= Operador %= Operador <<= Operador >>= Operador &= Operador ^=| Operador |=

Adems de los operadores: , (coma), new y delete Ejemplo de sobrecarga.#include <iostream.h> #include <conio.h> class duplicado {public: int x; duplicado operator++ () { x = x + x; return *this; } Ing. Ricardo Castaeda

199

FACULTAD DE INGENIERIA MECANICA


}; void main () { // (Comprobacin)

2013

duplicado e1 = {5}, e2; e2 = ++e1; // M.2 uso de operador ++ sobrecargado

cout << "e1 == " << e1.x << endl; cout << "e2 == " << e2.x << endl; getch(); } 11.2.3. Sobrecarga de funciones.- Cuando una funcin tiene ms de una definicin decimos que es una

funcin sobrecargada. Sabemos que dos o ms funciones pueden tener el mismo nombre pero para estar sobrecargadas no deben diferir en el tipo de sus argumentos o el nmero de sus argumentos. Es muy importante considerar que bastante comn es sobrecargar las funciones constructoras. de sobrecarga de funciones / * Ejemplo Ejemplo de sobrecarga 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(); }

200

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


PROBLEMAS

2013

1.- Construya un programa orientado a objetos desarrolle el polimorfismo utilizando el concepto de funcin 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

201

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


2.- Construya un programa que sobrecargue un operador realizando una operacin para un objeto. SOLUCION PROGRAMA /* CODIGO: POOC11PROB2 FECHA: 23 DE MARZO

2013

OBJETIVO: Sobrecarga de operadores es la facultad que tiene un operador de funcionar de forma diferente segn el tipo de dato con el que se utilice,es decir, hacer que el operador funcione con los datos que el usuario cree. En el cuerpo de la funcin habr que poner las operaciones que queramos que realice el operador */ #include<iostream.h> #include<conio.h> class clase { int x,y; public: clase(int x=0,int y=0); clase operator +(clase &); void visualizar( ); ~clase(){cout<<"\nDestruyendo el Objeto ";} }; clase ::clase(int m,int n) { x=m;y=n;} clase clase::operator +(clase &obj) //pasa un objeto de tipo clase { clase aux; aux.x=x+obj.x; //x del objeto ms x que pasa aux.y=y+obj.y; return(aux); } void clase::visualizar() { cout<<"\nx= "<<x<<' '<<"y= "<<y; } main( ) { clase a(5,7); clase b(3,4); clase c; c=a+b; //x de a ms x de b ; y de a ms y de b c.visualizar( ); //c=operator +b; getch(); } EJECUCION

3.- Construya un programa que sobrecargue una funcin utilizando dos tipos de datos diferentes, la funcin debe ser simple. SOLUCION

202

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


PROGRAMA /* CODIGO: POOC11PROB3 FECHA: 23 DE MARZO DE 2013 OBJETIVO: Funcin fecha recargada */ #include<iostream.h> #include<conio.h> #include<stdio.h> void fecha(char *fecha); void fecha(int anno,int mes, int dia); void main() { 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

2013

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 comn inicializar variables que inicializar arrays, de modo que para admitir arrays de objetos sin inicializar, junto con objetos inicializados debe incluirse un constructor que permita la inicializacin y otro que no. */ #include<iostream.h> #include<conio.h> class base { protected: int j; public: base();//sin inicializador base(int n);//con inicializador int getx(); }; base::base() {j=0;}

203

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


base::base(int n) {j=n;} base::getx() {return j;} main() { int i; base v1[10];//declaracion del array sin inicializacin 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

2013

204

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS

2013

CAPITULO XII

205

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


FLUJOS Y ARCHIVOS

2013

12. ARCHIVOS.- Sabemos que la nica estructura que permite acceder dispositivos externos de memoria y por lo tanto posibilita que los datos sobrevivan a los procesos son los archivos, nosotros en este libro veremos los dos tipos de archivos ms importantes y son: 12.1. Archivos de texto (legibles) Archivos binarios (Poco legibles) ARCHIVOS DE TEXTO

Usar streams facilita mucho el acceso a ficheros en disco, veremos que una vez que creemos un stream para un fichero, podremos trabajar con l igual que lo hacemos con cin o cout. Mediante las clases ofstream, ifstream y fstream tendremos acceso a todas las funciones de las clases base de las que se derivan estas: ios, istream, ostream, fstreambase, y como tambin contienen un objeto filebuf, podremos acceder a las funciones de filebuf y streambuf. Evidentemente, muchas de estas funciones puede que nunca nos sean de utilidad, pero algunas de ellas se usan con frecuencia, y facilitan mucho el trabajo con ficheros. Crear un archivo de salida, abrir un archivo de entrada

Empezaremos con algo sencillo. Vamos a crear un fichero mediante un objeto de la clase ofstream, y posteriormente lo leeremos mediante un objeto de la clase ifstream: Ejemplo 1: //POOC12E1 #include <iostream> #include <fstream> int main() { char cadena[128]; // Crea un fichero de salida ofstream fs("nombre.txt"); // Enviamos una cadena al fichero de salida: fs << "Hola, mundo" << endl; // Cerrar el fichero, // para luego poder abrirlo para lectura: fs.close(); // Abre un fichero de entrada ifstream fe("nombre.txt"); // Leeremos mediante getline, si lo hiciramos // mediante el operador >> slo leeramos // parte de la cadena: fe.getline(cadena, 128); cout << cadena << endl; cin.get(); return 0;} Este sencillo ejemplo crea un fichero de texto y despus visualiza su contenido en pantalla. Ejemplo 2. Un ejemplo sencillo, para ilustrar algunas limitaciones del operador >> para hacer lecturas, cuando no queremos perder caracteres.

206

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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

2013

Supongamos que llamamos a este programa "streams.cpp", y que pretendemos que se autoimprima en pantalla:

El resultado quiz no sea el esperado. El motivo es que el operador >> interpreta los espacios, tabuladores y retornos de lnea 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 cdigo y las cuatro notas de prcticas de 10 alumnos. Escribir tambin 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]<<' '

207

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


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

2013

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"

208

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


<<" 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);

2013

209

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


//empezar en una nueva lnea cout<<endl; //leer y desplegar el contenido del archivo while ((ch = f04.peek()) != EOF) // verificar el siguiente carcter { f04>>descripcion>>precio; //introducir datos al flujo cout<<descripcion<<' '<<precio<<endl; } //cerrar archivo f04.close(); cout<<"\nLos datos se leyeron con xito en el archivo: "<<nomarch<<endl;; getch(); return 0;} 12.2. ARCHIVOS BINARIOS

2013

12.2.1. Introduccin.- Cuando manejamos sistemas de informacin los datos (archivos) permanecen y los procesos son los que se ejecutan y desaparecen, esto significa que la informacin existe antes del procesos y sobrevive a este. El almacenamiento permanente se realiza en discos pticos o magnticos, este captulo trata del mtodo ms utilizado para estas tareas el manejo de archivos. 12.2.2. Entrada/Salida por archivos.- Para manejar entrada/salida en archivos debemos incluir la clase fstream que maneja los flujos hacia y desde los archivos al programa. Las clases dedicadas a la gestin de entrada/salida en disco son fstreambase, ifstream, ofstream y fstream que se derivan por herencia a su vez de los ios, ostream, istream e iostream. 12.2.3. Apertura y cierre de un archivo.- Para realizar E/S de disco se crea los siguientes objetos: Para asociar un flujo de salida a un archivo se debe crear un objeto de tipo ofstream (output file stream). Para asociar un flujo de entrada a un archivo se debe crear un objeto de tipo ifstream (input file stream) Para realizar tareas de entrada/salida debemos utilizar un objeto de la clase fstream (file stream).

Una vez que se ha creado un flujo con cualquiera de las formas: ifstream fentra; ofstream fsal; fstream fensa; A continuacin asociamos el flujo al archivo con la funcin open. El prototipo de la funcin open es: void open(char *nombrearch, int modo, int acceso); Donde: nombreach ...... es el nombre del archivo. modo .................la forma en que se abre el archivo. acceso ..............como se puede acceder al archivo. Modos de apertura de archivos in out app ate trunc : Abre el archivo para lectura (entrada) : Abre el archivo para escritura (salida) : Abre el archivo para escritura, aade al final : Abre el archivo y toma posicin al final : Si el archivo existe, destruye su contenido, si no existe, se crea un nuevo archivo

binary : Abre el archivo en modo binario

nocreate :Abre un archivo existente. Si el archivo no existe, la apertura falla noreplace :Si el archivo existe la apertura falla

210

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


Programas bsicos de creacin 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

2013

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 Castaeda

211

FACULTAD DE INGENIERIA MECANICA


while(!(f2.eof())) { f2.read(nomper,sizeof(nomper)); If(!(f2.eof())) cout<<nomper<<endl; } getch(); f2.close(); } EJECUCION

2013

12.3.

Operaciones con archivos.- Sabemos que un archivo es una coleccin de registros y cada registro

es un conjunto de variables con un nombre comn 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: Creacin Eliminacin Adicin Modificacin Consulta Proceso

El detalle de cada operacin la veremos en los problemas resueltos. 12.4. 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 funcin seekg( ) que nos permite acceder al archivo de un modo directo. La funcin 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 ios:: beg ios:: cur ios:: end Significado Principio del archivo Posicin actual del archivo Fin del archivo Ing.Ricardo Castaeda

212

PROGRAMACION ORIENTADA A OBJETOS


Ejemplos: a) Posicionarse al inicio del archivo alumnos.dat que reside en el disco A. Solucion: indicaremos las lneas 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);

2013

PROBLEMAS 1.- Construya un programa que nos permita crear un archivo, cuyo registro contenga los siguientes campos: Registro de almacen: codalm desalm codpro ubialm nunalm coualm char[8] ..Codigo del item de almacen char[40] Descripcin del item de almacen char[8] Codigo del proveedor del almacen char[4] ..Ubicacin del item dentro del almacen ej:A17, entero Stock del producto(item). real Costo unitario del tem D121

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] ; // cdigo del tem char desalm[40] ; // descripcin del tem char codpro[8] ; // cdigo del proveedor

213

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


char ubialm [4] ; // ubicacin del tem int nunalm ; }; void main( ) { almacen registro ; int n, i; ofstream flusal; clrscr( ); flusal.open( "C:stock.dat", ios :: out | ios:: binary); // Se abre archivo para escritura cout << " Cuantos registros desea grabar --> " ; cin >> n; for ( i = 1; i <= n ; i++ ) { cout << " Ingrese codigo del item "<< i << " : "; gets ( registro.codalm); cout << " Ingrese descripcion del item "<< i << " : "; gets ( registro.desalm); cout << " Ingrese codigo del proveedor "<< i << " : "; gets ( registro.codpro); cout << " Ingrese ubicacion del item "<< i << " : "; gets ( registro.ubialm); cout << " Ingrese # de unidades del item "<< i << " : "; cin >> registro.nunalm; cout << " Ingrese costo uni. del item "<< i << " : "; cin >> registro.coualm; flusal.write( (const unsigned char *) &registro, sizeof(registro)); } // se graba registro flusal.close ( ); } // se cierra archivo EJECUCION // nmero de unidades del tem float coualm ; // costo unitario del tem

2013

2.- Construya un programa que nos permita leer el archivo anteriormente creado. SOLUCION

214

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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] ; // cdigo del tem char desalm[40] ; // descripcin del tem char codpro[8] ; // cdigo del proveedor char ubialm [4] ; // ubicacin del tem int nunalm ; 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 cont=cont+1; gotoxy(2,cont);cout<< "================================================================"; cont=cont+2; while ( ! fluent.eof( ) ) { fluent.read( ( unsigned char *) &registro, 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 PROVEEDOR UBICACION #UNIDADES COSTO/UNIT "; // nmero de unidades del tem float coualm ; } ;// costo unitario del tem

2013

215

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


descripcin del producto y el proveedor PROGRAMA /* CODIGO: POOC12PROB12 FECHA: 23 DE MARZO DE 2013 OBJETIVO: Lista proveedores de almacen */ # 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 while ( ! fr.eof( ) ) {fr.read( ( unsigned char *) &registro, 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; DESCRIPCION"<<endl;

2013

3.- Escriba un programa que liste a todos los proveedores de los items de nuestro almacen. Se debe mostrar la

216

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


gotoxy(14,i+3);cout <<l[i].desalm; getch(); fr.close ( ); } }

2013

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]Cdigo del proveedor nompro char[40] .Nombre del proveedor teluro char[9] ..Telfono 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] ; // cdigo del proveedor char nompro [40] ; // nombre proveedor char telpro[9] ; }; void main( ) {proveedor buf ; // telfono del proveedor

217

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


int n, i; ofstream flusal; fstream f1; clrscr( ); flusal.open( "C:proveedor.dat", ios :: out | ios:: binary); cout << " Cuantos registros desea grabar => " ; cin >> n; for ( i = 1; i <= n ; i++ ) {cout << " codigo "<< i << " : "; gets ( buf.codpro); cout << " nombre "<< i << " : "; gets ( buf.nompro); cout << " telefono "<< i << " : "; gets ( buf.telpro); flusal.write( (const unsigned char *) &buf, sizeof(buf)); } flusal.close ( ); // se cierra archivo /* Programa que lista los registros de proveedores */ clrscr( ); i=0; i=i+3; gotoxy(5,i);cout<<"Codigo"; gotoxy(15,i);cout<<"Nombre"; gotoxy(50,i);cout<<"Telefono"; i=i+1; gotoxy(5,i);cout<<"======="; gotoxy(15,i);cout<<"========================================"; gotoxy(50,i);cout<<"========"; i=1+i; f1.open( "A:proveedor.dat", ios :: in | ios:: binary); while (! f1.eof( )) {f1.read( ( unsigned char *) &buf, sizeof(buf)); if (! f1.eof( )) {i=i+1; gotoxy(5,i);cout<< buf.codpro; gotoxy(15,i);cout<< buf.nompro; gotoxy(50,i);cout<< buf.telpro; } } f1.close ( ); getch(); } // se cierra archivo

2013

EJECUCION

218

Ing.Ricardo Castaeda

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].Cdigo del proveedor nompro char[40] ..Nombre del proveedor teluro char[9] Telfono del proveedor

Registro de almacen: codalm desalm codpro ubialm nunalm coualm 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> char[8] ..Codigo del item de almacen char[40] Descripcin del item de almacen char[8] Codigo del proveedor del almacen char[4] .Ubicacin del item dentro del almacen ej:A17, D121 entero ..Stock del producto(item). real Costo unitario del tem

219

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


#include<fstream.h> #include<stdio.h> struct proveedor { char codpro[8] ; // cdigo del proveedor char nompro[40] ; // nombre del proveedor char telpro[9] ; }; struct almacen { char codalm[8] ; // cdigo del tem char desalm[40] ; // descripcin del tem char codpro[8] ; // cdigo del proveedor char ubialm [4] ; // ubicacin del tem int nunalm ; }; void main( ) {proveedor buf ; almacen registro; fstream f1,f2; char codx[8]; clrscr( ); cout << "Ingrese Codigo del Item: "; cin >>codx; f1.open( "C:stock.dat", ios :: in | ios:: binary); while ( (! f1.eof( )) && strcmp(codx,registro.codalm)!= 0) f1.read( ( unsigned char *) &registro, sizeof(registro)); if (strcmp(codx,registro.codalm)!= 0) cout << "Registro no hallado"; else { f2.open( "A:proveedor.dat", ios :: in | ios:: binary); while((!f2.eof())&& strcmp(buf.codpro,registro.codpro)!= 0) f2.read( ( unsigned char *) &buf, sizeof(buf)); if( strcmp(buf.codpro, registro.codpro)== 0) {cout<< "CODIGO :"<< buf.codpro<<endl; cout<< "NOMBRE :"<< buf.nompro<<endl; cout<< "TELEFONO:"<< buf.telpro<<endl;} f2.close(); } f1.close ( ); getch(); // se cierra archivo } // nmero de unidades del tem float coualm ; // costo unitario del tem // telfono del proveedor

2013

6.- Escriba un programa que liste todos los proveedores de los productos del stock.

220

Ing.Ricardo Castaeda

PROGRAMACION ORIENTADA A OBJETOS


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 while ( ! fr.eof( ) ) { fr.read( ( unsigned char *) &registro, 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 ( ); } } DESCRIPCION";

2013

221

Ing. Ricardo Castaeda

FACULTAD DE INGENIERIA MECANICA


actualcelo en precio unitario. SOLUCION PROGRAMA /* CODIGO: POOC12PROB7 FECHA: 23 DE MARZO DE 2013 OBJETIVO: PROGRAMA ACTUALIZA UNIDADES DE UN REGISTRO */ # 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 ; } ; void main( ) { char codx[8]; almacen registro ; fstream ff; clrscr( ); ff.open( "C:stock.dat", ios :: in | ios :: out | ios:: binary); cout<< " Ingrese codigo : "; cin >>codx; do { ff.read( ( unsigned char *)&registro , sizeof(registro)); } while ( (! ff.eof( )) && strcmp(codx,registro.codalm) !=0 ); if( strcmp(codx,registro.codalm) ==0) {gotoxy(30,2);cout<<"REGISTRO HALLADO"; gotoxy(25,4);cout <<"Codigo : "<<registro.codalm; gotoxy(25,5);cout <<"Descripcion : "<<registro.desalm; gotoxy(25,6);cout <<"Ubicacion : "<<registro.ubialm; gotoxy(25,7);cout <<"Nro. Unidades: "<<registro.nunalm ; gotoxy(25,8);cout <<"Nuevo nmero de unidades: "; cin >> registro.nunalm; ff.seekg (- sizeof(registro), ios::cur); ff.write( (const unsigned char *) &registro , sizeof(registro)); } else cout << "CODIGO NO HALLADO"; getch(); ff.close ( ); }

2013

7.- Escriba un programa que actualice el registro de almacen en cuanto al nmero de unidades, posteriormente usted

222

Ing.Ricardo Castaeda

Potrebbero piacerti anche