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