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ąć..
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ł.
static uint LiczbaWyrazow(string napis)
{
uint wyrazy = 1;
for (int i = 0; i < napis.Length; i++)
{
if (napis[i] == ' ')
{
wyrazy++;
}
}
return wyrazy;
}
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?
tak. wydaje mi się, że cyfry to też wyraz
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.
Z tego co się orientuję to separatory to: , : ; ! - . ' " ?
ktoś coś? :D
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
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)
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);
}
}
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;
}
}