首页 > 代码库 > c语言100实例2 一个数据填写错误导致的问题 论校验的重要性

c语言100实例2 一个数据填写错误导致的问题 论校验的重要性

/**
*题目:企业发放的奖金根据利润提成。
*利润(I)低于或等于10万元时,奖金可提10%;
*利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
*20万到40万之间时,高于20万元的部分,可提成5%;
*40万到60万之间时高于40万元的部分,可提成3%;
*60万到100万之间时,高于60万元的部分,可提成1.5%;
*高于100万元时,超过100万元的部分按1%提成。
*从键盘输入当月利润I,求应发放奖金总数?
*程序分析:请利用数轴来分界,定位。注意定义时需把奖金定义成长整型。
*
***/

double award(double a)
{
    
    if (a < 0)
    {
        return 0;
    }
    //系统有默认的转化规则,就是从精度底的转化为精度高的,避免计算时精度的丢失
    //char  --> short  --> int ---> unsigned  --> long --> unsigned long --> float --> double
    double res = 0;
    double percent[6] = { 0.1, 0.075, 0.05, 0.03, 0.015, 0.01 };
double step[6] = { 100000, 100000, 200000, 200000, 4000000, 0 }; //倒数第二个元素填写成了400万 导致与答案给的结果不符合
    //double step[6] = { 100000, 100000, 200000, 200000, 400000, 0 };
    //先考虑溢出问题
    /**
    if (0<a <= 100000)
    {
        res = a * 1 / 10;
    }
    else if (a<=200000)
    {
        res = 100000 * 1 / 10;
        res += (a - 100000) * 75 /1000;
    }
    else if (a<=400000)
    {
        res = a * 0.01;
    }
    else if (a<=600000)
    {
        res = a * 0.01;
    }
    else if (a<=1000000)
    {
        res = a * 0.01;
    }
    else
    {
        res = a * 0.01;
    }

    **/
    /**
    伪流程:
        判断是否达到10以上 没有计算然后退出
        减去10万的利润
        减去10万计算得出的利润
        假设200万
        190万  10万算利润
        180万  10万算利润
        160万 20万算利润
        140 万 20万算利润
        100 万 40万算利润
                100万剩余算利润 最后的不在计算

        假设43万
        33 万 10万算利润
        23万  10万算利润
        3    20万算利润
                3万剩余利润  <0
    **/
    double money;
    printf("传入参数的数值:%lf\n",a);
    for (int i =0;i<6;i++)
    {
        money = a - step[i];//剩余的钱数
        if (money <= 0)
        {
            res += a * percent[i];
            printf("第%0.1d次:%lf\n", i + 1,res);
            break;
        }
        else
        {
            a = money;//剩余的钱数先赋值给a为下次循环准备
            if (step[i] != 0)
            {    
                res += step[i] * percent[i];
                printf("第%0.1d次:%lf\n", i + 1, res);
            }
            else
            {
                res += a * percent[i];
                printf("第%0.1d次:%lf\n", i + 1, res);
                break;
            }
            
        }

    }
    

    return res;
}


double award2(double i)
{
    //面向过程 流程清晰
    double bonus1, bonus2, bonus4, bonus6, bonus10, bonus;
    
    bonus1 = 100000 * 0.1;
    bonus2 = bonus1 + 100000 * 0.075;
    bonus4 = bonus2 + 200000 * 0.05;
    bonus6 = bonus4 + 200000 * 0.03;
    bonus10 = bonus6 + 400000 * 0.015;
    if (i <= 100000) {
        bonus = i*0.1;
    }
    else if (i <= 200000) {
        bonus = bonus1 + (i - 100000)*0.075;
    }
    else if (i <= 400000) {
        bonus = bonus2 + (i - 200000)*0.05;
    }
    else if (i <= 600000) {
        bonus = bonus4 + (i - 400000)*0.03;
    }
    else if (i <= 1000000) {
        bonus = bonus6 + (i - 600000)*0.015;
    }
    else if (i>1000000) {
        bonus = bonus10 + (i - 1000000)*0.01;
    }
    
    return bonus;
}

 

 

输入输出:

int main()
{
printf("The number of bits in a byte %d\n", CHAR_BIT);

    printf("The minimum value of SIGNED CHAR = %d\n", SCHAR_MIN);
    printf("The maximum value of SIGNED CHAR = %d\n", SCHAR_MAX);
    printf("The maximum value of UNSIGNED CHAR = %d\n", UCHAR_MAX);

    printf("The minimum value of SHORT INT = %d\n", SHRT_MIN);
    printf("The maximum value of SHORT INT = %d\n", SHRT_MAX);

    printf("The minimum value of INT = %d\n", INT_MIN);
    printf("The maximum value of INT = %d\n", INT_MAX);

    printf("The minimum value of CHAR = %d\n", CHAR_MIN);
    printf("The maximum value of CHAR = %d\n", CHAR_MAX);

    printf("The minimum value of LONG = %ld\n", LONG_MIN);
    printf("The maximum value of LONG = %ld\n", LONG_MAX);

    printf("The maximum value of float = %f\n", FLT_MAX);
    printf("The minimum value of float = %f\n", FLT_MIN);

    printf("The maximum value of double = %f\n", DBL_MAX);
    printf("The minimum value of double = %f\n", DBL_MIN);

    double a;


    
    
    for (;;)
    {
        printf("你的净利润是:\n");
        scanf("%lf", &a);
        printf("1函数利润提成%lf\n", award(a));
        printf("2函数利润提成%lf\n", award2(a));
    }
return 0;
}

 

  

 

c语言100实例2 一个数据填写错误导致的问题 论校验的重要性