Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 46

Удалить повторяющиеся значения из массивов

20.05.2019, 12:53. Показов 2193. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
У меня есть 2 массива, которые являются координатами по x и по y, я хочу удалить повторяющиеся координаты, у меня не получается реализовать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
20.05.2019, 12:53
Ответы с готовыми решениями:

Как удалить повторяющиеся элементы двух массивов?
Имеется три массива $m_1, $m_2 и $m_3. Первый массив содержит буквенно-цифровые элементы, разделенные пробелами: $m_1 = "n 1 1...

Удалить повторяющиеся значения
Подскажите как удалить повторяющиеся значения из условия. Хочется чтобы одно и тоже значение не повторялось в таблице. SELECT * ...

Удалить повторяющиеся значения
Доброго времени суток, подскажите как удалить дубликаты строк. БД - ( , , , , , , ...

29
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 46
21.05.2019, 22:28  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от zayats80888 Посмотреть сообщение
рандомно
Нет. Сначала в массиве формируются точки пересечения сектора(квадрата) с многоугольником, дальше к ним добавляются вершины сектора, которые лежат внутри многоугольника, потом удаляем повторяющиеся координаты, и так получается наш массив. Вот наш старый добрый код:
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
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
#include "pch.h"
#include <math.h>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
struct flat_vector
{
    double x;
    double y;
};
flat_vector operator-(const flat_vector& lh, const flat_vector& rh)
{
    return flat_vector
    {
        lh.x - rh.x,
        lh.y - rh.y
    };
}
flat_vector operator*(const flat_vector& lh, const flat_vector& rh)
{
    return flat_vector
    {
        lh.x * rh.x,
        lh.y * rh.y
    };
}
 
double angle(flat_vector& xy1, flat_vector& xy2) {
    return xy1.x * xy2.y - xy2.x*xy1.y;
}
ostream &operator<<(ostream&ost, const flat_vector&obj)
{
    ost << "(" << obj.x << ";" << obj.y << ")";
    return ost;
}
bool operator<(flat_vector lh, flat_vector rh) {
    if (lh.x <= rh.x && lh.y <= rh.y) {
        return true;
    }
    else {
        return false;
    }
}
bool operator>(flat_vector lh, flat_vector rh) {
    if (lh.x >= rh.x && lh.y >= rh.y) {
        return true;
    }
    else {
        return false;
    }
    
}
bool operator==(flat_vector lh, flat_vector rh) {
    if (lh.x == rh.x && lh.y == rh.y) {
        return true;
    }
    else {
        return false;
    }
}
bool operator!=(flat_vector lh, flat_vector rh) {
    if (lh.x != rh.x && lh.y != rh.y) {
        return true;
    }
    else {
        return false;
    }
}
flat_vector max(flat_vector& pxy1, flat_vector& pxy2) {
    if (pxy1.x >= pxy2.x && pxy1.y >= pxy2.y) {
        return flat_vector{
            pxy1.x, pxy1.y
        };
    }
    else if (pxy1.x >= pxy2.x && pxy1.y <= pxy2.y) {
        return flat_vector{
            pxy1.x,pxy2.y
        };
    }
    else if (pxy1.x <= pxy2.x && pxy1.y <= pxy2.y) {
        return flat_vector{
            pxy2.x, pxy2.y
        };
    }
    else {
        return flat_vector{
            pxy2.x, pxy1.y
        };
    }
}
flat_vector min(flat_vector& pxy1, flat_vector& pxy2) {
    if (pxy1.x >= pxy2.x && pxy1.y >= pxy2.y) {
        return flat_vector{
            pxy2.x, pxy2.y
        };
    }
    else if (pxy1.x >= pxy2.x && pxy1.y <= pxy2.y) {
        return flat_vector{
            pxy2.x,pxy1.y
        };
    }
    else if (pxy1.x <= pxy2.x && pxy1.y <= pxy2.y) {
        return flat_vector{
            pxy1.x, pxy1.y
        };
    }
    else {
        return flat_vector{
            pxy1.x, pxy2.y
        };
    }
}
flat_vector pere(flat_vector& xyp1, flat_vector& xyp2, flat_vector& pxy1, flat_vector& pxy2) {
    double eps = 0.001;
    double z = ((xyp1.x - xyp2.x)*(pxy1.y - pxy2.y) - (xyp1.y - xyp2.y)*(pxy1.x - pxy2.x));
    double q = ((xyp1.x*xyp2.y - xyp1.y * xyp2.x)*(pxy1.x - pxy2.x) - (xyp1.x - xyp2.x)*(pxy1.x*pxy2.y - pxy1.y * pxy2.x))/z;
    double e = ((xyp1.x*xyp2.y - xyp1.y * xyp2.x)*(pxy1.y - pxy2.y) - (xyp1.y - xyp2.y)*(pxy1.x*pxy2.y - pxy1.y * pxy2.x))/z;
    if (abs(z) >=eps) {
        return flat_vector{
            q,
            e
        };
    }
    else {
        return flat_vector{
            NULL,NULL
        };
    }
}
template<typename T> void foo(vector<T>& v)
{
    vector<int> uniq(v.size(), 0);
    vector<T> result;
    result.reserve(v.size());
    for (size_t i{}; i < v.size(); ++i)
        if (!uniq[i])
        {
            result.push_back(v[i]);
            for (size_t j = i + 1; j < v.size(); ++j)
                if (v[i] == v[j])
                    uniq[j] = 1;
        }
    result.swap(v);
}
int main() {
    vector<flat_vector> xyp{ {0,0},{2,0},{4,4},{2,4} };// координаты многоугольника
    double n = xyp.size();
    vector<flat_vector> pxy{ {2,1},{3,1},{3,2},{2,2} };
    double b = pxy.size();
    xyp.push_back(xyp[0]);
    pxy.push_back(xyp[0]);
    flat_vector nu{NULL,NULL} ;
    vector<flat_vector> xxyy;
    vector<flat_vector> lxy;
    int k = 0;
    int m = 0;
 
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < b; j++) {
            xxyy.push_back(pere(xyp[i], xyp[i + 1], pxy[j], pxy[j + 1]));
            if (xxyy[k] != nu) {
                //cout << max(pxy[j], pxy[j + 1]) << " - " << min(pxy[j], pxy[j + 1])<<"------"<<xxyy[k] << endl;
                if (xxyy[k] < max(pxy[j], pxy[j + 1]) && xxyy[k] > min(pxy[j], pxy[j + 1])) {
                    lxy.push_back(xxyy[k]);
                    cout << lxy[m]<<endl;       
                    m++;
                }
            }
            k++;
            
        }
        cout << "--------" << endl;
    }
 
    vector<flat_vector> xxy;
    vector<flat_vector> x_y;
    double *ug;
    int s = 0;
    int l = 0;
    ug = new double[n];
    for (int j = 0; j < b; j++) { //определяю какие точки сектора лежат в многоугольнике
        for (int i = 0; i < n; i++) {
            xxy.push_back(pxy[j] - xyp[i]);
            x_y.push_back(xyp[i + 1] - pxy[j]);
        }
        for (int i = 0; i < n; i++) {
            ug[i] = angle(xxy[l], x_y[l]);
            l++;
            if (ug[i] > 0) {
                s = 1;
            }
        }
        cout << "Tochka " << pxy[j];
        if (s == 0) {
            lxy.push_back(pxy[j]);
            cout << " vnutri" << endl;
            m++;
        }
        else
        {
            cout << ") snaruzhi" << endl;
        }
        s = 0;
    }
    foo(lxy);
    lxy.push_back(lxy[0]);
    m = lxy.size();
    double *ar;
    ar = new double[m];
    double area=0;
    for (int i = 0; i < m ; i++) {
        cout << lxy[i] << endl;
    }
    for (int i = 0; i < m-1; i++) {
        ar[i] = angle(lxy[i],lxy[i+1]);
        area += ar[i];
    }
    area /= 2;
    cout << area;
    return 0;
}

