【PAT B1028】人口普查 (C语言)

1: 是零个合理的人数,直接输出零,末尾不要有空格
2:是一个合理的人直接将这个人输出两次, 他既是最年长的也是最年轻的

在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#define RIGHT 1
#define WRONG 2
#define FIRST	3
#define SECOND	4
#define MAX_NAME 6
typedef struct info {
	char name[MAX_NAME];
	int y;
	int m;
	int d;
} info;
int sum;
struct info *old;							/* 记录最早出生的人 */
struct info *young;							/* 记录最迟出生的人 */
int read_info (); 
int which_older (struct info *first, struct info *second);
int record_man (struct info *man);
int print_result ();
/*------------------------------- 读信息 判断 ----------------------------------*/
int read_info () {
	struct info *p;
	struct info *max_age, *min_age;
	max_age = malloc (sizeof(info));
	min_age = malloc (sizeof(info));
	max_age->y = 1814;
	min_age->y = 2014;
	max_age->m = min_age->m = 9;
	max_age->d = min_age->d = 6;

	int N, i;
	//test
//	FILE *f_read = fopen ("data.txt", "r");

	N = 0;
	scanf("%d", &N);
	for (i = 0; i < N; ++i)
	{
		p = malloc(sizeof(info));				/* 读取一个人的信息 */
	//	fscanf (f_read, "%s %d/%d/%d", p->name, &p->y, &p->m, &p->d);
		scanf ("%s %d/%d/%d", p->name, &p->y, &p->m, &p->d);
		if (which_older(max_age, p) == FIRST && which_older(min_age, p) == SECOND)
			record_man (p);		/* 在规定的日期范围内 ,记录 */
		else
			free (p);
	}
}
/*------------------------------ 记录这个出生日合理的人 --------------------------------*/
int record_man (struct info *man) {
	++sum;	
	if (old == NULL || young == NULL)			/* 当最年长和最年轻的人都还没有记录 */
	{
		if (old == NULL)						/* 若最年长的人没有记录 */
			old = man;			
		else									/* 否则最年长的已经记录了,最年轻的人没有记录 */
		{
			if (which_older(man, old) == FIRST)	/* 若当前这个人比已经记录的人年长 */
			{
				young = old;					/* 记录 */
				old = man;
			}
			else								/* 否则当前这个人比 old记录的年轻 */
				young = man;						
		}
	}
	else										/* 已经记录了两个人了, */
	{
		if (which_older(man, old) == FIRST)		/* 若当前这个人老 */
			old = man;
		else									/* 若当前这个人还不是最老的 */
		{
			if (which_older(man, young) == SECOND)/* 若当前这个人年轻 */
				young = man;
		}
	}
	return 0;
}
/*------------------------ 判断first和second这两个人那个老,并返回结果 -----------------------*/
int which_older (struct info *first, struct info *second){
	if (first->y < second->y)			/* 出生的年小, 就是老 */
		return FIRST;
	else if (first->y > second->y)		/* 出生的年大, 就是年轻 */
		return SECOND;
	else				/* 这两个人同岁 first->y == second->y */
	{
		if (first->m < second->m)		/* 同岁, 月份小,年纪大 */
			return FIRST;
		else if (first->m > second->m)	/* 同岁, 月份大, 年纪小 */
			return SECOND;
		else			/* 同年同月出生 */
		{
			if (first->d < second->d)	/* 同年同月,但日子小, 年纪大 */
				return FIRST;
			else if (first->d > second->d)/* 同年同月,但日子大, 年纪小 */
				return SECOND;
			else						/* 这个主要用来判断当前这个人是否合理 (在函数read_info里面用)*/
			{	/* 在合理的人群中,相同生日无所谓,题目明确说,最年长和最年轻的人只有一个 */
				if (first->y == 1814 )	/* 当前这个人是最年长的了 生日:1814/9/6 */
					return FIRST;		/* 合理 */
				else					/* 这个处理生日为 2014/9/6 或者合理返回内的 */
					return SECOND;
			}
		}
	}
	
}
/*----------------------------- 输出结果 ----------------------------------------*/
int print_result () {
	printf ("%d", sum);
	if (sum == 1)
	{
		if (old != NULL)
		{
			printf (" %s", old->name);
			printf (" %s", old->name);
		}
		else
		{
			printf (" %s", young->name);
			printf (" %s", young->name);
		}
	}
	else if (sum > 1)
	{
		printf (" %s", old->name);
		printf (" %s", young->name);
	}
	return 0;
}
int main () {
	read_info ();
	print_result ();
	return 0;
}


邻居赶着群羊上山了,留下一只老母羊和它的三个仔,小样非常可爱,但这只孤零零的老母羊每天都在呼叫着,我猜它很孤独,它知道什么叫孤独吗?
后来我发现我错了,老母羊的三个仔如果出去溜达,老母羊看不见的时候它们的时候,老母羊就会没命的喊叫。所以我每次在这种情况下, 我看见小崽子们就拍手惊吓它们回巢。羊为什么只照看自己的孩子呢?它为什么会有这种感情呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值