Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Как подсчитать количество слов в строке ?

Автор: Крутой 5.12.2003 22:11

Ребята, помогите подсчитать количество слов в строке ??
Слова (группы символов) разделены пробелами (одним или несколькими -- в этом и загвоздка)..... :-[

Автор: trminator 5.12.2003 22:22

Можно просто сначала удалить повторяющиеся пробелы

Код

while pos('  ', mystring > 0 do delete(mystring, pos('  ', mystring, 1)

и пробелы в начале строки и в конце строки, а затем посчитать количество пробелов и прибавить единичку. Но это не лучший способ.

Автор: GLuk 6.12.2003 1:40

А ежели без удаления, дык это просто смотреть строку в прямом направлении и ПРОПУСКАТЬ повторяющиеся пробелы.

Автор: error_404 6.12.2003 7:27

и ещё отсеивать отдельно стоящие знаки препинания, предлоги и пр. муру... мне это на лабе было лениво делать....

Автор: trminator 6.12.2003 13:35

Вот, на мой взгляд, хорошее решение:

Код

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.

В отличие от варианта с удалением двойных пробелов этот алгоритм сделает все за один проход, а не будет сначала сто раз бегать по строке в поисках пробелов, а потом еще и считать их. Ну и со знаками препинания всякими вроде нет проблем
Тесты (мало тестил, лень smile.gif
qwe rty f   a v<десяток пробелов>
ответ - 5

<много пробелов> kdfjgh<много пробелов> dhgf sd<много пробелов> n, re,,,,<табуляции всякие>dsdf
ответ - 6

<табуляция>srughsfigh<еще табуляция>ifu jfhgaj tieuyt , , , , , , ,f
ответ - 5

Вот по поводу последнего теста: отдельно стоящая буква - тоже слово?

А вопрос, по-моему, можно и в FAQ какой-нибудь сунуть

Автор: Крутой 6.12.2003 15:15

ВО-РЕРВЫХ, СПАСИБО ВСЕМ ЗА ОТВЕТЫ!!! :D
ВО-ВТОРЫХ,trminator, у меня к тебе пару вопросов:
первый: кто такой "ИМХО" И ЧТО ТАКОЕ "ЧАВО"?
второй: что такое in_word и почему он в цикле вдруг станет true??
я полагаю,это проверка на то , были ли введины символы?
(извини с булями я не силен)???

Автор: KRUTOY 6.12.2003 17:54

:P ВСЁ ПРОСТО ,КАК ПРАВДА!!

Код
uses crt;
var st: String;
  prob: Char;
  p,n,i,k: Integer;
begin
clrscr;
writeLN('введите строку: ');
readln(st);
k:=1;
p:=length(st);
while k<p do
begin
p:=length(st);
inc(n);
if st[n] = ' ' then k := n+1;
if st[k] = ' ' then begin
delete(st,n,1);
dec(n);
end;
end;
if st[1] = ' ' then delete(st,1,1);
i:= length(st);
if st[i]= ' ' then delete(st,i,1);
write(st);
readkey
end.

Автор: trminator 6.12.2003 20:56

Цитата
кто такой "ИМХО" И ЧТО ТАКОЕ "ЧАВО"?

Подправил текст сообщения, чтобы понятней было. ИМХО = "In my humble opinion" - по моему скромному мнению, ЧаВо - Часто Задаваемые Вопросы (и ответы на них), FAQ (кто мне скажет, как читается слово FAQ? Фак?)
Цитата
что такое in_word и почему он в цикле вдруг станет true?

in_word - признак того, что ты сейчас находишься внутри слова (s[i] - часть слова). Если наткнулись на букву и при этом до этого еще не находились внутри слова, значит, вошли в слово, и надо его посчитать.

А последняя программа не выдает, сколько же там слов...

Автор: KRUTOY 6.12.2003 21:36

Понятненько,
Да, но это легко сделать !!

Автор: trminator 6.12.2003 21:57

Цитата
ЭТО ЛЕГКО СДЕЛАТЬ!

Мне показалось, что ты хочешь все же посчитать количество пробелов. Но если это действительно так, то нужно
Цитата
...ещё отсеивать отдельно стоящие знаки препинания <...> и пр. муру...

Правда, я и сам это предлагал, но тогда я не подумал о "пр. муре" sad.gif

Автор: KRUTOY 6.12.2003 22:13

trminator ;D, ладненько с этим я разобрался-- помоги мне с файлами, если не в тягость, дружище? 8)

Автор: EC 15.12.2013 4:46

Program STROKI_3;
Var f: string; i,s: integer;
Begin
cls; writeln(' подсчет слов в фразе'); writeln;
writeln('введи фразу (слова с пробелами)'); readln(f);f:=f+' ';
s:=0;
for i:=1 to ord(f[0]) do
if f[i]=' ' then if f[i-1]<>' ' then s:=s+1 ;
writeln('всего слов: ',s)
end.


Не забываем пользоваться тэгами!

Автор: APAL 17.12.2013 19:56


ord(f[0]) аналогично Length(f)
обращение к 0-му элементу не во всех компиляторах "пройдет" (например pascalAPC.net)