标题:如何解决字母及字符输入出错的问题
只看楼主
小小熊宝宝
Rank: 2
来 自:江苏无锡
等 级:论坛游民
威 望:2
帖 子:183
专家分:38
注 册:2008-8-12
结帖率:100%
已结贴  问题点数:2 回复次数:2 
如何解决字母及字符输入出错的问题
编译环境VC++ 6.0
编写程序,要求输入一周中的工作小时数,然后打印工资总额、税金以及净工资。作如下假设:
a.  使程序提供一个选择工资等级的菜单。用switch选择工资等级。程序运行的开头应该像这样:
    *****************************************************************
    Enter the number corresponding to the desired pay rate or action:
    1) $8.75/hr         2) $9.33/hr
    3) $10.00/hr        4) $11.20/hr
    5) quit
    *****************************************************************
b.  加班(超过40小时)=1.5倍的时间
c.  税率               前300美元为15%
                       下一个150美元为20%
                       余下的为25%
用#define定义常量,不必关心本例是否符合当前的税法。
如果选择1到4,那么程序应该请求输入工作小时数。程序应该一直循环运行,直到输入5。如果输入1到5以外的选项,那么程序应该提醒用户合适的选项是哪些,然后再循环。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#define TAX_RATE_FIRST 0.15 //前300美元的税率
#define TAX_RATE_NEXT 0.20 //下一个150美元的税率
#define TAX_RATE_REMAIN 0.25 //余下的税率
int main(void)
{
    int hours,number;
    double pay,sum_pay,pay_hour,taxation;
    printf("*****************************************************************\n");
    printf("Enter the number corresponding to the desired pay rate or action:\n");
    printf("1) $8.75/hr \t\t\t\t2) $9.33/hr\n");
    printf("3) $10.00/hr\t\t\t\t4) $11.20/hr\n");
    printf("5) quit\n");
    printf("*****************************************************************\n");
    scanf("%d",&number);
    while(number!=5) //输入5退出程序
    {
        switch(number)
        {
        case 1:pay_hour=8.75; //选择1时的基本工资
            break;
        case 2:pay_hour=9.33; //选择2时的基本工资
            break;
        case 3:pay_hour=10.00; //选择3时的基本工资
            break;
        case 4:pay_hour=11.20; //选择4时的基本工资
            break;
        default:printf("Error!Enter the number again.\n"); //其余数字为错误
            scanf("%d",&number);
            continue;
        }
        printf("Please input your work hours in a week!\n");
        scanf("%d",&hours);
        while(1)
        {
            if(hours<0||hours>168) //一周工作时间小于0大于168为错误时间
            {
                printf("Error!Please enter the digital 0 to 168.\n");
                scanf("%d",&hours); //重新输入小时
                continue;
            }
            else if(hours<=40) //一周工作时间大于0小于等于40小时为1倍时间计算
                pay=pay_hour*hours;
            else
                pay=pay_hour*(40+1.5*(hours-40)); //一周工作时间大于40小于等于168小时为1.5倍时间计算
            if((pay-450)<=-150) //工资总额小于等于300美元的税金计算
                taxation=pay*TAX_RATE_FIRST;
            else if((pay-450)<=0&&(pay-450)>-150) //工资总额大于300美元小于等于450美元的税金计算
                taxation=300.00*TAX_RATE_FIRST+(pay-300.00)*TAX_RATE_NEXT;
            else
                taxation=300.00*TAX_RATE_FIRST+150.00*TAX_RATE_NEXT+(pay-450.00)*TAX_RATE_REMAIN; //工资总额大于450美元的税金计算
            sum_pay=pay-taxation; //净工资为工资总额减去税金
            printf("You have worded %d hours in a week.\n",hours); //打印输出结果
            printf("Your pay rate is $%.4lf/hr\n",pay_hour);
            printf("The total pay is $%.4lf/hr\n",pay);
            printf("Your pay is $%.4lf and the taxation is $%.4lf.\n",sum_pay,taxation);
            break;
        }
        printf("*****************************************************************\n");
        system("pause");
        system("cls");
        printf("*****************************************************************\n");
        printf("*****************************************************************\n");
        printf("Enter the number corresponding to the desired pay rate or action:\n");
        printf("1) $8.75/hr \t\t\t\t2) $9.33/hr\n");
        printf("3) $10.00/hr\t\t\t\t4) $11.20/hr\n");
        printf("5) quit\n");
        printf("*****************************************************************\n");
        printf("Do you want to again?\nEnter \"5\" to quit, other numbers be continued.\n");
        scanf("%d",&number);
    }
    printf("That's all. Thank you for using!\n");
    return 0;
}

输入其他都正常,输入字母或者字符就陷入死循环,如何解决?

[ 本帖最后由 小小熊宝宝 于 2010-9-27 13:16 编辑 ]
搜索更多相关主题的帖子: 编写程序 desired number action 
2010-09-27 13:04
逐渐学习
Rank: 6Rank: 6
等 级:侠之大者
帖 子:113
专家分:454
注 册:2010-9-26
得分:2 
这个问题出现在scanf函数上.一旦输入非法类型数据,程序不是死锁,就是得到一个错误的结果.
可以这样修改下:
 增加变量i,int i;
           i=scanf("%d",&number);
           while(i!=1)
           { fflush(stdin);
             printf("Error!Enter the number again.\n");
             i=scanf("%d",&number);
           }
 用上述语句替换scanf("%d",&number);
           i=scanf("%d",&hours);
           while(i!=1)
           { fflush(stdin);
             printf("Error!Please enter the digital 0 to 168.\n");
             i=scanf("%d",&hours);
           }
用上述语句替换scanf("%d",&hours);在试试看

帮人《---》帮己
2010-09-27 16:01
小小熊宝宝
Rank: 2
来 自:江苏无锡
等 级:论坛游民
威 望:2
帖 子:183
专家分:38
注 册:2008-8-12
得分:0 
有道理,明白了,THANKS!!!!

欢迎加入C语言交流群:43287755
2010-09-27 16:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-321481-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.405253 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved