Задача 1.
Астроиду, уравнения которой задаются следующими равенствами
x=a*cos(t)3
y=a*sin(t)3
|
(где 0 |
можно построить с помощью следующей программы:
SCREEN 12
a = 100
'ATN(1)*8=2*pii
FOR t = 0 TO ATN(1) * 8 STEP .01
x = 320 + a * COS(t) ^ 3
y = 240 + a * SIN(t) ^ 3
PSET (x, y)
NEXT t
|
Сделать программу, которая рисовала бы какую* нибудь другую красивую кривую.
Задача 2.
Нарисовать систему координат с шагом в 20 писклей. Использовать SCREEN 12
Задача 3.
Составить программу, которая на координатной оси, построенной в предыдущей задаче, строит графики кривых:
y=x2 и
y=2x2-10x+3
Учесть, что 1 единица есть 20 писклей. Графики нарисовать разным цветом.
Задача 4.
Используя координатную ось, построенную в задаче 2, проиллюстрировать графически наличие или отсутствие решений в уравнении:
Ax+B=Cx+D
Задача 5.
Нарисовать орнамент или картину (дом, птица, дерево и т.д.) с помощью оператора DRAW
Задача 6.
Проиллюстрировать задачу из задания 10: В единичный квадрат вписан круг. В квадрат бросаются случайно N точек. Составить программу, моделирующую эту ситуацию и вычисляющую значение 4*Р/ N, Р –количество точек, попавших в круг. N –задаётся пользователем. Что представляет собой число 4*Р/ N? Точки задаём случайными координатами (x,y). Квадрат рисуем с помощью оператора LINE, круг с помощью CIRCLE, случайные точки ставим с помощью PSET . Точки внутрь и вне круга ставим разного цвета.
Задача 7.
Получить движение слова «Эврика» по строке, а строки по экрану.
Задача 8.
Получить на экране пунктирные линии.
15. Функция пользователя
Вдобавок к существующим функциям в QBASICе можно сделать свою функцию пользователя.
Функция пользователя описывается отдельно в виде подпрограммы (модуля), которую создают только в том случае, если к ней обращается основная программа. После выполнения подпрограммы, возвращаемся назад в основную программу в то место, откуда ушли.
Для описания функции пользователя есть две возможности:
Определение функции пользователя, как части основной программы. Используется в старых версиях Бейсика.
Определение функции пользователя в отдельном модуле. Это дополнение в новых версиях.
Функция пользователя определяется между операторами:
DEF FN...END DEF
Рассмотрим пример. Определим функцию пользователя –арксинус, которого нет в перечне стандартных. Для его определения используем стандартные функции ATN (арктангенс) и SQR (квадратный корень), а также математическое соотношение:
ARCSIN(X) = ATN(X / SQR(-X * X + 1)).
Пример:
DEF FNARCSIN (x) = ATN(x / SQR(1 - x ^ 2))
INPUT "Введи число из промежутка ]-1; 1["; a
PRINT "Арксинус этого числа есть "; FNARCSIN(a); " радиана."
|
В этой программе не определена функция в точках –1 и 1. Для её определения надо ввести дополнительные условия. В этом случае функция пользователя определяется в нескольких рядах программы.
DEF FNARCSIN (x)
SELECT CASE x
CASE 1 'для х=1
FNARCSIN = 2 * ATN(1) 'arcsin=pii/2
CASE -1 'для x = -1
FNARCSIN = -2 * ATN(1) 'arcsin=-pi/2
CASE ELSE
FNARCSIN = ATN(x / SQR(1 - x ^ 2))
END SELECT
END DEF
INPUT "Введи число из отрезка [-1; 1]"; a
PRINT "Арксинус равен "; FNARCSIN(a); " радиан."
|
PRINT " или "; 180*FNARCSIN(arv)/FNPII; " градусов."
Используя следующие математические соотношения, можно определить и другие математические функции:
Секанс
|
Sec(X) = 1 / Cos(X)
|
Косеканс
|
Cosec(X) = 1 / Sin(X)
|
Котангенс
|
Cotan(X) = 1 / Tan(X)
|
Арксинус
|
Arcsin(X) = Atn(X / Sqr(-X * X + 1))
|
Арккосинус
|
Arccos(X) = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
|
Арксеканс
|
Arcsec(X) = Atn(X / Sqr(X * X – 1)) + Sgn((X) – 1) * (2 * Atn(1))
|
Арккосеканс
|
Arccosec(X) = Atn(X / Sqr(X * X - 1)) + (Sgn(X) – 1) * (2 * Atn(1))
|
Арккотангенс
|
Arccotan(X) = Atn(X) + 2 * Atn(1)
|
Гиперболический синус
|
HSin(X) = (Exp(X) – Exp(-X)) / 2
|
Гиперболический косинус
|
HCos(X) = (Exp(X) + Exp(-X)) / 2
|
Гиперболический тангенс
|
HTan(X) = (Exp(X) – Exp(-X)) / (Exp(X) + Exp(-X))
|
Гиперболический секанс
|
HSec(X) = 2 / (Exp(X) + Exp(-X))
|
Гиперболический косеканс
|
HCosec(X) = 2 / (Exp(X) – Exp(-X))
|
Гиперболический котангенс
|
HCotan(X) = (Exp(X) + Exp(-X)) / (Exp(X) – Exp(-X))
|
Гиперболический арксинус
|
HArcsin(X) = Log(X + Sqr(X * X + 1))
|
Гиперболический арккосинус
|
HArccos(X) = Log(X + Sqr(X * X – 1))
|
Гиперболический арктангенс
|
HArctan(X) = Log((1 + X) / (1 – X)) / 2
|
Гиперболический арксеканс
|
HArcsec(X) = Log((Sqr(-X * X + 1) + 1) / X)
|
Гиперболический арккосеканс
|
HArccosec(X) = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)
|
Гиперболический арккотангенс
|
HArccotan(X) = Log((X + 1) / (X – 1)) / 2
|
Логарифм при основании N.
|
LogN(X) = Log(X) / Log(N) или LogN(N,X) = Log(X) / Log(N)
|
Функция пользователя может обрабатывать текст. Рассмотрим например функцию пользователя, которая убирает пустые места (пробелы), как справа, так и слева.
DEF FNTRIM$ (tekst$) = LTRIM$(RTRIM$(tekst$))
a$ = " @ "
PRINT "joosep" + FNTRIM$(a$) + "kuskil.ee"
|
FUNCTION...END FUNCTION
Удобнее оформлять функцию пользователя в виде отдельного модуля.
Для этого надо:
-
Взять из меню EDIT команду New Function...
-
Напечатать имя функции (Первая – буква, без пробелов, английскими буквами и цифрами)
-
В открывшемся окне между FUNCTION и END FUNCTION напечатать описание функции.
-
Возвратится в основную программу, взяв из меню View команду Subs... и далее выбрав название своей программы.
Отличием от предыдущего случая является то, что перед названием программы не должны быть буквы FN и описание модуля функции не видно в основной программе.
Общий вид функции пользователя:
FUNCTION имя [(аргументы)] [STATIC]
[команды]
имя = значение
[EXIT FUNCTION]
[команды]
END FUNCTION
|
Если нет слова STATIC, то значения переменных обнуляются. А если есть слово STATIC, то сохраняются промежуточные значения переменных при многократном использовании программы.
EXIT FUNCTION даёт возможность прервать выполнение программы и выйти из неё.
Приведём пример создания функции пользователя HYPOTENUUS, у которой 2 аргумента a и b. Значение функции находим с помощью теоремы Пифагора.
Для этого делаем следующее:
1. Выбираем Edit->New Function..
2. Даём имя hypotenuus
3. Получаем:
FUNCTION hypotenuus
END FUNCTION
|
4. Теперь пишем аргументы в первую строку и формулу для гипотенузы.
FUNCTION hypotenuus (a, b)
hypotenuus = SQR(a ^ 2 + b ^ 2)
END FUNCTION
|
5. Возвращаемся в основную программу View->Subs...и пробуем использовать функцию пользователя.
INPUT "Введи длину катета";a
INPUT "Введи длину второго катета";b
PRINT "Длина гипотенузы равна";hypotenuus(a,b)
|
После сохранения программы , созданную функцию пользователя можно использовать только вместе с этой программой. После сохранения добавляется фраза в начало программы DECLARE FUNCTION... это вспомогательная фраза для , которую делает редактор QBASIC. При редактировании функции пользователя, эту фразу надо стирать.
Создадим программу, которая решает систему линейных уравнений относительно x и y .
A*x+b*y=c
D*x+e*y=f
У этой системы должно быть 6 аргументов (a, b, c, d, e, f) + ещё аргумент «какой», которым задаём, относительно чего решаем систему (x или y).
Договоримся. Что аргумент «какой» может принимать только 2 значения –1 (верное) или 0 (неверное) и в зависимости от этого получаем решение первого или второго уравнения.
Описание функции:
FUNCTION lvs (a, b, c, d, e, f, kumb)
'находим детерминант системы
d = a * e - b * d
'в зависимости от аргумента «какой» решаем систему
IF kumb THEN
lvs = (c * e - b * f) / d
ELSE
lvs = (a * f - d * c) / d
END IF
END FUNCTION
|
Однако возникают проблемы при d=0. Рассмотрим, как это решить с помощью оператора EXIT FUNCTION.
FUNCTION lvs (a, b, c, d, e, f, kumb)
d = a * e - b * d
IF d=0 THEN EXIT FUNCTION
IF kumb THEN
lvs = (c * e - b * f) / d
ELSE
lvs = (a * f - d * c) / d
END IF
END FUNCTION
|
При d=0, значение функции получактся равным 0, что неверно. Исправим это.
CLS
PRINT "Решение системы уравнений вида:"
PRINT "ax+by=c"
PRINT "ex+dy=f"
PRINT
INPUT "Введи аргументы первой системы (a,b,c)"; a, b, c
INPUT "Введи аргументы второй системы (d,e,f)"; d, e, f
PRINT
'если kumb=1, то решение первой системы
PRINT "x="; lvs(a, b, c, d, e, f, 1)
'если kumb=0, то решение второй системы
PRINT "y="; lvs(a, b, c, d, e, f, 0)
|
Создадим функцию пользователя, которая находит наибольший общий делитель (НОД) двух чисел.
FUNCTION SYT (arv1, arv2)
'запомним значения arv1 и arv2, чтобы их можно было в дальнейшем использовать
a=arv1
b=arv2
DO
IF a > b THEN a = a - b
IF b > a THEN b = b - a
LOOP UNTIL a = b
SYT = a
END FUNCTION
|
Приведём пример ещё одной программы сложения двух обыкновенных дробей.
PRINT "Вычислим: a/b+c/d"
INPUT "Введи значения (a,b)"; a, b
INPUT "Введи значения (c,d)"; c, d
'находим НОД
n = b * d
'и знаменатель
l = a * d + c * b
PRINT "Ответ:"; l; "/"; n
'используем функцию пользователя
s=SYT(n, l)
n = n / s
l = l / s
PRINT "Ответ:"; l; "/"; n
|
Чтобы использовать функцию пользователя, она должна быть определена в данной программе.
Одна функция пользователя может содержать внутри себя другую.
Например определим функцию пользователя VYK(a, b)=a*b/SYT(a, b).
FUNCTION VYK(a,b)
VYK=a*b/SYT(a,b)
END FUNCTION
|
При этом функция SYT(a,b) должна быть определена в этой программе.
Следующая функция пользователя выбирает из ”isikukood” дату рождения и оформляет её в виде: dd.mm.yy
FUNCTION ID2SYND$ (isikukood$)
KUUPAEV$ = MID$(isikukood$, 6, 2) + "."
KUUPAEV$ = KUUPAEV$ + MID$(isikukood$, 4, 2) + "."
KUUPAEV$ = KUUPAEV$ + MID$(isikukood$, 2, 2)
ID2SYND$ = KUUPAEV$
END FUNCTION
|
Основная программа:
INPUT "Введи свой код (isikukood):"; ID$
PRINT "Твоя дата рождения:" ID2SYND$(ID$)
|
Если последний пример сохранить и открыть затем в текстовом редакторе, например NotePad, то текст программы будет выглядить следующим образом и его можно распечатать в виде:
DECLARE FUNCTION ID2SYND$ (isikukood$)
INPUT " Введи свой код (isikukood):"; ID$
PRINT " Твоя дата рождения:"; ID2SYND$(ID$)
FUNCTION ID2SYND$ (isikukood$)
KUUPAEV$ = MID$(isikukood$, 6, 2) + "."
KUUPAEV$ = KUUPAEV$ + MID$(isikukood$, 4, 2) + "."
KUUPAEV$ = KUUPAEV$ + MID$(isikukood$, 2, 2)
ID2SYND$ = KUUPAEV$
END FUNCTION
|
Достарыңызбен бөлісу: |