Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Matriz bidimensional

Estas en el tema de Matriz bidimensional en el foro de C/C++ en Foros del Web. Hola buenos días. Mi duda es la siguiente: Tengo un programa el cual me pide el numero de filas y de columnas que tiene la ...
  #1 (permalink)  
Antiguo 29/01/2014, 04:32
 
Fecha de Ingreso: abril-2012
Ubicación: Malaga
Mensajes: 46
Antigüedad: 12 años
Puntos: 0
Matriz bidimensional

Hola buenos días.
Mi duda es la siguiente:
Tengo un programa el cual me pide el numero de filas y de columnas que tiene la matriz y los números que tiene.
El programa quiero que lea todos los números y me diga cual es el mayor, y en que fila/columna está.
La primera parte la he sacado, pero me está costando la misma vida sacar lo de la fila/columna xD.

Muchas gracias de antemano.
  #2 (permalink)  
Antiguo 29/01/2014, 06:00
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Matriz bidimensional

supongo que para guardar el mayor usas un un bucle con un entero que bien lo llamarias de temp o algo asi al cual le vas guradando el numero que sea mayor.
pues necesitas 2 variables para guardar la posicion actual.
El código bien puede ser este:
Estoy suponiendo que es c++, tampoco has dicho si es c :/
Código C++:
Ver original
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. int main (){
  5.     int temp = 0;      // Guardamos aqui el mayor valor.
  6.     int x = 0;            // Esta la usamos para guardar la fila actual del mayor numero
  7.     int y = 0;            // Esta la usamos para guardar la columna actual del mayor numero
  8.     const int    filas = 5;
  9.     const int    columnas = 5;
  10.     int A[columnas][filas] = {
  11.         { 7,  1, 3, 10, 11},
  12.         { 2, 42,12, 22,  5},
  13.         {21, 45, 9, 77, 32},
  14.         {56, 47,17,  4, 71},
  15.         {13, 34, 8, 74, 14}
  16.     };
  17.  
  18.  
  19.     for ( int cont1 = 0 ; cont1 <= columnas; cont1++ ){
  20.         for ( int cont2 = 0 ; cont2 <= filas; cont2++ ){
  21.             if ( A[cont1][cont2] > temp ){
  22.                 temp = A[cont1][cont2];
  23.                 y = cont1;
  24.                 x = cont2;
  25.                 cout << "mayor encontrado: " << temp
  26.                      << ", esta guardado en: A[" << y << "][" << x << "]" << endl;
  27.             }
  28.  
  29.         }
  30.     }
  31.  
  32.     cin.ignore();
  33.     return 0;
  34. }
Pero aun hay un problema:
¡En los números todos sabemos que se puede repetir!¿No?!
Pues aparte de saber los mayores debes listar si hay mas de uno ;)
Pero eso ya es cosa tuya ;)
  #3 (permalink)  
Antiguo 29/01/2014, 06:35
 
Fecha de Ingreso: septiembre-2008
Ubicación: Valencia
Mensajes: 160
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Matriz bidimensional

¿Que es la primera parte, saber que valor es el mayor y el número de filas y columnas?

Supongo que para obtener el valor más alto recorres la matriz, lo único que debes hacer es cuando guarde de nuevo el valor más alto guardar las posición en otras variables que por ejemplo se digan columnaM y filaM.

Si lo que aún no tienes es saber cual es el valor más alto lo único que debes hacer es anidar 2 FOR para recorrer toda la matriz, luego es guardas el primer valor en una variable, o inicias esta variable con 0 suponiendo que todos los número son mayores que 0. Y luego dentro del segundo FOR comparas el valor que haya en esa posición de la matriz con el máximo encontrado hasta ahora, y si es mayor lo sustituyes y guardas los valores de fila y columnas que son los de los índices de los for.
__________________
Siempre inmerso en nuevos proyectos.

Cuando estoy activo puedes verme en //LiveCoding
  #4 (permalink)  
Antiguo 29/01/2014, 10:41
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 3 meses
Puntos: 1
Respuesta: Matriz bidimensional

