Редактирование: Информатика: Функции

Перейти к: навигация, поиск

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
'''[[Абрамов Игорь]]'''
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
 
 +
 
 +
'''[[Лебедев Станислав]]'''
  
'''Алгоритм''': функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно двумя способами: с помощью математических функций из стандартных библиотек, указывая начало и конец отрезка, а также шаг, с которым определена функция, и считывая координаты точек из файла, предварительно считав их количество. Далее с любыми функциями можно производить следующие действия и их комбинации: сложение, вычитание, кубическая интерполяция и линейная аппроксимация. При этом результат каждого из этих действий - новая функция, с которой можно продолжать работу. Функции можно выводить на экран с помощью средств графической библиотеки OpenGL, а также печатать её значения в файл.
+
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
  
'''Инструкция''': пользователь вводит необходимые действия с функциями в функции Display. На данный момент при запуске программы можно увидеть пример её работы: первая функция считывается из файла, интерполируется и выводится на экран. Затем вторая функция вводится из библиотеки math.h интерполируется и выводится на экран. Затем функции суммируются, интерполируются и выводятся на экран. [[:File:Func_Abramov.rar]]
+
'''Пояснения к алгоритму''':
 +
#  Прочитанные из файла функции нужно отсортировать.
 +
#  Найти совместную область определения, то есть, найти множество пересечения областей определения функций, над которыми совершается операция.
 +
#  Создать третью функцию, со следующими свойствами : область определения состоит только из точек, принадлежащих совместной области определения, каждая точка области значений является результатом нужной операции над точкой области значений одной из функций и, либо интерполированной точкой по другой функции, либо, если есть возможность, точным значением из ее области значений.
  
