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

时间:2013-03-10 15:02:51

标签: c++ arrays

所以我一直在寻找一个问题的解决方案,一步涉及计算每个独特字母的频率。我到处都有相同的数组递增器。我没有看到这种形式,也没有完全理解它。我试图找到格式的支持文档,但无法弄清楚它实际上做了什么。我可以让它工作;但是,我不确定每个peice代表什么。

Peice我有问题理解是这里的括号里面发生了什么。

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

频率是数组

来自count number of times a character appears in an array?

的示例

算法:

  • 打开文件/读一封信。
  • 搜索新信件的字母数组。
  • 如果新信件存在:增加频率槽 那封信:频率[toupper(new_letter) - 'A'] ++;如果是新的 字母丢失,添加到数组并将频率设置为1.
  • 处理完所有字母后,打印出频率数组:`

    cout<< 'A'+    index<< “:”<<频率[指数]<< ENDL;

任何帮助理解都会得到很多帮助。

3 个答案:

答案 0 :(得分:4)

这只是一个数组。也许令你困惑的部分是toupper(new_letter) - 'A'我们在这里做的是 - 我们将字母转换为upercase,然后从结果的ASCII代码中减去'A'的ASCII代码。因此,结果是[0-25]范围内的数字。之后,通过将其添加到'A',我们得到origianl大写字符。至于算法的其余部分 - 这就像counting sort

答案 1 :(得分:2)

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

toupper只是将传递给它的任何字符转换为大写字母。鉴于上述假设,从中减去'A'将得出"距离"从'A'到给定的信件。也就是说,如果new_letter'A',则结果为0.如果为'b',则结果为1.如您所见,使用{{1}的原因}是为了使toupper是大写还是小写是独立的。

然后使用此结果(基本上是字母表中字母的位置)来访问数组。如果new_letter是一个包含26个frequency s(每个字母一个)的数组,您将访问相应的int。然后int递增。

答案 2 :(得分:1)

如果它是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'还是{{ 1}}等,然后减去字母表中第一个字母的值C。这意味着如果'A'new_letter,则索引为零。如果'A'new_letter,我们使用索引7等[这假设所有字母都是连续的,这不是绝对肯定的,当然,如果我们谈论的是英语以外的其他语言例如ä,ǹ,Ë或ê等作为语言的一部分,那些肯定不会跟随AZ]

如果你要手工计算一段文字中的字母数,你可以只列出纸张边缘的所有字母AZ,然后在每个字母旁边放一个点,当你在文本,然后计算点数。这也是同样的事情,除了它随着你的进展保持每个计数运行。