式を入力して、その計算結果を返すプログラムを作ろうと考えまして。まず、
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言語でお願いします。
入力した数式を計算するプログラム
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: 入力した数式を計算するプログラム
よく使われるのは逆ポーランド記法に変換してから計算する方法ですね。
アルゴリズムとしてはスタックを使います。
「アルゴリズムとデータ構造編 第8章 スタック」
http://www.geocities.jp/ky_webid/algorithm/008.html
「数式を逆ポーランド法に変換するための事柄」
http://7ujm.net/etc/calcstart.html
まず、この2つを理解してみてください。
アルゴリズムとしてはスタックを使います。
「アルゴリズムとデータ構造編 第8章 スタック」
http://www.geocities.jp/ky_webid/algorithm/008.html
「数式を逆ポーランド法に変換するための事柄」
http://7ujm.net/etc/calcstart.html
まず、この2つを理解してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: 入力した数式を計算するプログラム
まずは、括弧や優先順位などを考慮せず
1+2+3
12-5+54
などの単純な式を計算できるプログラムを組んでみたらどうでしょうか?
1+2+3
12-5+54
などの単純な式を計算できるプログラムを組んでみたらどうでしょうか?
Re: 入力した数式を計算するプログラム
まずは、括弧や優先順位などを考慮せず
1+2+3
12-5+54
などの単純な式を計算できるプログラムを組んでみたらどうでしょうか?
1+2+3
12-5+54
などの単純な式を計算できるプログラムを組んでみたらどうでしょうか?
-
かずま
Re: 入力した数式を計算するプログラム
{ と } を許すとは珍しいですね。
次のプログラムは、グローバル変数を使っていてあまりよくないのですが、
参考にしてください。
p に式の文字列の先頭を設定し、expr(o) を呼び出すと、計算結果が返ってきます。
ただし、その時の c の値が 0 であれば成功、そうでなければエラーです。
次のプログラムは、グローバル変数を使っていてあまりよくないのですが、
参考にしてください。
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;
}
-
myon
Re: 入力した数式を計算するプログラム
お返事ありがとうございます。
逆ポーランド記法を勉強し、実際に組んでいる途中です。
また、書いていただいたコードも使ってみようと思います。
ありがとうございました。
逆ポーランド記法を勉強し、実際に組んでいる途中です。
また、書いていただいたコードも使ってみようと思います。
ありがとうございました。