Как перевести программу basic в графический режим
Перейти к содержимому

Как перевести программу basic в графический режим

  • автор:

Как перевести программу basic в графический режим

Язык Basic был разработан преподавателями Дартмутского колледжа Джоном Кемени и Томасом Курцом в 1965 году как средство обучения и работы непрофессиональных программистов. Его назначение определено в самом названии, которое является аббревиатурой слов Beginner’s All-purpose Symbolic Instruction Code (многоцелевой язык символических инструкций для начинающих) и при этом в дословном переводе означает «базовый» [13, c. 54].

Новый язык быстро завоевал популярность благодаря своей простоте в изучении, особенно среди начинающих. Собственно, как и Pascal, Basic был предназначен для обучения.

Изначально разработка была по большей части теоретической. Но уже в середине 70-х годов появились первые персональные компьютеры, язык Basic подошел для них наилучшим образом — ведь он тогда занимал всего 4 Кб памяти.

В 1975 году два молодых программиста — Пол Аллен и Уильям Гейтс начали разрабатывать интерпретатор Бейсика для персонального компьютера Altair 8800. Вскоре родилась и компания Microsoft, а Basic оказался первым продуктом, выпущенным ею.

Basic был успешно перенесен на другие модели компьютеров, такие как Apple, Commodore и Atari. Затем интерпретатор был написан для только что появившегося IBM PC.

Будучи действительно весьма простым средством программирования,

совершенно непригодным в те времена для решения серьезных задач, Basic представлял собой качественно новую технологию создания программ в режиме интерактивного диалога между разработчиком и компьютером. То есть представлял собой прообраз современных систем программирования. Другое дело, что решение подобной задачи на технике тех лет было возможно только за счет максимального упрощения языка программирования и использования транслятора типа «интерпретатор».

Писать программы на ранних версиях Basic осложняли нумерованные строки, отсутствие структурных конструкций и типизации, а также интерпретируемость.

В середине 80-х годов компанией Microsoft был разработан QuickBasic (последняя версия 4.5). Это уже был полностью компилируемый язык, с структурными конструкциями, пользовательскими типами данных, причем еще и совместимый со старыми версиями (Basic и GW Basic). В конце 80-х годов насчитывалось около десятка систем Basic различных фирм-разработчиков [13, с. 57].

QBasic, в отличие от более ранних версий языка Basic, уже поддерживал современные средства модульного программирования. Это свойство поднимает его до современных языков программирования. К достоинствам этого языка также следует отнести то, что он: содержит хороший экранный редактор; не ограничивает длину программы; отменяет необходимость нумерации строк; предлагает операторы, позволяющие организовывать структуры внутри программ; поддерживает программные процедуры, вызываемые из основной программы; позволяет использовать локальные переменные.

С появлением Windows новая версия Basic названа Visual Basic.

Язык Basic менялся, приспосабливался к возможностям различных (все более мощных) машин. В конце 1993 года, одновременно с официальным объявлением о прекращении развития Basic/DOS, корпорация Microsoft объявила о намерении создать на основе VB новую универсальную систему программирования для прикладных программ, которая получила название Visual Basic for Applications (VB для приложений).

Первый вариант VBA 1.0 появился в составе MS Office 4.0, но лишь в программах Excel 4.0 и Project 6.0. В других же приложениях — Word 6.0 и Access 2.0 — были собственные варианты Basic. К тому же VBA 1.0 довольно сильно отличался (причем он имел ряд существенных преимуществ) от используемой тогда универсальной системы VB 3.0.

В конце 1996 года — после выпуска MS Office 97, в котором была реализована единая среда программирования VBA 5.0, включенная в программы Word, Excel и PowerPoint. Более того, VBA 5.0 использовала тот же самый языковый механизм и среду разработки, что и универсальная система VB 5.0.

В состав выпущенного пакета MS Office 2000 вошла соответственно версия VBA 6.0, используемая в шести программах — Word, Excel, PowerPoint, Access, Outlook, FrontPage.

Basic остается, пожалуй, самым массовым языком программирования — им владеют, в том числе и многие люди, работа и интересы которых вообще не связаны с программированием. А практически для всех программистов Basic стал своего рода «введением в профессию» [29, с. 145].

QBasic — диалект языка программирования Basic, разработанный компанией Microsoft, а также среда разработки, позволяющая писать, запускать и отлаживать программы на этом языке.

Для запуска среды программирования QBasic необходимо перейти qbasic.exe. На экране появляется оболочка QBasic (рисунок 4).

Основное поле (голубого цвета) — окно редактора, в этом окне набирается текст программ. В верхней строке экрана расположены слова, образующие главное меню QBasic.

В середине следующей строки расположено имя программы (точнее, имя файла с этой программой). Пока программе не дали другое имя, она будет называться «Untitle», что значит «не имеющая заголовка».

