Протабулировать функцию и ...На языке С

  • Автор темы polynkov1
  • Дата начала
Статус
Закрыто для дальнейших ответов.
P

polynkov1

#1
Люди помогите решить/исправить задачу! Я уже решил/написал текст программы да там столько ошибок много да и не факт что она правильно написана:

Вот фаил программы: http://narod.ru/disk/22396833000/POL-KR.CPP.html
Вот заание: http://i070.radikal.ru/1005/a5/f49e50620602.jpg
среда Builder, С++
Заранее спасибо!
 
R

romanriddick

#2
Люди помогите решить/исправить задачу! Я уже решил/написал текст программы да там столько ошибок много да и не факт что она правильно написана:

Вот фаил программы: http://narod.ru/disk/22396833000/POL-KR.CPP.html
Вот заание: http://i070.radikal.ru/1005/a5/f49e50620602.jpg
среда Builder, С++
Заранее спасибо!
Решу.Недорого
romanriddick@bk.ru
icq: 586013370
 

DarkKnight

Well-known member
01.08.2010
653
0
#3
При таком условии, в массив A попадают все значения, там нет просто нулевых... Глупое условие задания... Выложу решение через пару часов, пока занят просто...
 

DarkKnight

Well-known member
01.08.2010
653
0
#4
C++:
#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;
}



}
Тут консоль только, но я думаю на Билдер сам переложишь.
Для вывода используй TStringGrid, для получения значений Y вызывай функцию (обходишь массив (вектор) по порядку и с этими аргументами вызываешь функцию, если что не ясно пиши, помогу.
 

DarkKnight

Well-known member
01.08.2010
653
0
#6
Думаю парень пишит в Turbo C++, а он поддерживает STL :)
Просто думал динамические массивы его запутаю еще больше)))

2Автор : Ну а так roman прав)) Юзай массивы и контролируй их длину))
Ну и метод пузырька тебе поможет ) что то наподобии:
C++:
	double mas[] = {7,6,5,4,3,2,1};

for (int i = 0; i < sizeof (mas) /sizeof(double); i++)
{
double min = 9999999999999999;
int pos_min = -1;
for (int j = i; j < sizeof (mas) /sizeof(double); j++)
{
if (mas[j]< min) { pos_min = j; min = mas[j];}
}
int buffer = mas[i];
mas[i]=mas[pos_min];
mas[pos_min] = buffer;
}
 
R

romanriddick

#7
врятли он ето прочтет , взглини на дату!!!))) :unsure:
 

DarkKnight

Well-known member
01.08.2010
653
0
#8
Я смотрел))) Ну это без разницы)) Вдруг кому пригодится еще))
На этом форуме время пролетает пипец просто))) мне нравиться))) Я такую хрень с универа не писал) весело)
даже мозг заработал) а то от Buildera и дурацких проэктов деградирую...
 
Статус
Закрыто для дальнейших ответов.