Языки Бейсик
.pdfГлава 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
