括弧の式による演算

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

括弧の式による演算

#1

投稿記事 by MP » 15年前

はじめまして。質問させていただきます。

私は大学で情報工学科に通う二年生です。大学の課題で出た問題を自分だけでは解決できないため、ご助力願いたいです。
C言語の理解度としましては、大学のC言語の授業にはついていけなくなってきてまして、ポインタに関して理解に自信がありません。という程度です。
課題の提出期限の関係から今月13日(日)までには仕上げたいと考えています。

問題は、足し算や掛け算といった演算を括弧を用いて表すというものです。
(1 2 3)は1+2+3と考えます。
加算を()、減算を{}、乗算を[/url]、除算を<>を用いて表し、たとえば、
[10 {60 24 5} 3] → 10*(60-24-5)*3
となります。括弧内の初項に2項目以降を指定の演算で計算するようになっています。

課題としては、文字列として与えられた正しいこの式の値を求めるプログラムを作成するというものです。

プログラムを作成してみてはいるのですが、コンパイルが通らずです。エラーコードを読み取り見直しましても、間違ってないような・・・という感じでどこが間違っているのかわかりません。どのような間違いをおかしていますでしょうか?

・プログラム
#include <stdio.h>
#include <string.h>
#include <math.h>

int i=0;

int calc(char *buff){
	int result;
	int result_empty=1;
	int calc_type;
	int term=0;
	int term_sign=1;
	int term_figure=0;
	int term_complete=0;

	/* 計算の種類を開き括弧から判断している */
	switch(buff){
		case '(':
			calc_type=1;
			i++;
			break;
		case '{':
			calc_type=2;
			i++;
			break;
		case '[':
			calc_type=3;
			i++;
			break;
		case '<':
			calc_type=4;
			i++;
			break;
		default:
			break;
	}

	/* 入力された文字列の最後まで読み終えたら繰り返し文から抜ける */
	while(i < signed int(strlen(buff))){

		/* 現在読んでいる一文字から何をするか判断している */
		switch(buff){
			/* 開き括弧ならcalc関数を呼び出し変数termに代入する */
			case '(':
			case '{':
			case '[':
			case '<':
				term=calc(buff);
			/* 空白および閉じ括弧なら一つの項が完成したとみなす */
			case ')':
			case '}':
			case ']':
			case '>':
			case ' ':
				term_complete=1;
				break;
			/* それ以外なら数字または-記号とみなし項の桁を増やす */
			default:
				term_figure++;
				break;
		}

		/* 項を読み終えたら項の計算に入る */
		if(term_complete){
			while(term_figure>0){
				/* もし-記号があれば変数term_signに-1を代入 */
				if(buff[i-term_figure]=='-'){
					term_sign=-1;
				}else{
				/* もし-以外(数字)であれば項に数字を加算していく */
					term=	term+
						term_sign*					/* 項の記号 */
						int(buff[i-term_figure]-'0')*			/* それぞれの桁の数字 */
						int(pow(double(10), double(term_figure-1)));	/* その数字が何桁目にあるか */
				}
				term_figure--;
			}

			/* 項が完成したら変数resultに計算していく */
			/* もし変数resultが何も手をつけられていない状態なら */
			/* 変数termをそのまま代入する */
			if(result_empty){
				result=term;
				result_empty=0;
			}else{
			/* そうでないならそれぞれの計算の種類にそってresultを計算する */
				switch(calc_type){
					case 1:
						result=result+term;
						break;
					case 2:
						result=result-term;
						break;
					case 3:
						result=result*term;
						break;
					case 4:
						result=result/term;
						break;
					default:
						break;
				}
			}
			term=0;
			term_sign=1;
			term_complete=0;
		}

		/* 読んでいる一文字が閉じ括弧なら繰り返し文から抜け変数resultを返す */
		if(	buff==')'||
			buff=='}'||
			buff==']'||
			buff=='>'){
				i++;
				break;
		}
		i++;
	}
	return result;
}