hola ignatar20 veo que vangodp te ha dado una buena idea para que la trabajes y perfecciones, pero ten encueta que la matriz puede ser de numeros negativos y entonces la inicializacion de temp a 0 te daria un resultado erroneo, podrias guardar el primer valor del array en temp para solucionrarlo como dice Oracles.

pero ... ¿y si tuvieses un matriz llena de '-1' cual deberia ser el resultadol de tu programa?.

al pedir los datos de entrada de la matriz supongo que reservaras memoria y los guardaras en un array de filasm y columnasm, a la vez que los guardas ya puedes veriguar el mayor o mayores, que podras guardar en arraymayores para luego visualizar los o encontrar el valormaximo y cuantos hay (cuantosmax) para luego recorrer el array buscando este valor y visualizandolo con su filam y columnam y seguir recorriendo la matriz "cuantoslmax" veces para visualizarlos todos.
  #5 (permalink)  
Antiguo 29/01/2014, 11:30
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Matriz bidimensional

Pues creo que el mayor seria -1, si la matriz tuviera llena de números -1 >_<
  #6 (permalink)  
Antiguo 29/01/2014, 12:22
 
Fecha de Ingreso: septiembre-2008
Ubicación: Valencia
Mensajes: 160
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Matriz bidimensional

Cita:
Iniciado por vangodp Ver Mensaje
Pues creo que el mayor seria -1, si la matriz tuviera llena de números -1 >_<
Pero se refiere a parte de valor, cual sería tu critario decir en que posición se encuentra, la primera vez que aparece, la última, o coges un valor aleatorio entre ellos.

Esto también puede suceder si hay valores más altos con el mismo valor, por ejemplo dos, tres o X posiciones con 4.
__________________
Siempre inmerso en nuevos proyectos.

Cuando estoy activo puedes verme en //LiveCoding
  #7 (permalink)  
Antiguo 29/01/2014, 12:46
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 6 meses
Puntos: 10
Respuesta: Matriz bidimensional

Yo le haría dos modificaciones al código de vangodp.
Una sería inicializar temp a A[0][0], para corregir el problema que detecta vizen. Si tenemos una matriz cuyos valores son todos negativos, el resutlado del mayor valor será 0, y no el mayor de los negativos.

Y la otra es un fallito que suele ser recurrente, y es que en el código se recorre el array desde la posición 0 hasta la N, y debe ser hasta la N-1.

Si ya hay varias ocurrencias iguales, pues ya habría que afinar la cosa en función del criterio que se quiera, como dice Oracles.

Saludos!
  #8 (permalink)  
Antiguo 29/01/2014, 12:46
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Matriz bidimensional

¡Si!..Te comprendo. :D
Primero hay que saber lo que quieres antes de hacer el código.
Sino Puedes que tengas que rehacerlo por completo mas de una vez XD
Cosas como.
¿Se repiten?
¿Mostro repetidos o solo el primer valor mas alto?
¿Son negativos?
....
XD
Creo que si sabes lo que quieres sera mas fácil hacer el código.
Otra cosa seria ponerse en el lugar de la persona que va usar el programa.
si vas hacer un programa que registre una persona pues ponte en lugar de una persona que rellena un formulario web :D
Creo que un buen proyecto para entender c++ es implementar un pequeño banco, con cuentas sistema de loguin, depósitos transferencias entre usuarios, retirar, prestamos..
Eso te da buenas bases para lo que sea.
Y intentar que sea con clases/objetos mejor :D
  #9 (permalink)  
Antiguo 29/01/2014, 13:20
 
Fecha de Ingreso: abril-2012
Ubicación: Malaga
Mensajes: 46
Antigüedad: 12 años
Puntos: 0
Respuesta: Matriz bidimensional

Gracias, me ha servido de gran ayuda.
Por cierto, el ejercicio te dice que si hay 2 o más valores mayores iguales, está a nuestra elección cual elegir, asi que yo he puesto que siempre coja el ultimo mas grande.

