C++高手请进

现有两个C++题目,由于我最近忙于其他事情,没有时间去上机编译完成,所以请高手能帮一下忙,时间紧急,最好能是已经上机调试过了的(这样我就不必再自己耗费太多的时间了)。谢谢... 现有两个C++题目,由于我最近忙于其他事情,没有时间去上机编译完成,所以请高手能帮一下忙,时间紧急,最好能
是已经上机调试过了的(这样我就不必再自己耗费太多的时间了)。谢谢了!!!

第一题
#include <iostream.h>
int gcd(int m,int n)//返还m和n的最大公约数
{if(m<n) swap(m,n);//库函数swap()用来交换m和n的值
while (n>0){int r=m%n;m=n;n=r;}
return m;
}
class Ratio
{public:
Ratio (int n=0,int d=1):num(n),den(d)
{cout <<"普通构造函数被调用!\n";reduce();}
Ratio(Ratio&r):num(r.num),den(r.den)//拷贝构造函数
{cout<<"拷贝构造函数被调用!\n";}
void disp()//输出有理数
{cout<<num<<'/'<<den<<endl;}
private :
int num,den;
void reduce();
};
void Ratio::reduce()//对有理数进行简化或规则化
{if (num==0 || den==0){num=0 ; den=0;return;}
if (den<0){den*=-1;num*=-1;}
if (den==1)return;
int sgn=(num<0?-1:1);
int g=gcd(sgn*num,den);
num/=g;den/=g;//对分数进行约分
}
Ratio func(Ratio r)//初始化形参时调用拷贝构造函数
{Ratio s=r;
cout<<"func()函数被调用!\n";
//s.den=6;//错误,den是私有类作用域变量,在类外不能访问
cout<<"s现在存在,s是:";s.disp();
return s;
}
int main()
{Ratio x(20,7);
cout<<"x现在存在,x是:";x.disp();
{Ratio y(x);
cout<<"y现在存在,y是:";y.disp();
}
cout<<"func()函数开始:"<<endl;
func(x);
cout<<"func()函数结束."<<endl;
{Ratio z(x);
cout<<"z现在存在,z是:";
z.disp();
}
return 0;
}
改写上述所述的程序,让fun()函数仍然作为类Ratio的友元函数,将声明语句改写为
friend Ratio func(Ratio &r);
同时将fun()函数改写成如下程序段:
Ratio func(Ratio &r)
{Ratio&s=t;
cout<<"fun()含函数被调用!\n";
s.den=6;
cout<<"s现在存在,s是:";s.disp();
return s;
}
编译并运行修改过的程序,比较输出结果,与上述源程序的不同,体会对象引用的作用。

第二题
定义一个Triangle类来描述三角形,使用point类的对象来表示端点,point类的定义如下:
Class point//定义point类
{public:
Point(double nx=0.0,double ny=0.0):x(nx),y(ny){}
Point(point&np):x(np.x),y(np){}
double GetX(){return x;}
double GetY(){return y;}
void SetX(double nx){x=nx;}
void SetY(double ny){x=ny;}
void SetPoint(double nx,double ny){x=nx;y=ny;}
void SetPoint(Point &np){x=np.x;y=np.y;}
private:
double x ,y;
};
在triangle类中包括point类的3个对象p1,p2,p3,作为数据成员。Triangle类具有计算三角形的功能,计算过程在成员函数getperimeter中实现。
展开
 我来答
jaycnvip
2009-04-30 · TA获得超过767个赞
知道小有建树答主
回答量:998
采纳率:100%
帮助的人:697万
展开全部
第一题
int gcd(int m,int n)//返还m和n的最大公约数
{
if(m<n)
swap(m,n);//库函数swap()用来交换m和n的值
while (n>0)
{
int r=m%n;
m=n;
n=r;
}
return m;
}

class Ratio
{
public:
Ratio (int n=0,int d=1):num(n),den(d)
{
cout <<"普通构造函数被调用!\n";
reduce();
}
Ratio(Ratio&r):num(r.num),den(r.den)//拷贝构造函数
{
cout<<"拷贝构造函数被调用!\n";
}
friend Ratio func(Ratio &r);
void disp()//输出有理数
{
cout<<num<<'/'<<den<<endl;
}
private :
int num,den;
void reduce();
};

