質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

801閲覧

肥満度の小さい人 for文

YuhiKUROIWA

総合スコア9

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/06/08 11:59

編集2020/06/08 14:06

肥満度を知るのに BMI (Body Mass Index) がよく使われる。BMI は、 体重 w Kg, 身長 h m に対してつぎの式で定義される値をいう。

w / h^2

何人かの人について、名前・身長・体重が与えられているとき、 その中で一番 BMI の小さい人を見つけるプログラムを作れ。

入力は、何行かにわたる。各行には、名前(ローマ字姓)、身長(単位 cm)、体重(単位 Kg)が この順に1個以上の空白で区切られて書かれている。標準入力がキーボードから行われるときは、入力の最後に C-d を入力する。出力は、 BMI が最も小さかった人の名前を1行として書き出す。

が問題です。下のソースコードを実行した結果答えが一致しませんでした。数人いる中、どの場合でも一番上に来ている人が答えとなっているように感じます。多分ですが、for文の中身が上手くできていないと思うのですがわかりません。
どなたかお答えいただけると嬉しいです。

入力を以下のようにすると
kawamoto 170 65
shimano 167 60
okano 180 90
出力結果がkawamotoとなりました。本来ならshimanoとなるのが正解です。

コード#include <stdio.h> struct number{ char name[1000]; double h; double w; double x; }; int main(void){ struct number b[1000]; int i; while(1){ if(scanf("%s %d %d", b[i].name, &b[i].h, &b[i].w)==EOF){ b[i].x=b[i].w/(b[i].h*b[i].h); break; } i++; } double min=100; int num; int j=0; for(j=0;j<i;j++){ if(min>b[j].x){ min=b[j].x; num=j; } } printf("%s\n", b[num].name); return 0; }

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

BMI は、 体重 w Kg, 身長 h m

入力は、何行かにわたる。各行には、名前(ローマ字姓)、身長(単位 cm)、

身長のセンチメートルからメートルへの変換はどこでやっているのですか?

質問には、「うまくいかない」ではなく、「入力をこれこれにしたら、出力がこれになった。
実際はこうなってほしい」のように具体的に書きましょう。

投稿2020/06/08 13:57

kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YuhiKUROIWA

2020/06/08 14:04

単位は共通なので変換がいらないと思い行っていません。 実行結果乗せました。よろしくおねがいします。
YuhiKUROIWA

2020/06/08 15:01

解決しました。ご指摘ありがとうございます。
guest

0

ベストアンサー

scanf("%s %d %d", b[i].name, &b[i].h, &b[i].w)
doubleを読み取るための書式指定は%lfです。

numiが初期化されていません。

scanfの戻り値がEOFになった時しかBMI計算していません。
つまり、入力された身長体重に対してはBMI計算せずに不定値が入っています。

C

1 if (scanf("%s %lf %lf", b[i].name, &b[i].h, &b[i].w) == EOF) { 2 b[i].x = b[i].w / (b[i].h * b[i].h); 3 break; 4 }

投稿2020/06/08 12:06

編集2020/06/08 12:11
SHOMI

総合スコア4079

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

YuhiKUROIWA

2020/06/08 12:52

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

2020/06/08 12:56

変更して実行してみたのですがうまくいきません。どうしたらよいですか。
SHOMI

2020/06/08 13:05 編集

うまくいきませんとだけ書かれてもわかりません。 どのように書き換えて、どううまくいかないのですか?
YuhiKUROIWA

2020/06/08 13:22

scanf分をlfにして、numとiを0で初期化しました。
SHOMI

2020/06/08 13:25 編集

>scanf分をlfにして、numとiを0で初期化しました。 質問文に変更後のコードを追記してください。 「どううまくいかない」のかも書いてください。
YuhiKUROIWA

2020/06/08 13:37

実行結果が最初と変わらず表示されてしまいます。
YuhiKUROIWA

2020/06/08 14:08

出力結果は質問のところに追記しました。
SHOMI

2020/06/08 14:18

コードも貼ってください
SHOMI

2020/06/08 14:20

>scanf分をlfにして、numとiを0で初期化しました コードの指摘はそれだけではありませんが…
YuhiKUROIWA

2020/06/08 14:46

#include <stdio.h> struct number{ char name[1000]; double h; double w; double x; }; int main(void){ struct number b[1000]; int i=0; while(1){ if(scanf("%s %lf %lf", b[i].name, &b[i].h, &b[i].w)==EOF){ b[i].x=b[i].w/(b[i].h*b[i].h); break; } i++; } double min=100; int num=0; int j=0; for(j=0;j<i;j++){ if(min>b[j].x){ min=b[j].x; num=j; } } printf("%s\n", b[num].name); return 0; } コード貼りました。よろしくお願いします。
SHOMI

2020/06/08 14:52

他の方たちにも気づかれるようコメント欄ではなく、質問文に追記してください。 b[i].x=b[i].w/(b[i].h*b[i].h);の指摘が直っていません。 ifの外に出してください。
YuhiKUROIWA

2020/06/08 15:00

すみません。よく読んでいませんでした。無事実行できました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問