Prácticas de C++ Practica Nº 4 Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Practica Nº 4 Programación en C++ Pág. 1 ÍNDICE ÍNDICE ........................................................................................................................................ 1 1. Introducción...................................................................................................................... 1 1.1 Ejercicio 1: Mi Primera clase complejo ..................................................................... 1 1.2 Ejercicio 2: Modificar la clase complejo.................................................................... 3 1.3 Ejercicio 3: La clase Fracción .................................................................................... 3 1.4 Ejercicio 4: La clase cuenta_corriente ....................................................................... 4 1. Introducción. En esta práctica empezará a utilizar las clases, a crear nuevos objetos, a entender la encapsulación y abstracción de datos, es decir, todo lo relacionado con la Programación Orientada a Objetos. Recuerde que siempre hay más ejercicios que los que puede hacer en dos horas de práctica. Hay que evitar copiar los ejercicios de otra persona, principalmente porque así no se aprende a programar: a programar sólo se aprende programando. 1.1 Ejercicio 1: Mi Primera clase complejo En la clase de esta semana y en la anterior, se ha explicado la clase complejo, que permite trabajar con números complejos como si fuesen un tipo de variables más de C++, de modo análogo a int, long, double, etc.. Este proyecto se llamará Ejer1. Debe crear tres ficheros complejo.h, complejo.cpp y main.cpp. Estos ficheros se listan a continuación: // fichero complejo.h #include <iostream.h> class complejo { private: double real; double imag; public: // Constructores complejo(); //defecto complejo(double, double im=0.0); // SetThings void SetData(void); void SetReal(double); void SetImag(double); // GetThings double GetReal(void){return real;} double GetImag(void){return imag;} //Operaciones complejo Suma(complejo c); complejo Resta(complejo c); complejo Multiplica(complejo c); complejo Cociente(complejo c); //Salida void Prt(){ cout << "("<< real <<","<< imag<<"i)"<<endl; } }; // fichero complejo.cpp // funciones y operadores de la clase complejo #include "complejo.h" Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Practica Nº 4 Programación en C++ complejo::complejo() // constructor por defecto { real = 0.0; imag = 0.0; } // constructor general complejo::complejo(double re,double im) { real = re; imag = im; } // función miembro SetData() void complejo::SetData(void) { cout << "Parte real: "; cin >> real; cout << "Parte imaginaria: "; cin >> imag; } void complejo::SetReal(double re) { real = re; } void complejo::SetImag(double im) { imag = im; } complejo complejo::Suma(complejo c) { complejo cs; cs.real = real + c.real; cs.imag = imag + c.imag; return cs; } complejo complejo::Resta(complejo c) { complejo cr; //escribir el código para restar return cr; } complejo complejo::Multiplica(complejo c) { complejo cm; //escribir el código (a,b) * (c,d) = (ac-bd, ad+bc) return cm; } complejo complejo::Cociente(complejo c) { complejo cc; //escribir (a,b)/(c,d) = ((ac+bd)/(c^2+d^2) , (bc-ad)/(c^2 + d^2 )) return cc; } //fichero main.cpp #include "complejo.h" void main(void) { // declaración de números complejos complejo c1(1.0, 1.0); complejo c2(2.0, 2.0); complejo c3; c3.SetData(); //pide datos para c3 complejo c4(4.0); // operadores aritméticos Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Pág. 2 Practica Nº 4 Programación en C++ complejo complejo complejo complejo cout cout cout cout cout cout cout } << << << << << << << suma = c1.Suma(c2); resta = c1.Resta(c3); producto = c2.Multiplica(c4); cociente = c1.Cociente(c3); Pág. 3 //c1+c2 //c1-c3 //c2*c4 //c1/c3 "Primer complejo: "; c1.Prt(); "Segundo complejo: ";c2.Prt(); "Tercer complejo: "; c3.Prt(); "Suma: " ; suma.Prt(); "Resta: " ; resta.Prt(); "Producto: " ; producto.Prt(); "Cociente: " ; cociente.Prt(); cout << "Ya he terminado." << endl; Compile el proyecto y ejecútelo, observando el resultado. Cree algunos números complejos más en el programa principal, opere con ellos y escriba el resultado. 1.2 Ejercicio 2: Modificar la clase complejo. Cree un nuevo proyecto llamado Ejer2 en su directorio de trabajo. Copie en este directorio los ficheros fuente del Ejercicio 1, complejo.h, complejo.cpp y main.cpp. Cambie el nombre a estos ficheros llamándolos complejo2.h, complejo2.cpp y main2.cpp. Ahora deberá modificar esos ficheros para que cumplan los siguientes objetivos: 1. Crear una función miembro llamada modulo() que permita calcular el módulo del objeto complejo que sea su argumento implícito. Se utilizará por ejemplo en la forma: complejo a(3.0, 2.0); cout << "El modulo de "; a.Prt(); cout<<" es "<<a.modulo()<< endl; 2. Crear una función friend (ver transparencia No.15 de clase) llamada también modulo() que permita calcular el módulo del objeto complejo que sea su argumento explícito. Se utilizará por ejemplo en la forma: complejo b(2.5, -1.0); cout << "El modulo de "; b.Prt(); cout<<" es "<<modulo(b)<< endl; Modifique el programa main2.cpp de modo que utilice las dos funciones modulo(). Este es un buen ejemplo de las posibilidades de C++ de cara a definir nuevos tipos de datos. Recuerde que ahora debe incluir el fichero “complejo2.h” en main2.cpp. 1.3 Ejercicio 3: La clase Fracción En este ejercicio va a crear la clase Fraccion, que permite trabajar con fracciones como si fuesen un tipo de variables más de C++, de modo análogo a int, long, double, etc. La clase Fraccion debe tener dos variables miembro tipo private: long num, den; las cuales nos servirán para almacenar el numerador y el denominador de la fracción. Debe crear los constructores y escribir las funciones miembro adecuadas para que le permitan escribir el siguiente programa: //fichero main.cpp #include "fraccion.h" void main(void) { Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Practica Nº 4 Programación en C++ // declaración de fracciones Fraccion f1(1, 4); // Representa Fraccion f2(1, 2); // Representa Fraccion f3; // Representa Fraccion f4(4); // Representa Pág. 4 1/4 1/2 0/1 4/1 // oporaciones aritméticos Fraccion suma = f1.Suma(f2); Fraccion resta = f1.Resta(f3); Fraccion producto = f1.Multiplica(f4); Fraccion cociente = f1.Divide(f2); cout cout cout cout cout cout } << << << << << << "Primera fracción: " ; f1.Prt(); "Segunda fracción: " ; f2.Prt(); "Suma: " << suma.Prt(); "Resta: " << resta.Prt(); "Producto: " << producto.Prt(); "Cociente: " << cociente.Prt(); cout << "Ya he terminado." << endl; Debe crear un nuevo proyecto Ejer3 y los ficheros Fraccion.h, Fraccion.cpp y main.cpp. Recuerde que los dos primeros son para la clase Fraccion y main.cpp es para el programa principal. 1.4 Ejercicio 4: La clase cuenta_corriente Con este ejercicio se pretende que el alumno se familiarice con las clases de C++. Cree un nuevo proyecto llamado Ejer4 dentro de su directorio de trabajo. Los ficheros de partida de este ejercicio son: cuenta.h, cuenta.cpp y bancoT.cpp (donde estará main). // Fichero cuenta.h class cuenta_corriente { private: // declaración de variables miembro -privadas, por defectodouble saldo; // saldo actual de la cuenta double interes; // interes en tanto por 1 public: // declaración de funciones miembro // constructor de la clase cuenta_corriente(double inicio, double int100); void deposito(double cantidad); // hacer un deposito double pago(double cantidad); // hacer pago (si se puede) void abono_interes(); // abonar intereses double obtener_saldo(); // preguntar el saldo // transferencia de objeto implícito a objeto “destino” double transfer(cuenta_corriente& destino, double cantidad); }; // Fichero cuenta.cpp // Definición de las funciones de la clase cuenta_corriente #include <iostream.h> // se incluye la declaración de cuenta_corriente #include "cuenta.h" // funcion round() para redondear céntimos. // No es función miembro double round(double cantidad); Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Practica Nº 4 Programación en C++ // Constructor de la clase: // Abrir cuenta con saldo e interés en % cuenta_corriente::cuenta_corriente(double inicio, double int100) { saldo = inicio; interes = int100/100.0; } // Depositar cantidad en cuenta. // No se chequea si el valor es positivo void cuenta_corriente::deposito(double cantidad) { saldo += cantidad; } // Función para retirar cantidad. // Se devuelve cantidad o cero (si no hay saldo) double cuenta_corriente::pago(double cantidad) { // Si hay saldo suficiente if(cantidad <= saldo) { saldo -= cantidad; return cantidad; } // No hay saldo suficiente else return 0.0; } // Función para calcular interés y sumarlo void cuenta_corriente::abono_interes() { // cálculo del interés double intereses = round(saldo * interes); // se incrementa el saldo saldo += intereses; } // Preguntar el saldo double cuenta_corriente::obtener_saldo() { // de devuelve el valor del saldo return saldo; } // Función para hacer una trasferencia. // El objeto origen es el argumento implícito. // El objeto destino es el argumento explícito double cuenta_corriente::transfer(cuenta_corriente& destino, double cantidad) { // Se accede directamente a la variable saldo // del objeto origen. Para acceder a saldo de // destino se utiliza el operador punto. if (saldo < cantidad) return 0.0; saldo -= cantidad; destino.saldo += cantidad; return cantidad; } // Función para redondear los céntimos // No es función miembro double round(double cantidad) { long centimos = long(100.0 * cantidad + 0.5); return double(centimos)/100.0; } Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Pág. 5 Practica Nº 4 Programación en C++ // Fichero bancoT.cpp // Calcular el saldo en una cuenta bancaria #include <iostream.h> #include "cuenta.h" void main(void) { // Obtener los datos del usuario double saldo; // Se leen las variables del programa // Datos para el objeto mi_cuenta cout << "Teclee los datos de mi_cuenta: " << endl; cout << "Saldo inicial: "; cin >> saldo; // llamada al constructor. // Se crea un objeto de la clase cuenta_corriente // con nombre mi_cuenta // Se le pasa un interés mensual cualquiera cuenta_corriente mi_cuenta(saldo, 1.0); // Datos para el objeto su_cuenta cout << "\nTeclee los datos de su_cuenta: " << endl; cout << "Saldo inicial: "; cin >> saldo; // llamada al constructor. // Se crea un objeto de la clase cuenta_corriente // con nombre su_cuenta // Se le pasa un interés mensual cualquiera cuenta_corriente su_cuenta(saldo, 1.0); // Transferencia int tr = 1; double cantidad = 0.0; while (tr==1) { cout << "\nTeclee los datos de la transferencia" << "\n1. de mi_cuenta a su_cuenta" << "\n2. de su_cuenta a mi_cuenta" << endl; cin >> tr; cout << "\nTeclee la cantidad: " << flush; cin >> cantidad; cout << "\nLos saldos antes de la transferencia son:" << "\n En mi_cuenta: " << mi_cuenta.obtener_saldo() << "\n En su_cuenta: " << su_cuenta.obtener_saldo() << endl; if (tr==1) { // mi_cuenta se pasa como argumento implícito // su_cuenta se pasa como argumento explícito if (mi_cuenta.transfer(su_cuenta, cantidad)==0.0) cout << "\nSaldo insuficiente en mi_cuenta" << endl; } else if (tr==2) { if (su_cuenta.transfer(mi_cuenta, cantidad)==0.0) cout << "\nSaldo insuficiente en su_cuenta" << endl; } else cout << "\nTransferencia mal definida: " << "Teclee de nuevo." << endl; Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra Pág. 6 Practica Nº 4 Programación en C++ Pág. 7 cout << "\nLos saldos tras la transferencia son:" << "\n En mi_cuenta: " << mi_cuenta.obtener_saldo() << "\n En su_cuenta: " << su_cuenta.obtener_saldo() << endl; cout << "\nDesea hacer una nueva transferencia? " << " Teclee 1 (SI) o 2 (NO)" << endl; cin >> tr; } // fin del while } cout << "Ya he terminado. " << endl; Cree el ejecutable de este proyecto y ejecútelo practicando con las trasferencias entre las dos cuentas corrientes, observando los resultados. Adicional: Como habrá podido notar, no hemos usado las funciones miembro deposito ni abono_intereses. Trate de usarlas desde main. Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra