WHR计算C语言代码异常排查:输入任意值均返回Obesity
WHR分类标准
| 男性 | 女性 | 类别 |
|---|---|---|
| <0.90 | <0.80 | Normalweight |
| 0.90-0.99 | 0.80-0.84 | Overweight |
| 1.0+ | 0.85+ | Obesity |
需求
根据输入的腰围(英寸)和臀围(英寸)计算腰臀比(WHR),并输出对应类别(Normalweight、Overweight、Obesity)。
问题代码
#include<stdio.h> int main(){ int a,b; char e; float d; scanf("%d %d",&a,&b); scanf("%c",&e); d=a/b; if(d<0.90 && e=='m'){ printf("Normalweight");} else if(d>=0.90 && d<=0.99 ){ if(e=='m'){ printf("Overweight");} } else if(d>0.80 && d<0.84){ if(e=='f'){ printf("Overweight");} }else{ printf("Obesity");} }
问题排查与修复
1. 输入字符读取到换行符
第一个scanf("%d %d",&a,&b)读取完数字后,输入缓冲区会残留换行符,第二个scanf("%c",&e)会直接读取这个换行符,导致e的值不是'm'或'f',所有性别判断条件都不满足,直接进入else分支输出Obesity。
解决:在读取性别前跳过空白字符,修改第二个scanf为:
scanf(" %c",&e); // 空格会跳过换行、空格等空白字符
2. 整数除法导致WHR计算错误
a和b都是int类型,a/b执行整数除法(只保留整数部分),比如36/40会得到0而非0.9,导致WHR结果完全错误,触发错误分支。
解决:强制转换为浮点除法:
d = (float)a / b; // 将a转为float后,b自动提升为float,结果为浮点型
3. 条件分支逻辑缺失
原代码未处理女性WHR<0.80的Normalweight情况,且嵌套逻辑混乱,部分合法情况会落入else分支。
修复:先判断性别,再按性别匹配WHR区间,逻辑更清晰。
修复后的完整代码
#include<stdio.h> int main(){ int waist, hip; char gender; float whr; // 读取腰围、臀围,跳过空白后读取性别 scanf("%d %d", &waist, &hip); scanf(" %c", &gender); // 计算腰臀比:强制浮点除法 whr = (float)waist / hip; if(gender == 'm'){ if(whr < 0.90){ printf("Normalweight"); } else if(whr >= 0.90 && whr <= 0.99){ printf("Overweight"); } else { printf("Obesity"); } } else if(gender == 'f'){ if(whr < 0.80){ printf("Normalweight"); } else if(whr >= 0.80 && whr <= 0.84){ printf("Overweight"); } else { printf("Obesity"); } } else { printf("Invalid gender input"); } return 0; }
测试示例
- 输入:
36 40 m→ WHR=0.9 → 输出Overweight - 输入:
32 40 f→ WHR=0.8 → 输出Overweight - 输入:
30 40 m→ WHR=0.75 → 输出Normalweight - 输入:
36 40 f→ WHR=0.9 → 输出Obesity
内容的提问来源于stack exchange,提问作者velavan suresh
相关产品推荐
相关产品推荐