void Ratio::reduce()//对有理数进行简化或规则化
{
if (num==0 || den==0)
{
num=0 ;
den=0;
return;
}
if (den<0)
{
den*=-1;
num*=-1;
}
if (den==1)
return;
int sgn=(num<0?-1:1);
int g=gcd(sgn*num,den);
num/=g;
den/=g;//对分数进行约分
}

Ratio func(Ratio &r)
{
Ratio&s = r;
cout<<"fun()含函数被调用!\n";
s.den=6;
cout<<"s现在存在,s是:";s.disp();
return s;
}

int main()
{
Ratio x(20,7);
cout<<"x现在存在,x是:";
x.disp();

Ratio y(x);
cout<<"y现在存在,y是:";
y.disp();
cout<<"func()函数开始:"<<endl;

func(x);
cout<<"func()函数结束."<<endl;

Ratio z(x);
cout<<"z现在存在,z是:";
z.disp();

return 0;
}

第二题
class Point//定义point类
{
public:
Point(double nx=0.0,double ny=0.0):x(nx),y(ny){}
Point(Point&np):x(np.x),y(np.y){}
double GetX(){return x;}
double GetY(){return y;}
void SetX(double nx){x=nx;}
void SetY(double ny){x=ny;}
void SetPoint(double nx,double ny){x=nx;y=ny;}
void SetPoint(Point &np){x=np.x;y=np.y;}
private:
double x ,y;
};

class Triangle
{
public:
Triangle(Point pa,Point pb,Point pc):p1(pa),p2(pb),p3(pc){}
Triangle(Triangle& RTriangle):p1(RTriangle.p1),p2(RTriangle.p2),p3(RTriangle.p3){}
double getperimeter() //计算三角形面积
{
//√{1/4[c^2a^2-((c^2+a^2-b^2)/2)^2]}
double a2 = pow(abs(p1.GetX()-p2.GetX()),2)+pow(abs(p1.GetY()-p2.GetY()),2);//边长 a 的平方
double b2 = pow(abs(p2.GetX()-p3.GetX()),2)+pow(abs(p2.GetY()-p3.GetY()),2);//边长 b 的平方
double c2 = pow(abs(p1.GetX()-p3.GetX()),2)+pow(abs(p1.GetY()-p3.GetY()),2);//边长 c 的平方
double re = 1/4.0*(a2*c2 - pow((c2+a2-b2)/2,2));
return pow(re,0.5);
}
private:
Point p1,p2,p3;
};

void main(){
Point p1(2,3),p2(30,60),p3(20,50);
Triangle t1(p1,p2,p3);
cout<<t1.getperimeter()<<"\n";
}
wanfustudio
2009-04-29 · TA获得超过1万个赞
知道大有可为答主
回答量:5513
采纳率:100%
帮助的人:4163万
展开全部
1.《形参》
说明在参数传入的过程中创建了临时对象,而如果形参是引用类型,则不对再对参数创建拷贝。
《定义初始化》
定义对象时候,如果采用其他对象赋值的形式,实际上对调用拷贝构造函数(如果没有重载=),如果定义为引用类型,则不会再调用拷贝构造函数。
《返回值》
如果返回值为该对象类型,函数也将为返回值创建临时对象,而当返回值为引用类型时候,不会为返回值创建临时对象

总结,当一个对象在传参,构造以及返回的时候,都可能会产生副本,为了避免这种情况,我们可以采用引用类型来避免创建临时变量

#include <iostream>
using namespace std;

class Point//定义point类
{
public:
Point(double nx=0.0,double ny=0.0):x(nx),y(ny){}
Point(Point&np):x(np.x),y(np.y){}
double GetX(){return x;}
double GetY(){return y;}
void SetX(double nx){x=nx;}
void SetY(double ny){x=ny;}
void SetPoint(double nx,double ny){x=nx;y=ny;}
void SetPoint(Point &np){x=np.x;y=np.y;}
private:
double x ,y;
};

class Triangle:public Point
{
public:
Triangle(double x1,double y1,double x2,double y2,double x3,double y3)
:p1(x1,y1),p2(x2,y2),p3(x3,y3)
{}
double getperimeter()
{
//返回3个变长的和就行了。
//变长有距离公式,(x-x2)方+ (y-y2)方,开根号
return 0;
}
private:
Point p1,p2,p3;
};

int main()
{
Triangle t(1,1, 3,1, 2,2);

return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式