ページ 1 / 1
プログラム指摘
Posted: 2015年8月22日(土) 20:14
by sim
コード:
#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がなくともできると指摘されました。また、不要なブロックがあるみたいです。
よろしくお願いします。
Re: プログラム指摘
Posted: 2015年8月22日(土) 21:39
by みけCAT
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;
}