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<iostream>
#include<string>
#include<vector>
using namespace std;
struct people{
string name;
int year;
int month;
int day;
};
int main()
{
int n;
int valid = 0;//有效生日的个数
int y, m, d;
string name;
string birth;
vector<people> p;
people temp;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> name >> birth;
y = stoi(birth.substr(0, 4));
m = stoi(birth.substr(5, 2));
d = stoi(birth.substr(8, 2));
if (y < 1814 || (y == 1814 && m < 9) || (y == 1814 && m == 9 && d < 6) ||
y>2014 || (y == 2014 && m>9) || (y == 2014 && m == 9 && d>6))
continue;
temp.name = name;
temp.year = y;
temp.month = m;
temp.day = d;
p.push_back(temp);
}
people max = p[0];
people min = p[0];
for (int i = 0; i < p.size(); i++)
{
if (max.year > p[i].year || (max.year == p[i].year&&max.month>p[i].month) ||
(max.year == p[i].year&&max.month == p[i].month&&max.day > p[i].day))
max = p[i];
if (min.year < p[i].year || (min.year == p[i].year&&min.month < p[i].month) ||
(min.year == p[i].year&&min.month == p[i].month&&min.day < p[i].day))
min = p[i];
}
cout << p.size() << " " << max.name << " " << min.name;
system("pause");
return 0;
}
段错误是访问了不可访问的内存(数组越界……)
测试点3应该是p是空的时候(p[0]无法访问)
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct people{
string name;
int year;
int month;
int day;
};
int main()
{
int n;
int valid = 0;//有效生日的个数
int y, m, d;
string name;
string birth;
vector<people> p;
people temp;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> name >> birth;
//scanf("%d/%d/%d", &y, &m, &d);
y = stoi(birth.substr(0, 4));
m = stoi(birth.substr(5, 2));
d = stoi(birth.substr(8, 2));
if (y < 1814 || (y == 1814 && m < 9) || (y == 1814 && m == 9 && d < 6) ||
y>2014 || (y == 2014 && m>9) || (y == 2014 && m == 9 && d>6))
continue;
temp.name = name;
temp.year = y;
temp.month = m;
temp.day = d;
p.push_back(temp);
valid++;
}
people max;
people min;
max.year = 9999; max.month = 0; max.day = 0;
min.year = 0; min.month = 0; min.day = 0;
for (int i = 0; i < p.size(); i++)
{
if (max.year > p[i].year || (max.year == p[i].year&&max.month > p[i].month) ||
(max.year == p[i].year&&max.month == p[i].month&&max.day > p[i].day))
max = p[i];
if (min.year < p[i].year || (min.year == p[i].year&&min.month < p[i].month) ||
(min.year == p[i].year&&min.month == p[i].month&&min.day < p[i].day))
min = p[i];
}
cout << valid;
if (valid != 0)
cout << " " << max.name << " " << min.name;
system("pause");
return 0;
}
然后可以改成scanf("%d/%d/%d", &y, &m, &d);