Jump to content

Dudas sobre un ejercicio en C#


Recommended Posts

Tengo el siguiente ejercicio:

 

 

Desarrolla una clase "Matriz", que represente a una matriz de 3x3, con métodos para

indicar el valor que hay en una posición, leer el valor de una posición, escribir la matriz

en pantalla y sumar dos matrices.

 

He sabido hacerlo todo hasta que he llegado a la parte complicada, es decir, la de las sumas, aquí está lo que he hecho:

 

 

using System;
public class Matriz
{
int[,] matriz=new int[3,3];

public void meter()
{
 int fila,columna;
 bool hecho=false;

 Console.WriteLine("Escribe la posición de la matriz en la que deseas introducir número.nFila:");
 fila=Convert.ToInt32(Console.ReadLine());
 Console.WriteLine("Columna:");
 columna=Convert.ToInt32(Console.ReadLine());

 for(int i=0;i<3;i++)
 {
  for(int j=0;j<3;j++)
  {
if(i==fila && j==columna)
{
 Console.WriteLine("Introduce el valor nuevo:");
 matriz[fila,columna]=Convert.ToInt32(Console.ReadLine());
 hecho=true;
}
  }
 }
 if(hecho==false)
 {
  Console.WriteLine("No se ha encontrado dicha posición");
 }
 hecho=false;

}
public void mostrarpos()
{
 int i, j;
 int fila,columna;
 bool hecho=false;

 Console.WriteLine("Qué valor concreto de la matriz quieres saber?nFila:");
 fila=Convert.ToInt32(Console.ReadLine());
 Console.WriteLine("Columna:");
 columna=Convert.ToInt32(Console.ReadLine());

 for(i=0;i<3;i++)
 {
  for(j=0;j<3;j++)
  {
if(i==fila && j==columna)
{
 Console.WriteLine("El valor en dicha posición es "{0}".",matriz[fila,columna]);
 hecho=true;
}
  }
 }
 if(!hecho)
 {
  Console.WriteLine("No se ha encontrado dicha posición;");
 }
}
public void mostrartoda()
{
 int i,j;

 for(i=0;i<3;i++)
 {
  for(j=0;j<3;j++)
  {
Console.WriteLine("{0} ",matriz[i,j]);
  }
 }
}
/**************************** Parte que no funciona bien **********************/
public void sumar(int[,] mat1, int[,] mat2)
{
 int[,] nuevaMatriz = new int[3,3];

 for (int x=0; x < 3; x++)
 {
  for (int y=0; y < 3; y++)
  {
nuevaMatriz[x, y] = mat1[x, y] + mat2[x, y];
  }
 }

 for(int i=0;i<3;i++)
 {
  for(int j=0;j<3;j++)
  {
Console.WriteLine("{0} ",nuevaMatriz[i,j]);
  }
 }
}
/* ************************************ */
}

 

using System;
public class matricioso
{
public static void Main()
{
 Matriz m1 = new Matriz();
 Matriz m2 = new Matriz();
 int opcion, opcion1;
 do
 {
  Console.WriteLine("Tienes dos matrices de 3x3.nElige opción:");
  Console.WriteLine("1.Indicar el valor en una posición.n2.Leer el valor de una posición.n3.Mostrar la matriz en pantalla.n4.Sumar las dos matrices.n5.Salir");
  opcion=Convert.ToInt32(Console.ReadLine());
  switch(opcion)
  {
case 1:
  Console.WriteLine("¿En qué matriz, la 1 o la 2?");
  opcion1=Convert.ToInt32(Console.ReadLine());
  if(opcion1==1)
  {
   m1.meter();
  }
  if(opcion1==2)
  {
   m2.meter();
  }
  else
  {
   Console.WriteLine("Opción no válida.");
  }
  break;
case 2:
  Console.WriteLine("¿En qué matriz, la 1 o la 2?");
  opcion1=Convert.ToInt32(Console.ReadLine());
  if(opcion1==1)
  {
   m1.mostrarpos();
  }
  if(opcion1==2)
  {
   m2.mostrarpos();
  }
  else
  {
   Console.WriteLine("Opción no válida.");
  }
  break;
case 3:
  Console.WriteLine("¿En qué matriz, la 1 o la 2 o las 2?");
  opcion1=Convert.ToInt32(Console.ReadLine());
  if(opcion1==1)
  {
   m1.mostrartoda();
  }
  if(opcion1==2)
  {
   m2.mostrartoda();
  }
  if(opcion1==3)
  {
   m1.mostrartoda();
   Console.WriteLine();
   m2.mostrartoda();
  }
  else
  {
   Console.WriteLine("Opción no válida.");
  }
  break;
/******************************** Parte que también corresponde a la suma de matrices *****/
case 4:
  m1.sumar(m1,m2);
  break;
/***********************************************************************************************/
case 5:
  Console.WriteLine("Fin del programa.");
  break;

default:
  Console.WriteLine("Opción no válida.");
  break;

  }
 }
 while(opcion!=5);
}
}

 

¿Qué hago para que funcione? :/

 

Gracias de antebrazo. xD

Edited by Chema_egea
Link to comment
Share on other sites

¿Que error te dice?

Ya que no ando con el compilador a mano.

 

Ah, te dejo algunos consejos de programacion :P

 

Podrias hacer algunas cosas que haran que tu codigo funcione mejor, o para que no escribas tanto, mira:

