Zero-Se
2016-12-06 07:17
采纳率: 91.7%
浏览 932
已采纳

进一步实现其他任何非整型输入的情况,比如输入字符,用单独的函数实现判断,在主函数中调用此函数判断

 #include <stdio.h>

int main(int argc,char* argv[])
{   
    int nBase = 1500,nPerformance = 0,nTemp = 0,nRes = 0;
    int nDuty = 0,nInvigilate = 0,nClass = 0;
    double fReserve = 0.0;
    printf("输入老师值班天数(不少于5天,不能超过22天):");
    nRes = scanf("%d",&nDuty);

    while(nRes == 1)
    {
        if (nDuty >= 5 && nDuty <= 22)
        {
            break;
        }
        else if (nDuty < 0)
        {
            printf("输入数据有误,请输入整数!\n");
        }
        else
        {           
            printf("输入范围有误,请输入整数!\n");
        }
        printf("输入老师值班天数(不少于5天,不能超过22天):");
        nRes = scanf("%d",&nDuty);
    }

    printf("输入老师监考次数(不能超过10次):");
    nRes = scanf("%d",&nInvigilate);
    while(nRes == 1)
    {
        if (nInvigilate >= 0 && nInvigilate <= 10)
        {
            break;
        }
        else if (nInvigilate < 0)
        {
            printf("输入数据有误,请输入整数!\n");
        }
        else
        {           
            printf("输入范围有误,请输入整数!\n");
        }
        printf("输入老师监考次数(不能超过10次):");
        nRes = scanf("%d",&nInvigilate);
    }

    printf("输入老师上课次数(不能超过30次):");
    nRes = scanf("%d",&nClass);
    while(nRes == 1)
    {
        if (nClass >= 0 && nClass <= 30)
        {
            break;
        }
        else if (nClass < 0)
        {
            printf("输入数据有误,请输入整数!\n");
        }
        else
        {           
            printf("输入范围有误,请输入整数!\n");
        }
        printf("输入老师上课次数(不能超过30次):");
        nRes = scanf("%d",&nClass);
    }

    nPerformance = (nDuty * 60) + (nInvigilate * 30) + (nClass * 64);
    nTemp = nPerformance + nBase;

    if (nTemp > 5000)
    {
        fReserve = (nTemp - 5000) * 0.25 + 1000 * 0.2 + 2000 * 0.15 + 2000 * 0.1;
    }
    else if (nTemp > 4000 && nTemp < 5000)
    {
        fReserve = (nTemp - 4000) * 0.2 + 2000 * 0.15 + 2000 * 0.1;
    }
    else if (nTemp > 2000 && nTemp < 4000)
    {
        fReserve = (nTemp - 2000) * 0.15 + 2000 * 0.1;
    }
    else if (nTemp < 2000)
    {
        fReserve = (float)(nTemp * 0.1);
    }
    printf("绩效工资总额是%d\n",nPerformance);
    printf("工资总额是%d\n",nTemp);
    printf("需要缴纳的公积金是%0.2f\n",fReserve);
    return 0;
}
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

