3

因此,我一直在寻找解决一个问题的方法,即一个步骤涉及计算每个唯一字母的频率。我去的每个地方都有相同的数组增量器。我没有看到这个表格,也没有完全理解它。我试图找到该格式的支持文档,但无法弄清楚它的实际作用。我可以让它工作;但是,我不确定每个 peice 代表什么。

Peice 我在理解这里括号内发生的事情时遇到了问题。

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

其中频率是一个数组

示例来自:count 字符出现在数组中的次数?

算法:

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

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

任何帮助理解将不胜感激。

4

3 回答 3

4

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

于 2013-03-10T15:06:11.237 回答
2

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

toupper简单地将传递给它的任何字符转换为大写。鉴于上述假设,从中减去,将计算出到给定字母'A'的“距离” 。'A'也就是说,如果new_letter'A',则结果为0。如果是'b',则结果为1。如您所见,使用的原因toupper是为了使其独立new_letter于是大写还是小写。

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

于 2013-03-10T15:09:28.670 回答
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'- 这首先将任何字母变成大写字母 - 所以我们不关心它是否是aor A, 'c' orC等​​,然后减去字母表中第一个字母的值,'A'。这意味着如果new_letter'A'索引为零。如果new_letter'G'我们使用索引 7 等 [这假设所有字母都是连续的,这不是绝对确定的,并且可以肯定的是,如果我们谈论的语言不是英语,例如 ä、ǹ、Ë 或 ê,等作为语言的一部分,那么那些肯定不会跟随 AZ]

如果您要手动计算一段文本中的字母数量,您可以将所有字母 AZ 列在纸的边缘,然后在阅读文本时在每个字母旁边画一个点,然后然后计算点的数量。这做同样的事情,除了它在你进行时保持每个计数运行。

于 2013-03-10T15:12:07.357 回答