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

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

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

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

Q&A

3回答

1690閲覧

ポインター構造体について?

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2017/09/03 08:47

お世話になっております。
C言語についての質問になります。
現在体重と身長を入力して肥満度を表すコードを作成しています。
男性のみになっておりますがscanf関数から自身の性別,年齢,身長,体重を入力すると
肥満度を表すコードをなっておりますが実行すると
・性別を入力した後にエンタキーを押すと空欄のみが入力される
・全項目入力後の計算結果で肥満度がおかしな数字になっている
・あなたは○○ですと診断するhikaku関数にたどり着いていない?
・*datab->のないようをみると性別、空欄に入力した数値,年齢,体重の数値が入っている
・・・と色々エラーが発生しております。
以上の問題に対してアドバイスよろしくお願いします。
イメージ説明
イメージ説明

C

1コード 2// ConsoleApplication18.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 3// 4 5#include "stdafx.h" 6#include<stdio.h> 7#include<stdlib.h> 8 9/*入力者のデータを入れる構造体*/ 10struct yourbmi { 11 /*性別*/ 12 int sex; 13 /*年齢*/ 14 int age; 15 /*体重*/ 16 double weight; 17 /*身長*/ 18 double height; 19}; 20/*入力されたデータをもとにBMI=体重(Kg)÷身長(m)÷身長(m)を計算する関数*/ 21double calculator(struct yourbmi *data); 22/*入力したデータを表示する関数*/ 23void typedata(struct yourbmi* data); 24/*入力したデータを比較して性別と年齢で結果を変える*/ 25void hikaku(struct yourbmi* hikaku , double result); 26 27int main() 28{ 29 //BMIを入れる変数 30 double sum = 0; 31 struct yourbmi data; 32 typedata(&data); 33 sum = calculator(&data); 34 hikaku(&data , sum); 35 36 return 0; 37} 38 39void typedata(struct yourbmi* data) { 40 printf("性別 男:1 女:2 "); 41 scanf_s("%d\n", &(data->sex)); 42 printf("年齢:"); 43 scanf_s("%d\n", &(data->age)); 44 printf("体重:"); 45 scanf_s("%lf\n", &(data->weight)); 46 printf("身長:"); 47 scanf_s("%lf\n", &(data->height)); 48} 49 50double calculator(struct yourbmi *data) { 51 double result = 0; 52 result = (data->weight / data->height) / (data->height); 53 printf("%f", result); 54 return result; 55} 56 57void hikaku(struct yourbmi* data , double result) { 58 //性別が男だった場合 59 if (data->sex = 1 ) { 60 //15~17歳だった場合 61 if (data ->age >= 15 &&data ->age <= 17) { 62 //BMIが7以下だった場合 63 if(result >= 0 && result <= 7) { 64 printf("あなたはやせ型です。"); 65 }else 66 //BMIが8以上23以下だった場合 67 if (result >= 8 && result <= 23) { 68 printf("あなたは標準型です。"); 69 } 70 }else 71 //BMIが24以上27以下だった場合 72 if (result >= 24 && result <= 27) { 73 printf("あなたは軽肥満型です。"); 74 } 75 else 76 //BMIが28以上だった場合 77 if (result >= 28) { 78 printf("あなたは肥満型です。"); 79 } 80 //18~39歳だった場合 81 if (data->age >= 18 && data->age <= 39) { 82 //BMIが10以下だった場合 83 if (result >= 0 && result <= 10) { 84 printf("あなたはやせ型です。"); 85 } 86 else 87 //BMIが11以上21以下だった場合 88 if (result >= 11 && result <= 21) { 89 printf("あなたは標準型です。"); 90 } 91 } 92 else 93 //BMIが22以上26以下だった場合 94 if (result >= 22 && result <= 26) { 95 printf("あなたは軽肥満型です。"); 96 } 97 else 98 //BMIが27以上だった場合 99 if (result >= 27) { 100 printf("あなたは肥満型です。"); 101 } 102 //40~59歳だった場合 103 if (data->age >= 40 && data->age <= 59) { 104 //BMIが0以上11以下だった場合 105 if (result >= 0 && result <= 11) { 106 printf("あなたはやせ型です。"); 107 } 108 else 109 //BMIが12以上22以下だった場合 110 if (result >= 12 && result <= 22) { 111 printf("あなたは標準型です。"); 112 } 113 } 114 else 115 //BMIが23以上27以下だった場合 116 if (result >= 23 && result <= 27) { 117 printf("あなたは軽肥満型です。"); 118 } 119 else 120 //BMIが28以上だった場合 121 if (result >= 28) { 122 printf("あなたは肥満型です。"); 123 } 124 //60歳以上だった場合 125 if (data->age >= 60) { 126 //BMIが0以上13以下だった場合 127 if (result >= 0 && result <= 13) { 128 printf("あなたはやせ型です。"); 129 } 130 else 131 //BMIが14以上24以下だった場合 132 if (result >= 14 && result <= 24) { 133 printf("あなたは標準型です。"); 134 } 135 } 136 else 137 //BMIが25以上29以下だった場合 138 if (result >= 25 && result <= 29) { 139 printf("あなたは軽肥満型です。"); 140 } 141 else 142 //BMIが30以上だった場合 143 if (result >= 30) { 144 printf("あなたは肥満型です。"); 145 } 146 } 147}

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

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

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

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

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

