Коды классов, функций и обработчиков событий


 

Сохраните модуль главной формы под именем LR_9, а проект – под именем PR_LR_9.

Для размещения классов в проекте использованы модули, не связанные с формой. Для первого варианта иерархии использованы следующие модули.

1.Модуль f_point

Заголовочный файлf_point.h

#ifndef f_pointH

#define f_pointH

//Объявление класса f_point

//---------------------------------------------------------------------------

class f_point

{

public:

f_point(float=0, float=0); //конструктор с умолчанием

void setpoint(float,float); //установка координат точки

float getX() const {return x;}// возвращение координаты x

float getY() const {return y;}// возвращение координаты y

protected:

float x,y; // координаты точки

};

#endif

 

Файл реализации f_point.cpp

//---------------------------------------------------------------------------

#pragma hdrstop

#include "f_point.h"

//Определения функций-элементов класса f_point

//---------------------------------------------------------------------------

//в конструкторе вызывается функция установки координат точки

f_point::f_point(float a, float b) {setpoint(a,b);}

//---------------------------------------------------------------------------

// установка координат точки

void f_point::setpoint(float a, float b) {x=a; y=b;}

//---------------------------------------------------------------------------

#pragma package(smart_init)

 

2.Модуль f_circle

Заголовочный файлf_circle.h

#ifndef f_circleH

#define f_circleH

#include "f_point.h"

//Объявление класса f_circle

//---------------------------------------------------------------------------

class f_circle:public f_point

{

public:

//конструктор с умолчанием

f_circle(float r=0.0, float x=0.0, float y=0.0);

void setradius(float); //установка радиуса

virtual float getradius() const; //возвращение радиуса

float area() const; //вычисление площади

protected:

float radius; //радиус круга

};

#endif

 

Файл реализации f_circle.cpp

//---------------------------------------------------------------------------

#pragma hdrstop

#include "f_circle.h"

//Определения функций-элементов класса f_circle

//---------------------------------------------------------------------------

//конструктор f_circle вызывает конструктор f_point через //инициализатор элементов-координат, затем инициализирует радиус

f_circle::f_circle(float r,float a, float b)

:f_point(a,b)

{ radius=r;}

//---------------------------------------------------------------------------

//установка радиуса круга

void f_circle::setradius(float r) {radius=r;}

//---------------------------------------------------------------------------

//получение радиуса круга

float f_circle::getradius() const {return radius;}

//---------------------------------------------------------------------------

//вычисление площади круга

float f_circle::area() const

{return 3.14159*radius*radius;}

//---------------------------------------------------------------------------

#pragma package(smart_init)

 

3.Модуль f_cylinder

 

Заголовочный файлf_cylinder.h

#ifndef f_cylinderH

#define f_cylinderH

#include "f_circle.h"

//Объявление класса f_cylinder

//---------------------------------------------------------------------------

class f_cylinder:public f_circle

{

public:

//конструктор с умолчанием

f_cylinder (float h=0.0, float r=0.0,

float x=0.0, float y=0.0);

void setheight(float); //установка высоты

float getheight () const; //возвращение высоты

//вычисление и возвращение площади поверхности цилиндра

float area() const;

float volume() const; //вычисление и возвращение объема

protected:

float height; //высота цилиндра

};

#endif

 

Файл реализации f_cylinder.cpp

//---------------------------------------------------------------------------

#pragma hdrstop

#include "f_cylinder.h"

//Определения функций-элементов класса f_cylinder

//---------------------------------------------------------------------------

//Конструктор f_cylinder вызывает конструктор f_circle

f_cylinder::f_cylinder(float h, float r, float x, float y)

:f_circle (r,x,y) //вызов конструктора базового класса

{height=h;}

//---------------------------------------------------------------------------

//установка высоты цилиндра

void f_cylinder::setheight(float h) {height=h;}

//---------------------------------------------------------------------------

//получение высоты цилиндра

float f_cylinder::getheight() const {return height;}

//---------------------------------------------------------------------------

//вычисление и возвращение площади поверхности цилиндра

float f_cylinder::area() const

{

return 2*f_circle::area()+

2*3.14159*radius*height;

}

//---------------------------------------------------------------------------

//вычисление и возвращение объема цилиндра

float f_cylinder::volume() const

{return f_circle::area()*height;}

//---------------------------------------------------------------------------

#pragma package(smart_init)

 

Для второго варианта иерархии использованы следующие модули.

4.Модуль shape

 

Заголовочный файл shape.h

//---------------------------------------------------------------------------

// Объявление абстрактного базового класса shape

#ifndef shapeH

#define shapeH

class shape

{

public:

virtual float getX()const=0;

virtual float getY()const=0;

virtual float getradius()const {return 0.0;}

virtual float getheight()const {return 0.0;}

virtual float area()const {return 0.0;}

virtual float volume()const {return 0.0;}

};

//---------------------------------------------------------------------------

#endif

 

Файл реализации shape.cpp

//---------------------------------------------------------------------------

#pragma hdrstop

#include "shape.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

 

5.Модуль point

Заголовочный файл point.h

//Объявление класса point

#ifndef pointH

#define pointH

#include "shape.h"

//---------------------------------------------------------------------------

class point:public shape

{

public:

point(float=0, float=0);

void setpoint(float,float);

virtual float getX()const {return x;}

virtual float getY()const {return y;}

private:

float x,y;

};

#endif

 

Файл реализации point.cpp

//---------------------------------------------------------------------------

//Определения функций-элементов класса point

#pragma hdrstop

#include "point.h"

//---------------------------------------------------------------------------

point::point(float a, float b) {setpoint(a,b);}

//---------------------------------------------------------------------------

void point::setpoint(float a, float b)

{x=a; y=b;}

//---------------------------------------------------------------------------

#pragma package(smart_init)

 

6.Модуль circle

Заголовочный файл circle.h

//Объявление класса circle

#ifndef circleH

#define circleH

#include "point.h"

//---------------------------------------------------------------------------

class circle:public point

{

public:

circle(float r=0.0, float x=0.0, float y=0.0);

void setradius(float);

virtual float getradius()const;

virtual float area()const;

private:

float radius;

};

#endif

 

Файл реализации circle.cpp

//---------------------------------------------------------------------------

//Определения функций-элементов класса circle

#pragma hdrstop

#include "circle.h"

//---------------------------------------------------------------------------

circle::circle(float r, float a, float b)

:point(a,b) //вызов конструктора базового класса

{ radius = r>0?r:0; }

//---------------------------------------------------------------------------

void circle::setradius(float r) { radius = r>0?r:0; }

//---------------------------------------------------------------------------

float circle::getradius()const {return radius;}

//---------------------------------------------------------------------------

float circle::area()const {return 3.14159*radius*radius;}

//---------------------------------------------------------------------------

#pragma package(smart_init)

 

7.Модуль cylinder

Заголовочный файл cylinder.h

//Объявление класса cylinder

#ifndef cylinderH

#define cylinderH

#include "circle.h"

//---------------------------------------------------------------------------

class cylinder:public circle

{

public:

cylinder(float h=0.0, float r=0.0, float x=0.0, float y=0.0);

void setheight(float);

virtual float getheight () const;

virtual float area()const;

virtual float volume()const;

private:

float height;

};

#endif

 

Файл реализации cylinder.cpp

//---------------------------------------------------------------------------

//Определения функций-элементов класса cylinder

#pragma hdrstop

#include "cylinder.h"

//---------------------------------------------------------------------------

cylinder::cylinder(float h, float r, float x, float y)

:circle(r,x,y)

{ height = h>0?h:0; }

//---------------------------------------------------------------------------

void cylinder::setheight(float h) { height = h>0?h:0; }

//---------------------------------------------------------------------------

float cylinder::getheight() const {return height;}

//---------------------------------------------------------------------------

float cylinder::area()const

{

return 2*circle::area()+2*3.14159*circle::getradius()*height;

}

//---------------------------------------------------------------------------

float cylinder::volume()const { return circle::area()*height; }

//---------------------------------------------------------------------------

#pragma package(smart_init)

 

В нижеприведенных заголовочном файле модуля формы LR_9.h и форме с результатами выполнения задания (рис.9.1) можно получить информацию для размещения компонентов на форме.

//---------------------------------------------------------------------------

#ifndef LR_9H

#define LR_9H

//---------------------------------------------------------------------------

#include <Classes.hpp>

#include <Controls.hpp>

#include <StdCtrls.hpp>

#include <Forms.hpp>

