Program który sprawdza ile razy dany element się powtórzył w tablicy

0

Witam!
Mam za zadanie zrobić program który sprawdza ile razy dany element się powtórzył w tablicy.
W szkole napisali takie coś

unsigned char tab[N];
int histogram[256];

for(int i=0; i<256; i++)
          histogram[i]=0
for(i=0; i<N; i++)
          histogram[int tab[i]]++;

A ja nic z tego nie rozumiem. Mógłby ktoś mi to jakoś łopatologicznie wytłumaczyć.

0

Hmmmm... Mamy Ci tłumaczyć absolutne podstawy? Nie lepiej byłoby jednak się czegoś nauczyć, np. wziąć do ręki tę książkę i poczytać?
No ale ok.

Tworzysz N-elementową tablicę o nazwie tab, przechowującą ośmiobitowe liczby całkowite bez znaku (0-255).
Tworzysz 256-elementową tablicę o nazwie histogram, przechowującą liczby całkowite ze znakiem.
W pierwszej pętli for jedziesz po wszystkich elementach tablicy histogram i ustawiasz ich wartości na 0.
W drugiej pętli for masz błąd składni, ale zakładam że jedziesz po wszystkich elementach tablicy tab. Wartości jej elementów są traktowane jako indeksy tablicy histogram. Zatem kiedy pod indeksem M tablicy tab znajdzie się wartość 42, to wartość w tablicy histogram pod indeksem 42 jest zwiększana o jeden (autoinkrementacja).

0

Co do książki do czytam "Jezyk C - Szkola Programowania Prata". To co napisałeś, to wytłumaczyłeś mi każdą linijkę po kolei. Tyle to jeszcze umiem, ale jak to się dzieje że ten program sprawdza czy dany element się powtórzył. Ja to widzę tak że np. pierwszy element tab[N] to 'a'(97 ASCII), skoro pierwsza pętla ustawia zera pod każdym indexem od 0 do 255, a w drugie to 'a' zamieniane na int czyli na 97, to element numer 97 który jest równy 0 zostaje zwiększony o 1 czyli ten element będzie wynosił 1. Jak dla mnie ten program nic sensownego nie robi, dlatego proszę o jakieś w

0

No to właśnie tak działa. To jest histogram. Jeśli Ci się gdzieś indziej w tab pojawi ponownie 97, to wartość pod indeksem 97 w histogram zostanie zwiększona ponownie o jeden i będzie wynosiła 2. Czyli elementy o wartości 97 wystąpiły w tab dwa razy (dotychczas).

0

Teraz to rozumiem

0

Sorki że jeszcze męczę w tym temacie ale próbowałem ostatnio wyświetlić ten histogram i mam taki problem,
mianowicie jak w tablicy powtarza się jakiś symbol to pisze go tylko raz
np. Symbol $ powtarza się 8 razy
i jak następnym razem natrafi na ten symbol to go pomija
bo ja ma na razie coś takiego

Symbol $ powtarza się 8 razy
Symbol $ powtarza się 8 razy
Symbol ^ powtarza się 2 razy
Symbol $ powtarza się 8 razy

0

Bez sensu, w histogramie symbol ma się właśnie nie powtarzać. Coś źle zrobiłeś.

0

Jeśli nie zmieniałeś algorytmu, to w histogramie nie mogą Ci się "powtarzać symbole", gdyż są one indeksami tablicy. Indeksy, jak zapewne zdajesz sobie sprawę, są unikalne. Prawdopodobnie masz błąd w kodzie wypisującym histogram. Na oko wygląda mi to na skakanie w te i nazad po tablicy zamiast jechać po kolei. Musiałbyś wkleić kod.

0

Jednej rzeczy tu nie rozumiem. Z tego co napisałeś wnioskuje że powinienem wyświetlić indeks żeby mi się tak nie powtarzało.
Wiem dlaczego u mnie się powtarza, tylko nie mogę nic wymyślić żeby to zmienić.

for(i=0; i<N; i++)
                printf("Znak %c powtuzyl sie %d razy\n", tab[i], histogram[(int)tab[i]]);
0

Nie iteruj po tekście wejściowym tylko po histogramie? o_O

0

Daj cały kod programu.

0
#include <stdio.h>
#define N 10

int main(void)
{
        unsigned char tab[N];
        int histogram[256];
        int i;

        for(i=0; i<256; i++)
                histogram[i]=0;
        for(i=0; i<N; i++)
                histogram[(int)tab[i]]++;

        for(i=0; i<N; i++)
                printf("Znak %c powtuzyl sie %d razy\n", tab[i], histogram[(int)tab[i]]);
        system("pause");
        return 0;
}
0

histogram[int tab[i]]++;
Co to w ogóle jest?

0
histogram[(int)tab[i]]++;

ponieważ tablica histogram jest wyzerowana to bierze znak z tab[N] zamienia go na int czyli odpowiednik kod ASCII i wykorzystuje go jako indeks.
Czyli jak mam dwa pierwsze znaki 'a' 'a' kod ASCII 97 to idzie na miejsce o indeksie 97 i zwiększa jego wartość o 1 czyli z 0 zwiększa na 1 i potem to samo, drugi znak 'a'
i 1 zwiększa na 2

