#2
by ビルド » 6年前
[quote="ビルド" id=3,19747,148649]
コード:
/* 1 * 10 + 100 / 7 * ( 7 + 21 ) % 6 . */
/* で 計算結果 12 が標準出力に得られる。 */
/* 「.」だけの行を読むと正常に終了する。 */
/*****************************************************/
/*****************************************************/
/* トレースやデバッグのためには Uncomment for debug */
/* と行頭部分に書いてある行の // を取り除く */
/* これらのデバッグ情報は標準エラー出力(stderr)に出力*/
/*****************************************************/
#include <stdio.h>
#include <stdlib.h>
/*****************************************************/
/* グローバル変数 開始 */
/*****************************************************/
char tkn[24];/*tokenを収容;64bit以内の10進整数の文字*/
/*列が収容可能なサイズとしている */
int Level; /*関数呼び出しレベル;トレース情報として、*/
/* デバッグメッセージに用いる */
/*****************************************************/
/* グローバル変数 終り */
/*****************************************************/
/****************************************************/
/* プロトタイプ宣言 始まり */
/****************************************************/
/****************************************************/
/*関数 int evalExpr(void); */
/*標準入力からinfix notationの式を読み込んで、 */
/*その値を計算して返却する。 */
int evalExpr(void);
/****************************************************/
/*関数 int evalTerm(void); */
/*標準入力からinfix notationのtermを読み込んで、 */
/*その値を計算して返却する。 */
int evalTerm(void);
/****************************************************/
/*関数 int evalFactor(void); */
/*標準入力からinfix notationのfactorを読み込んで、 */
/*その値を計算して返却する。 */
int evalFactor(void);
/****************************************************/
/*関数 void nextToken(void); */
/*scanf("%s", tkn)でtokenを一つ読み込む */
void nextToken(void);
/****************************************************/
/* プロトタイプ宣言 終り */
/****************************************************/
/****************************************************/
/* 関数定義 始まり */
/****************************************************/
int main(void) {/*メイン関数*/
int opr;/*式の計算結果*/
/*initialise function level*/
Level = 0;
nextToken();
/*1 token先読み*/
while (1) {
opr = evalExpr();
printf( "%d\n", opr);
fflush(stdout);
fflush(stderr);nextToken();/*1 token先読み*/
if (tkn[0] == '.') break;
}
return 0;
}
int evalExpr(void){/*関数 evalExpr();*/
int opr = 0;
///*Uncomment for debug*/fprintf(stderr, "%3d: entering evalExpr: tkn = %s\n", Level++, tkn);
opr = evalTerm();
while (tkn[0] == '+' || tkn[0]== '-' ){
if (tkn[0] == '+'){
nextToken();/*1 token先読み*/
opr += evalTerm();
}else/*tkn[0]=='-'*/ {
nextToken(); /*1 token先読み*/
opr -= evalTerm();
}
} if (tkn[0]=='.') {
///*Uncomment for debug*/fprintf(stderr, "%3d: Stop and exiting evalExpr: current opr = %d\n", --Level, opr);
return opr;
}
///*Uncomment for debug*/fprintf(stderr, "%3d: exiting evalExpr: %d\n", --Level, opr);
return opr;
}
int evalTerm( void) {
/*関数 evalTerm()*/
int opr;
///*Uncomment for debug*/fprintf(stderr, "%3d: entering evalTerm: tkn = %s\n", Level++, tkn);
opr =evalFactor( );
while (tkn[0] =='*' || tkn[0] =='/'
|| tkn[0]=='%') {
if(tkn[0]=='*') {
nextToken();
opr *= evalFactor();
}
else if (tkn[0]=='/') {
nextToken();
opr /= evalFactor();
}else/* '%' assumed)*/ {
nextToken();
opr %= evalFactor();
}
}
///*Uncomment for debug*/fprintf(stderr, "%3d: exiting evalTerm: %d\n", --Level, opr);
return opr;
}
int evalFactor(void) {/*関数 evalFactor()*/
int opr;
///*Uncomment for debug*/fprintf(stderr, "%3d: entering evalFactor: tkn = %s\n", Level++, tkn);
if (tkn[0]=='('){
nextToken();
/*1 token先読み*/
opr = evalExpr();
if (tkn[0]!=')') {
fprintf(stderr, "Error! an ')' expected.\n");
exit(1);
}
nextToken();/*1 token先読み*/
///*Uncomment for debug*/fprintf(stderr, "%3d: exiting evalFactor: %d\n", --Level, opr);
return opr;
} else {/*expect a number and so assume*/
opr = atoi(tkn);
nextToken();/*1 token先読み*/
///*Uncomment for debug*/fprintf(stderr, "%3d: exiting evalFactor: %d\n", --Level, opr);
return opr;
}
}
void nextToken(void) {
scanf("%s", tkn);
///*Uncomment for debug*/fprintf(stderr, "nextToken: token read: %s\n", tkn);
return;
}
入力してもなにも表示されない。
C:\workC>a.exe
1 + 2
理想の実行結果
C:\workC>a.exe
普通の式
1 + 2
後置記法
1 2 +
なので、理想の実行結果がでるように、教えてください。
[quote="ビルド" id=3,19747,148649][code]
/* 1 * 10 + 100 / 7 * ( 7 + 21 ) % 6 . */
/* で 計算結果 12 が標準出力に得られる。 */
/* 「.」だけの行を読むと正常に終了する。 */
/*****************************************************/
/*****************************************************/
/* トレースやデバッグのためには Uncomment for debug */
/* と行頭部分に書いてある行の // を取り除く */
/* これらのデバッグ情報は標準エラー出力(stderr)に出力*/
/*****************************************************/
#include <stdio.h>
#include <stdlib.h>
/*****************************************************/
/* グローバル変数 開始 */
/*****************************************************/
char tkn[24];/*tokenを収容;64bit以内の10進整数の文字*/
/*列が収容可能なサイズとしている */
int Level; /*関数呼び出しレベル;トレース情報として、*/
/* デバッグメッセージに用いる */
/*****************************************************/
/* グローバル変数 終り */
/*****************************************************/
/****************************************************/
/* プロトタイプ宣言 始まり */
/****************************************************/
/****************************************************/
/*関数 int evalExpr(void); */
/*標準入力からinfix notationの式を読み込んで、 */
/*その値を計算して返却する。 */
int evalExpr(void);
/****************************************************/
/*関数 int evalTerm(void); */
/*標準入力からinfix notationのtermを読み込んで、 */
/*その値を計算して返却する。 */
int evalTerm(void);
/****************************************************/
/*関数 int evalFactor(void); */
/*標準入力からinfix notationのfactorを読み込んで、 */
/*その値を計算して返却する。 */
int evalFactor(void);
/****************************************************/
/*関数 void nextToken(void); */
/*scanf("%s", tkn)でtokenを一つ読み込む */
void nextToken(void);
/****************************************************/
/* プロトタイプ宣言 終り */
/****************************************************/
/****************************************************/
/* 関数定義 始まり */
/****************************************************/
int main(void) {/*メイン関数*/
int opr;/*式の計算結果*/
/*initialise function level*/
Level = 0;
nextToken();
/*1 token先読み*/
while (1) {
opr = evalExpr();
printf( "%d\n", opr);
fflush(stdout);
fflush(stderr);nextToken();/*1 token先読み*/
if (tkn[0] == '.') break;
}
return 0;
}
int evalExpr(void){/*関数 evalExpr();*/
int opr = 0;
///*Uncomment for debug*/fprintf(stderr, "%3d: entering evalExpr: tkn = %s\n", Level++, tkn);
opr = evalTerm();
while (tkn[0] == '+' || tkn[0]== '-' ){
if (tkn[0] == '+'){
nextToken();/*1 token先読み*/
opr += evalTerm();
}else/*tkn[0]=='-'*/ {
nextToken(); /*1 token先読み*/
opr -= evalTerm();
}
} if (tkn[0]=='.') {
///*Uncomment for debug*/fprintf(stderr, "%3d: Stop and exiting evalExpr: current opr = %d\n", --Level, opr);
return opr;
}
///*Uncomment for debug*/fprintf(stderr, "%3d: exiting evalExpr: %d\n", --Level, opr);
return opr;
}
int evalTerm( void) {
/*関数 evalTerm()*/
int opr;
///*Uncomment for debug*/fprintf(stderr, "%3d: entering evalTerm: tkn = %s\n", Level++, tkn);
opr =evalFactor( );
while (tkn[0] =='*' || tkn[0] =='/'
|| tkn[0]=='%') {
if(tkn[0]=='*') {
nextToken();
opr *= evalFactor();
}
else if (tkn[0]=='/') {
nextToken();
opr /= evalFactor();
}else/* '%' assumed)*/ {
nextToken();
opr %= evalFactor();
}
}
///*Uncomment for debug*/fprintf(stderr, "%3d: exiting evalTerm: %d\n", --Level, opr);
return opr;
}
int evalFactor(void) {/*関数 evalFactor()*/
int opr;
///*Uncomment for debug*/fprintf(stderr, "%3d: entering evalFactor: tkn = %s\n", Level++, tkn);
if (tkn[0]=='('){
nextToken();
/*1 token先読み*/
opr = evalExpr();
if (tkn[0]!=')') {
fprintf(stderr, "Error! an ')' expected.\n");
exit(1);
}
nextToken();/*1 token先読み*/
///*Uncomment for debug*/fprintf(stderr, "%3d: exiting evalFactor: %d\n", --Level, opr);
return opr;
} else {/*expect a number and so assume*/
opr = atoi(tkn);
nextToken();/*1 token先読み*/
///*Uncomment for debug*/fprintf(stderr, "%3d: exiting evalFactor: %d\n", --Level, opr);
return opr;
}
}
void nextToken(void) {
scanf("%s", tkn);
///*Uncomment for debug*/fprintf(stderr, "nextToken: token read: %s\n", tkn);
return;
}
[/code]
入力してもなにも表示されない。
C:\workC>a.exe
1 + 2
理想の実行結果
C:\workC>a.exe
普通の式
1 + 2
後置記法
1 2 +
なので、理想の実行結果がでるように、教えてください。