Как НЕ заполнять массив определенными числами?

Указываю код хотя мне кажется он здесь не пригодится. Можете сразу переходить к "проблемной" строчке внизу.

Как сделать так,чтобы определенные значения(цифры) не могли заполнять массив.То есть:

    #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 шт):

Автор решения: Zhihar

Как сделать так,чтобы определенные значения(цифры) не могли заполнять массив.

так чисел или цифр?

если чисел, то сделать следующее:

способ 1:

сформировать массив разрешенных чисел, например через

std::vector<int> nums;

и выбирать числа для матрицы оттуда, случайным образом определяя индекс в массиве из которого надо взять число

способ 2:

сформировать множество запрещённых числе, например через

std::set<int> nums = {1, 7, 15};

и если случайное число входит в это множество

if (nums.find(value) != nums.end())

то генерировать случайное число заново (тут вопрос по сравнению со способом 1 в равномерности распределения случайных чисел возникнет, ну да ладно)

если же нужны именно цифры числа, то, что мешает использовать способы 1 и 2 для совокупности цифр, которые можно определить разными способами - или через перевод числа в строку или через выделение цифр при делении по модулю 10

→ Ссылка
Автор решения: AlexGlebe

Сначала генерируете правильно, чтобы не было проблем так:

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 (или другие структуры) :)

→ Ссылка