Программа на языке Basic записывается в виде последовательности символов, к числу которых относятся латинские и русские буквы, арабские цифры, знаки препинания , знаки операций , специальные символы (% & ! # $).

Среда разработки QBasic 4.5

Рис. 4. Среда разработки QBasic 4.5.

Программа на QBasic состоит из последовательности операторов. Оператор является основным элементом языка и описывает действия, которые необходимо выполнить для реализации алгоритма решения задачи. Он содержит служебное слово (имя оператора) и параметры.

Программные средства языка QBasic позволяют с графической информацией. Это обеспечивается языком графики, набором операторов и функций. Графические программные средства позволяют создавать на экране дисплея сложные изображения с различной глубиной свечения точек экрана, а также выводить одновременно с графической текстовую информацию [49, с. 101].

Как и в Turbo Pascal 7.0 элементарным изобразительным средством графического экрана в QBasic является чёрно-белая или цветная точка разной степени свечения. Местоположение всех точек на экране образует прямоугольную систему координат из горизонтальных строк (x) и вертикальных колонок (y).

Количество точек, которое может быть размещено на экране, зависит от разрешающей способности (средней или высокой). Разрешающая способность устанавливается оператором Screen.

При средней разрешающей способности горизонтальная строка содержит 320 точек, вертикальная — 200 точек. Точки нумеруются слева направо от х=0 до х=319 и сверху вниз от у=0 до у=199. Местоположение каждой точки задаётся её координатой. Имеются две формы задания координат точки: абсолютная и относительная. Абсолютная форма задания координаты точки имеет вид (х,у). Например, координата точки, которая находится в левом верхнем углу экрана, равна (0,0); координата точки в правом верхнем углу при средней разрешающей способности экрана дисплея равна (319,0); координата точки в левом нижнем углу при средней и высокой разрешающей способности равна (0,199).

Относительная форма предполагает задание координат относительно последней выведенной точки, осуществляемое с помощью операнда Step(x1, y1), где x1 и y1 — значения, которые прибавляются к координатам последней выведенной точки. Значения x1 и y1 могут быть положительными и отрицательными [51, с. 89].

При загрузке системы QBasic дисплей устанавливается системой в текстовый режим работы. Для задания графического режима используется оператор Screen, который устанавливает режим и параметры работы дисплея:

Screen режим, режим — целое выражение, устанавливающее режим экрана:

Screen 0 — текстовый режим;

Screen 1 — 320х200 графический режим.

Монитор воспроизводить 16 цветов, оператор Color [c],[f] позволяет выбрать цвет символов и цвет фона, где [c] — цвет символов, [f] — цвет фона.

Отдельный пиксель можно «зажечь» заданным цветом любой из двух универсальных команд графического режима Pset (x,y),[c] и Preset (x,y),[c].

Формат команд одинаков: сначала указываются координаты точки, а затем, если необходимо — номер цвета точки [45, с. 86].

Пример 1. Изобразить на экране бегущий отрезок.

For x=1 to 640

Preset (x-10,240)

Операторы Pset и Preset могут иметь еще следующие формы:

Pset Step (x, y)

Preset Step (x, y)

Step в этих операторах указывает на смещение точки относительно координат последней точки.

Оператор Line (x1,y1)-(x2,y2),[c] предназначен для рисования отрезка, соединяющего две произвольные точки экрана, где x1, y1 — координаты начала отрезка, а x2, y2 — координаты конца отрезка, c — цвет.

Если координаты начала отрезка опущены, то отрезок будет начинаться с координат последней точки.

В операторе Line можно использовать относительные координаты для начала или конца отрезка. Например:

Line Step (10, 10) — (100,165) будет нарисован отрезок от точки с координатами последней точки + 10, 10 до точки с координатами 100,165.

Конечно, можно нарисовать прямоугольник с помощью операторов Line,

повторяя их четыре раза для рисования четырех сторон, но можно для этой цели выбрать, более простой путь: Line (x1, y1)-(x2, y2), [c], B, Line (x1, y1)-(x2, y2), [c], BF, где:

B — параметр, указывающий на рисование прямоугольника;

BF — параметр, указывающий на рисование закрашенного прямоугольника;

x1,y1 — координаты верхнего левого угла прямоугольника;

x2, y2 — координаты правого нижнего угла прямоугольника.

В случае пропуска какого-либо параметра или параметров необходимо сохранить нужное количество разделительными запятыми.

Пример 2. Нарисовать несколько вложенных прямоугольников.

For i=1 to 5

Line Step (10, 10)-(200-I*10,200-I*10)

Результатом выполнения программы будет (рисунок 5):

Рис. 5. Результат выполнения программы.

С помощью оператора Circle (x,y),r,[c] можно нарисовать окружность, где x,y — координаты или смещение центра окружности r — радиус окружности.

Чтобы нарисовать дугу, эллипс или сектор окружности необходимо добавить новые параметры в оператор Circle (x,y),r,c,n,k,a, где:

x,y — координаты центра окружности;

r — радиус окружности;

n — начальная точка дуги, заданная в радианах;

k — конечная точка дуги, заданная в радианах;

a — отношение значений y— радиуса и x — радиуса. Для рисования окружности используются только параметры x,y и радиус. Для рисования дуги необходимо добавить значения параметров начальной и конечной точек [29, с. 56].

Значения параметров начальной и конечной точек задаются в радианах и должны иметь значения между 0 и радиан (2р =6.28). При рисовании дуги отсчет идет от начальной точки дуги до конечной в направлении против часовой стрелки. При отрицательных значениях этих параметров начальные и конечные точки дуги соединяются с центром соответствующей окружности. Таким образом, на экране получается изображение сектора окружности. Если отрицательным является значение только одного параметра, то и соединяться с центром окружности будет только одна точка дуги.

Rem рисование окружности, дуги и сектора

Circle (100,100), 30 ? окружность?

Circle (180,100), 30, 3, 1, 2 ? дуга?

Circle (260,100), 30, 3, -2, -1 ? сектор?

Для рисования эллипса нужно ввести в оператор Circle коэффициент отношения радиусов по осям y и x. Этот параметр определяет степень сжатия эллипса и может иметь любое положительное значение. Следующая программа представляет оператор Circle с использованием различных параметров:

Rem Рисование мордашки

Circle (100,100), 70

Circle (75, 75), 10, , ,2

Circle (125, 75), 10, , ,2

Circle (100,100), 5, , ,2

Line (100, 40) — (90, 60)

Line (100, 40) — (110, 60)

Line (100, 40) — (100, 60)

Circle (100,110), 20, , , 3.14, 0

Результатом выполнения программы будет (рисунок 6):

Рис. 6. Результатом выполнения программы

С помощью оператора Paint (x,y),c1,c2 можно закрасить замкнутую область в заданный цвет:

x, y — координаты любой точки из замкнутой области;

c1 — цвет, в который надо закрасить область;

c2 — цвет, которым нарисована граница области.

Если цвет области совпадает с цветом границы, то с2 можно не указывать. Закрашиваемая область должна быть замкнутой. Если в контуре (на границе) области окажется разрыв, краска с1 «вытечет» из контура и заполнит весь экран.

В графическом режиме можно выводить текст командой Print. Каждый видеорежим имеет собственное деление экрана на строки и столбцы. Например, в режиме 9 экран делится на 25 строк и 80 столбцов (как бы имитация текстового режима). Матрица символа имеет размеры 8х14 — восемь столбцов и 14 строк (640/80 и 350/25). Координаты выводимого текста можно указать с помощью обычной команды Locate, например [36, с. 155]:

Locate 12,44

Print «A = »; A;

На экране будет: А = 48. Текст выводится текущим цветом символов, который указан в последней выданной команде Color.

Оператор Draw позволяет управлять движением «пера» с помощью графических команд [2, c. 34].

В строке символов записывается последовательность графических команд, причем каждая команда обозначена латинской буквой и целым числом (например, e10, c2 и т.д.). Движение пера начинается с текущей позиции курсора, а эту позицию можно установить оператором Pset или Preset.

Следующая «таблица 2» содержит команды [51, с. 189], необходимые для рисования:

10.12. Графические возможности basic

При программировании на BASICе вы можете задействовать графику. Это позволит наглядно смодулировать некоторые процессы (например движение). BASIC имеет обычные процедуры графического режима, присущие большинству языков программирования. Опишем их.

1. Переход в графический режим экрана

Для того, чтобы начать работать с графикой, сначала надо перейти в графический режим. Для этого существует оператор SCREEN, его синтаксис: SCREEN [mode] [,[apage]] [,[vpage]]

mode — Это режим в котором находитмя экран при выводе графики. Режим устанавливает разрешение экрана, его цветовую гамму.

apage, vpage— это номера страниц экрана, где apage — это активная в данный момент страница, а vpage — скрытая страница экрана.

Количество страниц в каждом графическом режиме различно и звисит от объема видеопамяти, поэтому следует сначала узнать количество страниц, а потом устанавливать значения переменных. Параметры некоторых режимов(для VGA мониторов) смотри в разделе SCREEN.

2. Операторы, реализующие графику

1. Оператор PSET организовывает прорисовку точки на экране.

Cинтаксис: PSET (x,y) [,color] (x,y) — координаты точкиcolor — цвет вывода

2. Оператор CIRCLE организовывает прорисовку окружности на экране.

Cинтаксис: CIRCLE (x,y),radius[,color][,[start]][,[end]][,[aspect]]

(x,y) — координаты центраradius — радиусcolor— цвет выводаstart,end-используются для прорисовки части окружности, задаётся начало и конец соответственноaspect-используются для прорисовки элипса

3. Оператор LINE организовывает прорисовку линии или закрашенного/незакрашенного прямоугольника на экране.

Cинтаксис: LINE (x1,y1)-(x2,y2),[,[color][,[B[F]] (x1,y1)— координаты начала линии(x2,y2)— координаты конца линииcolor — цвет выводаВ— используются для прорисовки незаполненного прямоугольникаBF — используются для прорисовки заполненного прямоугольника

4. Оператор PAINT заполняет какую-то область экрана заданным цветом

Cинтаксис: PAINT (x,y),[paint][,[bordercolor]][,[backgroung]]

(x,y) — координаты точки. Если точка поладает в область какого-нибудь изображения (окружности) то изображение заполняетсяbordercolor — цвет линии, ограничивающей областьbackgroung — цвет фона

5. Оператор POINT возвращает цвет точки по координатам

Cинтаксис: POINT (x,y) (x,y)-координаты точки.

Установка цветов в операторе color qBasic:

5 Фиолетовый

6 Коричневый

8 Темно-серый

9 Светло-синий

10 Светло-зеленый

11 Светло-голубой

12 Светло-красный

13 Светло-фиолетовый

11.Технология структурного программирования

С момента появления первых ЭВМ возникла потребность написания большого количества программ, и эта потребность увеличивалась с каждым годом. Начали складываться методы и принципы создания программных продуктов, из которых постепенно сформировалась традиционная для 60-х – 70-х годов технология программирования «снизу-вверх», суть которой заключалась в следующем: сначала создавались программные модули нижнего уровня, из которых далее формировались модули более высоких уровней. На формирование этой технологии оказало влияние то, что в то время потребителем программы становился ограниченный круг лиц (часто сами разработчики), поэтому вопросы, связанные с дальнейшим сопровождением программы, не принимались во внимание при оценке качества программы. Зато основным критерием качества считалась её эффективность в смысле экономии ресурсов ЭВМ, поскольку тогда эти ресурсы были весьма ограничены. Программа должна была занимать минимум ОЗУ и выполняться за кратчайшее время. Тело программы было очень запутанным, и исправлять скрытые ошибки и вносить изменения в данные программы было очень трудно. При таком проектировании основные трудности концентрировались на заключительных этапах разработки больших проектов.

С развитием средств вычислительной техники ситуация кардинально изменилась: количество потребителей программ резко возросло, и узким местом стали не вычислительные, а человеческие ресурсы, необходимые при создании и сопровождении программ. При этом сопровождение программ стало стоить в несколько раз дороже. Неудовлетворенность традиционной технологией и осознание новых критериев заставило искать новые технологические принципы. Эти принципы были найдены и успешно внедрены в практику корпорацией IBM в начале 70-х годов. С тех пор начала прочно утверждаться технология структурного программирования.

Цели структурного программирования:

избавиться от плохой структуры программы;

создавать программы, которые можно было бы понимать, сопровождать и модифицировать без участия автора.

Технология структурного программирования состоит из двух частей:

нисходящая разработка;

структурное программирование.

Нисходящая разработка.

Нисходящую разработку можно рассматривать как процесс, состоящий из трех этапов:

проектирование;

планирование;

Законы Мэрфи.

Все оказывается сложнее, чем кажется.

Все тянется дольше, чем можно ожидать.

Все оказывается дороже, чем планировалось.

Если что-то может испортиться, оно обязательно испортится.

Комментарий Каллагена: «Мэрфи был оптимистом».

Эти законы хорошо описывают проблемы традиционной восходящей технологии программирования.

Цели нисходящей разработки:

уменьшить сложность программ;

уменьшить время разработки;

позволить как можно раньше обнаружить ошибки.

Проектирование программы

Одним из принципов проектирования программ является модульность программ. Модуль – это программа, которую можно вызвать из любого другого модуля и можно отдельно откомпилировать.

Разбиение программ на модули характеризуется следующими преимуществами:

сокращение сроков написания программы, так как проектирование модулей можно поручить разным программистам;

можно создавать библиотеки наиболее часто употребляемых функций;

упрощается загрузка больших программ в ОЗУ – не требуется сегментация всей программы, так как это достигается естественным образом при разбиении на модули;

для руководства легче наблюдать за продвижением проекта;

проще проектирование и последующие изменения программы.

Наряду с этим имеются и недостатки:

может увеличиться время выполнения программы;

может возрасти размер памяти, требуемый программе;

может увеличиться время компиляции и загрузки;

при некорректном разбиении программ на модули могут возникнуть проблемы межмодульного взаимодействия (особенно при внесении изменений).

Для современной техники эти недостатки несущественны и окупаются за счет сокращения сроков разработки и сопровождения.

Разбиение программы на модули нужно производить по возможности так, чтобы модули имели следующие желательные свойства:

модуль должен иметь один вход и один выход и возвращать управление тому, кто его вызвал;

размер модуля должен быть небольшим (10-100 операндов), при этом его легче читать и тестировать;

модуль не должен сохранять историю своих вызовов для управления своим функционированием;

модуль должен по возможности реализовывать одну функцию преобразования исходных данных в результат, это позволяет выделять часто употребляемые модули и объединять их в библиотеки;

по возможности принятие решений в модулях нужно организовать так, чтобы эти решения прямо влияли только на выполнение вызываемых модулей;

модуль должен быть по возможности независимым от других модулей, для этого важно ослабить связи между модулями.

Модули могут быть связаны:

по содержимому, если один модуль ссылается на операторы другого модуля, используя абсолютное смещение, при этом даже перекомпиляция другим компилятором может привести к ошибке;

по общей памяти, если два модуля ссылаются на одинаковые абсолютные адреса, при этом изменение размера одного элемента общей области памяти может привести к ошибкам в других модулях. Глобальные данные затрудняют чтение программ, поэтому количество глобальных данных надо стремиться уменьшать;

по управлениюкогда один модуль при вызове другого модуля может модифицировать его действия (это может возникнуть, если вызываемый модуль реализует несколько функций, при этом, если исправлять действие одной из функций, можно испортить и выполнение остальных);

по данным, нужно стремиться передавать меньше данных в модули.

Нисходящее проектирование программы основано на идее уровней абстракции.

Абстрагирование – это процесс обобщения, при котором внимание концентрируется на сходстве явлений и предметов и они объединяются в группы на основе этого сходства.

Уровни абстракции определяют уровни модулей в программе. На этапе проектирования строится схема иерархии, отображающая эти уровни, их функции и взаимодействие модулей разных уровней. От блок схемы она отличается тем, что не показывает логику принятия решений или точный порядок исполнения.

Разработка схемы иерархии.

Чтобы создать схему иерархии, то есть спроектировать модульную организацию системы, нужно начинать с вершины и продвигаться вниз.

Пример. Диалоговая информационная система, в которой обрабатываются запросы пользователя, приведена на рисунке 1.

Линии связи показывают подчиненность модулей. Каждый модуль активизируется вышестоящим и, закончив работу, возвращается ему управление, то есть передача управления происходит только по вертикальным связям. Таким образом, схемы иерархии строятся с использованием принципа вертикального управления, который предполагает следующие правила:

модуль должен возвратить управление тому, кто его вызвал (исключение – аварийное завершение модуля);

модуль может вызвать другой модуль уровнем ниже, но не может вызвать модуль своего уровня или выше (но может рекурсивно вызвать сам себя). Это упрощает межмодульный обмен данными. Если нужно вызвать модуль, находящийся несколькими уровнями ниже, то в этом случае в схеме иерархии его нужно дополнительно поместить на следующий уровень и везде специально отметить. Это означает, что модуль пишется один раз, а используется на разных уровнях иерархии;

принятие основных решений нужно выносить на максимально высокий уровень (обычно в головной модуль, который является кратким конспектом всей программы);

модуль низшего уровня не должен принимать решения за модули высшего уровня, то есть модуль не должен производить действий, непосредственно изменяющих порядок работы программы.

Преимущества вертикального управления:

логика программы становится понятней;

программу проще изменять и дополнять, в ней нет перекрестных связей;

программирование и проверка вначале модулей высшего уровня, а затем низшего позволяет быстрее обнаруживать логические ошибки.

Модули низшего уровня детализируются только после написания всех модулей высших уровней. Рекомендации:

при разбиении на модули лучше чуть перестараться, чем недостаточно продвинуться, так как объединять модули легче;

нельзя рассредоточивать реализацию одной функции в разных модулях;

аргументы функции следует передавать явно, а не через общую память, количество аргументов нужно стремиться уменьшать.

Процесс разделения на функции заканчивается, когда все модули полностью спроектированы и дальнейшее деление может привести к рассредоточению функций. Задача разбиения на модули не имеет единственного решения.

При разбиении программы на модули нужно провести внешнее проектирование каждого модуля, то есть определить его внешние характеристики. Эта информация выражается в виде внешних спецификаций модуля, которые содержат описания всех сведений, необходимых вызывающим его модулям. Здесь не описывается логика работы модуля.

Внешние спецификации должны содержать следующие сведения:

функция, выполняемая модулем;

список параметров – число и порядок передачи модулю параметров;

входные параметры – точное описание всех входных параметров (формат, размер, единицы измерений, диапазоны значений);

выходные параметры – точное описание данных, которые возвращает модуль, здесь же указывается функциональная связь между входными и выходными параметрами, а также выходные данные, которые получаются при неверных входных данных;

внешние эффекты – дается описание всех внешних событий, происходящих при работе модуля;

использование внешних областей памяти и глобальных объектов.

Внешние спецификации определяют межмодульные связи. Их изменение приводит, как правило, к изменению вызывающих модулей. Лучше всего эти спецификации помещать в виде начального комментария в тексте модуля.

Конец этапа проектирования характеризуется следующими условиями:

известно необходимое число модулей и их спецификации;

связи между модулями отображены схемой иерархии;

вся работа проверена пользователями на точность и полноту.

Планирование.

Планирование включает в себя две задачи: планирование порядка разработки модуля и планирование тестов. На этом этапе выбирается последовательность программирования и тестирования модулей.

Планирование порядка разработки модулей.

Существуют несколько подходов, но наиболее распространены иерархический и операционный подходы.

Иерархический подход.

При этом подходе порядок программирования и тестирования модулей определяется их расположением в схеме иерархии. Сначала программируются и тестируются все модули одного уровня, после чего происходит переход на уровень ниже. При тестировании вызовы модулей нижних уровней заменяются заглушками. Заглушка – это упрощенная схема будущего модуля, содержащая все необходимое для тестирования модуля более высокого уровня и эмулирующая для модуля высокого уровня поведение модуля низкого уровня.

Используя иерархический подход, не нужно забывать о двух вещах:

необходимость использовать в модуле данные, подготовленные или измененные другим модулем, то есть зависимость по данным, может затруднить программирование и тестирование при иерархическом подходе;

слепое следование поуровневому подходу приводит к реализации основной массы модулей в конце проекта.

Операционный подход.

При этом подходе модули разрабатываются в порядке их выполнения при запуске готовой программы. Так как порядок исполнения обычно меняется с изменением входных данных, то здесь также остается свобода для выбора порядка разработки. Преимущество операционного подхода в том, что минимизируются трудности, вызванные зависимостью по данным. Недостаток операционного подхода в том, что при такой последовательности разработчики модулей «выстраиваются в очередь», то есть нерационально используется рабочая сила.

Таким образом, в чистом виде ни иерархический, ни операционный подходы не дают приемлемого результата. Наилучший подход – комбинированный, где взвешиваются достоинства каждого подхода. При этом, чтобы не выйти за рамки нисходящей технологии, перед программированием каждого модуля нужно проверять следующие условия:

должен существовать путь управления к этому модулю, то есть такая цепочка уже разработанных модулей, через которую управление может быть передано новому модулю (критерий управления);

должны быть доступны значения всех данных, необходимых для работы модуля, которые выдаются либо уже разработанными модулями, либо заглушками (критерий доступности данных).

Кроме этого, при определении порядка разработки модулей следует учитывать следующие рекомендации:

обеспечить готовность вспомогательных модулей в первую очередь;

следует начинать проектирование со сложных модулей, так как они могут оказаться сложнее и потребовать для разработки больше времени, кроме того, ранее программирование обнаружит ошибки в определении режимов работы модулей;

обработка исключительных ситуаций, связанных с неправильными данными, должна программироваться в первую очередь.

На практике большинство этих принципов противоречат друг другу. Поэтому такое планирование требует времени и способностей. При поиске наилучшей последовательности лучше всего начинать с операционного подхода. При этом легко убедиться, что критерий управления и критерий доступности данных выполняются для каждого модуля. При этом часто нужно пытаться мысленно выполнить программу. Это может помочь выявить недостатки полученной модульной структуры и документации на модули (в документации должна быть указана зависимость модуля по данным).

Пример планирования для схемы на рисунке 1.

Последовательность разрабатываемых модулей.

«Обработать запрос» – головной модуль.

«Вывести ответ» – необходим при тестировании.

«Подготовить ответ», «Анализ», «Получение информации» – как наиболее сложные.

«Ввести запрос», «Признать», «Проверить» – как наиболее простые.

Планирование тестов.

Вместе с планированием порядка, в котором следует разрабатывать модули, нужно планировать разработку тестов для всего проекта. Тесты необходимо готовить до начала программирования в силу следующих причин:

устраняется возможность подгонки тестов к уже написанной программе (уменьшается возможность внесения одних и тех же ошибок в программу и тест);

лучше понимаются ограничения на входные данные (сопряжение модулей зависит от передаваемых данных);

при планировании и разработке тестов программист вынужден представить себе окончательный результат, получаемый программой, что позволяет на ранних этапах проектирования увидеть неточности спецификаций и вовремя принять решения;

при таком подходе обеспечивается непрерывность создания программ: тесты определяют входные данные, которые используются при разработке модуля и при его проверке.

В некоторых случаях для тестирования создаются специальные программы – генераторы тестов.

Тесты не должен готовить тот человек, который пишет программу, чтобы исключить взаимовлияние этих процессов. Тестер должен быть специалистом высокой квалификации, знакомый с областью применения программы. Нужно привлекать к процессу тестирования пользователя программы: он может указать различные ситуации, возникающие при эксплуатации, и помочь при определении ограничений на данные.

Этап реализации включает:

фактическую подготовку тестов;

программирование и тестирование модулей.

Модули нужно добавлять по одному, а все возникающие несоответствия стараться обнаружить и исправить до перехода на следующий уровень.

Структурное программирование.

Общепринятого точного определения структурного программирования нет. Как концепция оно привлекло внимание после того, как Корадо Бойман и Джузеппе Якопини в 1966г. было доказано, что программу для решения любой логической задачи можно составить только из трех структур: следование, ветвление и повторение (цикл). Далее было указано, что неограниченное использование оператора goto нарушает соответствие между текстом и логикой работы программы (то есть программа плохо читается).

Можно так определить структурное программирование: это программирование, ориентированное на общение с людьми, а не с машиной. Для этого программа должна удовлетворять следующим требованиям:

текст программы должен быть композицией трех основных элементов: следование, ветвление и цикл;

употребление goto следует избегать всюду, где это возможно. Наихудшее применение goto – переход на оператор, расположенный выше в тексте программы;

при написании программы желательно придерживаться следующих рекомендаций: используйте осмысленные имена для объектов; избегайте схожих имен; избегайте использования промежуточных переменных; во избежание неоднозначности употребляйте скобки в выражениях; по возможности избегайте специфических особенностей языка; не игнорируйте предупреждающие сообщения компилятора; игнорируйте все предложения по повышению эффективности, пока программа не будет правильной; используйте комментарии для записи спецификаций в начале модуля; комментируйте объявления переменных (для чего они предназначены); помните особенности внутреннего представления данных в ЭВМ и диапазоны значений типов переменных;

текст программы нужно структурировать, то есть писать так, чтобы можно было легко выделять блоки программы;

каждый модуль должен иметь один вход и один выход.

Защитное программирование (защита от дурака) – это контроль входных данных с целью обнаружения ошибок в них. Оно используется для следующих целей:

устойчивость программы в целом;

худшее, что может сделать модуль, – это получить неверные входные данные и выдать неверный, но правдоподобный результат.

Защитное программирование требует разумного подхода, так как, доведенное до крайности, оно может чрезвычайно усложнить программу.

Тестирование программного обеспечения.

Тестирование – это процесс выполнения программы с намерением найти ошибки. Если цель – показать отсутствие ошибок, то их будет найдено немного, если цель – показать наличие ошибок, то их будет найдено значительно больше. Отладка – это процесс установления точной природы уже найденной ошибки и ее исправление. Результат тестирования является исходными данными для отладки. Фундаментальные принципы тестирования отражены в следующих аксиомах тестирования.

Хорош тот тест, для которого высока вероятность обнаружить ошибку, а не тот, который демонстрирует правильную работу программы.

Одна из самых сложных проблем при тестировании – решить, когда надо закончить, то есть как выбрать минимум тестов, дающих максимальную отдачу.

Невозможно тестировать свою собственную программу. Тестирование должно быть разрушительным процессом.

Необходимая часть любого теста – описание ожидаемых выходных данных и результатов, то есть ожидаемые результаты тестирования нужно определять заранее, до написания программы.

Нужно избегать не воспроизводимых тестов, то есть не задавать в качестве входных воздействий заранее не спланированные значения, которые часто невозможно повторить при нахождении ошибок. Тесты следует документировать.

Нужно готовить тесты как для правильных, так и для неправильных входных данных.

Нужно детально изучать результаты каждого теста.

По мере роста числа ошибок, обнаруженных в программе, растет относительная вероятность существования в ней необнаруженных ошибок.

Тестирование нужно поручать самым способным программистам.

Никогда нельзя изменять программу с целью облегчения ее тестирования.

Существует два похода к тестированию.

Предполагает составлять тесты только на основе внешних спецификаций.

Предполагает составлять тесты, изучая только логику программы.

Проектирование тестов.

Руководствуясь внешними спецификациями, нужно подготовить тест для каждой ситуации, вызывающей внешние эффекты, для каждой границы областей допустимых значений входных и выходных данных, для всех недопустимых условий. Если входных параметров немного и они имеют мало различных значений, имеет смысл перебрать все входные комбинации. Если входные аргументы ограничены некоторым диапазоном значений, то проверяют работу на границах области допустимых значений и в нескольких внутренних точках. Многие программы имеют функциональные границы. (Например, модуль выполняет сортировку чисел. Функциональные границы: массив пуст или содержит один элемент, массив уже отсортирован, все элементы массива – одинаковые).

Нужно проверить текст программы и добавить тесты с целью охвата всех условных переходов.

Для каждого цикла необходимо составить тесты соответствующие однократному выполнению тела цикла, максимальному числу итераций, обходу тела цикла.

По тесту программы необходимо выявить чувствительность к особым значениям входных данных и добавить тесты.

Как перевести программу basic в графический режим

Монитор современного компьютера может работать в двух режимах: текстовом и графическом. В языке программирования Quick Basic предусмотрены способы вывода информации на экран в обоих режимах.

Рассмотрим, что и каким образом можно выводить на экран в текстовом режиме.

По умолчанию Quick Basic работает с монитором в текстовом режиме. В этом режиме на экран можно вывести все символы, которые есть на клавиатуре , и символы псевдографики. В текстовом режиме экран имеет 25 строк, в каждой строке 80 позиций ( однако, с помощью оператора WIDTH 40 можно получить 40 “широких” позиций) для вывода символом, следовательно, максимальное количество символов, которое можно разместить на экране в текстовом режиме , равно 2000=25х80.

5.1. Управление цветом в текстовом режиме

Оператор COLOR цвет_символа, цвет_фона устанавливает цвет выводимого символа и цвет фона под символом.

Цвет символа — это число от 0 до 15, т.е. символ может быть выведен на экран одним из 16 цветов .

Цвет фона — это число от 0 до 7.

Если оператора COLOR в программе нет совсем, то Quick Basic по умолчанию устанавливает цвет 7 (белый) для символа и цвет 0 (черный) для фона.

Каждый цвет — это комбинация трех основных цветов — красного, зеленого и синего . Каждый цвет может выводиться с низкой или высокой интенсивностью (яркостью).

0 — черный

8 – серый

1 — синий

9 — ярко-синий

2 — зеленый

10 — ярко-зеленый

3 — голубой (точнее, циан)

11 — ярко-голубой

4 — красный

12 — ярко-красный

5 — фиолетовый

13 — ярко-фиолетовый

6 — коричневый

14 — желтый

7 — белый

15 — ярко-белый

Красный Зеленый Синий Обычный Яркий

Составим таблицу цветов. Наличие в цвете какой-либо цветовой компоненты будем отмечать единицей, а ее отсутствие — нулем.

Если к цветам, указанным в таблице, прибавить 16, то символы будут выводиться тем же цветом, но кроме того начнут мигать. Таким образом, если в качестве цвета символа указан код со значением с 16 по 31, то мы получим соответствующий мигающий цвет.

Пример: обычный красный — 4; мигающий — 20.

Задание . Загрузите программу PRG.BAS и сделайте полоски разных цветов.

Некоторые символы не так-то просто вывести на экран просто потому, что их нет на клавиатуре. Это, в частности, относится к символам псевдографики.

Псевдографика — это символы, с помощью которых можно рисовать линии, рамки и другие графические изображения в текстовом режиме. Символы псевдографики отличаются от обычных символов тем, что занимают всю ширину (высоту) места, отведенного символу на экране. Поэтому они, будучи поставлены рядом, сливаются и образуют непрерывные линии.

Чтобы вывести на экран символ, отсутствующий на клавиатуре , нужно нажать клавишу Alt и, не отпуская ее, другой рукой набрать код символа (число от 0 до 255). (Некоторые драйверы клавиатуры имеют режим набора псевдосимволов.)

Приведем коды некоторых символов.

Одинарная рамка: Двойная рамка:

Задача . Вывести на экран таблицу символов.

Решение. С помощью функции CHR$ получим символ по его коду:

символ = CHR$( число )

и сразу выведем его на экран оператором PRINT . Чтобы все символы поместились на экране, расположим их в виде таблицы 16х16. Пронумеруем строки и столбцы таблицы числами от 0 до 15. Тогда код символа, стоящего на пересечении i-ой строки и j-го столбца , равен значению 16*i + j. Организуем вывод таблицы по строчкам:

Запишем программу под именем TABL.BAS и выполним ее. На экране появится таблица, однако некоторые места в ней останутся пустыми — для этих кодов нет графического представления. Но это не значит, что ими нельзя воспользоваться в программе! Так, например, при выполнении оператора PRINT CHR$(7) раздается звуковой сигнал, PRINT CHR$(12) очищает экран, PRINT CHR$(13) переводит курсор на новую строку и т.д.

Конечно, чаще всего, те же действия можно выполнить “стандартными” операторами: BEEP — звуковой сигнал, CLS — очистка экрана, перевод строки делается автоматически после вывода на экран (если только в конце оператора PRINT не стоит точка с запятой для подавления перевода строки!). Иногда знание кода символа необходимо. Невозможно, например, вывести оператором PRINT текст, содержащий кавычки, так как последние воспринимаются как ограничители. Чтобы вывести на экран фразу: “Смотрите фильмы в кинотеатре “Космос”!” следует написать

PRINT “Смотрите фильмы в кинотеатре”; CHR$(34);“Космос”; CHR$(34); “!”

PRINT “Смотрите фильмы в кинотеатре”+ CHR$(34) +“Космос”+ CHR$(34) + “!”

Вернемся к программе TABL.BAS. Поскольку вывод символа с кодом 12 эквивалентен оператору CLS , то с экрана сотрется изображения предыдущих символов, и мы их не увидим (разве что заметим, как что-то мелькнуло на экране). Вставим, поэтому, проверку условия: код символа не равен 12 (Так как знака “не равен” нет на клавиатуре, то он изображается двумя символами: <> или ><).

Задания . Пользуясь символами псевдографики “нарисуйте” на экране рамку, лестницу, флаг, забор и т.д.

6. Работа с монитором в графическом режиме

В графическом режиме минимальным элементом, который можно вывести на экран, является не символ, а пиксель . Пиксель (точка экрана) представляет собой крошечный прямоугольник, размеры которого зависят от установленного графического режима. Верхняя левая точка экрана имеет координату (0,0), ось ОХ направлена вправо, ось О Y – вниз, т.е. чем ниже на экране расположена точка, тем больше ее координата по оси OY..

Оператор SCREEN номер режима переводит режим работы экрана из текстового в графический с заданным номером. Если оператор SCREEN не указан, то подразумевается текстовый режим. Текстовый режим имеет номер 0, поэтому, если нужно из графического режима перейти в текстовый, следует использовать SCREEN 0 . Иногда при возврате из графического режима (например, из SCREEN 7) символы текста становятся широкими. Вернуть им нормальные размеры можно только оператором WIDTH 80. Графические режимы различаются разрешением (количеством “точек”) экрана и количеством возможных цветов.

Например, SCREEN 7 устанавливает разрешение экрана в 320 точек по горизонтали и 200 точек по вертикали. Положение произвольной точки на экране задается двумя числами (x, y) в экранной системе координат. От декартовых координат эта система отличается тем, что ось Oy направлена вниз, а не вверх.

В графическом режиме на экран кроме символов можно выводить и геометрические фигуры: точки, линии, прямоугольники, окружности и т.д. Замкнутые фигуры можно закрашивать.

6.1. Рисование точек и линий

Оператор PSET (x, y)[, цвет ] закрашивает точку экрана заданным цветом.

Оператор LINE (x1, y1)-(x2, y2)[, цвет ] рисует отрезок, соединяющий на экране точки с координатами (x1, y1) и (x2, y2)

Оператор LINE — (x2, y2)[, цвет ] рисует отрезок, соединяющий последнюю выведенную на экран точку с точкой (x2, y2).

Цвет в этих операторах задается числом от 0 до 15. Если цвет в графических операторах не указан, то все линии рисуются белым цветом. (О том, какие могут быть цвета в различных графических режимах, мы поговорим позже.)

Пример. Соединить точки (20, 45) и (38, 144).

Первый способ: LINE (20, 45)-(38, 144)
Второй способ: PSET (20, 45)
LINE -(38, 144 )

Задание . Построить на экране треугольник, четырехугольник, пятиугольник; нарисовать домик. Записать программу “Домик” в файл HOUSE.BAS.

6.2. Прямоугольники и квадраты

Рисовать домик отдельными линиями — не самый рациональный способ. Легко увидеть, что домик представляет собой прямоугольник с крышей из двух отрезков. (Так рисуют домик почти все, кроме гениальных фантазеров и профессиональных художников.) А нарисовать прямоугольник можно одним оператором

LINE (x1, y1)-(x2, y2), [ цвет ], B

Этот оператор рисует рамку-прямоугольник со сторонами, параллельными границам экрана. Точки (x1, y1) и (x2, y2) суть две вершины прямоугольника, расположенные по одной из его диагоналей. Если параметр цвет отсутствует, то будет нарисована белая рамка. (Но “лишняя” запятая должна остаться!)

Поскольку точки экрана представляют собой маленькие прямоугольнички, то попытка нарисовать квадрат оператором

LINE (20, 20)-(120, 120), , B

потерпит неудачу. Высота этого “квадрата” окажется больше, чем ширина, хотя обе стороны содержат одинаковое число пикселей. Уменьшим число точек в высоте “квадрата” в 1.2 раза (для SCREEN 1 !) или во столько же раз увеличим ширину “квадрата” — только тогда мы получим истинный квадрат. Поправочный коэффициент назовем “коэффициентом вытянутости” пикселя.

Оператор LINE (x1, y1)-(x2, y2), [ цвет ], BF рисует такой же, но закрашенный прямоугольник.

Задача . Нарисовать на экране пирамиду из 10 ступенек-прямоугольников.

Решение. Воспользуемся тем, что пирамида имеет осевую симметрию. Расположим ось пирамиды посредине экрана. Пронумеруем прямоугольники сверху вниз числами от 1 до 10. Очевидно, что значения x1, y1, x2, y2 зависят от номера прямоугольника. В силу симметрии, чтобы получить x1, нужно от 160 вычесть что-то, а чтобы получить x2 — прибавить столько же.

Составим вспомогательную табличку.

Номер
ступеньки

x1

x2
1 160 — 10 160 + 10
2 160 — 20 160 + 20
3 160 — 30 160 + 30
. . .
10 160 — 100 160 + 100

Легко заметить, что номер ступеньки-прямоугольника и величина добавки связаны зависимостью

Если обозначить через k номер ступеньки, получим формулы для вычисления x1 и x2:

Значения y1 и y2 также зависят от номера и высоты ступеньки h , где h — некоторая заранее заданная величина (например, h = 10 ):

Теперь можно составить программу.

Задание . Запишите программу под именем PIRAMIDA.BAS. Измените высоту, ширину, цвет ступенек. Составьте пирамиду из закрашенных прямоугольников; из закрашенных прямоугольников с рамкой другого цвета.

Заметим, что использование переменной h для обозначения высоты ступенек позволяет проще изменять высоту ступеньки.

6.3. Окружности и дуги

Оператор CIRCLE (x, y), радиус [, цвет ] рисует окружность заданного радиуса и цвета с центром в точке (x, y). Если вся окружность на экране не поместится, то будет нарисована только ее часть. Радиус окружности задается в пикселях, но такое количество пикселей укладывается только по горизонтали. Размер вертикального радиуса (в пикселях) зависит от номера графического режима.

Задача . Нарисовать несколько концентрических окружностей (“мишень”).

Решение.

Задание . Запишите программу под именем MISHEN.BAS. Сделайте шаг в цикле равным 3, 2, затем 1 (но не 0, так как программа “зациклится”!). Объясните возникающий при этом эффект. Измените положение “мишени” на экране так, чтобы ее часть ушла за экран. Введите зависимость положения центра окружности от ее радиуса. Поэкспериментируйте с несколькими разноцветными “мишенями ”.

Тем же оператором можно нарисовать и дугу, только дополнительно потребуется задать значения начального и конечного углов дуги:

CIRCLE (x, y), радиус , [ цвет ], нач_угол , кон_угол

Если поместить в точку (x, y) начало математической системы координат, то начальный и конечный углы откладываются от оси Ox в направлении против часовой стрелки.

Начальный угол может быть больше конечного, но принцип рисования дуги останется прежним.

Углы дуги должны задаваться в радианах. Поскольку это не всегда удобно , автор рекомендует переводить градусы в радианы каждый раз, как это потребуется. Коэффициент пропорциональности QR вычисляется по формуле QR = p /180, где p » 3.14159265358 всем известная константа. Конечно, можно использовать и конкретное значение коэффициента: QR » 0.0174329252.

Пример . Изобразите на листе бумаги, что получится на экране после выполнения программы:

Правильность ответа проверьте на компьютере.

Замечание. Математики рассматривают как положительные, так и отрицательные углы. В операторе CIRCLE также могут использоваться отрицательные значения для начального и конечного углов, однако здесь знак минус “сообщает”, что следует не только нарисовать дугу, но и провести один или оба радиуса. Измените предыдущую программу, посмотрите, что получится на экране. Учтите, что с точки зрения Quick Basic’а “отрицательный” нуль ничем не отличается от обычного, поэтому замените его очень маленьким отрицательным числом, например, — 0.001.

Задания для самостоятельной работы

Составьте программы, которые выводят на экран следующие картинки:

6.4. Графические режимы

SCREEN 1 — это устаревший графический режим, используемый в Quick Basic только для совместимости с некоторыми мониторами. В этом режиме доступны одновременно только 4 цвета (включая цвет фона). Одному и тому же номеру соответствуют разные цвета в зависимости от выбранной палитры :

голубой (3)

зеленый (2)

фиолетовый (5)

красный (4)

белый (7)

коричневый (6)

Номер цвета Палитра №1 Палитра №2

Оператор COLOR в этом режиме имеет свой особый синтаксис:

COLOR цвет_фона, номер_палитры

Выбор цвета фона намного богаче — он может быть любым из 16 основных цветов (от 0 до 15).

По умолчанию SCREEN 1 устанавливает первую палитру.

SCREEN 2 задает разрешение 640 точек по горизонтали на 200 точек по вертикали. В этом графическом режиме возможны только два цвета — черный и белый, заданные “раз и навсегда”. Использование оператора COLOR в этом режиме некорректно и вызовет сообщение об ошибке “Illegal function call” (“Недопустимый вызов функции”).

Высота пикселя в этом режиме больше его ширины в 2.4 раза.

SCREEN 7 задает разрешение 320 точек по горизонтали на 200 точек по вертикали, следовательно, “коэффициент вытянутости” пикселя , как и в SCREEN 1 равен 1.2..

В этом и следующих режимах оператор COLOR управляет цветом линий, цветом фона экрана и цветом символов текста. Можно указывать цвет рисования и в каждом графическом операторе (если цвет пропущен, то линия рисуется цветом, заданным в операторе COLOR , а если нет и оператора — то ярко-белым цветом). Оператор COLOR имеет следующий вид:

COLOR цвет_линии, цвет_фона

Цвет линии — число от 0 до 15, цвет фона — число от 0 до 7. Заданные параметры распространяются и на текстовый вывод, но в отличие от текстового режима нельзя вывести на экран мигающие символы. Кроме того, изменение цвета фона действует и на уже выведенный текст!

SCREEN 8 задает разрешение 640 точек по горизонтали на 200 точек по вертикали (“коэффициент вытянутости” = 2.4), а SCREEN 9 — 640 точек по горизонтали на 350 точек по вертикали. Точное значение “коэффициента вытянутости“ в SCREEN 9 равно 48/35. что практически равно 1.37.

Для мониторов типа VGA и SVGA возможны и другие графические режимы. Чаще всего используются режим SCREEN 12 с разрешением 640 точек по горизонтали на 480 точек по вертикали, в котором “коэффициент вытянутости” в точности равен 1. Однако в этом режиме в операторе COLOR указывается только один параметр — цвет линии (символа). Цвет фона оператором не задается!

Задание . Загрузите программу PIRAMIDA.BAS и посмотрите результат выполнения в рассмотренных графических режимах. Сделайте ступеньки пирамиды разных цветов. Подпишите рисунок (используйте оператор COLOR для задания цвета фона и символов текста).

6.5. Закраска произвольной области

Если на экране нарисована замкнутая кривая, то область внутри нее можно закрасить. Также можно закрасить и область, оставшуюся снаружи от кривой. Для этого используется оператор

PAINT (x, y), цвет_закраски, цвет_границы

Точка (x, y) должна попасть внутрь области, подлежащей закрашиванию.

Если граница области “дырявая”, то краска выльется за пределы области, даже если дырка всего в один пиксель. То же самое произойдет, если граница области содержит по недосмотру кусочек другого цвета — для оператора PAINT это все равно что дырка.

Пример . Нарисовать флаг Японии — красный круг на белом фоне.

Задание . Нарисовать флаги предложенных ниже стран или любой другой страны.

Чтобы упростить построение сложного контура, можно составить его из нескольких простых. Например, крест на флаге Швеции сделать из двух закрашенных прямоугольников, серп на флаге Турции — из двух кругов, один из которых закрасить белым, а другой, меньший, красным.

При закраске окружности в качестве начальной точки для оператора PAINT удобно брать центр окружности, в других случаях, особенно при закраске маленьких областей, легко “ промахнуться ” мимо области. Чтобы проконтролировать расположение начальной точки, заменим оператор PAINT оператором PSET(x, y). Убедимся в том, что точка (x, y) попала в нужное место, и после этого вернем оператор PAINT на свое законное место.

! Будьде внимательны с координатами диагонали! Помните, что вы задаёте координаты диагонали, а не координаты сторон прямоугольника! Просто довольно часто многие делают такую ошибку.

&nbsp &nbsp &nbsp &nbsp &nbsp Ах да, если вместо «B» поставить «BF», то новый прямоугольник будет закрашенным. LINE (X1,Y1)-(X2,Y2), C, BF — нарисуется закрашенный C цветом прямоугольник с координатами диагонали X1,Y1 и X2,Y2. А если хотите сделать фигуру с непереллельными экрану сторонами, то делайте это простой последовательностью операторов LINE безо всяких там B тем более BF. (:

&nbsp &nbsp &nbsp &nbsp &nbsp В паскале мы рисуем отрезки и прямоугольники двумя разными операторами — Line и Rectangle. Но расскажу я Вам сначала не о них. Оператор SetColor позволяет устанавливать текущий цвет, который устанавливается в скобках — «SetColor(C);». Не забывайте ставить этот оператор перед рисованием чего-либо. Вернёмся к нашим баранам. В скобках после оператора Line ставятся все координаты — начала и конца — через запятую — «Line (x1,y1,x2,y2);». С оператором Rectangle — та же история — «Rectangle (x1,y1,x2,y2);» — в скобках — координаты диагонали. Вот так-то! Идём дальше.

Примитивы: Окружности и эллипсы с дугами

&nbsp &nbsp &nbsp &nbsp &nbsp В паскале, как я уже сказал, эллипсы рисуются по-другому. «Формула» эллипса в паскале: «Ellipse (X,Y:integer; StAngle, EndAngle, Xradius, Yradius: Word);» — X и Y — координаты центра, Integer — целые, StAngle — начальный угол (для дуги), EndAngle — конечный угол (опять же — для дуги), Xradius и Yradius — радиучы эллипса (последние четыре величины типа Word — беззнаковые целые). Опять же, попрактикуйтесь с построением окружностей, дуг и эллипсов. Попрактиковались? Идём дальше.

Закраска

  • Контур должен быть замкнут, инача закрасится весь экран — «утечка краски».
  • Контур должен быть одноцветен. Если в контуре хотя бы один пиксел будет не того цвета, который задан, то компьютер поймёт это как разрыв и опять же — закрасит весь экран.
  • Координатры закраски должны лежать внутри контура.

Бейсик: Макроязык GML

&nbsp &nbsp &nbsp &nbsp &nbsp Для расширения возможностей рисования графики в бейсике был разработан специальный макроязык GML (Graphics Macro Language), который позволяет строить довольно сложные изображения и выводить их на экран. Каждая команда языка представлена латинской буквой, после которой следует один или два числовых параметра (чаще всего целых). Здесь показаны эти самые буквы (которые команды!):

Команда Действие
U,D,L,R,E,F,G,H Переместиться в точку в соответствии со стрелкой (выше)
M x,y Переместиться в точку с координатами x,y
M +/-n, +/-m Переместиться по отношению к текущей позиции на +/-n точек по оси X и на +/-m точек по оси Y. Знаки плюс и минус проставлять обязательно
At Поворот изображения против часовой стрелки вокруг точки, с которой начиналось рисование на 90 градусов*t (t=0/1/2/3). Действует во всех дальнейших командах до нового назначения
Cn Задание нового цвета. Действует во всех дальнейших командах до нового назначения
Sn Расстояние, указанное в командах перемещения, умножается на n/4 (0
B Переместиться в новую позицию при помощи следующих за B команд, но рисования не производить. Может предшествовать любой команде перемещения
N Выполнить следующую команду перемещения и вернуться в исходную позицию. Может предшествовать любой команде перемещения
P c1,c2 Команда заполнения контура цветом; c1 — цвет заполнения, c2 — цвет контура. Должны соблюдаться все вышеизложенные правила закраски, и курсор должен находиться внутри закрашиваемого контура

&nbsp &nbsp &nbsp &nbsp &nbsp Для использования этих команд языка GML используется оператор DRAW. Например, команда DRAW «R50 D50 L50 U50» изобразит нам квадрат, начиная от последней графической точки. Потренируйтесь и разберитесь, что к чему. Идём дальше.

Вывод текстовой информации в графике

! Только помните, что координаты в операторе LOCATE не графические (пиксели), а текстовые (символы)!

Анимация

&nbsp &nbsp &nbsp &nbsp &nbsp Чтобы сделать паузу, нужен оператор SLEEP, после которого задаётся количество секунд паузы. Если это количество не указать, то компьютер просто будет ждать нажатия любой кнопки. Самое интересное, что оператор SLEEP «понимает» только целые числа, то есть нельзя задать паузу в полсекунды или одну десятую секунды, только одну, две, три и т.д. секунды. Есть ещё один способ создания пауз, я даже его называю «генератором пауз». Это, как бы вы думали, что? Звук! Высокочастотный звук не слышен человеческому уху, и когда он звучит, другие операторы не выполняются. Так вот, исполняя оператор SOUND, динамик компьютера «пищит» на заданной частоте заданное количество тактов (а в секунде примерно 18,2 тактов). SOUND 5000, 18 — произнесётся звук частотой 5000 герц, и звучать он будет одну секунду. Кстати, динамик компьютера способен воспроизводить звуки частотой от 37 до 32767 герц. Ну вот, теперь Вы ещё и научились создавать звуки. Попрактикуйтесь — должно быть весело! (:

&nbsp &nbsp &nbsp &nbsp &nbsp Теперь рассмотрим пример движения круга слева направо по экрану (бейсик): &nbsp &nbsp &nbsp &nbsp &nbsp Давайте разберёмся. Сначала, после очистки экрана, включается режим 12 (640×480). Затем определяется Y центра окружности — 240 — центр вертикали. Затем в цикле X от 50 до 590 (по 50 от каждого края экрана) рисуется окружность радиусом 50 зелёного цвета. Потом, после паузы в одну секунду, рисутеся такая же окружность чёрного цвета, которая закрывает собою предыдущую окружность. Потом — следующий виток цикла, окружность смещается на 1 точку вправо, всё происходит заново, таким образом, мы видим, что наша зелёная окружность «плывёт» по экрану по горизонтали (правда, медленно! для этого советую зажать какую-нибудь клавишу — будет немного побыстрее).

Генератор случайных чисел

&nbsp &nbsp &nbsp &nbsp &nbsp Так вот, нетрудно догадаться, что делает этот самый генератор. Конечно, из этого словосочетания «генератор случайных чисел» в уме складывается что-то вроде этого:

&nbsp &nbsp &nbsp &nbsp &nbsp Конечно, я немного преувеличил. (: На самом деле, конечно же, он выглядит совершенно не так. Точнее сказать, он никак не выглядит, он просто есть. Так вот, генератор случайных чисел «производит» случайные числа — просто произвольные. Ладно, ближе к делу. Инициализация генератора случайных чисел (давно пора называть его просто ГСЧ, так и будем называть его в дальнейшем) выглядит следующим образом: RANDOMIZE TIMER в бейсике и просто Randomize; в паскале. Почему TIMER? Потому что в качестве основы для создания какой-либо последовательности случайных чисел, служат показания встроенного в компьютер таймера. Обычные операторы RND и Random генерируют случайное число от 0 до 1 (минимум 0,0000001, максимум 0,9999999 — мы видим, что вариантов просто море). Но, к примеру, нам нужно случайное число от одного до пяти — как это сделать? Очень просто. Вспоминаем функцию INT — она будет выделять целую часть из произвольного дробного числа. Дальше — в скобках после RND и Random ставится число, на которое будет умножаться это самое число от 0 до 1. Итак, Вы запомнили это, теперь забудьте! Просто запомните, что число в скобках n будет давать произвольно число от 0 до n-1, то есть, первые n чисел. То есть, если у нас такая строка: X=INT(RND(7)), то будет сгенерировано целое число от 0 до 6 включительно. Естественно, чтобы сделать число от 1 до 5, нужно написать INT(RND(5))+1. Например, RND сгенирировал случайное число — 0,54389, затем это число умножается на 5, получается 2,71945, потом выделяется целая часть — 2, и к ней прибавляется 1. Получается 3. Попало в диапозон? Конечно попало! Естественно, формулы с участием RND и Random можно «запихивать» в параметры операторов.

&nbsp &nbsp &nbsp &nbsp &nbsp А зачем, собственно, ГСЧ делает в разделе «графика»? Всё просто — его можно наглядно использовать в графике. Например, классический пример — звёздное небо. Задаём цикл от 1 до того количества звёзд, которое мы хотим, затем в нём просто пишем: «PSET (INT(RND(640))+1, INT(RND(480))+1), 7». В результате получится звёздное небо — чёрный фон и белые точки, произвольно появляющиеся каждый раз. Можно произвольно задавать цвет фигур (от 0 до 16), радиус, координаты, и так далее. Потренируйтесь, Вам должно понравиться! Можно также потренироваться с простыми числами — создать программу кидания кубика, а также бросания монеты. Это на ваше усмотрение — случайные числа часто используются.

&nbsp &nbsp &nbsp &nbsp &nbsp Таким образом, мы разобрали графику в бейсике и паскале. Идём в следующий раздел .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *