Учебник Информатики
.pdf
|
CONST nm = 20 |
b = b0 |
|
|
|
||
|
DIM X(1 TO nm) AS SINGLE |
FOR i = 1 TO nm |
|
|
PRINT "Введите b0 и h" |
z = (a + 2 * b + 3 * X(i)) / 6 |
|
|
INPUT b0, h |
PRINT z |
|
|
PRINT "Введите элементы массива" |
a = a + .2 |
|
|
FOR i = 1 TO nm |
b = b + h |
|
|
INPUT X(i) |
NEXT i |
|
|
NEXT i |
END |
|
|
a = 0 |
|
|
|
|
|
|
|
|
|
|
Рис. 10. Программа вычисления функции z
Запоминание результатов
Если результат вычисляется как набор значений простой переменной, то эти значения последовательно заносятся в выделенное поле памяти. Поэтому в памяти ЭВМ после окончания цикла останется лишь последнее вычисленное значение. Для сохранения всех полученных значений необходимо выделить массив для результатов, описав его в операторе DIM, а вычисляемые значения присваивать элементам этого массива.
Пример 6. Составить программу записи подряд в массив Y положительных, а в массив Z отрицательных элементов массива X, состоящего из 100 элементов.
Программа записи положительных и отрицательных элементов массива X в массивы Y и Z показана на рис. 11. Особенность её состоит в том, что элементы, записываемые в массивы Y и Z, должны располагаться подряд без пропусков. Это приводит к тому, что индексы переменных Yky и Zkz принимают значения, отличные от значений индексов переменной Xi.
41
|
CONST nm = 100 |
IF X(i) < 0 THEN |
|
|
|
||
|
OPTION BASE 1 |
kz = kz + 1 |
|
|
DIM X(nm), Y(nm), Z(nm) |
Z(kz) = X(i) |
|
|
PRINT "Введите элементы массива" |
END IF |
|
|
FOR i = 1 TO nm |
NEXT i |
|
|
INPUT X(i) |
PRINT "Массив Y" |
|
|
NEXT i |
FOR i = 1 TO ky |
|
|
ky = 0 |
PRINT Y(i) |
|
|
kz = 0 |
NEXT i |
|
|
FOR i = 1 TO nm |
PRINT "Массив Z" |
|
|
IF X(i) > 0 THEN |
FOR i = 1 TO kz |
|
|
ky = ky + 1 |
PRINT Z(i) |
|
|
Y(ky) = X(i) |
NEXT i |
|
|
END IF |
END |
|
|
|
|
|
|
|
|
|
Рис. 11. Программа записи в массив Y положительных, а в массив Z
отрицательных элементов массива X
Вычисление суммы
При вычислении суммы используется приём накопления в цикле по рекуррентной формуле, реализуемой с помощью оператора присваивания
s = s + y,
где s – накапливаемая сумма (слева – текущая, справа – предыдущая), y – слагаемое. Из данной формулы следует, что каждое новое значение суммы получается добавлением слагаемого к предыдущей сумме. После первого выполнения цикла сумма должна равняться значению первого слагаемого, поэтому перед циклом необходимо задать начальное значение суммы, равное нулю: s = 0.
42
Вычисление произведения
При вычислении произведения также используется приём накопления в цикле по рекуррентной формуле, реализуемой с помощью оператора присваивания
p = p * y,
где p – накапливаемое произведение (слева – текущее, справа – предыдущее), y – сомножитель. Начальное значение произведения, задаваемое перед циклом, выбирается равным единице: p = 1.
Пример 7. Составить программу вычисления среднего геометрического положительных элементов массива Z, содержащего 50 элементов; считать, что хотя бы один положительный элемент в массиве Z есть.
Программа вычисления среднего геометрического положительных элементов массива показана на рис. 12.
|
CONST nm = 50 |
IF Z(i) > 0 THEN |
|
|
|
||
|
DIM Z(1 TO nm) AS SINGLE |
k = k + 1 |
|
|
PRINT "Введите элементы массива" |
p = p * Z(i) |
|
|
FOR i = 1 TO nm |
END IF |
|
|
INPUT Z(i) |
NEXT i |
|
|
NEXT i |
sg = p ^ (1 / k) |
|
|
p = 1 |
PRINT "Среднее геометрическое"; sg |
|
|
k = 0 |
END |
|
|
FOR i = 1 TO nm |
|
|
|
|
|
|
|
|
|
|
Рис. 12. Программа вычисления среднего геометрического положительных элементов массива
Нахождение наибольшего значения
Нахождение наибольшего значения осуществляется в цикле путём сравнения некоторого текущего значения с наибольшим из всех предыдущих. При
43
этом, если текущее значение больше наибольшего из всех предыдущих, то оно присваивается наибольшему значению. В противном случае наибольшее сохраняет своё прежнее значение.
Математически это означает, что внутри цикла реализуется формула:
ymax |
y |
, |
если y |
|
> y |
max , |
|
= |
i |
|
|
i |
|
||
|
ymax , |
если yi |
≤ ymax |
где ymax – наибольшее из всех предыдущих значений, yi – текущее значение. По окончании цикла ymax будет наибольшим из всех рассмотренных зна-
чений. Для корректности работы программы перед циклом в качестве начального значения наибольшего задаётся заведомо малое число, например -1030 (на языке QBasic – -1E30). Программная реализация вышесказанного осуществляется с использованием операторов присваивания и условного.
Если требуется найти наибольший элемент в массиве, то в качестве начального значения наибольшего целесообразно взять значение первого элемента массива.
Пример 8. Составить программу нахождения наибольшего значения функции y = |a| exp(ax - x2) при изменении аргумента x от 0 до a с шагом 0,1.
Программа нахождения наибольшего значения функции y показана на рис. 13.
|
INPUT "Введите a"; a |
IF y > ymax THEN ymax = y |
|
|
|
||
|
ymax = -1E30 |
x = x + .1 |
|
|
x = 0 |
LOOP |
|
|
DO WHILE x <= a |
PRINT "ymax = "; ymax |
|
|
y = ABS(a) * EXP(a * x - x ^ 2) |
END |
|
|
|
|
|
|
|
|
|
Рис. 13. Программа нахождения наибольшего значения функции
44
Нахождение наименьшего значения
Нахождение наименьшего значения аналогично нахождению наибольшего. Для корректности работы программы перед циклом в качестве начального значения наименьшего задаётся заведомо большое число, например 1030 (на языке QBasic – 1E30), а для нахождения наименьшего в цикле используется формула:
ymin |
y |
, |
если y |
|
< y |
min , |
|
= |
i |
|
|
i |
|
||
|
ymin , |
если yi |
≥ ymin |
где ymin – наименьшее из всех предыдущих значений, yi – текущее значение. Если требуется найти наименьший элемент в массиве, то в качестве на-
чального значения наименьшего целесообразно взять значение первого элемента массива, а поиск наименьшего осуществить в цикле обычным образом.
Пример 9. Составить программу нахождения наименьшего элемента массива X и его порядкового номера; считать, что массив состоит из 100 элементов.
Программа нахождения наименьшего элемента массива X и его порядкового номера показана на рис. 14.
|
CONST nm = 100 |
imin = 1 |
|
|
|
||
|
DIM X(1 TO nm) AS SINGLE |
FOR i = 1 TO nm |
|
|
PRINT "Введите элементы массива" |
IF X(i) < xmin THEN xmin = X(i) : imin = i |
|
|
FOR i = 1 TO nm |
NEXT i |
|
|
INPUT X(i) |
PRINT "xmin = "; xmin; " imin = "; imin |
|
|
NEXT i |
END |
|
|
xmin = X(1) |
|
|
|
|
|
|
|
|
|
|
Рис. 14. Программа нахождения наименьшего элемента массива и его порядкового номера
45
Программирование с использованием функций и процедур
Введение
До сих пор мы имели дело с предопределёнными заранее (стандартными) функциями и процедурами. Они доступны любой программе. Если не оговорено особо, то функции и процедуры будем называть одним словом – «подпрограммы». Наряду с возможностью использования уже готовых подпрограмм в QBasic предусмотрена возможность создания своих собственных функций и процедур.
Подпрограммы представляют собой самостоятельные фрагменты программ, оформленные особым образом и снабжённые идентификаторами. Обращение к подпрограмме (её вызов) осуществляется с помощью этого идентификатора. Подпрограммы представляют собой инструмент, с помощью которого любая программа может быть разбита на ряд в известной степени не зависимых друг от друга частей.
Подпрограммы в QBasic отделены от основной программы. Они могут иметь свои собственные (локальные) параметры, которые не зависят от параметров основной программы или других подпрограмм. Для создания и редактирования подпрограмм используется отдельное окно, которое можно открыть по команде меню Редактирование / Новая SUB... (или Новая FUNCTION...). В
дальнейшем к подпрограммам можно переходить по команде меню Просмотр / SUBs... или нажатием функциональной клавиши F2.
Объявление подпрограмм
Функция
Подпрограмма-функция представляет собой группу операторов, в результате выполнения которых вычисляется одно скалярное значение, присваивае-
46
мое идентификатору функции. Поэтому в теле функции её идентификатору хотя бы один раз должно быть присвоено некоторое значение. Заголовок функции состоит из ключевого слова FUNCTION, за которым следует идентификатор, а далее в круглых скобках – список формальных параметров, если они есть. Для функции обязательно также указывается тип возвращаемого параметра с помощью одного из специальных символов (%, &, !, #, $).
Обращение к функции можно использовать в соответствующих выражениях наряду с переменными и константами.
Общая структура функции имеет примерно такой вид:
FUNCTION f [(список формальных параметров)] [блок операторов]
f = выражение [блок операторов] END FUNCTION,
где f – идентификатор функции.
Чтобы объявить новую функцию, надо выполнить команду меню Редактирование / Новая FUNCTION... и указать идентификатор функции. После этих действий интерпретатор QBasic создаст в текущей программе новую функцию с указанным идентификатором. В новом окне редактора будут автоматически созданы две строки
FUNCTION идентификатор
END FUNCTION,
между которыми должны размещаться операторы, реализующие требуемый алгоритм.
В списке формальных параметров типы параметров указываются либо с помощью заключительного специального символа, либо с помощью ключевого слова AS. При использовании в качестве формального параметра массива указывается его идентификатор и пустые круглые скобки (например, A%()). Дос-
47
рочный выход из подпрограммы-функции осуществляется с использованием стандартной процедуры EXIT FUNCTION.
Для вызова функции в выражении, где необходимо использовать её значение, следует указать идентификатор функции со списком фактических параметров. При использовании в качестве фактического параметра массива также указывается его идентификатор и пустые круглые скобки. Фактические параметры должны совпадать по количеству, порядку следования и типам с формальными параметрами функции.
При сохранении файла, содержащего подпрограмму-функцию, QBasic автоматически добавляет в начало основной программы оператор
DECLARE FUNCTION f [(список формальных параметров)],
где f – идентификатор функции. Этот оператор сообщает, что программа содержит функцию и выполняет проверку её параметров (аргументов) на соответствие типов.
Пример 10. Составить программу вычисления суммы положительных элементов, расположенных на главной диагонали квадратной матрицы B разме-
рами 20 × 20. Нахождение указанной суммы оформить в виде подпрограммыфункции.
Программа вычисления суммы положительных элементов главной диагонали квадратной матрицы показана на рис. 15.
Процедура
Подпрограмма-процедура предназначена для выполнения некоторой законченной последовательности действий. Результатом её выполнения является получение одного или нескольких значений, которые передаются в основную программу как значения параметров процедуры.
Процедура объявляется способом аналогичным способу объявления функции, а именно выполнением команды меню Редактирование / Новая SUB..., после чего указывается её идентификатор без заключительного специ-
48
ального символа. После этих действий в новом окне редактора будут автоматически созданы две строки
SUB идентификатор
END SUB,
между которыми должны размещаться операторы, реализующие требуемый алгоритм.
|
DECLARE FUNCTION f! (B!(), n!) |
PRINT "Сумма = "; sd |
|
|
|
||
|
CONST nm = 20 |
END |
|
|
OPTION BASE 1 |
|
|
|
DIM B(nm, nm) |
FUNCTION f (B(), n) |
|
|
PRINT "Введите элементы матрицы" |
s = 0 |
|
|
FOR i = 1 TO nm |
FOR i = 1 TO n |
|
|
FOR j = 1 TO nm |
IF B(i, i) > 0 THEN s = s + B(i, i) |
|
|
INPUT B(i, j) |
NEXT i |
|
|
NEXT j |
f = s |
|
|
NEXT i |
END FUNCTION |
|
|
sd = f(B(), nm) |
|
|
|
|
|
|
|
|
|
|
Рис. 15. Программа вычисления суммы положительных элементов, расположенных на главной диагонали квадратной матрицы
Общая структура процедуры имеет примерно такой вид:
SUB p [(список формальных параметров)] [блок операторов]
END SUB,
где p – идентификатор процедуры. В списке формальных параметров часть параметров могут быть входными, а часть – выходными, т.е. передающими результат в программу.
Для вызова процедуры из основной программы или другой подпрограммы можно воспользоваться одним из двух способов:
49
♦указать оператор CALL, а за ним – идентификатор процедуры со списком фактических параметров (например, CALL abc(b1, b2));
♦указать идентификатор процедуры в начале строки, а за ним список фактических параметров через запятую, но без круглых скобок (на-
пример, abc b1, b2).
Предпочтительным является первый способ.
Список фактических параметров должен совпадать по количеству, порядку следования и типам с формальными параметрами процедуры. Досрочный выход из подпрограммы-процедуры осуществляется с использованием стандартной процедуры EXIT SUB.
Всё остальное – аналогично рассмотренному в разделе «Функция».
Пример 11. Составить программу вычисления сумм отрицательных эле-
ментов каждой строки матрицы C размерами 10 × 15. Нахождение указанных сумм оформить в виде подпрограммы-процедуры.
Программа вычисления сумм отрицательных элементов каждой строки матрицы показана на рис. 16.
|
DECLARE SUB p (C!(), n!, m!, S!()) |
PRINT S(i) |
|
|
|
||
|
CONST nm = 10, mm = 15 |
NEXT i |
|
|
DIM C(1 TO nm, 1 TO mm), S(1 TO nm) |
END |
|
|
PRINT "Введите элементы матрицы" |
|
|
|
FOR i = 1 TO nm |
SUB p (C(), n, m, S()) |
|
|
FOR j = 1 TO mm |
FOR i = 1 TO n |
|
|
INPUT C(i, j) |
S(i) = 0 |
|
|
NEXT j |
FOR j = 1 TO m |
|
|
NEXT i |
IF C(i, j) < 0 THEN S(i) = S(i) + C(i, j) |
|
|
CALL p(C(), nm, mm, S()) |
NEXT j |
|
|
PRINT "Суммы по строкам: " |
NEXT i |
|
|
FOR i = 1 TO nm |
END SUB |
|
|
|
|
|
|
|
|
|
Рис. 16. Программа вычисления сумм отрицательных элементов каждой строки матрицы
50