# Zapoctovy test 21.4.2010

<{ForumPost(poster="iwtu", timestamp=2010-04-23 02:34:45)}>
*Vstupny subor:* prvy riadok obsahuje oddelovac, na dalsich riadkach su data.   
*data format:* oddelovacom mohlo byt oddelene meno alebo cislo alebo nezmysel. Nezmysly sa ignoruju.  
*forma mena*: obsahuje iba pismena a medzery. meno je iba prve meno splnajuce format mena. Dalsie mena su povazovane za nezmysel. Defaultne meno je prazdny retezec.  
*format cisla:* cislo je celociselne, moze obsahovat unarne + alebo -  
*Vystupny subor1:* obsahuje meno na zaciatku, oddelovac a cisla upsoriadane vzostupne oddelene oddelovacom.  Lexikograficky usporiadane riadky podla mena.  
*Vystupny subor2*:  meno, oddelovac, sucet cisiel. Lexikograficky usporiadane podla mena.  
*Vystupny subor3:* meno, oddelovac, sucet cisiel. Riadky su usporiadane zostupne podla sumy cisiel.  
  
Ak by niekto chcel zdrojak...  

    #include <fstream>
    #include <sstream>
    #include <string>
    #include <vector>
    #include <cctype>
    #include <algorithm>
    
    char oddelovac;
    
    struct clovek {
        std::string meno;
        int suma;
        std::vector<int> cisla;
    
        clovek(): meno(""), suma(0) {}
    };
    
    std::vector<clovek> ludia;
    
    bool je_platne_cislo(std::string s)
    {
        if (s[0] != '+' && s[0] != '-' && !std::isdigit((s[0])))
            return false;
        for (unsigned int i=1; i < s.length(); ++i)
            if (!std::isdigit(s[i]))
                return false;
    
        return true;
    }
    
    bool je_platne_meno(std::string s)
    {
        for (unsigned int i=0; i < s.length(); ++i)
            if (!std::isalpha(s[i]) && s[i] != ' ')
                return false;
    
        return true;
    }
    
    bool je_mensie_meno(clovek c1, clovek c2)
    {
        return c1.meno < c2.meno;
    }
    
    bool je_vacsia_suma(clovek c1, clovek c2)
    {
        return c1.suma > c2.suma;
    }
    
    int main()
    {
        
        //nacitaie vstupu
        std::ifstream in("/tmp/input.txt");
        std::string s;
        std::getline(in,s);
        oddelovac = s[0];
        
        //nacita riadok
        while (std::getline(in,s)) {
            std::stringstream ss(s);       
            bool bolo_meno = false;
            clovek cl;
            //parsuje riadok
            while (std::getline(ss,s,oddelovac)) {
                //spracovanie poloziek riadku
                
                if (!bolo_meno && je_platne_meno(s)) {
                    bolo_meno = true;
                    cl.meno = s;                
                   
                }
    
                if (je_platne_cislo((s))) {
                    std::stringstream ss2(s);
                    int cislo;
                    ss2 >> cislo;                
                    cl.suma += cislo;
                    cl.cisla.push_back(cislo);
                }
                
            }        
            //usporiada cisla vzostupne
            std::sort(cl.cisla.begin(), cl.cisla.end());
            ludia.push_back(cl);
            
        }
        in.close();
    
        std::ofstream out("/tmp/output2.txt");
        for (unsigned int i=0; i < ludia.size(); ++i) {
            out  << ludia[i].meno << oddelovac << ludia[i].suma << "
    ";
    
        }
        out.close();
    
        out.open("/tmp/output1.txt");
        std::sort(ludia.begin(), ludia.end(), je_mensie_meno);
        for (unsigned int i=0; i < ludia.size(); ++i) {
            out << ludia[i].meno << oddelovac;
            for (unsigned int i2=0; i2 < ludia[i].cisla.size(); ++i2) {
                if (i2 != ludia[i].cisla.size() - 1)
                    out << ludia[i].cisla[i2] << oddelovac;
                else
                    out << ludia[i].cisla[i2] << "
    ";
            }
        }
        out.close();
    
        std::sort(ludia.begin(), ludia.end(), je_vacsia_suma);
        out.open("/tmp/output3.txt");
        for (unsigned int i=0; i < ludia.size(); ++i) {
            out  << ludia[i].meno << oddelovac << ludia[i].suma << "
    ";
    
        }
        out.close();
    
    }


<{/ForumPost}>

