Autor Tema: C# diferencia entre array o arreglo de una dimensión y de dos dimensiones matriz  (Leído 2076 veces)

Art_15

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Hola comunidad!! Estoy haciendo un programa en C#. Mi duda es por qué me devuelve los mismos datos para cada alumno. ¿Alguna ayuda?

Enunciado o rúbrica del ejercicio a resolver:

1 - Crear un método que se llame ingreso Numérico Con Control.

* Solicitar al usuario que ingrese un valor entero (n : cantidad de alumnos).
* Solicitar el usuario que ingrese el valor entero (m : cantidad de clases al mes).
* Realizar el control de errores.
* El método deberá retornar un tipo de dato entero.

1 A - Crear un método que se llame Crear Planilla Asistencia

* Definir un array del tipo string de n elementos, donde n seria la cantidad de alumnos a
  cargar. El valor de n se cargó en el punto 1.

1 B - Crear un método que se llame Tomar Asistencia.

* Ir cargando en otro array la asistencia de los alumnos, la cantidad de días de clases está
dado por la variable m del punto 1.
* El usuario cargará una P (presente) o una A (Ausente).
* Al finalizar la carga mostrar por consola la planilla con los nombres y las asistencias.

1 C - Crear un método que se llame Control

* El método se encargará de sumar las asistencias de cada alumno.
* Mostrar como salida cuantos presentes y cuantos ausentes tuvo cada alumno.


Salida:

Juan Presentes: 2 Ausentes: 1
Pedro Presentes: 3 Ausentes: 0
Maria Presentes: 1 Ausentes: 2


Código: [Seleccionar]
static void Main(string[] args)
        {

            //int cant_ClasesMes = 0;
           
            int cant_Alumnos = ingresoNumericoconControl("Ingrese cantidad alumnos)");//p_1
            int cant_Clases = ingresoNumericoconControl("Ingrrese cantidad Clases");
            CrearPlanillaAsistencia(cant_Alumnos);
            TomarAsistencia(cant_Alumnos, cant_Clases); // PUNTO 1.B
        }

        public static int ingresoNumericoconControl(string msj)
        {


            Boolean bandera;
            int n = 0;


            do   //INGRESO CANTIDAD ALUMNOS; CONTROL DE ERRORES;
            {
                try
                {
                    Console.WriteLine(msj);
                   n = int.Parse(Console.ReadLine());
               
                    if (n >= 1)
                    {
                        bandera = true;
                    }
                    else
                    {
                        bandera = false;
                        Console.WriteLine("Error. Debe ingresar un valor mayor a 0");
                    }

                }
                catch (Exception e)
                {
                    Console.WriteLine("ERROR DESDE EL CATCH");
                    Console.WriteLine(e.Message);
                    bandera = false;
                }


            } while (!bandera);
           // Console.WriteLine("Cantidad: "+ n);
            return n;
        }
 
        public static int  TomarAsistencia(int cant_alumnos, int cant_clases)
        {

           
            string[] array_Alumnos = new string[cant_alumnos];
            string[] array_Clase = new string[cant_clases];//1.b

           
            creaplanillaAssistencia: " + cantidad_muestra);
         
             for (int i = 0; i < cant_alumnos; i++)
             {
                 Console.WriteLine("Ingrese nombre alumno nº: " + i + ";");
                    array_Alumnos[i] = Console.ReadLine();
                 for (int s = 0; s < cant_clases; s++)
                 {
                     Console.WriteLine("ingrese a ausente o p presente: " + s + ";");
                     array_Clase[s] = Console.ReadLine();
                }
                Console.WriteLine();             
            }
             //muestra
             for (int i = 0; i < cant_alumnos; i++)
             {
                 Console.WriteLine("NOMBRE: " + array_Alumnos[i] + " Nº: " + i);
                for (int s = 0; s < cant_clases; s++)
                {
                    Console.WriteLine("Asistencia: " + array_Clase[s] + " Clase Nº: " + s);
                }         
              }

            return cant_alumnos;
        }
        public static int CrearPlanillaAsistencia(int cantidad_muestra)//1.a
        {
            int cantidad4 = 0;
            string[] cantidad_Alumnos = new string[cantidad4];
            return cantidad_muestra;

        }
