Лекции.Орг


Поиск:




Категории:

Астрономия
Биология
География
Другие языки
Интернет
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Механика
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Транспорт
Физика
Философия
Финансы
Химия
Экология
Экономика
Электроника

 

 

 

 


Результат работы программы




Условие

 

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

 

Анализ задачи

Исходные данные и результат

Дано:

nєN<=100

M={di|diєD,i=1,n}

D={(x,y) |x,yєR}

Результат: r1,r2,r3єD, fϵ{0,-1,-2}.

 

Решение:

LNG = – длина отрезка (x1,y1),(x2,y2)

PER = LNG(d1,d2)+LNG(d2,d3)+LNG(d3,d1) – периметр треугольника (d1,d2,d3)

CHK = a, если |(х2-x1)*(у3-y2)|=|(x3-x2)*(y2-y1)|, то a=0; иначе а=1 – проверка на треугольник (на то, что точки не лежат на одной прямой)

 

При e=3, max=-2

Повторять

Если n>=2, то

max=-1

|при i=1

|повторять

||при j=i+1

||повторять

per=PER(di,dj,de)

Если max<per, то если CHK (di,dj,de)=1, то max=per, p1=i,p2=j,p3=e; j=j+1 ||пока j<=e-1 ||i=i+1 |пока i<=e-2 |e=e+1 Пока e<=n 3.Структуры данных, используемые для представления исходных данных и результатов задачи Const int N=100- константа, определяющая максимальное количество вводимых точек. Внешнее представление исходных данных: натуральное число n и последовательность координат n точек, представленных в виде пар вещественных чисел, разделенных запятой.   Внутреннее представление исходных данных: int n-количество введенных точек(n<=N) pnt A[N] –массив, являющегося программным представлением множества точек на плоскости - массив структур вида struct pnt{float x,y}, являющихся программным представлением точки в двухмерном пространстве, где и - соответствующие координаты точки. Внешнее представление результата: Последовательность координат точек, представленная в виде пар вещественных чисел или сообщение об ошибке.   Внутреннее представление результата: struct max {float per, int p1,p2,p3} - структура, являющейся программным представлением треугольника c наибольшим периметром в двухмерном пространстве, где per – длина периметра и сигнал ошибки, p1,p2 и p3 – условные номера точек. pnt A[N] –массив, являющегося программным представлением множества точек на плоскости - массив структур вида struct pnt{float x,y}, являющихся программным представлением точки в двухмерном пространстве, где и - соответствующие координаты точки.    

Укрупненный алгоритм решения задачи

 

 

Структура программы

Составные части программы

 

Void IN(pnt A[N],int i) – считывает координаты точки. Вызывается как элемент основной.

A[N] – множество точек, i – номер считываемой.

Void OUT (pnt A[N],max n) – выводит координаты точек треугольника с наибольшим периметром. Вызывается как элемент основной.

A[N] – множество точек, n – треугольник с наибольшим периметром, содержащий координаты вершин.

Float LNG (pnt A[N],int a,int b) – высчитывает расстояние между двумя точками. Вызывается как элемент PER.

A[N] – множество точек, a,b – номера точек, расстояние между которыми вычисляются.

Float PER (pnt A[N],int a,int b,int c) – высчитывает периметр треугольника, заданного тремя вершинами. Вызывается как элемент основной, вызывает LNG.

A[N] – множество точек, a,b,c – номера вершин треугольника.

Int CHECK_LINE (pnt A[N], int a, int b, int c) – проверяет, принадлежат ли точки одной прямой. Вызывается какэлемент основной.

A[N] – множество точек, a,b,c – номера проверяемых точек.

 

 

Текст программы

#include <stdio.h>

#include <conio.h>

#include <math.h>

#define N 100

 

struct pnt

{

float x;

float y;

};

 

struct max

{

int p1,p2,p3;

float per;

};

 

void IN (pnt A[N],int i)

{

scanf ("%f",&A[i].x);

scanf ("%f",&A[i].y);

}

 

void OUT (pnt A[N],max n)

{

printf ("%f %f, ",A[n.p1].x,A[n.p1].y);

printf ("%f %f, ",A[n.p2].x,A[n.p2].y);

printf ("%f %f",A[n.p3].x,A[n.p3].y);

}

 

float LNG (pnt A[N],int a,int b)

{

float lng;

lng=sqrt((A[a].x-A[b].x)*(A[a].x-A[b].x)+(A[a].y-A[b].y)*(A[a].y-A[b].y));

return lng;

}

 

float PER (pnt A[N],int a,int b,int c)

{

float per;

per=LNG(A,a,b);

per+=LNG (A,b,c);

per+=LNG (A,c,a);

return per;

}

 

int CHECK_LINE (pnt A[N],int a,int b,int c)

{

float k1,k2;

k1=(A[a].x-A[b].x)*(A[b].y-A[c].y);

k2=(A[a].y-A[b].y)*(A[b].x-A[c].x);

if (fabs(k1)!=fabs(k2)) return 1;

else return 0;

}

 

void main ()

{

int n,i,j,e;

float per;

pnt A[N];

max permax;

permax.per=-2;

printf ("Input number:");

scanf ("%d",&n);

if (n>2)

{

permax.per=-1;

for (e=0;e<n;e++)

{

printf ("Input %d x,y:",e+1);

IN (A,e);

if (e>1)

for (i=0;i<=(e-2);i++)

for (j=i+1;j<=(e-1);j++)

{

per=PER (A,i,j,e);

if (permax.per<per)

if (CHECK_LINE (A,i,j,e)==1)

{

permax.per=per;

permax.p1=i;

permax.p2=j;

permax.p3=e;

}

}

}

if (permax.per!=-1) OUT (A,permax);

else printf ("Error: All points on one line");

}

else printf ("Error: Need more points");

getch();

}

Набор тестов

1) Тест на недостаточность точек

 

Входные данные: 2

Результат: “Error: Need more points"

2) Тест на отсутствие треугольника (точки повторяются)

Входные данные: 3, (2,2),(3,3),(2,2)

Результат: ”Error: All points on the one line ”

3) Тест на отсутствие треугольника (все точки лежат на одной прямой)

Входные данные: 4, (2,4),(3,5),(-4,-2),(-1,1)

Результат:”Error: All points on the one line ”

4)Тесты на принадлежность точек

Входные данные: 17, (2,0),(1;7),(-1.5,5.2),(6.1,-1.6),(0.2,-0.2),(2,0),(2,4),(3,5),(-4,-2),(-1,1),(3,3),(2,2),(4,5),(5,4),(6,5),(5,6),(0,0)

Результат: (1,7),(6.1,-1.6),(-4,-2)

 

Результат работы программы

• Было найдено одно из наиболее быстрых решений, которое нашло баланс между дополнительными проверками и простым перебором всех возможных комбинаций;

• Пройдя достаточное количество разнообразных тестов, программа ни разу не дала сбоя, всегда возвращая верные результаты;

• Программа без особых справляется с большим количеством входных данных за короткий срок.





Поделиться с друзьями:


Дата добавления: 2016-11-18; Мы поможем в написании ваших работ!; просмотров: 712 | Нарушение авторских прав


Поиск на сайте:

Лучшие изречения:

Стремитесь не к успеху, а к ценностям, которые он дает © Альберт Эйнштейн
==> читать все изречения...

2158 - | 2114 -


© 2015-2024 lektsii.org - Контакты - Последнее добавление

Ген: 0.011 с.