-1

簡単な例の入力行: 2 3 + が出力: 5 と終了する RPN 計算機を作成しようとしています。

入力行を取得し、数字をスタックに置き、数字以外を見つけ、それらが演算子であるかどうかをチェックするプログラムが必要です: '+'、'-'、'/'、または '*' であり、それらが演算子である場合スタックの最後の 2 つの数値の計算を計算し、それらの 2 つの数値を削除してから、新しい数値をスタックに追加します。これは、入力行を解析しながら、左から右に進む必要があります。また、シンボルが演算子の 1 つでない場合は、cout に出力する必要があります。

現在、プログラムはコンパイル時に非常に長いエラー コードのリストを画面に表示します。

ここに私が持っているものがあります:

#include<iostream>
#include<string>
#include<stack>
using namespace std;

int main()
{
 stack<int> num;

 string line;
 int n,count=0,a,b;
 char c;


 while (getline(cin,line))
 {
     for (string::const_iterator it = line.begin(); it != line.end(); ++ it)
     {
         if (isdigit(static_cast<unsigned char>(*it)))
         {
             cout << it << endl;
             n = (it - 48);
             num.push(n);
             count++;
         }
         else if (ispunct(static_cast<unsigned char>(*it)))
         {
             if (it == '+' || it == '-' || it == '/' || it == '*')
             {
                 cout << "count is " << count << endl;
                 if (count>1)
                 {
                    b =  num.top();
                    num.pop();
                    a = num.top();
                    num.pop();

                    if (it == '+')
                    {
                        cout << "+" <<endl;
                        num.push(a+b);
                        count--;
                    }
                    else if (it == '-')
                    {
                        num.push(a-b);
                        count--;
                    }
                    else if (it == '/')
                    {
                        if (b != 0)
                        {
                            num.push(a/b);
                            count--;
                        }
                        else
                        {
                            cout << "division by zero" << endl;
                            return(0);
                        }
                    }
                    else if (it == '*')
                    {
                        num.push(a*b);
                        count--;
                    }
                    else
                    {
                        cout << "invalid input" << endl;
                        return(0);          
                    }
                 }
                 else
                 {
                     cout << "stack underflow" << c << endl;
                     return(0);
                 }
             }
            cout << c << endl;
     }
    }
 }
 while ( !num.empty() )
 {
     cout << num.top() << endl;
     num.pop();
 }
 return 0;
}
4

3 に答える 3

3

コンパイラがエラーを画面にダンプする

これを処理する一般的な方法は、エラーを読み、指摘されている問題を理解し、プログラムを修正して問題を修正することです。エラー メッセージを理解できない場合、最初に試みることの 1 つは、その特定のエラー メッセージまたはエラー メッセージ内の理解できない特定の用語を Web で検索することです。

その調査を行っても特定のエラー メッセージを理解できない場合は、他のプログラマーにその特定のエラー メッセージの説明を求めるのが適切な場合があります。その場合、特定のエラー メッセージと、エラーが参照しているソース コードの行を表示します。

また、最初のエラーをリストして、最初から始めることが重要です。これは、以前のエラーがコンパイラを混乱させ、その後、実際には意味をなさない可能性のあるエラーをさらに生成する可能性があるためです。


あなたがエラー メッセージとともに投稿したドキュメントは、先頭が途切れているようです。エラー メッセージがコンソール バッファをいっぱいにして、最初が失われていませんか?

gcc でコードをコンパイルすると、次のようなエラー メッセージが表示されます。

 main.cpp: In function 'int main()':
main.cpp:21:22: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
              cout << it << endl;
                      ^

最初から始めると、どこから問題を探し始めるかがより明確になります。

コンパイラの出力が最初に途切れるのを防ぐために、いくつかのことを行うことができます。

  • 端末で許可されている場合は、バッファー サイズを増やすか、無制限に設定します。
  • コンパイラの出力をファイルまたはページャー プログラム ( など) にリダイレクトしますless
  • のようなコマンドを使用してhead -n 20、出力の最初の数行のみを取得し、残りを破棄します。表示されたエラーを修正したら、再コンパイルしてさらにエラーを確認します。
于 2014-05-30T18:51:15.927 に答える