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

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

Внимание! Вы не авторизовались на сайте. Ваш 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++)
 +
        {
 +
            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++)
1. Пользователь вводит параметры первой функции
+
        {
2. Пользователь вводит параметры второй функции
+
            for (int j = 0; j < (general - 1); j ++)
3. Происходит интерполяция первой функции по второй
+
            {
4. Пользователь выбирает арифметическую операцию
+
                dot temp;
5. При желании пользователь может выполнить аппроксимацию полученного результата
+
                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--;
 +
                }
 +
            }
 +
        }
  
Скачать можно [[http://mech.spbstu.ru/File:Gilmanov_Func.rar здесь]]
+
        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++)
 
+
        {
Скачать можно  [http://tm.spbstu.ru/File:MyFunc.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;
 +
    }
 +
    };
  
'''Краткое описание алгоритма''': Программа ищет совместную область определения для двух заданных пользователем функций. Для каждой из них вводится шаг и первое и последнее значения. После поиска совместной области программа интерполирует две функции и создает третью функцию, в которую сохраняются результаты работы программы, то есть сложение, вычитание, деление и умножение двух изначальных функций.
+
    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);
 +
            }
  
'''Инструкция к программе''': Введите поочередно первый и последний элементы функций, а также их шаги. После этого введите число, соответствующее желаемому действию (соответствие указано в меню программы).
+
        }
 
+
        {
Посмотреть программу можно [http://tm.spbstu.ru/Файл:main.zip здесь]
+
            for (int i = tmp.k1 ; i < (general) ; i++)
 
+
        {
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
 
+
            if (tiger.pol == true)
#include <iostream>
+
            {
#include <fstream>
+
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
#include <cstring>
+
                                            F3.massiv[i].x,
#include <stdlib.h>
+
                                            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;
 +
        }
  
using namespace std;
+
        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--;
 +
                }
 +
            }
 +
        }
  
ofstream outfile;
+
        for (int i = 0 ; i < general ; i++)
 +
        {
  
struct approx                                              //структура, необходимая для функции линейной интерполяции
+
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
{
+
        }
    double koefficientA, koefficientB;
 
};
 
  
struct dot                                                  //структура, содержащая в себе значения координат каждой точки
 
{                                                          //по обеим осям
 
