MyTetra Share
Делитесь знаниями!
История имен и фамилий через класс 2
Время создания: 07.08.2017 15:12
Раздел: Computer - Programming - C++ - Coursera White_Belt

/*

Дополните класс из предыдущей задачи «Имена и фамилии — 1»

методом GetFullNameWithHistory:


class Person {

public:

void ChangeFirstName(int year, const string& first_name) {

// добавить факт изменения имени на first_name в год year

}

void ChangeLastName(int year, const string& last_name) {

// добавить факт изменения фамилии на last_name в год year

}

string GetFullName(int year) {

// получить имя и фамилию по состоянию на конец года year

}

string GetFullNameWithHistory(int year) {

// получить все имена и фамилии по состоянию на конец года year

}

private:

// приватные поля

};


В отличие от метода GetFullName, метод GetFullNameWithHistory

должен вернуть не только последние имя и фамилию к концу данного года,

но ещё и все предыдущие имена и фамилии в обратном хронологическом порядке.

Если текущие факты говорят о том, что человек два раза подряд

изменил фамилию или имя на одно и то же, второе изменение

при формировании истории нужно игнорировать.


Для лучшего понимания формата см. примеры.


ПРИМЕР:

Код:

int main() {

Person person;

person.ChangeFirstName(1965, "Polina");

person.ChangeLastName(1967, "Sergeeva");

for (int year : {1900, 1965, 1990}) {

cout << person.GetFullNameWithHistory(year) << endl;

}

person.ChangeFirstName(1970, "Appolinaria");

for (int year : {1969, 1970}) {

cout << person.GetFullNameWithHistory(year) << endl;

}

person.ChangeLastName(1968, "Volkova");

for (int year : {1969, 1970}) {

cout << person.GetFullNameWithHistory(year) << endl;

}

person.ChangeFirstName(1990, "Polina");

person.ChangeLastName(1990, "Volkova-Sergeeva");

cout << person.GetFullNameWithHistory(1990) << endl;

person.ChangeFirstName(1966, "Pauline");

cout << person.GetFullNameWithHistory(1966) << endl;

person.ChangeLastName(1960, "Sergeeva");

for (int year : {1960, 1967}) {

cout << person.GetFullNameWithHistory(year) << endl;

}

person.ChangeLastName(1961, "Ivanova");

cout << person.GetFullNameWithHistory(1967) << endl;

return 0;

}


Вывод:

Incognito

Polina with unknown last name

Polina Sergeeva

Polina Sergeeva

Appolinaria (Polina) Sergeeva

Polina Volkova (Sergeeva)

Appolinaria (Polina) Volkova (Sergeeva)

Polina (Appolinaria, Polina) Volkova-Sergeeva (Volkova, Sergeeva)

Pauline (Polina) with unknown last name

Sergeeva with unknown first name

Pauline (Polina) Sergeeva

Pauline (Polina) Sergeeva (Ivanova, Sergeeva)

*/


#include <iostream>

#include <vector>

#include <map>


using namespace std;


vector<string> FormNamesHistory(int year, map<int, string>& data)

{

vector<string> result;

int limit = data.begin() -> first;

for(int i = year; i >= limit; --i)

{

if(data.count(i))

result.push_back(data[i]);

}

return result;

}


string FindName(const int year, const map<int, string>& data)

{

string name;

for (const auto& item : data)

{

if (item.first <= year)

name = item.second;

else

break;

}

return name;

}


string GetHistoryNames(const vector<string>& data)

{

string result;// = " (";

string check = data[0];

unsigned int limit = data.size()-1;

for(unsigned int i = 1; i < limit; ++i)

{

if(check != data[i])

{

result += data[i] + ", ";

check = data[i];

}

}

if(data[limit] != check)

result += data[limit];

if(!result.empty())

{

return " (" + result + ")";

}

//result += ")";

return result;

}


class Person {

public:

void ChangeFirstName(int year, const string& first_name) {

// добавить факт изменения имени на first_name в год year

firstName[year] = first_name;

}


void ChangeLastName(int year, const string& last_name) {

// добавить факт изменения фамилии на last_name в год year

lastName[year] = last_name;

}


string GetFullName(int year) {

string name = FindName(year, firstName);

string surname = FindName(year, lastName);


if(!name.empty() && !surname.empty())

return name + " " + surname;

else if(!name.empty())

return name + " with unknown last name";

else if(!surname.empty())

return surname + " with unknown first name";

else return "Incognito";

// получить имя и фамилию по состоянию на конец года year

}


string GetFullNameWithHistory(int year) {

vector<string> names = FormNamesHistory(year, firstName);

vector<string> surnames = FormNamesHistory(year, lastName);


string result;

if(!names.empty() && !surnames.empty())

{

result = names[0];

if(names.size() > 1)

{

result += GetHistoryNames(names);

}

result += (" " + surnames[0]);

if(surnames.size() > 1)

{

result += GetHistoryNames(surnames);

}

return result;

}

else if(!names.empty())

{

result = names[0];

if(names.size() > 1)

{

result += GetHistoryNames(names);

}

result += " with unknown last name";

}

else if(!surnames.empty())

{

result = surnames[0];

if(surnames.size() > 1)

{

result += GetHistoryNames(surnames);

}

result += " with unknown first name";

}

else result = "Incognito";

return result;

}


private:

map<int, string> firstName;

map<int, string> lastName;

// приватные поля

};


int main()

{

/*вставить код из примера в условии задачи и проверить*/

getchar();

return 0;

}

Так же в этом разделе:
 
MyTetra Share v.0.53
Яндекс индекс цитирования