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

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

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

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

18.05.2012, 19:38. Просмотров 4925. Ответов 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
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
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);
      }
0
cfilipasr
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 2
21.05.2012, 05:10 #62
Вечер, ночь, утро доброе. подскажите в каком разделе можно оставить заказ на выполнение програмы на С++
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
21.05.2012, 05:25  [ТС] #63
cfilipasr, уж точно не в этом. Насколько знаю. на форуме помогают разобраться в задаче, а не решают ее за вас.
0
cfilipasr
0 / 0 / 0
Регистрация: 17.05.2012
Сообщений: 2
21.05.2012, 05:28 #64
Ну и спрашиваю есть ли раздел где заказать можно, а то сам не нашол))
Извеняюсь что в этой теме))
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
21.05.2012, 08:26 #65
ejk, это все вставляется туда, где я в комментах поставил кучу восклицательных знаков, строка №16

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


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

Цитата Сообщение от ejk Посмотреть сообщение
Здесь ему N не нравится
Описочка. Там n.
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
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])//Если нашли
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
22.05.2012, 10:10 #69
Можете кинуть весь код этого места?
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
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
0
UFO94
264 / 253 / 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[конец файла]
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
23.05.2012, 10:34  [ТС] #72
UFO94, в общем я сделала, чтобы кол-во точек считывалось из файла, тогда все хорошо получается. Он выдает три числа, два из которых совпадают с подсчитанными вручную, а вот третье нет.
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 13:05 #73
Он точно правильно из файла считывает? Попробуйте распечатать массив.
И какие числа он выдает? (Мы ведь о разбиении говорим, так?)
0
ejk
0 / 0 / 0
Регистрация: 14.05.2012
Сообщений: 81
23.05.2012, 14:45  [ТС] #74
UFO94, я уже расстояния считаю. Он считает расстояния между центрами тяжестей всех разбиений
0
UFO94
264 / 253 / 13
Регистрация: 04.04.2012
Сообщений: 546
23.05.2012, 17:46 #75
Сами центры тяжести правильно нашел?
0
23.05.2012, 17:46
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.05.2012, 17:46
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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