Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.69
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
#1

Разбиения множества - C++

18.05.2012, 19:38. Просмотров 4987. Ответов 82
Метки нет (Все метки)

Добрый вечер.
У меня есть множество точек в трехмерном пространстве, которые я считала и занесла в двухмерный массив. Задача состоит в том, чтобы рассмотреть все разбиения этого множества на два и сравнить их центры тяжести. Но как сравнить я знаю, а вот как разбить понятия не имею.
Например, если у меня три точки, то должно получится три варианта разбиения. Программирую на Си.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 19:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Разбиения множества (C++):

Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В - C++
Введено с клавиатуры число изъять из множества А, если оно является элементом множества А, но не является элементом множества В. ...

Функция разбиения матрицы на две - C++
Доброго времени суток уважаемые форумчане. Столкнулся с проблемой. Необходимо написать функцию разбиения матрицы на две матрицы, в качестве...

Алгоритм разбиения массива на подмассивы - C++
Здравствуйте, помогите написать алгоритм есть массив элементов А вычисляются значения А10 А21 А20 ...

Программа разбиения строк на слова - C++
Привет всем. Прошу объяснить фрагмент когда строк 23-26 в данной программе #include<iostream> #include<cstdio> #include<locale> ...

Функция разбиения строки в части [C++] - C++
Всем доброго времени суток. Нужно написать условие, который разделит (через точки) строку line на lname, fname, mname Например: ...

Множества. Вычислить количество элементов множества Q, связанного c исходными множествами - C++
В общем задание звучит так : Заданы 3 упорядоченных множества F, G и H, представленные файлами f, g и h соответственно. Вычислить...

82
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 16:32 #46
Так... киньте, пожалуйста, функцию grouping. Хочу посмотреть, туда ли вы вставили...
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
20.05.2012, 16:33  [ТС] #47
UFO94, я все переправила и теперь он выдает мне 1 и 2 при трех точках.
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 18:25 #48
При трех точках он должен выдавать:
1
2
3

Добавлено через 3 минуты
Можешь попробовать в строке №21 заменить < на <=, посмотрим результат. И можешь вывести для 4 или 5 точек.
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
20.05.2012, 18:32  [ТС] #49
UFO94, а что это он такое выдает?)

Добавлено через 1 минуту
Цитата Сообщение от UFO94 Посмотреть сообщение
Можешь попробовать в строке №21 заменить < на <=, посмотрим результат. И можешь вывести для 4 или 5 точек.
Тот же результат.
1
2
3
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 18:34 #50
Для 3-х точек это правильный результат. Он был и до замены < на <=?
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
20.05.2012, 18:36  [ТС] #51
Цитата Сообщение от UFO94 Посмотреть сообщение
Он был и до замены < на <=?
Да
Погоди, но он разве не должен выдавать номера точек в разбиении?
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 18:40 #52
А он и выдает. Он выдает номера точек в одной из групп, а именно в меньшей. Вот для 3-х точек и будут разбиения
1 -- 2,3
2 -- 1,3
3 -- 1,2
Из которых меньшие группы
1
2
3
Верни в 21-ю строку знак строгого меньше, и выведи для 5 точек
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
20.05.2012, 18:47  [ТС] #53
Все правильно вывел. Я после одного цикла просто еще слеш н написала и сделал больше пробелы перед разбиениями

1

2

3

4

5

1
2

1
3

1
4

1
5

2
3

2
4

2
5

3
4

3
5

4
5

Добавлено через 1 минуту
Так. Ну получается, что теперь в том if мне надо считать центры тяжести, а для этого надо поднимать из массива еще и координаты точек, то бишь цикл в цикле писать?
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 18:49 #54
Ура. Кстати, выведите еще для какого-нибудь четного значения, 4 или 6

Добавлено через 1 минуту
Ну а в чем сложности? Цикл в цикле -- значит цикл в цикле... Только 1 момент, чтобы считать это все в функции grouping, вам придется добавить в ее аргументы массивы float* *pt и float* mas.
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
20.05.2012, 18:52  [ТС] #55
Он мне выдает разбиения. Наименьшее. А где хранится наибольшее?
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 18:54 #56
Наибольшее -- это все точки, которые не вошли в наименьшее. Т.е., если для 5 точек у нас меьшая группа -- 2,3, то большая, соответственно, 1,4,5

Добавлено через 58 секунд
Можете просто суммировать точки от 1 до N, и в зависимости от того, есть такой номер в массиве или нет использовать эти точки в разных суммах.
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
20.05.2012, 19:24  [ТС] #57
Так. Ладно. Сейчас попробую написать...

Добавлено через 26 минут
Я вот как рассуждаю:
Допустим у меня одна точка. Координаты центра тяжести x0,y0,z0. x0=*mas[i]*(сумма по х-координатам точек в множестве)/k, где х-координата точки, k-кол-во точек в множестве. Получается, что больше никаких циклов не надо?
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 19:37 #58
Сумма в общем случае запишется циклом.
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
20.05.2012, 20:10  [ТС] #59
UFO94, а вот как именно координаты по иксу брать? У меня номера обозначают строки, а не столбцы. Или брать сумму от конкретного номера строки и только столбец менять?

Добавлено через 30 минут
У меня что-то вот такое странное получается

C
1
2
3
4
5
6
7
8
9
10
for(int i=0; i<m; i++){
for(k=0;i<*num[i];k++){
cx+=pt[k][j];
cy+=pt[k][j];
cz+=pt[k][j];
b++;
}
x0=*mas[i]*cx/b;
y0=*mas[i]*cy/b;
z0=*mas[i]*cz/b;
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 20:25 #60
Код для определения центров масс:
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
float x1=0;
float x2=0;
float y1=0;
float y2=0;
float z1=0;
float z2=0;
float mas1=0;
float mas2=0;
for(int i=0; i<N; i++)
{
//Здесь ищем число i в массиве num
if(...)//Если нашли
{
x1+=mas[i]*pt[i][0];
y1+=mas[i]*pt[i][1];
z1+=mas[i]*pt[i][2];
mas1+=mas[i];
}
else
{
x2+=mas[i]*pt[i][0];
y2+=mas[i]*pt[i][1];
z2+=mas[i]*pt[i][2];
mas2+=mas[i];
}
}
x1/=mas1;
x2/=mas2;
y1/=mas1;
y2/=mas2;
z1/=mas1;
z2/=mas2;
float l=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)+(z1-z2)*(z1-z2));//Посчитали расстояние.
Добавлено через 2 минуты
А странное у вас по простой причине -- мы не координаты складываем для получения центра масс, а массу точки, умноженную на координату. И делим, соответственно, на общую массу. А еще во второй строке механическая ошибка, там не i<num[i], а k
0
20.05.2012, 20:25
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 20:25
Привет! Вот еще темы с ответами:

Реализация разбиения числа с Динам. Прогр - C++
Доброго времени суток. Нужна помощь: как с помощью динамического программирования реализовать решение такой вот задачи: &quot;найти...

Функция разбиения строки на отдельные слова - C++
Подскажите, плиз, как написать функцию разбиения строки на отдельные слова. Параметр функции — исходная строка, результат работы —...

Квадрат с вершинами из первого множества накрывает все точки второго множества и имеет минимальную площадь - C++
Даны два множества точек на плоскости. Выбрать четыре различных точки первого множества так, чтобы квадрат с вершинами в этих точках...

Множества . Найти разность полученного множества с заданным - C++
Всем доброго времени суток! Необходима ваша помощь. Никак не могу сделать второй пункт задачи.Суть задачи-найти 1)объединение множества...


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

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

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