我是这里的新手,并且对编程非常陌生,而且在我花时间搜寻互联网和此站点的所有时间中,我似乎都找不到我的这个问题的答案。我需要从字符列表中随机选择一个元素并将其打印出来,然后以用户输入的次数重复此操作。我正在尝试制作一个文本生成器,用于使用单个键而不是单词进行打字练习。 (是的,我知道我参加“正确键入”聚会的时间太晚了,但是我对编码的尝试使我看到它比我想象的要有用。)
到目前为止,我基本上已经找到了使用迭代器来连续打印列表中所有元素的答案,这不是我想要的。我还经常遇到人们说使用向量而不是列表的情况,但是我开始学习的C ++书籍并没有涉及很多“太高级”的内容,因此我被困在那儿。虽然使用列表对我来说似乎是个好主意,但这可能只是我的初学者。数组对于我想完成的任务来说太死板了,因为如果用户可以在此程序的更高版本中输入他们想要的键,而不仅仅是像我第一次尝试的那样编码它们,那将会更多理想。
但是无论如何,我的程序现在看起来像这样:
// Version 1
// Text Generator for Typing Practice with Individual Keys:
// For inputting into typing practice programs/sites with "insert your text" fields.
// Generates a random list of letters from a list of known keys,
// that only displays up to a user-entered amount of characters,
// separated into paragraphs.
#include <iostream>
#include <cstdlib>
#include <list>
#include <ctime>
using namespace std;
int main () {
//Declare variables used below
int x = 0;
int list_size = 0;
int p = 0;
// Add new letters to the list below as you learn them!
list <char> Keys_Known = {' ', ' ', ' ', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 'e', 'r', 'u', 'i'};
// Define function(s) used below
char get_Text(); {
for (int i = 0; i <= x; ++i) { // For x amount of times
p = srand(time(nullptr)) % list_size;
// Randomly choose a character from the list by its index,
// limited to the total number of elements in the list,
cout << Keys_Known[p];
// and finally output the letter value of the index.
}
}
// Get and set list_size here
list_size = Keys_Known.size();
cout << "Enter total number of characters wanted: " << endl;
cin >> x;
// Set x to the total number of characters wanted in your practice text.
// Maybe about 100 is good? ((Try with 10 for testing!))
cout << get_Text() << "/n" << get_Text() << "/n";
// Print two blocks of random text separated into paragraphs.
return 0;
}
我不断在int p和int list_size的类型上遇到错误,而%s不起作用,这通常是我限制随机数范围的方式。 Eclipse还告诉我,我什么也不能说'Keys_Known []',因为它不知道[]应该意味着什么。我什至尝试在其中放置一个0,但它仍然表现为无法使用索引。我是否缺少'#include'标头?
我得到的确切错误是:
“对于二进制'operator%'第29行C / C ++问题,类型为'void'和'int'的类型无效的操作数”
和:
“与'operator []'不匹配(操作数类型为'std :: __ cxx11 :: list'和'int')第33行C / C ++问题”
任何帮助将不胜感激,谢谢!
答案 0 :(得分:0)
std::list
不是随机访问容器。因此,您可能无法使用Keys_Known[p]
来访问元素。
您可以使用数组或std::vector
。
一个数组可以很好地满足您的需求。
您尝试做的事情不够清晰-至少意图没有翻译成代码。从a good book了解该语言的基础知识将很有帮助。
这是您的代码,已更新并带有注释。希望对您有所帮助。
#include <iostream>
#include <cstdlib>
#include <list>
#include <ctime>
using namespace std;
int main () {
//Declare variables used below
int x = 0;
int list_size = 0;
int p = 0;
// Add new letters to the list below as you learn them!
char Keys_Known[] = {' ', ' ', ' ', 'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', 'e', 'r', 'u', 'i'};
// Seed the random number generator.
srand(time(nullptr));
// Get and set list_size here
list_size = sizeof(Keys_Known)/sizeof(Keys_Known[0]);
cout << "Enter total number of characters wanted: " << endl;
cin >> x;
// Define function(s) used below
// Incorrect.
// This will execute the code in the loop x+1 times.
// for (int i = 0; i <= x; ++i) // For x amount of times
// Correct. Choose one.
// for (int i = 0; i = x; ++i) // For x amount of times
for (int i = 1; i <= x; ++i) // For x amount of times
{
// Get a random number mod list_size..
p = rand() % list_size;
// Randomly choose a character from the list by its index,
// limited to the total number of elements in the list,
cout << Keys_Known[p];
// and finally output the letter value of the index.
}
cout << endl;
return 0;
}
答案 1 :(得分:0)
这里发生了几件事:
如ÖöTiib所述,函数srand(unsigned int)
为随机数生成器播种并返回void
。您应该使用srand(unsigned int)
为随机数生成器添加一次种子,然后调用rand()
生成随机整数。
第二,list<T>
不是随机访问容器,因此与其他容器不同,没有定义operator[]
。该文档告诉我们list<T>
是作为双链表实现的,旨在允许进行恒定时间的插入和删除,但是无法直接访问给定位置的元素:
列表和转发列表与其他列表相比的主要缺点 序列容器是它们无法通过以下方式直接访问元素 他们的位置;例如,要访问列表中的第六个元素, 一个人必须从一个已知的位置进行迭代(例如开始或结束) 结束)到该位置,这需要花费线性时间 这些。
您可能还是不想在这里使用list<char>
。一些更有效的选择是:
vector<char>
,它确实定义了随机访问权限operator[]
,并且可以用作代码中的直接替代; string
,它是由char
定义的operator[]
的容器; char[list_size]
,这是您完成工作所需的全部内容,也是我的建议:您不需要所有花哨的迭代器,搜索方法或动态分配使用std容器得到的结果。