Quería practicar la creación de matrices creando un pequeño programa que permitiera al usuario ingresar una cantidad de elementos que tendría una matriz, luego crear una matriz con la cantidad de elementos que el usuario ha ingresado y llenar todos los elementos con números. Por ejemplo: si escribe 3, generaría 3 elementos, complete el elemento 1 con el número 1 y el número 2 con el número 2 y así sucesivamente. Aunque obtengo un error específico cada vez: CS0021 No se puede aplicar la indexación con [] a una expresión de tipo 'grupo de métodos' Aquí está mi código:

       static void Main(string[] args)
    {
        int num;
        string getNum;
        getNum = Console.ReadLine();
        num = Int32.Parse(getNum);
        int[] array = new int[num];
        Console.WriteLine("Array created with {0} elements.",num);
    }
    static void Array(int input)
    {
        int num = 1;
        int inum = input;
        while(inum >= input)
        {
            Array[inum] = num;
            Console.WriteLine("{0}",input);
            Console.WriteLine("{0}", num);
            inum = inum - 1;
            num = num + 1;
        }

Gracias de antemano si decides ayudarme :)

0
ImNotCrazy 11 nov. 2017 a las 19:24

2 respuestas

La mejor respuesta

En su programa, Array es un método.

Por lo tanto, la línea Array[inum] = num tiene errores porque Array es un método y no puede aplicar un indexador ([]) a un método.

La forma más rápida de lograr lo que desea es algo como lo siguiente:

static int[] Array(int input) // Change return type to return an array of integers
{
    var result = new int[input]; // Declare a local variable to hold a new array of size input.

    // Change while to basic for loop
    for (int i = 0; i < input; i++)
    {
        result[inum] = i + 1; // set elements of the result array.
        Console.WriteLine("{0}",input);
        Console.WriteLine("{0}", i);
    }
}

En su método principal:

static void Main(string[] args)
{
    int num;
    string getNum;
    getNum = Console.ReadLine();
    num = Int32.Parse(getNum);
    int[] array = Array(num); // Change this to call the Arrra(int num) method
    Console.WriteLine("Array created with {0} elements.",num);
}

O de lo contrario, podría usar una simple declaración de Linq:

Enumerable.Range(1, input).ToArray();
0
Michal Ciechan 11 nov. 2017 a las 16:47

Ok, ordenemos un poco su código e intentemos que haga lo que parece que quiere que haga:

Comencemos sacando cualquier lógica de su método Main y escribiendo métodos específicos que den pequeños pasos hacia su objetivo. Recuerde, cuanto más pequeños sean sus métodos, más difícil le resultará escribir un error. Si está aprendiendo, comience de manera absurdamente pequeña y crezca a medida que gane confianza.

Ok, existe el concepto de pedirle un número a un usuario, vamos a escribir un método que haga esto y hacerlo lo más robusto posible en el proceso. Recuerde, ¡los usuarios son tontos! Pide un número y escribirán cualquier cosa menos:

public static int PromptUserForPositiveInteger(string prompt)
{
    int number;
    Console.Write(prompt);
    var input = Console.ReadLine();

    while (!int.TryParse(input, out number) ||
             number < 0)
    {
        Console.Write("Input is not a valid number, try again: ");
        input = Console.ReadLine();
    }

    return number;
}

Ok, entonces lo que hace este método es pedirle al usuario un número entero positivo, y seguirá haciéndolo hasta que el usuario logre ingresar un número válido o desconecte. De cualquier manera, estamos a salvo. int.TryParse es una forma segura de extraer un int de un string; si es posible hacerlo, le dará un número y devolverá true; de lo contrario, devolverá false. Lo que no hará es explotar en tu cara si falla, algo que int.Parse está bastante feliz de hacer. Evita Parse como una plaga, usa siempre el más amigo TryParse.

También vale la pena mencionar que este método es un detalle de implementación , por lo que es private. Nadie fuera de tu clase necesita usarlo, así que no lo muestres.

Tenga en cuenta también que podemos generalizar esto haciendo que la persona que llama especifique cómo desea preguntarle al usuario. No hay ninguna razón por la que desee restringir este método solo a los tamaños de matriz, ¡tal vez mañana necesite la cantidad de plátanos que va a alimentar al mono! Siempre que sea barato y fácil, generaliza tu código. Siempre que sea difícil generalizar, no lo haga, lo más probable es que no lo necesite y es un esfuerzo inútil.

Ahora, la siguiente tarea que necesitamos es hacer una matriz int y llenarla con valores. El valor será el índice de cada elemento de la matriz. ¡Oh, pero espera, dijimos que haríamos un método por tarea sin importar cuán absurdamente pequeño sea! Sí, lo sé, pero absurdamente pequeño solo llega hasta cierto punto.

private static int[] CreatArrayAndSetValuesToIndex(int size)
{
    Debug.Assert(size >= 0);
    var array = new int[size];

    for (var i = 0; i < size; i++)
    {
        array[i] = i;
    }

    return array;
}

CreatArrayAndSetValuesToIndex puede parecer un nombre absurdamente largo, pero te dice exactamente lo que hace el método . Acostúmbrese a utilizar nombres descriptivos y evite las abreviaturas. Hoy en día con intellisense no tiene sentido usar nombres cortos enigmáticos.

También observe la validación del argumento. Nunca enfatizaré esto lo suficiente: ¡siempre valida las entradas a tus métodos! . Si se supone que las cosas no funcionan bajo ciertas condiciones, asegúrese de hacer todo lo posible para evitar estas condiciones. Debido a que el método es privado, Debug.Assert es suficiente. Si fuera parte de la superficie pública, necesitaría lanzar una excepción apropiada (ArgumentOutOfRange me viene a la mente como una adecuada).

Por último, pero no menos importante, escribamos un último método que imprima matrices int para que podamos asegurarnos de que nuestro código funciona bien:

private static void PrintOut(int[] array)
{
    Console.WriteLine(string.Join(Environment.NewLine, array);
}

He aprovechado aquí las herramientas que ya están disponibles en el marco. string.Join es un pequeño método ingenioso que toma cualquier objeto enumerable (las matrices son uno de ellos) y crea una cadena de todos sus miembros con un separador dado, en este caso, una nueva línea.

Y ahora, todo lo que queda es ponerlo todo junto:

static void Main(string[] args)
{
    var size = PromptUserForPositiveInteger("Enter array size: ");
    var array = CreatArrayAndSetValuesToIndex(size);
    PrintOutArray(array);
    Console.ReadLine();
}

¡Y hemos terminado!

0
InBetween 11 nov. 2017 a las 17:09