程序内容:

提供五种工资菜单,用户自行选择,读取用户输入的工作时长,计算工资和净收入,及其缴纳的税金。(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

c++输入错误重新输入_C程序-根据时长和时薪计算工资1.3(解决输入非数字选项退出的bug)...相关推荐

  1. MySQL数据库用户密码连续5次输入错误限定用户登录

    为数据库安全第三方会进行渗透测试,为防止恶意暴力破解用户密码,在用户登录时密码连续输入错误一定次数后限定用户的登录.本文通过插件实现当用户连续输入5次错误密码后显示其登录. 连接控制插件 MySQL数 ...

  2. 如何解决Office2016安装时提示:错误1406。安装程序无法将值写入注册表项\.xlsx

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 一.当前问题 二.解决办法 一.当前问题 Office2016安装时提示:错误1406.安装程序无法将值写入注册表 ...

  3. sql无法写入mysql_安装sql2008R2数据库时提示错误1406,安装程序无法将值写入注册表项?...

    摘要: 安装sql2008R2数据库时提示错误1406,安装程序无法将值写入注册表项 \software\classes\msolapadmin2.msolapsources.1.怎么解决呢? 这个问 ...

  4. 安全模式或开发者模式动画程序关闭动画时长缩放,动画最好不要执行

    安全模式或开发者模式动画程序关闭动画时长缩放,动画最好不要执行. 执行动画的结果:循环动画会闪烁,缩放动画不会执行. 解决:在安全模式或开发者模式动画程序关闭动画时长缩放时,不要执行动画. 1.Pow ...

  5. java手动输入函数_Java程序如何添加一个函数,如果玩家输入错误,它将返回代码。...

    我的程序有问题,不是代码问题,而是我要怎么做,这是我一直困惑的部分.只是为了让你知道我是一个基本的Java编码器,我不理解复杂的东西,所以请记住,我的代码不是最好的. ---------------- ...

  6. bootstrap 输入错误提示_win7系统提示explorer.exe应用程序错误怎么办

    在电脑当中弹出错误提示框可谓是多种多样,详细有很多电脑都有碰到过,最近有位win7系统用户在使用电脑的过程中,系统总是提示"explorer.exe应用程序错误",用户不知道怎么解 ...

  7. python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现...

    相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...

  8. python编写猜数游戏代码、如果不是整数、显示输入错误_python编写猜数游戏代码、如果不是整数、显示输入错误_数字炸弹游戏程序 用python来实现......

    相信许多小伙伴都玩过数字炸弹游戏,就是指在一定数字范围(一般是整数,不包含边界)里,一个玩家选中一个数字当作炸弹,其余玩家在这个范围含数字,每次只要没猜中炸弹数字,则根据玩家猜的数字缩小范围,直至其中 ...

  9. java输错重新输入_java程序在dos界面运行时输入错误后返回重新输入的方法

    展开全部 修改点:62616964757a686964616fe78988e69d8331333332623936在switch中增加default判断错误的输入 将while设置成无限循环,就能够继 ...

最新文章

  1. mysql创建generator字段_springmvc+mybatsi-generator生成不了字段注释的解决方案
  2. 玩转产品排期:让小伙伴们高效协作
  3. 传统登录实现方式问题思考
  4. 2007高考:考生要根据家庭经济条件慎重填报按办学成本收费的高校及专业
  5. moxy json介绍_MOXy的对象图和动态JAXB
  6. JavaSE基础知识学习-----泛型
  7. linux jmeter 内存,JMeter-Linux内存不足
  8. 21 句话入门机器学习
  9. Flask 的 template模板 与 jinja2语法
  10. NEC公司日前正式回绝了AMD的传唤请求
  11. net.sf.json与fastjson两种jar包的使用
  12. 构建区块链量化交易系统(一)
  13. 解决Linux连不上外国软件源或者软件源失效
  14. UESTC 1633 去年春恨却来时,落花人独立,微雨燕双飞 Dijkstra+构造
  15. Smbus host controller not enabled Assuming drive cache : write through
  16. 还 是 你 太 狠 心
  17. CPU制作工艺中的14nm工艺
  18. 校园表白墙微信小程序V1.0 SayLove -基于微信云开发-一键快速搭建,开箱即用
  19. 在H5移动端开发强制竖屏,横屏时提示
  20. 安全防护 守好家门 也谈端口的开关

热门文章

  1. docker 删除image_如何用两个小时入门 Docker?
  2. java https双向验证_java https双向认证证书
  3. flag的具体用法python_Python Qt.WindowFlags方法代码示例
  4. android录屏软件冲突,关于Android同时录制多个录像的问题
  5. mysql中group by的排序问题_Mysql之group by 和order by 一起用时的排序问题
  6. php伪静态限制网页播放视频,学习猿地-php伪静态后html不能访问怎么办
  7. yolov4用1050ti_简单粗暴的多目标跟踪神器 – DeepSort
  8. 鸿蒙手机是个噱头,华为鸿蒙不是谈判噱头 必要时会应用手机当中!
  9. python数字对应车站_python爬虫查询车站信息
  10. 学习Spring Boot:(二十三)Spring Boot 中使用 Docker