Все нужные нам координаты содержатся в lxy
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
21.05.2019, 22:43
Всеволодович, короче вот сортировка точек, обход против часовой стрелки
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
struct flat_vector
{
    double x;
    double y;
};
 
flat_vector operator+(const flat_vector& lh, const flat_vector& rh)
{
    return flat_vector
    {
        lh.x + rh.x,
        lh.y + rh.y
    };
}
 
flat_vector operator*(const flat_vector& lh, double rh)
{
    return flat_vector
    {
        lh.x * rh,
        lh.y  *rh
    };
}
 
double angle(const flat_vector& lh, const flat_vector& rh)
{
    return lh.x * rh.y - rh.x * lh.y;
}
 
flat_vector operator-(const flat_vector& v) { return v * -1; }
 
double length(const flat_vector& v) { return sqrt(v.x*v.x + v.y*v.y); }
 
struct Poly
{
    std::vector<flat_vector> points;
 
    void move(const flat_vector& v)
    {
        for (auto& p : points)
            p = p + v;
    }
 
    flat_vector center()
    {
        return std::accumulate(points.begin(), points.end(), flat_vector{ 0,0 })*(1.0 / points.size());
    }
 
    void sort()
    {
        flat_vector c{ center() },
                    base{ 1,0 };
        move(-c);
        std::sort(points.begin(), points.end(), [&base](const auto& lh, const auto& rh)
        {
            return angle(base, lh * (1 / length(lh))) < angle(base, rh * (1 / length(rh)));
        });
        move(c);
    }
};
 
