Печать наименьшего числа из массива с помощью DO UNLIL LOOP - PullRequest
2 голосов
/ 24 апреля 2019

Я пишу программу QBasic, которая получит оценки 10 учеников с помощью цикла DO UNTIL и вычислит самую низкую оценку, но моя программа всегда останавливается, когда я запускаю ее и вводю оценки 10 учеников.

Я перепробовал все, что я знаю, но все равно зависает.

Ниже мой код:

DIM arr(10) AS INTEGER
DIM low AS INTEGER
DIM x AS INTEGER

CLS
x = 0
DO UNTIL x >= 10
    INPUT "Enter Number: ", arr(x)
    x = x + 1
LOOP

low = arr(1)

DO UNTIL x >= 11
    IF arr(x) < low THEN
        low = arr(x)
    END IF
LOOP

CLS 

PRINT "All Marks Are:"
PRINT arr(x); " ";

PRINT
PRINT "The Lowest Number is: "; low

И я ожидаю результатов ниже:

All Marks Are:
54 32 59 43 90 43 12 4 54 35

The Lowest Number is: 4

Ответы [ 5 ]

1 голос
/ 25 апреля 2019

Хорошо, я бы изменил пару вещей в вашем коде.Прежде всего,

DO UNTIL x >= 10
    INPUT "Enter Number: ", arr(x)
    x = x + 1
LOOP

Зачем использовать DO ... LOOP здесь?Я бы выбрал цикл FOR:

FOR x = 1 to 10
  INPUT "Enter Number: ", arr(x)
NEXT

Это более обычный, более короткий код и более понятный код.

Во-вторых, ваш второй DO ... LOOP не может выйти.Да, конечно, он выходит, когда x больше или равен 11, но когда это произойдет?В вашем цикле нет переопределения x, поэтому ваш цикл либо бесконечен (если x начинается меньше 11), либо бессмыслен (если x уже 11 или больше).В этом случае x будет равен 10, поэтому ваш код, как вы описали, зависнет.

Анализ, который вы пытаетесь выполнить, к сожалению, слишком сложен в QBasic, но это возможно.Для ясности, в верхней части вашей программы определите TRUE и FALSE:

CONST TRUE = 1
CONST FALSE = 0

Затем, когда вы дойдете до места, где вы хотите проанализировать наименьшее значение, сделайте что-то вроде этого:

finished% = TRUE 'I start by defining as TRUE and define as FALSE if I find
                 'a value which is smaller than the currently tested value.

CurTest% = 1 'This represents the array element which I am currently testing.
             'It will change only when the program finds a value smaller than
             'the one it is currently testing.

DO
  finished% = TRUE
  FOR i = CurTest% + 1 TO 10
    IF arr(i) < arr(CurTest%) THEN
      finished% = FALSE
      CurTest% = i
      EXIT FOR
    END IF
  NEXT i
LOOP UNTIL finished% = TRUE

'The loop will only complete once it has gone through a complete FOR...NEXT
'without finding a smaller value.

PRINT "The smallest value is:"; arr(CurTest%)

* Примечание: код не проверен;могут быть причуды / ошибки.

Надеюсь, это поможет!

1 голос
/ 29 апреля 2019

Небольшое изменение вашего кода для получения низких результатов в этом:

DIM arr(10) AS INTEGER
DIM low AS INTEGER
DIM x AS INTEGER

CLS
x = 1
DO UNTIL x > 10
    INPUT "Enter Number: ", arr(x)
    x = x + 1
LOOP

low = arr(1)
x = 1
DO UNTIL x > 10
    IF arr(x) < low THEN
        low = arr(x)
    END IF
    x = x + 1
LOOP

CLS
PRINT "All Marks Are:"
FOR x = 1 TO 10
    PRINT arr(x); " ";
NEXT

PRINT
PRINT "The Lowest Number is: "; low
0 голосов
/ 01 мая 2019

Другой образец для определения наивысших / наименьших / средних баллов по любому количеству предметов:

REM determine highest/lowest/average score of any number of items
CLS
PRINT "Number of items";: INPUT n
DIM arr(n) AS SINGLE
FOR x = 1 TO n
    PRINT "Enter Number"; x;: INPUT arr(x)
    IF x = 1 THEN low = arr(x): high = arr(x)
    avg = avg + arr(x)
    IF arr(x) < low THEN
        low = arr(x)
    END IF
    IF arr(x) > high THEN
        high = arr(x)
    END IF
NEXT
PRINT "All Marks Are:"
FOR x = 1 TO n
    PRINT arr(x);
NEXT
PRINT
PRINT "The Highest Number is:"; high
PRINT "The Lowest Number is:"; low
PRINT "The Average of all Scores is:"; avg / n
0 голосов
/ 01 мая 2019

Более эффективный способ определения наименьшего балла из 10 пунктов:

REM determine lowest score of 10 items
CLS
FOR x = 1 TO 10
    PRINT "Enter Number"; x;: INPUT arr(x)
    IF x = 1 THEN low = arr(x)
    IF arr(x) < low THEN
        low = arr(x)
    END IF
NEXT
PRINT "All Marks Are:"
FOR x = 1 TO 10
    PRINT arr(x); " ";
NEXT
PRINT
PRINT "The Lowest Number is: "; low
0 голосов
/ 24 апреля 2019

Возможно, вы захотите установить x обратно на 0 (или использовать другую переменную) перед вашим вторым циклом. Потому что он будет продолжать увеличивать x с того места, где вы остановились с 1-го цикла.

Также могут возникнуть проблемы со 2-м циклом, поскольку ваш массив занимает всего 10 целых чисел, но вы пытаетесь получить доступ к 11-й позиции в массиве.

...