Проверка всей строки массива на нахождение элементов
Дана следующая задача: Дана целочисленная квадратная матрица А порядка N, где N — заданное натуральное число. Если в матрице А есть строка, все элементы которой являются удвоенными нечетными числами, то вывести на экран сообщение «Да», иначе сообщение «Нет».
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <Math.h>
#include <locale.h>
#define size 100
int main(void) {
setlocale(LC_ALL, "Rus");
int i,j,n;
int array[size][size];
int x,y=0;
printf("Введите порядок n: ");
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("Введите %d элемент массива: ",++x);
scanf("%d",&array[i][j]);
if (array[i][j]%2==0 && array[i][j]%4 != 0)
{
y++;
}
}
}
for(i=0;i<n;i++)
{
for ( j = 0; j < n; j++ )
{
printf( "%d \t", array[i][j] );
}
printf( "\n" );
}
if(y>0)
{
printf("Да");
}
else
{
printf("Нет");
}
getch();
return 0;
}
В моём коде, работает так, что если хотя бы один элемент во всей матрице соответствует условию задачи, то мне выводит "Да". Проблема в том, что я не знаю, как проверить всю строку, а не один элемент.
Ответы (1 шт):
Вот решение "в лоб" с двумя булевыми переменными:
#include <stdio.h>
#include <stdlib.h>
#include <Math.h>
#include <locale.h>
#define size 100
int main(void) {
setlocale(LC_ALL, "Rus");
int i, j, n;
int array[size][size];
int x = 0, // x тоже обязательно нужно инициализировать, иначе ++x вернёт неизвестно что
y = 0;
printf("Введите порядок n: ");
scanf("%d", &n);
bool stringFound = false; // Переменная, показывающая, надена ли нужная строка
for (i = 0; i<n; i++)
{
bool elementFound = true; // Переменная, показывающая, что очередное число подряд удовлетворяет условию
for (j = 0; j<n; j++)
{
printf("Введите %d элемент массива: ", ++x);
scanf("%d", &array[i][j]);
if (!(array[i][j] % 2 == 0 && array[i][j] % 4 != 0)) // Если вдруг одно из чисел в строке не удовлетворяет условию
{
elementFound = false; // Значит эта строка не подходит
}
}
if (elementFound)
stringFound = true; // Если после прохождения всей строки переменная осталась true, значит все числа удовлетворяли условию,
// а значит нужная строка найдена.
}
for (i = 0; i<n; i++)
{
for (j = 0; j < n; j++)
{
printf("%d \t", array[i][j]);
}
printf("\n");
}
if (stringFound)
{
printf("Да");
}
else
{
printf("Нет");
}
getchar();
return 0;
}
Прочитайте мои комментарии к коду, из них должна быть понятна логика. Также я поясню здесь, как рассуждал. Итак, Вы перебираете элементы каждой строки в цикле со счётчиком j (а цикл со счётчиком i перебирает сами строки). Я решил, что стоит пойти от обратного. То есть заранее принять, что элементы данной строки удовлетворяют условию и только потом, если так не окажется, менять переменную, отвечающую за это. Суть в том, что при проходе по строке мы проверяем каждый элемент на удовлетворение условия и если оно не выполняется, вся строка признаётся не удовлетворяющей условию. Если же каждый элемент строки удовлетворял условию, то переменная, отвечающая за это (elementFound), так и не будет изменена, и тогда мы можем считать, что нужная строка найдена: stringFound = true;.
P.S. Также прошу Вас обратить внимание на мой комментарий по поводу инициализации x, т.к. без этого изначально в данной переменной будет находиться неопределённое значение. И ещё вызывает сомнения, что Вы объявляете массив фиксированного размера, какое бы n не ввели. В таком случае, если будет введено n < size, Вы потратите лишнюю память, а если n > size, то вообще выйдете за границы массива и программа упадёт. Пользуйтесь лучше динамическим массивом и объявляйте его размером n на n, а не больше или меньше.
P.P.S. Моё решение данной задачи не претендует на элегантность. Я уверен, что можно решить её более коротко и изящно, но, к сожалению, у меня нет времени как следует над этим поразмыслить.