Коды классов, функций и обработчиков событий
Сохраните модуль главной формы под именем 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=○
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; просмотров: 373;