如何使用C语言实现计算体脂率,并且优化
体脂率
体脂率是什么
体脂率是指人体内脂肪重量在人体总体重中所占的比例,又称体脂百分数。
体脂率有什么意义
体脂率反映了人体内脂肪含量的多少。肥胖会提高罹患各种疾病的风险,例如:高血压、糖尿病和高血脂等。同时打算怀孕的女性也不能忽视肥胖引起的妊娠并发症与难产的风险。
体脂率如何计算
男、女体脂率数值计算上有一定差别。首先要量出腰围和体重,腰围是髂前上嵴和第十二肋下缘连线的中点水平所测得的值,单位用cm,体重kg(公斤)为单位。
成年女性体脂率的计算方法:参数1=腰围×0.74,参数2=体重×0.082+34.89。机体脂肪重量(kg)=参数1-参数2,体脂率=(身体脂肪总重量/体量)×100%。
成年男性的体脂率计算方法:参数1=腰围×0.74,参数2=体重×0.082+44.74。机体脂肪重量(kg)=参数1-参数2,体脂率=(身体脂肪总重量/体重)×100%。
女性体脂率正常值是20%-25%,男性是15%-18%。
用C语言实现计算体脂率
(建立在已知对象年龄、体重、腰围的基础上)
将任务拆分
1.区分成年和未成年
原因:只提供了成年体脂率的计算方法
2.区分性别
原因:男女体脂率的计算方法不同
3.提示对象输入腰围和体重并且读取
4.将所得到的数据按照公式计算的得到新的数据
5.将新的数据输出
将任务一一解决
1.用if else语句将未成年和成年区分成两种不同情况
2.用if else语句或者switch语句将男女区分成两种不同情况
需注意的是:switch 后的 expression 必须是整型表达式;case 后的值,必须是整形常量表达式。所以对象输入“男”或者“女”这种字符时,如果采用switch语句将难以区分。为了后续操作方便,不妨让男输入“1”,女输入“0”。
3.用printf函数打印语句,用来提示对象输入。用scanf函数来读取对象输入的数据。
4.略(见代码)
5.用printf函数将处理后的数据输出
转换成代码
#define _CRT_SECURE_NO_WARNINGS
//忽略安全警告,使代码正常运行
#include <stdio.h>
int main()
{
int year = 0;
printf("请输入你的年龄");
scanf("%d", &year);
if (year < 18)
printf("抱歉,你不在测试范围内。\n");
else {
int 性别 = 0;
int 腰围 = 0;
int 体重 = 0;
printf("请输入你性别(男填1,女填0)\n", &性别);
scanf("%d", &性别);
printf("请输入腰围(cm)=\n", &腰围);
scanf("%d", &腰围);
printf("请输入体重(kg/公斤)=\n", &体重);
scanf("%d", &体重);
if (性别 == 1)
{
double a = 腰围 * 0.74 * 100;
double b = (体重 * 0.082 + 44.74) * 100;
double 体脂率 = (a - b) / 体重;
printf("你的体脂率是%f %%", 体脂率);
}
else
{
double c = 腰围 * 0.74 * 100;
double d = (体重 * 0.082 + 34.89) * 100;
double 体脂率2 = (c - d) / 体重;
printf("你的体脂率是%f %% ", 体脂率2);
}
}
return 0;
}
详细注释(避免过多注释影响代码流畅性):
1.VS2022认为scanf函数有安全隐患
但实际上并没有,我们可以使用它提供的函数scanf-s,但是这个函数在其它编译器中可能无法被识别,导致代码无法运行,所以我们最好忽略警告。而在代码块首写入
#define _CRT_SECURE_NO_WARNINGS 就是解决办法之一。
2.如果想在C语言中打印一个百分号(%),需要使用转义字符(escape character)来实现。在C语言中,百分号字符(%)是一个特殊字符,需要通过转义字符来表示。下面是一个简单的示例代码,演示如何在C语言中打印一个百分号:
#include <stdio.h>
int main() {
printf("%%\n"); // 使用两个%%来表示一个百分号
return 0;
}
运行上面的代码,将在控制台输出一个百分号。请注意,代码中的两个百分号%%会被正确地打印为一个百分号。
优化
试运行:
基本功能已经完成,但不难发现这只能输入一组数据,如果想要再处理一组数据,就必须关闭程序,再重新启动程序,非常麻烦。所以应该使其具有输入多组数据的功能。
优化一:增添多组数据输入功能
用循环语句来实现,一组数据处理完之后再此回到开始,重新进行一遍程序,从而达到输入多组数据的功能。代码展示如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int year = 0;
next:printf("请输入你的年龄");
while (scanf("%d", &year))
if (year < 18)
{
printf("抱歉,你不在测试范围内。\n\n");
goto next;
}
else {
int 性别 = 0;
int 腰围 = 0;
int 体重 = 0;
printf("请输入你性别(男填1,女填0)\n", &性别);
scanf("%d", &性别);
printf("请输入腰围(cm)=\n", &腰围);
scanf("%d", &腰围);
printf("请输入体重(kg/公斤)=\n", &体重);
scanf("%d", &体重);
if (性别 == 1)
{
double a = 腰围 * 0.74 * 100;
double b = (体重 * 0.082 + 44.74) * 100;
double 体脂率 = (a - b) / 体重;
printf("你的体脂率是%f %%\n\n", 体脂率);
goto next;
}
else
{
double c = 腰围 * 0.74 * 100;
double d = (体重 * 0.082 + 34.89) * 100;
double 体脂率2 = (c - d) / 体重;
printf("你的体脂率是%f %% \n\n", 体脂率2);
goto next;
}
}
return 0;
}
注释:
1.这里使用了while循环语句,循环语句有while,do while,for三种,但是for语句将初始化、判断、调整这三个部分整合到一起,不适用于这种较为复杂的循环。while和do while功能相差不大,而在循环语句中do while语句的使⽤少,所以就采用了while循环语句。
2.代码中使用了goto语句。如果去掉,将会发现进行下一次循环时屏幕不会打印“请输入你的年龄”,虽然正常输入年龄后,可以正常运行,但是没有提示显然不太便捷。而用goto语句就解决了这个问题。
试运行:
结果非常amazing,完美实现了多组数据输入的功能!
但是依然存在瑕疵,前面为了方便处理,男输入“1”,女输入“0”,但是如果对象输入其它数字,将会因为非1而自动归为女,显然不合理。所以进一步优化应该使对象只能输入1和0,输入其它时将会得到相应的提示。
优化二:报错功能
在解决多分支方面,switch语句显然比if else语句更方面,并且如果找不到对应的值,就执⾏ default 分⽀,在解决报错方面有很大的优势。所以有必要将代码中if else语句改为switch语句。
代码展示如下:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main()
{
int year = 0;
next:printf("请输入你的年龄");
while (scanf("%d", &year))
if (year < 18)
{
printf("抱歉,你不在测试范围内。\n\n");
goto next;
}
else {
int 性别 = 0;
int 腰围 = 0;
int 体重 = 0;
printf("请输入你性别(男填1,女填0)\n", &性别);
scanf("%d", &性别);
printf("请输入腰围(cm)=\n", &腰围);
scanf("%d", &腰围);
printf("请输入体重(kg/公斤)=\n", &体重);
scanf("%d", &体重);
switch (性别)
{
case 1:
{
double a = 腰围 * 0.74 * 100;
double b = (体重 * 0.082 + 44.74) * 100;
double 体脂率 = (a - b) / 体重;
printf("你的体脂率是%f %%\n\n", 体脂率);
goto next;
}
case 0:
{ double c = 腰围 * 0.74 * 100;
double d = (体重 * 0.082 + 34.89) * 100;
double 体脂率2 = (c - d) / 体重;
printf("你的体脂率是%f %% \n\n", 体脂率2);
goto next;
}
default:
printf("性别输入错误\n");
printf("请输入正常性别对应的正确数字\n");
goto next;
}
}
return 0;
}
试运行:
可以看出,较好地实现了报错功能,当然如果能在输入性别后立刻报错会更好,所以这个代码还有提升地空间。
总结
代码是为服务人而产生的,有测脂肪率的需求才会写相应的代码来实现,而为了进一步满足现实要求,代码又不断地被优化,从而更好地服务人。所以需求与写代码是相互依存,相互促进。
同时不难注意到代码是需要不断被优化的。我们的任务从不是写出一个完美无缺、无懈可击、一劳永逸的代码,而是不断不断优化代码、创新代码,从而不断适应人的需求。或许这才是计算机语言被发明的终极目的。
写于初学C语言,欢迎交流和指出错误!