Zliczanie 0 i 1 w ciągu znaków

0

Witam,
Zapewne problem jest trywialny, jednak jestem początkującym i serdecznie proszę o pomoc przy zadaniu:
Otóż muszę napisać program, który na wejściu przyjmuje łańcuch znaków składający się z “0” i “1”, następnie zlicza powtarzalność np. jeśli na wejściu jest : “0011101” to na wyjściu powinno pojawić się:

0[2]
1[3]
0[1]
1[1]
0

Z czym masz problem? Pokaż co już napisałeś.

0
kq napisał(a):

Z czym masz problem? Pokaż co już napisałeś.

Mam pomysł jak to zrobić, jednak nie wiem jak poprawnie to napisac. Chcę aby na wstepie programu wprowadzić rozmiar tablicy i jej wartości, następnie (wydaje mi sie, ze najodpowiedzniejsze do tego bedzie if) sprawdzić każdy element tablicy czy jest true czy false i jakoś je zsumować. Jak już wpomniałem jestem początkującym i nie bardzo wiem z czym to się je. Przyznam, że łatwiej będzie mi przeanalizować gotowy kod, by móc zrozumieć konstrukcje i działanie.

1

Nie potrzebujesz do tego tablicy – iteruj po ciągu znaków i inkrementuj licznik jeśli kolejne znaki są takie same. Gdy napotkasz na inny, wyświetl bieżący stan licznika na ekranie, następnie wyzeruj go i licz od nowa.

Nie chce mi się już myśleć nad implementacją, bo język C nie jest moją mocną stroną, ale w Pascalu można to napisać kilkoma linijkami kodu (w C pewnie wyjdzie jeszcze krótszy):

procedure PrintDigits(AChar: PChar);
var
  Digit: PChar;
  Count: Integer;
begin
  while AChar^ <> #0 do
  begin
    Digit := AChar;
    Count := 0;

    while AChar^ = Digit^ do
    begin
      Count += 1;
      AChar += 1;
    end;

    WriteLn(Digit^, '[', Count, ']');
  end;
end;

https://ideone.com/De69xi

Do rozwiązania Twojego problemu można użyć implementacji algorytmu RLE, tyle że na ekranie wyświetla się inaczej sformatowane dane. W razie czego, w sieci znajdziesz mnóstwo gotowców.


Late edit: odpowiednik powyższej procedurki w C:

void printDigits(char* curr)
{
    char* digit;
    int count;
    
    while(*curr != 0)
    {
        digit = curr;
        count = 0;
        
        while(*curr == *digit)
        {
            count++;
            curr++;
        }
        
        printf("%c[%u]\n", *digit, count);
    }
}

http://cpp.sh/9atma

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