Sunteți pe pagina 1din 15

Ejercicios Resueltos Tema 2 Ejercicio 2.

1
Crear una clase Vector de N elementos (N ser un const) de tipo flotante, con los operadores: suma, resta, producto escalar y entrada/salida, as como el constructor por defecto. Crear todos los mtodos adicionales que se estime oportuno.

Solucin
//Ejercicio 2.1 #include <iostream> #include <conio.h> using namespace std; //Constante N const int N = 4; //Clase vector class Vector{ private: //Array de N elementos float V[N]; //variable que se devuelve //al acceder fuera de rango float elemento_no_valido; public: //Constructor por defecto Vector(){ for(int i=0;i<N;i++) V[i]=0; return; } //Operador suma de dos vectores Vector operator+(Vector v){ Vector resul; for(int i=0;i<N;i++) resul.V[i]=V[i]+v.V[i]; return(resul); } //Operador resta de dos vectores Vector operator-(Vector v){ Vector resul; for(int i=0;i<N;i++) resul.V[i]=V[i]-v.V[i]; return(resul); }

FP2 GISIT. Ejercicios resueltos Tema 2

//Operador producto escalar. Devuelve un flotante float operator*(Vector v){ float resul=0; for(int i=0;i<N;i++) resul+=V[i]*v.V[i]; return(resul); } //Acceso a los elementos mediante corchetes float & operator[](int i){ if(i>=0 && i<N) return(V[i]); else return(elemento_no_valido); //fuera de rango } //Salida por pantalla friend ostream& operator<<(ostream &medio, Vector v){ for(int i=0;i<N;i++) medio<<v.V[i]<<" "; medio<<endl; return(medio); } //Entrada por teclado friend istream& operator>>(istream &medio, Vector &v){ for(int i=0;i<N;i++){ cout<<"Elemento "<<i<<":"; medio>>v.V[i]; } return(medio); } }; //Funcin principal int main(void){ //cdigo de ejemplo para probar la clase Vector v1; cout<<"Introduzca vector v1: "<<endl; cin>>v1; cout<<"Vector introducido: "<<v1; Vector v2=v1; //const. de copia for(int i=0;i<N;i++) v2[i]=v2[i]*2; cout<<"Doble del vector: "<<v2; cout<<"Producto escalar: "<<v1*v2<<endl; cout<<"Resultado de la suma "<<v2-v1+v2-v1-v2; //result vector a 0 getche(); return(0); }

FP2 GISIT. Ejercicios resueltos Tema 2

Ejercicio 2.2
Crear una clase Matriz de NxN elementos (misma N anterior) basada en Vector. Para ello, la matriz contendr un array de N elementos Vector de N elementos cada uno. Incluir los mismos operadores (suma, resta, producto matriz-matriz, producto matriz-vector y entrada/salida) y el constructor por defecto. Crear todos los mtodos adicionales que se estime oportuno.

Solucin
//Ejercicio 2.2 #include <iostream> #include <conio.h> using namespace std; //Constante N const int N = 3; //Clase vector class Vector{ private: //Array de N elementos float V[N]; //variable que se devuelve al acceder fuera de rango float elemento_no_valido; public: //Constructor por defecto Vector(){ for(int i=0;i<N;i++) V[i]=0; return; } //Operador suma de dos vectores Vector operator+(Vector v){ Vector resul; for(int i=0;i<N;i++) resul.V[i]=V[i]+v.V[i]; return(resul); } //Operador resta de dos vectores Vector operator-(Vector v){ Vector resul; for(int i=0;i<N;i++) resul.V[i]=V[i]-v.V[i]; return(resul); } //Operador producto escalar. Devuelve un flotante float operator*(Vector v){ float resul=0; for(int i=0;i<N;i++) resul+=V[i]*v.V[i]; return(resul); } //Acceso a los elementos mediante corchetes float & operator[](int i){ if(i>=0 && i<N) return(V[i]); else return(elemento_no_valido); //fuera de rango }