#include <ExtCtrls.hpp>

//---------------------------------------------------------------------------

class TForm1 : public TForm

{

__published: // IDE-managed Components

TMemo *Memo1;

TMemo *Memo2;

TLabel *Label4;

TLabel *Label5;

TButton *Button1;

TGroupBox *GroupBox1;

TLabel *Label1;

TLabeledEdit *LabeledEdit1;

TLabeledEdit *LabeledEdit2;

TGroupBox *GroupBox2;

TLabel *Label2;

TLabeledEdit *LabeledEdit3;

TLabeledEdit *LabeledEdit4;

TLabeledEdit *LabeledEdit5;

TGroupBox *GroupBox3;

TLabeledEdit *LabeledEdit9;

TLabel *Label3;

TLabeledEdit *LabeledEdit6;

TLabeledEdit *LabeledEdit7;

TLabeledEdit *LabeledEdit8;

TButton *Button2;

TButton *Button3;

TButton *Button4;

TButton *Button5;

void __fastcall Button1Click(TObject *Sender);

void __fastcall Button2Click(TObject *Sender);

void __fastcall Button4Click(TObject *Sender);

void __fastcall Button3Click(TObject *Sender);

void __fastcall Button5Click(TObject *Sender);

private: // User declarations

public: // User declarations

__fastcall TForm1(TComponent* Owner);

};

//---------------------------------------------------------------------------

extern PACKAGE TForm1 *Form1;

//---------------------------------------------------------------------------

#endif

 

Рис.9.1 – форма с результатами выполнения задания

 

Перенесем на форму компоненты и зададим значения их свойствам. Со страницы Стандарт – три панели общего назначения GroupBox1,2,3( в свойство Caption впишите соответственно точка, круг, цилиндр), пять меток Label1,…,5(Captionкоординаты, координаты центра, координаты центра основания, без виртуальных функций, с виртуальными функциями), два компонента Memo1,2, пять кнопок Button1,…,5 (Captionвычислить, очистить, вычислить, очистить, выход), причем под меткой Label4 (без виртуальных функций) расположено окноMemo1и кнопки Button1,2(соответственно вычислить, очистить). Со страницы Дополнительно – девять окон редактирования с присоединенными к ним метками LabeledEdit1,…,9, причем первые два окна расположены на панели GroupBox1 (точка), следующие три - на панели GroupBox2 (круг), и последние четыре - на панели GroupBox3 (цилиндр).

В представленном ниже файле реализации модуля формы LR_9.cpp программа драйвер иерархии по варианту 1 расположена в обработчике щелчка на кпопке Button1(вычислить), а по варианту 2 – Button3(вычислить).

//---------------------------------------------------------------------------

 

#include <vcl.h>

#pragma hdrstop

 

#include "LR_9.h"

#include "f_cylinder.h"

#include "cylinder.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

#pragma resource "*.dfm"

TForm1 *Form1;

//---------------------------------------------------------------------------

__fastcall TForm1::TForm1(TComponent* Owner)

: TForm(Owner)

