• 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

Cloud VPS
+1 głos
691 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 (290,290 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 (158,840 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 (158,840 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 2,413 wizyt
0 głosów
1 odpowiedź 770 wizyt
pytanie zadane 27 listopada 2018 w Inne języki przez BlvckFox Gaduła (4,240 p.)
0 głosów
0 odpowiedzi 1,204 wizyt
pytanie zadane 21 listopada 2017 w C i C++ przez Tomek Wilnowski Użytkownik (610 p.)

93,456 zapytań

142,451 odpowiedzi

322,721 komentarzy

62,837 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

Kursy INF.02 i INF.03
...