« Última modificación: 17 de Enero 2021, 19:52 por Ogramar »

Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ayuda C#
« Respuesta #1 en: 22 de Octubre 2020, 13:27 »
El método crearPlanillaAsistencia() esta mal, en todos los sentidos.

Se supone que este método ha de crear o retornar un array de string, cuyo tamaño sea la "cantidad de alumnos" que el usuario haya introducido por teclado.

Pero este código no hace eso:

Citar
        public static int CrearPlanillaAsistencia(int cantidad_muestra)//1.a
        {
            int cantidad4 = 0;
            string[] cantidad_Alumnos = new string[cantidad4];
            return cantidad_muestra;

        }
- Recibe por argumentos la cantidad de alumnos (cantidad_muestra), pero no usa ese dato para nada.
- Crea un array de string, sí, pero su tamaño es 0, ya que usa la variable cantidad4, y cantidad4 = 0
- Pero da igual el tamaño del array, porque no lo está retornando. Lo único que retorna este método es el mismo dato que ha recibido por argumentos (cantidad_muestra).

Es decir, este método recibe el dato cantidad_muestra, crea un array de longitud 0 (que es lo mismo que no crear nada) y vuelve a retornar cantidad_muestra.

Hay que corregirlo, debe crear un array con el tamaño que le diga cantidad_muestra, y retornarlo.

Citar
        public static string[] CrearPlanillaAsistencia(int cantidad_muestra)//1.a
        {
            string[] cantidad_Alumnos = new string[cantidad_muestra];
            return cantidad_Alumnos;

        }

Bueno, tendríamos ya el método corregido, pero ahora hay otro problema.
Tú invocas a este método en el Main

Citar
static void Main(string[] args)
        {

            //int cant_ClasesMes = 0;
           
            int cant_Alumnos = ingresoNumericoconControl("Ingrese cantidad alumnos)");//p_1
            int cant_Clases = ingresoNumericoconControl("Ingrrese cantidad Clases");
            CrearPlanillaAsistencia(cant_Alumnos);
            TomarAsistencia(cant_Alumnos, cant_Clases); // PUNTO 1.B
        }

Pero no estás recogiendo el dato que retorna, tan solo lo invocas, así que el array de string que retorna, no se está recogiendo y se pierde.
Hay que recogerlo, por ejemplo, asignándolo a una referencia ahí en esa misma línea.

Citar
static void Main(string[] args)
        {

            //int cant_ClasesMes = 0;
           
            int cant_Alumnos = ingresoNumericoconControl("Ingrese cantidad alumnos)");//p_1
            int cant_Clases = ingresoNumericoconControl("Ingrrese cantidad Clases");
            string[] lista_Alumnos = CrearPlanillaAsistencia(cant_Alumnos);
            TomarAsistencia(cant_Alumnos, cant_Clases); // PUNTO 1.B
        }

Bien, ya tenemos el array refenciado para no perderlo. Ahora hay que pasárselo al método TomarAsistencia(), ya que los nombres de alumnos que se van a ingresar, se ha de hacer en este array que hemos creado:

Citar
static void Main(string[] args)
        {

            //int cant_ClasesMes = 0;
           
            int cant_Alumnos = ingresoNumericoconControl("Ingrese cantidad alumnos)");//p_1
            int cant_Clases = ingresoNumericoconControl("Ingrrese cantidad Clases");
            string[] lista_Alumnos = CrearPlanillaAsistencia(cant_Alumnos);
            TomarAsistencia(lista_Alumnos, cant_Clases); // PUNTO 1.B
        }

