#c #string #file #format #maps
#c #строка #файл #формат #Карты
Вопрос:
Моя первоначальная программа была разработана для определения типа геометрического объекта у пользователя, а затем принимает координаты каждой строки для вычисления площади фигуры. У него была одна проблема, которая заключалась в том, что всякий раз, когда я просил пользователя ввести две координаты, которые образуют строку, вторая координата будет повторяться снова как первая для следующей строки.
пример: в первой строке он должен ввести 0 0 0 1 (обозначает x1 y1 x2 y2), во второй строке ввод будет 0 1 1 0 (x2 y2 x3 y3)
вы можете видеть, что 0 1 повторялись снова, что не было проблемой на первом этапе программы.
На втором этапе, когда я попытался обновить свою программу, я начал получать входные данные из файлов, отформатированных следующим образом: прямоугольник,(42,25),(68,25),(68,70),(42,70)
Я могу прочитать каждую координату отдельно, используя
fscanf(file, "(%lf,%lf)", amp;X, amp;Y);
но как я могу снова взять вторую координату и повторить ее для следующего ввода, как я объяснил в приведенном выше примере.
методы старого класса
Point::Point(double x, double y)
{
X = x;
Y = y;
}
Point::Point()
{
cout << "Point constructor called! enter the x and y co-ordinates" << endl;
cin >> X >> Y;
//this is what I want to modify
}
double operator-(const Pointamp; Start, const Pointamp; End)
{
// returns the distance between two points
return sqrt(pow((End.X - Start.X), 2.0) pow((End.Y - Start.Y), 2.0));
}
Комментарии:
1. Кстати, вы можете рассмотреть возможность использования
x * x
вместоpow(x, 2)
. Обычно умножение выполняется быстрее, поскольку позволяет избежать накладных расходов на вызов функции и возврат.2. Я рекомендую не использовать ввод-вывод в конструкторе. Вы можете создавать методы для чтения в разных форматах, и вы можете рассмотреть возможность перегрузки
operator>>
.3. См . Также списки инициализации , такие как
Point(double x, double y) : X(x), Y(y) {}
.4. @ThomasMatthews Спасибо, но можете ли вы предложить решение этой проблемы?
5. @ThomasMatthews моя программа может вычислять площадь при задании каждой координаты дважды, как я могу избежать этого, я действительно не могу найти решение.
Ответ №1:
ИМХО, вы должны перегрузить operator>>
чтение в координате:
struct Coordinate
{
double x;
double y;
friend std::istreamamp; operator>>(std::istreamamp; input, Coordinateamp; co);
};
std::istreamamp; operator>>(std::istreamamp; input, Coordinateamp; co)
{
char c;
input >> c; '('
input >> co.x;
input >> c; ','
input >> co.y;
input >> c; ')'
return input;
}
Затем вы можете прочитать координаты в контейнере:
std::vector<Coordinate> points;
Coordinate p;
while (input_file >> p)
{
points.push_back(p);
char c;
input_file >> c;
}
Вы можете расширить свою структуру координат, добавив другие методы:
struct Coordinate
{
//...
// Calculate y1 - this
double absolute_distance(const Coordinateamp; y1) const;
};
double
Coordinate ::
absolute_distance(const Coordinateamp; y1) const
{
const double x_diff(y1.x - x);
const double y_diff(y1.y - y);
const double x_diff_squared(x_diff * x_diff);
const double y_diff_squared(y_diff * y_diff);
return abs(sqrt(x_diff_squared y_diff_squared));
}
Это позволит вам вычислить расстояние между двумя координатами:
double distance = points[1].absolute_distance(points[0]);
Следуя этой технике, вы должны быть в состоянии вычислить область с 4 координатами.