#include <iostream>
#include <vector>
#include <algorithm>
#include <functional> //для greater<>
//Определение PI = 3.14 ~
const double M_PI = 3.14159265358979323846;
using namespace std;
vector <double> A,B;
vector <double> Z; // Вектор все значения;
double **E; //наш двумерный массив;
//Функция вычисления значения функции по заданию
double Funct1 (double x)
{
double Result = 3.0 * cos(5*x) + sin(x);
return Result;
}
//Вывод (**Тебе не нужна** ), для теста использовал
void Print (double Val)
{
cout<<Val<<endl;
}
//Функция записи значения в массив B (меньше половины ср. арифм)
void InToMassB(vector<double>All,double SrFun)
{
for (int i = 0; i<All.size(); i++)
{
if (All[i] < SrFun )
{
B.push_back(All[i]);
}
}
}
int main(void)
{
double Iterator = -M_PI; //Начальное знаение
double MaxIterator = M_PI; //Конечное значение
double StepIter = M_PI / 10; //Шаг итерации
double SredFunc = 0; //Средне-арифметич. значение на промежутке (Сначало сумма всех значений)
int IterCount = 0; //Кол-во итераций (для нахождение средне арифм. значения на промежутке
while (Iterator <= MaxIterator)
{
double FValue = Funct1(Iterator); //Текущее значение функции
SredFunc += FValue; //Суматор значений
IterCount++; //Инкремент кол-ва итераций
if (FValue != 0) // Если знаение НЕ НУЛЕВО пишим в массив A
{
A.push_back(FValue);
}
Z.push_back(FValue); // Все значения пишим сюда
Iterator += StepIter; //Увеличиваем значения аргумента на ШАГ
}
SredFunc = (SredFunc/Iterator) /2; //Среднее значение функции на промежутке пополам
InToMassB(Z,SredFunc);
sort(A.begin(),A.end()); //Сортировка по возрастанию вектора A
sort(B.begin(),B.end(),greater<double>()); //Сортировка по убыванию вектора B
int Min_Razm; //переменная с наименьшей размерностью
//найдем ее
(A.size() > B.size()) ? Min_Razm = B.size(): Min_Razm = A.size();
int RowMaxPlus = 0; //переменная номер строки с макс. положительными элементами;
int PlusEl = -1; //Переменная для с кол-вом положительных эл. по строке.
//Инициализация и заполнения двумерного массива E
E = new double* [Min_Razm];
for (int i=0; i<Min_Razm;i++)
{
int PlusElements = 0; // кол-во пол. элементов по тек. строке
E[i] = new double [Min_Razm];
for (int j=0; j<Min_Razm;j++)
{
if (A[i] > B [j]) E[i][j] = A[i] - B[j];
if (A[i] < B [j]) E[i][j] = A[i] + B[j];
if (A[i] == B [j]) E[i][j]= 0;
//Проверим положительность, если положительный увеличим счетчик
if (E[i][j] > 0) PlusElements++;
}
//проверим наибольшее кол-во полож. элементов по строке
if (PlusElements > PlusEl)
{
RowMaxPlus = i;
PlusEl = PlusElements;
}
}
//Поменяем элементы строки со столбцом
for (int i=0; i<Min_Razm;i++)
{
double buffer = 0; //Буферная переменная для замены
buffer = E[RowMaxPlus][i];
E[RowMaxPlus][i] = E[i][RowMaxPlus];
E[i][RowMaxPlus] = buffer;
}
//Ну тут можно глянуть что в итоге вышло
cout<<"A:"<<endl;
for_each(A.begin(),A.end(),Print); //STL перебор вектора
cout<<endl<<"B:"<<endl;
for_each(B.begin(),B.end(),Print); //STL перебор вектора
cout<<"E:"<<endl;
for (int i=0; i<Min_Razm;i++)
{
for (int j=0; j<Min_Razm;j++)
{
cout<<E[i][j]<<" ";
}
cout<<endl;
}
}