Ahora lo que hace falta, es corregir también el método TomarAsistencia().
El método que has escrito, crear dos arrays, uno para nombres y otro para las asistencias en cada clase.
Marco en rojo, algunas (no todas) de las cosas que hay que corregir.
La línea que marco en verde, no me queda claro su propósito. Es más, no estoy seguro siquiera de que el compilador la de por válida.
Citar
public static int  TomarAsistencia(int cant_alumnos, int cant_clases)
        {

           
            string[] array_Alumnos = new string[cant_alumnos];
            string[] array_Clase = new string[cant_clases];//1.b

           
            creaplanillaAssistencia: " + cantidad_muestra);
         
             for (int i = 0; i < cant_alumnos; i++)
             {
                 Console.WriteLine("Ingrese nombre alumno nº: " + i + ";");
                    array_Alumnos[i ] = Console.ReadLine();
                 for (int s = 0; s < cant_clases; s++)
                 {
                     Console.WriteLine("ingrese a ausente o p presente: " + s + ";");
                     array_Clase[s ] = Console.ReadLine();
                }
                Console.WriteLine();             
            }
             //muestra
             for (int i = 0; i < cant_alumnos; i++)
             {
                 Console.WriteLine("NOMBRE: " + array_Alumnos[i ] + " Nº: " + i);
                for (int s = 0; s < cant_clases; s++)
                {
                    Console.WriteLine("Asistencia: " + array_Clase[s ] + " Clase Nº: " + s);
                }         
              }

            return cant_alumnos;
        }

No debe crear dos arrays, debe utilizar el array creado en planillaAsistencia() y que ya le estamos pasando por parámetros y crear otro más con la cantidad de clases que también le indicamos por argumentos.

Marco en negrita las principales correcciones, para que se reciba y se pueda usar el array de string correcto.

Citar
public static int TomarAsistencia(string[] array_Alumnos, int cant_clases)
        {

           
            //Esta linea se puede borrar -- string[] array_Alumnos = new string[cant_alumnos];
            string[] array_Clase = new string[cant_clases];//1.b

           
            //Esta linea se puede borrar -- creaplanillaAssistencia: " + cantidad_muestra);
         
             for (int i = 0; i < cant_alumnos; i++)
             {
                 Console.WriteLine("Ingrese nombre alumno nº: " + i + ";");
                    array_Alumnos[i ] = Console.ReadLine();
                 for (int s = 0; s < cant_clases; s++)
                 {
                     Console.WriteLine("ingrese a ausente o p presente: " + s + ";");
                     array_Clase[s ] = Console.ReadLine();
                }
                Console.WriteLine();             
            }
             //muestra
             for (int i = 0; i < cant_alumnos; i++)
             {
                 Console.WriteLine("NOMBRE: " + array_Alumnos[i ] + " Nº: " + i);
                for (int s = 0; s < cant_clases; s++)
                {
                    Console.WriteLine("Asistencia: " + array_Clase[s ] + " Clase Nº: " + s);
                }         
              }

            return cant_alumnos;
        }


Hay más cosas que corregir. Todas las líneas que usan la variable cant_alumnos, variable que YA NO está recibiendo este método, porque NO es lo que necesita, se tienen que modificar o eliminar según sea necesario.
Habría que revisar que las demás lineas están usando correctamente el array que recibimos por parámetro, no las he mirado, así que no se si requieren correcciones.
Este método tampoco debería retornar un int, de hecho, no debería retornar nada. Tan solo mostrar en pantalla el contenido de los dos arrays una vez se han introducido todos los datos.
Estos cambios te los dejo a ti.

Corrige todo lo que hemos dicho, no se si con esto quedaría el programa completado, en cualquier caso si te surgen dudas, si faltan más cosas, si las correcciones implican nuevos problemas... lo que sea, ...pregunta por aquí y lo vemos.

Un saludo.
« Última modificación: 22 de Octubre 2020, 13:32 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Art_15

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Ayuda C#
« Respuesta #2 en: 22 de Octubre 2020, 18:17 »
Te agradezco por responder. De a poco lo voy entendiendo, pero sigo con el mismo problema, corregí el código y no me doy cuenta por que me devuelve los mismo datos para todos los alumnos. Ejemplo:


