50 / 3 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
1

Особый цикл

05.02.2013, 15:24. Показов 797. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет. Возникла небольшая проблема при написании программы. Необходим особый цикл. Я совсем не понимаю как его написать, вводится количество точек N, далее необходимо вбить значения координат точек - это отдельные массивы для координат X и Y, это все есть. Но как сделать так, что бы в самом теле цикла происходило разбиение N на группы по три точки, где уже что-либо считается. Если делать методом исключения - то я понимаю только для N = 4, то - есть исключается первое значение, потом вычисляется допустим сумма остальных трех, потом считается значение всех трех точек, кроме второй и т.д. А как организовать такой цикл для произвольного N? Пусть даже не произвольного, но хотя бы кратного трем. Вот пока, что есть:

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
#include "stdafx.h"
#include <iostream>
 
using namespace std;
 
#define dim 100 
 
using namespace std; 
 
int N; //количество точек первой группы
int K; //количество точек второй группы
 
//динамический массив первой группы точек
double points1_x[dim]; 
double points1_y[dim]; 
 
 
int main()
{
    setlocale(LC_ALL,"rus");
 
    cout << "\nВведите количество точек в группе, N = 3, 6, i + 3: \n";
    cin >> N;
 
    cout << "\nВведите координаты точек в группе: \n";
 
    for(int i = 0; i < N; i++ )
    {
        
            cout << "\nКоординаты " << i + 1 <<"-й точки: \n" ;
            cout << " x[" << i + 1 << "] = ";
            scanf_s("%lf",&points1_x[i]);
            cout << " y[" << i + 1 << "] = ";
            scanf_s("%lf",&points1_y[i]);
        
    }
 
    cout << "\nКоординаты имеют точки: \n\n";
 
        for(int i = 0; i < N; i++)
        {
            
            cout << " x[" << i + 1 << "] = ";
            printf_s("%3.2lf",points1_x[i]);
            cout << " y[" << i + 1 << "] = ";
            printf_s("%3.2lf",points1_y[i]);
            printf("\n");
 
        }
 
 
            for(int i = 0; i < N; i++)
            {
                for(int j = 0; j < N; j++)
                {
                    if( i == j) //Проход цикла, исключая n = 1, ... , j член 
                    {
                        continue;
                    }
 
                                         //Скорее всего здесь что-то нужно добавить
                    
                }
            }
 
 
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2013, 15:24
Ответы с готовыми решениями:

Особый элемент
Здравствуйте. Пожалуйста помогите. Нужно осуществить поиск особого элемента в массиве. Это...

Определить скалярное произведение строки и столбца, где расположен максимальный особый элемент
Дан двумерный массив А(N,N) натуральных чисел. Элемент A(I,J) назовем особым , если число,...

Удалить строки заданной матрицы, в которых есть хотя бы один особый элемент
Здравствуйте. Я только начал постигать язык С++ и остановился на одной задачи и не могу сдвинуться...

Удалить первый нулевой элемент массива и добавить после каждого чётного элемента особый элемент
Здравствуйте! Имеется такая задача: 1) Сформировать одномерный массив целых чисел, используя...

16
594 / 532 / 76
Регистрация: 22.03.2011
Сообщений: 1,585
05.02.2013, 15:27 2
прошу прощения, я ничего не понял, вам для каких целей?
0
50 / 3 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 15:29  [ТС] 3
OstapBender, для написание программы нужно, а что?)
0
33 / 33 / 6
Регистрация: 19.01.2013
Сообщений: 33
05.02.2013, 16:56 4
Nuclear_Razor, Как и остальным, мне не очень понятно что вы хотите сделать. Опишите пожалуйста что делает ваша программа поподробнее или вообще для чего она нужна, может есть решение её более простым способом. Если я вас все таки правильно понял то посмотрите на такую вещь как двумерные массивы.
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,739
05.02.2013, 16:58 5
До меня тоже не дошло что нужно сделать
0
50 / 3 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 17:07  [ТС] 6
define undef, можно упростить задачу. Задано количество точек N. Необходимо посчитать центр масс некой фигуры, например треугольника, он считается по трем координатам по X и Y соответственно. Я же не могу просто написать массив накопления суммы и разделить на три. Нужен иной цикл. Цикл с последовательным исключением координат точки, то есть если их 4: то делать так исключить первую точку, посчитать Xc и Yc последующих трех, потом исключить вторую точку и посчитать Xc и Yc для первой и последних, кроме второй. То есть получиться четыре разных значения центра масс. Так вот мне интересно, как организовать такой цикл, для произвольного количества точек. Насчет двумерных массивов - я одномерные использовал для наглядности вывода на экран, в задаче это не принципиально важно какой тип массивов использовать.
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,739
05.02.2013, 17:25 7
Крнечно Вы можете вводить какие-то свои термины - но при этом другим становится Вас трудно понять. Фигура на плоскости XY не имеет объема, а значит нет и массы. Наверное Вам нужно найти точку ее центра. Простейший способ сложить все X/Y и поделить на число точек. Вас смущает что точки могут стоять "где густо а где и пусто" - и Вы ищете способ лучше. Так?
0
50 / 3 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 17:31  [ТС] 8
Igor3D, масса может сосредоточена в точках, на сторонах фигуры или равномерно распределена по всей площади фигуры. Дело вообще не в математическом аспекте, а именно в самом цикле. Я просто привел центр масс как пример для решения. Я думаю тут дело даже не в цикле, если использовать такой "метод" , а может быть в рекурсии. Рекурсию не знаю совсем.
0
171 / 79 / 4
Регистрация: 05.12.2012
Сообщений: 217
05.02.2013, 17:31 9
Пускай у Вас есть N точек и требуется найти все K-элементные подмножества и что-то с ними сделать.
Если совсем по деревенски, то я это вижу как-то так:
// Здесь, array - массив точек, result - результ( в каком-то твоем виде ), placesArray - вектор, временно хранящий позиции выбранных элементов. Код очень схематический, поскольку все равно четко сформулированной задачи я не понял
В программе запускаешь do_step_for_i( result, array, placesArray )
Smth, YourType - Ваши форматы результата и условия.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool do_step_for_i( Smth& result, const YourType& array, vector& placesArray, int place = 0, int i = K )
{
if ( i == 0 )
{
//Делаешь, что хочешь - выбранные элементы маркируются значениями в placesArray
return false;
}
 
for ( int k = place; k < N - i; ++k )
{
placesArray.push_back( k );
do_step_for_i(  result, array, placesArray, k + 1, i - 1 );
placesArray.pop_back( k );
}
}
0
Заблокирован
Автор FAQ
05.02.2013, 17:31 10
Nuclear_Razor, надо было написать что всё тело разбиваешь в плоскости на элементарные треугольники, что для каждого треугольника находишь элементарный центр масс, из центров масс молучаешь сетку уже 2-го порядка (т.е теже треугольники но в 3 раза меньше чем изначальных точке) и делаешь такие вот подсчёты пока точек не останется три штуки - это будут те самые последни 3 точки(у меня они красным), которые и дадут при подсчёте их центра масс - центр масс всего тела. Ну и что тебя тут смущает?Заведи цикл для всех точек и для каждой тройки найди центр масс и так прогони итерационно до 3-х точек
Изображения
 
0
50 / 3 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 17:42  [ТС] 11
-=ЮрА=-, вот насчет прогнать итерационно - я ничего не понял

St-Voland, хм, спасибо!
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,739
05.02.2013, 17:50 12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
надо было написать что всё тело разбиваешь в плоскости на элементарные треугольники, что для каждого треугольника находишь элементарный центр масс, из центров масс молучаешь сетку уже 2-го порядка
Операция разбиения может быть сложной если фигура не выпуклая. И что-то не очень ясно как строить сетки 2-го и след порядков. Может по-народному, Монте-Карликом?
0
Заблокирован
Автор FAQ
05.02.2013, 18:18 13
Цитата Сообщение от Nuclear_Razor Посмотреть сообщение
-=ЮрА=-, вот насчет прогнать итерационно - я ничего не понял
показываю как оно всё может выглядеть
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
#include <cmath>
#include <ctime>
#include <iostream>
using namespace std;
 
struct my_point
{
    double x;
    double y;
};
 
my_point getCentoid(my_point p1, my_point p2, my_point p3);
my_point * getCentr(my_point * pCoord, int n);
 
int main()
{
    int N = 15;
    int i = 0;
    srand(time(0));//Устанавливаем нач значение ген-ра случ чисел
    my_point * pCoords = new my_point[N];
    cout<<"Input points : "<<endl;
    for(i = 0; i < N; i++)
    {
        pCoords[i].x = (rand()%20 - 10) / 10.0;
        pCoords[i].y = (rand()%20 - 10) / 10.0;
        cout<<"("<<pCoords[i].x<<";"<<pCoords[i].y<<")"<<endl;
    }
    do
    {
        pCoords = getCentr(pCoords, N);
    }
    while(1 < (N /= 3));
    cout<<"Center of figure : "<<"("<<pCoords[0].x<<";"<<pCoords[0].y<<")"<<endl;
    return 0;
}
 
my_point getCentoid(my_point p1, my_point p2, my_point p3)
{
    my_point pCentr = {0};
    pCentr.x = (p1.x + p2.x + p3.x) / 3;
    pCentr.y = (p1.y + p2.y + p3.y) / 3;
    return pCentr;
}
 
my_point * getCentr(my_point * pCoord, int n)
{
    my_point * pCentr = new my_point[n / 3 + 1];
    my_point p1 = {0};
    my_point p2 = {0};
    my_point p3 = {0};
    int i, j = 0;
    for(i = 2; i < n; i += 2, j++)
    {
        p1 = pCoord[i - 2];
        p2 = pCoord[i - 1];
        p3 = pCoord[i - 0];
        pCentr[j] = getCentoid(p1, p2, p3);
    }
    return pCentr;
}
Справка здесь
http://ru.wikipedia.org/wiki/Центроид_треугольника
http://dxdy.ru/topic12982.html
при решении сделано предположение о равенстве масс всех элементарных узлов
http://codepad.org/PIOevn2r
Кликните здесь для просмотра всего текста
Input points :
(0.3;0.2)
(0;-0.2)
(0.8;-0.5)
(0.9;0.1)
(-0.9;0.4)
(0;0.3)
(-0.4;-1)
(0.4;-1)
(-1;0.5)
(0.8;0.4)
(-0.7;0.9)
(0.1;0.2)
(0;-0.1)
(0.4;-0.6)
(0.6;-0.5)
Center of figure : (0.0666667;-0.0888889)
Миниатюры
Особый цикл  
0
Заблокирован
Автор FAQ
05.02.2013, 18:26 14

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Операция разбиения может быть сложной если фигура не выпуклая. И что-то не очень ясно как строить сетки 2-го и след порядков.
- речь шла о двумерной сетке
Цитата Сообщение от Nuclear_Razor Посмотреть сообщение
далее необходимо вбить значения координат точек - это отдельные массивы для координат X и Y, это все есть.
потому проблем с нахождением элементарных центров просто нет - главное лишь бы плотность везде одинаковой была - это вот для этого
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
при решении сделано предположение о равенстве масс всех элементарных узлов
(в принципе в физике так и предполагают что плотность тела во всех точках одинакова)



Добавлено через 4 минуты

Не по теме:

Цитата Сообщение от Igor3D Посмотреть сообщение
Может по-народному, Монте-Карликом?
- покажи как ты хотел использовать данный метод чисто теоретически (интересно поглядеть)

