Школьная задачка для разминки и занять время - страница 7

 
Nikolai Semko:
Разве?
Сейчас не за компом.
Вроде пробовал. ME не узнавал этой функции и в справке не находил по F1
Я так понял, что это библиотека AlgLib

https://www.mql5.com/ru/docs/standardlibrary/mathematics/stat/mathsubfunctions/statmathsum

 
Aleksey Nikolayev:

https://www.mql5.com/ru/docs/standardlibrary/mathematics/stat/mathsubfunctions/statmathsum

Мдя. Реализация ...

Это же либа, там как-то так должно быть:

1. При нулевом массиве возвращает значение инициализированное конструктором по умолчанию (для примитивов - это 0)

template<typename T>
T MathSum(const T &arr[]){
   T sum=T();
   for (int i=0,size=ArraySize(arr);i<size;sum+=arr[i++]);
   return sum;
}

2. При нулевом массиве падает в рантайме

template<typename T>
T MathSum(const T &arr[]){
   T sum=arr[0];
   for (int i=1,size=ArraySize(arr);i<size;sum+=arr[i++]);
   return sum;
}

3. Возвращает структуру, содержащую код результата работы и сумму

template<typename T>
struct SRet{
   int retCode; //0 - Ок, -1 - Not initialized
   T res;
   SRet():retCode(-1){}
   SRet(uint code,const T &_res):retCode(code),res(_res){}
   SRet(const SRet<T> &other) {this=other;}
   bool operator !() const {return retCode!=0;}
};

template<typename T>
SRet<T> MathSum(const T &arr[]){
   int size=ArraySize(arr);
   if (!size) return SRet<T>();
   SRet<T> ret(0,arr[0]);
   for (int i=1,size=ArraySize(arr);i<size;ret.res+=arr[i++]);
   return ret;
}

Что называется, что больше нравится)))

На коленке писал, так, что может где и косяка упорол.

 
Aleksey Nikolayev:
Про теорему Крамера есть в этой книге (Приложение, стр. 102).

спасибо! оказывается очень просто доказывается через (непростую) теорему о круге.

 
Vladimir Simakov:

Мдя. Реализация ...

Это же либа, там как-то так должно быть:

1. При нулевом массиве возвращает значение инициализированное конструктором по умолчанию (для примитивов - это 0)

2. При нулевом массиве падает в рантайме

3. Возвращает структуру, содержащую код результата работы и сумму

Что называется, что больше нравится)))

На коленке писал, так, что может где и косяка упорол.

Ну, было же написано: "делаем как в R, только быстрее", как в С++ не обещалось.

 
Aleksey Nikolayev:

Ну, было же написано: "делаем как в R, только быстрее", как в С++ не обещалось.

Weak excuse.

Делать как в R ... Не знаю, R нету в моем стеке.

Вот только, не пользоваться шаблонами при написании библиотеки в С++ (если выглядит как С++, пахнет как С++ и даже UB у них есть, то наводит на мысли...) - это как-то ...

 
Aleksey Nikolayev:

https://www.mql5.com/ru/docs/standardlibrary/mathematics/stat/mathsubfunctions/statmathsum

В справке есть, но компилятор ее не видит.
Такое только у меня?


ЗЫ сейчас только увидел что у вас стоит 

#include <Math\Stat\Math.mqh>

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

 
Nikolai Semko:


Еще раз - не вижу смысла обвешивать свою программу дополнительными библиотеками ради экономии одной строки кода.

программа для частного случая есть - есть. Придирки про MathSum несущественны

на фоне более существенной проблемы: выше заметили что это решение работает только если центр описанного круга попадает внутрь фигуры.

То есть нужен ещё критерий применимости. "вот для этого - пожалте результат, а вот для такого ни-шмогу"

вот теперь к оптимизации оптимизатором тема имеет прямое отношение...

 
Maxim Kuznetsov:

программа для частного случая есть - есть. Придирки про MathSum несущественны

на фоне более существенной проблемы: выше заметили что это решение работает только если центр описанного круга попадает внутрь фигуры.

То есть нужен ещё критерий применимости. "вот для этого - пожалте результат, а вот для такого ни-шмогу"

вот теперь к оптимизации оптимизатором тема имеет прямое отношение...

На первый взгляд, изменится только уравнение для определения R.

1) В случае центра внутри: A1+A2+...+An=2*Pi
2) В случае центра снаружи: A1-A2-...-An=0, где A1 - угол для самой длинной стороны.

Стало быть, нужно лишь определить как отличать эти два случая.

PS. В общем, нужно посчитать сумму углов Ai при условии, что радиус равен половине максимальной стороны. Если он меньше 2*Пи, то центр снаружи многоугольника и наоборот.

 
Maxim Kuznetsov:

программа для частного случая есть - есть. Придирки про MathSum несущественны

на фоне более существенной проблемы: выше заметили что это решение работает только если центр описанного круга попадает внутрь фигуры.

То есть нужен ещё критерий применимости. "вот для этого - пожалте результат, а вот для такого ни-шмогу"

вот теперь к оптимизации оптимизатором тема имеет прямое отношение...

Ну почему же ни-шмогу.
Просто время тратить нужно, а для чего - не ясно.

Так вроде Симаков уже сделал. Правда я не разбирался.

ну ладно, сейчас попробую на свой лад. Чтобы визуально все было видно.

 

Файлы:
Zadacha3.mq5  9 kb