
- •Выполнил: преподаватель Агафонов а. В.
- •Оглавление
- •19. Задания 55
- •22. Задания 59
- •1. Введение
- •2. Переменные
- •Символьные переменные.
- •Числовые переменные
- •3. Операторы присвоения, печати, ввода и ремарки Оператор присвоения
- •Оператор печати
- •Оператор ввода
- •Оператор ремарки
- •4. Арифметические действия.
- •Логический оператор and
- •Верное Верное Верное
- •Логический оператор or
- •Логический оператор not
- •Другие логические операторы xor, eqv, imp
- •7. Оператор условного перехода
- •Оператор if.(условие)..Then.(оператор)..Else..(оператор).
- •Оператор select
- •8. Задания
- •9. Оператор цикла Принудительное прерывание программы
- •Цикл do……loop
- •Цикл for...Next
- •Оператор goto
- •10. Задания
- •Задачи на вычисление сумм.
- •11. Функции
- •Математические функции
- •Символьные функции.
- •Вспомогательные функции
- •Выработка случайных величин.
- •12. Задания
- •13. Операторы графики.
- •Изображение линий и прямоугольников
- •Изображение кругов и эллипсов
- •Раскрашивание
- •Оператор draw
- •14. Задания
- •15. Функция пользователя
- •16. Процедуры
- •Оператор gosub..Return
- •Оператор sub...End sub
- •17. Задания
- •18. Массивы
- •Многомерные массивы
- •Операторы data, read, restore
- •19. Задания
- •20. Работа с файлами.
- •Запись в файл
- •Функция eof принимает значение 1, если конец файла и 0 – в противном случае. Аргументом функции является порядковый номер файла.
- •22. Задания
- •23. Создание функции пользователя в Excel с помощью Visual Basic
14. Задания
Задача 1.
Астроиду, уравнения которой задаются следующими равенствами
x=a*cos(t)3 y=a*sin(t)3 |
(где 0<t<=2*pii , a - константа). |
можно построить с помощью следующей программы:
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" INPUT "Введи аргументы первой системы (a,b,c)"; a, b, c INPUT "Введи аргументы второй системы (d,e,f)"; d, e, f
'если 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 |