第9单元 - 作业2:OJ编程 - 修改附属类,重载加减法运算符
温馨提示:
1.本次作业属于Online Judge题目,提交后由系统即时判分。
2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩。
练习运算符重载
完善复数的输出显示
依照学术诚信条款,我保证此作业是本人独立完成的。
1
练习运算符重载(5分)
本作业是对作业2的修订:请勿在作业2中提交作业,请在本作业中提交作业2的程序
具体内容,参见 【第9单元 - 作业2说明:【OJ - 修改复数类,重载加减法运算符】】
时间限制:500ms内存限制:32000kb
#include <iostream>
#include <cstdlib>
#include <limits>
#include <iomanip>
#include <cmath>
using namespace std;
class MyComplex//2. 创建一个类 MyComplex,用来表示复数。
{
public:
MyComplex();
MyComplex(double a, double b);
friend ostream& operator <<(ostream& os, const MyComplex& z);//4. 重载流插入运算符 << ,使之可以将复数输出为如下的格式(实部如果是非负数,则不输出符号位;输出时要包含半角左右小括号):
friend istream& operator >> (istream& is, MyComplex& z);//3. 重载流提取运算符 >> ,使之可以读入以下格式的输入(两个数值之间使用空白分隔),将第一个数值存为复数的实部,将第二个数值存为复数的虚部:
MyComplex operator+(const MyComplex &secondMyComplex);//加法法则:(a+bi)+(c+di)=(a+c)+(b+d)i;
MyComplex operator-(const MyComplex &secondMyComplex);//减法法则:(a+bi)-(c+di)=(a-c)+(b-d)i;
MyComplex operator*(const MyComplex &secondMyComplex);//乘法法则:(a+bi)·(c+di)=(ac-bd)+(bc+ad)i;
MyComplex operator/(const MyComplex &secondMyComplex);//除法法则:(a+bi)÷(c+di)=[(ac+bd)/(c²+d²)]+[(bc-ad)/(c²+d²)]i.
private:
double a_;
double b_;
};
MyComplex::MyComplex()
{
}
MyComplex::MyComplex(double a, double b)
{
a_ = a;
b_ = b;
}
ostream & operator<<(ostream & os, const MyComplex & z)//4. 重载流插入运算符 << ,使之可以将复数输出为如下的格式(实部如果是非负数,则不输出符号位;输出时要包含半角左右小括号):
{
// TODO: 在此处插入 return 语句
os.unsetf(std::ios::showpos);
os << "(" << z.a_;
os.setf(std::ios::showpos);
os << z.b_ << "i)";
return os;
}
istream & operator >> (istream & is, MyComplex & z)//3. 重载流提取运算符 >> ,使之可以读入以下格式的输入(两个数值之间使用空白分隔),将第一个数值存为复数的实部,将第二个数值存为复数的虚部:
{
// TODO: 在此处插入 return 语句
is >> z.a_ >> z.b_;
return is;
}
MyComplex MyComplex::operator+(const MyComplex & secondMyComplex)//加法法则:(a+bi)+(c+di)=(a+c)+(b+d)i;
{
return MyComplex(a_ + secondMyComplex.a_, b_ + secondMyComplex.b_);
}
MyComplex MyComplex::operator-(const MyComplex & secondMyComplex)//减法法则:(a+bi)-(c+di)=(a-c)+(b-d)i;
{
return MyComplex(a_ - secondMyComplex.a_, b_ - secondMyComplex.b_);
}
MyComplex MyComplex::operator*(const MyComplex & secondMyComplex)//乘法法则:(a+bi)·(c+di)=(ac-bd)+(bc+ad)i;
{
return MyComplex(a_ * secondMyComplex.a_ - b_ * secondMyComplex.b_, secondMyComplex.a_ * b_ + a_ * secondMyComplex.b_);
}
MyComplex MyComplex::operator/(const MyComplex & secondMyComplex)//除法法则:(a+bi)÷(c+di)=[(ac+bd)/(c²+d²)]+[(bc-ad)/(c²+d²)]i.
{
if (pow(secondMyComplex.a_, 2) + pow(secondMyComplex.b_, 2) == 0)//2. 在做除法时,如果除数是0,则输出一条信息:“Divisor can not be 0” (注意:请精确复制这段信息,否则即便你的程序逻辑正确,OJ系统仍然会判你失败。输出信息中不包含引号)然后结束程序(调用 exit() 函数),直接退出(注意,传递给操作系统的返回值与main函数正常结束时相同,仍然为0)。
{
cout << "Divisor can not be 0";
exit(0);
}
return MyComplex((a_ * secondMyComplex.a_ + b_ * secondMyComplex.b_) / (pow(secondMyComplex.a_, 2) + pow(secondMyComplex.b_, 2)), (b_ * secondMyComplex.a_ - a_ * secondMyComplex.b_) / (pow(secondMyComplex.a_, 2) + pow(secondMyComplex.b_, 2)));
}
int main() {
MyComplex z1, z2;
cin >> z1;
cin >> z2;
cout << "z1 + z2 = " << z1 + z2 << endl;
cout << "z1 - z2 + z1 = " << z1 - z2 + z1 << endl;
cout << "z1 * z2 - z1 = " << z1 * z2 - z1 << endl;
cout << "z1 / z2 + z1 = " << z1 / z2 + z1 << endl;
cout << "z2 - z1 / z1 = " << z2 - z1 / z1;
// GCC及VC编译器在调试模式下会暂停,便于查看运行结果
#if ( defined(__DEBUG__) || defined(_DEBUG) )
cin.ignore(numeric_limits<streamsize>::max(), '\n');
cin.get();
#endif
return 0;
}