Budowanie histogramu częstotliwości występowania liter

0

Hej, stworzyłem taki kod. Ma on zliczać a następnie wyświetlać liczbę liter użytych do stworzenia słowa, lub całego zdania. Program nie działa, domyślam się gdzie jest błąd, ale nie wiem jak go naprawić. Dlatego proszę was o pomoc.

#include <iostream>

using namespace std;

int main()
{
    char litera;
    string alfabet[26], slowo;
    int licznik=0, for1, for2, dlugosc, alfabetliczby[26]={0};

    getline(cin,slowo);

    for (litera='a'; litera<='z'; litera++)
    {
        alfabet[licznik]=litera;
        licznik++;
    }

    dlugosc=slowo.length();

    for (for1=0; for1<=dlugosc; for1++)
    {
        for (licznik=0; licznik<=26; licznik++)
        {
             if (slowo[for1]=='alfabet[licznik]')       //
            {                                           //    coś tu nie gra
                alfabetliczby[licznik]++;               //
            }
        }
    }

    for (for2=0; for2<=26; for2++)
    {
        cout << alfabet[for2] << " " << alfabetliczby[for2] << endl;
    }

    return 0;
}
'''
1

Litera a odpowiada liczbie 97 w ASCII (http://www.lo8.poznan.pl/belferek/klasa1/budkom/lit.html), zatem pisząc alfabet['a'] odnosisz się do indeksu 97, który jest daleeeeko za Twoim zadeklarowanym 26 - spróbuj wszędzie wykorzystywać alfabet[litera - 97] (przemapuje do literę a na indeks 0, literę b na indeks 1 itd.).

Uważaj jednak: dotyczy to tylko minuskuł! Do obsługi majuskuł będziesz potrzebował podejść do tematu inaczej.

Btw, po co Ci w ogóle zmienna alfabet? Do wykonania tego zadania wystarczy Ci jedna tablica, o taka: unsigned int histogram[26];, ew. unsigned int histogram[256];, dla świętego spokoju ;-)

0

Btw, po co Ci w ogóle zmienna alfabet? Do wykonania tego zadania wystarczy Ci jedna tablica, o taka: unsigned int histogram[26];, ew. unsigned int histogram[256];, dla świętego spokoju ;-)

Nie znam tej tablicy, wychodzi ona powyżej mojej wiedzy.

Rozumiem co masz na myśli, ale przecież wyraźnie umieszczam litery alfabetu do tablicy i odpowiada za to licznik, który powinien je umieszczać od 0 a nie od 97. Chyba jednak dalej nie całkiem rozumiem.

Poza tym litera to char jak mogę od chara odejmować inta?

Oraz dlaczego "po mojemu" działa tablica alfabet, a alfabetliczby nie działa?
screenshot-20190512174406.png

1

Nie znam tej tablicy, wychodzi ona powyżej mojej wiedzy.

W jaki sposób najzwyczajniejsza tablica liczb wychodzi poza zakres Twojej wiedzy, ale tablica obiektów std::string (czyli Twoja zmienna alfabet, coś nieporównywalnie bardziej skomplikowanego) już nie?

przecież wyraźnie umieszczam litery alfabetu do tablicy i odpowiada za to licznik, który powinien je umieszczać od 0 a nie od 97.

A, racja - teraz już rozumiem w jakim celu wykorzystujesz tę dodatkową tablicę; w takiej sytuacji jest all ok ;-)

litera to char jak mogę od chara odejmować inta?

char jest tak naprawdę liczbą o wartości zgodnej z tablicą ASCII - przynajmniej póki nie zagłębisz się w UTF-8, bo tam to działa nieco inaczej.

Wracając zatem do meritum: co to znaczy coś tu nie gra?

Btw, masz off-by-one error - Twoje pętle powinny mieć warunek < 26, nie <= 26.

0
Patryk27 napisał(a):

Nie znam tej tablicy, wychodzi ona powyżej mojej wiedzy.

W jaki sposób najzwyczajniejsza tablica liczb wychodzi poza zakres Twojej wiedzy, ale tablica obiektów std::string (czyli Twoja zmienna alfabet, coś nieporównywalnie bardziej skomplikowanego) już nie?

przecież wyraźnie umieszczam litery alfabetu do tablicy i odpowiada za to licznik, który powinien je umieszczać od 0 a nie od 97.

A, racja - teraz już rozumiem w jakim celu wykorzystujesz tę dodatkową tablicę; w takiej sytuacji jest all ok ;-)

litera to char jak mogę od chara odejmować inta?

char jest tak naprawdę liczbą o wartości zgodnej z tablicą ASCII - przynajmniej póki nie zagłębisz się w UTF-8, bo tam to działa nieco inaczej.

Wracając zatem do meritum: co to znaczy coś tu nie gra?

Btw, masz off-by-one error - Twoje pętle powinny mieć warunek < 26, nie <= 26.

  1. Unsigned mnie zmyliło, nie spotkałem się wcześniej z tym. Mój błąd.
  2. Czyli char przemianowuje to co w nim jest na liczbę ASCII, "czyli char a" dla komputera to jakby "97 pozycja w tablicy ASCII"?
  3. Jak na ss. Nie dodaje mi tych liter błąd ich sumowania zapis "alfabetliczby[licznik]++;" jest chyba błędny. Czym go zastąpić? Ja to widzę tak: jeśli literka się zgadza to inkrementuję odpowiadające jej miejsce w tablicy (++).
  4. Chyba muszę powtórzyć for bo jakoś zawsze go omijałem i teraz wychodzi.

Dzięki za zainteresowanie

1

Ad 2: Tak, 'a' jest dla komputera równe dokładnie 97 - możesz też rzutować w obydwie strony:
cpp char a = 99; // 'b' int b = 'c'; // 100

Ad 3: Dlaczego wewnątrz swojego if'a 'alfabet[licznik]' masz w apostrofach?

0
Patryk27 napisał(a):

Ad 2: Tak, 'a' jest dla komputera równe dokładnie 97 - możesz też rzutować w obydwie strony:
cpp char a = 99; // 'b' int b = 'c'; // 100

Ad 3: Dlaczego wewnątrz swojego if'a 'alfabet[licznik]' masz w apostrofach?

Myślałem, że przyrównuję tu do znaku. uczono mnie, że znaki piszemy w ' '
Poza tym znika wtedy error "no match for operator ==

1

uczono mnie, że znaki piszemy w ' '

Literały znakowe (inaczej: stałe, np. 'x') - tak; z tym że nie masz tam literału znakowego (nie masz stałej), tylko masz wyrażenie zwracające znak - stąd nie powinno dookoła niego być '.

Powinieneś zmienić string alfabet[26]; na char alfabet[26]; (bo i przecież trzymasz tam pojedyncze znaki) oraz pisać normalnie if (slowo[for1] == alfabet[licznik]).

0
Patryk27 napisał(a):

uczono mnie, że znaki piszemy w ' '

Literały znakowe (inaczej: stałe, np. 'x') - tak; z tym że nie masz tam literału znakowego (nie masz stałej), tylko masz wyrażenie zwracające znak - stąd nie powinno dookoła niego być '.

Powinieneś zmienić string alfabet[26]; na char alfabet[26]; (bo i przecież trzymasz tam pojedyncze znaki) oraz pisać normalnie if (slowo[for1] == alfabet[licznik]).

Bardzo dziękuję za pomoc, wszystko działa. Zmieniłem alfabet z stringa na chara (oczywisty błąd już rozumiem) oraz wyrzuciłem apostrofy.

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