0 / 0 / 1
Регистрация: 23.04.2014
Сообщений: 55
1

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

26.04.2014, 17:17. Показов 6417. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите решить.
Сформировать массив с 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;
    }
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.04.2014, 17:17
Ответы с готовыми решениями:

Записать в массив общие элементы других массивов, без повторения одинаковых элементов
Записать в массив общие элементы других массивов, без повторения записи одинаковых элементов ...

Сгенерировать одномерный массив A в диапазоне [-20; 20] и сформировать новый массив B из отрицательный элементов массива
Здравствуйте. Помогите, пожалуйста, дорешать задачу. Нужно сгенерировать одномерный массив A в...

Добавление числа в массив без повторения
Есть массив int mass = new int; Необходимо создать, наверно цикл.. для того, чтобы добавить в...

КАК ВЫВЕСТИ МАССИВ БЕЗ ПОВТОРЕНИЯ ЧИСЕЛ (ОДНОМЕРНЫЙ)
ПОМОГИТЕ !!!!!

9
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
26.04.2014, 17:36 2
Лучший ответ Сообщение было отмечено karpinets2710 как решение

Решение

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 Посмотреть сообщение
случайный генератор чисел
Это называется Генератор случайных чисел. В данном случае порядок слов важен.
1
7 / 4 / 14
Регистрация: 05.02.2014
Сообщений: 131
26.04.2014, 17:51 3
после скобки { - ставь setlocale(LC_CTYPE, "rus");

глаза болят аж
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
26.04.2014, 18:00 4
Цитата Сообщение от Fear1911 Посмотреть сообщение
ставь setlocale(LC_CTYPE, "rus");
Это
а) Совершенно не по делу
б) не всюду прокатит
0
7 / 4 / 14
Регистрация: 05.02.2014
Сообщений: 131
26.04.2014, 18:53 5
Байт, Vvedit pochatkove naturalne chyslo

все лучше чем это
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
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 минуту
Максимальный элемент думаю найдете сами.
0
68 / 68 / 37
Регистрация: 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, но теперь не надо каждый раз проверять новое полученое значение элемента со всеми предыдущими. Скорость обработки возрастает на порядок.
1
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
26.04.2014, 23:43 8
Цитата Сообщение от RQdan Посмотреть сообщение
свои пять копеек
За каждую копейку получаете по баллу, ПЯТЬ!
Детально не проверял, но идея совершенно здравая.
Кстати, на форуме эта тема поднималась не раз. Временами доходило до мордобоя.
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
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";
}
0
68 / 68 / 37
Регистрация: 26.10.2013
Сообщений: 198
27.04.2014, 21:47 10
Цитата Сообщение от Genn55 Посмотреть сообщение
RQdan ваш код работает при условии что range <= размеру массива,
По условию задачи он должен быть меньше.
0
27.04.2014, 21:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.04.2014, 21:47
Помогаю со студенческими работами здесь

Подсчитать число сочетаний без повторения из n элементов по m
Составить программу, подсчитывающую число сочетаний без повторения из n элементов по m ...

Перемешать одномерный массив и вывести в случайном порядке без повторения
Всем привет, Есть одномерный массив неправильных вопросов, мне их нужно перемешать и выводить в...

Cоздать из двух двумерных массивов один без повторения элементов
Всем привет. 1.Как создать из двух двумерных массивов один, и чтобы они не повторялись, по одному...

Как присвоить списку ComboBox список List без повторения элементов?
Dim lstSrc = New List(Of String) lstSrc.Add(&quot;asdf&quot;) lstSrc.Add(&quot;123&quot;) lstSrc.Add(&quot;asdf&quot;)...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru