|
掲示板に投稿する前に、【掲示板ご利用上の注意】ぐらいはちゃんと読みましょう。
投稿するときに、プログラムが左詰になるのがわかるはずですが、それを
変だとは思わないのでしょうか?
題名も内容を表さず不適切です。「カッコのついた数式処理」あるいは
「数式処理」だけでもかまわないでしょう。
プログラムもかなりいい加減ですね。
10+3= だと result = 4
1 2+3= だと result = 15
--7= だと result = -7
全部書き直さないとだめなんでしょうが、最小限の修正で括弧が使えるように
してみました。
#include <stdio.h>
typedef enum { NUM, OP, END } STATE;
int result = 0, mresult = 0, num, sign;
char op = ' ', mop = ' ';
int stack[100], *sp = stack;
void push(int result, int mresult, char op, char mop)
{
*sp++ = result; *sp++ = mresult; *sp++ = op; *sp++ = mop;
}
void pop(int *result, int *mresult, char *op, char *mop)
{
*mop = *--sp; *op = *--sp; *mresult = *--sp; *result = *--sp;
}
void calcmul(void)
{
switch (mop) {
case ' ': mresult = num*sign; break;
case '*': mresult *= num*sign; break;
case '/': mresult /= num*sign; break;
}
}
void calc(void)
{
calcmul();
switch (op) {
case ' ': result = mresult; break;
case '+': result += mresult; break;
case '-': result -= mresult; break;
}
mresult = 0;
mop = ' ';
}
int main(void)
{
char c;
STATE s = OP;
while ((c = getchar()) != EOF) {
switch (s) {
case OP:
if (c >= '0' && c <= '9') {
num = c - '0'; sign = 1; s = NUM;
} else if (c == '-') {
num = 0; sign = -1; s = NUM;
} else if (c == '(') {
push(result, mresult, op, mop);
sign = 1, result = 0, mresult = 0, op = ' ', mop = ' ';
}
break;
case NUM:
if (c >= '0' && c <= '9') {
num *= 10; num += c - '0';
} else if (c == '*' || c == '/') {
calcmul(); mop = c; s = OP;
} else if (c == '+' || c == '-') {
calc(); op = c; s = OP;
} else if (c == '=') {
calc(); printf("result = %d\n",result);
return 0;
} else if (c == ')') {
calc();
num = result;
sign = 1;
pop(&result, &mresult, &op, &mop);
}
break;
}
}
return 0;
}
|