|
Esta sección te permite ver todos los posts escritos por este usuario. Ten en cuenta que sólo puedes ver los posts escritos en zonas a las que tienes acceso en este momento.
Mensajes - Checho360
51
« en: Miércoles 30 de Marzo de 2011, 15:41 »
Hola, si lo que preguntas es una funcion que genere a partir de una matriz A, una matriz B reflejo vertical de A (la misma pero al reves), creo que seria: function [B] = reflejo_vertical (A) %Programa que recibe una matriz A y devuelve su reflejo vertical t = fil; t=t-1; end end
Si te he entendido mal dimelo !! Un saludo!!
52
« en: Miércoles 30 de Marzo de 2011, 15:05 »
No entiendo muy bien que es lo que preguntas; si te explicas mejor quizás te pueda ayudar.
53
« en: Miércoles 30 de Marzo de 2011, 00:46 »
Para almacenar la suma en "vector" basta sobrecargar el constructor copia de "vector" para poder recibir const matrix&. Además tienes que agregar un constructor sin párametros "default constructor" para "matrix" y también es buena idea si las clases hijas tienen uno.
Supongo que todo esto es simple ejercicio académico, por que es un poco absurdo tener esas dos clases hijas, puesto que tienen el mismo comportamiento y miembros de la clase padre. ostia pues tienes razón jajajja si le declaro el default constructor luego me deja sobrecargar el constructor copia de "vector" y luego claro ya puedo. Pero no entiendo por que hay que darle esa declaración de constructor default para que luego me deje sobrecargar el copia. Me puedes decir?? Ah,y por cierto, si es un ejercicio de aprendizaje. Un saludo y muchisimas gracias!
54
« en: Martes 29 de Marzo de 2011, 21:42 »
Hola; estoy creando otro programa probando con eso de la herencia y tengo una duda acerca de una cosa. El código es el siguiente: #include <iostream> #include <cmath> #define MAX_SIZE 10 using namespace std; class matrix { public: int col, fil; double s[MAX_SIZE][MAX_SIZE]; matrix (int n, int m); matrix(const matrix& A); matrix operator = (matrix A); matrix operator + (matrix A); matrix scan_matrix (void); void print_matrix (void); ~matrix(){} }; matrix :: matrix(int n, int m){ if(n>MAX_SIZE){ cerr<<"ERROR: el numero de filas introducidas es mayor del permitido"; fil=MAX_SIZE; } else{ fil=n; } if(m>MAX_SIZE){ cerr<<"ERROR: el numero de columnas introducidas es mayor del permitido"; col=MAX_SIZE; } else{ col=m; } } matrix :: matrix (const matrix& A){ fil=A.fil;col=A.col; for(int i=0;i<A.fil;i++){ for(int j=0;j<A.col;j++){ s[i][j]=A.s[i][j]; } } } matrix matrix :: operator + (matrix A){ if(col!=A.col || fil != A.fil){ cerr<<"ERROR: el numero de filas o columnas de las matrices introducidas no coinciden"; } matrix C(A.fil,A.col); for(int i=0;i<A.fil;i++){ for (int j=0;j<A.col;j++){ C.s[i][j]=s[i][j]+A.s[i][j]; } } return C; } matrix matrix ::operator = (matrix A){ fil = A.fil; col = A.col; for(int i=0;i<A.fil;i++){ for (int j=1;j<A.col;j++){ s[i][j]=A.s[i][j]; } } } matrix matrix :: scan_matrix (void){ for (int i=0;i<fil;i++){ for(int j=0;j<col;j++){ cout<<"Introduzca el coef "<<i<<" "<<j<<"n"; cin>>s[i][j]; } } } void matrix :: print_matrix (void){ for (int i=0;i<fil;i++){ for(int j=0;j<col;j++){ cout<<"El coef "<<i<<" "<<j<<" = "<<s[i][j]<<"n"; } } } class square_matrix : public matrix { public: square_matrix(int size) : matrix (size,size) {} ~square_matrix () {} }; class vector : public matrix { public: vector (int size) : matrix(1,size) {} ~vector () {} }; int main (){ matrix A(2,2);square_matrix B(2);vector C(2);vector D(2); A.scan_matrix();B.scan_matrix();C.scan_matrix();D.scan_matrix(); matrix F=(A+B);F.print_matrix(); matrix E(C+D); system("pause"); }
Si os fijais en las ultimas lineas sumo dos vectores y esta suma la tengo que almacenar en un objeto de la clase matrix. Es logico porque arriba a la hora de declarar las funciones tengo escrito "matrix operator", lo cual dice que devuelve un objeto del tipo "matrix". Me preguntaba si se podría modificar el código de alguna manera para poder almacenar la suma en un objeto del tipo "vector" en lugar del tipo "matrix". Un saludo!!
55
« en: Martes 29 de Marzo de 2011, 20:15 »
Es que el constructor copia es matrix::matrix(const matrix& A) y no matrix::matrix(matrix& A) (léete esto de principio a fin). Bueno pues así es entonces; esa es la forma de crear el constructor copia y lo tenía mal declarado... Un saludo y muchas gracias a todos!
56
« en: Martes 29 de Marzo de 2011, 19:08 »
El error que te da es porque no tienes constructor por defecto. Es decir, declaras
pero esto no lo puedes hacer porque tu constructor pide un argumento.
Saludos. Si pero de todas formas si fuera por eso no debería de funcionar al poner esto ? : Es que así tampoco funciona
57
« en: Martes 29 de Marzo de 2011, 18:36 »
Bueno pues tienes razón Epa; modificando eso para ponerle un const compila y funciona perfectamente: #include <iostream> using namespace std; #define MAX_SIZE 10 class matrix{ public: int size; double s[MAX_SIZE]; matrix (int n); ~matrix() {} int test_matrix (int a); matrix scan_matrix (void); matrix operator + (matrix A); void print_matrix (void); matrix (const matrix& A);//<---------------Aqui esta la declaracion }; matrix::matrix(const matrix& A){ //<-------------Aqui esta la implementación size = A.size; for (int i=0;i<A.size;i++) s[i]=A.s[i]; } matrix :: matrix (int n){ size = test_matrix(n); } int matrix :: test_matrix (int a){ if(a>MAX_SIZE){ cerr<<"Demasiados elementosn"; a=MAX_SIZE; } return a; } matrix matrix :: scan_matrix (void){ for(int i=0;i<size;i++){ cout<<"Ingresa el coef "<<i<<"n";cin>>s[i]; } } matrix matrix :: operator + (matrix A){ if(A.size!=size){ cerr<<"Los vectores han de ser del mismo orden"; } matrix C (A.size); for(int i=0;i<A.size;i++){ C.s[i]=s[i]+A.s[i];} return C; } void matrix :: print_matrix (void){ for(int i= 0;i<size;i++){ cout<<"Suma no "<<i<<" = "<<s[i]<<"n"; } } int main(){ int n;int m; cout<<"Introduzca el orden del vector1n"; cin>>n; matrix A(n); A.scan_matrix(); cout<<"Introduzca el orden del vector2n"; cin>>m; matrix B(m); B.scan_matrix(); matrix D = A + B; matrix E(A+B); D.print_matrix (); E.print_matrix (); system("pause");return 1; }
A ver si alguien puede decir por que pasa esto :S Un saludo!!
58
« en: Martes 29 de Marzo de 2011, 18:29 »
OK jajaja a ver entonces si alguien dice; de momento cambio lo que tu dices de const en el copia jaja Un saludo y muchas gracias por contestar
59
« en: Martes 29 de Marzo de 2011, 18:08 »
Hola Epa. Tienes razón en ese sitio ni siquiera utilizo el constructor copia, pero de todas formas, cuando quito las lineas 14 a 21 (declaración de constructor copia e implementación) el programa funciona perfectamente; por qué es eso??
Un saludo!!
60
« en: Martes 29 de Marzo de 2011, 17:44 »
Aqui estan los errores:  Uploaded with ImageShack.us
61
« en: Martes 29 de Marzo de 2011, 17:04 »
Fíjate que el constructor de copia no recibe matrix A, sino matrix& A. Pero si no le pongo el & tampoco compila :S
62
« en: Martes 29 de Marzo de 2011, 17:03 »
No no pero me referia a que había puesto un código equivocado; la duda es del código acutal jeje
63
« en: Martes 29 de Marzo de 2011, 16:51 »
Bueno pues muchas gracias, ya cambio yo ahora como tu dices. Por cierto, tengo por ahí otro post con un error a la hora de poner el constructor copia, quizas me podrias echar un cable ejejje  Un saludo!!
64
« en: Martes 29 de Marzo de 2011, 15:20 »
Bueno me había confundido de código
65
« en: Martes 29 de Marzo de 2011, 14:47 »
No sé si no me explico bien o qué... Sigues mezclando implementaciones dentro y fuera de la clase.
Dentro de la clase:
matrix (int n){ size=test_matrix(n); }
Fuera de la clase:
int matrix :: test_matrix (int a){ if(a>MAX_SIZE){ cerr<<"Demasiados elementosn"; a=MAX_SIZE; } return a; }
Pero como hago para darle el valor correspondiente a size con un programa externo ?? la unica forma que se me ocurre es esa que tengo ahí :S ; ah y por cierto esta tarde me pondré un poco con el private a ver que tal 
Un saludo!!
66
« en: Martes 29 de Marzo de 2011, 13:18 »
Bueno, pues haciendote caso me quedo esto: #include <iostream> using namespace std; #define MAX_SIZE 10 class matrix{ public: int size; double s[MAX_SIZE]; matrix (int n){ size=test_matrix(n); } ~matrix() {} int test_matrix (int a); matrix scan_matrix (void); matrix operator + (matrix A); void print_matrix (void); }; int matrix :: test_matrix (int a){ if(a>MAX_SIZE){ cerr<<"Demasiados elementosn"; a=MAX_SIZE; } return a; } matrix matrix :: scan_matrix (void){ for(int i=0;i<size;i++){ cout<<"Ingresa el coef "<<i<<"n";cin>>s[i]; } } matrix matrix :: operator + (matrix A){ if(A.size!=size){ cerr<<"Los vectores han de ser del mismo orden"; } matrix C (A.size); for(int i=0;i<A.size;i++){ C.s[i]=s[i]+A.s[i];} return C; } void matrix :: print_matrix (void){ for(int i= 0;i<size;i++){ cout<<"Suma no "<<i<<" = "<<s[i]<<"n"; } } int main(){ int n;int m; cout<<"Introduzca el orden del vector1n"; cin>>n; matrix A(n); A.scan_matrix(); cout<<"Introduzca el orden del vector2n"; cin>>m; matrix B(m); B.scan_matrix(); matrix D = A + B; D.print_matrix (); system("pause");return 1; }
Lo unico lo de public y private.. es que si pongo algo en private luego no puedo acceder a ello desde otras partes del programa y entonces tendría que crear otra función para poder acceder a ella ?? es que no entiendo muy bien Un saludo y muchísimas gracias por contestar!!
67
« en: Lunes 28 de Marzo de 2011, 22:12 »
Por cierto, en su momento se me olvido... pero por si a alguien le interesa quedo: #include <iostream> using namespace std; int main () /*Este programa pide al usuario una matriz de orden n la diagonaliza por el metodo de Gauss-Jordan sin pivote y calcula su inversa*/ { //Genero las variables, la matriz, la pido al usuario y la muestro por pantalla int n;double long t;int w; cout<<"Introduzca el orden de la matriz:"<<endl; cin>>n;int q=n; double A[n][(2*n)];double B[n][n]; for(int i=0;i<n;i++){ for(int k=0;k<n;k++){ cout<<"Introduzca el elemento de la fila "<<i+1<<" y la columna "<<k+1<<endl; cin>>A[i][k]; } } cout<<endl<<endl; for(int i=0;i<n;i++){ for(int k=0;k<n;k++){ cout<<A[i][k]<<" "; if(k==n-1){cout<<endl;} } } //Genero la matriz identidad for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ if(j==i){B[i][j]=1.0;} else{B[i][j]=0.0;} } } //Acoplo la matriz identidad para trabajar con ella for(int j=0;j<n;j++){ int a=0; for(int i=n;i<2*n;i++){ A[j][i]=B[j][a]; a++; } } //Muestro la matriz con la que voy a trabajar cout<<endl<<endl<<"La matriz introducida con la identidad acoplada es:"<<endl<<endl; for(int i=0;i<n;i++){ for(int k=0;k<2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } cout<<endl<<endl; //Triangulo la matriz int u=2; for(int i=0;i<n;i++){ for(int k=i+1;k<n;k++){ //Activo este bucle para evitar que el programa divida por 0 (el pivote sea 0) if(A[i][i]==0){ double sum =0.0; for(int x=i+1;x<n;x++){ if(A[x][i]!=0){sum=1;break;} sum=sum+A[x][i]; } if(sum==0){u=1;break;} } if(u==1){break;} int a=i+1; //Permutamos las filas mientras el pivote sea 0 while(A[i][i]==0){ for(int s=0;s<2*n;s++){ int p = A[i][s];A[i][s]=A[a][s];A[a][s]=p; } a++; } t=A[k][i]/A[i][i]; for(int j=0;j<2*n;j++){ if(u==1){break;} A[k][j]=A[k][j]-t*A[i][j]; } } } cout<<endl<<endl; //Muestro la matriz triangulada cout<<"La matriz triangulada es:"<<endl<<endl; for(int i=0;i<n;i++){ for(int k=0;k<2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } cout<<endl<<endl; //Aplico Gauss-Jordan for(int i=0;i<n;i++){ q--;w=q; for(int k=i+1;k<n;k++){ w--; t=A[w][q]/A[q][q]; for(int j=0;j<2*n;j++){ A[w][j]=A[w][j]-t*A[q][j]; } } } for(int i=0;i<n;i++){ for(int j=n;j<2*n;j++){ A[i][j]=A[i][j]/A[i][i]; } A[i][i]=1; } //Muestro la matriz diagonalizada y la inversa: cout<<"La matriz diagonalizada y la inversa de A es:"<<endl<<endl; for(int i=0;i<n;i++){ for(int k=0;k<2*n;k++){ cout<<A[i][k]<<" "; } cout<<endl; } system("pause");return 0; }
68
« en: Lunes 28 de Marzo de 2011, 21:39 »
Bueno, tengo el siguiente codigo: #include <iostream> using namespace std; #define MAX_SIZE 10 class matrix{ public: int size; double s[MAX_SIZE]; matrix (int n); ~matrix() {} int test_matrix (int a); matrix scan_matrix (void); matrix operator + (matrix A); void print_matrix (void); matrix (matrix& A);//<---------------Aqui esta la declaracion }; matrix :: matrix (matrix& A){ //<-------------Aqui esta la implementación size = A.size; for (int i=0;i<A.size;i++) s[i]=A.s[i]; } matrix :: matrix (int n){ size = test_matrix(n); } int matrix :: test_matrix (int a){ if(a>MAX_SIZE){ cerr<<"Demasiados elementosn"; a=MAX_SIZE; } return a; } matrix matrix :: scan_matrix (void){ for(int i=0;i<size;i++){ cout<<"Ingresa el coef "<<i<<"n";cin>>s[i]; } } matrix matrix :: operator + (matrix A){ if(A.size!=size){ cerr<<"Los vectores han de ser del mismo orden"; } matrix C (A.size); for(int i=0;i<A.size;i++){ C.s[i]=s[i]+A.s[i];} return C; } void matrix :: print_matrix (void){ for(int i= 0;i<size;i++){ cout<<"Suma no "<<i<<" = "<<s[i]<<"n"; } } int main(){ int n;int m; cout<<"Introduzca el orden del vector1n"; cin>>n; matrix A(n); A.scan_matrix(); cout<<"Introduzca el orden del vector2n"; cin>>m; matrix B(m); B.scan_matrix(); matrix D = A + B; D.print_matrix (); system("pause");return 1; }
Sé que el error está en alguna parte del constructor de copia por que el programa compila y funciona si le quito esa redefinición, sin embargo no encuentro el error. A ver si alguien me puede decir donde está el error y ya de paso por qué hay que tener escrito el operador '&' en la declaración. Un saludo y muchas gracias de antemano!!!
69
« en: Lunes 28 de Marzo de 2011, 18:14 »
Hola; lo de private en lugar de public ya lo hare que de momento estoy probando un poco como va el tema este de las clases. Lo segundo que dices (establecer unas funciones dentro de la clase y otros fuera) no lo entiendo muy bien, te refieres a que no cree la función suma fuera de la definición de clase? yo pensaba que eso era muy común y además así lo tienes más organizado. En lo de los espacios tienes toda la razón, le daré más lineas a los codigos. Muchas gracias por contestar al problema, ahora ya lo entiendo un poco mejor, pero no entiendo muy bien eso de sobrecargar el operador, me puedes explicar?
Un saludo!!
70
« en: Lunes 28 de Marzo de 2011, 14:33 »
El ordenador toma la posición cero pero yo en la realidad siempre hablo a partir de la posición uno en adelante, por eso lo puse a partir de uno (en la vida cotidiana yo diría posición dos que es par). De todas formas eso es una tontería, cada uno que lo vea como quiera. Si quieres sumar los componentes uno a uno es SUMAR dos vectores, no unirlos; seria: int suma [cantidad];for(int i=0;i<cantidad;i++) suma[i]=0; (for int i=0;i<cantidad;i++){ suma[i]=vector1[i]+vector2[i];}
71
« en: Lunes 28 de Marzo de 2011, 14:18 »
Hola; estoy trabajando algo con las clases en C++ y consigo que me corran lo programas. Veamos para mi lo logico al crear este programa de sumar vectores es: #include <iostream> using namespace std; #define MAX_SIZE 10 class matrix{ public: int size; double s[MAX_SIZE]; matrix (int n){ if (n>MAX_SIZE) {cerr<<"Error tamaño demasiado grande"; return;} size=n; for(int i=0;i<n;i++){ cout<<"Ingresa el coef "<<i<<"n";cin>>s[i]; } } ~matrix() {}; void suma_de_vectores (matrix A,matrix B); }; void matrix :: suma_de_vectores (matrix A, matrix B){ if(A.size!=size){cerr<<"Los vectores han de ser del mismo orden";return;} for(int i=0;i<A.size;i++){ cout<<"suma "<<i<<" = "<<A.s[i]+s[i];} } int main(){ int n;int m; cout<<"Introduzca el orden del vector1n";cin>>n; cout<<"Introduzca el orden del vector2n";cin>>m; matrix A(n);matrix B(m); A.suma_de_vectores (A,B); system("pause");return 1; }
Sin embargo el codigo tambien compila y funciona si suprimo algunas cosas en la declaración y desarrollo de la función, es decir: #include <iostream> using namespace std; #define MAX_SIZE 10 class matrix{ public: int size; double s[MAX_SIZE]; matrix (int n){ if (n>MAX_SIZE) {cerr<<"Error tamaño demasiado grande"; return;} size=n; for(int i=0;i<n;i++){ cout<<"Ingresa el coef "<<i<<"n";cin>>s[i]; } } ~matrix() {}; void suma_de_vectores (matrix B); }; void matrix :: suma_de_vectores (matrix A){ if(A.size!=size){cerr<<"Los vectores han de ser del mismo orden";return;} for(int i=0;i<A.size;i++){ cout<<"suma "<<i<<" = "<<A.s[i]+s[i];} } int main(){ int n;int m; cout<<"Introduzca el orden del vector1n";cin>>n; cout<<"Introduzca el orden del vector2n";cin>>m; matrix A(n);matrix B(m); A.suma_de_vectores (B); system("pause");return 1; }
Con lo cual me doy cuenta de que no entiendo que es lo que hago excatamente. Mi consulta es esa, si alguien me podría explicar un poco que es lo que hace el programa; por que al poner size y s toma los de la matriz A (aunque supongo que será por declarar A.suma_de_vectores( ) sin decirselo. Para mi lo mas logico seria tomar los ultimos valores de size y s que se dieron pero los ultimos que yo sepa son los de la matriz B.
Bueno un saludo y muchas gracias de antemano
72
« en: Domingo 27 de Marzo de 2011, 23:21 »
si creo que me esta compilando bien. ahora, podrias ayudarme regalandome alguna explicacion sobre como hago para unir 2 vectores? saludos!! Tienes que explicarte mejor cuando haces preguntas... que es unir dos vectores?
73
« en: Domingo 27 de Marzo de 2011, 19:17 »
Pero vamos a ver, la resta es lo mismo que la suma pero cambiando el signo... que quieres hacer? si quieres que reste todos los valores es asi como tu lo tienes
74
« en: Domingo 27 de Marzo de 2011, 17:33 »
muchisimas gracias pero bueno solo una cosa, cambiaria radicalmente teniendo en cuenta que en relacion con los pares me piden es resta o es solo cuestion de cambiar signos? saludos!! y gracias por aceptar enseñarme jaja No entiendo muy bien lo que preguntas pero si te refieres a que en lugar de pedirte la suma de los pares te piden la resta de los pares solo tendrias que cambiar el signo de la variable en la que acumulas la suma; es decir, en la linea 21 cambias por: cout<<"la resta de los pares es "<<(-suma)<<endl;
Un saludo!!
75
« en: Domingo 27 de Marzo de 2011, 11:29 »
Bueno ya recibi tu mail  ; yo tampoco se mucho pero te puedo ayudar a hacer lo que quieres (utilizo tu codigo,añado lo que dices y cambio alguna cosa que creo que esta mejor): #include <iostream> using namespace std; main(){ #define tam 10 int cantidad; cout<<"tamaño de datos a ingresar"<<endl; cin>>cantidad; while(cantidad >tam){ cerr<<"El tamaño ingresado es mayor del permitido"<<endl; cout<<"tamaño de datos a ingresar"<<endl; cin>>cantidad; } int vector [cantidad]; int suma = 0; for(int x=0;x<cantidad;x++){ cout<<"ingrese un numero"<<endl; cin>>vector[x]; } for(int x=1;x<cantidad;x=x+2){ cout<<x+1<< "-> "<<vector[x]<<endl; suma = suma + vector[x]; } cout<<"la suma de los pares es "<<suma<<endl; if(vector[0]!=0){ cout<<"la suma de los pares dividida por el primer componente del vector es "<<suma/vector[0]<<endl;} suma = 0; for(int x=0;x<cantidad;x=x+2){ cout<<x+1<< "-> "<<vector[x]<<endl; suma = suma + vector[x]; } cout<<"la suma de los impares es "<<suma<<endl; if(vector[0]!=0){ cout<<"la suma de los impares dividida por el primer componente del vector es "<<suma/vector[0]<<endl;} system ("pause");return 0; }
Podria estar mejor pero por lo menos me compila y funciona  jaja Si tienes alguna duda pregunta y te intento contestar! un saludo!!
|
|
|