• ベストアンサー

誰か教えてください!!

main() { float weight,height,s_weight,fatness; int sex,count,keisu,y_cnt,f_cnt,k_cnt,c_cnt,n_cnt; y_cnt=f_cnt=k_cnt=c_cnt=n_cnt=0; printf("*** 肥満度プログラム ***\n"); for(count=1;count<=10;count++) { printf("あなたの体重(Kg単位)=\n"); scanf("%f",&weight); printf("あなたの身長(m単位)=\n"); scanf("%f",&height); printf("あなたの性別(男=0/女=1)=\n"); scanf("%d",&sex); if(sex==0) keisu=22; else keisu=20; if(height>0 && weight>0) { s_weight=height*height*keisu; printf("標準体重=%fKg\n",s_weight); fatness=(weight-s_weight)/s_weight*100; printf("肥満度=%f%\n",fatness); if(fatness<-10.0) { printf("やせすぎです。\n"); y_cnt++; } else if(-10.0<=fatness && fatness<10.0) { printf("標準です。\n"); f_cnt++; } else if(10.0<=fatness && fatness<20.0 ) { printf("過体重です。\n"); k_cnt++; } else if(20.0<=fatness) { printf("あなたは超過体重ですわ!\n"); c_cnt++; } else printf("計算できません。\n"); n_cnt++; } } printf("*** 肥満度統計結果 ***\n"); printf("やせすぎ=%d人\n",y_cnt); printf("普通=%d人\n",f_cnt); printf("過体重=%d人\n",k_cnt); printf("超過体重=%d人\n",c_cnt); printf("計算できない人=%d人\n",n_cnt); } これを実行すると、10回それぞれ身長や体重を入力していくのですが、”計算できない人”が毎回加算されてしまい、”計算できない人=10”と出てしまします。他のやせすぎとか過体重などはちゃんと計算してくれるんです。どのようにしたら、ちゃんと”計算できない人”を計算してくれるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

ぱっと見ただけなので、違っていたらごめんなさい。 たぶん、後半にある printf("あなたは超過体重ですわ!\n"); c_cnt++; } else printf("計算できません。\n"); n_cnt++; } } printf("*** 肥満度統計結果 ***\n"); の、最後のelseのところが問題ではないかと思います。 この書き方だと、elseに続くのは >printf("計算できません。\n"); の1文だけであり、その下の >n_cnt++; は、elseと関係ない文になっています。 全体のif文の外側になってます。 これを直すには、{}を使い、 printf("あなたは超過体重ですわ!\n"); c_cnt++; } else { printf("計算できません。\n"); n_cnt++; } } } printf("*** 肥満度統計結果 ***\n"); として printf("計算できません。\n"); と n_cnt++; をグループにまとめてやります。

milch1114
質問者

お礼

大変貴重な指導ありがとうございます。実行でき、助かりました。

その他の回答 (3)

  • panick
  • ベストアンサー率40% (26/64)
回答No.4

if文の入れ子は間違いやすいので、{ } を使って明確にすると良いです。 if(sex==0){keisu=22;} else{keisu=20;} if(height>0 && weight>0){ s_weight=height*height*keisu; printf("標準体重=%fKg\n",s_weight); fatness=(weight-s_weight)/s_weight*100; printf("肥満度=%f%\n",fatness); if(fatness<-10.0){y_cnt++; printf("やせすぎです。\n");} else{ if(-10.0<=fatness && fatness<10.0){f_cnt++; printf("標準です。\n");} else{ if(10.0<=fatness && fatness<20.0 ){k_cnt++; printf("過体重です。\n");} else{ if(20.0<=fatness){c_cnt++; printf("あなたは超過体重ですわ!\n");} else{n_cnt++; printf("計算できません。\n");} } } } }

milch1114
質問者

お礼

ご指導いただきありがとうございました。大変参考になりました。どうもありがとうございました。

回答No.3

