PAT 1016. Phone Bills

博客内容涉及PAT 1016题目的电话费用计算问题,强调了编程中变量命名的重要性,以及处理逻辑时应避免复杂性和错误。文章通过示例展示了如何计算通话费用,并提供了优化的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

复杂的程序,变量的命名贴近实际含义,写代码时思路会连贯,速度会加快
筛选对象时,优先使用简单逻辑进行判断,不增加额外标记,这样会使结构简单,不易出错
处理对象的某个属性的过程中,选择不易忽视掉边界情况,肯定正确的方式,对包含这个属性的所有对象进行操作;比如筛选时选择符合条件的,而不是用排除法
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
using namespace std;
struct record{
	string name;
	int month,day,hour,minute;
	int online;
}r[1010];
int rate[24],daycost;
bool cmp(record a,record b){
	if(a.name!=b.name) return a.name<b.name;
	else if(a.month!=b.month) return a.month<b.month;
	else if(a.day!=b.day) return a.day<b.day;
	else if(a.hour!=b.hour) return a.hour<b.hour;
	else return a.minute<b.minute;
}
void calculate(record a,record b,int &minute,double &once){
	minute=(b.day-a.day)*24*60+(b.hour-a.hour)*60+b.minute-a.minute;
	once=0;
	int i;
	if(a.day==b.day){//通话记录为同一天
			for ( i = a.hour; i < b.hour; i++)
				once+=rate[i]*60;
			once-=rate[a.hour]*a.minute;
			once+=rate[b.hour]*b.minute;
	}else{//通话记录跨天
		for ( i = a.hour; i < 24; i++)//当天的话费
			once+=rate[i]*60;
		once-=rate[a.hour]*a.minute;
		for ( i = a.day; i < b.day-1; i++)//中间天的话费
			once+=daycost;
		for ( i = 0; i < b.hour; i++)//结束天的话费
			once+=rate[i]*60;
		once+=rate[b.hour]*b.minute;
	}
	once*=0.01;
}
int main(){
	int n,i;
	for ( i = 0; i < 24; i++){
		cin>>rate[i];
		daycost+=rate[i]*60;
	}
	cin>>n;
	string s;
	for ( i = 0; i < n; i++){//输入
		cin>>r[i].name;
		scanf("%d:%d:%d:%d",&r[i].month,&r[i].day,&r[i].hour,&r[i].minute);
		cin>>s;
		if(s=="on-line")
			r[i].online=1;
		else
			r[i].online=0;
	}
	sort(r,r+n,cmp);//排序
	int minute;
	double once,total=0;
	string prename;
	for ( i = 0; i < n; i++){
		 if(i!=n-1&&r[i].online==1&&r[i+1].online==0&&r[i].name==r[i+1].name){//如果找到匹配的
			if(r[i].name!=prename){//如果改变了用户,输出上一个用户的总金额和当前用户的用户名
				if(total!=0)
					printf("Total amount: $%.2lf\n",total);
				total=0;
				cout<<r[i].name;printf(" %.2d\n",r[i].month);
			}
			once=0;//输出此条匹配的记录
			calculate(r[i],r[i+1],minute,once);
			printf("%.2d:%.2d:%.2d ",r[i].day,r[i].hour,r[i].minute);
			printf("%.2d:%.2d:%.2d ",r[i+1].day,r[i+1].hour,r[i+1].minute);
			printf("%d $%.2lf\n",minute,once);
			total+=once;
			i++;
			prename=r[i].name;
			continue;
		 }
	}
	if(total!=0)
		printf("Total amount: $%.2lf\n",total);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值