Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Уроки программирования на Turbo Pascal


Информационный Канал Subscribe.Ru


Уроки программирования на Turbo Pascal #23

Подписчиков на 2002-12-02 - 3372 человек(а).

Рассылка проекта "Олимпиада.com.ru".


Главная Архив задач Конкурс Обучение Рассылки Форум Контакты

Здравствуйте, уважаемые подписчики!


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


Урок 23


1. Работа в графической обстановке в турбо-паскале.
  Любая информация при работе в графическом режиме на экране монитора представлена совокупностью светящихся точек - пикселей, которые определяются цветом и координатами - положением относительно левого верхнего угла экрана с координатами (0,0).
  Дисплей может работать в нескольких графических режимах, каждому из которых может соответствовать свой формат изображения, т. е. разрешающая способность (количество пикселей по горизонтали и вертикали) экрана и набор используемых цветов. Формат изображения определяется техническими характеристиками дисплея, а также используемыми в текущий момент адаптером и драйвером. Адаптер (device adapter) - устройство сопряжения ЭВМ и внешнего устройства. Драйвер (device driver) - программа, обеспечивающая взаимодействие операционной системы с физическим устройством, обычно это файл с расширением *.BGI. Наиболее распространены дисплеи типа CGA, EGA, VGA. Характеристики некоторых драйверов:

Драйвер Режим Разрешение Файл
CGA (CGACO,CGAHi) 320х200 (640х200) CGA.BGI
EGA (EGALo,EGAHi) 640х200 (640х350) EGAVGA.BGI
VGA (VGALo,VGAHi) 320х200 (640х480) EGAVGA.BGI

2. Инициализация графического режима.
  Для использования графических функций и процедур модуля GRAPH.TPU необходимо инициировать графический режим работы экрана, используя процедуру INITGRAPH. Формат обращения:

  INITGRAPH (< драйвер >, < режим >, <путь>);

  где <драйвер> - переменная типа INTEGER, определяющая тип графического драйвера. Этот параметр может задаваться как по имени, так и цифрой;

  <режим> - переменная типа INTEGER, определяющая режим работы графического адаптера;
  <путь> - выражение типа STRING, содержащее путь к файлу драйвера *.BGI. Если он расположен в активной директории (в той, где находится ваша программа), то вместо маршрута ставятся два апострофа.

  Если тип адаптера ЭВМ неизвестен или если программа рассчитана на работу с любым адаптером, используется обращение к процедуре с требованием автоматического определения типа адаптера:


  Driver= Detect;
  lnitgraph(Driver, Regim, 'C:\TP\BGI');

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

{ Пример для InitGraph }
uses Graph;
var  grDriver : Integer;
     grMode : Integer;
