• 締切済み

C言語でのプログラム作成について

授業でIf文の問題が出たのですが、なかなか上手く作成できないので、教えていただけないでしょうか。やればやるほど上手くいかなくて困っているのでお願いします。 問題 身長(cm)と体重(kg)を入力して、それらの値からBMI値を求め出力せよ。さらに求められたBMI値によりそれぞれ以下のようなメッセージを出力せよ。 BMI値          出力メッセージ 18.5以下        Yasegimidesu      18.5以上25.0以下   Futsuudesu 25.0以上30.0未満   Futorifimidesu 30.0以上        Futorisugidesu ※BMI値計算のための式は以下の通りです。(身長がメートル単位であることに注意) BMI値=体重(kg)÷(身長(m)×身長(m)) 例えば身長167cm、体重60kgの場合、 BMI値=60÷(1.67×1.67)となる。 よろしくお願いします。

みんなの回答

回答No.14

ついでに、キャストについてもうひとつ。 > BMI = wkg/((hcm/100)*(hcm/100)); これで、「もしも」hcm が int なら、明示的なキャストが必要になります。 (または、100 を 100.0 にして、暗黙のキャストをするか) ※もっとも、直前で、"%lf" でscanf() の 処理しているので、 hcm は double なのでしょけど。 ※hcm が double なら、暗黙のうちに 100 (これ、int ね)を double にする型変換が発生するので  実害はありません。 これも、ちゃんと、No.3 の回答で触れられています。

chocoholic39
質問者

補足

No,13で言われた変数などの確認もちゃんとしておきます。 先生に教わったのはヒントのみなのでコピーしたわけではありませんが… 他の方の回答も参考にして作り直してきます。 色々とご指摘ありがとうございます。

回答No.13

おまけ。 ついでに、「使っている変数」はちゃんと確認しましょう。 まさか、先生に質問して、答えをコピーしてきた訳ではないと思いますから。

回答No.12

> エラー出まくりでどこをどう直せばいいのかもわかりませんでした… せめてここまでの回答は見直しましょう。 少なくとも、No.3 の後半。 もっとも、 if(18.5<=BMI<25.0) では、「エラーは出ません」けどね。 一番最初の行をしっかり見直しましょう。 単なるタイプミスだけど、これがこけると、山ほどエラーが出ます。

chocoholic39
質問者

補足

まず一番最初のstdioが違いましたね。 やり直してもう一度確認しておきます。

回答No.11

エラーが出ているのは、 if( 18.5 <= BMI < 25.0 ) の箇所だと思います。 "<=" や "<" は二項演算子と言い、右辺値と左辺値の比較をします。 変数 BMI は、判定式の中で、同時に右辺値と左辺値にはなりませんので、 先の回答例のように、  (18.5 <= BMI) && (BMI < 25.0) と、論理演算子(これも二項演算子)で連結します。 また、if~else が使えているようですので、 if( BMI が 18.5 未満であるならば ) { printf("Yasegimidesu"); } else { /* このブロックは BMI が 18.5 以上 */ } となります。 従って、 if( BMI < 18.5 ) /* ... */ else if( 18.5 <= BMI ) /* <--- この判定式は冗長 */ /* ... */ となります。 「場合分け」で考えると、 if( BMI が 18.5 未満であるならば ) { /* ... */ } else if( BMI が ... であるならば ) { /* ... */ } else if( BMI が ... であるならば ) { /* ... */ } else { /* ... */ } と書けると思います。 (このような日本語とちゃんぽんなコードを擬似コードと言い、アルゴリズムの検討のために書くことがあります) /* がんばれ */

chocoholic39
質問者

補足

ありがとうございます。 論理演算子のことすっかり忘れていました。 もう一度やり直してみます。

回答No.10

> BMI値計算時にいると言われたのですが、使わなくてもいいのでしょうか? 1.キャストというのはどういう機能で、どういうときに使うものなのか説明してみてください。 2.たとえば、No.7 のソースのどこにキャスト演算子があるのか指摘してください。 こういうことを考えてみればわかるかな?

chocoholic39
質問者

補足

型名を()でくくったものを値などの前にかくと、それを特定の型に変換することができると教わりましたがいまいちわかっていません。 あと、今日、先生に質問したりして自分でできる範囲まで作成したのがこのプログラムです。 エラー出まくりでどこをどう直せばいいのかもわかりませんでした… かなりめちゃくちゃでお恥ずかしいのですが載せておきます。 include <studio.h> main() { int b; double height,weight,BMI; b=0 height=0.0; weight=0.0; BMI=0.0; printf("Enter Your height"); scanf("%if",&hcm); printf("Enter Your weight"); scanf("%if",&wkg); BMI = wkg/((hcm/100)*(hcm/100)); printf("Your BMI = %if\n",BMI); { if(BMI<18.5) printf("Yasegimidesu\n"); else if(18.5<=BMI<25.0) printf("Futsuudesu\n"); else if(25.0<=BMI<30.0) printf("Futorigimidesu\n"); else if(30.0<=BMI) printf("Futorisugidesu\n"); } }

回答No.9

それでは、以下の手順で考えましょう。 1.double 型の shincho, taiju を定義しましょう。(書いてみてください) 2.double 型の bmi を定義しましょう(以下同様) 3.shincho, taiju を入力してみましょう。 4.shincho は、cm 単位で入力していますが、BMI の計算式は m 単位です。 shincho を m 単位に換算しましょう。 5.bmi を算出しましょう。 6.bmi の値を出力しましょう。 7.bmi が、18.5未満の時の処理をしましょう。 8.bmi が、30以上の時の処理をしましょう。 まずは、ここまで書いてみてください。 回答の全部ではありませんが、最初のステップではあります。 1.~ 8.はそれぞれ単独でも書けるはずです。

回答No.8

補足にあった、 > If文、キャスト演算子、scanf()関数を使うまではわかるのですが、 普通に作れば、キャストは要らない。

chocoholic39
質問者

補足

BMI値計算時にいると言われたのですが、使わなくてもいいのでしょうか?

回答No.7

#include <stdio.h> int main(void) { double s, t, b; scanf("%lf%lf",&s,&t); s/=100.0; b=t/(s*s); if(b<=18.5)printf("Yasegimidesu"); if(b>=18.5&&b<=25.0)printf("Futsuudesu"); if(b>=25.0&&b<30.0)printf("Futorifimidesu"); if(b>=30.0)printf("Futorisugidesu"): }

chocoholic39
質問者

補足

ありがとうございます! しかしdoubleって何ですか? 今まで使ったことがなかったです…

  • edomin7777
  • ベストアンサー率40% (711/1750)
回答No.6

そうですね。> #3、5さん

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

#3前半に書いた18.5と25.0の件が解決すれば、ですけどね>#4さん

関連するQ&A