LINUX.ORG.RU

Как вычислить расстояние между точками в векторе?

 , , ,


0

1

Есть следующая закавыка:

С клавиатуры вводятся координаты точек на плоскости в виде строк, представляющих пару в формате “(x,y)”. Строка должна быть проанализирована, координаты извлечены и помещены в вектор точек (точка –пользовательский тип данных структура). Вычислить расстояния всех точек до точки, введенной последней.

Написал код через обычные массивы (по формуле r=sqrt( (x-x[1])^2+(y-y[1])^2) - код пашет):

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

main()
{
	float x[100], y[100];
	int i, n;
	float r;

	cout << "Enter dimension of 1D massives (vectors of X & Y coordinates)\n";
	cin >> n;

	cout << "Enter X coordinates of points for the 1st 1D massive (vector 1):\n";
	for (i = 0; i < n; i++)
	{ cin >> x[i];
	}
	
	cout << "Enter Y coordinates of points for the 2nd 1D massive (vector 2):\n";
	for (i = 0; i < n; i++)
	{ cin >> y[i];
	}
	
	for (i = 0; i < n; i++)
	{ r=sqrt(  ((x[i]-x[0])*(x[i]-x[0])+(y[i]-y[0])*(y[i]-y[0]))  );

	cout << "\n r = " << r;
	cout << "\n";
		  }

	return 0;
}

Как вычислить расстояние между точками через векторы? Надо приплести сюда итераторы? Есть у кого опыт в итераторах? Я пока не до конца разобрался:

      #include <stdio.h>
    #include <iostream.h>
    #include <vector.h>
    #include <algorithm.h>
    #include <list.h>

    struct coordinates {
    { float x, y;
    } points;

    main()
    { using namespace std;
        int i;
        float r;
      cout << "Set dimension of vector";
      cin >> n;
        for (i=0; i<n; i++) { // Input coordinates x, y
      cout << "Input x:";
      cin >> points.x;
      cout << "Input y:";
      cin >> points.y;
    }
      std:: vector<points> pointvect; // vector declaration
      points points;
      pointvect.push_back (points); // add point to the vector
      
      for_each (pointvect.begin(). pointvect.end(). print);
      cout << endl;        
      
      // тут начинается творчество
        vector<points>::iterator pos;
        for (pos = pointvect.begin(); pos != pointvect.end(); pos++) {
      r=sqrt( (pointvect[i]-pointvect[0])*(pointvect[i]-pointvect[0]));

      cout << r;
      
      getch();
      return 0;
   }
  


Последнее исправление: Auroch (всего исправлений: 1)

Ты бы прочитал про итераторы хоть. В последнем цикле с творчеством доступ по индексу i при наличии итератора тебе не нужен.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Да и вообще не нужны они здесь. Итераторы абстрагируют тебя от способа хранения элементов в контейнере, представляя унифицированный интерфейс доступа.

В качестве упражнения в итераторах и шаблонах, напиши функцию, которая решает твою задачу независимо от выбранного типа контейнера, будь то вектор, список, или еще что.

yoghurt ★★★★★
()
Ответ на: комментарий от yoghurt

Прочитал раздел про итераторы у Джосьютиса, а доступ по индексу i придумал сам. Как тогда вычислить расстояние?

Auroch
() автор топика
Ответ на: комментарий от maverik

Исправил:

for (i=0; i<n; i++) { // Input coordinates x, y
      cout << "Input x:";
      cin >> points.x;
      cout << "Input y:";
      cin >> points.y;
    }

Auroch
() автор топика
Ответ на: комментарий от Auroch

Вот, читай его дальше. Много всего полезного откроешь по STL. Годная книга. Я даже новое издание прикупил (с 11 плюсами)

maverik ★★
()
Ответ на: комментарий от Auroch

Например, так

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

struct point
{ 
    float x;
    float y;
};
    
float distance(const point& first, const point& second)
{
    return sqrt((first.x-second.x)*(first.x-second.x)+(first.y-second.y)*(first.y-second.y));
}
    
int main() 
{
    
    int n;
    cout << "Set dimension of vector\n";
    cin >> n;
    vector<point> points(n);
    point tmp;
    for (int i=0; i<n; i++) 
    {
        cout << "Input x:\n";
        cin >> tmp.x;
        cout << "Input y:\n";
        cin >> tmp.y;
        points.push_back(tmp);
    }
     
          
    auto last=(points.rbegin()+1).base();
    for (auto pos = points.begin(); pos != last; ++pos) 
    {
        cout << distance(*pos, *last) << endl;
    }
    
    return 0;
}
Uter
()
Последнее исправление: Uter (всего исправлений: 1)
Ответ на: комментарий от Auroch

Может всем похуй на студенческие поделки? ;-)

anonymous
()

эм, на вид все верно с итератором(матан не проверял) вижу парочку опечаток. Ты про C++11 и C++1y уже в крусе?

deterok ★★★★★
()

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

deterok ★★★★★
()
Ответ на: комментарий от deterok

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

если ты считаешь что он ничего не понимает в итераторах, то твое же предыдущее сообщение просто абсурдно...

эм, на вид все верно с итератором

anonymous2 ★★★★★
()
Ответ на: комментарий от deterok

да. и поясняю подробнее:

эм, на вид все верно с итератором(матан не проверял) вижу парочку опечаток

ситуация либо как ты и написал «с итератором все верно» других толкований сдесь просто нет, исключая вижу парочку опечаток.

либо ситуация совершенно иная:

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

здесь однозначное принижение знаний автора, но на основании первого твоего утверждения, вывод прост:

- вы оба не понимаете как работают итераторы.

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)

Например, так:

#include <algorithm>
#include <cmath>
#include <iostream>
#include <iterator>
#include <vector>

struct point
{
  float x, y;
};

auto operator>> (std::istream& istm, point& p) -> std::istream&
{
  return istm >> p.x >> p.y;
}

auto operator<< (std::ostream& ostm, point const& p) -> std::ostream&
{
  return ostm << p.x << ' ' << p.y;
}

auto sqr(double x) -> double
{
  return x * x;
}

auto main() -> int
{
  auto points = std::vector<point>(std::istream_iterator<point>(std::cin), std::istream_iterator<point>());
  std::copy(points.begin(), points.end(), std::ostream_iterator<point>(std::cout, "\n"));

  std::vector<double> distances;
  std::transform(points.begin() + 1, points.end(), std::back_inserter(distances), [&] (point const& p) {
      return std::sqrt(sqr(p.x - points.front().x) + sqr(p.y - points.front().y));
    });
  std::copy(distances.begin(), distances.end(), std::ostream_iterator<double>(std::cout, " "));
}

Begemoth ★★★★★
()
Ответ на: комментарий от anonymous2

Я не так давно решил разобраться как оно работает. Я понимаю как они устроены в принципе, т.к. пришлось свои писать.

deterok ★★★★★
()

не вижу тег «лабораторная работа»

anonymous
()
Ответ на: комментарий от Auroch

А я не собираюсь за тебя бесплатно делать твою работу...
Ищи тех, кто тебе за просто так будет задачки для универа решать.

peregrine ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.