2017-06-22 3 views
2

こんにちは皆、私はBrian W. Kernighan(著)、Dennis M. Ritchie(著)のCプログラミング言語の本からの質問を試みていました。私は基本的な逆ポーランドの電卓のために私は理解していないが、番号または手紙を見つけるためのCプログラミングの切り替え文

どのようにすべての数字をキャプチャすることができますか?次の質問では、sincosまたはpowのようなケースを処理するように求められます。私はそれを行う同様の方法があると仮定していますが、説明すれば私はより良い助けになります。

getop次のオペレータまたは数値オペランドを取得し、pushpopは、通常のスタック機能であり、atofは山車にASCIIに変換します。

#define NUMBER '0' 


    int type; 
    double op2; 
    char s[100]; 

    while ((type = getop(s)) != EOF) { 
     switch (type) { 
      case NUMBER: 
       push(atof(s)); 
       break; 
      case '+': 
       push(pop() + pop()); 
       break; 
      case '*': 
       push(pop() * pop()); 
       break; 
      case '-': 
       op2 = pop(); 
       push(pop() - op2); 
       break; 
      case '/': 
       op2 = pop(); 
       if (op2 != 0.0) 
        push(pop()/op2); 
       else 
        printf("error: zero divisor\n"); 
       break; 
      case '%': 
       op2 = pop(); 
       if (op2 != 0.0) 
        push((int)pop() % (int)op2); 
       else 
        printf("error: division by zero\n"); 
       break; 
      case '\n': 
       printf("\t%.8g\n", pop()); 
       break; 
      default: 
       printf("error: unknown command %s\n", s); 
       break; 
     } 
    } 
    return 0; 
} 
+2

私は 'getop()'がその引数 's'が数値であれば' NUMBER'を返すと思います。 – Hasturkun

+0

啓発が来るまで 'switch(type)'行を見てください。 –

+0

@Hasturkunええ私は何が起こったのか見た。 – cv14

答えて

2

コンパイラがソースコードを読み込んでパーズする前に、Cプリプロセッサがテキスト置換を行います。 NUMBERは、数字0を表す文字の値である'0'に置き換えられます。

ファンクションgetop()は、数値が入力から解析されたときに値'0'を返し、数字をsにコピーします。 atof()はそれを数値に変換します。

getop()のソースコードにアクセスできる場合は、数字、空白、コメント、演算子の解析方法がわかります。

%には浮動小数点値を使用しないでください。代わりにfmod()を使用する必要があります。

+0

整数除算のオーバーフローは、浮動小数点演算を使用する場合の問題ではありません。 – Aconcagua

+0

@Aconcagua:OK、それを逃しました。なぜゼロ除算をテストするのはなぜですか?非ゼロ値をゼロで割ると無限大になり、0.0/0.0でNaNが生成されます。 – chqrlie

+0

数学の正しさはおそらく - しかし、私はそれを忘れていました。確かにintへの変換が行われました... – Aconcagua

関連する問題