【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19106

簡単な電卓のプログラム
投稿者---真衣(2005/01/09 19:19:54)


下のプログラムですが、簡単な電卓のプログラムなんだけど、いまいちどのように働いているのか分かりません・・ ソースにコメントを付けて分かりやすくしたいのですけど、誰か助けて!

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

void error(const char *emsg) { fprintf(stderr, "%s", emsg), exit(1); }

typedef enum {
NUMBER, PRINT, END, BAD_TOKEN,

PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
LP = '(', RP = ')',
} Token_type;

int value;
Token_type token;

Token_type gettok(void)
{
int c;

while (isspace(c = getchar()) && c != '\n')
;

switch (c) {
case '\n':
return token = PRINT;
case EOF:
return token = END;
case '+':
case '-':
case '*':
case '/':
case '(':
case ')':
return token = c;
default:
if (isdigit(c)) {
ungetc(c, stdin);
scanf("%d", &value);
return token = NUMBER;
}
return token = BAD_TOKEN;
}
}

int expr(void);

int prime(void)
{
switch (gettok()) {
int e;
case NUMBER:
return value;
case '(':
e = expr();
if (token != ')')
error("括弧が閉じていません");
return e;
default:
error("Bad token\n");
}
}

int term(void)
{
int left = prime();

for (;;)
switch (gettok()) {
case '*':
left *= prime();
break;
case '/':
left /= prime();
break;
default:
return left;
}
}

int expr(void)
{
int left = term();

for (;;)
switch (token) {
case '+':
left += term();
break;
case '-':
left -= term();
break;
default:
return left;
}
}

int main(void)
{
for (;;)
printf("%d\n", expr());
return 0;
}




この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:簡単な電卓のプログラム 19108 ぽへぇ 2005/01/09 20:22:38
<子記事> Re:簡単な電卓のプログラム 19109 ぽこ 2005/01/09 20:31:00
<子記事> Re:簡単な電卓のプログラム 19110 Ban 2005/01/09 21:19:45


No.19108

Re:簡単な電卓のプログラム
投稿者---ぽへぇ(2005/01/09 20:22:38)


ソースの添付は「HTML変換ツール」で字下げ!

>下のプログラムですが、簡単な電卓のプログラムなんだけど、いまいち
「いまいち」だったら、せめてわかったところまで書いてください。




この投稿にコメントする

削除パスワード

No.19109

Re:簡単な電卓のプログラム
投稿者---ぽこ(2005/01/09 20:31:00)


>下のプログラムですが、簡単な電卓のプログラムなんだけど、いまいちどのように働いているのか分かりません・・ ソースにコメントを付けて分かりやすくしたいのですけど、誰か助けて!

ご自分で作られたのではないのですか?
以下のような感じで動いているんじゃないかと思います。

expr ::= term | term '+' term | term '-' term
term ::= prime | prime '*' prime | prime '/' prime
prime ::= number | '(' expr ')'
number ::= ('1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | '0')+

#BNF記法自信なし。。



この投稿にコメントする

削除パスワード

No.19110

Re:簡単な電卓のプログラム
投稿者---Ban(2005/01/09 21:19:45)


別の掲示板に同じソースを貼って以下の質問をされている方がいますが、
おぺ さんという方はご学友ですか?

> このプログラムの機能を説明しろという宿題が出たのですが、
> 簡単な電卓であることは分かるんですが、いまいちよく分かりません。
> ソースにコメントを付けて説明しないといけないんですが、
> 助けてください。。

丸投げはためになりません。



この投稿にコメントする

削除パスワード

No.19111

Re:簡単な電卓のプログラム
投稿者---真衣(2005/01/09 21:29:46)


そうかも・・・(笑



この投稿にコメントする

削除パスワード

No.19112

Re:簡単な電卓のプログラム
投稿者---真衣(2005/01/09 22:01:50)


すいませんでした。具体的にいうとtypedefの中のPRINT,END,NUMBER,BAD_TOKENの働きが分かりません。


この投稿にコメントする

削除パスワード

No.19113

Re:簡単な電卓のプログラム
投稿者---Ban(2005/01/09 23:44:49)


> すいませんでした。具体的にいうとtypedefの中のPRINT,END,NUMBER,
> BAD_TOKENの働きが分かりません。

typedef の中という表現がちょっと危険な香りですが...

まず enum は「列挙したもの」を「識別する」ためのものです。
これらの場合は「値」に意味を持たせていないので自動採番に
任せているだけで、あとの働きは PLUS や MINUS などと基本的に一緒です。
# 実際の割当番号が知りたければ enum の説明を読めば書いてあるはずです。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