FP2 GISIT. Ejercicios resueltos Tema 2

//Salida por pantalla friend ostream& operator<<(ostream &medio, Vector v){ for(int i=0;i<N;i++) medio<<v.V[i]<<" "; medio<<endl; return(medio); } //Entrada por teclado friend istream& operator>>(istream &medio, Vector &v){ for(int i=0;i<N;i++){ cout<<"Elemento "<<i<<":"; medio>>v.V[i]; } return(medio); } }; //Clase Matriz class Matriz{ private: //Array de N vectores de tamao N Vector M[N]; //variable que se devuelve //al acceder fuera de rango Vector elemento_no_valido; public: Matriz(){ //el constructor por defecto no hace nada //porque lo hace todo el de Vector return; } //Suma de dos matrices Matriz operator+(Matriz m){ Matriz resul; for(int i=0;i<N;i++) resul.M[i] = M[i]+m.M[i]; return(resul); } //Resta de dos matrices Matriz operator-(Matriz m){ Matriz resul; for(int i=0;i<N;i++) resul.M[i] = M[i]-m.M[i]; return(resul); } //Acceso a los elementos con [] Vector& operator[](int i){ if(i>=0 && i<N) return(M[i]); else return(elemento_no_valido); //fuera de rango } //Producto por un vector, resulta un vector Vector operator*(Vector v){ Vector resul; //usamos el producto vector-vector for(int i=0;i<N;i++) resul[i]=M[i]*v; return(resul); } //Extrae un vector columna Vector ObtenerColumna(int j){ Vector resul; for(int i=0;i<N;i++) resul[i]=M[i][j]; return(resul); }

FP2 GISIT. Ejercicios resueltos Tema 2

//Producto matriz-matriz Matriz operator*(Matriz m){ Matriz resul; for(int i=0;i<N;i++){ Vector fact = M[i]; for(int j=0;j<N;j++){ Vector cact; cact = m.ObtenerColumna(j); //extrae el vector columna resul[i][j]=fact*cact; //para hacer vector*vector } } return(resul); } //Salida por pantalla friend ostream& operator<<(ostream &medio, Matriz v){ //usa el operador << de vector for(int i=0;i<N;i++) medio<<v.M[i]; return(medio); } //Entrada por teclado friend istream& operator>>(istream &medio, Matriz &v){ for(int i=0;i<N;i++){ cout<<"Fila "<<i<<endl; //Usa el operador >> del vector medio>>v.M[i]; } return(medio); } }; //Funcion principal int main(void){ Matriz m1,m2; Vector v; cout<<"Introduzca Matriz1 "<<endl; cin>>m1; cout<<"Introduzca Matriz2 "<<endl; cin>>m2; cout<<"Introduzca Vector"<<endl; cin>>v; cout<<"Matriz1="<<endl; cout<<m1; cout<<"Matriz2="<<endl; cout<<m2; cout<<"Vector="<<endl; cout<<v; cout <<"Matriz1 + Matriz2 = "<<endl<<m1+m2; cout <<"Matriz1 - Matriz2 * Matriz1= "<<endl<<m1-m2*m1; cout <<"Matriz1 * Vector = "<<endl<<m1*v; getche(); return(0); }

FP2 GISIT. Ejercicios resueltos Tema 2

Ejercicio 2.3
Crear un proyecto completo con las dos clases anteriores, separando la implementacin y la definicin de las clases en sus respectivos archivos .cpp y .h, as como un archivo main.cpp que testee los elementos de los mismos.

Solucin
Fichero vector.h
#ifndef VECTOR_H #define VECTOR_H #include <iostream> #include <conio.h> using namespace std; //Constante N const int N = 3; //Clase vector class Vector{ private: //Array de N elementos float V[N]; //variable que se devuelve //al acceder fuera de rango float elemento_no_valido; public: //Constructores Vector(); //Operadores Vector operator+(Vector v); Vector operator-(Vector v); float operator*(Vector v); float & operator[](int i); friend ostream& operator<<(ostream &medio, Vector v); friend istream& operator>>(istream &medio, Vector &v); };

