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

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

ただいまの
回答率

90.35%

  • C

    4215questions

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

  • Emacs

    144questions

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

文字列の表示について

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 738

bjbjeknr

score 18

身長 [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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

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;
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/17 20:21

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

    キャンセル

  • 2016/12/17 20:28

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

    キャンセル

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 22:46

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

    キャンセル

  • 2016/12/03 23:09

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

    キャンセル

  • 2016/12/17 20:29

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/17 20:29

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

    キャンセル

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:28

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

    キャンセル

同じタグがついた質問を見る

  • C

    4215questions

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

  • Emacs

    144questions

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