类名
point
备注
成员函数
point (int zx=0,int zy=0);//构造函数
构造函数
point (point &p);//拷贝构造函数
拷贝构造函数
~point();//析构函数
析构函数
void psetvalue (int zx,int zy);//设置函数
设置横纵坐标函数
int getx();//横坐标提取函数
横坐标提取函数
int gety();//纵坐标提取函数
纵坐标提取函数
friend class tri;
友元类
成员变量
int mx,my;
横纵坐标
类名
tri
备注
成员函数
tri( point &zp1, point &zp2, point &zp3);//构造函数
构造函数
tri(int x1=0,int y1=0,int x2=0,int y2=0,int x3=0,int y3=0) {}
构造函数
tri(tri &p);//拷贝构造函数
拷贝构造函数
~tri ();//析构函数
析构函数
void tsetvalue ( point &zp1, point &zp2, point &zp3);//设置函数
赋值函数
double area ();//面积计算函数
面积计算函数
成员变量
point marray[3];
点类的对象数组
point (int zx=0,int zy=0);//构造函数 构造函数,支持缺省赋值
point (point &p);//拷贝构造函数 用于拷贝构造函数
~point();//析构函数 输出赋值的结构,便于观察调用顺序
void psetvalue (int zx,int zy);//设置函数 设置函数中的横纵坐标
int getx();//横坐标提取函数 将函数的横坐标返回
int gety();//纵坐标提取函数 将函数的纵坐标返回
tri( point &zp1, point &zp2, point &zp3);//构造函数
tri(int x1=0,int y1=0,int x2=0,int y2=0,int x3=0,int y3=0)
{}
tri(tri &p);//拷贝构造函数
~tri ();//析构函数 析构函数,显示调用顺序
void tsetvalue ( point &zp1, point &zp2, point &zp3);//设置函数 设置函数,将三个点类输入
double area ();//面积计算函数 利用tarea=0.5*(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2);公式将三角形的面积计算出来
由声明头文件point.h和tri.h、实现源程序文件point.cpp、tri.cpp和运算例程main.cpp组成。
#ifndef POINT
#define POINT
class tri;
class
point
{
int mx,my;
public:
point (int zx=0,int zy=0);//构造函数
point (point &p);//拷贝构造函数
~point();//析构函数
void psetvalue (int zx,int zy);//设置函数
int getx();//横坐标提取函数
int gety();//纵坐标提取函数
friend class tri;
};
#endif // !POINT
#ifndef TRI
#define TRI
#include"point.h"
class tri
{
point marray[3];
public:
tri( const point &zp1, const point &zp2,const point &zp3);//构造函数
tri(int x1=0,int y1=0,int x2=0,int y2=0,int x3=0,int y3=0)
{}
tri(tri &p);//拷贝构造函数
~tri ();//析构函数
void tsetvalue (const point &zp1,const point &zp2,const point &zp3);//设置函数
double area ();//面积计算函数
};
#endif
#include
#include
#include"point.h"
#include"tri.h"
using namespace std;
point::point(int zx,int zy)//构造函数
{
mx=zx;
my=zy;
}
point::point(point &p)//拷贝构造函数
{
mx=p.mx;
my=p.my;
}
point::~point()//析构函数
{
cout<
}
void point::psetvalue(int zx,int zy)//point赋值函数
{
mx=zx;
my=zy;
}
int point::getx()//横坐标提取函数 //在此次试验中没有作用
{
return mx;
}
int point ::gety()//纵坐标提取函数 //在此次试验中没有作用
{
return my;
}
#include
#include
#include"point.h"
#include"tri.h"
using namespace std;
tri::tri( const point &zp1,const point &zp2,const point &zp3)//构造函数
{
marray[0]=zp1;
marray[1]=zp2;
marray[2]=zp3;
}
tri::tri(tri &p)//拷贝构造函数
{
marray[0]=p.marray[0];
marray[1]=p.marray[1];
marray[2]=p.marray[2];
}
tri::~tri()//析构函数
{
cout <<"析构函数 tri"<< endl;
}
void tri::tsetvalue(const point &zp1,const point &zp2,const point &zp3)//设置赋值函数
{
marray[0]=zp1;
marray[1]=zp2;
marray[2]=zp3;
}
double tri ::area()//面积计算函数
{
double tarea ;
double x1,x2,x3,y1,y2,y3;
x1=marray[0].mx;
x2=marray[1].mx;
x3=marray[2].mx;
y1=marray[0].my;
y2=marray[1].my;
y3=marray[2].my;
tarea=0.5*(x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2);//此处可以将上述的marray[i].mx/my直接带入,但是为了简洁,不带入
return fabs(tarea);//取绝对值
}
#include"point.h"
#include "tri.h"
#include
#include
#include
using namespace std;
int main()
{
int a,b;
for(;1;)
{
cout<<"请输入第一个点的坐标"<
cin>>a>>b;
point zp1(a,b);
cout<<"请输入第二个点的坐标"<
cin>>a>>b;
point zp2(a,b);
cout<<"请输入第三个点的坐标"<
cin>>a>>b;
point zp3(a,b);
tri mtri;
mtri.tsetvalue(zp1,zp2,zp3);
cout<<"the area is "<
}
system("pause");
return 0;
}
输入三个点的坐标为(0,0)(0,1)(1,0),输出面积为0.5
输入三个点的坐标为(0,0)(0,2)(2,0),输出面积为2
输入三个点的坐标为(0,0)(0,3)(3,0),输出面积为4.5
全部计算正确
思路清晰,简单易懂,在main函数中加入判断循环while,通过用户的输入,判断是否计算。
你所发现的同学程序问题:
可能有重复编译的情况,应该加上#ifndef……#define……#endif
知道了友元类的使用方法,明白了友元类的“好处”,是我们能直接进入数据中,但是正如老师所说的,这是与c++的思想相悖的,所以要尽量的少使用。