(从德语翻译成英语) 我在这个练习中需要帮助:
线程:字符串处理用户可以对输入句子进行简单的更改。
条件
程序显示一个菜单供用户选择以下操作。在操作完成后再次显示,直到用户终止程序(因此需要循环)。
该菜单包含以下项目,这些项目应在输入指定的字母时执行:
一个。输入句子
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
答案 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。尝试 在在线帮助中查找并了解如何使用它 做任务。