/*
* points.c
* This program reads several input points,
computes their centre of mass
* and locates the
points which are closest and farthest from this centre.
*/
#include <stdio.h>
#include <math.h>
/* Definition of
a point: */
struct _Point
{
float
x;
float
y;
};
typedef struct
_Point Point;
/* Prototypes:
*/
float point_dist (const Point *p, const
Point *q);
int main ()
{
int n_points;
/* The number of points. */
Point *points; /* The points
themselves. */
Point cm; /* The
centre of mass. */
float dist; /* The
distance of the current point from the centre. */
float min_dist; /* The minimal
distance so far. */
float max_dist; /* The maximal
distance so far. */
int i_close;
/* The index of the closest point so far. */
int i_far;
/* The index of the farthest point so far. */
int i;
/* Read the number
of input points: */
do
{
printf ("Please enter the number of points: ");
scanf ("%d", &n_points);
} while
(n_points <= 0);
/* Allocate memory to store the points. */
points = (Point *)
malloc (sizeof(Point) * n_points);
/* Read the points.
*/
for
(i = 0; i < n_points; i++)
{
printf ("Please enter point no. %d: ", i+1);
scanf ("%f %f", &(points[i].x),
&(points[i].y));
}
/* Compute the
centre of mass by averaging the point coordinates. */
cm.x = 0;
cm.y = 0;
for
(i = 0; i < n_points; i++)
{
cm.x += points[i].x;
cm.y += points[i].y;
}
cm.x /= (float)n_points;
cm.y /= (float)n_points;
/* Print the
result. */
printf ("The centre of the %d points is (%g,%g).\n",
n_points, cm.x, cm.y);
/* Find the closest
and the farthest point. */
min_dist = max_dist = point_dist (points,
&cm);
i_close = i_far = 0;
for
(i = 1; i < n_points; i++)
{
dist = point_dist
(points + i, &cm);
/* Check if the
current point is closer to the centre of mass than
* the closest
point so far. */
if
(dist < min_dist)
{
min_dist = dist;
i_close = i;
}
/* Check if the
current point is farther from the centre of mass than
* the farthest
point so far. */
else
if (dist > max_dist)
{
max_dist = dist;
i_far = i;
}
}
/* Print the
closest and farthest points. */
printf ("The point closest to the centre is (%g,%g).\n",
points[i_close].x,
points[i_close].y);
printf ("The point farthest from the centre is
(%g,%g).\n",
points[i_far].x,
points[i_far].y);
/* Free memory. */
free (points);
return
(0);
}
/*
------------------------------------------------------------------------
* Function: point_dist
* Purpose : Compute
the Euclidean distance between two points.
* Input
: p - The first point.
* q - The second point.
* Returns : The
distance.
*/
float point_dist (const Point *p, const
Point *q)
{
return
((float) sqrt ((p->x - q->x)*(p->x -
q->x) +
(p->y
- q->y)*(p->y - q->y)));
}