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

#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 LOCAL
	freopen("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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值