{

Memo1->Text="";

Memo2->Text="";

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button1Click(TObject *Sender)

{

float x1,y1,x2,y2,r1,x3,y3,r2,h;

x1=StrToFloat(LabeledEdit1->Text);

y1=StrToFloat(LabeledEdit2->Text);

x2=StrToFloat(LabeledEdit3->Text);

y2=StrToFloat(LabeledEdit4->Text);

r1=StrToFloat(LabeledEdit5->Text);

x3=StrToFloat(LabeledEdit6->Text);

y3=StrToFloat(LabeledEdit7->Text);

r2=StrToFloat(LabeledEdit8->Text);

h=StrToFloat(LabeledEdit9->Text);

f_point fp(x1,y1),*pfp;

f_circle fcir(r1,x2,y2), *pfcir;

f_cylinder fcyl(h,r2,x3,y3), *pfcyl;

Memo1->Lines->Add("отображение объектов по их именам");

Memo1->Lines->Add("");

Memo1->Lines->Add("точка");

Memo1->Lines->Add(

" x = "+FloatToStrF(fp.getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(fp.getY(),ffGeneral,5,3));

Memo1->Lines->Add("");

Memo1->Lines->Add("круг");

Memo1->Lines->Add(

" x = "+FloatToStrF(fcir.getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(fcir.getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(fcir.getradius(),ffGeneral,5,3));

Memo1->Lines->Add("площадь круга = "+

FloatToStrF(fcir.area(),ffGeneral,5,3));

Memo1->Lines->Add("");

Memo1->Lines->Add("цилиндр");

Memo1->Lines->Add(

" x = "+FloatToStrF(fcyl.getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(fcyl.getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(fcyl.getradius(),ffGeneral,5,3)+

" h = "+FloatToStrF(fcyl.getheight(),ffGeneral,5,3));

Memo1->Lines->Add("площадь поверхности цилиндра = "+

FloatToStrF(fcyl.area(),ffGeneral,5,3));

Memo1->Lines->Add("объем цилиндра = "+

FloatToStrF(fcyl.volume(),ffGeneral,5,3));

Memo1->Lines->Add("");

Memo1->Lines->Add(

"отображение объектов по указателю класса точка");

Memo1->Lines->Add("");

pfp=&fp;

Memo1->Lines->Add("точка");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfp->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfp->getY(),ffGeneral,5,3));

Memo1->Lines->Add("");

pfp=&fcir;

Memo1->Lines->Add("круг");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfp->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfp->getY(),ffGeneral,5,3));

Memo1->Lines->Add("");

pfp=&fcyl;

Memo1->Lines->Add("цилиндр");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfp->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfp->getY(),ffGeneral,5,3));

Memo1->Lines->Add("");

Memo1->Lines->Add(

"отображение объектов по указателю класса круг");

Memo1->Lines->Add("");

pfcir=&fcir;

Memo1->Lines->Add("круг");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfcir->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfcir->getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(pfcir->getradius(),ffGeneral,5,3));

Memo1->Lines->Add("площадь круга = "+

FloatToStrF(pfcir->area(),ffGeneral,5,3));

Memo1->Lines->Add("");

pfcir=&fcyl;

Memo1->Lines->Add("цилиндр");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfcir->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfcir->getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(pfcir->getradius(),ffGeneral,5,3));

Memo1->Lines->Add("площадь основания цилиндра = "+

FloatToStrF(pfcir->area(),ffGeneral,5,3));

Memo1->Lines->Add("");

Memo1->Lines->Add(

"отображение объектов по указателю класса цилиндр");

Memo1->Lines->Add("");

pfcyl=&fcyl;

Memo1->Lines->Add("цилиндр");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfcyl->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfcyl->getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(pfcyl->getradius(),ffGeneral,5,3)+

" h = "+FloatToStrF(pfcyl->getheight(),ffGeneral,5,3));

Memo1->Lines->Add("площадь поверхности цилиндра = "+

FloatToStrF(pfcyl->area(),ffGeneral,5,3));

Memo1->Lines->Add("объем цилиндра = "+

FloatToStrF(pfcyl->volume(),ffGeneral,5,3));

Memo1->Lines->Add("");

Memo1->Lines->Add(

"отображение объектов по указателю класса точка");

Memo1->Lines->Add(

"после приведения к типу указателя класса круг");

Memo1->Lines->Add("");

pfp=&fcir;

pfcir=(f_circle*)pfp;

Memo1->Lines->Add("круг");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfcir->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfcir->getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(pfcir->getradius(),ffGeneral,5,3));

Memo1->Lines->Add("площадь круга = "+

FloatToStrF(pfcir->area(),ffGeneral,5,3));

Memo1->Lines->Add("");

pfp=&fcyl;

pfcir=(f_circle*)pfp;

Memo1->Lines->Add("цилиндр");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfcir->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfcir->getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(pfcir->getradius(),ffGeneral,5,3));

Memo1->Lines->Add("площадь основания цилиндра = "+

FloatToStrF(pfcir->area(),ffGeneral,5,3));

Memo1->Lines->Add("");

Memo1->Lines->Add(

"отображение объектов по указателю класса точка");

Memo1->Lines->Add(

"после приведения к типу указателя класса цилиндр");

Memo1->Lines->Add("");

pfp=&fcyl;

pfcyl=(f_cylinder*)pfp;

Memo1->Lines->Add("цилиндр");

