IP Guia 10: Recursividad y Principios de la POO

Anuncio
UNIVERSIDAD DON BOSCO
FACULTAD DE ESTUDIOS TECNOLÓGICOS
ESCUELA DE COMPUTACION
GUIA DE LABORATORIO #10
Nombre de la Practica:
CICLO: 01/ 2012
Lugar de Ejecución:
Tiempo Estimado:
MATERIA:
Programación Orientada a Objetos (POO) en
C++
Centro de Computo
2 horas y 30 minutos
Introducción a la Programación
I. OBJETIVOS
Que el alumno sea capaz de:
• Aplicar el concepto de Recursión en la solución de problemas
• Redactar la sintaxis apropiada para definir una "Clase" en lenguaje C++.
• Definir las capacidades de realizar tareas específicas que tendrá un objeto, por medio de los
métodos.
II. INTRODUCCION TEORICA
RECURSIVIDAD
Una función recursiva es una función que se llama a sí misma de manera directa o indirecta a
través de otra función. Para algunos tipos de problemas es útil tener funciones que se llamen a
si mismas.
Los elementos que se toman en cuenta cuando se estructura un programa con recursividad son
los siguientes:
Se debe establecer un caso base. Si se invoca a la función desde el caso base, ésta
simplemente devuelve un resultado.
Se específica el paso recursivo (Función recursiva). Esté se llamará n veces, de tal
forma que va obteniendo los resultados, incluye la palabra reservada return, debido que
cada vez que se llama envía el resultado a la llamada original de la función hasta que
converge en algún momento con el caso base. En ese punto, la función reconoce el caso
base, devuelve el resultado a la copia previa de la función, y se presenta una secuencia de
1
resultados que se mueve hacia arriba, hasta que la función original devuelve el resultado
final a main.
Ejemplo:
Se presenta el factorial de un número, tomando la referencia que el factorial de un número no
negativo n, se obtiene así:
n! = n*(n-1)*(n-2)*…*1
donde el factorial de 1 (1!) y 0 (0!) da como resultado 1. Observe el código:
2
PROGRAMACION ORIENTADA A OBJETOS (POO)
A continuación se dan los puntos básicos para la definición de clases y creación de objetos.
Clases y Objetos en C++:
C++ es un lenguaje orientado a objetos, su gran virtud es usar este prototipo para hacer
software más depurado y reutilizable. La base de la programación orientada a objetos es el uso
de clases, una clase es un tipo de datos abstracto con la cual podemos definir objetos, un
objeto es un tipo especial de variable con atributos propios y funciones miembro (métodos).
Los que tengan experiencia con estructuras no les será muy ajeno el concepto, una clase es
muy parecida a las estructuras solo con funciones propias y un sistema de protección.
Escribiendo la primera clase:
Siempre los ejemplos visuales son los mejores, una clase se define con la palabra reservada
class, en el ejemplo de la Figura 10.1 se define una clase con el nombre de Ejemplo con una
función miembro pública (que se explicará en breve) llama diHola, el cuerpo de la clase se
introduce entre llaves y termina con punto y coma (;).
Métodos Públicos y Privados:
C++ cuenta con las palabras reservadas
public, private y protected que forman el
sistema de protección.
public:
Al establecer un método como público
(public), este puede ser accesado desde
cualquier lugar del programa, este es el
nivel de seguridad más bajo.
Figura 10.1: definición de una clase y 3 métodos
3
Private:
Determina que solo puede ser usado dentro de la misma clase (este es el nivel más restrictivo)
Protected:
Indica que solo puede ser usado por la clase y clases padre. Se verá en otra práctica, cuando
se trate el tema de la Herencia.
Para establecer métodos como públicos solo basta con indicar la palabra public seguida de dos
puntos y añadir los métodos y atributos bajo de eso, todo lo que se encuentre bajo de eso será
establecido como publico hasta encontrar otro nivel de protección.
A continuación se pondrá un cuerpo a al método diHola ya que lo escrito antes es solo el
prototipo del método, los prototipos son declaraciones que indican solamente el tipo y
parámetros del método (o función).
Al nombre del método se antepone el nombre de la clase a la que pertenece y su tipo, aquí se
agrega un método llamado “diHola” del tipo void, un método void no retorna ningún valor, hace
su proceso y finaliza.
Inicializando un objeto:
Ahora dentro del método main() se declara un objeto de Ejemplo llamado ej, esto se logra
anteponiendo el tipo:
Para acceder a los métodos se puede usar el operador de acceso . (Punto), con los métodos y
atributos públicos, recuerde que los métodos privados son solo accesibles desde la misma
clase.
4
Ya el ejercicio completo quedaría de la siguiente manera (ver Figura 10.2).
Si se quiere ejecutar el metodoPrivado, no se podría hacer ya que este solo es accesible desde
la misma clase, pero se podría utilizar un método público de la misma clase que llame al
método privado, Ver ejemplo en la Figura 10.3:
Figura 10.2: Codigo fuente completo con la declaración de una Clase y sus métodos.
5
El método diHola(), llama al metodoPrivado(), entonces ya se puede visualizar el contenido
desde main.
Figura 10.3: Cómo invocar a un método privado de una Clase, solamente desde sus propios
métodos, en este caso desde método diHola().
6
III. MATERIALES Y EQUIPO
Para la realización de la guía de práctica se requerirá lo siguiente:
No.
1
2
3
Requerimiento
Guía de Laboratorio # 10 de IP
Compilador de C++.
Disquete ó Memoria USB
Cantidad
1
1
1
IV. PROCEDIMIENTO
Redacte, pruebe y analice los siguientes códigos fuentes.
Ejercicio 1. Implementacion de una función recursiva
Desarrolle una función recursiva, que permita calcular la potencia de un numero X cualquiera
elevado a un exponente N entero (sea positivo, negativo o cero). Recordar que ante una
potencia con exponente negativo, se tiene que El caso base a tomar en cuenta para la recursividad de la función es que cualquier numero x a
la 0 es 1
#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
//prototipos funciones
double Elevar(double X, int N);
main(){
//base
double
int exp
double
y exponente dados por usuario
base;
on;
pote; //valor potencia solicitada
//cod ASCII de tecla dada por usuario para
//saber si salir de programa o continuar con otra ejecucion
int salir;
//repetirá cuerpo-ciclo mientras no presione tecla TAB
do{
system("cls");
cout<<"\n\tCalculo potencia de un numero";
cout<<"\nDigite valor de la Base:\t";
cin>>base;
cout<<"\n y ahora del exponente entero (sea +, - o cero):\t";
7
cin>>expon;
pote=Elevar(base,expon);
cout<<"\n\n Potencia de "<<base<<" a la "<<expon
<<" es de "<<pote<<endl<<endl;
cout<<"\n\n\tpresione tecla TAB para salir del programa!!";
salir= int(getche());
}while(salir!=9); //fin ciclo do-while salir
}//fin funcion principal
//definicion de la funcion, con metodologia Recursiva!!
double Elevar(double X, int N){
//Evalua “caso base” (indica cuando finalizar recursividad
//e iniciar los retornos de valores a llamadas anteriores
if(N==0)
return(1);
else //Comienza recursividad
if(N<0){ //caso exponente negativo
N=-1*N; //cambia signo exponente a +
return(1/Elevar(X,N));
}else{//caso exponente positivo
return(X*Elevar(X,N-1));
}//fin cadena de if
}//fin funcion Elevar
Ejercicio 2. Creando Clases y Objetos
Desarrolle una clase que permita calcular los pagos de un préstamo ficticio, en el cual, el
usuario puede indicar el dinero a recibir y los meses a pagar, con una tasa de interés anual del
10% sobre el pago insoluto de la deuda, es decir, los intereses serian:
(insoluto*taza_interes)/12 (taza anual).
#include <iostream>
#include <conio.h>
using namespace std;
class Prestamo //Definicion clase Prestamo
{
public:
//Atributos (datos que utilizara la clase Prestamo)
double prestamo, pagos_mes, intereses;
int meses;
//Metodos de la clase Prestamo (Solamente los Prototipos)
Prestamo( ); //metodo Constructor de Clase Prestamo
void fijar_pagos_mes(double prestamo, int meses);
void actualizar_cuenta(void);
void mostrar_informe(ostream& flujo, int num_mes);
8
private:
//atributo privado de clase Prestamo
double taza_interes;
//Metodo privado de clase Prestamo (Solamente prototipos)
double obtener_interes(void);
}; //fin definicion clase Prestamo
//Cuerpo / definicion de la Funcion Principal main
int main (int argc, char *argv[])
{
Prestamo pr; //crea a objeto pr, basado en clase Prestamo
int i; //contador for
cout<< "Cantidad del Prestamo:" <<endl;
//objeto pr almacenara valor prestamo en su atributo prestamo
cin >> pr.prestamo;
cout<< "digite en cuantos meses lo pagara:"<<endl;
cin>> pr.meses; // pr almacenara valor en su atributo meses
//Se invoca a metodo publico fijar_pagos_mes() del objeto pr
pr.fijar_pagos_mes(pr.prestamo, pr.meses);
cout<< "Mes\tPago\tIntereses\tRestante" << endl;
for(i=0; i<pr.meses; i+=1){
//invoca a metodos publicos del objeto pr
pr.actualizar_cuenta();
pr.mostrar_informe(cout,(i+1));
}//fin for i
getch();
return 0;
} //fin funcion principal main
/*
Definicion del cuerpo de cada Metodo (publicos y privados)
de clase Prestamo
*/
Prestamo::Prestamo() //Metodo Constructor
{
/* Este se invoca automaticamente al declarar una variable
con la clase*/
taza_interes=0.10;
taza_interes
}
//fija
un
valor
inicial
al
atributo
9
void Prestamo::fijar_pagos_mes(double prestamo, int meses)
{
pagos_mes= (prestamo/meses);
}
void Prestamo::actualizar_cuenta(void){
intereses=obtener_interes();
prestamo = (prestamo-pagos_mes)+intereses;
}
double Prestamo::obtener_interes(void){
double tot;
tot= prestamo*taza_interes /12;
return(tot);
}
void Prestamo::mostrar_informe(ostream& flujo, int num_mes){
//Se fijan atributos de los datos numericos del flujo salida
flujo.setf(ios::fixed);
flujo.setf(ios::showpoint);
flujo.precision(3);
flujo <<num_mes << "\t" << (double)pagos_mes<< "\t"
<< intereses << "\t\t" << prestamo << endl;
}
V. DISCUSION DE RESULTADOS
1. Realizar un programa utilizando recursividad, para obtener la serie de Fibonacci 0, 1, 1,
2, 3, 5, 8, 13… , la cual comienza con 0 y 1; además, tiene la propiedad de que cada
número subsiguiente es la suma de los números anteriores de la serie.
2. Crea una clase CRectángulo. Esta clase tiene dos datos miembro, largo y ancho.
También, la clase cuenta con métodos que calculan el perímetro (obtenPerímetro) y el
área (obtenArea) del rectángulo, así como métodos para obtener y poner los valores
correspondientes a los atributos largo y ancho. El método poner debe comprobar que
tanto largo como ancho sean mayores que 0 y menores que 20.
3. Definir una clase cPersona con los siguientes datos miembros: nombre, dNacimiento
(día de nacimiento), mNacimiento (mes de nacimiento), aNacimiento (año de
nacimiento), dirección, codigoPostal y ciudad. Las funciones miembro serán
obtenNombre,
obtenDomicilio,
obtenFechaNacimiento,
ponerNombre,
ponerFechaNacimiento, ponerDirección, ponerCPostal y ponerCiudad. Las cadenas
de caracteres son arrays de longitud fija.
10
4. Crear una aplicación que contenga una clase llamada Calculadora, con las siguientes
características:
• variable primero, variable segundo – son los números con los que operará.
• fijarNumeros(n1, n2) – guardará en el objeto los números para operar luego con
ellos.
• sumar() – sumará los números. No necesita parámetros porque accede
directamente a las propiedades (variables) que tenga guardadas el objeto de
clase calc que creemos.
• dividir() – lo mismo que antes, dividirá primero entre segundo, pero para
asegurarnos de que pueda hacerse, recurrirá a otro método.
• comprobar() – este método comprobará que segundo sea distinto de cero para
poder dividir.
• Los números deben ser introducidos por el usuario.
5. Crear una aplicación en C, que contenga una clase donde calcule el área de al menos 3
figuras planas trigonométricas (triangulo, cuadrado, rombo, circulo, etc.). Y otra clase
donde calcule el volumen de al menos 3 cuerpos con volumen (cubo, cono, cilindro,
esfera, etc.). Las variables necesarias para calcular el área y el volumen deben ser
introducidas por el usuario.
VII. BIBLIOGRAFIA
•
•
Metodología de la Programación: Diagramas de Flujo, Algoritmos y Programación
estructurada. Joyanes Aguilar, Luis. No. De Clasificación 005.1 J88 1998. Editorial:
MCGRAW HILL
Cómo Programar en C/C++. Deitel, Harvey M... No. De Clasificación 005.362 D325 1995
Editorial: PRENTICE HALL
11
Descargar