#include <stdio.h>
#include <malloc.h>
#include <string.h>
#define USER "user.txt"
#define TELDATA "5.dat"
#define AREA "area.txt"
#define DISCOUNT "discount.txt"
//时间费用折扣链表
typedef struct Discount
{
int startT;//开始时间
int endT;//结束时间
float discount;//折扣率
struct Discount *next;
};
struct Discount * initTelData()
{
struct Discount * headDiscount=NULL;
struct Discount tempDiscount;
struct Discount * pDiscount=NULL;
struct Discount * preDiscount=NULL;
int isScanf=-1;
FILE * fpDiscount=fopen("discount.txt","r");
while(1)
{
tempDiscount.discount=0;
isScanf=fscanf(fpDiscount,"%d%d%f",&tempDiscount.startT,&tempDiscount.endT,&tempDiscount.discount);
if(isScanf<3) break;
pDiscount=(struct Discount *)malloc(sizeof(struct Discount));
*pDiscount=tempDiscount;
pDiscount->next=0;
if(headDiscount==NULL)
{
headDiscount=pDiscount;
preDiscount= pDiscount;
}
else
{
preDiscount->next=pDiscount;
preDiscount= pDiscount;
}
}
fclose(fpDiscount);
return headDiscount;
}
float countPart(int h1,int m1,int c1,int h2,int m2,int c2,struct Discount * head,int temptimes )//===============================在24小时之内的费用
{
struct Discount * temp=head;
float qian=0,qian1=0;
int issecond,sum,sum1,sum2;
int times1=temptimes;
int price=1;
while(1)//在同一阶段时间
{
if(temp==0) break;
if(temp->startT <= h1 && h1<temp->endT && h2<temp->endT )
{
qian=times1*temp->discount * price;
return qian;
}
temp=temp->next;
}
//重新初始化
temp=head;
while(1)
{
if(temp==0) break;
if(temp->startT <= h1 && h1<temp->endT && h2>temp->endT )//
{
sum1=h1*60*60+m1*60+c1;
sum2=(temp->endT)*60*60;
sum=(sum2-sum1);
issecond=sum%60;
if(issecond)//还没有到一分钟的时间按一分来算
{
sum=sum/60+1;
}
else
{
sum=sum/60;
}
times1=sum;//计算相差秒数
qian1=times1*(temp->discount) * price;
qian=qian+qian1;
}
else if(temp->startT >= h1 &&h2>=temp->startT && h2<=temp->endT )//
{
sum2=h2*60*60+m2*60+c2;
sum1=(temp->startT )*60*60;
sum=(sum2-sum1);
issecond=sum%60;
if(issecond)//还没有到一分钟的时间按一分来算
{
sum=sum/60+1;
}
else
{
sum=sum/60;
}
times1=sum;//计算相差秒数
qian1=times1*(temp->discount) * price;
qian=qian+qian1;
}
else if(temp->startT >= h1 && h2 >=temp->endT )
{
sum2=(temp->endT)*60*60;
sum1=(temp->startT )*60*60;
sum=(sum2-sum1);
sum=sum/60;
times1=sum;//计算相差秒数
qian1=times1*(temp->discount) * price;
qian=qian+qian1;
}
temp=temp->next;
}
return qian;
}
int sumtimes(int h1,int m1,int c1,int h2,int m2,int c2)///总的时间
{
int times;
int price=1;
int issecond,sum,sum1,sum2;
sum1=h1*60*60+m1*60+c1;
sum2=h2*60*60+m2*60+c2;
sum=(sum2-sum1);//计算相差秒数
issecond=sum%60;
if(issecond)//还没有到一分钟的时间按一分来算
{
sum=sum/60+1;
}
else
{
sum=sum/60;
}
times=sum;
if( times<0)
{
times=times*(-1);
}
printf("总时间=%d\n",times);
return times;
}
float count(int h1,int m1,int c1,int h2,int m2,int c2,struct Discount * head)
{
struct Discount * temp=head;
float qian=0,qian1,qian2;
int times;
int price=1;
if(h1>h2)//超过24点
{
h2=h2+24;
}
times=sumtimes( h1, m1, c1, h2, m2, c2);
while(1)//在同一阶段时间
{
if(temp==0) break;
if(temp->startT <= h1 && h1<temp->endT && h2<temp->endT )
{
qian=times*temp->discount * price;
return qian;
}
temp=temp->next;
}
//重新初始化
temp=head;
if(h2>24) //不同时间段,超过24点
{
h2=h2-24;
//24以前
times=sumtimes( h1, m1, c1, 24, 0, 0);
qian1= countPart( h1, m1, c1,24, 0, 0,head,times);
//24以后
times=sumtimes( 0, 0, 0, h2, m2, c2);
qian2= countPart( 0, 0, 0, h2, m2, c2,head,times);
qian=qian1+qian2;
}
else//不同时间段,没有超过24点
{
times=sumtimes( h1, m1, c1, h2, m2, c2);
qian= countPart( h1, m1, c1, h2, m2, c2,head,times);//在24小时之内的费用
}
return qian;
}
int main()
{
struct Discount * head=NULL;
int h1,m1,c1,h2,m2,c2;
float sum;
head=initTelData();
while(1)
{
sum=0;
scanf("%d%d%d",&h1,&m1,&c1);
scanf("%d%d%d",&h2,&m2,&c2);
printf("%d:%d:%d\n",h1,m1,c1);
printf("%d:%d:%d\n",h2,m2,c2);
sum=count( h1,m1,c1,h2,m2,c2, head);
printf("%.2f\n",sum);
fflush(stdin);
}
return 0;
}
计算在任何阶段间的费用,例如电信计费系统
最新推荐文章于 2021-12-24 17:15:41 发布