QBasic/QB64: Как очистить ЕСЛИ ЕСЛИ "Лестницу"?

Не уверен, что я использую правильные термины здесь, но по какой-то причине QBasic не понимает что-то вроде "x = y = z". Это ограничено двумя.

Чтобы это исправить, я сделал это:

IF sum(1) = sum(2) THEN
    IF sum(2) = sum(3) THEN
        IF sum(3) = sum2(1) THEN
            IF sum2(1) = sum2(2) THEN
                IF sum2(2) = sum2(3) THEN
                    IF sum2(3) = sum3 THEN
                        IF sum3 = sum4 THEN
                            PRINT "This is a Lo Shu Square, with all sums equaling"; sum(1)
                        ELSE
                            PRINT "This is not a Lo Shu Square."
                        END IF
                    END IF
                END IF
            END IF
        END IF
    END IF
END IF
END

Определенно работает, но что-то говорит мне, что есть более простой способ проверить, равны ли все суммы одинаковым. Какие-либо предложения?

6 ответов

Это сработало бы, если бы все сравнения помещались в одну строку, разделенную символом AND, вот так:

REM code to shrink IFTHEN ladder:
IF sum(1) = sum(2) AND sum(2) = sum(3) AND sum(3) = sum2(1) AND sum2(1) = sum2(2) AND sum2(2) = sum2(3) AND sum2(3) = sum3 AND sum3 = sum4 THEN
    PRINT "This is a Lo Shu Square, with all sums equaling"; sum(1)
ELSE
    PRINT "This is not a Lo Shu Square."
END IF
END

Более простой способ проверить цикл:

testvals(1) = sum(1)
testvals(2) = sum(2)
testvals(3) = sum(3)
testvals(4) = sum2(1)
testvals(5) = sum2(2)
testvals(6) = sum2(3)
testvals(7) = sum3
testvals(8) = sum4
FOR i = 1 TO 7
    IF testvals(i) <> testvals(i + 1) THEN
        PRINT "This is not a Lo Shu square."
        END
    END IF
NEXT
PRINT "This is a Lo Shu square, with all sums equaling"; sum(1)

Объединить логику в функцию:

FUNCTION isLoShuSquare (sums() AS DOUBLE)

    isLoShuSquare = 1

    DIM i AS INTEGER
    FOR i = 0 TO UBOUND(sums) - 1
        IF sums(i) <> sums(i + 1) THEN
            isLoShuSquare = 0
            EXIT FOR
        END IF
    NEXT i

END FUNCTION

Затем загрузите массив и передайте его функции:

DIM sums(7) AS DOUBLE
DIM i AS INTEGER
i = 0
sums(i) = sum(1): i = i + 1
sums(i) = sum(2): i = i + 1
sums(i) = sum(3): i = i + 1
sums(i) = sum2(1): i = i + 1
sums(i) = sum2(2): i = i + 1
sums(i) = sum2(3): i = i + 1
sums(i) = sum3: i = i + 1
sums(i) = sum4

PRINT isLoShuSquare(sums())

Более простой способ проверки массивов:

testvals(1) = sum(1)
testvals(2) = sum(2)
testvals(3) = sum(3)
testvals(4) = sum2(1)
testvals(5) = sum2(2)
testvals(6) = sum2(3)
testvals(7) = sum3
testvals(8) = sum4
FOR i = 1 TO 7
    IF testvals(i) <> testvals(i + 1) THEN
        f = -1
        EXIT FOR
    END IF
NEXT
IF f THEN
    PRINT "This is not a Lo Shu square."
ELSE
    PRINT "This is a Lo Shu square, with all sums equaling"; sum(1)
END IF

Вы также можете закодировать логику в цикл:

DIM testvals(8)
testvals(0) = sum(1)
testvals(1) = sum(2)
testvals(2) = sum(3)
testvals(3) = sum2(1)
testvals(4) = sum2(2)
testvals(5) = sum2(3)
testvals(6) = sum3
testvals(7) = sum4
DO 
    FOR i = 1+LBOUND(testvals) TO UBOUND(testvals)
        IF testvals(i-1) <> testvals(i) THEN
            PRINT "This is not a Lo Shu square."
            EXIT DO
        END IF
    NEXT
    PRINT "This is a Lo Shu square, with all sums equaling"; sum(1)
LOOP WHILE 1 = 0

Это имеет несколько преимуществ:

  1. Проще заметить опечатку, если вы измените код.
  2. Вы всегда можете добавлять и удалять значения теста в подобных случаях. В этом случае нет необходимости делать это, но в некоторых других случаях может быть полезно просто набрать testvals(8) = value и изменить 8 к 9 в DIM линия.
  3. Он замыкает сравнение, то есть, если первое условие ложно, он прекращает проверку и говорит, что это не площадь Ло Шу, похожая на башню IF-THEN-ELSE заявления (где каждый ELSE является PRINT "This is not a Lo Shu square.") QB64 AND Оператор оценивает оба операнда, даже если первый операнд равен 0 или другому "ложному" значению. Это может быть намного быстрее, хотя вы, вероятно, не заметите разницу в этом случае.

С другой стороны, у него есть некоторые недостатки:

  1. Это необычный шаблон в QB64, чтобы не использовать AND в таком случае На самом деле, это одна из очень веских причин, почему AND существует.
  2. Вы можете также легко удалить тестовые значения, которые объединены с помощью AND без необходимости перенумеровать элементы в testvals массив или изменить его размеры.
  3. Даже если у вас много тестовых значений, часто лучше написать небольшую программу, которая генерирует IF a AND b AND c AND ... THEN ... END IF заблокировать себя (или что-то похожее на ваш IF-THEN башня, чтобы сохранить поведение при коротком замыкании) и вставьте вывод в код вашей программы, где это необходимо.

Другой способ проверить массив в цикле в функции:

DIM sums(8) AS DOUBLE
sums(1) = sum(1)
sums(2) = sum(2)
sums(3) = sum(3)
sums(4) = sum2(1)
sums(5) = sum2(2)
sums(6) = sum2(3)
sums(7) = sum3
sums(8) = sum4
IF isLoShuSquare(sums()) = 0 THEN
    PRINT "This is not a Lo Shu square."
ELSE
    PRINT "This is a Lo Shu square, with all sums equaling"; sum(1)
END IF
END
FUNCTION isLoShuSquare (sums() AS DOUBLE)
isLoShuSquare = -1
FOR i = 1 TO UBOUND(sums) - 1
    IF sums(i) <> sums(i + 1) THEN
        isLoShuSquare = 0
        EXIT FUNCTION
    END IF
NEXT
END FUNCTION
Другие вопросы по тегам