ページ 11

AOJのStrange Mathematical Expression

Posted: 2011年3月26日(土) 15:03
by みけCAT
この問題を解いています。
これが書いたコードです。

コード:

#include <stdio.h>
#include <stdlib.h>

int main(void) {
	double stack[200];
	char temp[100];
	int stackptr=0;
	while(1) {
		if(scanf("%s",temp)==-1)break;
		if(temp[0]=='+') {
			if(stackptr<2)return 1;
			stack[stackptr-2]+=stack[stackptr-1];
			stackptr--;
		} else if(temp[0]=='-') {
			if(stackptr<2)return 1;
			stack[stackptr-2]-=stack[stackptr-1];
			stackptr--;
		} else if(temp[0]=='*') {
			if(stackptr<2)return 1;
			stack[stackptr-2]*=stack[stackptr-1];
			stackptr--;
		} else if(temp[0]=='/') {
			if(stackptr<2)return 1;
			if(stack[stackptr-1]==0)return 1;
			stack[stackptr-2]/=stack[stackptr-1];
			stackptr--;
		} else {
			stack[stackptr]=atof(temp);
			stackptr++;
		}
		if(getchar()=='\n') {
			if(stackptr!=1)return 1;
			printf("%f\n",stack[0]);
			stackptr=0;
		}
	}
	return 0;
}
これを送信すると、Runtime Errorになります。
デバッグしてみたところ、4つある

コード:

if(stackptr<2)return 1;
のところのいずれかで弾かれているようです。
ここは、スタックに積まれている数が少なすぎないかの判定をしています。
ここを取ってもRuntime Errorになります。
どこが間違っているか教えていただけると嬉しいです。
よろしくお願いします。

Re: AOJのStrange Mathematical Expression

Posted: 2011年3月26日(土) 15:54
by みけCAT
チャットで聞いて解決できました。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
	double stack[200];
	char temp[100];
	int stackptr=0;
	while(1) {
		if(scanf("%s",temp)==-1)break;
		if(strcmp(temp,"+")==0) {
			if(stackptr<2)return 1;
			stack[stackptr-2]+=stack[stackptr-1];
			stackptr--;
		} else if(strcmp(temp,"-")==0) {
			if(stackptr<2)return 1;
			stack[stackptr-2]-=stack[stackptr-1];
			stackptr--;
		} else if(strcmp(temp,"*")==0) {
			if(stackptr<2)return 1;
			stack[stackptr-2]*=stack[stackptr-1];
			stackptr--;
		} else if(strcmp(temp,"/")==0) {
			if(stackptr<2)return 1;
			if(stack[stackptr-1]==0)return 1;
			stack[stackptr-2]/=stack[stackptr-1];
			stackptr--;
		} else {
			stack[stackptr]=atof(temp);
			stackptr++;
		}
		if(getchar()=='\n') {
			if(stackptr!=1)return 1;
			printf("%f\n",stack[0]);
			stackptr=0;
		}
	}
	return 0;
}