Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Язык программирования Pascal

Язык Паскаль создан Н. Виртом в 1971 году. Он играет особую роль и в практическом программировании и в его изучении. Суще-ствует много версий языка Паскаль. Любая программа на Паскале является текстовым файлом с собственным именем и расширением.pas. Она имеет вид последовательности символов латинских и рус-ских букв, арабских цифр, знаков операций, скобок, знаков препи-нания и некоторых дополнительных символов. Схематически про-грамма представляется в виде последовательности восьми разделов:

1) заголовок программы (начинается со слова program);

2) описание внешних модулей, процедур и функций;

3) описание меток;

4) описание констант (начинается со слова const);

5) описание типов переменных (начинается со слова var);

6) описание переменных;

7) описание функций и процедур;

8) раздел операторов (начинается со слова begin).

Не в каждой программе обязательно присутствуют все разделы. Каждый раздел начинается со служебного слова, назначение кото-рого зафиксировано так, что его нельзя употреблять для других це-лей. Программа заканчивается служебным словом end, после кото-рого ставится точка. Описания величин и операторы отделяются друг от друга точкой с запятой. Для обозначения величин исполь-зуются имена. Они состоят из латинских букв и цифр, причем первым символом должна быть буква. Имя программы выбирается ав-тором и составляется по тому же правилу. Постоянные величины бывают числовыми или символьными. Значения символьных заклю-чаются в апострофы. Постоянные величины описываются в разделе констант по схеме: const<имя>=<константа>. Данные, обрабаты-ваемые программой, могут быть разных типов. Тип определяет об-ласть допустимых значений, а также операторы и функции, применимые к величине. В Паскале имеется несколько встроенных про-стых типов со стандартными именами.

Скалярный тип – значения которого можно перечислить в неко-тором списке. Для них определена порядковая функция ord(x) – но-мер значения х в списке (для целочисленного х ord(x)=x), pred(x) – значение в списке, предшествующее х, succ(x) – значение в списке, следующее за х.

Упорядоченный тип – значения которого упорядочены в обыч-ном смысле. К ним применимы операции отношения <,>,<=,>=,<>. Для логических выполняется неравенство false<true.

Переменные описываются в разделе описания переменных по схеме: var<список имен переменных>:<тип>. Имена в списке разде-ляются запятой.

Над целыми величинами (тип integer) определены операции: *, div (деление нацело), mod (деление с остатком), +, - (приведены в порядке старшинства).

Над вещественными величинами (тип real) определены: *, +, -, /, а также функции при вещественном или целом аргументе: abs(x), sqr(x), sin(x), cos(x), arctan(x), ln(x), exp(x), sqrt(x), int(x), random. Они дают вещественный результат.

Над логическими величинами (тип string) определены опера-ции: not - отрицание, and - конъюнкция, or - дизъюнкция. Логиче-ская функция odd(x) принимает значение true, если целочисленное х является нечетным, false - если четным.

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

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

Основные конструкции.

Следование - реализовывается с помощью составного оператора:

begin

<последовательность операторов>

end.

Развилка – реализовывается с помощью условного оператора и оператора варианта (выбора). Структура условного оператора:

if<логическое выражение>

then<оператор 1>

else<оператор 2>

Оператор варианта имеет форму:

case<выражение> of

<список констант 1>:<оператор 1>;

<список констант 2>:<оператор 2>;

………………

<список констант N>:< оператор N >

end.

Для реализации циклов имеются три оператора. Если число по-вторений известно заранее, то используют цикл с параметром: 1) for <параметр>:= <выражение 1> to <выражение 2> do <оператор>, 2) for <параметр>:= <выражение 1> downto <выражение 2> do <опера-тор>; в других случаях используют цикл с предусловием: while <ло-гическое выражение> do <оператор>, (действие: вычисляется зна-чение логического выражения, если оно истинно, то выполняется оператор, после чего снова вычисляется значение логического вы-ражения, в противном случае действие заканчивается); или цикл с постусловием:

repeat <последовательность операторов>

until <логическое выражение>, (действие: выполняется последо-вательность операторов, далее вычисляется значение логического выражения, если оно истинно, то действие заканчивается, в против-ном случае снова выполняется последовательность операторов).

