1028 人口普查 (20 分)
某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。
这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。
输入格式:
输入在第一行给出正整数 N,取值在(0,105];随后 N 行,每行给出 1 个人的姓名(由不超过 5 个英文字母组成的字符串)、以及按 yyyy/mm/dd
(即年/月/日)格式给出的生日。题目保证最年长和最年轻的人没有并列。
输出格式:
在一行中顺序输出有效生日的个数、最年长人和最年轻人的姓名,其间以空格分隔。
输入样例:
5
John 2001/05/12
Tom 1814/09/06
Ann 2121/01/30
James 1814/09/05
Steve 1967/11/20
输出样例:
3 Tom John
正确代码:
#include <stdio.h>
#include <string.h>
int main()
{
int n;
scanf("%d",&n);
int i;
int validData =0;
char name[6],birthday[11],olderName[6],olderBirthday[11]="2014/09/06",youngerName[6],youngerBirthday[11]="1814/09/06";
for(i=0; i<n; i++)
{
scanf("%s %s",name,birthday);
if(strcmp(birthday,"1814/09/06")>=0 && strcmp(birthday,"2014/09/06")<=0)
{
validData++;
if(strcmp(birthday,olderBirthday)<0)
{
strcpy(olderBirthday,birthday);
strcpy(olderName,name);
}
if(strcmp(birthday,youngerBirthday)>0)
{
strcpy(youngerBirthday,birthday);
strcpy(youngerName,name);
}
}
}
if(validData)
printf("%d %s %s",validData,olderName,youngerName);
else
printf("0");
return 0;
}
这个题上来我是想用字符串比较的,然后后来看见200岁啊,最大最小啊,后来又换成结构体{name,year,month,day}了。之后写着写着感觉逻辑好麻烦啊,然后突然想起来字符串比较也是可以胜任的。。。又换了重新写的换了回来。。。
重点是基于字符串的字典序比较,反正字典序里1<2<3......是成立的,和数字一样。
另外要注意最后的输出,如果没有合条件的话输出0需要单独处理,不然后面会有空格,格式错误。(我跳坑了)
最后说个笑话,是关于C语言里的字符串。。。我竟然用了运算符==和 = 来比较和赋值。。。看来这样是不行的,必须要用字符串处理函数。 。。
#include <string.h>
int strlen(字符数组); \\得到字符数组中'\0'前的字符的个数
例如:"memeda\0muadarling"得到的长度是6
int strcmp(字符数组1,字符数组2); \\字符串比较大小,比较字典序,a<b,无关长度
返回值: s1<s2,返回负整数; s1==s2,返回0; s1>s2,返回正整数
strcpy(字符数组1,字符数组2); \\字符串复制,2复制给1
strcat(字符数组1,字符数组2); \\字符串连接,2连到1后面