我已经用c ++制作了一个计算器,并且试图检查用户何时尝试除以0来给出错误。哪里有这样的例子。
这是我到目前为止所得到的
#include "pch.h"
#include <iostream>
using namespace std;
int main()
{
int num1, num2;
char symb;
cout << "Enter the first number: ";
cin >> num1;
cout << "Enter the symbol: ";
cin >> symb;
cout << "Enter the second number: ";
cin >> num2;
int calculation;
if (symb == '+') {
calculation = num1 + num2;
}
else if (symb == '-') {
calculation = num1 - num2;
}else if (symb == '/'){
calculation = num1 / num2;
}
else if (symb == '*') {
calculation = num1 * num2;
}
else if (calculation == 0 ) {
throw error;
}
else {
cout << "wrong symbol";
}
cout << calculation;
return 0;
}
答案 0 :(得分:3)
首先,您的程序中有未定义的行为:
int cacluation; // uninitialised!
if (...) { }
else if (...) { }
// ...
else if (cacluation == 0) // <- (!)
{
// ...
}
如果以前所有这些检查均失败(即用户未输入有效符号),则您现在正在评估未初始化的变量calculation
!
此外,假设用户输入1 + -1
或1 - 1
...,此检查还是不正确的。
您确实需要做的是在执行计算之前先检查除数 ,并且只有在用户实际要除法的情况下才这样做:
// ...
else if (symb == '/')
{
// check BEFORE calculation:
if(num2 == 0)
{
// appropriate error handling, e. g. print some error message
}
else
{
cacluation = num1 / num2;
}
}
最后,您还需要避免打印出无效结果。一种非常简单的方法是用直接输出值代替对calculation
变量的赋值:
else
{
std::cout << num1 / num2; // analogously in all other branches
}
答案 1 :(得分:0)
(尽管IEEE754确实定义了浮点类型的行为,但标准C ++中未定义零除行为)。
如果使用throw
,则还需要提供相应的catch
。
但是在这种情况下(因为您已经向控制台发出了错误),您无需这样做
if (!num2){
std::cerr << "division by zero";
}
在计算除法的代码部分中就足够了。
您的分支机构else if (calculation == 0)
也是一个错误,因为无需初始化calculation
,但是我的修正消除了对此的需要。
答案 2 :(得分:0)
else if (symb == '/'){
if (num2 ==0)
cout<<"Mathematical error";
else
calcluation = num1 / num2;
}
答案 3 :(得分:-2)
如果char为num2
,只需检查/
是否等于零。您在行
else if (symb == '/'){
cacluation = num1 / num2;
}
如果num2为零。
这是错误的:
else if (cacluation == 0 ) {
throw error;
}
它可以是零除零以外的任何值。答案将是零。你错了。