Ссылка на скачивание: [http://tm.spbstu.ru/File:Func_Abramov.rar]
+
Скачать можно  [http://tm.spbstu.ru/Файл:Функции.rar тут].
  
'''[[Андреева Полина]]'''
 
  
'''Инструкция к программе:''' пользователь должен ввести начало, конец и шаг. Создается две функции. Затем на экране появляется один из знаков арифметических действий. Пользователь выбирает один из знаков. Создается третья функция. Пользователь вводит второй шаг. Функция интерполируется по этому новому шагу, а затем аппроксимируется.
 
'''Краткое описание алгоритма :''' в классе создается две функции(с помощью массивов). Так же в классе есть такие методы: перегрузка арифм операций, интерполяция, аппроксимация, вывод массивов на экран и их сохранение в файл. Сначала создается два массива для функций. Затем  с помощью перегрузки эти два массива складываются/умножаются/делятся/вычитаются и записываются опять в этот массив. В методе перегрузки сразу вызывается интерполяция и аппроксимация.
 
[http://tm.spbstu.ru/Файл:Function.rar Программа]
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
 
<div class="mw-collapsible-content">
 
<div class="mw-collapsible-content">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
 
#include <iostream>
 
#include <iostream>
 +
#include <math.h>
 +
#include <cstring>
 +
#include <cmath>
 +
#include <malloc.h>
 
#include <fstream>
 
#include <fstream>
#include "math.h"
+
 
 
using namespace std;
 
using namespace std;
class func
+
 
 +
double base(double x)                                        //базовая функция ( если задавать через шаг и начальный х
 
{
 
{
private:
+
     return x;
    double *mass1, *mass, *masss ;
+
}
    double  AmountDouble, Begin, End, Step, Step2;
 
public:
 
     int  AmountInt;
 
    func ( double _Begin, double _End, double _Step ):Begin(_Begin), End(_End), Step(_Step)
 
    {
 
        AmountDouble=((End-Begin)/Step)+1;///количество точек с данным шагом
 
        AmountInt=static_cast<int>(AmountDouble);///так как количество это целое число, то округляем
 
  
     }
+
struct ap                                                  //две одинаковые структуры это нехорошо,коненчо,но зато наглядно...
 +
{
 +
     double k,b;
 +
};
 +
 
 +
struct fun                                                  //один столбик в таблице функции
 +
{
 +
    double x,y;
 +
};
 +
 
 +
struct sf                                                  //структура нужная, для возражеия значений из функции "prepare" класса F
 +
{
 +
    int i1,i2,e1,e2;
 +
    double glength, gfirstx, glastx;
 +
};
  
    void massiv1() ///создание первой функции х^3
+
double intr(double x1,double x2,double x,double y1,double y2) // линенейная интерполяция
    {
+
{
        mass=new double[AmountInt];
+
    return ( ((x-x1)/(x2-x1)) * (y2-y1) + y1 );
        for (int l=0; l<AmountInt; l++)
+
}
        {
 
            mass[l] =pow((l*Step+Begin),3);
 
        }
 
        cout << "y=x^3 \n";
 
    }
 
    void massiv2() ///создание второй функции sin(x)
 
    {
 
        mass=new double[AmountInt];
 
        for (int l=0; l<AmountInt; l++)
 
        {
 
            mass[l] =sin(l*Step+Begin);
 
        }
 
        cout << "y=sin(x) \n";
 
    }
 
  
     void interpolation(double __Begin, double __End, double __Step)
+
ap aproks(fun b [],int n)                                      //линейная аппроксимация
 +
{
 +
    ap r;
 +
     double xy = 0,x = 0,y = 0,sqx = 0,xsq = 0;
 +
    for (int i = 0; i < n; i++)                                 //вычисление коэффицентов
 
     {
 
     {
 
+
         xy  += b[i].x*b[i].y;
         double NewAmount=((__End-__Begin)/__Step) + 1;///количество точек для нового шага
+
        x   += b[i].x;
        int NewAmountInt=static_cast<int>(NewAmount);
+
        y  += b[i].y;
        for (int i=0; i<NewAmountInt; i++)///i-это точки функции с новыми шагами
+
        sqx += b[i].x*b[i].x;
        {
+
         xsq += b[i].x;
            mass1 = new double[NewAmountInt];
 
            double x = i*__Step+__Begin;///значения х в новых точках
 
            double x0=(static_cast<int>((x-__Begin)/Step)) * Step+__Begin;///значение х в точке интерполяции
 
            ///стоящей ДО новой точки
 
            double x1=x0+Step;///точка интерполяции ПОСЛЕ новой точки, т.е к предыдущей прибавляем СТАРЫЙ шаг
 
            int i0=(static_cast<int>((x-__Begin)/Step));///это нужно для массива, значение массива в i0 соответстует значению функции в x0
 
            int i1=i0+1;
 
            mass1[i]=(((x - x0 )*(mass[i1] - mass[i0]))/( x1-x0)) + mass[i0];
 
            cout << "y("<<i<< ") = " << mass1[i] <<endl<<endl; ///вывод интерполяции на экран
 
            std::ofstream fout("Interpol.txt",ios::app);///сохранение в файл
 
            fout<<i<<" "<<mass1[i]<<" \n";
 
            fout.close();
 
         }
 
        AmountInt=NewAmountInt;
 
        delete[] mass;
 
        mass=mass1;
 
        cout<<"end of interpol";
 
 
     }
 
     }
 +
    xsq *= xsq;
  
     void approximation(double __Begin, double __End, double __Step)
+
     r.k = (n*xy - x*y)/(n*sqx - xsq);                      //использование формул
 +
    r.b = (y - r.k*x)/n;
 +
    return r;
 +
}
  
 +
class F
 +
{
 +
private:
 +
    int length;
 +
    double firstx, step, lastx;
 +
    fun *a;
 +
public:
 +
    F(){}
 +
    F(int l,double f,double s)                              //конструктор, создающий фунцию по длине,первоиу элементу,шагу по х, y вычисляется по базовой функции
 
     {
 
     {
         double SumXMass=0;///это сумма умножений x на значение функции в этом x для всех значений
+
         if (l >= 0)
        double SumX=0;///сумма всех значений x
+
          a = new fun [l];
         double SumMass=0;///сумма всех значений функции в точках x
+
         firstx = f;
         double SumXX=0;///сумма всех квадратов значений x
+
         length = l;
         mass1 = new double[AmountInt];
+
         step = s;
         double x;
+
         lastx = firstx+(length - 1)*step;
        for (int i=0; i<AmountInt; i++)
 
        {
 
            x=i*__Step+__Begin;///такие значения принимает x в точках по порядку i
 
            SumXMass=SumXMass+x*mass[i];
 
            SumX=SumX+x;
 
            SumMass=SumMass+mass[i];
 
            SumXX=SumXX+x*x;
 
  
        }
 
        double a=(SumXMass*AmountInt-SumX*SumMass)/(AmountInt*SumXX-SumX*SumX);
 
        double b=(SumMass-a*SumX)/AmountInt;
 
        if (b>0)
 
            cout<<"approximation "<<a<<"*x+"<<b<<endl;
 
        else if (b<0)
 
            cout<<"approximation "<<a<<"*x"<<b<<endl;
 
  
         for (int i=0; i<AmountInt; i++)
+
         for (int i = 0;i < length; i ++)
 
         {
 
         {
             mass1[i] = a*(i*__Step+__Begin)+b;///такие значения принимает апроксимация
+
             a[i].y = base(firstx + i*step);
 +
            a[i].x = firstx + i*step;
 
         }
 
         }
        delete[] mass;
 
        mass=mass1;
 
        output();///вывод на экран
 
        SaveFile("approximation.txt");///сохранение в файл
 
        cout<<"end of appox";
 
  
 
     }
 
     }
  
     func operator+( func f)///перегрузка оператора +
+
     F (fun b[],int l)                                   //конструктор для создания фунции с уже известными областями определния и значений
 
     {
 
     {
         func newmass(Begin, End, Step);
+
         length = l;
         masss=new double[AmountInt];///новая функция равная сумме данныйх функций
+
         a = new fun [l];
         for (int i=0; i<AmountInt; i++)
+
         for (int i = 0; i < l;i++)
        {
+
             a[i] = b[i];
             masss[i] = mass[i] + f.mass[i];
+
 
        }
+
         for (int i = 0; i < l;i++)
         delete [] mass;
+
            for (int j = 0; j < (l - 1); j++)
        mass=masss;
+
                if (a[j].x > a[j + 1].x)
        output();///вывод на экран резултата
+
                {
        SaveFile("f3.txt");///сохранение в файл
+
                    fun tmp = a[j];
        cout<<"enter new step";
+
                    a[j] = a[j + 1];
        cin>>Step2;
+
                    a[j + 1] = a[j];
        cout<<"interpolation: ";
+
                }
        interpolation(Begin,End,Step2);///интерполяция
 
        cout<<" approximation: ";
 
        approximation(Begin,End,Step2);///аппроксимация
 
        return newmass;
 
  
 +
        firstx = a[0].x;
 +
        lastx = a[length - 1].x;
 
     }
 
     }
  
     func operator-( func f)
+
     void addpar (double k, double b, int l, fun z[] )                           //позволяет создать и заполнить переданным массивом поле объекта класса
 
     {
 
     {
         func newmass(Begin, End, Step);
+
         a = new fun [l];
        masss=new double[AmountInt];
+
         for (int i = 0; i < l; i++)
         for (int i=0; i<AmountInt; i++)
 
 
         {
 
         {
             masss[i] = mass[i] - f.mass[i];
+
             a[i].y = k*z[i].x + b;
 +
            a[i].x = z[i].x;
 
         }
 
         }
         delete [] mass;
+
         length = l;
        mass = masss;
+
    }
        output();
+
 
         SaveFile("f3.txt");
+
    double getelx(int i)                               //возращает значение из поля "х" iого элемента
        cout<<"enter new step";
+
    {
        cin>>Step2;
+
         return a[i].x;
        cout<<"interpolation: ";
+
    }
        interpolation(Begin,End,Step2);
+
 
        cout<<" approximation: ";
+
 
        approximation(Begin,End,Step2);
+
    double getely(int i)                               //возращает значение из поля "х" iого элемента
         return newmass;
+
    {
 +
         return a[i].y;
 
     }
 
     }
     func operator/( func f)
+
 
 +
     int getlength()                                //возращает размер области определения функции(в точках)
 
     {
 
     {
        func newmass(Begin, End, Step);
+
         return length;
        masss=new double[AmountInt];
 
        for (int i=0; i<AmountInt; i++)
 
        {
 
            masss[i] = mass[i] / f.mass[i];
 
        }
 
        cout << " division: \n ";
 
        delete [] mass;
 
        mass = masss;
 
        output();
 
        SaveFile("f3.txt");
 
        cout<<"enter new step";
 
        cin>>Step2;
 
        cout<<"interpolation: ";
 
        interpolation(Begin,End,Step2);
 
        cout<<" approximation: ";
 
        approximation(Begin,End,Step2);
 
         return newmass;
 
 
     }
 
     }
     func operator*( func f)
+
 
 +
     void FOut()                                     //выводит функцию на экран
 
     {
 
     {
         func newmass(Begin, End, Step);
+
      cout << "  x         y" << endl;
        masss=new double[AmountInt];
+
      for (int i = 0;i < length; i ++)
        for (int i=0; i<AmountInt; i++)
+
          cout << "   " << a[i].x << "        " << a[i].y << endl;
        {
+
      cout << endl;
            masss[i] = mass[i] * f.mass[i];
 
        }
 
        cout << " multiply: \n ";
 
        delete [] mass;
 
        mass = masss;
 
        output();
 
        SaveFile("f3.txt");
 
         cout<<"enter new step";
 
        cin>>Step2;
 
        cout<<"interpolation: ";
 
        interpolation(Begin,End,Step2);
 
        cout<<" approximation: ";
 
        approximation(Begin,End,Step2);
 
        return newmass;
 
 
     }
 
     }
  
  
     void output()///вывод функции на экран
+
     int pfind(double x)const                        //возращает либо номер элемента,идущщий перед элементом, большим,чем х; в случае нахождения равного, возращает число, противоположное номеру следующего элемента(иначе может вернуться нуль,а нуль знака не имееет)
 
     {
 
     {
         for (int i=0; i<AmountInt; i++)
+
         for (int i = 0; i < length-1; i++ )
 
         {
 
         {
             cout << "y("<<i<< ") = " << mass[i] <<endl;
+
             if (((a[i].x < x) && (a[i + 1].x > x)))
 
+
                return (i + 1);
 +
            else
 +
                // чтобы иметь возможность проанализировать полученное значение функции,мы должны понимать, было найденно равное или промежуточное значение. "флагом" равных значений является знак минус,но так у нуля нет знака,то приходиться все сдвигать на 1
 +
                if (a[i].x == x)
 +
                  return -(i + 1);
 +
                else
 +
                    if (a[i + 1].x == x)
 +
                        return -(i + 2);
 
         }
 
         }
 +
//        cerr << "fail!!" << endl;
 +
        return -1;
 
     }
 
     }
  
 
+
     sf prepare(F &x)const                                      //"подготовка" функций к бинарной операции (нахождение совместной области определения
     void SaveFile(char filename[])///сохранение функции в файл
 
 
     {
 
     {
         std::ofstream fout(filename);
+
         sf r;
         for (int l=0; l<AmountInt; l++)
+
         if (a[0].x > x.a[0].x)
 
         {
 
         {
             fout<<l<<" "<<mass[l]<<" \n";
+
             r.gfirstx = a[0].x;
 +
            r.i1 = 0;
 +
            r.i1 = 0;
 +
            double k = x.pfind(a[0].x);
 +
            if (k < 0)
 +
                r.i2 = -k - 1;
 +
            else
 +
                r.i2 = (k - 1) + 1;
 +
        }
 +
        else
 +
        {
 +
            r.gfirstx = x.a[0].x;
 +
            double k = pfind(x.a[0].x);
 +
            if (k < 0)
 +
                r.i1 = -k - 1;
 +
            else
 +
                r.i1 = (k - 1) + 1;
 +
            r.i2 = 0;
 +
        }
 +
 
 +
        if (a[length - 1].x < x.a[x.length - 1].x)
 +
        {
 +
            r.glastx = a[length - 1].x;
 +
            r.e1 = length - 1;
 +
            double k = x.pfind(r.glastx);
 +
            if (k < 0)
 +
                r.e2 = -k - 1;
 +
            else
 +
                r.e2 = (k - 1) - 1;
 +
        }
 +
        else
 +
        {
 +
            r.glastx = x.a[x.length - 1].x;
 +
            double k = pfind(r.glastx);
 +
            if (k < 0)
 +
                r.e1 = -k - 1;
 +
            else
 +
                r.e1 = (k - 1) + 1;
 +
            r.e2 = x.length - 1;
 
         }
 
         }
 +
        r.glength = length + x.length - r.i1 - (length - (r.e1 + 1)) - r.i2 - (x.length - (r.e2 + 1));
  
         fout.close();
+
         return r;
 
     }
 
     }
};
 
  
 +
    void ad (fun b[],int l)                                  //присвоить массиву объекта класса F значения массива b
 +
    {
 +
        length = l;
 +
        a = new fun [l];
 +
        for (int i = 0; i < l;i++)
 +
            a[i] = b[i];
 +
        firstx = a[0].x;
 +
        lastx = a[length - 1].x;
 +
    }
  
 +
    fun *geta()                                        //получения указателя на начало массива в поле класса
 +
    {
 +
        return a;
 +
    }
  
int main()
+
    F operator +(F &x) const                              //сложение двух функций
{
+
    {
 +
        int i1, e1, i2, e2, kk = 0;
 +
        double gfirstx, glastx, glength;
  
    double Begin1, End1, Step1, Step2;
+
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((lastx < x.firstx) && (firstx < x.firstx)))
    cout<<" enter the beginning of the  function ";
+
        {
    cin>>Begin1;
+
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
    cout<<"\n enter the end of the  function ";
+
            F fl(-1,0,0);
    cin>>End1;
+
            return fl;
    cout<<"\n enter the step of the 1st function ";
+
        }
    cin>>Step1;
+
        sf r = prepare(x);
 
+
        F tmp(r.glength,r.gfirstx,r.glastx);
    func f1(Begin1,End1,Step1);///создание первой функции
+
        for (int i = 0; i <= (r.e1 - r.i1); i++)
    f1.massiv1();
+
        {
    f1.output();
+
            tmp.a[i].x = a[i + r.i1].x;           //поправка,введенная таким образом,чтобы номер,с которого начинается отсчет был первым в новой области определения
    cout<<"\n ";
+
            int ii = x.pfind(tmp.a[i].x);
    f1.SaveFile("f1.txt");
+
            if (ii < 0)
 +
                tmp.a[i].y = x.a[-ii - 1].y + a[i + r.i1].y;
 +
            else
 +
                tmp.a[i].y = intr(x.a[ii - 1].x , x.a[ii + 1].x , tmp.a[i].x , x.a[ii].y , x.a[ii + 1].y) + a[i + r.i1].y;
 +
        }
 +
        for (int i = (r.e1 - r.i1 + 1); i <= (r.e2 - r.i2 + (r.e1 - r.i1) + 1) ; i++)
 +
        {
 +
            int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
 +
            if (ii >= 0)
 +
            {
 +
                tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
 +
                tmp.a[i - kk].y = intr (a[ii - 1].x , a[(ii - 1) + 1].x , tmp.a[i - kk].x , a[ii - 1].y, a[(ii - 1) + 1].y) + x.a[i - (r.e1 - r.i1 + 1) + r.i2].y;
 +
            }
 +
            else
 +
            {
 +
                kk++;
 +
                glength --;
 +
                tmp.length --;
 +
            }
 +
        }
  
    func f2(Begin1,End1,Step1);///создание второй функции
+
        for (int i = 0; i < glength; i++)
    f2.massiv2();
+
            for (int j = 0; j < glength - 1; j++)
    f2.output();
+
            if (tmp.a[j].x > tmp.a[j + 1].x)
    cout<<"\n ";
+
            {
    f2.SaveFile("f2.txt");
+
                fun t = tmp.a[j];
    cout<<"\n";
+
                tmp.a[j] = tmp.a[j + 1];
 +
                tmp.a[j + 1] = t;
 +
            }
  
    func f3(Begin1,End1,Step1);
+
        return tmp;
 +
}
  
     cout<<" \n \n choose 1 - sum , 2 - subtract, 3 - division, 4 - multiply \n";///выбор операции
+
     F operator *(F & x) const                                        //умножение двух функций
    int z;
 
    cin>>z;
 
    switch (z)
 
 
     {
 
     {
    case 1:
+
         int i1, e1, i2, e2, kk = 0;
    {
+
         double gfirstx, glastx, glength;
         f3=f1+f2;///сумма функций
 
         break;
 
    }
 
    case 2:
 
    {
 
        f3=f1-f2;
 
        break;
 
    }
 
    case 3:
 
    {
 
        f3=f1/f2;
 
        break;
 
    }
 
    case 4:
 
    {
 
        f3=f1*f2;
 
        break;
 
    }
 
  
    default :
+
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
    {
+
        {
        cout<<"NOOOOO";
+
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
        break;
+
            F fl(-1,0,0);
    }
+
            return fl;
    };
+
        }
    return 0;
 
}
 
  
 +
        sf r = prepare(x);
 +
        F tmp(r.glength,r.gfirstx,r.glastx);
  
</syntaxhighlight>
+
        for (int i = 0; i <= (r.e1 - r.i1); i++)
</div>
+
        {
 +
            tmp.a[i].x = a[i + r.i1].x;
 +
            int ii = x.pfind(tmp.a[i].x);
 +
            if (ii < 0)
 +
                tmp.a[i].y = x.a[-ii - 1].y * a[i + r.i1].y;
 +
            else
 +
                tmp.a[i].y = intr(x.a[ii - 1].x , x.a[ii + 1].x , tmp.a[i].x , x.a[ii].y , x.a[ii + 1].y) * a[i + r.i1].y;
 +
        }
 +
        for (int i = (r.e1 - r.i1 + 1); i <= (r.e2 - r.i2 + (r.e1 - r.i1) + 1) ; i++)
 +
        {
 +
            int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
 +
            if (ii >= 0)
 +
            {
 +
                tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
 +
                tmp.a[i - kk].y = intr (a[ii - 1].x , a[(ii - 1) + 1].x , tmp.a[i - kk].x , a[ii - 1].y, a[(ii - 1) + 1].y) * x.a[i - (r.e1 - r.i1 + 1) + r.i2].y;
 +
            }
 +
            else
 +
            {
 +
                kk++;
 +
                glength --;
 +
                tmp.length --;
 +
            }
 +
        }
  
'''[[Анастасия Бальцер]]'''
+
        for (int i = 0; i < glength; i++)
 +
            for (int j = 0; j < glength - 1; j++)
 +
            if (tmp.a[j].x > tmp.a[j + 1].x)
 +
            {
 +
                fun t = tmp.a[j];
 +
                tmp.a[j] = tmp.a[j + 1];
 +
                tmp.a[j + 1] = t;
 +
            }
  
'''Описание программы''': Программа считывает из файла значения функций и количество точек, затем с ними можно провести следующие действия: сложить, умножить, линейно интерполировать и линейно аппроксимировать. Все результаты выводятся в отдельные файлы.
+
        return tmp;
 +
    }
  
'''Пояснения к работе''': В два текстовые файла занести количество точек и значения абсцисс и ординат функций, который написать в первом и втором пунктах меню, затем выбрать необходимую операцию и ввести имя файла, в который сохранятся полученные значения.
+
    F operator ^(F & x) const                                  //возведение функции слева от оператора в степень функции справа от оператора
 
+
    {
Скачать можно  [http://tm.spbstu.ru/Файл:inter.zip тут].
+
        int i1, e1, i2, e2, kk = 0;
 +
        double gfirstx, glastx, glength;
  
 +
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
 +
        {
 +
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
 +
            F fl(-1,0,0);
 +
            return fl;
 +
        }
  
'''[[Белоусова Екатерина]]'''
+
        sf r = prepare(x);
 +
        F tmp(r.glength,r.gfirstx,r.glastx);
  
'''Инструкция к программе''': пользователь вводит начало и конец отрезка и шаг для функций, после чего создается две функции. Затем пользователь выбирает одну из арифметических операций, которую он хочет применить к этим функциям. Создается третья функция. После пользователь вводит второй шаг для интерполяции. Третья функция интерполируется по новому шагу, а затем аппроксимируется.  
+
        for (int i = 0; i <= (r.e1 - r.i1); i++)
 +
        {
 +
            tmp.a[i].x = a[i + r.i1].x;
 +
            int ii = x.pfind(tmp.a[i].x);
 +
            if (ii < 0)
 +
                tmp.a[i].y = pow(x.a[-ii - 1].y, a[i + r.i1].y);
 +
            else
 +
                tmp.a[i].y = pow(intr(x.a[ii - 1].x , x.a[ii + 1].x , tmp.a[i].x , x.a[ii].y , x.a[ii + 1].y), a[i + r.i1].y);
 +
        }
 +
        for (int i = (r.e1 - r.i1 + 1); i <= (r.e2 - r.i2 + (r.e1 - r.i1) + 1) ; i++)
 +
        {
 +
            int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
 +
            if (ii >= 0)
 +
            {
 +
                tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
 +
                tmp.a[i - kk].y = pow(intr (a[ii - 1].x , a[(ii - 1) + 1].x , tmp.a[i - kk].x , a[ii - 1].y, a[(ii - 1) + 1].y), x.a[i - (r.e1 - r.i1 + 1) + r.i2].y);
 +
            }
 +
            else
 +
            {
 +
                kk++;
 +
                glength --;
 +
                tmp.length --;
 +
            }
 +
        }
  
'''Краткое описание алгоритма''': в классе при помощи массива создаются две функции, с которыми потом работает программа. Эти функции перегружаются операторами арифметических операций, где затем полученная новая функция интерполируется и аппроксимируется.
+
        for (int i = 0; i < glength; i++)
 +
            for (int j = 0; j < glength - 1; j++)
 +
            if (tmp.a[j].x > tmp.a[j + 1].x)
 +
            {
 +
                fun t = tmp.a[j];
 +
                tmp.a[j] = tmp.a[j + 1];
 +
                tmp.a[j + 1] = t;
 +
            }
  
Скачать программу можно по ссылке  [http://tm.spbstu.ru/Файл:задача_2.zip].
+
        return tmp;
 +
    }
 +
};
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
int main()
<div class="mw-collapsible-content">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <iostream>
 
#include <locale.h>
 
#include <math.h>
 
#include <fstream>
 
#include<iomanip>
 
 
 
using namespace std;
 
 
 
class functya ///создаем класс функции
 
 
{
 
{
 +
  /*
 +
    F f1(5,-2,1.5);
 +
    F f2(30,-10,0.5);
 +
    F f3, f4;
 +
    f1.FOut();
 +
    f2.FOut();
 +
    f3 = f1 + f2;
 +
    f3.FOut();
 +
    f4 = f1 * f2;
 +
    f4.FOut();
 +
    cout << " ________" << endl;
 +
*/
 +
    char vc, s[255], ce;
 +
    ifstream infile;
 +
    int n;
 +
    fun *a;
 +
    F f5,f6,f7,f8,f9;
  
private: ///объявляем тип переменных в привате
+
    while(true)
     double *mass, *mass1, *mass2; ///*mass, *mass1, *mass2 -определение двумерного массива
+
     {
     double start, ending, step, step2, amountdouble; ///start-начало, ending-конец, step-шаг, amountdouble-количество точек (типа double)
+
     start :
 
+
        system("cls");
public: ///объявляем тип переменных в паблике
+
        cout << "1 - Vvesti 1uu func"            << endl;
    int amount; ///amoun-количество точек (типа int)
+
        cout << "2 - Vvesti 2uu func"            << endl;
 
+
        cout << "3 - Sloshit'"                  << endl;
functya (double _start, double _ending, double _step):start(_start),ending(_ending),step(_step) ///создаем конструктор функции с объявлением переменных
+
        cout << "4 - Umnozhit'"                  << endl;
{
+
        cout << "5 - Vozvesti v stepen'"        << endl;
 
+
        cout << "6 - Aproximirovat'"            << endl;
    amountdouble=((ending-start)/step)+1; ///подсчитываем количество точек с заданым шагом
+
        cout << "7 - Zapics' v file func"        << endl;
    amount=static_cast<int>(amountdouble); ///преобразуем количество из типа double к типу int
+
        cout << "8 - Zapics' v file aprok fun"  << endl;
 
+
        cout << "0 - Vihod"                      << endl;
}
+
        cin  >> vc;
 
+
        switch (vc)
void massiv1 () ///создаем функцию массива
+
        {
{
+
            case '0':
 
+
                return 0 ;
    mass=new double[amount]; ///создаем двумерный массив
+
            case '1':
    for (int l=0; l<amount; l++) ///создаем цикл от нуля до amount-количества точек
+
                {
    {
+
                system("cls");
        mass[l]= pow((l*step+start),3); ///при помощи массива задаем функцию с которой будем работать
+
                strcpy(s,"");
    }
+
                delete []a;
    cout<< "\n";
+
                a = NULL;
}
+
                cout << "Vvedite imya fila" << endl;
 
+
                cin >> s;
void massiv2 () ///создаем функцию массива
+
                strcat(s, ".txt");
{
+
                infile.open(s);
 
+
                infile >> n;
    mass=new double[amount]; ///создаем двумерный массив
+
                a = new fun [n];
    for (int l=0; l<amount; l++) ///создаем цикл от нуля до amount-количества точек
+
                for(int i = 0; i < n; i ++)
    {
+
                    infile >> a[i].x >> a[i].y;
        mass[l]= pow((l*step+start),2); ///при помощи массива задаем функцию с которой будем работать
+
                f5.ad(a,n);
    }
+
                f5.FOut();
    cout<< "\n";
+
                infile.close();
 
+
                cout << "Nazhmite \"b\" chotibi viti" << endl;
}
+
                cin >> ce;
 
+
                while (true)
void interpol (double __start, double __ending, double __step) ///создаем функцию интерполяция с определением переменных
+
                if (ce == 'b')
{
+
                    goto start;
 
+
                }
    double amount1=((__ending-__start)/__step)+1; ///определяем тип и подсчитываем новое количество точек с новым шагом
+
            case '2':
    int amounti=static_cast<int>(amount1); ///преобразуем количество из типа double к типу int
+
                {
 
+
                system("cls");
    for (int i=0; i<amounti; i++) ///создаем цикл от 0 до amounti-нового количества точек
+
                strcpy(s,"");
    {
+
                delete []a;
 
+
                a = NULL;
        mass1=new double[amounti];
+
                cout << "Vvedite imya fila" << endl;
        double x = i*__step+__start; ///определяем тип и расчитываем координату Х
+
                cin >> s;
        double x0=(static_cast<int>((x-__start)/step)) * step+__start;///определяем тип и расчитываем координату х
+
                strcat(s, ".txt");
                                                                      ///в интерполирующейся точке, которая стоит до новой точки
+
                infile.open(s);
        double x1=x0+step;///определяем тип и расчитываем координату х1 прибавляя к предыдущей точке шаг
+
                infile >> n;
        int i0=(static_cast<int>((x-__start)/step));///определяем значение массива в i0 соответстующей значению функции в x0
+
                a = new fun[n];
        int i1=i0+1;
+
                for(int i = 0; i < n; i ++)
        mass1[i]=(((x - x0 )*(mass[i1] - mass[i0]))/( x1-x0)) + mass[i0];
+
                    infile >> a[i].x >> a[i].y;
        cout << "Х="<<i<<setw(10)<< "У= " << mass1[i] <<endl<<endl; ///выводим интерполяцию на экран
+
                f6.ad(a,n);
        ofstream fout("interpol.txt",ios::app);///сохраняем в файл
+
                f6.FOut();
        fout<< "Х="<<i<<setw(10)<< "У="<<mass1[i]<<" \n";
+
                infile.close();
        fout.close();
+
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 
+
                cin >> ce;
    }
+
                while (true)
 
+
                if (ce == 'b')
    amount=amounti;
+
                    goto start;
    delete []mass;
+
                }
    mass = mass1;
+
            case '3':
 
+
                system("cls");
}
+
                f5.FOut();
 
+
                f6.FOut();
void aprocsimation(double __start, double __ending, double __step) ///создаем функцию апроксимация с определением переменных
+
                f7 = f5 + f6;
{
+
                f7.FOut();
 
+
                cout << "Nazhmite \"b\" chotibi viti" << endl;
    int N=amount; ///определяем тип и значение переменной N (равна количеству точек с заданным шагом)
+
                cin >> ce;
    double SumXY=0; ///определяем тип и значение переменной SumXY ( сумма (Х*У) )
+
                while (true)
    double SumX=0; ///определяем тип и значение переменной SumX ( сумма Х )
+
                if (ce == 'b')
    double SumY=0; ///определяем тип и значение переменной SumУ ( сумма У )
+
                    goto start;
    double Sum_Xkv=0; ///определяем тип и значение переменной Sum_Xkv ( сумма (Х*Х) )
+
            case '4':
    double Xi; ///определяем тип переменной Xi
+
                system("cls");
 
+
                f5.FOut();
    mass1 = new double[N]; ///создаем двумерный массив
+
                f6.FOut();
    for (int i=0; i<N; i++) ///создаем цикл от 0 до N (количество точек с заданным шагом)
+
                f7 = f5 * f6;
    {
+
                f7.FOut();
 
+
                cout << "Nazhmite \"b\" chotibi viti" << endl;
        Xi=i*__step+__start; ///расчитываем Хi
+
                cin >> ce;
        SumXY=SumXY+Xi*mass[i]; ///расчитываем SumXY
+
                while (true)
        SumX=SumX+Xi; ///расчитываем SumX
+
                if (ce == 'b')
        SumY=SumY+mass[i]; ///расчитываем SumY
+
                    goto start;
        Sum_Xkv=Sum_Xkv+Xi*Xi; ///расчитываем Sum_Xkv
+
            case '5':
 
+
                system("cls");
    }
+
                f5.FOut();
 
+
                f6.FOut();
    double a=(SumXY*N-SumX*SumY)/(N*Sum_Xkv-SumX*SumX); ///определяем тип и расчитываем коэффициент перед Х в уравнении аХ+b
+
                f7 = f5 ^ f6;
    double b=(SumY-a*SumX)/N; ///определяем тип и расчитываем свободный член в уравнении аХ+b
+
                f7 = f5 ^ f6;
 +
                f7.FOut();
 +
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 +
                cin >> ce;
 +
                while (true)
 +
                if (ce == 'b')
 +
                    goto start;
 +
            case '6':
 +
            {
 +
                system("cls");
 +
                ap tmp = aproks(f7.geta(), f7.getlength());
 +
                f8.addpar(tmp.k, tmp.b, f7.getlength(), f7.geta());
 +
                f8.FOut();
 +
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 +
                cin >> ce;
 +
                while (true)
 +
                if (ce == 'b')
 +
                    goto start;
 +
            }
 +
            case '7':
 +
            {
 +
                system("cls");
 +
                strcpy(s,"");
 +
                cout << "Vvedite imya fila" << endl;
 +
                cin >> s;
 +
                strcat(s, ".txt");
 +
                ofstream outfile(s);
 +
                outfile << "x          y" << endl;
 +
                for (int i = 0; i < f7.getlength(); i ++)
 +
                    outfile << f7.getelx(i) << "          " << f7.getely(i) << endl;
  
    if (b>0) ///если b положительное то
+
                cout << "done" << endl;
    cout<<"Апроксимация: "<<a<<"*x+"<<b<<endl; ///выводим на экран: Апроксимация: а*Х+b
+
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 
+
                cin >> ce;
    else if (b<0) ///если b отрицательно то
+
                while (true)
    cout<<"Апроксимация: "<<a<<"*x"<<b<<endl; ///выводим на экран: Апроксимация: а*Х b
+
                if (ce == 'b')
 
+
                    goto start;
    for (int i=0; i<N; i++) ///создаем цикл от 0 до N (количество точек с заданным шагом)
+
            }
    {
+
            case '8':
        mass1[i] = a*(i*__step+__start)+b; ///при помощи массива создаем функцию подсчета точек при апроксимации
+
                system("cls");
 +
                strcpy(s,"");
 +
                cout << "Vvedite imya fila" << endl;
 +
                cin >> s;
 +
                strcat(s, ".txt");
 +
                ofstream outfile(s);
 +
                outfile << "x           y" << endl;
 +
                for (int i = 0; i < f8.getlength(); i ++)
 +
                    outfile << f8.getelx(i) << "          " << f8.getely(i) << endl;
 +
                cout << "done" << endl;
 +
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 +
                cin >> ce;
 +
                while (true)
 +
                if (ce == 'b')
 +
                    goto start;
 +
        }
 
     }
 
     }
 +
    return 0;
 +
}
 +
</syntaxhighlight>
 +
</div>
 +
 +
 +
'''[[Иванова Яна]]'''
  
    delete[] mass;
+
'''Краткое описание алгоритма''': Программа ищет совместную область определения для двух заданных пользователем функций. Для каждой из них вводится шаг и первое и последнее значения. После поиска совместной области программа интерполирует две функции и создает третью функцию, в которую сохраняются результаты работы программы, то есть сложение, вычитание, деление и умножение двух изначальных функций.
    mass=mass1;
 
    vivod();///вывод на экран
 
    zapis("aprocsimation.txt");///сохраненяем в файл
 
  
}
+
'''Инструкция к программе''': Введите поочередно первый и последний элементы функций, а также их шаги. После этого введите число, соответствующее желаемому действию (соответствие указано в меню программы).
  
functya operator+ ( functya F) ///перегрузка оператора +
+
Посмотреть программу можно [http://tm.spbstu.ru/Файл:main.zip здесь]
{
 
  
    functya tmp(start,ending,step);
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
  
    mass2=new double[amount];///создаем двумерный массив
+
#include <iostream>
    for (int i=0; i<amount; i++)
+
#include <fstream>
    {
+
#include <cstring>
        mass2[i]=mass[i] + F.mass[i];///находим сумму двух функций
+
#include <stdlib.h>
    }
+
 
    delete [] mass;
+
using namespace std;
    mass=mass2;
 
    vivod();///выводим на экран результат
 
    zapis("f3.txt");///сохраненяем в файл
 
    cout<<"Введите шаг для интерполяции";
 
    cin>>step2;
 
    cout<<"Интерполяция: "<<"\n";
 
    interpol(start,ending,step2);///вызов функции интерполяции
 
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 
    return tmp;
 
  
}
+
ofstream outfile;
  
functya operator-( functya F)///перегрузка оператора -
+
struct approx                                              //структура, необходимая для функции линейной интерполяции
 
{
 
{
 +
    double koefficientA, koefficientB;
 +
};
  
     functya tmp(start,ending,step);
+
struct dot                                                  //структура, содержащая в себе значения координат каждой точки
 +
{                                                          //по обеим осям
 +
     double x, y;
 +
};
  
    mass2=new double[amount];///создаем двумерный массив
+
struct polyana                                              //структура, содержащая номера первого и последнего элемента каждой
    for (int i=0; i<amount; i++)
+
{                                                           //функции и количество элементов каждой из них
    {
+
     int a1, a2, b1, b2, k1, k2;
        mass2[i]=mass[i] - F.mass[i];///находим разность двух функций
+
};
     }
 
 
 
    delete [] mass;
 
    mass=mass2;
 
    vivod();///выводим на экран результат
 
    zapis("f3.txt");///сохраненяем в файл
 
    cout<<"Введите шаг для интерполяции";
 
    cin>>step2;
 
    cout<<"Интерполяция: "<<"\n";
 
    interpol(start,ending,step2);///вызов функции интерполяции
 
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 
    return tmp;
 
  
 +
struct trees                                                //структура, содержащая номер элемента и логическое значение,
 +
{                                                          // отвечающее за нужность или не нужность интерполяции
 +
    bool pol;                                              //при равенстве или неравенстве энных элементов двух функций
 +
    int n;
 +
};
 +
                                                            //непосредственно функция линейной интерполяции
 +
double pentagon (double x1, double x, double x2, double y1, double y2)
 +
{
 +
    return (((x - x1)/(x2- x1))*(y2 - y1) + y1);
 
}
 
}
  
functya operator*( functya F)///перегрузка оператора *
+
class stars                                                //класс, позволяющий сохранять дискретные значения функции на
{
+
{                                                           //определенном интервале с определенным шагом
     functya tmp(start,ending,step);
+
     private:
  
    mass2=new double[amount];///создаем двумерный массив
+
        double a;                  //первое значение функции
    for (int i=0; i<amount; i++)
+
        double b;                   //последнее значение функции
    {
+
        double step;                //шаг
         mass2[i]=mass[i] * F.mass[i];///находим произведение двух функций
+
        int length;                 //длина
    }
+
         int k;                     //счетчик количества элементов
  
     delete [] mass;
+
     public:
    mass=mass2;
 
    vivod();///выводим на экран результат
 
    zapis("f3.txt");///сохраненяем в файл
 
    cout<<"Введите шаг для интерполяции";
 
    cin>>step2;
 
    cout<<"Интерполяция: "<<"\n";
 
    interpol(start,ending,step2);///вызов функции интерполяции
 
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 
    return tmp;
 
  
}
+
        dot *massiv;
 +
        stars (int _k)                                      //конструктор для создания объекта класса - структуры
 +
        {                                                  //с двумя полями по количеству элементов
 +
            massiv = new dot [_k];
 +
            k = _k;
 +
        }
 +
        stars () {};                                        //конструктор
 +
        stars (double _a, double _b, double _step)          //конструктор для создания объекта класса через начальный
 +
                                                            //и коненый элементы с определенным шагом
 +
        {
 +
            a = _a;
 +
            b = _b;
 +
            step = _step;
 +
 
 +
            length = _b - _a + 1;
 +
            k = 0;
  
functya operator/( functya F)///перегрузка оператора /
+
            for (int i = _a ; i <= _b ; i += step)         //подсчет количества элементов функции
{
+
            {
 +
                k++;
 +
            }
  
    functya tmp(start,ending,step);
+
            massiv = new dot [k];                          //задание функции
 +
            for (int i = 0 ; i < k ; i++)
 +
              {
 +
                    massiv[i].x = _a + _step * i;
 +
                    massiv[i].y = i * 5;
 +
              }
 +
        }
  
    mass2=new double[amount];///создаем двумерный массив
+
        void outinfile ()                                  //вывод в файл значений функции
    for (int i=0; i<amount; i++)
+
        {
    {
+
            outfile.open ("meow", ios :: app);
        mass2[i]=mass[i] / F.mass[i];///находим частное двух функций
 
    }
 
  
    delete [] mass;
+
            outfile << "x" << "         " << "y" << endl;
    mass=mass2;
+
            for (int i = 0 ; i < k ; i++)
    vivod();///выводим на экран результат
+
                {
    zapis("f3.txt");///сохраненяем в файл
+
                    outfile << massiv[i].x << "       " << massiv[i].y << endl;
    cout<<"Введите шаг для интерполяции ";
+
                }
    cin>>step2;
+
            outfile << endl;
    cout<<"Интерполяция: "<<"\n";
+
            outfile.close();
    interpol(start,ending,step2);///интерполяция
+
        }
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 
    return tmp;
 
  
}
+
        void out ()                                        //вывод на экран значений функции
 +
        {
 +
            cout << "x" << "          " << "y" << endl;
 +
            for (int i = 0 ; i < k ; i++)
 +
                {
 +
                    cout << massiv[i].x << "        " << massiv[i].y << endl;
 +
                }
 +
            cout << endl;
 +
        }
  
void vivod ()///создаем функцию вывода на экран
+
        polyana prepare (stars &h)                         //подготовка совместной области определения для двух функций -
{
+
        {                                                  //той части значений множества Х, на которой будут
 
+
            trees del;                                      //производиться вычисления
    for (int l=0; l<amount; l++)
+
            polyana tmp;
    {
+
            if (massiv[0].x > h.massiv[0].x)                //поиск начала совместной области определения
        cout<<"Х"<<l<<setw(10)<< "Y= " << mass[l] <<"\n";
+
            {
    }
+
                del = h.love(massiv[0].x);
 
+
                tmp.a2 = del.n + 1;
}
+
                tmp.a1 = 0;
 
+
            }
void zapis (char Zapis[])///созданем функцию записи в файл
+
            else
{
+
                if (massiv[0].x < h.massiv[0].x)
 +
                {
 +
                    del = love(h.massiv[0].x);
 +
                    tmp.a2 = 0;
 +
                    tmp.a1 = del.n + 1;
 +
                }
 +
                else
 +
                    if (massiv[0].x == h.massiv[0].x)
 +
                    {
 +
                        tmp.a1 = 0;
 +
                        tmp.a2 = 0;
 +
                    };
  
    ofstream fout(Zapis);
+
            if (massiv[k-1].x > h.massiv[k-1].x)           //поиск конца совместной области определения
    for (int l=0; l<amount; l++)
+
            {
    {
+
                del = h.love(massiv[k-1].x);
        fout<<"X="<<l<<setw(10)<<"Y="<<mass[l]<<" \n";
+
                tmp.b2 = k-1;
    }
+
                tmp.b1 = del.n;
 +
            }
 +
            else
 +
                if (massiv[k-1].x < h.massiv[k-1].x)
 +
                {
 +
                    del = h.love(massiv[k-1].x);
 +
                    tmp.b2 = del.n;
 +
                    tmp.b1 = k-1;
 +
                }
 +
                else
 +
                    if (massiv[k-1].x == h.massiv[k-1].x)
 +
                    {
 +
                        tmp.b2 = k-1;
 +
                        tmp.b1 = k-1;
 +
                    };
  
    fout.close();
+
            tmp.k1 = 0;
 
+
            for (int i = tmp.a1 ; i <= tmp.b1 ; i ++)      //подсчет количества элементов первой функции
}
+
            {
 +
                tmp.k1++;
 +
            }
 +
            tmp.k2 = 0;
 +
            for (int i = tmp.a2 ; i <= tmp.b2 ; i ++)       //подсчет количества элементов второй функции
 +
            {
 +
                tmp.k2++;
 +
            }
 +
            return tmp;                                    //возвращает первые и последние значения обеих функций и
 +
        }                                                   //их количества элементов
  
};
+
    //ПЕРЕГРУЗКА ОПЕРАТОРОВ
  
int main()
+
    stars operator+ (stars & v)                            //сложение
{
+
    {
 +
        polyana tmp = prepare(v);
 +
        int general = tmp.k1 + tmp.k2;                      //общее количество элементов обеих функций
 +
        stars F3(general);                                  //создание объекта класса только по количеству элементов
 +
        for (int i = 0 ; i < tmp.k1 ; i++)                  //заполнение первой части окончательного результата
 +
        {
 +
            F3.massiv[i].x = massiv[i+tmp.a1].x;
 +
            trees tiger = v.love(massiv[i+tmp.a1].x);
 +
            if (tiger.pol == true)                          //если значения по У в одной точке не совпадают, то интерполировать
 +
            {
 +
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 +
                                          F3.massiv[i].x,
 +
                                          v.massiv[tiger.n + 1].x,
 +
                                          v.massiv[tiger.n].y,
 +
                                          v.massiv[tiger.n + 1].y )
 +
                                          + massiv[i+tmp.a1].y;
 +
            }
 +
            else                                            //иначе, просто сложить значения
 +
            {
 +
                F3.massiv[i].y = v.massiv[tiger.n].y + massiv[i+tmp.a1].y;
 +
            }
  
    setlocale(LC_ALL,"RUS");
+
        }
 
+
        {
    double start1, ending1, step1, step2;
+
          for (int i = tmp.k1  ; i < (general) ; i++)      //заполнение второй части окончательного результата
    int number;
+
        {
    cout<< "Введите начало отрезка ";
+
            F3.massiv[i].x = v.massiv[i + tmp.a2 - tmp.k1].x;
    cin>> start1;
+
            trees tiger = love(v.massiv[i + tmp.a2 - tmp.k1].x);
    cout<< "Введите конец отрезка ";
+
            if (tiger.pol == true)
    cin>> ending1;
+
            {
    cout<<"Введите шаг для функций ";
+
                F3.massiv[i].y = pentagon  (v.massiv[tiger.n].x,
    cin>> step1;
+
                                            F3.massiv[i].x,
 +
                                            v.massiv[tiger.n + 1].x,
 +
                                            v.massiv[tiger.n].y,
 +
                                            v.massiv[tiger.n + 1].y )
 +
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 +
            }
 +
            else
 +
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
 +
        }
  
    functya F1(start1,ending1,step1);///создаем первую функцию
+
        for (int i = 0; i < (general); i++)                  //сортировка
    F1.massiv1();
+
        {
    F1.vivod();///выводим координаты первой функции на экран
+
            for (int j = 0; j < (general - 1); j ++)
    F1.zapis("F1.txt");///записываем координаты первой функции в файл
+
            {
 
+
                dot temp;
    cout<<"\n \n";
+
                if (F3.massiv[j].x > F3.massiv[j + 1].x)
 
+
                {
    functya F2(start1,ending1,step1);///создаем вторую функцию
+
                    temp = F3.massiv[j];
    F2.massiv2();
+
                    F3.massiv[j] = F3.massiv[j + 1];
    F2.vivod();///выводим координаты второй функции на экран
+
                    F3.massiv[j + 1] = temp;
    F2.zapis("F2.txt");///записываем координаты второй функции в файл
+
                }
 +
                else                                        //если элементы совпадают, то нужно выбросить один из них
 +
                if (F3.massiv[j].x == F3.massiv[j + 1].x)
 +
                {
 +
                    int l = j;
 +
                    while (l < general)
 +
                    {
 +
                        F3.massiv[l].x = F3.massiv[l + 1].x;
 +
                        F3.massiv[l].y = F3.massiv[l + 1].y;
 +
                        l++;
 +
                    }
 +
                    general--;
 +
                }
 +
            }
 +
        }
  
    cout<<"\n \n";
 
  
    functya F3(start1, ending1, step1);
+
        stars normalny (general);                           //создание элемента класса по длине
 
+
        for (int i = 0; i < (general); i++)
    cout<<"Выберите, что вы хотите сделать с функциями: 1-найти сумму, 2-найти разность, 3-найти произведение, 4-найти частное ";
+
        {
    cin>>number;
+
            normalny.massiv[i].x = F3.massiv[i].x;
    cout<<"\n \n";
+
            normalny.massiv[i].y = F3.massiv[i].y;
 
+
        }
    if(number==1)
+
        a = normalny.massiv[0].x;
    {
+
        b = normalny.massiv[general].x;
         F3=F1+F2;
+
         return normalny;
 
     }
 
     }
 +
    };
  
    else if (number==2)
+
        stars operator* (stars & v)                         //умножение
 
     {
 
     {
         F3=F1-F2;
+
         polyana tmp = prepare(v);
    }
+
        int general = tmp.k1 + tmp.k2;
 
+
        stars F3(tmp.k1 + tmp.k2);
    else if (number==3)
+
        for (int i = 0 ; i < tmp.k1 ; i++)
    {
+
        {
        F3=F1*(F2);
+
            F3.massiv[i].x = massiv[i+tmp.a1].x;
    }
+
            trees tiger = v.love(massiv[i+tmp.a1].x);
 +
            if (tiger.pol == true)
 +
            {
 +
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,      F3.massiv[i].x,
 +
                                          v.massiv[tiger.n + 1].x,  v.massiv[tiger.n].y,
 +
                                          v.massiv[tiger.n + 1].y )* (massiv[i+tmp.a1].y);
 +
            }
 +
            else
 +
            {
 +
                F3.massiv[i].y = v.massiv[tiger.n].y * massiv[i+tmp.a1].y;
 +
            }
  
    else if (number==4)
+
        }
    {
+
        {
        F3=F1/F2;
+
            for (int i = tmp.k1 ; i < (general) ; i++)
    }
+
        {
 +
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
 +
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
 +
            if (tiger.pol == true)
 +
            {
 +
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 +
                                            F3.massiv[i].x,
 +
                                            v.massiv[tiger.n + 1].x,
 +
                                            v.massiv[tiger.n].y,
 +
                                            v.massiv[tiger.n + 1].y )
 +
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 +
            }
 +
            else
 +
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
 +
        }
  
    else
+
        for (int i= 0; i < (general); i++)
    {
+
        {
        cout<<"Ошибка ";
+
            for (int j = 0; j < (general - 1); j ++)
    }
+
            {
 +
                dot temp;
 +
                if (F3.massiv[j].x > F3.massiv[j+1].x)
 +
                {
 +
                    temp = F3.massiv[j];
 +
                    F3.massiv[j] = F3.massiv[j+1];
 +
                    F3.massiv[j+1] = temp;
 +
                }
 +
                else
 +
                if (F3.massiv[j].x == F3.massiv[j+1].x)
 +
                {
 +
                    int l = j;
 +
                    while (l < general)
 +
                    {
 +
                        F3.massiv[j].x = F3.massiv[j+1].x;
 +
                        l++;
 +
                    }
 +
                    general--;
 +
                }
 +
            }
 +
        }
  
    return 0;
+
        for (int i = 0 ; i < general ; i++)
 +
        {
  
}
+
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
</syntaxhighlight>
+
        }
</div>
 
  
'''[[Васильева Анастасия]]'''
 
  
'''Инструкция к программе''':сначала в папке с программой создаются два файла input1 и input2, в которых на первой строчке число точек в функции, а потом в два столбика значения х и у (функции должны быть с одинаковым шагом). Пользователь поочередно выбирает действия: 1 - нужно будет написать имя файла, откуда считывать значения для первой функции (х и у), 2 - для второй функции, 3 - сложение функций, пишем название файла, куда будут записываться значения, 4 - разность, 5 - умножение, 6 - интерполяция функции с шагом 0,5 , получившейся в результате сложения двух начальных,(можно сделать интерполяцию функций, которые получились в результате разности или умножения, но нужно будет в коде в case 6: newf3.Inter(0.5).output() поменять индекс функции и новый шаг), 7 - аппроксимация функции, получившейся в результате сложения двух начальных,(можно сделать аппроксимацию функций, которые получились в результате разности или умножения, но нужно будет в коде в case 7: newf3.Approxy().output() поменять индекс функции), 8 - выход.
+
        stars normalny(general);
 
+
        for (int i = 0; i < (general); i++)
'''Краткое описание алгоритма''':  функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно считывая координаты точек из файла. Далее с любыми функциями можно производить следующие действия: сложение, вычитание, умножение, интерполяция и аппроксимация. При этом результат каждого из этих действий - новая функция. Результаты выводятся в файл.
+
        {
Скачать программу можно по ссылке [http://tm.spbstu.ru/Файл:1.zip].
+
            normalny.massiv[i].x = F3.massiv[i].x;
 
+
            normalny.massiv[i].y = F3.massiv[i].y;
'''[[Гильманов Илья]]'''
+
        }
 +
        a = normalny.massiv[0].x;
 +
        b = normalny.massiv[general].x;
 +
        return normalny;
 +
    }
 +
    };
  
'''Описание программы''': программа, с помощью которой можно складывать, умножать, вычитать, делить 2-е функции, аппроксимировать,интерполировать.
+
    stars operator- (stars & v)                            //вычитание
 +
    {
 +
        polyana tmp = prepare(v);
 +
        int general = tmp.k1 + tmp.k2;
 +
        stars F3(tmp.k1 + tmp.k2);
 +
        for (int i = 0 ; i < tmp.k1 ; i++)
 +
        {
 +
            F3.massiv[i].x = massiv[i+tmp.a1].x;
 +
            trees tiger = v.love(massiv[i+tmp.a1].x);
 +
            if (tiger.pol == true)
 +
            {
 +
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,       F3.massiv[i].x,
 +
                                          v.massiv[tiger.n + 1].x,   v.massiv[tiger.n].y,
 +
                                          v.massiv[tiger.n + 1].y )- massiv[i+tmp.a1].y;
 +
            }
 +
            else
 +
            {
 +
                F3.massiv[i].y = v.massiv[tiger.n].y - massiv[i+tmp.a1].y;
 +
            }
  
'''Суть программы:''' Программа позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
+
        }
 
+
        {
'''Инструкция к программе''':
+
            for (int i = tmp.k1 ; i < (general) ; i++)
1. Пользователь вводит параметры первой функции
+
        {
2. Пользователь вводит параметры второй функции
+
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
3. Происходит интерполяция первой функции по второй
+
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
4. Пользователь выбирает арифметическую операцию
+
            if (tiger.pol == true)
5. При желании пользователь может выполнить аппроксимацию полученного результата
+
            {
 +
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 +
                                            F3.massiv[i].x,
 +
                                            v.massiv[tiger.n + 1].x,
 +
                                            v.massiv[tiger.n].y,
 +
                                            v.massiv[tiger.n + 1].y )
 +
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 +
            }
 +
            else
 +
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
 +
        }
  
Скачать можно [[http://mech.spbstu.ru/File:Gilmanov_Func.rar здесь]]
+
        for (int i= 0; i < (general); i++)
 +
        {
 +
            for (int j = 0; j < (general - 1); j ++)
 +
            {
 +
                dot temp;
 +
                if (F3.massiv[j].x > F3.massiv[j+1].x)
 +
                {
 +
                    temp = F3.massiv[j];
 +
                    F3.massiv[j] = F3.massiv[j+1];
 +
                    F3.massiv[j+1] = temp;
 +
                }
 +
                else
 +
                if (F3.massiv[j].x == F3.massiv[j+1].x)
 +
                {
 +
                    int l = j;
 +
                    while (l < general)
 +
                    {
 +
                        F3.massiv[j].x = F3.massiv[j+1].x;
 +
                        l++;
 +
                    }
 +
                    general--;
 +
                }
 +
            }
 +
        }
  
'''[[Демченко Артём]]'''
+
        for (int i = 0 ; i < general ; i++)
 +
        {
  
'''Описание программы''': В программе создается две функции, которые мы можем просуммировать, интерполировать каждую из них и аппроксимировать каждую из них. После каждой операции ( кроме аппроксимации ) значения записываются в файл.
+
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
 +
        }
  
'''Инструкции''': Запустите программу и выбором одного из трех параметров в меню выберете желаемую операцию. Далее следуйте указаниям из меню.
 
  
 +
        stars normalny(general);
 +
        for (int i = 0; i < (general); i++)
 +
        {
 +
            normalny.massiv[i].x = F3.massiv[i].x;
 +
            normalny.massiv[i].y = F3.massiv[i].y;
 +
        }
 +
        a = normalny.massiv[0].x;
 +
        b = normalny.massiv[general].x;
 +
        return normalny;
 +
    }
 +
    };
  
Скачать можно  [http://tm.spbstu.ru/File:MyFunc.zip тут].
+
    stars operator/ (stars & v)                            //деление
 +
    {
 +
        polyana tmp = prepare(v);
 +
        int general = tmp.k1 + tmp.k2;
 +
        stars F3(tmp.k1 + tmp.k2);
 +
        for (int i = 0 ; i < tmp.k1 ; i++)
 +
        {
 +
            F3.massiv[i].x = massiv[i+tmp.a1].x;
 +
            trees tiger = v.love(massiv[i+tmp.a1].x);
 +
            if (tiger.pol == true)
 +
            {
 +
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,      F3.massiv[i].x,
 +
                                          v.massiv[tiger.n + 1].x,  v.massiv[tiger.n].y,
 +
                                          v.massiv[tiger.n + 1].y )/ (massiv[i+tmp.a1].y);
 +
            }
 +
            else
 +
            {
 +
                F3.massiv[i].y = (v.massiv[tiger.n].y) / (massiv[i+tmp.a1].y);
 +
            }
  
'''[[Иванова Яна]]'''
+
        }
 
+
        {
'''Краткое описание алгоритма''': Программа ищет совместную область определения для двух заданных пользователем функций. Для каждой из них вводится шаг и первое и последнее значения. После поиска совместной области программа интерполирует две функции и создает третью функцию, в которую сохраняются результаты работы программы, то есть сложение, вычитание, деление и умножение двух изначальных функций.
+
            for (int i = tmp.k1 ; i < (general) ; i++)
 
+
        {
'''Инструкция к программе''': Введите поочередно первый и последний элементы функций, а также их шаги. После этого введите число, соответствующее желаемому действию (соответствие указано в меню программы).
+
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
 
+
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
Посмотреть программу можно [http://tm.spbstu.ru/Файл:main.zip здесь]
+
            if (tiger.pol == true)
 +
            {
 +
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 +
                                            F3.massiv[i].x,
 +
                                            v.massiv[tiger.n + 1].x,
 +
                                            v.massiv[tiger.n].y,
 +
                                            v.massiv[tiger.n + 1].y )
 +
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 +
            }
 +
            else
 +
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
 +
        }
 +
 
 +
        for (int i= 0; i < (general); i++)
 +
        {
 +
            for (int j = 0; j < (general - 1); j ++)
 +
            {
 +
                dot temp;
 +
                if (F3.massiv[j].x > F3.massiv[j+1].x)
 +
                {
 +
                    temp = F3.massiv[j];
 +
                    F3.massiv[j] = F3.massiv[j+1];
 +
                    F3.massiv[j+1] = temp;
 +
                }
 +
                else
 +
                if (F3.massiv[j].x == F3.massiv[j+1].x)
 +
                {
 +
                    int l = j;
 +
                    while (l < general)
 +
                    {
 +
                        F3.massiv[j].x = F3.massiv[j+1].x;
 +
                        l++;
 +
                    }
 +
                    general--;
 +
                }
 +
            }
 +
        }
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
        for (int i = 0 ; i < general ; i++)
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
        {
  
#include <iostream>
+
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
#include <fstream>
+
        }
#include <cstring>
 
#include <stdlib.h>
 
  
using namespace std;
 
  
ofstream outfile;
+
        stars normalny(general);
 +
        for (int i = 0; i < (general); i++)
 +
        {
 +
            normalny.massiv[i].x = F3.massiv[i].x;
 +
            normalny.massiv[i].y = F3.massiv[i].y;
 +
        }
 +
        a = normalny.massiv[0].x;
 +
        b = normalny.massiv[general].x;
 +
        return normalny;
 +
    }
 +
    };
  
struct approx                                              //структура, необходимая для функции линейной интерполяции
+
    trees love (double a)                                  //
{
+
    {
    double koefficientA, koefficientB;
+
        trees privet;
};
+
        for (int i = 0; i < k; i++ )
 
+
            if ((massiv[i].x < a)&& (a < massiv[i+1].x))
struct dot                                                  //структура, содержащая в себе значения координат каждой точки
+
            {
{                                                           //по обеим осям
+
                privet.n = i;
     double x, y;
+
                privet.pol = true;
};
+
                return privet;
 
+
            }
struct polyana                                              //структура, содержащая номера первого и последнего элемента каждой
+
            else
{                                                           //функции и количество элементов каждой из них
+
                if (massiv[i].x == a)
     int a1, a2, b1, b2, k1, k2;
+
                {
 +
                    privet.n = i;
 +
                    privet.pol = false;
 +
                    return privet;
 +
                }
 +
                else
 +
                if (massiv[i+1].x == a)
 +
                {
 +
                    privet.n = i+1;
 +
                    privet.pol = false;
 +
                    return privet;
 +
                }
 +
    }
 +
 
 +
 
 +
    approx approximate ()                                  //функция аппроксимации
 +
     {
 +
        approx hey;
 +
        stars mattafix (double a, double b, double step, int k, int length);
 +
        double sigmaX = 0;
 +
        double sigmaY = 0;
 +
        double sigmaXY = 0;
 +
        double sigmaXsqrt = 0;
 +
        for (int i = 0; i < length; i++)
 +
        {
 +
          sigmaX += a + step * i;
 +
          sigmaY += b + i * 5;
 +
          sigmaXY += (a + step * i)*(b + i * 5);
 +
          sigmaXsqrt += (a + step * i)*(a + step * i);
 +
        }
 +
        hey.koefficientA = ((k * (sigmaXY) - (sigmaX*sigmaY))/(k*sigmaXsqrt - (sigmaX * sigmaX)));
 +
        hey.koefficientB = ((sigmaY - hey.koefficientA*sigmaX)/k);
 +
        return hey;
 +
 
 +
 
 +
     }
 
};
 
};
  
struct trees                                                //структура, содержащая номер элемента и логическое значение,
+
int main()
{                                                          // отвечающее за нужность или не нужность интерполяции
 
    bool pol;                                              //при равенстве или неравенстве энных элементов двух функций
 
    int n;
 
};
 
                                                            //непосредственно функция линейной интерполяции
 
double pentagon (double x1, double x, double x2, double y1, double y2)
 
 
{
 
{
     return (((x - x1)/(x2- x1))*(y2 - y1) + y1);
+
     int tyu;
}
+
    stars function3;
 +
    int firstnumber1;
 +
    int firstnumber2;
 +
    int lastnumber1;
 +
    int lastnumber2;
 +
    int step1;
 +
    int step2;
 +
    while (true)
 +
    {
  
class stars                                                //класс, позволяющий сохранять дискретные значения функции на
+
        cout << "Input 0 - vvedite parametry pervoy funkcii"<< endl;
{                                                          //определенном интервале с определенным шагом
+
        cout << "Input 1 - vvedite parametry vtoroy funkcii"<< endl;
    private:
+
        cout << "Input 2 - slozhenie"<< endl;
 +
        cout << "Input 3 - umnozhenie"<< endl;
 +
        cout << "Input 4 - delenie"<< endl;
 +
        cout << "Input 5 - vychitanie"<< endl;
 +
        cout << "Input 6 - aproximate"<< endl;
 +
        cin >> tyu ;
  
         double a;                  //первое значение функции
+
         switch (tyu)
        double b;                  //последнее значение функции
 
        double step;                //шаг
 
        int length;                //длина
 
        int k;                      //счетчик количества элементов
 
 
 
    public:
 
 
 
        dot *massiv;
 
        stars (int _k)                                     //конструктор для создания объекта класса - структуры
 
        {                                                  //с двумя полями по количеству элементов
 
            massiv = new dot [_k];
 
            k = _k;
 
        }
 
        stars () {};                                        //конструктор
 
        stars (double _a, double _b, double _step)          //конструктор для создания объекта класса через начальный
 
                                                            //и коненый элементы с определенным шагом
 
 
         {
 
         {
             a = _a;
+
             case 0:
            b = _b;
+
            {  cout << "Vvedite pervy x" << endl;
            step = _step;
+
                cin >> firstnumber1;
 
+
                cout << "Vvedite posledniy x" << endl;
            length = _b - _a + 1;
+
                cin >> lastnumber1;
            k = 0;
+
                cout << "Vvedite shag" << endl;
 
+
                cin >> step1;
             for (int i = _a ; i <= _b ; i += step)          //подсчет количества элементов функции
+
                break;
 +
            }
 +
             case 1:
 
             {
 
             {
                 k++;
+
                 cout << "Vvedite pervy x" << endl;
 +
                cin >> firstnumber2;
 +
                cout << "Vvedite posledniy x" << endl;
 +
                cin >> lastnumber2;
 +
                cout << "Vvedite shag" << endl;
 +
                cin >> step2;
 +
                break;
 
             }
 
             }
 +
            case 2:
 +
            {
 +
                stars function1 (firstnumber1, lastnumber1, step1);
 +
                function1.out();
 +
                function1.outinfile ();
  
            massiv = new dot [k];                           //задание функции
+
                stars function2 (firstnumber2, lastnumber2, step2);
            for (int i = 0 ; i < k ; i++)
+
                function2.out();
              {
+
                function2.outinfile ();
                    massiv[i].x = _a + _step * i;
 
                    massiv[i].y = i * 5;
 
              }
 
        }
 
  
        void outinfile ()                                   //вывод в файл значений функции
+
                function3 = function1 + function2;
        {
+
                function3.out();
            outfile.open ("meow", ios :: app);
+
                function3.outinfile ();
 +
                break;
 +
            }
 +
            case 3:
 +
            {
 +
                stars function1 (firstnumber1, lastnumber1, step1);
 +
                function1.out();
 +
                function1.outinfile ();
  
            outfile << "x" << "          " << "y" << endl;
+
                stars function2 (firstnumber2, lastnumber2, step2);
            for (int i = 0 ; i < k ; i++)
+
                 function2.out();
                 {
+
                 function2.outinfile ();
                    outfile << massiv[i].x << "        " << massiv[i].y << endl;
 
                 }
 
            outfile << endl;
 
            outfile.close();
 
        }
 
  
        void out ()                                         //вывод на экран значений функции
+
                function3 = function1 * function2;
        {
+
                function3.out();
             cout << "x" << "          " << "y" << endl;
+
                function3.outinfile ();
             for (int i = 0 ; i < k ; i++)
+
                break;
                 {
+
            }
                    cout << massiv[i].x << "        " << massiv[i].y << endl;
+
             case 4:
                 }
+
             {
            cout << endl;
+
                stars function1 (firstnumber1, lastnumber1, step1);
        }
+
                 function1.out();
 +
                 function1.outinfile ();
  
        polyana prepare (stars &h)                         //подготовка совместной области определения для двух функций -
+
                stars function2 (firstnumber2, lastnumber2, step2);
        {                                                  //той части значений множества Х, на которой будут
+
                function2.out();
            trees del;                                     //производиться вычисления
+
                function2.outinfile ();
            polyana tmp;
+
 
            if (massiv[0].x > h.massiv[0].x)               //поиск начала совместной области определения
+
                function3 = function1 / function2;
 +
                function3.out();
 +
                function3.outinfile ();
 +
                break;
 +
            }
 +
            case 5:
 
             {
 
             {
                 del = h.love(massiv[0].x);
+
 
                 tmp.a2 = del.n + 1;
+
                stars function1 (firstnumber1, lastnumber1, step1);
                 tmp.a1 = 0;
+
                 function1.out();
 +
                function1.outinfile ();
 +
 
 +
                stars function2 (firstnumber2, lastnumber2, step2);
 +
                 function2.out();
 +
                function2.outinfile ();
 +
 
 +
                function3 = function1 - function2;
 +
                function3.out();
 +
                 function3.outinfile ();
 +
                break;
 
             }
 
             }
             else
+
             case 6:
                if (massiv[0].x < h.massiv[0].x)
 
 
                 {
 
                 {
                     del = love(h.massiv[0].x);
+
                     approx you;
                     tmp.a2 = 0;
+
                    function3.approximate();
                     tmp.a1 = del.n + 1;
+
                     outfile.open ("meow", ios :: app);
 +
                     outfile << "Y = "<< you.koefficientA <<"* x + "<<you.koefficientB << endl;
 +
                    outfile << endl;
 +
                    outfile.close();
 +
 
 +
 
 
                 }
 
                 }
                else
+
            }
                    if (massiv[0].x == h.massiv[0].x)
+
        }
                    {
+
    };
                        tmp.a1 = 0;
+
 
                        tmp.a2 = 0;
 
                    };
 
  
            if (massiv[k-1].x > h.massiv[k-1].x)            //поиск конца совместной области определения
+
</syntaxhighlight>
            {
+
</div>
                del = h.love(massiv[k-1].x);
 
                tmp.b2 = k-1;
 
                tmp.b1 = del.n;
 
            }
 
            else
 
                if (massiv[k-1].x < h.massiv[k-1].x)
 
                {
 
                    del = h.love(massiv[k-1].x);
 
                    tmp.b2 = del.n;
 
                    tmp.b1 = k-1;
 
                }
 
                else
 
                    if (massiv[k-1].x == h.massiv[k-1].x)
 
                    {
 
                        tmp.b2 = k-1;
 
                        tmp.b1 = k-1;
 
                    };
 
  
            tmp.k1 = 0;
 
            for (int i = tmp.a1 ; i <= tmp.b1 ; i ++)      //подсчет количества элементов первой функции
 
            {
 
                tmp.k1++;
 
            }
 
            tmp.k2 = 0;
 
            for (int i = tmp.a2 ; i <= tmp.b2 ; i ++)      //подсчет количества элементов второй функции
 
            {
 
                tmp.k2++;
 
            }
 
            return tmp;                                    //возвращает первые и последние значения обеих функций и
 
        }                                                  //их количества элементов
 
  
    //ПЕРЕГРУЗКА ОПЕРАТОРОВ
 
  
    stars operator+ (stars & v)                            //сложение
 
    {
 
        polyana tmp = prepare(v);
 
        int general = tmp.k1 + tmp.k2;                      //общее количество элементов обеих функций
 
        stars F3(general);                                  //создание объекта класса только по количеству элементов
 
        for (int i = 0 ; i < tmp.k1 ; i++)                  //заполнение первой части окончательного результата
 
        {
 
            F3.massiv[i].x = massiv[i+tmp.a1].x;
 
            trees tiger = v.love(massiv[i+tmp.a1].x);
 
            if (tiger.pol == true)                          //если значения по У в одной точке не совпадают, то интерполировать
 
            {
 
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 
                                          F3.massiv[i].x,
 
                                          v.massiv[tiger.n + 1].x,
 
                                          v.massiv[tiger.n].y,
 
                                          v.massiv[tiger.n + 1].y )
 
                                          + massiv[i+tmp.a1].y;
 
            }
 
            else                                            //иначе, просто сложить значения
 
            {
 
                F3.massiv[i].y = v.massiv[tiger.n].y + massiv[i+tmp.a1].y;
 
            }
 
  
        }
 
        {
 
          for (int i = tmp.k1  ; i < (general) ; i++)      //заполнение второй части окончательного результата
 
        {
 
            F3.massiv[i].x = v.massiv[i + tmp.a2 - tmp.k1].x;
 
            trees tiger = love(v.massiv[i + tmp.a2 - tmp.k1].x);
 
            if (tiger.pol == true)
 
            {
 
                F3.massiv[i].y = pentagon  (v.massiv[tiger.n].x,
 
                                            F3.massiv[i].x,
 
                                            v.massiv[tiger.n + 1].x,
 
                                            v.massiv[tiger.n].y,
 
                                            v.massiv[tiger.n + 1].y )
 
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 
            }
 
            else
 
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
 
        }
 
  
        for (int i = 0; i < (general); i++)                  //сортировка
+
'''[[Лосева Татьяна]]'''
        {
+
            for (int j = 0; j < (general - 1); j ++)
+
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.
            {
 
                dot temp;
 
                if (F3.massiv[j].x > F3.massiv[j + 1].x)
 
                {
 
                    temp = F3.massiv[j];
 
                    F3.massiv[j] = F3.massiv[j + 1];
 
                    F3.massiv[j + 1] = temp;
 
                }
 
                else                                        //если элементы совпадают, то нужно выбросить один из них
 
                if (F3.massiv[j].x == F3.massiv[j + 1].x)
 
                {
 
                    int l = j;
 
                    while (l < general)
 
                    {
 
                        F3.massiv[l].x = F3.massiv[l + 1].x;
 
                        F3.massiv[l].y = F3.massiv[l + 1].y;
 
                        l++;
 
                    }
 
                    general--;
 
                }
 
            }
 
        }
 
  
 +
'''Инструкция к программе:''' Начальная координата и шаг,для задания координат функций,передаются при вызове методов,создающих функции.Начальный шаг,шаг интерполяции,а так же количество выводимых координат заданы глобально.Поэтому просто запускайте программу, при желании поменяйте заданные
 +
величины.
  
        stars normalny (general);                          //создание элемента класса по длине
+
Cкачать программу можно  [http://tm.spbstu.ru/Файл:Loseva.rar здесь]
        for (int i = 0; i < (general); i++)
 
        {
 
            normalny.massiv[i].x = F3.massiv[i].x;
 
            normalny.massiv[i].y = F3.massiv[i].y;
 
        }
 
        a = normalny.massiv[0].x;
 
        b = normalny.massiv[general].x;
 
        return normalny;
 
    }
 
    };
 
  
        stars operator* (stars & v)                        //умножение
+
<div class="mw-collapsible-content">
    {
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
        polyana tmp = prepare(v);
+
#include <iostream>
        int general = tmp.k1 + tmp.k2;
+
 
        stars F3(tmp.k1 + tmp.k2);
+
using namespace std;
        for (int i = 0 ; i < tmp.k1 ; i++)
 
        {
 
            F3.massiv[i].x = massiv[i+tmp.a1].x;
 
            trees tiger = v.love(massiv[i+tmp.a1].x);
 
            if (tiger.pol == true)
 
            {
 
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,      F3.massiv[i].x,
 
                                          v.massiv[tiger.n + 1].x,  v.massiv[tiger.n].y,
 
                                          v.massiv[tiger.n + 1].y )* (massiv[i+tmp.a1].y);
 
            }
 
            else
 
            {
 
                F3.massiv[i].y = v.massiv[tiger.n].y * massiv[i+tmp.a1].y;
 
            }
 
  
        }
+
#define N 5//количество точек
        {
 
            for (int i = tmp.k1 ; i < (general) ; i++)
 
        {
 
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
 
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
 
            if (tiger.pol == true)
 
            {
 
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 
                                            F3.massiv[i].x,
 
                                            v.massiv[tiger.n + 1].x,
 
                                            v.massiv[tiger.n].y,
 
                                            v.massiv[tiger.n + 1].y )
 
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 
            }
 
            else
 
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
 
        }
 
  
        for (int i= 0; i < (general); i++)
+
const double l1 = 5;//задаём начальный шаг функций
        {
+
const double l2 = 0.7;//шаг для интерполяции
            for (int j = 0; j < (general - 1); j ++)
 
            {
 
                dot temp;
 
                if (F3.massiv[j].x > F3.massiv[j+1].x)
 
                {
 
                    temp = F3.massiv[j];
 
                    F3.massiv[j] = F3.massiv[j+1];
 
                    F3.massiv[j+1] = temp;
 
                }
 
                else
 
                if (F3.massiv[j].x == F3.massiv[j+1].x)
 
                {
 
                    int l = j;
 
                    while (l < general)
 
                    {
 
                        F3.massiv[j].x = F3.massiv[j+1].x;
 
                        l++;
 
                    }
 
                    general--;
 
                }
 
            }
 
        }
 
  
        for (int i = 0 ; i < general ; i++)
+
class Func
        {
+
{//класс,хранящий функцию,содержащий методы:печать,перегрузка,интерполяция,апроксимация
  
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
+
public:
        }
+
Func(int size) : size_(size), ax(new double[size]), by(new double[size])//создаём два массива,заполняем нулями
 +
{
 +
for (int i = 0; i< size_; i++)
 +
{
 +
ax[i] = 0;
 +
by[i] = 0;   //все элементы обоих массивов обнуляются
 +
}
 +
}
  
 +
void print()//вывод на экран
 +
{
 +
cout << "x: ";
 +
for (int i = 0; i < size_; i++)
 +
cout << ax[i] << " ";
 +
cout << endl << "y: ";
 +
for (int i = 0; i < size_; i++)
 +
cout << by[i] << " ";
 +
cout << endl;
 +
}
 +
 +
Func &operator+(Func &f2)//функция перегрузки:cложение функций
 +
{
 +
Func *result = new Func(size_);//создаём результирующую функцию,равную сумме двух f2 и this
 +
for (int i = 0; i < size_; i++)
 +
{
 +
result->ax[i] = this->ax[i];//суммируем координаты X
 +
result->by[i] = f2.by[i] + this->by[i];//суммируем координаты Y
 +
}
 +
cout << "Sum f(x)=f1+f2:" << endl;//выводим на экран сумму функций
 +
result->print();
 +
return *result;
 +
}
  
        stars normalny(general);
+
void Int(double L) //метод Интерполяции
        for (int i = 0; i < (general); i++)
+
{
        {
+
int M = (this->ax[this->size_ - 1] - this->ax[0]) / L + 1; //M- количество элементов массива с координатами интерполирующей функции;
            normalny.massiv[i].x = F3.massiv[i].x;
+
Func result = Func(M);//cоздаём функцию,в кторой будет храниться результат интерполяции
            normalny.massiv[i].y = F3.massiv[i].y;
+
cout << "M =" << M << endl;//выводим M для проверки
        }
+
cout << "Interpolation: " << endl;
        a = normalny.massiv[0].x;
+
int t;
        b = normalny.massiv[general].x;
+
for (int i = 1; i < M; i++)
        return normalny;
+
{
    }
+
result.ax[0] = this->ax[0];
    };
+
result.ax[i] = result.ax[i - 1] + L;//интерполируем Х,прибавляя шаг к каждому предыдущему элементу
 
+
t = (result.ax[i - 1] - result.ax[0]) / l1;//считаем номер элемента,"левого" от искомого
    stars operator- (stars & v)                             //вычитание
+
 
    {
+
                      //интерполируем Y по формуле
        polyana tmp = prepare(v);
+
result.by[i] = this->by[t] + ((result.ax[i] - this->ax[t]) / (this->ax[t + 1] - this->ax[t]))*(this->by[t + 1] - this->by[t]);
        int general = tmp.k1 + tmp.k2;
 
        stars F3(tmp.k1 + tmp.k2);
 
        for (int i = 0 ; i < tmp.k1 ; i++)
 
        {
 
            F3.massiv[i].x = massiv[i+tmp.a1].x;
 
            trees tiger = v.love(massiv[i+tmp.a1].x);
 
            if (tiger.pol == true)
 
            {
 
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,       F3.massiv[i].x,
 
                                          v.massiv[tiger.n + 1].x,  v.massiv[tiger.n].y,
 
                                          v.massiv[tiger.n + 1].y )- massiv[i+tmp.a1].y;
 
            }
 
            else
 
            {
 
                F3.massiv[i].y = v.massiv[tiger.n].y - massiv[i+tmp.a1].y;
 
            }
 
  
        }
+
}
        {
 
            for (int i = tmp.k1 ; i < (general) ; i++)
 
        {
 
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
 
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
 
            if (tiger.pol == true)
 
            {
 
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 
                                            F3.massiv[i].x,
 
                                            v.massiv[tiger.n + 1].x,
 
                                            v.massiv[tiger.n].y,
 
                                            v.massiv[tiger.n + 1].y )
 
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 
            }
 
            else
 
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
 
        }
 
  
        for (int i= 0; i < (general); i++)
+
result.print();//выводим результат
        {
+
}
            for (int j = 0; j < (general - 1); j ++)
 
            {
 
                dot temp;
 
                if (F3.massiv[j].x > F3.massiv[j+1].x)
 
                {
 
                    temp = F3.massiv[j];
 
                    F3.massiv[j] = F3.massiv[j+1];
 
                    F3.massiv[j+1] = temp;
 
                }
 
                else
 
                if (F3.massiv[j].x == F3.massiv[j+1].x)
 
                {
 
                    int l = j;
 
                    while (l < general)
 
                    {
 
                        F3.massiv[j].x = F3.massiv[j+1].x;
 
                        l++;
 
                    }
 
                    general--;
 
                }
 
            }
 
        }
 
  
        for (int i = 0 ; i < general ; i++)
+
void aprox()//Апроксимация
        {
+
{
 +
double a=0;
 +
          for(int i=0;i<size_;i++)//считаем сумму x
 +
  a=this->ax[i]+a;
 +
       
  
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
+
double b=0;
        }
+
for(int i=0;i<size_;i++)//считаем сумму y
 +
b=this->by[i]+b;
 +
  
 +
double c=0;
 +
for(int i=0;i<size_;i++)//считаем сумму квадратов x
 +
c=(this->ax[i])*(this->ax[i])+c;
 +
  
        stars normalny(general);
+
double d=0;
        for (int i = 0; i < (general); i++)
+
for(int i=0;i<size_;i++)//считаем сумму xy
        {
+
d=(this->ax[i])*(this->by[i])+d;
            normalny.massiv[i].x = F3.massiv[i].x;
+
            normalny.massiv[i].y = F3.massiv[i].y;
 
        }
 
        a = normalny.massiv[0].x;
 
        b = normalny.massiv[general].x;
 
        return normalny;
 
    }
 
    };
 
  
    stars operator/ (stars & v)                             //деление
+
//затем решаем систему для у=kx+m
    {
+
//(1)c*k+a*m=d
        polyana tmp = prepare(v);
+
//(2)a*k+size_*m=b;
        int general = tmp.k1 + tmp.k2;
+
//k=(d-am)
        stars F3(tmp.k1 + tmp.k2);
+
//подставим в (2)
        for (int i = 0 ; i < tmp.k1 ; i++)
+
double m;
        {
+
m=(b*c-a*d)/(c*size_-a*a);
            F3.massiv[i].x = massiv[i+tmp.a1].x;
+
double k;
            trees tiger = v.love(massiv[i+tmp.a1].x);
+
k=(d-a*m)/c;
            if (tiger.pol == true)
+
cout<<"aproximacia :: ";
            {
+
cout<<"y="<<k<<"x+"<<m<<endl;
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,      F3.massiv[i].x,
 
                                          v.massiv[tiger.n + 1].x,  v.massiv[tiger.n].y,
 
                                          v.massiv[tiger.n + 1].y )/ (massiv[i+tmp.a1].y);
 
            }
 
            else
 
            {
 
                F3.massiv[i].y = (v.massiv[tiger.n].y) / (massiv[i+tmp.a1].y);
 
            }
 
  
        }
+
}
        {
 
            for (int i = tmp.k1 ; i < (general) ; i++)
 
        {
 
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
 
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
 
            if (tiger.pol == true)
 
            {
 
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 
                                            F3.massiv[i].x,
 
                                            v.massiv[tiger.n + 1].x,
 
                                            v.massiv[tiger.n].y,
 
                                            v.massiv[tiger.n + 1].y )
 
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 
            }
 
            else
 
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
 
        }
 
  
        for (int i= 0; i < (general); i++)
 
        {
 
            for (int j = 0; j < (general - 1); j ++)
 
            {
 
                dot temp;
 
                if (F3.massiv[j].x > F3.massiv[j+1].x)
 
                {
 
                    temp = F3.massiv[j];
 
                    F3.massiv[j] = F3.massiv[j+1];
 
                    F3.massiv[j+1] = temp;
 
                }
 
                else
 
                if (F3.massiv[j].x == F3.massiv[j+1].x)
 
                {
 
                    int l = j;
 
                    while (l < general)
 
                    {
 
                        F3.massiv[j].x = F3.massiv[j+1].x;
 
                        l++;
 
                    }
 
                    general--;
 
                }
 
            }
 
        }
 
  
        for (int i = 0 ; i < general ; i++)
+
double *ax;
        {
+
double *by;
  
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
+
private:
        }
+
int size_;//размер массива
 +
};
  
  
        stars normalny(general);
 
        for (int i = 0; i < (general); i++)
 
        {
 
            normalny.massiv[i].x = F3.massiv[i].x;
 
            normalny.massiv[i].y = F3.massiv[i].y;
 
        }
 
        a = normalny.massiv[0].x;
 
        b = normalny.massiv[general].x;
 
        return normalny;
 
    }
 
    };
 
  
    trees love (double a)                                  //
 
    {
 
        trees privet;
 
        for (int i = 0; i < k; i++ )
 
            if ((massiv[i].x < a)&& (a < massiv[i+1].x))
 
            {
 
                privet.n = i;
 
                privet.pol = true;
 
                return privet;
 
            }
 
            else
 
                if (massiv[i].x == a)
 
                {
 
                    privet.n = i;
 
                    privet.pol = false;
 
                    return privet;
 
                }
 
                else
 
                if (massiv[i+1].x == a)
 
                {
 
                    privet.n = i+1;
 
                    privet.pol = false;
 
                    return privet;
 
                }
 
    }
 
  
 +