Массивы. Составные типы величин образуются из других типов, при этом существенную роль играет метод образования или струк-тура составного типа. Часто используемый составной тип – массив. Массив – это последовательность, состоящая из фиксированного числа однотипных элементов. Все элементы массива имеют общее имя и различаются индексами. Индексы можно вычислять. При описании массивов используются слова: array и of. В описании мас-сива указывается тип его элементов и типы индексов: type <имя массива> = array [<список типов индексов>] of <тип элементов>. Число индексов называется размерностью массива. Обращение к элементу массива осуществляется с помощью задания имени пере-

менной, за которым следует заключенный в квадратные скобки спи-сок индексов элемента.

Пример. Рассмотрим задачу упорядочения членов числовой по-следовательности по какому-либо признаку (по возрастанию). Ис-пользуем метод, носящий название «пузырек». Для этого будем рассматривать пары элементов последовательно слева направо и переставлять элементы в паре, если они стоят неправильно. В нача-ле присвоим некоторой логической переменной значение p:=true, если при просмотре пар была хотя бы одна перестановка изменим значение логической переменной. Цикл заканчивается, если после очередного просмотра выполняется условие: p=true.

Программа:

Program bubble;

const a: array[1…10] of integer=(19,8,17,6,15,4,13,2,11,0);

var b, I: integer; p: Boolean;

begin clrscr;

for I:=1 to 10 do while (a[I]:3); writeln; writeln;

repeat p:=true;

for I:=10 downto 2 do

if a[I]<a[I-1] then

begin

b:=a[I]; a[I]:=a[I-1];a[I-1]:=b; p:=false

end

until p=true;

for I:=1 to 10 do write (a[I]:3);

writeln

end.

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

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

описание процедуры заканчивается точкой с запятой (а не точкой).

Все имена, описанные в программе до процедуры, действуют во всей программе и в любой ее подпрограмме. Они называются гло-бальными, в отличие от локальных имен, описанных в процедуре. Данные для обработки могут передаваться процедуре через гло-бальные имена или через аргументы процедуры. В процедуре каж-дый аргумент имеет свое имя – формальный параметр, описывае-мый в заголовке процедуры по схеме: procedure <имя> (<список описаний формальных параметров>). Описание параметров имеет вид <список имен>: <тип> или var <список имен>: <тип>. В первом случае говорят о параметрах-значениях, во втором =- о параметрах-переменных. В простейшем случае заголовок процедуры содержит только ее имя. Оператор вызова процедуры имеет вид: <имя проце-дуры> (<список выражений>). Указанные выражения называют фактическими параметрами. Их список должен точно соответст-вовать списку описаний формальных параметров процедуры. Во время вызова процедуры каждому параметру-значению присваива-ется значение соответствующего фактического параметра, и поэто-му их обычно используют для передачи входных данных. Перемен-ные-параметры следует использовать для представления результа-тов процедуры.

Функция – это подпрограмма, определяющая единственное ска-лярное, вещественное или строковое значение. Отличия функции от процедуры: заголовок функции начинается со служебного слова function и заканчивается указанием типа значения функции; раздел операторов функции должен содержать хотя бы один оператор присваивания имени функции; обращение к функции – не оператор, а выражение вида <имя функции> (<список фактических параметров>).

Функции и процедуры могут использовать свое имя в собствен-ном описании, т. е. Могут быть рекурсивными. Работа с файлами. Файл (последовательность) - это одна из наиболее фундаментальных структур данных. Программная орга-

низация компьютеров, их связь с внешними устройствами основа-ны на файловой структуре. Файлы позволяют решить две проблемы: 1) возможность формирования и сохранения значений для по-следующего использования другими программами (например, в программах многократной обработки информационных систем, таких как платежные ведомости, различные АСУ, базы данных, необходимость длительного хранения информации очевидна); 2) взаимодействие программ с внешними устройствами ввода-вывода: дисплеем, принтером, АСП и т.п. В Паскале эти проблемы снимаются с помощью структуриро-ванных данных файлового типа. Файловый тип данных в программе задается следующем образом: type <имя файлового типа> = file of <тип компонентов> В качестве типа компонентов файла разрешается использовать любой тип данных, кроме файлового. Например:

