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

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

Войти
Регистрация
Восстановить пароль
 
 
Nuclear_Razor
49 / 2 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
#1

Особый цикл - C++

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

Всем привет. Возникла небольшая проблема при написании программы. Необходим особый цикл. Я совсем не понимаю как его написать, вводится количество точек 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.02.2013, 15:24     Особый цикл
Посмотрите здесь:

Особый элемент - C++
Здравствуйте. Пожалуйста помогите. Нужно осуществить поиск особого элемента в массиве. Это последняя моя функция в коде. Что я делаю не...

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

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

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

Реализовать особый поиск - Базы данных
Есть 2 таблицы - GOODS и KEYWORDS. GOODS: id title description rate KEYWORDS: id

Особый редирект по условию - PHP
Подскажите как организовать: Если пользователь переходит на сайт с vk,с определённой страницы,скажем vk.com/id111,то скрипт редиректит на...

Нужен особый Timer - Unity, Unity3D
Всем привет, тема таймера уже неоднократно поднималась. Тем много, многие из них я уже прочел , но так и не нашел нужного. Мне необходим...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
OstapBender
583 / 521 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
05.02.2013, 15:27     Особый цикл #2
прошу прощения, я ничего не понял, вам для каких целей?
Nuclear_Razor
49 / 2 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 15:29  [ТС]     Особый цикл #3
OstapBender, для написание программы нужно, а что?)
define undef
33 / 33 / 1
Регистрация: 19.01.2013
Сообщений: 33
05.02.2013, 16:56     Особый цикл #4
Nuclear_Razor, Как и остальным, мне не очень понятно что вы хотите сделать. Опишите пожалуйста что делает ваша программа поподробнее или вообще для чего она нужна, может есть решение её более простым способом. Если я вас все таки правильно понял то посмотрите на такую вещь как двумерные массивы.
Igor3D
943 / 476 / 43
Регистрация: 01.10.2012
Сообщений: 2,366
05.02.2013, 16:58     Особый цикл #5
До меня тоже не дошло что нужно сделать
Nuclear_Razor
49 / 2 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 17:07  [ТС]     Особый цикл #6
define undef, можно упростить задачу. Задано количество точек N. Необходимо посчитать центр масс некой фигуры, например треугольника, он считается по трем координатам по X и Y соответственно. Я же не могу просто написать массив накопления суммы и разделить на три. Нужен иной цикл. Цикл с последовательным исключением координат точки, то есть если их 4: то делать так исключить первую точку, посчитать Xc и Yc последующих трех, потом исключить вторую точку и посчитать Xc и Yc для первой и последних, кроме второй. То есть получиться четыре разных значения центра масс. Так вот мне интересно, как организовать такой цикл, для произвольного количества точек. Насчет двумерных массивов - я одномерные использовал для наглядности вывода на экран, в задаче это не принципиально важно какой тип массивов использовать.
Igor3D
943 / 476 / 43
Регистрация: 01.10.2012
Сообщений: 2,366
05.02.2013, 17:25     Особый цикл #7
Крнечно Вы можете вводить какие-то свои термины - но при этом другим становится Вас трудно понять. Фигура на плоскости XY не имеет объема, а значит нет и массы. Наверное Вам нужно найти точку ее центра. Простейший способ сложить все X/Y и поделить на число точек. Вас смущает что точки могут стоять "где густо а где и пусто" - и Вы ищете способ лучше. Так?
Nuclear_Razor
49 / 2 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 17:31  [ТС]     Особый цикл #8
Igor3D, масса может сосредоточена в точках, на сторонах фигуры или равномерно распределена по всей площади фигуры. Дело вообще не в математическом аспекте, а именно в самом цикле. Я просто привел центр масс как пример для решения. Я думаю тут дело даже не в цикле, если использовать такой "метод" , а может быть в рекурсии. Рекурсию не знаю совсем.
St-Voland
171 / 79 / 3
Регистрация: 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 );
}
}
-=ЮрА=-
Заблокирован
Автор FAQ
05.02.2013, 17:31     Особый цикл #10
Nuclear_Razor, надо было написать что всё тело разбиваешь в плоскости на элементарные треугольники, что для каждого треугольника находишь элементарный центр масс, из центров масс молучаешь сетку уже 2-го порядка (т.е теже треугольники но в 3 раза меньше чем изначальных точке) и делаешь такие вот подсчёты пока точек не останется три штуки - это будут те самые последни 3 точки(у меня они красным), которые и дадут при подсчёте их центра масс - центр масс всего тела. Ну и что тебя тут смущает?Заведи цикл для всех точек и для каждой тройки найди центр масс и так прогони итерационно до 3-х точек
Изображения
 
Nuclear_Razor
49 / 2 / 0
Регистрация: 22.07.2012
Сообщений: 104
Записей в блоге: 1
05.02.2013, 17:42  [ТС]     Особый цикл #11
-=ЮрА=-, вот насчет прогнать итерационно - я ничего не понял

St-Voland, хм, спасибо!
Igor3D
943 / 476 / 43
Регистрация: 01.10.2012
Сообщений: 2,366
05.02.2013, 17:50     Особый цикл #12
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
надо было написать что всё тело разбиваешь в плоскости на элементарные треугольники, что для каждого треугольника находишь элементарный центр масс, из центров масс молучаешь сетку уже 2-го порядка
Операция разбиения может быть сложной если фигура не выпуклая. И что-то не очень ясно как строить сетки 2-го и след порядков. Может по-народному, Монте-Карликом?
-=ЮрА=-
Заблокирован
Автор 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)
Миниатюры
Особый цикл  
-=ЮрА=-
Заблокирован
Автор FAQ
05.02.2013, 18:26     Особый цикл #14

Не по теме:

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



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

Не по теме:

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

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.02.2013, 18:40     Особый цикл
Еще ссылки по теме:

Особый приоритет приложения - Linux
Здравствуйте. Так как задавал много вопросов тут, но получил только часть ответов, то вынужден продублировать неотвеченные вопросы. Есть...

QFileSystemModel и особый фильтр - C++ Qt
Возникла небольшая проблема, а именно, использую QFileSystemModel и отображаю в QTreeView (все работает идеально), но нужно сделать так...

Особый ввод массивов - Turbo Pascal
Имеется прейскурант К услуг по ремонту автомобилей в виде: название, шифр и стоимость услуг. Для каждого автомобиля известны наряд-зааказы...

Ищу особый менеджер загрузок - Софт
Нужна такая функция, чтобы качать файл несколькими потоками и каждый поток качал с отдельного прокси. Посоветуйте


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

Или воспользуйтесь поиском по форуму:
Igor3D
943 / 476 / 43
Регистрация: 01.10.2012
Сообщений: 2,366
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 - банальное векторное произведение (разберется). И это точный центр, без всяких предположений. Но вот если фигура невыпуклая - не вижу простого решения. Юра, я слышал Ваш вопрос, но давайте подождем ТС (что ему надо хз) чтобы попусту воздух не гонять
Yandex
Объявления
05.02.2013, 18:40     Особый цикл
Ответ Создать тему
Опции темы

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