Содержание:
Введение
1. Основные принципы объектно ориентированного программирования
2. Создание объектов
3. Использование объектов
Постановка учебной задачи
4. Пример работы программы
Заключение
Список используемой литературы
Текст программы
Введение
В основе того или иного языка программирования лежит некоторая руководящая идея, оказывающая существенное влияние на стиль соответствующих программ.
Исторически первой была идея структурирования программ, в соответствии с которой программист должен был решить, какие именно процедуры он будет использовать в своей программе, а затем выбрать наилучшие алгоритмы для реализации этих процедур. Появление этой идеи было следствием недостаточной изученности алгоритмической стороны вычислительных процессов, столь характерной для ранних программных разработок (сороковые — пятидесятые годы. По мере прогресса в области вычислительной математики акцент в программировании стал смещаться с процедур в сторону организации данных. Оказалось, что эффективная разработка сложных программ нуждается в действенных способах контроля правильности использования данных. Контроль должен осуществляться как на стадии компиляции, так и при прогоне программ, в противном случае, как показала практика, резко возрастают трудности создания крупных программных проектов.
Отчётливое осознание этой проблемы привело к созданию Ангола-60, а позже Паскаля, Модулы-2, Си и множества других языков программирования, имеющих более или менее развитые структуры типов данных. Логическим следствием развития этого направления стал модульный подход к разработке программ, характеризующийся стремлением «спрятать» данные и процедуры внутри модуля.
Начиная с языка Симула-67, в программировании наметился новый подход, который получил название объектно-ориентированного программирования (в дальнейшем ООП). Его руководящая идея заключается в стремлении связать данные с обрабатывающими эти данные процедурами в единое целое – объект. Характерной чертой объектов является инкапсуляция (объединение) данных и алгоритмов их обработки, в результате чего и данные, и процедуры во многом теряют самостоятельное значение. Фактически ООП можно рассматривать как модульное программирование нового уровня, когда вместо во многом случайного, механического объединения процедур и данных акцент делается на их смысловую связь.
Какими мощными средствами располагает ООП наглядно демонстрирует библиотека Turbo Vision, входящая в комплект поставки Турбо Паскаля. В этой работе рассмотрены основные идеи ООП и способы их использования.
Следует заметить, что преимущества ООП в полной мере проявляются лишь при разработке достаточно сложных программ. Более того, инкапсуляция придаёт объектам совершенно новое свойство «самостоятельности», максимальной независимости от остальных частей программы. Правильно сконструированный объект располагает всеми необходимыми данными и процедурами их обработки, чтобы успешно реализовать требуемые от него действия. Попытки использовать ООП для программирования несложных алгоритмов, связанных, например, с расчетными вычислениями по готовым формулам, чаще всего выглядят искусственными нагромождениями ненужных языковых конструкций. Такие программы обычно не нуждаются в структуризации, расчленении алгоритма на ряд относительно независимых частей, их проще и естественнее разрабатывать традиционными способами Паскаля. При разработке сложных диалоговых программ программист вынужден структурировать программу, так как только в этом случае он может рассчитывать на успех: «критической массой» неструктурированных программ является объём в 1000-1200 строк исходного текста – отладка неструктурированных программ большего объёма обычно сталкивается с чрезмерными трудностями. Структурирование программы ведёт, фактически, к разработке собственной библиотеки программирования – вот в этот момент на помощь приходят новые средства ООП.
Моя курсовая работа повещена созданию объектов на языке программирования Паскаль.
1. Основные принципы объектно-ориентированного программирования
Объектно-ориентированное программирование основано на «трёх китах» – трёх важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследование и полиморфизм.
Инкапсуляция есть объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются полями объекта, а алгоритмы – объектными методами.
Инкапсуляция позволяет в максимальной степени изолировать объект от внешнего окружения. Она существенно повышает надёжность разрабатываемых программ, т.к. локализованные в объекте алгоритмы обмениваются с программой сравнительно небольшими объёмами данных, причём количество и тип этих данных обычно тщательно контролируется. В результате замена или модификация алгоритмов и данных, инкапсулированных в объект, как правило, не влечёт за собой плохо прослеживаемых последствий для программы в целом (в целях повышения защищённости программ в ООП почти не используются глобальные переменные).
Другим немаловажным следствием инкапсуляции является лёгкость обмена объектами, переноса их из одной программы в другую. Можно сказать, что ООП «провоцирует» разработку библиотек объектов, таких как Turbo Vision.
Наследование есть свойство объектов порождать своих потомков. Объект-потомок автоматически наследует от родителя все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.
Принцип наследования решает проблему модификации свойств объекта и придаёт ООП в целом исключительную гибкость. При работе с объектами программист обычно подбирает объект, наиболее близкий по своим свойствам для решения конкретной задачи, и создаёт одного или нескольких потомков от него, которые «умеют» делать то, что не реализовано в родителе.
Последовательное проведение в жизнь принципа «наследуй и изменяй» хорошо согласуется с поэтапным подходом к разработке крупных программных проектов и во многом стимулирует такой подход.
Полиморфизм – это свойство родственных объектов (т.е. объектов, имеющих одного общего родителя) решать схожие по смыслу проблемы разными способами. В рамках ООП поведенческие свойства объекта определяются набором входящих в него методов. Изменяя алгоритм того или иного метода в потомках объекта, программист может придавать этим потомкам отсутствующие у родителя специфические свойства. Для изменения метода необходимо перекрыть его в потомке, т.е. объявить в потомке одноимённый метод и реализовать в нём нужные действия. В результате в объекте-родителе и объекте-потомке будут действовать два одноимённых метода, имеющие разную алгоритмическую основу и, следовательно, придающие объектам разные свойства. Это и называется полиморфизмом объектов.
В Турбо Паскале полиморфизм достигается не только описанным выше механизмом наследования и перекрытия методов родителя, но и их виртуализацией, позволяющей родительским методам обращаться к методам потомков.
2. Создание объектов
В Турбо Паскале для создания объектов используется три зарезервированных слова: object, constructor, destructor и три стандартные директивы: private, public и virtual.
Зарезервированное слово object используется для описания объекта. Описание объекта должно помещаться в разделе описания типов:
type
MyObject = object
{поля объекта}
{методы объекта}
end;
Если объект порождается от какого-либо родителя, имя родителя указывается в круглых скобках сразу за словом object:
type
MyDescendantObject = object (MyObject)
end;
Любой объект может иметь сколько угодно потомков, но только одного родителя, что позволяет создавать иерархические деревья наследования объектов.
Для примерка создадим объект-родитель TGraphObject, в рамках которого инкапсулированы поля и методы, общие для всех остальных объектов:
type
TGraphObj = object
Private {поля объекта будут скрыты от пользователя}
X,Y: Integer;
Color: Word; {цвет фигуры}
Public
Constructor Init (aX, aY: Integer; aColor: Word);
{создаёт экзепляр объекта}
Procedure Draw (aColor: Word); Virtual;
{вычерчивает объект заданным цветом aColor}
Procedure Show;
{показывает объект – вычерчивает его цветом Color}
Procedure Hide;
{прячет объект – вычерчивает его цветом фона}
Procedure MoveTo (dX, dY: Integer);
{перемещает объект в точку с координатами X+dX и Y+dY}
end; {конец описания объекта TGraphObj}
В дальнейшем предполагается создать объекты-потомки от TGraphObject, реализующие все специфические свойства точки, линии, окружности и прямоугольника. Каждый из этих графических объектов будет характеризоваться положением на экране (поля X и Y) и цветом (поле Color). С помощью метода Draw он будет способен отображать себя на экране, а с помощью свойств “показать себя” (метод Show) и “спрятать себя” (метод Hide) сможет перемещаться по экрану (метод MoveTo). Учитывая общность свойств графических объектов, мы объявляем абстрактный объект TGraphObj, который не связан с конкретной графической фигурой. Он объединяет в себе все общие поля и методы реальных фигур и будет служить родителем для других объектов.
Директива Private в описании объекта открывает секцию описания скрытых полей и методов. Перечисленные в этой секции элементы объекта “не видны” программисту, если этот объект он получил в рамках библиотечного TPU-модуля. Скрываются обычно те поля и методы, к которым программист (в его же интересах!) не должен иметь непосредственного доступа. В данном примере он не может произвольно менять координаты реперной точки (X,Y), т.к. это не приведёт к перемещению объекта. Для изменения полей X и Y предусмотрены входящие в состав объекта методы Init и MoveTo. Скрытые поля и методы доступны в рамках той программной единицы (программы или модуля), где описан соответствующий объект. В дальнейшем предполагается, что программа будет использовать модуль GraphObj с описанием объектов. Скрытые поля будут доступны в модуле GraphObj, но недоступны в использующей его основной программе. Разумеется, в рамках реальной задачи создание скрытых элементов объекта вовсе необязательно. В объект TGraphObj они введены лишь для иллюстрации возможностей ООП.
Директива public отменяет действие директивы private, по этому все следующие за public элементы объекта доступны в любой программной единице. Директивы private и public могут произвольным образом чередоваться в пределах одного объекта.
Варианты объявления объекта TGraphObj без использования механизма private .public:
type
TGraphObj = object
X,Y: Integer;
Color: Word;
Constructor Init (aX,aY: Integer; aColor: Word);
Procedure Draw (aColor: Word); Virtual;
Procedure Show;
Procedure Hide;
Procedure MoveTo (dX,dY: Integer);
end;
Описания полей ничем не отличаются от описания обычных переменных. Полями могут быть любые структуры данных, в том числе и другие объекты. Используемые в данном примере поля X и Y содержат координату реперной (характерной) точки неграфического объекта, а поле Color — его цвет. Реперная точка характеризует текущее положение графической фигуры на экране и, в принципе, может быть любой её точкой (в данном примере она совпадает с координатами точки в описываемом ниже объекте TPoint, с центром окружности в объекте TСircle, первым концом прямой в объекте TLine и с левым верхним углом прямоугольника в объекте TRect).
Для описания методов в ООП используются традиционные для Паскаля процедуры и функции, а так же особый вид процедур — конструкторы и деструкторы. Конструкторы предназначены для создания конкретного экземпляра объекта, ведь объект — это тип данных, т.е. “шаблон”, по которому можно создать сколько угодно рабочих экземпляров данных объектного типа (типа TGraphObj, например).
Зарезервированное слово constructor, используемое в заголовке конструктора вместо procedure, предписывает компилятору создать особый код пролога, с помощью которого настраивается так называемая таблица виртуальных методов (см. ниже). Если в объекте нет виртуальных методов, в нём может не быть ни одного конструктора, наоборот, если хотя бы один метод описан как виртуальный (с последующим словом Virtual, см метод Draw), в состав объекта должен входить хотя бы один конструктор и бращение к конструктору должно прежшествовать обращению к любому виртуальному методу.
Типичное действие, реализуемое конструктором, состоит в наполнении объектных полей конкретными значениями. Следует заметить, что разные экземпляры одного и того же объекта отличаются друг от друга только содержимым объектных полей, в то время как каждый из них использует одни и те же объектные методы. В данном примере конструктор Init объекта TGraphObj получает все необходимые для полного определения экземпляра данные через параметры обращения aX, aY, aColor.
Процедура Draw предназначена для вычерчивания графического объекта. Эта процедура будет реализовываться в потомках объекта TGraphObj по-разному. Например, для визуализации точки следует вызвать процедуру PutPixel, для вычерчивания линии — процедуру Line и т.д. В объекте TGraphObj процедура Draw определена как виртуальная (“воображаемая”). Абстрактный объект TGraphObj не предназначен для вывода на экран, однако наличие процедуры Draw в этом объекте говорит о том, что любой потомок TGraphObj должен иметь собственный метод Draw, с помощью которого он может показать себя на экране.
При трансляции объекта, содержащего виртуальные методы, создаётся так называемая таблица виртуальных методов (ТВМ), количество элементов которой равно количеству виртуальных методов объекта. В этой таблице будут храниться адреса точек входа в каждый виртуальный метод. В данном примере ТВМ объекта TGraphObj хранит единственный элемент — адрес метода Draw. Первоначально элементы ТВМ не содержат конкретных адресов. Если бы мы создали экземпляр объекта TGraphObj с помощью вызова его конструктора Init, код пролога конструктора поместил бы в ТВМ нужный адрес родительского метода Draw. Далее я создам несколько потомков объекта TGraphObj. Каждый из них будет иметь собственный конструктор, с помощью которого ТВМ каждого потомка настраивается так, чтобы её единственный элемент содержал адрес нужного метода Draw. Такая процедура называется поздним связыванием объекта. Позднее связывание позволяет методям родителя обращаться к виртуальным методам своих потомков и использовать их для реализации специфичных для потомков действий.
Наличие в объекте TGraphObj виртуального метода Draw позволяет легко реализовать три других метода объекта: чтобы показать объект на экране в методе Show, вызывается Draw с цветом aColor, равным значению поля Color, а чтобы спрятать графический объект, в методе Hide вызывается Draw со значением цвета GetBkColor, т.е. с текущим цветом фона.
Рассмотрим реализацию перемещения объекта. Если потомок TGraphObj (например, TLine) хочет переместить себя на экране, он обращается к родительскому методу MoveTo. В этом методе сначала с помощью Hide объект стирается с экрана, а затем с помощью Show показываетя в другом месте. Для реализации своих действий и Hide, и Show обращаются к виртуальному методу Draw. Поскольку вызов MoveTo происходит в рамках объекта TLine, используется ТВМ этого объекта и вызывается его метод Draw, вычерчивающий прямую. Если бы перемещалась окружность, ТВМ содержала бы адрес метода Draw объекта TСircle и визуализация-стирание объекта осуществлялась бы с помощью этого метода.
Чтобы описать все свойства объекта, необходимо раскрыть содержимое объектных методов, т.е. описать соответствующие процедуры и функуии. Описание методов производится обычным для Паскаля способом в любом месте раздела описаний, но после описания объекта. Например:
type
TGraphObj = object
end;
Сonstructor TGraphObj.Init;
begin
X:= aX;
Y:= aY;
Color:= aColor
еnd;
Рrocedure TGraphObj.Draw;
begin
{Эта процедура в родительском объекте ничего не делает, поэтому экземплялры TGraphObj не способны отображать себя на экране. Чтобы потомки объекта TGraphObj были способны отображать себя, они должны перекрывать этот метод}
end;
Procedure TGraphObj.Show;
begin
Draw (Color)
end;
Procedure TGraphObj.Hide;
begin
Draw (GetBkColor)
end;
Procedure TGraphObj.MoveTo;
begin
Hide;
X:= X+dX;
Y:= Y+dY;
end;
Отмечу два обстоятельства. Во-первых, при описании методов имя метода дополняется спереди именем объекта, т.е. используется составное имя метода. Это необходимо по той простой причине, что в иерархии родственных объектов любой из методов может быть перекрыт в потомках. Составные имена чётко указывают принадлежность конкретной процедуры. Во-вторых, в любом объектном методе можно использовать инкапсулированные поля объекта почти так, как ели бы они были определены в качестве глобальных переменных. Например, в конструкторе TGraph.Init переменные в левых частях операторов присваивания представляют собой объектные поля и не должны заново описываться в процедуре. Более тонко, описание Constructor TGraph.Init:
var
X,Y: Integer; {ошибка!}
Color: Word; {ошибка!}
begin
.end;
вызовет сообщение о двойном определении переменных X, Y, Color (в этом и состоит отличие в использовании полей от глобальных переменных: глобальные переменные можно переопределять в процедурах, в то время как объектные поля переопределять нельзя).
Стоит обратить внимание на то, что абстрактный объект TGraphObj не предназначен для выводя на экран, поэтому его метод Draw ничего не делает. Однако методы Hide, Show, MoveTo “знают” формат вызова этого метода и реализуют необходимые действия, обращаясь к реальным методам Draw своих будущих потомков через соответствующие ТВМ. Это и есть полтморфизм объектов.
Создадим простейшего потомка от Tgraphobj — объект TРoint, с помощью которого будет визуализироваться и перемещаться точка. Все основные действия, необходимые для этого, уже есть в объекте TGraphObj, поэтому в объекте TPoint перекрывается единственный метод — Draw:
type
TPoint = object (TGraphObj)
Procedure Draw (aColor); Virtual;
end;
Procedure TPoint.Draw;
begin
PutPixel (X,Y,Color) {показываем цветом Color пиксель с координатами X и Y}
end;
В новом объекте TРoint можно использовать любые методы объекта-родителя TGraphObj. Например, вызвать метод MoveTo, чтобы переместить изображение точки на новое место. В этом случае родительский метод TGraphObj.MoveTo будет обращаться к методу TPoint.Draw, чтобы спрятать и затем показать изображение
точки. Такой вызов станет доступен после обращения к конструктору Init объекта TРoint, который нужным образом настроит ТВМ объекта. Если вызвать TPoint.Draw до вызова Init, его ТВМ не будет содержать правильного адреса и программа “зависнет”.
Чтобы создат объект-линию, необходимо ввести два новых поля для хранения координат другого конца.
Дополнительные поля требуется наполнить конкретными значениями, поэтому нужно перекрыть конструктор родительского объекта:
type
TLine = object (TGraphObj)
dX, dY: Integer; {Приращение координат второго конца}
Constructor Init (X1, Y1, X2, Y2: Integer; aColor: Word); Virtual;
end;
Constructor TLine.Init;
{Вызывает унаследованный конструктор TGraphObj для инициации полей X, Y, Color. Затем инициирует поля dX, dY}
begin
{Вызываем унаследованный конструктор}
Inherited Init (X1, Y1, aColor);
{Инициируем поля dX, dY}
dX:= X2-X1;
dY:= Y2-Y1
end;
Procedure Draw;
begin
SetColor (Color); {Устанавливаем цвет Color}
Line (X, Y, X+dX, Y+dY) {Вычерчиваем линию}
end;
В конструкторе TLine.Init для инициации полей X, Y, Color, унаследованных от родмтельского объекта, вызывается унаследованный конструктор TGraph.Init, для чего используется зарезервированное слово inherited (англ. — унаследованный):
Inherited Init (X1, Y1, aColor);
C таким же успехом мы могли бы использовать и составное имя метода:
TGraphObj.Init (X1, Y1, aColor);
Для инициации полей dX и dY вычисляется расстояние в пикселах по горизонтали и вертикали от первого конца прямой до её второго конца. Это позволяет в методе TLine.Draw вычислить координаты второго конца по координатам первого и смещениям dX, dY. В результате простое изменение координат реперной точки X,Y в родительском методе TGraph.MoveTo перемещает всю фигуру по экрану.
Теперь нетрудно реализовать объект TСircle для создания и перемещения окружности:
type
TCircle = object (TGraphObj)
R: Integer;
Constructor Init (aX, aY, aR: Integer; aColor: Word);
Procedure Draw (aColor: Virtual);
еnd;
Constructor TCircle.Init;
begin
Inherited Init (aX, aY, aColor);
R:= aR
end;
Procedure TCircle.Draw;
begin
SetColor (aColor); {устанавливает цвет Color}
Circle (X, Y, R) {вычерчивает окружность}
end;
В объекте Trect, с помощью которого создаётся и перемещается прямоугольник, учтём то обстоятельство, что для задания прямоугольника требуется указать четыре целочисленных параметря, т.е. столько же, сколько для задания линии. Поэтому объект TRect удобнее породить не от TGraphObj, а от TLine, чтобы использовать его конструктор Init:
tуpe
TRect = object (TLine)
Procedure Draw (aColor: Word);
end;
Procedure TRect.Draw;
begin
SetColor (aColor);
Rectangle (X, Y, X+dX, Y+dY) {вычерчиваем прямоугольник}
end;
Чтобы описания графических объектов не мешали созданию основной программы, оформим эти описания в отдельном модуле GraphObj:
Unit GraphObj;
Interface
{интерфейсная часть модуля содержит только объявления объектов}
type
TGraphObj = object
end;
TPoint = object (TGraphObj)
end;
TLine = object (TGraphObj)
end;
TCircle = object (TGraphObj)
end;
TRect = object (Tline)
end;
Implementation
{исполняемая часть содержит описания всех объектных методов}
Uses Graph;
Constructor TGraphObj.Init;
end.
В интерфейсной части модуля приводятся лишь объявления объектов, подобно тому как описываются другие типы данных, объявляемые в модуле доступными для внешних программных едениц. Расшифровка объектных методов помещается в исполняемую часть implementation, как если бы это были описания обычных интерфейсных процедур и функций. При описании методов можно опускать повторное описание в заголовке параметров вызова. Если они всё же повторяются, они должны в точности соответствовать ранее объявляемым параметрам в описании объекта. Например, заголовок конструктора TGraphObj.Init может быть таким:
Сonstructor TGraphObj.Init;
или таким:
Сonstructor TGraphObj.Init (aX, aY: Integer; aColor: Word);
3. Использование объектов
Идею инкапсуляции полей и алгоритмов можно применить не только к графическим объектам, но и ко всей программе в целом. Ничто не мешает нам создать объект-программу и “научить” его трём основным действиям: инициации (Init), выполнению основной работы (Run), завершению (Done). На этапе инициации экран переводится в графический режим работы и создаются и отображаются графические объекты (100 экземпляров TРoint и по одному экземпляру TLine, TCircle, TRect). На этапе Run осуществляется сканирование клавиатуры и перемещение графических объектов. Наконец, на этапе Done экран переводится в текстовый режим и завершается работа всей программы.
Создание экземпляра объекта ничуть не отличается от создание экземпляра переменной любого другого типа. Просто в разделе описания переменных мы указываем имя переменной и её тип:
var
App: TGraphApp;
Получив это указание, компилятор зарезервирует нужный объём памяти для размещения всех областей объекта программы. Чтобы обратиться к тому или иному объектному методу или полю, используется составное имя, причём первым указывается не имя объектного типа, а имя соответствующей переменной.
Переменные объектного типа могут быть статическими или динамическими, т.е. располагаться в сегменте данных (статические) или в куче (динамические).
Для инициации динамической переменной используется вызов функции . В этом случае первым параметром указывается имя типа инициируемой переменной, а вторым осуществляется вызов метода-конструктора, который нужен для настройки таблицы виртуальных методов. Такой приём (распределение объектов в динамической памяти с одновременной инициацией их ТВМ) характерен для техники ООП.
Следует иметь в виду, что в отличие от конструктора, осуществляющего настройку ТВМ, деструктор не связан с какими-то специфичными действиями: для компилятора слова destructor и procedure — синонимы. Введение в ООП деструкторов носит, в основном, стилистическую направленность — просто процедуру, разрушающую экземпляр объекта, принято называть деструктором. В реальной практике ООП с деструкторами обычно связывают процедуры, которые не только прекращают работу с объектом, но и освобождают выделенную для него динамическую память.
В заключении следует сказать, что формалистика ООП в рамках реализации этой технологии в Турбо Паскале предельно проста и лаконична. Введение лишь шести зарезервированных слов, из которых действительно необходимыми являются три (object, constructor, virtual), весьма небольшая плата за мощный инструмент создания современного программного обеспечения.
Постановка учебной задачи
При выборе программного продукта на тему: «Объекты языка программирования Turbo Pascal» Я ориентировался на создание графической программы. Поэтому я выбрал программу реализующюю пример из физики, под названием “Броуновское движение”.
Эта программа для начала и завершения работы требует нажатие любой клавиши.
Программа этой курсовой работы предназначена для компьютеров с мощностью процессора не менне 50 MHz (80386sx).
Техническая реализация программы потребует использования средств двух стандартных библиотек – CRT и GRAPH.
Основное тело программы делится на несколько частей:
setcolor(2);
settextstyle(0,0,2);
outtextxy(5,100,'Данная программа покажет тебе пример из');
outtextxy(5,150,'физики: "Броуновское движение"');
setcolor(5);
outtextxy(5,200,'Выполнил студент 2 курса, 21 группы');
outtextxy(200,250,'Ягунов Андрей');
settextstyle(0,0,1);
setcolor(4);
outtextxy(200,430,'Для продолжения нажми любую клавищу'); readln;
setfillstyle(1,0);
floodfill(12,12,13);
Этот блок реализует рисование заставку.
setbkcolor (8);
x1 := 250; y1 := 180;
x2 := 340; y2 := 300;
setfillstyle ( 1, 14 );
bar ( 100, 300, 500, 310 );
bar ( 160, 300, 165, 400 );
bar ( 440, 300, 445, 400 );
setfillstyle ( 1, 11 );
bar ( x1, y1, x2, y2 );
line ( x1-1, y1-30, x1-1, y2+1 );
line ( x2+1, y1-30, x2+1, y2+1 );
line ( x1-1, y2+1, x2+1, y2+1 );
line ( x1-1, y1-1, x2+1, y1-1 );
ellipse ( x1+(x2-x1)div 2, y1-30, 0, 360, (x2-x1) div 2, 4 );
Этот блок реализует рисование объектов (стол, колба), а также присваивает им координаты, которые являются как бы основой.
x[i] := x1 + random (x2-x1);
y[i] := y1 + random (y2-y1);
putpixel ( x[i], y[i], 0 );
end;
Здесь осуществляется начальная прорисовка молекул.
repeat
for i := 1 to N do putpixel ( x[i], y[i], 11 );
for i := 1 to N do begin
dx := 2 - random (5);
dy := 2 - random (5);
if ( x[i] + dx > x1 ) and ( x[i] + dx if ( y[i] + dy > y1 ) and ( y[i] + dy end;
for i := 1 to N do putpixel ( x[i], y[i], 1 );
delay (600);
until keypressed;
Основной блок программы. Здесь осуществляется беспорядочное движение молекул за счет использования цикла.
Пример работы программы
При запуске программы появляется окно с указанием названия программы и имени и фамилии написавшего программу (см. рис. 1): Рис. 1 заставка В дальнейшем, при нажатии любой клавиши, появляется основное рабочее окно, показывающее пример «Броуновского движения» (см. рис. 2):
При работе с данной программой не возникает проблем, так как нажатие клавиш означает переход с одного окна в другой и выход из неё.
Заключение
Во время написания своей курсовой работы по теме: «Объекты Turbo Pascal 7.0», я больше освоил язык программирования Паскаль, в виде написания объектов.
Я узнал, что в основе того или иного языка программирования лежит некоторая руководящая идея, оказывающая существенное влияние на стиль соответствующих программ. А также, что исторически первой была идея структурирования программ, в соответствии с которой программист должен был решить, какие именно процедуры он будет использовать в своей программе, а затем выбрать наилучшие алгоритмы для реализации этих процедур.
Усвоил то, что объектно-ориентированное программирование основано трёх важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследование и полиморфизм.
Программа этой курсовой работы предназначена для наглядного применения в учебных заведениях, на уроках физики.
Данная программа может совершенствоваться, в виде выбора опыта из списка доступных.
Список использованной литературы
1. Блашкин И.И., Буров А.А. Новые возможности Turbo-Pascal 6.0. — Спб.: Изд-во “Макет”, 1992.
2. Бородич Ю.С. и др. Паскаль для персональных компьютеров: Справ. пособие/ Ю.С.Бородич, А.Н.Вальвачев, А.И.Кузьмич. — Мн.: Выш. шк.: БФ ГИТМП “НИКА”, 1991.
3. ВасильевП.П. Турбо Паскаль — мой друг: М.: Компьютер, ЮНИТИ, 1995.
4. Джордейн Р. Справочник программиста персональных компьютеров типа IBM PC, XT, AT: Пер. с англ./ Предисл. Н.В.Гайского. — М.: Финансы и статистика, 1991.
5. Зуев Е.А. Язык программирования Turbo Pascal 6.0. — М.: Унитех, 1992.
6. Мизрохи. Turbo Pascal и объектно-ориентированное программирование. — М.: Финансы и статистика, 1992.
7. Справочник по процедурам и функциям Borland Pascal with Objects 7.0. — Киев: “Диалектика”, 1993.
8. Фаронов В.В. Программирование на персональных ЭВМ в среде Турбо-Паскаль. — М.: Изд-во МГТУ, 1990.
9. Фёдоров А. Особенности программирования на Borland Pascal. — Киев: “Диалектика”, 1994.
10. Хершель Р. Турбо Паскаль/ 2-е изд., перераб. — Вологда: МП “МИК”, 1991.
11. POWER TOOLS PLUS. Процедуры поддержки для Turbo Pascal 4.0.: Справочное руководство пользователя. Техническая документация.
Текст программы
program broun;
uses crt, graph;
const N = 200;
var gd,gm: integer;
x,y:array[1 N] of integer;
dx, dy : integer;
i:integer;
x1,y1,x2,y2:integer;
begin
gd := detect;
initgraph ( gd, gm, '' );
randomize;
setcolor(2);
settextstyle(0,0,2);
outtextxy(5,100,'Данная программа покажет тебе пример из');
outtextxy(5,150,'физики: "Броуновское движение"'); setcolor(5);
outtextxy(5,200,'Выполнил студент 2 курса, 21 группы');
uttextxy(200,250,'Ягунов Андрей');
settextstyle(0,0,1);
setcolor(4);
outtextxy(200,430,'Для продолжения нажми любую клавищу');
readln;
setfillstyle(1,0);
floodfill(12,12,13);
setbkcolor (8);
x1 := 250; y1 := 180;
x2 := 340; y2 := 300;
setfillstyle ( 1, 14 );
bar ( 100, 300, 500, 310 );
bar ( 160, 300, 165, 400 );
bar ( 440, 300, 445, 400 );
setfillstyle ( 1, 11 );
bar ( x1, y1, x2, y2 );
line ( x1-1, y1-30, x1-1, y2+1 );
line ( x2+1, y1-30, x2+1, y2+1 );
line ( x1-1, y2+1, x2+1, y2+1 );
line ( x1-1, y1-1, x2+1, y1-1 );
ellipse ( x1+(x2-x1)div 2, y1-30, 0, 360, (x2-x1) div 2, 4 );
for i := 1 to N do begin
x[i] := x1 + random (x2-x1);
y[i] := y1 + random (y2-y1);
putpixel ( x[i], y[i], 0 );
end;
repeat
for i := 1 to N do putpixel ( x[i], y[i], 11 );
for i := 1 to N do begin
dx := 2 - random (5);
dy := 2 - random (5);
if ( x[i] + dx > x1 ) and ( x[i] + dx y1 ) and ( y[i] + dy for i := 1 to N do putpixel ( x[i], y[i], 1 );
delay (600);
until keypressed;
closegraph;
end.