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

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

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

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

Q&A

解決済

4回答

1947閲覧

文字列の表示について

bjbjeknr

総合スコア26

C

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

Emacs

GNU Emacsと拡張性の高い、高性能なテキストエディタです。豊富なライブラリの導入により、統合開発環境やWebブラウザとしても機能させる事が可能です。

0グッド

0クリップ

投稿2016/12/03 12:07

編集2016/12/03 13:44

身長 [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のところ)でエラーになります。

どのように書けばいいのでしょうか。

私のコードです。

C

1#include <stdio.h> 2 3double bmi_keisan(int height, int weight) 4{ 5 6 double body_mass_index=0; 7 8 body_mass_index=(double)weight/height*height; 9 10 return (body_mass_index); 11} 12 13int main(void) 14{ 15 int height; 16 int weight; 17 double bmi; 18 char result[10]; 19 do{ 20 printf("身長 [cm] ? "); 21 scanf("%d",&height); 22 }while(height<0) 23 do{ 24 printf("体重 [kg] ? "); 25 scanf("%d"&weight); 26 }while(weight<0) 27 28 printf("身長 = %d [cm]\n"); 29 printf("体重 = %d [kg]\n"); 30 31 bmi = bmi_keisan(height,weight); 32 if(bmi>=18.5 || bmi<25){ 33 result[10] = "標準型"; 34 }else if(bmi>=25){ 35 result[10] = "肥満型"; 36 }else{ 37 result[10] = "やせ型"; 38 } 39 40 printf("BMI = %.1lf (%s)",bmi,result[10]); 41 42 return 0; 43} 44

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

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

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

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

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

guest

回答4

0

ベストアンサー

簡単にプログラムを書いてみました
途中10000をかけているのは
単位はmで出さなければおかしくなるからです。

基本的にwhile文if文をわかりやすく書いてみました(これが正しいと言う事はありませんが)
elseやdo whileはできれば使わない方が
綺麗に書けますのでぜひご参考に

c

1#include <stdio.h> 2#include <string.h> 3 4double bmi_keisan(int height, int weight); 5 6int main(void) 7{ 8 int height; 9 int weight; 10 double bmi; 11 char result[10] = ""; 12 13 while(1){ 14 printf("身長 [cm] ? \n"); 15 scanf("%d",&height); 16 if (height >= 0){ 17 break; 18 } 19 } 20 21 while(1){ 22 printf("体重 [kg] ? \n"); 23 scanf("%d", &weight); 24 if (weight >= 0){ 25 break; 26 } 27 } 28 29 bmi = bmi_keisan(height, weight); 30 if (bmi < 18.5) { 31 strcpy(result, "やせ型"); 32 } 33 if (bmi >= 18.5 && bmi < 25) { 34 strcpy(result, "標準型"); 35 } 36 if (bmi >= 25) { 37 strcpy(result, "肥満型"); 38 } 39 40 printf("身長 = %d [cm]\n", height); 41 printf("体重 = %d [kg]\n", weight); 42 printf("BMI = %.1lf (%s)\n", bmi, result); 43 44 return 0; 45} 46 47double bmi_keisan(int height, int weight) 48{ 49 double body_mass_index = 0.0; 50 body_mass_index = (double)(weight * 10000) / (height * height); 51 52 return body_mass_index; 53}

投稿2016/12/17 11:08

編集2016/12/17 11:17
dec5798

総合スコア74

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

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

dec5798

2016/12/17 11:21

言い忘れていましたが if (bmi >= 18.5 && bmi < 25) ここはandの条件分岐じゃないと駄目だと思いますよ 18.5以上が全部標準になりますからね
bjbjeknr

2016/12/17 11:28

解決しました。わかりやすいご説明有難うございました。
guest

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/14 18:05

ba_max009

総合スコア21

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

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

bjbjeknr

2016/12/17 11:28

解決しました。わかりやすいご説明有難うございました。
guest

0

エラーが発生したならそのメッセージを書かれた方が回答しやすいと思います。
とりあえず、ぱっと見てすぐに気づいたことは、do~whileループのwhileの後ろにセミコロンがないということですね。C言語ではdo~whileループのwhileの後ろにはセミコロンを書く必要があります。

投稿2016/12/03 14:05

catsforepaw

総合スコア5938

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

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

bjbjeknr

2016/12/17 11:29

解決しました。わかりやすいご説明有難うございました。
guest

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;としないと通らないかも。

投稿2016/12/03 12:31

Chironian

総合スコア23272

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

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

bjbjeknr

2016/12/03 13:46

分かりやすい解説ありがとうございました。 しかし、19行目(doのところ)もエラーが出ていました。質問文に書くのを忘れてました。。 すみません。。
Chironian

2016/12/03 14:09

do~whileについてはcatsforepawさんの回答通りです。 直前のwhile文に ;(セミコロン)が無いのでdo文でエラーになる筈です。
bjbjeknr

2016/12/17 11:29

解決しました。わかりやすいご説明有難うございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問