class Cord//класс,создающий и хранящий значение функций
 +
{
 +
public:
 +
Cord(double x0, double s) :x0(x0), s(s)//x0-начальная координата;s-шаг
 +
{
 +
}
  
    approx approximate ()                                   //функция аппроксимации
+
void Fyx1(Func func)//метод,считающий координаты нашей функции y=x
    {
+
{
        approx hey;
+
int i;
        stars mattafix (double a, double b, double step, int k, int length);
+
func.ax[0] = x0;
        double sigmaX = 0;
+
for (i = 1; i < N; i++)//считаются иксы
        double sigmaY = 0;
+
{
        double sigmaXY = 0;
+
func.ax[i] = x0 + s;
        double sigmaXsqrt = 0;
+
x0 = func.ax[i];
        for (int i = 0; i < length; i++)
+
}
        {
+
for (i = 0; i<N; i++)
          sigmaX += a + step * i;
+
func.by[i] = func.ax[i];//считаем координаты у
          sigmaY += b + i * 5;
+
cout << "f1 :" << endl;
          sigmaXY += (a + step * i)*(b + i * 5);
+
func.print();
          sigmaXsqrt += (a + step * i)*(a + step * i);
+
cout << endl;
        }
+
}
        hey.koefficientA = ((k * (sigmaXY) - (sigmaX*sigmaY))/(k*sigmaXsqrt - (sigmaX * sigmaX)));
+
 
        hey.koefficientB = ((sigmaY - hey.koefficientA*sigmaX)/k);
+
void Fyx2(Func func)//метод,считающий координаты нашей функции y=x+1
        return hey;
+
{
 
+
int i;
 
+
func.ax[0] = x0;
    }
+
for (i = 1; i<N; i++)//считаем иксы
};
+
{
 +
func.ax[i] = x0 + s;
 +
x0 = func.ax[i];
 +
}
 +
for (i = 0; i<N; i++)
 +
func.by[i] = func.ax[i] + 1;//считаем игрики
 +
cout << "f2 :" << endl;
 +
func.print();
 +
cout << endl;
 +
}
 +
 
 +
private:
 +
double x0;//начальная координата
 +
double s;//шаг
 +
};
  
 
int main()
 
int main()
 
