如何在开关状态下验证字符串和双打

  • 本文关键字:字符串 验证 开关 状态 c
  • 更新时间 :
  • 英文 :


我刚开始编程,刚刚一周。我试图用c编程语言中的switch语句来解决一个学校作业的问题。但我无法使用switch语句验证输入的字符串或double。

以下是我的问题:

Q3.一家公司决定在新年向所有员工发放奖金。决定向所有男性员工发放5%的奖金,向女性员工发放10%的奖金。此外,如果员工的工资低于10000卢比,则该员工将获得额外2%的工资奖金。编写一个C程序switch…case结构,输入员工的工资和性别,并计算必须给员工的奖金。

下面是我的代码。

#include <stdio.h>
int main()
{
char gender[6];
double salary;
double bonusSalary;
printf("enter your gender here:");
scanf("%s", gender);
printf("enter your salary here:");
scanf("%lf", &salary);
switch(gender && salary)
{
case "male" && salary<10000 :
bonusSalary=salary*(7.0/100.0);
break;
case "male" :
bonusSalary=salary*(5.0/100.0);
break;
case "female" && salary<10000 :
bonusSalary=salary*(10.0/100.0);
break;
case "female" :
bonusSalary=salary*(12.0/100.0);
break;
default :
printf("invalid input");
break;
}
printf("your bonus salary is:%f", bonusSalary);
return 0;
}

我收到的错误如下:"case标签确实减少为整数常数";我用过的所有案例陈述。

正如@ElKurshum正确指出的那样,不能在switch语句中使用字符串。但是,您可以使用intcharshortlong等。请使用switch语句找到以下修改后的代码。请务必阅读评论以了解所做的更改。

#include <stdio.h>
int main()
{
char gender;
double salary;
double bonusSalary;

int gender_code;

printf("enter your gender here [M/F]: ");
scanf("%c", &gender);

printf("enter your salary here: ");
scanf("%lf", &salary);

// salary_lt_10000 will be either 0 or 1
int salary_lt_10000 = salary < 10000.0;

// Mapping used:
// M -> 100
// F -> 200
// M with salary < 10000 -> 101
// F with salary < 10000 -> 201
switch (gender)
{
case 'M':
// Input is ok
gender_code = 100 + salary_lt_10000;
break;
case 'F':
// Input is ok
gender_code = 200 + salary_lt_10000;
break;
default:
printf("Invalid input. Expected 'M' or 'F'n");
return 1;
}

// printf("gender_code = %dn", gender_code);
// No need to divide the values for percentage,
// for example, we know 5/100 is always 0.05 and so on for other values.
switch (gender_code)
{
case 100:
bonusSalary = 0.05 * salary;
break;
case 101:
bonusSalary = 0.07 * salary;
break;
case 200:
bonusSalary = 0.10 * salary;
break;
case 201:
bonusSalary = 0.12 * salary;
break;
default:
printf("Something went wrong...n");
return 1;
}

printf("your bonus salary is: %lfn", bonusSalary);
return 0;
}

switch不能这样工作。控制表达式必须是一个整数表达式(gender && salary < 10000就是它,我将在下面解释(,case标签必须是整数常量表达式,如65'A'或类似表达式。不能打开字符串或浮点值。

CCD_ 12是一个数组表达式;在这种情况下;衰变";指向指针表达式,其值为数组的第一个元素的地址。由于您声明它的方式,它将始终为非零。如果为真则salary < 10000将评估为1,如果为假则0

如果两个操作数都为非零,则&&表达式的结果为1,否则为0。将对左侧操作数进行完全求值(并应用任何副作用(-如果结果为非零,则对右侧操作数进行求值。如果左操作数是0,则根本不计算右操作数。

因此,如果这是您的控制表达式,那么只有01两种情况,它们不会捕获所有可能的输入组合。

对于您尝试做的事情,switch语句是不合适的——您应该使用if-else语句:

#include <string.h>
...
if ( strcmp( gender, "male" ) == 0 )
{
if ( salary < 10000 )
{
bonusSalary = salary * 0.07;
}
else
{
bonusSalary = salary * 0.05:
}
}
else if ( strcmp( gender, ”female" ) == 0 )
{
// compute bonus for female
}
else
{
// unrecognized gender entry, handle as appropriate
}

没有为字符串定义==运算符,因此必须使用strcmp进行字符串比较(如果字符串相同,则返回0,否则为非零(。注意strcmp区分大小写。

最后,当您声明一个数组来存储字符串时,您必须留出至少一个比最大字符串长度多的元素来考虑字符串终止符——这意味着您的gender数组需要有7个元素宽,而不是6个。字符串"female"被表示为序列{'f', 'e', 'm', 'a', 'l', 'e', 0},其是7个元素。

只能向switch语句传递int、char或enum。不允许使用其他类型。因此,如果你想比较字符串和浮点值,你应该使用string.h中的strcmp((进行字符串比较,并为自己创建一个比较浮点值的函数。

最新更新