Логическая ошибка в коде?

74
18 ноября 2021, 09:00


Помогите исправить код чтобы работал правильно -

Определения: (Идет работа с массивом от первого до последнего поля)
             Массив -  
             Резко падает = 88,55,33,22,1; (может быть массив в два поля = 1,4);
             Резко возрастает = 1,15,33,44; (может быть массив в два поля = 5,2);
             Монотонно возрастает = 1,3,15,15,33,55;
             Монотонно падает = 88,55,33,33,22,1; 
Задание:
if toschka == true && vvod == резко возрастает, End = true;
if toshka == false && vvod == резко падает, End = true;
if (toschka == false || toschka == true) && (vvod == null || vvod.length == 0), End = false;
if (toschka == false || toschka == true) && vvod.length == 1, End = true;

Мой код, где я накосячил?

  public static boolean End(int[] vvod, boolean toschka) {
        boolean Otvet = false;
        boolean dvoinoeVosvr = false;
        boolean vozvrastanie = false;
        int a = 0;
        while (a < vvod.length) {//Pruef ob monoton steigend
            for (int j = 0; j < vvod.length; j++)
                for (int k = j + 1; k < vvod.length; k++) {
                    if (k != j && vvod[k] == vvod[j]) {
                        dvoinoeVosvr = true;
                        break; 
                    }
                }
            for (int i = 0; i < vvod.length - 1; i++) {
                if (vvod[i] > vvod[i + 1]) {
                    vozvrastanie = false;
                    break;
                } else {
                    vozvrastanie = true;
                    break;
                }
            }
            a++;
        }
      if (vvod == null && vvod.length == 0) {
        Otvet = false;
    } else if (vvod.length == 1){
        Otvet = true;
    } else if (toschka == true && vozvrastanie == true){
        Otvet = true;
    } else if (toschka ==  false && vozvrastanie == false) {
        Otvet = true;
    }
        return Otvet;
    }
}

На скриншоте изменены названия метода и переменных метода, код тот же самый

Answer 1

В Вашем коде шесть вариантов, когда функция ничего не возвращает, и один - когда что-то возвращает. С этим надо что-то делать. Еще очень мило выглядит проверка параметра на null после долгих манипуляций с этим параметром.

Уберите эти условия отовсюду:

toschka == true || toschka == false
Answer 2

С условиями стоит поработать. Во-первых, в условии задачи чётко не определено - значения в массивах обязательно возрастают или убывают, или могут произвольно меняться как в сторону увеличения, так и в сторону уменьшения.

Во втором случае нужно пройтись в цикле и убедиться, что значения меняются в одну сторону на всей протяжённости. Поскольку это не оговорено, будем использовать упрощённый вариант.

Так же чётко не задано условие двойного возрастания. Из кода предположу, что это когда каждое последующее число другое.

В профессии программиста это важно: 1. запросить все условия. 2. не делать больше чем просят.

Проверку

 if (vvod == null && vvod.length == 0) {
        Otvet = false;
    } else if (vvod.length == 1){
        Otvet = true;
    }

Надо перенести в начало метода в таком виде:

    if (vvod == null || vvod.length == 0) {
        return false;
    } else if (vvod.length == 1){
        return true;
    }

Условие здесь стоит поправить. Сейчас вторая проверка свалится с NullPounterException. Если перевести это условие на русский язык: "если ввод равен налл, и его длина равна нулю".

if (vvod == null && vvod.length == 0) {

Правильное решение:

if (vvod == null || vvod.length == 0) {

"если ввод равен налл, или его длина равна нулю". В случае, если первое условие == true - второе проверяться уже не будет.

Циклы.

Тут всё плохо. Один лишний цикл, ненужные проверки, ненужная переменная. Дешевле переписать код:

    public static boolean end(int[] vvod, boolean toschka) {
        // (vvod == null || vvod.length == 0), End = false;
        // vvod.length == 1, End = true;
        if (vvod == null || vvod.length == 0) {
            return false;
        } else if (vvod.length == 1) {
            return true;
        }
        // смотрим, есть у нас двойное изменение или нет.
        boolean doubleIncr = true;
        for (int i = 0; i < vvod.length - 1; i++) {
            if (vvod[i] == vvod[i + 1]) {
                doubleIncr = false;
                break;
            }
        }
        //если монотонное - возвращаем false
        if (!doubleIncr) {
            return false;
        }
        // Если первый элемент массива меньше последнего - значит возрастает
        boolean increase = vvod[0] < vvod[vvod.length - 1];
        // if toschka == true && vvod == резко возрастает, End = true;
        //if toshka == false && vvod == резко падает, End = true;
        if ((toschka && increase) || (!toschka && !increase)) {
            return true;
        } else {
            return false;
        }
        // кстати, последние проверки можно упростить до:
        // return (toschka && increase) || (!toschka && !increase);
    }

Тесты для проверки:

    @Test
    void endTest() {
        assertFalse(end(new int[]{}, false));
        assertFalse(end(new int[]{}, true));
        assertTrue(end(new int[]{0}, false));
        assertTrue(end(new int[]{0}, true));
        assertFalse(end(new int[]{1,2}, false));
        assertTrue(end(new int[]{2,1}, false));
        assertTrue(end(new int[]{1,2}, true));
        assertFalse(end(new int[]{2,1}, true));
        assertFalse(end(new int[]{1,2,2}, false));
        assertFalse(end(new int[]{2,1,1}, true));
        assertFalse(end(new int[]{1,2,2}, false));
        assertFalse(end(new int[]{2,1,1}, true));
    }

Так же советую называть переменные и методы с маленькой буквы.

READ ALSO
Ошибка при подключении “ORA-12505: TNS:listener does not currently know of SID given in connect descriptor”

Ошибка при подключении “ORA-12505: TNS:listener does not currently know of SID given in connect descriptor”

Установила Oracle11g, настроила подключение в идее - все окНо в итоге выдает такую ошибку:

144
Вставка данных в несколько связанных таблиц одновременно

Вставка данных в несколько связанных таблиц одновременно

Хотел бы поинтересоваться, как добавлять данные в связанные таблицы одним запросомНа рисунке изображена схема БД

70
Структура базы данных, laravel

Структура базы данных, laravel

На сайте на разных страницах должен выводиться контент, редактируемый из админкиИ контент по своей структуре разный: на некоторых страницах...

310