#include <stdio.h>
#define EXTRA_HOUR 1.5
#define BASE_TAX 0.15
#define EXTRA_TAX 0.2
#define EXCEED_TAX 0.25
void show_menu(void);
void calc_salary(float base_salary, float hour);
int main(void)
{
float hour = 0;
char selected ;
do
{
show_menu();
selected = getchar();
while(getchar() != '\n') continue;
switch (selected)
{
case 'a':
printf("you choose $8.75/hr,enter hour");
scanf("%f", &hour);
calc_salary(8.75, hour);
break;
case 'b':
printf("you choose $9.33/hr,enter hour");
scanf("%f", &hour);
calc_salary(9.33, hour);
break;
case 'c':
printf("you choose $10.00/hr,enter hour");
scanf("%f", &hour);
calc_salary(10.00, hour);
break;
case 'd':
printf("you choose $11.20/hr,enter hour");
scanf("%f", &hour);
calc_salary(11.20, hour);
break;
case 'q':
break;
default:
printf("wrong choose,rechoose again\n");
break;
}
} while (selected != 'q');
return 0;
}
void show_menu(void)
{
char s1[] = "a) $8.75/hr";
char s2[] = "b) $9.33/hr";
char s3[] = "c) $10.00/hr";
char s4[] = "d) $11.20/hr";
char s5[] = "q) Quit";
printf("********************\n");
printf("chose one base_salary:\n");
printf("%-15s", s1);
printf("%-15s\n", s2);
printf("%-15s", s3);
printf("%-15s\n", s4);
printf("%-15s\n", s5);
printf("********************\n");
}
void calc_salary(float base_salary, float hour)
{
float salary, tax, taxed_salary;
if (hour <= 30)
{
salary = base_salary * hour;
tax = BASE_TAX * salary;
taxed_salary = salary - tax;
}
else if (hour > 30 && hour <= 40)
{
salary = base_salary * hour;
tax = BASE_TAX * 300 + (salary - 300) * EXTRA_TAX;
taxed_salary = salary - tax;
}
else
{
hour = 40 + (hour - 40) * EXTRA_HOUR;
salary = base_salary * hour;
if (salary <= 450)
{
tax = BASE_TAX * 300 + (salary - 300) * EXTRA_TAX;
taxed_salary = salary - tax;
}
else
{
tax = BASE_TAX * 300 + 150 * EXTRA_TAX + (salary - 450) * EXCEED_TAX;
taxed_salary = salary - tax;
}
}
printf("%.2f %.2f %.2f\n",salary, tax, taxed_salary);
printf("\ncontinue\n");
}
根据菜单选择时薪后再输入工作时间打印总工资,利用selected = scanf("%c",&selected)或者selected = getchar()选择选项,但是输出是这样的:第一次正常,但是第二次输入a后回车自动显示wrong choose,rechoose again,再次输入a又能恢复正常,不能理解a在选项里明明是正确选项,为啥是wrong,然后第三次为什么恢复正常,是因为终端输入a后的回车也计入了吗,但是
我尝试把选项改成数字1 2 3 4,然后selected = scanf("%d",&selected)可以避免这个问题,现在就用scanf("%c",&selected)或者selected = getchar(),如何改呢,以上代码是C Primer Plus的参考答案
********************
chose one base_salary:
a) $8.75/hr b) $9.33/hr
c) $10.00/hr d) $11.20/hr
q) Quit
********************
a
you choose $8.75/hr,enter hour6
52.50 7.88 44.63
continue
********************
chose one base_salary:
a) $8.75/hr b) $9.33/hr
c) $10.00/hr d) $11.20/hr
q) Quit
********************
a
wrong choose,rechoose again
********************
chose one base_salary:
a) $8.75/hr b) $9.33/hr
c) $10.00/hr d) $11.20/hr
q) Quit
********************
a
you choose $8.75/hr,enter hour6
52.50 7.88 44.63
continue
********************
chose one base_salary:
a) $8.75/hr b) $9.33/hr
c) $10.00/hr d) $11.20/hr
q) Quit
********************