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
No.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言語の場合、数値の型によっての最大値や最小値がマクロで定義されててヘッダで準備されてたりするるので、その辺を使うようにしてたらいろんなトコで面倒が少なかったりする。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語(構造体) 3 2022/07/05 20:08
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語初心者 構造体 課題について 1 2023/03/10 19:30
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
- C言語・C++・C# プログラミングを教えて欲しいです。 配列aは、int a[9]={7,6,12,8,3,5,10,9 4 2022/12/19 23:27
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
10個出力で改行したいのですが...
-
strcmp
-
printf で二進表示を行いたい。
-
改行について 1行に何個かづ...
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
C言語プログラミング
-
CTRL+Dでループを抜けるには
-
二つの整数値の大小比較
-
%P と %X の違い
-
scanfに文字が入力されたときに...
-
コマンドプロンプトがすぐ消える
-
C言語で、 printf()とwhile文を...
-
C言語
-
BMI値から体型を判定するプログ...
-
分数を表示するプログラム(長...
-
C言語で入力した変数の値から三...
-
ガウスの消去法、後退代入について
-
4の倍数を論理演算で表す。。
-
C言語について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語について
-
printf で二進表示を行いたい。
-
cshの文字列操作(0埋め)
-
10個出力で改行したいのですが...
-
コンパイルエラーについて
-
テキストカーソル位置の取得
-
strcmp
-
unsigned int型について
-
c言語でAからZまでを表示する...
-
printf( " %2d", p * q );
-
コマンドラインに出力した文字...
-
printfの出力内の文字をdefine...
-
ホームページをC言語で作りたい...
-
コマンドプロンプトがすぐ消える
-
小数点切捨て表示
-
【C言語教えてください】sin波...
-
switch分のケースを範囲数?に...
-
二つの整数値の大小比較
-
4の倍数を論理演算で表す。。
-
defineで定数が置き換えられな...
おすすめ情報
minB = fitness[0].bangou;
if (minH > fitness[i].shinchou) {
minH = fitness[i].shinchou;
minB = fitness[i].bangou;
}
}
printf("身長の最小値:%g 会員番号:%d\n", minH,minB);
これを追加することで上手くいきました。