С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
rioto
0 / 0 / 0
Регистрация: 19.08.2017
Сообщений: 22
1

Надо сделать проверку на уникальность элементов массива

21.05.2018, 12:05. Просмотров 882. Ответов 10
Метки нет (Все метки)

Есть вот такой вод код рабочий, но есть одно но надо сделать так чтобы повторяющийся элемент в массиве не добавлялся ,и заместо него пользователь вводил еще элементы, пока не достигнется заданная мощность множества
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#include <iostream>
#include <stdio.h>
using namespace std;
class Set  // класс множество
{              // Открытие класса
private:   // Приватные поля
unsigned int size_massiv;  // размер массива
unsigned int* array;  // указатель массива
public:   // Публичные
Set() { size_massiv=0; array = new unsigned int[size_massiv]; } // конструктор
Set(int k) {  size_massiv = k; array = new unsigned int[size_massiv]; // конструктор с аргументами для выделения памяти
for ( unsigned i = 0; i < size_massiv; i++)  // цикл для конструктора
array[i] = 0;  }
Set(const Set &o) // конструктор копии
{   size_massiv = o.size_massiv;
array = new unsigned  int[size_massiv];
for ( unsigned int i = 0; i < size_massiv; i++)
array[i] = o.array[i]; }
void Enter(); // метод для ввода
void Show(); // метод для вывода
void Obed(Set, Set); // метод объединение
void Perecech(Set, Set); // метод пресечения
void operator = (Set); // оператор присваивания(с помощью перегрузки)
int operator [] (int i);  // оператор [](с помощью перегрузки)
void Raznost(Set, Set); // метод разность
};   // Закрытие класса
void Set::Enter() // метод для ввода
{
cout << "Введите размер множества " << endl;  // Приглашения для ввода размера множества
cin >> size_massiv;  // ввод размера множества
array = new unsigned int[size_massiv];
for ( unsigned int i = 0; i < size_massiv; i++)  // цикл для ввода элементов множества
{
cout << "Введите элемент " << i + 1 << ")   "; // Приглашения для ввода элементов множества
cin >> array[i]; // Ввод элементов множества
}
}
void Set::Show()  // Метод для отображения множества
{
cout << "Множество " << endl; // Надпись "Множество"
for ( unsigned int i = 0; i < size_massiv; i++)  // Цикл для вывода множества
cout << array[i] << " "; // Вывод элементов получившегося множества
cout << endl;
}
void Set::Obed(Set a, Set b) // Объединение двух множеств
{
size_massiv = a.size_massiv + b.size_massiv;  // размер множества равен сумме размеров двух множеств
array = new unsigned int[size_massiv];
unsigned i, j, count = 0;
unsigned int n = a.size_massiv; // Приравниваем  n = a.size_massiv
for ( i = 0; i < a.size_massiv; i++) // Цикл для множества а, начинаем идти с начала массива
array[i] = a.array[i];  // Приравнивание элементов
 
for ( i = 0; i < b.size_massiv; i++)  // Цикл для множества b
{
for ( j = 0; j < a.size_massiv; j++)  // Цикл для множества a
if(b.array[i] == a.array[j])  // условие равенства двух элементов двух множеств a и b
continue;  // продолжение
else  // условие иначе
count++;  // Увеличение счётчика count
if(count == a.size_massiv)  // Условие равенства
array[n++] = b.array[i];
count = 0; // счетчик count =0
}
size_massiv = n; // Размер массива = n
}
void Set::Perecech(Set a, Set b)  // Пересечение двух множеств
{
size_massiv = a.size_massiv + b.size_massiv;  // размер множества равен сумме размеров двух множеств
array = new unsigned int[size_massiv];
unsigned int i, j, n = 0;
for ( i = 0; i < a.size_massiv; i++)  // Цикл для множества a
for ( j = 0; j < b.size_massiv; j++)  // Цикл для множества b
{
if(a.array[i] == b.array[j])  // условие равенства двух элементов двух множеств a и b
{
array[n++] = a.array[i];
continue;
}
}
size_massiv = n;  // Размер массива = n
}
void Set::Raznost(Set a, Set b) // разность двух множеств
{
array = new unsigned int[size_massiv]; 
unsigned int i, n = 0; // введение переменных
for (int i = 0; i < a.size_massiv; i++) // цикл для размера множества а
{ int j = 0;  // Введение переменной
while (j < b.size_massiv && b.array[j] != a.array[i]) j++;  //пока j меньше размера множества b и элементы двух множеств не равны
if (j == b.size_massiv)  array[n++] = a.array[i]; // условие если j =размеру множества b 
}
size_massiv = n;  // Размер массива = n
}
void Set::operator = (Set a)  // оператор приравнивания
{
unsigned int i; // ввод переменной i
delete[] this->array;  // Применение указателя this
this->size_massiv = a.size_massiv;  // Применение указателя this
this->array = new unsigned int[size_massiv];  // Применение указателя this
for ( i = 0; i < size_massiv; i++)  // Цикл для размера множества
array[i] = a.array[i]; // Придание элементам array значений элементов a.array
}
int Set::operator[](int i)  // Оператор []
{
return array[i];  // Возвращение элементов array
}
int main()   //  Главная функция
{
setlocale(0, "rus");  // для кириллицы
Set a;  // Создание объекта а где а это множество
cout << "Ввод и вывод  множества а " << endl;
a.Enter();  // Ввод множества а
a.Show();  // Показ множества а
Set b = a;  // Приравнивание множеству b множество a
cout << "инициализация множества b с помощью конструктора копии "<< endl;
b.Show();
cout << "Ввод множества b " << endl;
b.Enter();  // Ввод множества b
Set c;   // Создание результирующего множества с
cout << "Объединение множеств " << endl;
c.Obed(a, b);  // Объединение
c.Show();  // Показ множества объединения
cout << "Пересечение " << endl;
c.Perecech(a, b);  // Пересечение
c.Show();  // Показ множества пресечения
cout << "Разность a/b " << endl;
c.Raznost(a,b);  // Разность a и b
c.Show();  // Показ множества разности а-b
cout << "Разность b/a " << endl;
c.Raznost(b,a);  // Разность b и a
c.Show();  // Показ множества разности b-a
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2018, 12:05
Ответы с готовыми решениями:

Контейнер map: реализовать проверку на уникальность ключа
Приветствую форумчан, имеется контейнер map с элементами struct Elemnts {...

Cделать проверку на истинность всех элементов массива bool
есть массив из bool как сделать проверку на истинность всех элементов массива?

С++ надо выполнить проверку на слово типа if(a == 'да') то вывести на экран
Я только учу с++, и столкнулсяс проблемой, я написал код для &quot;пробной&quot;...

Надо сделать задание (надо найти среднее геометрическое)
Вот задание: найти среднее геометрическое n значений Z1,Z2,...Zn по формуле...

Надо организовать проверку на введенную строку, если есть цифры то должно вывести ошибку
cout &lt;&lt; &quot;Введите Ф.И.О директора: &quot;; a.Name_director = new char;...

10
Cortas
44 / 43 / 36
Регистрация: 14.03.2016
Сообщений: 200
Завершенные тесты: 5
21.05.2018, 12:13 2
создайте цикл с условием на выход по "мощности" массива, запрашивайте у пользователя число, затем проходите по всему массиву и сравнивайте нет ли похожего, если нет, то добавляйте, увеличивайте "мощность", выводите значение "мощности" на экран, чтобы пользователь понимал сколько ему ещё вводить.

p.s. копируйте код с табуляцией, а то это читать больно
0
rioto
0 / 0 / 0
Регистрация: 19.08.2017
Сообщений: 22
21.05.2018, 12:29  [ТС] 3
А можно так чтобы повторяющийся элемент просто не добавлялся в массив?

Добавлено через 2 минуты
Да и это в конструкторе как то провернуть надо
0
Cortas
44 / 43 / 36
Регистрация: 14.03.2016
Сообщений: 200
Завершенные тесты: 5
21.05.2018, 12:39 4
rioto, хорошо, как вы добавляете элемент во множество?

Кстати, тут у вас ошибка
C++
1
int operator [] (int i);  // оператор [](с помощью перегрузки)
Вы не будете менять значение i-того элемента, а лишь значение копии, которая никак не влияет на сам массив.
C++
1
int& operator [] (int i);  // оператор [](с помощью перегрузки) //вот так сделайте
Добавлено через 7 минут
Так-с, вот ваш ввод:
C++
1
2
3
4
5
6
7
8
9
10
11
void Set::Enter() // метод для ввода
{
    cout << "Введите размер множества " << endl;  // Приглашения для ввода размера множества
    cin >> size_massiv;  // ввод размера множества
    array = new unsigned int[size_massiv];
    for ( unsigned int i = 0; i < size_massiv; i++)  // цикл для ввода элементов множества
    {
        cout << "Введите элемент " << i + 1 << ")   "; // Приглашения для ввода элементов множества
        cin >> array[i]; // Ввод элементов множества
    }
}
Вообще у множетсва как такого нет доступа к произвольному элементу, т.к. может нарушиться сортировка, но у вас её нет, потому нарушать нечего. Предлагаю сделать следующие:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Set::Enter() // метод для ввода
{
    cout << "Введите размер множества " << endl;  // Приглашения для ввода размера множества
    cin >> size_massiv;  // ввод размера множества
    array = new unsigned int[size_massiv];
    
    unsigned int buf;
    for ( unsigned int i = 0; i < size_massiv; i++)  // цикл для ввода элементов множества
    {
        cout << "Введите элемент " << i + 1 << ")   "; // Приглашения для ввода элементов множества
        cin >> buf; // Ввод элементов множества
        if(no_sim(buf))
            array[i] = buf;
    }
}
bool Set::no_sim(const unsigned int& s)
{
    for(unsigned int i = 0; i < size_massiv; i++)
        if(buf == array[i])
            return false;
    return true;
}
Добавлено через 1 минуту
Цитата Сообщение от rioto Посмотреть сообщение
Да и это в конструкторе как то провернуть надо
C++
1
2
3
4
5
6
7
8
Set(const Set &o) // конструктор копии
{  
    size_massiv = o.size_massiv;
    array = new unsigned  int[size_massiv];
    for ( unsigned int i = 0; i < size_massiv; i++)
        if(no_sim(o.array[i])
            array[i] = o.array[i]; 
}

Бред написал. У вас же и так будет множество без повторяющихся элементов
0
rioto
0 / 0 / 0
Регистрация: 19.08.2017
Сообщений: 22
21.05.2018, 12:41  [ТС] 5
У меня есть конструктор для выделения элементов под массив вот он
C++
1
2
3
Set(int k) {  size_massiv = k; array = new unsigned int[size_massiv]; // конструктор с аргументами для выделения памяти
for ( unsigned i = 0; i < size_massiv; i++)  // цикл для конструктора
array[i] = 0;  }
А сам ввод элементов происходит в методе enter
C++
1
2
3
4
5
6
7
8
9
10
11
void Set::Enter() // метод для ввода
{
cout << "Введите размер множества " << endl;  // Приглашения для ввода размера множества
cin >> size_massiv;  // ввод размера множества
array = new unsigned int[size_massiv];
for ( unsigned int i = 0; i < size_massiv; i++)  // цикл для ввода элементов множества
{
cout << "Введите элемент " << i + 1 << ")   "; // Приглашения для ввода элементов множества
cin >> array[i]; // Ввод элементов множества
}
}
0
Cortas
44 / 43 / 36
Регистрация: 14.03.2016
Сообщений: 200
Завершенные тесты: 5
21.05.2018, 12:43 6
Цитата Сообщение от rioto Посмотреть сообщение
У меня есть конструктор для выделения элементов под массив вот он
Если вы не хотите повторяющихся значений, то не инициализируйте каждый элемент 0, оставьте его пустым.
0
rioto
0 / 0 / 0
Регистрация: 19.08.2017
Сообщений: 22
21.05.2018, 12:55  [ТС] 7
Я сделал как вы посоветовали только при вводе множества 1 2 3 4 у меня показывается 30 0 0 0
0
Cortas
44 / 43 / 36
Регистрация: 14.03.2016
Сообщений: 200
Завершенные тесты: 5
21.05.2018, 13:03 8
У меня он выводит то, что я ввел.
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
#include <iostream>
#include <conio.h>
using namespace std;
 
//чтобы консоль не вылетала после отработки программы.
int end() { cout << endl << "END" << endl; _getch(); return 0; }
 
class Set  // класс множество
{              // Открытие класса
    private:   // Приватные поля
    unsigned int size_massiv;  // размер массива
    unsigned int* array;  // указатель массива
    public:   // Публичные
    Set() { size_massiv = 0; array = new unsigned int[size_massiv]; } // конструктор
    Set(int k)
    {
        size_massiv = k;
        array = new unsigned int[size_massiv]; // конструктор с аргументами для выделения памяти
        for(unsigned i = 0; i < size_massiv; i++)  // цикл для конструктора
            array[i] = 0;
    }
    Set(const Set &o) // конструктор копии
    {
        size_massiv = o.size_massiv;
        array = new unsigned  int[size_massiv];
        for(unsigned int i = 0; i < size_massiv; i++)
            array[i] = o.array[i];
    }
    void Enter(); // метод для ввода
    void Show(); // метод для вывода
    void Obed(Set, Set); // метод объединение
    void Perecech(Set, Set); // метод пресечения
    void operator = (Set); // оператор присваивания(с помощью перегрузки)
    unsigned int& operator [] (int i);  // оператор [](с помощью перегрузки)
    void Raznost(Set, Set); // метод разность
    bool Set::no_sim(const unsigned int&);
};   // Закрытие класса
 
void Set::Enter() // метод для ввода
{
    cout << "Введите размер множества " << endl;  // Приглашения для ввода размера множества
    cin >> size_massiv;  // ввод размера множества
    array = new unsigned int[size_massiv];
 
    unsigned int buf;
    for(unsigned int i = 0; i < size_massiv; i++)  // цикл для ввода элементов множества
    {
        cout << "Введите элемент " << i + 1 << ")   "; // Приглашения для ввода элементов множества
        cin >> buf; // Ввод элементов множества
        if(no_sim(buf))
            array[i] = buf;
    }
}
 
bool Set::no_sim(const unsigned int& s)
{
    for(unsigned int i = 0; i < size_massiv; i++)
    if(s == array[i])
        return false;
    return true;
}
 
void Set::Show()  // Метод для отображения множества
{
    cout << "Множество " << endl; // Надпись "Множество"
    for(unsigned int i = 0; i < size_massiv; i++)  // Цикл для вывода множества
        cout << array[i] << " "; // Вывод элементов получившегося множества
    cout << endl;
}
void Set::Obed(Set a, Set b) // Объединение двух множеств
{
    size_massiv = a.size_massiv + b.size_massiv;  // размер множества равен сумме размеров двух множеств
    array = new unsigned int[size_massiv];
    unsigned i, j, count = 0;
    unsigned int n = a.size_massiv; // Приравниваем  n = a.size_massiv
    for(i = 0; i < a.size_massiv; i++) // Цикл для множества а, начинаем идти с начала массива
        array[i] = a.array[i];  // Приравнивание элементов
 
    for(i = 0; i < b.size_massiv; i++)  // Цикл для множества b
    {
        for(j = 0; j < a.size_massiv; j++)  // Цикл для множества a
        if(b.array[i] == a.array[j])  // условие равенства двух элементов двух множеств a и b
            continue;  // продолжение
        else  // условие иначе
            count++;  // Увеличение счётчика count
        if(count == a.size_massiv)  // Условие равенства
            array[n++] = b.array[i];
        count = 0; // счетчик count =0
    }
    size_massiv = n; // Размер массива = n
}
 
void Set::Perecech(Set a, Set b)  // Пересечение двух множеств
{
    size_massiv = a.size_massiv + b.size_massiv;  // размер множества равен сумме размеров двух множеств
    array = new unsigned int[size_massiv];
    unsigned int i, j, n = 0;
    for(i = 0; i < a.size_massiv; i++)  // Цикл для множества a
    for(j = 0; j < b.size_massiv; j++)  // Цикл для множества b
    {
        if(a.array[i] == b.array[j])  // условие равенства двух элементов двух множеств a и b
        {
            array[n++] = a.array[i];
            continue;
        }
    }
    size_massiv = n;  // Размер массива = n
}
void Set::Raznost(Set a, Set b) // разность двух множеств
{
    array = new unsigned int[size_massiv];
    unsigned int i, n = 0; // введение переменных
    for(int i = 0; i < a.size_massiv; i++) // цикл для размера множества а
    {
        int j = 0;  // Введение переменной
        while(j < b.size_massiv && b.array[j] != a.array[i]) j++;  //пока j меньше размера множества b и элементы двух множеств не равны
        if(j == b.size_massiv)
            array[n++] = a.array[i]; // условие если j =размеру множества b 
    }
    size_massiv = n;  // Размер массива = n
}
 
void Set::operator = (Set a)  // оператор приравнивания
{
    unsigned int i; // ввод переменной i
    delete[] this->array;  // Применение указателя this
    this->size_massiv = a.size_massiv;  // Применение указателя this
    this->array = new unsigned int[size_massiv];  // Применение указателя this
    for(i = 0; i < size_massiv; i++)  // Цикл для размера множества
        array[i] = a.array[i]; // Придание элементам array значений элементов a.array
}
 
unsigned int& Set::operator[](int i)  // Оператор []
{
    return array[i];  // Возвращение элементов array
}
 
int main()
{
    setlocale(0, "");
    Set a;
    a.Enter();
    a.Show();
    return end();
}
Название: Screenshot_2.png
Просмотров: 15

Размер: 5.4 Кб
0
rioto
0 / 0 / 0
Регистрация: 19.08.2017
Сообщений: 22
21.05.2018, 13:07  [ТС] 9
А у меня почему то он на эту строку ругается
C++
1
    bool Set::no_sim(const unsigned int&);
[Error] extra qualification 'Set::' on member 'no_sim' [-fpermissive]
0
Cortas
44 / 43 / 36
Регистрация: 14.03.2016
Сообщений: 200
Завершенные тесты: 5
21.05.2018, 13:15 10
Лучший ответ Сообщение было отмечено rioto как решение

Решение

Кстати, стоит немного переделать ввод, иначе у вас могут быть неинициализированные элементы:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void Set::Enter() // метод для ввода
{
    cout << "Введите размер множества " << endl;  // Приглашения для ввода размера множества
    cin >> size_massiv;  // ввод размера множества
    array = new unsigned int[size_massiv];
 
    unsigned int buf;
    for(unsigned int i = 0; i < size_massiv; i++)  // цикл для ввода элементов множества
    {
        cout << "Введите элемент " << i + 1 << ")   "; // Приглашения для ввода элементов множества
        cin >> buf; // Ввод элементов множества
        if(no_sim(buf))
            array[i] = buf;
        else
        {
            cout << "Element \'" << buf << "\' already exist!" << endl;
            i--;
        }
    }
}
Добавлено через 3 минуты
Цитата Сообщение от rioto Посмотреть сообщение
А у меня почему то он на эту строку ругается
В классе поменяйте строчку
C++
1
bool Set::no_sim(const unsigned int&);
на
C++
1
bool no_sim(const unsigned int&);
1
rioto
0 / 0 / 0
Регистрация: 19.08.2017
Сообщений: 22
21.05.2018, 13:23  [ТС] 11
Спасибо большое. Особенно за i--, я про него забыл(:

Добавлено через 5 минут
А мне просто надо очень много, много учиться
0
21.05.2018, 13:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2018, 13:23

Надо написать функцию, которая по массиву действительных чисел x1, x2, ..., xn находит произведение положительных элементов массива
Надо написать функцию, которая по массиву действительных чисел x1, x2, ..., xn...

Заданный массив S (n) и значения x. Определить, какое минимальное количество элементов массива S надо составить подряд
Доппустим у нас х=17 массвив S={1,5,7,3,2,9,12,,4} ответ получается нужгно 5...

Надо найти номер строки массива размером МхN, в котором находится наибольшее количество четных элементов
Помогите решить, надо найти номер строки массива размером МхN, в котором...


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

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

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