PAT B1028 人口普查 最终ac 一开始总是差一个输出因把年龄和月份比较弄混了

来源:互联网 发布:网络爱情歌曲 编辑:程序博客网 时间:2024/04/29 04:08
#include<stdio.h>//考虑到可能有同年不同月不同日的人,也要进入比较大小,所以用结构体,输入时忽略/字符,结构体又4个子元素组成//一个很重要的点,应该写一个比较日期大小的函数,因为判断边界要用,等下比较谁大谁小还要用。我一开始没想到只想着想一步写一步 //第二次提交能通过编译,但是只有一个1分的测试点是答案正确 //后终于ac了!3 Tom John最是我把日期大小和年龄大小弄混了,在主函数中比较时一时思维没转换过来!纠结了我一个下午! //#define LOCAL struct Person{char pname[7];//我一开始把中括号写到前面了,就不对。。 int yy,mm,dd;//三个变量 }oldest,youngest,temp,left,right; //left 和right分别放合法日期的左右边界bool LessEqu(struct Person a,struct Person b){//注意是日期大小,而不是年龄大小if(a.yy!=b.yy) return a.yy<=b.yy;else if(a.mm!=b.mm) return a.mm<=b.mm;else return a.dd<=b.dd;//不太懂啊这个 } bool MoreEqu(struct Person a,struct Person b){//注意是日期大小,而不是年龄大小!!等会比较要注意 if(a.yy!=b.yy) return a.yy>=b.yy;else if(a.mm!=b.mm) return a.mm>=b.mm;else return a.dd>=b.dd;} void init(){//youngest与left为1814年9月6日,oldest与right为2014年9月6日youngest.yy=left.yy=1814;//这里好像书上写错了,后来发现是自己写错了 oldest.yy=right.yy=2014;youngest.mm=left.mm=oldest.mm=right.mm=9;youngest.dd=left.dd=oldest.dd=right.dd=6;//后来总是显示2个,后来发现这里数字写错了 }int main(){#ifdef LOCALfreopen("data.in","r",stdin);freopen("data.out","w",stdout);#endif//突然发现了原因!在主函数中没有对边界和最大最小进行初始化直接就比较了! init(); int n,count=0;scanf("%d",&n);while(n--){scanf("%s%d/%d/%d",&temp.pname,&temp.yy,&temp.mm,&temp.dd);//第三次犯这个错误,导致内存无法读取 //先判断是否合理,合理的话自增1,然后继续进行比较,否则到此终止 if(LessEqu(temp,right)&&MoreEqu(temp,left)){count++;if(MoreEqu(temp,youngest))//一开始这里写成了MoreEqu,把日期大小和年龄大小弄混了!youngest=temp;if(LessEqu(temp,oldest))//一开始这里写成了MoreEqu,把日期大小和年龄大小弄混了! oldest=temp;} }if(count==0) printf("0\n");//不用担心个数为1时会怎么样,因为已经有交换,所以如果是1就输出两次那一个     //输出绝对有问题 else printf("%d %s %s\n",count,oldest.pname,youngest.pname);//这样写输出结果3  Tom/*else{printf("%d",count);printf(" %s",oldest.pname);printf(" %s\n",youngest.pname);}*/return 0;} 


0 0
原创粉丝点击