Как НЕ заполнять массив определенными числами?
Указываю код хотя мне кажется он здесь не пригодится. Можете сразу переходить к "проблемной" строчке внизу.
Как сделать так,чтобы определенные значения(цифры) не могли заполнять массив.То есть:
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;
int main()
{
int rows = 4;
int columns = 4;
srand(time(NULL));
//Создаем указатель на указатель,и каждый элемент массива указателей будет хранить еще один массив.
int **arr = new int* [rows];
for (int i = 0; i < rows; i++)
{
//в качестве указателя выступает массив и каждая ячейка будет выделять память под еще один массив.
arr[i] = new int[columns];
}
//////////////////////////////////
//Заполняем массив случайными значениями
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
arr[i][j] = rand() % 20+1;
if ( arr[i][j] == 5||6||7||8||9||10)
{
}
}
}
//Выводим массив в консоль.
for (int i = 0; i < rows; i++)
{
for (int j = 0; j < columns; j++)
{
cout << arr[i][j] << "\t";
}
cout << endl;
}
/////////////////////////////////
//Очищаем память.
for (int i = 0; i < rows; i++)
{
delete[] arr[i];
}
delete[] arr;
return 0;
}
И "проблемная" строчка:
if ( arr[i][j] == 5||6||7||8||9||10)
{
//Нужно чтобы вышеуказанные значения не были в массиве.
}
Ответы (3 шт):
Как сделать так,чтобы определенные значения(цифры) не могли заполнять массив.
так чисел или цифр?
если чисел, то сделать следующее:
способ 1:
сформировать массив разрешенных чисел, например через
std::vector<int> nums;
и выбирать числа для матрицы оттуда, случайным образом определяя индекс в массиве из которого надо взять число
способ 2:
сформировать множество запрещённых числе, например через
std::set<int> nums = {1, 7, 15};
и если случайное число входит в это множество
if (nums.find(value) != nums.end())
то генерировать случайное число заново (тут вопрос по сравнению со способом 1 в равномерности распределения случайных чисел возникнет, ну да ладно)
если же нужны именно цифры числа, то, что мешает использовать способы 1 и 2 для совокупности цифр, которые можно определить разными способами - или через перевод числа в строку или через выделение цифр при делении по модулю 10
Сначала генерируете правильно, чтобы не было проблем так:
arr[i][j] = rand() % (20 - 6) + 1;
if (arr[i][j] >= 5 && arr[i][j] <= 10)
arr[i][j] += 6 ;
или делаете массив нужных чисел :
int mass [ 20 - 6 ] = { 1 , 2 , 3 , 4 , 11 , .... , 20 } ;
..
arr[i][j] = mass [ rand() % (20 - 6) ] ;
Ну если чисел не так много и они не большие, то можно примерно таким образом:
srand(time(0));
//Всего в черном списке может быть 128 чисел, от 0 до 127
bool black_list[128] = { 0 };
//Заносим 5, 6, 7, 8, 9, 10 в черный список
for (int i = 5; i <= 10; i++)
black_list[i] = true;
int cols = 4, rows = 4;
int** arr = new int* [rows];
for (int i = 0; i < rows; i++) {
arr[i] = new int[cols];
for (int j = 0; j < cols; j++) {
do {
//Генерируем числа от 0 до 15
arr[i][j] = rand() % 16;
//Пропуская от [5, 10]
} while (black_list[arr[i][j]]);
}
}
... Далее вывод и удаление матрицы
Если же вы перед запуском программы сами устанавливаете числа, которые не хотите видеть в матрице, то вам может подойти вот такой способ:
srand(time(0));
int black_list[] = { 5,6,7,8,9,10 };
int cols = 4, rows = 4;
int** arr = new int* [rows];
for (int i = 0; i < rows; i++) {
arr[i] = new int[cols];
for (int j = 0; j < cols; j++) {
do {
arr[i][j] = rand() % 10;
} while (isFind(black_list, 6, arr[i][j]));
}
}
... Далее вывод и удаление матрицы
Функция ifFind максимально проста, просто как пример:
bool isFind(int* black_list, int size, int value) {
for (int i = 0; i < size; i++)
if (black_list[i] == value)
return true;
return false;
}
Конечно я думаю лучше использовать библиотечную функцию, например find.
Тогда условие цикла do...while изменится:
do {
arr[i][j] = rand() % 10;
} while (find(black_list, black_list + 6, arr[i][j]) != black_list + 6);
Функция find возвращает указатель на первый найденый элемент в промежутке [black_list, black_list + 6) то есть от начала и до концы массива black_list, но без учета blac_list + 6. Если элемент не был найден, то функция возвращает второй её параметр, в нашем случае black_list + 6.
Если же вы хотите динамически добавлять числа в черный список, то тут лучше использовать динамическую структуру например vector или же сами пишите vector (или другие структуры) :)