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.
Fórum › C / C++
Počet písmen ve slovech v textovém souboru
A co dál? Postrádám výsledek vlastní iniciativy.
hu
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
#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
Jsi s tím za měsíc nepohnul?? No potěš koště.
hu
#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...
#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
}
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
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;
}
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;
}
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
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
#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.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Počet opakování stejných slov v textovém souboru — založil tomstein
Počet písmen vo vete — založil kristián
Stejný počet písmen na řádku — založil B Fridrich
Počet veľkých písmen v reťazci — založil Kent
Výpis ze souboru po slovech — založil Jirka
Moderátoři diskuze