アプリ版:「スタンプのみでお礼する」機能のリリースについて

今、構文解析のプログラムをC言語プログラムで作成しています。
switch文で演算子別に場合分けして(case '+': ~  というような形)
しているのですが、べき乗を計算するために
case '^': ~
という風にすると実行した時に^を入力しても
^を認識していないのかうまく計算できていません。
そこで試しに
case '~': ~
と書き換え、実行時の入力も~でやってみたところ、
うまくべき乗の計算ができていました。
これはなぜなんでしょうか?
また、どうすれば^と入力してべき乗の計算ができますか?
回答よろしくお願いします。

A 回答 (4件)

環境が分からないしプログラムがどうなっているかも分からないので何とも言えませんが, 実行時に '^' を入力したときに, '^'

    • good
    • 0

とりあえず、ソース全体を載せてください。

    • good
    • 0

ひょっとしてWindowsで開発していて、入力はコマンドラインで与えるとかしてます?



c:>hoge a ^ b

みたいに。
    • good
    • 0

/* 優先順位付きで整数同士を四則演算するルーチン


* ()付きの式、符号としての+、-も評価する
* 「2*(3+4)-(-2+5)」も正しく11になる
* 評価する文字列の中に「スペース」は入れないこと
*/
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

int expr(char *buf,char **p);

int expr3(char *buf,char **p)
{
int a;
*p=buf;
a=strtoul(*p,p,10);
return a;
}

int expr2(char *buf,char **p)
{
int a;
*p=buf;
switch (**p) {
case '(':
a=expr(++(*p),p);
if (**p==')') (*p)++;
return a;
case '+':
return expr3(++(*p),p);
case '-':
return -1 * expr3(++(*p),p);
}
return expr3(*p,p);
}

int expr1(char *buf,char **p)
{
int a,b;
*p=buf;
a=expr2(*p,p);
switch (**p) {
case '\0':
return a;
case '*':
b=expr1(++(*p),p);
return a*b;
case '/':
b=expr1(++(*p),p);
if (b) return a/b;
return INT_MAX;
}
return a;
}

int expr(char *buf,char **p)
{
int a,b;
*p=buf;
a=expr1(*p,p);
switch (**p) {
case '\0':
return a;
case '+':
b=expr(++(*p),p);
return a+b;
case '-':
b=expr(++(*p),p);
return a-b;
}
return a;
}

void main(void)
{
int ans;
char buf[256];
char *p;
scanf("%s",buf);
ans=expr(buf,&p);
if (*p) printf("%s以降が構文エラー\n",p);
else printf("計算結果は%dです\n",ans);
}

これを元に、優先順位を考え、他の演算子も増やしてみて下さい。

すべての演算子を並列に処理(同じswitch文で振り分け)すると、すべて同じ優先順位になってしまうので、ご注意を。

なお、スペースのスキップはしていないので、必要であれば、適切な位置にスペースの読み飛ばしを挿入して下さい。
    • good
    • 0
この回答へのお礼

詳しい例ありがとうございます。
参考にします。

お礼日時:2008/12/03 14:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!