Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatics.doc
Скачиваний:
6
Добавлен:
21.08.2019
Размер:
1.33 Mб
Скачать

If I and jb then

w = w + P(j): price = price + S(j)

END IF

IF (w <= m) AND (price > max) THEN

max = price: k = i 'запомнили лучший вариант

END IF

NEXT : z = "" 'перебор закончен

FOR j = 1 TO n 'формирование разрядов байта

IF j = 1 THEN jb = 1 ELSE jb = 2 * jb

IF jb AND k THEN z = z + "1" ELSE z = z + "0"

NEXT: PRINT max; z

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

мальная стоимость грузов 30 у. е., z = 1 0 1 0 1 0 1 (т. е. уложены 1, 3, 5 и 7-й грузы общим весом 39 ).

Пример 7. Рассмотрим еще пример, где использование массивов играет вспомогательную роль. Пусть введено некоторое натуральное число n, а затем еще n произвольных натуральных чисел a1 , a2 , … , an . Требуется вычислить сумму S = … . Ка-ждая отдельная сумма, естественно, вычисляется с помощью цикла FOR … NEXT, но количество таких циклов заранее неизвестно. На по-мощь приходит предыдущий пример: массив А(1 to n) можно рассма-тривать как большую разрядную сетку, которую можно постепенно за-

полнять с "младших разрядов". Приведем пример программы.

DEFINT A, I-N, P : DEFSNG R-S

Input n

DIM A(1 TO n), P(1 TO n)

FOR i = 1 TO n : INPUT A(i) : P(i) = 1

NEXT: s = 1 / n 'подготовка информации

DO : pi = 0 'признак окончания работы

FOR i = n TO 1 STEP -1

IF P(i) < A(i) THEN

P(i) = P(i) + 1: r = 0 'заполнение разрядов

FOR j = 1 TO n: IF j > i THEN P(j) = 1

r = r + P(j) 'знаменатель дроби

NEXT

s = s + 1 / r : pi = 1 : EXIT FOR

END IF

NEXT

LOOP WHILE pi : PRINT s

1.10. Функции, подпрограммы

Стандартное определение функции и подпрограммы следует

схеме

заголовок

конец

функция

FUNCTION ‹ имя ›

END FUNCTION

подпрограмма

SUB ‹ имя ›

END SUB

Подпрограмма может быть вызвана по имени в любом месте програм-мы (обычно) с помощью оператора CALL. Функция также является подпрограммой, возвращающей через свое имя вычисленное значение, имя функции (вместе со списком параметров) как обычный идентифи-катор используется во всех конструкциях обработки информации. В теле функции должен быть хоть один оператор присваивания имени (как идентификатору) возвращаемого значения. Если функциональное отношение может быть выражено одним арифметическим оператором,

функция может быть определена с помощью предложения

DEF FN ‹ имя › (‹ параметры ›) = ‹ арифметическое выражение ›.

В этом случае функция используется в программе с необходимой при-

ставкой FN.

Пример 1. Рассмотрим задачу: в массиве А n действительных чисел выбрать те, которые больше двух ближайших соседей. Для этого определим функцию MAX(x,y,z), находящую наибольшее из чисел x,

y, z. Очевидно, max(a, b) = 0.5(a + b + |a - b|), поэтому запишем:

DEF FNF(a, b) = 0.5 * (a + b + ABS(a - b))

DEF FNMAX(x, y, z) = FNF(x, FNF(y, z)) : 'функция определена

FOR i = 2 TO n - 1

IF FNMAX(A(i-1), A(i), A(i + 1)) = A(i) THEN

PRINT "i =" ; i ; ": A(i) = " ; A(i)

END IF

NEXT

Пример 2. Необходимо на промежутке [-2, 3] с шагом 0.5 вы-числить значения функции f(x) = exp ,

где [ ∙ ] – целая часть числа. Можно заметить, что здесь каждая дробь без учета знака и корней знаменателя отличается от предыдущей мно-жителем , знаменатель которого меняется в девять раз. Поэтому

функцию можно вычислить программой:

FUNCTION F(x AS SINGLE) 'определение функции

DIM r AS DOUBLE, sq3 AS DOUBLE, sum AS DOUBLE, q AS DOUBLE

DIM m AS DOUBLE, x2 AS SINGLE, sqn AS DOUBLE, n AS INTEGER

DIM k AS INTEGER

CONST eps = 1E-6

sq3 = SQR(3): q = 1: r = x: x2 = x * x: m = 3: sum = x / sq3

WHILE ABS(q) > eps

n = n + 1: sqn = SQR(n): r = r * x2 * sqn / m: m = 9 * m

IF INT(sqn) MOD 2 THEN k = -1 ELSE k = 1

