Задача по массиву

115
09 октября 2019, 18:50

Всем привет. Продолжаю изучать С#. Есть задача:

На вход метода подаётся массив целых чисел. Метод должен вычислить сумму всех чётных элементов.

Если ее решать не разбивая на методы, проблем нет, плевое дело. Но я решил сделать по правильному и разбить на методы. И сразу же появилась проблемы. Я решил добавить два метода: Первый метод будет находить в массиве четные числа Второй метод будет эти четные числа складывать Ну и main будет выводиться результат. Вот мой код:

static int EvenNumber(int[] array)
    {
        //тут получение четных чисел из массива
        int evenNum = 0;
        for (int i = 0; i < array.Length; i++)
        {
            if (array[i] % 2 == 0)
            {
                evenNum = array[i];
            }
        }
        return evenNum; //это неправильно((
    }
    static int SummValue(int[] summ)
    {
        //получение суммы массива
        return summ.Sum();
    }
    static void Main(string[] args)
    {
        int[] arrays = { 2, 4, 3, 10, 1 };                      
        Console.ReadKey();
    }        

Как из метода EvenNumber вернуть четные числа массива и использовать их в методе SummValue? Чтоб потом вывести результат в main. Уже какой день бьюсь... Спасибо заранее Всем за помощь!

Answer 1

Ответ будет как начинающему (с соотв. кодом) и с некоторыми рекомендациями.

Вот вы создали проект и написали первую строчку

static void Main(string[] args)
{
    int[] inputArray = new[] { 1, 2, 5, 7, 4, 7, 8, 6, 4, 0 };
}

что делать дальше? Размышлять письменно, т.е. писать комментарии вот так

static void Main(string[] args)
{
    int[] inputArray = new[] { 1, 2, 5, 7, 4, 7, 8, 6, 4, 0 };
    //получить массив четных чисел из входного массива
    //получить сумму четных чисел из массива
    //вывести результат на экран
    Console.ReadKey();
}

Поразмышляли? Начинаем писать код.

Написали строки с несуществующими еще методами. Как быть? Пускай их за нас напишет студия. Вот так подводите мышку к подчеркнутым красным названию метода и вылезает такая подсказка, нажимаем Enter и нужный метод создан.

Повторяем эту же операцию со вторым методом. И получаем второй метод. И программа почти готова!

static void Main(string[] args)
    {
        int[] inputArray = new[] { 1, 2, 5, 7, 4, 7, 8, 6, 4, 0 };
        //получить массив четных чисел из входного массива
        int[] evenNumbers = GetEvenNumbersArray(inputArray);
        //получить сумму четных чисел из массива
        int sum = GetSum(evenNumbers);
        //вывести результат на экран
        Console.WriteLine(sum);
        Console.ReadKey();
    }
    private static int GetSum(int[] evenNumbers)
    {
        throw new NotImplementedException();
    }
    private static int[] GetEvenNumbersArray(int[] inputArray)
    {
        throw new NotImplementedException();
    }

Она даже компилируется! Но не выполняется...

Теперь размышляем над первым методом.

private static int[] GetEvenNumbersArray(int[] inputArray)
    {
        //создать массив-аккумулятор для сбора четн.чисел
        //пройти по аккумулятору и назначить всем элементам -1
        //выбрать в цикле четные и занести их в аккумулятор
        //подсчитать кол-во чисел не равных -1 в аккумуляторе
        //cоздать результирующий массив
        //внести в результирующий массив все числа не равные -1 из аккумулятора
        //вернуть результат
        throw new NotImplementedException();
    }

Пишем код...

private static int[] GetEvenNumbersArray(int[] inputArray)
    {
        //создать массив-аккумулятор для сбора четн.чисел
        int[] accum = new int[inputArray.Length];
        //пройти по аккумулятору и назначить всем элементам -1
        for (int i = 0; i < accum.Length; i++)
        {
            accum[i] = -1;
        }
        //выбрать в цикле четные и занести их в аккумулятор
        for (int i = 0; i < inputArray.Length; i++)
        {
            if (inputArray[i] % 2 == 0)
            {
                accum[i] = inputArray[i];
            }
        }
        //подсчитать кол-во чисел не равных -1 в аккумуляторе
        int count = 0;
        for (int i = 0; i < accum.Length; i++)
        {
            if (accum[i] != -1)
            {
                count++;
            }
        }
        //cоздать результирующий массив
        int[] result = new int[count];
        //внести в результирующий массив все числа не равные -1 из аккумулятора
        int j = 0;
        for (int i = 0; i < accum.Length; i++)
        {
            if (accum[i] != -1)
            {
                result[j] = accum[i];
                j++;
            }
        }
        //вернуть результат
        return result;
    }

Теперь можно проверить работу первого метода. Вернитесь в метод Main() и на вызове второго метода поставьте курсор и нажмите клавишу F9, или мышкой кликните слева на серой рамке напротив нужной строки. Таким образом мы установили точку останова. В режиме отладки программа остановится на этой строке и сможем проверить результат выполнения метода, вот так наводите курсор мыши на нужную переменную и всплывает подсказка, в которой можно проверить результат выполнения метода.

В таком же духе продолжаем со вторым методом

private static int GetSum(int[] evenNumbers)
{
    //создать результирующую переменную
    int result = 0;
    //пройти в цикле по evenNumbers и просуммировать в результат
    for (int i = 0; i < evenNumbers.Length; i++)
    {
        result += evenNumbers[i];
    }
    //вернуть результат
    return result;
}

Все. Можно проверить работу программы. Точку останова можно отключить, если по ней кликнуть еще раз или повторно поставить курсор на эту строчку и нажать F9.

Вы скажите, что лень писать комментарии, а хочется сразу код. Когда вы только учитесь лучше сначала набросать канву решения в комментариях, а потом писать код. Такой режим работы помогает сохранить нить размышлений, и такой подход помогает даже опытным программистам в сложных и запутанных ситуациях.

Желаю успехов!

READ ALSO
C# Selenium. Не получается нажать на кнопку

C# Selenium. Не получается нажать на кнопку

Создаю приложение, в котором требуется мне взять базу с Avito, на нужной страничке имеется кнопка <div class="DnHhI"><span class="_2bexo">Загрузить еще</span></div>...

121
Windows установить прокси с аутентификацией

Windows установить прокси с аутентификацией

Я изменяю настройки прокси сервера windows с помощью

117
Cookie, которые устанавливает JS

Cookie, которые устанавливает JS

Уже неделю ломаю голову, не могу понять как сделатьДелаю робота для авторизации на сайте и парсинга

106