Главная страница
Навигация по странице:

  • 9.1 Модули 165

  • 9.2 Графическое программирование 167 Таблица 9.1 – Кодировки и названия цветов в графическом режиме VGAНомер цвета Код цвета Название

  • 9.2 Графическое программирование 169

  • Константа Значение Описание

  • 9.2 Графическое программирование 171

  • 9.2 Графическое программирование 173

  • программирование тусур. Программирование учебное пособие. Учебное пособие Томск Эль Контент


    Скачать 0.93 Mb.
    НазваниеУчебное пособие Томск Эль Контент
    Анкорпрограммирование тусур
    Дата17.08.2022
    Размер0.93 Mb.
    Формат файлаpdf
    Имя файлаПрограммирование учебное пособие.pdf
    ТипУчебное пособие
    #647947
    страница15 из 16
    1   ...   8   9   10   11   12   13   14   15   16
    Глава 9. Модули и графика
    const Max=100;
    var
    Stack: arrray[1..Max] of integer;
    Top: integer;
    procedure Push (Elem: integer);
    begin if Top > Max then begin writeln(
    'стек переполнен');
    Exit; end;
    Stack[Top]:= Elem; inc(Top);
    end;
    function Pop: integer;
    begin
    Pop:=0;
    If Top =1 then begin writeln(
    'стек пуст'); Exit; end;
    dec(Top); Pop:= Stack[Top]
    end;
    function Empty: boolean;
    begin Empty := Top=1; end;
    function Full: boolean;
    begin Full:= Top > Max end;
    begin
    Top:=1;{первоначально стек пуст}
    end.
    9.1.2 Стандартные модули
    В Турбо Паскале 7.0 существуют 10 стандартных модулей. Опишем кратко два из них.
    Модуль System
    Модуль System является основной библиотекой, куда входят все предопре- деленные процедуры и функции стандарта языка Паскаль а также подпрограммы общего назначения (управление вводом-выводом, работа со строками, статической и динамической памятью и т. д.). Модуль System автоматически подключается к любой программе, и его не следует упоминать в разделе объявления используе- мых модулей uses.
    Опишем некоторые функции из этого модуля.
    Процедура Halt(ExitCode: word) прекращает выполнение программы, вы- зывает в случае необходимости подпрограмму завершения и осуществляет выход в операционную систему. ExitCode — код завершения (при отсутствии этого па- раметра код завершения считается равным 0).
    Процедура Exit осуществляет немедленный выход из текущего блока (под- программы); в основной программе Exit действует подобно Halt.
    Процедура Randomize инициализирует генератор случайных чисел в зависи- мости от показания системных часов.

    9.1 Модули
    165
    Функция Random формирует случайное число: вызов без аргумента — Random выдает случайное вещественное число x в полуинтервале 0.0
    x < 1.0; вызов с аргументом Random(N: word) выдает целое число x в полуинтервале 0
    x < N.
    Модуль Crt
    Модуль Crt обеспечивает возможности для доступа к экрану дисплея в тексто- вом режиме и средства чтения информации с клавиатуры и простейшее управление звуком.
    Экран разбивается на 25 строк по 80 позиций. Номера строк и позиций на- чинаются с 1. В каждой позиции помещается один символ. Для каждого элемента экрана можно задать цвет фона и цвет символа, символ можно сделать мерцающим.
    Атрибуты символа размещаются в одном байте.
    Цвета с кодами от 0 до 7 можно использовать для символов и для фона. Цвета с кодами от 8 до 15 можно использовать только для символов. Константа Blink =
    = 128 используется для задания мигания символа.
    • Процедура TextBackGround(Color: Byte) задает цвет фона.
    • Процедура TextColor(Color: Byte) задает цвет символа.
    Вызов TextColor(Color+Blink) устанавливает мигание символов.
    • Процедура ClrScr очищает экран.
    • Процедура GotoXY(X,Y: Byte) перемещает курсор к элементу экрана с заданными координатами.
    • Функции WhereX и WhereY выдают в качестве значения координаты X и Y
    текущего положения курсора.
    • Процедура Delay(Ms:word) задает задержку выполнения программы на
    Ms миллисекунд.
    • Процедура Sound(Hz:word) запускает источник звука с частотой Hz герц.
    • Процедура NoSound выключает источник звука.
    • Функция KeyPressed:boolean анализирует нажатие клавиши клавиа- туры (за исключением вспомогательных клавиш: Shift, Alt, NumLock и т. п.). Если клавиша нажата, то результат равен True.
    • Функция ReadKey: char считывает символ с клавиатуры и освобождает буфер клавиатуры от считанного символа.
    Пример repeat until KeyPressed;
    ch:= ReadKey;

    166
    Глава 9. Модули и графика
    9.2 Графическое программирование
    Этот раздел описывает графическое программирование в Турбо-Паскале. Что- бы узнать, как использовать графику в PascalABC, следует обратиться к электрон- ному help’у транслятора PascalABC.
    9.2.1 Аппаратная и программная поддержка графики
    Аппаратная поддержка графики персонального компьютера обеспечивается двумя основными модулями: видеоадаптером (называется так же видеокартой или графической картой) и монитором.
    Монитор служит основным средством отображения вводимой и выводимой информации во время работы прикладных и системных программ. Изображение на экране формируется из светящихся точек (их обычно называют пикселями).
    Монитор персонального компьютера может работать в одном из двух режи- мов: текстовом и графическом. При выборе текстового режима на экран выводятся символы (литеры), как правило, по 80 символов в 25 строках. То есть тексто- вый режим монитора представляет из себя матрицу символов размерности 25
    ×80.
    Символ представляется из нескольких пикселов, преобразование которых в символ происходит на аппаратном уровне.
    В графическом режиме экран монитора разбивается на Y пикселов по вертика- ли и X пикселов по горизонтали и представляет собой матрицу пикселов. В этом режиме становится возможным вывод точки, линии, окружности и других геомет- рических фигур заданным цветом. Каждый пиксел характреризуется целочислен- ными неотрицательными координатами (x, y), указывающими его местоположение,
    и цветом. Пиксел с координатами (0, 0) находится в левом верхнем углу экрана;
    координата x увеличивается слева направо, координата y — сверху вниз.
    Неотрицательные значения целого типа X и Y определяются выбранным ти- пом графического драйвера и типом графического режима, а такжетехническими параметрами монитора и компьютера. Работой видеоадаптера управляет специаль- ная программа, которая называется графическим драйвером. Драйвер хранится на диске в отдельном файле с расширением bgi. Имя файла с драйвером соответствует типу видеоадаптера компьютера. Turbo Pascal обеспечивает работу со следующи- ми видеоадаптерами: CGA, MCGA, EGA, VGA, Hercules, AT&T 400, 3270 PC,
    IBM-8514.
    Графический режим устанавливает разрешение экрана и количество возмож- ных цветов пиксела. Цвет каждого пиксела определяют 3 цветовые составляющие:
    красная (Red), зеленая (Green) и синяя (Blue). Коротко — RGB. Номер цвета пиксе- ля залает яркость свечения каждой из трех составляющих, что дает возможность получения различных цветов. Так, например, если все три составляющие равны нулю, то цвет пиксела черный, если все три составляющие равны максимально возможному значению, то цвет пиксела белый. Графический режим VGA (Video
    Graphic Adapter) имеет разрешение экрана 640
    ×480 и 16 цветов. В данном режиме цвета записываются 4 битами, 3 младших бита задают свечение трех составляющих цвета (RGB), а старший бит задает их повышенную яркость.
    В таблице 9.1 представлены кодировки всех возможных цветов режима VGA
    графической библиотеки языка Turbo Pascal.

    9.2 Графическое программирование
    167
    Таблица 9.1 – Кодировки и названия цветов в графическом режиме VGA
    Номер цвета
    Код цвета
    Название
    0 0000
    Black
    (черный)
    1 0001
    Blue
    (синий)
    2 0010
    Green
    (зеленый)
    3 0011
    Cyan
    (бирюзовый)
    4 0100
    Red
    (красный)
    5 0101
    Magenta
    (пурпурный)
    6 0110
    Brown
    (коричневый)
    7 0111
    LightGray
    (светло-серый)
    8 1000
    DarkGray
    (темно-серый)
    9 1001
    LightBlue
    (ярко-синий)
    10 1010
    LightGreen
    (ярко-зеленый)
    11 1011
    LightCyan
    (голубой)
    12 1100
    LightRed
    (ярко-красный)
    13 1101
    LightMagenta
    (ярко-сиреневый)
    14 1110
    Yellow
    (желтый)
    15 1111
    White
    (белый)
    Множество битов, закрепленных в совокупности за всеми пикселями экрана,
    образуют видеобуфер (видеопамять). Основное назначение видеобуфера — хране- ние образа экрана. Видеопамять адаптеров разделена на несколько областей фик- сированного размера — видеостраницы.
    Чтобы сделать процесс графического программирования более эффективным,
    фирма Borland Int. разработала:
    • библиотеку Graph;
    • набор драйверов для работы с разными типами мониторов;
    • набор шрифтов для вывода на экран текста.
    Для формирования графических изображений в языке Turbo Pascal предназна- чен стандартный библиотечный модуль Graph. В нем содержится 79 графических процедур, функций, десятки стандартных констант и типов данных. Все они со- ставляют единый комплекс средств, позволяющих разрабатывать профессиональ- ные программные продукты.
    Подключение модуля Graph к пользовательской программе осуществляется стандартным способом — с помощью зарезервированного слова uses:
    Uses Graph;
    С этого момента все графические средства доступны пользователю.
    9.2.2 Инициализация графики
    Прежде чем работать с графикой, необходимо установить наиболее подходящий для имеющегося монитора видеорежим.
    С момента подключения модуля Graph программисту доступны все находящи- еся в нем подпрограммы. В первую очередь вызывается процедура InitGraph,
    которая устанавливает один из возможных графических режимов. Формат процедуры:

    168
    Глава 9. Модули и графика
    InitGraph(DriverVar,ModeVar,
    'C:TpBgi');
    Целочисленные переменные DriverVar и ModeVar задают драйвер и режим.
    Имеется встроенная константа Detect (она имеет нулевое значение). Если это значение присвоено параметру DriverVar:
    DriverVar:=Detect;
    то InitGraph автоматически инициирует нужный драйвер и установит наиболее подходящий для дисплея режим.
    Третий параметр — маршрут к файлу *.bgi. Пустая строка означает, что гра- фический драйвер находится в том же каталоге, что и программа.
    Пример
    Uses Graph;
    var DriverVar, ModeVar: integer;
    begin
    DriverVar:=Detect;
    InitGraph(DriverVar, ModeVar,
    '');
    Когда все запланированные графические работы выполнены, необходимо вый- ти из графического режима. Это делается с помощью, не имеющей параметров процедуры CloseGraph.
    В процессе выполнения этой процедуры освобождается память, распределен- ная под драйверы, графики, файлы шрифтов и промежуточные данные, и вос- станавливает режим работы адаптера в то состояние, в котором он находился до выполнения инициализации системы.
    Память видеобуфера подразделяется на несколько частей — так называемых ви-
    деостраниц. Их количество зависит от текущего режима и типа адаптера (для адаптера VGA используется 4 страницы). Нумерация страниц начинается с 0.
    В каждый отдельный момент на экране может быть отображена только одна страница, она называется видимой. По умолчанию видима страница с номером 0.
    Страничная организация позволяет с помощью графических процедур и функций формировать изображение на любой из страниц. Страница, на которой в данный момент формируется изображение, называется активной.
    Процедура SetActivePage(Page: word) устанавливает активную страницу для построения изображения.
    Пример
    SetActivePage(1);
    Построение изображения может производиться незаметно для смотрящего на экран (в этом случае активная страница не совпадает с видимой). Например, стра-

    9.2 Графическое программирование
    169
    ница может формироваться «подкачкой» данных с диска или с помощью любых процедур Turbo Pascal. Сформировав страницу, ее можно показать на экране с по- мощью процедуры
    SetVisualPage(Page: word),
    где Page — номер видимой страницы.
    Пример
    SetActivePage(0); {показ страницы 0 на экране}
    OutText(
    'Страница 0'); {строка появляется на экране}
    SetActivePage(1); {активная страница}
    OutText(
    'Страница 1'); {формирование изображения на странице 1, но на экране ее нет!}
    Readln;
    SetVisualPage(1); {показ страницы 1, строка на экране}
    Графическая программа, как и любая другая, может содержать ошибки. Про- граммист должен предусмотреть все возможное для их своевременного обнаруже- ния и нейтрализации. Для этого имеется две функции: GraphResult и GraphEr- rorMsg
    GraphResult возвращает значение 0, если последняя графическая операция выполнилась без ошибок, или число в диапазоне
    −15. . .−1, если ошибка была.
    Некоторые ошибки и их коды приведены в табл. 9.2.
    Таблица 9.2 – Коды ошибок
    Константа
    Значение
    Описание
    grOk
    0
    Нет ошибок grNoInitGraph
    −1
    Графика не инициализирована
    (используйте InitGraph)
    grNotDetected
    −2
    Графическое устройство не обнаружено grFileNotFound
    −3
    Файл драйвера устройства не найден
    Пример uses Graph;
    Var ErrorNumber:integer;
    Begin
    ErrorNumber := GraphResult;

    170
    Глава 9. Модули и графика
    В переменной ErrorNumber содержится код ошибки. Можно пользоваться как кодом ошибки, так и соответствующей ему константой, например:
    If ErrorNumber <> grOk then writeln(
    'Обнаружена ошибка');
    GraphErrorMsg
    возвращает строку сообщения об ошибке, соответствую- щую коду ошибки. Например, процедура writeln(GraphErrorMsg(ErrorNumber));
    выведет строку ''No error'', так как в нашем примере графический режим уста- новлен правильно. Инициализацию графического режима и проверку возможных ошибок удобно осуществлять в отдельной процедуре:
    procedure Init;
    {Процедура инициализации и анализ системных ошибок,
    DriverVar и ModeVar описаны в основной программе.}
    Begin
    DriverVar:= Detect;
    InitGraph(DriverVar,ModeVar,
    '');
    ErrorCode := GraphResult;
    If ErrorCode <> grOk then begin writeln(
    'Графическая системная ошибка',
    GraphErrorMsg(ErrorCode)); Halt(1)
    end end;
    9.2.3 Базовые процедуры и функции
    Система координат
    Для построения изображения на экране используется система координат. От- чет начинается от верхнего левого угла экрана, который имеет координаты (0, 0).
    Значение x (столбец) увеличивается слева направо, значение y (строка) увеличива- ется сверху вниз.
    Чтобы построить изображение, необходимо указывать, по крайней мере, точку начала ввода. В графическом режиме видимого курсора нет, но есть невидимый
    текущий указатель CP (CurrentPointer). Фактически это тот же курсор, но он невидим.
    В графическом режиме для перемещения CP имеется ряд процедур и функций.
    В первую очередь это MoveTo и MoveRel. Процедура MoveTo(x, y) перемещает текущий указатель в точку с координатами x и y. Процедура MoveRel(dx, dy)
    перемещает CP на dx точек по горизонтали и на dy точек по вертикали.
    В ряде программ выполняется постоянный контроль местоположения текущего указателя. Для этого используются функции GetX и GetY, которые возвращают соответственно значение координаты x и координаты y указателя CP.

    9.2 Графическое программирование
    171
    Пример var xpos,ypos:integer;
    xpos := GetX; ypos := GetY;
    В процессе управления CP может возникнуть ситуация, когда его координа- ты выйдут за допустимые пределы, в таких ситуациях используются функции
    GetMaxX
    :integer и GetMaxY:integer, которые возвращают соответственно максимально возможные для установленного режима значения координат x и y.
    Пример x := 6000 div 10;
    y := 2000 div 2;
    if (x>GetMaxX) or (y>GetMaxY) then writeln(
    'Вне экрана');
    Пример
    Определение центра экрана осуществляется очень просто:
    xc := GetMaxX div 2;
    yc := GetMaxY div 2;
    Такой способ избавляет вас от настройки на конкретный тип монитора и рас- ширяет область применения программы.
    Чтобы стереть изображения на экране, т. е. очистить его, используется не име- ющая параметров процедура ClearDevice. С момента ее выполнения все уста- новки по цвету, фону и т. д. аннулируются и указатель CP переходит в точку с ко- ординатами (0, 0).
    Точки и линии
    Какие бы изображения ни выводились на экран, все они построены из точек.
    Имея средство построения точки определенного цвета в нужном месте экрана,
    теоретически можно создать любое изображение вплоть до картины. В библиотеке
    Graph вывод точки осуществляется процедурой
    PutPixel(x,y:integer; Color:word),

    172
    Глава 9. Модули и графика
    где x и y — экранные координаты расположения точки, Color — ее цвет. Возмож- ные значения Color приведены в табл. 9.1.
    Пример
    Оператор for i:=0 to 59 do PutPixel(i,0,Red)
    выведет в первую строку экрана 60 красных точек.
    Чтобы узнать цвет точки в конкретной позиции экрана, используется функция
    GetPixel
    (x,y:integer):word.
    Из точек строятся линии (отрезки прямых). Это делает процедура Line(x1,
    y1
    , x2, y2), где x1 и y1 — координаты начала, x2 и y2 — координаты конца линии.
    В процедуре Line нет параметра для установки цвета. В этом и других анало- гичных случаях цвет задается процедурой SetColor(Color), где Color — цвет,
    значение которого берется из табл. 9.1.
    Пример
    SetColor(Cyan);
    Line(1,1,600,1);
    Для черчения линий применяются еще две процедуры: LineTo и LineRel.
    Процедура LineTo(x,y) строит линию из точки текущего указателя в точку с коор- динатами (x, y). Процедура LineRel(dx,dy) проводит линию от точки текущего расположения указателя в точку (GetX+dx, GetY+dy), где (GetX, GetY) — теку- щие координаты CP.
    Можно вычерчивать линии самого различного стиля: тонкие, широкие, штри- ховые, пунктирные и т. д. Установка стиля производится процедурой
    SetLineStyle
    (LineStyle : word; Pattern: word; Thickness:
    word);
    Параметр LineStyle устанавливает стиль линии, возможные значения кото- рого приведены в табл. 9.3; Pattern — образец, Thickness — толщину линии,
    определяемую константами, указанными в табл. 9.4. Если применяется один из стандартных стилей, значение Pattern равно 0.
    Пример
    SetLineStyle(DottedLn,0,NormWidth);
    Line(1,1,600,1);

    9.2 Графическое программирование
    173
    Если пользователь хочет активизировать свой собственный стиль, то значение
    LineStyle равно 4. В этом случае Pattern — двухбайтовое число.
    Таблица 9.3 – Стиль линии
    Константа
    Значение
    Описание
    SolidLn
    0
    Непрерывная линия
    DottedLn
    1
    Линия из точек
    CenterLn
    2
    Линия из точек и тире
    DashedLn
    3
    Штриховая линия
    UserBitLn
    4
    Тип пользователя
    Таблица 9.4 – Толщина линии
    Константа
    Значение
    Описание
    NormWidth
    1
    Нормальная толщина (1 пиксель)
    ThickWidth
    3
    Жирная линия (3 пикселя)
    Работа с текстом
    Для вывода текста на экран используются процедуры OutText и OutTextXY.
    Процедура OutText(TextString : string) выводит строку текста, начиная с текущего положения CP.
    Явный недостаток этой процедуры — нельзя указать произвольную точку нача- ла вывода. Его можно устранить с помощью MoveTo, но лучше воспользоваться процедурой
    OutTextXY(x,y,Text),
    где x, y — координаты точки начала вывода текста, Text — константа или перемен- ная типа string.
    Для начинающих проблемой является вывод численных данных, ибо в Graph нет предназначенных для этого процедур. Выход прост: сначала преобразовать число в строку с помощью процедуры Str, а затем посредством '+' подключить ее к выводимой OutTextXY строке.
    Пример
    Max := 34.56;
    Str(Max:6:2, Smax); {результат преобразования находится в Smax}
    OutTextXY(400,40,
    'Максимум ='+Smax);{+ — конкатенация}
    Список имеющихся шрифтов приведен в табл. 9.5. Установить нужный шрифт можно процедурой

    174
    1   ...   8   9   10   11   12   13   14   15   16


    написать администратору сайта