小说章节收费网站建设,界面设计属于什么专业,网站定位方案,网站电脑端和手机端目录
一、题目
二、代码
三、算法分析
#xff08;一#xff09;数学表达式
#xff08;二#xff09; 代码实现
一#xff09;运算符重载函数
二#xff09;优化函数#xff08;实现有理数约分#xff09; 一、题目
通过运算符重载为类的成员函数来实现两个有…目录
一、题目
二、代码
三、算法分析
一数学表达式
二 代码实现
一运算符重载函数
二优化函数实现有理数约分 一、题目
通过运算符重载为类的成员函数来实现两个有理数对象的加减乘除运算
有理数是一个可以化为分数的数如2/3533/920,都是有理数而根号2、Π等就为无理数。
在C中并没有预先定义有理数需要时可以声明一个有理数类将有理数的分子和分母分别存放在nume和deno变量中对有理数的各种操作都可以用重载运算符来实现。可以写一个优化函数optimize它的作用时使有理数约去公分母也就是说使保存的有理数分子和分母之间没有公约数除1以外。在创建有理数对象时才能执行它在执行各种运算之后也能执行它从而保证所存储的有理数都是最优的。
二、代码
#includeiostream
using namespace std;
#includecmathclass Rational //定义有理数类
{public:Rational(int x0,int y1); //类的构造函数void print(); //打印出有理数Rational operator(Rational a); //类的运算符重载函数成员函数实现有理数加法private:int nume; //分子int deno; //分母void optimize(); //优化函数实现对有理数的约分
};
void Rational::optimize() //优化函数实现对有理数的约分
{int gcd,i; //gcd存放分子和分母较大的一个i记录更新的公约数if(nume0) //①如果分子为0则分母置1返回约分结束{deno1;return;}//②分子不为0继续约分操作gcd(abs(nume)abs(deno)?abs(nume):abs(deno)); //gcd为分子和分母中较大的一个if(gcd0) //若为0则无需约分返回结束约分操作return ;for(igcd;i1;i--) //for循环从gcd开始逐次-1判断是否为公约数找到一个即返回最大公约数{if((nume%i0)(deno%i)0) //判断是否为公约数break;}nume/i; //根据找到的最大公约数更新分子和分母deno/i;if(nume0deno0) //若分子分母同为负数则结果为正所以均改为正{nume-nume;deno-deno;}else if(nume0||deno0) //若分子分母中有一个为负则结果为负分子调整为负分母调整为正{nume-abs(nume);denoabs(deno);}
}
Rational::Rational(int x,int y) //构造函数的定义同时调用优化函数对有理数继续约分
{numex;denoy;optimize();
}
void Rational::print() //打印有理数
{coutnume;if(nume!NULL) //①分子不为0cout/denoendl;else //②分子为0coutendl;
}
//函数返回的不是引用类型因为不可以作为左值
Rational Rational::operator(Rational a) //运算符重载函数实现类用户自定义的数据类型的加法运算
{Rational r; //定义一个临时变量自动调用类的构造函数占有栈区程序结束后系统自动调用析构函数释放内存r.denoa.deno*deno;r.numea.nume*denoa.deno*nume;r.optimize(); //运算完也需要约分return r;
}
int main()
{Rational r1(3,14),r2(4,14),r3;r1.print();r2.print();r3r1r2;r3.print();return 0;
}三、算法分析
有理数相加
一数学表达式 当两个有理数 和相加时可得到这样的算式 分子分母分开存放 分子a*db*c 分母b*d 运算完毕后需要对词有理数继续优化 此操作可通过重载运算符“”实现。 二 代码实现
一运算符重载函数
代码 Rational Rational::operator(Rational a) //运算符重载函数实现类用户自定义的数据类型的加法运算 { Rational r; //定义一个临时变量自动调用类的构造函数占有栈区程序结束后系统自动调用析构函数释放内存 r.denoa.deno*deno; r.numea.nume*denoa.deno*nume; r.optimize(); //运算完也需要约分 return r; } 分析 重载了运算符后在进行有理数运算时只需像基本类型的运算一样书写即可这样给用户带来了很大的方便并且很直观。 r3r1r2 执行时C可以解释为 r3r1.operator(r2) 由此可以看出C系统在处理算术表达式“r1r2”时把对表达式的处理自动转化为对成员运算符重载函数operator的调用r1.operator(r2)通过“”运算符左边的对象去调用operator“”右边的对象作为函数调用的实参。 这样双目运算符左边的对象就由系统通过this指针隐含地传递给operator函数。因此如果将双目运算符函数重载为类的成员函数其参数表只需写一个形参就可以了。 但必须要求运算表达式第一个参数运算符左边的操作数是一个类对象。而且与运算符函数的返回类型相同。这是因为必须通过类的对象去调用该类的成员函数而且只要运算符重载函数返回值与改对象同类型运算才有意义。 二优化函数实现有理数约分
代码 void Rational::optimize() //优化函数实现对有理数的约分 { int gcd,i; //gcd存放分子和分母较大的一个i记录更新的公约数 if(nume0) //①如果分子为0则分母置1返回约分结束 { deno1; return; } //②分子不为0继续约分操作 gcd(abs(nume)abs(deno)?abs(nume):abs(deno)); //gcd为分子和分母中较大的一个 if(gcd0) //若为0则无需约分返回结束约分操作 return ; for(igcd;i1;i--) //for循环从gcd开始逐次-1判断是否为公约数找到一个即返回最大公约数 { if((nume%i0)(deno%i)0) //判断是否为公约数 break; } nume/i; //根据找到的最大公约数更新分子和分母 deno/i; if(nume0deno0) //若分子分母同为负数则结果为正所以均改为正 { nume-nume; deno-deno; } else if(nume0||deno0) //若分子分母中有一个为负则结果为负分子调整为负分母调整为正 { nume-abs(nume); denoabs(deno); } } 分析 寻找最大公约数的步骤 ①初始最大公约数gcd gcd(abs(nume)abs(deno)?abs(nume):abs(deno)); //gcd为分子和分母中较大的一个 ② 判断是否为公约数 for(igcd;i1;i--) //for循环从gcd开始逐次-1判断是否为公约数找到一个即返回最大公约数 { if((nume%i0)(deno%i)0) //判断是否为公约数 break; }