Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/7: Рейтинг темы: голосов - 7, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.05.2020
Сообщений: 6
1

Перемешать данные в массиве таким образом, чтобы модуль разности любых соседних чисел был не меньше чем 5

19.08.2020, 23:20. Показов 1455. Ответов 6

Всем привет!
Помогите плиз))
Таск: Заполнить одномерный массив размером 200 элементов случайными и неповторяющимися числами в диапазоне 1 – 200. Перемешать данные в массиве таким образом, чтобы модуль разности любых соседних чисел был не меньше чем 5.
С заполнением массива разобрался, Подскажите пожалуйста, ну или хоть подайте идею, как перемешать данные в массиве. Если подскажете по коду буду весьма признателен
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <ctime>
#include <cmath>
 
using namespace std;
 
void swap(int& a, int& b) {
    int s;
    s = a;
    a = b;
    b = s;
}
 
void main(void) {
    setlocale(LC_ALL, "Rus");
    int a[200];
    int i, j;
    int x;
    bool IsInArray, IsMudul5;
    srand(time(NULL));
    //запускаем цикл наполнения массива
    for (i = 0; i < 200;) {
        IsInArray = false;
        int x = rand() % 200;
        //сравниваем если такой элемент есть в массиве(дабы избежать повторения элементов), если элемент найден, i не инкрементируется и цикл повторяется
        for (j = 0; j < i; j++) {
            if (a[j] == x) {
                IsInArray = true;
                break;
            }
        }
 
        if (IsInArray == false) {
            a[i] = x;
            i++;
        }
    }
    cout << "Неповторяющиеся числа в диапазоне 1 – 200" << endl;
    for (i = 0; i < 200; i++) {
        cout << a[i] << " " ;
    }
    cout << endl;
 
 
    //запускаем цикл сортировки
    for (i = 1; i <= 200;) {
        IsMudul5 = false;
        //сравнимаем если у чисел i+1 с i модуль <5
        for (j = 0; j < 200; j++) {
            if (abs(a[i+1]-a[i]) < 5) {
                IsMudul5 = true;
                swap(a[i + 1], a[i]);
                break;
            }
        }
 
        if (IsInArray == false) {
            i++;
        }
    }
 
 
    cout << "Отсортированный массив" << endl;
    for (i = 0; i < 200; i++) {
        cout << a[i] << " ";
    }
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.08.2020, 23:20
Ответы с готовыми решениями:

Создать static таким образом, чтобы его цвет был таким же, как у окна
Нужно создать метку таким образом чтобы цвет метки был таким же как у окна. HWND hLabelFrom =...

Переставить числа в массиве таким образом, чтобы сначала шли элементы меньше a[b], затем равные a[b], и потом большие
3) Дан массив a и число b. Переставить числа в массиве таким образом, чтобы сначала шли элементы...

Отсортировать массив таким образом, чтобы наибольший элемент был в середине
Дан массив из 9 случайных чисел. Отсортировать его таким образом, чтобы наибольший элемент был в...

Заполнить массив таким образом, чтобы элемент с индексами i и j был равен i + j
Необходимо создать двумерный массив размерности NxN и заполнить его таким образом, чтобы элемент с...

6
115 / 105 / 51
Регистрация: 29.03.2016
Сообщений: 480
20.08.2020, 00:36 2
первое что приходит в голову это

1. получить рандомно индекс массива и если результирующий массив пуст или последнее значение в нем отличается от выбранного более чем на 5 то пункт 2 иначе повторить пункт 1
2. записать число из начального массива в результирующий массив и увеличить на единицу значение переменной в которой хранится количество перемещенных значений
3. сместить все элементы массива на один шаг влево и уменьшить значение переменной на единицу в которой хранится размер необработанных ячеек начального массива
4. возвращаемся к пункту 1 пока начальный массив полностью не заполнится нулями

