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条)

报告相同问题?

悬赏问题

  • ¥15 LiBeAs的带隙等于0.997eV,计算阴离子的N和P
  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 来真人,不要ai!matlab有关常微分方程的问题求解决,
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法