Дана задача: Для заданного массива размером 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 раза! когда совпадут оба условия внутри скобки. Блин, он тупо не работает. Я понимаю возможно это для вас нубская реализация задачи, но логика в ней какая-никакая есть и должна исполняться программой, но не хочет. Почему? Хочу понять.