任务描述
每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后的身高的因素包括遗传、饮食习惯与体育锻炼等。小孩成人后的身高与其父母的身高和自身的性别密切相关。 设faHeight为其父身高,moHeight为其母身高,身高预测公式为
- 男性成人时身高=(faHeight + moHeight)×0.54cm
- 女性成人时身高=(faHeight×0.923 + moHeight)/2cm
- *上述公式为原始身高预测公式!!!**** 此外,
- 如果喜爱体育锻炼,那么可增加身高2%(注意这个增加是在原始身高预测公式的基础上的增加);
- 如果有良好的卫生饮食习惯,那么可增加身高1.5%(注意这个增加是在原始身高预测公式的基础上的增加)。
编程从键盘输入
- 用户的性别(用字符型变量sex存储,输入字符F表示女性,输入字符M表示男性);
- 父母身高(用实型变量存储,faHeight为其父身高,moHeight为其母身高);
- 是否喜爱体育锻炼(用字符型变量sports存储,输入字符Y表示喜爱,输入字符N表示不喜爱);
- 是否有良好的饮食习惯(用字符型变量diet存储,输入字符Y表示良好,输入字符N表示不好)。 利用给定公式和身高预测方法对身高进行预测,输出所得结果,保留2位小数。
编程注意事项
- cm不是C语言的一部分,不能直接放到程序中;
- 在身高增加2%中,不能直接在公式中使用2%,而应该转换为0.02再使用;
- 字符char在赋值时,需要带单引号,例如char ch = 'Y'。
- 注意乘号的使用,在C中乘号为*
- double类型数据的输入输出格式控制为%lf
- float类型数据的输入输出格式控制为%f
良好的输入提示信息
相关知识
为了完成本关任务,你需要掌握:1.数字、字符混搭输入,2.if-else的使用。
数字字符混搭输入
在C语言中数字与字符一起混搭输入,不太容易作对。 如有问题,可以使用编译环境,单步调试,查看输入是否正确。 在进行字符输入时,如果单步调试发现并没有获得想要的字符,应思考是何种原因造成。 比如在这里的测试输入,每个信息之间用空格隔开 170 160 F N N 前两个是数字,后面3个是字符。 数字输入可以方便的scanf("%lf",&faHeight); 但是字符在输入时,前面是空格字符,因此需要用一个temp字符去把空格清除,之后再读入需要的字符。 方法如下:
scanf("%c",&temp);
scanf("%c",&sex);
if-else的使用
(1)if-else和switch都是用于进行选择判断的,但是switch一般用于离散的值的判断条件选择,如果值不是离散的,还需要进行一些转换,让其为离散的,然后再用switch语句进行判断,相关例子,比如统计各个分数段的学生人数。
(2)编码的时候,要根据具体问题的需要来进行选择,哪种方式方便就用哪种方式。
(3)本题,无疑是用if-else比较方便。
编程要求
测试说明
从左到右分别输入的数据为父亲身高,母亲身高,本人性别,是否喜欢体育锻炼,是否有良好饮食习惯。
测试输入:
170 160 F N N
预期输出:
158.45
测试输入:
172 165 M Y N
预期输出:
185.62
代码实现
#include <stdio.h>
int main()
{
char x;//性别
int faHeight,moHeight;//父母身高
char sport;//运动
char diet;//饮食
int Y,N,F,M;//F女,M男,Y=yes,N=no
//Y=1;
//N=0,F=0,M=1;
double a = 0, H = 0;//a为男生身高,H为女生身高
printf("请输入父母身高:\n");
printf("请输入性别 F OR M\n");
printf("请输入饮食习惯 好为Y,不好为N:\n");
printf("是否爱好体育运动:Y OR N\n");
scanf("%d\n",&faHeight);
scanf("%d\n",&moHeight);
scanf("%c\n",&x);
scanf("%c\n",&sport);
scanf("%c",&diet);
if(x=='M')
{a=(faHeight+moHeight)*0.54;
}
else a=(faHeight*0.923 + moHeight)/2;
H = a;
if(diet=='Y')
{a=a+0.015*H;}
if(sport=='Y')
{a=a+0.02*H;}
printf("%.2f",a);
return 0;
}