在Pascal中使用String类型的练习

时间:2017-06-04 19:45:14

标签: string pascal

(从德语翻译成英语) 我在这个练习中需要帮助:

线程:字符串处理用户可以对输入句子进行简单的更改。

条件

程序显示一个菜单供用户选择以下操作。在操作完成后再次显示,直到用户终止程序(因此需要循环)。

该菜单包含以下项目,这些项目应在输入指定的字母时执行:

一个。输入句子

B中。确定单词数

℃。确定小于其序列字符的字符数

d。用大写首字母替换句子中的所有单词

X。端

如果用户输入不同的字母,则不会发生任何操作或再次输出菜单。

如果选择了菜单项A,则会发出提示以输入读入字符串变量的集合。菜单项B,C和D的操作无法更改此变量!有可能。必须事先在另一个字符串变量中准备该集的副本。

在菜单点B中,计算块中所有单词的数量。为简单起见,您可以假设两个单词之间总有一个空格。句子的开头和结尾没有空格。在计算之后输出单词的数量(例如,"该集合是4个单词")。

如果用户执行菜单项C,则逐个字符地遍历该集合,并且对于每个字符检查它是否小于其尾随字符。这是一个简单的字符比较(你也可以直接写一些像' 1'<' d')。然后输出如此找到的字符数(例如,"在句子中找到的13个字符小于尾随字符")。

在菜单项D中,遍历句子并且其中包含的每个单词都被其大写的初始字符替换。大写当然只有在第一个字符是字母时才会出现,否则字符保持不变。您可以假设句子永远不会以空格开头或结尾。在两个单词之间总是只有一个空格,所以它应该在首字母之间。例如,来自" 123好心情"变成" 1 G L"。

这里不允许逐件建立一个全新的弦乐!相反,你应该使用pos,copy,length,delete和insert在原始句子的副本上循环工作!它也被禁止收集"字符串开头或结尾的初始字符;这些应该直接插入到相应单词位置的字符串中!

此外,在菜单点D处无法访问字符串,因为此处将明确地使用字符串例程。如果已输入记录,则只能选择菜单项B,C和D.否则在菜单中输入B,C或D时没有任何反应或输入错误信息,菜单再次输出。

对菜单项B,C或D的每次调用将始终对用户输入的原始集合起作用,而不是对先前已执行的菜单项已经更改的集合起作用!

再次输入菜单项A,可以用新的块覆盖输入的块。

使用' X'用户可以终止程序。

在预定义的字符串函数的任何地方使用,不要自己用难度循环等编写它!但是,禁止使用strreplace或reverseString函数!

这是我的工作到现在为止,我只对D部分有问题:

     program Project2;
        {$APPTYPE CONSOLE}
        {$R *.res}

        uses
        System.SysUtils;

        const
          lz = ' ';

        var
  Satz: string;
  Buchstabe: char;
  i, p, j, zaehler2, index, count: integer;

 writeln('A) Write Sentence');
readln(Satz);

      'D':
        begin
          index := 2;
         insert(lz, Satz, length(Satz)+1);
          count := (pos(lz,Satz));
          repeat
            delete(Satz, index,(count - index));
            index := index + 2;
           count := pos(lz,copy(Satz,index,(length(Satz)-index)))+index-1;
          until  ;
         writeln(uppercase(Satz));
        end

1 个答案:

答案 0 :(得分:0)

我很高兴你找到了自己的解决方案,干得好!

虽然你一直这样做,但我一直在写下面的答案,就像我一样 已经完成了,我想我会在这里发布它以向你展示另一种方式 解决从字符串中提取单词的问题。有 有几十种方法可以完成这项任务,但我希望我使用的方法是公平的 很容易理解。

也许你遇到问题的原因是你的字符串索引 表达式有点太复杂了。我打赌如果你在6个月内回到你的代码 它需要你一段时间来弄清楚应该做什么和更长的时间 告诉它是否真的这样做。避免这样的问题的关键 是将你的代码分解成更容易遵循和更容易的chucks 去测试。所以不要只告诉你repeat条件应该是什么, 我会告诉你一种更容易理解的方法。

首先要做的是从输入中提取一个单词。所以,第一件事 我写的是一个函数,ExtractFirstWord返回第一个单词 输入字符串,无论输入是否包含空格,还返回 一个Remainder字符串,它是剩下的字符串或第一个字符串之后的输入字符串 单词(以及紧随其后的任何空格已被删除)。这个完成了 使用一些简单的while循环,这些循环被编码为跳过前导空格 然后从后面的非空格字符构建一个字符串。

代码

const
    lz = ' ';

  var
    Satz: string;
    FirstWord : String;
    Remainder : String;

function ExtractFirstWord(const InputStr : String; var Remainder : String) : String;
var
  P : Integer;
  WordStart : Integer;
begin
  Result := '';
  P := 1;
  //  The following skips over any spaces at the start of InputStr
  while (P <= Length(InputStr)) and (InputStr[P] = lz) do
    Inc(P);

  //  Now we know where the first word starts
  WordStart := P;

  //  Now we can get the first word, if there is one
  while (P <= Length(InputStr)) and (InputStr[P] <> lz) do
    Inc(P);
  Result := Copy(InputStr, WordStart, P - WordStart);

  Remainder := Copy(InputStr, P, Length(InputStr));
  //  the following is one way to remove spaces at the start of Remainder
  while (Length(Remainder) > 0) and (Remainder[1] = lz) do
    Delete(Remainder, 1, Length(lz));
  //  instead you could do something simlar to the first `while` loop above
end;

begin
  Satz := ' cat dog ';
  repeat
    FirstWord := ExtractFirstWord(Satz, Remainder);
    FirstWord := UpperCase(FirstWord);
    Satz := Remainder;
    writeln('First word: ', FirstWord, ' remainder: ', Remainder);
  until Remainder = '';
  readln;
end.

这种特殊的做法并不适合其他要求 在您的任务中指定但应该很容易适应它们。例如,单词的上半部分可以在输入字符串上“就地”完成,方法是在第二个While循环中对其当前字符进行上限。

顺便说一句,如果您使用的是Delphi或Free Pascal / Lazarus,那就更简单了 从字符串中提取单词的方法。它使用TStringList。尝试 在在线帮助中查找并了解如何使用它 做任务。