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ąć..
liczenie wyrazów, c#
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
- Rejestracja: dni
- Ostatnio: dni
- Postów: 214
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ł.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
static uint LiczbaWyrazow(string napis)
{
uint wyrazy = 1;
for (int i = 0; i < napis.Length; i++)
{
if (napis[i] == ' ')
{
wyrazy++;
}
}
return wyrazy;
}
- Rejestracja: dni
- Ostatnio: dni
- Postów: 214
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?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 214
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 60
Z tego co się orientuję to separatory to: , : ; ! - . ' " ?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 4883
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 214
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)
- Rejestracja: dni
- Ostatnio: dni
- Postów: 72
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;
}
}