{
 
{
    int tyu;
+
Func f1(N);//создание функции f1
    stars function3;
+
Func f2(N);//создание f2
    int firstnumber1;
+
Cord s1(0, l1);//cоздаём объект s1
    int firstnumber2;
+
Cord s2(0, l1);//cоздаём объект s2
    int lastnumber1;
+
s1.Fyx1(f1);//задаём координаты 1ой функции
    int lastnumber2;
+
s2.Fyx2(f2);//задаём координаты 2ой функции
    int step1;
 
    int step2;
 
    while (true)
 
    {
 
  
        cout << "Input 0 - vvedite parametry pervoy funkcii"<< endl;
+
      //сложение функций:
        cout << "Input 1 - vvedite parametry vtoroy funkcii"<< endl;
+
        cout << "Input 2 - slozhenie"<< endl;
+
Func f3 = f2 + f1;//есть тоже ,что и Func f3 = f2.operator+(f1);
        cout << "Input 3 - umnozhenie"<< endl;
+
 
        cout << "Input 4 - delenie"<< endl;
+
f1.Int(l2);//Интерполируем f1 с новым шагом l2
        cout << "Input 5 - vychitanie"<< endl;
+
f1.aprox();//Апроксимируем f1
        cout << "Input 6 - aproximate"<< endl;
+
        cin >> tyu ;
+
getchar();
 +
return 0;
 +
}
  
        switch (tyu)
+
</syntaxhighlight>
        {
+
</div>
            case 0:
 
            {  cout << "Vvedite pervy x" << endl;
 
                cin >> firstnumber1;
 
                cout << "Vvedite posledniy x" << endl;
 
                cin >> lastnumber1;
 
                cout << "Vvedite shag" << endl;
 
                cin >> step1;
 
                break;
 
            }
 
            case 1:
 
            {
 
                cout << "Vvedite pervy x" << endl;
 
                cin >> firstnumber2;
 
                cout << "Vvedite posledniy x" << endl;
 
                cin >> lastnumber2;
 
                cout << "Vvedite shag" << endl;
 
                cin >> step2;
 
                break;
 
            }
 
            case 2:
 
            {
 
                stars function1 (firstnumber1, lastnumber1, step1);
 
                function1.out();
 
                function1.outinfile ();
 
  
                stars function2 (firstnumber2, lastnumber2, step2);
 
                function2.out();
 
                function2.outinfile ();
 
  
                function3 = function1 + function2;
 
                function3.out();
 
                function3.outinfile ();
 
                break;
 
            }
 
            case 3:
 
            {
 
                stars function1 (firstnumber1, lastnumber1, step1);
 
                function1.out();
 
                function1.outinfile ();
 
  
                stars function2 (firstnumber2, lastnumber2, step2);
 
                function2.out();
 
                function2.outinfile ();
 
  
                function3 = function1 * function2;
+
'''[[Козловская Анна]]'''
                function3.out();
 
                function3.outinfile ();
 
                break;
 
            }
 
            case 4:
 
            {
 
                stars function1 (firstnumber1, lastnumber1, step1);
 
                function1.out();
 
                function1.outinfile ();
 
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
                function2.out();
 
                function2.outinfile ();
 
  
                function3 = function1 / function2;
+
'''Пояснения к алгоритму''': Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
                function3.out();
 
                function3.outinfile ();
 
                break;
 
            }
 
            case 5:
 
            {
 
  
                stars function1 (firstnumber1, lastnumber1, step1);
 
                function1.out();
 
                function1.outinfile ();
 
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
Скачать можно  [http://tm.spbstu.ru/File:project1.rar тут].
                function2.out();
 
                function2.outinfile ();
 
  
                function3 = function1 - function2;
 
                function3.out();
 
                function3.outinfile ();
 
                break;
 
            }
 
            case 6:
 
                {
 
                    approx you;
 
                    function3.approximate();
 
                    outfile.open ("meow", ios :: app);
 
                    outfile << "Y = "<< you.koefficientA <<"* x + "<<you.koefficientB << endl;
 
                    outfile << endl;
 
                    outfile.close();
 
  
  
                }
 
            }
 
        }
 
    };
 
  
 +
'''[[Сюрис Александр]]'''
 +
Задаются две функции с разными шагами и начальными и конечными значениями.  Аппроксимирует одну функцию по шагу другой и складывает/умножает/вычитает/делит их
  
</syntaxhighlight>
+
Скачать можно  [http://mech.spbstu.ru/File:%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F(%D0%A1%D1%8E%D1%80%D0%B8%D1%81%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80).zip тут].
</div>
 
  
'''[[Капитанюк Светлана]]'''
+
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
  
'''Описание программы:''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции. функции хранятся в программе как массив точек, заданных с определенным шагом по X на заданном отрезке. Функции заданы автоматически, поэтому нет необходимости вводить каждый промежуток, нужно ввести только начало, конец и шаг. Далее пользователю на выбор будет представлено несколько операций с функциями, такие как: сложение, вычитание, умножение и деление функции одну на другую. Если функции имеют различный шаг, топеред этимони интерполируются. Так же в программе предусмотрена аппроксимация.  
+
#include <iostream>
 +
#include <vector>
 +
#include<math.h>
  
 +
using namespace std;
 +
class f{
 +
    private:
 +
    double st, en, d; //начало, конец, дельта
 +
    vector<double> v;//вектор, содержащий y
 +
    public:
 +
    f(double _st, double _en, double _d, vector<double> _v){
 +
        st=_st;
 +
        en=_en;
 +
        d=_d;
 +
        for(int i=0;i<_v.size();i++) //копируем массив, который вводим в консоль
 +
            v.push_back(_v[i]);
 +
        //return *this;
 +
    }
 +
    f(){};
 +
    f aprox(double _st, double _en, double _d){ //метод интерполяции, поиск коэфф a и b для y=ax+b
 +
        double sum_x=0, sum_y=0, sum_2x=0,sum_xy=0,a,b;
 +
        for(int i=0; i<=(en-st)/d; i++)
 +
            sum_x=sum_x+st+i*d;
 +
        for(int i=0; i<=(en-st)/d; i++)
 +
            sum_y=sum_y+v[i];
 +
        for(int i=0; i<=(en-st)/d; i++)
 +
            sum_2x=sum_2x+pow(st+i*d,2);
 +
        for (int i=0; i<=(en-st)/d; i++)
 +
            sum_xy=sum_xy+v[i]*(st+i*d);
 +
        a=(((en-st)/d+1)*sum_xy-sum_x*sum_y)/(((en-st)/d+1)*sum_2x-sum_x*sum_x);
 +
        b=(sum_y-a*sum_x)/(((en-st)/d+1));
  
Скачать можно  [http://tm.spbstu.ru/File:Function_02.zip тут].
+
        vector<double> v1;//вектор, содержащий проинтерполированную функцию
 
+
            for(int i=0; i<=(en-st)/d; i++)
'''[[Киселёв Лев]]'''
+
                v1.push_back(a*(st+i*d)+b);//добавление значений проинтерполированной ф-ции с шагом другой функции
'''Описание программы''':программа позволяет интерполировать и аппроксимировать значения функции, а также складывать две функции, используя перегрузку.
+
        return f(_st,_en,_d,v1);
 
 
Скачать можно [[http://mech.spbstu.ru/File:Interpol.rar здесь]]
 
 
 
'''[[Козловская Анна]]'''
 
  
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
+
    }
  
'''Пояснения к алгоритму''': Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
+
    f operator +(f x){//оператор сложения
 
+
        double _en,_st,_d;
 
+
        _en=min(en,x.en); //поиск области пересечения
Скачать можно  [http://tm.spbstu.ru/File:project1.rar тут].
+
        _st=max(st,x.st);
 
+
        if (_en>_st){//проверяем, пересекаются ли функции
'''[[Лебедев Станислав]]'''
+
            vector<double> _v;
 
+
            f y;
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
+
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
 +
                vector<double> _v;
 +
                y=x.aprox(_st, _en, d);
 +
                for (int i=0; i<=(_en-_st)/d; i++)
 +
                    _v.push_back(y.v[i]+v[i]); //вектор с суммой функций
 +
                return f(_st,_en,d,_v);
 +
            }
 +
            else{
 +
                vector<double> _v;
 +
                y=this->aprox(_st, _en, x.d); //this-> функция, в которой мы работаем
 +
              for (int i=0; i<=(_en-_st)/x.d; i++)
 +
                    _v.push_back(y.v[i]+x.v[i]);
 +
                return f(_st,_en,x.d,_v);
 +
            }
 +
        }
 +
    }
  
'''Пояснения к алгоритму''':
+
    f prot(){ //поиск противоположной функции
#  Прочитанные из файла функции нужно отсортировать.
+
        for (int i=0; i<=(en-st)/d; i++)
#  Найти совместную область определения, то есть, найти множество пересечения областей определения функций, над которыми совершается операция.
+
            v[i]=(-1)*v[i];
#  Создать третью функцию, со следующими свойствами : область определения состоит только из точек, принадлежащих совместной области определения, каждая точка области значений является результатом нужной операции над точкой области значений одной из функций и, либо интерполированной точкой по другой функции, либо, если есть возможность, точным значением из ее области значений.
+
        return *this;
 +
    }
  
Скачать можно  [http://tm.spbstu.ru/Файл:Функции.rar тут].
+
    f operator - (f x){ //разность функций
 +
        return(*this + x.prot());
 +
    }
  
 +
f operator *(f x){//оператор умножения
 +
        double _en,_st,_d;
 +
        _en=min(en,x.en); //поиск области пересечения
 +
        _st=max(st,x.st);
 +
        if (_en>_st){//проверяем, пересекаются ли функции
 +
            vector<double> _v;
 +
            f y;
 +
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
 +
                vector<double> _v;
 +
                y=x.aprox(_st, _en, d);
 +
                for (int i=0; i<=(_en-_st)/d; i++)
 +
                    _v.push_back(y.v[i]*v[i]); //вектор с суммой функций
 +
                return f(_st,_en,d,_v);
 +
            }
 +
            else{
 +
                vector<double> _v;
 +
                y=this->aprox(_st, _en, x.d); //this-> функция, в которой мы работаем
 +
              for (int i=0; i<=(_en-_st)/x.d; i++)
 +
                    _v.push_back(y.v[i]*x.v[i]);
 +
                return f(_st,_en,x.d,_v);
 +
            }
 +
        }
 +
    }
  
<div class="mw-collapsible mw-collapsed" style="width:100%" ><div class="mw-collapsible-content">
+
f obr(){
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
  for (int i=0; i<=(en-st)/d; i++)
#include <iostream>
+
            v[i]=1/v[i];
#include <math.h>
+
        return *this;
#include <cstring>
+
}
#include <cmath>
 
#include <malloc.h>
 
#include <fstream>
 
 
 
using namespace std;
 
  
double base(double x)                                       //базовая функция ( если задавать через шаг и начальный х
+
f operator /(f x){
{
+
return(*this*x.obr());
    return x;
 
 
}
 
}
  
struct ap                                                  //две одинаковые структуры это нехорошо,коненчо,но зато наглядно...
+
    void vivod(){ //вывод
{
+
     for(int i=0; i<v.size(); i++)
     double k,b;
+
        cout<<v[i]<<" ";
};
 
  
struct fun                                                  //один столбик в таблице функции
+
     }
{
 
     double x,y;
 
};
 
 
 
struct sf                                                  //структура нужная, для возражеия значений из функции "prepare" класса F
 
{
 
    int i1,i2,e1,e2;
 
    double glength, gfirstx, glastx;
 
 
};
 
};
 +
int main(){
 +
    setlocale(LC_ALL, "Russian");
 +
    double a,b,a1,b1,d,d1,t;
 +
    int o;
 +
    cout << "Введите начала и конец отрезка и дельту: ";
 +
    cin>>a>>b>>d;
 +
    int amount=(b-a)/d+1,amount2;
 +
    vector<double>x;
 +
    cout << "Введите " << amount << " значений функции на данном интервале:";
 +
    for (int i=0; i<amount; i++)
 +
    {
 +
        cin>>t;
 +
        x.push_back(t);
 +
    }
  
double intr(double x1,double x2,double x,double y1,double y2)  // линенейная интерполяция
+
    cout << "Проделаем ровно то же самое для 2 функции ";
{
+
    cout << "Введите начала и конец отрезка и дельту: ";
     return ( ((x-x1)/(x2-x1)) * (y2-y1) + y1 );
+
     cin >> a1 >> b1 >> d1;
}
 
  
ap aproks(fun b [],int n)                                       //линейная аппроксимация
+
    amount2=(b1-a1)/d1+1;
{
+
     vector<double>y;
     ap r;
+
     cout << "Введите " << amount2 << " значений функции на данном интервале:";
     double xy = 0,x = 0,y = 0,sqx = 0,xsq = 0;
+
     for (int i=0; i<amount2; i++)
     for (int i = 0; i < n; i++)                                 //вычисление коэффицентов
 
 
     {
 
     {
         xy  += b[i].x*b[i].y;
+
         cin>>t;
         x  += b[i].x;
+
         y.push_back(t);
        y  += b[i].y;
 
        sqx += b[i].x*b[i].x;
 
        xsq += b[i].x;
 
 
     }
 
     }
     xsq *= xsq;
+
     f g(a,b,d,x);
 +
    f h(a1,b1,d1,y);
  
     r.k = (n*xy - x*y)/(n*sqx - xsq);                       //использование формул
+
     cout<<"Выберете дейстивя с функциями: +, -, *, \ " << endl;
     r.b = (y - r.k*x)/n;
+
    cout<<"Введите число, соответсвующее порядковому номеру операции(1-4) - ";
    return r;
+
    cin>>o;
}
+
    if(o==1){              //по невыясненным причинам одновременно написанные слева идущие if -ы не работают,
 +
        cout<<"Сумма:";     //но если заккоментить их и менять знак + в скобке на другие, то все работает
 +
        (g+h).vivod();
 +
 
 +
    }
 +
 
 +
    if(o==2){
 +
        cout<<"Разность:"
 +
        (g-h).vivod();
  
class F
+
     }
{
 
private:
 
     int length;
 
    double firstx, step, lastx;
 
    fun *a;
 
public:
 
    F(){}
 
    F(int l,double f,double s)                              //конструктор, создающий фунцию по длине,первоиу элементу,шагу по х, y вычисляется по базовой функции
 
    {
 
        if (l >= 0)
 
          a = new fun [l];
 
        firstx = f;
 
        length = l;
 
        step = s;
 
        lastx = firstx+(length - 1)*step;
 
  
 +
    if(o==3){
 +
        cout<<"Произведение:"
 +
        (g*h).vivod();
  
        for (int i = 0;i < length; i ++)
 
        {
 
            a[i].y = base(firstx + i*step);
 
            a[i].x = firstx + i*step;
 
        }
 
  
 
     }
 
     }
  
    F (fun b[],int l)                                   //конструктор для создания фунции с уже известными областями определния и значений
+
    if(o==3){
    {
+
         cout<<"Отношение:"
         length = l;
+
         (g/h).vivod();
         a = new fun [l];
+
    }
        for (int i = 0; i < l;i++)
+
 
            a[i] = b[i];
 
  
        for (int i = 0; i < l;i++)
+
}
            for (int j = 0; j < (l - 1); j++)
 
                if (a[j].x > a[j + 1].x)
 
                {
 
                    fun tmp = a[j];
 
                    a[j] = a[j + 1];
 
                    a[j + 1] = a[j];
 
                }
 
  
        firstx = a[0].x;
+
</syntaxhighlight>
        lastx = a[length - 1].x;
+
</div>
    }
 
  
    void addpar (double k, double b, int l, fun z[] )                          //позволяет создать и заполнить переданным массивом поле объекта класса
 
    {
 
        a = new fun [l];
 
        for (int i = 0; i < l; i++)
 
        {
 
            a[i].y = k*z[i].x + b;
 
            a[i].x = z[i].x;
 
        }
 
        length = l;
 
    }
 
  
    double getelx(int i)                                //возращает значение из поля "х" iого элемента
 
    {
 
        return a[i].x;
 
    }
 
  
  
    double getely(int i)                              //возращает значение из поля "х" iого элемента
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    {
 
        return a[i].y;
 
    }
 
  
    int getlength()                                //возращает размер области определения функции(в точках)
 
    {
 
        return length;
 
    }
 
  
    void FOut()                                     //выводит функцию на экран
+
 
 +
'''[[Андреева Полина]]'''
 +
 
 +
'''Инструкция к программе:''' пользователь должен ввести начало, конец и шаг. Создается две функции. Затем на экране появляется один из знаков арифметических действий. Пользователь выбирает один из знаков. Создается третья функция. Пользователь вводит второй шаг. Функция интерполируется по этому новому шагу, а затем аппроксимируется.
 +
'''Краткое описание алгоритма :''' в классе создается две функции(с помощью массивов). Так же в классе есть такие методы: перегрузка арифм операций, интерполяция, аппроксимация, вывод массивов на экран и их сохранение в файл. Сначала создается два массива для функций. Затем  с помощью перегрузки эти два массива складываются/умножаются/делятся/вычитаются и записываются опять в этот массив. В методе перегрузки сразу вызывается интерполяция и аппроксимация.
 +
[http://tm.spbstu.ru/Файл:Function.rar Программа]
 +
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
 
 +
#include <iostream>
 +
#include <fstream>
 +
#include "math.h"
 +
using namespace std;
 +
class func
 +
{
 +
private:
 +
    double *mass1, *mass, *masss ;
 +
    double  AmountDouble, Begin, End, Step, Step2;
 +
public:
 +
    int  AmountInt;
 +
    func ( double _Begin, double _End, double _Step ):Begin(_Begin), End(_End), Step(_Step)
 
     {
 
     {
      cout << "  x         y" << endl;
+
         AmountDouble=((End-Begin)/Step)+1;///количество точек с данным шагом
      for (int i = 0;i < length; i ++)
+
        AmountInt=static_cast<int>(AmountDouble);///так как количество это целое число, то округляем
          cout << "  " << a[i].x << "        " << a[i].y << endl;
+
 
      cout << endl;
 
 
     }
 
     }
  
 
+
     void massiv1() ///создание первой функции х^3
     int pfind(double x)const                        //возращает либо номер элемента,идущщий перед элементом, большим,чем х; в случае нахождения равного, возращает число, противоположное номеру следующего элемента(иначе может вернуться нуль,а нуль знака не имееет)
 
 
     {
 
     {
         for (int i = 0; i < length-1; i++ )
+
        mass=new double[AmountInt];
 +
         for (int l=0; l<AmountInt; l++)
 
         {
 
         {
             if (((a[i].x < x) && (a[i + 1].x > x)))
+
             mass[l] =pow((l*Step+Begin),3);
                return (i + 1);
+
        }
            else
+
        cout << "y=x^3 \n";
                // чтобы иметь возможность проанализировать полученное значение функции,мы должны понимать, было найденно равное или промежуточное значение. "флагом" равных значений является знак минус,но так у нуля нет знака,то приходиться все сдвигать на 1
+
    }
                if (a[i].x == x)
+
    void massiv2() ///создание второй функции sin(x)
                  return -(i + 1);
+
    {
                else
+
        mass=new double[AmountInt];
                    if (a[i + 1].x == x)
+
        for (int l=0; l<AmountInt; l++)
                        return -(i + 2);
+
        {
 +
            mass[l] =sin(l*Step+Begin);
 
         }
 
         }
//        cerr << "fail!!" << endl;
+
        cout << "y=sin(x) \n";
        return -1;
 
 
     }
 
     }
  
     sf prepare(F &x)const                                      //"подготовка" функций к бинарной операции (нахождение совместной области определения
+
     void interpolation(double __Begin, double __End,  double __Step)
 
     {
 
     {
         sf r;
+
 
         if (a[0].x > x.a[0].x)
+
         double NewAmount=((__End-__Begin)/__Step) + 1;///количество точек для нового шага
 +
         int NewAmountInt=static_cast<int>(NewAmount);
 +
        for (int i=0; i<NewAmountInt; i++)///i-это точки функции с новыми шагами
 
         {
 
         {
             r.gfirstx = a[0].x;
+
             mass1 = new double[NewAmountInt];
             r.i1 = 0;
+
            double x = i*__Step+__Begin;///значения х в новых точках
             r.i1 = 0;
+
            double x0=(static_cast<int>((x-__Begin)/Step)) * Step+__Begin;///значение х в точке интерполяции
             double k = x.pfind(a[0].x);
+
            ///стоящей ДО новой точки
             if (k < 0)
+
             double x1=x0+Step;///точка интерполяции ПОСЛЕ новой точки, т.е к предыдущей прибавляем СТАРЫЙ шаг
                r.i2 = -k - 1;
+
            int i0=(static_cast<int>((x-__Begin)/Step));///это нужно для массива, значение массива в i0 соответстует значению функции в x0
             else
+
             int i1=i0+1;
                r.i2 = (k - 1) + 1;
+
             mass1[i]=(((x - x0 )*(mass[i1] - mass[i0]))/( x1-x0)) + mass[i0];
 +
             cout << "y("<<i<< ") = " << mass1[i] <<endl<<endl; ///вывод интерполяции на экран
 +
            std::ofstream fout("Interpol.txt",ios::app);///сохранение в файл
 +
             fout<<i<<" "<<mass1[i]<<" \n";
 +
            fout.close();
 
         }
 
         }
         else
+
         AmountInt=NewAmountInt;
 +
        delete[] mass;
 +
        mass=mass1;
 +
        cout<<"end of interpol";
 +
    }
 +
 
 +
    void approximation(double __Begin, double __End, double __Step)
 +
 
 +
    {
 +
        double SumXMass=0;///это сумма умножений x на значение функции в этом x для всех значений
 +
        double SumX=0;///сумма всех значений x
 +
        double SumMass=0;///сумма всех значений функции в точках x
 +
        double SumXX=0;///сумма всех квадратов значений x
 +
        mass1 = new double[AmountInt];
 +
        double x;
 +
        for (int i=0; i<AmountInt; i++)
 
         {
 
         {
             r.gfirstx = x.a[0].x;
+
             x=i*__Step+__Begin;///такие значения принимает x в точках по порядку i
             double k = pfind(x.a[0].x);
+
             SumXMass=SumXMass+x*mass[i];
             if (k < 0)
+
             SumX=SumX+x;
                r.i1 = -k - 1;
+
             SumMass=SumMass+mass[i];
             else
+
             SumXX=SumXX+x*x;
                r.i1 = (k - 1) + 1;
+
 
             r.i2 = 0;
 
 
         }
 
         }
 +
        double a=(SumXMass*AmountInt-SumX*SumMass)/(AmountInt*SumXX-SumX*SumX);
 +
        double b=(SumMass-a*SumX)/AmountInt;
 +
        if (b>0)
 +
            cout<<"approximation "<<a<<"*x+"<<b<<endl;
 +
        else if (b<0)
 +
            cout<<"approximation "<<a<<"*x"<<b<<endl;
  
         if (a[length - 1].x < x.a[x.length - 1].x)
+
         for (int i=0; i<AmountInt; i++)
 
         {
 
         {
             r.glastx = a[length - 1].x;
+
             mass1[i] = a*(i*__Step+__Begin)+b;///такие значения принимает апроксимация
            r.e1 = length - 1;
+
        }
            double k = x.pfind(r.glastx);
+
        delete[] mass;
            if (k < 0)
+
        mass=mass1;
                r.e2 = -k - 1;
+
        output();///вывод на экран
            else
+
        SaveFile("approximation.txt");///сохранение в файл
                r.e2 = (k - 1) - 1;
+
        cout<<"end of appox";
         }
+
 
         else
+
    }
 +
 
 +
    func operator+( func f)///перегрузка оператора +
 +
    {
 +
        func newmass(Begin, End, Step);
 +
         masss=new double[AmountInt];///новая функция равная сумме данныйх функций
 +
         for (int i=0; i<AmountInt; i++)
 
         {
 
         {
             r.glastx = x.a[x.length - 1].x;
+
             masss[i] = mass[i] + f.mass[i];
            double k = pfind(r.glastx);
 
            if (k < 0)
 
                r.e1 = -k - 1;
 
            else
 
                r.e1 = (k - 1) + 1;
 
            r.e2 = x.length - 1;
 
 
         }
 
         }
         r.glength = length + x.length - r.i1 - (length - (r.e1 + 1)) - r.i2 - (x.length - (r.e2 + 1));
+
         delete [] mass;
 +
        mass=masss;
 +
        output();///вывод на экран резултата
 +
        SaveFile("f3.txt");///сохранение в файл
 +
        cout<<"enter new step";
 +
        cin>>Step2;
 +
        cout<<"interpolation: ";
 +
        interpolation(Begin,End,Step2);///интерполяция
 +
        cout<<" approximation: ";
 +
        approximation(Begin,End,Step2);///аппроксимация
 +
        return newmass;
  
        return r;
 
 
     }
 
     }
  
     void ad (fun b[],int l)                                 //присвоить массиву объекта класса F значения массива b
+
     func operator-( func f)
 
     {
 
     {
         length = l;
+
         func newmass(Begin, End, Step);
         a = new fun [l];
+
         masss=new double[AmountInt];
         for (int i = 0; i < l;i++)
+
         for (int i=0; i<AmountInt; i++)
             a[i] = b[i];
+
        {
         firstx = a[0].x;
+
             masss[i] = mass[i] - f.mass[i];
         lastx = a[length - 1].x;
+
         }
 +
        delete [] mass;
 +
         mass = masss;
 +
        output();
 +
        SaveFile("f3.txt");
 +
        cout<<"enter new step";
 +
        cin>>Step2;
 +
        cout<<"interpolation: ";
 +
        interpolation(Begin,End,Step2);
 +
        cout<<" approximation: ";
 +
        approximation(Begin,End,Step2);
 +
        return newmass;
 
     }
 
     }
 
+
     func operator/( func f)
     fun *geta()                                         //получения указателя на начало массива в поле класса
 
 
     {
 
     {
         return a;
+
         func newmass(Begin, End, Step);
    }
+
         masss=new double[AmountInt];
 
+
         for (int i=0; i<AmountInt; i++)
    F operator +(F &x) const                              //сложение двух функций
 
    {
 
        int i1, e1, i2, e2, kk = 0;
 
         double gfirstx, glastx, glength;
 
 
 
         if (((x.lastx < firstx) && (x.firstx < firstx)) || ((lastx < x.firstx) && (firstx < x.firstx)))
 
 
         {
 
         {
             cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
+
             masss[i] = mass[i] / f.mass[i];
            F fl(-1,0,0);
 
            return fl;
 
 
         }
 
         }
         sf r = prepare(x);
+
         cout << " division: \n ";
         F tmp(r.glength,r.gfirstx,r.glastx);
+
        delete [] mass;
         for (int i = 0; i <= (r.e1 - r.i1); i++)
+
        mass = masss;
 +
        output();
 +
         SaveFile("f3.txt");
 +
        cout<<"enter new step";
 +
        cin>>Step2;
 +
        cout<<"interpolation: ";
 +
        interpolation(Begin,End,Step2);
 +
        cout<<" approximation: ";
 +
        approximation(Begin,End,Step2);
 +
        return newmass;
 +
    }
 +
    func operator*( func f)
 +
    {
 +
        func newmass(Begin, End, Step);
 +
        masss=new double[AmountInt];
 +
         for (int i=0; i<AmountInt; i++)
 
         {
 
         {
             tmp.a[i].x = a[i + r.i1].x;            //поправка,введенная таким образом,чтобы номер,с которого начинается отсчет был первым в новой области определения
+
             masss[i] = mass[i] * f.mass[i];
            int ii = x.pfind(tmp.a[i].x);
 
            if (ii < 0)
 
                tmp.a[i].y = x.a[-ii - 1].y + a[i + r.i1].y;
 
            else
 
                tmp.a[i].y = intr(x.a[ii - 1].x , x.a[ii + 1].x , tmp.a[i].x , x.a[ii].y , x.a[ii + 1].y) + a[i + r.i1].y;
 
 
         }
 
         }
         for (int i = (r.e1 - r.i1 + 1); i <= (r.e2 - r.i2 + (r.e1 - r.i1) + 1) ; i++)
+
         cout << " multiply: \n ";
         {
+
         delete [] mass;
            int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
+
        mass = masss;
            if (ii >= 0)
+
        output();
            {
+
        SaveFile("f3.txt");
                tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
+
        cout<<"enter new step";
                tmp.a[i - kk].y = intr (a[ii - 1].x , a[(ii - 1) + 1].x , tmp.a[i - kk].x , a[ii - 1].y, a[(ii - 1) + 1].y) + x.a[i - (r.e1 - r.i1 + 1) + r.i2].y;
+
        cin>>Step2;
            }
+
        cout<<"interpolation: ";
            else
+
         interpolation(Begin,End,Step2);
            {
+
         cout<<" approximation: ";
                kk++;
+
        approximation(Begin,End,Step2);
                glength --;
+
        return newmass;
                tmp.length --;
+
    }
            }
 
         }
 
 
 
         for (int i = 0; i < glength; i++)
 
            for (int j = 0; j < glength - 1; j++)
 
            if (tmp.a[j].x > tmp.a[j + 1].x)
 
            {
 
                fun t = tmp.a[j];
 
                tmp.a[j] = tmp.a[j + 1];
 
                tmp.a[j + 1] = t;
 
            }
 
  
        return tmp;
 
}
 
  
     F operator *(F & x) const                                        //умножение двух функций
+
     void output()///вывод функции на экран
 
     {
 
     {
         int i1, e1, i2, e2, kk = 0;
+
         for (int i=0; i<AmountInt; i++)
         double gfirstx, glastx, glength;
+
         {
 +
            cout << "y("<<i<< ") = " << mass[i] <<endl;
  
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
 
        {
 
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
 
            F fl(-1,0,0);
 
            return fl;
 
 
         }
 
         }
 +
    }
  
        sf r = prepare(x);
 
        F tmp(r.glength,r.gfirstx,r.glastx);
 
  
         for (int i = 0; i <= (r.e1 - r.i1); i++)
+
    void SaveFile(char filename[])///сохранение функции в файл
 +
    {
 +
        std::ofstream fout(filename);
 +
         for (int l=0; l<AmountInt; l++)
 
         {
 
         {
             tmp.a[i].x = a[i + r.i1].x;
+
             fout<<l<<" "<<mass[l]<<" \n";
            int ii = x.pfind(tmp.a[i].x);
 
            if (ii < 0)
 
                tmp.a[i].y = x.a[-ii - 1].y * a[i + r.i1].y;
 
            else
 
                tmp.a[i].y = intr(x.a[ii - 1].x , x.a[ii + 1].x , tmp.a[i].x , x.a[ii].y , x.a[ii + 1].y) * a[i + r.i1].y;
 
        }
 
        for (int i = (r.e1 - r.i1 + 1); i <= (r.e2 - r.i2 + (r.e1 - r.i1) + 1) ; i++)
 
        {
 
            int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
 
            if (ii >= 0)
 
            {
 
                tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
 
                tmp.a[i - kk].y = intr (a[ii - 1].x , a[(ii - 1) + 1].x , tmp.a[i - kk].x , a[ii - 1].y, a[(ii - 1) + 1].y) * x.a[i - (r.e1 - r.i1 + 1) + r.i2].y;
 
            }
 
            else
 
            {
 
                kk++;
 
                glength --;
 
                tmp.length --;
 
            }
 
 
         }
 
         }
  
         for (int i = 0; i < glength; i++)
+
         fout.close();
            for (int j = 0; j < glength - 1; j++)
 
            if (tmp.a[j].x > tmp.a[j + 1].x)
 
            {
 
                fun t = tmp.a[j];
 
                tmp.a[j] = tmp.a[j + 1];
 
                tmp.a[j + 1] = t;
 
            }
 
 
 
        return tmp;
 
 
     }
 
     }
 +
};
  
    F operator ^(F & x) const                                  //возведение функции слева от оператора в степень функции справа от оператора
 
    {
 
        int i1, e1, i2, e2, kk = 0;
 
        double gfirstx, glastx, glength;
 
  
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
 
        {
 
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
 
            F fl(-1,0,0);
 
            return fl;
 
        }
 
  
        sf r = prepare(x);
+
int main()
        F tmp(r.glength,r.gfirstx,r.glastx);
+
{
  
        for (int i = 0; i <= (r.e1 - r.i1); i++)
+
    double Begin1, End1, Step1, Step2;
        {
+
    cout<<" enter the beginning of the  function ";
            tmp.a[i].x = a[i + r.i1].x;
+
    cin>>Begin1;
            int ii = x.pfind(tmp.a[i].x);
+
    cout<<"\n enter the end of the  function ";
            if (ii < 0)
+
    cin>>End1;
                tmp.a[i].y = pow(x.a[-ii - 1].y, a[i + r.i1].y);
+
    cout<<"\n enter the step of the 1st function ";
            else
+
    cin>>Step1;
                tmp.a[i].y = pow(intr(x.a[ii - 1].x , x.a[ii + 1].x , tmp.a[i].x , x.a[ii].y , x.a[ii + 1].y), a[i + r.i1].y);
 
        }
 
        for (int i = (r.e1 - r.i1 + 1); i <= (r.e2 - r.i2 + (r.e1 - r.i1) + 1) ; i++)
 
        {
 
            int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
 
            if (ii >= 0)
 
            {
 
                tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
 
                tmp.a[i - kk].y = pow(intr (a[ii - 1].x , a[(ii - 1) + 1].x , tmp.a[i - kk].x , a[ii - 1].y, a[(ii - 1) + 1].y), x.a[i - (r.e1 - r.i1 + 1) + r.i2].y);
 
            }
 
            else
 
            {
 
                kk++;
 
                glength --;
 
                tmp.length --;
 
            }
 
        }
 
  
        for (int i = 0; i < glength; i++)
+
    func f1(Begin1,End1,Step1);///создание первой функции
            for (int j = 0; j < glength - 1; j++)
+
    f1.massiv1();
            if (tmp.a[j].x > tmp.a[j + 1].x)
+
    f1.output();
            {
+
    cout<<"\n ";
                fun t = tmp.a[j];
+
    f1.SaveFile("f1.txt");
                tmp.a[j] = tmp.a[j + 1];
 
                tmp.a[j + 1] = t;
 
            }
 
  
        return tmp;
+
    func f2(Begin1,End1,Step1);///создание второй функции
     }
+
    f2.massiv2();
};
+
    f2.output();
 +
    cout<<"\n ";
 +
     f2.SaveFile("f2.txt");
 +
    cout<<"\n";
  
int main()
+
     func f3(Begin1,End1,Step1);
{
 
  /*
 
     F f1(5,-2,1.5);
 
    F f2(30,-10,0.5);
 
    F f3, f4;
 
    f1.FOut();
 
    f2.FOut();
 
    f3 = f1 + f2;
 
    f3.FOut();
 
    f4 = f1 * f2;
 
    f4.FOut();
 
    cout << " ________" << endl;
 
*/
 
    char vc, s[255], ce;
 
    ifstream infile;
 
    int n;
 
    fun *a;
 
    F f5,f6,f7,f8,f9;
 
  
     while(true)
+
     cout<<" \n \n choose 1 - sum , 2 - subtract, 3 - division, 4 - multiply \n";///выбор операции
 +
    int z;
 +
    cin>>z;
 +
    switch (z)
 +
    {
 +
    case 1:
 
     {
 
     {
    start :
+
         f3=f1+f2;///сумма функций
         system("cls");
+
         break;
         cout << "1 - Vvesti 1uu func"            << endl;
+
    }
        cout << "2 - Vvesti 2uu func"            << endl;
+
    case 2:
        cout << "3 - Sloshit'"                  << endl;
+
    {
         cout << "4 - Umnozhit'"                  << endl;
+
         f3=f1-f2;
         cout << "5 - Vozvesti v stepen'"        << endl;
+
         break;
        cout << "6 - Aproximirovat'"            << endl;
+
    }
        cout << "7 - Zapics' v file func"        << endl;
+
    case 3:
        cout << "8 - Zapics' v file aprok fun"  << endl;
+
    {
         cout << "0 - Vihod"                      << endl;
+
         f3=f1/f2;
         cin  >> vc;
+
         break;
        switch (vc)
+
    }
        {
+
    case 4:
            case '0':
+
    {
                return 0 ;
+
        f3=f1*f2;
            case '1':
+
        break;
                {
+
    }
                system("cls");
+
 
                strcpy(s,"");
+
    default :
                delete []a;
+
    {
                a = NULL;
+
        cout<<"NOOOOO";
                cout << "Vvedite imya fila" << endl;
+
        break;
                cin >> s;
+
    }
                strcat(s, ".txt");
+
    };
                infile.open(s);
+
    return 0;
                infile >> n;
+
}
                a = new fun [n];
+
 
                for(int i = 0; i < n; i ++)
+
 
                    infile >> a[i].x >> a[i].y;
+
</syntaxhighlight>
                f5.ad(a,n);
+
</div>
                f5.FOut();
+
 
                infile.close();
+
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
                cin >> ce;
+
'''[[Белоусова Екатерина]]'''
                while (true)
+
 
                if (ce == 'b')
+
'''Инструкция к программе''': пользователь вводит начало и конец отрезка и шаг для функций, после чего создается две функции. Затем пользователь выбирает одну из арифметических операций, которую он хочет применить к этим функциям. Создается третья функция. После пользователь вводит второй шаг для интерполяции. Третья функция интерполируется по новому шагу, а затем аппроксимируется.
                    goto start;
+
 
                }
+
'''Краткое описание алгоритма''': в классе при помощи массива создаются две функции, с которыми потом работает программа. Эти функции перегружаются операторами арифметических операций, где затем полученная новая функция интерполируется и аппроксимируется.
            case '2':
+
 
                {
+
Скачать программу можно по ссылке  [http://tm.spbstu.ru/Файл:задача_2.zip].
                system("cls");
+
 
                strcpy(s,"");
+
<div class="mw-collapsible-content">
                delete []a;
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
                a = NULL;
+
#include <iostream>
                cout << "Vvedite imya fila" << endl;
+
#include <locale.h>
                cin >> s;
+
#include <math.h>
                strcat(s, ".txt");
+
#include <fstream>
                infile.open(s);
+
#include<iomanip>
                infile >> n;
+
 
                a = new fun[n];
+
using namespace std;
                for(int i = 0; i < n; i ++)
+
 
                    infile >> a[i].x >> a[i].y;
+
class functya ///создаем класс функции
                f6.ad(a,n);
+
{
                f6.FOut();
+
 
                infile.close();
+
private: ///объявляем тип переменных в привате
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
    double *mass, *mass1, *mass2; ///*mass, *mass1, *mass2 -определение двумерного массива
                cin >> ce;
+
    double start, ending, step, step2, amountdouble; ///start-начало, ending-конец, step-шаг, amountdouble-количество точек (типа double)
                while (true)
+
 
                if (ce == 'b')
+
public: ///объявляем тип переменных в паблике
                    goto start;
+
    int amount; ///amoun-количество точек (типа int)
                }
+
 
            case '3':
+
functya (double _start, double _ending, double _step):start(_start),ending(_ending),step(_step) ///создаем конструктор функции с объявлением переменных
                system("cls");
+
{
                f5.FOut();
+
 
                f6.FOut();
+
    amountdouble=((ending-start)/step)+1; ///подсчитываем количество точек с заданым шагом
                f7 = f5 + f6;
+
    amount=static_cast<int>(amountdouble); ///преобразуем количество из типа double к типу int
                f7.FOut();
+
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
}
                cin >> ce;
+
 
                while (true)
+
void massiv1 () ///создаем функцию массива
                if (ce == 'b')
+
{
                    goto start;
+
 
            case '4':
+
    mass=new double[amount]; ///создаем двумерный массив
                system("cls");
+
    for (int l=0; l<amount; l++) ///создаем цикл от нуля до amount-количества точек
                f5.FOut();
+
    {
                f6.FOut();
+
        mass[l]= pow((l*step+start),3); ///при помощи массива задаем функцию с которой будем работать
                f7 = f5 * f6;
+
    }
                f7.FOut();
+
    cout<< "\n";
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
}
                cin >> ce;
+
 
                while (true)
+
void massiv2 () ///создаем функцию массива
                if (ce == 'b')
+
{
                    goto start;
+
 
            case '5':
+
    mass=new double[amount]; ///создаем двумерный массив
                system("cls");
+
    for (int l=0; l<amount; l++) ///создаем цикл от нуля до amount-количества точек
                f5.FOut();
+
    {
                f6.FOut();
+
        mass[l]= pow((l*step+start),2); ///при помощи массива задаем функцию с которой будем работать
                f7 = f5 ^ f6;
+
    }
                f7 = f5 ^ f6;
+
    cout<< "\n";
                f7.FOut();
+
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
}
                cin >> ce;
+
 
                while (true)
+
void interpol (double __start, double __ending, double __step) ///создаем функцию интерполяция с определением переменных
                if (ce == 'b')
+
{
                    goto start;
 
            case '6':
 
            {
 
                system("cls");
 
                ap tmp = aproks(f7.geta(), f7.getlength());
 
                f8.addpar(tmp.k, tmp.b, f7.getlength(), f7.geta());
 
                f8.FOut();
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 
                cin >> ce;
 
                while (true)
 
                if (ce == 'b')
 
                    goto start;
 
            }
 
            case '7':
 
            {
 
                system("cls");
 
                strcpy(s,"");
 
                cout << "Vvedite imya fila" << endl;
 
                cin >> s;
 
                strcat(s, ".txt");
 
                ofstream outfile(s);
 
                outfile << "x          y" << endl;
 
                for (int i = 0; i < f7.getlength(); i ++)
 
                    outfile << f7.getelx(i) << "          " << f7.getely(i) << endl;
 
  
                cout << "done" << endl;
+
    double amount1=((__ending-__start)/__step)+1; ///определяем тип и подсчитываем новое количество точек с новым шагом
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
    int amounti=static_cast<int>(amount1); ///преобразуем количество из типа double к типу int
                cin >> ce;
 
                while (true)
 
                if (ce == 'b')
 
                    goto start;
 
            }
 
            case '8':
 
                system("cls");
 
                strcpy(s,"");
 
                cout << "Vvedite imya fila" << endl;
 
                cin >> s;
 
                strcat(s, ".txt");
 
                ofstream outfile(s);
 
                outfile << "x          y" << endl;
 
                for (int i = 0; i < f8.getlength(); i ++)
 
                    outfile << f8.getelx(i) << "          " << f8.getely(i) << endl;
 
                cout << "done" << endl;
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 
                cin >> ce;
 
                while (true)
 
                if (ce == 'b')
 
                    goto start;
 
        }
 
    }
 
    return 0;
 
}
 
</syntaxhighlight>
 
</div>
 
  
'''[[Лобанов Илья]]'''
+
    for (int i=0; i<amounti; i++) ///создаем цикл от 0 до amounti-нового количества точек
 +
    {
  
'''Описание программы''':
+
        mass1=new double[amounti];
Программа позволяет складывать , вычитать , делить,умножать 2 функции,заданные на одном интервале.При считывании с файла сначала указывается отрезок, потом величина шага, а потом дискретные значения.
+
        double x = i*__step+__start; ///определяем тип и расчитываем координату Х
 
+
        double x0=(static_cast<int>((x-__start)/step)) * step+__start;///определяем тип и расчитываем координату х
Скачать можно [[http://tm.spbstu.ru/File:func.rar тут]]
+
                                                                      ///в интерполирующейся точке, которая стоит до новой точки
 
+
        double x1=x0+step;///определяем тип и расчитываем координату х1 прибавляя к предыдущей точке шаг
 
+
        int i0=(static_cast<int>((x-__start)/step));///определяем значение массива в i0 соответстующей значению функции в x0
'''[[Лосева Татьяна]]'''
+
        int i1=i0+1;
+
        mass1[i]=(((x - x0 )*(mass[i1] - mass[i0]))/( x1-x0)) + mass[i0];
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.
+
        cout << "Х="<<i<<setw(10)<< "У= " << mass1[i] <<endl<<endl; ///выводим интерполяцию на экран
 +
        ofstream fout("interpol.txt",ios::app);///сохраняем в файл
 +
        fout<< "Х="<<i<<setw(10)<< "У="<<mass1[i]<<" \n";
 +
        fout.close();
  
'''Инструкция к программе:''' Начальная координата и шаг,для задания координат функций,передаются при вызове методов,создающих функции.Начальный шаг,шаг интерполяции,а так же количество выводимых координат заданы глобально.Поэтому просто запускайте программу, при желании поменяйте заданные
+
    }
величины.
 
  
Cкачать программу можно  [http://tm.spbstu.ru/Файл:Loseva.rar здесь]
+
    amount=amounti;
 +
    delete []mass;
 +
    mass = mass1;
  
<div class="mw-collapsible-content">
+
}
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <iostream>
 
  
using namespace std;
+
void aprocsimation(double __start, double __ending, double __step) ///создаем функцию апроксимация с определением переменных
 +
{
  
#define N 5//количество точек
+
    int N=amount; ///определяем тип и значение переменной N (равна количеству точек с заданным шагом)
 +
    double SumXY=0; ///определяем тип и значение переменной SumXY ( сумма (Х*У) )
 +
    double SumX=0; ///определяем тип и значение переменной SumX ( сумма Х )
 +
    double SumY=0; ///определяем тип и значение переменной SumУ ( сумма У )
 +
    double Sum_Xkv=0; ///определяем тип и значение переменной Sum_Xkv ( сумма (Х*Х) )
 +
    double Xi; ///определяем тип переменной Xi
  
const double l1 = 5;//задаём начальный шаг функций
+
    mass1 = new double[N]; ///создаем двумерный массив
const double l2 = 0.7;//шаг для интерполяции
+
    for (int i=0; i<N; i++) ///создаем цикл от 0 до N (количество точек с заданным шагом)
 +
    {
  
class Func
+
        Xi=i*__step+__start; ///расчитываем Хi
{//класс,хранящий функцию,содержащий методы:печать,перегрузка,интерполяция,апроксимация
+
        SumXY=SumXY+Xi*mass[i]; ///расчитываем SumXY
 +
        SumX=SumX+Xi; ///расчитываем SumX
 +
        SumY=SumY+mass[i]; ///расчитываем SumY
 +
        Sum_Xkv=Sum_Xkv+Xi*Xi; ///расчитываем Sum_Xkv
  
public:
+
    }
Func(int size) : size_(size), ax(new double[size]), by(new double[size])//создаём два массива,заполняем нулями
+
 
{
+
    double a=(SumXY*N-SumX*SumY)/(N*Sum_Xkv-SumX*SumX); ///определяем тип и расчитываем коэффициент перед Х в уравнении аХ+b
for (int i = 0; i< size_; i++)
+
    double b=(SumY-a*SumX)/N; ///определяем тип и расчитываем свободный член в уравнении аХ+b
{
 
ax[i] = 0;
 
by[i] = 0;  //все элементы обоих массивов обнуляются
 
}
 
}
 
  
void print()//вывод на экран
+
    if (b>0) ///если b положительное то
{
+
    cout<<"Апроксимация: "<<a<<"*x+"<<b<<endl; ///выводим на экран: Апроксимация: а*Х+b
cout << "x: ";
 
for (int i = 0; i < size_; i++)
 
cout << ax[i] << " ";
 
cout << endl << "y: ";
 
for (int i = 0; i < size_; i++)
 
cout << by[i] << " ";
 
cout << endl;
 
}
 
  
Func &operator+(Func &f2)//функция перегрузки:cложение функций
+
    else if (b<0) ///если b отрицательно то
{
+
    cout<<"Апроксимация: "<<a<<"*x"<<b<<endl; ///выводим на экран: Апроксимация: а*Х b
Func *result = new Func(size_);//создаём результирующую функцию,равную сумме двух f2 и this
 
for (int i = 0; i < size_; i++)
 
{
 
result->ax[i] = this->ax[i];//суммируем координаты X
 
result->by[i] = f2.by[i] + this->by[i];//суммируем координаты Y
 
}
 
cout << "Sum f(x)=f1+f2:" << endl;//выводим на экран сумму функций
 
result->print();
 
return *result;
 
}
 
  
void Int(double L) //метод Интерполяции
+
    for (int i=0; i<N; i++) ///создаем цикл от 0 до N (количество точек с заданным шагом)
{
+
    {
int M = (this->ax[this->size_ - 1] - this->ax[0]) / L + 1; //M- количество элементов массива с координатами интерполирующей функции;
+
        mass1[i] = a*(i*__step+__start)+b; ///при помощи массива создаем функцию подсчета точек при апроксимации
Func result = Func(M);//cоздаём функцию,в кторой будет храниться результат интерполяции
+
    }
cout << "M =" << M << endl;//выводим M для проверки
 
cout << "Interpolation: " << endl;
 
int t;
 
for (int i = 1; i < M; i++)
 
{
 
result.ax[0] = this->ax[0];
 
result.ax[i] = result.ax[i - 1] + L;//интерполируем Х,прибавляя шаг к каждому предыдущему элементу
 
t = (result.ax[i - 1] - result.ax[0]) / l1;//считаем номер элемента,"левого" от искомого
 
  
                      //интерполируем Y по формуле
+
    delete[] mass;
result.by[i] = this->by[t] + ((result.ax[i] - this->ax[t]) / (this->ax[t + 1] - this->ax[t]))*(this->by[t + 1] - this->by[t]);
+
    mass=mass1;
 +
    vivod();///вывод на экран
 +
    zapis("aprocsimation.txt");///сохраненяем в файл
  
}
+
}
  
result.print();//выводим результат
+
functya operator+ ( functya F) ///перегрузка оператора +
}
+
{
  
void aprox()//Апроксимация
+
    functya tmp(start,ending,step);
{
 
double a=0;
 
          for(int i=0;i<size_;i++)//считаем сумму x
 
  a=this->ax[i]+a;
 
       
 
  
double b=0;
+
    mass2=new double[amount];///создаем двумерный массив
for(int i=0;i<size_;i++)//считаем сумму y
+
    for (int i=0; i<amount; i++)
b=this->by[i]+b;
+
    {
+
        mass2[i]=mass[i] + F.mass[i];///находим сумму двух функций
 
+
    }
double c=0;
+
    delete [] mass;
for(int i=0;i<size_;i++)//считаем сумму квадратов x
+
    mass=mass2;
c=(this->ax[i])*(this->ax[i])+c;
+
    vivod();///выводим на экран результат
+
    zapis("f3.txt");///сохраненяем в файл
 +
    cout<<"Введите шаг для интерполяции";
 +
    cin>>step2;
 +
    cout<<"Интерполяция: "<<"\n";
 +
    interpol(start,ending,step2);///вызов функции интерполяции
 +
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 +
    return tmp;
  
double d=0;
+
}
for(int i=0;i<size_;i++)//считаем сумму xy
 
d=(this->ax[i])*(this->by[i])+d;
 
 
  
//затем решаем систему для у=kx+m
+
functya operator-( functya F)///перегрузка оператора -
//(1)c*k+a*m=d
+
{
//(2)a*k+size_*m=b;
 
//k=(d-am)/с
 
//подставим в (2)
 
double m;
 
m=(b*c-a*d)/(c*size_-a*a);
 
double k;
 
k=(d-a*m)/c;
 
cout<<"aproximacia :: ";
 
cout<<"y="<<k<<"x+"<<m<<endl;
 
  
}
+
    functya tmp(start,ending,step);
  
 +
    mass2=new double[amount];///создаем двумерный массив
 +
    for (int i=0; i<amount; i++)
 +
    {
 +
        mass2[i]=mass[i] - F.mass[i];///находим разность двух функций
 +
    }
  
double *ax;
+
    delete [] mass;
double *by;
+
    mass=mass2;
 
+
    vivod();///выводим на экран результат
private:
+
    zapis("f3.txt");///сохраненяем в файл
int size_;//размер массива
+
    cout<<"Введите шаг для интерполяции";
};
+
    cin>>step2;
 +
    cout<<"Интерполяция: "<<"\n";
 +
    interpol(start,ending,step2);///вызов функции интерполяции
 +
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 +
    return tmp;
  
 +
}
  
 +
functya operator*( functya F)///перегрузка оператора *
 +
{
 +
    functya tmp(start,ending,step);
  
 +
    mass2=new double[amount];///создаем двумерный массив
 +
    for (int i=0; i<amount; i++)
 +
    {
 +
        mass2[i]=mass[i] * F.mass[i];///находим произведение двух функций
 +
    }
  
class Cord//класс,создающий и хранящий значение функций
+
    delete [] mass;
 +
    mass=mass2;
 +
    vivod();///выводим на экран результат
 +
    zapis("f3.txt");///сохраненяем в файл
 +
    cout<<"Введите шаг для интерполяции";
 +
    cin>>step2;
 +
    cout<<"Интерполяция: "<<"\n";
 +
    interpol(start,ending,step2);///вызов функции интерполяции
 +
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 +
    return tmp;
 +
 
 +
}
 +
 
 +
functya operator/( functya F)///перегрузка оператора /
 
{
 
{
public:
 
Cord(double x0, double s) :x0(x0), s(s)//x0-начальная координата;s-шаг
 
{
 
}
 
  
void Fyx1(Func func)//метод,считающий координаты нашей функции y=x
+
    functya tmp(start,ending,step);
{
+
 
int i;
+
    mass2=new double[amount];///создаем двумерный массив
func.ax[0] = x0;
+
    for (int i=0; i<amount; i++)
for (i = 1; i < N; i++)//считаются иксы
+
    {
{
+
        mass2[i]=mass[i] / F.mass[i];///находим частное двух функций
func.ax[i] = x0 + s;
+
    }
x0 = func.ax[i];
+
 
}
+
    delete [] mass;
for (i = 0; i<N; i++)
+
    mass=mass2;
func.by[i] = func.ax[i];//считаем координаты у
+
    vivod();///выводим на экран результат
cout << "f1 :" << endl;
+
    zapis("f3.txt");///сохраненяем в файл
func.print();
+
    cout<<"Введите шаг для интерполяции ";
cout << endl;
+
    cin>>step2;
}
+
    cout<<"Интерполяция: "<<"\n";
 +
    interpol(start,ending,step2);///интерполяция
 +
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 +
    return tmp;
  
void Fyx2(Func func)//метод,считающий координаты нашей функции y=x+1
+
}
{
 
int i;
 
func.ax[0] = x0;
 
for (i = 1; i<N; i++)//считаем иксы
 
{
 
func.ax[i] = x0 + s;
 
x0 = func.ax[i];
 
}
 
for (i = 0; i<N; i++)
 
func.by[i] = func.ax[i] + 1;//считаем игрики
 
cout << "f2 :" << endl;
 
func.print();
 
cout << endl;
 
}
 
  
private:
+
void vivod ()///создаем функцию вывода на экран
double x0;//начальная координата
+
{
double s;//шаг
+
 
};
+
    for (int l=0; l<amount; l++)
 +
    {
 +
        cout<<"Х"<<l<<setw(10)<< "Y= " << mass[l] <<"\n";
 +
    }
 +
 
 +
}
  
int main()
+
void zapis (char Zapis[])///созданем функцию записи в файл
 
{
 
{
Func f1(N);//создание функции f1
 
Func f2(N);//создание f2
 
Cord s1(0, l1);//cоздаём объект s1
 
Cord s2(0, l1);//cоздаём объект s2
 
s1.Fyx1(f1);//задаём координаты 1ой функции
 
s2.Fyx2(f2);//задаём координаты 2ой функции
 
  
      //сложение функций:
+
    ofstream fout(Zapis);
+
    for (int l=0; l<amount; l++)
Func f3 = f2 + f1;//есть тоже ,что и Func f3 = f2.operator+(f1);
+
    {
 +
        fout<<"X="<<l<<setw(10)<<"Y="<<mass[l]<<" \n";
 +
    }
 +
 
 +
    fout.close();
  
f1.Int(l2);//Интерполируем f1 с новым шагом l2
 
f1.aprox();//Апроксимируем f1
 
 
getchar();
 
return 0;
 
 
}
 
}
  
</syntaxhighlight>
+
};
</div>
 
  
'''[[Сергей Ляжков]]'''
+
int main()
'''Описание программы''':программа позволяет проводить следующие действия с функциями: сложение, вычитание, умножение, те же действия с числами, проводить аппроксимацию и интерполяцию
+
{
Скачать можно [[http://tm.spbstu.ru/File:Функции.zip тут]]
 
  
<br>'''[[Нарядчиков Александр]]'''<br>
+
    setlocale(LC_ALL,"RUS");
'''Инструкция:''' Пользователю достаточно просто запустить программу.<br>
 
'''Описание программы:''' В окне рисуются графики с разным шагом, количеством точек, начальными и конечными координатами, по клавише 'G' происходит их кубическая интерполяция, также рисуется график их суммы. По клавише 'S' можно сохранить полученный график в текстовый документ в виде координат его точек. По клавише 'L' можно загрузить график из текстового документа, и он появится в окне программы. Также происходит линейная аппроксимация графика суммы, и график аппроксимации рисуется на экран.<br>
 
'''Описание алгоритма:''' Вся графика написана с помощью библиотек OpenGL и GLUT. Кубическая интерполяция написана с помощью кривых Безье(интерполяция по четырем точкам - кубическая кривая). При сложение двух графиков происходит их интерполяция, для приведения их к общему шагу. Линейная аппроксимация написана с помощью метода наименьших квадратов.<br>
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
"'''T05GRAPH.CPP'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
/* FILENAME: T05GRAPH.CPP
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#include "GRAPH.H"
+
    double start1, ending1, step1, step2;
 +
    int number;
 +
    cout<< "Введите начало отрезка ";
 +
    cin>> start1;
 +
    cout<< "Введите конец отрезка ";
 +
    cin>> ending1;
 +
    cout<<"Введите шаг для функций ";
 +
    cin>> step1;
  
/* Глобальные переменные */
+
    functya F1(start1,ending1,step1);///создаем первую функцию
// Глобальная переменная, хранящая время в секундах с момента старта программы
+
    F1.massiv1();
double SyncTime;
+
    F1.vivod();///выводим координаты первой функции на экран
// Глобальные переменные для отслеживания нажатия клавиш
+
    F1.zapis("F1.txt");///записываем координаты первой функции в файл
bool IsGraph, IsSave, IsLoad, IsLoaded;
 
  
/* Timer function */
+
    cout<<"\n \n";
// Подсчет времени
 
void Timer( void )
 
{
 
long t;
 
static long StartTime = -1;
 
  
t = clock();
+
    functya F2(start1,ending1,step1);///создаем вторую функцию
if (StartTime == -1)
+
    F2.massiv2();
StartTime = t;
+
    F2.vivod();///выводим координаты второй функции на экран
SyncTime = (double)(t - StartTime) / CLOCKS_PER_SEC;
+
    F2.zapis("F2.txt");///записываем координаты второй функции в файл
} /* End of 'Timer' function */
 
  
/* Display function */
+
    cout<<"\n \n";
// Стандартная функция, вызываемая при перерисовке окна
 
void Display( void )
 
{
 
graph G1(-15, 15, 0.1), G2(2, 10, 0.4), G3, G4;
 
  
// Запуск времени
+
    functya F3(start1, ending1, step1);
Timer();
 
  
// Установка цвета закраски фона в белый
+
    cout<<"Выберите, что вы хотите сделать с функциями: 1-найти сумму, 2-найти разность, 3-найти произведение, 4-найти частное ";
glClearColor(1, 1, 1, 1);
+
    cin>>number;
// Очищаем цветовой буфер для создания нового изображения
+
    cout<<"\n \n";
glClear(GL_COLOR_BUFFER_BIT);
 
  
glLoadIdentity();
+
    if(number==1)
glScaled(0.1 / (1366 / 768.0), 0.1, 0.1);
+
    {
 +
        F3=F1+F2;
 +
    }
  
// Отрисовка осей X и Y
+
    else if (number==2)
glBegin(GL_LINE_STRIP);
+
    {
 +
        F3=F1-F2;
 +
    }
 +
 
 +
    else if (number==3)
 +
    {
 +
        F3=F1*(F2);
 +
    }
 +
 
 +
    else if (number==4)
 +
    {
 +
        F3=F1/F2;
 +
    }
 +
 
 +
    else
 +
    {
 +
        cout<<"Ошибка ";
 +
    }
 +
 
 +
    return 0;
 +
 
 +
}
 +
</syntaxhighlight>
 +
</div>
  
glColor3d(0, 0, 1);
 
glVertex2d(0, -1000);
 
glVertex2d(0, 1000);
 
  
glColor3d(1, 0, 0);
 
glVertex2d(-1000, 0);
 
glVertex2d(1000, 0);
 
  
glEnd();
+
'''[[Уманский Александр]]'''
  
/* Отрисовка графиков */
+
'''Инструкция к программе''': пользователь вводит начало и конец отрезка и шаг для функций, после чего создается две функции. Затем функции суммируются, после чего пользователь вводит значение нового шага, суммированная функция интерполируется по новому шагу, после этого по МНК(методу наименьших квадратов) функция апроксимируется.
// Отрисовка первого графика и его интерполяция по клавише "G"
 
G1.Draw(sin);
 
if (IsGraph == 1)
 
G1.Interpolation_Draw(1.0 / 32);
 
  
// Отрисовка второго графика и его интерполяция по клавише "G"
 
G2.Draw(log);
 
if (IsGraph == 1)
 
G2.Interpolation_Draw(1.0 / 32);
 
  
// Отрисовка графика суммы для первого и второго графиков
 
G3 = G2 + G1;
 
glColor3d(0, 1, 0);
 
G3.Draw();
 
// Аппроксимация графика суммы
 
G3.Approximation();
 
  
// Сохранение графика по клавише "S"
+
Скачать программу можно по [http://mech.spbstu.ru/File:Untitled1.rar ссылке]
if (IsSave == 1)
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
{
+
Метод наименьших квадратов
G3.SaveArray();
+
задача состоит в том, чтобы минимизировать выражение:
IsSave == 0;
+
1: http://mech.spbstu.ru/images/b/b0/003.png
}
+
Доказано, что минимум достигается при:
+
2: http://mech.spbstu.ru/images/2/20/005.png
// Загрузка графика по клавише "L"
+
записываем пункт 2 в нашу программу, находим коэффициенты и находим значение линейной функции y=ax+b, по интерполированным значениям x.
if (IsLoad == 1)
 
{
 
delete[] G4.mas;
 
delete[] G4.Color;
 
G4.LoadArray("graph.txt");
 
IsLoad == 0;
 
IsLoaded = 1;
 
}
 
 
// Отрисовка загруженного графика
 
if (IsLoaded == 1)
 
{
 
glColor3d(1, 0, 0);
 
G4.Draw();
 
IsLoaded = 0;
 
}
 
  
// Чистка памяти
 
delete[] G1.mas;
 
delete[] G1.Color;
 
delete[] G2.mas;
 
delete[] G2.Color;
 
delete[] G3.mas;
 
delete[] G3.Color;
 
delete[] G4.mas;
 
delete[] G4.Color;
 
  
glFinish();
+
<div class="mw-collapsible-content">
// Копируем вторичный буфер в окно
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
glutSwapBuffers();
 
// Вызываем функцию обновления кадра
 
glutPostRedisplay();
 
} /* End of 'Display' function */
 
  
/* Keyboard function */
+
#include <iostream>
// Стандартная функция, вызываемая при нажатие клавиш на клавиатуре
+
#include <math.h>
void Keyboard( unsigned char Key, int X, int Y )
+
#include <iomanip>
{
+
#include<stdlib.h>
// Выход из программы
+
using namespace std;
if (Key == 27)
 
exit(0);
 
// Отрисовка интерполированных графиков
 
else if ((Key == 'G') || (Key == 'g'))
 
IsGraph = !IsGraph;
 
// Сохранение графика суммы в файл
 
else if ((Key == 'S') || (Key == 's'))
 
IsSave = !IsSave;
 
// Загрузка графика из файла
 
else if ((Key == 'L') || (Key == 'l'))
 
IsLoad = !IsLoad;
 
// Открытие программы в полном экране
 
else if ((Key == 'F') || (Key == 'f'))
 
glutFullScreen();
 
} /* End of 'Keyboard' function */
 
  
/* Main function */
+
class func
int main( int argc, char *argv[] )
 
 
{
 
{
// Инициализации OpenGL и GLUT
+
private:
glutInit(&argc, argv);
+
    double a/*начало*/,b/*конец*/,c/*шаг*/,k/**/,m/**/,rr/**/;
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+
    int d/*переменная для изменения типа, кол-во элементов для начальных элементов*/,tt/*переменная для изиенения типа, кол-ва элементов для счёта суммы*/;
 +
    double *F/*массив для значений У*/, *X/*Массив для значений Х*/, *R/*массив для значений У после интерполяции*/, *Q;
 +
public:
  
// Задача размеров и позиции окна
+
    func (double a1, double b1, double c1):a(a1),b(b1),c(c1)//создаём конструктор для функции
glutInitWindowPosition(0, 0);
+
    {
glutInitWindowSize(500, 500);
+
        double p = (b-a)/c;
// Создание окна
+
        d = (int)p;
glutCreateWindow("T05GRAPH");
+
        if (b > (d*c+a)) d += 2; //в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
 +
        else d += 1;
  
// Установка функций 'обратного вызова'
+
        F = new double [d];//создание динамического массива для У
glutDisplayFunc(Display);
+
        X = new double [d];// создание динамического массива для Х
glutKeyboardFunc(Keyboard);
+
        X[0]=a;//первый элемент
 +
        X[d-1]=b;//последний элемент, для того чтобы последний элемент был в конце промежутка, чтобы его не потерять
 +
        for(int i = 1; i < d-1; i++) X[i]=a+c*i; //присваивание значений всех Х
  
// Запускаем основной цикл построения
+
    }
glutMainLoop();
+
    void first ()//функция для первой функции
return 0;
+
    {
} /* End of 'main' function */
+
        double y;//в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
 +
        F[0]=pow(2,a);//объявление значения У для начала промежутка
 +
        F[d-1]=pow(2,b);//объявление значения У для конца промежутка
 +
        for(int i = 1; i < d-1; ++i)
 +
        {
 +
            y = pow(2,((c*i)+a));//высчитываем значения У внутри промежутка
 +
            F[i] = y;//присваиваем массиву значения по У
 +
        }
  
/* END OF 'T05GRAPH.CPP' FILE */
+
        cout << " " << endl;//пробел и конец строки
</syntaxhighlight>
+
    }
"'''GRAPH.CPP'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
/* FILENAME: GRAPH.CPP
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#include "GRAPH.H"
+
    void second ()//функция для второй функции
 +
    {
 +
        if(a==0 || b==0) return;
 +
        F[0]=1*a*a; //присваивание значения функции в начале промежутка
 +
        F[d-1]=1*b*b;//присваивание значения функции в конце промежутка
  
/* Load Array of points function */
+
        for(int k = 1; k <d-1; ++k)
// Загрузка графика из файла по точкам
+
        {
void graph::LoadArray( char *FileName )
+
            double n = c*k+a;
{
+
            if (n != 0)//условие неделимости на ноль
// Создание указателя на тип FILE
+
            {
FILE *F;
+
                F[k] = 1*n*n;
 +
            }
 +
        }
  
// Создание файла и открытие его в режиме чтения
+
    }
fopen_s(&F, FileName, "rt");
 
  
// Количество точек
+
    void operator +(func Q)//перегрузка оператора +
fscanf(F, "%d", &N);
+
    {
// Шаг функции
+
        sum(Q);
fscanf(F, "%lf", &Step);
+
    }
// Начальная координата по X
 
fscanf(F, "%lf", &MinX);
 
// Конечная координата по X
 
fscanf(F, "%lf", &MaxX);
 
 
// Выделение памяти под массив точек
 
mas = new vec[N];
 
  
// Заполнение массива точек из файла
+
    void sum (func Q)//функция суммирования функций на интерполированном шаге
for (int i = 0; i < N; ++i)
+
    {  double m, p = (b-a)/c;
{
+
    int i;
// Заполнение по X
+
        R=new double[d+2];
fscanf(F, "%lf", &mas[i].X);
+
          if (b > (d*c+a)) d += 2; //в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
// Заполнение по Y
+
        else d += 1;
fscanf(F, "%lf", &mas[i].Y);
+
    m=a;
}
+
cerr<<"\n";
  
// Закрытие файла
+
        for(i = 0; i <d-1; ++i)//цикл суммирования функций и вывода значений суммы, функций и иксов
fclose(F);
+
        {
} /* End of 'LoadArray' function */
 
  
/* Fill mas function */
+
            cerr <<"YFirst: "<< F[i] << "  ";
// Заполнение массива координат точек с цветом
+
            cerr << "YSecond: "<< Q.F[i] << "  ";
void graph::Fill( double(*f)(double) )
+
            R[i] = F[i] + Q.F[i];
{
+
            cerr << "Ysum: "<< R[i] << "  ";
// Выделение памяти под массив точек
+
            cerr << "X:" << m << '\n';
mas = new vec[N];
 
// Выделение памяти под массив цветов
 
Color = new vec[N];
 
  
// Заполнение массивов
+
            m=m+c;
for (int i = 0; i < N; i++)
+
        }
{
+
  for(i = 0; i <d-1; ++i)
mas[i] = vec(MinX + i * Step, f(MinX + i * Step));
+
        {Q.F[i]=R[i];
Color[i] = vec::Rnd();
+
}
}
+
        cerr << " " << endl;
} /* End of 'Fill' function */
+
    }
  
/* Draw graph function */
+
double interp( double pnt/*новый шаг*/, func Q)//функция для интерполяции функции
// Рисование заполненного графика на экран
+
    {double p,h,i,w,*X,aApr,bApr,X2sm,XYsm,Xsm/*хранит сумму интерполированных иксов*/,Ysm/*хранит сумму интерполированных игреков*/;
void graph::Draw( void )
+
    int q,k,l,o;
{
+
    p=(b-a)/pnt+1;
  // Задача размер точки
+
    q=int(p);
glPointSize(1);
+
    R=new double [q];
// Рисование
+
    X=new double [q];
glBegin(GL_POINTS);
 
for (int i = 0; i < N; i++)
 
glVertex2d(mas[i].X, mas[i].Y);
 
glEnd();
 
} /* End of 'Draw' function */
 
  
/* Draw graph function */
+
    l=0;
// Рисование не заполненного еще графика на экран
+
    k=0;
void graph::Draw( double(*f)(double) )
 
{
 
// Заполнение массива
 
graph::Fill(f);
 
  
// Задача цвета и размера точки
+
    for(h=a/*начало функции*/; h<=b/*конец функции*/; h=h+c/*старый шаг*/) //шагает по нормальному шагу
glColor3d(0, 0, 0);
+
    {
glPointSize(1);
+
        for(i=a-1; i<=b; i=i+pnt/*новый шаг*/)
// Рисование
+
          if((i>h)&&(i<=(h+c)))//проверяет лежит ли новый шаг между точками старого
glBegin(GL_POINTS);
+
            {  R[k]=(Q.F[l]-Q.F[l-1])*(i-h)/c+Q.F[l-1];//формула интерполяции
for (int i = 0; i < N; i++)
+
                cout<<"\n"<<"Yinter: "<<R[k]<<"  "<<"X: "<<i-1;//вывод интерполированных значений и иксов
glVertex2d(mas[i].X, mas[i].Y);
+
                X[k]=i-1;
glEnd();
+
                k++;
} /* End of 'Draw' function */
+
            }
 +
        l++;
 +
    }
 +
    cout<<"\n";
 +
    cout<<"\n";
 +
    cout<<"\n";
 +
    //обнуление значений сумм для МНК
 +
    Xsm=0;
 +
    Ysm=0;
 +
    XYsm=0;
 +
    X2sm=0;
  
/* Interpolation draw graph function */
+
    for(o=0;o<=k;o++)//цикл подготавливает суммы для МНК
// Рисование интерполированного графика на экран
+
        {Xsm+=X[o];
void graph::Interpolation_Draw( double i_step )
+
        Ysm+=R[o];
{
+
        XYsm+=X[o]*R[o];
// Коэффициент Катмулл-Рома
+
        X2sm+=X[o]*X[o];
double alpha = 1.0 / 6;
+
        }
+
 
// Кубическая интерполяция кривыми Безье
+
aApr=(k*XYsm-Xsm*Ysm)/(k*X2sm-Xsm*Xsm);//находим коэфициенты по МНК
for (int i = 0; i < N - 1; i++)
+
bApr=(Ysm-a*Xsm)/k;
{
+
cout<<"\n"<<"aAprox"<<a<<"  "<<"bAprox"<<b<<"\n";//выводим их
// Создание 4 точек для интерполяции по ним
+
for(o=0;o<k;o++)
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
+
        {c=aApr*X[o]+bApr;//считаем значение Y при данных коэфициентах
vec Color0 = mas[i], Color1, Color2, Color3 = mas[i + 1];
+
        cout<<"YAprox: "<<c<<" "<<"X:"<<X[o]<<"\n" ;
 +
        }
 +
 
 +
 
 +
    return 0;}
 +
};
  
// Значения для первого и последнего отрезков
+
int main(){
if (i == 0)
+
    double x, xn, s1,pnt;
{
+
    cout << "Input the beginning of the function: " << endl;
P1 = (mas[1] - mas[0]) * alpha + mas[0];
+
    cin >> x;
Color1 = (mas[1] - mas[0]) * alpha + mas[0];
+
    cout << "Input the ending of the function: " << endl;
}
+
    cin >> xn;
else
+
    cout << "Input step for the function: " << endl;
{
+
    cin >> s1;
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
+
    func H(x,xn,s1);
Color1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
+
    H.first();
}
+
    func G(x,xn,s1);
if (i == N - 2)
+
    G.second();
{
+
    H+G;
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
+
    cout<<"\n" << "Input new step for the function: " << endl;
Color2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
+
    cin >> pnt;
}
+
    H.interp(pnt,G);
else
+
 
{
+
return 0;}
P2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
+
</syntaxhighlight>
Color2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
+
</div>
}
 
  
glLineWidth(2);
 
glBegin(GL_LINE_STRIP);
 
for (double t = 0; t <= 1; t += i_step)
 
{
 
vec p, color;
 
  
// Вычисление точки интерполированного графика по 4 точкам
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
p = P0 * (1 - t) * (1 - t) * (1 - t) + P1 * 3 * (1 - t) * (1 - t) * t + P2 * 3 * (1 - t) * t * t + P3 * t * t * t;
+
'''[[Рубинова Раиса]]'''
color = Color0 * (1 - t) * (1 - t) * (1 - t) + Color1 * 3 * (1 - t) * (1 - t) * t + Color2 * 3 * (1 - t) * t * t + Color3 * t * t * t;
 
  
// Рисование
+
'''Описание программы''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции.
glColor3d(color.X / 10, 0, color.Y);
 
glVertex2d(p.X, p.Y);
 
}
 
glEnd();
 
}
 
} /* End of 'Interpolation_Draw' function */
 
  
/* Interpolation graph function */
+
'''Инструкция к программе''':
// Интерполяция графика
+
1. Пользователь вводит параметры первой функции
graph graph::Interpolation( double i_step )
+
2. Пользователь вводит параметры второй функции (при этом шаг второй функции меньше шага первой)
{
+
3. Происходит интерполяция первой функции по второй
graph G_New;
+
4. Пользователь выбирает арифметическую операцию
// Коэффициент Катмулл-Рома
+
5. При желании пользователь может выполнить аппроксимацию полученного результата
double alpha = 1.0 / 6;
 
  
// Заполнение параметров для нового графика
 
G_New.MinX = MinX;
 
G_New.MaxX = MaxX;
 
G_New.Step = Step * i_step;
 
G_New.N = (int)((G_New.MaxX - G_New.MinX) / G_New.Step);
 
G_New.mas = new vec[G_New.N];
 
 
// Кубическая интерполяция кривыми Безье
 
for (int i = 0; i < N - 1; i++)
 
{
 
// Создание 4 точек для интерполяции по ним
 
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
 
 
// Значения для первого и последнего отрезков
 
if (i == 0)
 
P1 = (mas[1] - mas[0]) * alpha + mas[0];
 
else
 
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
 
if (i == N - 2)
 
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
 
else
 
P2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
 
 
for (double t = 0; t <= 1; t += i_step)
 
{
 
vec p;
 
  
// Вычисление точки интерполированного графика по 4 точкам
+
Скачать можно [http://tm.spbstu.ru/File:Funcc.rar тут].
G_New.mas[(int)((t + i) / i_step)] = P0 * (1 - t) * (1 - t) * (1 - t) + P1 * 3 * (1 - t) * (1 - t) * t + P2 * 3 * (1 - t) * t * t + P3 * t * t * t;
 
}
 
}
 
  
return G_New;
 
} /* End of 'Interpolation' function */
 
  
/* Sum of 2 graphics function */
+
<div class="mw-collapsible-content">
// Сложение двух графиков
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
graph graph::operator+( graph &G )
+
#ifndef FUNC_H
{
+
#define FUNC_H
graph G_New, G1, G2;
 
int i, j;
 
  
// Заполнение параметров графика суммы
 
G_New.MinX = (MinX >= G.MinX) ? MinX : G.MinX;
 
G_New.MaxX = (MaxX <= G.MaxX) ? MaxX : G.MaxX;
 
G_New.Step = Step * G.Step;
 
G_New.N = (int)((G_New.MaxX - G_New.MinX) / G_New.Step);
 
G_New.mas = new vec[G_New.N];
 
  
// Интерполяция слагаемых графиков, для приведение к общему шагу
+
class Func
G1 = Interpolation(G.Step);
+
{
G2 = G.Interpolation(Step);
+
    public:
 
+
        Func(double a1, double b1, double c1);
// Поиск общего начала и конца графиков
+
        virtual ~Func();
for (i = 0; i < G1.N; i++)
+
        void DefFunc ();    // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
if (fabs(G1.mas[i].X - G_New.MinX) <= Threshold)
+
        void PluFunc (Func D); // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
break;
+
        void operator +(Func D); // перегрузка оператора '+'
 +
        void MinFunc (Func D);  // функция, линейно вычитающая значения второй функции из значений первой функции
 +
        void operator -(Func D); // перегрузка оператора '-'
 +
        void UmnFunc (Func D); // функция, линейно переумножающая значения функций
 +
        void operator *(Func D); // перегрузка оператора '*'
 +
        void DelFunc (Func D);  // функция, линейно делящая значения первой функци на значения второй функции
 +
        void operator /(Func D);  // перегрузка оператора '/'
 +
        void In (Func D);  // функция, интерполирующая первую функцию по второй
 +
        void App (); // функция, аппроксимирующая полученную в результате сложения/вычитания/деления/умножения двух функций функцию
 +
        void Viv ();  // Функция вывода на экран значений
 +
    protected:
 +
    private:
 +
        double a,b,c;
 +
        int j,z;
 +
        double *A,*B;
 +
};
 +
 
 +
#endif // FUNC_H
  
for (j = 0; j < G2.N; j++)
 
if (fabs(G2.mas[j].X - G_New.MinX) <= Threshold)
 
break;
 
  
// Заполнение графика суммы
 
for (int k = 0; k < G_New.N; k++)
 
{
 
G_New.mas[k].X = G_New.MinX + k * G_New.Step;
 
G_New.mas[k].Y = G1.mas[i + k].Y + G2.mas[j + k].Y;
 
}
 
  
return G_New;
+
#include "Func.h"
} /* End of 'Sum' function */
+
#include <fstream>
 +
#include <iostream>
 +
#include <math.h>
  
/* Save Array of points function */
+
Func::Func(double a1, double b1, double c1):a(a1),b(b1),c(c1)  // конструктор для класса Func, создающий объект данного класса, определенный тремя значениями, введенными пользователем
// Сохранение графика в файл по точкам
 
void graph::SaveArray( void )
 
 
{
 
{
// Создание указателя на тип FILE
+
    double d=(b-a)/c;  // расчет количества элементов, определяющих функцию
FILE *F;
+
    j=floor(d);   // созданной целочисленной переменной присваивается значение, равное целой части числа, рассчитанного выше, с округлением в меньшую сторону
 +
    A = new double [j+1];  // создание массива
 +
}
  
// Создание файла и открытие его в режиме записи
+
Func::~Func()  // деструктор для класса Func
fopen_s(&F, "graph.txt", "wt");
+
{
 +
    //dtor
 +
}
  
/* Запись в файл данных */
+
void Func::Viv ()  // Функция вывода на экран значений
// Количество точек
+
{
fprintf(F, "%d\n", N);
+
    std::cout << "x ";
// Шаг функции
+
    for (int z=0; z<=j; ++z)
fprintf(F, "%lf\n", Step);
+
    {
// Начальная координата по X
+
        std::cout << z+1 << " ";
fprintf(F, "%lf\n", MinX);
+
    }
// Конечная координата по X
+
}
fprintf(F, "%lf\n", MaxX);
 
  
// Координаты всех точек
+
void Func::DefFunc ()  // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
for (int i = 0; i < N; ++i)
+
{
  fprintf(F, "%lf %lf ", mas[i].X, mas[i].Y);
+
    double x;  // создание переменной, используемой для расчета значений функции
 +
    for(int i=0; i<=j; ++i) // создание цикла, рассчитывающего j элементов
 +
    {
 +
        x =i*c+a;  // задание значения перемнной x, определенной выше
 +
        A[i]=x*x;  // задание значения самой функции (при этом в данной ситуации нам неважно, как именно задается функция, ее значения могут быть определены любым способом, от этого алгоритм не меняется)
 +
        std::cerr << A[i] << " ";   // вывод на экран значения функции
 +
    }
 +
}
  
// Закрытие файла
+
void Func::PluFunc (Func D)   // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
fclose(F);
 
} /* End of 'SaveArray' function */
 
 
 
/* Approximation of function function */
 
// Аппроксимация графика
 
void graph::Approximation( void )
 
 
{
 
{
double k, b, s1 = 0, s2 = 0, s3 = 0, s4 = 0;
+
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
 
+
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
// Линейная аппроксимация
+
    {
for (int i = 0; i < N; i++)
+
        B[i]=B[i]+D.A[i];   // сложение значений двух функций для одного и того же значения переменной
{
+
    }
if (fabs(mas[i].X) < MAX && fabs(mas[i].Y) < MAX)
+
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
{
+
    {
s1 += mas[i].X * mas[i].Y;
+
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
s2 += mas[i].X;
+
    }
s3 += mas[i].X * mas[i].X;
+
    out.close();    // закрытие файла после записи в него значений
s4 += mas[i].Y;
+
    D.Viv();
}
+
    std::cout << std::endl << "y ";
}
+
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
 
+
    {
k = (N * s1 - s2 * s4) / (double(N) * s3 - s2 * s2);
+
        std::cout << B[i] << " ";
b = (s4 - k * s2) / double(N);
+
    }
 
+
}
// Задача цвета и ширины линии
+
void Func::operator +(Func D)  // перегрузка оператора '+'
glColor3d(1, 0.5, 0);
+
{
glLineWidth(1);
+
    PluFunc(D);                        // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1+f2 будет работать аналогично записи f1.PluFunc(f2)
// Рисование
+
}
glBegin(GL_LINE_STRIP);
+
void Func::MinFunc (Func D)   // функция, линейно вычитающая значения второй функции из значений первой функции
glVertex2d(MinX, MinX * k + b);
+
{
glVertex2d(MaxX, MaxX * k + b);
+
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
glEnd();
+
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
} /* End of 'Approximation' function */
+
    {
 
+
        B[i]=B[i]-D.A[i];   // вычитание значений второй функций из значений первой для одного и того же значения переменной
/* End of 'GRAPH.CPP' file */
+
    }
</syntaxhighlight>
+
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
"'''GRAPH.H'''"
+
    {
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
/* FILENAME: GRAPH.H
+
    }
  * LAST UPDATE: 17.01.2016
+
    out.close();    // закрытие файла после записи в него значений
*/
+
    D.Viv();
 
+
    std::cout << std::endl << "y ";
#ifndef _GRAPH_H_
+
    for (int i=0; i<=D.j; ++i) // аналогичный предыдущему цикл, выводящий значения на экран
#define _GRAPH_H_
+
    {
 
+
        std::cout << B[i] << " ";
#define _CRT_SECURE_NO_WARNINGS
+
    }
 
+
}
#include <iostream>
+
void Func::operator -(Func D)  // перегрузка оператора '-'
#include <stdio.h>
+
{
#include <stdlib.h>
+
    MinFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1-f2 будет работать аналогично записи f1.MinFunc(f2)
#include <math.h>
+
}
#include <time.h>
+
void Func::UmnFunc (Func D)    // функция, линейно переумножающая значения функций
#include <GL\glut.h>
 
 
 
#define MAX 100
 
 
 
using namespace std;
 
 
 
/* Useful constants */
 
const double Threshold = 1e-10;
 
const double Infinity = 1e+10;
 
 
 
/* Vector representation type */
 
class vec
 
 
{
 
{
public:
+
    std::ofstream out("zap.txt");    // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
double X, Y;
+
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
 
+
    {
/* Default constructor */
+
        B[i]=B[i]*D.A[i];  // умножение значений первой функций на значенийя второй для одного и того же значения переменной
vec( void )
+
    }
{
+
    for (int i=0; i<=D.j; ++i)     // создание цикла, рассчитанного на то же количество раз, что и предыдущий
}
+
    {
 
+
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
/* Class constructor */
+
    }
vec( double A ) : X(A), Y(A)
+
    out.close();    // закрытие файла после записи в него значений
{
+
    D.Viv();
}
+
    std::cout << std::endl << "y ";
 
+
    for (int i=0; i<=D.j; ++i)   // аналогичный предыдущему цикл, выводящий значения на экран
/* Class constructor */
+
    {
vec( double A, double B ) : X(A), Y(B)
+
        std::cout << B[i] << " ";
{
+
    }
}
+
}
 
+
void Func::operator *(Func D)  // перегрузка оператора '*'
static double R0( void )
+
{
{
+
    UmnFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1*f2 будет работать аналогично записи f1.UmnFunc(f2)
return rand() / (double)RAND_MAX;
+
}
} /* End of 'R0' function */
+
void Func::DelFunc (Func D)   // функция, линейно делящая значения первой функци на значения второй функции
 
+
{
static vec Rnd( void )
+
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
{
+
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
return vec(R0(), R0());
+
    {
} /* End of 'Rnd' function */
+
        B[i]=B[i]/D.A[i];       // деление значений первой функций на значенийя второй для одного и того же значения переменной
 
+
    }
/* The functions of operations on vectors */
+
    for (int i=0; i<=D.j; ++i)      // создание цикла, рассчитанного на то же количество раз, что и предыдущий
 
+
    {
/* Vector = vector function */
+
        out << B[i] << '\n';        // запись значений, полученных в предыдущем цикле, в файл
vec operator=( vec &B )
+
    }
{
+
    out.close();    // закрытие файла после записи в него значений
X = B.X;
+
    D.Viv();
Y = B.Y;
+
    std::cout << std::endl << "y ";
 
+
    for (int i=0; i<=D.j; ++i)     // аналогичный предыдущему цикл, выводящий значения на экран
return B;
+
    {
} /* end of 'operator+' function */
+
        std::cout << B[i] << " ";
 
+
    }
/* Vector add vector function */
+
}
vec operator+( const vec &B ) const
+
void Func::operator /(Func D)  // перегрузка оператора '/'
{
+
{
return vec(X + B.X, Y + B.Y);
+
    DelFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1/f2 будет работать аналогично записи f1.DelFunc(f2)
} /* end of 'operator+' function */
+
}
 
+
void Func::In (Func D)      // функция, интерполирующая первую функцию по второй
/* Vector sub vector function */
+
{
vec operator-( const vec &B ) const
+
    double l=c/D.c;    // создаем переменную, которой присваиваем значение, обозначающее, во сколько раз один шаг больше другого
{
+
    c=D.c;      // приводим больший шаг к меньшему значению
return vec(X - B.X, Y - B.Y);
+
    z=D.j+1;   // ранее созданной переменной присваиваем значение, равное количеству элементов плюс один
} /* end of 'operator-' function */
+
    int p=l;    // создаем целочисленную переменную, равную переменной l
 
+
    B = new double [D.j+2];     // создание массива с количеством элементов D.j+2
vec operator-( void ) const
+
    D.Viv(); std::cout << std::endl << "y ";
{
+
    B[0]=A[0]; std::cerr << B[0] << " ";   // присваиваем первому элементу нового массива значение первого элемента старого массива и выводим его на экран
return vec(-X, -Y);
+
    int k=0;    // создаем вспомогательную целочисленную переменную
} /* end of 'operator-' function */
+
    for (int i=0; i<=j; i+=p)  // создаем цикл, рассчитанный на j повторов через p
 
+
    {
/* Vector mul number function */
+
        for (int m=1; m<p; ++m)    // создание цикла, выссчитывавшего промежуточное значение
vec operator*( const double N ) const
+
        {B[i+m]=((A[k]+A[k+1])/p)*(l-m); std::cerr << B[i+m] << " ";}  // присваиваем (i+m)-ому элементу значение, выссчитанного по формуле через заданные изначально значения и вывод егона экран
{
+
        B[i+p]=A[k+1];      // присваивание значению (i+p)-ого элемента нового массива значения (k+1)-ого элемента старого массива
return vec(X * N, Y * N);
+
        std::cerr << B[i+p] << " ";    // вывод высчитанного выше значения на экран
} /* end of 'operator*' function */
+
        k=k+1; // увеличение k на единицу
 +
    }
 +
}
 +
void Func::App ()  // функция, аппроксимирующая полученную в результате сложения/вычитания/деления/умножения двух функций функцию
 +
{
 +
    double d=0,e=0,f=0,g=0;    // создание переменных
 +
    double k=0,l=0;    // создание переменных
 +
    for (int i=0; i<z; ++i)     // цикл, который высчитывает сумму произведений зависимой и независимой переменных
 +
        {d=i*B[i]+d;}
 +
    for (int i=0; i<z; ++i)    // цикл, который высчитывает сумму всех значений функции
 +
        {e=B[i]+e;}
 +
    for (int i=0; i<z; ++i)    // цикл, высчитывающий сумму всех аргументов функции
 +
        {f=i+f;}
 +
    for (int i=0; i<z; ++i)     // цикл, высчитывающий сумму квадратов всех аргументов функции
 +
        {g=i*i+g;}
 +
    k=(z*d-f*e)/(z*g-f*f);     // расчет углового коэффициента прямой
 +
    l=(e-k*f)/z;        // расчет свободного коэффициента прямой
 +
    std::cout << "y=" << k << "x+" << l;    // вывод уравнения полученной прямой на экран
 +
    std::ofstream out("ap.txt");        // запись полученного уравнения в файл
 +
    {
 +
        out << "y=" << k << "x+" << l;
 +
    }
 +
    out.close();
 +
}
  
/* Vector div number function */
 
vec operator/( const double N ) const
 
{
 
return vec(X / N, Y / N);
 
} /* end of 'operator/' function */
 
  
/* Vector dot vector function */
 
double operator&( const vec &B ) const
 
{
 
return double(X * B.X + Y * B.Y);
 
} /* end of 'operator&' function */
 
  
vec & operator+=( const vec &B )
+
#include <iostream>
{
+
#include <fstream>
X += B.X;
+
#include "Func.h"
Y += B.Y;
 
  
return *this;
+
using namespace std;
} /* end of 'operator+=' function */
+
double m,n,o, m1, n1, o1;
 +
int a;
 +
char b;
  
vec & operator-=( const vec &B )
+
int main()
{
+
{
X -= B.X;
+
    cout << "Enter the beginning, the end and the step of a function." << endl; // ввод опорных значений первой функции: начало, конец, шаг;
Y -= B.Y;
+
    cin >> m >> n >> o; // считывание значений
 
+
    cout << "Enter the beginning, the end and the step of another function." << endl; // ввод опорных значений второй функции: начало, конец, шаг;
return *this;
+
    cin >> m1 >> n1 >> o1; // считывание значений
} /* end of 'operator-=' function */
+
    Func F(m,n,o); // создание объекта класса Func, определяющий первую функцию
 
+
    cout << "The first function is" << endl; F.Viv(); cout << endl << "y ";
vec & operator*=( const double N )
+
    F.DefFunc(); // определение первой функции через создание массива с ее значениями
{
+
    cout << endl;
X *= N;
+
    Func F1(m1,n1,o1); // создание объекта класса Func, определяющий вторую функцию
Y *= N;
+
    cout << "The second function is" << endl; F1.Viv(); cout << endl << "y ";
 
+
    F1.DefFunc(); // определение второй функции через создание массива с ее значениями
return *this;
+
    cout << endl;
} /* end of 'operator*=' function */
+
    cout << "As two functions have different steps, we made the interpolation of the first function." << endl;
 
+
    F.In(F1); // линейная интерполяция первой функции по второй
vec & operator/=( const double N )
+
    cout << endl;
{
+
    cout << "What do you want to do with these functions?" << '\n' << "Enter 1 to sum them;" << '\n' << "Enter 2 to subtract the second from the first;" << '\n' << "Enter 3 to multiply them;" << '\n' << "Enter 4 to divide first by second" << endl;
X /= N;
+
    cin >> a;
Y /= N;
+
    if (a==1)
 +
    {cout << "Function 1 + function 2 =" << '\n'; F+F1;}  // сложение двух функций с одинаковым шагом и интервалом
 +
    else if (a==2)
 +
    {cout << "Function 1 - function 2 =" << '\n'; F-F1;}  // вычитание двух функций с одинаковым шагом и интервалом
 +
    else if (a==3)
 +
    {cout << "Function 1 * function 2 =" << '\n'; F*F1;}  // умножение двух функций с одинаковым шагом и интервалом
 +
    else if (a==4)
 +
    {cout << "Function 1 / function 2 =" << '\n'; F/F1;}   // деление двух функций с одинаковым шагом и интервалом
 +
    cout << endl;
 +
    cout << "Enter 5 to do the approximation of the result function" << endl;  // пользователь сам выбирает, выполнять ли аппроксимацию;
 +
    cout << "Otherwise enter 6 to quit" << endl;
 +
    cin >> a;
 +
    if (a==5)
 +
    {cout << "Appromaximation:" << endl;
 +
    F.App();}  // аппроксимация
 +
    return 0;
 +
}
  
return *this;
+
</syntaxhighlight>
} /* end of 'operator/=' function */
+
</div>
  
double operator!( void ) const
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
{
+
'''[[Савельева Ольга]]'''
return double(X * X + Y * Y);
+
} /* end of 'operator!' function */
+
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
 +
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
//Бибилотека необходимая для возможности включения русского языка в консоли
 +
#include <locale.h>
  
/* Access vector components by index function */
+
class fun
double operator[]( const int i ) const
+
{
{
+
/*
switch (i)
+
fx - массив с дискретными значениями функции
{
+
a - начало отрезка определения функции
case 0:
+
b - конец отрезка определения функции
return double(X);
+
dx - шаг
case 1:
+
*/
return double(Y);
+
double *fx, a, b, dx;
}
+
//Чтобы очусть ошибки округления в вещественных числах при сравнениях используется константа eps.
} /* end of 'operator[]' function */
+
//К примеру два вещественных числа x и y сравниваются не так x>=y, а так x-y>=-eps.
 +
const double eps = 1e-10; //1e-10 это тоже самое что 0.0000000001
  
/* Normalizing vector function */
+
public:
vec & Normalize( void )
+
//Коструктор по умолчанию
{
+
fun();
double len = !*this;
+
//Конструктор копирования
 +
fun(fun &tmp);
 +
//Деструктор
 +
~fun();
  
if (len != 1 && len != 0)
+
//Перегруженные операторы. Ключевое слово const в конце означает, что объект от которого вызвается метод не изменяется
*this /= sqrt(len);
+
const fun operator+(const fun& right) const;
return *this;
+
const fun operator-(const fun& right) const;
} /* end of 'Normalize' function */
+
const fun operator*(const fun& right) const;
}; /* end of 'vec' class */
+
const fun operator/(const fun& right) const;
 +
const fun& operator=(const fun& right);
  
/* Graph class */
+
//Метод считывания из файла
class graph
+
void readFile(const char *path);
{
+
//Метод вывода в файл
public:
+
void writeFile(const char *path);
double MinX, MaxX, Step; // Начальная координата по X; Конечная координата по X; Шаг функции
 
int N; // Количество точек
 
vec *mas, *Color; // Массивы точек и цветов
 
  
/* Default constructor */
+
//Метод изменения шага
graph( void )
+
void changeDx(double newDx);
{
+
//Метод вычисления значения в заданной точке
MinX = -10, MaxX = 10, Step = 0.1, N = 200;
+
double getX(double x1);
}
+
};
  
/* Class constructor */
+
//В конструкторе по умолчанию все просто.
graph( double _MinX, double _MaxX, double _Step ) : MinX(_MinX), MaxX(_MaxX), Step(_Step)
+
fun::fun()
{
+
{
N = (int)((MaxX - MinX) / Step);
+
a = b = dx = 0;
// Выделение памяти
+
fx = NULL;
mas = new vec[N];
+
}
Color = new vec[N];
 
}
 
  
/* Load Array of points function */
+
//Конструктор копирования
void LoadArray( char *FileName );
+
fun::fun(fun &tmp)
 
+
{
/* Fill mas function */
+
int i, n;
void Fill( double(*f)(double) );
+
//Копирование свойств объекта tmp в текущий объект
 +
a = tmp.a;
 +
b = tmp.b;
 +
dx = tmp.dx;
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Выделение необходимой памяти для хранения дискретных значений
 +
fx = new double[n];
 +
//Копирование дискретных значений объекта tmp в текущий объект
 +
for (i = 0; i<n; ++i)
 +
fx[i] = tmp.fx[i];
 +
}
  
/* Draw graph function */
+
//Деструктор
void Draw( double(*f)(double) );
+
fun::~fun()
 +
{
 +
//Освобождение памяти выделенной для массива дискретных значений
 +
if (fx != NULL) delete[] fx;
 +
}
 +
//Оператор сложения.
 +
const fun fun::operator+(const fun& right) const
 +
{
 +
//Создание результирующего объекта
 +
fun result;
 +
int i, n;
 +
//Копирование свойств в результирующий объект
 +
result.dx = dx;
 +
result.a = a;
 +
result.b = b;
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Выделение необходимой памяти для хранения дискретных значений
 +
result.fx = new double[n];
 +
//Вычисление дискретных значений результирующего объекта
 +
for (i = 0; i<n; ++i)
 +
result.fx[i] = fx[i] + right.fx[i];
  
/* Draw graph function */
+
//Возвращение результата
void Draw( void );
+
return result;
 +
}
  
/* Interpolation draw graph function */
+
//Этот оператор аналогичен оператору сложение
void Interpolation_Draw( double i_step );
+
const fun fun::operator-(const fun& right) const
 +
{
 +
fun result;
 +
int i, n;
 +
result.dx = dx;
 +
result.a = a;
 +
result.b = b;
 +
n = (b - a) / dx + 1;
 +
result.fx = new double[n];
 +
for (i = 0; i<n; ++i)
 +
result.fx[i] = fx[i] - right.fx[i];
  
/* Interpolation graph function */
+
return result;
graph Interpolation( double i_step );
+
}
  
/* Sum of 2 graphics function */
+
//Этот оператор аналогичен оператору сложение
graph operator+( graph &G );
+
const fun fun::operator*(const fun& right) const
 +
{
 +
fun result;
 +
int i, n;
 +
result.dx = dx;
 +
result.a = a;
 +
result.b = b;
 +
n = (b - a) / dx + 1;
 +
result.fx = new double[n];
 +
for (i = 0; i<n; ++i)
 +
result.fx[i] = fx[i] * right.fx[i];
  
/* Save Array of points function */
+
return result;
void SaveArray( void );
+
}
  
/* Approximation of function function */
+
//Этот оператор аналогичен оператору сложение
void Approximation( void );
+
const fun fun::operator/(const fun& right) const
}; /* end of 'graph' class */
+
{
 
+
fun result;
#endif /* _GRAPH_H_ */
+
int i, n;
 +
result.dx = dx;
 +
result.a = a;
 +
result.b = b;
 +
n = (b - a) / dx + 1;
 +
result.fx = new double[n];
 +
for (i = 0; i<n; ++i)
 +
result.fx[i] = fx[i] / right.fx[i];
  
/* End of 'GRAPH.H' file */
+
return result;
</syntaxhighlight>
+
}
</div>
 
[http://tm.spbstu.ru/File:T05GRAPH.7z Скачать архив]
 
<br>
 
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
//Оператор присваивания
'''[[Рубинова Раиса]]'''
+
const fun& fun::operator=(const fun& right)
 +
{
 +
//Проверка на самоприсваивание
 +
if (this == &right)
 +
//Возвращение в качестве результата текущий объект
 +
return *this;
  
'''Описание программы''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции.
 
  
'''Инструкция к программе''':
+
int i, n;
1. Пользователь вводит параметры первой функции
+
//Присваивание свойств объекта right текущему объекту
2. Пользователь вводит параметры второй функции (при этом шаг второй функции меньше шага первой)
+
a = right.a;
3. Происходит интерполяция первой функции по второй
+
b = right.b;
4. Пользователь выбирает арифметическую операцию
+
dx = right.dx;
5. При желании пользователь может выполнить аппроксимацию полученного результата
+
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
 +
if (fx != NULL) delete[] fx;
 +
//Выделение необходимой памяти для хранения дискретных значений
 +
fx = new double[n];
  
 +
//Копирование дискретных значений объекта right в текущий объект
 +
for (i = 0; i<n; ++i)
 +
fx[i] = right.fx[i];
  
Скачать можно [http://tm.spbstu.ru/File:Funcc.rar тут].
+
//Возвращение в качестве результата текущий объект
 +
return *this;
 +
}
  
 +
/*
 +
Метод считывания из файла
 +
path - путь к файлу из которого считывать
 +
*/
  
<div class="mw-collapsible-content">
+
void fun::readFile(const char *path)
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
{
#ifndef FUNC_H
+
//Открытие файла для считывания
#define FUNC_H
+
FILE *in = fopen(path, "r");
 +
int i, n;
 +
//Считывание границ отрезка и шага из файла
 +
fscanf(in, "%lf%lf%lf", &a, &b, &dx);
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
 +
if (fx != NULL) delete[] fx;
 +
//Выделение необходимой памяти для хранения дискретных значений
 +
fx = new double[n];
 +
//Считывание дискретных значений из файла
 +
for (i = 0; i<n; ++i) fscanf(in, "%lf", &fx[i]);
 +
//Закрытие файла
 +
fclose(in);
 +
}
  
 +
/*
 +
Метод вывода в файл
 +
path - путь к файлу в который нужно вывести
 +
*/
  
class Func
+
void fun::writeFile(const char *path)
 
{
 
{
    public:
+
//Открытие файла для вывода
        Func(double a1, double b1, double c1);
+
FILE *out = fopen(path, "w");
        virtual ~Func();
+
int i, n;
        void DefFunc ();   // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
+
double x = a;
        void PluFunc (Func D)// функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
+
//Вычисление количества дискретных значений
        void operator +(Func D); // перегрузка оператора '+'
+
n = (b - a) / dx + 1;
        void MinFunc (Func D); // функция, линейно вычитающая значения второй функции из значений первой функции
+
//Вывод информации о отрезке и шаге в файл
        void operator -(Func D); // перегрузка оператора '-'
+
fprintf(out, "[%.5lf, %.5lf] dx=%.5lf\n", a, b, dx);
        void UmnFunc (Func D); // функция, линейно переумножающая значения функций
+
//Последовательный вывод пары (точка, значение в точке) в файл
        void operator *(Func D);  // перегрузка оператора '*'
+
for (i = 0; i<n; ++i, x += dx)
        void DelFunc (Func D);  // функция, линейно делящая значения первой функци на значения второй функции
+
fprintf(out, "x=%.5lf f(x)=%.5lf\n", x, fx[i]);
        void operator /(Func D);  // перегрузка оператора '/'
+
//Закрытие файла
        void In (Func D);   // функция, интерполирующая первую функцию по второй
+
fclose(out);
        void App (); // функция, аппроксимирующая полученную в результате сложения/вычитания/деления/умножения двух функций функцию
+
}
        void Viv ();  // Функция вывода на экран значений
 
    protected:
 
    private:
 
        double a,b,c;
 
        int j,z;
 
        double *A,*B;
 
};
 
  
#endif // FUNC_H
+
/*
 
+
Метод изменения величины шага
 
+
*/
 
+
void fun::changeDx(double newDx)
#include "Func.h"
+
{
#include <fstream>
+
int i, j, n, newN;
#include <iostream>
+
double *newFx, x, newX, x1, y1, x2, y2, K, B;
#include <math.h>
+
//Вычисление количества старых дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Вычисление количества новых дискретных значений
 +
newN = (b - a) / newDx + 1;
 +
//Выделение памяти под новые дискретные значения
 +
newFx = new double[newN];
 +
//Определение первой точки в которой вычисляется новое дискретное значение
 +
newX = a;
 +
//Переменная которая бежит по старым дискретным значениям
 +
i = 0;
 +
//Определение первой точки в которой вычисляется старое дискретное значение
 +
x = a;
 +
//Цикл для формирования новых дискретных значений
 +
for (j = 0; j<newN; ++j, newX += newDx)
 +
{
 +
//В цикле находим отрезок где лежит точка в которой нужно вычислить новое дискретное значение
 +
for (; i<n - 1; ++i, x += dx)
 +
//Если без eps, то сравнения такие: x<=newX<=x+dx
 +
if ((newX - x>-eps) && ((x+dx) - newX>-eps))
 +
{
 +
//Линейная интерполяция
 +
x1 = x;
 +
x2 = x + dx;
 +
y1 = fx[i];
 +
y2 = fx[i + 1];
 +
K = (y2 - y1) / (x2 - x1);
 +
B = (y2*x1 - y1*x2) / (x1 - x2);
 +
//Вычисления значения в точке с помощью линейной интерполяции
 +
newFx[j] = newX*K + B;
 +
//Выход из цикла по i
 +
break;
 +
}
 +
}
 +
//Смена величины шага на новый
 +
dx = newDx;
 +
//Удаление старых дискретных значений
 +
delete[] fx;
 +
//Присвоение текущему объекту новых дискретных значений
 +
fx = newFx;
 +
}
  
Func::Func(double a1, double b1, double c1):a(a1),b(b1),c(c1)  // конструктор для класса Func, создающий объект данного класса, определенный тремя значениями, введенными пользователем
+
/*
 +
Метод вычисляет значение в точке xAns с помощью линейной интерполяции.
 +
*/
 +
double fun::getX(double xAns)
 
{
 
{
    double d=(b-a)/c;   // расчет количества элементов, определяющих функцию
+
int i, n;
    j=floor(d);    // созданной целочисленной переменной присваивается значение, равное целой части числа, рассчитанного выше, с округлением в меньшую сторону
+
double x, x1, y1, x2, y2, K, B;
    A = new double [j+1];   // создание массива
+
x = a;
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Ищем отрезок в котором лежит точка xAns
 +
for (i = 0; i<n - 1; ++i, x += dx)
 +
{
 +
//Если без eps, то сравнения такие: x<=newX<=x+dx
 +
if (((x+dx) - xAns>-eps) && (xAns - x>-eps))
 +
{
 +
//Линейная интерполяция
 +
x1 = x;
 +
x2 = x + dx;
 +
y1 = fx[i];
 +
y2 = fx[i + 1];
 +
K = (y2 - y1) / (x2 - x1);
 +
B = (y2*x1 - y1*x2) / (x1 - x2);
 +
//Вычисления значения функции в заданной точке с помощью линейной интерполяции
 +
return K*xAns + B;
 +
}
 +
}
 
}
 
}
  
Func::~Func()   // деструктор для класса Func
+
int main()
 
{
 
{
    //dtor
+
//Включение поддержки русского языка в консоли
}
+
setlocale(LC_ALL, "Russian");
 +
//Объявление трех переменных типа fun
 +
fun a, b, c;
 +
//Считывания первых дискретных значений из файла inputA.txt
 +
a.readFile("inputA.txt");
 +
//Считывания вторых дискретных значений из файла inputB.txt
 +
b.readFile("inputB.txt");
  
void Func::Viv ()   // Функция вывода на экран значений
+
//Первая функция
{
+
a.writeFile("outputA.txt");
    std::cout << "x ";
+
//Вторая функция
    for (int z=0; z<=j; ++z)
+
b.writeFile("outputB.txt");
    {
+
 
        std::cout << z+1 << " ";
+
c = a + b;
    }
+
//Результат сложения двух функций
}
+
c.writeFile("outputAaddB.txt");
 +
 
 +
 
 +
c = a - b;
 +
//Результат вычитания второй функции из первой
 +
c.writeFile("outputAsubB.txt");
  
void Func::DefFunc ()  // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
+
c = a*b;
{
+
//Результат умножения двух функций
    double x;   // создание переменной, используемой для расчета значений функции
+
c.writeFile("outputAmultiB.txt");
    for(int i=0; i<=j; ++i) // создание цикла, рассчитывающего j элементов
 
    {
 
        x =i*c+a;  // задание значения перемнной x, определенной выше
 
        A[i]=x*x;  // задание значения самой функции (при этом в данной ситуации нам неважно, как именно задается функция, ее значения могут быть определены любым способом, от этого алгоритм не меняется)
 
        std::cerr << A[i] << " ";   // вывод на экран значения функции
 
    }
 
}
 
  
void Func::PluFunc (Func D)  // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
+
c = a / b;
{
+
//Результат деления первой функции на вторую
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
c.writeFile("outputAdivB.txt");
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
+
 
    {
+
//У первой функции изменили шаг на 0.5
        B[i]=B[i]+D.A[i];   // сложение значений двух функций для одного и того же значения переменной
+
a.changeDx(0.5);
    }
+
//Вывели её дискретные значения
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
a.writeFile("outputChangeDx.txt");
    {
+
 
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
+
//Функция, которая аппроксимирует её кусочно линейная.
    }
+
//Для примера нашли значение аппроксимируещей функции в точке не совпадающей с дискретными значениями.
    out.close();    // закрытие файла после записи в него значений
+
printf("Значение в точке 1.8 первой функции %.5lf\n", a.getX(1.8));
    D.Viv();
+
 
    std::cout << std::endl << "y ";
+
//Нужно чтобы окно консоли автоматически не закрылось
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
+
system("pause");
    {
+
return 0;
        std::cout << B[i] << " ";
 
    }
 
 
}
 
}
void Func::operator +(Func D)  // перегрузка оператора '+'
+
</syntaxhighlight>
{
+
</div>
    PluFunc(D);                        // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1+f2 будет работать аналогично записи f1.PluFunc(f2)
+
 
}
+
 
void Func::MinFunc (Func D)    // функция, линейно вычитающая значения второй функции из значений первой функции
+
 
{
+
Скачать можно [http://tm.spbstu.ru/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8.zip здесь]
     std::ofstream out("zap.txt")// открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
 
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
+
 
    {
+
'''[[Сенников Иван]]'''
        B[i]=B[i]-D.A[i];   // вычитание значений второй функций из значений первой для одного и того же значения переменной
+
 +
'''Суть программы:''' Программы позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
 +
 
 +
'''Идея:''' Класс работы с функциями содержит такие функции как функция введения данных функции - ее создание, перегрузки оператора сложения, линейных интерполяции и аппроксимации, выделения и освобождения памяти. Линейная интерполяция написана с помощью теории аналитической геометрии на плоскости, а линейная аппроксимация с помощью метода наименьших квадратов.
 +
 
 +
'''Инструкция:''' Программа выполнена в виде меню на английском языке: пользователю будет предоставлена возможность выйти из программы, создать обе функции, а также поработать с ними в индивидуальном порядке и сложить две уже существующие функции. Комментарии к программе написаны также на английском языке.
 +
 
 +
Ссылка для скачиваний: [http://tm.spbstu.ru/Файл:Func.zip здесь].
 +
 
 +
 
 +
'''[[Степанянц Степан]]'''
 +
 +
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.Данныеберутся из файла.
 +
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
 
 +
 
 +
#include <iostream>
 +
#include <vector>
 +
#include <math.h>
 +
#include <fstream>
 +
#include <stdio.h>
 +
#include <string>
 +
#include <time.h>
 +
 +
using namespace std;
 +
 +
class func {
 +
     vector <double> vals;
 +
    double a, b, step, sz;
 +
 +
public:
 +
    func (string fil) { //конструктор для ввода функции из файла
 +
        ifstream f(fil.c_str());
 +
        double a, b, step, y;
 +
        f >> a >> b >> step; //вводим основные значения из файла
 +
        this->step = step;
 +
        this->sz = (int)((b - a) / step + 1); //считаем размер
 +
        this->a = a, this->b = b;
 +
        for (int i = 0; i < this->sz; i++) {
 +
            f >> y;
 +
            this->vals.push_back(y); //считываем и записываем значения из файла
 +
        }
 +
        f.close();
 
     }
 
     }
     for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
     func () {} //еще один конструктор
     {
+
    func operator + (func a) { // эта и ближайшие четыре метода -- калькулятор функций
         out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
+
        func f = *new func(); //создаем новый экземпляр класса, ответ
 +
        for (int i = 0; i < sz; i++) {
 +
            f.vals.push_back(this->vals[i] + a.vals[i]); // складываем покоординатно
 +
        }
 +
        f.step = a.step; // копируем все значения в ответ (возможно, это можно сделать гораздо проще и не писать 4*4 строк но почему-то ничего умнее я не придумал)
 +
        f.a = a.a;
 +
        f.b = a.b;
 +
        f.sz = a.sz;
 +
        return f;
 +
    }//Перегрузки операторов
 +
     func operator - (func a) {
 +
         func f = *new func();                 
 +
        for (int i = 0; i < a.sz; i++) {
 +
            f.vals.push_back(this->vals[i] - a.vals[i]);    //Вычитание
 +
        }
 +
        f.step = a.step;
 +
        f.a = a.a;
 +
        f.b = a.b;
 +
        f.sz = a.sz;
 +
        return f;
 
     }
 
     }
     out.close();    // закрытие файла после записи в него значений
+
     func operator * (func a) {
    D.Viv();
+
        func f = *new func();
    std::cout << std::endl << "y ";
+
        for (int i = 0; i < a.sz; i++) {
    for (int i=0; i<=D.j; ++i) // аналогичный предыдущему цикл, выводящий значения на экран
+
            f.vals.push_back(this->vals[i] * a.vals[i])//умножение
    {
+
        }
         std::cout << B[i] << " ";
+
        f.step = a.step;
 +
        f.a = a.a;
 +
        f.b = a.b;
 +
        f.sz = a.sz;
 +
         return f;
 
     }
 
     }
}
+
    func operator / (func a) {
void Func::operator -(Func D)  // перегрузка оператора '-'
+
        func f = *new func();
{
+
        for (int i = 0; i < a.sz; i++) {
    MinFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1-f2 будет работать аналогично записи f1.MinFunc(f2)
+
            f.vals.push_back(this->vals[i] / a.vals[i]);   // Деление
}
+
        }
void Func::UmnFunc (Func D)    // функция, линейно переумножающая значения функций
+
        f.step = a.step;
{
+
        f.a = a.a;
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
        f.b = a.b;
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
+
        f.sz = a.sz;
    {
+
        return f;
        B[i]=B[i]*D.A[i];   // умножение значений первой функций на значенийя второй для одного и того же значения переменной
 
 
     }
 
     }
     for (int i=0; i<=D.j; ++i)     // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
    {
+
     pair<double, double> approx() { //аппроксимация.
        out << B[i] << '\n';   // запись значений, полученных в предыдущем цикле, в файл
+
        double mid = 0;
    }
+
        for (int i = 0; i < this->sz; i++) {
    out.close();    // закрытие файла после записи в него значений
+
            mid += this->a + i * this->step;
    D.Viv();
+
        }
    std::cout << std::endl << "y ";
+
        mid /= this->sz;
    for (int i=0; i<=D.j; ++i)   // аналогичный предыдущему цикл, выводящий значения на экран
+
        double d = 0;
    {
+
        for (int i = 0; i < this->sz; i++) {
        std::cout << B[i] << " ";
+
            d += pow((this->a + i * this->step - mid), 2.);
    }
+
        }
}
+
        double a = 0;
void Func::operator *(Func D)   // перегрузка оператора '*'
+
        for (int i = 0; i < this->sz; i++) {
{
+
            a += (this->a + i * this->step - mid) * this->vals[i];
    UmnFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1*f2 будет работать аналогично записи f1.UmnFunc(f2)
+
        }
}
+
        a /= d;
void Func::DelFunc (Func D)    // функция, линейно делящая значения первой функци на значения второй функции
+
        double midy = 0;
{
+
        for (int i = 0; i < this->sz; i++) {
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
            midy += this->vals[i];
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
+
        }
    {
+
        midy /= this->sz;
        B[i]=B[i]/D.A[i];       // деление значений первой функций на значенийя второй для одного и того же значения переменной
+
        double c = midy - a * mid;
 +
        return {a, c}; //{x,y} возвращает пару (на самом деле не пару а просто какой-нибудь объект) с первым значением x и вторым y
 
     }
 
     }
     for (int i=0; i<=D.j; ++i)     // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
    {
+
     func inter(double step) {
        out << B[i] << '\n';       // запись значений, полученных в предыдущем цикле, в файл
+
        func f = *new func(); //ответ
 +
        double curr2, curr1;
 +
        int j = 0;
 +
        f.a = this->a, f.b = this->b, f.step = step, f.sz = (int)((b - a) / step + 1);
 +
        for (int i = 0; i < f.sz; i++) {
 +
            curr2 = a + i * step;
 +
            curr1 = a + j * this->step;
 +
            while (curr1 + this->step <= curr2) {
 +
                j++, curr1 += this->step;
 +
            }
 +
            if (curr1 == curr2) {
 +
                f.vals.push_back(this->vals[j]);
 +
                continue;
 +
            }
 +
            f.vals.push_back((this->vals[j + 1] - this->vals[j]) * (curr2 - curr1) / this->step + this->vals[j]);//я хз, тут видимо какая-то математика
 +
        }
 +
        return f;
 
     }
 
     }
     out.close();    // закрытие файла после записи в него значений
+
     void write(string fil) { //запись. чтобы записать не в файл, а в консоль вывести, надо передать "-1"
    D.Viv();
+
        ofstream f(fil.c_str());
    std::cout << std::endl << "y ";
+
        if (fil != "-1") {
    for (int i=0; i<=D.j; ++i)      // аналогичный предыдущему цикл, выводящий значения на экран
+
            f << this->a << ' ' << this->b << ' ' << this->step << '\n';
    {
+
        }
        std::cout << B[i] << " ";
+
        else
 +
            cout << this->a << ' ' << this->b << ' ' << this->step << '\n';
 +
        for (int i = 0; i < sz; i++) {
 +
            if (fil != "-1")
 +
                f << this->vals[i] << '\n';
 +
            else
 +
                cout << this->vals[i] << '\n';
 +
        }
 +
        f.close();
 +
 
     }
 
     }
}
+
};
void Func::operator /(Func D)   // перегрузка оператора '/'
+
{
+
int main() {
     DelFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1/f2 будет работать аналогично записи f1.DelFunc(f2)
+
     string fil;
}
+
     cout << "Input the file name with the function values\n";
void Func::In (Func D)      // функция, интерполирующая первую функцию по второй
+
     cin >> fil;
{
+
     func f = *new func(fil);
     double l=c/D.c;     // создаем переменную, которой присваиваем значение, обозначающее, во сколько раз один шаг больше другого
+
     int a;
     c=D.c;     // приводим больший шаг к меньшему значению
+
     char ch;
     z=D.j+1;   // ранее созданной переменной присваиваем значение, равное количеству элементов плюс один
+
     double st;
     int p=l;   // создаем целочисленную переменную, равную переменной l
+
     while (true) {
     B = new double [D.j+2];     // создание массива с количеством элементов D.j+2
+
        cout << "what do you want to do?\n1-math operation\n2-interpolation\n3-approximation\n4-write to file\n5-read values from file\n6-quit\n";
     D.Viv(); std::cout << std::endl << "y ";
+
        cin >> a;
    B[0]=A[0]; std::cerr << B[0] << " ";   // присваиваем первому элементу нового массива значение первого элемента старого массива и выводим его на экран
+
        if (a == 4) {
    int k=0;    // создаем вспомогательную целочисленную переменную
+
            cout << "input file name to write to\n";
    for (int i=0; i<=j; i+=p)   // создаем цикл, рассчитанный на j повторов через p
+
            cin >> fil;
    {
+
            f.write(fil);
         for (int m=1; m<p; ++m)     // создание цикла, выссчитывавшего промежуточное значение
+
        }
        {B[i+m]=((A[k]+A[k+1])/p)*(l-m); std::cerr << B[i+m] << " ";}  // присваиваем (i+m)-ому элементу значение, выссчитанного по формуле через заданные изначально значения и вывод егона экран
+
        if (a == 3) {
         B[i+p]=A[k+1];      // присваивание значению (i+p)-ого элемента нового массива значения (k+1)-ого элемента старого массива
+
            auto t = f.approx();
        std::cerr << B[i+p] << " ";     // вывод высчитанного выше значения на экран
+
            cout << "Approximate line equation is y = " << t.first << " * x + " << t.second << '\n';
         k=k+1; // увеличение k на единицу
+
        }
 +
        if (a == 2) {
 +
            cout << "input step to interpolate\n";
 +
            cin >> st;
 +
            f = f.inter(st);
 +
        }
 +
         if (a == 1) {
 +
            cout << "input arithmetic operator and file name with the second function values\n";
 +
            cin >> ch >> fil;
 +
            if (ch == '+') f = f + func(fil);
 +
            if (ch == '-') f = f - func(fil);
 +
            if (ch == '*') f = f * func(fil);
 +
            if (ch == '/') f = f / func(fil);
 +
        }
 +
         if (a == 5) {
 +
            cout << "Input the file name with the function values\n";
 +
            cin >> fil;
 +
            f = *new func(fil);
 +
        }
 +
         if (a == 6)
 +
            return 0;
 
     }
 
     }
 
}
 
}
void Func::App ()  // функция, аппроксимирующая полученную в результате сложения/вычитания/деления/умножения двух функций функцию
+
</syntaxhighlight>
{
+
</div>
    double d=0,e=0,f=0,g=0;    // создание переменных
 
    double k=0,l=0;    // создание переменных
 
    for (int i=0; i<z; ++i)    // цикл, который высчитывает сумму произведений зависимой и независимой переменных
 
        {d=i*B[i]+d;}
 
    for (int i=0; i<z; ++i)    // цикл, который высчитывает сумму всех значений функции
 
        {e=B[i]+e;}
 
    for (int i=0; i<z; ++i)    // цикл, высчитывающий сумму всех аргументов функции
 
        {f=i+f;}
 
    for (int i=0; i<z; ++i)    // цикл, высчитывающий сумму квадратов всех аргументов функции
 
        {g=i*i+g;}
 
    k=(z*d-f*e)/(z*g-f*f);      // расчет углового коэффициента прямой
 
    l=(e-k*f)/z;        // расчет свободного коэффициента прямой
 
    std::cout << "y=" << k << "x+" << l;    // вывод уравнения полученной прямой на экран
 
    std::ofstream out("ap.txt");        // запись полученного уравнения в файл
 
    {
 
        out << "y=" << k << "x+" << l;
 
    }
 
    out.close();
 
}
 
  
  
 +
<br>'''[[Нарядчиков Александр]]'''<br>
 +
'''Инструкция:''' Пользователю достаточно просто запустить программу.<br>
 +
'''Описание программы:''' В окне рисуются графики с разным шагом, количеством точек, начальными и конечными координатами, по клавише 'G' происходит их кубическая интерполяция, также рисуется график их суммы. По клавише 'S' можно сохранить полученный график в текстовый документ в виде координат его точек. По клавише 'L' можно загрузить график из текстового документа, и он появится в окне программы. Также происходит линейная аппроксимация графика суммы, и график аппроксимации рисуется на экран.<br>
 +
'''Описание алгоритма:''' Вся графика написана с помощью библиотек OpenGL и GLUT. Кубическая интерполяция написана с помощью кривых Безье(интерполяция по четырем точкам - кубическая кривая). При сложение двух графиков происходит их интерполяция, для приведения их к общему шагу. Линейная аппроксимация написана с помощью метода наименьших квадратов.<br>
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
"'''T05GRAPH.CPP'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: T05GRAPH.CPP
 +
* LAST UPDATE: 17.01.2016
 +
*/
  
#include <iostream>
+
#include "GRAPH.H"
#include <fstream>
 
#include "Func.h"
 
  
using namespace std;
+
/* Глобальные переменные */
double m,n,o, m1, n1, o1;
+
// Глобальная переменная, хранящая время в секундах с момента старта программы
int a;
+
double SyncTime;
char b;
+
// Глобальные переменные для отслеживания нажатия клавиш
 +
bool IsGraph, IsSave, IsLoad, IsLoaded;
  
int main()
+
/* Timer function */
 +
// Подсчет времени
 +
void Timer( void )
 
{
 
{
    cout << "Enter the beginning, the end and the step of a function." << endl; // ввод опорных значений первой функции: начало, конец, шаг;
+
long t;
    cin >> m >> n >> o; // считывание значений
+
static long StartTime = -1;
    cout << "Enter the beginning, the end and the step of another function." << endl; // ввод опорных значений второй функции: начало, конец, шаг;
 
    cin >> m1 >> n1 >> o1; // считывание значений
 
    Func F(m,n,o); // создание объекта класса Func, определяющий первую функцию
 
    cout << "The first function is" << endl; F.Viv(); cout << endl << "y ";
 
    F.DefFunc(); // определение первой функции через создание массива с ее значениями
 
    cout << endl;
 
    Func F1(m1,n1,o1); // создание объекта класса Func, определяющий вторую функцию
 
    cout << "The second function is" << endl; F1.Viv(); cout << endl << "y ";
 
    F1.DefFunc(); // определение второй функции через создание массива с ее значениями
 
    cout << endl;
 
    cout << "As two functions have different steps, we made the interpolation of the first function." << endl;
 
    F.In(F1); // линейная интерполяция первой функции по второй
 
    cout << endl;
 
    cout << "What do you want to do with these functions?" << '\n' << "Enter 1 to sum them;" << '\n' << "Enter 2 to subtract the second from the first;" << '\n' << "Enter 3 to multiply them;" << '\n' << "Enter 4 to divide first by second" << endl;
 
    cin >> a;
 
    if (a==1)
 
    {cout << "Function 1 + function 2 =" << '\n'; F+F1;}  // сложение двух функций с одинаковым шагом и интервалом
 
    else if (a==2)
 
    {cout << "Function 1 - function 2 =" << '\n'; F-F1;}  // вычитание двух функций с одинаковым шагом и интервалом
 
    else if (a==3)
 
    {cout << "Function 1 * function 2 =" << '\n'; F*F1;}  // умножение двух функций с одинаковым шагом и интервалом
 
    else if (a==4)
 
    {cout << "Function 1 / function 2 =" << '\n'; F/F1;}  // деление двух функций с одинаковым шагом и интервалом
 
    cout << endl;
 
    cout << "Enter 5 to do the approximation of the result function" << endl;  // пользователь сам выбирает, выполнять ли аппроксимацию;
 
    cout << "Otherwise enter 6 to quit" << endl;
 
    cin >> a;
 
    if (a==5)
 
    {cout << "Appromaximation:" << endl;
 
    F.App();}  // аппроксимация
 
    return 0;
 
}
 
  
</syntaxhighlight>
+
t = clock();
</div>
+
if (StartTime == -1)
 +
StartTime = t;
 +
SyncTime = (double)(t - StartTime) / CLOCKS_PER_SEC;
 +
} /* End of 'Timer' function */
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
/* Display function */
'''[[Савельева Ольга]]'''
+
// Стандартная функция, вызываемая при перерисовке окна
+
void Display( void )
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
 
<div class="mw-collapsible-content">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <stdio.h>
 
#include <stdlib.h>
 
//Бибилотека необходимая для возможности включения русского языка в консоли
 
#include <locale.h>
 
 
 
class fun
 
 
{
 
{
/*
+
graph G1(-15, 15, 0.1), G2(2, 10, 0.4), G3, G4;
fx - массив с дискретными значениями функции
 
a - начало отрезка определения функции
 
b - конец отрезка определения функции
 
dx - шаг
 
*/
 
double *fx, a, b, dx;
 
//Чтобы очусть ошибки округления в вещественных числах при сравнениях используется константа eps.
 
//К примеру два вещественных числа x и y сравниваются не так x>=y, а так x-y>=-eps.
 
const double eps = 1e-10; //1e-10 это тоже самое что 0.0000000001
 
  
public:
+
// Запуск времени
//Коструктор по умолчанию
+
Timer();
fun();
 
//Конструктор копирования
 
fun(fun &tmp);
 
//Деструктор
 
~fun();
 
  
//Перегруженные операторы. Ключевое слово const в конце означает, что объект от которого вызвается метод не изменяется
+
// Установка цвета закраски фона в белый
const fun operator+(const fun& right) const;
+
glClearColor(1, 1, 1, 1);
const fun operator-(const fun& right) const;
+
// Очищаем цветовой буфер для создания нового изображения
const fun operator*(const fun& right) const;
+
glClear(GL_COLOR_BUFFER_BIT);
const fun operator/(const fun& right) const;
+
 
const fun& operator=(const fun& right);
+
glLoadIdentity();
 +
glScaled(0.1 / (1366 / 768.0), 0.1, 0.1);
 +
 
 +
// Отрисовка осей X и Y
 +
glBegin(GL_LINE_STRIP);
  
//Метод считывания из файла
+
glColor3d(0, 0, 1);
void readFile(const char *path);
+
glVertex2d(0, -1000);
//Метод вывода в файл
+
glVertex2d(0, 1000);
void writeFile(const char *path);
 
  
//Метод изменения шага
+
glColor3d(1, 0, 0);
void changeDx(double newDx);
+
glVertex2d(-1000, 0);
//Метод вычисления значения в заданной точке
+
glVertex2d(1000, 0);
double getX(double x1);
 
};
 
  
//В конструкторе по умолчанию все просто.
+
glEnd();
fun::fun()
 
{
 
a = b = dx = 0;
 
fx = NULL;
 
}
 
  
//Конструктор копирования
+
/* Отрисовка графиков */
fun::fun(fun &tmp)
+
// Отрисовка первого графика и его интерполяция по клавише "G"
{
+
G1.Draw(sin);
int i, n;
+
if (IsGraph == 1)
//Копирование свойств объекта tmp в текущий объект
+
G1.Interpolation_Draw(1.0 / 32);
a = tmp.a;
 
b = tmp.b;
 
dx = tmp.dx;
 
//Вычисление количества дискретных значений
 
n = (b - a) / dx + 1;
 
//Выделение необходимой памяти для хранения дискретных значений
 
fx = new double[n];
 
//Копирование дискретных значений объекта tmp в текущий объект
 
for (i = 0; i<n; ++i)
 
fx[i] = tmp.fx[i];
 
}
 
  
//Деструктор
+
// Отрисовка второго графика и его интерполяция по клавише "G"
fun::~fun()
+
G2.Draw(log);
{
+
if (IsGraph == 1)
//Освобождение памяти выделенной для массива дискретных значений
+
G2.Interpolation_Draw(1.0 / 32);
if (fx != NULL) delete[] fx;
 
}
 
//Оператор сложения.
 
const fun fun::operator+(const fun& right) const
 
{
 
//Создание результирующего объекта
 
fun result;
 
int i, n;
 
//Копирование свойств в результирующий объект
 
result.dx = dx;
 
result.a = a;
 
result.b = b;
 
//Вычисление количества дискретных значений
 
n = (b - a) / dx + 1;
 
//Выделение необходимой памяти для хранения дискретных значений
 
result.fx = new double[n];
 
//Вычисление дискретных значений результирующего объекта
 
for (i = 0; i<n; ++i)
 
result.fx[i] = fx[i] + right.fx[i];
 
  
//Возвращение результата
+
// Отрисовка графика суммы для первого и второго графиков
return result;
+
G3 = G2 + G1;
}
+
glColor3d(0, 1, 0);
 +
G3.Draw();
 +
// Аппроксимация графика суммы
 +
G3.Approximation();
  
//Этот оператор аналогичен оператору сложение
+
// Сохранение графика по клавише "S"
const fun fun::operator-(const fun& right) const
+
if (IsSave == 1)
{
+
{
fun result;
+
G3.SaveArray();
int i, n;
+
IsSave == 0;
result.dx = dx;
+
}
result.a = a;
+
result.b = b;
+
// Загрузка графика по клавише "L"
n = (b - a) / dx + 1;
+
if (IsLoad == 1)
result.fx = new double[n];
+
{
for (i = 0; i<n; ++i)
+
delete[] G4.mas;
result.fx[i] = fx[i] - right.fx[i];
+
delete[] G4.Color;
 +
G4.LoadArray("graph.txt");
 +
IsLoad == 0;
 +
IsLoaded = 1;
 +
}
 +
 +
// Отрисовка загруженного графика
 +
if (IsLoaded == 1)
 +
{
 +
glColor3d(1, 0, 0);
 +
G4.Draw();
 +
IsLoaded = 0;
 +
}
  
return result;
+
// Чистка памяти
}
+
delete[] G1.mas;
 +
delete[] G1.Color;
 +
delete[] G2.mas;
 +
delete[] G2.Color;
 +
delete[] G3.mas;
 +
delete[] G3.Color;
 +
delete[] G4.mas;
 +
delete[] G4.Color;
  
//Этот оператор аналогичен оператору сложение
+
glFinish();
const fun fun::operator*(const fun& right) const
+
// Копируем вторичный буфер в окно
{
+
glutSwapBuffers();
fun result;
+
// Вызываем функцию обновления кадра
int i, n;
+
glutPostRedisplay();
result.dx = dx;
+
} /* End of 'Display' function */
result.a = a;
 
result.b = b;
 
n = (b - a) / dx + 1;
 
result.fx = new double[n];
 
for (i = 0; i<n; ++i)
 
result.fx[i] = fx[i] * right.fx[i];
 
  
return result;
+
/* Keyboard function */
}
+
// Стандартная функция, вызываемая при нажатие клавиш на клавиатуре
 
+
void Keyboard( unsigned char Key, int X, int Y )
//Этот оператор аналогичен оператору сложение
 
const fun fun::operator/(const fun& right) const
 
 
{
 
{
fun result;
+
// Выход из программы
int i, n;
+
if (Key == 27)
result.dx = dx;
+
exit(0);
result.a = a;
+
// Отрисовка интерполированных графиков
result.b = b;
+
else if ((Key == 'G') || (Key == 'g'))
n = (b - a) / dx + 1;
+
IsGraph = !IsGraph;
result.fx = new double[n];
+
// Сохранение графика суммы в файл
for (i = 0; i<n; ++i)
+
else if ((Key == 'S') || (Key == 's'))
result.fx[i] = fx[i] / right.fx[i];
+
IsSave = !IsSave;
 +
// Загрузка графика из файла
 +
else if ((Key == 'L') || (Key == 'l'))
 +
IsLoad = !IsLoad;
 +
// Открытие программы в полном экране
 +
else if ((Key == 'F') || (Key == 'f'))
 +
glutFullScreen();
 +
} /* End of 'Keyboard' function */
  
return result;
+
/* Main function */
}
+
int main( int argc, char *argv[] )
 
 
//Оператор присваивания
 
const fun& fun::operator=(const fun& right)
 
 
{
 
{
//Проверка на самоприсваивание
+
// Инициализации OpenGL и GLUT
if (this == &right)
+
glutInit(&argc, argv);
//Возвращение в качестве результата текущий объект
+
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
return *this;
 
  
 +
// Задача размеров и позиции окна
 +
glutInitWindowPosition(0, 0);
 +
glutInitWindowSize(500, 500);
 +
// Создание окна
 +
glutCreateWindow("T05GRAPH");
  
int i, n;
+
// Установка функций 'обратного вызова'
//Присваивание свойств объекта right текущему объекту
+
glutDisplayFunc(Display);
a = right.a;
+
glutKeyboardFunc(Keyboard);
b = right.b;
 
dx = right.dx;
 
//Вычисление количества дискретных значений
 
n = (b - a) / dx + 1;
 
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
 
if (fx != NULL) delete[] fx;
 
//Выделение необходимой памяти для хранения дискретных значений
 
fx = new double[n];
 
  
//Копирование дискретных значений объекта right в текущий объект
+
// Запускаем основной цикл построения
for (i = 0; i<n; ++i)
+
glutMainLoop();
fx[i] = right.fx[i];
+
return 0;
 +
} /* End of 'main' function */
  
//Возвращение в качестве результата текущий объект
+
/* END OF 'T05GRAPH.CPP' FILE */
return *this;
+
</syntaxhighlight>
}
+
"'''GRAPH.CPP'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: GRAPH.CPP
 +
* LAST UPDATE: 17.01.2016
 +
*/
  
/*
+
#include "GRAPH.H"
Метод считывания из файла
 
path - путь к файлу из которого считывать
 
*/
 
  
void fun::readFile(const char *path)
+
/* Load Array of points function */
 +
// Загрузка графика из файла по точкам
 +
void graph::LoadArray( char *FileName )
 
{
 
{
//Открытие файла для считывания
+
// Создание указателя на тип FILE
FILE *in = fopen(path, "r");
+
FILE *F;
int i, n;
+
 
//Считывание границ отрезка и шага из файла
+
// Создание файла и открытие его в режиме чтения
fscanf(in, "%lf%lf%lf", &a, &b, &dx);
+
fopen_s(&F, FileName, "rt");
//Вычисление количества дискретных значений
 
n = (b - a) / dx + 1;
 
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
 
if (fx != NULL) delete[] fx;
 
//Выделение необходимой памяти для хранения дискретных значений
 
fx = new double[n];
 
//Считывание дискретных значений из файла
 
for (i = 0; i<n; ++i) fscanf(in, "%lf", &fx[i]);
 
//Закрытие файла
 
fclose(in);
 
}
 
  
/*
+
// Количество точек
Метод вывода в файл
+
fscanf(F, "%d", &N);
path - путь к файлу в который нужно вывести
+
// Шаг функции
*/
+
fscanf(F, "%lf", &Step);
 +
// Начальная координата по X
 +
fscanf(F, "%lf", &MinX);
 +
// Конечная координата по X
 +
fscanf(F, "%lf", &MaxX);
 +
 +
// Выделение памяти под массив точек
 +
mas = new vec[N];
  
void fun::writeFile(const char *path)
+
// Заполнение массива точек из файла
{
+
for (int i = 0; i < N; ++i)
//Открытие файла для вывода
+
{
FILE *out = fopen(path, "w");
+
// Заполнение по X
int i, n;
+
fscanf(F, "%lf", &mas[i].X);
double x = a;
+
// Заполнение по Y
//Вычисление количества дискретных значений
+
fscanf(F, "%lf", &mas[i].Y);
n = (b - a) / dx + 1;
+
}
//Вывод информации о отрезке и шаге в файл
+
 
fprintf(out, "[%.5lf, %.5lf] dx=%.5lf\n", a, b, dx);
+
// Закрытие файла
//Последовательный вывод пары (точка, значение в точке) в файл
+
fclose(F);
for (i = 0; i<n; ++i, x += dx)
+
} /* End of 'LoadArray' function */
fprintf(out, "x=%.5lf f(x)=%.5lf\n", x, fx[i]);
 
//Закрытие файла
 
fclose(out);
 
}
 
  
/*
+
/* Fill mas function */
Метод изменения величины шага
+
// Заполнение массива координат точек с цветом
*/
+
void graph::Fill( double(*f)(double) )
void fun::changeDx(double newDx)
 
 
{
 
{
int i, j, n, newN;
+
// Выделение памяти под массив точек
double *newFx, x, newX, x1, y1, x2, y2, K, B;
+
mas = new vec[N];
//Вычисление количества старых дискретных значений
+
// Выделение памяти под массив цветов
n = (b - a) / dx + 1;
+
Color = new vec[N];
//Вычисление количества новых дискретных значений
+
 
newN = (b - a) / newDx + 1;
+
// Заполнение массивов
//Выделение памяти под новые дискретные значения
+
for (int i = 0; i < N; i++)
newFx = new double[newN];
 
//Определение первой точки в которой вычисляется новое дискретное значение
 
newX = a;
 
//Переменная которая бежит по старым дискретным значениям
 
i = 0;
 
//Определение первой точки в которой вычисляется старое дискретное значение
 
x = a;
 
//Цикл для формирования новых дискретных значений
 
for (j = 0; j<newN; ++j, newX += newDx)
 
 
{
 
{
//В цикле находим отрезок где лежит точка в которой нужно вычислить новое дискретное значение
+
mas[i] = vec(MinX + i * Step, f(MinX + i * Step));
for (; i<n - 1; ++i, x += dx)
+
Color[i] = vec::Rnd();
//Если без eps, то сравнения такие: x<=newX<=x+dx
 
if ((newX - x>-eps) && ((x+dx) - newX>-eps))
 
{
 
//Линейная интерполяция
 
x1 = x;
 
x2 = x + dx;
 
y1 = fx[i];
 
y2 = fx[i + 1];
 
K = (y2 - y1) / (x2 - x1);
 
B = (y2*x1 - y1*x2) / (x1 - x2);
 
//Вычисления значения в точке с помощью линейной интерполяции
 
newFx[j] = newX*K + B;
 
//Выход из цикла по i
 
break;
 
}
 
 
}
 
}
//Смена величины шага на новый
+
} /* End of 'Fill' function */
dx = newDx;
 
//Удаление старых дискретных значений
 
delete[] fx;
 
//Присвоение текущему объекту новых дискретных значений
 
fx = newFx;
 
}
 
  
/*
+
/* Draw graph function */
Метод вычисляет значение в точке xAns с помощью линейной интерполяции.
+
// Рисование заполненного графика на экран
*/
+
void graph::Draw( void )
double fun::getX(double xAns)
 
 
{
 
{
int i, n;
+
  // Задача размер точки
double x, x1, y1, x2, y2, K, B;
+
glPointSize(1);
x = a;
+
// Рисование
//Вычисление количества дискретных значений
+
glBegin(GL_POINTS);
n = (b - a) / dx + 1;
+
for (int i = 0; i < N; i++)
//Ищем отрезок в котором лежит точка xAns
+
glVertex2d(mas[i].X, mas[i].Y);
for (i = 0; i<n - 1; ++i, x += dx)
+
glEnd();
{
+
} /* End of 'Draw' function */
//Если без eps, то сравнения такие: x<=newX<=x+dx
 
if (((x+dx) - xAns>-eps) && (xAns - x>-eps))
 
{
 
//Линейная интерполяция
 
x1 = x;
 
x2 = x + dx;
 
y1 = fx[i];
 
y2 = fx[i + 1];
 
K = (y2 - y1) / (x2 - x1);
 
B = (y2*x1 - y1*x2) / (x1 - x2);
 
//Вычисления значения функции в заданной точке с помощью линейной интерполяции
 
return K*xAns + B;
 
}
 
}
 
}
 
  
int main()
+
/* Draw graph function */
 +
// Рисование не заполненного еще графика на экран
 +
void graph::Draw( double(*f)(double) )
 
{
 
{
//Включение поддержки русского языка в консоли
+
// Заполнение массива
setlocale(LC_ALL, "Russian");
+
graph::Fill(f);
//Объявление трех переменных типа fun
 
fun a, b, c;
 
//Считывания первых дискретных значений из файла inputA.txt
 
a.readFile("inputA.txt");
 
//Считывания вторых дискретных значений из файла inputB.txt
 
b.readFile("inputB.txt");
 
  
//Первая функция
+
// Задача цвета и размера точки
a.writeFile("outputA.txt");
+
glColor3d(0, 0, 0);
//Вторая функция
+
glPointSize(1);
b.writeFile("outputB.txt");
+
// Рисование
 +
glBegin(GL_POINTS);
 +
for (int i = 0; i < N; i++)
 +
glVertex2d(mas[i].X, mas[i].Y);
 +
glEnd();
 +
} /* End of 'Draw' function */
  
c = a + b;
+
/* Interpolation draw graph function */
//Результат сложения двух функций
+
// Рисование интерполированного графика на экран
c.writeFile("outputAaddB.txt");
+
void graph::Interpolation_Draw( double i_step )
 +
{
 +
// Коэффициент Катмулл-Рома
 +
double alpha = 1.0 / 6;
 +
 +
// Кубическая интерполяция кривыми Безье
 +
for (int i = 0; i < N - 1; i++)
 +
{
 +
// Создание 4 точек для интерполяции по ним
 +
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
 +
vec Color0 = mas[i], Color1, Color2, Color3 = mas[i + 1];
  
 +
// Значения для первого и последнего отрезков
 +
if (i == 0)
 +
{
 +
P1 = (mas[1] - mas[0]) * alpha + mas[0];
 +
Color1 = (mas[1] - mas[0]) * alpha + mas[0];
 +
}
 +
else
 +
{
 +
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
 +
Color1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
 +
}
 +
if (i == N - 2)
 +
{
 +
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
 +
Color2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
 +
}
 +
else
 +
{
 +
P2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
 +
Color2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
 +
}
  
c = a - b;
+
glLineWidth(2);
//Результат вычитания второй функции из первой
+
glBegin(GL_LINE_STRIP);
c.writeFile("outputAsubB.txt");
+
for (double t = 0; t <= 1; t += i_step)
 +
{
 +
vec p, color;
  
c = a*b;
+
// Вычисление точки интерполированного графика по 4 точкам
//Результат умножения двух функций
+
p = P0 * (1 - t) * (1 - t) * (1 - t) + P1 * 3 * (1 - t) * (1 - t) * t + P2 * 3 * (1 - t) * t * t + P3 * t * t * t;
c.writeFile("outputAmultiB.txt");
+
color = Color0 * (1 - t) * (1 - t) * (1 - t) + Color1 * 3 * (1 - t) * (1 - t) * t + Color2 * 3 * (1 - t) * t * t + Color3 * t * t * t;
  
c = a / b;
+
// Рисование
//Результат деления первой функции на вторую
+
glColor3d(color.X / 10, 0, color.Y);
c.writeFile("outputAdivB.txt");
+
glVertex2d(p.X, p.Y);
 +
}
 +
glEnd();
 +
}
 +
} /* End of 'Interpolation_Draw' function */
  
//У первой функции изменили шаг на 0.5
+
/* Interpolation graph function */
a.changeDx(0.5);
+
// Интерполяция графика
//Вывели её дискретные значения
+
graph graph::Interpolation( double i_step )
a.writeFile("outputChangeDx.txt");
+
{
 +
graph G_New;
 +
// Коэффициент Катмулл-Рома
 +
double alpha = 1.0 / 6;
  
//Функция, которая аппроксимирует её кусочно линейная.
+
// Заполнение параметров для нового графика
//Для примера нашли значение аппроксимируещей функции в точке не совпадающей с дискретными значениями.
+
G_New.MinX = MinX;
printf("Значение в точке 1.8 первой функции %.5lf\n", a.getX(1.8));
+
G_New.MaxX = MaxX;
 
+
G_New.Step = Step * i_step;
//Нужно чтобы окно консоли автоматически не закрылось
+
G_New.N = (int)((G_New.MaxX - G_New.MinX) / G_New.Step);
system("pause");
+
G_New.mas = new vec[G_New.N];
return 0;
+
}
+
// Кубическая интерполяция кривыми Безье
</syntaxhighlight>
+
for (int i = 0; i < N - 1; i++)
</div>
+
{
 +
// Создание 4 точек для интерполяции по ним
 +
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
 +
 +
// Значения для первого и последнего отрезков
 +
if (i == 0)
 +
P1 = (mas[1] - mas[0]) * alpha + mas[0];
 +
else
 +
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
 +
if (i == N - 2)
 +
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
 +
else
 +
P2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
 +
 +
for (double t = 0; t <= 1; t += i_step)
 +
{
 +
vec p;
  
 +
// Вычисление точки интерполированного графика по 4 точкам
 +
G_New.mas[(int)((t + i) / i_step)] = P0 * (1 - t) * (1 - t) * (1 - t) + P1 * 3 * (1 - t) * (1 - t) * t + P2 * 3 * (1 - t) * t * t + P3 * t * t * t;
 +
}
 +
}
  
 +
return G_New;
 +
} /* End of 'Interpolation' function */
  
Скачать можно [http://tm.spbstu.ru/%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8.zip здесь]
+
/* Sum of 2 graphics function */
 +
// Сложение двух графиков
 +
graph graph::operator+( graph &G )
 +
{
 +
graph G_New, G1, G2;
 +
int i, j;
  
 +
// Заполнение параметров графика суммы
 +
G_New.MinX = (MinX >= G.MinX) ? MinX : G.MinX;
 +
G_New.MaxX = (MaxX <= G.MaxX) ? MaxX : G.MaxX;
 +
G_New.Step = Step * G.Step;
 +
G_New.N = (int)((G_New.MaxX - G_New.MinX) / G_New.Step);
 +
G_New.mas = new vec[G_New.N];
  
'''[[Сенников Иван]]'''
+
// Интерполяция слагаемых графиков, для приведение к общему шагу
+
G1 = Interpolation(G.Step);
'''Суть программы:''' Программы позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
+
G2 = G.Interpolation(Step);
 
 
'''Идея:''' Класс работы с функциями содержит такие функции как функция введения данных функции - ее создание, перегрузки оператора сложения, линейных интерполяции и аппроксимации, выделения и освобождения памяти. Линейная интерполяция написана с помощью теории аналитической геометрии на плоскости, а линейная аппроксимация с помощью метода наименьших квадратов.
 
  
'''Инструкция:''' Программа выполнена в виде меню на английском языке: пользователю будет предоставлена возможность выйти из программы, создать обе функции, а также поработать с ними в индивидуальном порядке и сложить две уже существующие функции. Комментарии к программе написаны также на английском языке.
+
// Поиск общего начала и конца графиков
 +
for (i = 0; i < G1.N; i++)
 +
if (fabs(G1.mas[i].X - G_New.MinX) <= Threshold)
 +
break;
  
Ссылка для скачиваний: [http://tm.spbstu.ru/Файл:Func.zip здесь].
+
for (j = 0; j < G2.N; j++)
 +
if (fabs(G2.mas[j].X - G_New.MinX) <= Threshold)
 +
break;
  
 +
// Заполнение графика суммы
 +
for (int k = 0; k < G_New.N; k++)
 +
{
 +
G_New.mas[k].X = G_New.MinX + k * G_New.Step;
 +
G_New.mas[k].Y = G1.mas[i + k].Y + G2.mas[j + k].Y;
 +
}
  
'''[[Степанянц Степан]]'''
+
return G_New;
+
} /* End of 'Sum' function */
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.Данныеберутся из файла.
 
<div class="mw-collapsible-content">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
  
 +
/* Save Array of points function */
 +
// Сохранение графика в файл по точкам
 +
void graph::SaveArray( void )
 +
{
 +
// Создание указателя на тип FILE
 +
FILE *F;
  
#include <iostream>
+
// Создание файла и открытие его в режиме записи
#include <vector>
+
fopen_s(&F, "graph.txt", "wt");
#include <math.h>
+
 
#include <fstream>
+
/* Запись в файл данных */
#include <stdio.h>
+
// Количество точек
#include <string>
+
fprintf(F, "%d\n", N);
#include <time.h>
+
// Шаг функции
+
fprintf(F, "%lf\n", Step);
using namespace std;
+
// Начальная координата по X
+
fprintf(F, "%lf\n", MinX);
class func {
+
// Конечная координата по X
    vector <double> vals;
+
fprintf(F, "%lf\n", MaxX);
    double a, b, step, sz;
+
 
+
// Координаты всех точек
public:
+
for (int i = 0; i < N; ++i)
    func (string fil) { //конструктор для ввода функции из файла
+
  fprintf(F, "%lf %lf ", mas[i].X, mas[i].Y);
        ifstream f(fil.c_str());
+
 
        double a, b, step, y;
+
// Закрытие файла
        f >> a >> b >> step; //вводим основные значения из файла
+
fclose(F);
        this->step = step;
+
} /* End of 'SaveArray' function */
        this->sz = (int)((b - a) / step + 1); //считаем размер
+
 
        this->a = a, this->b = b;
+
/* Approximation of function function */
        for (int i = 0; i < this->sz; i++) {
+
// Аппроксимация графика
            f >> y;
+
void graph::Approximation( void )
            this->vals.push_back(y); //считываем и записываем значения из файла
+
{
        }
+
double k, b, s1 = 0, s2 = 0, s3 = 0, s4 = 0;
        f.close();
+
 
    }
+
// Линейная аппроксимация
    func () {} //еще один конструктор
+
for (int i = 0; i < N; i++)
    func operator + (func a) { // эта и ближайшие четыре метода -- калькулятор функций
+
{
        func f = *new func(); //создаем новый экземпляр класса, ответ
+
if (fabs(mas[i].X) < MAX && fabs(mas[i].Y) < MAX)
        for (int i = 0; i < sz; i++) {
+
{
            f.vals.push_back(this->vals[i] + a.vals[i]); // складываем покоординатно
+
s1 += mas[i].X * mas[i].Y;
        }
+
s2 += mas[i].X;
        f.step = a.step; // копируем все значения в ответ (возможно, это можно сделать гораздо проще и не писать 4*4 строк но почему-то ничего умнее я не придумал)
+
s3 += mas[i].X * mas[i].X;
        f.a = a.a;
+
s4 += mas[i].Y;
        f.b = a.b;
+
}
        f.sz = a.sz;
+
}
        return f;
+
 
    }//Перегрузки операторов
+
k = (N * s1 - s2 * s4) / (double(N) * s3 - s2 * s2);
    func operator - (func a) {
+
b = (s4 - k * s2) / double(N);
        func f = *new func();                  
+
 
        for (int i = 0; i < a.sz; i++) {
+
// Задача цвета и ширины линии
            f.vals.push_back(this->vals[i] - a.vals[i]);    //Вычитание
+
glColor3d(1, 0.5, 0);
        }
+
glLineWidth(1);
        f.step = a.step;
+
// Рисование
        f.a = a.a;
+
glBegin(GL_LINE_STRIP);
        f.b = a.b;
+
glVertex2d(MinX, MinX * k + b);
        f.sz = a.sz;
+
glVertex2d(MaxX, MaxX * k + b);
        return f;
+
glEnd();
    }
+
} /* End of 'Approximation' function */
    func operator * (func a) {
+
 
        func f = *new func();
+
/* End of 'GRAPH.CPP' file */
        for (int i = 0; i < a.sz; i++) {
+
</syntaxhighlight>
            f.vals.push_back(this->vals[i] * a.vals[i])//умножение
+
"'''GRAPH.H'''"
        }
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
        f.step = a.step;
+
/* FILENAME: GRAPH.H
        f.a = a.a;
+
* LAST UPDATE: 17.01.2016
        f.b = a.b;
+
*/
        f.sz = a.sz;
+
 
        return f;
+
#ifndef _GRAPH_H_
    }
+
#define _GRAPH_H_
    func operator / (func a) {
+
 
        func f = *new func();
+
#define _CRT_SECURE_NO_WARNINGS
        for (int i = 0; i < a.sz; i++) {
+
 
            f.vals.push_back(this->vals[i] / a.vals[i]);   // Деление
+
#include <iostream>
        }
+
#include <stdio.h>
        f.step = a.step;
+
#include <stdlib.h>
        f.a = a.a;
+
#include <math.h>
        f.b = a.b;
+
#include <time.h>
        f.sz = a.sz;
+
#include <GL\glut.h>
        return f;
+
 
    }
+
#define MAX 100
+
 
    pair<double, double> approx() { //аппроксимация.  
+
using namespace std;
        double mid = 0;
+
 
        for (int i = 0; i < this->sz; i++) {
+
/* Useful constants */
            mid += this->a + i * this->step;
+
const double Threshold = 1e-10;
        }
+
const double Infinity = 1e+10;
        mid /= this->sz;
+
 
        double d = 0;
+
/* Vector representation type */
        for (int i = 0; i < this->sz; i++) {
+
class vec
            d += pow((this->a + i * this->step - mid), 2.);
+
{
        }
+
public:
        double a = 0;
+
double X, Y;
        for (int i = 0; i < this->sz; i++) {
+
 
            a += (this->a + i * this->step - mid) * this->vals[i];
+
/* Default constructor */
        }
+
vec( void )
        a /= d;
+
{
        double midy = 0;
+
}
        for (int i = 0; i < this->sz; i++) {
+
 
            midy += this->vals[i];
+
/* Class constructor */
        }
+
vec( double A ) : X(A), Y(A)
        midy /= this->sz;
+
{
        double c = midy - a * mid;
+
}
        return {a, c}; //{x,y} возвращает пару (на самом деле не пару а просто какой-нибудь объект) с первым значением x и вторым y
+
 
    }
+
/* Class constructor */
+
vec( double A, double B ) : X(A), Y(B)
    func inter(double step) {
+
{
        func f = *new func(); //ответ
+
}
        double curr2, curr1;
+
 
        int j = 0;
+
static double R0( void )
        f.a = this->a, f.b = this->b, f.step = step, f.sz = (int)((b - a) / step + 1);
+
{
        for (int i = 0; i < f.sz; i++) {
+
return rand() / (double)RAND_MAX;
            curr2 = a + i * step;
+
} /* End of 'R0' function */
            curr1 = a + j * this->step;
+
 
            while (curr1 + this->step <= curr2) {
+
static vec Rnd( void )
                j++, curr1 += this->step;
+
{
            }
+
return vec(R0(), R0());
            if (curr1 == curr2) {
+
} /* End of 'Rnd' function */
                f.vals.push_back(this->vals[j]);
+
 
                continue;
+
/* The functions of operations on vectors */
            }
+
 
            f.vals.push_back((this->vals[j + 1] - this->vals[j]) * (curr2 - curr1) / this->step + this->vals[j]);//я хз, тут видимо какая-то математика
+
/* Vector = vector function */
        }
+
vec operator=( vec &B )
        return f;
+
{
    }
+
X = B.X;
    void write(string fil) { //запись. чтобы записать не в файл, а в консоль вывести, надо передать "-1"
+
Y = B.Y;
        ofstream f(fil.c_str());
+
 
        if (fil != "-1") {
+
return B;
            f << this->a << ' ' << this->b << ' ' << this->step << '\n';
+
} /* end of 'operator+' function */
        }
+
 
        else
+
/* Vector add vector function */
            cout << this->a << ' ' << this->b << ' ' << this->step << '\n';
+
vec operator+( const vec &B ) const
        for (int i = 0; i < sz; i++) {
+
{
            if (fil != "-1")
+
return vec(X + B.X, Y + B.Y);
                f << this->vals[i] << '\n';
+
} /* end of 'operator+' function */
            else
+
 
                cout << this->vals[i] << '\n';
+
/* Vector sub vector function */
        }
+
vec operator-( const vec &B ) const
        f.close();
+
{
+
return vec(X - B.X, Y - B.Y);
    }
+
} /* end of 'operator-' function */
};
+
 
+
vec operator-( void ) const
int main() {
+
{
    string fil;
+
return vec(-X, -Y);
    cout << "Input the file name with the function values\n";
+
} /* end of 'operator-' function */
    cin >> fil;
+
 
    func f = *new func(fil);
+
/* Vector mul number function */
    int a;
+
vec operator*( const double N ) const
    char ch;
+
{
    double st;
+
return vec(X * N, Y * N);
    while (true) {
+
} /* end of 'operator*' function */
        cout << "what do you want to do?\n1-math operation\n2-interpolation\n3-approximation\n4-write to file\n5-read values from file\n6-quit\n";
+
 
        cin >> a;
+
/* Vector div number function */
        if (a == 4) {
+
vec operator/( const double N ) const
            cout << "input file name to write to\n";
+
{
            cin >> fil;
+
return vec(X / N, Y / N);
            f.write(fil);
+
} /* end of 'operator/' function */
        }
+
 
        if (a == 3) {
+
/* Vector dot vector function */
            auto t = f.approx();
+
double operator&( const vec &B ) const
            cout << "Approximate line equation is y = " << t.first << " * x + " << t.second << '\n';
+
{
        }
+
return double(X * B.X + Y * B.Y);
        if (a == 2) {
+
} /* end of 'operator&' function */
            cout << "input step to interpolate\n";
 
            cin >> st;
 
            f = f.inter(st);
 
        }
 
        if (a == 1) {
 
            cout << "input arithmetic operator and file name with the second function values\n";
 
            cin >> ch >> fil;
 
            if (ch == '+') f = f + func(fil);
 
            if (ch == '-') f = f - func(fil);
 
            if (ch == '*') f = f * func(fil);
 
            if (ch == '/') f = f / func(fil);
 
        }
 
        if (a == 5) {
 
            cout << "Input the file name with the function values\n";
 
            cin >> fil;
 
            f = *new func(fil);
 
        }
 
        if (a == 6)
 
            return 0;
 
    }
 
}
 
</syntaxhighlight>
 
</div>
 
  
'''[[Сюрис Александр]]'''
+
vec & operator+=( const vec &B )
Задаются две функции с разными шагами и начальными и конечными значениями. Аппроксимирует одну функцию по шагу другой и складывает/умножает/вычитает/делит их
+
{
 +
X += B.X;
 +
Y += B.Y;
  
Скачать можно  [http://mech.spbstu.ru/File:%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F(%D0%A1%D1%8E%D1%80%D0%B8%D1%81%D0%90%D0%BB%D0%B5%D0%BA%D1%81%D0%B0%D0%BD%D0%B4%D1%80).zip тут].
+
return *this;
 +
} /* end of 'operator+=' function */
  
<div class="mw-collapsible-content">
+
vec & operator-=( const vec &B )
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
{
 +
X -= B.X;
 +
Y -= B.Y;
  
#include <iostream>
+
return *this;
#include <vector>
+
} /* end of 'operator-=' function */
#include<math.h>
 
  
using namespace std;
+
vec & operator*=( const double N )
class f{
+
{
    private:
+
X *= N;
    double st, en, d; //начало, конец, дельта
+
Y *= N;
    vector<double> v;//вектор, содержащий y
 
    public:
 
    f(double _st, double _en, double _d, vector<double> _v){
 
        st=_st;
 
        en=_en;
 
        d=_d;
 
        for(int i=0;i<_v.size();i++) //копируем массив, который вводим в консоль
 
            v.push_back(_v[i]);
 
        //return *this;
 
    }
 
    f(){};
 
    f aprox(double _st, double _en, double _d){ //метод интерполяции, поиск коэфф a и b для y=ax+b
 
        double sum_x=0, sum_y=0, sum_2x=0,sum_xy=0,a,b;
 
        for(int i=0; i<=(en-st)/d; i++)
 
            sum_x=sum_x+st+i*d;
 
        for(int i=0; i<=(en-st)/d; i++)
 
            sum_y=sum_y+v[i];
 
        for(int i=0; i<=(en-st)/d; i++)
 
            sum_2x=sum_2x+pow(st+i*d,2);
 
        for (int i=0; i<=(en-st)/d; i++)
 
            sum_xy=sum_xy+v[i]*(st+i*d);
 
        a=(((en-st)/d+1)*sum_xy-sum_x*sum_y)/(((en-st)/d+1)*sum_2x-sum_x*sum_x);
 
        b=(sum_y-a*sum_x)/(((en-st)/d+1));
 
  
        vector<double> v1;//вектор, содержащий проинтерполированную функцию
+
return *this;
            for(int i=0; i<=(en-st)/d; i++)
+
} /* end of 'operator*=' function */
                v1.push_back(a*(st+i*d)+b);//добавление значений проинтерполированной ф-ции с шагом другой функции
 
        return f(_st,_en,_d,v1);
 
  
    }
+
vec & operator/=( const double N )
 +
{
 +
X /= N;
 +
Y /= N;
  
    f operator +(f x){//оператор сложения
+
return *this;
        double _en,_st,_d;
+
} /* end of 'operator/=' function */
        _en=min(en,x.en); //поиск области пересечения
 
        _st=max(st,x.st);
 
        if (_en>_st){//проверяем, пересекаются ли функции
 
            vector<double> _v;
 
            f y;
 
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
 
                vector<double> _v;
 
                y=x.aprox(_st, _en, d);
 
                for (int i=0; i<=(_en-_st)/d; i++)
 
                    _v.push_back(y.v[i]+v[i]); //вектор с суммой функций
 
                return f(_st,_en,d,_v);
 
            }
 
            else{
 
                vector<double> _v;
 
                y=this->aprox(_st, _en, x.d); //this-> функция, в которой мы работаем
 
              for (int i=0; i<=(_en-_st)/x.d; i++)
 
                    _v.push_back(y.v[i]+x.v[i]);
 
                return f(_st,_en,x.d,_v);
 
            }
 
        }
 
    }
 
  
    f prot(){ //поиск противоположной функции
+
double operator!( void ) const
        for (int i=0; i<=(en-st)/d; i++)
+
{
            v[i]=(-1)*v[i];
+
return double(X * X + Y * Y);
        return *this;
+
} /* end of 'operator!' function */
    }
 
  
    f operator - (f x){ //разность функций
+
/* Access vector components by index function */
        return(*this + x.prot());
+
double operator[]( const int i ) const
    }
+
{
 +
switch (i)
 +
{
 +
case 0:
 +
return double(X);
 +
case 1:
 +
return double(Y);
 +
}
 +
} /* end of 'operator[]' function */
  
f operator *(f x){//оператор умножения
+
/* Normalizing vector function */
        double _en,_st,_d;
+
vec & Normalize( void )
        _en=min(en,x.en); //поиск области пересечения
+
{
        _st=max(st,x.st);
+
double len = !*this;
        if (_en>_st){//проверяем, пересекаются ли функции
 
            vector<double> _v;
 
            f y;
 
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
 
                vector<double> _v;
 
                y=x.aprox(_st, _en, d);
 
                for (int i=0; i<=(_en-_st)/d; i++)
 
                    _v.push_back(y.v[i]*v[i]); //вектор с суммой функций
 
                return f(_st,_en,d,_v);
 
            }
 
            else{
 
                vector<double> _v;
 
                y=this->aprox(_st, _en, x.d); //this-> функция, в которой мы работаем
 
              for (int i=0; i<=(_en-_st)/x.d; i++)
 
                    _v.push_back(y.v[i]*x.v[i]);
 
                return f(_st,_en,x.d,_v);
 
            }
 
        }
 
    }
 
  
f obr(){
+
if (len != 1 && len != 0)
  for (int i=0; i<=(en-st)/d; i++)
+
*this /= sqrt(len);
            v[i]=1/v[i];
+
return *this;
        return *this;
+
} /* end of 'Normalize' function */
}
+
}; /* end of 'vec' class */
 +
 
 +
/* Graph class */
 +
class graph
 +
{
 +
public:
 +
double MinX, MaxX, Step; // Начальная координата по X; Конечная координата по X; Шаг функции
 +
int N; // Количество точек
 +
vec *mas, *Color; // Массивы точек и цветов
  
f operator /(f x){
+
/* Default constructor */
return(*this*x.obr());
+
graph( void )
}
+
{
 +
MinX = -10, MaxX = 10, Step = 0.1, N = 200;
 +
}
  
    void vivod(){ //вывод
+
/* Class constructor */
    for(int i=0; i<v.size(); i++)
+
graph( double _MinX, double _MaxX, double _Step ) : MinX(_MinX), MaxX(_MaxX), Step(_Step)
        cout<<v[i]<<" ";
+
{
 +
N = (int)((MaxX - MinX) / Step);
 +
// Выделение памяти
 +
mas = new vec[N];
 +
Color = new vec[N];
 +
}
  
    }
+
/* Load Array of points function */
};
+
void LoadArray( char *FileName );
int main(){
 
    setlocale(LC_ALL, "Russian");
 
    double a,b,a1,b1,d,d1,t;
 
    int o;
 
    cout << "Введите начала и конец отрезка и дельту: ";
 
    cin>>a>>b>>d;
 
    int amount=(b-a)/d+1,amount2;
 
    vector<double>x;
 
    cout << "Введите " << amount << " значений функции на данном интервале:";
 
    for (int i=0; i<amount; i++)
 
    {
 
        cin>>t;
 
        x.push_back(t);
 
    }
 
  
    cout << "Проделаем ровно то же самое для 2 функции ";
+
/* Fill mas function */
    cout << "Введите начала и конец отрезка и дельту: ";
+
void Fill( double(*f)(double) );
    cin >> a1 >> b1 >> d1;
 
  
    amount2=(b1-a1)/d1+1;
+
/* Draw graph function */
    vector<double>y;
+
void Draw( double(*f)(double) );
    cout << "Введите " << amount2 << " значений функции на данном интервале:";
 
    for (int i=0; i<amount2; i++)
 
    {
 
        cin>>t;
 
        y.push_back(t);
 
    }
 
    f g(a,b,d,x);
 
    f h(a1,b1,d1,y);
 
  
    cout<<"Выберете дейстивя с функциями: +, -, *, \ " << endl;
+
/* Draw graph function */
    cout<<"Введите число, соответсвующее порядковому номеру операции(1-4) - ";
+
void Draw( void );
    cin>>o;
 
    if(o==1){              //по невыясненным причинам одновременно написанные слева идущие if -ы не работают,
 
        cout<<"Сумма:";    //но если заккоментить их и менять знак + в скобке на другие, то все работает
 
        (g+h).vivod();
 
  
    }
+
/* Interpolation draw graph function */
 +
void Interpolation_Draw( double i_step );
  
    if(o==2){
+
/* Interpolation graph function */
        cout<<"Разность:"
+
graph Interpolation( double i_step );
        (g-h).vivod();
 
  
    }
+
/* Sum of 2 graphics function */
 +
graph operator+( graph &G );
 +
 
 +
/* Save Array of points function */
 +
void SaveArray( void );
 +
 
 +
/* Approximation of function function */
 +
void Approximation( void );
 +
}; /* end of 'graph' class */
 +
 
 +
#endif /* _GRAPH_H_ */
 +
 
 +
/* End of 'GRAPH.H' file */
 +
</syntaxhighlight>
 +
</div>
 +
[http://tm.spbstu.ru/File:T05GRAPH.7z Скачать архив]
 +
<br>
  
    if(o==3){
+
 
        cout<<"Произведение:"
+
'''[[Абрамов Игорь]]'''
        (g*h).vivod();
+
 
 +
'''Алгоритм''': функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно двумя способами: с помощью математических функций из стандартных библиотек, указывая начало и конец отрезка, а также шаг, с которым определена функция, и считывая координаты точек из файла, предварительно считав их количество. Далее с любыми функциями можно производить следующие действия и их комбинации: сложение, вычитание, кубическая интерполяция и линейная аппроксимация. При этом результат каждого из этих действий - новая функция, с которой можно продолжать работу. Функции можно выводить на экран с помощью средств графической библиотеки OpenGL, а также печатать её значения в файл.
 +
 
 +
'''Инструкция''': пользователь вводит необходимые действия с функциями в функции Display. На данный момент при запуске программы можно увидеть пример её работы: первая функция считывается из файла, интерполируется и выводится на экран. Затем вторая функция вводится из библиотеки math.h интерполируется и выводится на экран. Затем функции суммируются, интерполируются и выводятся на экран. [[:File:Func_Abramov.rar]]
 +
 
 +
Ссылка на скачивание: [http://tm.spbstu.ru/File:Func_Abramov.rar]
  
  
    }
+
'''[[Анастасия Бальцер]]'''
  
    if(o==3){
+
'''Описание программы''': Программа считывает из файла значения функций и количество точек, затем с ними можно провести следующие действия: сложить, умножить, линейно интерполировать и линейно аппроксимировать. Все результаты выводятся в отдельные файлы.
        cout<<"Отношение:"
 
        (g/h).vivod();
 
    }
 
  
 +
'''Пояснения к работе''': В два текстовые файла занести количество точек и значения абсцисс и ординат функций, который написать в первом и втором пунктах меню, затем выбрать необходимую операцию и ввести имя файла, в который сохранятся полученные значения.
  
}
+
Скачать можно  [http://tm.spbstu.ru/Файл:inter.zip тут].
  
</syntaxhighlight>
 
</div>
 
  
 
'''[[Тимошенко Валентина]]'''
 
'''[[Тимошенко Валентина]]'''
Строка 4141: Строка 4293:
 
</div>
 
</div>
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''[[Уманский Александр]]'''
 
  
'''Инструкция к программе''': пользователь вводит начало и конец отрезка и шаг для функций, после чего создается две функции. Затем функции суммируются, после чего пользователь вводит значение нового шага, суммированная функция интерполируется по новому шагу, после этого по МНК(методу наименьших квадратов) функция апроксимируется.
 
  
  
  
Скачать программу можно по [http://mech.spbstu.ru/File:Untitled1.rar ссылке]
+
'''[[Васильева Анастасия]]'''
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
 
Метод наименьших квадратов
+
'''Инструкция к программе''':сначала в папке с программой создаются два файла input1 и input2, в которых на первой строчке число точек в функции, а потом в два столбика значения х и у (функции должны быть с одинаковым шагом). Пользователь поочередно выбирает действия: 1 - нужно будет написать имя файла, откуда считывать значения для первой функции (х и у), 2 - для второй функции, 3 - сложение функций, пишем название файла, куда будут записываться значения, 4 - разность, 5 - умножение, 6 - интерполяция функции с шагом 0,5 , получившейся в результате сложения двух начальных,(можно сделать интерполяцию функций, которые получились в результате разности или умножения, но нужно будет в коде в case 6: newf3.Inter(0.5).output() поменять индекс функции и новый шаг), 7 - аппроксимация функции, получившейся в результате сложения двух начальных,(можно сделать аппроксимацию функций, которые получились в результате разности или умножения, но нужно будет в коде в case 7: newf3.Approxy().output() поменять индекс функции), 8 - выход.
задача состоит в том, чтобы минимизировать выражение:
 
1: http://mech.spbstu.ru/images/b/b0/003.png
 
Доказано, что минимум достигается при:
 
2: http://mech.spbstu.ru/images/2/20/005.png
 
записываем пункт 2 в нашу программу, находим коэффициенты и находим значение линейной функции y=ax+b, по интерполированным значениям x.
 
  
 +
'''Краткое описание алгоритма''':  функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно считывая координаты точек из файла. Далее с любыми функциями можно производить следующие действия: сложение, вычитание, умножение, интерполяция и аппроксимация. При этом результат каждого из этих действий - новая функция. Результаты выводятся в файл.
 +
Скачать программу можно по ссылке [http://tm.spbstu.ru/Файл:1.zip].
  
<div class="mw-collapsible-content">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
  
#include <iostream>
 
#include <math.h>
 
#include <iomanip>
 
#include<stdlib.h>
 
using namespace std;
 
  
class func
+
'''[[Капитанюк Светлана]]'''
{
 
private:
 
    double a/*начало*/,b/*конец*/,c/*шаг*/,k/**/,m/**/,rr/**/;
 
    int d/*переменная для изменения типа, кол-во элементов для начальных элементов*/,tt/*переменная для изиенения типа, кол-ва элементов для счёта суммы*/;
 
    double *F/*массив для значений У*/, *X/*Массив для значений Х*/, *R/*массив для значений У после интерполяции*/, *Q;
 
public:
 
  
    func (double a1, double b1, double c1):a(a1),b(b1),c(c1)//создаём конструктор для функции
+
'''Описание программы:''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции
    {
 
        double p = (b-a)/c;
 
        d = (int)p;
 
        if (b > (d*c+a)) d += 2; //в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
 
        else d += 1;
 
  
        F = new double [d];//создание динамического массива для У
+
Скачать можно  [http://tm.spbstu.ru/File:Function_02.zip тут].
        X = new double [d];// создание динамического массива для Х
 
        X[0]=a;//первый элемент
 
        X[d-1]=b;//последний элемент, для того чтобы последний элемент был в конце промежутка, чтобы его не потерять
 
        for(int i = 1; i < d-1; i++) X[i]=a+c*i; //присваивание значений всех Х
 
  
    }
+
'''[[Демченко Артём]]'''
    void first ()//функция для первой функции
 
    {
 
        double y;//в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
 
        F[0]=pow(2,a);//объявление значения У для начала промежутка
 
        F[d-1]=pow(2,b);//объявление значения У для конца промежутка
 
        for(int i = 1; i < d-1; ++i)
 
        {
 
            y = pow(2,((c*i)+a));//высчитываем значения У внутри промежутка
 
            F[i] = y;//присваиваем массиву значения по У
 
        }
 
  
        cout << " " << endl;//пробел и конец строки
+
'''Описание программы''': В программе создается две функции, которые мы можем просуммировать, интерполировать каждую из них и аппроксимировать каждую из них. После каждой операции ( кроме аппроксимации ) значения записываются в файл.
    }
 
  
    void second ()//функция для второй функции
+
'''Инструкции''': Запустите программу и выбором одного из трех параметров в меню выберете желаемую операцию. Далее следуйте указаниям из меню.
    {
 
        if(a==0 || b==0) return;
 
        F[0]=1*a*a; //присваивание значения функции в начале промежутка
 
        F[d-1]=1*b*b;//присваивание значения функции в конце промежутка
 
  
        for(int k = 1; k <d-1; ++k)
 
        {
 
            double n = c*k+a;
 
            if (n != 0)//условие неделимости на ноль
 
            {
 
                F[k] = 1*n*n;
 
            }
 
        }
 
  
    }
+
Скачать можно  [http://tm.spbstu.ru/File:MyFunc.zip тут].
  
    void operator +(func Q)//перегрузка оператора +
 
    {
 
        sum(Q);
 
    }
 
  
    void sum (func Q)//функция суммирования функций на интерполированном шаге
+
'''[[Лобанов Илья]]'''
    {  double m, p = (b-a)/c;
 
    int i;
 
        R=new double[d+2];
 
          if (b > (d*c+a)) d += 2; //в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
 
        else d += 1;
 
    m=a;
 
cerr<<"\n";
 
  
        for(i = 0; i <d-1; ++i)//цикл суммирования функций и вывода значений суммы, функций и иксов
+
'''Описание программы''':
        {
+
Программа позволяет складывать , вычитать , делить,умножать 2 функции,заданные на одном интервале.При считывании с файла сначала указывается отрезок, потом величина шага, а потом дискретные значения.
 +
 
 +
Скачать можно [[http://tm.spbstu.ru/File:func.rar тут]]
 +
 
 +
'''[[Гильманов Илья]]'''
  
            cerr <<"YFirst: "<< F[i] << "  ";
+
'''Описание программы''': программа, с помощью которой можно складывать, умножать, вычитать, делить 2-е функции, аппроксимировать,интерполировать.
            cerr << "YSecond: "<< Q.F[i] << "  ";
 
            R[i] = F[i] + Q.F[i];
 
            cerr << "Ysum: "<< R[i] << "  ";
 
            cerr << "X:" << m << '\n';
 
  
            m=m+c;
+
'''Суть программы:''' Программа позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
        }
 
  for(i = 0; i <d-1; ++i)
 
        {Q.F[i]=R[i];
 
}
 
        cerr << " " << endl;
 
    }
 
  
double interp( double pnt/*новый шаг*/, func Q)//функция для интерполяции функции
+
'''Инструкция к программе''':
    {double p,h,i,w,*X,aApr,bApr,X2sm,XYsm,Xsm/*хранит сумму интерполированных иксов*/,Ysm/*хранит сумму интерполированных игреков*/;
+
1. Пользователь вводит параметры первой функции  
    int q,k,l,o;
+
2. Пользователь вводит параметры второй функции
    p=(b-a)/pnt+1;
+
3. Происходит интерполяция первой функции по второй
    q=int(p);
+
4. Пользователь выбирает арифметическую операцию
    R=new double [q];
+
5. При желании пользователь может выполнить аппроксимацию полученного результата
    X=new double [q];
 
  
    l=0;
+
Скачать можно [[http://mech.spbstu.ru/File:Gilmanov_Func.rar здесь]]
    k=0;
 
  
    for(h=a/*начало функции*/; h<=b/*конец функции*/; h=h+c/*старый шаг*/) //шагает по нормальному шагу
+
'''[[Киселёв Лев]]'''
    {
+
'''Описание программы''':программа позволяет интерполировать и аппроксимировать значения функции, а также складывать две функции, используя перегрузку.
        for(i=a-1; i<=b; i=i+pnt/*новый шаг*/)
 
          if((i>h)&&(i<=(h+c)))//проверяет лежит ли новый шаг между точками старого
 
            {  R[k]=(Q.F[l]-Q.F[l-1])*(i-h)/c+Q.F[l-1];//формула интерполяции
 
                cout<<"\n"<<"Yinter: "<<R[k]<<"  "<<"X: "<<i-1;//вывод интерполированных значений и иксов
 
                X[k]=i-1;
 
                k++;
 
            }
 
        l++;
 
    }
 
    cout<<"\n";
 
    cout<<"\n";
 
    cout<<"\n";
 
    //обнуление значений сумм для МНК
 
    Xsm=0;
 
    Ysm=0;
 
    XYsm=0;
 
    X2sm=0;
 
  
    for(o=0;o<=k;o++)//цикл подготавливает суммы для МНК
+
Скачать можно [[http://mech.spbstu.ru/File:Interpol.rar здесь]]
        {Xsm+=X[o];
 
        Ysm+=R[o];
 
        XYsm+=X[o]*R[o];
 
        X2sm+=X[o]*X[o];
 
        }
 
  
aApr=(k*XYsm-Xsm*Ysm)/(k*X2sm-Xsm*Xsm);//находим коэфициенты по МНК
+
'''[[Сергей Ляжков]]'''
bApr=(Ysm-a*Xsm)/k;
+
'''Описание программы''':программа позволяет проводить следующие действия с функциями: сложение, вычитание, умножение, те же действия с числами, проводить аппроксимацию и интерполяцию
cout<<"\n"<<"aAprox"<<a<<"  "<<"bAprox"<<b<<"\n";//выводим их
+
Скачать можно [[http://tm.spbstu.ru/File:Функции.zip тут]]
for(o=0;o<k;o++)
 
        {c=aApr*X[o]+bApr;//считаем значение Y при данных коэфициентах
 
        cout<<"YAprox: "<<c<<" "<<"X:"<<X[o]<<"\n" ;
 
        }
 
 
 
 
 
    return 0;}
 
};
 
 
 
int main(){
 
    double x, xn, s1,pnt;
 
    cout << "Input the beginning of the function: " << endl;
 
    cin >> x;
 
    cout << "Input the ending of the function: " << endl;
 
    cin >> xn;
 
    cout << "Input step for the function: " << endl;
 
    cin >> s1;
 
    func H(x,xn,s1);
 
    H.first();
 
    func G(x,xn,s1);
 
    G.second();
 
    H+G;
 
    cout<<"\n" << "Input new step for the function: " << endl;
 
    cin >> pnt;
 
    H.interp(pnt,G);
 
 
 
return 0;}
 
</syntaxhighlight>
 
</div>
 
Вам запрещено изменять защиту статьи. Edit Создать редактором

Обратите внимание, что все добавления и изменения текста статьи рассматриваются как выпущенные на условиях лицензии Public Domain (см. Department of Theoretical and Applied Mechanics:Авторские права). Если вы не хотите, чтобы ваши тексты свободно распространялись и редактировались любым желающим, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого.
НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ МАТЕРИАЛЫ, ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ!

To protect the wiki against automated edit spam, we kindly ask you to solve the following CAPTCHA:

Отменить | Справка по редактированию  (в новом окне)