Значения блока меньше, чем в предыдущей итерации

Этот цикл проверяет предыдущий элемент в массиве. Вопрос в том, как избежать проверки 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 предназначены только для просмотра того, что происходит.

Каково ваше условие, чтобы разрешить номера? Вы вообще не сверяетесь с номерами предыдущей строки arr[k-1]. Что не так с указанными цифрами?

Gerhardh 21.03.2022 12:09

Каждое добавленное число должно быть больше, чем все остальные (предыдущие числа, которые уже были добавлены), независимо от строки/столбца.

user18528430 21.03.2022 12:11

Тогда зачем вам столбцы/строки? Просто сохраните last_number и сравните с new_number перед сохранением в массиве. Тогда условие для break будет if (n==0 && k == 0)

Gerhardh 21.03.2022 12:12

Для будущих вопросов я предлагаю несколько улучшений: Заголовок и тело должны совпадать. Если вы получили неверный результат, сообщите нам (в теле вопроса, а не в комментариях), какой результат ожидается и почему. Кроме того, ваше тело непоследовательно: break, которое у вас есть, отлично избегает проверки предыдущих элементов, которые могут вызвать UB. Ваша проблема была другой (из названия).

Gerhardh 21.03.2022 12:47
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
4
44
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Сдача

while (arr[k][n] <= arr[k][n - 1]); 

к

while (n > 0 && arr[k][n] <= arr[k][n - 1]); 

Это работает, потому что && закорачивает тест, когда n == 0, и не выполняет второй тест.

Вам также нужно будет исправить оператор печати.

Это имеет тот же недостаток, что большее значение в предыдущей строке не обнаружено.

Gerhardh 21.03.2022 12:17

Я считаю, что название и все описание должны быть приняты во внимание.

Gerhardh 21.03.2022 12:26

действительный пункт. логика неверна.

stark 21.03.2022 12:33

Цель цикла - быть бесконечным, пока не будет введено допустимое число.

stark 21.03.2022 12:36
Ответ принят как подходящий

Вы проверяете только предыдущий столбец. Это не связано с вашим 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), что именно она делает?

user18528430 21.03.2022 12:26

Это позволяет избежать дополнительной итерации для самого первого значения. arr[0][0] должны быть приняты без каких-либо проверок.

Gerhardh 21.03.2022 12:28

даже простое добавление if (n==0 && k == 0) в мой код, кажется, решает проблему без проблем. Вы добавили переменные new number и last number, чтобы сделать его лучше в целом. Я прав?

user18528430 21.03.2022 12:31

Я добавил last_number, чтобы сохранить наибольшее значение из первой строки. Это из-за вашего комментария быть больше, чем все остальные (предыдущие числа, которые уже были добавлены), независимо от строки/столбца.

Gerhardh 21.03.2022 12:34

last_number не инициализирован

stark 21.03.2022 12:38

@stark при самом первом запуске внутреннего цикла for мы пропустим условие while как n==0 && k == 0. Сразу после этого ему будет присвоено значение, которое можно использовать в следующей итерации.

Gerhardh 21.03.2022 12:42

@Gerhardh Я проверил это, и только добавление if (n==0 && k == 0) помогает, даже проверяет предыдущие строки.

user18528430 21.03.2022 12:49

@ user18528430 со своим старым кодом? Это неверно. Для n==0 && k==1 ваш код по-прежнему обращается к arr[k][n-1], что неверно. Также ваш код не мешает вводить числа, которые вы показываете как недопустимый ввод. Вы должны начать использовать отладчик и пройтись по коду. Смотрите каждую инструкцию и проверяйте значения ваших переменных. Если бы это было правильным решением, я бы не стал вносить больше изменений.

Gerhardh 21.03.2022 12:52

Другие вопросы по теме