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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
asdjack
記事: 22
登録日時: 8年前

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

#1

投稿記事 by asdjack » 7年前

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が帰ってくるのですが
どこがおかしいか見当が付きません。
ご指摘お願いいたします。

box
記事: 1745
登録日時: 9年前

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

#2

投稿記事 by box » 7年前

2桁以上の数値を入力した場合のロジックはどこにありますか?
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 1745
登録日時: 9年前

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

#3

投稿記事 by box » 7年前

問題は別のところにあるのかもしれません。例えば
asdjack さんが書きました:

コード:

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

# 的外れな指摘かも。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

salsaww

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

#4

投稿記事 by salsaww » 7年前

こちらの環境で試して見た範囲では、普通に動作するようです。
Visual Studio 2012/Windows7

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

アバター
みけCAT
記事: 6244
登録日時: 9年前
住所: 千葉県
連絡を取る:

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

#5

投稿記事 by みけCAT » 7年前

tがint型なのがまずいと思います。
tはdouble型であるべきではないでしょうか?

撃墜ケース

コード:

3 2 /
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

asdjack
記事: 22
登録日時: 8年前

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

#6

投稿記事 by asdjack » 7年前

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

閉鎖

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