腊肉张 2022-12-09 16:33 采纳率: 100%
浏览 22
已结题

关于#getchar#的问题,如何解决?


#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
********************

  • 写回答

1条回答 默认 最新

  • 开心的牛仔 2022-12-09 17:14
    关注

    img

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 12月17日
  • 已采纳回答 12月9日
  • 创建了问题 12月9日

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么