您好,我正在尝试生成用户输入长度的随机数组。然后我的数组应该打印并显示数组中这些字母的出现。到目前为止,这只打印到字母 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/