Rekurencyjne zliczenie znaków.

0

Witam. Mam taki problem. Mianowicie chodzi mi o to, że potrzebuję napisać program, który po wczytaniu pliku tekstowego dokona zliczenia znaków.

Nie chodzi o to, żeby on zliczał wszystkie znaki. Plik, który zostanie wczytany to "mapa". Jest to mapa 10x10. Składająca się z 1 i 0. Wygląda to mniej więcej tak:
0000000000
0011100000
0011100000
0000011100 (...)
Dalszego fragmentu nie rysuję, bo chyba rozumiecie?. Jestem początkującym programistą, a zadanie mam to narzucone odgórnie. Dlatego MUSZĘ użyć rekurencji. Czas mnie goni, a poradniki nie pomagają. Rekurencję niby rozumiem, ale tak niecałkowicie. Jakby ktoś mógł mi pomóc napisać funkcję, która rekurencyjnie zliczyłaby jedynki. Ale chodzi też o to, że: wśród tych zer wytworzy się np 5 skupisk jedynek. Funckja ta ma zliczać każde "skupisko" jedynek oddzielnie. A następnie ma wyrzucić ile razy takie pola z jedynkami się pojawiły i ile tych jedynek było w każdym polu. (gdy pola stykają się tylko rogami, to są to już 2 oddzielne pola). Wiem, że nie zadałem konkretnego pytania, ale po prostu nie mam pojęcia jak się za to zabrać. Z wyświetleniem mapy nie mam problemu. Problem zaczyna się przy rekurencji.