begin
  grDriver := Detect; {Автоматическое определение типа драйвера экрана}
  lnitGraph(grDriver,grMode,");    {два апострофа}

  { Выполняем графику }
  Line(0, 0, GetMaxX, GetMaxY);
  ReadLn;
  CloseGraph;
end.


  В результате работы данной программы устанавливается графический режим и рисуется линия максимального размера из левого верхнего в правый нижний угол. READLN используется для задержки сформированного изображения.
  Процедура CLOSEGRAPH стирает экран, закрывает графический режим работы экрана и возвращает в текстовый режим.
  Чаще всего причиной возникновения ошибки при обращении к процедуре INITGRAPH является неправильное указание местоположения файла GRAPH.TPU, содержащего библиотеку графических процедур, или файла с драйвером графического адаптера (например, EGAVGA.BGI для адаптеров EGA и VGA). Настройка на местоположение драйвера осуществляется указанием пути к нужному файлу в качестве фактического параметра вызова процедуры INITGRAPH.

3. Основные графические примитивы.
  Функции GETMAXX, GETMAXY возвращают значения типа INTEGER, содержащие максимальные координаты экрана в текущем режиме работы соответственно по горизонтали и вертикали.
  Процедура PUTPIXEL выводит заданным цветом пиксель по указанным координатам; формат обращения:

  PUTPIXEL (X, Y, <цвет>);

  где X, Y - выражения типа INTEGER, определяющие координаты;
  <цвет> - выражения типа WORD , определяющее цвет. (см. таблицу, урок 22)

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


  SETCOLOR(<цвет>);

  где <цвет> - выражение типа WORD, задающее текущий цвет.

  Процедура SETLINESTYLE устанавливает новый стиль вычерчиваемых линий. Формат обращения:

  SETLINESTYLE(<ВИД>, <образец>, <толщина>);

  где <вид> - переменная типа WORD, задающая вид линии;
  <образец> - переменная типа WORD, указывающая образец линии;
  <толщина> - переменная типа WORD, задающая толщину линии.

  Вид линии определяется константами. Образец учитывается только для линий, вид которых определяется пользователем. Параметр <толщина> может принимать одно из двух значений (1-обычная, 3-утолщенная).

константа константа тип линии
SOLIDLINE 0 НЕПРЕРЫВНАЯ
DOTTEDLINE 1 ТОЧЕЧНАЯ
CENTERLINE 2 ПУНКТИРНАЯ
DASHEDLINE 3 ПУНКТИРНАЯ
USERBITLINE 4 ОПРЕДЕЛЯЕМАЯ ПОЛЬЗОВАТЕЛЕМ

  Процедура LINE вычерчивает линию с указанными координатами начала и конца. Формат обращения:

  LINE (X1, Y1, X2, Y2 );

  где X1,Y1, X2,Y2 - выражения типа INTEGER, определяющие координаты начала и конца линии. Линия вычерчивается текущим стилем и текущим цветом.

  Процедура CIRCLE вычерчивает окружность. Формат обращения:


  CIRCLE (X, Y, <РАДИУС>);


  где X,Y - выражения типа INTEGER, означающие координаты центра;
  <радиус> - выражения типа WORD, указывающее радиус в пикселях.
 

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

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


  RECTANGLE (X1, Y1, X2, Y2 );

  где X1, Yl, X2,Y2 - выражения типа INTEGER, определяющие координаты левого верхнего и правого нижнего углов прямоугольника.

  Прямоугольник вычерчивается с использованием текущего цвета и текущего стиля линий (устанавливаются процедурой SETLINESTYLE).

  Процедура SETFILLSTYLE устанавливает стиль (тип и цвет) штриховки. Формат обращения:


  SETFILLSTYLE(<ШТРИХОВКА>,<ЦВЕТ>);


  где <штриховка> - переменная типа WORD, задающая тип штриховки;
  <цвет> - переменная типа WORD, цвет штриховки.

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

константа константа комментарий
EMPTYFILL 0 штриховка фоном
SOLIDFILL 1 сплошное заполнение области
LINEFILL 2 штриховка горизонт. линиями
LTSLASHFILL 3 ///
SLASHFILL 4 /// утолщенными линиями
BKSLASHFILL 5 \\\
LTBKSLASHFILL 6 \\\ утолщенными линиями
HATCHFILL 7 штриховка +++
XHATCHFILL 8 штриховка ххх
INTERLEAVEFILL 9 штриховка в прямоугольную клетку
WIDEDOTFILL 10 редкими точками
CLOSEDOTFILL 11 частыми точками
USERFILL 12 шаблон пользователя

  Процедура FLOODFILL закрашивает произвольную замкнутую фигуру, формат обращения:

  FLOODFILL (X, Y, <ЦВЕТ ГРАНИЦЫ>);


  где X,Y - выражения типа INTEGER, означающие координаты любой точки внутри замкнутой фигуры;
  <цзет границы> - выражения типа WORD, цвет граничной линии.


  Процедура закрашивает замкнутую фигуру текущим образцом штриховки и текущим цветом (устанавливаются процедурой SETFILLSTYLE). Если штрихуемая фигура не замкнута, штриховка "разольется по всему экрану".


  Процедура BAR закрашивает прямоугольную область экрана. Формат обращения:

  BAR (X1, Y1, X2, Y2 );

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

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

Пример программы выводящей на экран разноцветные окружности.

uses crt,graph;
var
    gd,gm,i:integer;
begin
  gd:=detect;
  initgraph(gd,gm,'c:\bp\bgi'); {в апострофах указываем путь к BGI}
  for i:=1 to 10 do
  begin
    setcolor(i); {устанавливаем цвет линии}
    circle(300,220,220-i*20); {рисуем окружность}
    setfillstyle(i,i); {устанавливаем стиль и цвет закраски}
    floodfill(300,220,i); {закрашиваем}
  end;
  readkey;
end.


Тренировочные задания.
1. Изобразить домик в центре экрана. Размеры произвольные, крыша - красного цвета, стены - синие, двери, окна - зеленые.
2. Изобразить домик, расположение которого задается координатами, определяемыми в диалоге. (Графический режим нужно включать после окончания диалога.)
3. Нарисовать гусеницу из одинаковых окружностей, разного цвета.
4. Изобразить пирамидку из прямоугольников с разной штриховкой.
5. Написать программу рисующую снеговика.

Разбор заданий 22 урока.
1. Напишите программу "бегущей строки" с вводом текста строки с клавиатуры.

uses crt;
var str,st1:string[160];
    i,k:byte;
begin
  writeln('Введите текст бегущей строки, не более 80 символов');
  readln(str);
  i:=length(str);
  k:=80-i; {определяем сколько прбелов надо добавить к строке}
  st1:='';
  for i:=1 to k do st1:=st1+' '; {формируем строку пробелов}
  Textbackground(5); {установка цвета фона экрана}
  ClrScr; {очистка экрана}
  textcolor(blue); {установка цвета текста}
  st1:=st1+str;
  For i:=1 to length(st1) do
  begin
    Delete(st1,1,1);
    GoToXY(1,10); {установка текстового курсора}
    Write(st1); {вывод текстовой строки}
    Delay(4000);{Задержка выполнения программы}
    DelLine {Удаление строки отмеченной курсором}
  end;
end.


2. Составьте программу, выводящую на экран введенную фразу разными цветами лесенкой.

{Ступеньки}
uses crt;
var str:string[50];
    i,k:byte;
begin
  writeln('Введите строку');
  readln(str);
  k:=3; {размер отступа}
  ClrScr; {очистка экрана}
  For i:=1 to 15 do
  begin
    textcolor(i); {установка цвета текста}
    GoToXY(i*k,i); {установка текстового курсора}
    Write(str); {вывод текстовой строки}
  end;
  readln;
end.


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

{Окна}
uses crt;
var
  i:byte;
begin
  textbackground(0);
  ClrScr; {очистка экрана}
  textcolor(0);
  For i:=1 to 7 do
  begin
    window(10*i-9,10,10*i,15);
    textbackground(i);
    ClrScr;
    Write('?');
  end;
  readln;
end.


4.Напишите программу рисующую на экране несколько вложенных друг в друга разноцветных прямоугольников.

uses crt;
var
  i,k,l:byte;
begin
  l:=4;
  textbackground(0);
  ClrScr; {очистка экрана}
  For i:=0 to 10 do
  begin
    window(1+i*l,1+i,80-i*l,25-i);
    textbackground(i+1);
    ClrScr;
  end;
  readln;
end.


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


uses crt;
var
  i:byte;
begin
  textbackground(0);
  ClrScr;
  For i:=1 to 10 do
  begin
    window(10*i-9,10,10*i,15);
    textbackground(6);
    clrscr;
    delay(7000);
    textbackground(0);
    clrscr;
  end;
  readln;
end.


Желаю успехов!
Ганилова Татьяна Евгеньевна, school6@rikt.ru.
Гимназия №6, г. Междуреченск.

Распространение, переработка и тиражирование только с согласия автора.


Архив рассылки:

  Архив предыдущих выпусков рассылки: http://olimpiada.com.ru/learing.php?lesson=all;

Урок 1 Урок 2 Урок 3 Урок 4 Урок 5
Урок 6 Урок 7 Урок 8 Урок 9 Урок 10
Урок 11 Урок 12 Урок 13 Урок 14 Урок 15
Урок 16 Урок 17 Урок 18 Урок 19 Урок 20
Урок 21

Реклама в рассылке:

RLE    

  


Подпишитесь на наши рассылки:

Новости проекта "Олимпиада.com.ru" [Алексей Шамис]
Новости проекта "Olimpiada.com.ru". Новые темы на форуме. Информация о пополнениях в архиве задач. Оперативно и своевременно!

Уроки программирования на Turbo Pascal [Татьяна Ганилова]
Хотите стать Великим Программистом? Начните свой путь к вершине славы с изучения языка Turbo Pascal. Он как нельзя лучше подходит для начинающих программистов и в то же время используется для разработки сложных "профессиональных" программ.

Олимпиадные задачи с решениями на Turbo Pascal [Алексей Шамис]
В рассылке публикуются решения интересных олимпиадных задач различного уровня. Содержит много теоретической информации. Периодичность - 2-3 раза в неделю.

Задача в неделю. Олимпиадные задачи по информатике [Александр Алексеев]
Каждый понедельник в рассылке публикуется задача, которую необходимо решить и в следующий понедельник прислать программу на тестирование. Решения проверяются, и в пятницу публикуется разбор и итоги тестирования.



Всегда рады видеть Вас на нашем сайте.

Copyright © 2002 by Tatyana Ganilova.



http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное