问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

请c语言大神帮忙!

发布网友 发布时间:2022-07-03 00:48

我来回答

3个回答

热心网友 时间:2023-10-31 05:28

这个题目要点。

1、收费标准必须为可操作修改。

2、收费标准档位是不确定的,需要动态数组。(当然用常量,每次手改源代码就不需要了)

3、收费标准的输入除第一个阀值,其他要求增量(较上一个阀值),不能直接用于运算。

4、输入范围需要有验证。

最简易做法是将标准定义成常量,然后需要时修改代码常量,但这样对用户够不友好,所以我这里把标准定义成结构,定义函数动态申请数组,修改收费标准。

#include<stdio.h>

#include<malloc.h>

typedef struct eq

{

    int tn;//表示共有几档

    float **fb;//表示各档计费标准的二维数组

}EQ;

int newFb(int tn);//构建收费标准数组地址空间,成功返回1,失败返回2。(成功自动释放旧地址,无需单独释放)

EQ *init();//初始化计费标准

void showEQ();//打印当前收费标准

int setEQ();//修改收费标准,成功返回1,失败返回0

float ecost(float amount);//计算电费

EQ *eq=NULL;

int main()

{

    int n=0;

    float at;

    eq=init();

    if(!eq)

    {

        printf("异常终止!\n");

        return 1;

    }


    while(1)

    {

        printf("1、打印收费标准;2、修改收费标准;3、计算电费\n");

        n=0;

        while(n!=1 && n!=2 && n!=3)

            scanf("%d",&n);

        switch(n)

        {

            case 1:showEQ();break;

            case 2:

                if(!setEQ())

                    printf("异常!修改失败!\n\n");

                else

                    printf("修改成功!\n\n");

                break;

            case 3:printf("请输入年度用电量:");

                   scanf("%f",&at);

                   printf("年度用电费用:%.2f\n\n",ecost(at));

                   break;

        }


    }

    return 0;

}

float ecost(float amount)//计算电费

{

    int i;

    float sum=0;

    if(amount<=eq->fb[0][0])

        return 0;


    for(i=eq->tn-1;i>=0;i--)

        if(amount>eq->fb[i][0])

        {

            sum+=(amount-eq->fb[i][0])*eq->fb[i][1];

            amount=eq->fb[i][0];

        }


    return sum;

}

EQ *init()//初始化计费标准,

{

    if(eq)

        return eq;

    eq=(EQ *)malloc(sizeof(EQ));

    if(!eq)

        return NULL;

    eq->tn=4;

    eq->fb=NULL;

    if(!newFb(4))

    {

        free(eq);

        return NULL;

    }

    eq->fb[0][0]=0,eq->fb[0][1]=0.6;

    eq->fb[1][0]=3000,eq->fb[1][1]=0.7;

    eq->fb[2][0]=5000,eq->fb[2][1]=0.9;

    eq->fb[3][0]=7000,eq->fb[3][1]=1.2;

    return eq;

}

int newFb(int tn)//构建收费标准数组地址空间,成功返回1,失败返回0。(成功自动释放旧地址,无需单独释放)

{

    int i,flag=1;

    float **fbSave=NULL;

    if(!eq)

        return 0;

    eq->tn=tn;

    if(!eq->fb)//如果有旧地址,保存该地址,用于还原

        fbSave=eq->fb;

    eq->fb=(float **)malloc(sizeof(float *)*tn);

    if(!eq->fb)

        flag=2;

    for(i=0;flag && i<tn;i++)

    {

        eq->fb[i]=(float *)malloc(sizeof(float)*2);

        if(!eq->fb)

            flag=3;

    }


    if(flag==3)//内存申请失败,释放已申请的新地址,还原旧地址

    {

        for(i=0;i<tn;i++)

            free(eq->fb[i]);

        free(eq->fb);

        eq->fb=fbSave;

        return 0;

    }

    if(flag==2)

    {

        eq->fb=fbSave;

        return 0;

    }

    return 1;

}

void showEQ()//打印当前收费标准

{

    int i;

    printf("当前共计%d档计费标准:\n",eq->tn);

    for(i=0;i<eq->tn;i++)

        printf("电量超过%.0f,%s%.1f(实际金额%.1f)\n",eq->fb[i][0],i>0?"每度再增加":"每度",i>0?eq->fb[i][1]-eq->fb[i-1][1]:eq->fb[i][1],eq->fb[i][1]);

    printf("\n");

}

