Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Учебник Информатики

.pdf
Скачиваний:
54
Добавлен:
23.02.2015
Размер:
560.16 Кб
Скачать

 

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