Таллиннская Тынисмяэская реальная школа Программирование на языке 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 Умножение 52 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=2R 3. площадь круга S=R2 4. площадь поверхности сферы P=4R2 5. объём сферы V=4/3R3 Дать подробную распечатку и ввести пояснения. Задача 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