#endif

FP2 GISIT. Ejercicios resueltos Tema 2

Fichero vector.cpp
#include "vector.h" //Constructor por defecto Vector::Vector(){ for(int i=0;i<N;i++) V[i]=0; return; } //Operador suma de dos vectores Vector Vector::operator+(Vector v){ Vector resul; for(int i=0;i<N;i++) resul.V[i]=V[i]+v.V[i]; return(resul); } //Operador resta de dos vectores Vector Vector::operator-(Vector v){ Vector resul; for(int i=0;i<N;i++) resul.V[i]=V[i]-v.V[i]; return(resul); } //Operador producto escalar. Devuelve un flotante float Vector::operator*(Vector v){ float resul=0; for(int i=0;i<N;i++) resul+=V[i]*v.V[i]; return(resul); } //Acceso a los elementos mediante corchetes float & Vector::operator[](int i){ if(i>=0 && i<N) return(V[i]); else return(elemento_no_valido); //fuera de rango } //Salida por pantalla ostream& operator<<(ostream &medio, Vector v){ for(int i=0;i<N;i++) medio<<v.V[i]<<" "; medio<<endl; return(medio); } //Entrada por teclado istream& operator>>(istream &medio, Vector &v){ for(int i=0;i<N;i++){ cout<<"Elemento "<<i<<":"; medio>>v.V[i]; } return(medio); }

Fichero matriz.h
#ifndef MATRIZ_H #define MATRIZ_H #include "vector.h" //Clase Matriz class Matriz{ private: //Array de N vectores de tamao N Vector M[N];

FP2 GISIT. Ejercicios resueltos Tema 2

//variable que se devuelve //al acceder fuera de rango Vector elemento_no_valido; public: //Constructores Matriz(); //Operadores Matriz operator+(Matriz m); Matriz operator-(Matriz m); Vector& operator[](int i); Vector operator*(Vector v); Matriz operator*(Matriz m); friend ostream& operator<<(ostream &medio, Matriz v); friend istream& operator>>(istream &medio, Matriz &v); //Otros mtodos Vector ObtenerColumna(int j); }; #endif

Fichero matriz.cpp
#include "matriz.h" Matriz::Matriz(){ //el constructor por defecto no hace nada //porque lo hace todo el de Vector return; } //Suma de dos matrices Matriz Matriz::operator+(Matriz m){ Matriz resul; for(int i=0;i<N;i++) resul.M[i] = M[i]+m.M[i]; return(resul); } //Resta de dos matrices Matriz Matriz::operator-(Matriz m){ Matriz resul; for(int i=0;i<N;i++) resul.M[i] = M[i]-m.M[i]; return(resul); } //Acceso a los elementos con [] Vector& Matriz::operator[](int i){ if(i>=0 && i<N) return(M[i]); else return(elemento_no_valido); //fuera de rango } //Producto por un vector, resulta un vector Vector Matriz::operator*(Vector v){ Vector resul; //usamos el producto vector-vector for(int i=0;i<N;i++) resul[i]=M[i]*v; return(resul); } //Extrae un vector columna Vector Matriz::ObtenerColumna(int j){ Vector resul; for(int i=0;i<N;i++) resul[i]=M[i][j]; return(resul); }

FP2 GISIT. Ejercicios resueltos Tema 2