Описание файловой переменной задается обычным способом в разделе описаний. Например: Var f: intfile; или var f: file of integer; Файловая переменная является буфером между Паскаль-программой и внешним устройством и должна быть логически с ним связана. Связь осуществляется оператором языка Паскаль: assign (<имя файловой переменной>,'<имя устройства>')

Как правило, файлы для хранения данных связаны с устройством внешней памяти на магнитных носителях (дисковод) и носят название внешние файлы. Если например, файл с именем primer.dat логически связан с дисководом А:, то все данные, помещаемые в файл, будут храниться на этом дисковом накопителе, а установка «окна» между программой и файлом будет определяться через файловую переменную f оператором assign (f, 'primer.dat') Если внешним устройством является принтер, то связь осу-ществляется оператором assign(f, '1st:'). Здесь 1st - логическое имя печатающего устройства. Ниже приветны логические имена внешних устройств ввода-вывода: con - консоль; trm - терминал; kbd - клавиатура; 1st - прин-тер; aux- буфер сети; usr-драйвер пользователя. После осуществления связи файловая переменная f отождест-вляется с соответствующим файлом. Для работы с файлом его необходимо открыть, а по окончании работы - закрыть. Файл открывается для чтения оператором reset(f), для записи - опе-ратором rewrite(f). Чтение и запись данных осуществляется известными коман-дами read/write, только в начале списка помещается имя файло-вой переменной: read (f, <список ввода>); readln (f, <список ввода>); write(f, <список вывода>); writeln(f, <список вывода>). Закрытие файла осуществляется командой close(f). Условно файл можно представить в виде ленты, у которой есть начало, а конец нe фиксируется. Компоненты файла запи-сываются на эту ленту последовательно, дpyr за другом: F0 F1 F2 F3 … M.K. ^T.M. Здесь т.м. - текущий маркер, указывающий на рабочую пози-цию (окно) файла; м.к. (маркер конца файла) - специальный код, автоматически формируемый вслед за последним элементом файла.

Такого рода файлы называются файлами последовательного доступа. В исходной версии Паскаля файлов прямого доступа, для которых можно непосредственно «достать» любую компо-ненту, не предусмотрено; однако, в Турбо-Паскале элементы прямого доступа есть (например, через функцию seek). Команда rewrite(f) - открыть файл для записи - устанавливает файл в начальное состояние режима записи; текущий маркер ус-танавливается на маркер конца файла. Если в файле f до этого была информация, то она уничтожается. В открытом для чтения командой reset(f) файле текущий мар-кер устанавливается на нулевое состояние, однако содержимое файла не утрачивается..Команда закрытия файла close (f) обязательна, поскольку эта команда формирует маркер конца файла, что в большинстве случаев является необходимым (например, для работы с функ-цией eof(r)). В системе Турбо-Паскаль предусмотрены встроенные функ-ции по работе с файлами: filesize(f)- текущее количество компонент открытого файла; На практике широко используются текстовые файлы, которые со-стоят из литерных (логических) строк. Поэтому в языке Паскаль пре-дусмотрен стандарта файловый тип TEXT (он не является file of char, скорее всего, это - file of string[n]). Логические строки бывают разной длины, в том числе и нулевой. В конец каждой строки помещается специальный символ «конец строки» (coin - «end of line»). В каче-стве печатного символа конца строки используют литеру #. Тексто-вый файл (text) является строго последовательным, к нему не применимы некоторые встроенные функции, в частности, seek. В отличие от типизированных файлов, с текстов файлом нельзя одновременно про-водить операции чтения (read) и записи (write). Однако, допустимы операторы writeln и readln. Числовые данные, целые и вещественные, в текстовом файле должны записываться через пробел. Пример 1. Вывод данных на печатающее устройство - принтер (1st:). Программа program print; var fal: text; x: real; name:string[25]; begin assign (fal, '1st:'); rewrite (fal); x:=2.5; name:'Слава'; writeln(fal,x:8:2); writeln(fal,'Привет, ',name); close(fal) end. {Здесь файловая переменная fal связывается с принтером 1st:, и запись в файл fal практически означает вывод на пе-чать) Пример 2. Создание и сохранение в файле «xxx.dat» последователь-ности целых чисел от 10 до 20.

Программа program zapis; var f: file of integer; i: integer; begin assign(f,'xxx.dat'); rewrite(f); for i:=10 to 20 do write(f,i); close (f); end. {После выполнения программы формируется внешний файл xxx.dat} Пример 3. Считывание первых пяти компонент из существующего файла «xxx.dat» и вывод на дисплей квадратов этих значений. Программа. program read; var ff: file of integer; j,i: integer; begin

assign(ff,'xxx.dat'); reset(ff); for j:=l to 5 do begin read(ff,i); writeln(i*i); end; close(ff); end. Пример 4. Шифрование и дешифрование текста. Программа шифрования заданного текста (sekret) использует следующее правило шифровки: каждая буква в тексте заменяется на букву, расположенную на позиций вправо от искомой в рус-ском алфавите. Причем последним символом алфавита является пробел '', а далее алфавит продолжается циклически. Значение смещения n находится во внешнем файле 'n.key', кото-рый формируется программой key. Зашифрованный текст выво-дится во внешний файл с именем «шифр.tхt», а также на дисплей. Программа дешифровки (retsek) считывает шифрованный текст из файла «шифр.txt» и выводит на экран дисплея искомый текст. Программа program key; var n: integer; f: file of integer; begin assign (f, 'n.key'); rewrite(f); write('введи ключ(смещение): '); readln(n); write(f,n); close(f); end. Работа с графикой. Машинная (компьютерная) графика - одно из важных направлений в современной прикладной информатике. В от-личие от базового Паскаля, современные версии содержат мощные средства разработки графических программ. Рассмотрим часть со-ответствующих возможностей Турбо-Паскаля, в котором они реа-лизованы с помощью стандартного модуля Graph. Модуль представляет собой мощную библиотеку графических подпрограмм универсального назначения, рассчитанную на работу с наиболее распространенными графическими адаптерами CGA, EGA, VGA, SVGA IBM-совместимых персональных компьютеров.

Подключение модуля Graph.tpu к программе выполняется дирек-тивой uses graph; Инициализация графического экрана осуще-ствляется с помощью процедуры Initgraph. Драйвер поддерживает тот или иной режим экрана, табл. 1. Таблица 1 Некоторые сведения о драйверах и определяемых ими режимах Адаптер Драйвер Режим (Номер, имя) Разрешимость Число страниц EGA.EGA OEgalo 640x200 4 1 Egahi 640x350 2 VGA VGA 0 Vgalo 640x200 4 1 Vgalo 640x350 2 2 Vgalo 640x480 1 Процедура инициализации в Турбо-Паскале имеет три аргумен-та: nitgraph (<драйвер>, <режим>, '<путь к драйверу:>’). Она мо-жет быть выполнена так: uses graph; var gd, gm: integer; (переменные gd и gm определяют драй-вер и режим) begin gd:=vga; gm:=vgahi; initgraph(gd,gm,'d:\tp55'); … Первые две команды можно заменить одной: gd:=detect Целая константа detect=0 в модуле Graph автоматически распо-знает драйвер и устанавливает режим максимального разрешения для данной машины. Процедура closegraph освобождает память от драйвера и уста-навливает режим работы экрана, который был до инициализации графики. Для обнаружения ошибок в графике применяются функции graphresult grapherrormsg (код ошибки). Последняя выдает строку сообщения о характере ошибки, соответствующей коду. Инициализация графического режима с проверкой ошибок может быть выполнена в программе следующим образом:

uses graph; var gd, gm, errorcod: integer; begin gd:=detect; initgraph(gd,gm,"); efrorcod:=graphresult; if errorcodogrok then begin \уп1е1п('ошибка графики'); writeln(grapherrormsg(errorcod)); halt end; Процедура Halt останавливает выполнение программы и воз-вращает управлеш операционной системе. Для формирования палитры используется система смешения красного, зеленого и синего цветов и изменения яркости луча. Цвет задается номером из списка цветов палитры в интервале 0.. 15. Процедуры setcolor(<цвет>) и setbkcolor (<цвет>) устанавливают текущий цвет рисунка и цвет фона. При инициализации графики по умолчанию устанавливается черный фон и белый цвет рисунка. В табл. 2 указаны основные процедуры для модуля Graph, приме-няющиеся для построения простейших геометрических примити-вов. Координаты точек воспринимаются в «экранной» системе ко-ординат, в которой начало - верхний левый угол экрана, ось «х» направлена вниз, ось «у» -направо. Максимальные значения ко-ординат определяются разрешимость» экрана (см. табл. 1). Первый аргумент процедуры setlinestyle(a,b,t) а - стиль линии вто-рой параметр b -«образец» - имеет значение 4, если а=4, в остальных случаях b=0; третий параметр t -толщина линии - может иметь зна-чение 1 (нормальная толщина) или 3 (жирная линия). Таблица 2 Основные процедуры модуля Graph Заголовок процедуры Геометрический смысл putpixel(x,y,c) Построить точку (х,у) цветом с seffihestyle(a,b,t) Установить стиль, образец и толщину линий Iine(xl,yl,x2,y2) Соединить две точки отрезком rectangle(x1,у1,х2,у2) Построить прямоугольник с заданными концами диа-гонали и сторонами, параллельными осям коорди-нат cirde(x,y,r) Построить окружность с центром (х,у) и радиусом r агс(х,у,а,Ь,г) Построить дугу окружности: а,b - начальный и ко-нечный угол в градусах ellipse(х,y,a,b,rx,ry) Построить эллиптическую дугу: rх, rу - полуоси эллипса

setfillstyle(t,c) Установить стиль закраски и ее цвет fillellipse(x,y,rx,ry) Построить закрашенный эллипс, используя цвет рисунка floodfill(x,y,cg) Закрасить фигуру до границы с цветом cg; (x,y) – внутренняя точка фигуры bаr(х1,у1,х2,у2) Построить столбец, используя тип и цвет закраски pieslice(x,y,a,b,r) Построить и закрасить сектор круга sector(x,y,a,b,rx,ry) Построить и закрасить эллиптический сектор settextstyle(f,n,d) Установить шрифт, направление вывода и размер символа текст outtextxy(x,y,st) Вывести строку st, начиная с точки (х,у) outtext(st) Вывести строку, начиная с точки расположения те-кущего указателя Первый аргумент процедуры setfillstyle(t,c) - тип закраски t - принимает значения из интервала 0..12. Наиболее употребителен тип t = 1 - заполнение фигуры текущим цветом. Для вывода текста на графический экран сначала выполняется процедура settextstyle(f,n,d), устанавливающая шрифт f, направ-ление вывода п и размер символов (параметр d). При f = 0 исполь-зуется стандартный точечный шрифт, встроенный в систему Турбо-Паскаль. С использованием других шрифтов познакомимся ниже. Направление вывода п принимает значения 0 (горизонтальный вы-вод) и 1 (вертикальный вывод). Размер букв определяется параметром d, принимающим значе-ния из интервала 1..10. Если d=1 и f=0, то каждый символ занимает квадрат 8*8 точек, при d > 1 сторона квадрата умножается на d. Далее, с помощью процедуры outtextxy(x,y,st) строка st выво-дится на экран, начиная с точки (х,у). Например: settextstyle(0,0,2); outtextxy (100,200,'горизонтальная строка'); outtextxy(100,230,'paзмep увеличен вдвое’);

Примеры графических программ Пример 1: программа рисует звездное небо с 400 «звездами», вспыхивающими постепенно, и полную желтую луну. Программа program sky; uses crt,graph;

var k,gd,gm: integer; begin gd:=detect; initgraph (gd, gm, ' '); randomize; for k:=l to 400 do begin putpixel (random(640), random(480), random(15)+1); delay(10); end; setfillstyle (l,14); setcolor(14); circle(550,80,30); flopdfill (550, 80,14); repeat until keypressed; closegraph end. Пример 2. Узор. Используя простейшие геометрические образы, строят замечательные графические изображения. Ниже приведена программа изображения муарового узора, полученного пересечени-ем двух семейств расходящихся отрезка прямых. Качество и изо-бражение получаемого узора зависит в основном от трёх парамет-ров: kl, k2 - расстояний между отрезками слева и справа; h – смеще-ния вниз (вверх) всего семейства.

Программа program uzor; uses crt, graph; var gd, gm, errCode, i, kl/k2,h: integer; begin kl:=8; k2:=3; h:=110; gd:=Detect; InitGraph(gd,gm, ' '); errCode:=GraphResult; if errCode = grOk then begin setcolor (green); for i:=l to (420 div kl) do begin line (0, i*kl, 640, i*k2+h); line (0, i*k2+h, 640, i*kl); end;. repeat until keypressed; CloseGraph; end

else writeln('errCode=', errCode); end. Процедуры построения прямоугольных фигур удобно использо-вать, в частности, при построении схем, диаграмм. Пример ____________3: программа строит столбчатую диаграмму, наглядно отражающую числовую информацию о населении 6 крупных горо-дов мира: Токио, Гамбурге Москвы, Бангкока, Мехико и Парижа. Программа program colon; uses crt, graph; const m: array[1..6] of real=(11500,2300,9700,5100,12400,8200); name: array[1..6] of string= ('Токио', 'Гамбург', 'Москва', 'Бангкок', 'Мехико', 'Париж'); var gd,gm,k,n,s: integer; st: string[6]; begin gdi:=detect; initgraph(gd,gm,' '); setcolor(15); setlinestyle(0,0,1); line(60,400,620,400); line(60,400,60,100); settextstyle(0,0,1); for k:=l to 12 do begin n:=1000*k; str(n,st); outtextxy(10,400-20*k-4,st); line(60,400-k*20,65,400-k*20); end; setcolor(14); settextstyle(0,0,2); outtextxy(120,20, 'Население городов (тысяч)'); settextstyle(0, 0,1); for k:=l to 6 do begin setfillstyle(1,k+2); bar(100+(k-l)*70,400,100+k*70,round(400-m[k]/1000*20)); outtextxy(100+(k-1)*70+4,450,name[k]); end; repeat until keypiressed; closegraph end. Процедура bar3d(xl)yl,x2,y2,d,top) рисует трехмерный столбец, глубина которого определяется параметром d. Последний параметр процедуры top - логического типа. Если top=true, рисуется верхнее основание столбика, в противном случае оно не изображается, что позволяет рисовать столбики один над другим. Диаграммы с трех-мерными столбиками красивы, но их труднее создавать. Построение графиков функций. Построение графиков функций - неотъемлемая часть большинства программ, предназначенных для обучения математике, физике. Ниже представлен пример програм-мы построения графика функции y=x*x*sin{l/x) на произвольном отрезке [а, Ь]. Количество точек графика (параметр n) также зада-ется произвольно (точка х=0 исключается, так как в ней функция не определена). В программе также определяются величины tl=(xl-x0)/(b-a) и t2=(yl-y0)/(2m), которые означают масштабы по осям X и Y соответственно. График рассматриваемой функции представлен на двух отрезках [а,b] и [-0.1,0.1]. Чтобы построить график другой функции, достаточно задать ее аналитический вид в описании функции (function f). Программа prograjn grafik; uses crt, graph; var gd, gin, errCode: integer; a,b: real; n: integer; function f(x:real):real; begin if x<>0 then f:=x*x*sin(1/x); end; procedure grafun(xO,xl,yO,yl,n: word; a,b: real); var h,m,x, tl,t2: real; i, u,v,xv,yv: word; begin h:=(b-a)/n; {поиск максимума f(x)} m:=abs (f(a)); for i:=l to,n do if m<abs(f(a+i*h)) then m:=abs(f(a+i*h)); tl:=(xl-xO)/(b-a); t2:-=(yl-yO)/(2*m); {построение координатных осей) setfillstyle(l,15); bar(xO-5,yO-5,xl+5,yl+5); xv:=round(xO-a*tl); yv:=round((yO+yl)/2); setcolor(l); line(xv,yO,xv,yl); line(xO,yv,xl,yv);

Moveto(xO,yv-round(f (a) *t2.)); {установка курсора в начало графика) setcolor(3); {построение графика} for i:=l to n do begin x:=a+i*h; u:=xO+round((x-a)*tl); v:=yv-round(f(x)*t2); lineto(u,v); end; end; (конец процедуры) begin, clrscr; write ('введи a,b и n: '); readln(a,b,n); gd:=Detect; InitGraph(gd,gm,''); errCode:=GraphResult; if errCode = grOk then begin grafun(100,500,50,300,n,a,b); grafun(550,620,10,100,200,-0.1,0.1); repeat until keypressed; CloseGraph; tnd; else writeln('errCode=',errCode); end. Для изображения поверхностей, определяемых функцией двух переменных z=f(x,y), можно использовать разные способы. Одним из них является метод построения семейства одномерных графиков функции z=f(x,y) от одной переменной или при различных фиксированных значениях другой. Это может быть хорошей тренировкой для самостоятельной работы по освоению графики. Построение движущихся изображений. Особую ценность в графике представляет организация движения фрагментов рисунка. Наиболее просто это сделать по следующему плану: • нарисовать фрагмент в нужном месте экрана; • стереть фрагмент, рисуя его цветом фона или используя процедуру cleardevice; • снова нарисовать фрагмент в другом месте экрана. Такой способ осуществлен в программе billiard, где два шарика радиусом 5 пикселей разных цветов двигаются с одинаковой ско-ростью внутри зеленого, прямоугольника, построенного с помо-щью процедуры bar. Процедура blou измеряет смещение центра шарика от сторон прямоугольника по каждой оси и, если это смещение на следую-щем шаге цикла станет меньше радиуса, изменяет направление движения, моделируя поведение упругого шара при ударе о стенку.. В программе также рассмотрена ситуация соприкосновения ша-риков во время их движения. Она решается примитивно просто: каждый шарик меняет направление своего движения на противо-положное. Программа program billiard; uses crt,graph; var x,y,dx,dy,gd,gm:integer; xl,yl,dxl,dyl:integer; procedure blow(a,b:integer; var c,d:integer); begin if (a<107) or (a>523) then c:=-c; if (b<107) or (b>363) then.d:=-d; end; begin gd:=detect; initgraph(gd,gm,''); setcolor(14); setlinestyle(0,0,1); rectangle(99,99,531,371); setfillstyle(l,3); bar(100,100,530,370); x:=320; y:=240; dx:=2; dy:=2; xl:=320; yl:=200; dxl:=-2; dyl:=-2; repeat circle(x,y,5); setcolor(4); circle(xl,yl,5); blow(x,y,dx,dy); blow(xl,yl,dxl,dyl);

delay(10); if (abs(x-xl)<=10) and (abs(y-yl)<=10) then begin dx:=-dx; dy:=-dy; dxl:=-dxl; dyl:=>-dyl; delay(300); end; setcolor(3); circle(x,y,5); x:~x+dx; y:=y+dy; setcolor(3); circle(xl,yl,5); xl:=xl+dxl; yl:=yl+dyl; setcolor(14); until keypressed; closegraph; end. Еще один способ организации движения на экране, широко применяющийся в компьютерных играх, связан с использова-нием нескольких экранных страниц. В режиме Vgamed их две, а в режиме Vgalo - четыре. Страницы имеют номера: 0,1,... В лю-бой момент времени одну из страниц можно сделать видимой и посмотреть ее содержимое на экране с помощью процедуры setvisualpage(номep). Визуальная страница обычно пассивна, т.е. на ней нельзя выполнять графические процедуры. Другую страницу можно объявить активной с помощью процедуры setactivepage(номep). Активная страница невидима для пользова-теля. На ней можно подготовить другой рисунок. В следующий момент можно поменять роли страниц, т.е. визуальную сделать активной и невидимой и на ней рисовать следующий кадр, а бывшую активную сделать визуальной и показать объект в но-вом месте экрана. В программе helicopter с помощью страниц моделируется вращение винтов вертолета. Две процедуры vertl и vert2 подго-тавливают рисунки вертолета с разным положением винтов. Изображения выводятся на разные страницы, которые потом по очереди становятся то видимыми, то активными. В программе организовано также движение вертолета по эллиптической орбите. Центр орбиты - точка (х0,у0) - располагается в центре экрана, числа а=250 и b=130 -горизонтальная и верти-кальная полуоси эллипса. Положение вертолета на орбите вы-числяется по формулам: u=x0+round(a*cosp), t=y0+round(b*sinp), где p – текущий угол, образованный радиус вектором точки эллипса с осью абсцисс.

delay(50); p:=p+step; c:=ac; ac:=vi; vi:=c;

end; closegraph

end.

<== предыдущая лекция | следующая лекция ==>
Языки программирования высокого уровня. Виды программирования Языки программирования - это формальные языки специально соз-данные для общения человека с компьютером | Язык программирования Visual Basic Основные понятия
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 355; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.047 сек.