“编写一个程序,读取用户输入的一系列字符,并以句点 ('.') 结束。您的程序应该允许用户通过按 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()
以外的任何字符串函数。
最佳答案
如果输入是从文本文件加载的或由在线判断或其他东西检查的,您可以一次读取一个字符的输入(这就是您将使用的)或读取整个 block (更快的解决方案)类似于一次加载整个输入,但这是旁注。
首先,我会在 main
ios::sync_with_stdio(false);
这一行将使您的代码显着更快,因为 C++ 的 I/O 不再与 C 的 I/O 同步,因此它消除了显着的开销,但请记住,如果您混合使用这两个 I/O,您将得到无意义的垃圾该行之后的 O 库。
一旦 I/O 准备就绪,我将添加读取输入并对出现次数进行计数的代码。为此,您应该对一个特定功能感兴趣 - get .现在你只需要一个大于 0 的整数数组(必须适合任何可能作为输入出现的字符,字符集应该在某处指定,但对于 ASCII 来说安全数字是 256),一个循环,一个条件终止循环(char from input == '.'
),你几乎完成了阅读和计数(不需要它的功能!)。
排序毕竟没那么可怕。在大多数情况下,冒泡排序可能不是可行的方法,但是有多少个字符呢? 40岁左右? 50岁左右? 100 左右?除非你超过 300-500 个字符,否则不值得实现有史以来最好的 O(lgn)
时间,O(1)
空间,稳定的排序算法因为它的平均性能可能比更简单的算法差。如果您想要重型算法,请寻找合并排序或快速排序,或者寻找更简单的替代方案,例如冒泡排序(最简单且最慢)或插入排序。
关于c++ - 接受用户输入的字符并按出现的降序显示它们的程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51031284/