void print(const Poly& l)
{
    for (const auto& p : l.points)
        std::cout << '(' << p.x << ", " << p.y << ") ";
    std::cout << std::endl;
}
 
int main()
{
    Poly p{ {{1,1},{3,3},{2,3},{3,2}} };
    print(p);
    p.sort();
    print(p);
}
0
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 46
21.05.2019, 22:53  [ТС]
Я решил добавить в код вот так,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void move(vector <flat_vector> points, const flat_vector& v)
    {
        for (auto& p : points)
            p = p + v;
    }
 
    flat_vector center(vector <flat_vector> points )
    {
        return accumulate(points.begin(), points.end(), flat_vector{ 0,0 })*(1.0 / points.size());
    }
 
    void sort(vector <flat_vector> points, flat_vector center)
    {
        flat_vector c{ center },
            base{ 1,0 };
        move(-c);
        sort(points.begin(), points.end(), [&base](const auto& lh, const auto& rh) { return angle(base, lh) < angle(base, rh); });
        move(c);
    }
Если делать со структурой, то придётся очень много менять и добавлять, и меня проблема в этой строке
sort(points.begin(), points.end(), [&base](const auto& lh, const auto& rh) { return angle(base, lh) < angle(base, rh);
Возможно без структуры обойтись нельзя, но если можно, то как исправить?
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
21.05.2019, 23:03
Всеволодович, я там sort() исправил, посмотрите

Добавлено через 48 секунд
Цитата Сообщение от Всеволодович Посмотреть сообщение
Возможно без структуры обойтись нельзя
ok, ща перепишу

Добавлено через 4 минуты
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
struct flat_vector
{
    double x;
    double y;
};
 
flat_vector operator+(const flat_vector& lh, const flat_vector& rh)
{
    return flat_vector
    {
        lh.x + rh.x,
        lh.y + rh.y
    };
}
 
flat_vector operator*(const flat_vector& lh, double rh)
{
    return flat_vector
    {
        lh.x * rh,
        lh.y  *rh
    };
}
 
double angle(const flat_vector& lh, const flat_vector& rh)
{
    return lh.x * rh.y - rh.x * lh.y;
}
 
flat_vector operator-(const flat_vector& v) { return v * -1; }
 
double length(const flat_vector& v) { return sqrt(v.x*v.x + v.y*v.y); }
 
 
void move(std::vector<flat_vector>& points, const flat_vector& v)
{
    for (auto& p : points)
        p = p + v;
}
 
flat_vector center(const std::vector<flat_vector>& points)
{
    return std::accumulate(points.begin(), points.end(), flat_vector{ 0,0 })*(1.0 / points.size());
}
 
void sort(std::vector<flat_vector>& points)
{
    flat_vector c{ center(points) },
                base{ 1,0 };
    move(points, -c);
    std::sort(points.begin(), points.end(), [&base](const auto& lh, const auto& rh)
    {
        return angle(base, lh * (1 / length(lh))) < angle(base, rh * (1 / length(rh)));
    });
    move(points, c);
}
 
 
void print(const std::vector<flat_vector>& points)
{
    for (const auto& p : points)
        std::cout << '(' << p.x << ", " << p.y << ") ";
    std::cout << std::endl;
}
 
int main()
{
    std::vector<flat_vector> p {{1,1},{20,20},{2,3},{3,2}};
    print(p);
    sort(p);
    print(p);
}
0
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 46
21.05.2019, 23:20  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
points.begin()
на 56 строке выдаёт "начальное значение ссылки на неконстантный параметр должно быть левосторонним значением" с этим я ещё не сталкивался
Цитата Сообщение от zayats80888 Посмотреть сообщение
points.end()
А тут "слишком много аргументов в вызове функции"
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
21.05.2019, 23:44
Цитата Сообщение от Всеволодович Посмотреть сообщение
на 56 строке выдаёт
В моем коде?

Добавлено через 1 минуту
Вот все работает:
https://rextester.com/ZDSE15231

Добавлено через 2 минуты
Попробуйте поддержку С++11 включить
0
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 46
22.05.2019, 00:37  [ТС]
Да, вроде, должно быть включено..
0
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 46
22.05.2019, 11:06  [ТС]
я просто не добавил
C++
1
#include <algorithm>
Но алгоритм, к сожалению, не совсем хороший, вот пример работы
ввод: (1, 1) (4, 5) (2, 3) (3, 2) (0, 2)
вывод: (1, 1) (3, 2) (0, 2) (4, 5) (2, 3)

Добавлено через 1 час 14 минут
в 54 строке я поменял
C++
1
base{ 1,0 };
на base{ 0,1 }; и всё начало работать правильно)
0
 Аватар для zayats80888
6354 / 3525 / 1428
Регистрация: 07.02.2019
Сообщений: 9,008
22.05.2019, 19:13
Цитата Сообщение от Всеволодович Посмотреть сообщение
Но алгоритм, к сожалению, не совсем хороший, вот пример работы
Да он не правильный
Цитата Сообщение от Всеволодович Посмотреть сообщение
на base{ 0,1 }; и всё начало работать правильно)
К сожалению и это не правильно, вот переделал:
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
 
