None

by coder on December 31st, 2009
No notes
Syntax: C++
Show lines - Hide lines - Show in textbox - Download
/*
	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;
}

Leave a Reply

Note: XHTML is allowed. Your email address will never be published.

Subscribe to this comment feed via RSS