Zliczanie znaków w stringu

0

Witam, chciałbym napisać funkcję która pozwala mi zliczyć powtarzalność znaków w danym stringu, nie mam jednak pomysłu jakiej komendy użyć przykładowo chciałbym aby po wpisaniu łańcucha wyświetlało mi np. Ala ma kota
A 1
l 1
a 3
m 1
a 3
k 1
o 1
t 1
a 3
Nie proszę o gotowe napisanie tylko o wskazówki z czego mam skorzystać. Pozdrawiam :)

3

skorzystaj z std::map
jako Key daj literke
jako value ile razy wystepuje w stringu

0

Skorzystaj z tego samego co masz w tytule wątku -> ze zliczania. Popatrz np. na algorytm sortowania przez zliczanie, bo masz zastosować bardzo podobny schemat.

1

Zwróciliście uwagę na przykładowe wyjście? Jeśli literka a wystąpiła trzy razy, to ma zostać trzy razy wypisana i do tego we właściwych wierszach.

1
#include <map>
#include <string>
#include <iterator>
#include <iostream>
#include <boost/range/algorithm/copy.hpp>
#include <boost/function_output_iterator.hpp>
using namespace std;
int main(){
    string str{
        istream_iterator<char>(cin), 
        istream_iterator<char>()
    };

    map<char, size_t> occurs;
    boost::copy(str, boost::make_function_output_iterator([&](char c){ occurs[c] += 1; }));
    
    for(char c : str){
        cout << c << ": " << occurs[c] << "\n";
    }
}

http://melpon.org/wandbox/permlink/d0FmsSyWNBuoLR8g

Nie proszę o gotowe napisanie

To dobrze, bo byś nie dostał :P

0

Znaczy powiem wprost no jest to zadanie na studia, i widzę że te funkcje i konstrukcje wybiegają daleko poza zakres mojej wiedzy więc wydaje mi się że powinien być jakiś prostszy sposób.

2

dobrze, nie chcesz gotowych funkcji to podam Ci liste krokow ktore musisz zrobic. Zajmie Ci pisanie pewnie z pare godzin zamiast napisanie tego w ciagu godziny i zrozumieniu tego. Ale jezeli lubisz wymyslac kolo na nowo to nikt Ci nie bedzie tego zabranial

  1. Robisz tablice z kazdym znakiem ktory chcesz by byl zliczany
    0.1 Robisz druga tablice pusta o typie int (w sensie ma wszystko na zero) o wielkosci tablicy pierwszej
  2. Wczytujesz linie tekstu (szukaj pod getline)
  3. Iterujesz po tym slowie jako kazdy znak
    2.1. szukasz w tablicy znakow obecnego znaku
    2.2 zapisujesz indeks w tablicy
    2.3 w drugiej tablicy o tym samym indeksie zwiekszasz liczbe o 1
  4. Wpisujesz tablice pierwsza i druga w tym samym momencie
0

Stworzyłem więc tablice z każdym znakiem który chce żeby był wczytywany, czyli praktycznie każdy z klawiatury. Stworzyłem tą tablice int i co dalej krok 1 i 2 również, jednak nie wiem jak mam "wyszukać" czy dany znak wystąpił.

2

A poświęciłeś 2 minuty na przeczytanie jak działa sortowanie przez zliczanie? Nie? To poświęć.

1

Tablica kodów dla znaków ASCII to od 127 do 256 liczb, stąd mieszczą się w char(8 bit) w zasadzie niezależnie od kodowania pozostałych znaków normalne litery i liczby to zakres od ok 48 do 127, przykładowo spacja to liczba 32, cyfra 0 to kod 48, litera "A" to liczba 65, "B" to 66 itd. małe "a" to 97 bo 65 + 32 = 97 (analogicznie dla wszystkich liter)

Zatem potrzebna jest zaledwie jedna dodatkowa tablica o rozmiarze 256 bajtów indeksowana znakami.
Rodzaj zmiennej użytej w tablicy trzeba dobrać do długości tekstu więc dla długości 256 znaków wystarczy unsigned __int8 dla tekstów o rozmiarze 4GB unsigned __int32 więc zaledwie od 256 do 1024 bajtów RAM. Zerujesz tablice liczebnosci[256] (przejście od 0 do 255). W przejściu petli for (i=0; i<znaki.length();i++) dla tekstu inkrementujesz liczebnosc[(unsigned char)znak[i]]++; i już masz liczebności. Dla wydrukowania potrzebne jest kolejne przejście podobnej petli (znowu od zera do znaki.length()): cout << (char)znak[i] << liczebnosc[(unsigned char)znak[i]] << endl;
Koniec.

Nie wiem co jest trudnego do zrozumienia, wystarczy zakodować poprzez kopiuj wklej dwóch petli, wczytać znaki z klawiatury poprzez getch() albo scanf i już.
Jak słusznie zauważył Shalom można to uznać za fragment algorytmu sortowanie przez zliczanie.

@fasadin - dokładnie tak jak napisałem potrzebna jest jedna tablica bo tej która zawiera tekst nie wliczam.
@spartanPAGE podał uniwersalną wersję algortymu która zadziała jesli będzie musiala zliczać np. sylaby, wyrazy, frazy większe elementy którym nie kody ASCII ale map przyporządkuje unikatowe liczby.

1 użytkowników online, w tym zalogowanych: 0, gości: 1