Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ массив с координатами точек

Автор: *оля* 28.10.2010 22:07

Задан вещественный массив размера 2*N, каждая пара элементов которого
содержит координаты точки x и y. Определить номера пар задающих точки с
максимальным расстоянием между ними.


не могли бы вы объяснить немного сам смысл задачи? и как можно организовать цикл, чтобы рассмотреть все комбинации?
расстояние я понимаю нужно считать по формуле: sqrt( pow((x2-x1),2.0)+pow((y2-y1),2.0))?

Автор: Client 28.10.2010 22:15

for (i=0; i<n-1; i++)
for (j=i+1; j<n; j++)
Примерно так

Автор: *оля* 28.10.2010 22:19

ну так мы же получим только согласно задаче x или y, а как сделать, чтобы получить и x, и y, чтобы посчитать расстояние?
либо я не совсем понимаю задание

Автор: Client 28.10.2010 22:21

хм. Данные расположены
XY XY XY XY
так? т.е. вектор?

Автор: *оля* 28.10.2010 22:24

вот я и не знаю, что тут имеется в виду, просто смущает то, что в задании массива цифра 2)
не может быть так:
X X X X
Y Y Y Y

?

хотя вряд ли наверное?

Автор: Client 28.10.2010 22:31

если матрица, то просто один цикл.
Если вектор. пусть будут точки
11 22 33 44. Итого четыре точки (X и Y)

for (i=0; i<n-1; i++) //n = 4
for (j=i+1; j<n; j++)

чтобы получить теперь X и Y для первой точки, можно написать так
if ((i-1)*2 +1) //будет X
if ((i-1)*2 +2) //будет Y

и для j надо тоже найти x и y

Автор: *оля* 29.10.2010 0:18

=(((
пытаюсь вникнуть, но не понимаю

Цитата(Client @ 28.10.2010 18:31) *

если матрица, то просто один цикл.




если делаю так:


while (i<2) {
for (int j=0; j<m-1; j++) // получаем x
for ( int jj=1; jj<m; jj++) // получаем y
...



то это только одна точка, а надо сразу две

Автор: Client 29.10.2010 0:54

#include <stdio.h>
#include <iostream>

using namespace std;
int main(int argc, char **argv)
{
int arr[2][4];
for (int i = 0; i<2; i++)
for(int j = 0; j<4; j++)
arr[i][j] = i*10 + j +1;
for (int i = 0; i<2; i++){
for(int j = 0; j<4; j++)
cout << arr[i][j] << '\t';
cout << '\n';
}
cout << '\n';
for (int i = 0; i<4-1; i++){
cout << "ARR I= "<< i <<"; " << arr[0][i] << "__" << arr[1][i] << '\t';
cout << '\n';
for (int j =i+1; j<4; j++){
cout << "ARR J=" << j << "; " << arr[0][j] << "__" << arr[1][j] << '\t';
}
cout << '\n';
cout << '\n';
}

return 0;
}

Вот как бы визуальное представление.
надо только посчитать и найти 2 точки.

Автор: Lapp 29.10.2010 7:08

М
А почему вторая тема за день с тем же названием?? blink.gif *Оля*, у вас так принято? Подумай немного о других..
Переделай, пожалуйста.
Кстати, это также повод перечитать еще разок три пункта правил этого раздела (вверху страницы). Особенно, третий пункт.


Автор: Lapp 29.10.2010 15:58

Спасибо.

Автор: *оля* 29.10.2010 19:56

Client, спасибо большое!)

Lapp, извиняюсь, постараюсь больше правила не нарушать)

Автор: volvo 29.10.2010 20:15

Цитата
	int arr[2][4];
противоречит условию:
Цитата
Задан вещественный массив размера 2*N
, про матрицу речи не было. Должно быть так:
Цитата
double arr[2*n]

Соответственно, решение - как-то вот так (SQR определил как макрос):
    const int n = 4;
double arr[2*n] = {2, 2, 6, 6, 5, 2, 4, 1};

int first = -1, second = -1;
double dist = 0.0;

for(int i = 0; i < n - 1; i++)
{
for(int j = i + 1; j < n; j++)
{
double new_dist = sqrt(SQR(arr[2*i] - arr[2*j]) + SQR(arr[2*i+1] - arr[2*j+1]));
if(new_dist > dist)
{
dist = new_dist;
first = i; second = j;
}
}
}

Автор: *оля* 20.11.2010 15:20

да, в условии подразумевалось именно это, вы, как всегда, правы, спасибо большое!