- •Bведение
- •1. Основы языка Basic
- •1.1. Основные структуры
- •1.2. Операторы ввода, вывода, позиционирования
- •1.3. Числа
- •1.4. Строки
- •1.5. Операторы def, dim, пользовательский тип
- •1.6. Разветвление и альтернатива
- •1.7. Циклы
- •If k then print "пароль принят" else print "ошибка пароля"
- •Input "Введите произвольный текст : ", txt
- •Input X
- •1.8. Программные стэки
- •1.9. Массивы
- •If I and jb then
- •Input n
- •1.10. Функции, подпрограммы
- •1.11. Файлы
- •1.12. Сегментирование программы
- •Input n
- •1.13. Работа с графической информацией
- •If nu then gosub Move 'перемещение рисунка
- •1.14. Звуковое воспроизведение
- •2. Элементы vba
- •2.1. Типы переменных
- •2.2. Использование массивов
- •2.3. Разветвление и циклы
- •2.4. Работа с ячейками листа
- •If y X Then
- •If Check Then
- •2.5. Элементы управления
- •If X 0 Then
- •2.6. Пользовательские классы
- •If IsEmpty(Text2) Then Exit Sub
- •2.7. Построение графиков в excel
- •2.8. Построение графиков и таблиц в word
- •3. Ключи в word
- •4. Гипертекстовая разметка
- •4.1. Основные тэги html
- •4.2. Форматирование таблиц
- •4.3. Фреймы
- •5. Основы программирования в среде MathCad
- •5.1. Особенности языка MathCad
- •5.2. Некоторые вычислительные модели
- •5.2.1. Системы уравнений
- •5.2.1.1. Системы линейных уравнений
- •Iter(a, b, e) n Last (b)
- •5.2.1.2. Нелинейные уравнения и системы
- •5.2.2. Определенный интеграл
- •5.2.3. Функции на дискретном множестве
- •5.2.4. Обыкновенные дифференциальные уравнения
- •5.2.5. Минимизация функций
- •5.2.5.1. Функции одной переменной
- •5.2.5.2. Функции многих переменных
- •5.2.6. Pазностная модель и прогноз
- •1 Otherwise (коэффициенты непрерывной модели)
- •5.2.7. Сглаживание и осреднение рядов
- •Задания
- •Литература
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. Составим программу вычисления экспоненты матрицы -А размера nn по формуле 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 'выход из подпрограммы