Среди элементов найти максимальный по абсолютной величине

findering

Здравствуйте, помогите пожалуйста написать программу, у самого не получается. Дан массив из 20 элементов. Среди элементов, лежащих вне заданного интервала, найти максимальный по абсолютной величине. Если этот элемент окажется меньше первого, то вычислить сумму элементов, расположенных после максимального, в противном случае вычислить произведение. Результаты представить в виде: Массив... Номер максимального элемента... Сумма(произведение)... Заранее спасибо.вот, что у меня получилось, но все равно не работает
CLS
INPUT n
DIM a(1 TO n), b(1 TO n)
FOR i = 1 TO n
    PRINT "a("; i; ")=";
    INPUT "", a(i)
NEXT i
max = a(1)
FOR i = 2 TO n
    IF a(i) > max THEN
        max = ABS(a(i)): imax = i
    END IF
NEXT i
IF max < a(1) THEN
    s = s + a(1)
    k = k + 1
ELSEIF max > a(1) THEN
    p = p * a(1)
    k = k + 1
END IF
PRINT USING "###.###|###.###|"; a(i), b(i), c(i)
PRINT "imax="; i, "s="; s, "p="; p
END
14 ответов

findering

max = a(1)
FOR i = 2 TO n
    IF a(i) > max THEN
        max = ABS(a(i)): imax = i
    END IF
NEXT i
Должно быть, здесь ошибка. max, по всей видимости, нужно задать как модуль а(1). И сравнивать, Вы говорили, нужно по модулю:
 IF ABS(a(i)) > max THEN
Если все равно работать не будет - посмотрим дальше.


findering

Поменял,все равно,когда начинаю вводить значения,то на 6-9 вводе выскакивает ошибка: line 21 subscript out of range continue?


findering

Тогда ясно. После выполнения цикла:
FOR i=1 TO 20
NEXT i
i будет равен не 20, а 21. Здесь лучше задавать индекс вручную. По всей видимости, использовать индекс imax.


findering

Ошибка исчезла,все вводится,но появляеся другая проблема:b(i),c(i),s и р равняются нулю и только a(i) и imax имеют значения


findering

Дело в том, что переменные s, k, p до их последнего вычисления нигде не упоминались. При первой упоминании переменная равна нулю. Можете сказать, какие данные Вы вводите в программу?


findering

Если я правильно понял вопрос,то в программу я ввожу только данные массива.


findering

Я имел в виду, какие именно вы вводите данные. Т.е., например:
0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19
Хотя я так подумал... Наверно это не особо важно. Как я вижу, ошибка сейчас кроется в строках
IF max < a(1) THEN
    s = s + a(1)
    k = k + 1
ELSEIF max > a(1) THEN
    p = p * a(1)
    k = k + 1
END IF
Здесь явно не хватает циклов. Ведь в условии написано, что нужно складывать (умножать) много элементов массива.


findering

В этом вся и проблема,я не знаю как это записать


findering

PRINT USING "###.###|###.###|"; a(i), b(i), c(i)
Вы нигде не определяли массив "с" (речь о проге из первого поста)Но строка 21: Вы пытаетесь вывести элементы этого массива.По умолчанию (т.е. без определения через "Dim") можно вводить и выводить только 10 элементов массива. Как только Вы строкой 21 пытаетесь вывести массив "с" за пределами 10-го элемента, то будет происходить ошибка
subscript out of range
И само задание какое-то не очень понятное.Я его так воспринимаю:
  1. Вводим с клавиатуры 20 элеменов;
  2. Вводим две переменные: начало и конец интервала (номера элементов);
  3. Теперь, определяем какие из них вне интервала: элементы до начального и после конечного;
  4. Из них определяем: модуль какого элемента больше всех, и запоминаем его номер;
  5. Сравниваем этот элемент с первым (только непонятно само число или его модуль);
  6. Если элемент с этим номером меньше значения первого, то вычисляем сумму элементов, расположенных после этого элемента.
  7. Если элемент с этим номером НЕ меньше значения первого, то вычисляем произведение элементов, расположенных после этого элемента.
Если не так, то прошу поправить.


findering

только непонятно само число или его модуль
По всей видимости, сравнивать нам предлагают именно число, т.к. модуль не может быть меньше первого элемента (за исключением случаев, когда первый элемент попадает в интервал исключения). Плюс к тому, так и было бы написано:
...если модуль этого элемента больше...
,однако, такового мы не наблюдаем.


findering

т.к. модуль не может быть меньше первого элемента (за исключением случаев, когда первый элемент попадает в интервал исключения)
Согласен. Значит надо сравнивать число, а в остальном вроде бы мое описание соответствует заданию.


