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

regeda_v_v_regeda_o_n_osnovy_programmirovaniya_na_vba

.pdf
Скачиваний:
11
Добавлен:
06.02.2016
Размер:
1.26 Mб
Скачать

функции Α = n x 2 + k 2 при x, изменяющегося от 0 до 5 с шагом 0.5 и для

k =1

любого значения n:

INPUT “Введите значение n”; n FOR x=0 TO 5 STEP 0.5

A=1

FOR k=1 TO n A=A*SQR(x^2+k^2) NEXT k

PRINT A

NEXT x

Обратите внимание, что вычисление произведения организуется в теле цикла путем последовательного перебора и умножения отдельных сомножителей A=A*f(x,k). При этом первое произведение получается путем умножения первого сомножителя на единицу (А=1). Если необходимо

организовать вычисление суммы, Α = n f ( x , k ) , то в теле цикла необходи-

k =1

мо последовательно перебирать и складывать отдельные слагаемые по формуле A=A+f(x,k). При этом первая сумма получается путем сложения первого слагаемого с нулем, т.е. перед внутренним циклом необходимо присвоить А значение, равное нулю.

Если несколько циклов имеют общий конечный оператор, можно указать для них один оператор NEXT, перечислив в нем переменные циклов в порядке, обратном порядку операторов FOR.

2.7.2. Циклы с неопределенным количеством повторений позволяет задавать конструкция WHILE/WEND, в которой указывается условие продолжения цикла:

WHILE x

...[операторы]

WEND

где x числовое выражение.

Цикл повторяется до тех пор, пока выражение x не станет равным нулю. При x=0 операторы до WEND включительно пропускаются, и программа выполняется дальше.

Например, для алгоритма рис. 2.3 будет иметь следующий вид:

WHILE x<20 y=sin(x) PRINT y x=x+2

WEND

Циклы могут быть вложенными. Всякий оператор WEND относится

кближайшему оператору WHILE.

2.7.3.Наиболее общая форма организации циклов с помощью оператора DO/LOOP позволяет проверять условие окончания цикла в начале или

в конце цикла.

DO {WHILE | UNTIL} x

...

...[операторы]

...

WEND

или

DO

...

...[операторы]

...

LOOP {UNTIL | WHILE} x

где x числовое выражение.

Если условие продолжения цикла проверяется в конце цикла, то последним оператором этой конструкции должен быть оператор LOOP, если же условие продолжения цикла проверяется в конце цикла, то последним оператором этой конструкции должен быть оператор LOOP. При использовании ключевого слова WHILE цикл повторяется, пока выражение x истинно (не равно нулю) и завершается, когда оно равно нулю. При использовании ключевого слова UNTIL, наоборот, цикл завершается, когда x не равно нулю, и повторяется, если x равно нулю. Например, программы, реализующие алгоритм рис. 2.3, с помощью операторов DO/LOOP имеют следующий вид:

DO WHILE x<20 y=sin(x) PRINT y x=x+2

LOOP

или

DO UNTIL x>=20 y=sin(x) PRINT y x=x+2

LOOP

или

DO

y=sin(x) PRINT y x=x+2

LOOP UNTIL x>=20

или

DO

y=sin(x) PRINT y x=x+2

LOOP WHILE x<20

2.7.4. Для изменения естественного порядка последовательного выполнения операторов в программе служат оператор перехода GOTO, после которого указывается метка или номер строки. Оператор GOTO вызывает переход к оператору с указанной меткой или номером строки.

Программа, реализующая алгоритм рис. 2.3, использующая для организации цикла операторы GOTO и IF THEN, имеет вид:

x=0

NACH:

IF x>20 TNEN END y=SIN(x) PRINT y x=x+2

GOTO NACH

Рис. 2.4.

2.8. Подпрограммы, функции и процедуры в TURBO BASIC

Программу на TB можно упростить, если использовать определяе-

мые функции, подпрограммы и процедуры.

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

Подпрограмма представляет собой набор операторов, имеющий метку, переход к которой осуществляется с помощью оператора GOSUB. Использование подпрограмм самый традиционный способ структурирования программы на части. Подпрограмма заканчивается оператором

RETURN.

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

Процедуры и функции в Турбо Бейсике представляют собой конструкции, свойственные только достаточно развитым языкам высокого уровня. Они допускают рекурсию (т.е. вызов самих себя), передачу параметров, доступ к локальным, статическим и глобальным переменным.

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

зуется символ предопределенного процесса, изо-

браженный на рис. 2.4. Сам предопределенный процесс должен быть описан в своей схеме алгоритма как отдельная программа, включая символы начала и конца программы.

2.8.1. Вызов подпрограммы осуществляется с помощью оператора GOSUB метка, по которому происходит переход к оператору, перед которым находится метка. Подпрограмма выполняется, пока в ее тексте не встретится оператор RETURN, после чего происходит возврат к оператору, стоящему за GOSUB. Можно применять вложенные подпрограммы. Количество вложений ограничено только стековой памятью TB, в которой хра-

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

REM Присвоение значений сторонам 1 треугольника a=5

b=6

c=7