//Producto matriz-matriz Matriz Matriz::operator*(Matriz m){ Matriz resul; for(int i=0;i<N;i++){ Vector fact = M[i]; for(int j=0;j<N;j++){ Vector cact; cact = m.ObtenerColumna(j); //extrae el vector columna resul[i][j]=fact*cact; //para usar vector*vector } } return(resul); } //Salida por pantalla ostream& operator<<(ostream &medio, Matriz v){ //usa el operador << de vector for(int i=0;i<N;i++) medio<<v.M[i]; return(medio); } //Entrada por teclado istream& operator>>(istream &medio, Matriz &v){ for(int i=0;i<N;i++){ cout<<"Fila "<<i<<endl; //Usa el operador >> del vector medio>>v.M[i]; } return(medio); }

Fichero main.cpp
#include "matriz.h" //Funcion principal int main(void){ Matriz m1,m2; Vector v; cout<<"Introduzca Matriz1 "<<endl; cin>>m1; cout<<"Introduzca Matriz2 "<<endl; cin>>m2; cout<<"Introduzca Vector"<<endl; cin>>v; cout<<"Matriz1="<<endl; cout<<m1; cout<<"Matriz2="<<endl; cout<<m2; cout<<"Vector="<<endl; cout<<v; cout <<"Matriz1 + Matriz2 = "<<endl<<m1+m2; cout <<"Matriz1 - Matriz2 * Matriz1= "<<endl<<m1-m2*m1; cout <<"Matriz1 * Vector = "<<endl<<m1*v; getche(); return(0); }

FP2 GISIT. Ejercicios resueltos Tema 2

Ejercicio 2.4
Repetir el ejercicio 2.1 para poder crear vectores con cualquier nmero de elementos (en el constructor principal recibir N).

Solucin
//Ejercicio 2.4 #include <iostream> #include <conio.h> using namespace std; //clase Vector class Vector{ private: //Array de flotantes y tamao float *V; int N; //variable que se devuelve //al acceder fuera de rango float elemento_no_valido; public: //Constructor a partir del nmero de elementos Vector(int n){ if(n<=0) n=1; //evita tamaos <=0 N=n; V=new float[N]; for(int i=0;i<N;i++) V[i]=0; return; } //Constructor de copia (necesario al contener elem. dinmicos) Vector(const Vector &orig){ N=orig.N; V=new float[N]; for(int i=0;i<N;i++) V[i]=orig.V[i]; return; } //Destructor (necesario al contener elem. dinmicos) ~Vector(){ delete []V; return; } //operador asignacin (necesario al contener elem. dinmicos) Vector operator=(Vector v){ if(N!=v.N){ //comprobamos el tamao delete V; N=v.N; V=new float[N]; } for(int i=0;i<N;i++) V[i]=v.V[i]; return(*this); }

FP2 GISIT. Ejercicios resueltos Tema 2

10

//Operador suma de dos vectores Vector operator+(Vector v){ int nmax = N; if(v.N>nmax) nmax=v.N; Vector resul(nmax);//resultado con el maximo tamao for(int i=0;i<nmax;i++){ if(i<N) resul.V[i]+=V[i]; if(i<v.N) resul.V[i]+=v.V[i]; } return(resul); } //Operador resta de dos vectores Vector operator-(Vector v){ int nmax = N; if(v.N>nmax) nmax=v.N; Vector resul(nmax);//resultado con el maximo tamao for(int i=0;i<nmax;i++){ if(i<N) resul.V[i]+=V[i]; if(i<v.N) resul.V[i]-=v.V[i]; } return(resul); } //Producto escalar float operator*(Vector v){ float resul=0; int nmin = v.N; if(N<nmin) nmin=N; for(int i=0;i<nmin;i++) resul+=V[i]*v.V[i]; return(resul); } //Acceso con corchetes float& operator[](int i){ if(i>=0 && i<N) return(V[i]); else return(elemento_no_valido); } //Salida por pantalla friend ostream& operator<<(ostream &medio, Vector v){ for(int i=0;i<v.N;i++) medio<<v.V[i]<<" "; medio<<endl; return(medio); } //Entrada por teclado friend istream& operator>>(istream &medio, Vector &v){ for(int i=0;i<v.N;i++){ cout<<"Elemento "<<i<<":"; medio>>v.V[i]; } return(medio); } }; //Funcion principal int main(void){ Vector v1(5); cout<<"Vector1 "<<endl; cin>>v1; Vector v2(3),v3=v1; v2=v1; for(int i=0;i<5;i++) v2[i]*=2; v3 = v3+v2; cout<<"V1 = "<<v1;

