• 网易云课堂_C++程序设计入门(下)_第9单元:白公曾咏牡丹芳,一种鲜妍独“异常”_第9单元


    第9单元 - 作业3:OJ编程 - 使用异常进行复数运算的错误处理

    �返回
     

    温馨提示:

    1.本次作业属于Online Judge题目,提交后由系统即时判分。

    2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩。

    在复数的运算中,练习异常处理

    依照学术诚信条款,我保证此作业是本人独立完成的。

    1
    通过C++内建的异常类,处理复数除法中除数为0 的问题(5分)
    时间限制:500ms内存限制:32000kb
     
    #include <iostream>
    #include <exception>
    #include <stdexcept>
    #include <limits>
    #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.
    {
    	//1. 在【本单元作业2】的基础上,修改相关代码。在做除法运算时,如果作为除数的复数z是0,则抛出一个runtime_error类型的异常
    	//2. 在该runtime_error类型的异常对象中,存储着错误信息“Divisor is 0”(注意:请精确复制这段信息,否则即便你的程序逻辑正确,OJ系统仍然会判你失败。输出信息中不包含引号)。该错误信息可以通过runtime_error类的构造函数存入runtime_error对象中。
    
    	if (pow(secondMyComplex.a_, 2) + pow(secondMyComplex.b_, 2) == 0)//2. 在做除法时,如果除数是0,则输出一条信息:“Divisor can not be 0” (注意:请精确复制这段信息,否则即便你的程序逻辑正确,OJ系统仍然会判你失败。输出信息中不包含引号)然后结束程序(调用 exit() 函数),直接退出(注意,传递给操作系统的返回值与main函数正常结束时相同,仍然为0)。
    	{
    		throw runtime_error("Divisor is 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() { // 不可修改main函数中的代码,否则OJ将给你的程序打0分
    	MyComplex z1, z2;
    	cin >> z1;
    	cin >> z2;
    	try {
    		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 << endl;
    		cout << "Finished";
    	}
    	catch (exception& e) {         // catch父类异常类型,也可以捕获子类异常
    		cout << e.what() << endl;  // waht()函数将存放在异常对象中的信息取出来
    		cout << "Unexpected Error";
    	}
    	// GCC及VC编译器在调试模式下会暂停,便于查看运行结果
    #if ( defined(__DEBUG__) || defined(_DEBUG) )
    	cin.ignore(numeric_limits<streamsize>::max(), '
    ');
    	cin.get();
    #endif
    	return 0;
    }
    
  • 相关阅读:
    初识云计算:历史、服务、架构
    云计算术语扫盲
    什么是 VxLAN?
    Linux用户态与内核态通信的几种方式
    Linux 命令多到记不住?这个开源项目帮你一网打尽!
    云计算时代,数据中心架构三层到大二层的演变
    Linux网络命令必知必会之瑞士军刀 nc(netcat)
    Docker 网络模型之 macvlan 详解,图解,实验完整
    基于alpine构建镜像报错temporary error (try again later)?
    win7环境下,vagrant,在启动虚拟机的时候报错io.rb:32:in `encode': incomplete "xC8" on GBK (Encoding::InvalidByteSequenceError)
  • 原文地址:https://www.cnblogs.com/denggelin/p/7136720.html
Copyright © 2020-2023  润新知