Codigo:
Código: [Seleccionar]
int cant_Alumnos = ingresoNumericoconControl("Ingrese cantidad alumnos)");//p_1
            int cant_Clases = ingresoNumericoconControl("Ingrrese cantidad Clases");

            string[] lista_Alumnos = CrearPlanillaAsistencia(cant_Alumnos);
            string[] lista_Asistencias =TomarAsistencia(cant_Clases);
            //Carga Alumnos y Asistencias
            for (int i = 0; i < cant_Alumnos; i++)
            {
                Console.WriteLine("Ingrese nombre alumno nº: " + i + ";");
                lista_Alumnos[i] = Console.ReadLine();
                for (int s = 0; s < cant_Clases; s++)
                {
                    Console.WriteLine("ingrese a ausente o p presente: " + s + ";");
                    lista_Asistencias[s] = Console.ReadLine();
                }
                Console.WriteLine();
            }
            //muestra
            for (int i = 0; i < cant_Alumnos; i++)
            {
                Console.WriteLine("NOMBRE: " + lista_Alumnos[i] + " Nº: " + i);
                for (int s = 0; s < cant_Clases; s++)
                {
                    Console.WriteLine("Asistencia: " + lista_Asistencias[s] + " Clase Nº: " + s);
                }
            }
        }
        public static int ingresoNumericoconControl(string msj)
        {
            Boolean bandera;
            int n = 0;
            do   //INGRESO CANTIDAD ALUMNOS; CONTROL DE ERRORES;
            {
                try
                {
                    Console.WriteLine(msj);
                   n = int.Parse(Console.ReadLine());
               
                    if (n >= 1)
                    {
                        bandera = true;
                    }
                    else
                    {
                        bandera = false;
                        Console.WriteLine("Error. Debe ingresar un valor mayor a 0");
                    }

                }
                catch (Exception e)
                {
                    Console.WriteLine("ERROR DESDE EL CATCH");
                    Console.WriteLine(e.Message);
                    bandera = false;
                }

            } while (!bandera);
            return n;
        }
        public static string[]  TomarAsistencia(int cant_clases)
        {
            string[] array_Clase = new string[cant_clases]; 
            return array_Clase;
        }
        public static string[] CrearPlanillaAsistencia(int cantidad_muestra)//1.a
        {
            string[] cantidad_Alumnos = new string[cantidad_muestra];
            return cantidad_Alumnos;

        }


Kabuto

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 988
    • Ver Perfil
Re:Ayuda C#
« Respuesta #3 en: 22 de Octubre 2020, 20:55 »
Es que ahora me doy cuenta de que el enunciado no es explícito en una cosa, o quizás es que está mal planteado...

El array donde anotamos las asistencias, no puede ser un array de una sola dimensión.
Por eso te muestra los mismos resultados, porque al ser de una sola dimensión, solo guarda los datos de un único alumno.
Da igual si registras dos, cinco o quinientos alumnos... para cada uno de estos estamos usando el mismo array, así que al final de la inserción de datos, solo tendremos las últimas asistencias que se registraron.

Para las asistencias, hay que usar un array de dos dimensiones, es decir, una matriz

Su primera dimensión la establece el valor de cant_Alumnos y la segunda el valor de cant_Clases

Código: [Seleccionar]
string[,] lista_Asistencias = new string[cant_Alumnos,cant_Clases];
De este modo, ahora sí que podremos registrar las asistencias de todos los alumnos, en cada una de sus clases
« Última modificación: 23 de Octubre 2020, 21:06 por Kabuto »
NO respondo dudas por mensaje privado
Publicando vuestras dudas en el foro público conseguimos:
- Que más gente aporte respuestas mejores o complementarias.
- Que otras personas puedan aprender de vuestras dudas.

Mejor en PÚBLICO que en privado. Gracias

Art_15

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 3
    • Ver Perfil
Re:Ayuda C#
« Respuesta #4 en: 22 de Octubre 2020, 21:27 »
Me parecía que debía hacer eso pero no me daba cuenta como formar la matriz.
Muchísimas Gracias!!!

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".