課題が・・・
Posted: 2009年1月11日(日) 22:57
こんばんわ、また課題でどうすればいいのかがわからなくなったので来ました。
今回の課題は1*2+3と式を文字列入力したらポーランド記法で表示して計算結果を取り出す、というプログラムです。
条件があって、()とマイナスの考慮で入れ方をツリー構造体で入れていくという条件です。
今、計算と()の判断とマイナス考慮はとりあえず置いておいて、表示ができるように使用としています。
プログラムの作り方は式を入力したら関数内に飛び、引地として持ってきた文字列を後ろからfor文とif文で+とーから検索、次に数字を*と/を検索という演算子の検索優先順位にして、それを抜けたら数字を入れていき、再帰プログラムでツリーができるまで続けるというようにます。
ですが、途中まで行くと無限ループになってしまいます。
よく見てみてもわからないのですが、どこをどう直せばいいのでしょう。
これが今のプログラムのソースの状態です。
関数内のスペースもtabスペースもしていないprintfのものは確認用のprintfです。
以上がソースの内容です。
どうかよろしくお願いしますm( )m
今回の課題は1*2+3と式を文字列入力したらポーランド記法で表示して計算結果を取り出す、というプログラムです。
条件があって、()とマイナスの考慮で入れ方をツリー構造体で入れていくという条件です。
今、計算と()の判断とマイナス考慮はとりあえず置いておいて、表示ができるように使用としています。
プログラムの作り方は式を入力したら関数内に飛び、引地として持ってきた文字列を後ろからfor文とif文で+とーから検索、次に数字を*と/を検索という演算子の検索優先順位にして、それを抜けたら数字を入れていき、再帰プログラムでツリーができるまで続けるというようにます。
ですが、途中まで行くと無限ループになってしまいます。
よく見てみてもわからないのですが、どこをどう直せばいいのでしょう。
これが今のプログラムのソースの状態です。
関数内のスペースもtabスペースもしていないprintfのものは確認用のprintfです。
#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) { print_tree(p->left); print_tree(p->right); printf("%c", p->str[N]); } } struct node *kansu(char str[/url]) { int i; char rstr[N], lstr[N]; struct node *p; printf("い%s\n", str); for(i=strlen(str)-1; str != '+' && str != '-' && i>=0; i--); //+とーを探索するループ if(str == '+' || str == '-') //もしstrが+かーだったら { printf("ろ%c\n", str); p->str[0] = str; p->str[1] = '\0'; } else //そうでなかったら { printf("は%s\n", str); for(i=strlen(str)-1; str != '*' && str != '/' && i>=0 ; i--); //*と/を探索するループ printf("に%c\n", str); if(str[i] == '*' || str[i] == '/') { p = malloc(sizeof(struct node)); p->right = NULL; p->left = NULL; printf("ほ%c\n", str[i]); 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; printf("へ%c\n", str[i+1]); str[i] = str[i+1]; p->str[0] = str[i]; p->str[1] = '\0'; } else //そうでなかったら { strcpy(rstr, str+i+1); printf("と%s\n", rstr); strncpy(lstr, str, i); lstr[i] = '\0'; printf("ち%s\n", lstr); } /* 再帰部分 */ p->right = kansu(rstr); p->left = kansu(lstr); return p; }
以上がソースの内容です。
どうかよろしくお願いしますm( )m