Počet písmen ve slovech v textovém souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Počet písmen ve slovech v textovém souboru – C / C++ – Fórum – Programujte.comPočet písmen ve slovech v textovém souboru – C / C++ – Fórum – Programujte.com

 

Tonda
~ Anonymní uživatel
32 příspěvků
5. 4. 2017   #1
-
0
-

Vytvořte program, kterému předáte textový soubor s libovolným počtem slov oddělených vykřičníkem. Program vytvoří nový soubor, kde budou vypsána písmena abecedy (od A do Z) seřazená dle četnosti výskytu daného písmene ve zdrojovém souboru. Za každým písmenem bude vypsána i procentuální četnost daného písmene.

Nahlásit jako SPAM
IP: 91.221.2.–
5. 4. 2017   #2
-
0
-

A co dál? Postrádám výsledek vlastní iniciativy.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
5. 4. 2017   #3
-
0
-

Postup by mohl vypadat zhruba takto:

1. Vyzvu uživatele k zadání vstupního souboru
2. Otevřu vstupní soubor a informuji uživatele o úspěchu nebo chybě
3. Vyzvu uživatele k zadání názvu výstupního souboru
4. Otevřu výstupní soubor a informuji uživatele o úspěchu nebo chybě
5. Vytvořím si abecedně seřazená počitadla, pro každé písmeno jedno (pole, vektor, .....)
6. Čtu vstupní soubor po jednotlivých znacích
7. Inkrementuji počitadlo příslušného znaku
8. Po přečtení posledního znaku vstupního souboru uzavřu vstupní soubor
9. Zjistím celkový počet znaků jako součet počitadel (představuje 100%)
10. Ke každému počitadlu vypočítám jeho podíl vyjádřený v %, zapíšu hodnoty do výstupního souboru
11. Zavřu výstupní soubor
12. Informuji uživatele o ukončení práce

body 6. a 7. by znamenali použití cyklu s ukončovací podmínkou podle bodu 8. Bod 10. je v podstatě taky cyklus, jeho počet iterací je dán počtem písmen abecedy.

Pár nejasností:
- mají se rozlišovat velká a malá písmena?
- oddělovače (vykřičníky) se mají počítat taky nebo se mají ignorovat?
- co se má udělat s "nepísmenovými" znaky? (čísla, interpunkční znaménka, mezery)
- nemá se výskyt znaků počítat pro každé slovo? Pak by algoritmus byl odlišný
- C nebo C++?

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Tonda
~ Anonymní uživatel
32 příspěvků
11. 5. 2017   #4
-
0
-

#3
- program nerozlišuje Velká a malá písmena

- vykřičníky ani zádné jiné znaky krom abecedy se také nepočítájí

- se znaky nedělat nic jen vypsat procentuelně A-Z tak jak jsou procentuelně podle výskytu za sebou

- počet písmen se počítá pro celý text

- C++

Děkuji

Nahlásit jako SPAM
IP: 77.104.244.–
11. 5. 2017   #5
-
0
-

Jsi s tím za měsíc nepohnul?? No potěš koště.

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Jerry
~ Anonymní uživatel
512 příspěvků
11. 5. 2017   #6
-
0
-

#1 Tonda
tam ti ale někdo např. pan učitel musel dát nějakej návod jak se např. otevírá soubor (iostream) pomocí knihoven pro C++ a jak se čte a jaké jsou funkce s řetězci apod. musíš to někde mít napsaný v sešitě. takhle to je moc divný .. nezdá se mi to ..

musíš si oteřít soubor, číst znak po znaku a pak identifikovat daný znak např. podle ascii kodu (0..255)

https://msdn.microsoft.com/cs-cz/library/k0t5wee3.aspx

a pak udělat jeden velkej switch-case kterej ti bude přičítat jedničku hodnotě v poli, kde použiješ jen 26 prvku pole t.j. znaky a..z, A..Z, u jednotlivejch case se malý 'a' a velký   'A' zapíšou za sebe tedy case 'a', 'A' 

tady to  máš napsaný:

https://msdn.microsoft.com/cs-cz/library/k0t5wee3.aspx

pak už jenom procházíš to pole a zapíšeš do souboru od nejpočetnějšího po nejmíň početný prvek...

Nahlásit jako SPAM
IP: 194.228.128.–
11. 5. 2017   #7
-
0
-

#6 Jerry
Nemusí být nutně switch. Ze znaku se dá spočítat index jeho počítadla v poli počítadel. Jak na to se dá odvodit z již zmiňované ASCII tabulky. Výhoda je, že nemusí ručně psát takový balík kódu. Zhruba takto: 

char znak;
int index;

if( (znak >= 'A') && (znak <= 'Z') )
{
   index = znak - 'A';
   //inkrementuji pocitadlo na pozici index
}
else if( (znak >= 'a') && (znak <= 'z') )
{
   index = znak - 'a';
   //inkrementuji pocitadlo na pozici index
}
Nahlásit jako SPAM
IP: 195.178.67.–
11. 5. 2017   #8
-
0
-

Pole počitadel lze připravit takto: 

#define POCET 26  //pocet znaku v abecede

int pocitadla[POCET];

for(int i = 0; i < POCET; i++) pocitadla[i] = 0;

a inkrementace počitadla uvedená v ukázce kódu z příspěvku #7 by pak byla 

pocitadla[index]++;

hu

Nahlásit jako SPAM
IP: 195.178.67.–
Tonda
~ Anonymní uživatel
32 příspěvků
16. 5. 2017   #9
-
0
-

