我为C编程课编写的源代码有两个问题。
1)我们必须从1,2,3,4或5的用户那里获得选择。如果做出这些选择以外的任何其他选择,则代码是提醒用户有效的选择。我尝试将默认值与 printf() 一起使用,但它没有恢复到它。2)此外,如果将字母作为选择,程序将进入无限循环,其中选择提示会不断打印给用户。任何帮助将不胜感激!下面是我在Visual Studio中使用的代码Microsoft。
#include <stdio.h>
int main(void)
{
const float OVERTIME_LIMIT = 40.0f;
const float OVERTIME_RATE = 1.5f;
const float TAX_LIMIT1 = 300.0f;
const float TAX_RATE1 = 0.15f;
const float TAX_LIMIT2 = 150.0f;
const float TAX_RATE2 = 0.20f;
const float TAX_RATE3 = 0.25f;
float gross = 0.0f;
float tax = 0.0f;
float work_hours = 0.0f;
float pay_rate = 0.0f;
int selection = 0;
do
{
printf("*****************************************************************n");
printf("Enter the number corresponding to the desired pay rate or action:n");
printf("1)$8.75/hrttttt2)$9.33/hrn");
printf("3)$10.00/hrttttt4)$11.20/hrn");
printf("5)quitn");
printf("*****************************************************************n");
if ((1 == scanf("%d", &selection)) && selection >= 1 && selection <= 4)
{
switch (selection)
{
case 1:
pay_rate = 8.75f;
break;
case 2:
pay_rate = 9.33f;
break;
case 3:
pay_rate = 10.00f;
break;
case 4:
pay_rate = 11.20f;
break;
}
printf("Please enter working hours: ");
scanf("%f", &work_hours);
if (work_hours > OVERTIME_LIMIT)
{
work_hours = OVERTIME_LIMIT + (work_hours - OVERTIME_LIMIT) * OVERTIME_RATE;
}
gross = work_hours * pay_rate;
if (gross <= TAX_LIMIT1)
{
tax = gross * TAX_RATE1;
}
else if (gross <= (TAX_LIMIT1 + TAX_LIMIT2))
{
tax = TAX_LIMIT1 * TAX_RATE1 + (gross - TAX_LIMIT1) * TAX_RATE2;
}
else
{
tax = TAX_LIMIT1 * TAX_RATE1 + TAX_LIMIT2 * TAX_RATE2 + (gross - TAX_LIMIT1 - TAX_LIMIT2) * TAX_RATE3;
}
printf("Gross: %.2fn", gross);
printf("Tax: %.2fn", tax);
printf("Net income: %.2fnn", gross - tax);
}
} while (selection != 5);
return 0;
你使用 if 语句如下:
if ((1 == scanf("%d", &selection)) && select>= 1 && select <= 4)
在这里,您只允许 1 到 4 的选择值用于开关情况。那么就不需要使用默认大小写了。如果你使用,那么它不会产生任何影响。因此,请删除 if 条件中的选择值检查。然后,您可以在开关情况本身中添加要退出的情况 5。在开关大小写中添加默认条件,如果选择不在 1 到 5 的范围内,则将打印默认大小写的 print 语句。希望这会有所帮助。
你的行:
if ((1 == scanf("%d", &selection)) && selection >= 1 && selection <= 4)
正在给你带来麻烦。 您正在尝试扫描该行以查找整数,但失败,因此扫描取消。 下次,当您返回到scanf
时,流中具有相同的字母,因为它与您的扫描不匹配并且从未被使用过。
scanf("%d"
不是这里的答案。 您需要做的只是获取单个字符,并尝试将其转换为整数。 您可以使用如下所示的代码来执行此操作,或者您可以从注释中获取 Gabriel 的建议,并使用 getchar()
。
char c;
scanf("%c", &c);
获得字符后,需要将其转换为整数。 如果它是一个以 null 结尾的字符串,您可以使用 atoi
,但由于它只是一个字符,因此您可以执行"作弊":
c = c - '0';
if (c >= 1 && c <= 4)
从字符中减去 0 的字符值会将任何数字转换为其实际值。 只要您使用 if
语句检查范围,就可以正常工作。