程序,它接受用户输入的字符并按出现的降序显示它们



>"编写一个程序,该程序以用户输入的字符序列读取,并以句点('.'(终止。程序应允许用户通过按每行末尾的 Enter 键来输入多行输入。程序应打印出一个频率表,按出现次数降序排序,列出每个出现的字母及其发生的次数。必须忽略所有非字母字符。在句点 ('.'( 之后输入的任何字符都应保留在输入流中未处理。不得对输入的长度施加任何限制。

我不知道从哪里开始。到目前为止,这就是我想出的:

#include<iostream>
using namespace std;

int main(){

int count=0;
char ch[count];
int i=0;
cout<<"Enter a sequence of characters (end with '.'): ";
cin>>ch[count];
while(ch[count]!='.')
{
count++;
cin>>ch[count];

}
cout<<"There were "<<count<<" characters in the string"<<endl;
return 0;
}

现在程序接受用户输入并显示其中的字符数,但我无法让它显示任何字符,更不用说降序了。排序不是我的问题,我完全了解如何编程,但我无法显示存储在输入流中的字符。

我的导师建议我们使用结构,但现在我只需要一些方向。输出的格式应如下所示:

Enter a sequence of characters (end with '.'): do be Do bo. xyz

Letter:    Number of Occurrences
o     3
d     2
b     2
e     1

我不是要求任何人为我编码,我只是需要帮助从哪里开始,以及如何显示字符。我们不能使用字符串类,因此不能使用strlen()以外的任何字符串函数。

如果输入是从文本文件加载的,或者由在线判断或类似的东西检查,您可以一次读取一个字符(这是您将使用的(或读取整个块(更快的解决方案(一次加载整个输入,但这是一个旁注。

首先,我将首先在main开始时将此行添加到您的代码中

ios::sync_with_stdio(false);

这一行将使你的代码明显更快,因为C++的 I/O 不再与 C 的 I/O 同步,所以它消除了大量的开销,但请记住,如果你在该行之后混合两个 I/O 库,你会得到毫无意义的垃圾。

一旦 I/O 准备就绪,我将添加读取输入并计算发生的代码。为了实现这一点,你应该对一个特定的函数感兴趣 - get。现在你只需要一个大于 0 的整数数组(必须适合任何可能显示为输入的字符,字符集应该在某处指定,但 ASCII 的安全数字是 256(、一个循环、一个终止循环的条件(输入中的字符 =='.'(,你几乎完成了读取和计数(不需要任何函数!

毕竟,排序并没有那么可怕。在大多数情况下,气泡排序可能不是要走的路,但是有多少个字符?40岁左右?50岁左右?100-左右?除非超过 300-500 个字符,否则不值得实现 makind 有史以来最好的未知O(lgn)时间、O(1)空间、稳定的排序算法,因为它的平均性能可能比更简单的算法差。如果您想要重型算法,请查找合并排序或快速排序,或者寻找更简单的替代方案,例如气泡排序(最简单和最慢(或插入排序。

有两个部分需要解决。首先,逐个阅读字符,忽略任何非字母字符,并计算其他字符;其次,按降序打印分数。

第一部分可以通过简单地将字符视为 0 到 255 之间的 ASCII 值(即在无符号字符范围内(来解决,并为每个值提供一个计数数组。

其次,您可以简单地浏览计数,找到最大值,然后打印出来。继续此操作,直到考虑了所有值 0>。

请参阅说明此方法的以下代码:

#include <sstream>
int main() {
stringstream ss("do be Do bo. xyz");
unsigned char c;
unsigned int counts[256] = {0};
while (ss >> c && c != '.') {
if (! isalpha(c)) {
continue;
}
c = tolower(c);
counts[c]++;
}
while (1) {
// find next maximum
int max = 0;
int maxPos = -1;
for (int i=0; i<256; i++) {
if (counts[i] > max) {
max = counts[i];
maxPos = i;
}
}
if (max == 0) {
break;
}
else {
cout << (char)maxPos << ":" << max << endl;
counts[maxPos] = 0; // don't consider this pos in next run
}
}
}

输出:

o:3
b:2
d:2
e:1

最新更新