Форум программистов, компьютерный форум 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
21.05.2012, 05:03  [ТС]     Разбиения множества #61
C
1
2
3
4
5
6
7
[quote=UFO94;3057948]else
{
x2+=mas[i]*pt[i][0];
y2+=mas[i]*pt[i][1];
z2+=mas[i]*pt[i][2];
mas2+=mas[i];
}[/quote]
Это мы должны вставить вот с этими строчками?

C
1
2
3
4
5
 for(int i=last+1; i<n-m+m1+1; i++) 
      {
         num[m1]=i;
         grouping(n,m,m1+1,num);
      }
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
cfilipasr
Сообщений: n/a
21.05.2012, 05:10     Разбиения множества #62
Вечер, ночь, утро доброе. подскажите в каком разделе можно оставить заказ на выполнение програмы на С++
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
21.05.2012, 05:25  [ТС]     Разбиения множества #63
cfilipasr, уж точно не в этом. Насколько знаю. на форуме помогают разобраться в задаче, а не решают ее за вас.
cfilipasr
Сообщений: n/a
21.05.2012, 05:28     Разбиения множества #64
Ну и спрашиваю есть ли раздел где заказать можно, а то сам не нашол))
Извеняюсь что в этой теме))
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
21.05.2012, 08:26     Разбиения множества #65
ejk, это все вставляется туда, где я в комментах поставил кучу восклицательных знаков, строка №16

cfilipasr, http://www.cyberforum.ru/order-program/
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
21.05.2012, 10:08  [ТС]     Разбиения множества #66
Цитата Сообщение от UFO94 Посмотреть сообщение
x1+=mas[i]*pt[i][0];
Ругается вот на это. Говорит, что "для индекса требуется массив или указатель". Я поставила там перед mas звездочки, а он начал писать, что "недопустимое косвенное обращение".


Цитата Сообщение от UFO94 Посмотреть сообщение
for(int i=0; i<N; i++)
Здесь ему N не нравится.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
21.05.2012, 21:32     Разбиения множества #67
Цитата Сообщение от ejk Посмотреть сообщение
"для индекса требуется массив или указатель"
К аргументам функции grouping добавила float* mas и float* *pt?

