プログラム指摘

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

プログラム指摘

#1

投稿記事 by sim » 10年前

コード:

#include<stdio.h>
#define NUM 5

int main(void)
{
	int i;
	int max=0,min=0;
	int tmp1=0,tmp2=0;
	int ave=0,sum=0;
	int month[NUM];
	
	printf("%d人の得点を入力してください。\n",NUM);
	for(i=0;i<5;i++)
	{
		scanf("%d",&month[i]);
		sum=sum+month[i];
		if(i == 0)
		{
			max=month[i];
			min=month[i];
			tmp1=1;
			tmp2=1;
		}
		else if(max < month[i])
		{
			max=month[i];
			tmp1=i+1;
		}
		else if(min < month[i])
		{
			min=month[i];
			tmp2=i+1;
		}
	}
		ave=sum/5;
		
		printf("┌──────┬──────┐\n");
		printf("│番号  │  得点│  \n");
	for(i=0;i<NUM;i++)
	{
		printf("├──────┼──────┤\n");
		printf("│%d番   │ %d点  │\n",i+1,month[i]);
		
	}
		printf("├──────┼──────┤\n");
		printf("│合計  │ %d点 │\n",sum);
		printf("├──────┼──────┤\n");
		printf("│平均  │ %d点  │\n",ave);
		printf("└──────┴──────┘\n");
	{
		printf("最高点は%d番の%dです。\n",tmp1,max);
		printf("最低点は%d番の%dです。\n",tmp2,min);
	}
	
	return 0;
}
このプログラムはmax,minがなくともできると指摘されました。また、不要なブロックがあるみたいです。
よろしくお願いします。

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

Re: プログラム指摘

#2

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

sim さんが書きました:このプログラムはmax,minがなくともできると指摘されました。
効率を下げれば確かにできます(といっても定数倍ですが)が、効率を変えないのは難しそうですね。
sim さんが書きました:また、不要なブロックがあるみたいです。
少なくとも2通りの解釈が考えられます。
1. 無駄にブロックにしている部分がある
2. 不要な処理をしているブロックがある (この解釈の場合、仕様にもよるがmax,minも必要なさそう)
どっち、もしくはその他でしょうか?

ついでに、せっかくNUMを定義しているのに、ループ回数にマジックナンバーを使用しているのも問題だと思います。

指摘の内容を参考にし、修正してみました。

コード:

#include<stdio.h>
#define NUM 5

/* 関数の定義に使うブロックは消せない? */
int main(void)
{
	int i;
	int tmp1=0,tmp2=0;
	int ave=0,sum=0;
	int month[NUM];
	
	printf("%d人の得点を入力してください。\n",NUM);
	for(i=0;i<NUM;i++)
		/* ブロックを使わなくていいところはブロックの代わりに順次演算子を使う。以下同様 */
		scanf("%d",&month[i]),
		sum=sum+month[i];
	ave=sum/5;
		
		printf("┌──────┬──────┐\n");
		printf("│番号  │  得点│  \n");
	for(i=0;i<NUM;i++)
		printf("├──────┼──────┤\n"),
		printf("│%d番   │ %d点  │\n",i+1,month[i]);

		printf("├──────┼──────┤\n");
		printf("│合計  │ %d点 │\n",sum);
		printf("├──────┼──────┤\n");
		printf("│平均  │ %d点  │\n",ave);
		printf("└──────┴──────┘\n");
	/* 変数名と内容が一致しなくなるが、メモリを節約するため(?)に変数を使いまわす */
	ave=0;
	sum=0;
	for(i=0;i<NUM;i++)
		/* if文の代わりに三項演算子を用いて、ブロックの使用を回避する */
		(tmp2 < month[i])
		?(
			tmp2=month[i],
			tmp1=i+1
		):(
		(ave < month[i])
		?(
			ave=month[i],
			sum=i+1
		):0);

		printf("最高点は%d番の%dです。\n",tmp1,tmp2);
		/* よくわからないアルゴリズムに基づいた最低点ではない何かが表示されるが、あえて仕様は変更しないでおく */
		printf("最低点は%d番の%dです。\n",sum,ave);
	
	return 0;
}
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

閉鎖

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