Sprawdzanie częstości występowania znaków c++
Sprawdzanie częstości występowania znaków c++
Witam! Mam pytanie. Czy mógłby mnie ktoś nakierować w jaki sposób zabrać się za program w c++, który będzie sprawdzał częstość występowania znaku w stringu? Mianowicie:
Przykład:
czestosc("Ala ma kota");
Wystwietli:
A - 1
l - 1
a - 3
(spacja) - 2
m - 1
k - 1
o - 1
t - 1
Dodam, że nie chodzi mi o gotowy kod tylko o jakąś podpowiedź jak zacząć. Czy jest jakaś funkcja do tego? Dzięki za odpowiedź. Pozdrawiam.
Przykład:
czestosc("Ala ma kota");
Wystwietli:
A - 1
l - 1
a - 3
(spacja) - 2
m - 1
k - 1
o - 1
t - 1
Dodam, że nie chodzi mi o gotowy kod tylko o jakąś podpowiedź jak zacząć. Czy jest jakaś funkcja do tego? Dzięki za odpowiedź. Pozdrawiam.
- mcbob
- Użytkownik
- Posty: 479
- Rejestracja: 15 gru 2008, o 19:02
- Płeć: Mężczyzna
- Lokalizacja: Poland
- Pomógł: 69 razy
Sprawdzanie częstości występowania znaków c++
Zrób sobie tablicę w której będziesz zapisywał ilość wystąpień danego znaku. A indeks w tablicy możesz wyliczać na przykład rzutując char na int'a.
Sprawdzanie częstości występowania znaków c++
Ehh, no dobra. Przypuścmy, że przeszukuje tablice znaków. Sprawdzam tab[0]. Jest to przykładowo 'a'. Ale w jaki sposób to sprawdzić, że to jest 'a', i jak sprawdzać kolejne znaki w poszukiwaniu 'a'? Tak jak mówisz zrobić tablice gdzie będę zapisywał ilość. Ale co mi to da? Jedynym rozwiązaniem, bardzo długim, które przychodzi mi do głowy to sprawdzać każdy znak po kolei. Ale to bezsensu. Siedziałbym nad tym do rana.
Sprawdzanie częstości występowania znaków c++
Załóżmy, że nie rozróżniamy wielkich/małych liter. Więc tak:
0. Wczytaj stringa, np do zmiennej: zdanie
1. Zamień wszystkie litery w stringu na małe litery.
2. Utwórz tablicę 26 elementową. Np. char tablica[26]
3. Wypełnij ją zerami.
4. Pobierz długość zmiennej zdanie, zapisz np. do zmiennej X.
5. dla i = 0,1,2..,x-1 rób 6
6. tablica[zdanie-'a']++;
7. Wypisz ładnie tą tablicę.
Jeśli chodzi o tablicę:
pod indeksem 0 siedzi liczba wystąpień a, pod 1 liczba wystąpień b, itd
krok 6 działa tak:
indeksem tablicy w tym kroku jest wyrażenie: zdanie-'a'.
zdanie - i-ta litera/symbol w stringu
zdanie-'a' zwraca 0 jeśli tam siedzi a, 1 jeśli jest tam b itd
0. Wczytaj stringa, np do zmiennej: zdanie
1. Zamień wszystkie litery w stringu na małe litery.
2. Utwórz tablicę 26 elementową. Np. char tablica[26]
3. Wypełnij ją zerami.
4. Pobierz długość zmiennej zdanie, zapisz np. do zmiennej X.
5. dla i = 0,1,2..,x-1 rób 6
6. tablica[zdanie-'a']++;
7. Wypisz ładnie tą tablicę.
Jeśli chodzi o tablicę:
pod indeksem 0 siedzi liczba wystąpień a, pod 1 liczba wystąpień b, itd
krok 6 działa tak:
indeksem tablicy w tym kroku jest wyrażenie: zdanie-'a'.
zdanie - i-ta litera/symbol w stringu
zdanie-'a' zwraca 0 jeśli tam siedzi a, 1 jeśli jest tam b itd
- mcbob
- Użytkownik
- Posty: 479
- Rejestracja: 15 gru 2008, o 19:02
- Płeć: Mężczyzna
- Lokalizacja: Poland
- Pomógł: 69 razy
Sprawdzanie częstości występowania znaków c++
Właśnie dzięki zamianie chara na inta taki problem nie występuje bo zawsze możesz to odwrócić. Prosty odwracalny hash.macmika pisze: Ale w jaki sposób to sprawdzić, że to jest 'a', i jak sprawdzać kolejne znaki w poszukiwaniu 'a'
Przykładowe rozwiązanie:
-
- Użytkownik
- Posty: 6607
- Rejestracja: 16 sty 2007, o 19:42
- Płeć: Mężczyzna
- Podziękował: 119 razy
- Pomógł: 1823 razy
Sprawdzanie częstości występowania znaków c++
O wiele bardziej logicznie jest tutaj użyć mapy. Nie ma kombinowania z jakimiś indeksami i kod jest czytelniejszy. Przykładowa funkcja:
Kod: Zaznacz cały
void printCharOccurrenceToStream(ostream& stream, const string& text)
{
map<char, unsigned int> occurrences;
for(size_t i=0;i<text.size();++i)
{
const char c = text.at(i);
if(occurrences.find(c)==occurrences.end())
{
occurrences.insert(make_pair(c,0));
}
++(occurrences.find(c)->second);
}
for(map<char, unsigned int>::iterator it = occurrences.begin(); it!=occurrences.end();++it)
{
stream<<'\''<<(it->first)<<"\': "<<(it->second)<<"\n";
}
}
- mcbob
- Użytkownik
- Posty: 479
- Rejestracja: 15 gru 2008, o 19:02
- Płeć: Mężczyzna
- Lokalizacja: Poland
- Pomógł: 69 razy
Sprawdzanie częstości występowania znaków c++
Wiem, ale po treści pytania wnioskowałem że kolega powyżej może nie znać dobrze STLa, a zapisywać w tablicy chyba każdy, nawet początkujący potrafi.soku11 pisze:O wiele bardziej logicznie jest tutaj użyć mapy