身長 [cm] と体重 [kg] を標準入力して BMI を計算するプログラムを作りたいのですが
BMI の値によって「やせ型」「標準型」「肥満型」の判
断と表示を行う(この部分もユーザー関数で行う)
• やせ型: BMI が 18.5 未満
• 標準型: BMI が 18.5 以上、25 未満
• 肥満型: BMI が 25 以上
とし、
実行例
% a.out
身長 [cm] ? -172
身長 [cm] ? 172
体重 [kg] ? 63
身長 = 172 [cm]
体重 = 63 [kg]
BMI = 21.3(標準型)
としたいのですが、文字列の書き方が分かりません。。
文字列のところと、19行目(doのところ)でエラーになります。
どのように書けばいいのでしょうか。
私のコードです。
#include <stdio.h>
double bmi_keisan(int height, int weight)
{
double body_mass_index=0;
body_mass_index=(double)weight/height*height;
return (body_mass_index);
}
int main(void)
{
int height;
int weight;
double bmi;
char result[10];
do{
printf("身長 [cm] ? ");
scanf("%d",&height);
}while(height<0)
do{
printf("体重 [kg] ? ");
scanf("%d"&weight);
}while(weight<0)
printf("身長 = %d [cm]\n");
printf("体重 = %d [kg]\n");
bmi = bmi_keisan(height,weight);
if(bmi>=18.5 || bmi<25){
result[10] = "標準型";
}else if(bmi>=25){
result[10] = "肥満型";
}else{
result[10] = "やせ型";
}
printf("BMI = %.1lf (%s)",bmi,result[10]);
return 0;
}
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
簡単にプログラムを書いてみました
途中10000をかけているのは
単位はmで出さなければおかしくなるからです。
基本的にwhile文if文をわかりやすく書いてみました(これが正しいと言う事はありませんが)
elseやdo whileはできれば使わない方が
綺麗に書けますのでぜひご参考に
#include <stdio.h>
#include <string.h>
double bmi_keisan(int height, int weight);
int main(void)
{
int height;
int weight;
double bmi;
char result[10] = "";
while(1){
printf("身長 [cm] ? \n");
scanf("%d",&height);
if (height >= 0){
break;
}
}
while(1){
printf("体重 [kg] ? \n");
scanf("%d", &weight);
if (weight >= 0){
break;
}
}
bmi = bmi_keisan(height, weight);
if (bmi < 18.5) {
strcpy(result, "やせ型");
}
if (bmi >= 18.5 && bmi < 25) {
strcpy(result, "標準型");
}
if (bmi >= 25) {
strcpy(result, "肥満型");
}
printf("身長 = %d [cm]\n", height);
printf("体重 = %d [kg]\n", weight);
printf("BMI = %.1lf (%s)\n", bmi, result);
return 0;
}
double bmi_keisan(int height, int weight)
{
double body_mass_index = 0.0;
body_mass_index = (double)(weight * 10000) / (height * height);
return body_mass_index;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
こんにちは。
result[0]はresult配列の0番目の要素です。resultは10個の要素を持つchar型配列なので、result[0]はchar型1文字の変数です。
result[10]はresult配列の11番目の要素ですが、resultは10個しか要素を持たないので存在しません。
また、仮にchar result[11];とすればresult[10]も存在しますが、char型1つだけなので"標準型"という漢字3文字を入れるスペースはありません。
簡単な対策は、resultをchar型へのポインタとすることです。
char const* result;
と定義し、result="標準型";
のようにしてみて下さい。また、printfでもresult[10]
ではなくresult
としてみて下さい。たぶん通る筈です。
なお、char const* result;
は、もしかするとchar* result;
としないと通らないかも。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
エラーが発生したならそのメッセージを書かれた方が回答しやすいと思います。
とりあえず、ぱっと見てすぐに気づいたことは、do~whileループのwhileの後ろにセミコロンがないということですね。C言語ではdo~whileループのwhileの後ろにはセミコロンを書く必要があります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
前の回答者様がポインタでの解決方法をおっしゃっているので、違う方法を書いていきますね。
これはstring関数を使って、文字列を配列にコピーする方法です。
result[10]="文字列"のところを
strcpy(result,"文字列")にすることでresultに文字列をコピーできます。
string.hをインクルードするのも忘れがちなので一応書いておきますね。
詳しい方法はstring関数などで調べるともっと理解できると思います。
ほかの注意点としてはresult[10]としてしまうとresultという配列の十番目のみをさすことになってしまうので文字列すべてを表すことにはなりません。
なので、読み込みときや表示するときはresultとして全体をさすようにしましょう。
とりあえず作ったもの載せておきます。
#include <stdio.h>
#include <string.h>
double bmi_keisan(int height, int weight)
{
double body_mass_index=0;
body_mass_index=(double)weight/(double)(height*height);
return (body_mass_index);
}
int main(void)
{
int height;
int weight;
double bmi;
char result[10];
do{
printf("身長 [cm] ? ");
scanf("%d",&height);
}while(height<0);
do{
printf("体重 [kg] ? ");
scanf("%d",&weight);
}while(weight<0);
printf("身長 = %d [cm]\n",height);
printf("体重 = %d [kg]\n",weight);
bmi = bmi_keisan(height,weight);
if(bmi>=18.5 || bmi<25){
strcpy(result,"標準型");
}else if(bmi>=25){
strcpy(result,"肥満型");
}else{
strcpy("やせ型",result);
}
printf("BMI = %.1lf (%s)",bmi,result);
return 0;
}
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
2016/12/17 20:21
if (bmi >= 18.5 && bmi < 25)
ここはandの条件分岐じゃないと駄目だと思いますよ
18.5以上が全部標準になりますからね
2016/12/17 20:28