C++primer第五版 读取两个整数,输出相除结果。当第二个数是0时抛出异常,使用try语句去捕获异常。catch子句应该为用户输出一条提示信息,询问其是否输入新数并执行try语句块内容。

该题目主要是为了练习try-throw-catch语句的使用。

首先讲一点理论知识。C++处理异常的机制是由3个部分组成的,即检查(try)、抛出(throw)和捕捉(catch) 。把需要检查的语句放在try块中,throw用来当出现异常时抛出一个异常信息,而catch则用来捕捉异常信息,如果捕捉到了异常信息,就处理它。

总结一下如何进行异常处理:

①把可能出现异常的、需要检查的语句或程序段放在try后面的花括号中;

②程序开始运行后,按正常的顺序执行到try块,开始执行try块中花括号内的语句。如果在执行try块内的语句过程中没有发生异常,则catch子句不起作用,流程转到catch子句后面的语句继续执行;

③如果在执行try块内的语句过程中发生异常,则throw运算符抛出一个异常信息,throw抛出什么样的数据由程序设计者自定,可以是任意类型的数据(包括自定义类型数据,如类对象)。

④catch块是try-catch结构中的一部分,必须紧跟在try块之后,不能单独使用,在二者之间也不能插入其他语句;

⑤在一个try-catch结构中,可以只有try块而无catch块;一个try-catch结构中只能有一个try块,但是可以又多个catch块,以便与不同的异常信息匹配;

⑥try和catch块中必须有用花括号括起来的复合语句,即使花括号内只有一个语句,也不能省略花括号;

⑦catch后面的圆括号中,一般只写异常信息的类型名。

附上代码:

// primer_5_6_3.cpp : Defines the entry point for the application.
// 编写一段程序,从标准输入读取两个整数,输出第一个数除以第二个数的结果
// 当第二个数是0时抛出异常,使用try语句去捕获异常
// catch子句应该为用户输出一条提示信息,询问其是否输入新数并执行try语句块内容

#include "stdafx.h"
#include<iostream>
using namespace std;

int main()
{
	int a,b;
	double result;
	cout << "input the divider and dividend: " << endl;
	while(cin >> a >> b)
	{
		try  //将需要被检查的内容放进try语句内
		{
	    	if(b==0)
	    		throw(b);  //抛出异常
		}
    	catch(int)  //catch后的括号内一般只写异常信息的类型名,因为抛出的b为int类型,因此此括号内填入int
		{
	    	cout << "wrong! the dividend is 0." << endl;  //告诉用户被除数为0
	    	cout << "try again? enter y or n." << endl;  //问用户是否要重新输入
			char c;  //定义一个字符变量,用来接收用户命令,y或者n
			cin >> c;  //接收用户输入的命令字符
			if(c=='y')  //如果用户输入y
			{
		    	cout << "input the divider and dividend: " << endl;  //输出提示语
				continue;  //跳过下面while循环内的语句,重新执行while循环
			}
			if(c=='n')  //如果用户输入n
				break;  //退出while循环
		}
		result = double(a)/double(b);  //计算除法结果
		cout << a << '/' << b << " = " << result << endl;  //输出结果
		cout << "input the divider and dividend: " << endl;  //作为while条件语句的提示语
	}
	cout << "exit!" << endl;  
	system("pause");
	return 0;
}

思路不难,注释也比较详细,不过result = double(a)/double(b);可能不太理解为什么要用强制转换。因为题目要求的是输入整数,但是做除法的时候如果是整数相除,那么得到的就会是整数部分结果,例如 4/5,结果就是0。因此为了满足题目要求,且结果比较准确,做除法的时候将除数和被除数强制转换成了double类型。

也顺带熟悉一下continue和break的使用。这里再介绍一下这两个语句:

continue:终止最近的循环中的当前迭代并立即开始下一次迭代。continue语句只能出现在for、while和do while循环的内部,或者嵌套在此类循环里的语句或块的内部。

break:负责终止离他最近的while、do while、for或switch语句,并从这些语句之后的第一条语句开始继续执行。注意,break语句只能出现在迭代语句或者switch语句内部。

最后,程序运行效果如下:

尝试了三种情况:

①除数和被除数均满足条件;

②被除数为0,继续输入;

③被除数为0,不继续输入;

针对这三种情况,程序均给出了正确的反应。

不过,真实情况远不止这么简单,用户或许会输入小数、字母等等非int数据,因此我们需要考虑到用户的各种非法输入并准备多个catch子句来处理相应情况,有兴趣的可以改进程序。

猜你喜欢

转载自blog.csdn.net/elma_tww/article/details/82431741