guest

回答3

0

性別を入力した後にエンタキーを押すと空欄のみが入力される

scanf_s("%d", &(data->sex));に書き換えれば解消されます。

全項目入力後の計算結果で肥満度がおかしな数字になっている

単位が違うのだと思います。身長をcmで入力していませんか?
BMI = 体重[kg] / 身長[m] / 身長[m]です。

他の問題は、少なくとも上記の改変後は再現できません。
なぜhikaku関数が呼び出されていないと判断したのでしょうか?


蛇足かもしれないですが、コードの良くない点をいくつか挙げます。

構造体の使い方
まず名前の記法。構造体の名前が全部小文字ってことはあんまりないかと思います。
C言語っぽくUPPER_SNAKE_CASEで書くか、C++を見据えてPascalCaseじゃないかと。
ぱっと見て普通の変数と見分けられる方が何かと便利です。

また、typedefを適宜用いると、毎回毎回structと書かずに済みます。

C

1typedef struct { 2 int sex; 3 int age; 4 double height; 5 double weight; 6} Human;

勝手にタグ名も変えちゃいました。

値自体に意味がない定数
ご提示のコードでは、男性を1、女性を0として区別しています。
このようなときは、列挙体を用いるときれいに書けます。

C

1enum SEX { 2 MAN, WOMAN, 3} 4 5bool isMan(Human *human) { 6 return human->sex == MAN; 7}

なお、boolを使うにはstdbool.hをインクルードしてください。
...cppとしてコンパイルしているならそのままでも使えますが。

排他的な条件が何度も評価されている
else if使いましょう。

C

1if(inAge(human, 15, 17)) { 2 ... 3} 4else if(inAge(human, 18, 39)) { 5 ... 6} 7...

煩雑な条件式
例えば次のような関数を定義するだけで、一気に見通しが良くなります。

C

1bool inAge(Human *human, int lower, int upper) { 2 return lower <= human->age && human->age <= upper; 3}

『〇〇世代』と表現できる世代なら、専用の関数を作ってもいいでしょう。

C

1bool isTeenager(Human *human) { 2 return inAge(human, 13, 19); 3}

BMIに関しても同様です。
ネットで見つけた表を参考にすると、こんな感じかな?

C

1bool isUnderweight(Human *); 2bool isHealthyWeight(Human *); 3bool isOverweight(Human *); 4bool isObese(Human *); 5bool isSeverelyObese(Human *); 6bool isMorbidlyObese(Human *);

同じことを何度も書きすぎ
配列を用いて、世代ごとに評価の境目を管理すると良いでしょう。

投稿2017/09/03 10:42

編集2017/09/03 11:44
LouiS0616

総合スコア35660

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

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

0

身長をcmで入力していますが、cmをmに治す計算が見えません。

height /= 100;

もし自分が見落としていたらすいません。
それと、2人の人が回答してくれています。自分にとってわかりやすい回答をベストアンサーに選びましょう。

投稿2020/03/22 23:58

sharoccu

総合スコア26

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

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

0

scanf関数の使い方、yourbmi構造体/hikaku関数/calculator関数の定義が無いのでアドバイスができません。

投稿2017/09/03 09:00

diracpaul

総合スコア157

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

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

LouiS0616

2017/09/03 12:00

見落としてるんじゃないですか? 質問に編集履歴はなく、しかもコードは全文が載せられ、プロトタイプ宣言には充分な(むしろ過剰な)コメントが入っています。
diracpaul

2017/09/03 13:17

失礼しました。見落としていようです。 なお、scanfの関数のフォーマット文字列には、%で始まる型format指定子で指定しますが、これは、printfの書式指定とは異なり任意の文字列や改行を指定するようにはなっていないようです。 このため、scanfのフォーマット文字列内の\nによって誤動作しているようです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問