LINUX.ORG.RU

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

 ,


1

1

C клавиатуры вводятся координаты точек на плоскости в виде строк, представляющих пару в формате (х,у). Координаты должны быть извлечены и помещены в вектор точек (точка - пользовательский тип данных структура). Вычислить и вывести расстояние от всех точек до первой точки.

--------- Похоже, задача решается через т. Пифагора sqrt((x2-x1)^2+(y2-y1)^2). Как приплести сюда структуры?


через т. Пифагора sqrt((x2-x1)^2+(y2-y1)^2).

Это называется длина вектора. товарищ Пифагор тут постольку поскольку.

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

Как приплести расстояние к этому вектору из точек?



#include <iostream>
#include <vector>

struct Point
{
  int x,y;
};

const std::istream& operator>>(const std::istream& istr, Point& point)
{
  return std::cin >> point.x >> point.y;
}

std::ostream& operator<<(const std::ostream& ostr, const Point& point)
{
  return std::cout << "(" << point.x << ";" << point.y << ")";
}

int main()
{
  std::vector<Point> pointsVector;
  Point p;
  while( (std::cin >> p) )
    pointsVector.push_back(p);

  for (std::vector<Point>::iterator it = pointsVector.begin(); it != pointsVector.end(); it++)
    std::cout << (*it) << "\n";
	return 0;
}

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

Ты зачем операторы перегрузил? Какой в этом смысл? И это, в С++11 уже есть циклы «foreach»: формат for(type &item: collection), выкидывай цикл с итератором к черту.

LongLiveUbuntu ★★★★★
()

И вообще, используй классы: меньше огорода нагородишь.

LongLiveUbuntu ★★★★★
()

В учебнике Праты в главе про структуры есть как раз тот код, что тебе нужен, с пояснениями.

Lilly
()
Ответ на: комментарий от LongLiveUbuntu

Структура потому, что в первом сообщении ТС написано - структура. И то, что он хочет их «приплести», возможно, означает, что другие решения ему вряд-ли нужны.

Это явно не рабочий проект, где действительно нужно писать оптимальный код(да, разумеется, если использовать ООП, то решается все легко), а учебный, то пусть ТС таки пишет через структуры.

Ну и ещё когда учишь плюсы, то полезно обратить внимание на структуры, чтобы в случае перехода на С не было удивлений.

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

Можем поспорить о взглядах на ООП в джаббере, если что ) Тебя я уже к себе добавил.

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

Учебник по С++. Лекции и упражнения. Издание, кажется, четвертое.

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

Вот оператор плюса перегрузить неплохо бы.

плюс не нужно. Сумма комплексных чисел — другое. ИМХО operator|() надо перегрузить. Это вроде как «модуль». Хотя и одна палка.

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

Я не про комплексные числа писал, я имел в виду, что формулу сложения, которая у ТС-а в первом посте, неплохо бы вынести в оператор +, чтобы в остальном коде было удобно складывать «векторы»-структуры так:

Point sum = point1 + point2;

А не на каждый чих писать:

Point sum = sqrt((point2.x-point1.x)^2 +
                 (point2.y-point1.y)^2);

А операторы ввода-вывода лучше реализовать через функцию, вроде:

void print_point(Point p)
{
    cout << "X of point: " << p.x << endl;
    cout << "Y of point: " << p.y << endl;
}

Раз уж на то пошло. Но плюсы не мой конёк, поэтому со всеми знатоками, которые могут обвинить мой код в кривоте я заранее соглашаюсь.

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

Point sum = point1 + point2;

я не знаю, что ты там говорил, но ТС ВЫЧИТАЕТ два вектора, и берёт модуль разницы. Плюс тут появился только потому, что у нас двухмерное пространство. Вот мы и считаем вдоль+поперёк.

Но вообще расстояние это разность.

А операторы ввода-вывода лучше реализовать через функцию, вроде:

нет. тогда уж надо перегрузить operator<<(ostream &, Point &)

тогда можно просто cout<<point1;

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

А, тьфу. Да, ты прав, не заметил. Мне показалось, что ТС-у нужно выполнять действия над векторами, поэтому и предложил для пущего удобства их описать через перегрузку.

Ну в таком случае решение ещё проще: описать структуру точки, функцию взятия расстояния, взять с stdin точки и рассчитать необходимое.

А то, что я говорю|пишу|излагаю, обычно видно в начале ветки.

Lilly
()

Народ, зачем вы решаете таким кадрам домашку? Они вырастут, получат дипломы и будут всячески позорить отечественных IT-специалистов и подрывать их репутацию. Мы в этом плане не столь уж далеко ушли от Индии и Пакистана, а опуститься есть куда.

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

решений много. Можно сделать абстрактный базовый класс Complex, и пару скрытых наследных классов для представления xi+y, и для представления в виде модуля и аргумента.

emulek
()
Ответ на: комментарий от Krieger_Od

Это воспитывает невероятное терпение и самоконтроль.

Lilly
()
Ответ на: комментарий от emulek

Тогда мы до глубокой ночи будем обсуждать это множество. На сим предлагаю разойтись, ибо тема исчерпала себя, да и ТС уже сам разберется или не разберется.

Благодарю за дискурс.

Lilly
()
Ответ на: комментарий от Krieger_Od

Они вырастут, получат дипломы и будут всячески позорить отечественных IT-специалистов и подрывать их репутацию.

да ладно. Где ты увидел решение? Ему в лучших традициях ЛОРа объяснили, что он...

emulek
()
#include <iostream>
#include <cmath>
#include <vector>

class Point {
 public:
  float Distance(const Point& p) const {
    float x_diff = x - p.x;
    float y_diff = y - p.y;
    return sqrt((x_diff * x_diff) + (y_diff * y_diff));
  }

  friend std::istream&
  operator >> (std::istream& is, Point& p) {
    return is >> p.x >> p.y;
  }
  friend std::ostream&
  operator << (std::ostream& os, const Point& p) {
    return os << "(" << p.x << "," << p.y << ")";
  }
 
 private:
  float x;
  float y;
};

int main(int argc, const char *argv[]) {
  std::vector<Point> points;
  Point point;
  while (std::cin >> point) {
    points.push_back(point);
  }

  Point first_point = points.front(); 
  for (int i = 1; i < points.size(); ++i) {
    std::cout << "Distance between " << first_point << " and " << points[i] <<
                 " is " << first_point.Distance(points[i]) << std::endl;
  }

  return 0;
}
chsh
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.