Попытка случайным образом выбрать один элемент из списка и отобразить его в C ++ - PullRequest
0 голосов
/ 27 августа 2018

Я здесь новичок и очень плохо знаком с программированием, и за все время, что я потратил на изучение интернета и этого сайта, я не могу найти ответ на этот мой вопрос.Мне нужно случайным образом выбрать один элемент из списка символов и распечатать его, а затем повторить это количество раз, введенное пользователем.Я пытаюсь создать текстовый генератор для практики набора текста с использованием отдельных клавиш, а не слов.(Да, я знаю, что я очень опоздал на вечеринку «печатать правильно», но мои набеги на кодирование заставили меня понять, что это был более полезный навык, чем я думал.)
До сих пор я в основном нашел ответы, которые используютитератор для печати всех элементов списка подряд, а это не то, что мне нужно.Я также постоянно сталкиваюсь с людьми, которые говорят, что используют вектор вместо списка, но моя книга по С ++, из которой я начал учиться, не затрагивает слишком «продвинутых» вещей, поэтому я застрял там.Хотя использование списка кажется хорошей идеей для меня, но это может быть только мой разговор с новичком.Массив был бы слишком жестким для того, что я хочу выполнить, потому что если бы пользователь мог ввести ключи, которые он хочет в более поздней версии этой программы, а не просто кодировать их, как я сделал для первой попытки, это было бы болееидеально.Но, в любом случае, моя программа теперь выглядит так:

// 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, не работающих с%, как обычно я ограничиваю диапазон случайных чисел.Eclipse также говорит мне, что я ничего не могу сказать «Keys_Known []», потому что он понятия не имеет, что [] должно означать.Я даже попытался поставить 0 там, но он все еще действует, как будто я не могу использовать индексы.Я пропускаю заголовок "#include"?Точные ошибки, которые я получаю:
"недопустимые операнды типов 'void' и 'int' в двоичном операторе% 'строка 29 C / C ++ Проблема"
и:
"нет соответствия для оператора [] '(типы операндов:' std :: __ cxx11 :: list 'и' int ') строка 33 C / C ++ Проблема "

Любая помощь приветствуется, спасибо!

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Здесь происходит пара вещей:

Как уже упоминалось Öö Tiib, функция srand(unsigned int) запускает генератор случайных чисел и возвращает void.Вы должны заполнить генератор случайных чисел один раз с помощью srand(unsigned int), затем вызвать rand(), чтобы сгенерировать случайное целое число.

Во-вторых, list<T> не являетсяКонтейнер произвольного доступа, поэтому, в отличие от других контейнеров, operator[] не определен.Документация говорит нам, что list<T> реализован в виде двусвязного списка, предназначенного для вставки и удаления с постоянным временем, но не имеет прямого доступа к элементу в данной позиции:

Основной недостатоксписки и forward_lists по сравнению с этими другими контейнерами последовательностей в том, что они не имеют прямого доступа к элементам по их положению;Например, чтобы получить доступ к шестому элементу в списке, необходимо выполнить итерацию от известной позиции (например, начала или конца) до этой позиции, что занимает линейное время на расстоянии между ними.

Вы, вероятно, не хотите использовать list<char> здесь в любом случае.Вот некоторые более эффективные опции:

  1. vector<char>, для которых определен произвольный доступ operator[] и которые можно использовать в качестве замены в вашем коде.;
  2. string, который является контейнером char s, для которого также определено operator[];
  3. или просто старый char[list_size], которыйэто все, что вам действительно нужно для выполнения работы, и я бы порекомендовал вам: вам не нужны все причудливые итераторы, методы поиска или динамическое распределение, которые вы получаете при использовании контейнера std.
0 голосов
/ 27 августа 2018
  1. std::list не является контейнером произвольного доступа.Следовательно, вы не можете использовать Keys_Known[p] для доступа к элементу.

    Вы можете использовать массив или std::vector.

    Массив отлично подойдет для ваших нужд.

  2. Отсутствует ясность в том, что вы пытаетесь сделать - по крайней мере, намерение не переведенокодировать.Будет полезно изучить основы языка из хорошей книги .

Вот ваш код, обновленный и аннотированный.Надеюсь, что это полезно.

#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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...