0

以下は、私のより大きなプログラムの 1 つから編集されたコード スニペットです。
(元のコードはここにあります)

実行可能なプログラムを作成しました (エラーがあります)

#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 を使用しています。

コードで発生している 2 つの問題があります。

  • % の部分を switch-case のケースとして入れることができません。これを行うと、コンパイラがエラーをスローします。エラーは次のとおりです。
    |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-case のケースとして入れることができません。これを行うと、コンパイラがエラーをスローします。

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 に答える