None
No notes
Syntax:
C++
/* Rozwiązanie ćwiczenia numer 3 z wikipedii. */ #include <iostream> #include <fstream> #include <algorithm> #include <iterator> #include <functional> #include <list> #include <set> #include <string> using namespace std; // funktor, ktory informuje czy wprowadzone slowo // jest zakonczone wyznaczonym sufixem class EndsWith : public std::unary_function<string, bool> { const string sufix; public: EndsWith(const string suf) : sufix(suf) {} bool operator()(const string word) const { // szukanie wystapienia wprowadzonej sekwencji unsigned const index = word.rfind(sufix); if (index == string::npos) return false; // sprawdzenie czy sekwencja jest sufiksem unsigned const rightPositon = word.size() - sufix.size(); if (index != rightPositon) return false; return true; } }; // typ reprezentujący płeć enum Sex { Male, Female }; // typ reprezentujacy osoba z bazy class Person { string pesel; Sex sex; string firstName; string secondName; public: Person(string pPesel, Sex pSex, string pfName, string psName) : pesel(pPesel), sex(pSex), firstName(pfName), secondName(psName) {} inline string getPesel() const { return pesel; } inline Sex getSex() const { return sex; } inline string getFirstName() const { return firstName; } inline string getSecondName() const { return secondName; } }; // reprezentacja klasy programu class Appliaction { bool fileError; list<Person> people; ifstream fileInput; public: Appliaction(const int argc, char*argv[]); ~Appliaction(); bool run(); private: void getDataFromFile(); void showResult1() const; void showResult2() const; }; Appliaction::Appliaction(const int argc, char*argv[]) : fileError(false) { const unsigned rightCountArgc = 2; // kontrola właściwej ilości argumentów wiersza if (argc != rightCountArgc) { fileError = true; return; } // sprawdzenie pliku fileInput.open(argv[1]); if (!fileInput.is_open()) fileError = true; } Appliaction::~Appliaction() { if (!fileError) fileInput.close(); } bool Appliaction::run() { if (fileError) return false; getDataFromFile(); // realizacja zadań do wykonania showResult1(); showResult2(); } void Appliaction::getDataFromFile() { string line; // zignorowanie naglowka przetwarzanego pliku (pomijam 3 linie) for (unsigned i = 0; i != 3 && !fileInput.eof(); ++i) getline(fileInput, line); // tymczasowe dane na potrzeby odbioru z wejscia string pesel; char chSex; Sex sex; string firstName; string secondName; while (!fileInput.eof()) { // pobieranie danych fileInput >> pesel >> chSex >> firstName >> secondName; // konwersja znakow M i K na typ Sex if (chSex == 'M') sex = Male; else sex = Female; // tworzenie nowej osoby na liscie people.push_back(Person(pesel, sex, firstName, secondName)); } } void Appliaction::showResult1() const { // zbior wszystkich nazwisk set<string> allSecondNames; // zbior właściwych nazwisk do wyświetlenia set<string> resultSecondNames; // sufix jakim mają kończyć się szukane nazwiska const string sufix = "ski"; // pobranie do zbioru wszystkich nazwisk list<Person>::const_iterator it = people.begin(); for (; it != people.end(); ++it) allSecondNames.insert(it->getSecondName()); // skopiowanie nazwisk zakończonych właściwym sufixem remove_copy_if(allSecondNames.begin(), allSecondNames.end(), inserter(resultSecondNames, resultSecondNames.begin()), not1(EndsWith(sufix))); // wyświetlenie rezultatu cout << "Zadanie 1\n\t"; copy(resultSecondNames.begin(), resultSecondNames.end(), ostream_iterator<string > (cout, "\n\t")); } void Appliaction::showResult2() const { // zbior wszystkich imion set<string> allFirstNames; // zbior zenskich imion, sortowanych alfabetycznie set<string, less<string> > femaleFirstNames; // zbior meskich imion, sortowanych alfabetycznie set<string, less<string> > maleFirstNames; // sufix sluzacy do rozpoznania plciu po imieniu const string femaleSuffix = "a"; // pobranie wszystkich imion list<Person>::const_iterator it = people.begin(); for (; it != people.end(); ++it) allFirstNames.insert(it->getFirstName()); // skopiowanie kobiecych imion remove_copy_if(allFirstNames.begin(), allFirstNames.end(), inserter(femaleFirstNames, femaleFirstNames.begin()), not1(EndsWith(femaleSuffix))); // skopiowanie meskich imion, sposobem roznicy zbiorow set_difference(allFirstNames.begin(), allFirstNames.end(), femaleFirstNames.begin(), femaleFirstNames.end(), inserter(maleFirstNames, maleFirstNames.begin())); // wyswietlenie rezultatu cout << "\n\nZadanie 2:\nZenskie imiona:\n\t"; copy(femaleFirstNames.begin(), femaleFirstNames.end(), ostream_iterator<string > (cout, "\n\t")); cout << "\nMeskie imiona:\n\t"; copy(maleFirstNames.begin(), maleFirstNames.end(), ostream_iterator<string > (cout, "\n\t")); cout << "\n"; } int main(int argc, char * argv[]) { Appliaction theApp(argc, argv); theApp.run(); return 0; }