Добавлено через 3 минуты
также можно сделать примерно то же, но без использования вспомогательного массива, при этом смещение элементов будет происходить вправо
1
С чаем беда...
Эксперт CЭксперт С++
9263 / 4762 / 1289
Регистрация: 18.10.2014
Сообщений: 10,841
20.08.2020, 05:01 3
Лучший ответ Сообщение было отмечено neprosnulsea как решение

Решение

Пишем программу, которая генерирует, заполняет, перемешивает что угодно и как угодно... но в итоге всегда получает одну и ту же перестановку

1, 101, 2, 102, 3, 103, ..., 99, 199, 100, 200

Такое решение будет удовлетворять требованиям задачи?
1
2136 / 1051 / 402
Регистрация: 08.11.2016
Сообщений: 3,018
20.08.2020, 10:12 4
Тоже вариант: по массиву упорядоченному от 1 до 200
C++
1
2
for (size_t i = 0; i < n / 2; ++i)
    std::swap(arr[i * 2], arr[(i * 2 + 5) % n]);
Рандомизированный вариант
C++
1
2
3
4
int rnd = rand() % 93 + 5;
rnd += !(rnd % 2);
for (size_t i = 0; i < n / 2; ++i)
    std::swap(arr[i * 2], arr[(i * 2 + rnd) % n]);
1
0 / 0 / 0
Регистрация: 07.05.2020
Сообщений: 6
20.08.2020, 19:55  [ТС] 5
Идея хорошая, сам думал так сделать, но препод не одобрит. В моём случае нужно как-то отсортировать, наподобие пузырькойвой, но чтоб модуль был > 5
0
С чаем беда...
Эксперт CЭксперт С++
9263 / 4762 / 1289
Регистрация: 18.10.2014
Сообщений: 10,841
20.08.2020, 20:13 6
Цитата Сообщение от neprosnulsea Посмотреть сообщение
В моём случае нужно как-то отсортировать, наподобие пузырькойвой, но чтоб модуль был > 5
Берем критерий сортировки a < b:

(a - 1) % 100 < (b - 1) % 100 || ((a - 1) % 100 == (b - 1) % 100 && a < b)

Сортируем массив в соответствии с эти критерием любым алгоритмом сортировки. Получаем последовательность из ответа #3.

Однако не ясно, как это согласуется со словом "перемешать" в постановке задачи. В постановке у вас сказано "перемешать". Теперь вы хотите "отсортировать". Что это за абракадабра? Каким это образом "перемешать" превратилось в "отсортировать"?
1
0 / 0 / 0
Регистрация: 07.05.2020
Сообщений: 6
20.08.2020, 21:36  [ТС] 7
Магия вне Хогвартса, только тссс. Спасибо за ответ

Добавлено через 11 минут
Таск решил, всем спасибо
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.08.2020, 21:36

Создание потока таким образом, чтобы файл был доступен другим программам
Здравствуйте Я создаю поток для записи в бинарный файл: using (FileStream stream = new...

Сформировать матрицу М таким образом, чтобы элемент с индексами (I, J) был равен двузначному числу
Сформировать матрицу М таким образом, чтобы элемент с индексами (I, J) был равен двузначному числу,...

Переставить строки матрицы таким образом, чтобы первый столбец был упорядочен по возрастанию
При помощи случайных чисел ввести матрицу размером 8x10. Переставить строки матрицы таким образом,...

Массив. Изменить таким образом, что сначала идут числа, модуль которых меньше 1, потом больше
Надо написать программу, выводящую массив таким образом, что сначала идут числа, модуль которых...

Сколькими способами 7 человек могут сесть в 3 вагона таким образом, чтобы ровно 1 вагон был пустым
На мой взгляд, по идее должно быть P_{7}\cdot A^{2}_{3}=7!\cdot 3! Это верно или нет?

Модуль разности их индексов и модуль разности самих чисел равны единице. Найти количество пар таких чисел.
Данная линейная таблица размерности N. Назовем «близкими» такие числа, модуль разности их индексов...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.