Pascal 如何找到给定字符串中的字数?

Pascal 如何找到给定字符串中的字数?,pascal,freepascal,turbo-pascal,Pascal,Freepascal,Turbo Pascal,我在用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

我在用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.

您可以使用两种状态(“内部单词”和“单词分隔符”)来实现该程序:

程序P1;
类型TState=(单词内,单词分隔符);
var-s:字符串;
i、 k:整数;
国家:TState;
开始
write('输入字符串:');readln(s);
k:=0;
状态:=字分隔符;
对于i:=1到长度do
开始
案件状态
内词:
开始
如果(s[i]='',则状态:=字分隔符;
终止
单词分隔符:
开始
如果(s[i]”,则开始
k:=k+1;
状态:=内部单词;
终止
终止
终止
终止
书写('字数',k);
终止

这里有一个解决方案,它将每个非字母视为单词分隔符:

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.
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.
程序P1;
变量
字数:整数;
insideWord,字母:布尔;
ch:Char;
开始
字数:=0;
insideWord:=假;
Write('输入字符串:');
Read(ch);
当你还没有开始的时候
letterRead:=(ch>='A')和(ch='A')和(ch在自由帕斯卡中,结构单元中有一个函数:

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

这是怎么失败的?你有没有试着“桌面检查”你的代码,假装是一台哑计算机,并像计算机一样执行程序的每一步?@JeffZeitlin在这件事上,程序只有在找到一个空格字符时才算,例如,如果我有字符串“我有4个苹果”计算的单词总数为3个,因为只有3个空格。也许你需要做的是(a)完善你如何定义一个单词,以及(b)找出你可以做什么来解释一个不以空格结尾的单词。这两个问题实际上是紧密相连的。你可能会发现并变得有用。你看到了吗?