我根据身高和性别编写了以下程序来检查男性和女性的理想体重:
#include<stdio.h>
#include<conio.h>
int main()
{
int age;
float height, mminima = 48, fminima = 45, iw;
char gender;
printf("Please Enter your Age,Height(in CM) and Gender\n");
scanf("%d\n%f\n%c", &age, &height, &gender);
if((gender = 'M') && (height < 152.4))
{
iw = mminima - (152.4 - height) * 1.1;
printf("\nYour idle Weight should be= %f", iw);
}
else
{
iw = mminima + (height - 152.4) * 1.1;
printf("\nYour Idle Wight should be= %f", iw);
}
if((gender = 'F') && (height < 152.4))
{
iw = fminima - (152.4 - height) * 1.1;
printf("\nYour Idle weight should be= %f", iw);
}
else
{
iw = fminima + (height - 152.4) * 1.1;
printf("\nYour Idle weight should be= %f", iw);
}
getch();
return 0;
}
但如果陈述不是性别比较,那么输出总是显示我对男性和女性的理想体重。为什么?我哪里错了?请帮忙!!
答案 0 :(得分:4)
你的if语句if((gender='M')&&(height<152.4))
要求两个条件都是真实的......那么无论性别如何,你的else
部分都会被执行。
如果高度高于152.4,则无论性别如何,else
个if(gender=='M')
{
if (height<152.4)
{
}
else
{
}
}
if(gender=='F')
{
if (height<152.4)
{
}
else
{
}
}
个都会运行
你应该分开这两个条件:
gender='F'
如前所述,您应将gender=='F'
更改为CREATE TABLE `event` (
`id` varchar(36) NOT NULL,
`device_id` varchar(36) NOT NULL,
`device_type` varchar(45) NOT NULL,
`data` text NOT NULL,
`created_at` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `fk_event_device_idx` (`device_id`),
KEY `event_device_type` (`device_type`),
KEY `event_created_at_idx` (`created_at`),
CONSTRAINT `fk_event_device` FOREIGN KEY (`device_id`) REFERENCES `device` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
答案 1 :(得分:2)
代码中的逻辑是错误的。首先你有一个错字
if((gender='M')&&(height<152.4))
gender='M'
是一项任务,将始终返回true。
其次,如果其中任何一个条件为假,它就会else
部分 - 即gender
为'F'
时。您需要将if
拆分为单独的条件。首先检查gender
,然后一旦您确认它等于'M'
,那么您可以检查height
,如下所示:
if(gender=='M')
{
if(height<152.4)
{
iw=mminima-(152.4-height)*1.1;
printf("\nYour idle Weight should be= %f",iw);
}
else
{
iw=mminima+(height-152.4)*1.1;
printf("\nYour Idle Wight should be= %f",iw);
}
}
然后你想要else if
检查gender
等同'F'
,如下所示:
else if(gender=='F')
{
if(height<152.4)
....
因为gender
只能是两个有效值中的一个,所以如果匹配一个,则它与另一个不匹配。您可以添加最终else
来处理gender
不是'M'
或'F'
并报告错误的情况。
答案 2 :(得分:1)
应该纠正几个问题:
1)错误的比较:
if(gender='M') // always true; should be if(gender=='M')
if((gender = 'F') // always true; should be if(gender=='M')
2)程序逻辑错误,会为女性和男性打印Ideal Weight
如果高度高于152.4
3)许多重复代码应该封装在函数中。
4)错误的性别符号缺乏错误处理。
5)需要正确的拼写和打印输出。正确:Idle Wigh
6)无需打印重量74.3456789
.
之后的一位数就足够了。
7)常量幻数应该在main之外定义,例如:
#define MAGIC_HEIGHT 152.4
8)使用switch
和case
可以提高程序的清晰度:
示例:
#include<stdio.h>
#include<conio.h>
#define M_MIN 48.0
#define F_MIN 45.0
#define FACTOR 1.1
#define MAGIC_HEIGHT 152.4
void print_ideal_weight(float iw)
{
printf("\nYour Ideal weight should be = %.1f", iw);
}
float calculate_ideal_weight(float m, float height)
{
float iw;
if(height < MAGIC_HEIGHT){
iw = m - (MAGIC_HEIGHT - height) * FACTOR;
}
else{
iw = m + (height - MAGIC_HEIGHT) * FACTOR;
}
return iw;
}
int main()
{
int age;
float height, iw;
char gender;
printf("Please Enter your Age, Height(in CM) and Gender(F/M): \n");
scanf("%d\n%f\n%c", &age, &height, &gender);
switch (gender)
{
case 'M':
iw = calculate_ideal_weight(M_MIN,height);
print_ideal_weight(iw);
break;
case 'F':
iw = calculate_ideal_weight(F_MIN,height);
print_ideal_weight(iw);
break;
default:
printf("Unknown gender entered!\n");
break;
}
getch();
return 0;
}
输出:
Please Enter your Age, Height(in CM) and Gender(F/M):
25
176
M
Your Ideal weight should be = 74.0