0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,739
05.02.2013, 18:40 15
Ну если фигура выпуклая, то все просто
C++
1
2
3
4
5
6
7
8
9
10
11
12
Point ConvexCenter( const Point * src, int num )
{
 Point cntr(0, 0);
 float sumW = 0.0f;
 for (int i = 0; i < num - 2; ++i) {
   float w = cross(src[0], src[i + 1], src[i + 2]);
   cntr += (src[0] + src[i + 1] + src[i + 2]) * w / 3;
   sumW += w;
 }
 cntr /= sumW;
 return cntr;
}
cross - банальное векторное произведение (разберется). И это точный центр, без всяких предположений. Но вот если фигура невыпуклая - не вижу простого решения. Юра, я слышал Ваш вопрос, но давайте подождем ТС (что ему надо хз) чтобы попусту воздух не гонять
0
50 / 3 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 18:51  [ТС] 16
Всем большое спасибо за подсказки! Вы мне очень помогли!

Юрий, этот участок кода в вашей программе очень пригодился:

C++
1
2
3
4
5
6
7
for(i = 2; i < n; i += 2, j++)
    {
        p1 = pCoord[i - 2];
        p2 = pCoord[i - 1];
        p3 = pCoord[i - 0];
        pCentr[j] = getCentoid(p1, p2, p3);
    }
Сам код по себе не сложный.


Igor3D, честно говоря, у вас я уже не понял, что значит строка:

C++
1
 float sumW = 0.0f; //0.0f - что это?)
Добавлено через 2 минуты
Igor3D, если фигура не выпуклая, то используя метод Монте - Карло, нужно будет найти площадь многоугольника?
0
1823 / 731 / 99
Регистрация: 01.10.2012
Сообщений: 3,739
05.02.2013, 19:04 17
Цитата Сообщение от Nuclear_Razor Посмотреть сообщение
C++
1
 float sumW = 0.0f; //0.0f - что это?)
Константа 0.0f имеет тип float, в 0.0 double
Центр равен взвешенной (по площади) сумме всех треугольников

Цитата Сообщение от Nuclear_Razor Посмотреть сообщение
если фигура не выпуклая, то используя метод Монте - Карло, нужно будет найти площадь многоугольника?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Point CenterMonteCarlo( const Point bounds[2], const Point * src, int num, int numTry )
{
 srand(0);
 Point cntr(0, 0);
 int numInside = 0;
 for (int i = 0; i < numTry; ++i) {
  float x = float(rand()) / RAND_MAX;
  float y = float(rand()) / RAND_MAX;
  Point test(bounds[0].x + x * (bounds[1].x - bounds[1].x),
                  bounds[0].y + y * (bounds[1].y - bounds[1].y));
  if (!PtInside(test, src, num)) continue;
  cntr += test;
  ++numInside;
 }
 if (!numInside) return (bounds[0] + bounds[1]) / 2;  // too small
 return cntr / numInside;
}
Тут надо рожать PtInside что не так уж просто - но все-таки куда проще чем триангуляция по полной программе
0
05.02.2013, 19:04
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.02.2013, 19:04
Помогаю со студенческими работами здесь

Задача на "особый" элемент матрицы
Задача: Делаю так: #include &lt;iostream&gt; int main() { using namespace std; int N,...

Цикл: Посчитать среднее арифметическое всех чисел в заданном диапазоне. Цикл while.
Напишите пожалуйста код для данной задачки с помощью цикла while Вывести числа в пользовательском...

Цикл: Определить, сколько простейших организмов будет через каждый период их деления. Цикл while.
Напишите пожалуйста код к этой задачке, неделю уже ломаю себе голову как ее решить. Одноклеточная...

Цикл: цикл for вообще никак не воспринимается транслятором
Пишу программу, которая производит различные действия с одномерным массивом. Возникла следующая...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru