c++ - 生成随机字母数组并计算出现次数

标签 c++ arrays random frequency srand

您好,我正在尝试生成用户输入长度的随机数组。然后我的数组应该打印并显示数组中这些字母的出现。到目前为止,这只打印到字母 g,并且出现的次数不正确。如果有人能告诉我我做错了什么,那会有很大帮助。谢谢。

#include <iostream>
#include <cstring>
#include <ctime>
#include <cstdlib>

using namespace std;


int main()
{
    srand(time(0));
    int i, num;
    char ch;
    char chars[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    int freq[26]={0};
    cout << "How many letters do you want in your string? ";
    cin >> num;

    for (i=0; i < num; i++)
    {
        ch = chars[rand()%26];
        chars[i]=ch;
        freq[i] +=1;
        cout << ch;
    }

    for (char lower = 'a'; lower <='z'; lower++)
    {
        cout << "\nLetter" << lower << "is " << freq[lower] << "times";
    }
}

最佳答案

问题1

线条

chars[i]=ch;
freq[i] +=1;

不对。您需要使用:

int index = ch - 'a';
freq[index] += 1; 

问题2

用于打印数据的 for 循环中的索引也不正确。

你需要使用:

for (char lower = 'a'; lower <='z'; lower++)
{
    int index = lower - 'a';
    cout << "\nLetter" << lower << "is " << freq[index] << "times";
}

重要提示

值得注意的是,C++标准并不保证小写字母是连续的。 (感谢@MartinBonner)。例如,如果您的系统使用 EBCDIC encoding你的程序将无法运行。

为了使您的代码健壮,最好使用 std::map

int main()
{
    srand(time(0));
    int i, num;
    char ch;
    char chars[]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

    std::map<char, int> freq;

    // Initialize freq.
    for ( ch : chars )
    {
       freq[ch] = 0;
    }

    cout << "How many letters do you want in your string? ";
    cin >> num;

    for (i=0; i < num; i++)
    {
        ch = chars[rand()%26];
        freq[ch] +=1;
    }

    for (auto item : freq )
    {
        cout << "\nLetter" << item.first << "is " << item.second << "times";
    }
}

关于c++ - 生成随机字母数组并计算出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58772468/

相关文章:

c++ - 具有确定性程序的未定义行为

python - 如何匹配实际上是随机的字符串?

java - 随机化 ArrayList 中的项目子集

c++ - 使用 OpenCV 和机器学习的简单对象检测

c++ - 强制 QObject 作为 QWidget 的父级会产生什么后果?

c++ - 从 vector 创建 EPS,C++

Android NDK - 在 Visual Studio 中添加更多目标 API 级别

c# - C# 中的数组写入是原子的吗?

c++ - 将一个数组中的字符替换为另一个数组中的字符串

javascript - 百分比分布 - JavaScript Math.random()