Sprawdzanie częstości występowania znaków c++

macmika
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 13 gru 2010, o 23:53
Płeć: Mężczyzna
Lokalizacja: Wrocław

Sprawdzanie częstości występowania znaków c++

Post autor: macmika »

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.
Awatar użytkownika
mcbob
Użytkownik
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++

Post autor: mcbob »

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.
macmika
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 13 gru 2010, o 23:53
Płeć: Mężczyzna
Lokalizacja: Wrocław

Sprawdzanie częstości występowania znaków c++

Post autor: macmika »

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.
_pt
Użytkownik
Użytkownik
Posty: 18
Rejestracja: 22 sty 2011, o 15:26
Płeć: Mężczyzna

Sprawdzanie częstości występowania znaków c++

Post autor: _pt »

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
Awatar użytkownika
mcbob
Użytkownik
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++

Post autor: mcbob »

macmika pisze: Ale w jaki sposób to sprawdzić, że to jest 'a', i jak sprawdzać kolejne znaki w poszukiwaniu 'a'
Właśnie dzięki zamianie chara na inta taki problem nie występuje bo zawsze możesz to odwrócić. Prosty odwracalny hash.
Przykładowe rozwiązanie:    
macmika
Użytkownik
Użytkownik
Posty: 14
Rejestracja: 13 gru 2010, o 23:53
Płeć: Mężczyzna
Lokalizacja: Wrocław

Sprawdzanie częstości występowania znaków c++

Post autor: macmika »

Wielkie dzięki. Pozdrawiam.
soku11
Użytkownik
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++

Post autor: soku11 »

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";
  }
}
Awatar użytkownika
mcbob
Użytkownik
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++

Post autor: mcbob »

soku11 pisze:O wiele bardziej logicznie jest tutaj użyć mapy
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.
ODPOWIEDZ