Как посчитать все слова в текстовом файле с несколькими пробелами - PullRequest
1 голос
/ 03 июля 2019

Я пытаюсь написать процедуру, которая считает все слова в текстовом файле на Паскале. Я хочу, чтобы он обрабатывал несколько пробелов, но я понятия не имею, как это сделать.

Я попытался добавить булеву функцию Пробел, чтобы определить, является ли символ пробелом, а затем выполнить

while not eof(file) do
begin    
  read(file,char);
  words:=words+1;
  if Space(char) then
    while Space(char) do
      words:=words;

но это не работает, и в основном просто подводит итог моего (вероятно, плохого) представления о том, как должна выглядеть процедура. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 04 июля 2019

По сути, как отмечает Том в своем ответе, вам нужен конечный автомат с двумя состояниями In_A_Word и Not_In_A_Word, а затем считать каждый раз, когда ваше состояние изменяется с Not_In_A_Word на In_A_Word.

Нечто подобное (псевдокод):

var
  InWord: Boolean;
  Ch: Char;
begin
  InWord := False;
  while not eof(file) do begin    
    read(file, Ch);
    if Ch in ['A'..'Z', 'a'..'z'] then begin
      if not InWord then begin
        InWord := True;
        Words := Words + 1;
      end;
    end else
      InWord := False
  end;
end;
2 голосов
/ 04 июля 2019

Используйте переменную boolean, чтобы указать, обрабатываете ли вы слово.

Установите true (и увеличьте счетчик) на только первый непробельный символ.

Установите false на пробел.

0 голосов
/ 05 июля 2019

Другим методом может быть чтение всего файла в одну строку, а затем использовать следующие шаги для подсчета слов:

{$mode objfpc}
uses sysutils; 

var
  fullstr: string = 'this is   a     test  string. '; 
  ch: char;
  count: integer=0; 

begin 
  {trim string- remove spaces at beginning and end: }
  fullstr:= trim(fullstr); 

  {replace all double spaces with single: }
  while pos('  ', fullstr) > 0 do 
    fullstr := stringreplace(fullstr, '  ', ' ', [rfReplaceAll, rfIgnoreCase]); 

  {count spaces: }
  for ch in fullstr do
    if ch=' ' then 
      count += 1; 

  {add one to get number of words: }
  writeln('Number of words: ',count+1); 
end.

Комментарии в приведенном выше коде объясняют шаги.

Вывод:

Number of words: 5
...