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

Языки Бейсик

.pdf
Скачиваний:
0
Добавлен:
11.08.2026
Размер:
622 Кб
Скачать

Глава VII. Управляющие операторы языка Бейсик

51

LOOP UNTIL (EOF(1)) 'проверка на конец файла END SELECT

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

problem: 'подпрограмма обработки ошибки диска

PRINT “дисковод не готов или не исправен!”

INPUT “игнорировать-1,повторить-2,прекратить-0?-”; fl% IF fl% = 0 GOTO end1 'прекратить работу программы

SELECT CASE fl%

CASE 1 'в зависимости от ответа

RESUME NEXT 'возврат на следующий оператор

CASE 2

RESUME 'или на повторение операции END SELECT

GOTO cont 'или на начало программы

problem1: 'подпрограмма обработки ошибки при контрольном чтении 'файла

PRINT “дисковод не готов или не исправен!”

INPUT “прекратить-0 или повторить?-”; fl%

IF fl% = 0 GOTO end1 'прекратить работу программы

RESUME 'или на повторение операции

7.15.Оператор RESUME-продолжить выполнение программы после подпрограммы обработки ошибки

В зависимости от типа ошибки возможны несколько сценариев продолжения работы программы. Для этого подпрограмма обработки ошибки должна предлагать пользователю программы самому выбрать наиболее приемлемый для него вариант дальнейшего развития событий. Применение одного оператора RESUME позволяет выбрать один из трех вариантов продолжения.

Формат оператора RESUME

RESUME [{метка,NEXT}]

ãäå

Метка— метка оператора для продолжения программы. Если вместо метки стоит 0 или метка отсутствует, то выполнение программы продолжится с оператора, в котором была обнаружена ошибка. Если указано ключевое слово NEXT, то выполнение программы будет продолжено с оператора, следующего за оператором, в котором была обнаружена ошибка.

Пример использования оператора RESUME приведен в примере 7.14.1

7.16. Оператор STOP-временно остановить выполнение программы

Оператор STOP-останавливает выполнение программы, сохраняя значение всех переменных, открытые файлы и т.п. Введен был, когда еще не существовало развитой системы отладки программ. Практическое применение этого оператора в настоящее время определить трудно.

Формат оператора STOP:

52

Языки Бейсик

STOP

Оператор без операндов

7.17. Оператор DEF-определить функцию пользователя

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

Формат оператора DEF:

DEF FNèìÿ[(параметры)] = выражение

èëè

DEF FNèìÿ[(параметры)] [áëîê FNèìÿ = выражение [áëîê EXIT DEF

[áëîê END DEF

ãäå Параметры Один или несколько аргументов в следующем формате:

перемен[( )] [AS òèï] [, перемен[( )] [AS òèï]]...

ãäå

Перемен — Имя переменной Basic.

Òèï — Тип данных переменной (INTEGER, LONG, SINGLE, DOUBLE, STRING или тип данных, определенный пользователем).

Выражение — Возвращаемое значение функции.

Оператор FUNCTION позволяет определять функцию лучшим образом.

Пример 7.15.1.

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

'программа поиска

корней многочлена

 

'на числовом отрезке

 

CLS

 

 

DIM min AS DOUBLE

'начало интервала поиска корня

DIM max AS DOUBLE

'конец интервала поиска корня

DIM x AS DOUBLE

'переменная

 

DIM y1 AS DOUBLE

'функция

 

'DIM y2 AS DOUBLE

'функция

 

DIM h AS DOUBLE

'точность вычислений

DIM x1 AS DOUBLE

'корень

 

'определяем функцию пользователя

DEF fny (x) = x ^

3 — 5 * x ^ 2 — 3 * x + 8

PRINT “вычисление

корня многочлена”

 

SCREEN 9

 

 

VIEW (340, 10)-(620, 200), 6, 7

'правое верхнее окно

Глава VII. Управляющие операторы языка Бейсик

53

WINDOW (-14,

— 9)-(14, 9)'определяем

Декартову систему координат

LINE (-14, 0)-(14,

0), 3 'чертим

îñü

Õ

 

LINE (0, — 9)-(0, 9), 3 'чертим

îñü

Ó

 

FOR i = — 13

TO 13

'öèêë —

чертим координаты по оси Х

 

LINE (i, — .5)-(i,

.5), 4

 

 

 

NEXT i

 

 

 

 

 

'рисуем

функцию

 

 

 

FOR x = — 10 TO 10 STEP .01 y = fny(x)

PSET (x, y), 2

NEXT x

LOCATE 11, 1 'устанавливаем курсор

'Вводим интервал в виде — начало интервала — конец интервала a: PRINT “введите интервал”

INPUT “MIN=“; min: INPUT “MAX=“; max

'Вводим точность вычисления

a001: PRINT “введите точность”: INPUT “шаг=“; h IF h = 0 THEN

PRINT “ТОЧНОСТЬ СЛИШКОМ ВЕЛИКА ДЛЯ МЕНЯ”

GOTO a001

END IF

IF min >= max THEN

PRINT “min должен быть меньше max! Повторите ввод!”

GOTO a

END IF

y1 = fny(min) 'вычисляем значение ф-ции в начале интервала y2 = fny(max) 'вычисляем значение ф-ции в конце интервала

IF y1 * y2 < 0 THEN

PRINT “в этом интервале существует по крайне мере_

один корень”

ELSE

PRINT “в этом интервале корней нет”: GOTO a

END IF

'Иррациональный цикл

a01: DO WHILE y1 * y2 < 0'приближаемся к корню слева min = min + h 'с шагом h

y1 = fny(min)

x1 = min

LOOP

a1: PRINT “функция=“; y1 'печатаем результат

PRINT “ïðè õ=“; x1

INPUT “будете уточнять?(0-нет, точность вычисления-да)”; h min = x1

IF h = 0 THEN GOTO m2 'больше не вычисляем

IF flag% = 0 THEN flag% = 1: GOTO m1 ELSE flag% = 0 GOTO a01 m1: DO WHILE y1 * y2 > 0'приближаемя к корню справа с

min = min — h 'шагом h y1 = fny(min)

x1 = min LOOP: GOTO a1

m2: END

54

Языки Бейсик

Глава VIII. Математические функции

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

Òàáë.8.1.

Функция

Выполняемое действие

 

 

ABS

Возвращает абсолютное значение числовой пере-

менной

 

 

 

ATN

Вычисляет арктангенс

 

 

CDBL

Переводит числовое выражение в значение с двой-

ной точностью

 

 

 

CSNG

Переводит числовое выражение в значение с

обычной точностью

 

CINT

Округляет числовое выражение до целого значе-

íèÿ

 

 

 

CLNG

Округляет числовое выражение до длинного (4

байта) целого значения

 

 

 

 

Переводят числовые строки бинарного формата

CVDMBF, CVSMBF

(Microsoft-Binary-format), которые могут храни-

ться в операторе строковых переменных FIELD,

 

 

обратно в числа в формате IEEE

 

 

 

Переводят числа в формате IEEE в числовые стро-

MKSMBF$,MKDMBF$

ки бинарного формата (Microsoft-Binary-format),

которые могут храниться в операторе строковых

 

переменных FIELD

 

 

EXP

Возвращает e, возведенное в указанную степень,

где e — основание натурального логарифма

 

LOG

Возвращает натуральный логарифм числового

выражения

 

INT

Возвращает наибольшее целое, меньшее или рав-

ное числовому выражению

 

 

 

FIX

Округляет выражение с плавающей запятой до его

целой части

 

RANDOMIZE

Инициализирует генератор случайных чисел

 

 

RND

Возвращает случайное число одинарной точности

между 0 и 1

 

SQR

Возвращает квадратный корень числового выра-

жения

 

 

 

SIN

Возвращает синус указанного угла

 

 

 

 

Глава VIII. Математические функции

55

 

 

 

Функция

Выполняемое действие

 

 

 

 

COS

Возвращает косинус указанного угла

 

 

 

 

TAN

Возвращает тангенс указанного угла

 

 

 

SGN

Возвращает значение, указывающее знак числово-

го выражения

 

 

 

 

 

 

 

 

 

8.1. Функции ABS и SGN

Функция ABS возвращает абсолютное значение числа.

Функция SGN возвращает значение, указывающее знак числового выражения (1 — если выражение положительно; 0 — если оно равно нулю; и — 1, если оно отрицательно).

Формат записи функций:

ABS(числовое_выражение)

SGN(числовое_выражение)

где числовое_выражение — Любое числовое выражение.

Пример:

PRINT ABS(45.5 — 100!) 'Вывод: 54.5

PRINT SGN(1), SGN(-1), SGN(0) 'Вывод: 1 — 1 0

8.2. Функции CDBL и CSNG

Функция CDBL переводит числовое выражение в значение с двойной точностью.

Функция CSNG переводит числовое выражение в значение с одинарной точ- ностью.

Формат записи функций:

CDBL(числ_выражение)

CSNG(числ_выражение)

где числ_выражение Любое числовое выражение.

Пример:

PRINT 1/3, CDBL(1/3) 'Вывод: .3333333 .3333333333333333 PRINT CSNG(975.3421515#) 'Вывод: 975.3422

8.3. Функции CINT и CLGN

Функция CINT округляет числовое выражение до целого значения.

Функция CLNG округляет числовое выражение до длинного (4 байта) целого значения.

56

 

Языки Бейсик

Формат записи функций:

 

 

CINT(числ_выражение)

 

 

CLNG(числ_выражение)

 

 

ãäå

 

 

числ_выражение Для CINT

любое числовое выражение в преде-

 

лах от — 32 768 до 32 767. Для CLNG — любое

 

числовое выражение в пределах от –2 147 483 648

 

äî 2 147 483 647.

Пример:

PRINT CINT(12.49), CINT(12.51) 'Вывод: 12 13

PRINT CLNG(338457.8) 'Вывод: 338458

8.4. Функции CVDMBF, CVSMBF и MKSMBF$, MKDMBF$

Функции MKSMBF$ и MKDMBF$ переводят числа в формате IEEE в числовые строки бинарного формата (Microsoft-Binary-format), которые могут храниться в операторе строковых переменных FIELD.(более подробно в гл.X — файлы прямого доступа)

Функции CVSMBF и CVDMBF переводят эти строки обратно в числа в формате IEEE.

Формат записи функции:

MKSMBF$(выражение_одинарн_точности!)

MKDMBF$(выражение_двойной_точности#)

CVSMBF (4_байт_числ_строка)

CVDMBF (8_байт_числ_строка)

Функция

Возвращает

 

 

MKSMBF$

4 байт. строку, содержащую число в бинарном формате

IBM.

 

 

 

MKDMBF$

8 байт. строку, содержащую число в бинарном формате

IBM.

 

CVSMBF

Число одинарной точности в формате IEEE.

 

 

CVDMBF

Число двойной точности в формате IEEE.

 

 

 

 

Эти функции полезны для поддержки файлов данных, созданных более ранними версиями Basic.

Пример:

TYPE Buffer

SngNum AS STRING * 4

DblNum AS STRING * 8

END TYPE

DIM RecBuffer AS Buffer

OPEN “TESTDAT.DAT” FOR RANDOM AS #1 LEN = 12

Глава VIII. Математические функции

57

SNum = 98.9

DNum = 645.3235622#

RecBuffer.SngNum = MKSMBF$(SNum)

RecBuffer.DblNum = MKDMBF$(DNum)

PUT #1, 1, RecBuffer

GET #1, 1, RecBuffer

CLOSE #1

PRINT CVSMBF(RecBuffer.SngNum), CVDMBF(RecBuffer.DblNum)

8.5. Функции EXP и LOG

Функция EXP возвращает e, возведенное в указанную степень, где e — основание натурального логарифма.

Функция LOG возвращает натуральный логарифм числового выражения.

Формат записи функции:

EXP(числ_выражение)

LOG(числ_выражение)

ãäå

 

Числ_выражение

Для EXP — число меньшее или равное 88.02969.

Для LOG — любое положительное числовое выражение.

Пример:

PRINT EXP(0), EXP(1) 'Вывод: 1 2.718282

PRINT LOG(1), LOG(EXP(1)) 'Вывод: 0 1

8.6. Функции INT и FIX

Функция FIX округляет выражение с плавающей запятой до его целой части.

Функция INT возвращает наибольшее целое, меньшее или равное числовому выражению.

Формат записи функций:

FIX(числ_выражение)

INT(числ_выражение)

где числ_выражение Любое числовое выражение.

Пример:

PRINT FIX(12.49), FIX(12.54) 'Вывод: 12 12

PRINT INT(12.54), INT(-99.4) 'Вывод: 12 — 100

8.7. Функции RANDOMIZE и RND

Система Бейсик имеет генератор случайных чисел. Функция RND(RaN- Dom-случайный) позволяет получить случайное число относительно некоторой базы генерации. Оператор RINDOMIZE(случайно выбрать) позволяет изменить начальную базу генерации случайных чисел.

58

Языки Бейсик

Оператор RANDOMIZE инициализирует генератор случайных чисел и позволяет изменить базу генерации случайных чисел

Функция RND возвращает случайное число одинарной точности между 0 и 1.

Формат записи функций:

RANDOMIZE [число%]

RND[(n#)]

ãäå

Число% Число, используемое для инициализации генератора случайных чи- сел. Если опущено, то RANDOMIZE запрашивает его.

n#

Значение, устанавливающее то, как RND генерирует следующее слу-

 

чайное число:

 

 

 

 

n#

 

RND возвращает

 

 

Меньше 0

То же самое число для любых n#

 

 

Больше 0 (или опущено)

Следующее случайное число

 

 

 

0

 

Последнее сгенерированное число

 

 

 

 

 

 

Пример:

RANDOMIZE TIMER

 

 

x%

=

INT(RND

*

6)

+

1

y%

=

INT(RND

*

6)

+

1

PRINT “Координаты

экрана: x =“; x%; “и y =“; y%

Пример 8.7.1

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

Суть метода состоит в следующем.

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

Программа находит методом Монте-Карло площадь круга радиусом 1. Из математики следует, что площадь такого круга равна S=πR^2. Поскольку R^2=1, следовательно мы вычислим значение π. Случайное число х в интервале [-a;a] вычисляется следующим образом

x=2aRND(1)-a

'программа нахождения площади единичного круга

Глава VIII. Математические функции

59

'методом Монте-Карло

CLS 'Чистим экран 'запрашиваем количество точек

p1: INPUT “укажите количество вбрасываний:-”; N M = 0 'счетчик, для числа попаданий в круг RANDOMIZE N

FOR i = 0 TO N

'вбрасываем точку в квадрат x# = 2 * RND(1) — 1

y# = 2 * RND(1) — 1

IF x# ^ 2 + y# ^ 2 <= 1 THEN M = M + 1 'Попала в круг NEXT i

S# = 4 * M / N

PRINT “Площадь единичного круга равна”; S#; “ при — “; N; “вбрасываний”

PRINT “закончить?(0-да)” z$ = INPUT$(1)

IF VAL(z$) <> 0 GOTO p1

Пример 8.7.2.

Слегка модернизированная программа примера 8.9.1., которая вычисляет, как часто уравнения вида ax^2+bx+c=0 имеет действительные корни, если коэффициенты a, b, c лежат в интервале [-10;+10]. Используется генератор случайных чисел.

'Программа нахождения корней квадратного уравнения 'Ах^2+Bx+C=0

'где A,B,C задаются случайным образом

'в интервале [-10;+10]. Подсчитывается, какая часть уравнений

имеет

‘вещественные корни, результат выводится на экран монитора

CLS 'Очистка экрана

p1: INPUT “введите число уравнений:-”; N

RANDOMIZE N

M = 0 'счетчик для подсчета числа уравнений, которые имеют

'действительные корни FOR i = 1 TO N

'генерация коэффициентов a = 20 * RND(1) — 10

b = 20 * RND(1) — 10 c = 20 * RND(1) — 10

'Вычисляем дискриминант d = b ^ 2 — 4 * a * c

'Проверяем значение дискриминанта

IF d >= 0 THEN M = M + 1 'уравнение имеет вещ.корни NEXT i

PRINT “Вероятность того, что уравнение имеет вещественные корни:-”; M / N

p2: PRINT “Закончить работу?(0-да)” z$ = INPUT$(1)

IF VAL(z$) <> 0 THEN GOTO p1 ELSE END

60

Языки Бейсик

Пример 8.7.3.

'Программа ежегодного подсчета размера банковского вклада, если известны начальный вклад(Snach) и годовой процент(P) по депозиту. Используется формула S=Snach*(1+P/100)^n, 'где n-срок вклада

'Программа ежегодного подсчета размера банковского вклада, 'если известны начальный вклад(Snach) и годовой процент(P) 'по депозиту

'используется формула S=Snach*(1+P/100)^n 'где n-срок вклада

p1: CLS 'очистка экрана

INPUT “введите начальную сумму вклада:-”; Snach INPUT “введите срок хранения(лет<100):-”; n INPUT “введите процент начисления за год:-”; P FOR k = 1 TO n

s = Snach * (1 + P / 100) ^ k 'сумма вклада PRINT “Размер вклада через”; k; “лет равен:-”; s NEXT k

PRINT “будем еще работать?(0-нет)” z$ = INPUT$(1)

IF VAL(z$) <> 0 GOTO p1

END

8.8. Тригонометрические функции

Функция ATN возвращает арктангенс указанного числового выражения.

Функции COS, SIN и TAN возвращают косинус, синус и тангенс указанного угла.

Формат записи:

ATN(числ_выражение)

COS(óãîë)

SIN(óãîë)

TAN(óãîë)

ãäå

 

 

Числ_выражение

Отношение сторон правильного треугольника.

Óãîë

Угол в радианах.

Функция ATN возвращает угол в радианах.

Для перевода градусов в радианы нужно умножить градусы на (PI / 180).

Пример:

CONST PI=3.141592654

PRINT ATN(TAN(PI/4.0)),PI/4.0 'Вывод:.7853981635 '.7853981635

PRINT (COS(180 * (PI / 180))) 'Вывод: -1

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