【问题标题】:How can I find the number of words in a given string?如何找到给定字符串中的单词数?
【发布时间】:2020-11-02 01:50:50
【问题描述】:

我正在尝试在 Pascal 中查找给定字符串中的单词数?

这是我的初学者代码:

Program P1;
 var s:string;
     i,k:integer;
 begin
   write('Enter a string:  '); readln(s);
   k:=0;
   for i:=1 to length(s) do
    begin
        if(s[i] = ' ') then k:=k+1;
    end;
    write('Number of words ', k);
end.

【问题讨论】:

  • 这是怎么失败的?您是否尝试过“桌面检查”您的代码,假装自己是一台愚蠢的计算机,并以计算机的方式执行程序的每一步?
  • @JeffZeitlin 事情,程序仅在找到空格字符时才计数,例如,如果我有字符串“我有 4 个苹果”,则总​​计数单词将为 3,因为只有 3 个空格
  • 那么也许你需要做的是 (a) 改进你如何定义一个词,并且 (b) 弄清楚你可以做些什么来解释一个不以空格结尾的词。这两个问题实际上是密切相关的。
  • 您可能会发现Regular Expressionsthis StackOverflow question 很有用。

标签: pascal freepascal turbo-pascal


【解决方案1】:

在 Free Pascal 中,strutils 单元中有一个wordcount 函数:

uses strutils;
var s : string;
begin 
  write('Enter a string:  '); readln(s);
  writeln('Number of words: ',wordcount(s,[' ','.',',']));
end;

【讨论】:

    【解决方案2】:

    您可以将程序实现为finite-state machine,具有两种状态(“内部单词”和“单词分隔符”):

    Program P1;
     type TState = (INSIDE_WORD, WORD_SEPARATOR);
     var s:string;
         i,k:integer;
         state: TState;
     begin
       write('Enter a string:  '); readln(s);
       k:=0;
       state := WORD_SEPARATOR;
       for i:=1 to length(s) do
        begin
            case state of
            INSIDE_WORD:
              begin
                if (s[i] = ' ') then state := WORD_SEPARATOR;
              end;
            WORD_SEPARATOR:
              begin
                if (s[i] <> ' ') then begin
                  k:=k+1;
                  state := INSIDE_WORD;
                end;
              end;
            end;
        end;
        write('Number of words ', k);
    end.
    

    【讨论】:

      【解决方案3】:

      这是一个将每个非字母都视为单词分隔符的解决方案:

      PROGRAM P1;
      
          VAR
              wordCount: Integer;
              insideWord, letterRead: Boolean;
              ch: Char;
      
      BEGIN
          wordCount := 0;
          insideWord := FALSE;
          Write('Enter a string:  ');
          Read(ch);
          WHILE NOT EoLn DO BEGIN
              letterRead := (ch >= 'A') AND (ch <= 'Z') OR (ch >= 'a') AND (ch <= 'z');
              IF NOT insideWord AND letterRead THEN
                  Inc(wordCount);
              insideWord := letterRead;
              Read(ch)
          END;
          WriteLn('Number of words: ', wordCount)
      END.
      

      【讨论】:

        猜你喜欢
        • 2020-03-15
        • 1970-01-01
        • 2018-02-28
        • 2012-09-21
        • 2020-10-07
        • 1970-01-01
        • 1970-01-01
        • 2015-02-08
        • 2012-07-07
        相关资源
        最近更新 更多