アプリ版:「スタンプのみでお礼する」機能のリリースについて

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”と出てしまします。他のやせすぎとか過体重などはちゃんと計算してくれるんです。どのようにしたら、ちゃんと”計算できない人”を計算してくれるのでしょうか?

A 回答 (4件)

ぱっと見ただけなので、違っていたらごめんなさい。


たぶん、後半にある

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++;
をグループにまとめてやります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/08 22:31

問題はもう少し根深いようです。


以下で正しいハズです。

あと、
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);
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/08 22:33

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;
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/08 22:34

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");}
}
}
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/01/08 22:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!