所以我一直在寻找一个问题的解决方案,一步涉及计算每个独特字母的频率。我到处都有相同的数组递增器。我没有看到这种形式,也没有完全理解它。我试图找到格式的支持文档,但无法弄清楚它实际上做了什么。我可以让它工作;但是,我不确定每个peice代表什么。
Peice我有问题理解是这里的括号里面发生了什么。
frequency[toupper(new_letter) - 'A']++;
频率是数组
来自count number of times a character appears in an array?
的示例算法:
处理完所有字母后,打印出频率数组:`
cout<< 'A'+ index<< “:”<<频率[指数]<< ENDL;
任何帮助理解都会得到很多帮助。
答案 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,然后在每个字母旁边放一个点,当你在文本,然后计算点数。这也是同样的事情,除了它随着你的进展保持每个计数运行。