ページ 11

ある問題のプログラムを綺麗にしたいです

Posted: 2013年11月06日(水) 15:04
by JOISO
https://www.ioi-jp.org/joi/2010/2011-yo ... yo-t1.html
ここのサイトの問題のプログラムを作ってみました。

コード:

#include <stdio.h>

int main(int argc, const char * argv[])
{

    // insert code here...
    int a,b,c,d,x,y;
    double goukei;
    scanf("%d%d%d%d",&a,&b,&c,&d);
    goukei = a+b+c+d;
    x = goukei / 60;
    y = (goukei /60 - x)*60+0.999;
    printf("%d\n%d",x,y);
    return 0;
}

かなり無理矢理に作ったのでとても美しいとは言えないプログラムになってしまいました。
バグ、計算ミスが少なく、かつ綺麗にまとめるとどのようになるのかが知りたいです。
どなたか解答の作成お願いしますm(_ _)m

Re: ある問題のプログラムを綺麗にしたいです

Posted: 2013年11月06日(水) 15:19
by h2so5
計算機は計算ミスをしません。

コード:

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

int main(void) {
	int i, sec, sum = 0;
	div_t res;
	for (i = 0; i < 4; ++i) {
		scanf("%d", &sec);
		sum += sec;
	}
	res = div(sum, 60);
	printf("%d\n%d", res.quot, res.rem);
	return 0;
}

Re: ある問題のプログラムを綺麗にしたいです

Posted: 2013年11月06日(水) 17:28
by ISLe
こういうのはどうでしょう。

コード:

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

int main(void) {
    div_t res;
    int sum, sec;
    for (sum = 0; scanf("%d", &sec) == 1; sum += sec);
    res = div(sum, 60);
    printf("%d\n%d", res.quot, res.rem);
    return 0;
}

Re: ある問題のプログラムを綺麗にしたいです

Posted: 2013年11月06日(水) 21:23
by みけCAT
個人的には
・コマンドライン引数を使用しないならmainの引数はvoid
・変数のスコープは必要最低限
・(ほとんどの)オンラインジャッジが要求するように、行の最後は必ず改行を入れる(質問のプログラムとは出力が変わるが)
・div関数は使わず、普通に書いたほうが可読性が上がる(気がする)
 →苦Cにも「この関数より、演算子 / や % を使うことをお勧めする。」と書いてある
がいいと思います。
これに従うと、

コード:

#include <stdio.h>

int main(void) {
	int i,sum=0;
	for(i=0;i<4;i++) {
		int input;
		scanf("%d",&input);
		sum+=input;
	}
	printf("%d\n%d\n",sum/60,sum%60);
	return 0;
}
このようになりました。