ページ 1 / 1
入力した数式を計算するプログラム
Posted: 2011年5月04日(水) 12:56
by myon
式を入力して、その計算結果を返すプログラムを作ろうと考えまして。まず、
char string[100];
int Color ;
Color = GetColor( 255 , 255 , 255 ) ;
//キーボードから数式の入力
KeyInputString( 0 , 16 , 30 , string , FALSE ) ;
このように記述し、たとえば、
(1+2)/3+3 と入力されれば4と表示され、
(1+2)/(3+3) と入力されれば0.5と表示され、
{(1+2)+(3+4)}/10+5 と入力されれば6と表示されるように、
しっかりと{}や()の計算順序を正しく認識するようなものを考えています。しかしながらどうもうまく考えがまとまりません。どのような方法がありますか? C言語でお願いします。
Re: 入力した数式を計算するプログラム
Posted: 2011年5月04日(水) 13:43
by softya(ソフト屋)
よく使われるのは逆ポーランド記法に変換してから計算する方法ですね。
アルゴリズムとしてはスタックを使います。
「アルゴリズムとデータ構造編 第8章 スタック」
http://www.geocities.jp/ky_webid/algorithm/008.html
「数式を逆ポーランド法に変換するための事柄」
http://7ujm.net/etc/calcstart.html
まず、この2つを理解してみてください。
Re: 入力した数式を計算するプログラム
Posted: 2011年5月04日(水) 15:38
by h2so5
まずは、括弧や優先順位などを考慮せず
1+2+3
12-5+54
などの単純な式を計算できるプログラムを組んでみたらどうでしょうか?
Re: 入力した数式を計算するプログラム
Posted: 2011年5月04日(水) 15:38
by h2so5
まずは、括弧や優先順位などを考慮せず
1+2+3
12-5+54
などの単純な式を計算できるプログラムを組んでみたらどうでしょうか?
Re: 入力した数式を計算するプログラム
Posted: 2011年5月05日(木) 14:31
by かずま
{ と } を許すとは珍しいですね。
次のプログラムは、グローバル変数を使っていてあまりよくないのですが、
参考にしてください。
p に式の文字列の先頭を設定し、expr(o) を呼び出すと、計算結果が返ってきます。
ただし、その時の c の値が 0 であれば成功、そうでなければエラーです。
コード:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
int c; char *p, o[] = "+-*/";
int get(void) { do c = *p++ & 0xff; while (isspace(c)); return c; }
double expr(const char *s)
{
double v;
if (*s)
for (v = expr(s+2); c == s[0] || c == s[1]; )
if (c == '+') v += expr(s+2);
else if (c == '-') v -= expr(s+2);
else if (c == '*') v *= expr(s+2);
else v /= expr(s+2);
else if (get() == '.' || isdigit(c)) v = strtod(p-1, &p), get();
else if (c == '(') v = expr(o), c==')' ? get() : (c = 1);
else if (c == '{') v = expr(o), c=='}' ? get() : (c = 1);
else if (c == '-') v = -expr(s);
else if (c == '+') v = expr(s);
else c = 1;
return v;
}
int main(void)
{
char string[1000]; double v;
while (printf("> "), fgets(string, sizeof string, stdin)) {
p = string;
v = expr(o);
printf(c ? " error\n" : " %.15g\n", v);
}
return 0;
}
Re: 入力した数式を計算するプログラム
Posted: 2011年5月05日(木) 15:35
by myon
お返事ありがとうございます。
逆ポーランド記法を勉強し、実際に組んでいる途中です。
また、書いていただいたコードも使ってみようと思います。
ありがとうございました。