1028 人口普查 (20 分)

某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。

这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过 200 岁的老人,而今天是 2014 年 9 月 6 日,所以超过 200 岁的生日和未出生的生日都是不合理的,应该被过滤掉。

输入格式:

输入在第一行给出正整数 N,取值在(0,10​5​​];随后 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后面