• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Funkcja rekurencyjna ze wskaźnikiem na tablice

Mały hosting, OGROMNE możliwości
0 głosów
1,440 wizyt
pytanie zadane 6 listopada 2016 w C i C++ przez Sprite77 Nowicjusz (170 p.)

Stworzyłem funkcję która ma liczyć ile liter jest w tablicy i zwracać tą wartość. Niestety za każdym razem wywołania funkcji wychodzą jakieś losowe liczby. Dodam jeszcze, że funkcja ma być stworzona rekurencyjnie. Oto jak to zrobiłem: 

#include <iostream>

#define SIZE 30

using namespace std;

int ile_znakow(char *tab)
{
	static int znakow = 0;

	if (tab[0] != '0')
	{
		znakow++;
		return znakow + ile_znakow(tab + 1);
	}

	return znakow;
}

int main()
{
	char tab1[SIZE] = { "ala" };
	char tab2[SIZE] = { "ma" };
	char tab3[SIZE] = { "kota" };
	char tab4[SIZE] = { "i" };
	char tab5[SIZE] = { "psa" };

	cout << ile_znakow(tab1) << endl;
	cout << ile_znakow(tab2) << endl;
	cout << ile_znakow(tab3) << endl;
	cout << ile_znakow(tab4) << endl;
	cout << ile_znakow(tab5) << endl;

	return 0;
}

Co można by tutaj poprawić, co jest źle? Z góry dziękuję za odpowiedź!

1
komentarz 6 listopada 2016 przez criss Mędrzec (172,570 p.)
if (tab[0] != '0')

Raczej chodziło o '\0'.

PS: Dlaczego zmienna znakow jest statyczna? Mam nadzieje, że wiesz do czego static służy?

komentarz 6 listopada 2016 przez Sprite77 Nowicjusz (170 p.)
wtedy wyrzuca

12
15
45
20
52

co wciąż niestety nie jest poprawne ;C
komentarz 6 listopada 2016 przez JAKUBW Nałogowiec (33,470 p.)

A poza tym czemu static?

static int znakow = 0;

 

komentarz 6 listopada 2016 przez Sprite77 Nowicjusz (170 p.)
Użyłem static żeby wartość dla zmiennej znakow się zmieniała bo dodaje tylko w warunku if.

Chyba, że to tak nie działa.
2
komentarz 6 listopada 2016 przez criss Mędrzec (172,570 p.)
static (użyte w funkcji) sprawia, że zmienna podtrzymuje swoją wartość przez cały czas działania programu (nie jest zmienną lokalną). Tym samym każde wywołanie funkcji korzysta z tej samej zmiennej. Stąd za duże wyniki.
komentarz 6 listopada 2016 przez criss Mędrzec (172,570 p.)

Poza tym: tab[0] jest troche mylące. Lepiej pisz *tab. To samo, ale lepiej obrazuje co chcesz osiągnąć. Oczywiście mówie tylko o tym konkretnym przypadku. 

komentarz 6 listopada 2016 przez Sprite77 Nowicjusz (170 p.)
Dzięki wielkie za pomoc, teraz wszystko działa. Jak zwykle jakiś głupi błąd się wkradł i straciłem na to dużo czasu. Na początku miałem samo int ale miałem coś innego złego w kodzie zmieniłem na static poprawiłem tamten błąd i dalej miałem źle, dlatego szukałem pomocy tutaj. Jeszcze raz wielkie dzięki!

2 odpowiedzi

+2 głosów
odpowiedź 6 listopada 2016 przez criss Mędrzec (172,570 p.)
wybrane 6 listopada 2016 przez Sprite77
 
Najlepsza
Po prostu zamień '0' na '\0' (znak oznaczający koniec łańcucha znaków) i wyrzuć słowo static.
+2 głosów
odpowiedź 6 listopada 2016 przez Ditrix Mądrala (5,650 p.)

Ponieważ sprawdzasz czy dana litera nie jest zerem, a nie znakiem końca wierszu. Osobiście zrobiłem w ten sposób i działa

if (tab[x] != '\0')

 

komentarz 6 listopada 2016 przez Sprite77 Nowicjusz (170 p.)
u mnie wtedy wyrzuca

12
15
45
20
52

a powinno:

3

2

4

1

3

i dlaczego tab[x]?
1
komentarz 6 listopada 2016 przez Ditrix Mądrala (5,650 p.)

Tak jak koledzy napisali wyżej. Wyrzuć static. Funkcja ile_znaków() wywoływana jest także sama w sobie, dlatego jej inkrementacja wykonuje się troszkę więcej razy ;)

Ogólnie zrobiłem w taki sposób, stąd te tab[x] ^^

int ile_znakow(char *tab, int x)
{
    int znakow = 0;

    if (tab[x] != '\0')
    {
        znakow++;
        return znakow + ile_znakow(tab, x+1);
    }

    return znakow;
}

 

komentarz 19 października 2019 przez niezalogowany
edycja 19 października 2019

trzy lata myślałem i tak może jeszcze bardziej rekurencyjnie

#include <iostream>

int count_char (const char * sentence,int n=0) {
    if (*sentence);
        else return n;
        count_char (++sentence,++n);
}

using namespace std;
int main() {
    char * a ="ala";

    cout<< count_char(a)<<endl;
    cout<< count_char(a,count_char(a))<<endl;
    return 0;
}

edit:: co by było całkiem poprawnie

unsigned int count_char (const char * sentence,int n=0) {
    if (!sentence[0]) return n;
    count_char (++sentence,++n);
}

 

Podobne pytania

0 głosów
1 odpowiedź 4,014 wizyt
pytanie zadane 4 marca 2018 w C i C++ przez bartez86 Nowicjusz (220 p.)
0 głosów
1 odpowiedź 292 wizyt
0 głosów
0 odpowiedzi 894 wizyt

93,715 zapytań

142,629 odpowiedzi

323,259 komentarzy

63,255 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...