FP2 GISIT. Ejercicios resueltos Tema 2

11

cout<<"V2 = "<<v2; cout<<"V3 = "<<v3; getche(); return(0); }

FP2 GISIT. Ejercicios resueltos Tema 2

12

Ejercicio 2.5
Crear una clase Cadena para manejar cadenas de caracteres dinmicas al estilo de string. Deber contener, al menos: constructor por defecto, constructor de copia, constructor a partir de un char*, destructor y los operadores de concatenacin (suma + y autosuma +=), flujo de entrada y salida, asignacin y comparaciones alfabticas (==, > y <). Tambin dotaremos a Cadena de la posibilidad de acceder carcter a carcter con corchetes y de un mtodo para obtener su longitud.

Solucin
//Ejercicio 2.5 #include <iostream> #include <string.h> #include <conio.h> using namespace std; //Clase Cadena class Cadena{ private: char *cad; //vector de caracteres int N; //nmero de caracteres public: //Constructor por defecto Cadena(){ //cadena con \0 nicamente cad = new char[1]; cad[0]='\0'; N=0; return; } //Constructor de copia Cadena(const Cadena &c){ cad = new char[c.N+1]; strcpy(cad,c.cad); N=c.N; return; } //Constructor a partir de una cadena Cadena(const char *c){ N=strlen(c); cad = new char[N+1]; strcpy(cad,c); return; } //destructor ~Cadena(){ delete []cad; return; }

FP2 GISIT. Ejercicios resueltos Tema 2

13

//Longitud de la cadena int Longitud(void){ return(N); } //flujo de salida friend ostream& operator<<(ostream &m, Cadena c){ m<<c.cad; return(m); } //flujo de entrada friend istream& operator>>(istream &m, Cadena &c){ char aux[100]; m>>aux; c=Cadena(aux); return(m); } //acceso por corchetes char & operator[](int i){ return(cad[i]); } //operador de asignacin Cadena operator=(Cadena c){ delete []cad; cad = new char[c.N+1]; strcpy(cad,c.cad); N=c.N; return(*this); } //Comparacin bool operator==(Cadena c){ if(strcmp(cad,c.cad)==0) return(true); else return(false); } //Operador > alfabtico bool operator>(Cadena c){ if(strcmp(cad,c.cad)>0) return(true); else return(false); } //Operador < alfabtico bool operator<(Cadena c){ if(strcmp(cad,c.cad)<0) return(true); else return(false); } //auto-concatenacin Cadena operator+=(Cadena c){ int l = N+c.N; char *nueva=new char[l+1]; strcpy(nueva,cad); strcat(nueva,c.cad); delete []cad; cad=nueva; N=l; return(*this); } //concatenacin Cadena+Cadena Cadena operator+(Cadena c){ Cadena nueva(*this); nueva+=c; return(nueva); }

FP2 GISIT. Ejercicios resueltos Tema 2

14

//Concatenacin char*+Cadena friend Cadena operator+(char *c1, Cadena c2){ Cadena resul = c1; resul += c2; return(resul); } }; //funcin principal int main(void){ //Ejemplo de uso de Cadena Cadena c1 = "primera cadena"; Cadena c2 = "segunda cadena"; Cadena c3; c3 = c1 + " separador " +c2; c3 += " al final"; for(int i=0;i<c3.Longitud();i++){ if(c3[i]>='a' && c3[i]<='z') c3[i]=c3[i]-'a'+'A'; } cout<<c3; getche(); return(0); }

FP2 GISIT. Ejercicios resueltos Tema 2

15

S-ar putea să vă placă și