Ahora tengo otro problema:
He hecho un programa para que me diga cuando una matriz es simetrica o no, pero a la hora de ejecutar el subprograma no me deja. Pongo el codigo para que lo entendais mejor
Código C++:
Ver original
  1. //============================================================================
  2. // Name        : simetrica.cpp
  3. // Author      : Francisco Ortega Avila
  4. // Version     :
  5. // Copyright   : Your copyright notice
  6. // Description : Hello World in C++, Ansi-style
  7. //============================================================================
  8.  
  9. #include <iostream>
  10. using namespace std;
  11. const int tam_array=50;
  12. typedef int Tmatriz[tam_array][tam_array];
  13. Tmatriz num;
  14. int fil,col,i,j,k,l;
  15. bool es=true;
  16. int matSime(int M[tam_array]);
  17.  
  18. int main() {
  19.     cout << "Introduzca el tamaño de la matriz: ";
  20.     cout << "Filas: ";
  21.     cin >> fil;
  22.     cout << "Columnas";
  23.     cin >> col;
  24.     for (i=0;i<fil;i++)
  25.     {
  26.         for(j=0;j<col;j++)
  27.         {
  28.             cout<<"Introduzca un numero: ";
  29.             cin>>num[i][j];
  30.         }
  31.     }
  32.     matSime(num);
  33.     return 0;
  34. }
  35.  
  36. int matSime(int M[tam_array])
  37. {
  38.  
  39.     for(k=0;k<fil;k++)
  40.     {
  41.         for(l=0;l<col;l++)
  42.         {
  43.             if(num[i][j] != num[j][i])
  44.             {
  45.                 es=false;
  46.             }
  47.         }
  48.     }
  49.     if(es==true)
  50.     {
  51.         cout<<"La matriz es simetrica.";
  52.     }
  53.     else
  54.     {
  55.         cout<<"La matriz no es simetrica.";
  56.     }
  57.     return num;
  58. }

El error está en matSime(num); pero no se porque :S

Muchas gracias chicos :D
  #10 (permalink)  
Antiguo 29/01/2014, 13:29
 
Fecha de Ingreso: septiembre-2008
Ubicación: Valencia
Mensajes: 160
Antigüedad: 15 años, 7 meses
Puntos: 2
Respuesta: Matriz bidimensional

El error te viene dado porqué num es una matriz y en la función defines que le pasas un vector, por lo que tienes una incompatibilidad de datos.
__________________
Siempre inmerso en nuevos proyectos.

Cuando estoy activo puedes verme en //LiveCoding
  #11 (permalink)  
Antiguo 29/01/2014, 13:49
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Matriz bidimensional

intentas meter una matriz bidimencional en una unidimensional
int Tmatriz[50][50]

matSime(num); -----------> matSime(M[50]);

es como esto:
matSime(Tmatriz); -----------> matSime(M[50]);

intentas meter Tmatriz[50][50] bidimensional en ----------> M[50] unidimensinal

ademas no haces nada en esa funcion matSime() con M[50]
if(num[i][j] != num[j][i]) ???

no sera:

if(M[i][j] != M[j][i])

Y no se a que te refieres con simétrica jaja
Ando oxidado en las mates.
Se que simétrica es ser idéntica, ¿Pero a que?
¿A ella misma?
No sera ese ejercicio trampa no?
Te dan el código to jodio para que lo arregles? XD

Última edición por vangodp; 29/01/2014 a las 14:01
  #12 (permalink)  
Antiguo 29/01/2014, 16:00
 
Fecha de Ingreso: abril-2012
Ubicación: Malaga
Mensajes: 46
Antigüedad: 12 años
Puntos: 0
Respuesta: Matriz bidimensional

Ya está ya funciona:D
Muchas gracias a todos por la ayuda.
Por cierto, lo de simetrica es si Aij = Aji, es decir, en una matriz de 2X2 si el numero de la columna 1 fila 2 es igual a columna 2 fila 1, la matriz es simétrica.

Saludos, y gracias de nuevo.

Etiquetas: matriz, numero, programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:48.