我为我的C编程类编写的源代码存在两个问题。
1)我们必须从1,2,3,4或5的用户那里获得选择。如果做出了除这些选择之外的任何选择,则代码将提醒用户有效的选择。我尝试使用defaultf和printf(),但它没有恢复到它。 2)此外,如果作为选择作出选择,则程序进入无限循环,其中选择提示连续打印给用户。任何帮助是极大的赞赏!下面是我在Microsoft Visual Studio中使用的代码。
#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/hr\t\t\t\t\t2)$9.33/hr\n");
printf("3)$10.00/hr\t\t\t\t\t4)$11.20/hr\n");
printf("5)quit\n");
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: %.2f\n", gross);
printf("Tax: %.2f\n", tax);
printf("Net income: %.2f\n\n", gross - tax);
}
} while (selection != 5);
return 0;
答案 0 :(得分:1)
您正在使用if语句,如下所示:
if((1 == scanf(“%d”,&amp; selection))&amp;&amp; selection&gt; = 1&amp;&amp; selection&lt; = 4)
在这里,您只允许将1到4的选择值用于切换案例。 然后不需要使用默认情况。如果你使用那么它不会产生任何影响。 因此,删除if条件中的选择值检查。 然后你可以在开关盒本身中添加case 5来退出。 在开关案例中添加默认条件,如果选择不在1到5的范围内,则将打印默认情况下的打印语句。 希望这会有所帮助。
答案 1 :(得分:0)
你的专栏:
if ((1 == scanf("%d", &selection)) && selection >= 1 && selection <= 4)
导致你的问题。您正在尝试扫描整数行,并且失败,因此扫描取消。下次回到scanf
时,流中会出现相同的字母,因为它与您的扫描不匹配且从未使用过。
scanf("%d"
不是这里的答案。你需要做的只是获取一个字符,并尝试将其转换为整数。您可以使用以下代码来执行此操作,或者您可以从评论中获取Gabriel的建议,并使用getchar()
。
char c;
scanf("%c", &c);
获得角色后,需要将其转换为整数。如果它是一个以空字符结尾的字符串,你可以使用atoi
,但由于它只是一个字符,你可以做一个“作弊”:
c = c - '0';
if (c >= 1 && c <= 4)
从角色中减去0的字符值会将任何数字转换为实际值。只要您使用if
语句检查范围,这将正常工作。