if~elseのネストが深くなると対応関係が分かりにくくなります。if と else のあとは必ず{ を入れるようにすると間違いを減らせると思います。 ネストさせないようにこんな書き方もできます。。参考まで #define KUBUN 4 float limit[KUBUN-1]={-10.0,10.0,20.0}; char *mes[KUBUN+1]={"やせすぎです。", "標準です。", "過体重です。", "あなたは超過体重ですわ!", "計算できません。"}; char *mes2[KUBUN+1]={"やせすぎ", "普通", "過体重", "超過体重", "計算できない人"}; int main(void) { float weight,height,s_weight,fatness; int sex,count,keisu; int i,p; int cnt[KUBUN+1]; /* カウンタクリア */ for (i=0; i<=KUBUN; i++) cnt[i]=0; printf("*** 肥満度プログラム ***\n"); for(count=1;count<=10;count++) { printf("あなたの体重(kg単位)=\n"); scanf("%f",&weight); printf("あなたの身長(m単位)=\n"); scanf("%f",&height); printf("あなたの性別(男=0/女=1)=\n"); scanf("%d",&sex); keisu = (sex==0)?22.0:20.0; if(height>0 && weight>0) { s_weight=height*height*keisu; printf("標準体重=%fKg\n",s_weight); fatness=(weight-s_weight)/s_weight*100.0; printf("肥満度=%f%\n",fatness); /* 基準値と比較してメッセージ表示&カウントアップ */ for (p=0,i=0; i<KUBUN-1; i++) { if (fatness>=limit[i]) { p++; } } printf("%s\n",mes[p]); cnt[p]++; } else { printf("%s\n",mes[KUBUN]); cnt[KUBUN]++; } } printf("*** 肥満度統計結果 ***\n"); for (i=0; i<=KUBUN; i++) { printf("%s=%d人\n",mes2[i],cnt[i]); } return 0; }

milch1114
質問者

お礼

こんな方法があったんですね。大変わかりやすく参考になりました。 どうもありがとうございました。

  • mcq
  • ベストアンサー率48% (45/93)
回答No.2

問題はもう少し根深いようです。 以下で正しいハズです。 あと、 if(fatness<-10.0) { printf("やせすぎです。\n"); は、 if(fatness<=10.0) の間違いでは? なるべく丁寧に見直すようにして下さい。 あるいは、カッコの大枠を先に書いてから中身を書くようにするのも一つの手です。もちろんインデントは必須。 main() { float weight,height,s_weight,fatness; int sex,count,keisu,y_cnt,f_cnt,k_cnt,c_cnt,n_cnt; y_cnt=f_cnt=k_cnt=c_cnt=n_cnt=0; printf("*** 肥満度プログラム ***\n"); for(count=1;count<=10;count++) { printf("あなたの体重(Kg単位)=\n"); scanf("%f",&weight); printf("あなたの身長(m単位)=\n"); scanf("%f",&height); printf("あなたの性別(男=0/女=1)=\n"); scanf("%d",&sex); if(sex==0) keisu=22; else keisu=20; if(height>0 && weight>0) { s_weight=height*height*keisu; printf("標準体重=%fKg\n",s_weight); fatness=(weight-s_weight)/s_weight*100; printf("肥満度=%f%\n",fatness); if(fatness<-10.0) { printf("やせすぎです。\n"); y_cnt++; } else if(-10.0<=fatness && fatness<10.0) { printf("標準です。\n"); f_cnt++; } else if(10.0<=fatness && fatness<20.0 ) { printf("過体重です。\n"); k_cnt++; } else if(20.0<=fatness) { printf("あなたは超過体重ですわ!\n"); c_cnt++; } } else { printf("計算できません。\n"); n_cnt++; } } printf("*** 肥満度統計結果 ***\n"); printf("やせすぎ=%d人\n",y_cnt); printf("普通=%d人\n",f_cnt); printf("過体重=%d人\n",k_cnt); printf("超過体重=%d人\n",c_cnt); printf("計算できない人=%d人\n",n_cnt); }

milch1114
質問者

お礼

貴重なご意見ありがとうございました。{}の位置を変えていただき大変わかりやすくなりました。どうもありがとうございました。

関連するQ&A