私は大学で情報工学科に通う二年生です。大学の課題で出た問題を自分だけでは解決できないため、ご助力願いたいです。
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
宜しくお願いします。