Hola. No sé cual es el error en el siguiente código, ¿alguien podría ayudarme?
//Problema 1: Programa que cree una matriz nxn, ingrese datos y luego imprima la suma de los elementos de la diagonal principal
#include<iostream>
#include<cstdlib>
using namespace std;
void llenarymostrarM(int *matriz, int f, int c);
int sumadiagp(int *matriz, int f, int c);
int main()
{
int *mat, fil, col;
cout<<"El numero de filas es: ";
cin>>fil;
cout<<"El numero de columnas es: ";
cin>>col;
mat=new int[fil, col];
llenarymostrarM(mat, fil, col);
cout<<endl;
cout<<"La suma de los elementos de la diagonal principal es: " <<sumadiagp(mat, fil, col)<<endl;
delete []mat;
system("pause");
}
void llenarymostrarM(int *matriz, int f, int c){
int i,j;
cout<<"Ingrese los elementos de la matriz: ";
for(i=0; i<f; i++){
for(j=0; j<c; j++){
cin>>matriz[i,j];
}
}
cout<<endl;
cout<<"La matriz es: ";
for(i=0; i<f; i++){
for(j=0; j<c; j++){
cout<<matriz[i,j]<<endl;
}
}
}
int sumadiagp(int *matriz, int f, int c){
int i,j, sdp=0;
for(i=0; i<f; i++){
for(j=0; j<c; j++){
sdp=sdp+matriz[i,i];
}
}
return sdp;
}
Por ejemplo cuando pongo una matriz 2x2: 1, 2, 3, 4, me sale que la matriz es: 3 4 3 4 y la suma de la diagonal principal es 14 :huh:
* Tienes errores en los punteros del array bidimensional, que han de ser **, tanto en su declaración como en los argumentos de las funciones.
* Se te ha ido la olla al hacer mat[ i , j ] en lugar de mat [ i ][ j ]
* Tienes mal declarado el array bidimensional con el operador new.
* Te falta el return de main.
Con esas correcciones o puntualizaciones, ya que
el resto del código es el tuyo, y tabulando o indentando el código de forma más razonable -no escatimes con los espacios en blanco, si no queda todo apelotonado- una posible solución, según tienes planteado, sería:
EI: codigo suprimido.
Por cierto, si quieres la suma de la diagonal no olvides que fil = col. Y si han de ser iguales te puedes ahorrar un cin, tomando col = fil si la matriz ha de ser del tipo n x n.
(http://i1280.photobucket.com/albums/a497/leosansan/leosan1/leones%20peques/lion14peque_zps1d213b80.jpg)
Muchas gracias por la ayuda. Creo que este el código final además le agregue otro problema jeje.
#include<iostream>
#include<cstdlib>
using namespace std;
void llenarymostrarM(int **matriz, int o);
int mayor(int **matriz, int o);
int sumadiagp(int **matriz, int o);
int main()
{
int **mat, orden;
cout<<"El orden de la matriz es: ";
cin>>orden;
mat=new int*[orden];
llenarymostrarM(mat, orden);
cout<<endl;
cout<<"El mayor elemento es: "<<mayor(mat, orden)<<endl;
cout<<"La suma de los elementos de la diagonal principal es: "<<sumadiagp(mat, orden)<<endl;
delete []mat;
system("pause");
}
void llenarymostrarM(int **matriz, int o){
int i,j;
cout<<"Ingrese los elementos de la matriz: ";
for(i=0; i<o; i++){
for(j=0; j<o; j++){
cin>>matriz[j];
}
}
cout<<endl;
cout<<"La matriz es: ";
for(i=0; i<o; i++){
for(j=0; j<o; j++){
cout<<matriz[j]<<endl;
}
}
}
int mayor(int **matriz, int o){
int i,j, mayor=matriz[0][0];
for(i=1; i<o; i++){
for(j=0; j<o; j++){
if(matriz[j]>mayor){
mayor=matriz[j];
}
}
}
return mayor;
}
int sumadiagp(int **matriz, int o){
int i,j, sdp=0;
for(i=0; i<o; i++){
for(j=0; j<o; j++){
if(i==j)
sdp=sdp+matriz[j];
}
}
return sdp;
}
Con respecto al return 0, ¿es siempre obligatorio?, nunca lo he usado en otros códigos. Donde dice matriz[j] en realidad debe ser matriz i[j], no sé porque se ve asi. Por último, cuando termino de ejecutar el programa sale que debe cerrarse :huh:
Cita de: CharterC+ en 5 Julio 2014, 06:21 AM
Muchas gracias por la ayuda. Creo que este el código final además le agregue otro problema jeje.
........................................................
Con respecto al return 0, ¿es siempre obligatorio?, nunca lo he usado en otros códigos. Donde dice matriz[j] en realidad debe ser matriz i[j], no sé porque se ve asi. Por último, cuando termino de ejecutar el programa sale que debe cerrarse :huh:
Respecto a lo último se debe a que [ i ] , sin los espacios en blanco que he puesto, es la secuencia de escape para las letras en cursivas. Por ello a partir del primer [ i ] que escribes la letra cambia a cursiva. Fíjate en el código de tu mensaje y lo veras. Para evitarlo usa las llamadas etiquetas GeSHi, en la parte superior de los iconos a la derecha, y en el desplegable que aparece elige las de C++ y en medio de las etiquetas "code" que aparecen pegas tu código.
Sí, el return es obligatorio porque por cuestiones del estándar del C/C++ main se debe declarar como una función de tipo int y estas han de retornar algo. Lo normal es que si no lo pones el programa te lance un warning de advertencia, al menos en el modo pedantic.
Y respecto al código sigues declarando mal el array. Como el mio lo han borrado te lo vuelvo a poner:
int **mat = new int*[orden];
for( int i = 0; i < orden; ++i )
mat[i] = new int[orden];
Y ya está.
También te aconsejo el uso de mensajes para introducir los valores, como:
cout <<"Ingrese los elementos de la matriz: "<< endl;
for( i = 0; i < f; i++ )
for( j = 0; j < c; j++ ){
cout << "matriz[" << i << "][" << j << "] = " ;
cin >> matriz[i][j];
}
cout << endl;
Y en la impresión que lo hagas como matriz:
cout << "La matriz es: " << endl;
for( i = 0; i <f ; i++){
for( j = 0; j < c; j++ )
cout << matriz[i][j] << " ";
cout << endl;
}
Así te quedará todo mucho más claro.
,,,
. .
|
\-/
¡¡¡¡ Saluditos! ..... !!!!
(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Muchas gracias por la ayuda, recién por cuestiones de tiempo he podido entrar.