计算在任何阶段间的费用,例如电信计费系统

#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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值