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

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

Войти
Регистрация
Восстановить пароль
 
urinec
1 / 1 / 0
Регистрация: 14.08.2012
Сообщений: 14
#1

Найти наибольшее расстояние (массив) - C++

14.08.2012, 09:31. Просмотров 870. Ответов 11
Метки нет (Все метки)

Даны координаты n точек на плоскости: x1,y1; x1,y2; …, xn,yn . Найти номера двух точек, расстояние между которыми наибольшее. Считать, что такая пара точек единственная.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.08.2012, 09:31     Найти наибольшее расстояние (массив)
Посмотрите здесь:

Найти среднее арифметическое каждой строки заданной матрицы, а среди найденых значений найти наибольшее C++
C++ Найти наибольшее расстояние между точками
Найти расстояние между отрезком AB и прямой C++
C++ переписать в одномерный массив ненулевые элементы и найти наибольшее по модулю
Наибольшее расстояние между словами в файле C++
C++ Найти наибольшее расстояние между точками
C++ Найти номера пары точек, расстояние между которыми наибольшее (считать, что такая пара единственная).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Catstail
Модератор
22142 / 10616 / 1728
Регистрация: 12.02.2012
Сообщений: 17,664
14.08.2012, 10:23     Найти наибольшее расстояние (массив) #2
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
#include <iostream.h>
 
int main(int argc, char* argv[])
{
 
    double *X,*Y,Dmax=0,D;
    int im,jm,n,i,j;
 
    cout << "Enter number of points ";
    cin >> n;
 
    X=new double[n];
    Y=new double[n];
 
    for (i=0; i<n; i++)
    {
        cout << "X[" << i <<"]=";
        cin >> X[i];
        cout << "Y[" << i <<"]=";
        cin >> Y[i];
    }
 
    for (i=0; i<n-1; i++)
        for (j=i+1; j<n; j++)
        {
            D=(X[i]-X[j])*(X[i]-X[j])+(Y[i]-Y[j])*(Y[i]-Y[j]);
            if (D > Dmax) 
            {
                im=i;
                jm=j;
                Dmax=D;
            }
        }
 
    cout << "Number of the farest points are: " << im << " and " << jm << endl;
 
    delete [] X;
    delete [] Y;
 
    return 0;
}
arthurfok
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 42
14.08.2012, 10:31     Найти наибольшее расстояние (массив) #3
ну, тапорный вариант:
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
#include "stdafx.h"
#include "math.h"
#include <iostream>
using namespace std;
int RasstoyanieMejduDvumyaTochkami(int X1,int Y1,int X2,int Y2)
{
   // Эта функция считывает расстояния между двумя точками  (X1,Y1) и (X2,Y2) 
   double d=sqrt((double)((X2-X1)*(X2-X1) + (Y2-Y1)*(Y2-Y1)));
   return (int)d;
}
void main()
{
    setlocale(LC_ALL,"Russian"); //это для того, что бы в консоле печатались русские букви (а не кваказабры) 
    int n=5;                 //   изменить эти значения как вам нужно
    int X[5]={1,2,3,4,5};    //   изменить эти значения как вам нужно
    int Y[5]={1,2,3,4,5};    //   изменить эти значения как вам нужно
 
   int max=0;
   int i_max;
   int k_max;
  for(int i=0;i<n-1;i++)
  {
     for(int k=i+1;k<n;k++)
     {
         int d=RasstoyanieMejduDvumyaTochkami(X[i],Y[i],X[k],Y[k]);
         if(d>max)
         {
           max=d;
           i_max = i;
           k_max=k;
         }
     }      
  }
 
  //
  // где i_max это индекс первой точки, а k_max  - индекс второй точки.
 // 
  cout<<"Наиболее расстояние имеется  у этих 2 точек: (X["<<i_max<<"],Y["<<i_max<<"]) и (X["<<k_max<<"],Y["<<k_max<<"])"<<endl;
 
}
zitxbit
Master C/C++
87 / 739 / 75
Регистрация: 11.04.2012
Сообщений: 971
14.08.2012, 10:53     Найти наибольшее расстояние (массив) #4
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 <stdio.h>
#include <conio.h>
#include <math.h>
#include <memory.h>
 
typedef struct Point
{
    int x;
    int y;
} POINT;
 
typedef struct Line
{
    POINT pt1;
    POINT pt2;
    double dist;
} LINE;
 
double distance(POINT pt1, POINT pt2)
{
    return sqrt(pow(fabs((double)(pt1.x - pt2.x)), 2) + 
        pow(fabs((double)(pt1.y - pt2.y)), 2));
}
 
#define __countof(p) sizeof(p) / sizeof(p[0]) \
 
