#c
Вопрос:
мне просто нужно, чтобы пользователь ввел матрицу символов 4*4, вывод будет » да » или » нет » в зависимости от того, есть ли подматрица 2 * 2 с одинаковым входом. код всегда печатается ложным.
код такой:
#include <iostream>
using namespace std;
int main()
{
//input
char color[4][4];
for (int i = 0; i < 4; i ) {
for (int j = 0; j < 4; j ) {
cin >> color[i][j];
}
}
//for testing if there are a squar
// * * * *
// * * # #
// # # * *
// * * # #
// 'yes' as
// * *
// * *
// is a squar of 2*2
for (int i = 0; i < 4; i ) {
for (int j = 0; j < 4; j ) {
if (j != 3) {
if (color[i][j] == color[i][j 1] == color[i 1][j] == color[i 1][j 1]) {
cout << "yes";
break;
}
else cout << "no";
}
}
}
//for (int i = 0; i < 4; i ) {
//for (int j = 0; j < 4; j ) {
//if (j == 3)
//cout << colors[i][j] <<"n";
//else
//cout << colors[i][j];
//}
//}
return 0;
}
Комментарии:
1. Похоже, вам, возможно, потребуется научиться использовать отладчик для пошагового выполнения кода. С хорошим отладчиком вы можете выполнять свою программу построчно и видеть, где она отклоняется от того, что вы ожидаете. Это необходимый инструмент, если вы собираетесь заниматься каким-либо программированием. Дальнейшее чтение: Как отлаживать небольшие программы и руководство по отладке
2.
a == b == c == d
не делает того, что вы думаете. Это интерпретируется как((a == b) == c) == d
, что означает, что вы сравниваете промежуточный результат (true
илиfalse
) сchar
Ответ №1:
Это условие неверно:
if (color[i][j] == color[i][j 1] == color[i 1][j] == color[i 1][j 1]
Для простоты рассмотрим
if (a == b == c)
который анализируется как
if ( (a == b) == c)
Результат a==b
сравнивается с c
. Результатом a==b
является либо true
или false
, которое может быть преобразовано в 1
или 0
, соответственно.
Вы бы "yes"
напечатали на экране , когда есть подматрица 2×2 со всеми элементами, равными 1
, хотя это было бы по неправильным причинам.
Чего вы на самом деле хотите, так это:
if ( a==b amp;amp; a==c)
Не игнорируйте предупреждения ваших компиляторов! При наличии правильных флагов ваш код не компилируется: https://godbolt.org/z/45oqcTEna.
Более того, цикл выходит за пределы массива. Вы предотвращаете j
выход за пределы, но когда i == 3
затем color[i 1][j]
пытаетесь получить доступ к элементу, которого не существует. Вместо итерации до <4
и затем исключения j == 3
, пусть цикл повторяет только те индексы, которые являются допустимыми верхними левыми углами подматрицы:
const size_t size = 4;
const size_t sub_matrix_size = 1;
for (size_t i=0; i < size-sub_matrix_size; i) {
for (size_t j=0; j < size-sub_matrix_size; j) {
//...