- •Курсовой проект
- •1.Постановка задачи и описание системы
- •2.Описание принципа работы автопилота
- •3.Разработка математической модели системы и
- •4.Описание классов и объектов модели
- •5.Анализ работы системы и инструктивные указания
- •6.Составление схемы модели на языке uml
- •Диаграммы вариантов использования
- •7.Выводы
7.Выводы
В проведенной курсовой работе была создана объектно-ориентированная программная система автопилота самолета, который отслеживает высоту, скорость и направление полета. Для моделирования полета была введена трехмерная система координат отображающая направление и высоту полета. Учитывается скорость полета, расстояние до объекта при бытия. Указан статус самолета(не земле, в полете).Возможно пополнение топливом на земле.
Был использован унифицированный язык моделирования (UML) для визуализации и документации модели объектно-ориентированной программы, которой является данная работа.
Результатом работы является программный продукт отвечающий заданию, принятым стандартам и нормам.
Листинг Unit1.срр
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
CKarta karta;
CSamolet samolet;
CMonitor monitor;
//-----------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//-----------------------
void __fastcall TForm1::Timer2Timer(TObject *Sender)
{
StatusBar1->Panels->Items[0]->Text="Время: "+Time();
if (!samolet.get_fly()) StatusBar1->Panels->Items[3]->Text="Самолет стоит";
else if ((monitor.dx<0) && (monitor.dy<0)) StatusBar1->Panels->Items[3]->Text="Напрвалени: Северо-Запад";
else if ((monitor.dx>0) && (monitor.dy<0)) StatusBar1->Panels->Items[3]->Text="Напрвалени: Северо-Восток";
else if ((monitor.dx>0) && (monitor.dy>0)) StatusBar1->Panels->Items[3]->Text="Напрвалени: Юго-Восток";
else if ((monitor.dx<0) && (monitor.dy>0)) StatusBar1->Panels->Items[3]->Text="Напрвалени: Юго-Запад";
}
//-------------------------------------------
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y)
{
StatusBar1->Panels->Items[1]->Text="X: "+IntToStr(X);
StatusBar1->Panels->Items[2]->Text="Y: "+IntToStr(Y);
}
//-----------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
monitor<<samolet;
monitor<<karta;
karta<<Image1;
monitor.set_im1(Image1);
monitor.set_im2(Image2);
monitor.cbox1=ComboBox1;
monitor.cbox2=ComboBox2;
monitor.l1=Label1;
monitor.l2=Label3;
monitor.l3=Label4;
monitor.l4=Label5;
monitor.l5=Label8;
monitor.l_S=Label2;
monitor.lx=Label10;
monitor.ly=Label11;
monitor.ed1=Edit1;
monitor.ed2=Edit2;
monitor.ed3=Edit3;
monitor.ed4=Edit4;
randomize();
int r=random(karta.get_kol());
int x,y;
x=karta.mas[r].get_x();
y=karta.mas[r].get_y();
samolet.set_xy(x,y);
ComboBox1->Text=karta.mas[r].get_str();
samolet.set_xy(x,y);
ComboBox1->OnChange(0);
r=random(karta.get_kol());
x=karta.mas[r].get_x();
y=karta.mas[r].get_y();
ComboBox2->Text=karta.mas[r].get_str();
ComboBox2->OnChange(0);
monitor.show_pynktu();
monitor.show();
}
//-----------------------------------------------
void __fastcall TForm1::ComboBox1Change(TObject *Sender)
{
monitor.set_punkt(ComboBox1->Text,0);
monitor.show();
}
//-----------------------------------------------
void __fastcall TForm1::ComboBox2Change(TObject *Sender)
{
monitor.set_punkt(ComboBox2->Text,1);
monitor.show();
}
//-----------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
if ( !strcmp(ComboBox1->Text.c_str(),ComboBox2->Text.c_str())) {
ShowMessage("Выберите разные пункты!!!");
return;
}
if (monitor.s*1.5 > samolet.get_v() ) {
ShowMessage("У вас не хватит топлива!!!");
return;
}
monitor.calculate();
karta.set_state(2);
karta.mas[monitor.punkt[0]].state=1;
karta.mas[monitor.punkt[1]].state=1;
Timer1->Enabled=true;
ComboBox1->Enabled=false;
ComboBox2->Enabled=false;
Button1->Enabled=false;
}
//-----------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
samolet.change(50);
monitor.show();
}
//-----------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
if (!monitor.move()) {
Button1->Enabled=true;
Timer1->Enabled=false;
}
monitor.show();
}
Листинг Unit2.срр
#pragma hdrstop
#include "Unit2.h"
#include "math.h"
CFuel::CFuel(){
v=500;
}
CFuel::CFuel(double v1){
v=v1;
}
CFuel::~CFuel(){
}
void CFuel::set_v(double v1){
v=v1;
}
double CFuel::get_v(){
return v;
}
bool CFuel::change(double d){
if ((v+d)>=0) {
v+=d;
return true;
}
else return false;
}
//-----------------------------------------------
int CKarta::get_kol(){
return kol;
}
CKarta::CKarta(){
kol=32;
mas=new CPlace[kol];
mas[0].set("spain",66,337);
mas[1].set("france",142,296);
mas[2].set("germany",216,231);
mas[3].set("italy",274,366);
mas[4].set("uk",119,175);
mas[5].set("ireland",71,169);
mas[6].set("ukraine",419,215);
mas[7].set("iceland",85,15);
mas[8].set("portugal",13,357);
mas[9].set("turkey",453,343);
mas[10].set("poland",298,184);
mas[11].set("poland",468,115);
mas[12].set("norway",215,80);
mas[13].set("sweden",254,101);
mas[14].set("finland",326,55);
mas[15].set("romania",365,281);
mas[16].set("belorussia",370,170);
mas[17].set("austria",262,264);
mas[18].set("hungary",303,271);
mas[19].set("slovakia",308,245);
mas[20].set("czech",263,231);
mas[21].set("latvia",343,123);
mas[22].set("serbia",326,309);
mas[23].set("kazakhstan",564,157);
mas[24].set("georgia",536,278);
mas[25].set("greece",343,376);
mas[26].set("morocco",30,430);
mas[27].set("algeria",131,428);
mas[28].set("tunesia",202,429);
mas[29].set("syria",522,388);
mas[30].set("irag",566,369);
mas[31].set("iran",574,319);
}
CKarta::~CKarta(){
delete[] mas;
}
void CKarta::show(){
int x,y;
int d;
im1->Canvas->Brush->Color=clWhite;
im1->Canvas->Pen->Color=clLime;
im1->Canvas->Pen->Width=1;
d=7;
for(int i=0;i<kol;i++) {
x=mas[i].get_x();
y=mas[i].get_y();
im1->Canvas->Ellipse(x-d,y-d,x+d+1,y+d+1);
}
d=3;
// im1->Canvas->Pen->Color=clRed;
im1->Canvas->Pen->Width=3;
for(int i=0;i<kol;i++) {
x=mas[i].get_x();
y=mas[i].get_y();
if (mas[i].state==0) im1->Canvas->Pen->Color=clLime;
else if (mas[i].state==1) im1->Canvas->Pen->Color=clRed;
else im1->Canvas->Pen->Color=clYellow;
im1->Canvas->MoveTo(x,y-d);
im1->Canvas->LineTo(x,y+d);
im1->Canvas->MoveTo(x-d,y);
im1->Canvas->LineTo(x+d,y);
}
}
void CKarta::set_state(int i1){
for(int i=0;i<kol;i++)
mas[i].state=i1;
}
void CKarta::operator<<(TImage *im){
im1=im;
}
//-----------------------------------------------
CPlace::CPlace(){
name="noname";
x=y=0;
state=0;
}
CPlace::CPlace(AnsiString str,int x1,int y1){
name=str;
x=x1;
y=y1;
state=0;
}
CPlace::~CPlace(){
}
AnsiString CPlace::get_str(){
return name;
}
void CPlace::set(AnsiString str,int x1,int y1){
name=str;
x=x1;
y=y1;
}
void CPlace::set_xy(int x1,int y1){
x=x1;
y=y1;
}
void CPlace::set_x(int x1){
x=x1;
}
void CPlace::set_y(int y1){
y=y1;
}
int CPlace::get_x(){
return x;
}
int CPlace::get_y(){
return y;
}
//-----------------------------------------------
CSamolet::CSamolet(){
x=419;
y=215;
}
CSamolet::CSamolet(double x1,double y1){
x=x1;
y=y1;
}
CSamolet::~CSamolet(){
}
void CSamolet::set_x(double x1){
x=x1;
}
void CSamolet::set_y(double y1){
y=y1;
}
void CSamolet::set_xy(double x1,double y1){
x=x1;
y=y1;
}
double CSamolet::get_x(){
return x;
}
double CSamolet::get_y(){
return y;
}
void CSamolet::set_fly(bool b){
fly=b;
}
bool CSamolet::get_fly(){
return fly;
}
void CSamolet::start(){
fly=true;
}
void CSamolet::stop(){
fly=false;
}
void CSamolet::set_skorost(double s1) {
skorost=s1;
}
double CSamolet::get_skorost(){
return skorost;
}
void CSamolet::set_h(int h1){
h=h1;
}
int CSamolet::get_h(){
return h;
}
//-----------------------------------------------
CMonitor::CMonitor(){
}
CMonitor::~CMonitor(){
}
void CMonitor::set_im1(TImage *m){
im1=m;
}
void CMonitor::set_im2(TImage *m){
im2=m;
}
void CMonitor::operator<<(CSamolet &sam){
samolet=&sam;
}
void CMonitor::operator<<(CKarta &kar){
karta=&kar;
}
void CMonitor::set_samolet(CSamolet * sam){
}
void CMonitor::show(){
im1->Picture=im2->Picture;
show_pyt();
karta->show();
im1->Canvas->Pen->Width=1;
im1->Canvas->Pen->Color=clBlack;
if (samolet->get_fly()) im1->Canvas->Brush->Color=clRed;
else im1->Canvas->Brush->Color=clBlue;
im1->Canvas->Ellipse(samolet->get_x()-5,samolet->get_y()-5,samolet->get_x()+5,samolet->get_y()+5);
ed1->Text=FloatToStrF(samolet->get_v(),ffFixed,3,00);
if (samolet->get_fly()) ed2->Text=" в полете";
else ed2->Text=" на земле";
lx->Caption="X= "+FloatToStrF(samolet->get_x(),ffFixed,3,2);
ly->Caption="Y= "+FloatToStrF(samolet->get_y(),ffFixed,3,2);
ed4->Text=IntToStr(samolet->get_h());
ed3->Text=FloatToStrF( samolet->get_skorost() ,ffFixed,3,2);
int x1,x2,y1,y2;
x1=karta->mas[punkt[0]].get_x();
y1=karta->mas[punkt[0]].get_y();
x2=karta->mas[punkt[1]].get_x();
y2=karta->mas[punkt[1]].get_y();
if (x1==x2)
if (y1==y2)
{
l_S->Caption="Растояние от точки до себя = 0 !!!";
l5->Caption="Требуемое кол-во топлива V= 0";
return;
}
s= pow(pow(x1-x2,2)+pow(y1-y2,2),0.5);
l_S->Caption="Растояние полета S= "+FloatToStrF(s,ffFixed,3,2);
l5->Caption="Требуемое кол-во топлива V= "+FloatToStrF( s*1.5,ffFixed,3,2);
}
void CMonitor::show_pynktu(){
cbox1->Items->Clear();
cbox2->Items->Clear();
for(int i=0;i<karta->get_kol();i++) {
cbox1->Items->Add(karta->mas[i].get_str());
cbox2->Items->Add(karta->mas[i].get_str());
}
}
void CMonitor::set_punkt(AnsiString str,int index){
for(int i=0;i<karta->get_kol();i++) {
if( !strcmp(str.c_str(),karta->mas[i].get_str().c_str())) {
punkt[index]=i;
break;
}
}
if (index==0) {
int x=karta->mas[punkt[index]].get_x();
int y=karta->mas[punkt[index]].get_y();
samolet->set_xy(x,y);
l1->Caption="X= "+IntToStr(karta->mas[punkt[index]].get_x());
l2->Caption="Y= "+IntToStr(karta->mas[punkt[index]].get_y());
} else {
l3->Caption="X= "+IntToStr(karta->mas[punkt[index]].get_x());
l4->Caption="Y= "+IntToStr(karta->mas[punkt[index]].get_y());
}
karta->set_state(0);
karta->mas[punkt[0]].state=1;
karta->mas[punkt[1]].state=1;
}
void CMonitor::show_pyt(){
im1->Canvas->MoveTo(karta->mas[punkt[0]].get_x(),karta->mas[punkt[0]].get_y());
im1->Canvas->LineTo(karta->mas[punkt[1]].get_x(),karta->mas[punkt[1]].get_y());
}
void CMonitor::calculate(){
int x1,x2,y1,y2;
x1=karta->mas[punkt[0]].get_x();
y1=karta->mas[punkt[0]].get_y();
x2=karta->mas[punkt[1]].get_x();
y2=karta->mas[punkt[1]].get_y();
double deltaX,deltaY;
deltaX=x2-x1;
deltaY=y2-y1;
if ( abs(deltaX)> abs(deltaY)) {
if (x2>x1) dx=1;
else if(x2==x1) dx=0;
else dx=-1;
dy=deltaY/abs(deltaX);
} else {
if (y2>y1) dy=1;
else if(y2==y1) dy=0;
else dy=-1;
dx=deltaX/abs(deltaY);
}
}
bool CMonitor::move(){
if ( abs(samolet->get_x() - karta->mas[punkt[1]].get_x()) <2)
if ( abs(samolet->get_y() - karta->mas[punkt[1]].get_y()) <2)
{
samolet->stop();
cbox1->Text=cbox2->Text;
cbox1->OnChange(0);
samolet->set_h(0);
cbox2->Enabled=true;
return false;
}
samolet->set_xy(samolet->get_x()+dx,samolet->get_y()+dy);
{
samolet->start();
samolet->set_skorost(250+random(20));
if (s<50) samolet->set_h(20+random(10));
else if (s<100) samolet->set_h(40+random(20));
else samolet->set_h(70+random(20));
samolet->change(-1.5);
return true;
}
}
//-----------------------------------------------
#pragma package(smart_init)
Листинг Unit2.h
#ifndef Unit2H
#define Unit2H
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
//-----------------------------------------------
class CPlace {
private:
int x,y;
AnsiString name;
public:
int state;
CPlace();
CPlace(AnsiString str,int x1,int y1);
~CPlace();
void set(AnsiString str,int x1,int y1);
void set_xy(int x1,int y1);
void set_x(int x1);
void set_y(int y1);
AnsiString get_str();
int get_x();
int get_y();
};
class CKarta {
private :
int kol;
TImage *im1;
public:
CPlace *mas;
CKarta();
~CKarta();
int get_kol();
void show();
void operator<<(TImage *im);
void set_state(int i1);
};
class CFuel {
private:
double v;
public:
CFuel();
CFuel(double v1);
~CFuel();
void set_v(double v1);
double get_v();
bool change(double d);
};
class CSamolet:public CFuel {
private:
double x,y;
bool fly;
double skorost;
int h;
public:
CSamolet();
CSamolet(double x1,double y1);
~CSamolet();
void set_h(int h1);
int get_h();
void set_skorost(double s1);
double get_skorost();
void set_x(double x1);
void set_y(double y1);
void set_xy(double x1,double y1);
double get_x();
double get_y();
void set_fly(bool b);
bool get_fly();
void start();
void stop();
bool move();
};
class CMonitor {
public:
CSamolet *samolet;
CKarta *karta;
TImage *im1,*im2;
TComboBox *cbox1,*cbox2;
TLabel *l1,*l2,*l3,*l4,*l_S,*l5,*lx,*ly;
TEdit *ed1,*ed2,*ed3,*ed4;
double dx,dy;
double s;
int punkt[2];
CMonitor();
~CMonitor();
void set_im1(TImage *m);
void set_im2(TImage *m);
void operator<<(CSamolet &sam);
void operator<<(CKarta &kar);
void set_samolet(CSamolet * sam);
void show();
void show_pynktu();
void show_pyt();
void set_punkt(AnsiString str,int index);
bool move();
void calculate();
};
#endif
Листинг Unit1.h
#ifndef Unit1H
#define Unit1H
//-----------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
#include <ExtCtrls.hpp>
#include <Graphics.hpp>
#include <ComCtrls.hpp>
//-----------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TImage *Image2;
TGroupBox *GroupBox1;
TImage *Image1;
TTimer *Timer1;
TStatusBar *StatusBar1;
TTimer *Timer2;
TGroupBox *GroupBox2;
TGroupBox *GroupBox3;
TGroupBox *GroupBox4;
TComboBox *ComboBox1;
TLabel *Label1;
TLabel *Label3;
TGroupBox *GroupBox5;
TLabel *Label4;
TLabel *Label5;
TComboBox *ComboBox2;
TButton *Button1;
TLabel *Label2;
TLabel *Label6;
TEdit *Edit1;
TLabel *Label7;
TEdit *Edit2;
TLabel *Label8;
TLabel *Label9;
TEdit *Edit3;
TGroupBox *GroupBox6;
TLabel *Label10;
TLabel *Label11;
TButton *Button2;
TLabel *Label12;
TEdit *Edit4;
void __fastcall Timer2Timer(TObject *Sender);
void __fastcall Image1MouseMove(TObject *Sender, TShiftState Shift,
int X, int Y);
void __fastcall FormCreate(TObject *Sender);
void __fastcall ComboBox1Change(TObject *Sender);
void __fastcall ComboBox2Change(TObject *Sender);
void __fastcall Button1Click(TObject *Sender);
void __fastcall Button2Click(TObject *Sender);
void __fastcall Timer1Timer(TObject *Sender);
private: // User declarations
public: // User declarations
__fastcall TForm1(TComponent* Owner);
};
//-----------------------------------------------
extern PACKAGE TForm1 *Form1;
//-----------------------------------------------
#endif