IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Práce se soubory a seřazení podle abecedy

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Patrik
Člen
Avatar
Patrik:7.5.2019 20:24

Zdravím, mám takový menší problém s prográmkem do školy.. Jde o to ,že se nám přiloží soubor ,který bude mít různá slova. Slova budou odděleny :
(dvojtečkou). Do téhle fáze jsem se ještě dostal ,poté potřebuji nahrát do souboru do každého řádku A-Z a kolik je počet slov daného začínajícího písmena.

Zkusil jsem: Jediné co mi chybí je udělat počítadlo ,pro ty slova. Což tak nějak nevím ,jak na to. Zvládl jsem seřadit všechny slova podle abecedy ,ale nevím jak hledat první písmenko. Napadlo mě jestli to nejde udělat nějak find ve <vector> a nebo ,že string je vlastně pole a udělat podmínky na první index slova a dát to do počítadla ,ale příjde mi to tak nějak nepoužitelné.

Chci docílit:

int main()
{

        string file;
        cout << "Zadej cestu k vstupnimu souboru" << endl;
        cin >> file;
        string s;
        ifstream in(file);

        if (in.is_open()) {
                in >> s;
        }
                string delimiter = ":";

                vector<string> outputArr;
                size_t pos = 0;
                string token;
                while ((pos = s.find(delimiter)) != string::npos) {
                        token = s.substr(0, pos);
                        s.erase(0, pos + delimiter.length());
                        outputArr.push_back(token);
                }
                outputArr.push_back(s);
                bubblesort(outputArr);
        for (int i = 0; i < outputArr.size(); i++) {
                cout << outputArr[i]<<" ";
        }


        in.close();
        cin.get();
}


 void bubblesort(vector<string> &strings)
{
        typedef vector<string>::size_type size_type;
        for (size_type i = 1; i < strings.size(); ++i)
        {

                for (size_type j = 0; j < (strings.size() - 1); ++j)
                {
                        if (strings[j] > strings[j + 1])
                        {
                                string const temp = strings[j];
                                strings[j] = strings[j + 1];
                                strings[j + 1] = temp;
                        }
                }
        }
}

Děkuji za každou radu ,nechci po vás ,aby jste to za mě udělali stačí ,když mě navedete na nějakou cestu. :)

 
Odpovědět
7.5.2019 20:24
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Patrik
DarkCoder:7.5.2019 23:29

Není na tom nic těžkého.

Nadefinuješ si velikost pole, jehož smyslem je udržovat hodnoty o počtu slov začínající tím kterým písmenem.

#define N_LETTERS 'z' - 'a' + 1

Dále si inicializuješ toto pole na hodnotu nula

int words[N_LETTERS] = { 0 };

Otevřeš soubor pro čtení, načteš první písmeno a pak vždy další písmeno za dvojtečkou. ASCII hodnotu písmena převedeš na index pole

index = tolower(c) - 'a';

Inkrementuješ daný index pole v závislosti na písmenu

words[tolower(c) - 'a']++;

To celé provádíš dokud nedojdeš na konec souboru. Uzavřeš soubor a vypisuješ na obrazovku písmena následované dvojtečkou a hodnotou na daném indexu. Použiješ for cyklus o počtu opakování rovno N_LETTERS, kde písmeno je dáno již známým vztahem

letter = index + 'a';

a kocháš se hotovým funkčním programem...

Toť vše..

Nahoru Odpovědět
7.5.2019 23:29
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Patrik
Člen
Avatar
Patrik:8.5.2019 9:16

Děkuji, dnes se na to vrhnu.

 
Nahoru Odpovědět
8.5.2019 9:16
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 3 zpráv z 3.