constexpr double eps = 1e-8;
 
struct flat_vector
{
    double x;
    double y;
};
 
flat_vector operator+(const flat_vector& lh, const flat_vector& rh)
{
    return flat_vector
    {
        lh.x + rh.x,
        lh.y + rh.y
    };
}
 
flat_vector operator*(const flat_vector& lh, double rh)
{
    return flat_vector
    {
        lh.x * rh,
        lh.y  *rh
    };
}
 
double operator%(const flat_vector& lh, const flat_vector& rh)
{
    return lh.x * rh.y - rh.x * lh.y;
}
 
int quad(const flat_vector& v)
{
    if (v.x > 0 && v.y >= 0) return 0;
    if (v.x <= 0 && v.y > 0) return 1;
    if (v.x < 0 && v.y <= 0) return 2;
    return 3;
}
 
flat_vector operator-(const flat_vector& v) { return v * -1; }
 
void move(std::vector<flat_vector>& points, const flat_vector& v)
{
    for (auto& p : points)
        p = p + v;
}
 
flat_vector center(const std::vector<flat_vector>& points)
{
    return std::accumulate(points.begin(), points.end(), flat_vector{ 0,0 })*(1.0 / points.size());
}
 
void sort(std::vector<flat_vector>& points)
{
    flat_vector c{ center(points) };
    move(points, -c);
    std::sort(points.begin(), points.end(), [](const auto& lh, const auto& rh)
    {
        return quad(lh) < quad(rh) || (quad(lh) == quad(rh) && (lh % rh) > 0);
    });
    move(points, c);
}
 
 
void print(const std::vector<flat_vector>& points)
{
    for (const auto& p : points)
        std::cout << '(' << p.x << ", " << p.y << ") ";
    std::cout << std::endl;
}
 
int main()
{
    std::vector<flat_vector> p {{-2,-1},{2,1},{-1,-2},{1,2},{1,-2},{0,2},{2,-1},{-1,2},{2,0},{-2,1},{-2,0},{0,-2} };
    print(p);
    sort(p);
    print(p);
}
1
0 / 0 / 0
Регистрация: 18.05.2019
Сообщений: 46
22.05.2019, 21:28  [ТС]
zayats80888, спасибо, сейчас проверю))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
22.05.2019, 21:28

Удалить повторяющиеся значения
Здравствуйте. Есть таблица В столбце &quot;Название товара&quot; есть повторяющиеся значения. Они идут подряд. Надо сделать вот что:...

Удалить из списка повторяющиеся значения
Пожалуйста помогите с этими заданиями. Коллекции (10) 1) Дан список, содержащий повторяющиеся значения. Удалить из списка повторяющиеся...

Удалить из строки повторяющиеся значения
Здравствуйте... Столкнулся с проблемой.... я в randomize сделал числа 4 66 2 66 9 0 5 2 а мне надо чтобы он повторяющиеся числа...

Удалить повторяющиеся значения в одной ячейке
Помогите, пожалуйста, справиться с такой задачей. В ячейке массив слов такого вида: -слово1 -слово2 -слово3 -слово2 и т.д.. каким...

Как удалить из списка все повторяющиеся значения?
Как удалить из списка все повторяющиеся значения, оставив только первое вхождение?


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru