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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 36, средняя оценка - 4.69
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
18.05.2012, 19:38     Разбиения множества #1
Добрый вечер.
У меня есть множество точек в трехмерном пространстве, которые я считала и занесла в двухмерный массив. Задача состоит в том, чтобы рассмотреть все разбиения этого множества на два и сравнить их центры тяжести. Но как сравнить я знаю, а вот как разбить понятия не имею.
Например, если у меня три точки, то должно получится три варианта разбиения. Программирую на Си.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
20.05.2012, 15:00  [ТС]     Разбиения множества #41
На вот это ругается
C
1
c=getc(f);
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 15:25     Разбиения множества #42
Как именно?
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
20.05.2012, 15:35  [ТС]     Разбиения множества #43
UFO94, неизвестный идентификатор f
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 15:37     Разбиения множества #44
А, черт побери, там вместо f надо file
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
20.05.2012, 15:43  [ТС]     Разбиения множества #45
Он еще ругался на маленький n, но я переправила его на большой.
Выдает несуразицу
1
-336860192
11966294743
18621
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 16:32     Разбиения множества #46
Так... киньте, пожалуйста, функцию grouping. Хочу посмотреть, туда ли вы вставили...
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
20.05.2012, 16:33  [ТС]     Разбиения множества #47
UFO94, я все переправила и теперь он выдает мне 1 и 2 при трех точках.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 18:25     Разбиения множества #48
При трех точках он должен выдавать:
1
2
3

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

Добавлено через 1 минуту
Цитата Сообщение от UFO94 Посмотреть сообщение
Можешь попробовать в строке №21 заменить < на <=, посмотрим результат. И можешь вывести для 4 или 5 точек.
Тот же результат.
1
2
3
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 18:34     Разбиения множества #50
Для 3-х точек это правильный результат. Он был и до замены < на <=?
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
20.05.2012, 18:36  [ТС]     Разбиения множества #51
Цитата Сообщение от UFO94 Посмотреть сообщение
Он был и до замены < на <=?
Да
Погоди, но он разве не должен выдавать номера точек в разбиении?
UFO94
 Аватар для UFO94
263 / 252 / 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 точек
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
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 мне надо считать центры тяжести, а для этого надо поднимать из массива еще и координаты точек, то бишь цикл в цикле писать?
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 18:49     Разбиения множества #54
Ура. Кстати, выведите еще для какого-нибудь четного значения, 4 или 6

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

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

Добавлено через 26 минут
Я вот как рассуждаю:
Допустим у меня одна точка. Координаты центра тяжести x0,y0,z0. x0=*mas[i]*(сумма по х-координатам точек в множестве)/k, где х-координата точки, k-кол-во точек в множестве. Получается, что больше никаких циклов не надо?
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
20.05.2012, 19:37     Разбиения множества #58
Сумма в общем случае запишется циклом.
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
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;
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.05.2012, 20:25     Разбиения множества
Еще ссылки по теме:

C++ Число изъять из множества А, если оно является элементом множества А, но не является элементом множества В
C++ Программа разбиения строк на слова
Алгоритм разбиения массива на подмассивы C++

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

Или воспользуйтесь поиском по форуму:
UFO94
 Аватар для UFO94
263 / 252 / 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
Yandex
Объявления
20.05.2012, 20:25     Разбиения множества
Ответ Создать тему
Опции темы

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