8条回答 默认 最新

  • 看得到你的人头 2016-12-07 03:09
    已采纳

    可以参考参考

     #include <stdio.h>
    #include <windows.h>
    
    void Input(int &nDuty, int &nInvigilate,int &nClass);//获取值班天数、监考次数、上课次数
    void Calclate(int nDuty, int nInvigilate,int nClass);//计算工资、公积金等
    
    
    int main(int argc,char* argv[])
    {   
        int nDuty = 0,nInvigilate = 0,nClass = 0;
    
        Input(nDuty, nInvigilate, nClass);
        Calclate(nDuty, nInvigilate, nClass);
        return 0;
    }
    
    //输入是否为合法数据 str为获取的字符串,minValue为合法的最小值,maxValue为合法的最大值
    //返回值 合法,返回输入的整数,不合法返回0
    int IsLegalInput(const char * str, int minValue, int maxValue)
    {
        int i = 0;
        int strValue = 0;
        int strLength = strlen(str);//数据长度
        for (i = 0; i < strLength; i++)
        {
            if(('0' == str[i]) || ('1' == str[i]) || ('2' == str[i]) || ('3' == str[i]) || ('4' == str[i]) || ('5' == str[i])
                || ('6' == str[i]) || ('7' == str[i]) || ('8' == str[i]) || ('9' == str[i]))
            {
                break;
            }
            else // 输入的不是整数
            {
                printf("输入数据有误,请输入整数!\n");
                return 0;
            }
        }
        //确认是整数了
        strValue = atoi(str);
        if (strValue < minValue || maxValue < strValue )
        {
            printf("输入范围有误,请输入%d到%d的整数!\n", minValue, maxValue);
            return 0;
        }
        return strValue;
    }
    
    void Input(int &nDuty, int &nInvigilate,int &nClass)
    {
        int rt;
        char input[10];
    
        //输入老师值班天数
        do 
        {
            printf("输入老师值班天数(不少于5天,不能超过22天):");
            scanf("%s",input);
            rt = nDuty = IsLegalInput(input, 5, 22);//是否为合法输入
        } while (!rt);
    
    
        //输入老师监考次数
        do 
        {
            printf("输入老师监考次数(不能超过10次):");
            scanf("%s",input);
            rt = nInvigilate = IsLegalInput(input, 1, 10);//是否为合法输入
        } while (!rt);
    
    
        //输入老师上课次数
        do 
        {
            printf("输入老师上课次数(不能超过30次):");
            scanf("%s",input);
            rt = nClass = IsLegalInput(input, 1, 30);//是否为合法输入
        } while (!rt);
    }
    
    //计算工资、公积金等
    void Calclate(int nDuty, int nInvigilate,int nClass)
    {
        int nPerformance = 0;
        int nTemp = 0;
        int nBase = 1500;
        nPerformance = (nDuty * 60) + (nInvigilate * 30) + (nClass * 64);
        nTemp = nPerformance + nBase;
        double fReserve = 0.0;
        if (nTemp > 5000)
        {
            fReserve = (nTemp - 5000) * 0.25 + 1000 * 0.2 + 2000 * 0.15 + 2000 * 0.1;
        }
        else if (nTemp > 4000 && nTemp < 5000)
        {
            fReserve = (nTemp - 4000) * 0.2 + 2000 * 0.15 + 2000 * 0.1;
        }
        else if (nTemp > 2000 && nTemp < 4000)
        {
            fReserve = (nTemp - 2000) * 0.15 + 2000 * 0.1;
        }
        else if (nTemp < 2000)
        {
            fReserve = (float)(nTemp * 0.1);
        }
        printf("绩效工资总额是%d\n",nPerformance);
        printf("工资总额是%d\n",nTemp);
        printf("需要缴纳的公积金是%0.2f\n",fReserve);
    }
    
    点赞 打赏 评论
  • shen_wei 2016-12-06 07:17
        while(1)
        {
            nRes = scanf("%d",&nDuty);
            if (nRes == 1)
            {
                if (nDuty >= 5 && nDuty <= 22)
                {
                    break;
                }
                else if (nDuty < 0)
                {
                    printf("输入数据有误,请输入整数!\n");
                    printf("输入老师值班天数,不少于5天,不能超过22天:");                
                }
                else
                {           
                    printf("输入范围有误,请输入整数!\n");
                    printf("输入老师值班天数,不少于5天,不能超过22天:");                
                }           
            }
            else if (nRes == 0)
            {
                scanf("%*c");
                printf("输入老师值班天数,不少于5天,不能超过22天:");            
            }
            else if (nRes == EOF)
            {
                break; //强制中断
            }       
        }
    
    点赞 打赏 评论
  • zhouhaiyangqq 2016-12-06 07:31

    什么叫输入字符?scanf可以转换把任何输入,你要转换成%s??

    点赞 打赏 评论
  • shen_wei 2016-12-06 07:34
     void Fun(int &nData,int nMax,int nMin,char *Str1,char *Str2)
    {
        int nRes = 0;
    
        while(1)
        {   
            printf("%s",Str2);
            nRes = scanf("%d",&nData);
            if (nRes == 1)
            {
                if (nData >= nMin && nData <= nMax)
                {
                    break;
                }
                else if (nData < 0)
                {
                    printf("%s",Str1);                          
                }
                else
                {           
                    printf("%s",Str1);                          
                }           
            }
            else if (nRes == 0)
            {
                scanf("%*c");                   
            }
            else if (nRes == EOF)
            {
                break; //强制中断
            }
        }
    }
    
    Fun(nDuty,22,5,"输入数据有误,请输入整数!\n","输入老师值班天数,不少于5天,不能超过22天:");
    

    这次测试不会死了。。。

    点赞 打赏 评论
  • Zero-Se 2016-12-06 07:45
     #include <stdio.h>
    
    
    int main(int argc,char* argv[])
    {   
        int nBase = 1500,nPerformance = 0,nTemp = 0,nRes = 0;
        int nDuty = 0,nInvigilate = 0,nClass = 0;
        double fReserve = 0.0;
        printf("输入老师值班天数(不少于5天,不能超过22天):");
        nRes = scanf("%d",&nDuty);
    
        while(nRes == 1)
        {
            if (nDuty >= 5 && nDuty <= 22)
            {
                break;
            }
            else if (nDuty < 0)
            {
                printf("输入数据有误,请输入整数!\n");
            }
            else
            {           
                printf("输入范围有误,请输入整数!\n");
            }
            printf("输入老师值班天数(不少于5天,不能超过22天):");
            nRes = scanf("%d",&nDuty);
        }
    
        printf("输入老师监考次数(不能超过10次):");
        nRes = scanf("%d",&nInvigilate);
        while(nRes == 1)
        {
            if (nInvigilate >= 0 && nInvigilate <= 10)
            {
                break;
            }
            else if (nInvigilate < 0)
            {
                printf("输入数据有误,请输入整数!\n");
            }
            else
            {           
                printf("输入范围有误,请输入整数!\n");
            }
            printf("输入老师监考次数(不能超过10次):");
            nRes = scanf("%d",&nInvigilate);
        }
    
        printf("输入老师上课次数(不能超过30次):");
        nRes = scanf("%d",&nClass);
        while(nRes == 1)
        {
            if (nClass >= 0 && nClass <= 30)
            {
                break;
            }
            else if (nClass < 0)
            {
                printf("输入数据有误,请输入整数!\n");
            }
            else
            {           
                printf("输入范围有误,请输入整数!\n");
            }
            printf("输入老师上课次数(不能超过30次):");
            nRes = scanf("%d",&nClass);
        }
    
        nPerformance = (nDuty * 60) + (nInvigilate * 30) + (nClass * 64);
        nTemp = nPerformance + nBase;
    
        if (nTemp > 5000)
        {
            fReserve = (nTemp - 5000) * 0.25 + 1000 * 0.2 + 2000 * 0.15 + 2000 * 0.1;
        }
        else if (nTemp > 4000 && nTemp < 5000)
        {
            fReserve = (nTemp - 4000) * 0.2 + 2000 * 0.15 + 2000 * 0.1;
        }
        else if (nTemp > 2000 && nTemp < 4000)
        {
            fReserve = (nTemp - 2000) * 0.15 + 2000 * 0.1;
        }
        else if (nTemp < 2000)
        {
            fReserve = (float)(nTemp * 0.1);
        }
        printf("绩效工资总额是%d\n",nPerformance);
        printf("工资总额是%d\n",nTemp);
        printf("需要缴纳的公积金是%0.2f\n",fReserve);
        return 0;
    }
    
    点赞 打赏 评论
  • shen_wei 2016-12-06 08:05
    bool Fun(int &nData,int nMax,int nMin,char *Str1,char *Str2)
    {
        int nRes = 0;
    
        while(1)
        {   
            printf("%s",Str2);
            nRes = scanf("%d",&nData);
            if (nRes == 1)
            {
                if (nData >= nMin && nData <= nMax)
                {
                    return true;                
                }
                else if (nData < 0)
                {
                    printf("%s",Str1);                          
                }
                else
                {           
                    printf("%s",Str1);                          
                }           
            }
            else if (nRes == 0)
            {
                scanf("%*c");                   
            }
            else if (nRes == EOF)
            {
                break; //强制中断
            }
        }
        return false;
    }
    
    int main()
    {   
        int nBase = 1500,nPerformance = 0,nTemp = 0,nRes = 0;
        int nDuty = 0,nInvigilate = 0,nClass = 0;
        float fReserve = 0.0;
    
        Fun(nDuty,22,5,"输入数据有误,请输入整数!\n","输入老师值班天数,不少于5天,不能超过22天:");
    
        Fun(nInvigilate,10,0,"输入数据有误,请输入整数!\n","输入老师监考次数,不能超过10次:");
    
        Fun(nClass,30,0,"输入数据有误,请输入整数!\n","输入老师上课次数,不能超过30次:");
    
    
        nPerformance = (nDuty * 60) + (nInvigilate * 30) + (nClass * 64);
        nTemp = nPerformance + nBase;
    
        if (nTemp > 5000)
        {
            fReserve = (nTemp - 5000) * 0.25 + 1000 * 0.2 + 2000 * 0.15 + 2000 * 0.1;
        }
        else if (nTemp > 4000 && nTemp < 5000)
        {
            fReserve = (nTemp - 4000) * 0.2 + 2000 * 0.15 + 2000 * 0.1;
        }
        else if (nTemp > 2000 && nTemp < 4000)
        {
            fReserve = (nTemp - 2000) * 0.15 + 2000 * 0.1;
        }
        else if (nTemp < 2000)
        {
            fReserve = (float)(nTemp * 0.1);
        }
    
        printf("绩效工资总额是%d\n",nPerformance);
        printf("工资总额是%d\n",nTemp);
        printf("需要缴纳的公积金是%0.2f\n",fReserve);
    
        system("PAUSE");
        return 0;
    } 
    
    点赞 打赏 评论
  • zhouhaiyangqq 2016-12-06 08:14

    用scanf就行了,再把其模块化一下:

    #include
    #include
    void InputParam(int* pDuty,int* pInvigilate ,int *pClass)
    {
    int nRes = 0;
    assert(pDuty);
    assert(pInvigilate);
    assert(pClass);
    printf("输入老师值班天数(不少于5天,不能超过22天):");
    nRes = scanf("%d",pDuty);

    while(nRes == 1)
    {
        if (*pDuty >= 5 && *pDuty <= 22)
        {
            break;
        }
        else if (*pDuty < 0)
        {
            printf("输入数据有误,请输入整数!\n");
        }
        else
        {           
            printf("输入范围有误,请输入整数!\n");
        }
        printf("输入老师值班天数(不少于5天,不能超过22天):");
        nRes = scanf("%d",pDuty);
    }
    
    printf("输入老师监考次数(不能超过10次):");
    nRes = scanf("%d",pInvigilate);
    while(nRes == 1)
    {
        if (*pInvigilate >= 0 && *pInvigilate <= 10)
        {
            break;
        }
        else if (*pInvigilate < 0)
        {
            printf("输入数据有误,请输入整数!\n");
        }
        else
        {           
            printf("输入范围有误,请输入整数!\n");
        }
        printf("输入老师监考次数(不能超过10次):");
        nRes = scanf("%d",pInvigilate);
    }
    
    printf("输入老师上课次数(不能超过30次):");
    nRes = scanf("%d",pClass);
    while(nRes == 1)
    {
        if (*pClass >= 0 && *pClass <= 30)
        {
            break;
        }
        else if (*pClass < 0)
        {
            printf("输入数据有误,请输入整数!\n");
        }
        else
        {           
            printf("输入范围有误,请输入整数!\n");
        }
        printf("输入老师上课次数(不能超过30次):");
        nRes = scanf("%d",pClass);
    }
    

    }

    struct RES
    {
    int nPerformance;
    int nSum;
    double fReserve;
    };

    struct RES Calc(init base,int nDuty,int nInvigilate,int nClass)
    {
    struct RES res ={0};
    res.nPerformance = (nDuty * 60) + (nInvigilate * 30) + (nClass * 64);
    res.nSum = nPerformance + nBase;

    if ( res.nSum > 5000)
    {
        fReserve = ( res.nSum - 5000) * 0.25 + 1000 * 0.2 + 2000 * 0.15 + 2000 * 0.1;
    }
    else if ( res.nSum > 4000 &&  res.nSum < 5000)
    {
        fReserve = ( res.nSum - 4000) * 0.2 + 2000 * 0.15 + 2000 * 0.1;
    }
    else if ( res.nSum > 2000 &&  res.nSum < 4000)
    {
        fReserve = ( res.nSum - 2000) * 0.15 + 2000 * 0.1;
    }
    else if ( res.nSum < 2000)
    {
        fReserve = (float)( res.nSum * 0.1);
    }
    printf("绩效工资总额是%d\n",res.nPerformance);
    printf("工资总额是%d\n",res.nSum);
    printf("需要缴纳的公积金是%0.2f\n",res.fReserve);
    

    return res;
    }

    int main()
    {
    int nBase = 1500;
    struct RES res = {0};
    int nDuty = 0,nInvigilate = 0,nClass = 0;

        InputParam(&nDuty,&nInvigilate,&nClass);
        res = Calc(base,nDuty,nInvigilate,nClass);
    
    
        return 0;
    

    }

    点赞 打赏 评论
  • zhouhaiyangqq 2016-12-06 08:16

    #include "stdio.h"
    #include "assert.h"

    点赞 打赏 评论

相关推荐 更多相似问题