Prácticas de C++

Anuncio
Prácticas de C++
Practica Nº 6
Informática II
Fundamentos de Programación
Prof. Dr. Paul Bustamante
Practica Nº 6 Programación en C++
Pág. 1
ÍNDICE
ÍNDICE ........................................................................................................................................ 1
1. Introducción...................................................................................................................... 1
1.1
Ejercicio 1: Clase Complejo, versión 1.1................................................................... 1
1.2
Ejercicio 2: Clase Fraccion v1.1 ................................................................................ 2
1.3
Ejercicio 3: Clase Vector............................................................................................ 3
1.4
Ejercicio 5: Mi clase MiString, versión 1.0 ............................................................... 4
1. Introducción.
En esta práctica nos introduciremos en la sobrecarga de operadores, un concepto
nuevo visto esta semana en las clases de teoría.
1.1 Ejercicio 1: Clase Complejo, versión 1.1
Este ejercicio consiste en sobrecargar todos los operadores (+,-,*,/,>>,<<) que intervengan en
el programa que se describe a continuación. Puede utilizar las versiones anteriores de la clase
Complejo, dadas en clase o en la práctica anterior. Sólo se da a modo de ejemplo cómo se
sobrecarga el operador “+”.
class Complejo
{
double r,i;
public:
Complejo( double r1, double i1);
~Complejo();
Complejo operator+(Complejo &c){
Complejo tmp;
tmp.r = r + c.r;
tmp.i = i + c.i;
return tmp;
}
};
//principal.cpp
#include <iostream.h>
void main()
{
Complejo c1(2.5,3),c2;
cin >> c2;
//pedir datos para c2
Complejo c3 = c1 + c2;
// c1.operator+(c2)
cout << c1 << " + " << c2 << " = " << c3 <<endl;
c3 = c1 * c2;
cout << c1 << " * " << c2 << " = " << c3 <<endl;
c1==c2? cout << c1 << " y " << c2 << " son Iguales\n":
cout << c1 << " y " << c2 << " son Diferentes\n";
if ( c1 > c2 ) cout << c1 << " es > que " << c2;
else cout << c1 << " es < que " << c2;
cout << "\nHe terminado.." << endl;
}
Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra
Practica Nº 6 Programación en C++
Pág. 2
1.2 Ejercicio 2: Clase Fraccion v1.1
Para recordar, la clase Fraccion tiene dos variables miembro privadas (long num, den), para
almacenar el numerador y denominador respectivamente. Debe crear un proyecto Ejer1 y los
ficheros respectivos para la clase Fraccion, en los cuales va a escribir el código:
1. Debe crear una función miembro privada, llamada simplificar( ), que permita
expresar la fracción en su forma más simplificada posible, manteniendo que tanto el
numerador como el denominador sean enteros. Por ejemplo, al simplificar la fracción 2/4 se
debe obtener 1/2. La simplificación se basa en la división por el máximo común divisor del
numerador y denominador. Para ello se puede seguir el algoritmo de Euclides presentado en
las transparencias de clase de “Algoritmos de búsqueda y ordenación”.
void Fraccion::simplificar()
{
long m, n, r;
if (num<den) { m=den; n=num; }
else { m=num; n=den; }
while ((r=m%n) != 0) {
m=n;
n=r;
} //n es el m.c.d
num /= n;
den /= n;
//r=resto de m/n
}
Se trata de una función privada, lo que significa que sólo puede ser llamada desde las
funciones miembro o funciones friend. Se pide utilizarla desde todas las funciones y
operadores que modifiquen el valor del denominador o del numerador (incluidos los
constructores). Esto significa que si por ejemplo inicializáramos a 4/8, el valor almacenado
debería ser 1/2.
2. Trate de crear una serie de funciones friend que permitan pre/post-multiplicar y
pre/post-dividir una fracción por un número entero (int). Los prototipos de estas funciones
para las variables de tipo int son los siguientes:
//Pre multiplicar y dividir:
friend Fraccion operator* (int, const Fraccion&);
friend Fraccion operator/ (int, const Fraccion&);
//Post multiplicar y dividir:
friend Fraccion operator* (const Fraccion&, int);
friend Fraccion operator/ (const Fraccion&, int);
3. Sobrecargar el operador de extracción “>>” para poder pedir el valor de la fracción
de la forma 2/6 directamente y que a su vez simplifique y guarde 1/3. También sobrecargar el
operador de inserción “<<” para poder sacar directamente por consola los valores de las
fracciones.
4. Finalmente, deben sobrecargar los operadores de suma y multiplicación para que
permitan sumar y multiplicar dos fracciones, tal como se puede apreciar en el código de la
función principal main.
A continuación se da el código que debe ir en main():
Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra
Practica Nº 6 Programación en C++
Pág. 3
void main()
{
Fraccion f1(1,4);
Fraccion f2(1,2);
Fraccion f3;
cin >> f3;
//pide datos para f3
Fraccion fr = f1 + f2;
cout << f1 << " + " << f2 << " = " << fr << endl;
Fraccion fm = f1 * f2;
cout << f1 << " * " << f2 << " = " << fm << endl;
int k=4;
fr = k * f1;
//Pre-multip
cout << k << " * "<<f1<<" = "<< fr << endl;
fr = k / f3;
//Pre-division
cout << k << " / "<<f3<<" = "<< fr << endl;
k=2;
fr =
cout
fr =
cout
f2
<<
f3
<<
* k;
//Post-multip
f2 << " * "<<k<<" = "<< fr << endl;
/ k;
//Post-division
f3 << " / "<<k<<" = "<< fr << endl;
Fraccion f4;
cin >> f4;
cout << f4;
}
1.3 Ejercicio 3: Clase Vector
Este ejercicio consiste en hacer una clase Vector que permita crear vectores de una forma más
intuitiva. Aunque el vector es de enteros, se puede extender a cualquier tipo (double, float).
El código es el mismo que el que está en los apuntes de las transparencias de clases. Tiene
una función miembro (Ordena) añadida que permitirá ordenar el vector de forma ascendente
o descendente, según el argumento que se le pase. A continuación puede ver la definición de
la clase,
//vector.h
class Vector
{
int *pV;
int num;
//numero de elementos
public:
Vector(int);
~Vector();
int& operator[](int index);
void Ordena(bool ord);
//true=asc. false=desc
};
Y el código del programa principal:
//principal.cpp
void main()
{
int num;
cout << "Num:";
cin >> num;
Vector v(num);
//crear vector
for (int i=0;i<num;i++)
cin >> v[i];
//imprimir vector
cout << "El vector es:\n";
Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra
Practica Nº 6 Programación en C++
Pág. 4
for (i=0;i<num;i++)
cout << v[i] << endl;
//ordenar
char orden;
cout << "Como lo quiere ordenar (A=asc D=desc):?";
cin >> orden;
cout << "\nEl vector es ordenado es:\n";
if ( orden=='A' || orden=='a') v.Ordena(true);
else v.Ordena(false);
for (i=0;i<num;i++)
cout << v[i] << endl;
cout << "Adios.."<<endl;
//asc
}
1.4 Ejercicio 5: Mi clase MiString, versión 1.0
En este ejercicio vamos a crear la clase MiString, la cual permite utilizar de manera más
intuitiva las cadenas. Ahora sólo se dará la definición de la clase y el código de la función
principal main, desde dónde se deben crear los objetos de la clase MiString. El resto debe
tratar de implementarlo Ud. solo.
//MiString.h
class MiString
{
char *str;
//cadena
public:
MiString();
MiString(char *t);
~MiString(){ delete [] str; }
//destructor
friend istream &operator>>(istream &ci, MiString &s);
friend ostream &operator<<(ostream &co, MiString &s);
char operator[](int i);
bool operator==(char*t);
void operator=(char *t);
//sobrecarga
int GetLen(){ return strlen(str); }
};
Se deben sobrecargar los siguientes operadores:
• De inserción << y de extracción >> para poder pedir el texto e imprimirlo.
• Operador = = para comparar con una cadena de texto.
• El operador [ ] para poder acceder directamente a un elemento de la cadena.
//main.cpp
void main()
{
MiString cs;
while(1) {
cout << "\nDar una frase:?";
cin >> cs;
cout << "La frase al reves es:";
for (int i=cs.GetLen()-1; i>=0;i--){
cout<<cs[i];
}
cout << "\nDesea Salir? SI o NO:?";
MiString cs1;
cin >> cs1;
if (cs1 == "SI") break;
}
cout << "\nAdios.."<<endl;
}
Compile el proyecto y ejecútelo, observando el resultado.
Escuela Superior de Ingenieros – Tecnun – Universidad de Navarra
Descargar