今、構文解析のプログラムをC言語プログラムで作成しています。
switch文で演算子別に場合分けして(case '+': ~ というような形)
しているのですが、べき乗を計算するために
case '^': ~
という風にすると実行した時に^を入力しても
^を認識していないのかうまく計算できていません。
そこで試しに
case '~': ~
と書き換え、実行時の入力も~でやってみたところ、
うまくべき乗の計算ができていました。
これはなぜなんでしょうか?
また、どうすれば^と入力してべき乗の計算ができますか?
回答よろしくお願いします。
No.4ベストアンサー
- 回答日時:
/* 優先順位付きで整数同士を四則演算するルーチン
* ()付きの式、符号としての+、-も評価する
* 「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文で振り分け)すると、すべて同じ優先順位になってしまうので、ご注意を。
なお、スペースのスキップはしていないので、必要であれば、適切な位置にスペースの読み飛ばしを挿入して下さい。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 3 2022/10/04 15:07
- その他(自然科学) 科学技術計算の仕事について 2 2023/02/04 18:09
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# プログラミング初心者です。 演算子を習い、自力で計算機を作ろうと思い、写真のようなプログラムを書きま 2 2022/08/14 21:27
- その他(プログラミング・Web制作) 【フローチャートの書き方について】 勤務年数と勤務場所を入力し,給与額を表示するフローチャートを作成 2 2022/10/04 12:11
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- その他(プログラミング・Web制作) [急募]Pythonについてです。 1 2022/10/03 20:53
- Java java 飾子を付けること(public static・・・) ・コンソールへの出力処理はmainメ 2 2022/06/16 19:34
- 新幹線 東海道・山陽新幹線で例えば東京〜博多を乗り継いで行くときは、改札を出なければ「こだま」を1駅ずつ乗り 7 2023/01/10 23:56
- Excel(エクセル) エクセル/列追加時、合計行の計算式 7 2023/03/15 11:14
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
配列をnビットシフトする
-
CStringをwchar_tに変換したい
-
double型の値をchar配列に変換...
-
コンパイルエラー invalid ope...
-
variant型ってどのような仕組み...
-
strchr() の第2引数はなぜ int ...
-
C++ の FileCopy の設定が解り...
-
int main()の・・・
-
_TCHAR*での引数の読み込み
-
c++ 文字列を入力して、一文字...
-
-'0'の意味について
-
コマンドラインに入力されてい...
-
数字文字の出現回数を表示する...
-
文字列がNULLか空文字列かの判定
-
new
-
sprintfに同じ変数は使えるか
-
間接参照のレベルが異なっています
-
charからLPTSTRへの変換方法
-
c言語
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgetsなどのときのstdinのバッ...
-
charでの計算?
-
C言語のfor文です。 繰り返しの...
-
charからLPTSTRへの変換方法
-
文字列から空白を取り除きたい...
-
C言語の入力した文字を反転させ...
-
'const char *' 型は 'char *' ...
-
配列をnビットシフトする
-
str系関数を使わずに二つの文字...
-
int main()の・・・
-
atoi( ) の反対をやりたい
-
CStringをwchar_tに変換したい
-
c++ 文字列を入力して、一文字...
-
switch文で文字を比較すること...
-
干支のプログラム
-
3桁区切(コンマ)記号をつけ...
-
絶対パスからのファイル名の切...
-
間接操作のレベルとは
-
間接参照のレベルが異なっています
-
型変換
おすすめ情報