アプリ版:「スタンプのみでお礼する」機能のリリースについて

Cプログラムの構造体について質問です。
ジムの会員4名の名簿を、表1に示す6個のメンバからなる 構造体(タグ名が club, 型は GYM型とする)で定義した配列 fitness[] を使って作成し、表2のデータをセットした。
この会員データを用いて下記の(1)~(5)を求め画面に表示するプログラムを作成してください。なお、メンバのアクセスにはポインタとアロー演算子を用いること。
(1) 平均年齢, (2) 平均身長, (3) 平均体重, (4) 体重の最大値とその会員番号
(5) 身長の最小値とその会員番号
について(1)~(4)は問題なかったのですが、(5)番の会員番号の値だけが違った値になってしまいます。
どうすれば正しい会員番号を出力してくれるのでしょうか?
回答お願いします。

ソースコード
#include <stdio.h>
#define NUM 4
int main(void) {
int sumA = 0, maxB,minB;
float sumH = 0, sumW = 0, maxW, minH;
int i;

typedef struct club {
int bangou;
char name[20];
char seibetsu;
int nenrei;
float shinchou;
float taijuu;
}GYM;

GYM fitness[] = {
{1401,"Yamada",'m',40,170.2,67.9},
{1402,"Suzuki",'f',22,152.4,47.9},
{1403,"Nakano",'f',30,160.5,50.2},
{1404,"Morita",'m',52,168.3,72.4} };

maxB = fitness[0].bangou;
minB = fitness[0].bangou;
maxW = fitness[0].taijuu;
minH = fitness[0].shinchou;
for (i = 0; i < 4; i++) {
sumA += fitness[i].nenrei;
sumW += fitness[i].taijuu;
sumH += fitness[i].shinchou;
if (maxW < fitness[i].taijuu) {
maxW = fitness[i].taijuu;
maxB = fitness[i].bangou;
minB = fitness[i].bangou;
}
if (minH > fitness[i].shinchou)minH = fitness[i].shinchou;
}
printf("平均年齢:%g\n", sumA / 4.0);
printf("平均身長:%g\n", sumH / 4.0);
printf("平均体重:%g\n", sumW / 4.0);
printf("体重の最大値:%g 会員番号:%d\n", maxW,maxB);
printf("身長の最小値:%g 会員番号:%d\n", minH,minB);
return(0);
}

実行結果
平均年齢:36
平均身長:162.85
平均体重:59.6
体重の最大値:72.4 会員番号:1404
身長の最小値:152.4 会員番号:1404

「Cプログラムについて」の質問画像

質問者からの補足コメント

  • minB = fitness[0].bangou;
    if (minH > fitness[i].shinchou) {
    minH = fitness[i].shinchou;
    minB = fitness[i].bangou;
    }
    }
    printf("身長の最小値:%g 会員番号:%d\n", minH,minB);
    これを追加することで上手くいきました。

      補足日時:2021/06/05 19:45

A 回答 (1件)

#include <stdio.h>


#include <float.h>
#define NUM 4

typedef struct club {
 int bangou;
 char name[20];
 char seibetsu;
 int nenrei;
 float shinchou;
 float taijuu;
} GYM;

int main(void) {
 int sumA = 0, maxB, minB;
 float sumH = 0, sumW = 0, maxW = 0.0, minH = FLT_MAX;
 GYM fitness [] = {
          {1401, "Yamada", 'm', 40, 170.2, 67.9},
          {1402, "Suzuki", 'f', 22, 152.4, 47.9},
          {1403, "Nakano", 'f', 30, 160.5, 50.2},
          {1404, "Morita", 'm', 52, 168.3, 72.4}
 };
 for (int i = 0; i < NUM; i++) {
  sumA += fitness[i].nenrei;
  sumW += fitness[i].taijuu;
  sumH += fitness[i].shinchou;
  if (maxW < fitness[i].taijuu) {
   maxW = fitness[i].taijuu;
   maxB = fitness[i].bangou;
  }
  if (minH > fitness[i].shinchou) {
   minH = fitness[i].shinchou;
   minB = fitness[i].bangou;
  }
 }
 printf("平均年齢: %g\n", sumA / (float)NUM);
 printf("平均身長: %g\n", sumH / (float)NUM);
 printf("平均体重: %g\n", sumW / (float)NUM);
 printf("体重の最大値: %g 会員番号: %d\n", maxW, maxB);
 printf("身長の最小値: %g 会員番号: %d\n", minH, minB);
 return 0;
}

1. せっかくマクロでNUMを定義してるのに使ってない。勿体無い。
2. 良くあるパターンでは、構造体の定義自体はmain関数の外側で行う。
3. 最大値を求める場合、良くあるパターンは最大値 = 0と初期化しておいて、これと比較してより大きい値を代入する、と言う手が使われる。
じゃあ、最小値はどうするのか。どういう最大値を与えるのか、とアタマを悩ます事が場合には起きる。
今回のケースだとfloat.hに定義されてるfloatの実際の最大値を使う、と言う手が考えられる。C言語の場合、数値の型によっての最大値や最小値がマクロで定義されててヘッダで準備されてたりするるので、その辺を使うようにしてたらいろんなトコで面倒が少なかったりする。
    • good
    • 0

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