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

question-closed Program rekurencyjny w języku C

Object Storage Arubacloud
+1 głos
336 wizyt
pytanie zadane 8 grudnia 2018 w Sprzęt komputerowy przez Dominik Walczak Początkujący (380 p.)
otagowane ponownie 8 grudnia 2018 przez Dominik Walczak

Witam !

Potrzebował bym pomocy w napisaiu programu w języku C, gdzie przy pomocy fukcji rekurencji program zliczałby ilość wyrazów zawartych w zdaniu. Przykład:

Marysia ma kota

Zdanie liczy: 3 wyrazy

Takie coś powinno być pomocne:

int rec_count(char*tekst){

   if tekst == null return 0

   char* tmp = jakas metoda która odejmuje pojedzyńczy wyraz z tekstu 

   return 1+rec_counttmp

}

 

 

 

komentarz zamknięcia: zakończone
komentarz 8 grudnia 2018 przez Arkadiusz Waluk Ekspert (287,950 p.)
Proszę nie usuwać treści swoich pytań.

3 odpowiedzi

0 głosów
odpowiedź 8 grudnia 2018 przez RafalS VIP (122,820 p.)

Rekurencja jest tu troche na siłe, więc napisałem to z maksymalnym wykorzystaniem rekurencji (wykorzystaniem pamięci na stosie).

Program opiera sie na założeniu, że w napisie jest ilosc_spacji + 1 slow - czyli ze nie ma wielokrotnych spacji i każdy znak/ciag znaków oddzielony spacjami jest wrazem:

int ile_wyrazow(const char* napis) {
	if (*napis == '\0') {
		return 1;
	}
	else if (*napis == ' ') {
		return 1 + ile_wyrazow(++napis);
	}
	else return ile_wyrazow(++napis);
}

int main() {
	printf("%d ", ile_wyrazow("Polska dla polaków, ziemia dla ziemniaków"));
}

 

0 głosów
odpowiedź 8 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)
edycja 8 grudnia 2018 przez mokrowski

Hmm.. Niby można... 

#include <stdio.h>
#include <stdlib.h>

size_t word_count(const char * msg, unsigned count)
{
    return !msg ? 0 : !*msg ? count : \
        word_count(msg + 1, count + (!count && *msg) + ((*msg) == ' '));
}

int main(void)
{
    const char * msg_table[] = {
        "Marysia ma Rysia.",
        "Abelard Giza.",
        "Ni",
        NULL
    };
    size_t length = sizeof(msg_table) / sizeof(msg_table[0]);
    size_t i;
    for (i = 0; i < length; ++i)
    {
        printf("Zdanie: \"%s\", jest %zu słów/słowa.\n",
                msg_table[i], word_count(msg_table[i], 0));
    }

    return EXIT_SUCCESS;
}

.. zawsze się trochę "powygłupiać". Ale tak pisać raczej się nie powinno.

0 głosów
odpowiedź 8 grudnia 2018 przez Marcin Siniarski Gaduła (4,420 p.)

Udało napisać mi się taką funkcje. Opiera się o tablicę ASCII. Nie jest ograniczona kilkoma spacjami naraz. Znaki specjalne także są uznawane

Funkcja będzie zwracać w ten sposób
 (Kropki oznaczają brak zwracanej wartości) 
......1..1.....1
Marysia ma kota\0
......1..1....10
Marysia ma kota \0
..1....1
abc  def\0

size_t wordCount(const char* word, unsigned int progress) {

    //Dla czytelności
    const char* curr = word + progress;
    const char* next = word + progress + 1;
                                                             // Moja logika po angielsku
    if(((*curr) >= 33 && (*curr) <= 126) && (*next) == '\0') // If current char is A-z and next char is null byte (end)
        return 1;                                            // Count it as word
    else if((*curr) == ' ' && (*next) == '\0')               // If current char is space and next char is null byte (end)
        return 0;                                            // Dont count spaces before null byte (end)
    else if((*curr) != ' ' && (*next) == ' ')                // If current char is not space  and next char is space
        return 1 + wordCount(word, progress + 1);            // Count 1 word and process next char
    else                                                     // If in the middle of the word or multiple spaces occured
        return wordCount(word, progress + 1);                // Process further
}

 

komentarz 8 grudnia 2018 przez mokrowski Mędrzec (155,460 p.)

Sprawdź przypadki:

1. Przesłanie wskaźnika word na NULL.

2. Przesłanie napisu składającego się z 1 litery. 

Zerknij na wyłuskania curr i next. 

W przypadku 1 masz w na next nieprawidłową arytmetykę wskaźnika. Elementu next może nie być. Dodatkowo w if'ie masz wtedy próby wyłuskania z NULL (a to jest UB) oraz next (także).

W przypadku 2 masz w if'ie wyłuskanie z next które jest UB. Arytmetyka wskaźnika jest ok ale próba wyłuskania z elementu poza tablicą jest UB.

Detekcja znaków sterujących/specjalnych pomysł dobry.

Podobne pytania

–2 głosów
5 odpowiedzi 1,689 wizyt
0 głosów
1 odpowiedź 584 wizyt
pytanie zadane 27 listopada 2018 w Inne języki przez BlvckFox Gaduła (4,240 p.)
0 głosów
0 odpowiedzi 920 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez Tomek Wilnowski Użytkownik (610 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

61,959 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...