【AOJの問題】これは直角三角形ですか? において、ランタイムエラーが発生します

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

【AOJの問題】これは直角三角形ですか? において、ランタイムエラーが発生します

#1

投稿記事 by kerotan0820 » 13年前

http://judge.u-aizu.ac.jp/onlinejudge/d ... 03&lang=jp

Aizu Online Judge の問題で、これは直角三角形ですか?という問題があります。
それが上のURLになります。

問題を解いてみたのですが、プログラムを投稿すると、審査でランタイムエラーになってしまいます。
原因が分からず困っております。
プログラムは此方です。

コード:


#include<stdio.h>

void sort(int a[3]);
void triangle(int a[3]);

void main(void)
{
	int n=0,i;
	int a[3];

	scanf("%d",&n);
	
	for(i=0;i<n;i++)
	{
		if(scanf("%d %d %d",&a[0],&a[1],&a[2]) == 3)
		{
			sort(a);
			triangle(a);
		}
	}
}

void sort(int *x)
{
	int humi;
	int i,j;

	for(i=0;i<3; i++)
	{
		for(j=i+1; j<3; j++)
		{
			if(x[i]<x[j])
			{
				humi = x[i];
				x[i] = x[j];
				x[j] = humi;
			}
		}
	}
}

void triangle(int *x)
{
	int a,b,c;

	a = x[1];
	b = x[2];
	c = x[0];

	if((a*a)+(b*b) == c*c)
	{
		printf("YES\n");
	}else
	{
		printf("NO\n");
	}
}
見難いプログラムで申し訳ありません。

三辺の長さを降順にソートし、a^(2)+b^(2) = c^(2) という式に当てはまるか調べて結果を出力するようにしています。

よろしければ、回答の程よろしくお願い致します。
けろけろにゃー (」・ω・)」うー!

box
記事: 2002
登録日時: 14年前

Re: 【AOJの問題】これは直角三角形ですか? において、ランタイムエラーが発生します

#2

投稿記事 by box » 13年前

どういう基準でチェックしているかはよくわかりませんが、仕様に

>1000 以下の3つの正の整数を入力し、

という記述がある以上、ここがノーチェックだとまずいのではないか、という気がします。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: 【AOJの問題】これは直角三角形ですか? において、ランタイムエラーが発生します

#3

投稿記事 by beatle » 13年前

AOJなどの問題は入力が完全に仕様通りであることが保証されていますので、特に入力値のチェックは必要ないかと思います。
ぱっと見で気づくのは main 関数の戻り値が void になってしまっていることです。
規格では int main が正しいです。

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

Re: 【AOJの問題】これは直角三角形ですか? において、ランタイムエラーが発生します

#4

投稿記事 by asdjack » 13年前

このプログラムをCで提出したのなら、main関数でreturn 0 を返していないのが原因だと思います。
AOJのJudge's RepliesのRuntime Errorの欄にmain関数は0を返すようにと書いてあるので
そこで引っかかっているのだと思います。

kerotan0820
記事: 91
登録日時: 14年前

Re: 【AOJの問題】これは直角三角形ですか? において、ランタイムエラーが発生します

#5

投稿記事 by kerotan0820 » 13年前

box さんが書きました:どういう基準でチェックしているかはよくわかりませんが、仕様に

>1000 以下の3つの正の整数を入力し、

という記述がある以上、ここがノーチェックだとまずいのではないか、という気がします。
回答有難うございます。
私も1000以上の入力に対する再入力を求める例外処理を加えるべきかとも思ったのですが、beatleさんとasdjackさんの回答の通り書き換えた所動作いたしました。

ただ問題文に対する回答としては例外処理を入れるのが正しいですね。
勉強になりました。ありがとうございます。

beatle さんが書きました:AOJなどの問題は入力が完全に仕様通りであることが保証されていますので、特に入力値のチェックは必要ないかと思います。
ぱっと見で気づくのは main 関数の戻り値が void になってしまっていることです。
規格では int main が正しいです。
int main に書き換えた所エラーは発生しませんでした。
誠にありがとうございました。
asdjack さんが書きました:このプログラムをCで提出したのなら、main関数でreturn 0 を返していないのが原因だと思います。
AOJのJudge's RepliesのRuntime Errorの欄にmain関数は0を返すようにと書いてあるので
そこで引っかかっているのだと思います。
return 0 を加えた所、エラーは発生いたしませんでした。
ありがとうございます。
けろけろにゃー (」・ω・)」うー!

閉鎖

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