0

以下是我的一个较大程序的编辑代码片段。
原始代码可以在这里找到

我已经制作了一个可运行的程序(它有错误)

#include<iostream>
#include<math.h>
using namespace std;
int main(){
    char op;
    double n1,n2;
    while(true){
        cin>> n1 >> op >> n2;
        switch(op){
            case '+' : cout<<n1 + n2 ; break;
            case '-' : cout<< n1 - n2 ; break;
            case 'x' :
            case '*' : cout<< n1 * n2 ; break;
            case '/' : cout<< n1/n2 ; break;
            case '^' : cout<< pow(n1,n2); break;
            case '<' : (n1<n2)? cout<<"True":cout<<"False"; break;
            case '>' : (n1>n2)? cout<<"True":cout<<"False"; break;
            case '=' : (n1==n2)? cout<<"True":cout<<"False"; break;
            case '%': int N1 = floor(n1); int N2 = floor(n2); cout << N1 % N2; break;
            default : cout<< "That operation is not available";
        }
    }
}

注意:我使用的是在 Windows Vista 上运行的 Code::Blocks。

我在代码中遇到了两个问题。

  • 我无法将 % 部分作为案例放在开关盒中。当我这样做时,我的编译器会抛出一个错误。错误是:
    |line 20| jump to case label [-fpermissive]
    |line 19| crosses initialization of 'int N2'
    |line 19| crosses initialization of 'int N1'

  • 当我为输入输入乱码值(字符串)时,程序进入无限循环。

为什么会发生这些事情?

4

2 回答 2

4

我无法将 % 部分作为案例放在开关盒中。当我这样做时,我的编译器会抛出一个错误。

您忘记向我们展示您尝试了什么以及错误是什么,但我猜您尝试在switch块中声明和初始化一些变量:

switch(op){
    //...
    case '%': int N1 = floor(n1); int N2 = floor(n2); cout << N1 % N2; break;
    //...
}

这是不允许的,以防止程序在不初始化变量的情况下跳转到变量的范围内。相反,您需要引入一个内部块来限定其中的变量case

case '%': {int N1 = floor(n1); int N2 = floor(n2); cout << N1 % N2; break;}
          ^                                                               ^

或者根本不关心变量:

case '%': cout << floor(n1) % floor(n2); break;

当我为输入输入乱码值(字符串)时,程序进入无限循环。

那是因为您没有检查输入的结果。最简单的解决方法是在输入失败时结束循环:

while (cin>> n1 >> op >> n2) {
    switch (op) {
        //...
    }
}

或者,您可以检查循环中的结果,cin.clear()如果失败则清除错误(使用 )。

于 2013-09-26T14:01:40.990 回答
0
  • 不知道为什么%会导致问题:你能显示错误代码吗?对我来说听起来像是一个错字
  • 必须检查输入/转换操作是否成功。当它失败时,您永远不会跳出循环,因为您的op代码是乱码并且您遇到了默认情况。
于 2013-09-26T13:58:08.110 回答