GOSUB triangle sl=s

REM Присвоение значений сторонам 2 треугольника a=4

b=8

c=6

GOSUB triangle s2=s

IF s2<sl THEN

PRINT "Площадь треугольника 1_ больше, чем треугольника 2"

ELSEIF s2>s1 THEN

PRINT "Площадь треугольника 2_ больше, чем треугольника 1"

ELSE

PRINT “Площади треугольников равны”

END IF

END

REM Подпрограмма для вычисления площади triangle:

p=(a+b+c)/2 s=SQR(p*(p-a)*(p-b)*(p-c))

RETURN

Обратите внимание, что перед подпрограммой, стоит оператор END, иначе бы в конце программы она выполнилась бы еще раз, даже без опера-

тора GOSUB.

2.8.2. Ознакомиться с операторами TB, используемыми для определения функций пользователя. В общем виде формат определения функции имеет или строчный вариант:

DEF FNимя [(список аргументов)] = выражение

или блочный вариант:

DEF FNимя [(список аргументов)] операторы

[EXIT DEF] FNимя=выражение]

END DEF

FNимя имя присваиваемое определяемой функции (буква, за которой следует любое число букв или цифр); список аргументов необязательная последовательность разделенных запятыми формальных параметров (не более 16), при вызове функции им присваивается значение соответствующих (по порядку в списке) параметров.

Оба альтернативных способа позволяют определить в программе собственную функцию пользователя, которая затем может вызываться по ее имени, т.е. каждый раз, когда в каком-либо операторе будет использовано имя, присвоенное данной функции, будет вычисляться выражение с подстановкой в него значений аргументов, указанных при вызове.

Имена аргументов в однострочном операторе DEF FN могут совпадать с именами переменных в программе, но это будут не одни и те же переменные. В выражении можно использовать переменные, не включенные в список аргументов. Аргументы могут использоваться только в выражении, определяющем функцию. Тип значения (числовое или символьное), которое получается при выполнении функции, определяется именем функции (по тем же правилам, что и имя переменной).

Пример:

IF FNdistance(2,3,4)<6 THEN PRINT "Точка внутри_

сферы радиуса 6"

...

REM Вычисление расстояния от точки (x,y,z) REM до центра сферы

DEF FNdistanсe(x,y,z)=SQR (x^2+y^2+z^2)

Положение в программе определения функции несущественно, в частности, она может находиться после тех операторов, в которых она используется. В отличие от подпрограмм, в тело функции "попасть случайно" нельзя, поскольку при выполнении программы строки, в которых располагается ее определение, считаются "невидимыми".

Войти в тело функции или выйти из него с помощью операторов GOTO, GOSUB, RETURN нельзя, хотя внутри тела эти операторы допустимы.

Определения функций не могут быть вложенными, хотя в определении могут встречаться вызовы других или этих же функций (и процедур). В последнем случае имеем дело с рекурсивным вызовом. Обычно в многострочном определении функции имеется оператор присваивания, в котором в левой части стоит имя функции. Если такого оператора нет, то значение, возвращаемое функцией, не определено. Для выхода из тела функции до оператора END DEF применяется оператор EXIT DEF.

Пример. Определим функцию, которая рекурсивно вычисляет значение факториала целого числа:

REM Определение функции FNfact%

DEF FNfact%(n%)

IF n%=0 THEN FNfact%=1 EXIT DEF

IF n%=1 THEN FNfact%=1_

ELSE FNfact%=n%*FNfact%(n%-1%)

END DEF

REM Использование ранее определенной функции FNfact%

PRINT "факториал 5=";FNfact% (5%)

2.8.3. Процедуры самое мощное средство для построения модульной программы определяются с помощью оператора SUB и END SUB, которые служат, соответственно, началом и концом группы операторов, называемой процедурой:

SUB имя [(список параметров)] [LOCAL список переменных] [STATIC список переменных] [SHARED список переменных]

операторы

[EXIT SUB] END SUB

имя уникальное имя процедуры, отвечающее тем же правилам, по которым образуются имена переменных; список параметров последовательность, разделенных запятыми формальных параметров, которые служат только для определения процедуры, не имея никакого отношения к

другим переменным программы с тем же именем. Как и для функции, положение процедуры не существенно, кроме того, нельзя "случайно" попасть в процедуру непосредственно от предыдущего оператора, ни с помощью операторов GOTO, GOSUB или RETUN, хотя внутри процедуры эти операторы действуют. Определения процедур не могут быть вложенными, хотя внутри процедуры могут быть вызовы других процедур и функций.

Все переменные в процедуре по умолчанию являются локальными. Локальные переменные являются динамическими: место под них выделяется лишь при выполнении процедуры, после же выполнения процедуры они автоматически пропадают. Однако можно объявить или с помощью оператора SHARED глобальные переменные (переменные, которые берут свои значения из предыдущих программных строк), или с помощью оператора STATIC статические переменные (переменные, для которых важно, чтобы они не изменились при повторных вызовах).

Определение процедуры должно заканчиваться оператором END SUB, который возвращает управление в программу, передавая его к оператору, следующему за вызовом процедуры. Для выхода из процедуры в произвольном месте используется оператор EXIT SUB.

