Вычисление средних расстояний между точками на плоскости

Подготовка к лабораторной работе № 1

В первой лабораторной работе исопльзуются абстрактные типы данных (АТД). АТД являются математическим понятием, пригодным на этапе подготовки спецификации - в процессе анализа. Понятие класса, предусматривая частичную или полную реализацию, обеспечивает необходимую связь с разработкой ПО на этапах проектирования и программирования. Напомним, класс называется эффективным, если его реализация полна, и отложенным - при частичной реализации.

 

Рассмотрим два типовых задания.

 

Задание№ 1.

Вычисление декартовых координат вершин правильного треугольника

Разработать ООП для вычисления декартовых координат вершин правильного треугольника с заданной длиной стороны, центр которого лежит на оси Х. Длина стороны треугольника должна передаваться программе через аргумент командной строки, а полученные координаты должны отображаться через стандартный вывод. Программная реализация вычислений должна быть основана на разработке класса точки с приватными полями ее декартовых координат и публичными методами доступа к ним и конструктором инициализации их значений. Кроме того нужно предусмотреть статический метод конструирования точки по ее полярным координатам. ( Программа polar.cc)

 

 

 

// Программа polar.cc

#include <stdlib.h>

#include <math.h>

#include <iostream.h>

// Класс Point2 точки плоскости

class Point2 {

private:

float x;

float y;

Point2(float _x, float _y) : x(_x), y(_y) { };// приватный конструктор

public:

 

float getx() { return x; }; // доступ к x

float gety() { return y; }; // доступ к y

static Point2 Polar(float, float); // именованный конструктор точки - общий статический метод

Point2() { x=y=0.0; }; // конструктор по умолчанию (для массива точек)

}; // Point2

// конструирование точки по полярным координатам

inline Point2 Point2 :: Polar(float R, float F) {

Point2 p(R*cos(F), R*sin(F)); // перевод полярных координат в декартовы

return p; // возврат объекта класса точки

}; //polar

// основная функция

int main(int argc, char* argv[ ]) {

float edge = 1.0; // сторона треугольника (1.0 – длина по умолчанию)

float angle = 0.0; // полярный угол вершины

float pi; // число pi

pi = acos (-1.0 ); // вычислить pi (можно M_PI из math.h)

float radius; // радиус-вектор вершины

int i = 0; // счетчик вершин треугольника

Point2 vertex [3]; // массив вершин треугольника vertex[0], vertex[1], vertex[2]

if(argc > 1)

edge = atof (argv[1]);// получить длину стороны из командной строки

cout << "pi=" << pi << endl;

radius = edge / (2*sin(pi/3.0)); // радиус описанной окружности

while (i<3) { // цикл вычисления декартовых координат вершин

vertex[ i ] = Point2::Polar(radius, angle);

angle += ((4.0*pi)/3.0); // +120 градусов =4* pi/3

i++;

}// while

do { // Печать декартовых координат вершин в обратном порядке

--i;

cout << vertex[ i ].getx() << ';' << vertex[ i ].gety() << endl;

} while(i > 0); //do- while

return (0); // Корректное завершение программы

}// main

 

Задание№ 2.

Вычисление средних расстояний между точками на плоскости

 

Разработать ООП для вычисления среднего расстояния от каждой точки заданного набора до остальных точек этого набора. Декартовы координаты точек набора должны передаваться программе парами целых чисел через аргументы командной строки. Полученные значения средних расстояний должны отображаться строками стандартного вывода. Программная реализация вычислений должна быть основана на разработке класса точки с приватными полями ее декартовых координат и конструктором инициализации их значений, публичными методами доступа к ним, а ткаже дружественная функция вычисления расстояния между 2-мя точками. Кроме того, в программе должно быть предусмотрено динамическое распределение памяти для всех точек заданного набора и массива их адресов. (Программа average.cc)

 

//Программа average.cc

#include <stdio.h>

#include <math.h>

// класс точки плоскости

class Point2 {

private:

int x;

int y;

public:

Point2(int _x, int _y) : x(_x), y(_y) { }; // конструктор точки

int getx() { return x; }; // доступ к x

int gety() { return y; }; // доступ к y

friend double distance(Point2*, Point2*); // определение расстояния между 2-мя точками

}//Point2

// дружественная функция вычисления расстояния между двумя точками

double distance(Point2* r, Point2* q) {

double d2=(r->x-q->x)*(r->x-q->x)+(r->y-q->y)*(r->y-q->y);

return (sqrt(d2));

} // distance

//Основная функция

int main(int argc, char* argv[ ]) {

double sum; // суммарное расстояние от первой до остальных точек

Point2** p; // адрес массива адресов точек набора

Point2* t; // адрес текущей точки

int x,y; // координаты точки

int i=0;

int j=0; // номера точек набора

if(argc < 2)
return(-1); //анализ числа аргументов командной строки

p = new Point2*[argc]; // распределить память под массив адресов точек

while(++i < argc) { //цикл ввода точек из командной строки

sscanf(argv[ i ], "(%d%*c%d)", &x, &y)); // получение координат точки

p[ j ]=new Point2(x,y); // динамическое конструирование точки

j ++;

} // while

p[ j ]=NULL; // маркировка конца массива адресов точек набора

for (i=0; p[ i ] != NULL; i++) { // цикл вычисления средних расстояний

sum = 0.0; // инициализировать сумму расстояний до текущей точки

t = p[ i ]; // фиксировать адрес текущей точки

for (j=0; p[ j ] != NULL; j++) // цикл суммирования расстояний от текущей точки до остальных

sum + = distance(t, p[ j ]); //вычисление среднего расстояния до текущей точки

 

printf("Dcp(%d;%d)=%f\n", t->getx(), t->gety(), sum/(argc-2)); // ->оператор доступа к члену

} // for-i

for(j=0; p[ j ] != NULL; j++) // освобождить дин. память точек набора

delete p[ j ]; // по их адресам

delete [ ]p; // освобождить дин. память массива адресов точек

return 0; //корректное завершение программы

}// main