()判定と計算の方法が
Posted: 2009年1月12日(月) 16:36
すいません、手違いで昨日投稿した質問を解決にしてしまい更に、パスワードをつけるのを忘れたので新しく作らせていただきました・・・。
()の判定と入力した文字列を計算するプログラムを作っているのですが、()の中の最優先するのと計算する方法がわかりません。
()は(1+2*3)となっていたら消すことはできましたが、どうすれば()の中を最優先できるのか、char型をint型にするのは自分で探してわかりましたが、どうすれば計算させるのかがわかりません。
どういう判定をすればいいのでしょうか?
こういうソースになっています。
()の判定と入力した文字列を計算するプログラムを作っているのですが、()の中の最優先するのと計算する方法がわかりません。
()は(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;
}