程序内容:
提供五种工资菜单,用户自行选择,读取用户输入的工作时长,计算工资和净收入,及其缴纳的税金。(C Primer Plus 第7章 第8题)
程序更新:解决输入非数字选项后退出程序的bug。
这个bug之前写程序的时候没多关注,正好有时间,就改过来了。
程序可执行文件:
工资1.3.exe
9.2K
· 百度网盘
Ps:源代码为本人亲自编写,并非书内标准答案,准确性需要读者自行考究。
Ps2:程序如果有bug或者想提出意见,可以在评论区留言,至于为什么我之前更新的那些底部都是英文,这就要问知乎了。
首先,如果要处理输入非数字不退出程序的问题,就需要让程序正确读取,这里使用getchar函数更容易,将原本的scanf替换成getchar即可。
但相应的,也会多出许多麻烦,第一点就是最后一次输入后,缓冲区内有换行符,getchar以ifu的形式将换行符读取,也会造成bug,为了避免这个bug ,可以考虑在最后一次输入的末尾,添加skip_word函数。
另外,getchar读取之后,缓冲区还会有其他字符流,所以需要跳过所有剩余的字符,只读取首位。
以下就是这个函数的代码:
int getfirst(void)
{int choice=-1;choice=getchar();skip_word();return choice;
} //读取第一个字符
程序源代码:
/*根据工作时间,计算工资*/
#include<stdio.h>
//基本工资等级
#define BASEPAY1 8.75
#define BASEPAY2 9.33
#define BASEPAY3 10.00
#define BASEPAY4 11.20
//税率
#define TAX_RATE1 0.15
#define TAX_RATE2 0.20
#define TAX_RATE3 0.25int worktime_test(double worktime); //测试工作时间数据是否大于零的函数原型
int hourly_wage_test(double hourly_wage); //测试时薪是否正常
double custom(void);
void skip_word(void); //跳过多余的输入
int getfirst(void); //读取第一个输入
int main()
{int choice=0; //选择变量double wages=0.0,workhour=0.0,taxes=0.0;//工资总额、工作时间、税金int i;//打印程序的选项界面for(i=0;i<=64;i++)printf("*");printf("nEnter the number corresponding to the desired pay rate or action:n" //显示菜单,提示用户输入"请选择类型n""1) $8.75/hrtttt2) $9.33/hrn""3) $10.00/hrtttt4) $11.20/hrn""5) 自定义工资(时薪)ttt6)quitn");for(i=0;i<=64;i++)printf("*");printf("n");while((choice=getfirst())!=EOF){switch(choice){case '1':do{printf("请输入工作时长(小时):n");scanf("%lf",&workhour);if(worktime_test(workhour))continue;//工资总额if(workhour<=40) //非加班工资wages=BASEPAY1*workhour;else{workhour=(workhour-40)*1.5; //去掉不算在加班内的时间wages=BASEPAY1*workhour;wages += 40*BASEPAY1;}//税金计算if(wages<=300)taxes=wages*TAX_RATE1;else if(wages<=450){taxes=(wages-300)*TAX_RATE2;taxes+=45;}else{taxes=(wages-450)*TAX_RATE3;taxes+=75;}break;}while(1);break;case '2':do{printf("请输入工作时长(小时):n");scanf("%lf",&workhour);if(worktime_test(workhour))continue;if(workhour<=40)wages=BASEPAY2*workhour;else{workhour=(workhour-40)*1.5;wages=BASEPAY2*workhour;wages+=40*BASEPAY2;}//税金计算if(wages<=300)taxes=wages*TAX_RATE1;else if(wages<=450){taxes=(wages-300)*TAX_RATE2;taxes+=45;}else{taxes=(wages-450)*TAX_RATE3;taxes+=75;}break;}while(1);break;case '3':do{printf("请输入工作时长(小时):n");scanf("%lf",&workhour);if(worktime_test(workhour)) //判断用户输入的时间是否为正确数据continue;if(workhour<=40)wages=BASEPAY3*workhour;else{workhour=(workhour-40)*1.5;wages=BASEPAY3*workhour;wages+=40*BASEPAY3;}//税金计算if(wages<=300)taxes=wages*TAX_RATE1;else if(wages<=450){taxes=(wages-300)*TAX_RATE2;taxes+=45;}else{taxes=(wages-450)*TAX_RATE3;taxes+=75;}break;}while(1);break;case '4':do{ //do while如果用户输入错误的值,可以再次输入printf("请输入工作时长(小时):n");scanf("%lf",&workhour);if(worktime_test(workhour))continue;if(workhour<=40)wages=BASEPAY4*workhour;else{workhour=(workhour-40)*1.5;wages=BASEPAY4*workhour;wages+=40*BASEPAY4;}//税金计算if(wages<=300)taxes=wages*TAX_RATE1;else if(wages<=450){taxes=(wages-300)*TAX_RATE2;taxes+=45;}else{taxes=(wages-450)*TAX_RATE3;taxes+=75;}break;}while(1);break;case '5': //自定义工资区域wages=custom(); //自定义工资计算总工资的函数if(wages<=300)taxes=wages*TAX_RATE1;else if(wages<=450){taxes=(wages-300)*TAX_RATE2;taxes+=45;}else{taxes=(wages-450)*TAX_RATE3;taxes+=75;}break;case '6':goto out;default:printf("请输入正确的选项:n");continue;}printf("您的工资总额为:t%.3lf dollarn税金为:tt%.3lf dollarn净收入为:t%.3lf dollarn",wages,taxes,wages-taxes);skip_word();}
out:printf("再见n");return 0;
}//测试用户输入工作时长是否大于零的函数
int worktime_test(double worktime)
{if (worktime<0){ printf("你还让老板给你打工了?n");return 1;}if (worktime==0){printf("不工作哪来的工资?n");return 1;}return 0;
}
int hourly_wage_test(double hourly_wage)
{if (hourly_wage<0){ printf("这怎么涅,还倒搭钱?n");return 1;}if (hourly_wage==0){printf("意思白干呗?n");return 1;}return 0;
}
//自定义工资 计算工资总额
double custom(void)
{double hourly_wage=0.0,worktime=0.0,wages=0.0;do{printf("请输入您的时薪:n");if(!(scanf("%lf",&hourly_wage)==1)){ skip_word();continue;}if(hourly_wage_test(hourly_wage))continue;do{printf("请输入您工作的时间:n");scanf("%lf",&worktime);//if(worktime_test(worktime))// continue;}while(worktime_test(worktime)); //while循环测试工作时间是否小于零wages=hourly_wage*worktime;break;}while(1);return wages;
}
void skip_word(void)
{while(getchar()!='n')continue;
} //跳过错误的输入字
int getfirst(void)
{int choice=-1;choice=getchar();skip_word();return choice;
} //读取第一个字符
Previous generation program1.2:
貂猫:C程序-根据时长和时薪计算工资(用户自定义时薪)zhuanlan.zhihu.com