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ランキング
-
error C2143: 構文エラー : ';'...
-
hit&bolwのプログラミングがで...
-
困ってます!Cプログラミングに...
-
万年カレンダーのC言語プログラ...
-
C言語での、年複利の計算方法...
-
(C言語)めちゃくちゃな値にな...
-
ヘロンの公式を作ったプルグラ...
-
ブラックジャック
-
コマンドプロンプトがすぐ消える
-
勝率をプログラムに
-
平均合計偏差値標準偏差の出し方
-
C言語
-
関数について
-
printf()文の書式
-
C言語で四則演算を使って10を作...
-
if文がコンパイルエラーを起こ...
-
scanfで正しい値を入力できない
-
DOS画面でテキストカーソルの位...
-
C言語で、「自然数nを入力し、n...
-
2進数の乗算と除算
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
10個出力で改行したいのですが...
-
既約分数の表示プログラム
-
printf で二進表示を行いたい。
-
8人分のテストの点数を入力し、...
-
printf( " %2d", p * q );
-
strcmp
-
CTRL+Dでループを抜けるには
-
4の倍数を論理演算で表す。。
-
%P と %X の違い
-
【C言語教えてください】sin波...
-
c言語でAからZまでを表示する...
-
cshの文字列操作(0埋め)
-
万年カレンダーのC言語プログラ...
-
コマンドラインに出力した文字...
-
scanfに文字が入力されたときに...
-
コンパイルエラーについて
-
ホームページをC言語で作りたい...
-
改行について 1行に何個かづ...
-
台形の面積を求めるプログラム
-
なぜgccはstdio.hをインクルー...
おすすめ情報
minB = fitness[0].bangou;
if (minH > fitness[i].shinchou) {
minH = fitness[i].shinchou;
minB = fitness[i].bangou;
}
}
printf("身長の最小値:%g 会員番号:%d\n", minH,minB);
これを追加することで上手くいきました。