ページ 11

逆ポーランド法のプログラムについて

Posted: 2013年1月12日(土) 19:24
by asdjack
http://judge.u-aizu.ac.jp/onlinejudge/d ... sp?id=0087
AOJの0087の逆ポーランド法の計算機を作るプログラムを解いていたのですが

コード:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
	char c[99],d[80];
	double s[80];
	int n,p,q,t;
	while(gets(c))
	{
		if(c[0] == 0)
			break;
		for(n=0,p=-1,q=0;c[n];n++)
		{
			switch(c[n])
			{
			case '+':
				t=s[p-1]+s[p];
				s[--p]=t;
				break;
			case '*':
				t=s[p-1]*s[p];
				s[--p]=t;
				break;
			case '/':
				t=s[p-1]/s[p];
				s[--p]=t;
				break;
			case ' ':
				if(q!=0)
				{
					s[++p]=atof(d);
					memset(d,NULL,80);
					q=0;
				}
				break;
			case '-':
				if(c[n+1]==' '||c[n+1]=='\0')
				{
					t=s[p-1]-s[p];
					s[--p]=t;
					break;
				}
			default:
				d[q++]=c[n];
			}
		}
		if(q!=0)
			s[0]=atof(d);
		printf("%f\n",s[0]);
	}
	return 0;
}
WrongAnswerが帰ってくるのですが
どこがおかしいか見当が付きません。
ご指摘お願いいたします。

Re: 逆ポーランド法のプログラムについて

Posted: 2013年1月12日(土) 19:28
by box
2桁以上の数値を入力した場合のロジックはどこにありますか?

Re: 逆ポーランド法のプログラムについて

Posted: 2013年1月12日(土) 20:58
by box
問題は別のところにあるのかもしれません。例えば
asdjack さんが書きました:

コード:

			case '-':
				if(c[n+1]==' '||c[n+1]=='\0')
				{
					t=s[p-1]-s[p];
					s[--p]=t;
					break;
				}
if文の条件が真のときだけしかbreakしないようになっているから、とか。

# 的外れな指摘かも。

Re: 逆ポーランド法のプログラムについて

Posted: 2013年1月13日(日) 09:37
by salsaww
こちらの環境で試して見た範囲では、普通に動作するようです。
Visual Studio 2012/Windows7

もしかして、入力文が正しくないからとかじゃないですか?
エラーチェックはされていないようなので、おかしな入力では、計算ができないのは当然なので。

Re: 逆ポーランド法のプログラムについて

Posted: 2013年1月13日(日) 09:47
by みけCAT
tがint型なのがまずいと思います。
tはdouble型であるべきではないでしょうか?

撃墜ケース

コード:

3 2 /

Re: 逆ポーランド法のプログラムについて

Posted: 2013年1月13日(日) 19:24
by asdjack
多くの回答ありがとうございます。
box さんが書きました:2桁以上の数値を入力した場合のロジックはどこにありますか?
読み込んだ文字列で数が連続しているうちはdに入れるようにして、スペースが来たらそれをatofでスタックへ入れるようにしています。また '-' が条件で抜けるようにしているのは負の値が来た時のための処理です。
みけCAT さんが書きました:tがint型なのがまずいと思います。
tはdouble型であるべきではないでしょうか?
tをdouble型にして再提出したところ Acceptされました。
いつも整数ばかりでテストしていたので小数点以下が落ちているのを見落としていました。