Ahoj můžete mi prosím ještě jednou poradit, jsem uplně levej vůbec mi to nejde. Děkuju tohle jsem zplodil :) 

Nevím jak tam mám načíst ten textovej soubor z konzole.

#include <iostream>
#include <fstream>
#include <string>

using namespace std;


int main ()

{   string NazevSouboru;
    ifstream VstupniSoubor (NazevSouboru); //otevreni souboru

    cout << "Zadejte nazev textoveho souboru:";
    getline(cin,NazevSouboru);//zadani nazvu konzoli

    VstupniSoubor.open(NazevSouboru.c_str());//otevreni souboru

    const char NazevSouboru[];
    string odkladani;



    if (VstupniSoubor.is_open())
    {
       //Vytvoreni poli
       int poleVelka[26] = {0};
           int poleMala[26] = {0};

       //precteni textu
       while (!VstupniSoubor.eof() )
       {
           //radek textui
           getline (VstupniSoubor, odkladani);
           //precte kazde pismeno v radku
           char znak;
          for(unsigned n = 0; n < odkladani.length(); ++n)
{
   znak = char( odkladani[n] ); // ziskani znaku
   if (znak >= 'A' && znak <='Z') {
     poleVeka[int(znak)- 'A']++;
   }
   else if (znak >= 'a' && znak <='z') {
     poleMala[int(znak)- 'a']++;
   }
}
        }//konec while

        VstupniSoubor.close(); //uzavreni souboru

        //vypis
        for (int i= 0; i < 26; i++)
            cout << char(i + 65) << "\t\t" << poleMala[i] << char(i + 95) << "\t\t" << poleMala[i] << endl;
}//konec if
        else cout << "Chyba";

       return 0;
}
Nahlásit jako SPAM
IP: 77.104.244.–
Tonda
~ Anonymní uživatel
32 příspěvků
16. 5. 2017   #10
-
0
-

Trochu jsem to upravil, ale nevím jak zadávat ten textovy soubor z konzole, tak aby to fungovalo. Takhle mi to funguje jen dodělat procenta, zadání textu, a par prkotin. 

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

const char NazevSouboru[] = "c:/test.txt";

int main ()
{
    string odkladani;
    ifstream VstupniSoubor (NazevSouboru); //open my file stream



    if (VstupniSoubor.is_open())
    {
       //Vytvoreni poli
       int poleVelka[26] = {0};
           int poleMala[26] = {0};

       //precteni textu
       while (!VstupniSoubor.eof() )
       {
           //radek textui
           getline (VstupniSoubor, odkladani);
           //precte kazde pismeno v radku
           char znak;
          for(unsigned n = 0; n < odkladani.length(); ++n)
{
   znak = char( odkladani[n] ); // ziskani znaku
   if (znak >= 'A' && znak <='Z') {
     poleVelka[int(znak)- 'A']++;
   }
   else if (znak >= 'a' && znak <='z') {
     
poleMala[int(znak)- 'a']++;
   }
}
        }//konec while

        VstupniSoubor.close(); //uzavreni souboru

        //vypis
        for (int i= 0; i < 26; i++)
            cout << char(i + 65) << "\t\t" << poleMala[i] << char(i + 97) << "\t\t" << poleMala[i] << endl;
}//konec if
        else cout << "Chyba";

       return 0;
}
Nahlásit jako SPAM
IP: 77.104.244.–
17. 5. 2017   #11
-
0
-

Myslíš aby si uživatel napsal, který soubor otevřít? Dotážeš se ho na jméno souboru. Jméno souboru je řetězec jako každý jiný. A pak tento řetězec předáš funkci pro otevření souboru jako parametr. Doporučuji použít i pro tento účel std::string

hu

Nahlásit jako SPAM
IP: 195.178.67.–
peter
~ Anonymní uživatel
4014 příspěvků
17. 5. 2017   #12
-
0
-

Myslim, ze by casove bylo rychlejsi spocitat vsechny znaky, za predpokladu, ze se jedna o 256 a ne utf tabulky.

- naplnil bych cele pole 0
int poleVelka[26] = {0}; //myslim si, ze tohle nenaplni pole nulami, jen nastavi prvni hodnotu nulu
- v cyklu znak = char( odkladani[n] ); pole[znak]++; // tj. indexy pole bych zalozil na znacich a ne na prevedene hodnote do integeru; a jestli to v C nejde, tak teda prevest pres ten int(znak)
- a na konci bych to teprve vytridil

Nahlásit jako SPAM
IP: 2001:718:2601:26c:5df0:50...–
Tonda
~ Anonymní uživatel
32 příspěvků
20. 5. 2017   #13
-
0
-

Ahoj :) Prosím o radu jak mám vypsat procentuelně ta císla z polí ? díky :)

Nahlásit jako SPAM
IP: 77.104.244.–
Staon0
Návštěvník
22. 5. 2017   #14
-
0
-

#13 Tonda
Procenta jsou podíl počet znaků / celkový počet znaků vynásobený 100. Tzn. musíš si nejdříve sečíst všechny hodnoty, které v polích máš, a pak u každého znaku podíl spočítat. Dělení nezapomeň dělat ve float (double), jinak se ti každá hodnota zaokrouhlí na 0.

Nahlásit jako SPAM
IP: 94.142.234.–
KIIV
~ Moderátor
+43
God of flame
22. 5. 2017   #15
-
0
-

#14 Staon
taky neni od veci zajistit, aby v souctu nevychazelo neco jineho nez 100%

Nahlásit jako SPAM
IP: 212.47.3.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý