Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

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

Aktivity (2)
Avatar
Patrik
Člen
Avatar
Patrik:7. května 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. května 20:24
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Patrik
DarkCoder:7. května 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  +1 7. května 23:29
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Patrik
Člen
Avatar
Patrik:8. května 9:16

Děkuji, dnes se na to vrhnu.

 
Nahoru Odpovědět 8. května 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.