int main()
{
    POINT points[] = { { 2, 3 }, { 4, 5 }, { 7, 9 },
                       { 2, 6 }, { 5, 4 }, { 7, 8 },
                       { 9, 6 }, { 3, 8 }, { 4, 6 }, 
                       { 7, 4 }, { 2, 9 }, { 7, 8 } };
 
    LINE* plines = new LINE[256];
    memset((void*)plines, 0x00, sizeof(LINE) * 256);
 
    int s = 0;
    for (int i = 0; i < __countof(points); i++)
        for (int k = i+1; k < __countof(points); k++)
        {
            plines[s].pt1 = points[i];
            plines[s].pt2 = points[k];
            plines[s++].dist = 0;
        }
 
    for (int q = 0; q < s; q++)
    {
        plines[q].dist = distance(plines[q].pt1, plines[q].pt2);
        printf("x0 = %d y0 = %d x1 = %d y1 = %d distance = %lf\n",
            plines[q].pt1.x, plines[q].pt1.y, plines[q].pt2.x, 
            plines[q].pt2.y, plines[q].dist);
    }
 
    printf("\n\n");
 
    int max = 0;
    for (int r = 0; r < s; r++)
        if (plines[r].dist > plines[max].dist)
            max = r;
 
    printf("x0 = %d y0 = %d x1 = %d y1 = %d distance = %lf\n",
        plines[max].pt1.x, plines[max].pt1.y, plines[max].pt2.x, 
        plines[max].pt2.y, plines[max].dist);
 
    _getch();
 
    return 0;
}
http://liveworkspace.org/code/65d1f3...3a2964570a60d2
Миниатюры
Найти наибольшее расстояние (массив)  
Пaтрик
395 / 388 / 38
Регистрация: 21.01.2012
Сообщений: 972
Завершенные тесты: 1
14.08.2012, 10:55     Найти наибольшее расстояние (массив) #5
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
#include <iostream>
#include <cmath>
 
struct point
{
    double x, y;
    double distance(const point &pt)
    {
        return sqrt((x - pt.x) * (x - pt.x) + (y - pt.y) * (y - pt.y));
    }
};
 
std::ostream& operator<< (std::ostream& out, const point& pt)
{
    out << "[" << pt.x << ", " << pt.y << "]";
    return out;
}
 
int main()
{
    const int count = 6;
    point points[count] = {
        { 2.2, 3.3 },
        { 2.3, 4.2 },
        { 5.3, 3.5 },
        { 4.5, 5.3 },
        { 3.6, 4.2 },
        { 0.3, 7.6 }
    };
    int pos1 = 0, pos2 = 0;
    point point_first = points[pos1];
    point point_second = points[pos2];
    double distance = 0.0;
    for(int i = 0; i < count; i++)
        for(int j = i + 1; j < count; j++)
            if (points[i].distance(points[j]) > distance)
            {
                point_first = points[pos1 = i];
                point_second = points[pos2 = j];
                distance = points[i].distance(points[j]);
            }
    std::cout << "Maximum distance " << distance << " between " << point_first
             << " and " << point_second << " points. "<< std::endl;
}
SubTerran
8 / 8 / 0
Регистрация: 13.08.2012
Сообщений: 18
14.08.2012, 11:03     Найти наибольшее расстояние (массив) #6
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
//
// 
// 
//
 
#include<iostream>
#include<fstream>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<string>
#include<list>
#include<vector>
#include<algorithm>
#include<stdexcept>
 
using namespace std;
 
//------------------------------------------------------------------------------
 
inline void keep_window_open();
 
//------------------------------------------------------------------------------
 
inline int randint(int max) { return rand()%max; }
 
//------------------------------------------------------------------------------
 
struct Points {
    Points(int nn, int x, int y) :n(nn) { points.first = x; points.second = y; }
    int n;
    pair<int, int> points;
};
 
//------------------------------------------------------------------------------
 
struct Pred
{
    bool operator()(const Points& p1, const Points& p2)
    {
        if (p1.points.first == p2.points.first)
            return p1.points.second < p2.points.second;
        return p1.points.first < p2.points.first;
    }
};
 
//------------------------------------------------------------------------------
 
int main()
{
    setlocale( LC_ALL, "Russian" );
 
    int n;
    cout << "Введите количество точек: ";
    cin >> n;
 
    vector<Points> points;
 
    srand(15);
 
    for (int i = 0; i < n; ++i)
        points.push_back(Points(i, randint(20), randint(20)));
 
    for (int i = 0; i < points.size(); ++i)
        cout << points[i].n << ": (" << points[i].points.first 
        << ',' << points[i].points.second << ")\n"; 
 
    sort(points.begin(), points.end(), Pred());
 
    cout << "Расстояние между " << points[0].n << " и "
         << points[points.size() - 1].n << " точками наибольшее\n";
 
    keep_window_open();
    return 0;
}
 