int main(void){
# define BUFSIZE 256
	char buff[BUFSIZE];
	fgets(buff, BUFSIZE, stdin);
	printf("%s => %d", buff, calc(buff));
	return 0;
}


・エラーコード
bq3.c: In function `calc':
bq3.c:47: error: parse error before "signed"
bq3.c:58: error: case label not within a switch statement
bq3.c:59: error: case label not within a switch statement
bq3.c:60: error: case label not within a switch statement
bq3.c:61: error: case label not within a switch statement
bq3.c:62: error: case label not within a switch statement
bq3.c:64: error: break statement not within loop or switch
bq3.c:66: error: `default' label not within a switch statement
bq3.c:68: error: break statement not within loop or switch
bq3.c: At top level:
bq3.c:72: error: parse error before "if"
bq3.c:92: warning: data definition has no type or storage class
bq3.c:93: error: parse error before '}' token
bq3.c:112: warning: data definition has no type or storage class
bq3.c:113: warning: data definition has no type or storage class
bq3.c:114: warning: data definition has no type or storage class
bq3.c:115: error: parse error before '}' token


環境  
 [2.1] OS : Windows vista (Cygwinを使っています。)
 [2.2] コンパイラ名 : gcc

宜しくお願いします。

Libra

Re:括弧の式による演算

#2

投稿記事 by Libra » 15年前

while(i < signed int(strlen(buff))){ 
のsigned int の部分を

signed int→(signed int)

にしてはどうでしょう?
変更したところ、BCCコンパイラでは通りました。

MP

Re:括弧の式による演算

#3

投稿記事 by MP » 15年前

文法的な間違いだったということでしょうか。
gccだと、Libraさんのようにすると、たしかにエラーコードはほとんどなくなったのですが、まだ一つ文法的な間違いをおかしているようです。探してみましたが、見つかりません。どこだかわかりますでしょうか。

・エラーコード
bq3_a.c: In function `calc':
bq3_a.c:73: error: parse error before "int"

・場所
int(buff[i-term_figure]-'0')*			/* それぞれの桁の数字 */
が73行目です。

sizuma

Re:括弧の式による演算

#4

投稿記事 by sizuma » 15年前

文の途中にコメント入れたらだめ。
とかでしょうか?

コンパイラは全くわからないんですけどね(笑

pooka

Re:括弧の式による演算

#5

投稿記事 by pooka » 15年前

>int(buff[i-term_figure]-'0')*

(int)(buff[i-term_figure]-'0')*
のようにしてみてください。

Libra

Re:括弧の式による演算

#6

投稿記事 by Libra » 15年前

VisualStudio2008でもコンパイルしてみたところ、
最初に提示されたソースでコンパイルが通りました。
変更無しで通ったためびっくりしました(^^;)

型変換(キャスト)を明示的行う際に、
gccでは括弧で括る必要があるようですね。

規約に「コンパイラの種類を提示して下さい」とありますが、
まさにこのことですね。
学校の課題という事なので、恐らく先生がある程度作成したプログラム
だと思うのですが、出題者は別のコンパイラを使用したのでしょうね。

コンパイラでここまで違うものなのですね。
勉強になります。m(_ _)m

MP

Re:括弧の式による演算

#7

投稿記事 by MP » 15年前

皆さんのコメントを参考に色々と弄っていたのですが、Libraさんのご指摘で解決いたしました。
C言語でもコンパイラの違いによって、書き方も異なったりするのですね。なるほどです。
コメントくださった方々、ありがとうございました。

pooka

Re:括弧の式による演算

#8

投稿記事 by pooka » 15年前

Libraさん
>VisualStudio2008でもコンパイルしてみたところ、
>最初に提示されたソースでコンパイルが通りました。
とありますが、C++としてコンパイルしていませんか?
Cとしてコンパイルしたところ同じようなエラーになりましたので・・・

閉鎖

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