Этот цикл проверяет предыдущий элемент в массиве. Вопрос в том, как избежать проверки arr[0][0] с его предыдущим элементом, который вызывает неопределенное поведение?
Вот код до сих пор, но у него есть проблема с первым элементом, проверяемым его предыдущим элементом.
int main()
{
int arr[2][4];
int k, n;
for (k = 0; k < 2; k++) {
for (n = 0; n < 4; n++) {
do {
printf("Provide a number");
scanf("%d", &arr[k][n]);
printf("This is %d in the position[%d][%d]\n", arr[k][n], k, n);
if (n==0) break;
printf("The arr[k][n] is %d and the arr[k][n-1] is %d and n-1 means %d\n", arr[k][n], arr[k][n - 1], n - 1);
} while (arr[k][n] <= arr[k][n - 1]); //Here is the issue
}
}
for (k = 0; k < 2; k++) {
for (n = 0; n < 4; n++) {
printf("%d\n", arr[k][n]);
}
}
}
Проблема:
Добавление if (n==0) break; приводит к тому, что программа разрешает добавлять меньшие числа, чем те, которые были вставлены до сих пор. Хотя не включение этой строки вызывает неопределенное поведение. Как это можно исправить?
Вот как это работает сейчас, что не правильно:
2 3 4 5
2 4 5 6
Заявления printf предназначены только для просмотра того, что происходит.
Каждое добавленное число должно быть больше, чем все остальные (предыдущие числа, которые уже были добавлены), независимо от строки/столбца.
Тогда зачем вам столбцы/строки? Просто сохраните last_number и сравните с new_number перед сохранением в массиве. Тогда условие для break будет if (n==0 && k == 0)
Для будущих вопросов я предлагаю несколько улучшений: Заголовок и тело должны совпадать. Если вы получили неверный результат, сообщите нам (в теле вопроса, а не в комментариях), какой результат ожидается и почему. Кроме того, ваше тело непоследовательно: break, которое у вас есть, отлично избегает проверки предыдущих элементов, которые могут вызвать UB. Ваша проблема была другой (из названия).



Сдача
while (arr[k][n] <= arr[k][n - 1]);
к
while (n > 0 && arr[k][n] <= arr[k][n - 1]);
Это работает, потому что && закорачивает тест, когда n == 0, и не выполняет второй тест.
Вам также нужно будет исправить оператор печати.
Это имеет тот же недостаток, что большее значение в предыдущей строке не обнаружено.
Я считаю, что название и все описание должны быть приняты во внимание.
действительный пункт. логика неверна.
Цель цикла - быть бесконечным, пока не будет введено допустимое число.
Вы проверяете только предыдущий столбец. Это не связано с вашим break, а из-за нарушенной логики.
Вы можете сделать это следующим образом:
int main()
{
int arr[2][4];
int k, n;
int last_number, new_number;
for (k = 0; k < 2; k++) {
for (n = 0; n < 4; n++) {
do {
printf("Provide a number");
scanf("%d", &new_number);
printf("This is %d in the position[%d][%d]\n", new_number, k, n);
if (n==0 && k == 0)
break; // Don't check for increasing values.
} while (new_number < last_number);
arr[k][n] = new_number;
last_number = new_number;
}
}
for (k = 0; k < 2; k++) {
for (n = 0; n < 4; n++) {
printf("%d\n", arr[k][n]);
}
}
}
часть (n==0 && k == 0), что именно она делает?
Это позволяет избежать дополнительной итерации для самого первого значения. arr[0][0] должны быть приняты без каких-либо проверок.
даже простое добавление if (n==0 && k == 0) в мой код, кажется, решает проблему без проблем. Вы добавили переменные new number и last number, чтобы сделать его лучше в целом. Я прав?
Я добавил last_number, чтобы сохранить наибольшее значение из первой строки. Это из-за вашего комментария быть больше, чем все остальные (предыдущие числа, которые уже были добавлены), независимо от строки/столбца.
last_number не инициализирован
@stark при самом первом запуске внутреннего цикла for мы пропустим условие while как n==0 && k == 0. Сразу после этого ему будет присвоено значение, которое можно использовать в следующей итерации.
@Gerhardh Я проверил это, и только добавление if (n==0 && k == 0) помогает, даже проверяет предыдущие строки.
@ user18528430 со своим старым кодом? Это неверно. Для n==0 && k==1 ваш код по-прежнему обращается к arr[k][n-1], что неверно. Также ваш код не мешает вводить числа, которые вы показываете как недопустимый ввод. Вы должны начать использовать отладчик и пройтись по коду. Смотрите каждую инструкцию и проверяйте значения ваших переменных. Если бы это было правильным решением, я бы не стал вносить больше изменений.
Каково ваше условие, чтобы разрешить номера? Вы вообще не сверяетесь с номерами предыдущей строки
arr[k-1]. Что не так с указанными цифрами?