IPB

Здравствуйте, гость ( Вход | Регистрация )

> Массивы на c++ в среде CodeBlock, Помогите !
MonaMi
сообщение 3.12.2012, 18:35
Сообщение #1


Новичок
*

Группа: Продвинутые
Сообщений: 5
Регистрация: 3.12.2012
Город: Ростов-на-Дону
Учебное заведение: ЮФУ



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

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

Вот теперь вопрос: как сделать так, чтобы находя периметр определить, что он максимально возможный при данных точках?
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
 
Ответить в эту темуОткрыть новую тему
Ответов(1 - 7)
MonaMi
сообщение 3.12.2012, 18:49
Сообщение #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.12.2012, 20:46
Сообщение #3


Студент
**

Группа: Продвинутые
Сообщений: 86
Регистрация: 16.11.2010
Город: Saratov



Цитата(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
сообщение 4.12.2012, 13:52
Сообщение #4


Новичок
*

Группа: Продвинутые
Сообщений: 5
Регистрация: 3.12.2012
Город: Ростов-на-Дону
Учебное заведение: ЮФУ



Ограничений по времени нет. проверять на расположение точек на одной прямой,предполагаю тоже не надо.
Спасибо за подсказку. Единственная проблема возникает-как записать полученние длины сторон в двумерный массив? Я двумерные массивы плохо знаю. Семантически как это будет? массив размера n/3 на 3 и в каждом столбце записаны три длины сторон треугольника?
Как я поняла, мне достаточно будет проверять,что точки не одинаковые и читая значения длин из массива считать периметры,а потом искать максимальным?
По логике, максимальный периметр получится при наибольших сторонах.
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
daslex
сообщение 4.12.2012, 15:56
Сообщение #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
сообщение 4.12.2012, 16:00
Сообщение #6


Студент
**

Группа: Продвинутые
Сообщений: 86
Регистрация: 16.11.2010
Город: Saratov



Цитата(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
сообщение 4.12.2012, 19:46
Сообщение #7


Новичок
*

Группа: Продвинутые
Сообщений: 5
Регистрация: 3.12.2012
Город: Ростов-на-Дону
Учебное заведение: ЮФУ



Цитата(Sergio Ramos @ 4.12.2012, 20:00) *



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

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

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

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

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

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


Спасибо)


Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
daslex
сообщение 4.12.2012, 20:38
Сообщение #8


Новичок
*

Группа: Продвинутые
Сообщений: 6
Регистрация: 30.11.2012
Город: Санкт-Петербург
Учебное заведение: мозга нет, не берут никуда. отчисленный
Вы: другое



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

>>system("CLS");

очищает экран (может и не нужна)
Пользователь в офлайнеКарточка пользователяОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия Сейчас: 25.5.2025, 20:29

Книжки в помощь: "Сборник заданий по высшей математике" Кузнецов Л.А., "Сборник заданий по высшей математике" Чудесенко В.Ф., "Индивидуальные задания по высшей математике" Рябушко А.П., и другие.




Зеркало сайта Решебник.Ру - reshebnik.org.ru