()判定と計算の方法が

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

()判定と計算の方法が

#1

投稿記事 by 774 » 16年前

すいません、手違いで昨日投稿した質問を解決にしてしまい更に、パスワードをつけるのを忘れたので新しく作らせていただきました・・・。

()の判定と入力した文字列を計算するプログラムを作っているのですが、()の中の最優先するのと計算する方法がわかりません。
()は(1+2*3)となっていたら消すことはできましたが、どうすれば()の中を最優先できるのか、char型をint型にするのは自分で探してわかりましたが、どうすれば計算させるのかがわかりません。

どういう判定をすればいいのでしょうか?
こういうソースになっています。
#include <stdio.h>
#include <string.h>

#define N 50

/*構造体の宣言*/
struct node
{
	char str[N];
	struct node *left;
	struct node *right;
};

void print_tree(struct node *p);
struct node *kansu(char str[/url]);
int main(void)
{
	struct node	*root;
	char d[N];
	int i, j = 0;	
	
	/* ツリー作成 */
	printf("文字列入力 ");
	fgets(d, 100, stdin);
	d[strlen(d) - 1] = '\0';     /* 余分な改行コードを削除 */
	
	do
	{
		root = NULL;	//ルートにNULLを入れる
		root = kansu(d);	//入力した値dをkansu関数の引値として入れてルートに入れる
		print_tree(root);	//rootをprint_tree関数の引地として入れる

		printf("\n");
		printf("文字列入力 ");
		fgets(d, 100, stdin);
		d[strlen(d) - 1] = '\0';     /* 余分な改行コードを削除 */
	}
	while(strcmp(d, "quit") != 0);

	return 0;
}

//ツリー出力 
void print_tree(struct node *p)
{

	if(p!=NULL)
	{
		printf("%c", p->str[0]);
		print_tree(p->left);
		print_tree(p->right);
	}

}

struct node *kansu(char str[/url])
{
	int i;
	char rstr[N] = { '\0' }, lstr[N] = { '\0' };
	struct node *p;

	if(str[0]=='(' || str[strlen(str)-1]==')')	//両端が()で囲まれていたら
	{
		for(i=0; i<=strlen(str)-1; i++)		//()を消す
		{
			str = str[i+1];
		}
	}

printf("\n");

	for(i=strlen(str)-1; str != '+' && str != '-' && i>=0; i--);	//+とーを探索するループ

	if(str == '+' || str == '-')	//もしstrが+かーだったら
	{
		p = malloc(sizeof(struct node));
		p->right = NULL;
		p->left = NULL;
		p->str[0] = str;
		p->str[1] = '\0';

	}

	else	//そうでなかったら
	{

		for(i=strlen(str)-1; str != '*' && str != '/' && i>0 ; i--);	//*と/を探索するループ

		if(str == '*' || str[i] == '/')
		{
			p = malloc(sizeof(struct node));
			p->right = NULL;
			p->left = NULL;
			p->str[0] = str[i];
			p->str[1] = '\0';
		}

	}

	if(str[i] != '+' && str[i] != '-' && str[i] != '*' && str[i] != '/')	//もし数字だったら
	{
		p = malloc(sizeof(struct node));
		p->right = NULL;
		p->left = NULL;
		p->str[0] = str[i];
		p->str[1] = '\0';
	}

	else	//そうでなかったら
	{
		strcpy(rstr, str+i+1);
		strncpy(lstr, str, i);
		lstr[i] = '\0';

	}

	/* 再帰部分 */
	if (rstr[0])
		p->right = kansu(rstr);
	if (lstr[0])
		p->left = kansu(lstr);

	return p;

}

たいちう

Re:()判定と計算の方法が

#2

投稿記事 by たいちう » 16年前

> どうすれば()の中を最優先できるのか、

http://smdn.invisiblefulmoon.net/ikimas ... olish.html


> どうすれば計算させるのかがわかりません。

nodeへのポインタを引数に取り、nodeの値を返す再帰関数があればよいでしょう。
nodeが値だった場合、その値をそのまま返し、演算子だった場合、
左右のnodeの値をそれぞれ計算し、演算の結果を返します。

774

Re:()判定と計算の方法が

#3

投稿記事 by 774 » 16年前

何とかできました。
ありがとうございます。
まだまだ自分でも気づけないところがあったのでもっと勉強しようと思います。
本当にありがとうございました!

閉鎖

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