2017-06-04 102 views
0

String类型(从德国翻译成英文) 我需要在这个练习帮助:Exercice与帕斯卡尔

主题:字符串处理,用户可以对输入的句子简单的更改。

条件

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

该菜单包含以下项目,进入指定的信时,应执行:

A.输入句子

B.确定单词的数量

C.确定小于其序列字符的字符数

D.用句子中的所有单词替换其大写字母首字母

X.结束

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

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

在菜单点B中,块中所有单词的数量将被计数。为了简单起见,你可以假设两个单词之间总是有一个空格。在句子的开头和结尾没有空格。在计算之后输出字数(例如“The set is 4 words”)。

如果用户执行菜单项C,则逐个字符遍历该集合,并对每个字符检查它是否小于其尾随字符。这里是一个简单的字符比较(你也可以直接写''''<'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 
+0

此q似乎与您的https://stackoverflow.com/questions/44247115/exercise-with-type-string-in-pascal非常相似,但增加了一些代码,与SO更适合。项目D是什么造成你的困难?通常,学生发现将输入分解成单词是困难的部分。大多数pascal实现包括将字符串转换为大写或小写的函数,并且使用它们是微不足道的。你在使用哪种帕斯卡尔实现? – MartynA

+0

既然已经关闭,我无法添加评论。 我在继续删除每个单词中的字母而不删除第一个字母并结束“重复”功能方面存在问题 –

+0

我想我已经想出了如何在每个单词中删除字母(从倒数第二个到最后一个),但我仍然不知道如何“结束”重复功能 –

回答

0

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

虽然你一直这样做,我一直在写下面的答案,并且,当我 已经完成它,我想我会在这里发布它,告诉你另一种方式 去解压缩的问题字符串中的单词。有几十种方式来完成这项任务,但我希望我使用的方法相当容易遵循 。

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

首先要做的是从输入中提取一个单词。所以,第一件事 我写的是一个函数,ExtractFirstWord它返回输入字符串中第一个字,不管输入中是否包含空格,并且还返回 a 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。尝试 联机帮助中寻找它,并有一个关于如何使用它 做任务事情。

+0

实际上,我们只能使用插入,复制,删除,pos,长度。使用其他程序,串接入(如起价[1]),并宣布新的字符串类型的变量是被禁止的,而我们还没有学会如何使用一种像“ExtractFirstWord”功能。 –