Форум программистов, компьютерный форум CyberForum.ru

Сгенерировать массив без повторения элементов - C++

Восстановить пароль Регистрация
 
karpinets2710
 Аватар для karpinets2710
0 / 0 / 0
Регистрация: 23.04.2014
Сообщений: 55
26.04.2014, 17:17     Сгенерировать массив без повторения элементов #1
Помогите решить.
Сформировать массив с M элементов (M<=50) случайных натуральных чисел, что попадают в промежуток [g1;g2] (M, g1, g2 вводятся с клавиатуры). Обеспечить чтоб в массиве не было одинаковых элементов. Напечатать этот массив и указать номер и значение его максимального элемента.
В условии дана подсказка: использовать случайный генератор чисел.

Вот что я сумел сделать, помогите доработать.

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
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "ctime"
#include "conio.h"
int main (void)
{
    int M, g1, g2;
    printf ("\nVvedit kilkist elementiv masyvu (ne bilshe 50): \n\t");
    while(1)                                                                 /* цикл введення елементів масиву */
    {
        scanf_s("%d", &M);
        if
            (M<=50 && M>0) break;
        else 
            printf("Ne virno vvedeno, sprobuyte shche raz\n\t");
    }
    inv: printf ("Vvedit pochatkove naturalne chyslo\n\t");
    while(1)
    {
        scanf_s("%d", &g1);
        if
            (g1>0) break;
        else 
            printf("Ne virno vvedeno, sprobuyte shche raz\n\t");
    }
    printf ("Vvedit kintseve naturalne chyslo\n\t");
    while(1)
    {
        scanf_s("%d", &g2);
        if
            (g2>0) break;
        else 
            printf("Ne virno vvedeno, sprobuyte shche raz\n\t");
    }
        if (g1>=g2)
        {
            printf("Ne virno vvedeno, sprobuyte shche raz\n\n");
            goto inv;45
        }
    _getch();
    return 0;
    }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.04.2014, 17:17     Сгенерировать массив без повторения элементов
Посмотрите здесь:

C++ Сгенерировать случайный двумерный массив с заданной размерностью
Двумерный массив, кол-во строк без нулевых элементов C++
Список четырехзначных чисел без повторения цифр C++
C++ Записать в массив общие элементы других массивов, без повторения одинаковых элементов
Двумерный массив. Найти среднее арифметическое элементов, которые делятся на 4 или на 3 без остатка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Байт
 Аватар для Байт
13946 / 8777 / 1221
Регистрация: 24.12.2010
Сообщений: 15,884
26.04.2014, 17:36     Сгенерировать массив без повторения элементов #2
Сообщение было отмечено автором темы, экспертом или модератором как ответ
karpinets2710, Ввод ты сделал (или содрал?) - молодец!
Теперь вторая часть задачи - заполнить массив случайными числами.
C++
1
2
3
4
5
int mas[50];
for(i=0; i<M; i++) {
  int x = rand()%(g2-g1+1) + g1;
  mas[i] = x;
}
Добавлено через 5 минут
О! Прости, не заметил.
Цитата Сообщение от karpinets2710 Посмотреть сообщение
Обеспечить чтоб в массиве не было одинаковых элементов.
Значит надо
а) проверить, что M <= g2 - g1 + 1 (иначе разными - не получится)
б) Перед записью в массив проверять, нет ли там уже таких
Вообще, эта задача не так проста, как кажется с виду, но для первой прикидки сойдет...

Добавлено через 1 минуту
Цитата Сообщение от karpinets2710 Посмотреть сообщение
случайный генератор чисел
Это называется Генератор случайных чисел. В данном случае порядок слов важен.
Fear1911
6 / 3 / 7
Регистрация: 05.02.2014
Сообщений: 131
26.04.2014, 17:51     Сгенерировать массив без повторения элементов #3
после скобки { - ставь setlocale(LC_CTYPE, "rus");

глаза болят аж
Байт
 Аватар для Байт
13946 / 8777 / 1221
Регистрация: 24.12.2010
Сообщений: 15,884
26.04.2014, 18:00     Сгенерировать массив без повторения элементов #4
Цитата Сообщение от Fear1911 Посмотреть сообщение
ставь setlocale(LC_CTYPE, "rus");
Это
а) Совершенно не по делу
б) не всюду прокатит
Fear1911
6 / 3 / 7
Регистрация: 05.02.2014
Сообщений: 131
26.04.2014, 18:53     Сгенерировать массив без повторения элементов #5
Байт, Vvedit pochatkove naturalne chyslo

все лучше чем это
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
26.04.2014, 22:26     Сгенерировать массив без повторения элементов #6
Теперь вторая часть задачи - заполнить массив случайными числами.
Как то так.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    int d,i = 0,j;
    int g2 = 5,g1 = 15;
   while (i<SIZE)
    {
        d = rand()%(g2-g1+1) + g1;
        for( j = 0; j < i; j++)
        {
          while (mass[j] == d)
          {
            d = rand()%(g2-g1+1) + g1;
            j = -1;
          }
        }
        mass[i] = d;
       cout << mass[i] << " ";
       i++;
    }
Добавлено через 1 минуту
Максимальный элемент думаю найдете сами.
RQdan
65 / 65 / 17
Регистрация: 26.10.2013
Сообщений: 198
26.04.2014, 23:33     Сгенерировать массив без повторения элементов #7
Ввод и вывод уже не имеет смысла делать - все расписали выше. А с генерацией случайных неповторяющихся чисел могу вставить свои пять копеек.
C++
1
2
3
4
5
6
7
8
9
10
int range=g2-g1+1;
int r;
for(int i=0;i<range;i++) masEl[i]=i+g1;//заносим все значения отрезка в массив
for(int i=0;i<m;i++)
{
  r=rand()%range;//получаем значение элемента массива
  mas[i]=masEl[r];//в итоговый массив записываем новый элемент
  masEl[r]=masEl[range-1];//на место выбранного значения элемента массива значений отрезка вставляем значение последнего элемента 
  range--;//уменьшаем значение выборки - таким образом ранее выпавшие элементы больше не попадут в выборку
}
Добавляем еще один массив masEl для всех значений отрезка g1-g2, но теперь не надо каждый раз проверять новое полученое значение элемента со всеми предыдущими. Скорость обработки возрастает на порядок.
Байт
 Аватар для Байт
13946 / 8777 / 1221
Регистрация: 24.12.2010
Сообщений: 15,884
26.04.2014, 23:43     Сгенерировать массив без повторения элементов #8
Цитата Сообщение от RQdan Посмотреть сообщение
свои пять копеек
За каждую копейку получаете по баллу, ПЯТЬ!
Детально не проверял, но идея совершенно здравая.
Кстати, на форуме эта тема поднималась не раз. Временами доходило до мордобоя.
Genn55
341 / 188 / 37
Регистрация: 26.12.2012
Сообщений: 658
27.04.2014, 01:01     Сгенерировать массив без повторения элементов #9
RQdan ваш код работает при условии что range <= размеру массива,но в таком случае проще использовать random_shuffle.Пример
//без повтора
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <algorithm>
#include <ctime>
#include <stdlib.h>
 
using namespace std;
 
int main()
{
 
    srand(time(NULL));
    int g2 =50,g1= 5;
    int range=g2-g1+1;
    int SIZE = range ;
 
    int mass[SIZE];
        for (int j=0; j<SIZE; j++)
            mass[j] = j+1;
        random_shuffle(mass, mass+SIZE);
        for (int j=0; j<SIZE; j++)
cout << mass[j] << " ";
 cout << " \n\n";
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.04.2014, 21:47     Сгенерировать массив без повторения элементов
Еще ссылки по теме:

C++ Сгенерировать неупорядоченный массив целых чисел от 1 до N
C++ Сгенерировать массив, исходя из условий: V[j] >v[i] при j > i
Сгенерировать случайные числа без повторений C++

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

Или воспользуйтесь поиском по форуму:
RQdan
65 / 65 / 17
Регистрация: 26.10.2013
Сообщений: 198
27.04.2014, 21:47     Сгенерировать массив без повторения элементов #10
Цитата Сообщение от Genn55 Посмотреть сообщение
RQdan ваш код работает при условии что range <= размеру массива,
По условию задачи он должен быть меньше.
Yandex
Объявления
27.04.2014, 21:47     Сгенерировать массив без повторения элементов
Ответ Создать тему
Опции темы

Текущее время: 20:43. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru