普通式から後置記法に変換でうまくコンパイルができない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ビルド

普通式から後置記法に変換でうまくコンパイルができない

#1

投稿記事 by ビルド » 6年前

コード:


/* 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;
}

ビルド

Re: 普通式から後置記法に変換でうまくコンパイルができない

#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 +
なので、理想の実行結果がでるように、教えてください。

かずま

Re: 普通式から後置記法に変換でうまくコンパイルができない

#3

投稿記事 by かずま » 6年前

ビルド さんが書きました: 入力してもなにも表示されない。
C:\workC>a.exe
1 + 2
プログラムの最初コメントをよく読みましょう。

コード:


/* 1 * 10 + 100 / 7 * ( 7 + 21 ) % 6 .               */
/*   で 計算結果 12 が標準出力に得られる。           */
/* 「.」だけの行を読むと正常に終了する。             */

1 + 2 .
.
と入力してみてください。
ビルド さんが書きました: 理想の実行結果
C:\workC>a.exe
普通の式
1 + 2
後置記法
1 2 +
なので、理想の実行結果がでるように、教えてください。

コード:

 67:    printf(".\n"); // printf(           "%d\n", opr);
 81:    printf("+ "); // opr += evalTerm();
 85:    printf("- "); // opr -= evalTerm();
103:    printf("* "); // opr *= evalFactor();
107:    printf("/ "); // opr /= evalFactor();
110:    printf("% "); // opr %= evalFactor();
131:    opr = atoi(tkn); printf("%d ", opr);

かずま

Re: 普通式から後置記法に変換でうまくコンパイルができない

#4

投稿記事 by かずま » 6年前

すみません。訂正です。

コード:

 67:    printf(".\n"); // printf(           "%d\n", opr);
 81:    opr += evalTerm(); printf("+ ");
 85:    opr -= evalTerm(); printf("- ");
103:    opr *= evalFactor(); printf("* ");
107:    opr /= evalFactor(); printf("/ ");
110:    opr %= evalFactor(); printf("% ");
131:    opr = atoi(tkn); printf("%d ", opr);

box
記事: 2002
登録日時: 13年前

Re: 普通式から後置記法に変換でうまくコンパイルができない

#5

投稿記事 by box » 6年前

今回の事象は「うまくコンパイルできない」ではなく、
「うまくコンパイルはできるけど、思ったとおりに動かない」というのが
正しそうです。
もし、「コンパイル」という用語の意味を正しく理解していないのであれば、
この機会に覚えておくとよいかもしれません。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。


返信

“C言語何でも質問掲示板” へ戻る