题目链接
出错点
- 名字长度不超过20,则数组长度应至少为21,用以容纳‘\0’,卡测试点123。
- 输入数据至少有一对配对(…at least one call is well paired in the input…),则可能存在有用户没配对的情况,注意不要输出。
- 代码的其他漏洞。毕竟这题的代码量真心大~~万一哪里的逻辑有点错误,找起来是真的费劲。我写输出数据的那层循环时,脑子一抽把判断下一条记录的名字与当前记录不相等放在循环的最后,仅仅当成退出循环的条件。错误部分的代码如下:
for(i=0;i<m;i++){
int flag=0;//判断是否符合条件并标记输出
double totalmoney=0.0;
for(j=k;j<n;j++){
if(strcmp(node[j].line,"on-line")==0 && strcmp(node[j+1].line,"off-line")==0){
if(flag==0){
printf("%s %02d\n",node[k].name,node[k].month);
flag=1;
}
printf("%02d:%02d:%02d %02d:%02d:%02d ",node[j].day,node[j].hour,node[j].minute,node[j+1].day,node[j+1].hour,node[j+1].minute);
//下面两行求时差和费用的代码,有更简单的算法,见关键点2
int temp=(node[j+1].day*24*60+node[j+1].hour*60+node[j+1].minute)-(node[j].day*24*60+node[j].hour*60+node[j].minute);
double money=((node[j+1].day*dayfee+hourfee[node[j+1].hour]+fee[node[j+1].hour]*node[j+1].minute)-(node[j].day*dayfee+hourfee[node[j].hour]+fee[node[j].hour]*node[j].minute))/100.0;
printf("%d $%.02f\n",temp,money);
totalmoney+=money;
}
if(flag==1 && strcmp(node[j].name,node[j+1].name)!=0) printf("Total amount: $%.02f\n",totalmoney);
//就是这里!!应该在内循环的开头就用if(strcmp(node[j].name,node[j+1].name)==0)过滤,else才是输出总费用并推出
if(strcmp(node[j].name,node[j+1].name)!=0){
k=j+1