Помощь - Поиск - Пользователи - Календарь
Полная версия: Массивы на c++ в среде CodeBlock > Информатика / Программирование
Образовательный студенческий форум > Другие дисциплины > Информатика / Программирование
MonaMi
Нужно написать программу на С++
Задание звучит так:
Даны натуральное число n и два вещественных массива из n элементов каждый. Массивы содержат значения координат точек на плоскости. Из заданного множества точек на плоскости выбрать такие три точки, которые составляют треугольник наибольшего периметра (использовать функцию).

Для решения этой задачи я решила использовать следующий алгоритм:
1. Просматриваем два массива со значениями координат.
2. Находим длину одной стороны, потом второй и третьей.
3. Значения нашедших сторон складываем и получаем периметр.

Вот теперь вопрос: как сделать так, чтобы находя периметр определить, что он максимально возможный при данных точках?
MonaMi
Функция нахождение периметра треугольника. Не работает так, как надо..но не знаю как ее поменять((

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
Цитата(MonaMi @ 3.12.2012, 23:49) *

Функция нахождение периметра треугольника. Не работает так, как надо..но не знаю как ее поменять((

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
Ограничений по времени нет. проверять на расположение точек на одной прямой,предполагаю тоже не надо.
Спасибо за подсказку. Единственная проблема возникает-как записать полученние длины сторон в двумерный массив? Я двумерные массивы плохо знаю. Семантически как это будет? массив размера n/3 на 3 и в каждом столбце записаны три длины сторон треугольника?
Как я поняла, мне достаточно будет проверять,что точки не одинаковые и читая значения длин из массива считать периметры,а потом искать максимальным?
По логике, максимальный периметр получится при наибольших сторонах.
daslex
Массивы содержат значения координат точек на плоскости
Массивы содержат вещественные числа.
=============
У каждой точки две(три, четыре и более координат) Зависит от плоскости и пространства. Следовательно первый массив содержит значения 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
Цитата(MonaMi @ 4.12.2012, 18:52) *

Ограничений по времени нет. проверять на расположение точек на одной прямой,предполагаю тоже не надо.
Спасибо за подсказку. Единственная проблема возникает-как записать полученние длины сторон в двумерный массив? Я двумерные массивы плохо знаю. Семантически как это будет? массив размера 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
Цитата(Sergio Ramos @ 4.12.2012, 20:00) *



Спасибо большое) буду пробовать)

Цитата(daslex @ 4.12.2012, 19:56) *

Массивы содержат значения координат точек на плоскости
Массивы содержат вещественные числа.
=============
У каждой точки две(три, четыре и более координат) Зависит от плоскости и пространства. Следовательно первый массив содержит значения X, второй массив Y. Итого получается N известных точек, по которым нужо провести анализ по периметрам треугольников в двумерной плоскости. Это N задано условием.
============

Я Правильно понял?

да. задание Вы правильно поняли.

>>system("CLS");
что это за функция и что она выполняет?


Спасибо)


daslex
Цитата(MonaMi @ 4.12.2012, 19:46) *

>>system("CLS");

очищает экран (может и не нужна)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.
Русская версия Invision Power Board © 2001-2024 Invision Power Services, Inc.