c++输入错误重新输入_C程序-根据时长和时薪计算工资1.3(解决输入非数字选项退出的bug)...
程序內(nèi)容:
提供五種工資菜單,用戶自行選擇,讀取用戶輸入的工作時長,計(jì)算工資和凈收入,及其繳納的稅金。(C Primer Plus 第7章 第8題)
程序更新:解決輸入非數(shù)字選項(xiàng)后退出程序的bug。
這個bug之前寫程序的時候沒多關(guān)注,正好有時間,就改過來了。
程序可執(zhí)行文件:
工資1.3.exe9.2K · 百度網(wǎng)盤Ps:源代碼為本人親自編寫,并非書內(nèi)標(biāo)準(zhǔn)答案,準(zhǔn)確性需要讀者自行考究。
Ps2:程序如果有bug或者想提出意見,可以在評論區(qū)留言,至于為什么我之前更新的那些底部都是英文,這就要問知乎了。
首先,如果要處理輸入非數(shù)字不退出程序的問題,就需要讓程序正確讀取,這里使用getchar函數(shù)更容易,將原本的scanf替換成getchar即可。
但相應(yīng)的,也會多出許多麻煩,第一點(diǎn)就是最后一次輸入后,緩沖區(qū)內(nèi)有換行符,getchar以ifu的形式將換行符讀取,也會造成bug,為了避免這個bug ,可以考慮在最后一次輸入的末尾,添加skip_word函數(shù)。
另外,getchar讀取之后,緩沖區(qū)還會有其他字符流,所以需要跳過所有剩余的字符,只讀取首位。
以下就是這個函數(shù)的代碼:
int getfirst(void) {int choice=-1;choice=getchar();skip_word();return choice; } //讀取第一個字符程序源代碼:
/*根據(jù)工作時間,計(jì)算工資*/ #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); //測試工作時間數(shù)據(jù)是否大于零的函數(shù)原型 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;//打印程序的選項(xiàng)界面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; //去掉不算在加班內(nèi)的時間wages=BASEPAY1*workhour;wages += 40*BASEPAY1;}//稅金計(jì)算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;}//稅金計(jì)算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)) //判斷用戶輸入的時間是否為正確數(shù)據(jù)continue;if(workhour<=40)wages=BASEPAY3*workhour;else{workhour=(workhour-40)*1.5;wages=BASEPAY3*workhour;wages+=40*BASEPAY3;}//稅金計(jì)算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;}//稅金計(jì)算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': //自定義工資區(qū)域wages=custom(); //自定義工資計(jì)算總工資的函數(shù)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("請輸入正確的選項(xiàng):n");continue;}printf("您的工資總額為:t%.3lf dollarn稅金為:tt%.3lf dollarn凈收入為:t%.3lf dollarn",wages,taxes,wages-taxes);skip_word();} out:printf("再見n");return 0; }//測試用戶輸入工作時長是否大于零的函數(shù) 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; } //自定義工資 計(jì)算工資總額 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循環(huán)測試工作時間是否小于零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程序-根據(jù)時長和時薪計(jì)算工資(用戶自定義時薪)?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的c++输入错误重新输入_C程序-根据时长和时薪计算工资1.3(解决输入非数字选项退出的bug)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win+mysql自动备份吗_Windo
- 下一篇: oracle12c 删除pdb用户,or