3.5.1 实例: 删除重复单词
当我们想将一个新的值放入一个对象, 就需要赋值操作。当你考虑赋值操作时, 很明显它在多次重复做一些事情时赋值是最有用的。当我们想以一个不同的值重复做某事时, 我们需要进行一次赋值。让我们来看一个小的程序, 它在一连串单词中找到相邻的重复字符。这段代码是大多数的语法检查程序的一部分:
由于它没有告诉我们重复单词在文本中的哪个位置出现, 因此这个程序对我们并不是很有帮助, 但是现在它够用了。我们从如下一行开始逐行分析这个程序:
这是一个字符串变量, 我们使用它来读取当前(即最近阅读)的单词:
这个结构称为一个while语句, 它对右侧的程序结构感兴趣, 我们将在4.4.2.1节中详细介绍。while的意思是当输入操作cin>>current成功的情况下, (cin>>current)后面的语句将反复执行, 而cin>>current成功的条件是从标准输入中读取字符。记住, 对于一个string, >>读取的是用空格分开的单词。你可以通过给程序一个终止输入符号(通常是指文件结尾)来终止这个循环。在Windows系统的计算机中, 使用Ctrl+Z(同时按Control和Z)紧接着一个回车。在UNIX或Linux系统的计算机中, 使用Ctrl+D(同时按Control和D)。
因此, 我们所做的是读取一个单词到current, 然后将它与前一个单词(存储在previous中)比较。如果它们是相同的, 我们将会:
然后, 我们准备好对下一个单词重复进行上述操作。我们通过将current单词拷贝到previous中来进行这个操作:
这可以处理我们开始后的所有情况。当第一个单词没有前一个单词可以比较时, 这段代码将会如何处理呢?这个问题可以在定义previous时得到解决:
""只包含一个字符(空格字符, 通过按键盘中的空格键来得到)。输入操作符>>会跳过空格, 我们不可能通过输入得到它。因此, 第一次执行while语句时, 检测
失败(正如我们所希望的)。
理解程序流程的一种方式是“推演计算机的运行”, 也就是按程序的顺序逐行执行指定的工作。在一张纸上画出很多方块, 然后在里面写入程序运行的结果。按程序指定的方式修改储存在其中的值。
试一试你亲自用一张纸来执行这个程序。输入是“The cat cat jumped”。即使是有经验的程序员, 当某段代码不那么清晰时, 也会用这种技术来推演其结果。
试一试运行“重复单词检测程序”。用句子“She she laughed He He He because what he did did not look very very good good”来测试它。这里有多少个重复的单词?为什么?在这里, 单词的定义是什么?重复单词的定义又是什么?(例如, “She she”是否重复?)