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

标签 c++ struct find-occurrences

“编写一个程序,读取用户输入的一系列字符,并以句点 ('.') 结束。您的程序应该允许用户通过按 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/

相关文章:

c++ - 扩展此程序以计算最大 10x10 矩阵的逆矩阵的最简单方法是什么?

c++ - GLM 随机数生成器的线性程度如何?

c - 结构数组 - C 中的内存释放

c - 链接列表元素未显示

notepad++ - 在Notepad++中进行智能突出显示时显示出现次数

linux - 找到出现的次数并将其添加到模式旁边

c++ - cocos2d-x 中的鼠标/触摸坐标

C - 创建和使用结构数组?错误 : expected identifier or '(' before '[' token

java - 字符串中第 N 次出现的字符并获取值

c++ - 分配 std::shared_ptr