解释频率[到上(new_letter) - 'A']++;

Explaining frequency[toupper(new_letter) - 'A']++;

本文关键字:letter 频率 到上 new 解释      更新时间:2023-10-16

所以我一直在寻找一个问题的解决方案,这个问题的一个步骤是计算每个唯一字母的频率。我所到之处都有相同的数组增量器。我还没有看到这个表单,也不完全理解它。我试图找到该格式的支持文档,但不知道它到底做了什么。我可以让它工作;然而,我不确定每一个peice代表什么。

Peice我对括号内的内容理解有问题。

frequency[toupper(new_letter) - 'A']++;

其中频率是阵列

例如:计算一个字符在数组中出现的次数?

算法:

  • 打开文件/读一封信
  • 搜索新字母的字母数组
  • 如果存在新字母:增加的频率槽那个字母:frequency[toupper(new_letter(-'A']++;如果新缺少字母,请将其添加到数组中,并将频率设置为1
  • 处理完所有字母后,打印出频率阵列:`

    cout<lt;'A+索引<lt;":"<lt;frequency[index]<lt;endl;

任何有帮助的理解都会非常感激。

这只是一个数组。也许让你困惑的是toupper(new_letter) - 'A',我们在这里所做的是——我们将字母转换为大写,然后从结果的ASCII码中减去'A'的ASCII码。因此,结果是范围[0-25]中的数字。然后,通过将其添加到'A'中,我们得到原始大写字符。至于算法的其余部分,这只是计数排序。

不幸的是,这个解决方案不是完全可移植的。它假设在执行字符集中,大写字母A-Z具有连续值。也就是说,它假设'A' + 1等于'B''B' + 1等于'C',依此类推。这不一定是真的,但通常是。

toupper只是将传递给它的任何字符转换为大写。在给定上述假设的情况下,从中减去'A',将计算出从'A'到给定字母的"距离"。也就是说,如果new_letter'A',则结果将为0。如果是'b',则结果为1。正如您所看到的,使用toupper的原因是使其独立于new_letter是大写还是小写。

这个结果(本质上是字母在字母表中的位置(然后用于访问数组。如果frequency是一个由26个int组成的数组(每个字母一个(,您将访问相应的int。然后该int被递增。

如果它是array(例如int frequency[26];(,那么我们不添加到数组中——它已经存在,但值为零。

++操作员是add one to the thing的短手操作员,因此

frequency[toupper(new_letter) - 'A']++;

与相同

frequency[toupper(new_letter) - 'A'] = frequency[toupper(new_letter) - 'A'] + 1;

显然,短手版本更容易阅读,因为需要仔细检查两侧是否相同的重复次数要少得多,等等。

索引是toupper(new_letter) - 'A'——这是通过首先将任何字母变成大写字母来实现的——所以我们不在乎它是a还是A、"c"还是C等,然后减去字母表中第一个字母的值'A'。这意味着,如果new_letter'A',则索引为零。如果new_letter'G',我们使用索引7等。[这假设所有字母都是顺序的,这不是绝对确定的,当然,如果我们谈论英语以外的语言,例如ä、ǹ、宋体或ê等作为语言的一部分,那么这些肯定不会跟随A-Z]

如果你要手工计算一段文字中的字母数量,你可以沿着纸的边缘列出所有字母a-Z,然后在阅读文字时在每个字母旁边放一个点,然后计算点的数量。这做了同样的事情,只是在你进行的过程中保持每个计数。