findering

Я,если честно,плохо понимаю,что от меня требуется.Понял только,что надо убрать c(i).Так что конкретно мне надо написать,чтобы все заработало нормально?


findering

Так что конкретно мне надо написать
Лично я слабо понимаю вообще назначение строки
PRINT USING "###.###|###.###|"; a(i), b(i), c(i)
Хотя... В общем: при условии (указанном) запускаем цикл FOR/NEXT. Исходя из условия, его оболочка такая:
FOR i=imax TO 20
NEXT i
"Начинка" - постепенное увеличение рабочей переменной, например:
s=s+a(i)
Или, во втором случае:
s=s*a(i)
но для второго где-нибудь до цикла (но после условия) приравнять s=1. Вроде все.


findering

Вот то, что должно соответствовать моему пониманию пост №10:Данные вводятся через генератор случайных чисел, но ручной ввод тоже есть. Активен генератор, если нужен ручной ввод, то:
  1. Нужно убрать строки с 4 по 10
  2. В строках с 14 по 18 убрать апострофы в начале строки
Если нужно оставить генератор случайных чисел, то: Нужно убрать строки с 11 по 18.
CLS
n = 20: ct = 7: cv = 14
DIM a(1 TO n)
'
'Ввод матрицы через ГСЧ
'
RANDOMIZE (TIMER)
FOR i = 1 TO n
    a(i) = RND * 100 - 50
NEXT i
'
'Ввод матрицы ВРУЧНУЮ
'
'PRINT "Введите массив элементов:": PRINT
'FOR i = 1 TO n
'    PRINT "a("; i; ") = ";
'    INPUT "", a(i)
'NEXT i: PRINT
'
' Определяем интервал
'
DO
  COLOR ct
  PRINT "Введите начало интервала "; : COLOR cv: PRINT USING "&###"; " от  1 до "; n;
  COLOR ct: PRINT " = ";
  INPUT "", n1
  IF n1 = 0 THEN PRINT "Программа завершена": END
LOOP UNTIL (n1 >= 1) AND (n1 <= 20)
DO
  PRINT "Введите конец  интервала "; : COLOR cv: PRINT USING "&###"; " от"; n1; " до "; n;
  COLOR ct: PRINT " = ";
  INPUT "", n2
  IF n2 = 0 THEN PRINT "Программа завершена": END
LOOP UNTIL (n2 >= n1) AND (n2 <= 20)
'
' Выводим исходный массив
'
CLS
PRINT "Задан интервал от "; : COLOR cv: PRINT n1;
COLOR ct: PRINT " до "; : COLOR cv: PRINT n2: COLOR ct
PRINT "Исходный массив:": PRINT
FOR i = 1 TO n
   PRINT USING "######.####   |"; a(i);
   IF (i MOD 5) = 0 THEN PRINT
NEXT i
'
'Проверяем наличие элементов вне интервала
'
IF (n1 = 1) AND (n2 = n) THEN
   COLOR 12: PRINT
   PRINT "Чисел вне диапазона НЕТ - Искать максимум негде": COLOR ct: END
END IF
'
'Ищем максимум в первом интервале, если он есть
'
IF n1 > 1 THEN
 max = a(1): imax = 1
    FOR i = 1 TO n1 - 1
       IF ABS(a(i)) > ABS(max) THEN
          max = a(i): imax = i
       END IF
    NEXT i
END IF
'
'Ищем максимум во втором интервале, если он есть
'
IF n2 < 20 THEN
 IF n1 = 1 THEN max = a(n2 + 1): imax = n2 + 1
    FOR i = n2 + 1 TO n
       IF ABS(a(i)) > ABS(max) THEN
          max = a(i): imax = i
       END IF
    NEXT i
END IF
 
'
'Сравниваем максимум с первым элементом и вычисляем, если есть что
'
PRINT
IF imax < n THEN
 PRINT "Максимальный по модулю элемент вне интервала = ";
 PRINT USING "#####.####&###"; max; "   его номер = "; imax
 PRINT "Количество элементов после максимального: "; n - imax
 IF max < a(1) THEN
    S = 0
    FOR i = imax + 1 TO n
     S = S + a(i)
    NEXT i
    PRINT "Сумма элементов после максимального = "; S
               ELSE
    P = 1
    FOR i = imax + 1 TO n
     P = P * a(i)
    NEXT i
    PRINT "Произведение элементов после максимального = "; P
 END IF
            ELSE
    PRINT "Максимальным по модулю вне диапазона является последний элемент - Считать нечего"
END IF
END
При вводе интервала начала и конца: если нажать или ввести 0, то прога завершится.Пока вробе бы все. Погоняйте, отпишитесь.