Для вызова процедуры используется оператор CALL, имеющий фор-

мат:

CALL имя ([список параметров])

имя это имя процедуры, определенной с помощью оператора SUB; список параметров это последовательность разделенных запятыми переменных, выражений или констант, передаваемых процедуре, в качестве фактических параметров (по типу они должны соответствовать формальным параметрам в определении процедуры).

6

Ниже приведена, программа для вычисления суммы S= (aii bi )2 ,

i=1

i, еслиi четное

,

i2

, еслиi четное

.

где ai =

, еслиi нечетное

ai =

, еслиi нечетное

i2

 

i3

 

 

 

 

 

 

 

FOR i=1 TO 6 CALL ab(i) s=s+(a-b)^2

NEXT

PRINT "S="; s

END

REM Процедура вычисления a, b SUB ab(i)

SHARED a,b

IF i MOD 2 <>0 THEN a=i^2:b=i^3 ELSE a=i:b=i^2 END SUB

Обратите внимание, что оператор END необязателен в программе, т.к. в процедуру ab можно попасть лишь по оператору CALL ab(i).

2.8.4. Составить три программы для вычисления и вывода на экран монитора значений функции из таблицы 2.5 для x, изменяющегося от -20 до 20 с шагом 2.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Таблица 2.5

№ ва-

 

 

 

 

Функция

№ ва-

 

 

 

Функция

рианта

 

 

 

 

рианта

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

0.5X 3 + 1,

X ≤ −10

 

 

 

 

 

 

 

 

 

 

(X

+ 1)

2

 

,

10 < X <1

 

X 4 12 ,

X ≤ −1

1

Z =

 

 

7

 

 

 

 

3

,

1 < X < 1

 

 

X + 10 ,

X 10

Z = (2 X + 1)

 

 

 

 

 

 

 

x + 11 ,

X 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

x

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sin X

 

 

,

X ≤ −π

 

 

 

 

sin 3X ,

X ≤ −π

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2

Z = (X

+13)

,

π < X <π

8

Z = (cos X +1) ,

π < X < π

 

 

(x

3

+ 2x),

X π

 

 

 

 

2x ,

X π

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

10

 

 

 

 

 

 

 

9

n

 

 

 

 

 

 

Α = 4 1000 n + x 4

Α = x + 3k

 

 

 

 

n=1

 

 

 

 

 

 

 

k =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

Α = cos X

 

 

10

Α = (xk + 2)3

 

 

 

n

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

k =1

2k

 

 

 

 

 

k =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

n

 

 

 

 

 

 

 

10

x

n

 

 

 

5

Α = (X 4 + 4k )

 

11

Α =

 

 

 

 

 

 

n

 

 

 

 

k =1

 

 

 

 

 

 

 

n =1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

n

 

 

 

 

 

 

12

15

 

 

 

 

 

 

Α = e x + kx

 

 

Α = x + k

 

 

 

 

k =1

 

 

 

 

 

 

 

k =5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Номер варианта задается преподавателем. В первой программе для организации цикла использовать оператор FOR/NEXT, во второй WHILE/WEND, а в третьей DO/LOOP. Вывести полученные результаты на экран монитора и на принтер: в первой программе в строку с точностью 2 знака после запятой; во второй программе в столбец с точностью 1 знак

после запятой; в третьей по зонам в экспоненциальном формате. Для вычисления значений функций использовать функцию пользователя.

2.8.5. Составить программу для вычисления и вывода на экран монитора наибольшего и наименьшего значений функции (Табл. 2.6) и значения аргумента, при котором оно получено. Для определения наибольшего значения использовать подпрограммы, а для определения наименьшего значения процедуры.

 

 

 

 

 

 

Таблица 2.6.

№ ва-

Функция

Диапазон изменения Х

Шаг изменения Х

рианта

1

y=-sin(Xi/2)

20÷40

2

2

y=13X2

÷7

1

3

y=cos(4x)

4÷24

2

 

 

 

 

 

 

4

Y =

 

1

 

(-1)÷5

0.5

 

X + 4

 

 

 

 

 

5

Y =

Х + 44

(-10)÷10

2

 

 

X 23

 

 

6

 

2

 

÷

1

 

y=(3x +43)

11 19

 

Для определения, наибольшего значения, функции и соответствующего ей значения аргумента воспользуйтесь следующим алгоритмом:

присвоить переменной YMAX значение, заведомо меньшее значения функции Y для заданного диапазона изменения X;

организовать цикл по переменной X ;

организовать переход в подпрограмму для нахождения наибольшего из двух значения Y, сохранить это значение в переменной YMAX, а соот-

ветствующее ему значение X в переменной XMAX;

после завершения цикла ввести на экран полученные значения в следующем виде:

YMAX=число

при

XMAX=число.

2.9. Использование массивов в TURBO BASIC

Помимо числовых и символьных переменных в TB используются еще и индексные переменные или массивы. Массив это последовательность данных одинакового типа, имеющих общее имя. Элемент массива является отдельной переменной. Он идентифицируется путем указания в

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