//------------------------------------------------------------------------------
 
inline void keep_window_open()
{
    cin.clear();
    cout << "Please enter a character to exit\n";
    char ch;
    cin >> ch;
    return;
}
 
//------------------------------------------------------------------------------
rinat_w
89 / 85 / 4
Регистрация: 13.11.2011
Сообщений: 192
Завершенные тесты: 1
15.08.2012, 02:08     Найти наибольшее расстояние (массив) #7
ураа у меня самый короткий код
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
#include<iostream>
#include<cmath>
using namespace std;
double dist(int *a, int x, int y){
       return sqrt(abs((a[x]-a[y])*(a[x]-a[y])+(a[x+1]-a[y+1])*(a[x+1]-a[y+1])));
}
int main(){
    int n;
    cout<<"n="; cin>>n;
    cout<<"x\ty\n\n";
    int *a=new int[2*n];
    srand(time(0));
    for (int i=0; i<2*n; i++){
        a[i]=rand()%201-100;
        if (i%2==0) cout<<a[i]<<"\t";
        else cout<<a[i]<<"\n";
    }
    int max1=0, max2=0;
    for (int x=0; x<2*n; x+=2)
        for (int y=x+2; y<2*n; y+=2)
            if (dist(a, max1, max2)<dist(a, x, y)){
               max1=x;
               max2=y;
            }
    printf ("\nmax distance %.7f: x1=%d y1=%d x2=%d y2=%d\n",
           dist(a, max1, max2),a[max1],a[max1+1],a[max2],a[max2+1]);
    system("pause");
    return 0;
}
Миниатюры
Найти наибольшее расстояние (массив)  
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
15.08.2012, 06:06     Найти наибольшее расстояние (массив) #8
Цитата Сообщение от arthurfok Посмотреть сообщение
int RasstoyanieMejduDvumyaTochkami(int X1,int Y1,int X2,int Y2)
это лучшее имя функции, которое я видел в своей жизни...
Catstail
Модератор
22142 / 10616 / 1728
Регистрация: 12.02.2012
Сообщений: 17,664
15.08.2012, 12:42     Найти наибольшее расстояние (массив) #9
Цитата Сообщение от rinat_w Посмотреть сообщение
ураа у меня самый короткий код
- но не самый оптимальный... Ведь не требуется найти максимальное расстояние, а только соответствующую пару точек. Поэтому можно квадратный корень не извлекать (лишнее). А уж брать абсолютную величину заведомо неотрицательного числа - точно не нужно!
arthurfok
0 / 0 / 0
Регистрация: 07.09.2011
Сообщений: 42
15.08.2012, 23:18     Найти наибольшее расстояние (массив) #10
salam, программист не должен боятся от длинных имен функции.
пусть оно будет длинным, но понятным,,, для того, что бы когда будешь читать собственный код через месяц , то сразу узнал для чего предназначена и что делает данная функция, а не ломать голову часами , пытаясь узнать это от логики написанного кода.
Это тебе совет на будущее
Leonman
15 / 15 / 0
Регистрация: 17.06.2012
Сообщений: 266
16.08.2012, 00:53     Найти наибольшее расстояние (массив) #11
Как много вариантов.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.08.2012, 01:57     Найти наибольшее расстояние (массив)
Еще ссылки по теме:

Найти расстояние между отрезками C++
C++ Найти расстояние между символами с1 и с2
Двумерный массив: найти номер последней по порядку строки массива, содержащей наибольшее количество букв ш C++
Как найти расстояние между 2 линиями (OpenCV)? C++
Найти номера двух точек, расстояние между которыми наибольшее C++

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

Или воспользуйтесь поиском по форуму:
ZaMaZaN4iK
Мой лучший друг-отладчик!
163 / 163 / 9
Регистрация: 24.06.2012
Сообщений: 662
Записей в блоге: 5
Завершенные тесты: 1
16.08.2012, 01:57     Найти наибольшее расстояние (массив) #12
arthurfok, не полностью согласен с Вами.Да, имя функции должно быть такое, чтобы было понтно, что она примерно делает.Но не такие же названия.Вообще рекомендуется называть функции английскими именами(но быть аккуратным, чтобы не повторяли имена каких-либо системных функций).И названия надо давать, что чередовались согласные и гласные звуки(блин, это както называется одним словом, но из головы вылетело, хоть убей).

Как то так.Но как говорится - на вкус и цвет товарищей нет(ну или фломастеры разные).
Yandex
Объявления
16.08.2012, 01:57     Найти наибольшее расстояние (массив)
Ответ Создать тему
Опции темы

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