重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
函数的构成
网站设计制作过程拒绝使用模板建站;使用PHP+MYSQL原生开发可交付网站源代码;符合网站优化排名的后台管理系统;成都做网站、成都网站建设收费合理;免费进行网站备案等企业网站建设一条龙服务.我们是一家持续稳定运营了十年的创新互联网站建设公司。
function+函数名(参数1,参数2){函数实现;}
函数名不能是数字开头,可以是字母和下划线;
函数的调用: 函数名();
作用域
定义在函数外面的变量,称之为全局变量,整个文档都可以访问。
定义在函数里面的变量为局部变量,只能在该函数内部访问。
var a=10;
function aa(){
var a=20;
alert(a);
}
alert(a);
aa()
函数是一个数据类型,可以把它赋给变量
var f=function (b){
return (b=b+1);
};
alert(f(5));
调用的时候使用f(参数)来使用
函数可以访问自身内部的函数
function b(){
var a=5;
function bb(){
alert(a);
}
bb();
}
b();
当内部函数有返回值的时候 调用函数要使用return+函数
function c(){
var a=10;
function bb(){
return a*2;
}
return bb();
}
alert(c())
函数对自身内部函数的调用
function d(a,b){
function dd(a){
return a+2
}
return c=dd(a)+dd(b);
}
alert(d(2,3))
函数对其他函数的调用
function add(a,b){
return a+b;
}
function sub(a,b){
return a-b;
}
function bb(x,a,b){
return x(a,b);
}
alert(bb(sub,2,3))
函数的递归
function cc(a){
if (a==1){
return a;
}else{
return a*cc(--a);
}
}
alert(cc(4));
这个题目要点。
1、收费标准必须为可操作修改。
2、收费标准档位是不确定的,需要动态数组。(当然用常量,每次手改源代码就不需要了)
3、收费标准的输入除第一个阀值,其他要求增量(较上一个阀值),不能直接用于运算。
4、输入范围需要有验证。
最简易做法是将标准定义成常量,然后需要时修改代码常量,但这样对用户够不友好,所以我这里把标准定义成结构,定义函数动态申请数组,修改收费标准。
#includestdio.h
#includemalloc.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(amounteq-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 itn;i++)
{
eq-fb[i]=(float *)malloc(sizeof(float)*2);
if(!eq-fb)
flag=3;
}
if(flag==3)//内存申请失败,释放已申请的新地址,还原旧地址
{
for(i=0;itn;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;ieq-tn;i++)
printf("电量超过%.0f,%s%.1f(实际金额%.1f)\n",eq-fb[i][0],i0?"每度再增加":"每度",i0?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;ieq-tn;i++)
{
printf("请输入第%d档电量阀值(%s%.0f),及%s(单位元)",i+1,i0?"必须大于":"大于等于",i0?eq-fb[i-1][0]:0,i0?"每度增加收费":"每度收费");
scanf("%f%f",eq-fb[i][0],money);
if(i==0 eq-fb[i][0]0)
{
printf("输入错误!起始阀值不能小于0!请重新输入\n");
i--;
continue;
}
if(i0 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:你说你代码运算不对,看看是否把增量当金额来用了。
int calculate_fee(int charge)
{
int fee;
if(charge = 300)
fee = charge * 9;
else if(charge = 600)
fee = (charge - 300)*8 + 300*9;
else if(charge = 1000)
fee = (charge - 600) * 6 + 300*(8+9);
else
fee = (charge - 1000)*3 + 400*6 + 300*(8+9);
return fee;
}
void main()
{
FILE *input, *output;
char custumer_id[20];
int charge, fee, custmer_count=0, charge_sum=0, fee_sum=0;
input = (FILE *) fopen("用电量.txt", "rt");
if(input == null) {
printf("用电量.txt文件不存在\n");
exit(-1);
}
output = (FILE *)fopen("用电费用.txt", "wt");
if(output == null)
fclose(input);
printf("无法创建用电费用.txt文件\n");
exit(-2);
}
while(fscanf(input, "%s %d\n", custerm_id, charge) != EOF) {
fee = calculate_fee(charge);
fprintf(output, "%s\t%d\t%d\n", customer_id, charge, fee);
customer_count ++;
fee_sum += fee;
charge_sum += charge;
}
fclose(input);
fclose(output);
printf("客户数量=%d, 总耗电千瓦时=%d, 总的电费=%d\n", customer_count, charge_sum, fee_sum);
}