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

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

 #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);
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(7条)

报告相同问题?

悬赏问题

  • ¥60 求直线方程 使平面上n个点在直线同侧并且距离总和最小
  • ¥50 java算法,给定试题的难度数量(简单,普通,困难),和试题类型数量(单选,多选,判断),以及题库中各种类型的题有多少道,求能否随机抽题。
  • ¥50 rk3588板端推理
  • ¥250 opencv怎么去掉 数字0中间的斜杠。
  • ¥15 这种情况的伯德图和奈奎斯特曲线怎么分析?
  • ¥250 paddleocr带斜线的0很容易识别成9
  • ¥15 电子档案元素采集(tiff及PDF扫描图片)
  • ¥15 flink-sql-connector-rabbitmq使用
  • ¥15 zynq7015,PCIE读写延时偏大
  • ¥15 使用spss做psm(倾向性评分匹配)遇到问题