Создание программы управления радиоуправляемой автомоделью

Автор работы: Пользователь скрыл имя, 03 Апреля 2015 в 17:40, курсовая работа

Краткое описание

Описание функциональных возможностей реального объекта. Радиоуправляемая автомодель — это модель автомобиля с радиоуправлением. Управляя двигателем управляют положением носа модели: при нажатии на газ нос приподнимается, от торможения машина «клюёт» носом и даже может сделать сальто в полёте. Рулением можно немного сдвинуть модель в сторону поворота колёс.

Содержание

Описание функциональных возможностей реального объекта 3
Разработка структуры объекта 4
Поля и свойства 5
Программы и процедуры 8
Использование объектов в программе 15
Блок-схема 21
Распечатка результатов работы 24
РЕЦЕНЗИЯ 25

Прикрепленные файлы: 1 файл

___ккр.docx

— 1.31 Мб (Скачать документ)

 

 

 

ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовой работе по курсу

"Программирование"

Вариант

 

 

 

 

 

Выполнил     студент гр.

Проверили

доц.___________   Предварительная оценка: ___________

Рецензент _______________    Оценка рецензента ________________

Окончательная оценка _____   Подпись руководителя КР ___________

 

 

 

 

 

 

 

 

2014

Оглавление

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Описание функциональных возможностей реального объекта

Радиоуправляемая автомодель — это модель автомобиля с радиоуправлением. Модели делятся по типу двигателя на две группы: с приводом от электродвигателя, и с приводом от двигателя внутреннего сгорания, и по типу применения: хобби или спорт.

Внедорожные модели модели имеют возможность передвигаться по пересечённой местности различной сложности. Их особенностью является возможность «безболезненно» совершать высокие прыжки на огромной скорости. На трассах для внедорожников всегда устанавливают несколько трамплинов. В воздухе модель остаётся вполне контролируемой благодаря большой инерции вращающихся колёс. Управляя двигателем управляют положением носа модели: при нажатии на газ нос приподнимается, от торможения машина «клюёт» носом и даже может сделать сальто в полёте. Рулением можно немного сдвинуть модель в сторону поворота колёс.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Разработка структуры объекта

 

Объект в программировании – набор переменных разного типа, называемых полями (как и у записи), и процедур или функций, называемых методами (methods), которые  выполняют определенные действия над свойствами.

Идея объектно-ориентированного подхода заключается в том, что объект в программе является абстрактным описанием настоящего, реально существующего объекта.

Первый этап выполнения КР – выделить характерных свойства и методы реального объекта. Для часов примем следующее:

 

 

Свойства

Методы

Направление движения

Изменить направление движения

Уровень сигнала

Измерить уровень сигнала

Частота пульта ДУ

Изменить частоту пульта ДУ

Включено или выключено

Включить или выключить

Статус

Отобразить статус на дисплее


 

На втором этапе нужно дать названия полям, в которых хранятся свойства, и методам, для каждого свойства выбрать подходящий тип данных, а для метода – установить, какая информация необходима для его выполнения. Разумеется, все названия должны даваться по правилам языков программирования – английскими буквами, без пробелов и т.д. Настоятельно рекомендуется использовать правильные английские слова:

 

 

Свойство реального объекта

Название поля

Тип данных

Направление движения

direction

String

Уровень сигнала

Signal

String

Частота пульта ДУ

Freq

String

Включено или выключено

On_off

String

Статус

idea

String


 

Поля и свойства

Данные внутри объекта хранятся в виде переменных-полей. В соответствии с принципом инкапсуляции поля размещают в разделе PRIVATE и делают их недоступными для изменения извне объекта. Для того, чтобы можно было считывать или изменять значения полей, в соответствии полю ставится свойство объекта (property). Свойство объекта доступно извне объекта. При его изменении или считывании его значения происходит автоматический вызов особой процедуры или функции, связанной с этим свойством. Таким образом, любые изменения значений полей происходят не напрямую, а только через вызов процедуры.

Имена свойств не должны совпадать с именами полей. Так как номинальная частота вращения является константой, ее можно не объявлять как поле, а представить только как свойство. Зададим набор процедур и функций для чтения/записи свойств:

Имя свойства

Процедура записи

Функция чтения

direction

procedure mycar.setdirection(newdirection:string);

begin

 m_direction := newdirection;

 m_idea :=m_direction;

 m_p;

end;

function mycar.getdirection:string;

 

begin

result:= m_direction;

Signal

procedure mycar.setsignal(newsignal:string);

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:string);

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:string);

  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:TDateTime;pp:TP);

  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(newdirection:string);

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:string);

begin

  m_on_off := newon_off;

  m_p;

end;

function mycar.getsignal:string;

begin

  Result := m_signal;

end;

procedure mycar.setsignal(newsignal:string);

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;

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);

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('signal_good.jpg');

if this_car.signal='nice' then image3.Picture.LoadFromFile('signal_nice.jpg');

if this_car.signal='low' then image3.Picture.LoadFromFile('signal_low.jpg');

 

if this_car.idea='right' then image2.Picture.LoadFromFile('carright.jpg');

if this_car.idea='left' then image2.Picture.LoadFromFile('carleft.jpg');

if this_car.idea='up' then image2.Picture.LoadFromFile('carup.jpg');

if this_car.idea='down' then image2.Picture.LoadFromFile('cardown.jpg');

end;

 

procedure TForm1.Button7Click(Sender: TObject);

begin

this_car.direction:='';

image2.Picture.LoadFromFile('car.jpg');

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.Enabled:=true;

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 – Результаты работы

 

Список литературы

  1. http://ru.wikipedia.org/wiki/Радиоуправляемая_автомодель
  2. Методические указания.

 

РЕЦЕНЗИЯ

на курсовую работу по программированию на курсовую работу по программированию студента  

 

    Курсовая работа  выполнена  в полном объеме в соответствии  с заданием и может быть  оценена следующим образом:

Информация о работе Создание программы управления радиоуправляемой автомоделью