Zapoctovy test 21.4.2010

Základní kurs objektově orientovaného programování v C++. Třídy a objekty, zapouzdření, metody, plymorfismus. Abstraktní datové typy, přetěžování. Kontejnery, iterátory, algoritmy. Šablony, generické programování, kompilační polymorfismus. Výjimky. Bezpečné a přenositelné programování, vazby na OS.
Uživatelský avatar
iwtu
Matfyz(ák|ačka) level I
Příspěvky: 48
Registrován: 15. 3. 2010 21:54
Typ studia: Informatika Bc.

Zapoctovy test 21.4.2010

Příspěvek od iwtu »

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...

Kód: Vybrat vše

#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();

}
Odpovědět

Zpět na „NPRG041 Programování v C++“