性格悪い人が優勝

二次元配列で、各配列の平均と最大の値を求めたいのですが上手くいきません。
どこをどのように直せば良いのでしょうか?

#include <stdio.h>
int main(void){
int i;
float sum1,sum2,sum3,sum4;
float max1,max2,max3,max4;
float a[4][3]={{76.51,78.25,76.99},{78.71,78.16,77.12},{79.14,80.59,78.88},{73.31,73.35,74.95}};

for(i=0;i<3;i++){
sum1=a[0][i]+sum1;
sum2=a[1][i]+sum2;
sum3=a[2][i]+sum3;
sum4=a[3][i]+sum4;
}

max1=a[0][1];
if(max1<a[0][2]){
max1=a[0][2];
}
if(max1<a[0][3]){
max1=a[0][3];
}

max2=a[1][1];
if(max2<a[1][2]){
max2=a[1][2];
}
if(max2<a[1][3]){
max2=a[1][3];
}

max3=a[2][1];
if(max3<a[2][2]){
max3=a[2][2];
}
if(max3<a[3][3]){
max3=a[3][3];
}

max4=a[4][1];
if(max4<a[4][2]){
max4=a[4][2];
}
if(max4<a[4][3]){
max4=a[4][3];
}

printf("<選手番号1>平均距離:%.2f,最大距離:%.2f\n",sum1/3,max1);
printf("<選手番号2>平均距離:%.2f,最大距離:%.2f\n",sum2/3,max2);
printf("<選手番号3>平均距離:%.2f,最大距離:%.2f\n",sum3/3,max3);
printf("<選手番号4>平均距離:%.2f,最大距離:%.2f\n",sum4/3,max4);

return 0;
}

A 回答 (3件)

> ありがとうございます。

参考にさせていただきます。

ほい、頑張って。

どこまで勉強進んでるか分からんけど、大きく言うと、

☆ 何でもかんでもmain関数内で処理しない

多分配列やってる辺りだともう関数を習ってる筈なんですが。
この問題のように、

> 各配列の平均と最大の値を求めたい

と言う場合、すぐ「平均と最大の値を同時に求めよう」としない。
そうじゃなくって、平均なら平均、最大なら最大を求める、と。
プログラムをする際に機能を最小限に抑える。そして「それらを組み合わせる」。
そのために「関数がある」のです。一つの機能を実装する為に。

大きく「全部いきなりやろう」としない事。全部いきなりやろうとすると、貴方のように混乱するんです。
小さいものを書く。そして小さいもの同士を「組み合わせていく」。結局それで目的のモノを作り上げるのです。
    • good
    • 0

#include <stdio.h>


#include <float.h>

float average(int n, float a[]){
 int acc = 0;
 for (int i = 0; i < n; i++) {
  acc += a[i];
 }
 return acc/n;
}

float max(int n, float a[]) {
 float min = -FLT_MAX;
 for (int i = 0; i < n; i++) {
  if (a[i] > min) {
   min = a[i];
  }
 }
 return min;
}

int main(void) {
 float a[4][3] = {{76.51, 78.25, 76.99},
        {78.71, 78.16, 77.12},
        {79.14, 80.59, 78.88},
        {73.31, 73.35, 74.95}};
for (int i = 0; i < 4; i++) {
 printf("<選手番号%d>平均距離:%.2f, 最大距離:%.2f\n", i + 1, average(3, a[i]), max(3, a[i]));
 }
 return 0;
}
「c言語について教えてください」の回答画像2
    • good
    • 0
この回答へのお礼

ありがとうございます。参考にさせていただきます。

お礼日時:2021/03/31 16:54

> for(i=0;i<3;i++){


> sum1=a[0][i]+sum1;

いきなり足し合わせる前に、sum1~sum4を0.0に初期化した方が良いのでは。
変数宣言すると0に初期化してくれるコンパイラとか処理系もあるけど、Cの仕様では中身の保証は無かったハズ。


改行無くすと、
max1=a[0][1];if(max1<a[0][2]){max1=a[0][2];}if(max1<a[0][3]){max1=a[0][3];}
max2=a[1][1];if(max2<a[1][2]){max2=a[1][2];}if(max2<a[1][3]){max2=a[1][3];}
max3=a[2][1];if(max3<a[2][2]){max3=a[2][2];}if(max3<a[3][3]){max3=a[3][3];}
max4=a[4][1];if(max4<a[4][2]){max4=a[4][2];}if(max4<a[4][3]){max4=a[4][3];}

配列の添え字が変じゃね?0,1,2,4とか。0,1,3,4とか。


課題の意図としては、最初に数値設定して以降の4回とか3回似たような事書いてる所は、繰り返し処理にまとめて欲しかったんだと思うけど。
    • good
    • 0
この回答へのお礼

ありがとうございます!もう一度考え直します。

お礼日時:2021/03/31 16:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!