复杂的程序,变量的命名贴近实际含义,写代码时思路会连贯,速度会加快
筛选对象时,优先使用简单逻辑进行判断,不增加额外标记,这样会使结构简单,不易出错
处理对象的某个属性的过程中,选择不易忽视掉边界情况,肯定正确的方式,对包含这个属性的所有对象进行操作;比如筛选时选择符合条件的,而不是用排除法
#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;
}