Не проходит 5 тест:
Failed case #5/5: Wrong answer
Дополните класс Person из задачи «Имена и фамилии — 2» конструктором, позволяющим задать имя и фамилию человека при рождении, а также сам год рождения. Класс не должен иметь конструктора по умолчанию.
При получении на вход года, который меньше года рождения:
методы GetFullName и GetFullNameWithHistory должны отдавать "No person";
методы ChangeFirstName и ChangeLastName должны игнорировать запрос.
Кроме того, необходимо объявить константными все методы, которые по сути ими являются.
Пример
Код
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| int main() {
Person person("Polina", "Sergeeva", 1960);
for (int year : {1959, 1960}) {
cout << person.GetFullNameWithHistory(year) << endl;
}
person.ChangeFirstName(1965, "Appolinaria");
person.ChangeLastName(1967, "Ivanova");
for (int year : {1965, 1967}) {
cout << person.GetFullNameWithHistory(year) << endl;
}
return 0;
} |
|
Вывод:
C++ |
1
2
3
4
| No person
Polina Sergeeva
Appolinaria (Polina) Sergeeva
Appolinaria (Polina) Ivanova (Sergeeva) |
|
Мой код:
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
| #include <iostream>
#include <string>
#include <vector>
#include <map>
using namespace std;
struct FullName {
string Name;
string Soname;};
class Person {
public:
Person(const string& first_name, const string& last_name, int year) {
YearNameSoname[year] = { first_name, last_name };
birth_year = year;
for (auto& i : YearNameSoname) {
if (i.first < year) YearNameSoname.erase(i.first);}}
void ChangeFirstName(int year, const string& first_name) {
for (auto& i : YearNameSoname) {
if (year > i.first) {
if (YearNameSoname.count(year) == 0) YearNameSoname[year].Soname = "";
YearNameSoname[year].Name = first_name;}
break;}}
void ChangeLastName(int year, const string& last_name) {
for (auto& i : YearNameSoname) {
if (year > i.first) {
if (YearNameSoname.count(year) == 0) YearNameSoname[year].Name = "";
YearNameSoname[year].Soname = last_name;}
break;}}
string GetFullName(int year) const {
if ( year < birth_year) return "No person";
else if (YearNameSoname.empty()) {
return "Incognito";}
else {
for (const auto& i : YearNameSoname) {
if (year < i.first) return "Incognito";
break;}}
string nm;
string sn;
for (const auto& i : YearNameSoname) {
if (i.first <= year && !i.second.Soname.empty()) sn = i.second.Soname;
if (i.first <= year && !i.second.Name.empty()) nm = i.second.Name;}
if (nm.empty()) return sn + " with unknown first name";
else if (sn.empty()) return nm + " with unknown last name";
else return nm + " " + sn;}
string GetFullNameWithHistory(int year) const {
if ( year < birth_year) return "No person";
else if (YearNameSoname.empty()) {
return "Incognito";}
else {
for (const auto& i : YearNameSoname) {
if (year < i.first) return "Incognito";
break;}}
string nm;
string sn;
vector<string> secondnames;
vector<string> firstnames;
for (const auto& i : YearNameSoname) {
if (i.first <= year && !i.second.Soname.empty()) {
if (i.second.Soname != sn && !sn.empty()) {
secondnames.push_back(sn);}
sn = i.second.Soname;}
if (i.first <= year && !i.second.Name.empty()) {
if (i.second.Name != nm && !nm.empty()) {
firstnames.push_back(nm);}
nm = i.second.Name;}}
string secnames_string, firstnames_string;
if (!secondnames.empty()) {
secnames_string += " (" + secondnames[secondnames.size() - 1];
if (secondnames.size() > 1) {
for (int i = secondnames.size() - 1; i > 0; --i) {
secnames_string += ", " + secondnames[i - 1]; }}
secnames_string += ")"; }
if (!firstnames.empty()) {
firstnames_string += " (" + firstnames[firstnames.size() - 1];
if (firstnames.size() >1) {
for (int i = firstnames.size() - 1; i > 0; --i) {
firstnames_string += ", " + firstnames[i - 1];}}
firstnames_string += ")";}
if (nm.empty()) return sn + secnames_string + " with unknown first name";
else if (sn.empty()) return nm + firstnames_string + " with unknown last name";
else return nm + firstnames_string + " " + sn + secnames_string;}
private:
map<int, FullName> YearNameSoname;
int birth_year = 0;};
int main() {
Person person("Polina", "Sergeeva", 1960);
for (int year : {1959, 1960}) {
cout << person.GetFullNameWithHistory(year) << endl;
cout << person.GetFullName(year) << endl;
}
person.ChangeFirstName(1965, "Appolinaria");
person.ChangeLastName(1967, "Ivanova");
person.ChangeFirstName(1802, "Test");
person.ChangeLastName(1804, "test");
for (int year : {1965, 1967, 2000, 0, -1, -2000}) {
cout << person.GetFullNameWithHistory(year) << endl;
cout << person.GetFullName(year) << endl;
}
return 0;
} |
|