5. Задания

advertisement
Таллиннская Тынисмяэская реальная школа
Программирование на языке
QBasic
Составитель:
Галина Василькова
Таллинн
2002
Составитель: Галина Василькова. Программирование на языке QBASIC
Оглавление
1. Введение ............................................................................................................................................. 3
2. Переменные ....................................................................................................................................... 3
Символьные переменные. .................................................................................................................. 3
Числовые переменные ........................................................................................................................ 4
3. Операторы присвоения, печати, ввода и ремарки ..................................................................... 5
Оператор присвоения ......................................................................................................................... 5
Оператор печати ................................................................................................................................. 6
Оператор ввода ................................................................................................................................... 6
Оператор ремарки ............................................................................................................................... 7
4. Арифметические действия. ............................................................................................................. 8
5. Задания ............................................................................................................................................... 8
6. Логические операторы .................................................................................................................... 9
7. Оператор условного перехода ...................................................................................................... 11
Оператор IF.(условие)..THEN.(оператор)..ELSE..(оператор). ...................................................... 12
Оператор SELECT ............................................................................................................................ 13
8. Задания ............................................................................................................................................. 13
9. Оператор цикла .............................................................................................................................. 16
Принудительное прерывание программы ...................................................................................... 16
Цикл DO……LOOP .......................................................................................................................... 17
Цикл FOR...NEXT ............................................................................................................................. 18
Оператор GOTO ................................................................................................................................ 19
10. Задания ........................................................................................................................................... 21
Задачи на вычисление сумм. ........................................................................................................... 21
11. Функции ......................................................................................................................................... 23
Математические функции ................................................................................................................ 23
Символьные функции. ..................................................................................................................... 25
Вспомогательные функции .............................................................................................................. 28
Выработка случайных величин. ...................................................................................................... 29
12. Задания ........................................................................................................................................... 31
13. Операторы графики. .................................................................................................................... 32
Изображение линий и прямоугольников ........................................................................................ 33
Изображение кругов и эллипсов ..................................................................................................... 34
Раскрашивание .................................................................................................................................. 35
Оператор DRAW ............................................................................................................................... 36
14. Задания ........................................................................................................................................... 38
15. Функция пользователя ................................................................................................................ 40
Cвязь между функциями .................................................................................................................. 41
16. Процедуры ..................................................................................................................................... 45
Оператор GOSUB..RETURN ........................................................................................................... 46
Оператор SUB...END SUB ............................................................................................................... 47
17. Задания ........................................................................................................................................... 50
18. Массивы ......................................................................................................................................... 51
Многомерные массивы .................................................................................................................... 53
Операторы DATA, READ, RESTORE ............................................................................................. 55
19. Задания ........................................................................................................................................... 56
20. Работа с файлами. ......................................................................................................................... 56
Запись в файл .................................................................................................................................... 57
Чтение из файла ................................................................................................................................ 57
Добавление текста в файл ................................................................................................................ 58
Уничтожение файла ......................................................................................................................... 58
21. Некоторые примеры .................................................................................................................... 58
22. Задания ........................................................................................................................................... 59
23. Создание функции пользователя в Excel с помощью Visual Basic ...................................... 60
24. Используемые источники ........................................................................................................... 61
2
Составитель: Галина Василькова. Программирование на языке QBASIC
1. Введение
Язык BASIC (Beginner`s All Symbolic Instruction Code) предусмотрен в
основном для начинающих. Он более простой, так как использует обычный
английский язык. Однако сейчас он достаточно развит, что позволяет создавать
на нём и достаточно сложные программы.
Язык программирования родился в Дартмунском университете Америки в
1956 году. У его истоков стояли профессора Джон Кемени и Томас Куртс. В 60х годах язык был преобразован для более удобного использования. В 1975 году
Билл Гейтс и Паул Аллен выработали свою версию языка для персональных
компьютеров. В 1989 году Билл Гейтс заявил, что современные версии языка
BASIC удовлетворяют новым требованиям к языкам программирования. В 1991
году был создан Visual Basic для среды программирования Windows ( ранее был
только для среды MS DOS).
В настоящее время существует много версий языка BASIC: Radio Shack
Level 1 BASIC, Apple Integer BASIC. Better BASIC, RMBASIC, также версии
Microsoft: Gee-Whiz BASIC (GWBASIC), QBASIC, QickBASIC (это не одна и та
же версия!) и Visual Basic. Однако используются последние версии языка
BASIC.
Некоторые версии языка используют компилятор, а некоторые
интерпретатор. Компилятор позволяет создавать файлы типа .exe и таким
образом можно с их помощью создавать программное обеспечение. Версии с
интерпретатором удобнее, но в них программа видна явно, что нежелательно
при создании программного обеспечения.
Здесь выбрана версия QBASIC, использующая интерпретатор. Она
работает в среде DOS и её можно получить бесплатно, в отличии от других
версий, из INTERNETa. QBASIC можно найти также на WINDOWS 98 CD в
каталоге tools\oldmsdos\ и на WINDOWS 95 CD в каталоге other\oldmsdos\.
Поскольку эта версия более доступна, достаточно проста и в то же время
отвечает всем требованиям , предъявляемым к современному языку
программирования, мы и будем её использовать. Умея программировать на
языке QBASIC, нетрудно разобрать и другие версии. Кроме того,
программирование на QBASIC позволяет достаточно развить навыки
программирования, чтобы изучить и другой язык.
2. Переменные
Различают символьные и числовые переменные.
Символьные переменные.
Символьные переменные обозначаются буквой со знаком $. Значение
символьной переменной есть текст, который заключается в кавычки.
Например, следующая программа печатает на экран слово «Мама».
3
Составитель: Галина Василькова. Программирование на языке QBASIC
А$=”MAMA”
PRINT A$
Символьные переменные можно складывать. Например:
А$=”Про“
B$=”грамм“
C$=”а“
PRINT A$+B$+C$
Напечаталось слово «Программа».
А$=”4“
B$=”5“
C$=”6“
PRINT A$+B$+C$
Получилось число 456, а не сумма цифр.
Числовые переменные
Числовые переменные могут быть целыми числами и дробными. В дробях
используется . , например 23.34. Цифры пишутся без кавычек. Напрмер,
PRINT 23.34
Напечатается 23.34
При сложении цифры складываются, как обычно. Например,
PRINT 2+3
Получается 5.
Значения числовых переменных отличаются величиной. Для разной величины
используются разные обозначения.
Пример
!
A!
#
A#
Пояснение
Числовые переменные одинарной точности. Расположены в интервале
-3.402823·1038 до -1.40129·10-45 для отрицательных значений и
1.40129E-45 до 3.402823E38 для положительных значений. Занимают в
памяти 4 байта.
Числовые переменные двойной точности. Расположены в интервале 1.79769313486231·10308 до -4.94065·10-324 для отрицательных величин
и в интервале 4.94065·10-324 до 1.79769313486231·10308 для
4
Составитель: Галина Василькова. Программирование на языке QBASIC
%
A%
&
A&
положительных величин. Занимают в памяти 8 байт.
Числовые переменные целого типа. Расположены в промежутке от 32768
до 32767. Занимают в памяти 2 байта .
Переменные типа Long-integer. Расположены в интервале -2147483648
до 2147483647. Занимают в памяти 4 байта.
В QBASICе не обязательноиспользовать знаки (! % & #). Обычно их
следует использовать в случаях, если требуется экономия памяти, ускорение
работы программы или большая точность при вычислениях.
Рассмотрим на прмерах использование разных видов переменных:
i% = 50 / 17
PRINT i%
или:
i = 50 / 17
PRINT i
или:
i#= 50 / 17
PRINT i#
или:
i! = 50 / 17
PRINT i!
Можно заметить, что от вида переменной зависит точнось ответа. Если
вид переменной не указан, получаем тоже, что и в случае переменной типа i! .
В случае очень больших значений целых чисел, следует после переменной
использовать знак &. Иначе появляется сообщение OVERFLOW
(переполнение).
3. Операторы присвоения, печати, ввода и ремарки
Оператор присвоения
Чтобы присвоить переменной некоторое значение, используется оператор
присвоения LET. Например:
LET A=45
LET B$=”MAMA”
Однако в QBASIC использовать этот оператор необязательно. Можно
просто написать:
5
Составитель: Галина Василькова. Программирование на языке QBASIC
А=45
В$=”MAMA”
Оператор печати
Оператор печати обозначается словом PRINT или знаком ?. Например:
PRINT “МАМА“
?245
В результате на одной строке будет напечатано слово “МАМА”, а на
другой число 245.
Знак ; в конце или между словами обозначает, что текст будет напечатан
подряд. Например,
?”MAMA”; 245;
?”ПАПА“
В результате будет напечатано – МАМА245ПАПА. Чтобы между словами
были пропуски, надо включить пробел в кавычки, например,
?”МАМА ” ; 245 ; “ ПАПА”
В результате получим –МАМА 245 ПАПА
Оператор ввода
Оператор INPUT используется для ввода информации пользователем с
клавиатуры. После оператора в кавычках пишется дополнительная информация,
затем ; и переменная или после оператора сразу переменная.
Например,
INPUT “Как тебя зовут?”; A$
PRINT “Привет“; А$
Запускаем программу на счёт –клавиша F5.
В результате на экране появится:
Как тебя зовут?
С клавиатуры вводим имя –например Маша и программа далее пишет:
Привет Маша
Так компьютор может знакомиться.
При вводе нескольких переменных отделяем их друг от друга запятой.
Например,
INPUT ”Введите ваши имена”; A$, B$, C$, D$
6
Составитель: Галина Василькова. Программирование на языке QBASIC
В результате компьютор прервёт выполнение и через запятую с
клавиатуры надо ввести имена. Если введём , например только два имени,
компьютор запросит с помощью ? дополнительную информацию.
Оператор ремарки
Для ввода комментариев к программе используется оператор REM или´.
Если комментарий пишется вначале строки, всё равно каким пользоватся.
Если же после текста строки с операторами, то используется ´. Если поставить
знак ´ перед строкой с операторами, она будет временно не использоватся, так
как воспринимается, как комментарий. Этим удобно пользоватся при отладке
программы.
Например,
REM Задача 1
N=10 ´Это количество учащихся
´ INPUT A
В этом примере оператор INPUT A временно не действует, так как
воспринимается, как комментарий.
Следует отметить, что если значение переменной меняется, предыдущее
теряется.
Например,
INPUT “Введи текст“; A$
INPUT “Введи число“; B
A$=”Информатика“
B=34567
PRINT A$
PRINT B
Здесь независимо от того, что будем вводить с клавиатуры, печататся
всегда будут: Информатика
34567
Значения всех переменных вначале равны 0, а символьных переменных –
пусто. Пустая символьная переменная обозначается “”.
Например,
PRINT “Значение символьной переменной: “; A$
PRINT “Значение числовой переменной:”; B
В результате получим пустое место и 0. Тоже получим, если задать А$=””,
В=0 и затем распечатать их.
7
Составитель: Галина Василькова. Программирование на языке QBASIC
Для обнуления всех данных можно использовать оператор CLEAR.
Например,
INPUT “Введи текст“; A$
INPUT “Введи число“; B
PRINT A$, B
CLEAR
PRINT A$, B
4. Арифметические действия.
Арифметические действия на языке QBASIC записываются несколько поиному, чем в математике.
Например,
Сложение:
Вычитание 5-2
PRINT 5-2
Деление
5:2
PRINT 5/2
Умножение 52
PRINT 5*2
Возведение в степень
Извлечение квадратного корня
Нахождение остатка от деления
Извлечение кубического корня
Нахождение абсолютного значения
В математике
2+5
QBASIC
PRINT 2+5
52
12
5:2 остаток 1
PRINT 5^2
PRINT SQR(12)
? 5 MOD 2
PRINT 2^(1/3)
PRINT ABS(-3)
|-3|
В выражениях могут быть использованы и переменные. Приведём пример
программы, где вычисляется гипотенуза по значениям двух катетов.
А=5
В=3
SQR(A^2+B^2)
Отметим, что порядок действий в скобках компьютор определяет сам.
5. Задания
Задача 1.
Вычислить значение выражения (Ах+В)(Сх-D) при задаваемых значениях
А, В, С, D. С помощью ремарок написать пояснения и указать, кому
принадлежит программа.
8
Составитель: Галина Василькова. Программирование на языке QBASIC
Задача 2.
По задаваемому значению радиуса R, вычислить следующие параметры:
1. диаметр круга D=2R
2. длину окружности L=2R
3. площадь круга S=R2
4. площадь поверхности сферы P=4R2
5. объём сферы V=4/3R3
Дать подробную распечатку и ввести пояснения.
Задача 3
1. Перевести вводимую температуру по шкале Цельсия в температуру по
шкале Фаренгейта по формуле Tf=Tc(180/100)+32. Чему равна по Фаренгейту
нормальная температура 36,6?
2. Перевести вводимую температуру по шкале Фаренгейта в температуру
по шкале Цельсия по формуле Tс=100(Tf-32)/180. Чему равна по Цельсию
температура 80?
Задача 4
По задаваемым сторонам найти периметр и площадь треугольника, квадрата и
прямоугольника. Дать подробную распечатку и ввести пояснения.
6. Логические операторы
Логические выражения принимают значения 0 (неверно) или другое
значение (верно). Логическое выражение состоит из условия или логических
операторов.
Условия
Рассмотрим следующий пример:
PRINT 2>3
PRINT 5<8
В первом случае получим значение 0, так как условие неверно, а во втором
случае –1, так как условие верно.
В следующем примере ответ будет 0 либо –1 в зависимости от того,
отвечает ли введённое значение условию или нет.
INPUT “Введи число“; x
PRINT x ^ 2 + x - 4 < 0
Выражения, значения которых могут быть либо 0, либо –1 называют
условиями.
9
Составитель: Галина Василькова. Программирование на языке QBASIC
В условиях могут использоватся не только числовые переменные, но и
символьные.
Например,
INPUT “Введи текст“; A$
PRINT a$> “Информатика“
В этом случае неравенство будет верным (равным –1), если введённое
слово будет содержать больше букв, чем слово «Информатика».
Условия могут содержать и другие математические знаки, например,
А меньше В
А больше В
А меньше или равно В
А больше или равно В
А не равно В
А равно В
значение текстовой
A<B
А>В
А<=В
А>=В
А< > B
А=В
А$=”Мама”
переменной равно “Мама”
А$< > B$
переменной А$ не равно В$
значение текстовой
Логический оператор AND
Приведём пример:
PRINT 2<3 AND 7>2
Ответ будет –1, так как оба неравенства верны.
PRINT 2<3 AND 7<2
Ответ будет 0, так как одно из неравенств неверно.
Для оператора AND можно составить таблицу значений:
Условие 1
Верное
Верное
Неверное
Верное
Неверное
Условие 2
Верное
Верное
Неверное
Неверное
Условие 1 AND Условие 2
Неверное
Неверное
Неверное
Отсюда видно, что оператор AND даёт верное значение только в том
случае, если оба условия верны.
10
Составитель: Галина Василькова. Программирование на языке QBASIC
Логический оператор OR
Рассмотрим следующую программу:
CLS
PRINT 2 < 3 OR 4 < 7
PRINT 2 > 3 OR 4 < 7
PRINT 2 < 3 OR 4 > 7
PRINT 2 > 2 OR 4 > 7
Для оператора OR верна следующая таблица значений:
Условие 1
Условие 2
Верное
Верное
Неверное
Верное
Неверное
Условие 1 OR Условие 2
Верное
Верное
Неверное
Неверное
Верное
Верное
Неверное
Оператор OR даёт верное значение тогда, когда по крайней мере одно из
условий верное.
Логический оператор NOT
Оператор NOT делает значение условия противоположным. Он
используется только с одним условием.
Например,
PRINT NOT 2 < 3´Значение неверное - 0
PRINT NOT 2 > 3 ´Значение верное - -1
Другие логические операторы XOR, EQV, IMP
XOR- даёт верное значение только в том случае, если оба условия разные
(т.е. одно верное, одно нет).tõese tulemuse saab üksnes siis, kui mõlemad
tingimused korraga on erinevad (üks tõene ja teine väär).
EQV- даёт верное значение только в том случае, если оба условия
одинаковые (т.е. оба верные или оба нет).
IMP- даёт неверное значение только в том случае, если первое условие
неверное, а второе – верное.
7. Оператор условного перехода
При решении задач в которых действие зависит от условия, используется
оператор условного перехода. Он имеет вид:
11
Составитель: Галина Василькова. Программирование на языке QBASIC
Оператор
IF.(условие)..THEN.(оператор)..ELSE..(оператор).
Пример:
INPUT “Как твоё имя? “; A$
IF A$=”Маша “ THEN PRINT “Привет, Маша“ ELSE PRINT “Привет “; A$
PRINT "Эта программа делит два числа"
INPUT "Введи делимое"; a
INPUT " Введи делитель"; b
IF b=0 THEN
BEEP 'этот оператор даёт гудок
PRINT "Деление на 0 невозможно!"
ELSE
PRINT "Частное от деления равно"; a/b
END IF
Здесь в первой программе используется условный оператор в
сокращённом виде (он должен размещатся на одной строке), а во второй –
используется несколько операторов после THEN. В этом случае делается запись
в виде «лестницы» для удобства чтения программы и заканчивается блок
оператором END IF
Оператор после ELSE может не ставится. Например,
PRINT "Введи число 1-10";
INPUT A
IF A>10 OR A<1 THEN
BEEP
PRINT "Это число не принадлежит этому промежутку!"
END IF
Условный оператор может быть и ещё более сложного вида:
IF условие 1 THEN
Операторы 1
ELSE IF условие 2 THEN
Операторы 2
ELSE IF условие 3 ТHEN
Операторы 3
...............
ELSE IF условие N THEN
Операторы N
ELSE
операторы
END IF
12
Составитель: Галина Василькова. Программирование на языке QBASIC
В этом случае при выполнении условия 1 действуют операторы 1, при
выполнении условия 2 – операторы 2 и т. д. Если ни одно из условий не
выполняется действуют операторы, находящиеся после оператора ELSE.
Оператор SELECT
Рассмотрим выполнение следующей программы.
INPUT "Какую оценку ты получил в школе?"; О
SELECT CASE О
CASE 1
PRINT "Тебе должно быть стыдно..."
CASE 2
PRINT "Слишком мало учил..."
CASE 3
PRINT "Посредственно..."
CASE 4
PRINT "Неплохо!"
CASE 5
PRINT Молодец!"
CASE ELSE
PRINT "Ну это ты обманываешь!"
END SELECT
Здесь в случае О=1 действует CASE 1, в случае О=2 - CASE 2 и т. д. Если
задаёшь О=6 получаешь ELSE.
8. Задания
Задача 1.
Вычислить значениеY, если Y=sin x/(x-1)^2 при x не равном 1 и Y=1 при x
равном 1.
Задача 2.
Вычислить значениеY, если Y=1-х при x большем или равном 1 и Y=х-1
при x меньшем 1.
Задача 3.
Вычислить значениеY, если Y=х +1 при x меньшем 2, Y=х+2 при x
меньшем 3 но больше или равном 2 и Y=х+3 при х большем или равном 3.
Задача 4.
Вычислить значениеY, если Y=х ^2 при м=1, Y=2*х при м=2, Y=х+1 при
м=3, Y =0 при м=4 и Y=х-1 при м=5.
13
Составитель: Галина Василькова. Программирование на языке QBASIC
Задача 5.
Вычислить значениеY=sign (x) т. е. Y=1 при x большем 0, Y=0 при х=0 и
Y= -1 при x меньшем 0.
Задача 6.
Вычислить значениеY, если Y=tg x^2 при x равном /2 и Y=соs х при х= .
Задача 7.
Составить программу решения квадратного уравнения.
Задача 8.
Задача определения, что случится с ракетой в зависимости от её начальной
скорости.
Алгоритм решения:
1. Вводится значение начальной скорости V0.
2. Печать «Ракета упадёт на Землю», если V0 меньше 7.8.
3. Печать «Ракета станет спутником Земли», если V0 больше или равно
7.8 и меньше 11.2.
4. Печать «Ракета станет спутником Солнца», если V0 больше или равно
11.2 и меньше 16.4.
5. Печать «Ракета покинет Солнечную систему», если V0 больше или
равно 16.4.
Задача 9.
Вычислить значение Y, если Y=1/x + 1/(x-1). Учесть случаи, когда Y не
имеет решения.
Задача 10.
Нахождение наибольшего общего делителя (НОД) двух натуральных
чисел А и В по алгоритму Евклида.
Алгоритм Евклида:
1. Задаются два натуральных числа А и В.
2. Если А=В, то НОД =А
3. Иначе, найти разность между большим и меньшим числом и заменить
ею большее число.
4. Перейти к 1.
Задача 11
14
Составитель: Галина Василькова. Программирование на языке QBASIC
Определить, принадлежит ли точка с координатами (х,y) фигуре на
плоскости, задаваемой уравнениями:
1. y>=0 и модуль х+модуль y меньше или равно 1
y
1
-1
2. y<=0 и модуль х+модуль y1меньше или равно 1
x
y
-1
1
x
-1
3. Модуль х+модуль y меньше или равно 1
y
y
-1
1
x
-1
Указать также, если точка
не принадлежит ни одной фигуре.
Задача 12
Найти наибольшее из двух чисел.
Задача 13
Найти наибольшее из трёх чисел.
Задача 14
Определить знак числа N.
15
Составитель: Галина Василькова. Программирование на языке QBASIC
Задача 15
Дан треугольник со сторонами А, В, С. Определить вид угла С (острый,
тупой, прямой).
Задача 16
Найти квадрат наибольшего из двух чисел А и В и напечатать признак N
=1, если наибольшим является А и N=2, если наибольшим является В.
Задача 17
Определить, попадёт ли точка с координатами (Х, Y) в круг радиуса R.
Уравнение окружности R^2 = Х^2+Y^2. Присвоить признак N=1, если точка
находится внутри круга и признак N=2, если точка находится вне круга.
Задача 18
Определить, в каком квадранте находится точка с координатами (Х, Y) и
отпечатать номер квадранта.
Y
I
II
X
III
IV
Задача 19
Проверить, что введённое число простое.
9. Оператор цикла
Принудительное прерывание программы
До сих пор рассматривались программы, которые выполняли
операторытолько один раз. Но часто бывает нужно, чтобы оператор выполнялся
заданное число раз. Бывает, что нужно, чтобы оператор выполнялся до тех пор,
пока выполняется некоторое заданное условие. Если записано неверное
условие, то программа может выполять оператор бесконечное число раз. Для её
прерывания используется комбинация клавиш CTRL+BREAK.
16
Составитель: Галина Василькова. Программирование на языке QBASIC
Приведём пример программы, которая заканчивается принудтительным
прерыванием.
DO
PRINT “INFORMATIKA”;
LOOP
Цикл DO……LOOP
Создадим программу, которая работает до тех пор, пока пользователь не
ответит «ДА» или «да» на вопрос «Нравится ли вам QBASIC?”. Если
пользователь ответит что-то другое, программа спрашивает его заново.
DO
INPUT « Нравится ли вам QBASIC?”, O$
LOOP UNTIL O$=«ДА» OR O$= «да»
PRINT « Прекрасно! »
Обратим внимание, что, если в операторе INPUT используется запятая,
знак ? в конце текста не ставится, а если стоит ; ,то ставится.
Общая структура операторов DO…. LOOP:
Первая возможность – это когда логическое условие находится в конце.
Например:
DO
………(Операторы)
LOOP UNTIL (логическое выражение)
В последнем примере было логическое выражение O$=«ДА» OR O$= «да»
Вторая возможность – написать логическое выражение вначало.
Например,
DO UNTIL (логическое выражение)…
…(операторы)
LOOP
Оба цикла выполняют операторы до тех пор, пока условие неверно
(значение равно 0). Если условия нет, то цикл бесконечный. Иногда вместо
команды UNTIL используется команда WHILE. Тогда цикл работает до тех пор,
пока условие выполняется (значение –верно, т.е. отличное от нуля)
Логическое условие может быть написано вначале:
DO WHILE (логическое условие)
(операторы)
LOOP
Логическое условие может быть написано в конце:
DO
(операторы)
LOOP WHILE (логическое условие)
17
Составитель: Галина Василькова. Программирование на языке QBASIC
Если WHILE или UNTIL находятся в конце, то цикл выполняется хотя бы
один раз , а если впереди, то ноль или больше раз.
Рассмотрим ещё две программы, где используется оператор WHILE или
UNTIL. Программы печатают все числа от 1 до 10.
Программа 1.
I=1
DO
PRINT I
I=I+1
LOOP UNTIL I=10
Программа 2.
I=0
DO
PRINT I
I=I+1
LOOP WHILE I<10
Из цикла DO …..LOOP можно выйти и преждевременно. Для этого
используется оператор EXIT DO. Рассмотрим программу, которая находит такое
значение I, что II=2. Программа заканчивает выполнение, когда находит
значение I с заданной точностью. Программа заканчивает работу, если не
находит такое значение, т.е. I становится больше 2 и нет смысла искать
значения дальше.
DO
I=I+0.0001
IF ABS (2-I^I)<0.001 THEN
PRINT “Значение равно”; I
EXIT DO
END IF
LOOP UNTIL I>2
PRINT «Программа закончила работу»
При изменении шага и точности могут возникнуть случаи, когда решения
нет.
Цикл FOR...NEXT
Цикл FOR…NEXT хорошо использовать, когда нужен счётчик. Например
в следующей программе мы считаем количество ходов.
FOR I=1 TO 10 STEP 2
PRINT I
NEXT
Программа напечатает 1, 3,5, 7, 9.
18
Составитель: Галина Василькова. Программирование на языке QBASIC
Циклы могут быть вложенными один в другой. Например в следующей
программе.
Программа печатает таблицу умножения.
CLS´Чистит экран
FOR I=1 TO 10
FOR J=1 TO 10
PRINT I*J
NEXT J
PRINT ´Начинается новый ряд
NEXT I
Вначале закрывается внутренний цикл, затем внешний.
Можно использовать переменные цикла внутри программы, например в
программе выбора цветов.
CLS
FOR I=1 TO 31
COLOR I´Выбор цвета
PRINT “Цвет“; I;
NEXT I
Выполнение цикла можно прервать. Для этого используется оператор
EXIT FOR. Рассмотрим программу, которая находит наибольшее n из
промежутка 1……….100, удовлетворяющее условию: 1+2+3+ +n<1000. После
нахождения числа программа прерывается.
FOR N=1 TO 100
SUM=SUM+N
IF SUM >=1000 THEN EXIT FOR
NEXT N
PRINT N
В этой программе видно также, что при выходе из цикла печатается
последнее принимаемое переменной значение.
Оператор GOTO
Оператор GOTO прост, однако не стоит им злоупотреблять. Приведём
пример программы которая пишет на экран «Привет!» и спрашивает у
пользователя разрешения сделать это снова. Если пользователь ответит
утвердительно («Да» или «да»), то программа снова напишет на экране
«Привет!»
Snova:´Помечаем ряд
PRINT “Привет!»
INPUT “Желаешь ещё?»; O$
IF O$=”ДА» OR O$=”да“ THEN GOTO snova
19
Составитель: Галина Василькова. Программирование на языке QBASIC
В данной программе пометили ряд словом Snova: После слова нужно
двоеточие. Можно помечать ряды цифрами. Одинаковых цифр быть не может.
Рассмотрим программу, которая проверяет верность пароля. Пометим
ряды цифрами.
10 INPUT “Введи пароль“; PAROOL$
20 IF PAROOL$=”Abrakadabra” THEN GOTO 50
30 PRINT “Пароль неверный!“
40 GOTO 10
50 PRINT “Пароль верный!“
Номера рядов использовались в более старых версиях Бейсика. Нумерация
шла через 10, чтобы можно было вставить между ряд. В современных версиях
нумерация необязательна, например предыдущую программу можно записать
без нумерации следующим образом:
INPUT “Введи пароль“; PAROOL$
IF PAROOL$<>”Abrakadabra” THEN PRINT “Пароль неверный!
LOOP UNTIL PAROOL$=”Abrakadabra”
PRINT “Пароль верный!“
Приведём пример программы, которая позволяет выучить таблицу
умножения.
Поскольку программа большая, её удобно запускать по- шагам, используя
клавиши F8 и F4.
F8 выполняет один ряд программы.
F4 позволяет смотреть текст на экране.
PRINT "Эта программа позволяет выучить таблицу умножения"
INPUT "Какое число умножаем?"; ARV
home:
FOR I = 1 TO 10
back: 'Это обозначение ряда
PRINT ARV; "*"; I; "=";
INPUT ОТVЕT
'...Ждём ответа
'Если ответ неверный пишем заново условие и считаем количество неверных
ответов.
IF ARV * I <> VASTUS THEN
PRINT "Неверно! Попробуй ещё!"
Valesid = Valesid + 1'Считаем количество неверных ответов
GOTO back
END IF
'Сюда попадаем, если ответ верный
NEXT I
20
Составитель: Галина Василькова. Программирование на языке QBASIC
'здесь проверяется, были ли ошибки
IF Valesid <> 0 THEN
CLS
PRINT "Сделал ошибки. Начнём сначала."
'Обнуляем количество неверных ответов
Valesid = 0
GOTO home
END IF
'Сюда попадаем, если все 10 ответов были верны
PRINT "Молодец!"
10. Задания
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Напечатать таблицу квадратных корней натуральных чисел от 1 до
20.
Записать на экране 30 раз «Мяу-мяу».
Записать на экране вводимое слово заданное число раз.
Воспользоватся оператором цикла и обойдясь без него, например ,
используя оператор GOTO.
Среди задаваемых 10 чисел. Проссумировать те, которые являются
положительными.
Подсчитать число нулей в последовательности из 10 чисел.
Изменить знаки заданных 10 чисел на противоположные.
Составить программу возведения числа А в стапень N.
Вычислить сумму квадратов чисел от 1 до N.
Вычислить сумму квадратов чётных чисел и кубов нечётных чисел
среди 100 чисел.
Найти все пифагоровы числа а, в,с , такие, что а^2+b^2=c^2 для
1<=a<=20, 1<=b<=20, 1<=c<=20.
Найти и напечатать все трёхзначные числа, сумма кубов цифр
которых равна самому числу.
Задачи на вычисление сумм.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Вычислить значение суммы чисел от 1 до 100.
Вычислить суммы рядов:
S=1/2+2/3+…….+(n-1)/n
S=1+1/3^2+….+1/(2n-1)^2
Xn=1-1/3+1/5-….(-1)^(n-1)/(2n-1)
Sn=1+1/2+1/4+ …1/2^n
S=1+1/2^2+1/3^2+….+1/n^2
S=x-x^2/2+x^3/3-x^4/4+….+(-1)^(n-1)*x^n/n
Вычисление произведений:
N!=1*2*3*4 …*n
21
Составитель: Галина Василькова. Программирование на языке QBASIC
11.
12.
13.
14.
15.
16.
17.
Y=n(n-1)(n-2)….(n-k+1)
Вычислить сумму:
S=1*2+1*2*3+….+1*2*3*…*n
B=N!/(K!*(N-K)!)
S=1*x/1+x^2/1*2+…+x^n/1*2*3*…*n
Записать таблицу умножения.
Решить задачу: В 4 дома ежедневно доставляется молоко. Сколько
молока было доставлено за неделю в каждый дом?
22
Составитель: Галина Василькова. Программирование на языке QBASIC
11. Функции
Рассмотрим три вида функций:
1. Математические функции
2. Символьные функции
3. Специальные функции
Математические функции
Для всех этих функций аргументом является число и значением тоже
число.
ABS
Aбсолютное значение числа. Значением является само число, если аргумент
положителен и противоположное значение, если аргумент отрицателен.
Пример:
PRINT ABS(100)
PRINT ABS(-100)
PRINT ABS(0)
ATN
Функция арктангенса.
Например:
PRINT 4*ATN(1) 'Это значение пи.
COS
Функция касинуса. Значение аргумента задаётся в радианах.
Пример:
INPUT "Введи угол в градусах"; А
'Переводим его в радианы
R = A * ATN(1) * 4 / 180
PRINT "Косинус угла равен"; COS(R)
Замечание. Поскольку перевод в радианы приблизительный и результат будет
приблизительным. Например косинус 90 градусов будет равен -4.371139E-08 , а
не нуль.
CINT
Функция првращает дробное число в целое.
Например:
PRINT CINT(3.68) 'Ответ 4
23
Составитель: Галина Василькова. Программирование на языке QBASIC
FIX
Отделяет целую часть вещественного числа.
Пример:
PRINT FIX(-3.69) 'Ответ -3
PRINT FIX(78.55) 'Ответ 78
LOG
Функция натурального логарифма ln x. Это единственная логарифмическая
функция в QBASIC. Для вычисления логарифма по другому основанию, надо
делать перевод.
Пример:
INPUT "Введи основание логарифма"; a
INPUT "Веди логарифмируемое"; b
PRINT "Логарифм"; b; "при основании"; a; "есть"; LOG(b) / LOG(a)
EXP
Функция ex.
Пример:
PRINT EXP(1) 'Результат -значение e
PRINT EXP(0) 'Результат- 1
PRINT EXP(10)
INT
Функция выделения целой части числа. Даёт ближайшее целое число, не
превышающее значение аргумента.
Пример:
INPUT "Введи нецелое число"; N
PRINT "Целая часть числа есть";INT(N)
RND
Функция даёт значения случайных чисел в промежутке от 0-до 1.
Пример:
PRINT "Эта программа даёт значения случайных чисел от 1 до 6."
PRINT INT(RND*6+1)
SGN
Функция даёт знак числа. Знак числа будет –1, 0 или 1 в завичсимости от того
является ли число отрицртельным, 0 или положительным.
Пример:
PRINT SGN(-700)
PRINT SGN(3.14)
24
Составитель: Галина Василькова. Программирование на языке QBASIC
PRINT SGN(0)
SIN
Функция синуса. Аргументом является угол, заданный в радианах..
Пример:
INPUT "Введи угол в радианах"; r
PRINT "Синус этого угла равен"; SIN(r)
SQR
Функция квадратного корня. Аргументом является неотрицательное число.
Пример:
PRINT "Эта программа находит гипотенузу треугольника"
INPUT "введи первый катет"; a
INPUT "введи второй катет"; b
c = SQR(a * a + b * b)
PRINT "Длина гипотенузы равна"; c
TAN
Функция тангенса. Аргументом является угол в радианах.
Пример:
INPUT "Введи угол в радианах"; r
PRINT "Тангенс этого угла равен"; TAN(r)
Символьные функции.
К этим функциям относятся функции, аргументом которых является текст.
ASC
Функция ASC. Даёт значение функции в кодах ASCII .
Пример:
PRINT ASC("A")
CHR$
Функция, обратная функции ASC. Аргументом является значение кода
символа, а значением символ.
Пример:
PRINT CHR$(81)
INSTR
Функция, позволяющая найти подстроку из строки и указать место, где
она находится.
25
Составитель: Галина Василькова. Программирование на языке QBASIC
Пример:
Программа ищет место, где находится знак @
'если знака @ нет, то значение функции0
INPUT "Введи свой электронный адрес"; email$
S = INSTR(email$, "@")
PRINT "Знак @ находится на месте"; S
LCASE$
Функция превращает символьную строку в строку, написанную
маленькими буквами.
Пример:
PRINT LCASE$("JOOSEP@KUSKIL.EE")
LEFT$
Аргументом функции является символьная строка и число. Выбирает
слева столько символов, сколько указано в числе.
Пример:
a$ = "Microsoft QBASIC"
PRINT LEFT$(a$, 5)'Получаем: Micro
LEN
Аргументом ввляется символьная строка. Функция показывает сколько
символов содержит строка.
Пример:
INPUT "Введи своё имя"; N$
PRINT "В твоём имени "; LEN(N$); "букв"
LTRIM$
Аргументом является символьная строка. Функция убирает слева все
пустые места (если они были). У положительного числа слева есть , в частности
пустое место для знака.
Пример:
a$=" BLAH"
PRINT LTRIM$(a$)
26
Составитель: Галина Василькова. Программирование на языке QBASIC
MID$
Аргументами является символьная строка и два числа. Функция выбирает
из символьной строки с заданного места указанное число символов.
Пример:
a$ = "Информатика"
PRINT MID$(a$, 3, 5)
'Результатом будет -форма
Замечание:
Функцию можно использовать и для замещения.
Пример:
A$ = "Mann Potik"
PRINT "Фамилия до брака "; A$
MID$(A$, 6, 5) = "Kuusk"
PRINT "Фамилия после брака: "; A$
RIGHT$
Аналогична функции LEFT$. Выбирает справа столько знаков, сколько
указано в числе.
Пример:
a$ = "Microsoft QBASIC"
PRINT RIGHT$(a$, 5) 'Результатом будет: BASIC
RTRIM$
Функция убирает справа в символьной строке все пустые места.
Пример:
a$="BLAH
"
PRINT RTRIM$(a$)
STR$
Функция превращает число с символьную строку.
Пример:
27
Составитель: Галина Василькова. Программирование на языке QBASIC
ARV=45*2+5
TEKST$="WINDOWS "+STR$(ARV)
PRINT TEKST$
UCASE$
Функция превращает символьную строку в строку, написанную большими
буквами.
Пример:
PRINT UCASE$("as siil ruudus")
VAL
Превращает символьную строку в число, если это возможно. Иначе даёт
значение 0.
Пример:
Tekst$ = "100" 'Это текст
Arv = VAL(Tekst$) 'превращаем текст в число
PRINT 2 * Arv 'число можно умножать
Вспомогательные функции
DATE$
Функция даты. Аргументов нет. Выдаёт сегодняшнее число в виде
символьной строки.
Пример:
PRINT DATE$
.
TIME$
Функция времени. Аргументов нет. Выдаёт значение времени в виде
символьной строки.
Пример:
PRINT TIME$
Замечание: С помощью этой функции можно менять время на компьютере.
28
Составитель: Галина Василькова. Программирование на языке QBASIC
TIMER
Функция указывает количество секунд, которые прошли с 12 часов ночи.
Используется при генерации случайных чисел.
Пример: (эту программу надо самим прерывать с
помощью CTRL+BREAK
DO
LOCATE 1, 1 'курсор на позицию 1,1
PRINT TIMER
LOOP
INKEY$
Функция читает нажатые клавиши. Нет аргументов. Если клавиша не
нажимается. Значением является пустая символьная строка.
Пример: (типичный случай "press any key to continue..." )
PRINT "Нажми клавишу для продолжения....."
'цикл продолжается. Пока значением 'inekey$ не будет пустая
строка
DO
LOOP UNTIL INKEY$ <> ""
Выработка случайных величин.
Для выработки случайных чисел используется специальный алгоритм,
который вырабатывает случайные числа, начиная с заданного числа. Чтобы
числа были разные, надо изменять заданное число.
Рассмотрим программу, которая вырабатывает случайные числа. Начиная
с 1.
RANDOMIZE 1 '1 – есть задаваемое начальное число.
A=RND 'переменной А присваивается случайное
значение из промежутка 0,1.
PRINT A 'печатаем на экран значение А
Оператор RANDOMIZE включает генератор случайных чисел.
Начальным заданным числом является 1. Если запускать программу несколько
раз, каждый раз будет получатся одно и то же случайное число. Если вместо 1
поставить другое число, случайное значение изменится. Такой метод не годится
для выработки последовательности случайных чисел. Однако можно для
последующего случайного числа в качестве задаваемого брать предыдущее
случайное число.
Пример:
RANDOMIZE 1
29
Составитель: Галина Василькова. Программирование на языке QBASIC
A = RND
PRINT A
RANDOMIZE A 'меняем задаваемое исходное число
B = RND
PRINT B
При использовании цикла можем генерировать много чисел.
Пример:
FOR i = 1 TO 10
RANDOMIZE A
A = RND
PRINT A
NEXT i
Эта программа даёт 10 случайных чисел, но при её последующем запуске
получим те же числа, что не всегда удобно.
Следующая программа представляет собой лототрон, т.е. колесо,
смешивающее числа, останавливается при нажатии любой клавиши и выдаёт
число.
DO
RANDOMIZE A
A = RND
LOOP UNTIL INKEY$ <> ""
PRINT "Выпало случайное число:"; A
В этом случае числа будут разные, т.к. клавиша будет
нажиматся в разное время.
В данной версии Бейсика удобно в качестве начального задаваемого числа
использовать число, которое даёт функция TIMER.
Пример:
RANDOMIZE TIMER
A = RND
PRINT A
В этом случак случайные числа зависят от момента запуска прграммы.
Функция RANDOM вырабатывает числа из промежутка 0,1. Если нужно
большее число, надо использовать математические выражения:
Надо получить:
A является случайным числом между 0 и 10
A является случайным числом между 0 и 9
A является случайным числом между 1 и 10
30
Пишем:
A=RND*10
A=INT(RND*10)
A=INT(RND*10+1)
Составитель: Галина Василькова. Программирование на языке QBASIC
Ниже приведена программа, которая вырабатывает целые случайные
числа из промежутка от А до В.
RANDOMIZE TIMER
PRINT "Эта программа находит целые случайные числа из промежутка от
А до В"
INPUT "Введи A";A
INPUT "Введи B";B
J=INT(RND*(B-A+1)+A)
PRINT J
12. Задания
1. Сделать программу, которая спрашивает у пользователя длины сторон
треугольника и ищет площадь этого треугольника. Вначале программа
проверяет, что задаваемые стороны подходят для построения
треугольника.
2. Программа решения уравнения Ах+В=Dx+C. Программа запрашивает
значения А,В,С и D и выясняет сколько решений имеет уравнение или
не имеет вообще.
3. Составить программу, которая находит сумму цифр числа.
4.
Выяснить, является ли слово полиндромом или нет, т.е. читается ли
оно
5. Составить программу, которая вычисляет арксинус и арккосинус
задаваемого угла.
6. Составить программу, которая вычисляет кубический корень из
вещественного числа (в том числе отрицательного).
7. В единичный квадрат вписан круг. В квадрат бросаются случайно N
точек. Составить программу, моделирующую эту ситуацию и
вычисляющую значение 4*Р/ N, Р –количество точек, попавших в круг.
N –задаётся пользователем. Что представляет собой число 4*Р/ N?
Точки задаём случайными координатами (x,y).
8. Составить программу, которая подсчитывает количество букв в
задаваемой фамилии.
9. Дан текст «файл первый». Переставить слова, чтобы получилось
«первый файл».
31
Составитель: Галина Василькова. Программирование на языке QBASIC
10. Дан текст «Миру –мир». Получить текст «!!!!!Миру –мир!!!!!»
11. Дан текст «хорошо окончить школу – наша задача». Получить текст
«наша задача –это хорошо окончить школу»
12. Выписать задуманное слово от конца к началу.
13. Закодировать задуманное слово его кодами. Раскодировать
полученное.
13. Операторы графики.
При выполнении графических команд, надо прежде всего задать
оператором графический экран.
Оператор SCREEN 12 задаёт графический экран размером 640*480
пикслей.
Оператор SCREEN 0 задаёт обычный текстовый экран. Этот экран
используется. Если хотим из графического экрана перейти в текстовый. Экран
при этом очищается.
При рисовании используется система координат, но начальная точка (0,0)
находится в левом верхнем углу.
Горизонтальная ось Х идёт слева направо и имеет от 0 до 640 точек. Ось У
идёт сверху вниз и имеет от 0 до 480 точек.
Точку на экран ставят с помощью команды PSET (x, y), цвет, где х, y –
координаты точки, параметр цвет есть число от 1 до 16 (не обязателен).
Пример:
SCREEN 12 'обязательно
PSET (320, 240),14 'жёлтая точка в центре экрана
Следующая программа рисует случайную точку случайным цветом.
SCREEN 12
RANDOMIZE TIMER
DO
x = INT(RND * 640) 'x координата
y = INT(RND * 480) 'y координата
v= INT(RND * 16) 'цвет
PSET (x, y), v 'ставим точку с этим цветом на экран
LOOP UNTIL INKEY$ <> ""
32
Составитель: Галина Василькова. Программирование на языке QBASIC
Следующая программа рисует синусоиду и косинусоиду:
SCREEN 12
'начинается цикл, где х меняется от 0 до 640 с шагом 0.01
FOR x = 0 TO 640 STEP .1
'считаем координаты у , учитывая, что начало координат находится
в левом верхнем углу.
SINY=240 + 200 * SIN(x / 30)
COSY=240 + -200 * COS(x / 30)
'ставим на экран 2 точки разного цвета
PSET (x, SINY), 2
PSET (x, COSY), 4
NEXT x
Изображение линий и прямоугольников
Линию можно провести с помощью оператора LINE.
Например,
LINE (A, B) - (C, D), цвет - проводит линию из точки с координатами (А,В)
до точки с координатами (С, D) с заданным номером цвета (цвет указывать
необязательно)
Для изображения прямоугольника используется оператор LINE (A, B) - (C,
D), цвет, В (от слова ВОХ)
Оператор , LINE (A, B) - (C, D), цвет, ВF (от слова ВОХ FILL)
Следующий пример удобно просмотреть пошажно командами DEBUG>STEP (F8) и VIEW->OUTPUT SCREEN (F4) .
SCREEN 12
LINE (0, 0)-(640, 480)'прямая по диагонали экрана
LINE (20, 50)-(70, 100), , B 'квадрат
LINE (80, 80)-(100, 100), 2, B 'зелёный квадрат
LINE (200, 110)-(250, 300), 4, BF 'красный заполненный квадрат
Во второй строке видно, что если не хотим указывать цвет, оставляем это
место пустым.
Рассмотрим программу, рисующую отрезки со случайными концами и
цветом.
33
Составитель: Галина Василькова. Программирование на языке QBASIC
SCREEN 12
RANDOMIZE TIMER 'включаем генератор случайных чисел
DO
'генерируем координаты и цвет
a = INT(RND * 640)
b = INT(RND * 480)
c = INT(RND * 640)
d = INT(RND * 480)
v = INT(RND * 16 + 1)
'проводим линию
LINE (a, b)-(c, d), v
'цикл продолжается до нажатия клавиши
LOOP UNTIL INKEY$ <> ""
Изображение кругов и эллипсов
Круги и эллипсы рисуются с помощью оператора CIRCLE, к которому
добавляются параметры.
CIRCLE x,y,радиус,цвет,начало,конец,коэффициент сжатия
Здесь:
 x и y – координаты центра.
 Цвет – число от 1 до 16.
 Начало – начальное значение дуги в радианах, по умолчанию 0.
 Конец – конечное значение дуги в радианах, по умолчанию
2*pii (pii = 3,14...)
 Коэффициент сжатия – отношение высоты эллипса к его
ширине, для круга равен 1.

В случае круга достаточно параметров центра круга и радиуса.
Приведём пример изображения круга и эллипса.
Его построение можно исследовать, нажимая клавиши F8 и F4.
SCREEN 12
CIRCLE (100, 100), 30 'обычный белый круг
CIRCLE (200, 100), 30, 4 'красный круг
CIRCLE (200, 300), 30, 9, 3.14 'синяя дуга
CIRCLE (400, 180), 60, 2, , , 4 'зелёный овал
34
Составитель: Галина Василькова. Программирование на языке QBASIC
Рассмотрим программу, где меняется коэффициент сжатия.
SCREEN 12
FOR к = 1 TO 16 STEP 0.1
CIRCLE (150, 240), 150, 2, , , к
NEXT
FOR к = 1 / 16 TO 1 STEP .1
CIRCLE (460, 240), 150, 4, , , к
NEXT
Раскрашивание
Раскрасить замкнутую область можно с помощью оператора PAINT:
PAINT (x,y),цвет,цвет границы
Рассмотрим следующую картинку рыбы:
SCREEN 12
CIRCLE (190, 100), 100, 1, , , .3 'синий эллипс –тело рыбы
CIRCLE (265, 92), 5, 1, , , .7 'синий эллипс – глаз рыбы
'ограниченное синим тело рыбы станет зелёным
PAINT (190, 100), 2, 1
LINE (40, 120)-(40, 80), 2 'зелёный контур
LINE (40,80)-(100, 100), 2 'рыбий хвост
LINE (100,100)-(40, 120), 2'рисунок
'хвост с зелёным контуром становится синим
PAINT (50, 100), 1, 2
Ниже даётся эффектная программа с использованием операторов
PAINT и CIRCLE:
RANDOMIZE TIMER 'мешаем случайные числа
SCREEN 12
DO
X = RND * 640
'случайный центр
Y = RND * 480
Raadius = RND * 100
'случайный радиус
C = INT(RND * 14 + 1)
'случайный цвет C
35
Составитель: Галина Василькова. Программирование на языке QBASIC
CIRCLE (X, Y), Raadius, 15 'круг с белым контуром
PAINT (X, Y), C, 15
'закрашиваем белый круг цветом C
CIRCLE (X, Y), Raadius, C 'рисуем круг цветом С
LOOP UNTIL INKEY$ <> ""
Ещё одна интересная программа:
INPUT "Введи радиус"; R
'выбираем местоположение и направление движения
d 'направление движения
MI = 1: NI = 1
'центр
M = 100: N = 100
'включаем графический экран и начинаем рисовать
SCREEN 12
DO
'проверяем, что не выходим за пределы
IF M < R OR M > 640 - R THEN MI = -MI
IF N < R OR N > 480 - R THEN NI = -NI
CIRCLE (M, N), R, 0 'закрашиваем чёрным (для стирания)
M = M + MI
N = N + NI
CIRCLE (M, N), R 'белый цвет
'далее стоит задержка (число 200 может быть увеличено)
FOR pidur = 1 TO 200
NEXT pidur
LOOP UNTIL INKEY$ <> ""
Оператор DRAW
Рассмотрим следующую программу:
SCREEN 12
DRAW "U100 L200 D100 R200"
С помощью оператора DRAW можно двигать невидимый карандаш в
разных направлениях. В этом примере двигаем его на 100 единиц вверх (U100 UP), затем на 200 единиц влево (L200 -LEFT), затем на 100 единиц вниз (D100 DOWN) и на 200 единиц вправо (R200 -RIGHT).
36
Составитель: Галина Василькова. Программирование на языке QBASIC
Нарисовав 4 прямоугольника, получаем окно:
SCREEN 12
DRAW "U100 L200 D100 R200"
DRAW "D100 L200 U100 R200"
DRAW "D100 R200 U100 L200"
DRAW "U100 R200 D100 L200"
Эта же программа может быть записана по-другому.
SCREEN 12
DRAW "U100L200D100R200D100L200U100R200D100"
DRAW "R200U100L200U100R200D100L200"
Следующая программа рисует треугольник.
SCREEN 12
DRAW "U100 TA120 U100 TA60 D100"
Здесь ТА120 меняет угол рисунка на 120 градусов. (TURN ANGLE)
Таким образом, у экранного курсора есть не только местоположение, но и
угол, который может менятся от –360 градусов до 360. Вначале рисуем под
углом 0 градусов.
По умолчанию единицей измерения является 1 пиксел. Но его можно
изменять.
Оператор DRAW имеет следующий общий вид:
DRAW text$ где text$ есть текстовая переменная, состоящая из следующих
элементов:
Смещает графический курсор на nr единиц вниз (без задания nr – на 1
единицу вниз (down).
Смещает графический курсор на nr единиц вниз (без задания nr – на 1
Unr
единицу вверх (up).
Смещает графический курсор на nr единиц вниз (без задания nr – на 1
Rnr
единицу вправо (right)
Смещает графический курсор на nr единиц вниз (без задания nr – на 1
Lnr
единицу влево (left)
Enr
Смещает графический курсор на nr единиц по диагонали вверх и направо
Fnr
Смещает графический курсор на nr единиц по диагонали вниз и направо
Gnr
Смещает графический курсор на nr единиц по диагонали вниз и налево
Hnr
Смещает графический курсор на nr единиц по диагонали вверх и налево
Mx
Смещает графический курсор на точку с координатами х ,y . Если перед
ними стоит знак +,- учитывается местоположение курсора.
Dnr
,y
37
Составитель: Галина Василькова. Программирование на языке QBASIC
B
Движется, не рисуя
N
Рисует линию, оставляя курсор невидимым в том же месте.
Anr
Делает поворот на nr * 90°. nr может быть 0, 1, 2 или 3
Cnr
Устанавливает цвет
Pjo
Закрашивает изображение. Первый параметр указывает цвет закраски,
onv,taust
второй- границу окраски.
v
Устанавливает масштаб , по умолчанию nr=4, т.е. 1:1. nr может быть целое
Snr
число от 1.до .255.
TA
Устанавливает угол рисунка в градусах от -360..до 360. По умолчанию =0.
kraad
Пример программы рисунка:
SCREEN 12
PRINT "Нажми на стрелку."
PRINT "Для окончания нажми ESC"
DO
klahv$ = INKEY$
SELECT CASE klahv$
CASE CHR$(0) + "H" 'стрелка вверх
DRAW "U10"
CASE CHR$(0) + "P" 'стрелка вниз
DRAW "D10"
CASE CHR$(0) + "K" 'стрелка влево
DRAW "L10"
CASE CHR$(0) + "M" 'стрелка вправо
DRAW "R10"
CASE CHR$(27) 'клавиша ESC
END
END SELECT
LOOP
14. Задания
Задача 1.
Астроиду, уравнения которой задаются следующими равенствами
x=a*cos(t)3
(где 0<t<=2*pii , a - константа).
y=a*sin(t)3
можно построить с помощью следующей программы:
SCREEN 12
a = 100
'ATN(1)*8=2*pii
FOR t = 0 TO ATN(1) * 8 STEP .01
38
Составитель: Галина Василькова. Программирование на языке QBASIC
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 . Точки внутрь и вне круга ставим разного цвета.
39
Составитель: Галина Василькова. Программирование на языке QBASIC
Задача 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))
40
Составитель: Галина Василькова. Программирование на языке QBASIC
END SELECT
END DEF
INPUT "Введи число из отрезка [-1; 1]"; a
PRINT "Арксинус равен "; FNARCSIN(a); " радиан."
PRINT " или "; 180*FNARCSIN(arv)/FNPII; " градусов."
Cвязь между функциями
Используя следующие математические соотношения, можно определить и
другие математические функции:
Секанс
Косеканс
Котангенс
Арксинус
Арккосинус
Арксеканс
Арккосеканс
Арккотангенс
Гиперболичес
кий синус
Гиперболичес
кий косинус
Гиперболичес
кий тангенс
Гиперболичес
кий секанс
Гиперболичес
кий косеканс
Гиперболичес
кий котангенс
Гиперболичес
кий арксинус
Гиперболичес
кий арккосинус
Гиперболичес
кий арктангенс
Гиперболичес
кий арксеканс
Гиперболичес
кий арккосеканс
Гиперболичес
кий арккотангенс
Логарифм
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
LogN(X) = Log(X) / Log(N) или LogN(N,X) = Log(X) / Log(N)
41
Составитель: Галина Василькова. Программирование на языке QBASIC
при основании N.
Функция пользователя может обрабатывать текст. Рассмотрим например
функцию пользователя, которая убирает пустые места (пробелы), как справа,
так и слева.
DEF FNTRIM$ (tekst$) = LTRIM$(RTRIM$(tekst$))
a$ = " @ "
PRINT "joosep" + FNTRIM$(a$) + "kuskil.ee"
FUNCTION...END FUNCTION
Удобнее оформлять функцию пользователя в виде отдельного модуля.
Для этого надо:
1.
Взять из меню EDIT команду New Function...
2.
Напечатать имя функции (Первая – буква, без пробелов,
английскими буквами и цифрами)
3.
В открывшемся окне между FUNCTION и END
FUNCTION напечатать описание функции.
4.
Возвратится в основную программу, взяв из меню 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. Теперь пишем аргументы в первую строку и формулу для гипотенузы.
42
Составитель: Галина Василькова. Программирование на языке QBASIC
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
43
Составитель: Галина Василькова. Программирование на языке QBASIC
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
44
Составитель: Галина Василькова. Программирование на языке QBASIC
Чтобы использовать функцию пользователя, она должна быть определена в
данной программе.
Одна функция пользователя может содержать внутри себя другую.
Например определим функцию пользователя 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
16. Процедуры
Процедурой называется независимый от основной программы кусок
программы. Её можно использовать в разных местах основной программы.
Процедуры и функции пользователя называют подпрограммами.
45
Составитель: Галина Василькова. Программирование на языке QBASIC
Говорят, что процедуры расширяют множество стандартных операторов, а
функции пользователя – множество стандартных функций.
Процедуру можно определить как часть программы и в виде отдельного
модуля программы.
Оператор GOSUB..RETURN
Основную программу можно направить на выполнение подпрограммы с
помощью операторов GOSUB и ON...GOSUB .Подпрограмма возвращается в
основную программу с помощью оператора RETURN, который возвращает
программу туда, откуда она ушла по оператору GOSUB.
Пример:
SCREEN 12
algus:
PRINT "1. Рисуем круг"
PRINT "2. Рисуем прямоугольник"
PRINT "3. Рисуем круг и прямоугольник"
PRINT "4. Выйди из программы"
INPUT I
CLS
IF I = 1 THEN GOSUB ring 'запускаем процедуру круг
IF I = 2 THEN GOSUB kast 'запускаем процедуру прямоугольник
IF I = 3 THEN GOSUB molemad 'запускаем процедуру круг и прямоугольник
IF I = 4 THEN END 'программа закончена
GOTO algus
ring:
CIRCLE (320, 200), 100
RETURN 'возврат в основную программу
kast:
LINE (200, 200)-(300, 250), , B
RETURN ' возврат в основную программу
molemad:
GOSUB ring ''запускаем процедуру круг
GOSUB kast ''запускаем процедуру прямоугольник
RETURN ''' возврат в основную программу
Заметим, что оператор GOSUB не может быть без RETURN. Иначе будет
ошибка. Отметим также, что одна процедура может вызывать другую.
Например в процедуре- molemad).
Используем в последней программе оператор ON...GOSUB:
SCREEN 12
algus:
PRINT "1. Рисуем круг"
PRINT "2. Рисуем прямоугольник"
PRINT "3. Рисуем круг и прямоугольник"
PRINT "4. Выход из программы"
46
Составитель: Галина Василькова. Программирование на языке QBASIC
INPUT I
CLS
'процедура выбирается в зависимости от значения I
ON I GOSUB ring, kast, molemad, lopp
GOTO algus
ring:
CIRCLE (320, 200), 100
RETURN 'возврат в основную программу
kast:
LINE (200, 200)-(300, 250), , B
RETURN ''возврат в основную программу
molemad:
GOSUB ring
GOSUB kast
RETURN ''возврат в основную программу
lopp:
END
RETURN
Значения переменной I могут быть 1, 2, 3 или 4.
Оператор SUB...END SUB
Удобнее создавать процедуру в виде отдельного модуля. В этом случае
надо:
1
2
3
4
Взять из меню EDIT команду New Sub...
Напечатать имя процедуры (без пробелов и других особых символов,
используя только английские буквы и цифры)
Между SUB и END SUB пишем операторы процедуры.
Для возврата в основную программу выбираем из меню View
команду Subs... и выбираем имя своей программы.
Общий вид процедуры:
SUB имя [(параметры)] [STATIC]
[операторы]
END SUB
То есть такой же, как и у функции пользователя.
Приведём пример процедуры BANG, которая очищает экран и печатает
зелёным цветом в центр экрана слово "BANG" и ждёт нажатия клавиши:
SUB bang
CLS
LOCATE 12, 40 'помещаем курсор в центр экрана
COLOR 2
'выбираем зелёный цвет
PRINT "BANG" 'пишем слово bang
COLOR 7
'выбираем снова серый цвет
47
Составитель: Галина Василькова. Программирование на языке QBASIC
'ждём нажатия клавиши...
DO
LOOP UNTIL INKEY$ <> ""
'очищаем экран...
CLS
END SUB
Эту программу можно использовать следующим образом:
PRINT " Hello World!"
SLEEP 2 'спим 2 секунды
'вызываем подпрограмму оператором CALL
CALL bang
PRINT "Tere Maailm!"
SLEEP 2 'спим ещё 2 сек
CALL bang
Изменим предыдущую процедуру, сделав её зависимой от параметра:
SUB bang(tekst$)
CLS 'очищаем экран
LOCATE 12, 40
COLOR 2
PRINT tekst$ 'печатаем значение переменной tekst$
COLOR 7
DO
LOOP UNTIL INKEY$ <> ""
CLS
END SUB
Основная программа, использующая эту процедуру может выглядеть
следующим образом:
CALL bang("TÖÖ")
CALL bang("TEGI")
CALL bang("AHVIST")
CALL bang("INIMESE")
Следующая процедура рисует концентрические окружности с заданным
центром, радиусом, густотой и цветом. Это параметры процедуры.
SUB konring (x, y, raadius, tihedus, varv)
FOR i = 1 TO raadius STEP tihedus
CIRCLE (x, y), i, varv
NEXT i
END SUB
Используем эту процедуру в следующей программе:
48
Составитель: Галина Василькова. Программирование на языке QBASIC
SCREEN 12
CALL konring(320, 240, 100, 30, 2)
CALL konring(100, 150, 40, 2, 4)
Используя следующую основную программу и процедуру konring,
создадим рисунок обоев:
SCREEN 12
FOR x = 0 TO 640 STEP 40
FOR y = 0 TO 480 STEP 40
CALL konring(x, y, 40, 10, 9)
NEXT y
NEXT x
Рассмотрим ещё одну программу:
DECLARE SUB ScreenSaver1 ()
DECLARE SUB ScreenSaver2 ()
DECLARE SUB ScreenSaver3 ()
DO
SCREEN 0 'текстовый экран
CLS
PRINT " Выбери screensaver? [1-3]"
PRINT " (для прерывания введи другую цифру)"
INPUT Valik$
SELECT CASE Valik$
CASE "1"
ScreenSaver1
CASE "2"
ScreenSaver2
CASE "3"
ScreenSaver3
CASE ELSE
END
END SELECT
LOOP
SUB ScreenSaver1
SCREEN 12
'Включаем графический экран
DO
x = INT(RND * 639)
'Генерируем координату x.
y = INT(RND * 479)
'Генерируем координату y
rad = INT(RND * 150) + 10 ' Генерируем радиус
col = INT(RND * 15) + 1
'Генерируем цвет
CIRCLE (x, y), rad, col 'Рисуем круг
LOOP UNTIL INKEY$ <> ""
END SUB
49
Составитель: Галина Василькова. Программирование на языке QBASIC
SUB ScreenSaver2
SCREEN 12
'Включаем графический экран
DO
x = INT(RND * 639)
'Генерируем координату x.
y = INT(RND * 479)
'Генерируем координату y
rad = INT(RND * 150) + 10 'Генерируем радиус
FOR r = 1 TO rad
col = INT(RND * 15) + 1 'Генерируем цвет
CIRCLE (x, y), r, col 'Рисуем круг
NEXT
LOOP UNTIL INKEY$ <> ""
END SUB
SUB ScreenSaver3
SCREEN 12
DO
x = INT(RND * 639)
y = INT(RND * 479)
rad = INT(RND * 150) + 10
col = INT(RND * 15) + 1
FOR r = rad TO rad - 10 STEP -2
CIRCLE (x, y), r, col
NEXT
LOOP UNTIL INKEY$ <> ""
END SUB
17. Задания
1. Сделать функцию пользователя JUUR(a,b), которая вычисляет корень
степени В из А. Использовать функции FUNCTION и END FUNCTION.
Основная программа может иметь вид:
INPUT "Введи число А"; A
INPUT "Введи степень В"; B
PRINT "Ответ:" ; JUUR(A,B)
2. Создать функцию пользователя LOGARITM(A,B), которая вычисляла
бы logab.
1. Создать функцию пользователя ALGARV(x), которая выясняет, что
число простое. Значение функции равно –1 (верное), если х является
простым числом и 0- (неверное), если х – составное число. Подсказка:
Проверить, сколько раз х делится на числа из промежутка от 1 до х. Если
50
Составитель: Галина Василькова. Программирование на языке QBASIC
два раза, то число простое, иначе –нет. Деление можно проверить с
помощью условия A/B=INT(A/B).
Основная программа может иметь вид:
INPUT "Введи число:"; X
IF ALGARV(X) THEN
PRINT "Это простое число!"
ELSE
PRINT "Это не простое число!"
END IF
2. Создать программу, которая печатала бы все простые числа от 1 до N.
Использовать функцию пользователя ALGARV(x). Значение N задаёт
пользователь.
3. Создать функцию пользователя RISTSUMMA(x) для вычисления суммы
цифр числа.
4. Используя операторы SUB и END SUB, создать процедуру TELJESTIK,
которая рисовала бы систему координат (единица деления равна 20
писклям). Создать другую процедуру SIRGE(a,b), которая рисовала бы
внутри неё прямую y=ax+b. Основная программа могла бы иметь вид:
INPUT "Введи значение а"; a
INPUT "Введи значение в"; b
CALL TELJESTIK
CALL SIRGE(a, b)
5. Создать процедуру PARABOOL(a,b,c). Основная программа может иметь
вид:
INPUT "Введи значение а"; a
INPUT "Введи значение в"; b
INPUT "Введи значение с"; c
CALL TELJESTIK
CALL PARABOOL(a, b, с)
6. Создать программу нахождения наибольшего общего делителя,
отличную от функции пользователя SYT, которая работала бы быстрее,
например используя остаток от деления A MOD B. Для измерения
скорости работы можно использовать следующую программу:
START=TIMER
PRINT SYT(2,100000)
PRINT "Потребовалось времени: ";TIMER-START;"секунды."
18. Массивы
Массивы используются для хранения большого количества однотипных
данных. Массивы могут быть числовыми и символьными.
51
Составитель: Галина Василькова. Программирование на языке QBASIC
Пример:
Создадим программу , которая вводит имена 5 детей и их возраст и затем
печатает их. Сделаем программу без использования массива, а затем с
использованием массива.
'Вводим имена
INPUT "Ввести 1. имя"; A$
INPUT " Ввести 2. имя "; B$
INPUT " Ввести 3. имя "; C$
INPUT " Ввести 4. имя "; D$
INPUT " Ввести 5. имя "; E$
'Введём возраст
INPUT "Введи возраст 1. ребёнка"; K
INPUT " Введи возраст 2. ребёнка"; L
INPUT " Введи возраст 3. ребёнка "; M
INPUT " Введи возраст 4. ребёнка "; N
INPUT " Введи возраст 5. ребёнка "; O
'Печать данных
PRINT A$; K; " лет."
PRINT B$; L; " лет."
PRINT C$; M; " лет."
PRINT D$; N; " лет."
PRINT E$; O; " лет."
Для 5 детей программа ещё не очень длинная. А если детей много?
В этом случае используется массив.
Пример:
'Задаём массивы
DIM Nimed$(5) 'символьный массив для имён
DIM Vanused(5) 'числовой массив для возраста
'Вводим имена
FOR I = 1 TO 5
PRINT "Введи имя "; I; ". -го ребёнка";
INPUT Nimed$(I)
NEXT I
'Вводим возраст
FOR I = 1 TO 5
PRINT "Введи возраст "; I; ". –го ребёнка";
INPUT Vanused(I)
NEXT I
52
Составитель: Галина Василькова. Программирование на языке QBASIC
'Печатаем имена и возраст
FOR I = 1 TO 5
PRINT Nimed$(I);Vanused(I); " лет."
NEXT I
При создании массива надо его сначала объявить с помощью оператора
DIM.
DIM Nimed$(5) – объявляет символьный массив имён из 5 элементов.
DIM Vanused(5) - объявляет числовой массив возрастов из 5 элементов.
Чтобы прочесть из массива конкретный элемент, надо его указать, например
Nimed$(3) –3-е имя из массива имён.
Многомерные массивы
Объявим двумерный массив, в котором 3ряда и 3 столбца:
DIM A(3,3). Для заполнения, например элемента, стоящего во 2-ом ряду и 3- ем
столбце пишем:
A(2,3)=2
Для его печати пишем:
PRINT A(2,3)
Аналогично можно определить 3-х мерный массив:
DIM B(2,5,3) и больше, но их трудно себе представить.
Пример:
Создадим программу, которая считает, сколько раз выпадает орёл при
бросании монеты M раз. Бросание повторяем N раз (серий). Результаты
бросаний заносим в массив.
INPUT "Сколько раз бросаем?"; M
INPUT "Сколько серий делаем?"; N
DIM SEERIA(N) 'Объявляем массив
RANDOMIZE TIMER 'Включаем генератор случайных чисел
FOR J = 1 TO N 'Цикл серии
'обнуляем счётчик
k=0
FOR i = 1 TO M 'начинаем цикл бросаний
'значение при бросании может быть 1-орёл и 2 –решка
v = INT(RND * 2 + 1)
IF v = 1 THEN k = k+ 1
NEXT i
'заносим ответы в массив
SEERIA(J) = k
NEXT J
'выводим ответы на экран
FOR J = 1 TO N
PRINT ".В ".J; ". cериях было"; SEERIA(J); "орлов."
NEXT J
Пример:
53
Составитель: Галина Василькова. Программирование на языке QBASIC
Составим программу, которая позволяет учить иностранные слова.
Задаётся количества пар слов N и создаёт массив SONAD$(N,2). Затем
пользователь заполняет массив. Затем начинает спрашивать произвольные
слова. Пользователь должен дать ответ. Программа проверяет, верно слово или
нет. При неправильном ответе показывает верный вариант. После каждого слова
экран очищается.
CLS 'чистим экран
INPUT "Сколько пар слов"; N
DIM SONAD$(N, 2)
'заполняем массив
FOR I = 1 TO N
INPUT "Вводим иностранное слово"; SONAD$(I, 1)
INPUT "Вводим перевод"; SONAD$(I, 2)
NEXT I
'начинаем спрашивать
CLS
RANDOMIZE TIMER
DO
V = INT(RND * N + 1) 'случайное число от 1-го до N
PRINT SONAD$(V, 2); "-";
INPUT Sona$
'Для выхода из программы вводим слово «хватит».
IF Sona$ = "хватит" THEN END
'проверяем правильность
IF Sona$ = SONAD$(V, 1) THEN
PRINT "Верно!"
ELSE
PRINT "Неверно!"
PRINT "Верное есть:"; SONAD$(V, 1)
END I
'спим 3 сек
SLEEP 3
CLS
LOOP
Создадим программу, генерирующую 20 случайных чисел из промежутка от 1
до 100 и сортирует их по возрастанию.
N = 20
DIM A(N)
RANDOMIZE TIMER
PRINT "Сортируемые случайные числа:"
FOR NUM = 1 TO N
LET A(NUM) = INT(100 * RND) + 1
PRINT A(NUM);
NEXT NUM
DO
OK = 1
54
Составитель: Галина Василькова. Программирование на языке QBASIC
FOR I = 1 TO N - 1
IF A(I) > A(I + 1) THEN
'SWAP меняет значения переменных
SWAP A(I), A(I + 1)
OK = 0 'признак, что обмен произошёл
END IF
NEXT I
LOOP UNTIL OK = 1
PRINT "Отсортированные числа:"
FOR NUM = 1 TO N
PRINT A(NUM);
NEXT NUM
Контролируем до тех пор, пока не произошло ни одного обмена.
Операторы DATA, READ, RESTORE
Иногда удобнее не самим заполнять массив, а задать конкретные числа,
которыми следует его заполнить.
Пример:
Составим программу, которая по задаваемой цифре месяца пишет его
название.
DATA январь, февраль, март, апрель, май
DATA июнь, июль, август, сентябрь, октябрь
DATA ноябрь, декабрь
DIM Kuud$(12)
'заполняем массив
FOR I = 1 TO 12
'читаем данные
READ Kuud$(I)
NEXT I
INPUT "Введи номер месяца"; N
PRINT Kuud$(N)
Здесь использованы опнраторы DATA, READ.
DATA – перечисляет символьные или числовые данные, записанные через
запятую. Символьные данные должны быть в кавычках.
READ- читает их подряд.
Оператор DATA не выполняется, поэтому может находится в любом месте
программы.
Если читать с помощью READ больше данных, чем есть в DATA будет
сообщение об ошибке, читать меньше данных можно.
Часто используется вместе с операторами DATA, READ также оператор
RESTORE. RESTORE – восстанавливает данные и их можно читать второй раз.
55
Составитель: Галина Василькова. Программирование на языке QBASIC
19. Задания
1.
Создать программу, которая вычисляет скалярное произведение
двух N мерных векторов. Координаты векторов и число N задаются
пользователями. Для нахождения скалярного произведения создать функцию
пользователя SKALAAR(A(),B()), где A() и B() массивы. Размер массива А
задаётся с помощью функции UBOUND(A) в функции пользователя.
2.
Создать программу, которая находит острый угол между двумя Nмерными векторами. Для нахождения угла создаём функцию пользователя
NURK(A(),B()), где A() и B() –массивы. Размер массива А задаётся с помощью
функции UBOUND(A) в функции пользователя. Можно использовать
созданную в предыдущем задании функцию SKALAAR(A(),B()).
3.
Создать программу обучения иностранным словам так, чтобы
пользователю не надо было бы самому вводить слова, а задать их с помощью
DATA. Количество пар слов выбираем сами, но не менее 10.
4.
Создать программу, которая выбирала бы из вводимых слов все
гласные буквы и отдельно все согласные. Для этого создать функцию
пользователя TAISHAALIK(taht$), для гласных букв. Основная программа
проверяла бы –выбранная буква является гласной или нет. Оператор DATA ,
перечисляющий гласные, использовать в основной программе.
5.
Среди заданных с помощью оператора DATA числовых и
символьных переменных выбрать отдельно символные переменные и
напечатать их, а числовые переменные сложить и распечатать сумму.
6.
Заданных с помощью оператора DATA учеников разделить на две
группы и распечатать результат.
7.
Вычислить значение
Y=x^3+5x^2+6x+7
Z=12x^5+11x^4+10x^3+123
При х=12, 15, 25, 7, 13, 2, 6, 9, 16, 19, 21.
8. Просклонять слово «книга», задавая окончания с помощью оператора
DATA.
20. Работа с файлами.
Рассмотрим, как записывать данные в файл и как их оттуда брать.
При открытии файла используются следующие режимы:
1. INPUT – для чтения текста из файла;
2. OUTPUT- для записи текста в файл;
3. APPEND – для добавления текста в файл;
Файл открывает оператор OPEN.
Например оператор
OPEN "proov.txt" FOR OUTPUT AS #1
Открывает файл proov.txt для записи. Файл proov.txt заносится в активный
каталог. Перед названием файла может быть указан путь, где файл находится,
например, "c:\temp\proov.txt".
#1 – обозначает порядковый номер файла. Одновременно может быть открыто
несколько файлов. У каждого –своё имя и свой порядковый номер.
56
Составитель: Галина Василькова. Программирование на языке QBASIC
Если хотим читать из файла proov.txt , то его надо открыть для чтения:
OPEN "proov.txt" FOR INPUT AS #1
После чтения/записи файл надо обязательно закрыть с помощью оператора
CLOSE.
CLOSE #1 – закрывает файл с номером #1
CLOSE – закрывает все открытые файлы.
Запись в файл
Запись в файл происходит с помощью оператора PRINT, но надо указать
порядковый номар файла.
Пример: Программа, которая запрашивает слово и записывает его в файл.
OPEN "proov.txt" FOR OUTPUT AS #1
INPUT "Введи слово"; Tekst$
PRINT #1, Tekst$ 'записываем слово в файл
CLOSE #1 'закрываем файл
Вместо оператора PRINT можно использовать оператор WRITE. Оператор
WRITE добавляет запятые между числами и кавычки для символов в файл.
Пример: Программа, которая записывает в файл andmed.txt данные 5
человек.
OPEN "andmed.txt" FOR OUTPUT AS #1
FOR I = 1 TO 5
INPUT "Введи имя:"; Nimi$
INPUT "Введи возраст:"; Vanus
INPUT "Введи пол:"; Sugu$
WRITE #1, Nimi$, Vanus, Sugu$
NEXT I
CLOSE #1
Если открыть файл в режиме OUTPUT и записать туда данные, файл
перепишется заново. Для добавления данных надо использовать режим
APPEND.
Чтение из файла
Читать из файла можно с помощью оператора INPUT. Надо указать также
порядковый номер файла.
Пример: Программа считывает из файла proov.txt текст до запятой.
OPEN "proov.txt" FOR INPUT AS #1
INPUT #1, Tekst$
PRINT "В файле был текст: "; Tekst$
CLOSE #1
57
Составитель: Галина Василькова. Программирование на языке QBASIC
Для чтения следующего значения надо снова использовать оператор
INPUT . Значения в файле отделены запятыми.
Пример: Для чтения из файла, невзирая на запятые, используется оператор
LINE INPUT .
OPEN "andmed.txt" FOR INPUT AS #1
'читаем данные 5 человек
PRINT "Содержимое файла:"
FOR I = 1 TO 5
LINE INPUT #1, RIDA$
PRINT RIDA$
NEXT I
CLOSE #1
Добавление текста в файл
В этом случае файл открывают в режиме APPEND.
Пример: Программа добавляет в файл proov.txt ещё один ряд.
OPEN "proov.txt" FOR APPEND AS #1
PRINT #1, "Ещё один ряд!"
CLOSE #1
Уничтожение файла
Уничтожение файла происходит с помощью оператора KILL.
Например, хотим уничтожить файл proov.txt.
Это делается командой:
KILL "proov.txt"
21. Некоторые примеры
Пример1. Программа, которая записывает числа, делящиеся на 2 в файл
2.txt, делящиеся на 3 –в 3.txt, остальные в файл teised.txt.
OPEN "2.txt" FOR OUTPUT AS #1
OPEN "3.txt" FOR OUTPUT AS #2
OPEN "teised.txt" FOR OUTPUT AS #3
INPUT "Сколько чисел смотрим"; PIIR
FOR I = 1 TO PIIR
'если I делится на 2 , то записываем в файл#1
IF I / 2 = INT(I / 2) THEN PRINT #1, I;
IF I / 3 = INT(I / 3) THEN PRINT #2, I;
'иначе - в файл #3
58
Составитель: Галина Василькова. Программирование на языке QBASIC
IF I / 3 <> INT(I / 3) AND I / 2 <> INT(I / 2) THEN PRINT #3, I
NEXT I
CLOSE
Прмер 2. Программа, которая записывает имена и возраст людей из
массива в файл andmed.txt
INPUT "Сколько данных вводим"; N
'объявляем массивы
DIM Nimed$(N) 'массив имён
DIM Vanused(N) 'массив возраста
'заносим имена в массив
FOR I = 1 TO N
PRINT "Введи"; I; ". имя";
INPUT Nimed$(I)
PRINT "Введи"; I; ". возраст";
INPUT Vanused(I)
NEXT I
'Заносим данные в файл andmed.txt
OPEN "andmed.txt" FOR OUTPUT AS #1
FOR I = 1 TO N
WRITE #1, Nimed$(I), Vanused(I)
NEXT I
CLOSE #1
Пример3. Программа, которая читает из файла andmed.txt имена и возраст
и выдаёт их на экран.
CLS
OPEN "andmed.txt" FOR INPUT AS #1
'повторяем цикл до тех пор, пока не иссякнут данные (функция EOF).
DO
INPUT #1, NIMI$, VANUS
PRINT "Имя:"; NIMI$
PRINT "Возраст:"; VANUS
LOOP UNTIL EOF(1)
CLOSE #1
Функция EOF принимает значение 1, если конец файла и 0 – в противном
случае. Аргументом функции является порядковый номер файла.
22. Задания
1.
Создать программу, которая записывает в файл все простые числа
до N , которое задаётся пользователем
2.
Создать программу, которая указывала бы все возможные
комбанации получения кроны из центов
50 центов
20 центов
10 центов
5 центов
0
0
0
20
59
Составитель: Галина Василькова. Программирование на языке QBASIC
0
0
1
18
Чтобы получить колонки, удобно данные поместить в файл так:
PRINT #1, A, B, C, D. Удобно также записать PRINT #1, "50 сентов", "20
сентов», "10 сентов», "5 сентов".
3.
Создать функцию пользователя LOENDA(failinimi$,), которая
читала бы из файла failinimi$ частоту появления буквы a$. Файл для чтения
должен быть создан в Notepad. Основная программа показывает частоту
вхождения разных букв в файл.
4. Создать графическую программу расположения на экране точек,
удовлетворяющих условию:
где N – натуральное число.
5. Создать графическую программу(SCREEN 12)., которая закрашиавает
экран разноцветными точками. Цвет выбирается из условия VARV=10 *
SIN(50 * x * y), где x и y –переменные (x меняется от 0 до 639, а y от 0 до
479).
6. Создать программу, которая находила бы все числа, похожие на 3025,
для которых верно:
30 + 25 = 55
55^2 = 3025. Использовать функции VAL, STR$, MID$, LTRIM$,LEFT$ ja
RIGHT$.
7. Найти все 4-х значные натуральные числа, которые при чтении в
обратном порядке дают число в 4,5 раз большее.
8. Создать в Excel функцию пользователя LOENDAFAILIST(Failinimi,
Taht), которая считала бы частоту вхождения буквы Taht в файл
Failinimi. Сохранить это файл 8.xls.
23. Создание функции пользователя в Excel с помощью
Visual Basic
Для создания функции пользователя выбираем в меню Tools, Macro,
Visual Basic Editor. Затем Insert, Module. Здесь пишем текст программы на
Бейсике, например, программу для подсчёта частоты вхождения заданной
буквы в текст:
Function LOENDAFAILIST(failinimi$, a$)
Open failinimi$ For Input As #1
Do
Line Input #1, tekst$
For x = 1 To Len(tekst$)
If a$ = Mid$(tekst$, x, 1) Then mitu = mitu + 1
Next
LOENDAFAILIST = mitu
Loop Until EOF(1)
Close #1
End Function
60
Составитель: Галина Василькова. Программирование на языке QBASIC
Внутри кнопки fx среди пользовательских функций User defined
появляется функция LOENDAFAILIST(failnimi$, a$) с двумя аргументами. В
качестве первого аргумента пишем адрес текста, в котором надо подсчитать
количество заданных букв, в качестве второго аргумента в кавычках букву,
частоту которой в тексте надо подсчитать, например,
=LOENDAFAILIST("c:\MyDocu~1\Galina\LOE.txt";"a") и ОК.
24. Используемые источники
1. Dan Bogdanov. Programmeerimiskeel BASIC.
2. Anti Teepere. QBASICu kaugkoolituskursus. (anti@7t.ee)
61
Download