    double x, y;
 
};
 
  
struct polyana                                              //структура, содержащая номера первого и последнего элемента каждой
+
        stars normalny(general);
{                                                           //функции и количество элементов каждой из них
+
        for (int i = 0; i < (general); i++)
     int a1, a2, b1, b2, k1, k2;
+
        {
};
+
            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 trees                                               //структура, содержащая номер элемента и логическое значение,
+
    trees love (double a)                                  //
{                                                           // отвечающее за нужность или не нужность интерполяции
+
    {
    bool pol;                                               //при равенстве или неравенстве энных элементов двух функций
+
        trees privet;
    int n;
+
        for (int i = 0; i < k; i++ )
};
+
            if ((massiv[i].x < a)&& (a < massiv[i+1].x))
                                                            //непосредственно функция линейной интерполяции
+
            {
double pentagon (double x1, double x, double x2, double y1, double y2)
+
                privet.n = i;
{
+
                privet.pol = true;
    return (((x - x1)/(x2- x1))*(y2 - y1) + y1);
+
                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 stars                                                //класс, позволяющий сохранять дискретные значения функции на
 
{                                                          //определенном интервале с определенным шагом
 
    private:
 
  
         double a;                   //первое значение функции
+
    approx approximate ()                                  //функция аппроксимации
         double b;                   //последнее значение функции
+
    {
         double step;               //шаг
+
         approx hey;
         int length;                 //длина
+
        stars mattafix (double a, double b, double step, int k, int length);
         int k;                     //счетчик количества элементов
+
        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;
  
    public:
 
  
        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;
+
int main()
            k = 0;
+
{
 +
    int tyu;
 +
    stars function3;
 +
    int firstnumber1;
 +
    int firstnumber2;
 +
    int lastnumber1;
 +
    int lastnumber2;
 +
    int step1;
 +
    int step2;
 +
    while (true)
 +
    {
  
            for (int i = _a ; i <= _b ; i += step)          //подсчет количества элементов функции
+
        cout << "Input 0 - vvedite parametry pervoy funkcii"<< endl;
            {
+
        cout << "Input 1 - vvedite parametry vtoroy funkcii"<< endl;
                k++;
+
        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 ;
  
             massiv = new dot [k];                           //задание функции
+
        switch (tyu)
            for (int i = 0 ; i < k ; i++)
+
        {
              {
+
            case 0:
                    massiv[i].x = _a + _step * i;
+
             {  cout << "Vvedite pervy x" << endl;
                    massiv[i].y = i * 5;
+
                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 ();
  
        void outinfile ()                                   //вывод в файл значений функции
+
                stars function2 (firstnumber2, lastnumber2, step2);
        {
+
                function2.out();
            outfile.open ("meow", ios :: app);
+
                function2.outinfile ();
  
            outfile << "x" << "          " << "y" << endl;
+
                function3 = function1 + function2;
            for (int i = 0 ; i < k ; i++)
+
                function3.out();
                 {
+
                 function3.outinfile ();
                    outfile << massiv[i].x << "        " << massiv[i].y << endl;
+
                 break;
                 }
+
            }
             outfile << endl;
+
             case 3:
            outfile.close();
+
            {
        }
+
                stars function1 (firstnumber1, lastnumber1, step1);
 +
                function1.out();
 +
                function1.outinfile ();
  
        void out ()                                         //вывод на экран значений функции
+
                stars function2 (firstnumber2, lastnumber2, step2);
        {
+
                function2.out();
            cout << "x" << "          " << "y" << endl;
+
                 function2.outinfile ();
            for (int i = 0 ; i < k ; i++)
 
                 {
 
                    cout << massiv[i].x << "        " << massiv[i].y << endl;
 
                }
 
            cout << endl;
 
        }
 
  
        polyana prepare (stars &h)                         //подготовка совместной области определения для двух функций -
+
                function3 = function1 * function2;
        {                                                  //той части значений множества Х, на которой будут
+
                function3.out();
            trees del;                                     //производиться вычисления
+
                function3.outinfile ();
             polyana tmp;
+
                break;
             if (massiv[0].x > h.massiv[0].x)                //поиск начала совместной области определения
+
             }
 +
             case 4:
 
             {
 
             {
                 del = h.love(massiv[0].x);
+
                 stars function1 (firstnumber1, lastnumber1, step1);
                 tmp.a2 = del.n + 1;
+
                 function1.out();
                 tmp.a1 = 0;
+
                 function1.outinfile ();
            }
+
 
            else
+
                 stars function2 (firstnumber2, lastnumber2, step2);
                 if (massiv[0].x < h.massiv[0].x)
+
                 function2.out();
                 {
+
                function2.outinfile ();
                    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;
 
                    };
 
  
            if (massiv[k-1].x > h.massiv[k-1].x)           //поиск конца совместной области определения
+
                function3 = function1 / function2;
 +
                function3.out();
 +
                function3.outinfile ();
 +
                break;
 +
            }
 +
            case 5:
 
             {
 
             {
                 del = h.love(massiv[k-1].x);
+
 
                 tmp.b2 = k-1;
+
                stars function1 (firstnumber1, lastnumber1, step1);
                 tmp.b1 = del.n;
+
                 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[k-1].x < h.massiv[k-1].x)
 
 
                 {
 
                 {
                     del = h.love(massiv[k-1].x);
+
                     approx you;
                     tmp.b2 = del.n;
+
                    function3.approximate();
                     tmp.b1 = k-1;
+
                    outfile.open ("meow", ios :: app);
 +
                     outfile << "Y = "<< you.koefficientA <<"* x + "<<you.koefficientB << endl;
 +
                    outfile << endl;
 +
                     outfile.close();
 +
 
 +
 
 
                 }
 
                 }
                else
+
            }
                    if (massiv[k-1].x == h.massiv[k-1].x)
+
        }
                    {
+
    };
                        tmp.b2 = k-1;
+
 
                        tmp.b1 = k-1;
+
 
                    };
+
</syntaxhighlight>
 +
</div>
 +
 
 +
 
  
            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;
 
            }
 
  
        }
+
Cкачать программу можно [http://tm.spbstu.ru/Файл:Loseva.rar здесь]
        {
 
          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++)                  //сортировка
+
<div class="mw-collapsible-content">
        {
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
            for (int j = 0; j < (general - 1); j ++)
+
#include <iostream>
            {
+
 
                dot temp;
+
using namespace std;
                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--;
 
                }
 
            }
 
        }
 
  
 +
#define N 5//количество точек
  
        stars normalny (general);                           //создание элемента класса по длине
+
const double l1 = 5;//задаём начальный шаг функций
        for (int i = 0; i < (general); i++)
+
const double l2 = 0.7;//шаг для интерполяции
        {
 
            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)                        //умножение
+
class Func
    {
+
{//класс,хранящий функцию,содержащий методы:печать,перегрузка,интерполяция,апроксимация
        polyana tmp = prepare(v);
+
 
        int general = tmp.k1 + tmp.k2;
+
public:
        stars F3(tmp.k1 + tmp.k2);
+
Func(int size) : size_(size), ax(new double[size]), by(new double[size])//создаём два массива,заполняем нулями
        for (int i = 0 ; i < tmp.k1 ; i++)
+
{
        {
+
for (int i = 0; i< size_; i++)
            F3.massiv[i].x = massiv[i+tmp.a1].x;
+
{
            trees tiger = v.love(massiv[i+tmp.a1].x);
+
ax[i] = 0;
            if (tiger.pol == true)
+
by[i] = 0//все элементы обоих массивов обнуляются
            {
+
}
                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;
 
            }
 
  
        }
+
void print()//вывод на экран
        {
+
{
            for (int i = tmp.k1 ; i < (general) ; i++)
+
cout << "x: ";
        {
+
for (int i = 0; i < size_; i++)
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
+
cout << ax[i] << " ";
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
+
cout << endl << "y: ";
            if (tiger.pol == true)
+
for (int i = 0; i < size_; i++)
            {
+
cout << by[i] << " ";
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
+
cout << endl;
                                            F3.massiv[i].x,
+
}
                                            v.massiv[tiger.n + 1].x,
+
 
                                            v.massiv[tiger.n].y,
+
Func &operator+(Func &f2)//функция перегрузки:cложение функций
                                            v.massiv[tiger.n + 1].y )
+
{
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
+
Func *result = new Func(size_);//создаём результирующую функцию,равную сумме двух f2 и this
            }
+
for (int i = 0; i < size_; i++)
            else
+
{
                F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
+
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;
 +
}
  
        for (int i= 0; i < (general); i++)
+
void Int(double L) //метод Интерполяции
        {
+
{
            for (int j = 0; j < (general - 1); j ++)
+
int M = (this->ax[this->size_ - 1] - this->ax[0]) / L + 1; //M- количество элементов массива с координатами интерполирующей функции;
            {
+
Func result = Func(M);//cоздаём функцию,в кторой будет храниться результат интерполяции
                dot temp;
+
cout << "M =" << M << endl;//выводим M для проверки
                if (F3.massiv[j].x > F3.massiv[j+1].x)
+
cout << "Interpolation: " << endl;
                {
+
int t;
                    temp = F3.massiv[j];
+
for (int i = 1; i < M; i++)
                    F3.massiv[j] = F3.massiv[j+1];
+
{
                    F3.massiv[j+1] = temp;
+
result.ax[0] = this->ax[0];
                }
+
result.ax[i] = result.ax[i - 1] + L;//интерполируем Х,прибавляя шаг к каждому предыдущему элементу
                else
+
t = (result.ax[i - 1] - result.ax[0]) / l1;//считаем номер элемента,"левого" от искомого
                if (F3.massiv[j].x == F3.massiv[j+1].x)
+
 
                {
+
                      //интерполируем Y по формуле
                    int l = j;
+
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]);
                    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;
+
result.print();//выводим результат
        }
+
}
  
 +
void aprox()//Апроксимация
 +
{
 +
double a=0;
 +
          for(int i=0;i<size_;i++)//считаем сумму x
 +
  a=this->ax[i]+a;
 +
       
  
        stars normalny(general);
+
double b=0;
        for (int i = 0; i < (general); i++)
+
for(int i=0;i<size_;i++)//считаем сумму y
        {
+
b=this->by[i]+b;
            normalny.massiv[i].x = F3.massiv[i].x;
+
            normalny.massiv[i].y = F3.massiv[i].y;
+
 
        }
+
double c=0;
        a = normalny.massiv[0].x;
+
for(int i=0;i<size_;i++)//считаем сумму квадратов x
        b = normalny.massiv[general].x;
+
c=(this->ax[i])*(this->ax[i])+c;
        return normalny;
+
    }
 
    };
 
  
    stars operator- (stars & v)                            //вычитание
+
double d=0;
    {
+
for(int i=0;i<size_;i++)//считаем сумму xy
        polyana tmp = prepare(v);
+
d=(this->ax[i])*(this->by[i])+d;
        int general = tmp.k1 + tmp.k2;
+
        stars F3(tmp.k1 + tmp.k2);
+
 
        for (int i = 0 ; i < tmp.k1 ; i++)
+
//затем решаем систему для у=kx+m
        {
+
//(1)c*k+a*m=d
            F3.massiv[i].x = massiv[i+tmp.a1].x;
+
//(2)a*k+size_*m=b;
            trees tiger = v.love(massiv[i+tmp.a1].x);
+
//k=(d-am)/с
            if (tiger.pol == true)
+
//подставим в (2)
            {
+
double m;
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,      F3.massiv[i].x,
+
m=(b*c-a*d)/(c*size_-a*a);
                                          v.massiv[tiger.n + 1].x,  v.massiv[tiger.n].y,
+
double k;
                                          v.massiv[tiger.n + 1].y )- massiv[i+tmp.a1].y;
+
k=(d-a*m)/c;
            }
+
cout<<"aproximacia :: ";
            else
+
cout<<"y="<<k<<"x+"<<m<<endl;
            {
+
 
                F3.massiv[i].y = v.massiv[tiger.n].y - massiv[i+tmp.a1].y;
+
}
            }
+
 
 +
 
 +
double *ax;
 +
double *by;
 +
 
 +
private:
 +
int size_;//размер массива
 +
};
  
        }
 
        {
 
            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++)
 
        {
 
  
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
+
class Cord//класс,создающий и хранящий значение функций
        }
+
{
 +
public:
 +
Cord(double x0, double s) :x0(x0), s(s)//x0-начальная координата;s-шаг
 +
{
 +
}
  
 +
void Fyx1(Func func)//метод,считающий координаты нашей функции y=x
 +
{
 +
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];//считаем координаты у
 +
cout << "f1 :" << endl;
 +
func.print();
 +
cout << endl;
 +
}
  
        stars normalny(general);
+
void Fyx2(Func func)//метод,считающий координаты нашей функции y=x+1
        for (int i = 0; i < (general); i++)
+
{
        {
+
int i;
            normalny.massiv[i].x = F3.massiv[i].x;
+
func.ax[0] = x0;
            normalny.massiv[i].y = F3.massiv[i].y;
+
for (i = 1; i<N; i++)//считаем иксы
        }
+
{
        a = normalny.massiv[0].x;
+
func.ax[i] = x0 + s;
        b = normalny.massiv[general].x;
+
x0 = func.ax[i];
        return normalny;
+
}
    }
+
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;//шаг
 +
};
  
    stars operator/ (stars & v)                             //деление
+
int main()
    {
+
{
        polyana tmp = prepare(v);
+
Func f1(N);//создание функции f1
        int general = tmp.k1 + tmp.k2;
+
Func f2(N);//создание f2
        stars F3(tmp.k1 + tmp.k2);
+
Cord s1(0, l1);//cоздаём объект s1
        for (int i = 0 ; i < tmp.k1 ; i++)
+
Cord s2(0, l1);//cоздаём объект s2
        {
+
s1.Fyx1(f1);//задаём координаты 1ой функции
            F3.massiv[i].x = massiv[i+tmp.a1].x;
+
s2.Fyx2(f2);//задаём координаты 2ой функции
            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++)
+
Func f3 = f2 + f1;//есть тоже ,что и Func f3 = f2.operator+(f1);
        {
+
 
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
+
f1.Int(l2);//Интерполируем f1 с новым шагом l2
            trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
+
f1.aprox();//Апроксимируем f1
            if (tiger.pol == true)
+
            {
+
getchar();
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
+
return 0;
                                            F3.massiv[i].x,
+
}
                                            v.massiv[tiger.n + 1].x,
+
 
                                            v.massiv[tiger.n].y,
+
</syntaxhighlight>
                                            v.massiv[tiger.n + 1].y )
+
</div>
                                            + 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++)
 
        {
 
  
            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;
 
    }
 
    };
 
  
    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;
 
                }
 
    }
 
  
 +
Скачать можно  [http://tm.spbstu.ru/File:project1.rar тут].
  
    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;
 
  
  
    }
 
};
 
  
int main()
+
'''[[Сюрис Александр]]'''
{
+
Задаются две функции с разными шагами и начальными и конечными значениями.  Аппроксимирует одну функцию по шагу другой и складывает/умножает/вычитает/делит их
    int tyu;
+
 
    stars function3;
+
Скачать можно  [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 тут].
    int firstnumber1;
+
 
    int firstnumber2;
+
<div class="mw-collapsible-content">
    int lastnumber1;
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
    int lastnumber2;
 
    int step1;
 
    int step2;
 
    while (true)
 
    {
 
  
        cout << "Input 0 - vvedite parametry pervoy funkcii"<< endl;
+
#include <iostream>
        cout << "Input 1 - vvedite parametry vtoroy funkcii"<< endl;
+
#include <vector>
        cout << "Input 2 - slozhenie"<< endl;
+
#include<math.h>
        cout << "Input 3 - umnozhenie"<< endl;
 
        cout << "Input 4 - delenie"<< endl;
 
        cout << "Input 5 - vychitanie"<< endl;
 
        cout << "Input 6 - aproximate"<< endl;
 
        cin >> tyu ;
 
  
        switch (tyu)
+
using namespace std;
        {
+
class f{
            case 0:
+
    private:
            {  cout << "Vvedite pervy x" << endl;
+
    double st, en, d; //начало, конец, дельта
                cin >> firstnumber1;
+
    vector<double> v;//вектор, содержащий y
                cout << "Vvedite posledniy x" << endl;
+
    public:
                cin >> lastnumber1;
+
    f(double _st, double _en, double _d, vector<double> _v){
                cout << "Vvedite shag" << endl;
+
        st=_st;
                cin >> step1;
+
        en=_en;
                break;
+
        d=_d;
            }
+
        for(int i=0;i<_v.size();i++) //копируем массив, который вводим в консоль
            case 1:
+
            v.push_back(_v[i]);
            {
+
        //return *this;
                cout << "Vvedite pervy x" << endl;
+
    }
                cin >> firstnumber2;
+
    f(){};
                cout << "Vvedite posledniy x" << endl;
+
    f aprox(double _st, double _en, double _d){ //метод интерполяции, поиск коэфф a и b для y=ax+b
                cin >> lastnumber2;
+
        double sum_x=0, sum_y=0, sum_2x=0,sum_xy=0,a,b;
                cout << "Vvedite shag" << endl;
+
        for(int i=0; i<=(en-st)/d; i++)
                cin >> step2;
+
            sum_x=sum_x+st+i*d;
                break;
+
        for(int i=0; i<=(en-st)/d; i++)
             }
+
            sum_y=sum_y+v[i];
            case 2:
+
        for(int i=0; i<=(en-st)/d; i++)
             {
+
             sum_2x=sum_2x+pow(st+i*d,2);
                stars function1 (firstnumber1, lastnumber1, step1);
+
        for (int i=0; i<=(en-st)/d; i++)
                function1.out();
+
             sum_xy=sum_xy+v[i]*(st+i*d);
                function1.outinfile ();
+
        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));
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
        vector<double> v1;//вектор, содержащий проинтерполированную функцию
                 function2.out();
+
            for(int i=0; i<=(en-st)/d; i++)
                function2.outinfile ();
+
                 v1.push_back(a*(st+i*d)+b);//добавление значений проинтерполированной ф-ции с шагом другой функции
 +
        return f(_st,_en,_d,v1);
  
                function3 = function1 + function2;
+
    }
                function3.out();
 
                function3.outinfile ();
 
                break;
 
            }
 
            case 3:
 
            {
 
                stars function1 (firstnumber1, lastnumber1, step1);
 
                function1.out();
 
                function1.outinfile ();
 
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
    f operator +(f x){//оператор сложения
                function2.out();
+
        double _en,_st,_d;
                function2.outinfile ();
+
        _en=min(en,x.en); //поиск области пересечения
 
+
        _st=max(st,x.st);
                 function3 = function1 * function2;
+
        if (_en>_st){//проверяем, пересекаются ли функции
                 function3.out();
+
            vector<double> _v;
                 function3.outinfile ();
+
            f y;
                 break;
+
            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);
 
             }
 
             }
             case 4:
+
             else{
            {
+
                 vector<double> _v;
                 stars function1 (firstnumber1, lastnumber1, step1);
+
                 y=this->aprox(_st, _en, x.d); //this-> функция, в которой мы работаем
                 function1.out();
+
              for (int i=0; i<=(_en-_st)/x.d; i++)
                function1.outinfile ();
+
                    _v.push_back(y.v[i]+x.v[i]);
 
+
                 return f(_st,_en,x.d,_v);
                stars function2 (firstnumber2, lastnumber2, step2);
 
                function2.out();
 
                function2.outinfile ();
 
 
 
                function3 = function1 / function2;
 
                function3.out();
 
                 function3.outinfile ();
 
                break;
 
 
             }
 
             }
            case 5:
+
        }
            {
+
    }
  
                stars function1 (firstnumber1, lastnumber1, step1);
+
    f prot(){ //поиск противоположной функции
                function1.out();
+
        for (int i=0; i<=(en-st)/d; i++)
                function1.outinfile ();
+
            v[i]=(-1)*v[i];
 +
        return *this;
 +
    }
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
    f operator - (f x){ //разность функций
                function2.out();
+
        return(*this + x.prot());
                function2.outinfile ();
+
    }
  
                function3 = function1 - function2;
+
f operator *(f x){//оператор умножения
                function3.out();
+
        double _en,_st,_d;
                function3.outinfile ();
+
        _en=min(en,x.en); //поиск области пересечения
                break;
+
        _st=max(st,x.st);
             }
+
        if (_en>_st){//проверяем, пересекаются ли функции
            case 6:
+
            vector<double> _v;
                 {
+
            f y;
                    approx you;
+
             if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
                     function3.approximate();
+
                vector<double> _v;
                    outfile.open ("meow", ios :: app);
+
                 y=x.aprox(_st, _en, d);
                    outfile << "Y = "<< you.koefficientA <<"* x + "<<you.koefficientB << endl;
+
                for (int i=0; i<=(_en-_st)/d; i++)
                    outfile << endl;
+
                     _v.push_back(y.v[i]*v[i]); //вектор с суммой функций
                     outfile.close();
+
                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(){
 +
  for (int i=0; i<=(en-st)/d; i++)
 +
            v[i]=1/v[i];
 +
        return *this;
 +
}
  
</syntaxhighlight>
+
f operator /(f x){
</div>
+
return(*this*x.obr());
 +
}
  
'''[[Капитанюк Светлана]]'''
+
    void vivod(){ //вывод
 +
    for(int i=0; i<v.size(); i++)
 +
        cout<<v[i]<<" ";
  
'''Описание программы:''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции. функции хранятся в программе как массив точек, заданных с определенным шагом по X на заданном отрезке. Функции заданы автоматически, поэтому нет необходимости вводить каждый промежуток, нужно ввести только начало, конец и шаг. Далее пользователю на выбор будет представлено несколько операций с функциями, такие как: сложение, вычитание, умножение и деление функции одну на другую. Если функции имеют различный шаг, топеред этимони интерполируются. Так же в программе предусмотрена аппроксимация.  
+
    }
 +
};
 +
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 функции ";
 +
    cout << "Введите начала и конец отрезка и дельту: ";
 +
    cin >> a1 >> b1 >> d1;
  
Скачать можно  [http://tm.spbstu.ru/File:Function_02.zip тут].
+
    amount2=(b1-a1)/d1+1;
 +
    vector<double>y;
 +
    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;
'''Описание программы''':программа позволяет интерполировать и аппроксимировать значения функции, а также складывать две функции, используя перегрузку.
+
    cout<<"Введите число, соответсвующее порядковому номеру операции(1-4) - ";
 +
    cin>>o;
 +
    if(o==1){              //по невыясненным причинам одновременно написанные слева идущие if -ы не работают,
 +
        cout<<"Сумма:";    //но если заккоментить их и менять знак + в скобке на другие, то все работает
 +
        (g+h).vivod();
  
Скачать можно [[http://mech.spbstu.ru/File:Interpol.rar здесь]]
+
    }
  
'''[[Козловская Анна]]'''
+
    if(o==2){
 +
        cout<<"Разность:"
 +
        (g-h).vivod();
  
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
+
    }
  
'''Пояснения к алгоритму''': Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
+
    if(o==3){
 +
        cout<<"Произведение:"
 +
        (g*h).vivod();
 +
 
 +
 
 +
    }
 +
 
 +
    if(o==3){
 +
        cout<<"Отношение:"
 +
        (g/h).vivod();
 +
    }
 +
 
 +
 
 +
}
  
 +
</syntaxhighlight>
 +
</div>
  
Скачать можно  [http://tm.spbstu.ru/File:project1.rar тут].
 
  
'''[[Лебедев Станислав]]'''
 
  
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
 
  
'''Пояснения к алгоритму''':
 
#  Прочитанные из файла функции нужно отсортировать.
 
#  Найти совместную область определения, то есть, найти множество пересечения областей определения функций, над которыми совершается операция.
 
#  Создать третью функцию, со следующими свойствами : область определения состоит только из точек, принадлежащих совместной области определения, каждая точка области значений является результатом нужной операции над точкой области значений одной из функций и, либо интерполированной точкой по другой функции, либо, если есть возможность, точным значением из ее области значений.
 
  
Скачать можно  [http://tm.spbstu.ru/Файл:Функции.rar тут].
 
  
 +
'''[[Андреева Полина]]'''
  
<div class="mw-collapsible mw-collapsed" style="width:100%" ><div class="mw-collapsible-content">
+
'''Инструкция к программе:''' пользователь должен ввести начало, конец и шаг. Создается две функции. Затем на экране появляется один из знаков арифметических действий. Пользователь выбирает один из знаков. Создается третья функция. Пользователь вводит второй шаг. Функция интерполируется по этому новому шагу, а затем аппроксимируется.
 +
'''Краткое описание алгоритма :''' в классе создается две функции(с помощью массивов). Так же в классе есть такие методы: перегрузка арифм операций, интерполяция, аппроксимация, вывод массивов на экран и их сохранение в файл. Сначала создается два массива для функций. Затем  с помощью перегрузки эти два массива складываются/умножаются/делятся/вычитаются и записываются опять в этот массив. В методе перегрузки сразу вызывается интерполяция и аппроксимация.
 +
[http://tm.spbstu.ru/Файл:Function.rar Программа]
 +
<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)                                        //базовая функция ( если задавать через шаг и начальный х
 
 
{
 
{
     return x;
+
private:
}
+
     double *mass1, *mass, *masss ;
 
+
    double  AmountDouble, Begin, End, Step, Step2;
struct ap                                                  //две одинаковые структуры это нехорошо,коненчо,но зато наглядно...
+
public:
{
+
    int  AmountInt;
    double k,b;
+
    func ( double _Begin, double _End, double _Step ):Begin(_Begin), End(_End), Step(_Step)
};
+
    {
 +
        AmountDouble=((End-Begin)/Step)+1;///количество точек с данным шагом
 +
        AmountInt=static_cast<int>(AmountDouble);///так как количество это целое число, то округляем
  
struct fun                                                  //один столбик в таблице функции
+
     }
{
 
     double x,y;
 
};
 
  
struct sf                                                  //структура нужная, для возражеия значений из функции "prepare" класса F
+
     void massiv1() ///создание первой функции х^3
{
 
     int i1,i2,e1,e2;
 
    double glength, gfirstx, glastx;
 
};
 
 
 
double intr(double x1,double x2,double x,double y1,double y2) // линенейная интерполяция
 
{
 
    return ( ((x-x1)/(x2-x1)) * (y2-y1) + y1 );
 
}
 
 
 
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;
+
         mass=new double[AmountInt];
         x  += b[i].x;
+
         for (int l=0; l<AmountInt; l++)
         y  += b[i].y;
+
         {
         sqx += b[i].x*b[i].x;
+
            mass[l] =pow((l*Step+Begin),3);
         xsq += b[i].x;
+
         }
 +
         cout << "y=x^3 \n";
 
     }
 
     }
     xsq *= xsq;
+
     void massiv2() ///создание второй функции sin(x)
 
 
    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 вычисляется по базовой функции
 
 
     {
 
     {
         if (l >= 0)
+
         mass=new double[AmountInt];
          a = new fun [l];
+
         for (int l=0; l<AmountInt; l++)
        firstx = f;
 
        length = l;
 
        step = s;
 
        lastx = firstx+(length - 1)*step;
 
 
 
 
 
         for (int i = 0;i < length; i ++)
 
 
         {
 
         {
             a[i].y = base(firstx + i*step);
+
             mass[l] =sin(l*Step+Begin);
            a[i].x = firstx + i*step;
 
 
         }
 
         }
 
+
        cout << "y=sin(x) \n";
 
     }
 
     }
  
     F (fun b[],int l)                                   //конструктор для создания фунции с уже известными областями определния и значений
+
     void interpolation(double __Begin, double __End,  double __Step)
 
     {
 
     {
        length = l;
 
        a = new fun [l];
 
        for (int i = 0; i < l;i++)
 
            a[i] = b[i];
 
  
         for (int i = 0; i < l;i++)
+
         double NewAmount=((__End-__Begin)/__Step) + 1;///количество точек для нового шага
            for (int j = 0; j < (l - 1); j++)
+
         int NewAmountInt=static_cast<int>(NewAmount);
                if (a[j].x > a[j + 1].x)
+
         for (int i=0; i<NewAmountInt; i++)///i-это точки функции с новыми шагами
                {
 
                    fun tmp = a[j];
 
                    a[j] = a[j + 1];
 
                    a[j + 1] = a[j];
 
                }
 
 
 
         firstx = a[0].x;
 
        lastx = a[length - 1].x;
 
    }
 
 
 
    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;
+
             mass1 = new double[NewAmountInt];
             a[i].x = z[i].x;
+
            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();
 
         }
 
         }
         length = l;
+
         AmountInt=NewAmountInt;
 +
        delete[] mass;
 +
        mass=mass1;
 +
        cout<<"end of interpol";
 
     }
 
     }
  
     double getelx(int i)                               //возращает значение из поля "х" iого элемента
+
     void approximation(double __Begin, double __End, double __Step)
 +
 
 
     {
 
     {
         return a[i].x;
+
         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++)
 +
        {
 +
            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;
  
    double getely(int i)                               //возращает значение из поля "х" iого элемента
+
        for (int i=0; i<AmountInt; i++)
    {
+
        {
         return a[i].y;
+
            mass1[i] = a*(i*__Step+__Begin)+b;///такие значения принимает апроксимация
    }
+
        }
 +
         delete[] mass;
 +
        mass=mass1;
 +
        output();///вывод на экран
 +
        SaveFile("approximation.txt");///сохранение в файл
 +
        cout<<"end of appox";
  
    int getlength()                                //возращает размер области определения функции(в точках)
 
    {
 
        return length;
 
 
     }
 
     }
  
     void FOut()                                     //выводит функцию на экран
+
     func operator+( func f)///перегрузка оператора +
 
     {
 
     {
      cout << "  x         y" << endl;
+
         func newmass(Begin, End, Step);
      for (int i = 0;i < length; i ++)
+
         masss=new double[AmountInt];///новая функция равная сумме данныйх функций
          cout << "  " << a[i].x << "         " << a[i].y << endl;
+
         for (int i=0; i<AmountInt; i++)
      cout << endl;
 
    }
 
 
 
 
 
    int pfind(double x)const                        //возращает либо номер элемента,идущщий перед элементом, большим,чем х; в случае нахождения равного, возращает число, противоположное номеру следующего элемента(иначе может вернуться нуль,а нуль знака не имееет)
 
    {
 
         for (int i = 0; i < length-1; i++ )
 
 
         {
 
         {
             if (((a[i].x < x) && (a[i + 1].x > x)))
+
             masss[i] = mass[i] + f.mass[i];
                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;
+
        delete [] mass;
         return -1;
+
        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;
 +
 
 
     }
 
     }
  
     sf prepare(F &x)const                                      //"подготовка" функций к бинарной операции (нахождение совместной области определения
+
     func operator-( func f)
 
     {
 
     {
         sf r;
+
         func newmass(Begin, End, Step);
         if (a[0].x > x.a[0].x)
+
         masss=new double[AmountInt];
 +
        for (int i=0; i<AmountInt; i++)
 
         {
 
         {
             r.gfirstx = a[0].x;
+
             masss[i] = mass[i] - f.mass[i];
            r.i1 = 0;
+
        }
            r.i1 = 0;
+
        delete [] mass;
            double k = x.pfind(a[0].x);
+
        mass = masss;
            if (k < 0)
+
        output();
                r.i2 = -k - 1;
+
        SaveFile("f3.txt");
            else
+
        cout<<"enter new step";
                r.i2 = (k - 1) + 1;
+
        cin>>Step2;
         }
+
        cout<<"interpolation: ";
         else
+
        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++)
 
         {
 
         {
             r.gfirstx = x.a[0].x;
+
             masss[i] = mass[i] / f.mass[i];
            double k = pfind(x.a[0].x);
 
            if (k < 0)
 
                r.i1 = -k - 1;
 
            else
 
                r.i1 = (k - 1) + 1;
 
            r.i2 = 0;
 
 
         }
 
         }
 
+
        cout << " division: \n ";
         if (a[length - 1].x < x.a[x.length - 1].x)
+
         delete [] mass;
         {
+
        mass = masss;
            r.glastx = a[length - 1].x;
+
        output();
            r.e1 = length - 1;
+
        SaveFile("f3.txt");
            double k = x.pfind(r.glastx);
+
         cout<<"enter new step";
            if (k < 0)
+
        cin>>Step2;
                r.e2 = -k - 1;
+
        cout<<"interpolation: ";
            else
+
        interpolation(Begin,End,Step2);
                r.e2 = (k - 1) - 1;
+
        cout<<" approximation: ";
         }
+
        approximation(Begin,End,Step2);
         else
+
        return newmass;
 +
    }
 +
    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));
+
         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;
 +
    }
  
        return r;
 
    }
 
  
     void ad (fun b[],int l)                                 //присвоить массиву объекта класса F значения массива b
+
     void output()///вывод функции на экран
 
     {
 
     {
        length = l;
+
         for (int i=0; i<AmountInt; i++)
        a = new fun [l];
+
        {
         for (int i = 0; i < l;i++)
+
             cout << "y("<<i<< ") = " << mass[i] <<endl;
             a[i] = b[i];
+
 
        firstx = a[0].x;
+
         }
         lastx = a[length - 1].x;
 
 
     }
 
     }
  
     fun *geta()                                         //получения указателя на начало массива в поле класса
+
 
 +
     void SaveFile(char filename[])///сохранение функции в файл
 
     {
 
     {
         return a;
+
         std::ofstream fout(filename);
 +
        for (int l=0; l<AmountInt; l++)
 +
        {
 +
            fout<<l<<" "<<mass[l]<<" \n";
 +
        }
 +
 
 +
        fout.close();
 
     }
 
     }
 +
};
 +
  
    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)))
+
int main()
        {
+
{
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
+
 
            F fl(-1,0,0);
+
    double Begin1, End1, Step1, Step2;
            return fl;
+
    cout<<" enter the beginning of the  function ";
        }
+
    cin>>Begin1;
        sf r = prepare(x);
+
    cout<<"\n enter the end of the  function ";
        F tmp(r.glength,r.gfirstx,r.glastx);
+
    cin>>End1;
        for (int i = 0; i <= (r.e1 - r.i1); i++)
+
    cout<<"\n enter the step of the 1st function ";
        {
+
    cin>>Step1;
            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++)
+
    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";
 +
 
 +
    func f3(Begin1,End1,Step1);
  
     F operator *(F & x) const                                        //умножение двух функций
+
     cout<<" \n \n choose 1 - sum , 2 - subtract, 3 - division, 4 - multiply \n";///выбор операции
 +
    int z;
 +
    cin>>z;
 +
    switch (z)
 +
    {
 +
    case 1:
 +
    {
 +
        f3=f1+f2;///сумма функций
 +
        break;
 +
    }
 +
    case 2:
 +
    {
 +
        f3=f1-f2;
 +
        break;
 +
    }
 +
    case 3:
 +
    {
 +
        f3=f1/f2;
 +
        break;
 +
    }
 +
    case 4:
 
     {
 
     {
         int i1, e1, i2, e2, kk = 0;
+
         f3=f1*f2;
         double gfirstx, glastx, glength;
+
         break;
 +
    }
  
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
+
    default :
        {
+
    {
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
+
        cout<<"NOOOOO";
            F fl(-1,0,0);
+
        break;
            return fl;
+
    }
        }
+
    };
 +
    return 0;
 +
}
  
        sf r = prepare(x);
 
        F tmp(r.glength,r.gfirstx,r.glastx);
 
  
        for (int i = 0; i <= (r.e1 - r.i1); i++)
+
</syntaxhighlight>
        {
+
</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;
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
    }
+
'''[[Белоусова Екатерина]]'''
 +
 
 +
'''Инструкция к программе''': пользователь вводит начало и конец отрезка и шаг для функций, после чего создается две функции. Затем пользователь выбирает одну из арифметических операций, которую он хочет применить к этим функциям. Создается третья функция. После пользователь вводит второй шаг для интерполяции. Третья функция интерполируется по новому шагу, а затем аппроксимируется.
 +
 
 +
'''Краткое описание алгоритма''': в классе при помощи массива создаются две функции, с которыми потом работает программа. Эти функции перегружаются операторами арифметических операций, где затем полученная новая функция интерполируется и аппроксимируется.
  
    F operator ^(F & x) const                                  //возведение функции слева от оператора в степень функции справа от оператора
+
Скачать программу можно по ссылке  [http://tm.spbstu.ru/Файл:задача_2.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)))
+
<div class="mw-collapsible-content">
        {
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
+
#include <iostream>
            F fl(-1,0,0);
+
#include <locale.h>
            return fl;
+
#include <math.h>
        }
+
#include <fstream>
 +
#include<iomanip>
  
        sf r = prepare(x);
+
using namespace std;
        F tmp(r.glength,r.gfirstx,r.glastx);
 
  
        for (int i = 0; i <= (r.e1 - r.i1); i++)
+
class functya ///создаем класс функции
        {
+
{
            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++)
+
private: ///объявляем тип переменных в привате
            for (int j = 0; j < glength - 1; j++)
+
    double *mass, *mass1, *mass2; ///*mass, *mass1, *mass2 -определение двумерного массива
            if (tmp.a[j].x > tmp.a[j + 1].x)
+
    double start, ending, step, step2, amountdouble; ///start-начало, ending-конец, step-шаг, amountdouble-количество точек (типа double)
            {
 
                fun t = tmp.a[j];
 
                tmp.a[j] = tmp.a[j + 1];
 
                tmp.a[j + 1] = t;
 
            }
 
  
        return tmp;
+
public: ///объявляем тип переменных в паблике
     }
+
     int amount; ///amoun-количество точек (типа int)
};
 
  
int main()
+
functya (double _start, double _ending, double _step):start(_start),ending(_ending),step(_step) ///создаем конструктор функции с объявлением переменных
 +
{
 +
 
 +
    amountdouble=((ending-start)/step)+1; ///подсчитываем количество точек с заданым шагом
 +
    amount=static_cast<int>(amountdouble); ///преобразуем количество из типа double к типу int
 +
 
 +
}
 +
 
 +
void massiv1 () ///создаем функцию массива
 +
{
 +
 
 +
    mass=new double[amount]; ///создаем двумерный массив
 +
    for (int l=0; l<amount; l++) ///создаем цикл от нуля до amount-количества точек
 +
    {
 +
        mass[l]= pow((l*step+start),3); ///при помощи массива задаем функцию с которой будем работать
 +
    }
 +
    cout<< "\n";
 +
}
 +
 
 +
void massiv2 () ///создаем функцию массива
 
{
 
{
  /*
 
    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)
+
     mass=new double[amount]; ///создаем двумерный массив
 +
    for (int l=0; l<amount; l++) ///создаем цикл от нуля до amount-количества точек
 
     {
 
     {
    start :
+
         mass[l]= pow((l*step+start),2); ///при помощи массива задаем функцию с которой будем работать
         system("cls");
+
    }
        cout << "1 - Vvesti 1uu func"            << endl;
+
    cout<< "\n";
         cout << "2 - Vvesti 2uu func"            << endl;
+
 
         cout << "3 - Sloshit'"                   << endl;
+
}
        cout << "4 - Umnozhit'"                 << endl;
+
 
        cout << "5 - Vozvesti v stepen'"        << endl;
+
void interpol (double __start, double __ending, double __step) ///создаем функцию интерполяция с определением переменных
         cout << "6 - Aproximirovat'"             << endl;
+
{
         cout << "7 - Zapics' v file func"       << endl;
+
 
        cout << "8 - Zapics' v file aprok fun"   << endl;
+
    double amount1=((__ending-__start)/__step)+1; ///определяем тип и подсчитываем новое количество точек с новым шагом
        cout << "0 - Vihod"                     << endl;
+
    int amounti=static_cast<int>(amount1); ///преобразуем количество из типа double к типу int
         cin  >> vc;
+
 
        switch (vc)
+
    for (int i=0; i<amounti; i++) ///создаем цикл от 0 до amounti-нового количества точек
        {
+
    {
            case '0':
+
 
                return 0 ;
+
        mass1=new double[amounti];
            case '1':
+
        double x = i*__step+__start; ///определяем тип и расчитываем координату Х
                {
+
         double x0=(static_cast<int>((x-__start)/step)) * step+__start;///определяем тип и расчитываем координату х
                system("cls");
+
                                                                      ///в интерполирующейся точке, которая стоит до новой точки
                strcpy(s,"");
+
        double x1=x0+step;///определяем тип и расчитываем координату х1 прибавляя к предыдущей точке шаг
                delete []a;
+
        int i0=(static_cast<int>((x-__start)/step));///определяем значение массива в i0 соответстующей значению функции в x0
                a = NULL;
+
        int i1=i0+1;
                cout << "Vvedite imya fila" << endl;
+
        mass1[i]=(((x - x0 )*(mass[i1] - mass[i0]))/( x1-x0)) + mass[i0];
                cin >> s;
+
         cout << "Х="<<i<<setw(10)<< "У= " << mass1[i] <<endl<<endl; ///выводим интерполяцию на экран
                strcat(s, ".txt");
+
         ofstream fout("interpol.txt",ios::app);///сохраняем в файл
                infile.open(s);
+
         fout<< "Х="<<i<<setw(10)<< "У="<<mass1[i]<<" \n";
                infile >> n;
+
         fout.close();
                a = new fun [n];
+
 
                for(int i = 0; i < n; i ++)
+
    }
                    infile >> a[i].x >> a[i].y;
+
 
                f5.ad(a,n);
+
    amount=amounti;
                f5.FOut();
+
    delete []mass;
                infile.close();
+
    mass = mass1;
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
 
                cin >> ce;
+
}
                while (true)
+
 
                if (ce == 'b')
+
void aprocsimation(double __start, double __ending, double __step) ///создаем функцию апроксимация с определением переменных
                    goto start;
+
{
                }
+
 
            case '2':
+
    int N=amount; ///определяем тип и значение переменной N (равна количеству точек с заданным шагом)
                {
+
    double SumXY=0; ///определяем тип и значение переменной SumXY ( сумма (Х*У) )
                system("cls");
+
    double SumX=0; ///определяем тип и значение переменной SumX ( сумма Х )
                strcpy(s,"");
+
    double SumY=0; ///определяем тип и значение переменной SumУ ( сумма У )
                delete []a;
+
    double Sum_Xkv=0; ///определяем тип и значение переменной Sum_Xkv ( сумма (Х*Х) )
                a = NULL;
+
    double Xi; ///определяем тип переменной Xi
                cout << "Vvedite imya fila" << endl;
+
 
                cin >> s;
+
    mass1 = new double[N]; ///создаем двумерный массив
                strcat(s, ".txt");
+
    for (int i=0; i<N; i++) ///создаем цикл от 0 до N (количество точек с заданным шагом)
                infile.open(s);
+
    {
                infile >> n;
+
 
                a = new fun[n];
+
        Xi=i*__step+__start; ///расчитываем Хi
                for(int i = 0; i < n; i ++)
+
        SumXY=SumXY+Xi*mass[i]; ///расчитываем SumXY
                    infile >> a[i].x >> a[i].y;
+
        SumX=SumX+Xi; ///расчитываем SumX
                f6.ad(a,n);
+
        SumY=SumY+mass[i]; ///расчитываем SumY
                f6.FOut();
+
        Sum_Xkv=Sum_Xkv+Xi*Xi; ///расчитываем Sum_Xkv
                infile.close();
+
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
    }
                cin >> ce;
+
 
                while (true)
+
    double a=(SumXY*N-SumX*SumY)/(N*Sum_Xkv-SumX*SumX); ///определяем тип и расчитываем коэффициент перед Х в уравнении аХ+b
                if (ce == 'b')
+
    double b=(SumY-a*SumX)/N; ///определяем тип и расчитываем свободный член в уравнении аХ+b
                    goto start;
+
 
                }
+
    if (b>0) ///если b положительное то
            case '3':
+
    cout<<"Апроксимация: "<<a<<"*x+"<<b<<endl; ///выводим на экран: Апроксимация: а*Х+b
                system("cls");
+
 
                f5.FOut();
+
    else if (b<0) ///если b отрицательно то
                f6.FOut();
+
    cout<<"Апроксимация: "<<a<<"*x"<<b<<endl; ///выводим на экран: Апроксимация: а*Х b
                f7 = f5 + f6;
+
 
                f7.FOut();
+
    for (int i=0; i<N; i++) ///создаем цикл от 0 до N (количество точек с заданным шагом)
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
    {
                cin >> ce;
+
        mass1[i] = a*(i*__step+__start)+b; ///при помощи массива создаем функцию подсчета точек при апроксимации
                while (true)
+
    }
                if (ce == 'b')
+
 
                    goto start;
+
    delete[] mass;
            case '4':
+
    mass=mass1;
                system("cls");
+
    vivod();///вывод на экран
                f5.FOut();
+
    zapis("aprocsimation.txt");///сохраненяем в файл
                f6.FOut();
+
 
                f7 = f5 * f6;
+
}
                f7.FOut();
+
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
functya operator+ ( functya F) ///перегрузка оператора +
                cin >> ce;
+
{
                while (true)
+
 
                if (ce == 'b')
+
    functya tmp(start,ending,step);
                    goto start;
+
 
            case '5':
+
    mass2=new double[amount];///создаем двумерный массив
                system("cls");
+
    for (int i=0; i<amount; i++)
                f5.FOut();
+
    {
                f6.FOut();
+
        mass2[i]=mass[i] + F.mass[i];///находим сумму двух функций
                f7 = f5 ^ f6;
+
    }
                f7 = f5 ^ f6;
+
    delete [] mass;
                f7.FOut();
+
    mass=mass2;
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
    vivod();///выводим на экран результат
                cin >> ce;
+
    zapis("f3.txt");///сохраненяем в файл
                while (true)
+
    cout<<"Введите шаг для интерполяции";
                if (ce == 'b')
+
    cin>>step2;
                    goto start;
+
    cout<<"Интерполяция: "<<"\n";
            case '6':
+
    interpol(start,ending,step2);///вызов функции интерполяции
            {
+
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
                system("cls");
+
    return tmp;
                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;
+
functya operator-( functya F)///перегрузка оператора -
                cin >> ce;
+
{
                while (true)
+
 
                if (ce == 'b')
+
    functya tmp(start,ending,step);
                    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;
+
    mass2=new double[amount];///создаем двумерный массив
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
    for (int i=0; i<amount; i++)
                cin >> ce;
+
    {
                while (true)
+
        mass2[i]=mass[i] - F.mass[i];///находим разность двух функций
                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>
 
  
'''[[Лобанов Илья]]'''
+
    delete [] mass;
 +
    mass=mass2;
 +
    vivod();///выводим на экран результат
 +
    zapis("f3.txt");///сохраненяем в файл
 +
    cout<<"Введите шаг для интерполяции";
 +
    cin>>step2;
 +
    cout<<"Интерполяция: "<<"\n";
 +
    interpol(start,ending,step2);///вызов функции интерполяции
 +
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 +
    return tmp;
  
'''Описание программы''':
+
}
Программа позволяет складывать , вычитать , делить,умножать 2 функции,заданные на одном интервале.При считывании с файла сначала указывается отрезок, потом величина шага, а потом дискретные значения.
 
  
Скачать можно [[http://tm.spbstu.ru/File:func.rar тут]]
+
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];///находим произведение двух функций
 +
    }
  
'''[[Лосева Татьяна]]'''
+
    delete [] mass;
+
    mass=mass2;
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.
+
    vivod();///выводим на экран результат
 +
    zapis("f3.txt");///сохраненяем в файл
 +
    cout<<"Введите шаг для интерполяции";
 +
    cin>>step2;
 +
    cout<<"Интерполяция: "<<"\n";
 +
    interpol(start,ending,step2);///вызов функции интерполяции
 +
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 +
    return tmp;
  
'''Инструкция к программе:''' Начальная координата и шаг,для задания координат функций,передаются при вызове методов,создающих функции.Начальный шаг,шаг интерполяции,а так же количество выводимых координат заданы глобально.Поэтому просто запускайте программу, при желании поменяйте заданные
+
}
величины.
 
  
Cкачать программу можно  [http://tm.spbstu.ru/Файл:Loseva.rar здесь]
+
functya operator/( functya F)///перегрузка оператора /
 +
{
  
<div class="mw-collapsible-content">
+
    functya tmp(start,ending,step);
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <iostream>
 
  
using namespace std;
+
    mass2=new double[amount];///создаем двумерный массив
 +
    for (int i=0; i<amount; i++)
 +
    {
 +
        mass2[i]=mass[i] / F.mass[i];///находим частное двух функций
 +
    }
  
#define N 5//количество точек
+
    delete [] mass;
 
+
    mass=mass2;
const double l1 = 5;//задаём начальный шаг функций
+
    vivod();///выводим на экран результат
const double l2 = 0.7;//шаг для интерполяции
+
    zapis("f3.txt");///сохраненяем в файл
 +
    cout<<"Введите шаг для интерполяции ";
 +
    cin>>step2;
 +
    cout<<"Интерполяция: "<<"\n";
 +
    interpol(start,ending,step2);///интерполяция
 +
    aprocsimation(start,ending,step2);///вызов функции аппроксимации
 +
    return tmp;
  
class Func
+
}
{//класс,хранящий функцию,содержащий методы:печать,перегрузка,интерполяция,апроксимация
+
 
 +
void vivod ()///создаем функцию вывода на экран
 +
{
 +
 
 +
    for (int l=0; l<amount; l++)
 +
    {
 +
        cout<<"Х"<<l<<setw(10)<< "Y= " << mass[l] <<"\n";
 +
    }
  
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()//вывод на экран
+
void zapis (char Zapis[])///созданем функцию записи в файл
{
+
{
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ложение функций
+
    ofstream fout(Zapis);
{
+
    for (int l=0; l<amount; l++)
Func *result = new Func(size_);//создаём результирующую функцию,равную сумме двух f2 и this
+
    {
for (int i = 0; i < size_; i++)
+
        fout<<"X="<<l<<setw(10)<<"Y="<<mass[l]<<" \n";
{
+
    }
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) //метод Интерполяции
+
    fout.close();
{
 
int M = (this->ax[this->size_ - 1] - this->ax[0]) / L + 1; //M- количество элементов массива с координатами интерполирующей функции;
 
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 по формуле
+
}
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]);
 
  
}
+
};
  
result.print();//выводим результат
+
int main()
}
+
{
  
void aprox()//Апроксимация
+
    setlocale(LC_ALL,"RUS");
{
 
double a=0;
 
          for(int i=0;i<size_;i++)//считаем сумму x
 
  a=this->ax[i]+a;
 
       
 
  
double b=0;
+
    double start1, ending1, step1, step2;
for(int i=0;i<size_;i++)//считаем сумму y
+
    int number;
b=this->by[i]+b;
+
    cout<< "Введите начало отрезка ";
+
    cin>> start1;
 +
    cout<< "Введите конец отрезка ";
 +
    cin>> ending1;
 +
    cout<<"Введите шаг для функций ";
 +
    cin>> step1;
  
double c=0;
+
    functya F1(start1,ending1,step1);///создаем первую функцию
for(int i=0;i<size_;i++)//считаем сумму квадратов x
+
    F1.massiv1();
c=(this->ax[i])*(this->ax[i])+c;
+
    F1.vivod();///выводим координаты первой функции на экран
+
    F1.zapis("F1.txt");///записываем координаты первой функции в файл
  
double d=0;
+
    cout<<"\n \n";
for(int i=0;i<size_;i++)//считаем сумму xy
 
d=(this->ax[i])*(this->by[i])+d;
 
 
  
//затем решаем систему для у=kx+m
+
    functya F2(start1,ending1,step1);///создаем вторую функцию
//(1)c*k+a*m=d
+
    F2.massiv2();
//(2)a*k+size_*m=b;
+
    F2.vivod();///выводим координаты второй функции на экран
//k=(d-am)/с
+
    F2.zapis("F2.txt");///записываем координаты второй функции в файл
//подставим в (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;
 
  
}
+
    cout<<"\n \n";
  
 +
    functya F3(start1, ending1, step1);
  
double *ax;
+
    cout<<"Выберите, что вы хотите сделать с функциями: 1-найти сумму, 2-найти разность, 3-найти произведение, 4-найти частное ";
double *by;
+
    cin>>number;
 +
    cout<<"\n \n";
  
private:
+
    if(number==1)
int size_;//размер массива
+
    {
};
+
        F3=F1+F2;
 +
    }
  
 +
    else if (number==2)
 +
    {
 +
        F3=F1-F2;
 +
    }
  
 +
    else if (number==3)
 +
    {
 +
        F3=F1*(F2);
 +
    }
  
 +
    else if (number==4)
 +
    {
 +
        F3=F1/F2;
 +
    }
 +
 +
    else
 +
    {
 +
        cout<<"Ошибка ";
 +
    }
 +
 +
    return 0;
 +
 +
}
 +
</syntaxhighlight>
 +
</div>
  
class Cord//класс,создающий и хранящий значение функций
 
{
 
public:
 
Cord(double x0, double s) :x0(x0), s(s)//x0-начальная координата;s-шаг
 
{
 
}
 
  
void Fyx1(Func func)//метод,считающий координаты нашей функции y=x
 
{
 
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];//считаем координаты у
 
cout << "f1 :" << endl;
 
func.print();
 
cout << endl;
 
}
 
  
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:
+
'''Инструкция к программе''': пользователь вводит начало и конец отрезка и шаг для функций, после чего создается две функции. Затем функции суммируются, после чего пользователь вводит значение нового шага, суммированная функция интерполируется по новому шагу, после этого по МНК(методу наименьших квадратов) функция апроксимируется.
double x0;//начальная координата
 
double s;//шаг
 
};
 
  
int main()
 
{
 
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ой функции
 
  
      //сложение функций:
 
 
Func f3 = f2 + f1;//есть тоже ,что и Func f3 = f2.operator+(f1);
 
  
f1.Int(l2);//Интерполируем f1 с новым шагом l2
+
Скачать программу можно по [http://mech.spbstu.ru/File:Untitled1.rar ссылке]
f1.aprox();//Апроксимируем f1
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
Метод наименьших квадратов
getchar();
+
задача состоит в том, чтобы минимизировать выражение:
return 0;
+
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.
  
</syntaxhighlight>
 
</div>
 
  
'''[[Сергей Ляжков]]'''
+
<div class="mw-collapsible-content">
'''Описание программы''':программа позволяет проводить следующие действия с функциями: сложение, вычитание, умножение, те же действия с числами, проводить аппроксимацию и интерполяцию
 
Скачать можно [[http://tm.spbstu.ru/File:Функции.zip тут]]
 
 
 
<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">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
/* FILENAME: T05GRAPH.CPP
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#include "GRAPH.H"
+
#include <iostream>
 +
#include <math.h>
 +
#include <iomanip>
 +
#include<stdlib.h>
 +
using namespace std;
  
/* Глобальные переменные */
+
class func
// Глобальная переменная, хранящая время в секундах с момента старта программы
 
double SyncTime;
 
// Глобальные переменные для отслеживания нажатия клавиш
 
bool IsGraph, IsSave, IsLoad, IsLoaded;
 
 
 
/* Timer function */
 
// Подсчет времени
 
void Timer( void )
 
 
{
 
{
long t;
+
private:
static long StartTime = -1;
+
    double a/*начало*/,b/*конец*/,c/*шаг*/,k/**/,m/**/,rr/**/;
 +
    int d/*переменная для изменения типа, кол-во элементов для начальных элементов*/,tt/*переменная для изиенения типа, кол-ва элементов для счёта суммы*/;
 +
    double *F/*массив для значений У*/, *X/*Массив для значений Х*/, *R/*массив для значений У после интерполяции*/, *Q;
 +
public:
  
t = clock();
+
    func (double a1, double b1, double c1):a(a1),b(b1),c(c1)//создаём конструктор для функции
if (StartTime == -1)
+
    {
StartTime = t;
+
        double p = (b-a)/c;
SyncTime = (double)(t - StartTime) / CLOCKS_PER_SEC;
+
        d = (int)p;
} /* End of 'Timer' function */
+
        if (b > (d*c+a)) d += 2; //в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
 +
        else d += 1;
  
/* Display function */
+
        F = new double [d];//создание динамического массива для У
// Стандартная функция, вызываемая при перерисовке окна
+
        X = new double [d];// создание динамического массива для Х
void Display( void )
+
        X[0]=a;//первый элемент
{
+
        X[d-1]=b;//последний элемент, для того чтобы последний элемент был в конце промежутка, чтобы его не потерять
graph G1(-15, 15, 0.1), G2(2, 10, 0.4), G3, G4;
+
        for(int i = 1; i < d-1; i++) X[i]=a+c*i; //присваивание значений всех Х
  
// Запуск времени
+
    }
Timer();
+
    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;//пробел и конец строки
glClearColor(1, 1, 1, 1);
+
    }
// Очищаем цветовой буфер для создания нового изображения
 
glClear(GL_COLOR_BUFFER_BIT);
 
  
glLoadIdentity();
+
    void second ()//функция для второй функции
glScaled(0.1 / (1366 / 768.0), 0.1, 0.1);
+
    {
 +
        if(a==0 || b==0) return;
 +
        F[0]=1*a*a; //присваивание значения функции в начале промежутка
 +
        F[d-1]=1*b*b;//присваивание значения функции в конце промежутка
  
// Отрисовка осей X и Y
+
        for(int k = 1; k <d-1; ++k)
glBegin(GL_LINE_STRIP);
+
        {
 +
            double n = c*k+a;
 +
            if (n != 0)//условие неделимости на ноль
 +
            {
 +
                F[k] = 1*n*n;
 +
            }
 +
        }
  
glColor3d(0, 0, 1);
+
    }
glVertex2d(0, -1000);
 
glVertex2d(0, 1000);
 
  
glColor3d(1, 0, 0);
+
    void operator +(func Q)//перегрузка оператора +
glVertex2d(-1000, 0);
+
    {
glVertex2d(1000, 0);
+
        sum(Q);
 +
    }
  
glEnd();
+
    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)//цикл суммирования функций и вывода значений суммы, функций и иксов
// Отрисовка первого графика и его интерполяция по клавише "G"
+
        {
G1.Draw(sin);
+
 
if (IsGraph == 1)
+
            cerr <<"YFirst: "<< F[i] << "   ";
G1.Interpolation_Draw(1.0 / 32);
+
            cerr << "YSecond: "<< Q.F[i] << "  ";
 +
            R[i] = F[i] + Q.F[i];
 +
            cerr << "Ysum: "<< R[i] << "  ";
 +
            cerr << "X:" << m << '\n';
  
// Отрисовка второго графика и его интерполяция по клавише "G"
+
            m=m+c;
G2.Draw(log);
+
        }
if (IsGraph == 1)
+
  for(i = 0; i <d-1; ++i)
G2.Interpolation_Draw(1.0 / 32);
+
        {Q.F[i]=R[i];
 +
}
 +
        cerr << " " << endl;
 +
    }
  
// Отрисовка графика суммы для первого и второго графиков
+
double interp( double pnt/*новый шаг*/, func Q)//функция для интерполяции функции
G3 = G2 + G1;
+
    {double p,h,i,w,*X,aApr,bApr,X2sm,XYsm,Xsm/*хранит сумму интерполированных иксов*/,Ysm/*хранит сумму интерполированных игреков*/;
glColor3d(0, 1, 0);
+
    int q,k,l,o;
G3.Draw();
+
    p=(b-a)/pnt+1;
// Аппроксимация графика суммы
+
    q=int(p);
G3.Approximation();
+
    R=new double [q];
 +
    X=new double [q];
  
// Сохранение графика по клавише "S"
+
    l=0;
if (IsSave == 1)
+
    k=0;
{
 
G3.SaveArray();
 
IsSave == 0;
 
}
 
 
// Загрузка графика по клавише "L"
 
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;
 
}
 
  
// Чистка памяти
+
    for(h=a/*начало функции*/; h<=b/*конец функции*/; h=h+c/*старый шаг*/) //шагает по нормальному шагу
delete[] G1.mas;
+
    {
delete[] G1.Color;
+
        for(i=a-1; i<=b; i=i+pnt/*новый шаг*/)
delete[] G2.mas;
+
          if((i>h)&&(i<=(h+c)))//проверяет лежит ли новый шаг между точками старого
delete[] G2.Color;
+
            {  R[k]=(Q.F[l]-Q.F[l-1])*(i-h)/c+Q.F[l-1];//формула интерполяции
delete[] G3.mas;
+
                cout<<"\n"<<"Yinter: "<<R[k]<<"  "<<"X: "<<i-1;//вывод интерполированных значений и иксов
delete[] G3.Color;
+
                X[k]=i-1;
delete[] G4.mas;
+
                k++;
delete[] G4.Color;
+
            }
 
+
        l++;
glFinish();
+
    }
// Копируем вторичный буфер в окно
+
    cout<<"\n";
glutSwapBuffers();
+
    cout<<"\n";
// Вызываем функцию обновления кадра
+
    cout<<"\n";
glutPostRedisplay();
+
    //обнуление значений сумм для МНК
} /* End of 'Display' function */
+
    Xsm=0;
 +
    Ysm=0;
 +
    XYsm=0;
 +
    X2sm=0;
  
/* Keyboard function */
+
    for(o=0;o<=k;o++)//цикл подготавливает суммы для МНК
// Стандартная функция, вызываемая при нажатие клавиш на клавиатуре
+
        {Xsm+=X[o];
void Keyboard( unsigned char Key, int X, int Y )
+
        Ysm+=R[o];
{
+
        XYsm+=X[o]*R[o];
// Выход из программы
+
        X2sm+=X[o]*X[o];
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 */
+
aApr=(k*XYsm-Xsm*Ysm)/(k*X2sm-Xsm*Xsm);//находим коэфициенты по МНК
int main( int argc, char *argv[] )
+
bApr=(Ysm-a*Xsm)/k;
{
+
cout<<"\n"<<"aAprox"<<a<<"  "<<"bAprox"<<b<<"\n";//выводим их
// Инициализации OpenGL и GLUT
+
for(o=0;o<k;o++)
glutInit(&argc, argv);
+
        {c=aApr*X[o]+bApr;//считаем значение Y при данных коэфициентах
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+
        cout<<"YAprox: "<<c<<" "<<"X:"<<X[o]<<"\n" ;
 +
        }
  
// Задача размеров и позиции окна
 
glutInitWindowPosition(0, 0);
 
glutInitWindowSize(500, 500);
 
// Создание окна
 
glutCreateWindow("T05GRAPH");
 
  
// Установка функций 'обратного вызова'
+
    return 0;}
glutDisplayFunc(Display);
+
};
glutKeyboardFunc(Keyboard);
 
  
// Запускаем основной цикл построения
+
int main(){
glutMainLoop();
+
    double x, xn, s1,pnt;
return 0;
+
    cout << "Input the beginning of the function: " << endl;
} /* End of 'main' function */
+
    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);
  
/* END OF 'T05GRAPH.CPP' FILE */
+
return 0;}
 
</syntaxhighlight>
 
</syntaxhighlight>
"'''GRAPH.CPP'''"
+
</div>
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
 
/* FILENAME: GRAPH.CPP
+
 
* LAST UPDATE: 17.01.2016
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
*/
+
'''[[Рубинова Раиса]]'''
  
#include "GRAPH.H"
+
'''Описание программы''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции.
  
/* Load Array of points function */
+
'''Инструкция к программе''':
// Загрузка графика из файла по точкам
+
1. Пользователь вводит параметры первой функции
void graph::LoadArray( char *FileName )
+
2. Пользователь вводит параметры второй функции (при этом шаг второй функции меньше шага первой)
{
+
3. Происходит интерполяция первой функции по второй
// Создание указателя на тип FILE
+
4. Пользователь выбирает арифметическую операцию
FILE *F;
+
5. При желании пользователь может выполнить аппроксимацию полученного результата
  
// Создание файла и открытие его в режиме чтения
 
fopen_s(&F, FileName, "rt");
 
  
// Количество точек
+
Скачать можно [http://tm.spbstu.ru/File:Funcc.rar тут].
fscanf(F, "%d", &N);
 
// Шаг функции
 
fscanf(F, "%lf", &Step);
 
// Начальная координата по X
 
fscanf(F, "%lf", &MinX);
 
// Конечная координата по X
 
fscanf(F, "%lf", &MaxX);
 
 
// Выделение памяти под массив точек
 
mas = new vec[N];
 
  
// Заполнение массива точек из файла
 
for (int i = 0; i < N; ++i)
 
{
 
// Заполнение по X
 
fscanf(F, "%lf", &mas[i].X);
 
// Заполнение по Y
 
fscanf(F, "%lf", &mas[i].Y);
 
}
 
  
// Закрытие файла
+
<div class="mw-collapsible-content">
fclose(F);
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
} /* End of 'LoadArray' function */
+
#ifndef FUNC_H
 +
#define FUNC_H
 +
 
  
/* Fill mas function */
+
class Func
// Заполнение массива координат точек с цветом
 
void graph::Fill( double(*f)(double) )
 
 
{
 
{
// Выделение памяти под массив точек
+
    public:
mas = new vec[N];
+
        Func(double a1, double b1, double c1);
// Выделение памяти под массив цветов
+
        virtual ~Func();
Color = new vec[N];
+
        void DefFunc ();    // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
 +
        void PluFunc (Func D);  // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
 +
        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 (int i = 0; i < N; i++)
 
{
 
mas[i] = vec(MinX + i * Step, f(MinX + i * Step));
 
Color[i] = vec::Rnd();
 
}
 
} /* End of 'Fill' function */
 
  
/* Draw graph function */
+
 
// Рисование заполненного графика на экран
+
 
void graph::Draw( void )
+
#include "Func.h"
 +
#include <fstream>
 +
#include <iostream>
 +
#include <math.h>
 +
 
 +
Func::Func(double a1, double b1, double c1):a(a1),b(b1),c(c1)  // конструктор для класса Func, создающий объект данного класса, определенный тремя значениями, введенными пользователем
 
{
 
{
   // Задача размер точки
+
    double d=(b-a)/c;   // расчет количества элементов, определяющих функцию
glPointSize(1);
+
    j=floor(d);   // созданной целочисленной переменной присваивается значение, равное целой части числа, рассчитанного выше, с округлением в меньшую сторону
// Рисование
+
    A = new double [j+1];   // создание массива
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 */
+
Func::~Func()   // деструктор для класса Func
// Рисование не заполненного еще графика на экран
 
void graph::Draw( double(*f)(double) )
 
 
{
 
{
// Заполнение массива
+
    //dtor
graph::Fill(f);
+
}
  
// Задача цвета и размера точки
+
void Func::Viv ()   // Функция вывода на экран значений
glColor3d(0, 0, 0);
+
{
glPointSize(1);
+
    std::cout << "x ";
// Рисование
+
    for (int z=0; z<=j; ++z)
glBegin(GL_POINTS);
+
    {
for (int i = 0; i < N; i++)
+
        std::cout << z+1 << " ";
glVertex2d(mas[i].X, mas[i].Y);
+
    }
glEnd();
+
}
} /* End of 'Draw' function */
+
 
 
+
void Func::DefFunc ()   // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
/* Interpolation draw graph function */
 
// Рисование интерполированного графика на экран
 
void graph::Interpolation_Draw( double i_step )
 
 
{
 
{
// Коэффициент Катмулл-Рома
+
    double x;   // создание переменной, используемой для расчета значений функции
double alpha = 1.0 / 6;
+
    for(int i=0; i<=j; ++i) // создание цикла, рассчитывающего j элементов
+
    {
// Кубическая интерполяция кривыми Безье
+
        x =i*c+a;  // задание значения перемнной x, определенной выше
for (int i = 0; i < N - 1; i++)
+
        A[i]=x*x;   // задание значения самой функции (при этом в данной ситуации нам неважно, как именно задается функция, ее значения могут быть определены любым способом, от этого алгоритм не меняется)
{
+
        std::cerr << A[i] << " ";   // вывод на экран значения функции
// Создание 4 точек для интерполяции по ним
+
    }
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
+
}
vec Color0 = mas[i], Color1, Color2, Color3 = mas[i + 1];
 
  
// Значения для первого и последнего отрезков
+
void Func::PluFunc (Func D)  // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
if (i == 0)
+
{
{
+
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
P1 = (mas[1] - mas[0]) * alpha + mas[0];
+
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
Color1 = (mas[1] - mas[0]) * alpha + mas[0];
+
    {
}
+
        B[i]=B[i]+D.A[i];   // сложение значений двух функций для одного и того же значения переменной
else
+
    }
{
+
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
+
    {
Color1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
+
        out << B[i] << '\n';   // запись значений, полученных в предыдущем цикле, в файл
}
+
    }
if (i == N - 2)
+
    out.close();    // закрытие файла после записи в него значений
{
+
    D.Viv();
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
+
    std::cout << std::endl << "y ";
Color2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
+
    for (int i=0; i<=D.j; ++i) // аналогичный предыдущему цикл, выводящий значения на экран
}
+
    {
else
+
        std::cout << B[i] << " ";
{
+
    }
P2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
+
}
Color2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
+
void Func::operator +(Func D)   // перегрузка оператора '+'
}
+
{
 
+
    PluFunc(D);                        // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1+f2 будет работать аналогично записи f1.PluFunc(f2)
glLineWidth(2);
+
}
glBegin(GL_LINE_STRIP);
+
void Func::MinFunc (Func D)    // функция, линейно вычитающая значения второй функции из значений первой функции
for (double t = 0; t <= 1; t += i_step)
+
{
{
+
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
vec p, color;
+
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
 
+
    {
// Вычисление точки интерполированного графика по 4 точкам
+
        B[i]=B[i]-D.A[i];   // вычитание значений второй функций из значений первой для одного и того же значения переменной
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;
+
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
 
+
    {
// Рисование
+
        out << B[i] << '\n';   // запись значений, полученных в предыдущем цикле, в файл
glColor3d(color.X / 10, 0, color.Y);
+
    }
glVertex2d(p.X, p.Y);
+
    out.close();   // закрытие файла после записи в него значений
}
+
    D.Viv();
glEnd();
+
    std::cout << std::endl << "y ";
}
+
    for (int i=0; i<=D.j; ++i) // аналогичный предыдущему цикл, выводящий значения на экран
} /* End of 'Interpolation_Draw' function */
+
    {
 
+
        std::cout << B[i] << " ";
/* Interpolation graph function */
+
    }
// Интерполяция графика
+
}
graph graph::Interpolation( double i_step )
+
void Func::operator -(Func D)  // перегрузка оператора '-'
 +
{
 +
    MinFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1-f2 будет работать аналогично записи f1.MinFunc(f2)
 +
}
 +
void Func::UmnFunc (Func D)     // функция, линейно переумножающая значения функций
 
{
 
{
graph G_New;
+
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
// Коэффициент Катмулл-Рома
+
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
double alpha = 1.0 / 6;
+
    {
 
+
        B[i]=B[i]*D.A[i];   // умножение значений первой функций на значенийя второй для одного и того же значения переменной
// Заполнение параметров для нового графика
+
    }
G_New.MinX = MinX;
+
    for (int i=0; i<=D.j; ++i)     // создание цикла, рассчитанного на то же количество раз, что и предыдущий
G_New.MaxX = MaxX;
+
    {
G_New.Step = Step * i_step;
+
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
G_New.N = (int)((G_New.MaxX - G_New.MinX) / G_New.Step);
+
    }
G_New.mas = new vec[G_New.N];
+
    out.close();    // закрытие файла после записи в него значений
+
    D.Viv();
// Кубическая интерполяция кривыми Безье
+
    std::cout << std::endl << "y ";
for (int i = 0; i < N - 1; i++)
+
    for (int i=0; i<=D.j; ++i)   // аналогичный предыдущему цикл, выводящий значения на экран
{
+
    {
// Создание 4 точек для интерполяции по ним
+
        std::cout << B[i] << " ";
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
+
    }
+
}
// Значения для первого и последнего отрезков
+
void Func::operator *(Func D)   // перегрузка оператора '*'
if (i == 0)
+
{
P1 = (mas[1] - mas[0]) * alpha + mas[0];
+
    UmnFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1*f2 будет работать аналогично записи f1.UmnFunc(f2)
else
+
}
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
+
void Func::DelFunc (Func D)    // функция, линейно делящая значения первой функци на значения второй функции
if (i == N - 2)
+
{
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
+
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
else
+
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
P2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
+
    {
+
        B[i]=B[i]/D.A[i];       // деление значений первой функций на значенийя второй для одного и того же значения переменной
for (double t = 0; t <= 1; t += i_step)
+
    }
{
+
    for (int i=0; i<=D.j; ++i)     // создание цикла, рассчитанного на то же количество раз, что и предыдущий
vec p;
+
    {
 
+
        out << B[i] << '\n';       // запись значений, полученных в предыдущем цикле, в файл
// Вычисление точки интерполированного графика по 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;
+
    out.close();    // закрытие файла после записи в него значений
}
+
    D.Viv();
}
+
    std::cout << std::endl << "y ";
 
+
    for (int i=0; i<=D.j; ++i)     // аналогичный предыдущему цикл, выводящий значения на экран
return G_New;
+
    {
} /* End of 'Interpolation' function */
+
        std::cout << B[i] << " ";
 
+
    }
/* Sum of 2 graphics function */
+
}
// Сложение двух графиков
+
void Func::operator /(Func D)  // перегрузка оператора '/'
graph graph::operator+( graph &G )
+
{
 +
    DelFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1/f2 будет работать аналогично записи f1.DelFunc(f2)
 +
}
 +
void Func::In (Func D)     // функция, интерполирующая первую функцию по второй
 
{
 
{
graph G_New, G1, G2;
+
    double l=c/D.c;    // создаем переменную, которой присваиваем значение, обозначающее, во сколько раз один шаг больше другого
int i, j;
+
    c=D.c;     // приводим больший шаг к меньшему значению
 
+
    z=D.j+1;    // ранее созданной переменной присваиваем значение, равное количеству элементов плюс один
// Заполнение параметров графика суммы
+
    int p=l;    // создаем целочисленную переменную, равную переменной l
G_New.MinX = (MinX >= G.MinX) ? MinX : G.MinX;
+
    B = new double [D.j+2];     // создание массива с количеством элементов D.j+2
G_New.MaxX = (MaxX <= G.MaxX) ? MaxX : G.MaxX;
+
    D.Viv(); std::cout << std::endl << "y ";
G_New.Step = Step * G.Step;
+
    B[0]=A[0]; std::cerr << B[0] << " ";    // присваиваем первому элементу нового массива значение первого элемента старого массива и выводим его на экран
G_New.N = (int)((G_New.MaxX - G_New.MinX) / G_New.Step);
+
    int k=0;    // создаем вспомогательную целочисленную переменную
G_New.mas = new vec[G_New.N];
+
    for (int i=0; i<=j; i+=p)  // создаем цикл, рассчитанный на j повторов через p
 +
    {
 +
        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)-ому элементу значение, выссчитанного по формуле через заданные изначально значения и вывод егона экран
 +
        B[i+p]=A[k+1];      // присваивание значению (i+p)-ого элемента нового массива значения (k+1)-ого элемента старого массива
 +
        std::cerr << B[i+p] << " ";    // вывод высчитанного выше значения на экран
 +
        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();
 +
}
 +
 
  
// Интерполяция слагаемых графиков, для приведение к общему шагу
 
G1 = Interpolation(G.Step);
 
G2 = G.Interpolation(Step);
 
  
// Поиск общего начала и конца графиков
+
#include <iostream>
for (i = 0; i < G1.N; i++)
+
#include <fstream>
if (fabs(G1.mas[i].X - G_New.MinX) <= Threshold)
+
#include "Func.h"
break;
 
  
for (j = 0; j < G2.N; j++)
+
using namespace std;
if (fabs(G2.mas[j].X - G_New.MinX) <= Threshold)
+
double m,n,o, m1, n1, o1;
break;
+
int a;
 +
char b;
  
// Заполнение графика суммы
+
int main()
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 */
 
 
 
/* Save Array of points function */
 
// Сохранение графика в файл по точкам
 
void graph::SaveArray( void )
 
 
{
 
{
// Создание указателя на тип FILE
+
    cout << "Enter the beginning, the end and the step of a function." << endl; // ввод опорных значений первой функции: начало, конец, шаг;
FILE *F;
+
    cin >> m >> n >> o; // считывание значений
 
+
    cout << "Enter the beginning, the end and the step of another function." << endl; // ввод опорных значений второй функции: начало, конец, шаг;
// Создание файла и открытие его в режиме записи
+
    cin >> m1 >> n1 >> o1; // считывание значений
fopen_s(&F, "graph.txt", "wt");
+
    Func F(m,n,o); // создание объекта класса Func, определяющий первую функцию
 
+
    cout << "The first function is" << endl; F.Viv(); cout << endl << "y ";
/* Запись в файл данных */
+
    F.DefFunc(); // определение первой функции через создание массива с ее значениями
// Количество точек
+
    cout << endl;
fprintf(F, "%d\n", N);
+
    Func F1(m1,n1,o1); // создание объекта класса Func, определяющий вторую функцию
// Шаг функции
+
    cout << "The second function is" << endl; F1.Viv(); cout << endl << "y ";
fprintf(F, "%lf\n", Step);
+
    F1.DefFunc(); // определение второй функции через создание массива с ее значениями
// Начальная координата по X
+
    cout << endl;
fprintf(F, "%lf\n", MinX);
+
    cout << "As two functions have different steps, we made the interpolation of the first function." << endl;
// Конечная координата по X
+
    F.In(F1); // линейная интерполяция первой функции по второй
fprintf(F, "%lf\n", MaxX);
+
    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>
for (int i = 0; i < N; ++i)
+
</div>
  fprintf(F, "%lf %lf ", mas[i].X, mas[i].Y);
 
  
// Закрытие файла
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
fclose(F);
+
'''[[Савельева Ольга]]'''
} /* End of 'SaveArray' function */
+
 +
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
 +
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
//Бибилотека необходимая для возможности включения русского языка в консоли
 +
#include <locale.h>
  
/* Approximation of function function */
+
class fun
// Аппроксимация графика
 
void graph::Approximation( void )
 
 
{
 
{
double k, b, s1 = 0, s2 = 0, s3 = 0, s4 = 0;
+
/*
 +
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:
for (int i = 0; i < N; i++)
+
//Коструктор по умолчанию
{
+
fun();
if (fabs(mas[i].X) < MAX && fabs(mas[i].Y) < MAX)
+
//Конструктор копирования
{
+
fun(fun &tmp);
s1 += mas[i].X * mas[i].Y;
+
//Деструктор
s2 += mas[i].X;
+
~fun();
s3 += mas[i].X * mas[i].X;
 
s4 += mas[i].Y;
 
}
 
}
 
  
k = (N * s1 - s2 * s4) / (double(N) * s3 - s2 * s2);
+
//Перегруженные операторы. Ключевое слово const в конце означает, что объект от которого вызвается метод не изменяется
b = (s4 - k * s2) / double(N);
+
const fun operator+(const fun& right) const;
 +
const fun operator-(const fun& right) const;
 +
const fun operator*(const fun& right) const;
 +
const fun operator/(const fun& right) const;
 +
const fun& operator=(const fun& right);
  
// Задача цвета и ширины линии
+
//Метод считывания из файла
glColor3d(1, 0.5, 0);
+
void readFile(const char *path);
glLineWidth(1);
+
//Метод вывода в файл
// Рисование
+
void writeFile(const char *path);
glBegin(GL_LINE_STRIP);
 
glVertex2d(MinX, MinX * k + b);
 
glVertex2d(MaxX, MaxX * k + b);
 
glEnd();
 
} /* End of 'Approximation' function */
 
  
/* End of 'GRAPH.CPP' file */
+
//Метод изменения шага
</syntaxhighlight>
+
void changeDx(double newDx);
"'''GRAPH.H'''"
+
//Метод вычисления значения в заданной точке
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
double getX(double x1);
/* FILENAME: GRAPH.H
+
};
* LAST UPDATE: 17.01.2016
 
*/
 
  
#ifndef _GRAPH_H_
+
//В конструкторе по умолчанию все просто.
#define _GRAPH_H_
+
fun::fun()
 +
{
 +
a = b = dx = 0;
 +
fx = NULL;
 +
}
  
#define _CRT_SECURE_NO_WARNINGS
+
//Конструктор копирования
 
+
fun::fun(fun &tmp)
#include <iostream>
+
{
#include <stdio.h>
+
int i, n;
#include <stdlib.h>
+
//Копирование свойств объекта tmp в текущий объект
#include <math.h>
+
a = tmp.a;
#include <time.h>
+
b = tmp.b;
#include <GL\glut.h>
+
dx = tmp.dx;
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Выделение необходимой памяти для хранения дискретных значений
 +
fx = new double[n];
 +
//Копирование дискретных значений объекта tmp в текущий объект
 +
for (i = 0; i<n; ++i)
 +
fx[i] = tmp.fx[i];
 +
}
  
#define MAX 100
+
//Деструктор
 
+
fun::~fun()
using namespace std;
+
{
 
+
//Освобождение памяти выделенной для массива дискретных значений
/* Useful constants */
+
if (fx != NULL) delete[] fx;
const double Threshold = 1e-10;
+
}
const double Infinity = 1e+10;
+
//Оператор сложения.
 
+
const fun fun::operator+(const fun& right) const
/* Vector representation type */
 
class vec
 
 
{
 
{
public:
+
//Создание результирующего объекта
double X, Y;
+
fun result;
 
+
int i, n;
/* Default constructor */
+
//Копирование свойств в результирующий объект
vec( void )
+
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;
 +
}
  
/* Class constructor */
+
//Этот оператор аналогичен оператору сложение
vec( double A ) : X(A), Y(A)
+
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];
  
/* Class constructor */
+
return result;
vec( double A, double B ) : X(A), Y(B)
+
}
{
 
}
 
  
static double R0( void )
+
//Этот оператор аналогичен оператору сложение
{
+
const fun fun::operator*(const fun& right) const
return rand() / (double)RAND_MAX;
+
{
} /* End of 'R0' function */
+
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];
  
static vec Rnd( void )
+
return result;
{
+
}
return vec(R0(), R0());
 
} /* End of 'Rnd' function */
 
  
/* The functions of operations on vectors */
+
//Этот оператор аналогичен оператору сложение
 +
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];
  
/* Vector = vector function */
+
return result;
vec operator=( vec &B )
+
}
{
 
X = B.X;
 
Y = B.Y;
 
  
return B;
+
//Оператор присваивания
} /* end of 'operator+' function */
+
const fun& fun::operator=(const fun& right)
 +
{
 +
//Проверка на самоприсваивание
 +
if (this == &right)
 +
//Возвращение в качестве результата текущий объект
 +
return *this;
  
/* Vector add vector function */
 
vec operator+( const vec &B ) const
 
{
 
return vec(X + B.X, Y + B.Y);
 
} /* end of 'operator+' function */
 
  
/* Vector sub vector function */
+
int i, n;
vec operator-( const vec &B ) const
+
//Присваивание свойств объекта right текущему объекту
{
+
a = right.a;
return vec(X - B.X, Y - B.Y);
+
b = right.b;
} /* end of 'operator-' function */
+
dx = right.dx;
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
 +
if (fx != NULL) delete[] fx;
 +
//Выделение необходимой памяти для хранения дискретных значений
 +
fx = new double[n];
  
vec operator-( void ) const
+
//Копирование дискретных значений объекта right в текущий объект
{
+
for (i = 0; i<n; ++i)
return vec(-X, -Y);
+
fx[i] = right.fx[i];
} /* end of 'operator-' function */
 
  
/* Vector mul number function */
+
//Возвращение в качестве результата текущий объект
vec operator*( const double N ) const
+
return *this;
{
+
}
return vec(X * N, Y * N);
 
} /* end of 'operator*' function */
 
  
/* Vector div number function */
+
/*
vec operator/( const double N ) const
+
Метод считывания из файла
{
+
path - путь к файлу из которого считывать
return vec(X / N, Y / N);
+
*/
} /* end of 'operator/' function */
 
  
/* Vector dot vector function */
+
void fun::readFile(const char *path)
double operator&( const vec &B ) const
+
{
{
+
//Открытие файла для считывания
return double(X * B.X + Y * B.Y);
+
FILE *in = fopen(path, "r");
} /* end of 'operator&' function */
+
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);
 +
}
  
vec & operator+=( const vec &B )
+
/*
{
+
Метод вывода в файл
X += B.X;
+
path - путь к файлу в который нужно вывести
Y += B.Y;
+
*/
  
return *this;
+
void fun::writeFile(const char *path)
} /* end of 'operator+=' function */
+
{
 +
//Открытие файла для вывода
 +
FILE *out = fopen(path, "w");
 +
int i, n;
 +
double x = a;
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Вывод информации о отрезке и шаге в файл
 +
fprintf(out, "[%.5lf, %.5lf] dx=%.5lf\n", a, b, dx);
 +
//Последовательный вывод пары (точка, значение в точке) в файл
 +
for (i = 0; i<n; ++i, x += dx)
 +
fprintf(out, "x=%.5lf f(x)=%.5lf\n", x, fx[i]);
 +
//Закрытие файла
 +
fclose(out);
 +
}
  
vec & operator-=( const vec &B )
+
/*
 +
Метод изменения величины шага
 +
*/
 +
void fun::changeDx(double newDx)
 +
{
 +
int i, j, n, newN;
 +
double *newFx, x, newX, x1, y1, x2, y2, K, B;
 +
//Вычисление количества старых дискретных значений
 +
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)
 
{
 
{
X -= B.X;
+
//В цикле находим отрезок где лежит точка в которой нужно вычислить новое дискретное значение
Y -= B.Y;
+
for (; i<n - 1; ++i, x += dx)
 
+
//Если без eps, то сравнения такие: x<=newX<=x+dx
return *this;
+
if ((newX - x>-eps) && ((x+dx) - newX>-eps))
} /* end of 'operator-=' function */
+
{
 +
//Линейная интерполяция
 +
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;
 +
}
  
vec & operator*=( const double N )
+
/*
 +
Метод вычисляет значение в точке xAns с помощью линейной интерполяции.
 +
*/
 +
double fun::getX(double xAns)
 +
{
 +
int i, n;
 +
double x, x1, y1, x2, y2, K, B;
 +
x = a;
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Ищем отрезок в котором лежит точка xAns
 +
for (i = 0; i<n - 1; ++i, x += dx)
 
{
 
{
X *= N;
+
//Если без eps, то сравнения такие: x<=newX<=x+dx
Y *= N;
+
if (((x+dx) - xAns>-eps) && (xAns - x>-eps))
 
+
{
return *this;
+
//Линейная интерполяция
} /* end of 'operator*=' function */
+
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()
 +
{
 +
//Включение поддержки русского языка в консоли
 +
setlocale(LC_ALL, "Russian");
 +
//Объявление трех переменных типа fun
 +
fun a, b, c;
 +
//Считывания первых дискретных значений из файла inputA.txt
 +
a.readFile("inputA.txt");
 +
//Считывания вторых дискретных значений из файла inputB.txt
 +
b.readFile("inputB.txt");
  
vec & operator/=( const double N )
+
//Первая функция
{
+
a.writeFile("outputA.txt");
X /= N;
+
//Вторая функция
Y /= N;
+
b.writeFile("outputB.txt");
  
return *this;
+
c = a + b;
} /* end of 'operator/=' function */
+
//Результат сложения двух функций
 +
c.writeFile("outputAaddB.txt");
  
double operator!( void ) const
 
{
 
return double(X * X + Y * Y);
 
} /* end of 'operator!' function */
 
  
/* Access vector components by index function */
+
c = a - b;
double operator[]( const int i ) const
+
//Результат вычитания второй функции из первой
{
+
c.writeFile("outputAsubB.txt");
switch (i)
 
{
 
case 0:
 
return double(X);
 
case 1:
 
return double(Y);
 
}
 
} /* end of 'operator[]' function */
 
  
/* Normalizing vector function */
+
c = a*b;
vec & Normalize( void )
+
//Результат умножения двух функций
{
+
c.writeFile("outputAmultiB.txt");
double len = !*this;
 
  
if (len != 1 && len != 0)
+
c = a / b;
*this /= sqrt(len);
+
//Результат деления первой функции на вторую
return *this;
+
c.writeFile("outputAdivB.txt");
} /* end of 'Normalize' function */
 
}; /* end of 'vec' class */
 
  
/* Graph class */
+
//У первой функции изменили шаг на 0.5
class graph
+
a.changeDx(0.5);
{
+
//Вывели её дискретные значения
public:
+
a.writeFile("outputChangeDx.txt");
double MinX, MaxX, Step; // Начальная координата по X; Конечная координата по X; Шаг функции
 
int N; // Количество точек
 
vec *mas, *Color; // Массивы точек и цветов
 
  
/* Default constructor */
+
//Функция, которая аппроксимирует её кусочно линейная.
graph( void )
+
//Для примера нашли значение аппроксимируещей функции в точке не совпадающей с дискретными значениями.
{
+
printf("Значение в точке 1.8 первой функции %.5lf\n", a.getX(1.8));
MinX = -10, MaxX = 10, Step = 0.1, N = 200;
 
}
 
  
/* Class constructor */
+
//Нужно чтобы окно консоли автоматически не закрылось
graph( double _MinX, double _MaxX, double _Step ) : MinX(_MinX), MaxX(_MaxX), Step(_Step)
+
system("pause");
{
+
return 0;
N = (int)((MaxX - MinX) / Step);
+
}
// Выделение памяти
+
</syntaxhighlight>
mas = new vec[N];
+
</div>
Color = new vec[N];
 
}
 
  
/* Load Array of points function */
 
void LoadArray( char *FileName );
 
  
/* Fill mas function */
 
void Fill( double(*f)(double) );
 
  
/* Draw graph 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 здесь]
void Draw( double(*f)(double) );
 
  
/* Draw graph function */
+
'''[[Степанянц Степан]]'''
void Draw( void );
+
 +
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.Данныеберутся из файла.
 +
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
  
/* Interpolation draw graph function */
 
void Interpolation_Draw( double i_step );
 
  
/* Interpolation graph function */
+
#include <iostream>
graph Interpolation( double i_step );
+
#include <vector>
 +
#include <math.h>
 +
#include <fstream>
 +
#include <stdio.h>
 +
#include <string>
 +
#include <time.h>
  
/* Sum of 2 graphics function */
+
using namespace std;
graph operator+( graph &G );
 
  
/* Save Array of points function */
+
class func {
void SaveArray( void );
+
    vector <double> vals;
 +
    double a, b, step, sz;
  
/* Approximation of function function */
+
public:
void Approximation( void );
+
    func (string fil) { //конструктор для ввода функции из файла
}; /* end of 'graph' class */
+
        ifstream f(fil.c_str());
 
+
        double a, b, step, y;
#endif /* _GRAPH_H_ */
+
        f >> a >> b >> step; //вводим основные значения из файла
 
+
        this->step = step;
/* End of 'GRAPH.H' file */
+
        this->sz = (int)((b - a) / step + 1); //считаем размер
</syntaxhighlight>
+
        this->a = a, this->b = b;
</div>
+
        for (int i = 0; i < this->sz; i++) {
[http://tm.spbstu.ru/File:T05GRAPH.7z Скачать архив]
+
            f >> y;
<br>
+
            this->vals.push_back(y); //считываем и записываем значения из файла
 
+
        }
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
        f.close();
'''[[Рубинова Раиса]]'''
+
    }
 
+
    func () {} //еще один конструктор
'''Описание программы''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции.
+
    func operator + (func a) { // эта и ближайшие четыре метода -- калькулятор функций
 
+
        func f = *new func(); //создаем новый экземпляр класса, ответ
'''Инструкция к программе''':
+
        for (int i = 0; i < sz; i++) {
1. Пользователь вводит параметры первой функции
+
            f.vals.push_back(this->vals[i] + a.vals[i]); // складываем покоординатно
2. Пользователь вводит параметры второй функции (при этом шаг второй функции меньше шага первой)
+
        }
3. Происходит интерполяция первой функции по второй
+
        f.step = a.step; // копируем все значения в ответ (возможно, это можно сделать гораздо проще и не писать 4*4 строк но почему-то ничего умнее я не придумал)
4. Пользователь выбирает арифметическую операцию
+
        f.a = a.a;
5. При желании пользователь может выполнить аппроксимацию полученного результата
+
        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;
 +
    }
 +
    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;
 +
    }
 +
    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;
 +
    }
  
 +
    pair<double, double> approx() { //аппроксимация. это все из наших лаб по физике, тут сплошная математика, никакого программирования
 +
        double mid = 0;
 +
        for (int i = 0; i < this->sz; i++) {
 +
            mid += this->a + i * this->step;
 +
        }
 +
        mid /= this->sz;
 +
        double d = 0;
 +
        for (int i = 0; i < this->sz; i++) {
 +
            d += pow((this->a + i * this->step - mid), 2.);
 +
        }
 +
        double a = 0;
 +
        for (int i = 0; i < this->sz; i++) {
 +
            a += (this->a + i * this->step - mid) * this->vals[i];
 +
        }
 +
        a /= d;
 +
        double midy = 0;
 +
        for (int i = 0; i < this->sz; i++) {
 +
            midy += this->vals[i];
 +
        }
 +
        midy /= this->sz;
 +
        double c = midy - a * mid;
 +
        return {a, c}; //{x,y} возвращает пару (на самом деле не пару а просто какой-нибудь объект) с первым значением x и вторым y
 +
    }
  
Скачать можно [http://tm.spbstu.ru/File:Funcc.rar тут].
+
    func inter(double step) {
 
+
        func f = *new func(); //ответ
 
+
        double curr2, curr1;
<div class="mw-collapsible-content">
+
        int j = 0;
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
        f.a = this->a, f.b = this->b, f.step = step, f.sz = (int)((b - a) / step + 1);
#ifndef FUNC_H
+
         for (int i = 0; i < f.sz; i++) {
#define FUNC_H
+
            curr2 = a + i * step;
 
+
            curr1 = a + j * this->step;
 
+
            while (curr1 + this->step <= curr2) {
class Func
+
                j++, curr1 += this->step;
{
+
            }
    public:
+
            if (curr1 == curr2) {
        Func(double a1, double b1, double c1);
+
                f.vals.push_back(this->vals[j]);
        virtual ~Func();
+
                continue;
         void DefFunc ();   // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
+
            }
        void PluFunc (Func D); // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
+
            f.vals.push_back((this->vals[j + 1] - this->vals[j]) * (curr2 - curr1) / this->step + this->vals[j]);//я хз, тут видимо какая-то математика
        void operator +(Func D); // перегрузка оператора '+'
+
         }
        void MinFunc (Func D); // функция, линейно вычитающая значения второй функции из значений первой функции
+
         return f;
        void operator -(Func D); // перегрузка оператора '-'
+
    }
        void UmnFunc (Func D); // функция, линейно переумножающая значения функций
+
    void write(string fil) { //запись. чтобы записать не в файл, а в консоль вывести, надо передать "-1"
         void operator *(Func D);  // перегрузка оператора '*'
+
         ofstream f(fil.c_str());
         void DelFunc (Func D); // функция, линейно делящая значения первой функци на значения второй функции
+
         if (fil != "-1") {
        void operator /(Func D);  // перегрузка оператора '/'
+
            f << this->a << ' ' << this->b << ' ' << this->step << '\n';
        void In (Func D)// функция, интерполирующая первую функцию по второй
+
         }
         void App (); // функция, аппроксимирующая полученную в результате сложения/вычитания/деления/умножения двух функций функцию
+
         else
         void Viv ();  // Функция вывода на экран значений
+
            cout << this->a << ' ' << this->b << ' ' << this->step << '\n';
    protected:
+
        for (int i = 0; i < sz; i++) {
    private:
+
            if (fil != "-1")
        double a,b,c;
+
                f << this->vals[i] << '\n';
         int j,z;
+
            else
         double *A,*B;
+
                cout << this->vals[i] << '\n';
};
+
        }
 
+
        f.close();
#endif // FUNC_H
 
 
 
 
 
 
 
#include "Func.h"
 
#include <fstream>
 
#include <iostream>
 
#include <math.h>
 
 
 
Func::Func(double a1, double b1, double c1):a(a1),b(b1),c(c1)  // конструктор для класса Func, создающий объект данного класса, определенный тремя значениями, введенными пользователем
 
{
 
    double d=(b-a)/c;   // расчет количества элементов, определяющих функцию
 
    j=floor(d);    // созданной целочисленной переменной присваивается значение, равное целой части числа, рассчитанного выше, с округлением в меньшую сторону
 
    A = new double [j+1];   // создание массива
 
}
 
  
Func::~Func()  // деструктор для класса Func
 
{
 
    //dtor
 
}
 
 
void Func::Viv ()  // Функция вывода на экран значений
 
{
 
    std::cout << "x ";
 
    for (int z=0; z<=j; ++z)
 
    {
 
        std::cout << z+1 << " ";
 
 
     }
 
     }
}
+
};
  
void Func::DefFunc ()   // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
+
int main() {
{
+
    string fil;
     double x;   // создание переменной, используемой для расчета значений функции
+
    cout << "Input the file name with the function values\n";
     for(int i=0; i<=j; ++i) // создание цикла, рассчитывающего j элементов
+
    cin >> fil;
    {
+
    func f = *new func(fil);
        x =i*c+a;   // задание значения перемнной x, определенной выше
+
    int a;
         A[i]=x*x;   // задание значения самой функции (при этом в данной ситуации нам неважно, как именно задается функция, ее значения могут быть определены любым способом, от этого алгоритм не меняется)
+
    char ch;
         std::cerr << A[i] << " ";   // вывод на экран значения функции
+
     double st;
 +
     while (true) {
 +
        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;
 +
        if (a == 4) {
 +
            cout << "input file name to write to\n";
 +
            cin >> fil;
 +
            f.write(fil);
 +
        }
 +
        if (a == 3) {
 +
            auto t = f.approx();
 +
            cout << "Approximate line equation is y = " << t.first << " * x + " << t.second << '\n';
 +
        }
 +
        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;
 
     }
 
     }
 
}
 
}
 +
</syntaxhighlight>
 +
</div>
 +
  
void Func::PluFunc (Func D)  // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
+
<br>'''[[Нарядчиков Александр]]'''<br>
{
+
'''Инструкция:''' Пользователю достаточно просто запустить программу.<br>
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
'''Описание программы:''' В окне рисуются графики с разным шагом, количеством точек, начальными и конечными координатами, по клавише 'G' происходит их кубическая интерполяция, также рисуется график их суммы. По клавише 'S' можно сохранить полученный график в текстовый документ в виде координат его точек. По клавише 'L' можно загрузить график из текстового документа, и он появится в окне программы. Также происходит линейная аппроксимация графика суммы, и график аппроксимации рисуется на экран.<br>
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
+
'''Описание алгоритма:''' Вся графика написана с помощью библиотек OpenGL и GLUT. Кубическая интерполяция написана с помощью кривых Безье(интерполяция по четырем точкам - кубическая кривая). При сложение двух графиков происходит их интерполяция, для приведения их к общему шагу. Линейная аппроксимация написана с помощью метода наименьших квадратов.<br>
    {
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
        B[i]=B[i]+D.A[i];  // сложение значений двух функций для одного и того же значения переменной
+
"'''T05GRAPH.CPP'''"
    }
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
/* FILENAME: T05GRAPH.CPP
    {
+
* LAST UPDATE: 17.01.2016
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
+
*/
    }
+
 
    out.close();    // закрытие файла после записи в него значений
+
#include "GRAPH.H"
    D.Viv();
+
 
    std::cout << std::endl << "y ";
+
/* Глобальные переменные */
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
+
// Глобальная переменная, хранящая время в секундах с момента старта программы
    {
+
double SyncTime;
        std::cout << B[i] << " ";
+
// Глобальные переменные для отслеживания нажатия клавиш
    }
+
bool IsGraph, IsSave, IsLoad, IsLoaded;
}
+
 
void Func::operator +(Func D)   // перегрузка оператора '+'
+
/* Timer function */
 +
// Подсчет времени
 +
void Timer( void )
 
{
 
{
    PluFunc(D);                         // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1+f2 будет работать аналогично записи f1.PluFunc(f2)
+
long t;
}
+
static long StartTime = -1;
void Func::MinFunc (Func D)   // функция, линейно вычитающая значения второй функции из значений первой функции
+
 
 +
t = clock();
 +
if (StartTime == -1)
 +
StartTime = t;
 +
SyncTime = (double)(t - StartTime) / CLOCKS_PER_SEC;
 +
} /* End of 'Timer' function */
 +
 
 +
/* Display function */
 +
// Стандартная функция, вызываемая при перерисовке окна
 +
void Display( void )
 
{
 
{
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
graph G1(-15, 15, 0.1), G2(2, 10, 0.4), G3, G4;
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
+
 
    {
+
// Запуск времени
        B[i]=B[i]-D.A[i];  // вычитание значений второй функций из значений первой для одного и того же значения переменной
+
Timer();
    }
+
 
    for (int i=0; i<=D.j; ++i)  // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
// Установка цвета закраски фона в белый
    {
+
glClearColor(1, 1, 1, 1);
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
+
// Очищаем цветовой буфер для создания нового изображения
    }
+
glClear(GL_COLOR_BUFFER_BIT);
    out.close();   // закрытие файла после записи в него значений
+
 
    D.Viv();
+
glLoadIdentity();
    std::cout << std::endl << "y ";
+
glScaled(0.1 / (1366 / 768.0), 0.1, 0.1);
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
+
 
    {
+
// Отрисовка осей X и Y
        std::cout << B[i] << " ";
+
glBegin(GL_LINE_STRIP);
    }
+
 
}
+
glColor3d(0, 0, 1);
void Func::operator -(Func D)   // перегрузка оператора '-'
+
glVertex2d(0, -1000);
{
+
glVertex2d(0, 1000);
    MinFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1-f2 будет работать аналогично записи f1.MinFunc(f2)
+
 
}
+
glColor3d(1, 0, 0);
void Func::UmnFunc (Func D)     // функция, линейно переумножающая значения функций
+
glVertex2d(-1000, 0);
{
+
glVertex2d(1000, 0);
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
 
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
+
glEnd();
    {
+
 
        B[i]=B[i]*D.A[i];  // умножение значений первой функций на значенийя второй для одного и того же значения переменной
+
/* Отрисовка графиков */
    }
+
// Отрисовка первого графика и его интерполяция по клавише "G"
    for (int i=0; i<=D.j; ++i)    // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
G1.Draw(sin);
    {
+
if (IsGraph == 1)
        out << B[i] << '\n';   // запись значений, полученных в предыдущем цикле, в файл
+
G1.Interpolation_Draw(1.0 / 32);
    }
+
 
    out.close();   // закрытие файла после записи в него значений
+
// Отрисовка второго графика и его интерполяция по клавише "G"
    D.Viv();
+
G2.Draw(log);
    std::cout << std::endl << "y ";
+
if (IsGraph == 1)
    for (int i=0; i<=D.j; ++i)   // аналогичный предыдущему цикл, выводящий значения на экран
+
G2.Interpolation_Draw(1.0 / 32);
    {
+
 
        std::cout << B[i] << " ";
+
// Отрисовка графика суммы для первого и второго графиков
    }
+
G3 = G2 + G1;
}
+
glColor3d(0, 1, 0);
void Func::operator *(Func D)  // перегрузка оператора '*'
+
G3.Draw();
{
+
// Аппроксимация графика суммы
    UmnFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1*f2 будет работать аналогично записи f1.UmnFunc(f2)
+
G3.Approximation();
}
+
 
void Func::DelFunc (Func D)    // функция, линейно делящая значения первой функци на значения второй функции
+
// Сохранение графика по клавише "S"
{
+
if (IsSave == 1)
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
{
    for(int i=0; i<=D.j; ++i)    // создание цикла, повторяющегося (D.j+1) раз
+
G3.SaveArray();
    {
+
IsSave == 0;
        B[i]=B[i]/D.A[i];       // деление значений первой функций на значенийя второй для одного и того же значения переменной
+
}
    }
+
    for (int i=0; i<=D.j; ++i)      // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
// Загрузка графика по клавише "L"
    {
+
if (IsLoad == 1)
        out << B[i] << '\n';       // запись значений, полученных в предыдущем цикле, в файл
+
{
    }
+
delete[] G4.mas;
    out.close();   // закрытие файла после записи в него значений
+
delete[] G4.Color;
    D.Viv();
+
G4.LoadArray("graph.txt");
    std::cout << std::endl << "y ";
+
IsLoad == 0;
    for (int i=0; i<=D.j; ++i)      // аналогичный предыдущему цикл, выводящий значения на экран
+
IsLoaded = 1;
    {
+
}
        std::cout << B[i] << " ";
+
    }
+
// Отрисовка загруженного графика
}
+
if (IsLoaded == 1)
void Func::operator /(Func D)   // перегрузка оператора '/'
+
{
 +
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();
 +
// Копируем вторичный буфер в окно
 +
glutSwapBuffers();
 +
// Вызываем функцию обновления кадра
 +
glutPostRedisplay();
 +
} /* End of 'Display' function */
 +
 
 +
/* Keyboard function */
 +
// Стандартная функция, вызываемая при нажатие клавиш на клавиатуре
 +
void Keyboard( unsigned char Key, int X, int Y )
 
{
 
{
    DelFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1/f2 будет работать аналогично записи f1.DelFunc(f2)
+
// Выход из программы
}
+
if (Key == 27)
void Func::In (Func D)     // функция, интерполирующая первую функцию по второй
+
exit(0);
{
+
// Отрисовка интерполированных графиков
    double l=c/D.c;    // создаем переменную, которой присваиваем значение, обозначающее, во сколько раз один шаг больше другого
+
else if ((Key == 'G') || (Key == 'g'))
    c=D.c;      // приводим больший шаг к меньшему значению
+
IsGraph = !IsGraph;
    z=D.j+1;    // ранее созданной переменной присваиваем значение, равное количеству элементов плюс один
+
// Сохранение графика суммы в файл
    int p=l;    // создаем целочисленную переменную, равную переменной l
+
else if ((Key == 'S') || (Key == 's'))
    B = new double [D.j+2];    // создание массива с количеством элементов D.j+2
+
IsSave = !IsSave;
    D.Viv(); std::cout << std::endl << "y ";
+
// Загрузка графика из файла
    B[0]=A[0]; std::cerr << B[0] << " ";    // присваиваем первому элементу нового массива значение первого элемента старого массива и выводим его на экран
+
else if ((Key == 'L') || (Key == 'l'))
    int k=0;    // создаем вспомогательную целочисленную переменную
+
IsLoad = !IsLoad;
    for (int i=0; i<=j; i+=p)   // создаем цикл, рассчитанный на j повторов через p
+
// Открытие программы в полном экране
    {
+
else if ((Key == 'F') || (Key == 'f'))
        for (int m=1; m<p; ++m)    // создание цикла, выссчитывавшего промежуточное значение
+
glutFullScreen();
        {B[i+m]=((A[k]+A[k+1])/p)*(l-m); std::cerr << B[i+m] << " ";}  // присваиваем (i+m)-ому элементу значение, выссчитанного по формуле через заданные изначально значения и вывод егона экран
+
} /* End of 'Keyboard' function */
        B[i+p]=A[k+1];     // присваивание значению (i+p)-ого элемента нового массива значения (k+1)-ого элемента старого массива
+
 
        std::cerr << B[i+p] << " ";     // вывод высчитанного выше значения на экран
+
/* Main function */
        k=k+1; // увеличение k на единицу
+
int main( int argc, char *argv[] )
    }
 
}
 
void Func::App ()   // функция, аппроксимирующая полученную в результате сложения/вычитания/деления/умножения двух функций функцию
 
 
{
 
{
    double d=0,e=0,f=0,g=0;    // создание переменных
+
// Инициализации OpenGL и GLUT
    double k=0,l=0;     // создание переменных
+
glutInit(&argc, argv);
    for (int i=0; i<z; ++i)    // цикл, который высчитывает сумму произведений зависимой и независимой переменных
+
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
        {d=i*B[i]+d;}
+
 
    for (int i=0; i<z; ++i)    // цикл, который высчитывает сумму всех значений функции
+
// Задача размеров и позиции окна
        {e=B[i]+e;}
+
glutInitWindowPosition(0, 0);
    for (int i=0; i<z; ++i)     // цикл, высчитывающий сумму всех аргументов функции
+
glutInitWindowSize(500, 500);
        {f=i+f;}
+
// Создание окна
    for (int i=0; i<z; ++i)    // цикл, высчитывающий сумму квадратов всех аргументов функции
+
glutCreateWindow("T05GRAPH");
        {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();
 
}
 
  
 +
// Установка функций 'обратного вызова'
 +
glutDisplayFunc(Display);
 +
glutKeyboardFunc(Keyboard);
  
 +
// Запускаем основной цикл построения
 +
glutMainLoop();
 +
return 0;
 +
} /* End of 'main' function */
  
#include <iostream>
+
/* END OF 'T05GRAPH.CPP' FILE */
#include <fstream>
+
</syntaxhighlight>
#include "Func.h"
+
"'''GRAPH.CPP'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: GRAPH.CPP
 +
* LAST UPDATE: 17.01.2016
 +
*/
  
using namespace std;
+
#include "GRAPH.H"
double m,n,o, m1, n1, o1;
 
int a;
 
char b;
 
  
int main()
+
/* Load Array of points function */
 +
// Загрузка графика из файла по точкам
 +
void graph::LoadArray( char *FileName )
 
{
 
{
    cout << "Enter the beginning, the end and the step of a function." << endl; // ввод опорных значений первой функции: начало, конец, шаг;
+
// Создание указателя на тип FILE
    cin >> m >> n >> o; // считывание значений
+
FILE *F;
    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>
+
// Создание файла и открытие его в режиме чтения
</div>
+
fopen_s(&F, FileName, "rt");
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
// Количество точек
'''[[Савельева Ольга]]'''
+
fscanf(F, "%d", &N);
+
// Шаг функции
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
+
fscanf(F, "%lf", &Step);
<div class="mw-collapsible-content">
+
// Начальная координата по X
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
fscanf(F, "%lf", &MinX);
#include <stdio.h>
+
// Конечная координата по X
#include <stdlib.h>
+
fscanf(F, "%lf", &MaxX);
//Бибилотека необходимая для возможности включения русского языка в консоли
+
#include <locale.h>
+
// Выделение памяти под массив точек
 +
mas = new vec[N];
 +
 
 +
// Заполнение массива точек из файла
 +
for (int i = 0; i < N; ++i)
 +
{
 +
// Заполнение по X
 +
fscanf(F, "%lf", &mas[i].X);
 +
// Заполнение по Y
 +
fscanf(F, "%lf", &mas[i].Y);
 +
}
 +
 
 +
// Закрытие файла
 +
fclose(F);
 +
} /* End of 'LoadArray' function */
  
class fun
+
/* Fill mas function */
 +
// Заполнение массива координат точек с цветом
 +
void graph::Fill( double(*f)(double) )
 
{
 
{
/*
+
// Выделение памяти под массив точек
fx - массив с дискретными значениями функции
+
mas = new vec[N];
a - начало отрезка определения функции
+
// Выделение памяти под массив цветов
b - конец отрезка определения функции
+
Color = new vec[N];
dx - шаг
 
*/
 
double *fx, a, b, dx;
 
//Чтобы очусть ошибки округления в вещественных числах при сравнениях используется константа eps.
 
//К примеру два вещественных числа x и y сравниваются не так x>=y, а так x-y>=-eps.
 
const double eps = 1e-10; //1e-10 это тоже самое что 0.0000000001
 
  
public:
+
// Заполнение массивов
//Коструктор по умолчанию
+
for (int i = 0; i < N; i++)
fun();
+
{
//Конструктор копирования
+
mas[i] = vec(MinX + i * Step, f(MinX + i * Step));
fun(fun &tmp);
+
Color[i] = vec::Rnd();
//Деструктор
+
}
~fun();
+
} /* End of 'Fill' function */
  
//Перегруженные операторы. Ключевое слово const в конце означает, что объект от которого вызвается метод не изменяется
+
/* Draw graph function */
const fun operator+(const fun& right) const;
+
// Рисование заполненного графика на экран
const fun operator-(const fun& right) const;
+
void graph::Draw( void )
const fun operator*(const fun& right) const;
+
{
const fun operator/(const fun& right) const;
+
  // Задача размер точки
const fun& operator=(const fun& right);
+
glPointSize(1);
 +
// Рисование
 +
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 */
void readFile(const char *path);
+
// Рисование не заполненного еще графика на экран
//Метод вывода в файл
+
void graph::Draw( double(*f)(double) )
void writeFile(const char *path);
+
{
 +
// Заполнение массива
 +
graph::Fill(f);
  
//Метод изменения шага
+
// Задача цвета и размера точки
void changeDx(double newDx);
+
glColor3d(0, 0, 0);
//Метод вычисления значения в заданной точке
+
glPointSize(1);
double getX(double x1);
+
// Рисование
};
+
glBegin(GL_POINTS);
 +
for (int i = 0; i < N; i++)
 +
glVertex2d(mas[i].X, mas[i].Y);
 +
glEnd();
 +
} /* End of 'Draw' function */
  
//В конструкторе по умолчанию все просто.
+
/* Interpolation draw graph function */
fun::fun()
+
// Рисование интерполированного графика на экран
 +
void graph::Interpolation_Draw( double i_step )
 
{
 
{
a = b = dx = 0;
+
// Коэффициент Катмулл-Рома
fx = NULL;
+
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];
  
//Конструктор копирования
+
// Значения для первого и последнего отрезков
fun::fun(fun &tmp)
+
if (i == 0)
{
+
{
int i, n;
+
P1 = (mas[1] - mas[0]) * alpha + mas[0];
//Копирование свойств объекта tmp в текущий объект
+
Color1 = (mas[1] - mas[0]) * alpha + mas[0];
a = tmp.a;
+
}
b = tmp.b;
+
else
dx = tmp.dx;
+
{
//Вычисление количества дискретных значений
+
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
n = (b - a) / dx + 1;
+
Color1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
//Выделение необходимой памяти для хранения дискретных значений
+
}
fx = new double[n];
+
if (i == N - 2)
//Копирование дискретных значений объекта tmp в текущий объект
+
{
for (i = 0; i<n; ++i)
+
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
fx[i] = tmp.fx[i];
+
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];
 +
}
 +
 
 +
glLineWidth(2);
 +
glBegin(GL_LINE_STRIP);
 +
for (double t = 0; t <= 1; t += i_step)
 +
{
 +
vec p, color;
  
//Деструктор
+
// Вычисление точки интерполированного графика по 4 точкам
fun::~fun()
+
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;
//Освобождение памяти выделенной для массива дискретных значений
 
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;
+
glColor3d(color.X / 10, 0, color.Y);
}
+
glVertex2d(p.X, p.Y);
 +
}
 +
glEnd();
 +
}
 +
} /* End of 'Interpolation_Draw' function */
  
//Этот оператор аналогичен оператору сложение
+
/* Interpolation graph function */
const fun fun::operator-(const fun& right) const
+
// Интерполяция графика
 +
graph graph::Interpolation( double i_step )
 
{
 
{
fun result;
+
graph G_New;
int i, n;
+
// Коэффициент Катмулл-Рома
result.dx = dx;
+
double alpha = 1.0 / 6;
result.a = a;
+
 
result.b = b;
+
// Заполнение параметров для нового графика
n = (b - a) / dx + 1;
+
G_New.MinX = MinX;
result.fx = new double[n];
+
G_New.MaxX = MaxX;
for (i = 0; i<n; ++i)
+
G_New.Step = Step * i_step;
result.fx[i] = fx[i] - right.fx[i];
+
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 точкам
 +
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 result;
+
return G_New;
}
+
} /* End of 'Interpolation' function */
  
//Этот оператор аналогичен оператору сложение
+
/* Sum of 2 graphics function */
const fun fun::operator*(const fun& right) const
+
// Сложение двух графиков
 +
graph graph::operator+( graph &G )
 
{
 
{
fun result;
+
graph G_New, G1, G2;
int i, n;
+
int i, j;
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;
+
// Заполнение параметров графика суммы
}
+
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];
  
//Этот оператор аналогичен оператору сложение
+
// Интерполяция слагаемых графиков, для приведение к общему шагу
const fun fun::operator/(const fun& right) const
+
G1 = Interpolation(G.Step);
{
+
G2 = G.Interpolation(Step);
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;
+
// Поиск общего начала и конца графиков
}
+
for (i = 0; i < G1.N; i++)
 +
if (fabs(G1.mas[i].X - G_New.MinX) <= Threshold)
 +
break;
  
//Оператор присваивания
+
for (j = 0; j < G2.N; j++)
const fun& fun::operator=(const fun& right)
+
if (fabs(G2.mas[j].X - G_New.MinX) <= Threshold)
{
+
break;
//Проверка на самоприсваивание
 
if (this == &right)
 
//Возвращение в качестве результата текущий объект
 
return *this;
 
  
 +
// Заполнение графика суммы
 +
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;
 +
}
  
int i, n;
+
return G_New;
//Присваивание свойств объекта right текущему объекту
+
} /* End of 'Sum' function */
a = right.a;
 
b = right.b;
 
dx = right.dx;
 
//Вычисление количества дискретных значений
 
n = (b - a) / dx + 1;
 
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
 
if (fx != NULL) delete[] fx;
 
//Выделение необходимой памяти для хранения дискретных значений
 
fx = new double[n];
 
  
//Копирование дискретных значений объекта right в текущий объект
+
/* Save Array of points function */
for (i = 0; i<n; ++i)
+
// Сохранение графика в файл по точкам
fx[i] = right.fx[i];
+
void graph::SaveArray( void )
 +
{
 +
// Создание указателя на тип FILE
 +
FILE *F;
  
//Возвращение в качестве результата текущий объект
+
// Создание файла и открытие его в режиме записи
return *this;
+
fopen_s(&F, "graph.txt", "wt");
}
 
  
/*
+
/* Запись в файл данных */
Метод считывания из файла
+
// Количество точек
path - путь к файлу из которого считывать
+
fprintf(F, "%d\n", N);
*/
+
// Шаг функции
 +
fprintf(F, "%lf\n", Step);
 +
// Начальная координата по X
 +
fprintf(F, "%lf\n", MinX);
 +
// Конечная координата по X
 +
fprintf(F, "%lf\n", MaxX);
  
void fun::readFile(const char *path)
+
// Координаты всех точек
{
+
for (int i = 0; i < N; ++i)
//Открытие файла для считывания
+
  fprintf(F, "%lf %lf ", mas[i].X, mas[i].Y);
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);
 
}
 
  
/*
+
// Закрытие файла
Метод вывода в файл
+
fclose(F);
path - путь к файлу в который нужно вывести
+
} /* End of 'SaveArray' function */
*/
 
  
void fun::writeFile(const char *path)
+
/* Approximation of function function */
 +
// Аппроксимация графика
 +
void graph::Approximation( void )
 
{
 
{
//Открытие файла для вывода
+
double k, b, s1 = 0, s2 = 0, s3 = 0, s4 = 0;
FILE *out = fopen(path, "w");
 
int i, n;
 
double x = a;
 
//Вычисление количества дискретных значений
 
n = (b - a) / dx + 1;
 
//Вывод информации о отрезке и шаге в файл
 
fprintf(out, "[%.5lf, %.5lf] dx=%.5lf\n", a, b, dx);
 
//Последовательный вывод пары (точка, значение в точке) в файл
 
for (i = 0; i<n; ++i, x += dx)
 
fprintf(out, "x=%.5lf f(x)=%.5lf\n", x, fx[i]);
 
//Закрытие файла
 
fclose(out);
 
}
 
  
/*
+
// Линейная аппроксимация
Метод изменения величины шага
+
for (int i = 0; i < N; i++)
*/
 
void fun::changeDx(double newDx)
 
{
 
int i, j, n, newN;
 
double *newFx, x, newX, x1, y1, x2, y2, K, B;
 
//Вычисление количества старых дискретных значений
 
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)
 
 
{
 
{
//В цикле находим отрезок где лежит точка в которой нужно вычислить новое дискретное значение
+
if (fabs(mas[i].X) < MAX && fabs(mas[i].Y) < MAX)
for (; i<n - 1; ++i, x += dx)
+
{
//Если без eps, то сравнения такие: x<=newX<=x+dx
+
s1 += mas[i].X * mas[i].Y;
if ((newX - x>-eps) && ((x+dx) - newX>-eps))
+
s2 += mas[i].X;
{
+
s3 += mas[i].X * mas[i].X;
//Линейная интерполяция
+
s4 += mas[i].Y;
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;
 
}
 
  
/*
+
k = (N * s1 - s2 * s4) / (double(N) * s3 - s2 * s2);
Метод вычисляет значение в точке xAns с помощью линейной интерполяции.
+
b = (s4 - k * s2) / double(N);
*/
+
 
double fun::getX(double xAns)
+
// Задача цвета и ширины линии
{
+
glColor3d(1, 0.5, 0);
int i, n;
+
glLineWidth(1);
double x, x1, y1, x2, y2, K, B;
+
// Рисование
x = a;
+
glBegin(GL_LINE_STRIP);
//Вычисление количества дискретных значений
+
glVertex2d(MinX, MinX * k + b);
n = (b - a) / dx + 1;
+
glVertex2d(MaxX, MaxX * k + b);
//Ищем отрезок в котором лежит точка xAns
+
glEnd();
for (i = 0; i<n - 1; ++i, x += dx)
+
} /* End of 'Approximation' 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()
+
/* End of 'GRAPH.CPP' file */
{
+
</syntaxhighlight>
//Включение поддержки русского языка в консоли
+
"'''GRAPH.H'''"
setlocale(LC_ALL, "Russian");
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
//Объявление трех переменных типа fun
+
/* FILENAME: GRAPH.H
fun a, b, c;
+
* LAST UPDATE: 17.01.2016
//Считывания первых дискретных значений из файла inputA.txt
+
*/
a.readFile("inputA.txt");
 
//Считывания вторых дискретных значений из файла inputB.txt
 
b.readFile("inputB.txt");
 
  
//Первая функция
+
#ifndef _GRAPH_H_
a.writeFile("outputA.txt");
+
#define _GRAPH_H_
//Вторая функция
 
b.writeFile("outputB.txt");
 
  
c = a + b;
+
#define _CRT_SECURE_NO_WARNINGS
//Результат сложения двух функций
 
c.writeFile("outputAaddB.txt");
 
  
 +
#include <iostream>
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
#include <math.h>
 +
#include <time.h>
 +
#include <GL\glut.h>
  
c = a - b;
+
#define MAX 100
//Результат вычитания второй функции из первой
 
c.writeFile("outputAsubB.txt");
 
  
c = a*b;
+
using namespace std;
//Результат умножения двух функций
 
c.writeFile("outputAmultiB.txt");
 
  
c = a / b;
+
/* Useful constants */
//Результат деления первой функции на вторую
+
const double Threshold = 1e-10;
c.writeFile("outputAdivB.txt");
+
const double Infinity = 1e+10;
  
//У первой функции изменили шаг на 0.5
+
/* Vector representation type */
a.changeDx(0.5);
+
class vec
//Вывели её дискретные значения
+
{
a.writeFile("outputChangeDx.txt");
+
public:
 +
double X, Y;
  
//Функция, которая аппроксимирует её кусочно линейная.
+
/* Default constructor */
//Для примера нашли значение аппроксимируещей функции в точке не совпадающей с дискретными значениями.
+
vec( void )
printf("Значение в точке 1.8 первой функции %.5lf\n", a.getX(1.8));
+
{
 +
}
  
//Нужно чтобы окно консоли автоматически не закрылось
+
/* Class constructor */
system("pause");
+
vec( double A ) : X(A), Y(A)
return 0;
+
{
}
+
}
</syntaxhighlight>
 
</div>
 
  
 +
/* Class constructor */
 +
vec( double A, double B ) : X(A), Y(B)
 +
{
 +
}
  
 +
static double R0( void )
 +
{
 +
return rand() / (double)RAND_MAX;
 +
} /* End of 'R0' 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 здесь]
+
static vec Rnd( void )
 +
{
 +
return vec(R0(), R0());
 +
} /* End of 'Rnd' function */
  
 +
/* The functions of operations on vectors */
  
'''[[Сенников Иван]]'''
+
/* Vector = vector function */
+
vec operator=( vec &B )
'''Суть программы:''' Программы позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
+
{
 +
X = B.X;
 +
Y = B.Y;
  
'''Идея:''' Класс работы с функциями содержит такие функции как функция введения данных функции - ее создание, перегрузки оператора сложения, линейных интерполяции и аппроксимации, выделения и освобождения памяти. Линейная интерполяция написана с помощью теории аналитической геометрии на плоскости, а линейная аппроксимация с помощью метода наименьших квадратов.
+
return B;
 +
} /* end of 'operator+' function */
  
'''Инструкция:''' Программа выполнена в виде меню на английском языке: пользователю будет предоставлена возможность выйти из программы, создать обе функции, а также поработать с ними в индивидуальном порядке и сложить две уже существующие функции. Комментарии к программе написаны также на английском языке.
+
/* Vector add vector function */
 +
vec operator+( const vec &B ) const
 +
{
 +
return vec(X + B.X, Y + B.Y);
 +
} /* end of 'operator+' function */
  
Ссылка для скачиваний: [http://tm.spbstu.ru/Файл:Func.zip здесь].
+
/* Vector sub vector function */
 +
vec operator-( const vec &B ) const
 +
{
 +
return vec(X - B.X, Y - B.Y);
 +
} /* end of 'operator-' function */
  
 +
vec operator-( void ) const
 +
{
 +
return vec(-X, -Y);
 +
} /* end of 'operator-' function */
 +
 +
/* Vector mul number function */
 +
vec operator*( const double N ) const
 +
{
 +
return vec(X * N, Y * N);
 +
} /* end of 'operator*' function */
  
'''[[Степанянц Степан]]'''
+
/* Vector div number function */
+
vec operator/( const double N ) const
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.Данныеберутся из файла.
+
{
<div class="mw-collapsible-content">
+
return vec(X / N, Y / N);
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
} /* 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 )
 +
{
 +
X += B.X;
 +
Y += B.Y;
 +
 
 +
return *this;
 +
} /* end of 'operator+=' function */
 +
 
 +
vec & operator-=( const vec &B )
 +
{
 +
X -= B.X;
 +
Y -= B.Y;
 +
 
 +
return *this;
 +
} /* end of 'operator-=' function */
 +
 
 +
vec & operator*=( const double N )
 +
{
 +
X *= N;
 +
Y *= N;
 +
 
 +
return *this;
 +
} /* end of 'operator*=' function */
 +
 
 +
vec & operator/=( const double N )
 +
{
 +
X /= N;
 +
Y /= N;
 +
 
 +
return *this;
 +
} /* end of 'operator/=' function */
 +
 
 +
double operator!( void ) const
 +
{
 +
return double(X * X + Y * Y);
 +
} /* end of 'operator!' function */
 +
 
 +
/* Access vector components by index function */
 +
double operator[]( const int i ) const
 +
{
 +
switch (i)
 +
{
 +
case 0:
 +
return double(X);
 +
case 1:
 +
return double(Y);
 +
}
 +
} /* end of 'operator[]' function */
 +
 
 +
/* Normalizing vector function */
 +
vec & Normalize( void )
 +
{
 +
double len = !*this;
 +
 
 +
if (len != 1 && len != 0)
 +
*this /= sqrt(len);
 +
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; // Массивы точек и цветов
 +
 
 +
/* Default constructor */
 +
graph( void )
 +
{
 +
MinX = -10, MaxX = 10, Step = 0.1, N = 200;
 +
}
 +
 
 +
/* Class constructor */
 +
graph( double _MinX, double _MaxX, double _Step ) : MinX(_MinX), MaxX(_MaxX), Step(_Step)
 +
{
 +
N = (int)((MaxX - MinX) / Step);
 +
// Выделение памяти
 +
mas = new vec[N];
 +
Color = new vec[N];
 +
}
 +
 
 +
/* Load Array of points function */
 +
void LoadArray( char *FileName );
 +
 
 +
/* Fill mas function */
 +
void Fill( double(*f)(double) );
 +
 
 +
/* Draw graph function */
 +
void Draw( double(*f)(double) );
 +
 
 +
/* Draw graph function */
 +
void Draw( void );
 +
 
 +
/* Interpolation draw graph function */
 +
void Interpolation_Draw( double i_step );
 +
 
 +
/* Interpolation graph function */
 +
graph Interpolation( double i_step );
 +
 
 +
/* 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>
 +
 
 +
 
 +
'''[[Абрамов Игорь]]'''
 +
 
 +
'''Алгоритм''': функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно двумя способами: с помощью математических функций из стандартных библиотек, указывая начало и конец отрезка, а также шаг, с которым определена функция, и считывая координаты точек из файла, предварительно считав их количество. Далее с любыми функциями можно производить следующие действия и их комбинации: сложение, вычитание, кубическая интерполяция и линейная аппроксимация. При этом результат каждого из этих действий - новая функция, с которой можно продолжать работу. Функции можно выводить на экран с помощью средств графической библиотеки OpenGL, а также печатать её значения в файл.
 +
 
 +
'''Инструкция''': пользователь вводит необходимые действия с функциями в функции Display. На данный момент при запуске программы можно увидеть пример её работы: первая функция считывается из файла, интерполируется и выводится на экран. Затем вторая функция вводится из библиотеки math.h интерполируется и выводится на экран. Затем функции суммируются, интерполируются и выводятся на экран. [[:File:Func_Abramov.rar]]
 +
 
 +
Ссылка на скачивание: [http://tm.spbstu.ru/File:Func_Abramov.rar]
 +
 
 +
 
 +
'''[[Анастасия Бальцер]]'''
 +
 
 +
'''Описание программы''': Программа считывает из файла значения функций и количество точек, затем с ними можно провести следующие действия: сложить, умножить, линейно интерполировать и линейно аппроксимировать. Все результаты выводятся в отдельные файлы.
 +
 
 +
'''Пояснения к работе''': В два текстовые файла занести количество точек и значения абсцисс и ординат функций, который написать в первом и втором пунктах меню, затем выбрать необходимую операцию и ввести имя файла, в который сохранятся полученные значения.
 +
 
 +
Скачать можно  [http://tm.spbstu.ru/Файл:inter.zip тут].
  
#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();
 
    }
 
    func () {} //еще один конструктор
 
    func operator + (func a) { // эта и ближайшие четыре метода -- калькулятор функций
 
        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;
 
    }
 
    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;
 
    }
 
    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;
 
    }
 
 
    pair<double, double> approx() { //аппроксимация.
 
        double mid = 0;
 
        for (int i = 0; i < this->sz; i++) {
 
            mid += this->a + i * this->step;
 
        }
 
        mid /= this->sz;
 
        double d = 0;
 
        for (int i = 0; i < this->sz; i++) {
 
            d += pow((this->a + i * this->step - mid), 2.);
 
        }
 
        double a = 0;
 
        for (int i = 0; i < this->sz; i++) {
 
            a += (this->a + i * this->step - mid) * this->vals[i];
 
        }
 
        a /= d;
 
        double midy = 0;
 
        for (int i = 0; i < this->sz; i++) {
 
            midy += this->vals[i];
 
        }
 
        midy /= this->sz;
 
        double c = midy - a * mid;
 
        return {a, c}; //{x,y} возвращает пару (на самом деле не пару а просто какой-нибудь объект) с первым значением x и вторым y
 
    }
 
 
    func inter(double step) {
 
        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;
 
    }
 
    void write(string fil) { //запись. чтобы записать не в файл, а в консоль вывести, надо передать "-1"
 
        ofstream f(fil.c_str());
 
        if (fil != "-1") {
 
            f << this->a << ' ' << this->b << ' ' << this->step << '\n';
 
        }
 
        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();
 
 
    }
 
};
 
 
int main() {
 
    string fil;
 
    cout << "Input the file name with the function values\n";
 
    cin >> fil;
 
    func f = *new func(fil);
 
    int a;
 
    char ch;
 
    double st;
 
    while (true) {
 
        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;
 
        if (a == 4) {
 
            cout << "input file name to write to\n";
 
            cin >> fil;
 
            f.write(fil);
 
        }
 
        if (a == 3) {
 
            auto t = f.approx();
 
            cout << "Approximate line equation is y = " << t.first << " * x + " << t.second << '\n';
 
        }
 
        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;
 
    }
 
}
 
</syntaxhighlight>
 
</div>
 
  
'''[[Сюрис Александр]]'''
+
'''[[Тимошенко Валентина]]'''
Задаются две функции с разными шагами и начальными и конечными значениями.  Аппроксимирует одну функцию по шагу другой и складывает/умножает/вычитает/делит их
 
  
Скачать можно  [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 class="mw-collapsible-content">
+
'''Инструкция к программе''': при запуске программа предлагает ввести начало интервала, его конец и шаг для обеих функций. Далее пользователь выбирает одну из предложенных арифметических операций - сложение, вычитание, умножение или деление. После проведения вычислений программа предлагает пользователю интерполировать и аппроксимировать результат выбранной арифметической операции. Пользователь может давать команды на выполнение арифметических операций неограниченное число раз, программа завершает работу по команде пользователя.
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
  
#include <iostream>
 
#include <vector>
 
#include<math.h>
 
  
using namespace std;
+
Скачать программу можно здесь: [http://tm.spbstu.ru/Файл:Program2.zip].
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));
 
  
        vector<double> v1;//вектор, содержащий проинтерполированную функцию
+
<div class="mw-collapsible-content">
            for(int i=0; i<=(en-st)/d; i++)
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
                v1.push_back(a*(st+i*d)+b);//добавление значений проинтерполированной ф-ции с шагом другой функции
+
#include <iostream> ///программа, перегружающая операторы для работы с двумя функциями,
        return f(_st,_en,_d,v1);
+
#include <fstream>  ///интерполирующая и аппроксимирующая результат арифметических операций над этими функциями
 +
#include <math.h>
  
    }
+
using namespace std;
  
    f operator +(f x){//оператор сложения
+
class functions ///класс, хранящий значения введенных пользователем значений начала и конца исследуемого интервала, а также шага функции
        double _en,_st,_d;
+
{
        _en=min(en,x.en); //поиск области пересечения
+
private:
        _st=max(st,x.st);
+
    double *massiv1, *massiv2, *massiv3; ///указатели на массивы, которые будут использованы в программе
        if (_en>_st){//проверяем, пересекаются ли функции
+
    ///massiv1 - массив, хранящий изначальные значения функций, massiv2 - массив, хранящий значения одной из функций после интерполяции
            vector<double> _v;
+
    ///massiv3 - массив, хранящий значения суммы/разности/умножения/деления функций
            f y;
+
    double quantity_before_interpolation, Begin, End, Step;
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
+
    ///quantity - количество элементов в массиве(переменная типа double), Begin и End - начало и конец рассматриваемого отрезка, Step - шаг функции
                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(){ //поиск противоположной функции
+
public:
        for (int i=0; i<=(en-st)/d; i++)
 
            v[i]=(-1)*v[i];
 
        return *this;
 
    }
 
  
     f operator - (f x){ //разность функций
+
     int amount_before_interpolation; ///amount - количество элементов в массиве (переменная типа int)
         return(*this + x.prot());
+
    functions (double Begin1, double End1, double Step1 ):Begin(Begin1), End(End1), Step(Step1) ///переменные, в которые закладываются значения, введенные пользоватедем
 +
    {
 +
         quantity_before_interpolation =((End-Begin)/Step) + 1; ///расчёт количества элементов в массиве
 +
        amount_before_interpolation = static_cast < int >(quantity_before_interpolation); ///перевод значения количества элементов из типа double в тип int
 
     }
 
     }
  
f operator *(f x){//оператор умножения
+
    void function1(double Begin, double End, double Step) ///задание первой функции
        double _en,_st,_d;
+
    {
         _en=min(en,x.en); //поиск области пересечения
+
         massiv1 = new double [amount_before_interpolation]; ///создание массива для хранения значений функций
         _st=max(st,x.st);
+
         ofstream out ("Function1.txt"); ///запись в файл значений первой функции
        if (_en>_st){//проверяем, пересекаются ли функции
+
        out << "The size of the range = " << amount_before_interpolation << '\n' << endl;; ///вывод на экран количества элементов данного массива
            vector<double> _v;
+
        for (int i = 0; i < amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
            f y;
+
        {
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
+
            massiv1[i] = 2*i*Step+Begin; ///формула вычисления
                vector<double> _v;
+
             out << "y(x=" << i << ")= " << massiv1[i] << endl; ///вывод на экран полученных значений
                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);
 
            }
 
 
         }
 
         }
 +
        out.close(); ///завершение записи в файл
 
     }
 
     }
  
f obr(){
+
    void function2(double Begin,double End,double Step) ///задание второй функции
  for (int i=0; i<=(en-st)/d; i++)
+
    {
             v[i]=1/v[i];
+
        massiv1 = new double [amount_before_interpolation]; ///создание массива для хранения значений функции
         return *this;
+
        ofstream out ("Function2.txt"); ///запись в файл значений второй функции
}
+
        out << "The size of the range = " << amount_before_interpolation << '\n' << endl;; ///вывод на экран количества элементов данного массива
 
+
        for (int i = 0; i < amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
f operator /(f x){
+
        {
return(*this*x.obr());
+
             massiv1[i] = i*Step; ///формула вычисления
}
+
            out << "y(x=" << i << ")= " << massiv1[i] << endl; ///вывод на экран полученных значений
 +
         }
 +
        out.close(); ///завершение записи в файл
 +
    }
  
     void vivod(){ //вывод
+
     void interpolation (double Begin1, double End1, double Step2) ///интерполяция результата по новому шагу
    for(int i=0; i<v.size(); i++)
 
        cout<<v[i]<<" ";
 
 
 
    }
 
};
 
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;
+
         ofstream out ("Interpolation.txt"); ///запись в файл интерполированных значений функции
         x.push_back(t);
+
        double quantity_after_interpolation =((End1-Begin1)/Step2) + 1; ///расчёт количества элементов в массиве
    }
+
         int amount_after_interpolation = static_cast < int > (quantity_after_interpolation); ///перевод значения количества элементов из типа double в тип int
 +
        out << "After interpolation the size of range = " << amount_after_interpolation << '\n' << endl;
  
    cout << "Проделаем ровно то же самое для 2 функции ";
+
        massiv3 = new double [amount_after_interpolation]; ///создание массива для хранения значений функции
    cout << "Введите начала и конец отрезка и дельту: ";
+
        for (int i = 0; i < amount_after_interpolation; ++i) ///цикл, вычисляющий значения функции
     cin >> a1 >> b1 >> d1;
+
        {
 +
            double x = i*Step2 + Begin1; ///расчёт х-вой координаты
 +
            double x0 = static_cast < int >((x - Begin1)/Step + Begin1); ///расчёт нулевой х-вой координаты
 +
            ///перевод значения х0 из типа double в тип int
 +
            ///расчёт х-вой координаты, считая от введенного значения начала интервала
 +
            double x1 = x0 + Step; ///расчёт следующего значения х-вой координаты
 +
            int i_0 = (x - Begin1)/Step; ///расчёт нулевого индекса
 +
            int i0 = static_cast < int > (i_0); ///перевод нулевого индекса из типа double в тип int
 +
            int i1 = i0 + 1; ///расчёт следующего индекса
 +
            massiv3[i]=(((x - x0)*(massiv2[i1] - massiv2[i0]))/(x1-x0)) + massiv2[i0]; ///формула вычисления
 +
            out << "y(x=" << i << ")= " << massiv2[i] << endl; ///вывод на экран полученных значений
 +
        }
 +
        out.close(); ///завершение записи в файл
 +
     }
  
     amount2=(b1-a1)/d1+1;
+
     void approximation(double Begin1, double End1, double Step2) ///функция, аппроксимирующая результат сложения/вычитания/умножения/деления функций
    vector<double>y;
 
    cout << "Введите " << amount2 << " значений функции на данном интервале:";
 
    for (int i=0; i<amount2; i++)
 
 
     {
 
     {
         cin>>t;
+
         amount_before_interpolation=(End1-Begin1)/Step2+1;
        y.push_back(t);
+
        int SIZE = static_cast <int> (amount_before_interpolation); /// для удобства вводим переменную SIZE и закладываем в нее значение размера массива
    }
 
    f g(a,b,d,x);
 
    f h(a1,b1,d1,y);
 
  
    cout<<"Выберете дейстивя с функциями: +, -, *, \ " << endl;
+
        ///обнуление переменных
    cout<<"Введите число, соответсвующее порядковому номеру операции(1-4) - ";
+
        double sumX = 0; ///переменная, хранящая значение суммы х-вых координат
    cin>>o;
+
        double sumY = 0; ///переменная, хранящая значение суммы у-вых координат
    if(o==1){              //по невыясненным причинам одновременно написанные слева идущие if -ы не работают,
+
        double sumXY = 0; ///переменная, хранящая значение суммы произведений х-вой и у-вой координат
         cout<<"Сумма:";     //но если заккоментить их и менять знак + в скобке на другие, то все работает
+
        double sumX2 = 0; ///переменная, хранящая значение суммы х-вых координат, взятых в квадрате
         (g+h).vivod();
+
        double k=0; ///переменная, хранящая значения углового коэффициента касательной к графику данной функции
 +
         double b=0; ///переменная, хранящая значение свободного коэффициента
 +
         double d;
  
    }
+
        ofstream out ("Approximation.txt"); ///запись в файл аппроксимированных значений
 +
        for (int i = 0; i < SIZE; ++i) ///цикл для расчёта сумм, указанных выше
 +
        {
 +
            d=i*Step2+Begin1; ///расчёт х-вой координаты
  
    if(o==2){
+
            sumX = d + sumX; ///расчёт суммы х-вых координат
        cout<<"Разность:"
 
        (g-h).vivod();
 
  
    }
+
            sumY = massiv3[i] + sumY; ///расчёт суммы у-вых координат
  
    if(o==3){
+
            sumXY = d*massiv3[i] + sumXY; ///расчёт суммы произведений х-вой и у-вой координат
        cout<<"Произведение:"
 
        (g*h).vivod();
 
  
 +
            sumX2 = d*d + sumX2; ///расчёт суммы х-вых координат, взятых в квадрате
 +
        }
  
    }
+
        k =(SIZE*sumXY - sumX*sumY)/(SIZE*sumX2- sumX*sumX); ///расчёт углового коэффициента
  
    if(o==3){
+
        b =(sumY - k*sumX)/SIZE; ///расчёт свободного коэффициента
        cout<<"Отношение:"
 
        (g/h).vivod();
 
    }
 
  
 +
        out << "The equation, which is got as a result of approximation" << endl; ///вывод уравнения на экран
  
}
+
        if (b > 0) ///вывод уравнения при положительном свободном коэффициенте
 +
        {
 +
            out << "y = " << k << "*x+" << b << endl;
 +
        }
  
</syntaxhighlight>
+
        else if (b < 0) ///вывод уравнения при отрицательном свободном коэффициенте
</div>
+
        {
 +
            out << "y = " << k <<"*x" << b << endl;
 +
        }
 +
        out.close(); ///завершение записи в файл
 +
    }
  
'''[[Тимошенко Валентина]]'''
+
    ///перегрузка операторов
  
'''Краткое описание алгоритма''': в классе создаются две различные функции, а также функции для осуществления арифметических операций - сложения, вычитания, умножения и деления. Кроме того, созданы функции интерполяции и аппроксимации результата. Все результаты записываются в файлы, названия которых выводятся на экран в процессе работы программы.
+
    functions operator+ (functions func3) ///сумма двух функций
 +
    {
 +
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
  
'''Инструкция к программе''': при запуске программа предлагает ввести начало интервала, его конец и шаг для обеих функций. Далее пользователь выбирает одну из предложенных арифметических операций - сложение, вычитание, умножение или деление. После проведения вычислений программа предлагает пользователю интерполировать и аппроксимировать результат выбранной арифметической операции. Пользователь может давать команды на выполнение арифметических операций неограниченное число раз, программа завершает работу по команде пользователя.
+
        ofstream out ("Results_of_sum.txt"); ///запись в файл значений после суммирования значений функций
 +
        out << "sum of the functions" << '\n' << endl;
  
 +
        for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 +
        {
 +
            massiv2[i] = massiv1[i] + func3.massiv1[i]; ///формула вычисления
 +
            out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
 +
        }
 +
        out.close(); ///завершение записи в файл
  
Скачать программу можно здесь: [http://tm.spbstu.ru/Файл:Program2.zip].
+
        char d; ///переменная для команды интерполировать результат
 
+
        cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
<div class="mw-collapsible-content">
+
        cin >> d;
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <iostream> ///программа, перегружающая операторы для работы с двумя функциями,
 
#include <fstream> ///интерполирующая и аппроксимирующая результат арифметических операций над этими функциями
 
#include <math.h>
 
  
using namespace std;
+
        if (d=='+') ///если команда для интерполяции дана
 +
        {
 +
            double Step2; ///переменная, хранящая значение нового шага
 +
            cout << '\n' << "Input the step for interpolation" << endl;
 +
            cin >> Step2;
 +
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
  
class functions ///класс, хранящий значения введенных пользователем значений начала и конца исследуемого интервала, а также шага функции
+
            char w; /// переменная для команды аппроксимировать результат
{
+
            cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
private:
+
            cin >> w;
    double *massiv1, *massiv2, *massiv3; ///указатели на массивы, которые будут использованы в программе
 
    ///massiv1 - массив, хранящий изначальные значения функций, massiv2 - массив, хранящий значения одной из функций после интерполяции
 
    ///massiv3 - массив, хранящий значения суммы/разности/умножения/деления функций
 
    double quantity_before_interpolation, Begin, End, Step;
 
    ///quantity - количество элементов в массиве(переменная типа double), Begin и End - начало и конец рассматриваемого отрезка, Step - шаг функции
 
  
public:
+
            if (w=='+') ///если команда на аппроксимацию дана
 +
            {
 +
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
 +
            }
 +
        }
 +
    }
  
     int amount_before_interpolation; ///amount - количество элементов в массиве (переменная типа int)
+
     functions operator- (functions func3) ///разность двух функций
    functions (double Begin1, double End1, double Step1 ):Begin(Begin1), End(End1), Step(Step1) ///переменные, в которые закладываются значения, введенные пользоватедем
 
 
     {
 
     {
         quantity_before_interpolation =((End-Begin)/Step) + 1; ///расчёт количества элементов в массиве
+
         massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
        amount_before_interpolation = static_cast < int >(quantity_before_interpolation); ///перевод значения количества элементов из типа double в тип int
 
    }
 
  
    void function1(double Begin, double End, double Step) ///задание первой функции
+
         ofstream out ("Results_of_difference.txt"); ///запись в файл значений второй функции
    {
+
         out << "difference of the functions" << '\n' << endl;
        massiv1 = new double [amount_before_interpolation]; ///создание массива для хранения значений функций
+
 
         ofstream out ("Function1.txt"); ///запись в файл значений первой функции
+
         for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
         out << "The size of the range = " << amount_before_interpolation << '\n' << endl;; ///вывод на экран количества элементов данного массива
 
         for (int i = 0; i < amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 
 
         {
 
         {
             massiv1[i] = 2*i*Step+Begin; ///формула вычисления
+
             massiv2[i] = massiv1[i] - func3.massiv1[i]; ///формула вычисления
             out << "y(x=" << i << ")= " << massiv1[i] << endl; ///вывод на экран полученных значений
+
             out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
 
         }
 
         }
 
         out.close(); ///завершение записи в файл
 
         out.close(); ///завершение записи в файл
    }
 
  
    void function2(double Begin,double End,double Step) ///задание второй функции
+
         char d; ///переменная для команды интерполировать результат
    {
+
         cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
         massiv1 = new double [amount_before_interpolation]; ///создание массива для хранения значений функции
+
        cin >> d;
        ofstream out ("Function2.txt"); ///запись в файл значений второй функции
+
 
         out << "The size of the range = " << amount_before_interpolation << '\n' << endl;; ///вывод на экран количества элементов данного массива
+
         if (d=='+') ///если команда для интерполяции дана
         for (int i = 0; i < amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 
 
         {
 
         {
             massiv1[i] = i*Step; ///формула вычисления
+
             double Step2; ///переменная, хранящая значение нового шага
             out << "y(x=" << i << ")= " << massiv1[i] << endl; ///вывод на экран полученных значений
+
             cout << '\n' << "Input the step for interpolation" << endl;
 +
            cin >> Step2;
 +
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
 +
 
 +
            char w; /// переменная для команды аппроксимировать результат
 +
            cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
 +
            cin >> w;
 +
 
 +
            if (w=='+') ///если команда на аппроксимацию дана
 +
            {
 +
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
 +
            }
 
         }
 
         }
        out.close(); ///завершение записи в файл
 
 
     }
 
     }
  
     void interpolation (double Begin1, double End1, double Step2) ///интерполяция результата по новому шагу
+
     functions operator* (functions func3) ///произведение двух функций
 
     {
 
     {
         ofstream out ("Interpolation.txt"); ///запись в файл интерполированных значений функции
+
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
        double quantity_after_interpolation =((End1-Begin1)/Step2) + 1; ///расчёт количества элементов в массиве
+
 
        int amount_after_interpolation = static_cast < int > (quantity_after_interpolation); ///перевод значения количества элементов из типа double в тип int
+
         ofstream out ("Results_of_multiplying.txt"); ///запись в файл значений второй функции
         out << "After interpolation the size of range = " << amount_after_interpolation << '\n' << endl;
+
         out << "multiplying of the functions" << '\n' << endl;
  
        massiv3 = new double [amount_after_interpolation]; ///создание массива для хранения значений функции
+
         for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
         for (int i = 0; i < amount_after_interpolation; ++i) ///цикл, вычисляющий значения функции
 
 
         {
 
         {
             double x = i*Step2 + Begin1; ///расчёт х-вой координаты
+
             massiv2[i] = massiv1[i] * func3.massiv1[i]; ///формула вычисления
            double x0 = static_cast < int >((x - Begin1)/Step + Begin1); ///расчёт нулевой х-вой координаты
+
             out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
            ///перевод значения х0 из типа double в тип int
 
            ///расчёт х-вой координаты, считая от введенного значения начала интервала
 
            double x1 = x0 + Step; ///расчёт следующего значения х-вой координаты
 
            int i_0 = (x - Begin1)/Step; ///расчёт нулевого индекса
 
            int i0 = static_cast < int > (i_0); ///перевод нулевого индекса из типа double в тип int
 
            int i1 = i0 + 1; ///расчёт следующего индекса
 
            massiv3[i]=(((x - x0)*(massiv2[i1] - massiv2[i0]))/(x1-x0)) + massiv2[i0]; ///формула вычисления
 
             out << "y(x=" << i << ")= " << massiv2[i] << endl; ///вывод на экран полученных значений
 
 
         }
 
         }
 
         out.close(); ///завершение записи в файл
 
         out.close(); ///завершение записи в файл
    }
 
  
    void approximation(double Begin1, double End1, double Step2) ///функция, аппроксимирующая результат сложения/вычитания/умножения/деления функций
+
        char d; ///переменная для команды интерполировать результат
    {
+
         cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
         amount_before_interpolation=(End1-Begin1)/Step2+1;
+
         cin >> d;
         int SIZE = static_cast <int> (amount_before_interpolation); /// для удобства вводим переменную SIZE и закладываем в нее значение размера массива
 
  
         ///обнуление переменных
+
         if (d=='+') ///если команда для интерполяции дана
         double sumX = 0; ///переменная, хранящая значение суммы х-вых координат
+
         {
        double sumY = 0; ///переменная, хранящая значение суммы у-вых координат
+
            double Step2; ///переменная, хранящая значение нового шага
        double sumXY = 0; ///переменная, хранящая значение суммы произведений х-вой и у-вой координат
+
            cout << '\n' << "Input the step for interpolation" << endl;
        double sumX2 = 0; ///переменная, хранящая значение суммы х-вых координат, взятых в квадрате
+
            cin >> Step2;
        double k=0; ///переменная, хранящая значения углового коэффициента касательной к графику данной функции
+
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
        double b=0; ///переменная, хранящая значение свободного коэффициента
 
        double d;
 
  
        ofstream out ("Approximation.txt"); ///запись в файл аппроксимированных значений
+
            char w; /// переменная для команды аппроксимировать результат
        for (int i = 0; i < SIZE; ++i) ///цикл для расчёта сумм, указанных выше
+
            cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
        {
+
             cin >> w;
             d=i*Step2+Begin1; ///расчёт х-вой координаты
 
  
             sumX = d + sumX; ///расчёт суммы х-вых координат
+
             if (w=='+') ///если команда на аппроксимацию дана
 
+
             {
             sumY = massiv3[i] + sumY; ///расчёт суммы у-вых координат
+
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
 
+
             }
            sumXY = d*massiv3[i] + sumXY; ///расчёт суммы произведений х-вой и у-вой координат
 
 
 
             sumX2 = d*d + sumX2; ///расчёт суммы х-вых координат, взятых в квадрате
 
 
         }
 
         }
 +
    }
  
        k =(SIZE*sumXY - sumX*sumY)/(SIZE*sumX2- sumX*sumX); ///расчёт углового коэффициента
+
    functions operator/ (functions func3) ///деление двух функций
 +
    {
 +
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
  
         b =(sumY - k*sumX)/SIZE; ///расчёт свободного коэффициента
+
         ofstream out ("Results_of_dividing.txt"); ///запись в файл значений после деления значения первой функции на значения второй функции
 +
        out << "dividing of the functions" << '\n' << endl;
  
        out << "The equation, which is got as a result of approximation" << endl; ///вывод уравнения на экран
+
      for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 
 
        if (b > 0) ///вывод уравнения при положительном свободном коэффициенте
 
 
         {
 
         {
             out << "y = " << k << "*x+" << b << endl;
+
             massiv2[i] = massiv1[i] / func3.massiv1[i]; ///формула вычисления
        }
+
             out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
 
 
        else if (b < 0) ///вывод уравнения при отрицательном свободном коэффициенте
 
        {
 
             out << "y = " << k <<"*x" << b << endl;
 
 
         }
 
         }
 
         out.close(); ///завершение записи в файл
 
         out.close(); ///завершение записи в файл
    }
 
  
    ///перегрузка операторов
+
         char d; ///переменная для команды интерполировать результат
 
 
    functions operator+ (functions func3) ///сумма двух функций
 
    {
 
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
 
 
 
        ofstream out ("Results_of_sum.txt"); ///запись в файл значений после суммирования значений функций
 
        out << "sum of the functions" << '\n' << endl;
 
 
 
        for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 
        {
 
            massiv2[i] = massiv1[i] + func3.massiv1[i]; ///формула вычисления
 
            out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
 
        }
 
        out.close(); ///завершение записи в файл
 
 
 
         char d; ///переменная для команды интерполировать результат
 
 
         cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
 
         cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
 
         cin >> d;
 
         cin >> d;
Строка 3957: Строка 4203:
 
         }
 
         }
 
     }
 
     }
 +
};
  
     functions operator- (functions func3) ///разность двух функций
+
int main()
     {
+
{
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
+
    double Begin1, End1, Step1; ///переменные, вводимые пользователем
 +
    cout << "Input the beginning of the interval" << endl; ///ввод начала отрезка
 +
     cin >> Begin1;
 +
    cout << '\n' << "Input the end of the interval" << endl; ///ввод конца отрезка
 +
    cin >> End1;
 +
    cout << '\n' << "Input the step of functions" << endl; ///ввод начального шага функций
 +
     cin >> Step1;
 +
 
 +
    functions func1(Begin1, End1, Step1); ///вызов первой функции
 +
    func1.function1(Begin1, End1, Step1);
 +
    cout <<'\n' << "Meanings of the first function are saved in file called 'Function1.txt'" << endl;
  
        ofstream out ("Results_of_difference.txt"); ///запись в файл значений второй функции
+
    functions func2(Begin1, End1, Step1); ///вызов второй функции
        out << "difference of the functions" << '\n' << endl;
+
    func2.function2(Begin1, End1, Step1);
 +
    cout <<'\n' << "Meanings of the second function are saved in file called 'Function2.txt'" << endl;
  
        for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
+
    functions func3(Begin1,End1,Step1); ///вызов третьей функции
        {
 
            massiv2[i] = massiv1[i] - func3.massiv1[i]; ///формула вычисления
 
            out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
 
        }
 
        out.close(); ///завершение записи в файл
 
  
         char d; ///переменная для команды интерполировать результат
+
    char s; ///переменная, используется в цикле
         cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
+
    do
         cin >> d;
+
    {
 +
         char c; ///переменная, хранящая выбор арифметической операции пользователем
 +
         cout << '\n' << "Input your choice: + for sum,- for difference,* for multiplying,/ for dividing" << endl;
 +
         cin >> c;
  
         if (d=='+') ///если команда для интерполяции дана
+
         if (c=='+') ///цикл, запускающий функцию расчёта суммы двух функций, их интерполяцию и аппроксимацию
 
         {
 
         {
             double Step2; ///переменная, хранящая значение нового шага
+
             func3=func1+func2; ///формула расчёта суммы
             cout << '\n' << "Input the step for interpolation" << endl;
+
             cout << '\n' << "Results of sum are saved in file called 'Results_of_sum.txt'" << endl;
            cin >> Step2;
+
             cout << '\n' << "Result of interpolation is saved in file called 'Interpolation.txt'" << endl;
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
+
             cout << '\n' << "Result of approximation is saved in file called 'Interpolation.txt'" << endl;
 
 
            char w; /// переменная для команды аппроксимировать результат
 
             cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
 
             cin >> w;
 
 
 
            if (w=='+') ///если команда на аппроксимацию дана
 
            {
 
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
 
            }
 
 
         }
 
         }
    }
+
        if (c=='-') ///цикл, запускающий функцию расчёта разности двух функций, их интерполяцию и аппроксимацию
 
 
    functions operator* (functions func3) ///произведение двух функций
 
    {
 
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
 
 
 
        ofstream out ("Results_of_multiplying.txt"); ///запись в файл значений второй функции
 
        out << "multiplying of the functions" << '\n' << endl;
 
 
 
        for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 
 
         {
 
         {
             massiv2[i] = massiv1[i] * func3.massiv1[i]; ///формула вычисления
+
             func3=func1-func2; ///формула расчёта разности
             out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
+
             cout << '\n' << "Results of difference are saved in file called 'Results_of_difference.txt'" << endl;
 +
            cout << '\n' << "Result of interpolation is saved in file called 'Interpolation.txt'" << endl;
 +
            cout << '\n' << "Result of approximation is saved in file called 'Interpolation.txt'" << endl;
 +
        }
 +
        if (c=='*') ///цикл, запускающий функцию расчёта произведения двух функций, их интерполяцию и аппроксимацию
 +
        {
 +
            func3=func1*func2; ///формула расчёта произведения
 +
            cout << '\n' << "Results of multiplying are saved in file called 'Results_of_multiplying.txt'" << endl;
 +
            cout << '\n' << "Result of interpolation is saved in file called 'Interpolation.txt'" << endl;
 +
            cout << '\n' << "Result of approximation is saved in file called 'Interpolation.txt'" << endl;
 +
        }
 +
        if (c=='/') ///цикл, запускающий функцию расчёта частного двух функций, их интерполяцию и аппроксимацию
 +
        {
 +
            func3=func1/func2; ///формула расчёта частного
 +
            cout << '\n' << "Results of dividing are saved in file called 'Results_of_dividing.txt'" << endl;
 +
            cout << '\n' << "Result of interpolation is saved in file called 'Interpolation.txt'" << endl;
 +
            cout << '\n' << "Result of approximation is saved in file called 'Interpolation.txt'" << endl;
 
         }
 
         }
        out.close(); ///завершение записи в файл
 
  
        char d; ///переменная для команды интерполировать результат
+
         cout << '\n' << "If you want program continue counting, input +, if not, input -" << endl;
         cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
+
        ///команда пользователя на продолжение работы цикла или же на его завершение
         cin >> d;
+
         cin >> s;
  
         if (d=='+') ///если команда для интерполяции дана
+
         if (s=='-') ///если дана команда на завершение работы цикла
 
         {
 
         {
             double Step2; ///переменная, хранящая значение нового шага
+
             cout << '\n' << "All results are saved in files." << endl; ///вывод на экран сообщения о записи в файл всех результатов
             cout << '\n' << "Input the step for interpolation" << endl;
+
             cout << '\n' << "The program is finished." << endl; ///вывод на экран сообщения о завершении работы программы
             cin >> Step2;
+
             return 0;
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
+
        }
 +
    }
 +
    while (s != '-'); ///работа цикла не завершается до тех пор, пока пользователь не даст соответствующую команду
  
            char w; /// переменная для команды аппроксимировать результат
+
}
            cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
+
 
            cin >> w;
+
</syntaxhighlight>
 +
</div>
  
            if (w=='+') ///если команда на аппроксимацию дана
 
            {
 
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
 
            }
 
        }
 
    }
 
  
    functions operator/ (functions func3) ///деление двух функций
 
    {
 
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
 
  
        ofstream out ("Results_of_dividing.txt"); ///запись в файл значений после деления значения первой функции на значения второй функции
 
        out << "dividing of the functions" << '\n' << endl;
 
  
      for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 
        {
 
            massiv2[i] = massiv1[i] / func3.massiv1[i]; ///формула вычисления
 
            out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
 
        }
 
        out.close(); ///завершение записи в файл
 
  
        char d; ///переменная для команды интерполировать результат
+
'''[[Васильева Анастасия]]'''
        cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
 
        cin >> d;
 
  
        if (d=='+') ///если команда для интерполяции дана
+
'''Инструкция к программе''':сначала в папке с программой создаются два файла input1 и input2, в которых на первой строчке число точек в функции, а потом в два столбика значения х и у (функции должны быть с одинаковым шагом). Пользователь поочередно выбирает действия: 1 - нужно будет написать имя файла, откуда считывать значения для первой функции (х и у), 2 - для второй функции, 3 - сложение функций, пишем название файла, куда будут записываться значения, 4 - разность, 5 - умножение, 6 - интерполяция функции с шагом 0,5 , получившейся в результате сложения двух начальных,(можно сделать интерполяцию функций, которые получились в результате разности или умножения, но нужно будет в коде в case 6: newf3.Inter(0.5).output() поменять индекс функции и новый шаг), 7 - аппроксимация функции, получившейся в результате сложения двух начальных,(можно сделать аппроксимацию функций, которые получились в результате разности или умножения, но нужно будет в коде в case 7: newf3.Approxy().output() поменять индекс функции), 8 - выход.
        {
 
            double Step2; ///переменная, хранящая значение нового шага
 
            cout << '\n' << "Input the step for interpolation" << endl;
 
            cin >> Step2;
 
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
 
  
            char w; /// переменная для команды аппроксимировать результат
+
'''Краткое описание алгоритма''':  функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно считывая координаты точек из файла. Далее с любыми функциями можно производить следующие действия: сложение, вычитание, умножение, интерполяция и аппроксимация. При этом результат каждого из этих действий - новая функция. Результаты выводятся в файл.
            cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
+
Скачать программу можно по ссылке [http://tm.spbstu.ru/Файл:1.zip].
            cin >> w;
 
  
            if (w=='+') ///если команда на аппроксимацию дана
 
            {
 
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
 
            }
 
        }
 
    }
 
};
 
  
int main()
 
{
 
    double Begin1, End1, Step1; ///переменные, вводимые пользователем
 
    cout << "Input the beginning of the interval" << endl; ///ввод начала отрезка
 
    cin >> Begin1;
 
    cout << '\n' << "Input the end of the interval" << endl; ///ввод конца отрезка
 
    cin >> End1;
 
    cout << '\n' << "Input the step of functions" << endl; ///ввод начального шага функций
 
    cin >> Step1;
 
  
    functions func1(Begin1, End1, Step1); ///вызов первой функции
+
'''[[Капитанюк Светлана]]'''
    func1.function1(Begin1, End1, Step1);
 
    cout <<'\n' << "Meanings of the first function are saved in file called 'Function1.txt'" << endl;
 
  
    functions func2(Begin1, End1, Step1); ///вызов второй функции
+
'''Описание программы:''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции.
    func2.function2(Begin1, End1, Step1);
 
    cout <<'\n' << "Meanings of the second function are saved in file called 'Function2.txt'" << endl;
 
  
    functions func3(Begin1,End1,Step1); ///вызов третьей функции
+
Скачать можно [http://tm.spbstu.ru/File:Function_02.zip тут].
 
+
 
    char s; ///переменная, используется в цикле
+
'''[[Демченко Артём]]'''
    do
 
    {
 
        char c; ///переменная, хранящая выбор арифметической операции пользователем
 
        cout << '\n' << "Input your choice: + for sum,- for difference,* for multiplying,/ for dividing" << endl;
 
        cin >> c;
 
 
 
        if (c=='+') ///цикл, запускающий функцию расчёта суммы двух функций, их интерполяцию и аппроксимацию
 
        {
 
            func3=func1+func2; ///формула расчёта суммы
 
            cout << '\n' << "Results of sum are saved in file called 'Results_of_sum.txt'" << endl;
 
            cout << '\n' << "Result of interpolation is saved in file called 'Interpolation.txt'" << endl;
 
            cout << '\n' << "Result of approximation is saved in file called 'Interpolation.txt'" << endl;
 
        }
 
        if (c=='-') ///цикл, запускающий функцию расчёта разности двух функций, их интерполяцию и аппроксимацию
 
        {
 
            func3=func1-func2; ///формула расчёта разности
 
            cout << '\n' << "Results of difference are saved in file called 'Results_of_difference.txt'" << endl;
 
            cout << '\n' << "Result of interpolation is saved in file called 'Interpolation.txt'" << endl;
 
            cout << '\n' << "Result of approximation is saved in file called 'Interpolation.txt'" << endl;
 
        }
 
        if (c=='*') ///цикл, запускающий функцию расчёта произведения двух функций, их интерполяцию и аппроксимацию
 
        {
 
            func3=func1*func2; ///формула расчёта произведения
 
            cout << '\n' << "Results of multiplying are saved in file called 'Results_of_multiplying.txt'" << endl;
 
            cout << '\n' << "Result of interpolation is saved in file called 'Interpolation.txt'" << endl;
 
            cout << '\n' << "Result of approximation is saved in file called 'Interpolation.txt'" << endl;
 
        }
 
        if (c=='/') ///цикл, запускающий функцию расчёта частного двух функций, их интерполяцию и аппроксимацию
 
        {
 
            func3=func1/func2; ///формула расчёта частного
 
            cout << '\n' << "Results of dividing are saved in file called 'Results_of_dividing.txt'" << endl;
 
            cout << '\n' << "Result of interpolation is saved in file called 'Interpolation.txt'" << endl;
 
            cout << '\n' << "Result of approximation is saved in file called 'Interpolation.txt'" << endl;
 
        }
 
 
 
        cout << '\n' << "If you want program continue counting, input +, if not, input -" << endl;
 
        ///команда пользователя на продолжение работы цикла или же на его завершение
 
        cin >> s;
 
 
 
        if (s=='-') ///если дана команда на завершение работы цикла
 
        {
 
            cout << '\n' << "All results are saved in files." << endl; ///вывод на экран сообщения о записи в файл всех результатов
 
            cout << '\n' << "The program is finished." << endl; ///вывод на экран сообщения о завершении работы программы
 
            return 0;
 
        }
 
    }
 
    while (s != '-'); ///работа цикла не завершается до тех пор, пока пользователь не даст соответствующую команду
 
 
 
}
 
 
 
</syntaxhighlight>
 
</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%" >
 
Метод наименьших квадратов
 
задача состоит в том, чтобы минимизировать выражение:
 
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.
 
 
 
 
 
<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];//создание динамического массива для У
 
        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;
 
            }
 
        }
 
 
 
    }
 
 
 
    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)//цикл суммирования функций и вывода значений суммы, функций и иксов
 
        {
 
 
 
            cerr <<"YFirst: "<< F[i] << "  ";
 
            cerr << "YSecond: "<< Q.F[i] << "  ";
 
            R[i] = F[i] + Q.F[i];
 
            cerr << "Ysum: "<< R[i] << "  ";
 
            cerr << "X:" << m << '\n';
 
 
 
            m=m+c;
 
        }
 
  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/*хранит сумму интерполированных игреков*/;
 
    int q,k,l,o;
 
    p=(b-a)/pnt+1;
 
    q=int(p);
 
    R=new double [q];
 
    X=new double [q];
 
 
 
    l=0;
 
    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++)//цикл подготавливает суммы для МНК
+
'''Описание программы''': Программа в зависимости от небольших изменений тем или иным способом получает функцию или точки этой функции и проводит с ней выбранные операции.
        {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";//выводим их
 
for(o=0;o<k;o++)
 
        {c=aApr*X[o]+bApr;//считаем значение Y при данных коэфициентах
 
        cout<<"YAprox: "<<c<<" "<<"X:"<<X[o]<<"\n" ;
 
        }
 
  
 +
Скачать можно  [[:File:Funcs.zip]]
  
    return 0;}
+
<div class="mw-collapsible mw-collapsed" style="width:100%"
};
+
'''[[Лобанов Илья]]'''
  
int main(){
+
'''Описание программы''':
    double x, xn, s1,pnt;
+
Программа позволяет складывать , вычитать , делить,умножать 2 функции,заданные на одном интервале.При считывании с файла сначала указывается отрезок, потом величина шага, а потом дискретные значения.
    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;}
+
Скачать можно [[http://tm.spbstu.ru/File:func.rar тут]]
</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:

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