![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
MonaMi |
![]() ![]()
Сообщение
#1
|
Новичок ![]() Группа: Продвинутые Сообщений: 5 Регистрация: 3.12.2012 Город: Ростов-на-Дону Учебное заведение: ЮФУ ![]() |
Нужно написать программу на С++
Задание звучит так: Даны натуральное число n и два вещественных массива из n элементов каждый. Массивы содержат значения координат точек на плоскости. Из заданного множества точек на плоскости выбрать такие три точки, которые составляют треугольник наибольшего периметра (использовать функцию). Для решения этой задачи я решила использовать следующий алгоритм: 1. Просматриваем два массива со значениями координат. 2. Находим длину одной стороны, потом второй и третьей. 3. Значения нашедших сторон складываем и получаем периметр. Вот теперь вопрос: как сделать так, чтобы находя периметр определить, что он максимально возможный при данных точках? |
![]() ![]() |
MonaMi |
![]()
Сообщение
#2
|
Новичок ![]() Группа: Продвинутые Сообщений: 5 Регистрация: 3.12.2012 Город: Ростов-на-Дону Учебное заведение: ЮФУ ![]() |
Функция нахождение периметра треугольника. Не работает так, как надо..но не знаю как ее поменять((
int perimetr(const int *a, const int *b, int n) { int i=0; int a, b, c, p; for (i=0; i<n; i++) { a=sqrt((abs(a[i]-a[i+1]))^2 + (abs(b[i]-b[i+1]))^2); b=sqrt((abs(a[i+1]-a[i+2]))^2 + (abs(b[i+1]-b[i+2]))^2); c=sqrt((abs(a[i+2]-a[i+3]))^2 + (abs(b[i+2]-b[i+3]))^2); p=a+b+c; } |
Sergio Ramos |
![]()
Сообщение
#3
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 86 Регистрация: 16.11.2010 Город: Saratov ![]() |
Функция нахождение периметра треугольника. Не работает так, как надо..но не знаю как ее поменять(( int perimetr(const int *a, const int *b, int n) { int i=0; int a, b, c, p; for (i=0; i<n; i++) { a=sqrt((abs(a[i]-a[i+1]))^2 + (abs(b[i]-b[i+1]))^2); b=sqrt((abs(a[i+1]-a[i+2]))^2 + (abs(b[i+1]-b[i+2]))^2); c=sqrt((abs(a[i+2]-a[i+3]))^2 + (abs(b[i+2]-b[i+3]))^2); p=a+b+c; } 1. "два вещественных массива". у Вас const int. 2. в цикле очевиден выход за границы массива. 3. ^2 - это возведение в квадрат? а как же pow, а как же простое перемножение? Если ограничений по времени нет, то предлагаю банальный перебор: 1. Найти расстояния между всеми точками (по Пифагору), записать в отдельный двумерный массив, который будет симметричным относительно главной диагонали. 2. Код double maxPerimeter = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { if (i != j) { for (int k = 0; k < n; k++) { if (j != k && k != i) { double currentPerimeter = lens[i][j] + lens[j][i] + lens[j][k]; if (currentPerimeter > maxPerimeter) { maxPerimeter = currentPerimeter; } } } } } } + Необходимо ли проверять условие расположения точек на одной прямой? |
MonaMi |
![]()
Сообщение
#4
|
Новичок ![]() Группа: Продвинутые Сообщений: 5 Регистрация: 3.12.2012 Город: Ростов-на-Дону Учебное заведение: ЮФУ ![]() |
Ограничений по времени нет. проверять на расположение точек на одной прямой,предполагаю тоже не надо.
Спасибо за подсказку. Единственная проблема возникает-как записать полученние длины сторон в двумерный массив? Я двумерные массивы плохо знаю. Семантически как это будет? массив размера n/3 на 3 и в каждом столбце записаны три длины сторон треугольника? Как я поняла, мне достаточно будет проверять,что точки не одинаковые и читая значения длин из массива считать периметры,а потом искать максимальным? По логике, максимальный периметр получится при наибольших сторонах. |
daslex |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Продвинутые Сообщений: 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; } Если подойдет, то немного совсем доработать, если нет, то условие неоднозначое очень. |
Sergio Ramos |
![]()
Сообщение
#6
|
Студент ![]() ![]() Группа: Продвинутые Сообщений: 86 Регистрация: 16.11.2010 Город: Saratov ![]() |
Ограничений по времени нет. проверять на расположение точек на одной прямой,предполагаю тоже не надо. Спасибо за подсказку. Единственная проблема возникает-как записать полученние длины сторон в двумерный массив? Я двумерные массивы плохо знаю. Семантически как это будет? массив размера n/3 на 3 и в каждом столбце записаны три длины сторон треугольника? Как я поняла, мне достаточно будет проверять,что точки не одинаковые и читая значения длин из массива считать периметры,а потом искать максимальным? По логике, максимальный периметр получится при наибольших сторонах. >>> двумерные массивы плохо знаю. ничего сложного. это массив одномерных массивов. пример инициализации статического двумерного массива int array[10] [20] ; пример инициализация динамического двумерного массива int ** array = new int * [N]; for(int i=0; i < N; i++) array[i] = new int[N]; >>> массив размера n/3 на 3 и в каждом столбце записаны три длины сторон треугольника? массив n x n, где array[i][j] = длине между i-ой и j-ой точкой. исправите lens[i][j] на lens[i][k]. а то 2 раза одно и тоже расстояние прибавляется. |
MonaMi |
![]()
Сообщение
#7
|
Новичок ![]() Группа: Продвинутые Сообщений: 5 Регистрация: 3.12.2012 Город: Ростов-на-Дону Учебное заведение: ЮФУ ![]() |
Спасибо большое) буду пробовать) Массивы содержат значения координат точек на плоскости Массивы содержат вещественные числа. ============= У каждой точки две(три, четыре и более координат) Зависит от плоскости и пространства. Следовательно первый массив содержит значения X, второй массив Y. Итого получается N известных точек, по которым нужо провести анализ по периметрам треугольников в двумерной плоскости. Это N задано условием. ============ Я Правильно понял? да. задание Вы правильно поняли. >>system("CLS"); что это за функция и что она выполняет? Спасибо) |
daslex |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Продвинутые Сообщений: 6 Регистрация: 30.11.2012 Город: Санкт-Петербург Учебное заведение: мозга нет, не берут никуда. отчисленный Вы: другое ![]() |
|
![]() ![]() |
![]() |
Текстовая версия | Сейчас: 25.5.2025, 20:29 |
Зеркало сайта Решебник.Ру - reshebnik.org.ru