0

Chodziło mi o to, że nie było nawiasu w pierwszym kodzie.

0

Ja bym tak zrobił:

#include <stdio.h>
#define N 10
 
int main(void)
{
        unsigned char tab[N];
        int histogram[256];
        int i;
 
        for(i=0; i<256; i++)
                histogram[i]=0;
        for(i=0; i<N; i++)
                histogram[(int)tab[i]]++;
 
        for(i=0; i<256; i++)
        {
                if(histogram[i])
                printf("Znak %c powtorzyl sie %d razy\n", (char)i, histogram[i]);
        }
        system("pause");
        return 0;
}
0

kurde, jeszcze raz:

#include <stdio.h>
#define N 10
 
int main(void)
{
        unsigned char tab[N];
        int histogram[256];
        int i;
 
        for(i=0; i<256; i++)
                histogram[i]=0;
        for(i=0; i<N; i++)
                histogram[(int)tab[i]]++;
 
        for(i=0; i<256; i++)
        {
                if(histogram[i] != 0)
                printf("Znak %c powtorzyl sie %d razy\n", (char)i, histogram[i]);
        }
        system("pause");
        return 0;
}
0

Sprawdza po kolei 255 znaków i jeżeli się jakiś powtórzył, to wypisuje, że się powtórzył ileś tam razy.

0

Ale jak to sprawdza, nie widzę tego, jest to w printfie, więc niby czemu sprawdza, ja tam ciągle widzę tylko wypisywanie i dokładnie nawet nie wiem czego.
Widziecie e nie rozumiem tego, więc proszę na piszcie to wprost jak to zrobić, albo przynajmniej piszcie jaśniej. A z kodu powyżej nie wiem dlaczego jest (char)i

0

Tutaj sprawdza:

for(i=0; i<N; i++)
                histogram[(int)tab[i]]++;

W tablicy tab masz na przykład wyraz "Programmer".
Pętla przechodzi 10 razy od znaku "p" do "r".
W histogramie zwiększasz o jeden element tablicy o indeksie danego znaku ((int)tab[i]).
Na przykład "P" castowane na int to 80, czyli histogram[80]++.

0

Przecież ja napisałem że nie wiem co to jest to (char)i, opisałeś linijkę którą sam wyjaśniłem wyżej

0

Mogę liczyć na waszą pomoc czy mam sobie poszukać innego miejsca?

0

Ten cast z int na char nie jest tutaj potrzebny, bo i tak printf wyświetli go jak pojedynczy znak traktując jak char. Nie umiem prościej.

0
 for(i=0; i<256; i++)
        {
                if(histogram[i] != 0)
                printf("Znak %c powtorzyl sie %d razy\n", (char)i, histogram[i]);
        }

jak dla mnie wyświetla po kolei to co jest pod kodem ASCII 0 potem 1 potem 2 i tak dalej.
Program działa jak trzeba a nie wiem dlaczego.

0

histogram jest typu int, a tab - char. Nie możesz wrzucić chara do inta, więc musisz zrzutować tab na int. (int)tab czyli tab będzie "przekonwertowany" na inta. /Na inną część kodu popatrzyłem

0

Co?

0
Foxtrot napisał(a):
 for(i=0; i<256; i++)
        {
                if(histogram[i] != 0)
                printf("Znak %c powtorzyl sie %d razy\n", (char)i, histogram[i]);
        }

jak dla mnie wyświetla po kolei to co jest pod kodem ASCII 0 potem 1 potem 2 i tak dalej.
Program działa jak trzeba a nie wiem dlaczego.

Nie wyświetla po kolei każdego znaku, tylko te, które były w danym ciągu znaków...

0

kolega wwerwer napisał tak

#include <stdio.h>
#define N 10
 
int main(void)
{
        unsigned char tab[N];
        int histogram[256];
        int i;
 
        for(i=0; i<256; i++)
                histogram[i]=0;
        for(i=0; i<N; i++)
                histogram[(int)tab[i]]++;
 
        for(i=0; i<256; i++)
        {
                if(histogram[i] != 0)
                printf("Znak %c powtorzyl sie %d razy\n", (char)i, histogram[i]);
        }
        system("pause");
        return 0;
}

i za cholera nie wiem jak działa ten printf, co robi (char)i.

I Proszę o jedno, Żebyście powiedzieli co to robi. Myślałem że zrobię to w 1h może 2 a tu już 5h mija i ciągle nie wiem.
I błagam napiszcie to wprost bo nic nie rozumiem co gadacie. To co dla was jest proste nie musi być dla innych.

0

Jak dalej nie wiesz o co chodzi, to napisz program od nowa. Jeżeli znowu nie wiesz, to napisz dokładne pytanie.

0

i za cholera nie wiem jak działa ten printf, co robi (char)i.

printf wyświetla tekst w konsoli.
(char)i - rzutujesz liczbę całkowitą "i" na znak. Na przykład, jeżeli:

i = 80;
// to...
char znaczek = (char)i; // czyli char znaczek = 'P';

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