Отсортировать точки по во возрастанию расстояния - C (СИ)
Формулировка задачи:
Здравствуйте, написал программу для вывода минимально точки, а вот как сделать чтобы она их выводила по возрастанию я не знаю, помогите пожалуйста переделать.
Задача:Дано множество точек на плоскости. Отсортировать точки по во возрастанию расстояния.
#include <stdio.h>
#include <math.h>
struct tp
{
int x, y, d;
};
float func(tp& p )
{
float x = p.x;
float y= p.y;
return sqrt((x*x)+(y*y));
}
int main(void)
{
int n = 0, i;
int nmin=0;
float min;
tp p[100];
while(n < 1 || n > 100)
{
scanf ("%d", &n);}
for(i=0; i<n; i++)
{
scanf("%d %d", &p[i].x, &p[i].y);
}
for(i=0; i<n; i++)
p[i].d = func(p[i]);
min = p[0].d;
for( i = 0; i<n; i++)
if(min > p[i].d)
{
min = p[i].d;
nmin = i;
}
printf ("%d %d ", p[nmin].x, p[nmin].y);
}Решение задачи: «Отсортировать точки по во возрастанию расстояния»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
struct point
{
double x, y;
};
int cmp(const void* b, const void* a)
{
struct point* pa = (struct point*) a;
struct point* pb = (struct point*) b;
return ((pa->x * pa->x + pa->y * pa->y) -
(pb->x * pb->x + pb->y * pb->y));
}
void display_points(const struct point* points, size_t count)
{
size_t i;
for(i = 0; i < count; ++i)
printf("{%8.2f, %8.2f}\n", points[i].x, points[i].y);
}
#define SIZE 10
void fill_points(struct point* points, size_t count, double thrashold)
{
size_t i;
for(i = 0; i < count; ++i)
{
points[i].x = (((double) rand()) / RAND_MAX - .5) * 2 * thrashold;
points[i].y = (((double) rand()) / RAND_MAX - .5) * 2 * thrashold;
}
}
int main(void)
{
struct point points[SIZE];
srand((size_t) time(NULL));
fill_points(points, SIZE, 50);
printf("Generated array of points:\n");
display_points(points, SIZE);
qsort(points, SIZE, sizeof(struct point), cmp);
printf("Points ordered ascending by the length of radius vector:\n");
display_points(points, SIZE);
exit(0);
}
Объяснение кода листинга программы
В этом коде используется язык программирования C для решения задачи по сортировке массива структур точек по возрастанию длины радиуса вектора. Список действий, которые выполняются в коде:
- Включаются необходимые заголовочные файлы:
stdio.h- для работы с вводом/выводом данных;stdlib.h- для работы с функциями сортировки и выделения памяти;time.h- для получения текущего времени, которое используется в качестве семени для генератора случайных чисел.
- Определяется структура точки:
- Название структуры:
point; - Поля структуры:
xиyтипаdouble, которые представляют координаты точки в двумерном пространстве.
- Название структуры:
- Реализуется функция сравнения:
- Название функции:
cmp; - Эта функция сравнивает две структуры
pointпо длине их радиуса вектора, используя формулуsqrt(x^2 + y^2).
- Название функции:
- Реализуется функция вывода точек:
- Название функции:
display_points; - Эта функция выводит на экран все точки из переданного массива, каждая точка выводится в отдельной строке с использованием формата
printfи шаблонных символов%8.2fдля координатxиy.
- Название функции:
- Задаются константы и переменные:
SIZE- размер массива точек;thrashold- параметр, который используется для генерации случайных значений координат точек.
- Заполняется массив точек случайными значениями:
- Название функции:
fill_points; - Эта функция заполняет массив
pointsслучайными значениями координатxиyс помощью функцииrand()иsrand().
- Название функции:
- Выполняется основная функция программы:
- Название функции:
main; - В этой функции выполняются следующие действия:
- Массив
pointsзаполняется случайными значениями с помощью функцииfill_points; - Выводится на экран сгенерированный массив точек с помощью функции
display_points; - Массив
pointsсортируется по возрастанию длины радиуса вектора с помощью функцииqsortи передается функция сравненияcmp; - Выводится на экран отсортированный массив точек с помощью функции
display_points; - Программа завершается с помощью
exit(0). В итоге, этот код генерирует массив случайных точек в двумерном пространстве, выводит его на экран, сортирует точки по возрастанию длины радиуса вектора и также выводит отсортированный массив на экран.
- Массив
- Название функции: