Вот,
на мой взгляд, хорошее решение:
Код
program for_cool;
var s : string;
i : integer;
in_word : boolean;
count : integer;
const letters : set of char = ['a'..'z', 'A'..'Z'];{Сюда добавить еще русские буквы}
begin
count:=0; in_word:=false;
readLn(s);
for i:=1 to length(s) do
begin
if (s[i] in letters) and (not in_word) then
begin
in_word:=true; inc(count)
end
else if not (s[i] in letters) and in_word then
begin
in_word:=false
end
end;
writeLn(count)
end.
В отличие от варианта с удалением двойных пробелов этот алгоритм сделает все за один проход, а не будет сначала сто раз бегать по строке в поисках пробелов, а потом еще и считать их. Ну и со знаками препинания всякими вроде нет проблем
Тесты (мало тестил, лень
qwe rty f a v<десяток пробелов>
ответ - 5
<много пробелов> kdfjgh<много пробелов> dhgf sd<много пробелов> n, re,,,,<табуляции всякие>dsdf
ответ - 6
<табуляция>srughsfigh<еще табуляция>ifu jfhgaj tieuyt , , , , , , ,f
ответ - 5
Вот по поводу последнего теста: отдельно стоящая буква - тоже слово?
А вопрос,
по-моему, можно и в
FAQ какой-нибудь сунуть