No.13740![]() |
数式の判定 投稿者---gammd(2004/04/25 12:06:20) |
||
以下のように作りました。こんな感じのものを、 読み込んだ数式を数値、演算子、ピリオド、改行コードと 4種類のトークンを判定するような関数を作って表示 出来るように拡張させたいのですが、どう作ったらいいんでしょうか? #include<stdio.h> #include<string.h> #define infinity 1 int main(void) { char mozi[50]; while(infinity){ printf(">"); fgets(mozi, sizeof(mozi), stdin); mozi[strlen(mozi)-1] = '\0'; if(!strcmp(mozi, ".")){ break; }else printf("%s\n", mozi); } return 0; } |
No.13744![]() |
Re:数式の判定 投稿者---かずま(2004/04/25 13:59:29) |
||
> 以下のように作りました。こんな感じのものを、 > 読み込んだ数式を数値、演算子、ピリオド、改行コードと > 4種類のトークンを判定するような関数を作って表示 > 出来るように拡張させたいのですが、どう作ったらいいんでしょうか? 参考になりますか? #include <stdio.h> #include <ctype.h> enum { NUMBER, OPERATOR, PERIOD, NEWLINE }; int token_val; int get_token(void) { int c; while (c = getchar(), isspace(c)) if (c == '\n') return NEWLINE; if (c == EOF) return EOF; if (c == '.') return PERIOD; if (isdigit(c)) { ungetc(c, stdin); scanf("%d", &token_val); return NUMBER; } token_val = c; return OPERATOR; } int main(void) { int token; printf("> "); while (token = get_token(), token != EOF) switch (token) { case NUMBER: printf("NUMBER: %d\n", token_val); break; case OPERATOR: printf("OPERATOR: %c\n", token_val); break; case PERIOD: printf("PERIOD\n"); return 0; case NEWLINE: printf("NEWLINE\n> "); break; } } |
No.13745![]() |
Re:数式の判定 投稿者---かずま(2004/04/25 14:04:20) |
||
> 参考になりますか? 訂正。main の最後に return 0; を追加してください。 |
No.13754![]() |
Re:数式の判定 投稿者---gammd(2004/04/25 19:27:47) |
||
>> 参考になりますか? > >訂正。main の最後に return 0; を追加してください。 かずまさん、ありがとうございます。 いい参考になりました。 |
No.13803![]() |
Re:数式の判定 投稿者---勉強中(2004/04/29 15:11:25) |
||
かずまさん、もう一つ質問があります。 さっきのソースでトークンを空白で区切りたい場合はどうしたらいいの でしょうか? |