programmist_derevo
@programmist_derevo

Почему if срабатывает внутри foreach когда не должен?

Дана задача: Для заданного массива размером n×n, элементы которого являются целыми числами для каждой строки найти последний четный элемент и записать данные в новый массив.
Дан кодер: нуб
Написан такой код: он достаточно простой и может длинноват, ибо использовал те знания, которые имею
using System;

class ProkaznikMassiv
{

    // создаем массив с возможностью задать его размеры
    static void Main()
    {
        Random rand = new Random();
        int n;
        int r;
        int e = 0;
        int w = 0;
        int q = 0;
        bool p = false;
        int s = 0;

        int[] massivResult = new int[2] { 0, 0 };  // создали массив, в который запишем итоговые два числа из массива massiv
                                                   // и заполним сразу обе ячейки, чтобы массив не мог оказаться пустым в конце программы

        Console.WriteLine("Введите число n");
        n = Convert.ToInt32(Console.ReadLine());


        int[,] massiv = new int[n, n];
        Console.WriteLine("\nСоздан массив размерами " + n + "x" + n);

        
        

        for (int i = 0; i <= n-1; i = i + 1)  // заполняем массив данными
        {
            for(int u = 0; u <= n-1; u = u + 1)
            {
                massiv[i, u] = rand.Next(1, 2000);  // записывает в ячейку массива случайное число от 1 до 2000
            }

           
        }

        //  массив создан и заполнен, теперь опрашиваем его и находим последнее чётное
        r = n-1;  // запоминаем количество ячеек в строке массива, но с нуля, чтобы соотв-ло 1й ячейке в строке. 

        foreach (int x in massiv)
        {
            

            if (x%2 == 0)
            {
                p = true;  // true если нашлось чётное число
                w = x;     // присваиваем переменной w это число
            }

             if (e==r && p)
                {        // если строка массива подошла к концу и нашлось чётное число
                    massivResult[q] = w;  // запишем это число в массив massiveResult в ячейку 0
                    q = 1;             // теперь, если число найдется, будем писать в ячейку 1 массива massiveResult
                    r += n;               // отслеживаем конец второй строки массива nxn (massiv который)
                    s++;  // просто проверочная переменная, чтобы подсчитать сколько раз выполнился этот if

                }  // если строка массива подойдет к концу, в massivResult запишется последнее чётное число. Если таковое число не нашлось,
              // то ничего не запишется (значение p будет false) и цикл продолжит искать чётные числа уже во второй строке массива "nxn"

            e++;  // узнаем какая ячейка массива сейчас опрашивается

        }

        // опрос массива кончился. мы проверили все числа и выполнили изначальное задание


        bool v, b;              // проверим, заполнились ли ячейки массива с результатами чем-то или так и остались с "0" т.е. чётное число не было найдено
        
        if (massivResult[0] != 0) v = true;
        else v = false;

        if (massivResult[1] != 0) b = true;
        else b = false;


        // ну вот и всё! осталось вывести результат выполнения программы
        Console.Write("\nНайденые чётные числа в заданом вами массиве оказались: ");
        if (v) Console.Write(massivResult[0] + " ");
        else Console.Write("числа не найдено ");
        Console.Write("в конце первой строки массива, и ");
        if (b) Console.Write(massivResult[1] + " ");
        else Console.Write("числа не найдено ");
        Console.Write("в конце второй строки массива\n");
        Console.WriteLine(s);
    }

}


Проблема в этом участке:
foreach (int x in massiv)
        {
            

            if (x%2 == 0)
            {
                p = true;  // true если нашлось чётное число
                w = x;     // присваиваем переменной w это число
            }

             if (e==r && p)
                {        // если строка массива подошла к концу и нашлось чётное число
                    massivResult[q] = w;  // запишем это число в массив massiveResult в ячейку 0
                    q = 1;             // теперь, если число найдется, будем писать в ячейку 1 массива massiveResult
                    r += n;               // отслеживаем конец второй строки массива nxn (massiv который)
                    s++;  // просто проверочная переменная, чтобы подсчитать сколько раз выполнился этот if

                }  // если строка массива подойдет к концу, в massivResult запишется последнее чётное число. Если таковое число не нашлось,
              // то ничего не запишется (значение p будет false) и цикл продолжит искать чётные числа уже во второй строке массива "nxn"

            e++;  // узнаем какая ячейка массива сейчас опрашивается

        }

Суть в том, что переменная q должна быть либо 0, либо 1, чтобы заполнить соответствующие поля массива massivResult[q], который состоит всего из 2 ячеек. Изначально написано было так: q++;, но вылезала ошибка переполнения массива, то есть оператор if выполнялся лишние разы, а massivResult[2] не существует. Цикл foreach должен был закончиться раньше.

Сейчас написал q=1, чтобы не вылетало и ввёл проверочную переменную "s" внутрь if, чтобы глянуть сколько раз этот if выполнялся.

Так вот суть вопроса: почему if (e==r && p) выполняется много раз? Какое n в начале вводишь, тому и равен получается s в итоге - то есть дофига раз выполняется этот if. Но должен всего 2 раза! когда совпадут оба условия внутри скобки. Блин, он тупо не работает. Я понимаю возможно это для вас нубская реализация задачи, но логика в ней какая-никакая есть и должна исполняться программой, но не хочет. Почему? Хочу понять.
  • Вопрос задан
  • 324 просмотра
Пригласить эксперта
Ответы на вопрос 1
AxianLTD
@AxianLTD
if (e==r && p) У вас p не инициализирована до проверки если if (!(x%2 == 0)).
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы