Автор работы: Пользователь скрыл имя, 03 Апреля 2015 в 17:40, курсовая работа
Описание функциональных возможностей реального объекта. Радиоуправляемая автомодель — это модель автомобиля с радиоуправлением. Управляя двигателем управляют положением носа модели: при нажатии на газ нос приподнимается, от торможения машина «клюёт» носом и даже может сделать сальто в полёте. Рулением можно немного сдвинуть модель в сторону поворота колёс.
Описание функциональных возможностей реального объекта 3
Разработка структуры объекта 4
Поля и свойства 5
Программы и процедуры 8
Использование объектов в программе 15
Блок-схема 21
Распечатка результатов работы 24
РЕЦЕНЗИЯ 25
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе по курсу
"Программирование"
Вариант
Выполнил студент гр.
Проверили
доц.___________ Предварительная оценка: ___________
Рецензент _______________ Оценка рецензента ________________
Окончательная оценка _____ Подпись руководителя КР ___________
2014
Оглавление
Радиоуправляемая автомодель — это модель автомобиля с радиоуправлением. Модели делятся по типу двигателя на две группы: с приводом от электродвигателя, и с приводом от двигателя внутреннего сгорания, и по типу применения: хобби или спорт.
Внедорожные модели модели имеют возможность передвигаться по пересечённой местности различной сложности. Их особенностью является возможность «безболезненно» совершать высокие прыжки на огромной скорости. На трассах для внедорожников всегда устанавливают несколько трамплинов. В воздухе модель остаётся вполне контролируемой благодаря большой инерции вращающихся колёс. Управляя двигателем управляют положением носа модели: при нажатии на газ нос приподнимается, от торможения машина «клюёт» носом и даже может сделать сальто в полёте. Рулением можно немного сдвинуть модель в сторону поворота колёс.
Объект в программировании – набор переменных разного типа, называемых полями (как и у записи), и процедур или функций, называемых методами (methods), которые выполняют определенные действия над свойствами.
Идея объектно-ориентированного подхода заключается в том, что объект в программе является абстрактным описанием настоящего, реально существующего объекта.
Первый этап выполнения КР – выделить характерных свойства и методы реального объекта. Для часов примем следующее:
Свойства |
Методы |
Направление движения |
Изменить направление движения |
Уровень сигнала |
Измерить уровень сигнала |
Частота пульта ДУ |
Изменить частоту пульта ДУ |
Включено или выключено |
Включить или выключить |
Статус |
Отобразить статус на дисплее |
На втором этапе нужно дать названия полям, в которых хранятся свойства, и методам, для каждого свойства выбрать подходящий тип данных, а для метода – установить, какая информация необходима для его выполнения. Разумеется, все названия должны даваться по правилам языков программирования – английскими буквами, без пробелов и т.д. Настоятельно рекомендуется использовать правильные английские слова:
Свойство реального объекта |
Название поля |
Тип данных |
Направление движения |
direction |
String |
Уровень сигнала |
Signal |
String |
Частота пульта ДУ |
Freq |
String |
Включено или выключено |
On_off |
String |
Статус |
idea |
String |
Данные внутри объекта хранятся в виде переменных-полей. В соответствии с принципом инкапсуляции поля размещают в разделе PRIVATE и делают их недоступными для изменения извне объекта. Для того, чтобы можно было считывать или изменять значения полей, в соответствии полю ставится свойство объекта (property). Свойство объекта доступно извне объекта. При его изменении или считывании его значения происходит автоматический вызов особой процедуры или функции, связанной с этим свойством. Таким образом, любые изменения значений полей происходят не напрямую, а только через вызов процедуры.
Имена свойств не должны совпадать с именами полей. Так как номинальная частота вращения является константой, ее можно не объявлять как поле, а представить только как свойство. Зададим набор процедур и функций для чтения/записи свойств:
Имя свойства |
Процедура записи |
Функция чтения |
direction |
procedure mycar.setdirection( begin m_direction := newdirection; m_idea :=m_direction; m_p; end; |
function mycar.getdirection:string;
begin result:= m_direction; |
Signal |
procedure mycar.setsignal(newsignal: begin m_signal:=newsignal; m_p; end; |
function mycar.getsignal:string; begin Result := m_signal; end; |
Freq |
procedure mycar.setfreq(newfreq:string); begin m_freq:=newfreq; m_p; end; |
function mycar.getfreq:string; begin result:=m_freq; end; |
On_off |
procedure mycar.seton_off(newon_off: begin m_on_off := newon_off; m_p; end; |
function mycar.geton_off:string; begin result := m_on_off; end; |
idea |
function mycar.getIdea:string; begin if m_direction='up' then m_idea:='up'; if m_direction='down' then m_idea:='down'; if m_direction='left' then m_idea:='left'; if m_direction='right' then m_idea:='right'; result:=m_idea; end; |
Объект используется внешней программой, которая обеспечивает весь интерфейс пользователя: кнопки, индикаторы и пр. И здесь возникает изрядная проблема: методы объекта при своем выполнении должны взаимодействовать с элементами интерфейса. Скажем, при смене частоты вращения на экране должен «ползать» полосковый индикатор. Но ведь объект пишется один раз и должен быть пригоден для использования в разных программах, с разным интерфейсом. Поэтому внутри объекта никаких ссылок на формы, кнопки, поля ввода… нет и быть не может.
Как же быть? Выход, разумеется, есть. Можно передать в объект ссылку на любую процедуру, описанную во внешней программе, и внутри методов объекта эту процедуру вызывать. Передача ссылки на процедуру (точнее, на метод другого объекта – такая процедура может быть, например, методом главной формы программы) требует использования особого типа данных, который описывается как
TYPE TP=procedure of object;
В переменной типа TP может храниться адрес метода любого другого объекта. В объекте mycar создадим поле p типа TP. При создании объекта нужно гарантировать, что в поле p будет занесен адрес процедуры из внешней программы. Для этого достаточно ввести параметр у метода-конструктора Create:
constructor mycar.Create(n:string;pp:TP);
begin
m_direction:='no';
m_on_off:='off';
m_signal:='good';
m_p:=pp;
end;
Хочешь создать наш объект – изволь подать ему на вход процедуру.
Теперь внутри методов в любом месте можно вызвать внешнюю процедуру, просто написав p (как это было сделано в методе Feed).
Теперь соберем все сказанное вместе:
//unit <имя модуля> - начало модуля с именем <имя модуля>
unit radiocar;
//interface начинает раздел описаний, все переменные, процедуры,
//объекты и т.д. описанные в этом разделе будут доступны в модулях,
//которые используют этот модуль
interface
//Type - описание типов данных
Type
//<имя типа данных> = <описание типа данных>
//Указатель на процедуру объекта
//понадобится
для организации обратного
TP = procedure of object;
{Описание класса:
<Имя класса> = class[(<родительский класс>)]
описание свойств,
описание методов
end;
}
{При описании класса могут быть 3 секции:
public (открытая) - все свойства и методы открытой секции доступны всем желающим
private (закрытая) - свойства и методы в закрытой секции доступны только самому классу
protected (защищенная) - свойства и методы в защищенной секции доступны самому классу и его потомкам
}
mycar = class
protected
//свойства класса
m_direction:string; //вперед
m_on_off:string; //задний ход
m_signal:string; //влево
m_freq:string; //вправо
m_idea:string; //состояние машины
m_p:TP; //указатель на процедуру для вывода информации о классе
//методы класса (геттеры и сеттеры)
//геттеры (get...) возвращают значения свойств объекта
//сеттеры (set...) устанавливают значения свойств объекта
//как правило, свойства напрямую не меняются, доступ к ним осуществляется через геттеры и сеттеры
function getdirection:string;
procedure setdirection(newdirection:
function geton_off:string;
procedure seton_off(newon_off:string);
function getsignal:string;
procedure setsignal(newsignal:string);
function getfreq:string;
procedure setfreq(newfreq:string);
function getIdea:string;
public
//конструктор - вызывается всегда первой и создает экземпляр объекта
//
constructor Create(s:Tup;n:string;b:
constructor Create(n:string;pp:TP);
//property - прячет свойства объекта за геттеры и сеттеры
//при этом нам кажется что мы работаем со свойствами напрямую
//property <имя>:<тип данных свойства> [Read <имя геттера>] [Write <имя сеттера>]
property direction:string Read getdirection write setdirection;
property on_off:string Read geton_off Write seton_off;
property signal:string Read getsignal Write setsignal;
property freq:string Read getfreq Write setfreq;
property idea:string Read getIdea;
end;
//implementation - секция реализации. Все что находится в этой секции не доступно модулям, которые используют наш модуль
implementation
uses Classes;
constructor mycar.Create(n:string;pp:TP);
begin
m_direction:='no';
m_on_off:='off';
m_signal:='good';
m_p:=pp;
end;
function mycar.getdirection:string;
begin
result:= m_direction;
end;
procedure
mycar.setdirection(
begin
m_direction := newdirection;
m_idea :=m_direction;
m_p;
end;
function mycar.geton_off:string;
begin
result := m_on_off;
end;
procedure
mycar.seton_off(newon_off:
begin
m_on_off := newon_off;
m_p;
end;
function mycar.getsignal:string;
begin
Result := m_signal;
end;
procedure
mycar.setsignal(newsignal:
begin
m_signal:=newsignal;
m_p;
end;
function mycar.getfreq:string;
begin
result:=m_freq;
end;
procedure mycar.setfreq(newfreq:string);
begin
m_freq:=newfreq;
m_p;
end;
function mycar.getIdea:string;
begin
if m_direction='up' then m_idea:='up';
if m_direction='down' then m_idea:='down';
if m_direction='left' then m_idea:='left';
if m_direction='right' then m_idea:='right';
result:=m_idea;
end;
Пришло время писать собственно программу. В ней нужно подключить наш модуль radiocar, создать переменную-объект this_car типа mycar и выполнить какие-то действия с этой переменной. Интерфейс пользователя зависит от конкретного моделируемого объекта и должен обеспечивать вызов всех методов объекта. Например, вот вариант внешнего вида главной формы программы (рис. 1):
Рис. 1 – Главная форма программы.
К методам главной формы (пусть она называется Form1) надо добавить свой – тот самый, который будет вызываться из объекта.
Исходный код программы-симулятора:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, radiocar, StdCtrls, ExtCtrls, jpeg;
type
TForm1 = class(TForm)
Button5: TButton;
Button7: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Image1: TImage;
Image2: TImage;
Timer1: TTimer;
Button1: TButton;
Button6: TButton;
Image3: TImage;
Timer2: TTimer;
ComboBox1: TComboBox;
Label1: TLabel;
procedure FormCreate(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Button7Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button6Click(Sender: TObject);
procedure Timer2Timer(Sender: TObject);
procedure ComboBox1Change(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure Show;
end;
var
Form1: TForm1;
this_car: mycar;
i:integer;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
this_car:=Mycar.Create('',
Show;
end;
procedure TForm1.Show;
begin
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
this_car.direction:='up';
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
this_car.direction:='down';
end;
procedure TForm1.Button5Click(Sender: TObject);
begin
this_car.direction:='left';
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
this_car.direction:='right';
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
if this_car.signal='good' then image3.Picture.LoadFromFile('
if this_car.signal='nice' then image3.Picture.LoadFromFile('
if this_car.signal='low' then image3.Picture.LoadFromFile('
if this_car.idea='right' then image2.Picture.LoadFromFile('
if this_car.idea='left' then image2.Picture.LoadFromFile('
if this_car.idea='up' then image2.Picture.LoadFromFile('
if this_car.idea='down' then image2.Picture.LoadFromFile('
end;
procedure TForm1.Button7Click(Sender: TObject);
begin
this_car.direction:='';
image2.Picture.LoadFromFile('
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
this_car.on_off:='on';
image3.Visible:=true;
combobox1.enabled:=true;
button2.Enabled:=false; button2.Enabled:=true; button3.Enabled:=true;
button4.Enabled:=true; button5.Enabled:=true; button6.Enabled:=true;button7.
end;
procedure TForm1.Button6Click(Sender: TObject);
begin
this_car.on_off:='off';
image3.Visible:=false;
combobox1.enabled:=false;
button1.Enabled:=true; button2.Enabled:=false; button3.Enabled:=false; button7.Enabled:=false; button4.Enabled:=false; button5.Enabled:=false; button6.Enabled:=false;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
if random(100)<40 then this_car.signal:='low';
if random(100)>60 then this_car.signal:='good';
if random(100)>80 then this_car.signal:='nice';
end;
procedure TForm1.ComboBox1Change(Sender: TObject);
begin
this_car.freq:=combobox1.Text;
end;
end.
Рис. 2 – Блок-схема функций и процедур объекта
Рис. 3 – Блок-схема функций и процедур объекта
Рис. 4 – Блок-схема процедуры Timer1Timer
Рис. 5 – Результаты работы
Список литературы
на курсовую работу по программированию на курсовую работу по программированию студента
Курсовая работа выполнена
в полном объеме в
Информация о работе Создание программы управления радиоуправляемой автомоделью