入力した数式を計算するプログラム

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
myon

入力した数式を計算するプログラム

#1

投稿記事 by myon » 14年前

式を入力して、その計算結果を返すプログラムを作ろうと考えまして。まず、

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: 入力した数式を計算するプログラム

#2

投稿記事 by softya(ソフト屋) » 14年前

よく使われるのは逆ポーランド記法に変換してから計算する方法ですね。
アルゴリズムとしてはスタックを使います。

「アルゴリズムとデータ構造編 第8章 スタック」
http://www.geocities.jp/ky_webid/algorithm/008.html

「数式を逆ポーランド法に変換するための事柄」
http://7ujm.net/etc/calcstart.html

まず、この2つを理解してみてください。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 入力した数式を計算するプログラム

#3

投稿記事 by h2so5 » 14年前

まずは、括弧や優先順位などを考慮せず

1+2+3
12-5+54

などの単純な式を計算できるプログラムを組んでみたらどうでしょうか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: 入力した数式を計算するプログラム

#4

投稿記事 by h2so5 » 14年前

まずは、括弧や優先順位などを考慮せず

1+2+3
12-5+54

などの単純な式を計算できるプログラムを組んでみたらどうでしょうか?

かずま

Re: 入力した数式を計算するプログラム

#5

投稿記事 by かずま » 14年前

{ と } を許すとは珍しいですね。
次のプログラムは、グローバル変数を使っていてあまりよくないのですが、
参考にしてください。
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: 入力した数式を計算するプログラム

#6

投稿記事 by myon » 14年前

お返事ありがとうございます。
逆ポーランド記法を勉強し、実際に組んでいる途中です。
また、書いていただいたコードも使ってみようと思います。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る