Цитата Сообщение от ejk Посмотреть сообщение
Здесь ему N не нравится
Описочка. Там n.
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
22.05.2012, 05:00  [ТС]     Разбиения множества #68
Да, да. Я вчера уже и со скобками разобралась и с указателями. Теперь он у меня выдает большие-большие числа, а в некоторых строчках просто нули.
i перебираю вот так:
C
1
2
3
4
5
6
float x1=0,x2=0,y1=0,y2=0,z1=0,z2=0,mas1=0,mas2=0;
        for(int i=0; i<n; i++)
        {
            for(int k=0;k<=m1;k++)//Здесь ищем число i в массиве num
            {
                if(i==num[k])//Если нашли
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 10:10     Разбиения множества #69
Можете кинуть весь код этого места?
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
22.05.2012, 16:18  [ТС]     Разбиения множества #70
Вся функция grouping
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
void grouping(int n, int m, int m1, int* num, float* mas, float* *pt)//num -- массив номеров точек, которые уже вошли в комбинацию, m1 -- их количество
{
    if(m1==0)
    {
        for(int i=1; i<n-m+1; i++)
        {
            num[0]=i;
            grouping(n,m,1,num,mas,pt);
        }
    }
    else if(m==m1)
    {
        float x1=0,x2=0,y1=0,y2=0,z1=0,z2=0,mas1=0,mas2=0;
        for(int i=0; i<n; i++)
        {
            for(int k=0;k<=m1;k++)//Здесь ищем число i в массиве num
            {
                if(i==num[k])//Если нашли
                {
                    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));//Посчитали расстояние.
        printf("%f", l);
 
        printf("\n");
    }
    else
    {
        int last=num[m1-1];//У нас частицы упорядочены, и если у нас уже была комбинация из 1,3,4 частицы, например, то комбинация из 1,4,3 нас уже не интересует, потому новые частицы имеет смысл присоейдинять к комбинации только начиная с num[m1-1]
        for(int i=last+1; i<n-m+m1+1; i++)//Если номер будет больше, чем n-m+m1+1, то опять-таки комбинации будут повторяться
        {
            num[m1]=i;
            grouping(n,m,m1+1,num,mas,pt);
        }
    }
}
Добавлено через 3 минуты
А еще он вот здесь как-то неправильно считает N. При 3х точках N=5

C
1
2
3
4
5
6
7
8
while(c!=EOF)//Пока не конец файла
    {
        if(c=='\n')//Перенос на следующую строку
            N++;
        c=getc(file);//Считывание следующего символа
    }
    N++;//Теперь N -- это наше реальное количество точек
    fclose(file);
Добавлено через 13 минут
В общем, я сделала немного по-другому считывание N и теперь оно равняется трем при трех точках. Зато теперь у меня в результате выводится не 3 ответа, а 2
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 01:49     Разбиения множества #71
На счет ошибок с массивами -- у вас элемент pt[4][2] (кол-во точек не меньше 5) выводится нормально? Просто если вывести его в основной программе?

По поводу подсчета N.
В каком виде у вас текстовый файл? Я писал под такой:
x1[пробел]y1[пробел]z1[перенос]
x2[пробел]y2[пробел]z2[перенос]
...
xk[пробел]yk[пробел]zk[конец файла]
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
23.05.2012, 10:34  [ТС]     Разбиения множества #72
UFO94, в общем я сделала, чтобы кол-во точек считывалось из файла, тогда все хорошо получается. Он выдает три числа, два из которых совпадают с подсчитанными вручную, а вот третье нет.
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 13:05     Разбиения множества #73
Он точно правильно из файла считывает? Попробуйте распечатать массив.
И какие числа он выдает? (Мы ведь о разбиении говорим, так?)
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
23.05.2012, 14:45  [ТС]     Разбиения множества #74
UFO94, я уже расстояния считаю. Он считает расстояния между центрами тяжестей всех разбиений
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 17:46     Разбиения множества #75
Сами центры тяжести правильно нашел?
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
23.05.2012, 18:13  [ТС]     Разбиения множества #76
Попросила сейчас вывести координаты центров. Ерунда какая-то. Как будто точки неправильно считывает

Добавлено через 6 минут
В общем, он считает правильно только два из трех разбиений. Неправильно считает то, в котором берется одна точка (первая) и две других (вторая и третья)
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 20:53     Разбиения множества #77
Все же, точно все правильно считалось из txt-шника?
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
23.05.2012, 21:10  [ТС]     Разбиения множества #78
UFO94, хм...самое интересное, что все считается правильно. Он берет вторую точку и компанует первую и третью. Потому берет третью и компанует вторую и первую.Но варианта когда он берет первую точку и компанует вторую и третью...он неправильно считает его в общем

Добавлено через 2 минуты
То есть вот:
Файл:
124
915
436

Вот что он выдает

9.000000 1.000000 5.000000
3.250000 2.750000 5.500000
4.000000 3.000000 6.000000
6.333333 1.333333 4.666667

6.000000 2.200000 5.600000
4.571429 2.142857 5.142857

То, что выделено-правильно. А вот в третьем он первое находит как компановку второй и третьей точки, а потом выдает что-то странно, хотя должен бы координаты первой точки
UFO94
 Аватар для UFO94
263 / 252 / 13
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 22:13     Разбиения множества #79
Я вообще не могу понять, почему он разбиение {1}-{2,3} последним считает... Вроде как первым должен.... Надо подумать...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2012, 20:17     Разбиения множества
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 80
25.05.2012, 20:17  [ТС]     Разбиения множества #80
А можно спросить. Если я буду делать считывание по-старому, то что мне ставить в объявлении grouping?

На вот такое считывание и группинг
C
1
2
3
4
5
6
7
8
void grouping(int n, int m, int m1, int* num, float* mas, float* pt)
 
...
 
for(int i=0;i<N;i++){
        for(int j=0;j<3;j++)
        fscanf(file,"%d",&pt[i][j]);
    }
он ругается вот здесь

C
1
2
3
4
x1+=mas[i]*pt[i][j];
y1+=mas[i]*pt[i][j];
z1+=mas[i]*pt[i][j];
...
, что error C2109: для индекса требуется массив или указатель
Yandex
Объявления
25.05.2012, 20:17     Разбиения множества
Ответ Создать тему
Опции темы

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