![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
MonaMi |
![]() ![]()
Сообщение
#1
|
Новичок ![]() Группа: Продвинутые Сообщений: 5 Регистрация: 3.12.2012 Город: Ростов-на-Дону Учебное заведение: ЮФУ ![]() |
Нужно написать программу на С++
Задание звучит так: Даны натуральное число n и два вещественных массива из n элементов каждый. Массивы содержат значения координат точек на плоскости. Из заданного множества точек на плоскости выбрать такие три точки, которые составляют треугольник наибольшего периметра (использовать функцию). Для решения этой задачи я решила использовать следующий алгоритм: 1. Просматриваем два массива со значениями координат. 2. Находим длину одной стороны, потом второй и третьей. 3. Значения нашедших сторон складываем и получаем периметр. Вот теперь вопрос: как сделать так, чтобы находя периметр определить, что он максимально возможный при данных точках? |
![]() ![]() |
daslex |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Продвинутые Сообщений: 6 Регистрация: 30.11.2012 Город: Санкт-Петербург Учебное заведение: мозга нет, не берут никуда. отчисленный Вы: другое ![]() |
Массивы содержат значения координат точек на плоскости
Массивы содержат вещественные числа. ============= У каждой точки две(три, четыре и более координат) Зависит от плоскости и пространства. Следовательно первый массив содержит значения X, второй массив Y. Итого получается N известных точек, по которым нужо провести анализ по периметрам треугольников в двумерной плоскости. Это N задано условием. ============ Я Правильно понял? Если правильно, то проверка одинаковых точек легко выполняется(и без помощи) и может смогу помочь кодом. Код Visual Studio. В скобках точки, правее три длины отрезков по трем левым точкам. Код #include <iostream> #include <ctime> #include <cmath> using namespace std; struct tpoint{double x,y;}; //для корректного сложения сторон void show(double *a,double *b,int N) //для себя показывал массив { for (int i=0;i<N;i++) { cout<<a[i]<<" "<<b[i]<<endl; } } void create(double *a,double *b,int N) //создание массива { for (int i=0;i<N;i++) { a[i]=i; b[i]=i+N; } } double perimetr(double x,double y,double z) //функция периметра { return x+y+z; } void get(double *a,double *b,int N) //Поиск трех злостных точек { double len1,len2,len3; //длины отрезков на трех точках double sum=0; //максимальный периметр tpoint T1,T2,T3; //три точки for (int i=0;i<N;i++) //Анализ всех комбинаций для построения треугольиков for (int j=i+1;j<N;j++) for (int k=j+1;k<N;k++) { //Вывод на экран длин трех отрезков cout<<"("<<a[i]<<";"<<b[i]<<") ("<<a[j]<<";"<<b[j]<<") ("<<a[k]<<";"<<b[k]<<")"<< "\t "; cout<<sqrt(pow(fabs(a[i]-a[j]),2)+pow(fabs(b[i]-b[j]),2))<<" "; cout<<sqrt(pow(fabs(a[j]-a[k]),2)+pow(fabs(b[j]-b[k]),2))<<" "; cout<<sqrt(pow(fabs(a[k]-a[i]),2)+pow(fabs(b[k]-b[i]),2))<<" "; //Запомиание длин в переменные len1=sqrt(pow(fabs(a[i]-a[j]),2)+pow(fabs(b[i]-b[j]),2)); len2=sqrt(pow(fabs(a[j]-a[k]),2)+pow(fabs(b[j]-b[k]),2)); len3=sqrt(pow(fabs(a[k]-a[i]),2)+pow(fabs(b[k]-b[i]),2)); //вот тут сравниваем периметр с максимальным на данный момент периметром и если новый больше текущего, запоминаем точки и новый периметр if (perimetr(len1,len2,len3)>sum) { T1.x=a[i]; T2.x=a[j]; T3.x=a[k]; T1.y=b[i]; T2.y=b[j]; T3.y=b[k]; sum=perimetr(len1,len2,len3); }; cout<<endl; } //Выводим инфу на экран cout<<"НАЙДЕНЫ ТОЧКИ"<<endl; cout<<T1.x<<" "<<T1.y<<endl; cout<<T2.x<<" "<<T2.y<<endl; cout<<T3.x<<" "<<T3.y<<endl; cout<<"ПЕРиМЕТР ТРЕУГОЛЬНИКА = "<<sum<<endl; } void main() { system("CLS"); double *Arr1,*Arr2; int N=9; Arr1=new double[N]; Arr2=new double[N]; create(Arr1,Arr2,N); //Создание массива из N элементов show(Arr1,Arr2,N); //отображение массива на экране get(Arr1,Arr2,N); //Поис злых точек delete []Arr1; //освобождение памяти delete []Arr2; } Если подойдет, то немного совсем доработать, если нет, то условие неоднозначое очень. |
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 28.5.2025, 1:28 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru