Оператор DATA в последнем своем параметре устанавливает шаблон узора для выводимой линии. Рассмотрим пример.
LINE (50, 30)-(90, 30), 3, , &HCCCC
Данный
оператор выводит узор в виде двух точек, далее две точки пропускаются,
потом снова устанавливаются две точки и так до конца линии. Кстати
данным оператором можно нарисовать прямоугольник, в котором стороны
представлены пунктирными линиями.
LINE (50, 30)-(11, 70), 3,В , &HCCCC
Также будем выводить и линии символа. Однако, отметим, что переменная, которая считывает данные из оператора DATA, имеет размерность в 4 байта или 16 бит. Поэтому длина линии должна иметь не больше 16 точек, в нашем случае от 0 до15.
Подобным
образом можно выводить другие символы разной размерности. Если ширина
символа больше 16 точек, то для него нужно использовать простую
переменную двойной точности. Если больше 32, то применяется оператор LINE на одной строчке два или более раз.
Помимо вывода указанного символа, можно нарисовать жирные символы или курсив, создать свой стиль и так далее.
Все
это хорошо, когда выводится несколько символов, а для того, чтобы иметь
возможность нарисовать все символы данного набора, то приходится делать
шаблоны для больших и маленьких символов, цифр, значков пунктуации и
пр., что довольно утомительно. Для создания своего шрифта существуют
специальные программы, причем символы формируются из кривых и прямых
линий, что позволяет создать символы только один раз, а в дальнейшем
они будут масштабироваться автоматически, также как и будет создан
автоматически курсив и полужирный шрифт на основе базового. Поэтому
создание шрифта на языке Бейсик является учебной задачей, что важно,
когда нужно вывести пять-шесть символов в процессе обучения
программированию.
Машинописный тренажер.
Приведем пример небольшой программы тренажера для работы с клавиатурой.
SCREEN 9: CLS : COLOR 14, 7: COLOR 4, 2
nstrok = 15: nstolb = 60: nklav = 13: GOSUB knopka:
nstrok = 30: nstolb = 100: nklav = 12: GOSUB knopka
nstrok = 45: nstolb = 145: nklav = 11: GOSUB knopka
nstrok = 67: nstolb = 187: nklav = 10: GOSUB knopka
bstr = 6: bstlb = 4: ab$ = "E1234567890-=": GOSUB bukva
bstr = 9: bstlb = 6: ab$ = "ЙЦУКЕНГШЩЗХЪ": GOSUB bukva
bstr = 12: bstlb = 8: ab$ = "ФЫВАПРОЛДЖЭ": GOSUB bukva
bstr = 15: bstlb = 11: ab$ = "ЯЧСМИТЬБЮ.": GOSUB bukva: PAINT (1, 1), 5, 3
OPEN "isx.txt" FOR INPUT AS #1: ierr = 0: LOCATE 17, 1: PRINT "Ошибок - "; 0
DO UNTIL EOF(1)
INPUT #1, ab$: LOCATE 1, 1: PRINT ab$: an$ = ""
LOCATE 19, 1: PRINT STRING$(79, " ");
m1: FOR i1% = 1 TO LEN(ab$)
an$ = an$ + a1$: LOCATE 19, 1: PRINT an$: a1$ = ""
a1$ = INPUT$(1): IF a1$ = CHR$(27) THEN GOTO endpr:
IF a1$ = "/" THEN a1$ = "."
IF a1$ <> MID$(ab$, i1%, 1) THEN
ierr = ierr + 1: LOCATE 17, 10: PRINT ierr; : PRINT CHR$(7)
LOCATE 1, 1: PRINT STRING$(79, " ");
ab$ = MID$(ab$, i1%, LEN(ab$) - i1% + 1): LOCATE 1, 1: PRINT ab$
LOCATE 20, 2: PRINT ASC(a1$)
GOTO m1
END IF
NEXT i1%
LOOP
endpr: END
bukva:
LOCATE bstr, bstlb
FOR i1% = 1 TO LEN(ab$): LOCATE bstr, bstlb + (i1% - 1) * 5
PRINT MID$(ab$, i1%, 1); : NEXT i1%
RETURN
knopka:
FOR i1% = 0 TO nklav - 1
LINE (nstrok + i1% * 40, nstolb)-(nstrok + i1% * 40 + 32, nstolb + 32), 3, B
NEXT i1%
RETURN
Данная программа выводит сверху экрана текст, который нужно набрать с клавиатуры. Этот текст находится в файле под именем isx.txt и желательно иметь записи небольшие по количеству символов на строчке, например, 50.
Ниже
представлена клавиатура и далее количество ошибок, которые
зафиксированы при работе с программой. Нижняя строка содержит введенные
с клавиатуры символы.
При
вводе символов с клавиатуры текст в верхней части экрана будет
уменьшаться, оставляя только те символы, которые следует ввести. Данная
программа приведена как пробная и поэтому ее можно расширять новыми
возможностями. Например, можно выделять клавиши, которые нужно
нажимать; в ней не предусмотрено исправление символов, то есть
дополнить удаление последнего неверно введенного символа нажатием на
клавишу Backspace; можно ввести
показатель введенных символов за единицу времени. Эти возможности не
требуют больших знаний в программировании, но могут служить хорошей
практикой при написании программ.
В
программе имеется существенное ограничение, связанное с тем, что символ
«р» не вводится с клавиатуры. Поэтому для того, чтобы обойти это,
следует использовать текст, не содержащий этот символ. Кроме того,
можно написать новую программу, с измененной раскладкой клавиатуры на
латиницу. Все английские символы вводятся с клавиатуры и выводятся на
экран без проблем.
Одним из значительных недостатков при работе с языком Бейсик является отсутствие встроенных операторов работы с мышью.
Приведенная ниже программа позволяет устранить этот недостаток, а,
вызывая драйвер мыши, демонстрирует его работу и выводит на экран
словные координаты мыши и коды нажатия на ее кнопки.
DATA &H60,&H1E,&H0E,&H1F,&HA1,&H18,&H00,&HCD,&H33,&H89,&H1E,&H1A
DATA &H00,&H89,&H0E,&H1C,&H00,&H89,&H16,&H1E,&H00,&H1F,&H61,&HCB
DIM ms(1 TO 20) AS INTEGER
'SCREEN 9
DEF SEG = VARSEG(ms(1)): msp& = VARPTR(ms(1))
FOR i = 0 TO 23: READ code%: POKE msp& + i, code%: NEXT i
ms(13) = 1: CALL absolute(msp&)
DO
ms(13) = 3: CALL absolute(msp&):
i3% = ms(14): i4% = ms(15): i2% = ms(16)
LOCATE 1, 1: PRINT i3%, i4%, i2%
LOOP WHILE i3% = 0
END
В данной программе, в операторах DATA
присутствует программа, написанная на языке ассемблера для
использования прерывания 33, которая вызывает драйвер мыши и работает с
ним. Первый оператор CALL absolute(msp&) вызывает программу, которая загружена в массив ms, а по своему действию инициирует драйвер, для чего в 13й элемент массива ms заносится значение 1. Следующий вызов данной подпрограммы (CALL absolute(msp&)) с параметром в 13м элементе массива равным трем (ms(13) = 3) позволяет считывать значения курсора мыши. Причем в 14м элементе массива ms
будет находиться признак нажатия на кнопку мыши (0 - кнопки не нажаты,
1 - нажата левая кнопка, 2 - нажата правая кнопка), в 15м элементе
массива - координата х, в 16 - координата у. Таким образом на рисунке
справа от текста программы показано состояние указателя мыши (0 -
кнопки мыши не нажаты, курсор мыши находится с координатами (224, 112)).
Запрос
состояния мыши производится в цикле, поэтому при передвижении курсора
мыши значения координат будут меняться. Выход из цикла и из программы
осуществляется при нажатии на любую кнопку мыши.
Калькулятор.
Следующий пример: программа работы с калькулятором.
SCREEN 9: CLS : COLOR 4, 2
‘ установка кнопок для калькулятора и нижнего прямоугольника для вывода результата
FOR i1% = 1 TO 4: FOR i2% = 1 TO 3
LINE (i2% * 40, i1% * 40)-(i2% * 40 + 32, i1% * 40 + 32), 4, B
NEXT i2%: NEXT i1%
LINE (160, 40)-(192, 72), 4, B: LINE (160, 80)-(192, 152), 4, B
LINE (160, 160)-(192, 232), 4, B: LINE (40, 200)-(112, 232), 4, B
LINE (120, 200)-(152, 232), 4, B: LINE (40, 250)-(300, 266), 4, B
‘ установка символов на кнопки
LOCATE 4, 13: PRINT "/": LOCATE 4, 18: PRINT "*": LOCATE 4, 23: PRINT "-"
LOCATE 7, 8: PRINT "7": LOCATE 7, 13: PRINT "8": LOCATE 7, 18: PRINT "9"
LOCATE 7, 23: PRINT "+": LOCATE 10, 8: PRINT "4": LOCATE 10, 13: PRINT "5"
LOCATE 10, 18: PRINT "6": LOCATE 13, 8: PRINT "1": LOCATE 13, 13: PRINT "2"
LOCATE 13, 18: PRINT "3": LOCATE 13, 23: PRINT "=": LOCATE 16, 8: PRINT "0"
LOCATE 16, 18: PRINT ".": LOCATE 19, 7: PRINT "0"
‘ окраска фона экрана, кроме кнопок, установка начальных значений переменных
‘ ii# - один операнд, ii1# - второй операнд
‘ op% - признак, указывающее какое число вводится: 0 - целая часть, 1 - дробная
‘ > 1 то позиция цифры в дробной части числа
‘ op1% - вид операции: 0 - нет операции, 1 - операция деления, 2 - умножения,
‘ 3 - вычитание, 4 - сложение
PAINT (1, 1), 5, 4: ii# = 0: op% = 0: op1% = 0: i2% = 0: ii1# = 0
DO
‘ ввод символа и проверка нажатия на клавишу Esc.
a1$ = INPUT$(1): IF a1$ = CHR$(27) THEN GOTO endpr:
‘ ввод числа для первого операнда
IF op% = 0 AND (a1$ >= "0" AND a1$ <= "9") THEN
ii# = ii# * 10 + ASC(a1$) - 48: GOTO endloop
END IF
‘ ввод точки, после ввода целой части числа
IF a1$ = "." THEN op% = 1: GOTO endloop
‘ ввод второго операнда
IF op% > 0 AND (a1$ >= "0" AND a1$ <= "9") THEN
ii# = ii# + (ASC(a1$) - 48) * 10 ^ (-op%): op% = op% + 1: GOTO endloop
END IF
‘ установка вида операции
IF a1$ = "/" THEN ii1# = ii#: ii# = 0: op1% = 1: op% = 0: GOTO endloop
IF a1$ = "*" THEN ii1# = ii#: ii# = 0: op1% = 2: op% = 0: GOTO endloop
IF a1$ = "-" THEN ii1# = ii#: ii# = 0: op1% = 3: op% = 0: GOTO endloop
IF a1$ = "+" THEN ii1# = ii#: ii# = 0: op1% = 4: op% = 0: GOTO endloop
‘ очистка переменных
IF a1$ = "y" OR a1$ = "Y" THEN ii# = 0: ii1# = 0: GOTO endloop
‘ вывод результата операции
IF ASC(a1$) = 13 THEN
IF op1% = 1 THEN ii# = ii1# / ii#: ii1# = 0: op1% = 0: op% = 0: GOTO endloop
IF op1% = 2 THEN ii# = ii1# * ii#: ii1# = 0: op1% = 0: op% = 0: GOTO endloop
IF op1% = 3 THEN ii# = ii1# - ii#: ii1# = 0: op1% = 0: op% = 0: GOTO endloop
IF op1% = 4 THEN ii# = ii1# + ii#: ii1# = 0: op1% = 0: op% = 0: GOTO endloop
END IF
‘ вывод полученного значения
endloop: LOCATE 19, 7: PRINT SPC(30); : LOCATE 19, 7: PRINT ii#;
IF op% = 1 THEN PRINT "."; ‘
LOOP
endpr: END
Приведенная
программа довольно небольшая, и возможности ее ограничены. Она может
производить операции с двумя операторами. Введите сначала одно число,
затем знак операции: умножение (*), деление (/), вычитание (-) и
сложение(+), после чего введите второе число. Если вводится число с
дробной частью, то нужно сначала ввести целую часть, затем точку и
дробную часть. Для того, чтобы получить результат, нажмите на клавишу Enter.
С
полученным числом можно выполнить новую арифметическую операцию и так
далее. Для того, чтобы очистить память и провести новые операции,
нажмите клавишу «Y».
Для того, чтобы выйти из программы, нажмите на клавишу Esc.
Программу можно дополнить новыми возможностями:
- установить проверку, чтобы не было ошибочных действий, например, деления на ноль;
- добавить ввод числа не при помощи клавиатуры, а мыши;
- показывать на экране оба операнда;
- складывать подряд три операнда, без нажатия на клавишу Enter;
- добавить новые режимы, например, нажав на клавишу «С», получить значение синуса. Можно вычислить значение косинуса, логарифма и других функций;
- можно установить память в калькуляторе и так далее.
Сортировка данных.
Иногда требуется расположить данные в порядке их возрастания. Существует несколько алгоритмов для сортировки данных, ниже представлен один из них.
DIM mas(20): COLOR 0, 7: CLS : RANDOMIZE TIMER
FOR i1% = 1 TO 20: i2% = RND * 1000: mas(i1%) = i2%: PRINT i2%, : NEXT i1%
m1: i2% = 0: FOR i1% = 1 TO 19
IF mas(i1%) > mas(i1% + 1) THEN
i2% = 1: i3% = mas(i1% + 1)
mas(i1% + 1) = mas(i1%)
mas(i1%) = i3%
END IF
NEXT i1%
IF i2% > 0 THEN GOTO m1
PRINT : PRINT : FOR i1% = 1 TO 20: PRINT mas(i1%), : NEXT i1%
END
В данной программе, массив mas
сначала заполняется случайными числами от 0 до 1000, затем происходит
сортировка следующим образом. Просматриваются все элементы массива и
сравниваются соседние, если следующий элемент больше текущего, то они
меняются местами. Таким образом просматриваются все элементы массива,
если перестановка завершилась, то переменной i2% присваивается
значение 1, что означает, что нужен еще один просмотр элементов
массива. В конце работы программы выполняется печать содержимого
массива.
Если
увеличить размерность массива, то таким образом увеличивается
количество данных. Можно также изменить пределы чисел, находящихся в
массиве.
Создание списка простых чисел.
Следующая программа выводит на экран простые числа.
DIM a%(2000)
a%(1) = 2
a%(2) = 3
a%(3) = 5
a%(4) = 7
ia% = 5
FOR i1% = 1 TO 200
i2% = i1% * 10 + 1
GOSUB vich
i2% = i1% * 10 + 3
GOSUB vich
i2% = i1% * 10 + 7
GOSUB vich
i2% = i1% * 10 + 9
GOSUB vich
NEXT i1%
FOR i1% = 1 TO ia% - 1: PRINT a%(i1%); : NEXT i1%: PRINT : PRINT i1%
END
vich:
FOR i3% = 1 TO ia% - 1
i4% = INT(i2% / a%(i3%))
IF i4% * a%(i3%) = i2% THEN GOTO m1
NEXT i3%
a%(ia%) = i2%: ia% = ia% + 1
m1: RETURN
В программе в массив a%
заносятся полученные простые целые числа. Первые простые целочисленные
значения (2, 3, 5, 7) заносятся в начале работы программы, остальные
вычисляются. При проверке числа, является оно простым или нет,
выбираются числа, которые оканчиваются на цифры: 1, 3, 7 и 9, так как,
если число имеет другое окончание, то оно составное. После этого
выбранное число проверяется, имеет ли оно делители или нет в
подпрограмме vich. В этой подпрограмме производится деление числа на найденные простые значения из массива a%. Если выбранное число не делится на них без остатка, то оно простое и заносится в массив.
Штриховка заданной области отрезками прямых произвольной направленности.
Напишем небольшую программу, которая выводит отрезки прямых разного цвета на заданную область экрана.
SCREEN 9: COLOR 14, 7
CLS : COLOR 4, 2
RANDOMIZE TIMER
VIEW (10, 10)-(420, 210)
WINDOW (0, 0)-(1, 1)
DO
a$ = INKEY$
IF a$ <> "" THEN GOTO endpr
LINE (RND, RND)-(RND, RND), RND * 15
LOOP
endpr: END
Конечно,
динамику вывода отрезков в книге трудно показать, поэтому лучше набрать
текст программы и выполнить ее на компьютере. В данной программе
используется оператор VIEW,
который позволяет отметить область на экране, в которую будет
проводиться вывод информации. Далее оператор указывает в определенной
области координаты, по которым будут выводиться данные. Таким образом,
в прямоугольник с координатами от (10,10) до (420,210) пикселов будет
выводиться информация, координаты которой должны быть от (0,0) до (1,1).
Далее в цикле выводятся отрезки прямых линий, а в случае нажатия на какую-либо клавишу, произойдет выход из программы.
Задачи. 1.
Напишите исходный текст программы рисования. Слева на экране установите
квадраты с цветовыми заливками, а справа поле, где будет происходить
прорисовка фигур. Ввод можно организовать при помощи клавиш на
клавиатуре, например, цвет выбирается путем ввод цифр, а клавиши со
стрелками - для рисования линий в разных направлениях. Вторым вариантом
будет использование мыши для выбора цвета и прорисовки линий.
2.
Нарисуйте на экране нотную линейку и создайте возможность подбирать
мелодии. Данная программа может работать при помощи клавиатуры (для
этого нужно выбрать клавиши, которые будут соответствовать нотам,
переходу на другую октаву и т.д.) или при помощи мыши.
3.
Введите в массив вопросы, номера ответов и номер правильного ответа,
после чего занесите их в файл. Потом введите данные в массив и, выбирая
случайным образом вопросы, выведите их на экран. Пример вопроса: «Как
называется воспитатель спортсменов?» и вариантов ответов к нему: «1.
Воспитатель, 2. Тренер, 3. Учитель, 4. Преподаватель, 5. Родитель».
Выведите на экран рамку с вопросом и ответами на него и дайте
возможность вашим друзьям ответить на него. При правильном или
неправильном ответах выведите соответствующее сообщение об этом.
Выведите общее количество вопросов и правильных ответов.
4.
Выведите на экран часы, в которых перемещаются минутная и часовая
стрелки. Как вариант, дополните часы секундной стрелкой, а также
создайте будильник.
5.
Сделайте программу калейдоскоп, которая выводит случайным образом через
определенные промежутки времени узор из разных фигур и этот узор
размножте на экране. Можно сделать повторение узора в квадратах или,
как у калейдоскопа, в разных треугольниках.
6.
Напишите программу, которая развивает внимательность. Программа должна
вывести на экран несколько фигур (например, елочек, деревьев, чашек,
тарелок, треугольников и пр.) в течении определенного времени, а потом
стирает с экрана и пользователь должен указать, сколько каких фигур
было на экране.
7. Напишите программу игры в пятнашки. Фишки можно передвигать при помощи клавиатуры.
8. Напишите программу, которая, используя клавиши со стрелками, будет передвигать фигуру на экране.
9. Напишите программу, которая перемещает шарик на экране, а при достижении стенок экрана, шарик будет отражаться от них.
10.
Напишите программу, которая проводит те же действия, что и программа
гашения экрана, например, выводит в произвольном порядке звездочки на
экран и их гасит.
|