liczenie wyrazów, c#

0

Stwórz funkcję uint IleWyrazow2(string napis) , która zwraca liczbę wyrazów znajdujących się w tekście napis. Wyrazy w tekście mogą być oddzielone dowolnym ciągiem znaków-separatorów (np. dwie spacje, wielokropek, etc.). Należy zaimplementować własny algorytm, nie korzystając z funkcji klasy string (np. Split, Contains, etc.).
Jak na razie udało mi się stworzyć program liczący wyrazy oddzielone spacją ale w tym wypadku nie mam pomysłu jak to ogarnąć..

0

Skoro ci się udało to stworzyć to wrzuć jak to wygląda a my może coś doradzimy. Bo teraz to wygląda jakbyś po gotowca przyszedł.

0
static uint LiczbaWyrazow(string napis)
        {
            uint wyrazy = 1;
            for (int i = 0; i < napis.Length; i++)
            {
                if (napis[i] == ' ')
                {
                    wyrazy++;
                }
            }
            return wyrazy;
        }
0

Hmm tak się zastanawiam o co chodzi w tym poleceniu i wydaje mi się ,że wyraz powinien składać się z liter lub cyfr cała reszta to są wyrazy. Chociaż czy cyfry to wyraz? No właśnie nie wiem.

Ale według ascii litery masz od 65-90 i od 97-122 tylko ,że to bez polskich znaków. Pytanie czy są one wymagane?

0

tak. wydaje mi się, że cyfry to też wyraz

0

Nie wiem zadanie jest bardzo źle sformułowane. Bo co jest separatorem? Zinterpretuj to sam i napisz mi listę separatorów. Chociaż to powinno być jasno w zadaniu sformułowane.

0

Z tego co się orientuję to separatory to: , : ; ! - . ' " ?

0

ktoś coś? :D

1

Sprawdzasz czy znak zawiera się w literach

(character >= 'a' && character <= 'z' ) ||
(character >= 'A' && character <= 'Z' )

Jeżeli nie i wyraz nie jest pusty (tak by dwa separatory nie liczył jako wyraz) to jest to nowy wyraz

Przeczytaj komentarze do tego posta, w zależności od interpretacji jest tam lepsze rozwiązanie

2
 static uint LiczbaWyrazow(string napis)
        {
            uint wyrazy = 1;
            bool repeat = true;
            foreach (char sign in napis)
            {
                if (sign == ' ' || sign == '.' || sign == '!' || sign == '?')
                {
                    if (!repeat) ++wyrazy;
                    repeat = true;
                }
                else repeat = false;                  
            }
            if (repeat) --wyrazy;
            return wyrazy;
        }

Nie wiem co mi się w tym kodzie nie podoba ale czuję ,że nie jest to optymalny kod. A i zmień sobie nazwy na angielskie bo ja kopiowałem twój kod. Ale pisanie po polsku to zła praktyka. (oczywiście pomijam to ,że jest on nieoptymalny bo nie użyłem gotowych funkcji o ,które aż się prosiło)

1

Może coś takiego?

public static class StringExtensions
{
    public static IEnumerable<string> GetWords(this string input)
    {
        return Regex.Matches(input, @"[\p{L}]+").Cast<Match>().Select(x => x.Value);
    }
}

Przykład online

Bez wykorzystania klasy String:

public static class StringExtensions
{
    public static int CountWords(this string input)
	{
		var words = 0;
		var insideWord = false;
		
		foreach (var ch in input)
		{
			if (char.IsLetter(ch))
			{
				if (!insideWord)
				{
					insideWord = true;
					words++;
				}
			}
			else
			{
				insideWord = false;
			}
		}
		
		return words;
	}
}

Przykład online

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