Jak bym mógł prosić o jakieś przykłady. Coś podobnego do tego, co ja mam wykonać. Ja nic nie mogłem znaleźć :( Nie chcę gotowców, tylko podpowiedzi, bo chcę się tego programowania nauczyć, ale po prostu idzie mi to dość oporowo (nie wiem, może nie mam do niego talentu(?)) Proszę o wszelkie wskazówki.
[PROGRAM MUSZĘ NAPISAĆ W ANSI C]
Z góry dzięki!
Begginer.

P.S WITAM WSZYSTKICH!

0

Zrób to bez rekurencji, a my to przerobimy.

1

Można tu zastosować algorytm "pożar prerii". Wypełnia on wszystkie pola figury o dowolnym kształcie ograniczonej granicą. Idea jest taka, że jeżeli badane pole jest tym, którego szukamy to zostaje wypełnione i przechodzi się do pól sąsiadujących bokami (lub również wierzchołkami) z polem wypełnionym. Algorytm się kończy, gdy pola sąsiadujące nie odpowiadają kryteriom wyszukiwania. Tyle teorii. W praktyce (dla tego zadania) funkcja wyszukująca może wyglądać tak:

#define LICZBA_WIERSZY      10
#define LICZBA_KOLUMN       10
#define SZUKANE_POLE        '1'
#define ZNALEZIONE_POLE     '.' //lub inny znak, którego nie ma w mapie

void szukaj_jedynki(char mapa[LICZBA_WIERSZY][LICZBA_KOLUMN], int wiersz, int kolumna, int* do_znalezionych)
{
    if(mapa[wiersz][kolumna] == SZUKANE_POLE)
    {
        mapa[wiersz][kolumna] = ZNALEZIONE_POLE;
        *do_znalezionych += 1;
        if(kolumna < LICZBA_KOLUMN - 1)
            szukaj_jedynki(mapa, wiersz, kolumna + 1, do_znalezionych);
        if( wiersz < LICZBA_WIERSZY - 1)
            szukaj_jedynki(mapa, wiersz + 1, kolumna, do_znalezionych);
        if(kolumna > 0)
            szukaj_jedynki(mapa, wiersz, kolumna - 1, do_znalezionych);
        if( wiersz > 0)
            szukaj_jedynki(mapa, wiersz - 1, kolumna, do_znalezionych);//ta instrukcja może być niepotrzebna
    }
}

Wskaźnik do_znalezionych musi wskazywać na zewnętrzą zmienną, aby podczas zwijania stosu wywołań nie otrzymać pierwszej zapisanej wartości. Po zakończeniu funkcji możesz odczytać liczbę jedynek w skupisku:

int liczba_jedynek;
//...
liczba_jedynek = 0;//konieczne zerowanie przed przekazaniem do funkcji  szukaj_jedynki();
szukaj_jedynki(mapa, wiersz, kolumna, &liczba_jedynek);
fprint("%d", liczba_jedynek);

Zmienne wiersz i kolumna zawierają współrzędne pola, od którego rozpoczyna się wszukiwanie.

Oczywiście to nie rozwiązuje twojego zadania. Potrzebna będzie jeszcze jedna funkcja (z iteracją po mapie lub rekurencyjna), która zapisze zwrócone wyniki z funkcji szukaj_jedynki() do tablicy z liczebnością skupisk i zwróci liczbę skupisk. Na upartego można to zrealizować w funkcji szukaj_jedynki(), ale wówczas byłaby to funkcja realizująca zbyt wiele zadań.

0

Dzięki wielke. Spróbuję się z tym pobawić i może mi się uda.

Jak mam być szczery to całe to programowanie idzie mi dość opornie. Jak na razie uczę się ANSI C i PHP. ANSI C z przymusu a PHP z własnej woli.

Co do tego ANSI C to właśnie to sprawia mi największe problemy. Czytam jakąś książkę. Niby napisana prostym językiem, ćwiczę te ich zadania, ale to i tak nie są łatwe rzeczy. A zadania jakie narzucają na nas po miesiącu studiów są, że tak powiem... high level. Coś się komuś chyba pomieszało i zapomniał, że my dopiero zaczynamy przygodę z programowaniem.

1
Begginer napisał(a):

... że tak powiem... high level ...

To zadanie uważasz za high level ?
Może dopóki nie jest za późno zmień kierunek na jakieś dziennikarstwo (posty smarować ci się udaje).

0

Nie uważam tego za high lvl w stosunku do całości programowania. Uważam to za high level jeśli chodzi o początkującego programistę. Jeśli na wykładach mieliśmy początki wskaźników i tablic, a na labolatoriach każe nam pisać takie zadanie, to myślę, że nie na tym rzecz polega. Dlatego stwierdziłem, że ćwiczenie to osiąga wysoki poziom w stosunku do wiedzy jaką posiadają studenci ci którzy zabawę z programowaniem zaczynają od zera. Bo z tego co się orientuję to w podstawówce, gimnazjum czy chociażby liceum nie uczą nas jak napisać funckję rekurencyjną, a ja idąc na studia nie mam obowiązku znać całość materiału, żeby sobie później go odświeżyć wraz z wykładowcami i odebrać papierek. Gdybym to umiał to siedziałbym teraz w domu.
Ciekawe jakbyś ty poszedł studiować język chiński a na 4. zajęciach miałbyś napisać chociażby kartkę z pamiętnika w języku chińskim. Dla Ciebie byłby to high level, dla kogoś kto uczył się chińskiego jakiś czas przed Tobą byłaby to błachostka.

Na dziennikarstwo nie pójdę, skończę informatykę żeby złamać stereotyp informatyków jaki ty reprezentujesz.

I ty naprawdę myślisz, że zależy mi na ilości postów tutaj? Będę offtopować, żeby być pierwszy w rankingu na forum? Proszę Cię. Nie rozśmieszaj mnie. Napisałem, żeby się coś poradzić. Ale skoro wszystko jest tutaj odbierane jako offtop... So sorry. Liczyłem, że trafiłem na NORMALNE forum z NORMALNYMI ludźmi. Ty mnie przekonałeś, że źle wybrałem.
Peace.

0

Uczysz się programowania przynajmniej pół semestru ile czasu potrzebujesz aby przejść od choinek drukowanych gwiazdkami do wyszukiwaniu w tablicy?
Zauważ w niesłusznej sprawie walnąłeś od niechcący cztery akapity - idź na dziennikarstwo.

0

Jak to pół semestru?
Minął dopiero październik, więc uczę się pierwszy miesiąc. Nie jest kwestią jak ile czasu ja potrzebuję na naukę, tylko ile czasu potrzebują wykładowcy, żeby tego uczyć.

Mi chodzi tylko o to, że:

  1. Na wykładach robimy małe kroczki, a na labolatoriach w porównaniu do tego robimy wielkie kroki. Ot tylko tyle. To tak jakby z dzieckiem w podstawówce przerobić dodawanie i odejmowanie, a na sprawdzianie wymagać całek. Po prostu nie współgra to czego nas uczą z tym czego od nas wymagają i tyle. Dlatego to jest HIGH LEVEL. Wiecej nic nie piszę, bo znowu powiesz, żebym szedł na dziennikarstwo.
0

A koniecznie Ci to potrzebne. @_13th_Dragon na rację. Programowanie... jak zaczniesz - zrozumiesz.Nie dla wszystkich. Ale, po co się męczyć - rób to co lubisz. Ja lubię.

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