int setEQ()//修改收费标准,成功返回1,失败返回0

{

    int i,tn;

    float money;

    printf("请输入新的计费档数(输入0退出修改):");

    scanf("%d",&tn);

    if(!tn)

        return 0;

    if(newFb(tn))

    {

        for(i=0;i<eq->tn;i++)

        {

            printf("请输入第%d档电量阀值(%s%.0f),及%s(单位元)",i+1,i>0?"必须大于":"大于等于",i>0?eq->fb[i-1][0]:0,i>0?"每度增加收费":"每度收费");

            scanf("%f%f",&eq->fb[i][0],&money);

            if(i==0 && eq->fb[i][0]<0)

            {

                printf("输入错误!起始阀值不能小于0!请重新输入\n");

                i--;

                continue;

            }

            if(i>0 &&  eq->fb[i][0]<=eq->fb[i-1][0])

            {

                printf("输入错误!当前阀值不能小于上一次的阀值!请重新输入\n");

                i--;

                continue;

            }

            if(i==0)

                eq->fb[i][1]=money;

            else

                eq->fb[i][1]=eq->fb[i-1][1]+money;

        }

    }


    return 1;

}

//PS:你说你代码运算不对,看看是否把增量当金额来用了。

热心网友 时间:2023-10-31 05:28

不会C++ 但是有if 可以写。 一套带全。

热心网友 时间:2023-10-31 05:29

多写几遍,仔细检查
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求这图片原图或者主角 出自哪一边电影或者电视剧 哪位大神知道这张图原版在吗?求原版。。。 在word中加下划线时第一次出现一条下划线第二次怎么就出现两条... 诛仙2资料站里的宠物展示能在npc买到吗 求一些诛仙2中的可以变为人形的宠物名字 诛仙2 神域的神农殿里,这是什么东西 诛仙2宠物元神问题 诛仙2 商城 中 宠物元神 怎么比 宠物 还贵啊?宠物元神是干什么的啊... 电热水器怎么安固定花洒 猛鬼夜惊魂剧情介绍 如何让QQ聊天窗口不显示自己的网名? 7414是什么芯片 我在京东买的浪木饮水机坏了,厂家不给修怎么办? 我在京东金融里 贷款不小心把卡号 填错了 显示放款失败 不处理有什后果?_百度问一问 为什么女人是鸡 男人是鸭 鸭子和鸡有什么不同么? 鸭子和鸡的区别 扁气罐是什么东西 鸡和鸭有什么区别耶! 我20多岁,女生,有慢性肾炎,现在开始想练习八段锦,但有几个问题想问问大家,谢谢了!问题请见补充~~ 淘宝的苹果耳机是真的吗 淘宝上的苹果耳机是正品吗 淘宝上的苹果无线耳机588能不能买? 淘宝上卖的苹果耳机和正版的一样吗 淘宝苹果无线耳机补配靠谱吗 淘宝798买到苹果耳机是真的吗 QQ华夏手游大微星怎么样强上去 联想的电脑在保修期内去接修站维修需要交服务费吗? 股票多空双杀是什么意思? 赏析高处的炊烟站稳了脚跟,看上去一动不动,像是在荷锄归来的人群中寻找着自己的男主人 C语言 电费计算问题 关于电费计算模型 C语言课程设计 帮忙编个c语言程序。。。 编写程序,从键盘输入某宿舍楼6家住户某月的水电消耗量及水费和电费标准,计算各户应交纳的水费和电费 虚能组什么词 虚,可以组什么词? 谁能介绍下伊犁地区的地质概况 以野炊的作文怎么写 本人上传到优酷和土豆的视频,如何才能让别人只能看,不能下载呢? 中国市场营销经理助理考试分数查询的网址是多少? 中国市场营销经理助理证书 excel中工作表名字变小了,那个怎么设置回来? excel表格下边这个栏目为什么这么窄?怎么调整呢?以前用的都是比较宽的,容易看清楚命名名称。 EXCEL工作表的名称怎么变小了 世界四大舞剧有哪些- 问一问 哪些行业用到电气绝缘油,变压器油 提高一个人的思想深度,有哪些书籍可以推荐 哪些书适合提高自己的思想深度? 如果想提高一个人的思想深度,有哪些书籍可以推荐 推荐几本可以提高思想深度的书,谢谢了!