q = k * r / SQR(3 – sq3): sum = sum + q: sq3 = SQR(3 + sq3)

WEND: F = EXP(sum)

END FUNCTION

DEFINT I: DEFSNG X-Y 'основная программа

FOR i = 0 TO 10

x = 0.5 * i – 2: y = F(x): PRINT x, y

NEXT

Пример 3. Составим программу вычисления экспоненты матрицы -А размера nn по формуле EXP(-A) = . Вычисления сле-дует проводить до тех пор, пока наибольший по модулю элемент оче-редного слагаемого не станет меньше ерs. Поскольку n-е слагаемое в сумме отличается от предыдущего на множитель (-А)/n , то нам нуж-на подпрограмма умножения матрицы на этот множитель, подпрог-рамма сложения матриц и функция, возвращающая наибольшую абсо-

лютную величину элементов матрицы. Определим

FUNCTION NORM(n AS INTEGER, P() AS SINGLE)

DEFINT I-M : DEFSNG Q-S : s = 0

FOR i = 1 TO n : FOR j = 1 TO n : r = ABS(P(i, j))

IF r > s THEN s = r

NEXT : NEXT

NORM= s

END FUNCTION 'вычисление нормы матрицы

SUB MULMA(n AS INTEGER, m AS INTEGER, P() AS SINGLE, Q() AS SINGLE)

DEFINT I-K : DEFSNG s : DIM C(1 TO n, 1 TO n) AS SINGLE

FOR i = 1 TO n : FOR j = 1 TO n : s = 0

FOR k = 1 TO n : s = s - P(i, k) * Q(k, j) : NEXT

C(i, j) = s

NEXT : NEXT

FOR i = 1 TO n ; FOR j = 1 TO n : Q(i, j) = C(i, j) / m

NEXT : NEXT

END SUB 'умножение матриц

SUB SUM(n AS INTEGER, P() AS SINGLE, Q() AS SINGLE)

DEFINT I-J

FOR i = 1 TO n : FOR j = 1 TO n : Q(i, j) = Q(i, j) + P(i, j)

NEXT : NEXT

END SUB 'сложение матриц

Тогда программа вычисления экспоненты матрицы -А с точностью

0.0001 будет выглядеть следующим образом:

DEFINT I-N

DIM E(1 TO n, 1 TO n) AS SINGLE

DIM S(1 TO n, 1 TO n) AS SINGLE

FOR i = 1 TO n : FOR j = 1 TO n

IF i = j THEN E(i, j) = 1 ELSE E(i, j) = 0

S(i, j) = E(i, j) 'единичная матрица

NEXT : NEXT : m = 0

WHILE NORM(n, E()) > 0.0001 : m = m + 1

CALL MULMA(n, m, A(), E())

CALL SUM(n, E(), S())

WEND 'матрица S содержит искомый результат.

Параметры подпрограммы (и функции) по сути своей являются фор-

мальными, поэтому при определении полезно явно указывать их тип,

идентификаторы массивов при этом снабжаются пустыми скобками. При вызове функции или подпрограммы формальные параметры заме-няются фактическими (см. предыдущий пример). Если подпрограммы введены с помощью оператора DECLARE, то они могут быть вызваны по имени без оператора CALL, в этом случае параметры подпрограм-мы не заключаются в скобки.

В некоторых случаях нет необходимости в настройке формаль-ных параметров подпрограммы (функции), если она работает с одними и теми же фактическими параметрами. Тогда их (т.е. параметры) мож-но не включать в определение подпрограммы, а сама подпрограмма может стать частью основной программы с помеченной строкой входа. Сама подпрограмма при этом должна заканчиваться оператором RETURN, возвращающим управление в главную программу, а обраще-ние к ней выполняется оператором GOSUB ‹ метка ›. Такие подпрог-раммы удобно размещать в конце кодовой части программы, при этом основная часть программы должна заканчиваться оператором END. В частности, задание примера 2 можно выполнить с помощью програм-

мы:

DEFINT I, K, N: DEFSNG X-Y: DEFDBL Q-S 'основная программа

CONST eps = 1E-6

FOR i = 0 TO 10

x = 0.5 * i – 2: GOSUB F

PRINT x, y

NEXT: END 'конец программы

F: 'метка входа в подпрограмму (функцию)

sq3 = SQR(3): q = 1: r = x: x2 = x * x: m = 3: sum = x / sq3

WHILE ABS(q) > eps

n = n + 1: sqn = SQR(n): r = r * x2 * sqn / m: m = 9 * m

IF INT(sqn) MOD 2 THEN k = -1 ELSE k = 1

q = k * r / SQR(3 – sq3): sum = sum + q: sq3 = SQR(3 + sq3)

WEND: y = EXP(sum)

RETURN 'выход из подпрограммы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]