Memo1->Lines->Add(

" x = "+FloatToStrF(pfcyl->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(pfcyl->getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(pfcyl->getradius(),ffGeneral,5,3)+

" h = "+FloatToStrF(pfcyl->getheight(),ffGeneral,5,3));

Memo1->Lines->Add("площадь цилиндра = "+

FloatToStrF(pfcyl->area(),ffGeneral,5,3));

Memo1->Lines->Add("объем цилиндра = "+

FloatToStrF(pfcyl->volume(),ffGeneral,5,3));

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button2Click(TObject *Sender)

{

Memo1->Clear();

}

//---------------------------------------------------------------------------

 

void __fastcall TForm1::Button3Click(TObject *Sender)

{

float x1,y1,x2,y2,r1,x3,y3,r2,h;

x1=StrToFloat(LabeledEdit1->Text);

y1=StrToFloat(LabeledEdit2->Text);

x2=StrToFloat(LabeledEdit3->Text);

y2=StrToFloat(LabeledEdit4->Text);

r1=StrToFloat(LabeledEdit5->Text);

x3=StrToFloat(LabeledEdit6->Text);

y3=StrToFloat(LabeledEdit7->Text);

r2=StrToFloat(LabeledEdit8->Text);

h=StrToFloat(LabeledEdit9->Text);

shape *psh;

point p(x1,y1),*pp;

circle cir(r1,x2,y2),*pcir;

cylinder cyl(h,r2,x3,y3),*pcyl;

Memo2->Lines->Add(

"отображение объектов по их именам");

Memo2->Lines->Add("");

Memo2->Lines->Add("точка");

Memo2->Lines->Add(

" x = "+FloatToStrF(p.getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(p.getY(),ffGeneral,5,3));

Memo2->Lines->Add("");

Memo2->Lines->Add("круг");

Memo2->Lines->Add(

" x = "+FloatToStrF(cir.getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(cir.getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(cir.getradius(),ffGeneral,5,3));

Memo2->Lines->Add("площадь круга = "+

FloatToStrF(cir.area(),ffGeneral,5,3));

Memo2->Lines->Add("");

Memo2->Lines->Add("цилиндр");

Memo2->Lines->Add(

" x = "+FloatToStrF(cyl.getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(cyl.getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(cyl.getradius(),ffGeneral,5,3)+

" h = "+FloatToStrF(cyl.getheight(),ffGeneral,5,3));

Memo2->Lines->Add("площадь поверхности цилиндра = "+

FloatToStrF(cyl.area(),ffGeneral,5,3));

Memo2->Lines->Add("объем цилиндра = "+

FloatToStrF(cyl.volume(),ffGeneral,5,3));

Memo2->Lines->Add("");

Memo2->Lines->Add("отображение объектов по указателю");

Memo2->Lines->Add("абстрактного базового класса форма");

Memo2->Lines->Add("");

Memo2->Lines->Add("точка");

psh=&p;

Memo2->Lines->Add(

" x = "+FloatToStrF(psh->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(psh->getY(),ffGeneral,5,3));

Memo2->Lines->Add("");

Memo2->Lines->Add("круг");

psh=&cir;

Memo2->Lines->Add(

" x = "+FloatToStrF(psh->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(psh->getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(psh->getradius(),ffGeneral,5,3));

Memo2->Lines->Add("площадь круга = "+

FloatToStrF(psh->area(),ffGeneral,5,3));

Memo2->Lines->Add("");

Memo2->Lines->Add("цилиндр");

psh=&cyl;

Memo2->Lines->Add(

" x = "+FloatToStrF(psh->getX(),ffGeneral,5,3)+

" y = "+FloatToStrF(psh->getY(),ffGeneral,5,3)+

" r = "+FloatToStrF(psh->getradius(),ffGeneral,5,3)+

" h = "+FloatToStrF(psh->getheight(),ffGeneral,5,3));

Memo2->Lines->Add("площадь поверхности цилиндра = "+

FloatToStrF(psh->area(),ffGeneral,5,3));

Memo2->Lines->Add("объем цилиндра = "+

FloatToStrF(psh->volume(),ffGeneral,5,3));

}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button4Click(TObject *Sender)

{Memo2->Clear();}

//---------------------------------------------------------------------------

void __fastcall TForm1::Button5Click(TObject *Sender)

{ exit(0); }

//---------------------------------------------------------------------------



Дата добавления: 2020-10-14; просмотров: 381;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.101 сек.