Tienes este codigo:

 

 

for(int i=0;i<3;i++)

{

for(int j=0;j<3;j++)

{

if(i==fila && j==columna)

{

Console.WriteLine("Introduce el valor nuevo:");

matriz[fila,columna]=Convert.ToInt32(Console.ReadLine());

hecho=true;

}

}

 

 

Creo que lo hiciste asi para comprobar que el valor este entre 0 y 3, te sale mejor hacer esto:

 

int fila;

do

{

Console.WriteLine("Escribe la posición de la matriz en la que deseas introducir número.nFila:");

fila = Convert.ToInt32(Console.ReadLine());

}while(fila>=0 && fila<3);

 

//lo mismo para leer las columnas

Otra cosa, este codigo:

 

if(hecho==false)

 

Como sabemos, hecho puede ser true o false, si queremos que se ejecute el codigo de nuestro if cuando la variable hecho sea falsa, ponemos:

 

if(hecho)

 

Ya que cuando hecho es verdadero, entrara al if, pero nosotros queremos que sea al revez, asi que negamos la variable hecho con el operador "!" (lo que hace es que si la sentencia es positiva, la cambia a negativa y viceversa).

 

En todo caso, arreglando eso de las condiciones con el while, no sera necesario que hagas el if para decir que no es una posicion valida :P

 

Eso, espero tu respuesta para poder ayudarte con lo que de verdad querias xd.

Saludos !

Link to comment
Share on other sites

¡Hola! El error que me dice es en el código de la clase matricioso (en los lugares que he marcado anteriormente):

 

error CS1502: The best overloaded method match for 'Matriz.sumar(int[,], int[,])' has some invalid arguments

 

error CS1503: Argument '#1' cannot convert 'Matriz' expression to type 'int[,]'

 

y en el código de la clase Matriz aparece el error:

 

(Location of the symbol related to previous error)

Link to comment
Share on other sites

El error estaba aqui:

 

m1.sumar(m1,m2);

 

Se supone que m1 y m2 son objetos de la clase Matriz,

Y en la funcion suma tu tenias esto:

 

public void sumar(int[,] mat1, int[,] mat2)

 

Ahi recibe como parametros una matriz de enteros, que es distinto que un objeto de tipo matriz.

 

Lo que deberias hacer para solucionar esto (tu codigo no es la mejor opcion para hacer lo que quieres, mas abajo te dare otros consejos :P) es que primero, debes declarar dentro de la clase matriz, el arreglo multidimensional "matriz" como tipo publico:

 

public int[,] matriz = new int[3, 3];

 

Y luego llamarlo desde la funcion de la siguiente manera:

 

m1.sumar(m1.matriz,m2.matriz);

 

Declare la matriz como "public" para poder llamarla desde la clase principal.

 

Consejos:

 

-Deberias considerar utilizar la clase matriz para que haga solo las operaciones que necesitas, ya que usar una clase para una matriz no es tan necesaria.

Podrias hacer esto:

 

En el main declaras las 2 matrices:

 

int[,] matriz1 = new int[3, 3];
int[,] matriz2 = new int[3, 3];
//Las llenas como quieras
//Y despues utilizas la clase matriz para hacer operaciones con las matrices de arriba, ejemplo:

int[,] matriz3 = Matriz.Sumar(matriz1 , matriz2);

 

Y ahi se te haria todo mas facil :P

Eso .. Ah y la clase Matriz (si es que haces esto ultimo) tienes que declararla como static en vez de public, para no tener que instanciarla (Matriz ejemplo = new Matriz), sino, utilizarla directamente.

Espero no haberte enredado mucho, cualquier duda, hazmela saber.

Saludos !

Edited by known
Link to comment
Share on other sites

:mmm: Veo varios detalles:

 

  • En los métodos meter y mostrarpos recorres la matriz completa. No hay necesidad de hacer eso; de hecho, es muy ineficiente.
  • Es conveniente especificar explícitamente la visibilidad de los atributos de una clase, o sea, a la variable matriz deberías anteponerle la palabra clave private.
  • Deberías agregar 2 métodos: leer y modificar. De hecho, son los 2 primeros métodos que te piden en el enunciado :tonto: . Estarían definidos así:
    public int leer(int x, int y)
    {
       // etc.
    }
    
    public void modificar(int x, int y, int valor)
    {
       // etc.
    }
    


  • El método que suma 2 matrices debería ser static, o sea, debería estar definido así:
    public static Matriz sumar(Matriz mat1, Matriz mat2)
    {
       // etc.
    }
    


    Al definirlo de esta forma, tendrías que usar los métodos leer y modificar para realizar la suma, ya que desde un método estático no vas a poder acceder a la variable matriz (que es una variable de instancia). Además la variable local que usas, nuevaMatriz, sería de tipo Matriz.

  • Por si acaso, cuando pides el ingreso de datos al usuario, queda mejor usar Console.Write. O sea:
    Console.Write("Ingrese número: ");
    valor = Convert.ToInt32(Console.ReadLine());
    

    Así el cursor queda justo a la derecha (y no al comienzo de la siguiente línea).

 

A los métodos meter y mostrarpos deberías quitarle la parte donde recorres la matriz completa y dejarle las partes donde pides el ingreso de datos al usuario; una vez que tienes los datos, llamas a leer o modificar (o sea, llamas a estos métodos desde meter ó mostrarpos).

Edited by susodicho
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...