当前位置:首页 » 编程语言 » 算电的c语言
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

算电的c语言

发布时间: 2022-12-25 17:17:15

① 请c语言大神帮忙!

这个题目要点。

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("异常终止! ");

return 1;

}


while(1)

{

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

n=0;

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

scanf("%d",&n);

switch(n)

{

case 1:showEQ();break;

case 2:

if(!setEQ())

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

else

printf("修改成功! ");

break;

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

scanf("%f",&at);

printf("年度用电费用:%.2f ",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档计费标准: ",eq->tn);

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

printf("电量超过%.0f,%s%.1f(实际金额%.1f) ",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(" ");

}

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!请重新输入 ");

i--;

continue;

}

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

{

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

i--;

continue;

}

if(i==0)

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

else

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

}

}


return 1;

}

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

② c语言电量百分比怎么计算

#include"stdafx.h"
#include<windows.h>

int_tmain(intargc,_TCHAR*argv[])
{
SYSTEM_POWER_STATUSsps;
GetSystemPowerStatus(&sps);

printf("isACpower:%s ",sps.ACLineStatus==1?"yes":"no");
printf("BatteryFlag:%d ",sps.BatteryFlag);
printf("BatteryLifePercent:%d%% ",sps.BatteryLifePercent);
if(sps.ACLineStatus==0)//ifnoacin
{
printf("BatteryLifeTime:%dSeconds=%fh ",
sps.BatteryLifeTime,((float)sps.BatteryLifeTime)/60/60);
printf("BatteryFullLifeTime:%d ",sps.BatteryFullLifeTime);
}
return0;
}