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

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

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

Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 1: Строка 1:
'''[[Абрамов Игорь]]'''
 
 
'''Алгоритм''': функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно двумя способами: с помощью математических функций из стандартных библиотек, указывая начало и конец отрезка, а также шаг, с которым определена функция, и считывая координаты точек из файла, предварительно считав их количество. Далее с любыми функциями можно производить следующие действия и их комбинации: сложение, вычитание, кубическая интерполяция и линейная аппроксимация. При этом результат каждого из этих действий - новая функция, с которой можно продолжать работу. Функции можно выводить на экран с помощью средств графической библиотеки OpenGL, а также печатать её значения в файл.
 
 
'''Инструкция''': пользователь вводит необходимые действия с функциями в функции Display. На данный момент при запуске программы можно увидеть пример её работы: первая функция считывается из файла, интерполируется и выводится на экран. Затем вторая функция вводится из библиотеки math.h интерполируется и выводится на экран. Затем функции суммируются, интерполируются и выводятся на экран. [[:File:Func_Abramov.rar]]
 
 
Ссылка на скачивание: [http://tm.spbstu.ru/File:Func_Abramov.rar]
 
  
 
'''[[Андреева Полина]]'''
 
'''[[Андреева Полина]]'''
Строка 12: Строка 5:
 
'''Краткое описание алгоритма :''' в классе создается две функции(с помощью массивов). Так же в классе есть такие методы: перегрузка арифм операций, интерполяция, аппроксимация, вывод массивов на экран и их сохранение в файл. Сначала создается два массива для функций. Затем  с помощью перегрузки эти два массива складываются/умножаются/делятся/вычитаются и записываются опять в этот массив. В методе перегрузки сразу вызывается интерполяция и аппроксимация.  
 
'''Краткое описание алгоритма :''' в классе создается две функции(с помощью массивов). Так же в классе есть такие методы: перегрузка арифм операций, интерполяция, аппроксимация, вывод массивов на экран и их сохранение в файл. Сначала создается два массива для функций. Затем  с помощью перегрузки эти два массива складываются/умножаются/делятся/вычитаются и записываются опять в этот массив. В методе перегрузки сразу вызывается интерполяция и аппроксимация.  
 
[http://tm.spbstu.ru/Файл:Function.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">
Строка 291: Строка 283:
 
</div>
 
</div>
  
'''[[Анастасия Бальцер]]'''
 
  
'''Описание программы''': Программа считывает из файла значения функций и количество точек, затем с ними можно провести следующие действия: сложить, умножить, линейно интерполировать и линейно аппроксимировать. Все результаты выводятся в отдельные файлы.
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
 
'''Пояснения к работе''': В два текстовые файла занести количество точек и значения абсцисс и ординат функций, который написать в первом и втором пунктах меню, затем выбрать необходимую операцию и ввести имя файла, в который сохранятся полученные значения.
 
  
Скачать можно  [http://tm.spbstu.ru/Файл:inter.zip тут].
 
  
  
Строка 617: Строка 605:
 
</div>
 
</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 - выход.
 
  
'''Краткое описание алгоритма''':  функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно считывая координаты точек из файла. Далее с любыми функциями можно производить следующие действия: сложение, вычитание, умножение, интерполяция и аппроксимация. При этом результат каждого из этих действий - новая функция. Результаты выводятся в файл.
+
'''[[Лебедев Станислав]]'''
Скачать программу можно по ссылке [http://tm.spbstu.ru/Файл:1.zip].
 
  
'''[[Гильманов Илья]]'''
+
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
  
'''Описание программы''': программа, с помощью которой можно складывать, умножать, вычитать, делить 2-е функции, аппроксимировать,интерполировать.
+
'''Пояснения к алгоритму''':
 +
#  Прочитанные из файла функции нужно отсортировать.
 +
#  Найти совместную область определения, то есть, найти множество пересечения областей определения функций, над которыми совершается операция.
 +
#  Создать третью функцию, со следующими свойствами : область определения состоит только из точек, принадлежащих совместной области определения, каждая точка области значений является результатом нужной операции над точкой области значений одной из функций и, либо интерполированной точкой по другой функции, либо, если есть возможность, точным значением из ее области значений.
  
'''Суть программы:''' Программа позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
+
Скачать можно  [http://tm.spbstu.ru/Файл:Функции.rar тут].
  
'''Инструкция к программе''':
 
1. Пользователь вводит параметры первой функции
 
2. Пользователь вводит параметры второй функции
 
3. Происходит интерполяция первой функции по второй
 
4. Пользователь выбирает арифметическую операцию
 
5. При желании пользователь может выполнить аппроксимацию полученного результата
 
  
Скачать можно [[http://mech.spbstu.ru/File:Gilmanov_Func.rar здесь]]
+
<div class="mw-collapsible mw-collapsed" style="width:100%" ><div class="mw-collapsible-content">
 
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
'''[[Демченко Артём]]'''
+
#include <iostream>
 
+
#include <math.h>
'''Описание программы''': В программе создается две функции, которые мы можем просуммировать, интерполировать каждую из них и аппроксимировать каждую из них. После каждой операции ( кроме аппроксимации ) значения записываются в файл.
+
#include <cstring>
 
+
#include <cmath>
'''Инструкции''': Запустите программу и выбором одного из трех параметров в меню выберете желаемую операцию. Далее следуйте указаниям из меню.
+
#include <malloc.h>
 
+
#include <fstream>
 
 
Скачать можно  [http://tm.spbstu.ru/File:MyFunc.zip тут].
 
 
 
'''[[Иванова Яна]]'''
 
 
 
'''Краткое описание алгоритма''': Программа ищет совместную область определения для двух заданных пользователем функций. Для каждой из них вводится шаг и первое и последнее значения. После поиска совместной области программа интерполирует две функции и создает третью функцию, в которую сохраняются результаты работы программы, то есть сложение, вычитание, деление и умножение двух изначальных функций.
 
 
 
'''Инструкция к программе''': Введите поочередно первый и последний элементы функций, а также их шаги. После этого введите число, соответствующее желаемому действию (соответствие указано в меню программы).
 
 
 
Посмотреть программу можно [http://tm.spbstu.ru/Файл:main.zip здесь]
 
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
 
 
#include <iostream>
 
#include <fstream>
 
#include <cstring>
 
#include <stdlib.h>
 
  
 
using namespace std;
 
using namespace std;
  
ofstream outfile;
+
double base(double x)                                        //базовая функция ( если задавать через шаг и начальный х
 +
{
 +
    return x;
 +
}
  
struct approx                                              //структура, необходимая для функции линейной интерполяции
+
struct ap                                                  //две одинаковые структуры это нехорошо,коненчо,но зато наглядно...
 
{
 
{
     double koefficientA, koefficientB;
+
     double k,b;
 
};
 
};
  
struct dot                                                  //структура, содержащая в себе значения координат каждой точки
+
struct fun                                                  //один столбик в таблице функции
{                                                           //по обеим осям
+
{
     double x, y;
+
     double x,y;
 
};
 
};
  
struct polyana                                              //структура, содержащая номера первого и последнего элемента каждой
+
struct sf                                                  //структура нужная, для возражеия значений из функции "prepare" класса F
{                                                           //функции и количество элементов каждой из них
+
{
     int a1, a2, b1, b2, k1, k2;
+
     int i1,i2,e1,e2;
 +
    double glength, gfirstx, glastx;
 
};
 
};
  
struct trees                                                //структура, содержащая номер элемента и логическое значение,
+
double intr(double x1,double x2,double x,double y1,double y2) // линенейная интерполяция
{                                                          // отвечающее за нужность или не нужность интерполяции
 
    bool pol;                                              //при равенстве или неравенстве энных элементов двух функций
 
    int n;
 
};
 
                                                            //непосредственно функция линейной интерполяции
 
double pentagon (double x1, double x, double x2, double y1, double y2)
 
 
{
 
{
     return (((x - x1)/(x2- x1))*(y2 - y1) + y1);
+
     return ( ((x-x1)/(x2-x1)) * (y2-y1) + y1 );
 
}
 
}
  
class stars                                                //класс, позволяющий сохранять дискретные значения функции на
+
ap aproks(fun b [],int n)                                      //линейная аппроксимация
{                                                          //определенном интервале с определенным шагом
+
{
     private:
+
    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;
 +
        x  += b[i].x;
 +
        y  += b[i].y;
 +
        sqx += b[i].x*b[i].x;
 +
        xsq += b[i].x;
 +
    }
 +
     xsq *= xsq;
  
        double a;                   //первое значение функции
+
    r.k = (n*xy - x*y)/(n*sqx - xsq);                       //использование формул
        double b;                  //последнее значение функции
+
    r.b = (y - r.k*x)/n;
        double step;               //шаг
+
    return r;
        int length;                 //длина
+
}
        int k;                      //счетчик количества элементов
 
  
     public:
+
class F
 
+
{
         dot *massiv;
+
private:
         stars (int _k)                                     //конструктор для создания объекта класса - структуры
+
     int length;
         {                                                   //с двумя полями по количеству элементов
+
    double firstx, step, lastx;
             massiv = new dot [_k];
+
    fun *a;
             k = _k;
+
public:
 +
    F(){}
 +
    F(int l,double f,double s)                              //конструктор, создающий фунцию по длине,первоиу элементу,шагу по х, y вычисляется по базовой функции
 +
    {
 +
         if (l >= 0)
 +
          a = new fun [l];
 +
        firstx = f;
 +
        length = l;
 +
        step = s;
 +
        lastx = firstx+(length - 1)*step;
 +
 
 +
 
 +
         for (int i = 0;i < length; i ++)
 +
         {
 +
             a[i].y = base(firstx + i*step);
 +
             a[i].x = firstx + i*step;
 
         }
 
         }
        stars () {};                                        //конструктор
 
        stars (double _a, double _b, double _step)          //конструктор для создания объекта класса через начальный
 
                                                            //и коненый элементы с определенным шагом
 
        {
 
            a = _a;
 
            b = _b;
 
            step = _step;
 
  
            length = _b - _a + 1;
+
    }
            k = 0;
 
  
            for (int i = _a ; i <= _b ; i += step)         //подсчет количества элементов функции
+
    F (fun b[],int l)                                   //конструктор для создания фунции с уже известными областями определния и значений
            {
+
    {
                k++;
+
        length = l;
            }
+
        a = new fun [l];
 
+
        for (int i = 0; i < l;i++)
            massiv = new dot [k];                           //задание функции
+
            a[i] = b[i];
            for (int i = 0 ; i < k ; i++)
 
              {
 
                    massiv[i].x = _a + _step * i;
 
                    massiv[i].y = i * 5;
 
              }
 
        }
 
  
         void outinfile ()                                  //вывод в файл значений функции
+
         for (int i = 0; i < l;i++)
        {
+
             for (int j = 0; j < (l - 1); j++)
            outfile.open ("meow", ios :: app);
+
                if (a[j].x > a[j + 1].x)
 
 
            outfile << "x" << "          " << "y" << endl;
 
             for (int i = 0 ; i < k ; i++)
 
 
                 {
 
                 {
                     outfile << massiv[i].x << "        " << massiv[i].y << endl;
+
                     fun tmp = a[j];
 +
                    a[j] = a[j + 1];
 +
                    a[j + 1] = a[j];
 
                 }
 
                 }
            outfile << endl;
 
            outfile.close();
 
        }
 
  
         void out ()                                         //вывод на экран значений функции
+
         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++)
 
         {
 
         {
             cout << "x" << "          " << "y" << endl;
+
             a[i].y = k*z[i].x + b;
            for (int i = 0 ; i < k ; i++)
+
            a[i].x = z[i].x;
                {
 
                    cout << massiv[i].x << "        " << massiv[i].y << endl;
 
                }
 
            cout << endl;
 
 
         }
 
         }
 +
        length = l;
 +
    }
  
        polyana prepare (stars &h)                         //подготовка совместной области определения для двух функций -
+
    double getelx(int i)                               //возращает значение из поля "х" iого элемента
        {                                                   //той части значений множества Х, на которой будут
+
    {
            trees del;                                      //производиться вычисления
+
        return a[i].x;
            polyana tmp;
+
    }
            if (massiv[0].x > h.massiv[0].x)                //поиск начала совместной области определения
+
 
            {
+
 
                del = h.love(massiv[0].x);
+
    double getely(int i)                               //возращает значение из поля "х" iого элемента
                tmp.a2 = del.n + 1;
+
    {
                tmp.a1 = 0;
+
        return a[i].y;
            }
+
    }
            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;
 
                    };
 
  
            if (massiv[k-1].x > h.massiv[k-1].x)           //поиск конца совместной области определения
+
    int getlength()                                 //возращает размер области определения функции(в точках)
            {
+
    {
                del = h.love(massiv[k-1].x);
+
        return length;
                tmp.b2 = k-1;
+
    }
                tmp.b1 = del.n;
 
            }
 
            else
 
                if (massiv[k-1].x < h.massiv[k-1].x)
 
                {
 
                    del = h.love(massiv[k-1].x);
 
                    tmp.b2 = del.n;
 
                    tmp.b1 = k-1;
 
                }
 
                else
 
                    if (massiv[k-1].x == h.massiv[k-1].x)
 
                    {
 
                        tmp.b2 = k-1;
 
                        tmp.b1 = k-1;
 
                    };
 
  
            tmp.k1 = 0;
+
    void FOut()                                     //выводит функцию на экран
            for (int i = tmp.a1 ; i <= tmp.b1 ; i ++)       //подсчет количества элементов первой функции
+
    {
            {
+
      cout << "  x        y" << endl;
                tmp.k1++;
+
      for (int i = 0;i < length; i ++)
            }
+
          cout << "  " << a[i].x << "        " << a[i].y << endl;
            tmp.k2 = 0;
+
      cout << endl;
            for (int i = tmp.a2 ; i <= tmp.b2 ; i ++)       //подсчет количества элементов второй функции
+
    }
            {
 
                tmp.k2++;
 
            }
 
            return tmp;                                     //возвращает первые и последние значения обеих функций и
 
        }                                                   //их количества элементов
 
  
    //ПЕРЕГРУЗКА ОПЕРАТОРОВ
 
  
     stars operator+ (stars & v)                             //сложение
+
     int pfind(double x)const                        //возращает либо номер элемента,идущщий перед элементом, большим,чем х; в случае нахождения равного, возращает число, противоположное номеру следующего элемента(иначе может вернуться нуль,а нуль знака не имееет)
 
     {
 
     {
        polyana tmp = prepare(v);
+
         for (int i = 0; i < length-1; i++ )
        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;
+
             if (((a[i].x < x) && (a[i + 1].x > x)))
            trees tiger = v.love(massiv[i+tmp.a1].x);
+
                 return (i + 1);
            if (tiger.pol == true)                          //если значения по У в одной точке не совпадают, то интерполировать
 
            {
 
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,
 
                                          F3.massiv[i].x,
 
                                          v.massiv[tiger.n + 1].x,
 
                                          v.massiv[tiger.n].y,
 
                                          v.massiv[tiger.n + 1].y )
 
                                          + massiv[i+tmp.a1].y;
 
            }
 
            else                                            //иначе, просто сложить значения
 
            {
 
                F3.massiv[i].y = v.massiv[tiger.n].y + massiv[i+tmp.a1].y;
 
            }
 
 
 
        }
 
        {
 
          for (int i = tmp.k1  ; i < (general) ; i++)      //заполнение второй части окончательного результата
 
        {
 
            F3.massiv[i].x = v.massiv[i + tmp.a2 - tmp.k1].x;
 
            trees tiger = love(v.massiv[i + tmp.a2 - tmp.k1].x);
 
            if (tiger.pol == true)
 
            {
 
                 F3.massiv[i].y = pentagon  (v.massiv[tiger.n].x,
 
                                            F3.massiv[i].x,
 
                                            v.massiv[tiger.n + 1].x,
 
                                            v.massiv[tiger.n].y,
 
                                            v.massiv[tiger.n + 1].y )
 
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 
            }
 
 
             else
 
             else
                 F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
+
                 // чтобы иметь возможность проанализировать полученное значение функции,мы должны понимать, было найденно равное или промежуточное значение. "флагом" равных значений является знак минус,но так у нуля нет знака,то приходиться все сдвигать на 1
 +
                if (a[i].x == x)
 +
                  return -(i + 1);
 +
                else
 +
                    if (a[i + 1].x == x)
 +
                        return -(i + 2);
 
         }
 
         }
 +
//        cerr << "fail!!" << endl;
 +
        return -1;
 +
    }
  
         for (int i = 0; i < (general); i++)                  //сортировка
+
    sf prepare(F &x)const                                      //"подготовка" функций к бинарной операции (нахождение совместной области определения
 +
    {
 +
        sf r;
 +
         if (a[0].x > x.a[0].x)
 
         {
 
         {
             for (int j = 0; j < (general - 1); j ++)
+
             r.gfirstx = a[0].x;
            {
+
            r.i1 = 0;
                dot temp;
+
            r.i1 = 0;
                if (F3.massiv[j].x > F3.massiv[j + 1].x)
+
            double k = x.pfind(a[0].x);
                {
+
            if (k < 0)
                    temp = F3.massiv[j];
+
                r.i2 = -k - 1;
                    F3.massiv[j] = F3.massiv[j + 1];
+
            else
                    F3.massiv[j + 1] = temp;
+
                r.i2 = (k - 1) + 1;
                }
 
                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--;
 
                }
 
            }
 
 
         }
 
         }
 
+
         else
 
 
         stars normalny (general);                          //создание элемента класса по длине
 
        for (int i = 0; i < (general); i++)
 
 
         {
 
         {
             normalny.massiv[i].x = F3.massiv[i].x;
+
             r.gfirstx = x.a[0].x;
             normalny.massiv[i].y = F3.massiv[i].y;
+
            double k = pfind(x.a[0].x);
 +
             if (k < 0)
 +
                r.i1 = -k - 1;
 +
            else
 +
                r.i1 = (k - 1) + 1;
 +
            r.i2 = 0;
 
         }
 
         }
        a = normalny.massiv[0].x;
 
        b = normalny.massiv[general].x;
 
        return normalny;
 
    }
 
    };
 
  
         stars operator* (stars & v)                        //умножение
+
         if (a[length - 1].x < x.a[x.length - 1].x)
    {
 
        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;
+
             r.glastx = a[length - 1].x;
             trees tiger = v.love(massiv[i+tmp.a1].x);
+
            r.e1 = length - 1;
             if (tiger.pol == true)
+
             double k = x.pfind(r.glastx);
            {
+
             if (k < 0)
                 F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,      F3.massiv[i].x,
+
                 r.e2 = -k - 1;
                                          v.massiv[tiger.n + 1].x,  v.massiv[tiger.n].y,
 
                                          v.massiv[tiger.n + 1].y )* (massiv[i+tmp.a1].y);
 
            }
 
 
             else
 
             else
            {
+
                 r.e2 = (k - 1) - 1;
                 F3.massiv[i].y = v.massiv[tiger.n].y * massiv[i+tmp.a1].y;
 
            }
 
 
 
 
         }
 
         }
 +
        else
 
         {
 
         {
             for (int i = tmp.k1 ; i < (general) ; i++)
+
             r.glastx = x.a[x.length - 1].x;
        {
+
             double k = pfind(r.glastx);
            F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
+
             if (k < 0)
             trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
+
                 r.e1 = -k - 1;
             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
 
             else
                 F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
+
                 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));
  
         for (int i= 0; i < (general); i++)
+
        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;
 +
    }
 +
 
 +
    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)))
 
         {
 
         {
             for (int j = 0; j < (general - 1); j ++)
+
             cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
             {
+
             F fl(-1,0,0);
                dot temp;
+
            return fl;
                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--;
 
                }
 
            }
 
 
         }
 
         }
 
+
        sf r = prepare(x);
        for (int i = 0 ; i < general ; i++)
+
        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;            //поправка,введенная таким образом,чтобы номер,с которого начинается отсчет был первым в новой области определения
             cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
+
             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++)
 
 
        stars normalny(general);
 
         for (int i = 0; i < (general); i++)
 
 
         {
 
         {
             normalny.massiv[i].x = F3.massiv[i].x;
+
             int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
            normalny.massiv[i].y = F3.massiv[i].y;
+
            if (ii >= 0)
        }
+
            {
        a = normalny.massiv[0].x;
+
                tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
        b = normalny.massiv[general].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;
        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
 
             else
 
             {
 
             {
                 F3.massiv[i].y = v.massiv[tiger.n].y - massiv[i+tmp.a1].y;
+
                 kk++;
 +
                glength --;
 +
                tmp.length --;
 
             }
 
             }
 +
        }
  
         }
+
         for (int i = 0; i < glength; i++)
        {
+
             for (int j = 0; j < glength - 1; j++)
            for (int i = tmp.k1 ; i < (general) ; i++)
+
             if (tmp.a[j].x > tmp.a[j + 1].x)
        {
 
             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,
+
                 fun t = tmp.a[j];
                                            F3.massiv[i].x,
+
                tmp.a[j] = tmp.a[j + 1];
                                            v.massiv[tiger.n + 1].x,
+
                tmp.a[j + 1] = t;
                                            v.massiv[tiger.n].y,
 
                                            v.massiv[tiger.n + 1].y )
 
                                            + v.massiv[i+tmp.a1 - tmp.k1].y;
 
 
             }
 
             }
 +
 +
        return tmp;
 +
}
 +
 +
    F operator *(F & x) const                                        //умножение двух функций
 +
    {
 +
        int i1, e1, i2, e2, kk = 0;
 +
        double gfirstx, glastx, glength;
 +
 +
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
 +
        {
 +
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
 +
            F fl(-1,0,0);
 +
            return fl;
 +
        }
 +
 +
        sf r = prepare(x);
 +
        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 = x.a[-ii - 1].y * a[i + r.i1].y;
 
             else
 
             else
                 F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
+
                 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++)
         for (int i= 0; i < (general); i++)
 
 
         {
 
         {
             for (int j = 0; j < (general - 1); j ++)
+
             int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
 +
            if (ii >= 0)
 
             {
 
             {
                 dot temp;
+
                 tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
                if (F3.massiv[j].x > F3.massiv[j+1].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;
                 {
+
            }
                    temp = F3.massiv[j];
+
            else
                    F3.massiv[j] = F3.massiv[j+1];
+
            {
                    F3.massiv[j+1] = temp;
+
                kk++;
                }
+
                glength --;
                else
+
                 tmp.length --;
                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++)
+
        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;
 +
            }
  
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
+
        return tmp;
        }
+
    }
  
 +
    F operator ^(F & x) const                                  //возведение функции слева от оператора в степень функции справа от оператора
 +
    {
 +
        int i1, e1, i2, e2, kk = 0;
 +
        double gfirstx, glastx, glength;
  
         stars normalny(general);
+
         if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
        for (int i = 0; i < (general); i++)
 
 
         {
 
         {
             normalny.massiv[i].x = F3.massiv[i].x;
+
             cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
             normalny.massiv[i].y = F3.massiv[i].y;
+
             F fl(-1,0,0);
 +
            return fl;
 
         }
 
         }
        a = normalny.massiv[0].x;
 
        b = normalny.massiv[general].x;
 
        return normalny;
 
    }
 
    };
 
  
    stars operator/ (stars & v)                             //деление
+
        sf r = prepare(x);
    {
+
         F tmp(r.glength,r.gfirstx,r.glastx);
         polyana tmp = prepare(v);
+
 
         int general = tmp.k1 + tmp.k2;
+
         for (int i = 0; i <= (r.e1 - r.i1); i++)
        stars F3(tmp.k1 + tmp.k2);
+
        {
         for (int i = 0 ; i < tmp.k1 ; 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++)
 
         {
 
         {
             F3.massiv[i].x = massiv[i+tmp.a1].x;
+
             int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
            trees tiger = v.love(massiv[i+tmp.a1].x);
+
             if (ii >= 0)
             if (tiger.pol == true)
 
 
             {
 
             {
                 F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,      F3.massiv[i].x,
+
                 tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
                                          v.massiv[tiger.n + 1].x,   v.massiv[tiger.n].y,
+
                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);
                                          v.massiv[tiger.n + 1].y )/ (massiv[i+tmp.a1].y);
 
 
             }
 
             }
 
             else
 
             else
 
             {
 
             {
                 F3.massiv[i].y = (v.massiv[tiger.n].y) / (massiv[i+tmp.a1].y);
+
                 kk++;
 +
                glength --;
 +
                tmp.length --;
 
             }
 
             }
 +
        }
  
         }
+
         for (int i = 0; i < glength; i++)
        {
+
             for (int j = 0; j < glength - 1; j++)
            for (int i = tmp.k1 ; i < (general) ; i++)
+
             if (tmp.a[j].x > tmp.a[j + 1].x)
        {
 
             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,
+
                 fun t = tmp.a[j];
                                            F3.massiv[i].x,
+
                tmp.a[j] = tmp.a[j + 1];
                                            v.massiv[tiger.n + 1].x,
+
                tmp.a[j + 1] = t;
                                            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++)
+
         return tmp;
        {
+
    }
            for (int j = 0; j < (general - 1); j ++)
+
};
            {
+
 
                dot temp;
+
int main()
                if (F3.massiv[j].x > F3.massiv[j+1].x)
+
{
                {
+
  /*
                    temp = F3.massiv[j];
+
    F f1(5,-2,1.5);
                    F3.massiv[j] = F3.massiv[j+1];
+
    F f2(30,-10,0.5);
                    F3.massiv[j+1] = temp;
+
    F f3, f4;
                }
+
    f1.FOut();
                else
+
    f2.FOut();
                if (F3.massiv[j].x == F3.massiv[j+1].x)
+
    f3 = f1 + f2;
                {
+
    f3.FOut();
                    int l = j;
+
    f4 = f1 * f2;
                    while (l < general)
+
    f4.FOut();
                    {
+
    cout << " ________" << endl;
                        F3.massiv[j].x = F3.massiv[j+1].x;
+
*/
                        l++;
+
    char vc, s[255], ce;
                    }
+
    ifstream infile;
                    general--;
+
    int n;
                }
+
    fun *a;
            }
+
    F f5,f6,f7,f8,f9;
        }
 
  
        for (int i = 0 ; i < general ; i++)
+
    while(true)
 +
    {
 +
    start :
 +
        system("cls");
 +
        cout << "1 - Vvesti 1uu func"            << endl;
 +
        cout << "2 - Vvesti 2uu func"            << endl;
 +
        cout << "3 - Sloshit'"                  << endl;
 +
        cout << "4 - Umnozhit'"                  << endl;
 +
        cout << "5 - Vozvesti v stepen'"        << endl;
 +
        cout << "6 - Aproximirovat'"            << endl;
 +
        cout << "7 - Zapics' v file func"        << endl;
 +
        cout << "8 - Zapics' v file aprok fun"  << endl;
 +
        cout << "0 - Vihod"                      << endl;
 +
        cin  >> vc;
 +
        switch (vc)
 
         {
 
         {
 
+
             case '0':
             cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
+
                return 0 ;
        }
+
             case '1':
 
 
 
 
        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;
+
                system("cls");
                     privet.pol = false;
+
                strcpy(s,"");
                    return privet;
+
                delete []a;
                 }
+
                a = NULL;
                 else
+
                cout << "Vvedite imya fila" << endl;
                 if (massiv[i+1].x == a)
+
                cin >> s;
 +
                strcat(s, ".txt");
 +
                infile.open(s);
 +
                infile >> n;
 +
                a = new fun [n];
 +
                for(int i = 0; i < n; i ++)
 +
                     infile >> a[i].x >> a[i].y;
 +
                f5.ad(a,n);
 +
                f5.FOut();
 +
                infile.close();
 +
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 +
                 cin >> ce;
 +
                 while (true)
 +
                 if (ce == 'b')
 +
                    goto start;
 +
                }
 +
            case '2':
 
                 {
 
                 {
                    privet.n = i+1;
+
                system("cls");
                    privet.pol = false;
+
                strcpy(s,"");
                     return privet;
+
                delete []a;
 +
                a = NULL;
 +
                cout << "Vvedite imya fila" << endl;
 +
                cin >> s;
 +
                strcat(s, ".txt");
 +
                infile.open(s);
 +
                infile >> n;
 +
                a = new fun[n];
 +
                for(int i = 0; i < n; i ++)
 +
                    infile >> a[i].x >> a[i].y;
 +
                f6.ad(a,n);
 +
                f6.FOut();
 +
                infile.close();
 +
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 +
                cin >> ce;
 +
                while (true)
 +
                if (ce == 'b')
 +
                     goto start;
 
                 }
 
                 }
    }
+
            case '3':
 
+
                system("cls");
 
+
                f5.FOut();
    approx approximate ()                                   //функция аппроксимации
+
                f6.FOut();
    {
+
                f7 = f5 + f6;
        approx hey;
+
                f7.FOut();
        stars mattafix (double a, double b, double step, int k, int length);
+
                cout << "Nazhmite \"b\" chotibi viti" << endl;
        double sigmaX = 0;
+
                cin >> ce;
        double sigmaY = 0;
+
                while (true)
        double sigmaXY = 0;
+
                if (ce == 'b')
        double sigmaXsqrt = 0;
+
                    goto start;
        for (int i = 0; i < length; i++)
+
            case '4':
        {
+
                system("cls");
          sigmaX += a + step * i;
+
                f5.FOut();
          sigmaY += b + i * 5;
+
                f6.FOut();
          sigmaXY += (a + step * i)*(b + i * 5);
+
                f7 = f5 * f6;
          sigmaXsqrt += (a + step * i)*(a + step * i);
+
                f7.FOut();
        }
+
                cout << "Nazhmite \"b\" chotibi viti" << endl;
        hey.koefficientA = ((k * (sigmaXY) - (sigmaX*sigmaY))/(k*sigmaXsqrt - (sigmaX * sigmaX)));
+
                cin >> ce;
        hey.koefficientB = ((sigmaY - hey.koefficientA*sigmaX)/k);
+
                while (true)
        return hey;
+
                if (ce == 'b')
 
+
                    goto start;
 
+
            case '5':
     }
+
                system("cls");
};
+
                f5.FOut();
 +
                f6.FOut();
 +
                f7 = f5 ^ f6;
 +
                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;
 +
 
 +
                cout << "done" << endl;
 +
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 +
                cin >> ce;
 +
                while (true)
 +
                if (ce == 'b')
 +
                    goto start;
 +
            }
 +
            case '8':
 +
                system("cls");
 +
                strcpy(s,"");
 +
                cout << "Vvedite imya fila" << endl;
 +
                cin >> s;
 +
                strcat(s, ".txt");
 +
                ofstream outfile(s);
 +
                outfile << "x          y" << endl;
 +
                for (int i = 0; i < f8.getlength(); i ++)
 +
                    outfile << f8.getelx(i) << "          " << f8.getely(i) << endl;
 +
                cout << "done" << endl;
 +
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 +
                cin >> ce;
 +
                while (true)
 +
                if (ce == 'b')
 +
                    goto start;
 +
        }
 +
     }
 +
    return 0;
 +
}
 +
</syntaxhighlight>
 +
</div>
  
int main()
 
{
 
    int tyu;
 
    stars function3;
 
    int firstnumber1;
 
    int firstnumber2;
 
    int lastnumber1;
 
    int lastnumber2;
 
    int step1;
 
    int step2;
 
    while (true)
 
    {
 
  
        cout << "Input 0 - vvedite parametry pervoy funkcii"<< endl;
+
'''[[Иванова Яна]]'''
        cout << "Input 1 - vvedite parametry vtoroy funkcii"<< endl;
 
        cout << "Input 2 - slozhenie"<< endl;
 
        cout << "Input 3 - umnozhenie"<< endl;
 
        cout << "Input 4 - delenie"<< endl;
 
        cout << "Input 5 - vychitanie"<< endl;
 
        cout << "Input 6 - aproximate"<< endl;
 
        cin >> tyu ;
 
  
        switch (tyu)
+
'''Краткое описание алгоритма''': Программа ищет совместную область определения для двух заданных пользователем функций. Для каждой из них вводится шаг и первое и последнее значения. После поиска совместной области программа интерполирует две функции и создает третью функцию, в которую сохраняются результаты работы программы, то есть сложение, вычитание, деление и умножение двух изначальных функций.
        {
 
            case 0:
 
            {  cout << "Vvedite pervy x" << endl;
 
                cin >> firstnumber1;
 
                cout << "Vvedite posledniy x" << endl;
 
                cin >> lastnumber1;
 
                cout << "Vvedite shag" << endl;
 
                cin >> step1;
 
                break;
 
            }
 
            case 1:
 
            {
 
                cout << "Vvedite pervy x" << endl;
 
                cin >> firstnumber2;
 
                cout << "Vvedite posledniy x" << endl;
 
                cin >> lastnumber2;
 
                cout << "Vvedite shag" << endl;
 
                cin >> step2;
 
                break;
 
            }
 
            case 2:
 
            {
 
                stars function1 (firstnumber1, lastnumber1, step1);
 
                function1.out();
 
                function1.outinfile ();
 
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
'''Инструкция к программе''': Введите поочередно первый и последний элементы функций, а также их шаги. После этого введите число, соответствующее желаемому действию (соответствие указано в меню программы).
                function2.out();
 
                function2.outinfile ();
 
  
                function3 = function1 + function2;
+
Посмотреть программу можно [http://tm.spbstu.ru/Файл:main.zip здесь]
                function3.out();
 
                function3.outinfile ();
 
                break;
 
            }
 
            case 3:
 
            {
 
                stars function1 (firstnumber1, lastnumber1, step1);
 
                function1.out();
 
                function1.outinfile ();
 
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
                function2.out();
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
                function2.outinfile ();
 
  
                function3 = function1 * function2;
+
#include <iostream>
                function3.out();
+
#include <fstream>
                function3.outinfile ();
+
#include <cstring>
                break;
+
#include <stdlib.h>
            }
 
            case 4:
 
            {
 
                stars function1 (firstnumber1, lastnumber1, step1);
 
                function1.out();
 
                function1.outinfile ();
 
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
using namespace std;
                function2.out();
 
                function2.outinfile ();
 
  
                function3 = function1 / function2;
+
ofstream outfile;
                function3.out();
 
                function3.outinfile ();
 
                break;
 
            }
 
            case 5:
 
            {
 
  
                stars function1 (firstnumber1, lastnumber1, step1);
+
struct approx                                              //структура, необходимая для функции линейной интерполяции
                function1.out();
+
{
                function1.outinfile ();
+
    double koefficientA, koefficientB;
 +
};
  
                stars function2 (firstnumber2, lastnumber2, step2);
+
struct dot                                                  //структура, содержащая в себе значения координат каждой точки
                function2.out();
+
{                                                          //по обеим осям
                function2.outinfile ();
+
    double x, y;
 +
};
  
                function3 = function1 - function2;
+
struct polyana                                              //структура, содержащая номера первого и последнего элемента каждой
                function3.out();
+
{                                                           //функции и количество элементов каждой из них
                function3.outinfile ();
+
    int a1, a2, b1, b2, k1, k2;
                break;
+
};
            }
 
            case 6:
 
                {
 
                    approx you;
 
                    function3.approximate();
 
                    outfile.open ("meow", ios :: app);
 
                    outfile << "Y = "<< you.koefficientA <<"* x + "<<you.koefficientB << endl;
 
                    outfile << endl;
 
                    outfile.close();
 
  
 +
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);
 +
}
  
                }
+
class stars                                                //класс, позволяющий сохранять дискретные значения функции на
            }
+
{                                                          //определенном интервале с определенным шагом
        }
+
     private:
     };
 
  
 +
        double a;                  //первое значение функции
 +
        double b;                  //последнее значение функции
 +
        double step;                //шаг
 +
        int length;                //длина
 +
        int k;                      //счетчик количества элементов
  
</syntaxhighlight>
+
    public:
</div>
 
  
'''[[Капитанюк Светлана]]'''
+
        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;
  
'''Описание программы:''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции. функции хранятся в программе как массив точек, заданных с определенным шагом по X на заданном отрезке. Функции заданы автоматически, поэтому нет необходимости вводить каждый промежуток, нужно ввести только начало, конец и шаг. Далее пользователю на выбор будет представлено несколько операций с функциями, такие как: сложение, вычитание, умножение и деление функции одну на другую. Если функции имеют различный шаг, топеред этимони интерполируются. Так же в программе предусмотрена аппроксимация.
+
            length = _b - _a + 1;
 +
            k = 0;
  
 +
            for (int i = _a ; i <= _b ; i += step)          //подсчет количества элементов функции
 +
            {
 +
                k++;
 +
            }
  
Скачать можно  [http://tm.spbstu.ru/File:Function_02.zip тут].
+
            massiv = new dot [k];                          //задание функции
 +
            for (int i = 0 ; i < k ; i++)
 +
              {
 +
                    massiv[i].x = _a + _step * i;
 +
                    massiv[i].y = i * 5;
 +
              }
 +
        }
  
'''[[Киселёв Лев]]'''
+
        void outinfile ()                                  //вывод в файл значений функции
'''Описание программы''':программа позволяет интерполировать и аппроксимировать значения функции, а также складывать две функции, используя перегрузку.
+
        {
 +
            outfile.open ("meow", ios :: app);
  
Скачать можно [[http://mech.spbstu.ru/File:Interpol.rar здесь]]
+
            outfile << "x" << "          " << "y" << endl;
 +
            for (int i = 0 ; i < k ; i++)
 +
                {
 +
                    outfile << massiv[i].x << "        " << massiv[i].y << endl;
 +
                }
 +
            outfile << endl;
 +
            outfile.close();
 +
        }
  
'''[[Козловская Анна]]'''
+
        void out ()                                        //вывод на экран значений функции
 +
        {
 +
            cout << "x" << "          " << "y" << endl;
 +
            for (int i = 0 ; i < k ; i++)
 +
                {
 +
                    cout << massiv[i].x << "        " << massiv[i].y << endl;
 +
                }
 +
            cout << endl;
 +
        }
  
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
+
        polyana prepare (stars &h)                          //подготовка совместной области определения для двух функций -
 +
        {                                                  //той части значений множества Х, на которой будут
 +
            trees del;                                      //производиться вычисления
 +
            polyana tmp;
 +
            if (massiv[0].x > h.massiv[0].x)                //поиск начала совместной области определения
 +
            {
 +
                del = h.love(massiv[0].x);
 +
                tmp.a2 = del.n + 1;
 +
                tmp.a1 = 0;
 +
            }
 +
            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;
 +
                    };
  
'''Пояснения к алгоритму''': Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
+
            if (massiv[k-1].x > h.massiv[k-1].x)            //поиск конца совместной области определения
 
+
            {
 
+
                del = h.love(massiv[k-1].x);
Скачать можно  [http://tm.spbstu.ru/File:project1.rar тут].
+
                tmp.b2 = k-1;
 
+
                tmp.b1 = del.n;
'''[[Лебедев Станислав]]'''
+
            }
 +
            else
 +
                if (massiv[k-1].x < h.massiv[k-1].x)
 +
                {
 +
                    del = h.love(massiv[k-1].x);
 +
                    tmp.b2 = del.n;
 +
                    tmp.b1 = k-1;
 +
                }
 +
                else
 +
                    if (massiv[k-1].x == h.massiv[k-1].x)
 +
                    {
 +
                        tmp.b2 = k-1;
 +
                        tmp.b1 = k-1;
 +
                    };
  
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
+
            tmp.k1 = 0;
 +
            for (int i = tmp.a1 ; i <= tmp.b1 ; i ++)      //подсчет количества элементов первой функции
 +
            {
 +
                tmp.k1++;
 +
            }
 +
            tmp.k2 = 0;
 +
            for (int i = tmp.a2 ; i <= tmp.b2 ; i ++)      //подсчет количества элементов второй функции
 +
            {
 +
                tmp.k2++;
 +
            }
 +
            return tmp;                                    //возвращает первые и последние значения обеих функций и
 +
        }                                                  //их количества элементов
  
'''Пояснения к алгоритму''':
+
    //ПЕРЕГРУЗКА ОПЕРАТОРОВ
#  Прочитанные из файла функции нужно отсортировать.
 
#  Найти совместную область определения, то есть, найти множество пересечения областей определения функций, над которыми совершается операция.
 
#  Создать третью функцию, со следующими свойствами : область определения состоит только из точек, принадлежащих совместной области определения, каждая точка области значений является результатом нужной операции над точкой области значений одной из функций и, либо интерполированной точкой по другой функции, либо, если есть возможность, точным значением из ее области значений.
 
  
Скачать можно  [http://tm.spbstu.ru/Файл:Функции.rar тут].
+
    stars operator+ (stars & v)                            //сложение
 
+
    {
 
+
        polyana tmp = prepare(v);
<div class="mw-collapsible mw-collapsed" style="width:100%" ><div class="mw-collapsible-content">
+
        int general = tmp.k1 + tmp.k2;                      //общее количество элементов обеих функций
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
        stars F3(general);                                  //создание объекта класса только по количеству элементов
#include <iostream>
+
        for (int i = 0 ; i < tmp.k1 ; i++)                  //заполнение первой части окончательного результата
#include <math.h>
+
        {
#include <cstring>
+
            F3.massiv[i].x = massiv[i+tmp.a1].x;
#include <cmath>
+
            trees tiger = v.love(massiv[i+tmp.a1].x);
#include <malloc.h>
+
            if (tiger.pol == true)                          //если значения по У в одной точке не совпадают, то интерполировать
#include <fstream>
+
            {
 +
                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;
 +
            }
  
using namespace std;
+
        }
 +
        {
 +
          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;
 +
        }
  
double base(double x)                                        //базовая функция ( если задавать через шаг и начальный х
+
        for (int i = 0; i < (general); i++)                  //сортировка
{
+
        {
    return x;
+
            for (int j = 0; j < (general - 1); j ++)
}
+
            {
 +
                dot temp;
 +
                if (F3.massiv[j].x > F3.massiv[j + 1].x)
 +
                {
 +
                    temp = F3.massiv[j];
 +
                    F3.massiv[j] = F3.massiv[j + 1];
 +
                    F3.massiv[j + 1] = temp;
 +
                }
 +
                else                                       //если элементы совпадают, то нужно выбросить один из них
 +
                if (F3.massiv[j].x == F3.massiv[j + 1].x)
 +
                {
 +
                    int l = j;
 +
                    while (l < general)
 +
                    {
 +
                        F3.massiv[l].x = F3.massiv[l + 1].x;
 +
                        F3.massiv[l].y = F3.massiv[l + 1].y;
 +
                        l++;
 +
                    }
 +
                    general--;
 +
                }
 +
            }
 +
        }
  
struct ap                                                  //две одинаковые структуры это нехорошо,коненчо,но зато наглядно...
 
{
 
    double k,b;
 
};
 
  
struct fun                                                  //один столбик в таблице функции
+
        stars normalny (general);                           //создание элемента класса по длине
{
+
        for (int i = 0; i < (general); i++)
    double x,y;
+
        {
};
+
            normalny.massiv[i].x = F3.massiv[i].x;
 
+
            normalny.massiv[i].y = F3.massiv[i].y;
struct sf                                                  //структура нужная, для возражеия значений из функции "prepare" класса F
+
         }
{
+
        a = normalny.massiv[0].x;
    int i1,i2,e1,e2;
+
         b = normalny.massiv[general].x;
    double glength, gfirstx, glastx;
+
        return normalny;
};
 
 
 
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;
 
        x  += b[i].x;
 
        y   += b[i].y;
 
         sqx += b[i].x*b[i].x;
 
         xsq += b[i].x;
 
 
     }
 
     }
     xsq *= xsq;
+
     };
  
    r.k = (n*xy - x*y)/(n*sqx - xsq);                      //использование формул
+
        stars operator* (stars & v)                         //умножение
    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)
+
         polyana tmp = prepare(v);
          a = new fun [l];
+
        int general = tmp.k1 + tmp.k2;
         firstx = f;
+
         stars F3(tmp.k1 + tmp.k2);
         length = l;
+
         for (int i = 0 ; i < tmp.k1 ; i++)
         step = s;
+
         {
        lastx = firstx+(length - 1)*step;
+
            F3.massiv[i].x = massiv[i+tmp.a1].x;
 +
            trees tiger = v.love(massiv[i+tmp.a1].x);
 +
            if (tiger.pol == true)
 +
            {
 +
                F3.massiv[i].y = pentagon (v.massiv[tiger.n].x,      F3.massiv[i].x,
 +
                                          v.massiv[tiger.n + 1].x,  v.massiv[tiger.n].y,
 +
                                          v.massiv[tiger.n + 1].y )* (massiv[i+tmp.a1].y);
 +
            }
 +
            else
 +
            {
 +
                F3.massiv[i].y = v.massiv[tiger.n].y * massiv[i+tmp.a1].y;
 +
            }
  
 
+
        }
         for (int i = 0;i < length; i ++)
+
         {
 +
            for (int i = tmp.k1 ; i < (general) ; i++)
 
         {
 
         {
             a[i].y = base(firstx + i*step);
+
             F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
             a[i].x = firstx + i*step;
+
            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++)
 
+
        {
    F (fun b[],int l)                                  //конструктор для создания фунции с уже известными областями определния и значений
+
             for (int j = 0; j < (general - 1); j ++)
    {
+
             {
        length = l;
+
                dot temp;
        a = new fun [l];
+
                if (F3.massiv[j].x > F3.massiv[j+1].x)
         for (int i = 0; i < l;i++)
+
                {
             a[i] = b[i];
+
                    temp = F3.massiv[j];
 
+
                    F3.massiv[j] = F3.massiv[j+1];
        for (int i = 0; i < l;i++)
+
                    F3.massiv[j+1] = temp;
             for (int j = 0; j < (l - 1); j++)
+
                }
                 if (a[j].x > a[j + 1].x)
+
                else
 +
                 if (F3.massiv[j].x == F3.massiv[j+1].x)
 
                 {
 
                 {
                     fun tmp = a[j];
+
                     int l = j;
                     a[j] = a[j + 1];
+
                     while (l < general)
                     a[j + 1] = a[j];
+
                    {
 +
                        F3.massiv[j].x = F3.massiv[j+1].x;
 +
                        l++;
 +
                    }
 +
                     general--;
 
                 }
 
                 }
 +
            }
 +
        }
  
        firstx = a[0].x;
+
        for (int i = 0 ; i < general ; i++)
         lastx = a[length - 1].x;
+
         {
    }
 
  
    void addpar (double k, double b, int l, fun z[] )                          //позволяет создать и заполнить переданным массивом поле объекта класса
+
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
    {
+
        }
         a = new fun [l];
+
 
         for (int i = 0; i < l; i++)
+
 
 +
         stars normalny(general);
 +
         for (int i = 0; i < (general); i++)
 
         {
 
         {
             a[i].y = k*z[i].x + b;
+
             normalny.massiv[i].x = F3.massiv[i].x;
             a[i].x = z[i].x;
+
             normalny.massiv[i].y = F3.massiv[i].y;
 
         }
 
         }
         length = l;
+
         a = normalny.massiv[0].x;
 +
        b = normalny.massiv[general].x;
 +
        return normalny;
 
     }
 
     }
 +
    };
  
     double getelx(int i)                               //возращает значение из поля "х" iого элемента
+
     stars operator- (stars & v)                             //вычитание
 
     {
 
     {
         return a[i].x;
+
         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;
 +
            }
  
 
+
         }
    double getely(int i)                              //возращает значение из поля "х" iого элемента
+
         {
    {
+
            for (int i = tmp.k1 ; i < (general) ; i++)
         return a[i].y;
 
    }
 
 
 
    int getlength()                                //возращает размер области определения функции(в точках)
 
    {
 
         return length;
 
    }
 
 
 
    void FOut()                                    //выводит функцию на экран
 
    {
 
      cout << "  x        y" << endl;
 
      for (int i = 0;i < length; i ++)
 
          cout << "  " << a[i].x << "        " << a[i].y << endl;
 
      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)))
+
             F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
                 return (i + 1);
+
            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
 
             else
                 // чтобы иметь возможность проанализировать полученное значение функции,мы должны понимать, было найденно равное или промежуточное значение. "флагом" равных значений является знак минус,но так у нуля нет знака,то приходиться все сдвигать на 1
+
                 F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
                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                                      //"подготовка" функций к бинарной операции (нахождение совместной области определения
+
        for (int i= 0; i < (general); i++)
    {
 
        sf r;
 
        if (a[0].x > x.a[0].x)
 
 
         {
 
         {
             r.gfirstx = a[0].x;
+
             for (int j = 0; j < (general - 1); j ++)
            r.i1 = 0;
+
            {
            r.i1 = 0;
+
                dot temp;
            double k = x.pfind(a[0].x);
+
                if (F3.massiv[j].x > F3.massiv[j+1].x)
            if (k < 0)
+
                {
                r.i2 = -k - 1;
+
                    temp = F3.massiv[j];
            else
+
                    F3.massiv[j] = F3.massiv[j+1];
                r.i2 = (k - 1) + 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--;
 +
                }
 +
            }
 
         }
 
         }
        else
+
 
 +
        for (int i = 0 ; i < general ; i++)
 
         {
 
         {
            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)
+
            cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
 +
        }
 +
 
 +
 
 +
        stars normalny(general);
 +
        for (int i = 0; i < (general); i++)
 
         {
 
         {
             r.glastx = a[length - 1].x;
+
             normalny.massiv[i].x = F3.massiv[i].x;
            r.e1 = length - 1;
+
             normalny.massiv[i].y = F3.massiv[i].y;
            double k = x.pfind(r.glastx);
 
             if (k < 0)
 
                r.e2 = -k - 1;
 
            else
 
                r.e2 = (k - 1) - 1;
 
 
         }
 
         }
         else
+
         a = normalny.massiv[0].x;
        {
+
         b = normalny.massiv[general].x;
            r.glastx = x.a[x.length - 1].x;
+
         return normalny;
            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));
 
 
 
         return r;
 
 
     }
 
     }
 +
    };
  
     void ad (fun b[],int l)                                 //присвоить массиву объекта класса F значения массива b
+
     stars operator/ (stars & v)                             //деление
 
     {
 
     {
         length = l;
+
         polyana tmp = prepare(v);
         a = new fun [l];
+
         int general = tmp.k1 + tmp.k2;
         for (int i = 0; i < l;i++)
+
        stars F3(tmp.k1 + tmp.k2);
             a[i] = b[i];
+
         for (int i = 0 ; i < tmp.k1 ; i++)
        firstx = a[0].x;
+
        {
        lastx = a[length - 1].x;
+
             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);
 +
            }
  
    fun *geta()                                        //получения указателя на начало массива в поле класса
 
    {
 
        return a;
 
    }
 
 
    F operator +(F &x) const                              //сложение двух функций
 
    {
 
        int i1, e1, i2, e2, kk = 0;
 
        double gfirstx, glastx, glength;
 
 
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((lastx < x.firstx) && (firstx < x.firstx)))
 
        {
 
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
 
            F fl(-1,0,0);
 
            return fl;
 
 
         }
 
         }
        sf r = prepare(x);
+
        {
        F tmp(r.glength,r.gfirstx,r.glastx);
+
            for (int i = tmp.k1 ; i < (general) ; i++)
        for (int i = 0; i <= (r.e1 - r.i1); i++)
 
 
         {
 
         {
             tmp.a[i].x = a[i + r.i1].x;            //поправка,введенная таким образом,чтобы номер,с которого начинается отсчет был первым в новой области определения
+
             F3.massiv[i].x = v.massiv[i+tmp.a2 - tmp.k1].x;
            int ii = x.pfind(tmp.a[i].x);
+
             trees tiger = love(v.massiv[i+tmp.a2 - tmp.k1].x);
            if (ii < 0)
+
             if (tiger.pol == true)
                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;
+
                 F3.massiv[i].y = pentagon (v.massiv[tiger.n].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;
+
                                            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
 
             else
            {
+
                 F3.massiv[i].y = massiv[tiger.n].y + v.massiv[i+tmp.a2 - tmp.k1].y;
                 kk++;
 
                glength --;
 
                tmp.length --;
 
            }
 
 
         }
 
         }
  
         for (int i = 0; i < glength; i++)
+
         for (int i= 0; i < (general); i++)
             for (int j = 0; j < glength - 1; j++)
+
        {
            if (tmp.a[j].x > tmp.a[j + 1].x)
+
             for (int j = 0; j < (general - 1); j ++)
 
             {
 
             {
                 fun t = tmp.a[j];
+
                 dot temp;
                tmp.a[j] = tmp.a[j + 1];
+
                if (F3.massiv[j].x > F3.massiv[j+1].x)
                tmp.a[j + 1] = t;
+
                {
            }
+
                    temp = F3.massiv[j];
 
+
                    F3.massiv[j] = F3.massiv[j+1];
        return tmp;
+
                    F3.massiv[j+1] = temp;
}
+
                }
 
+
                else
    F operator *(F & x) const                                        //умножение двух функций
+
                if (F3.massiv[j].x == F3.massiv[j+1].x)
    {
+
                {
        int i1, e1, i2, e2, kk = 0;
+
                    int l = j;
         double gfirstx, glastx, glength;
+
                    while (l < general)
 +
                    {
 +
                        F3.massiv[j].x = F3.massiv[j+1].x;
 +
                        l++;
 +
                    }
 +
                    general--;
 +
                }
 +
            }
 +
         }
  
        if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
+
        for (int i = 0 ; i < general ; i++)
 
         {
 
         {
             cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
+
 
            F fl(-1,0,0);
+
             cout <<F3.massiv[i].x<< ' ' << F3.massiv[i].y <<endl;
            return fl;
 
 
         }
 
         }
  
        sf r = prepare(x);
 
        F tmp(r.glength,r.gfirstx,r.glastx);
 
  
         for (int i = 0; i <= (r.e1 - r.i1); i++)
+
        stars normalny(general);
 +
         for (int i = 0; i < (general); i++)
 
         {
 
         {
             tmp.a[i].x = a[i + r.i1].x;
+
             normalny.massiv[i].x = F3.massiv[i].x;
            int ii = x.pfind(tmp.a[i].x);
+
             normalny.massiv[i].y = F3.massiv[i].y;
            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++)
+
         a = normalny.massiv[0].x;
        {
+
        b = normalny.massiv[general].x;
             int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
+
        return normalny;
            if (ii >= 0)
+
    }
 +
    };
 +
 
 +
    trees love (double a)                                   //
 +
    {
 +
        trees privet;
 +
        for (int i = 0; i < k; i++ )
 +
             if ((massiv[i].x < a)&& (a < massiv[i+1].x))
 
             {
 
             {
                 tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
+
                 privet.n = i;
                 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;
+
                 privet.pol = true;
 +
                return privet;
 
             }
 
             }
 
             else
 
             else
            {
+
                if (massiv[i].x == a)
                 kk++;
+
                {
                glength --;
+
                    privet.n = i;
                tmp.length --;
+
                    privet.pol = false;
            }
+
                    return privet;
        }
+
                }
 +
                else
 +
                 if (massiv[i+1].x == a)
 +
                {
 +
                    privet.n = i+1;
 +
                    privet.pol = false;
 +
                    return privet;
 +
                }
 +
    }
  
        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;
+
     approx approximate ()                                   //функция аппроксимации
     }
 
 
 
    F operator ^(F & x) const                                  //возведение функции слева от оператора в степень функции справа от оператора
 
 
     {
 
     {
         int i1, e1, i2, e2, kk = 0;
+
         approx hey;
         double gfirstx, glastx, glength;
+
        stars mattafix (double a, double b, double step, int k, int length);
 
+
        double sigmaX = 0;
         if (((x.lastx < firstx) && (x.firstx < firstx)) || ((x.firstx < lastx) && (firstx < x.firstx)))
+
        double sigmaY = 0;
 +
         double sigmaXY = 0;
 +
        double sigmaXsqrt = 0;
 +
         for (int i = 0; i < length; i++)
 
         {
 
         {
            cout << "Nevozmozhno, prover'te oblasti opredelenia" << endl;
+
          sigmaX += a + step * i;
            F fl(-1,0,0);
+
          sigmaY += b + i * 5;
            return fl;
+
          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;
  
        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);
+
int main()
            if (ii < 0)
+
{
                tmp.a[i].y = pow(x.a[-ii - 1].y, a[i + r.i1].y);
+
    int tyu;
            else
+
    stars function3;
                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);
+
    int firstnumber1;
         }
+
    int firstnumber2;
         for (int i = (r.e1 - r.i1 + 1); i <= (r.e2 - r.i2 + (r.e1 - r.i1) + 1) ; i++)
+
    int lastnumber1;
 +
    int lastnumber2;
 +
    int step1;
 +
    int step2;
 +
    while (true)
 +
    {
 +
 
 +
        cout << "Input 0 - vvedite parametry pervoy funkcii"<< endl;
 +
        cout << "Input 1 - vvedite parametry vtoroy funkcii"<< endl;
 +
        cout << "Input 2 - slozhenie"<< endl;
 +
        cout << "Input 3 - umnozhenie"<< endl;
 +
         cout << "Input 4 - delenie"<< endl;
 +
         cout << "Input 5 - vychitanie"<< endl;
 +
        cout << "Input 6 - aproximate"<< endl;
 +
        cin >> tyu ;
 +
 
 +
        switch (tyu)
 
         {
 
         {
             int ii = pfind(x.a[i - (r.e1 - r.i1 + 1) + r.i2].x);
+
             case 0:
            if (ii >= 0)
+
            {  cout << "Vvedite pervy x" << endl;
            {
+
                cin >> firstnumber1;
                 tmp.a[i - kk].x = x.a[i - (r.e1 - r.i1 + 1) + r.i2].x;
+
                cout << "Vvedite posledniy x" << endl;
                 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);
+
                cin >> lastnumber1;
 +
                cout << "Vvedite shag" << endl;
 +
                 cin >> step1;
 +
                 break;
 
             }
 
             }
             else
+
             case 1:
 
             {
 
             {
                 kk++;
+
                 cout << "Vvedite pervy x" << endl;
                 glength --;
+
                 cin >> firstnumber2;
                 tmp.length --;
+
                 cout << "Vvedite posledniy x" << endl;
 +
                cin >> lastnumber2;
 +
                cout << "Vvedite shag" << endl;
 +
                cin >> step2;
 +
                break;
 
             }
 
             }
        }
+
            case 2:
 +
            {
 +
                stars function1 (firstnumber1, lastnumber1, step1);
 +
                function1.out();
 +
                function1.outinfile ();
 +
 
 +
                stars function2 (firstnumber2, lastnumber2, step2);
 +
                function2.out();
 +
                function2.outinfile ();
  
        for (int i = 0; i < glength; i++)
+
                function3 = function1 + function2;
            for (int j = 0; j < glength - 1; j++)
+
                function3.out();
             if (tmp.a[j].x > tmp.a[j + 1].x)
+
                function3.outinfile ();
 +
                break;
 +
             }
 +
            case 3:
 
             {
 
             {
                 fun t = tmp.a[j];
+
                 stars function1 (firstnumber1, lastnumber1, step1);
                 tmp.a[j] = tmp.a[j + 1];
+
                 function1.out();
                 tmp.a[j + 1] = t;
+
                 function1.outinfile ();
            }
 
  
        return tmp;
+
                stars function2 (firstnumber2, lastnumber2, step2);
    }
+
                function2.out();
};
+
                function2.outinfile ();
  
int main()
+
                function3 = function1 * function2;
{
+
                function3.out();
  /*
+
                function3.outinfile ();
    F f1(5,-2,1.5);
+
                break;
    F f2(30,-10,0.5);
+
            }
    F f3, f4;
+
            case 4:
    f1.FOut();
+
            {
    f2.FOut();
+
                stars function1 (firstnumber1, lastnumber1, step1);
    f3 = f1 + f2;
+
                function1.out();
    f3.FOut();
+
                function1.outinfile ();
    f4 = f1 * f2;
+
 
    f4.FOut();
+
                stars function2 (firstnumber2, lastnumber2, step2);
    cout << " ________" << endl;
+
                function2.out();
*/
+
                function2.outinfile ();
    char vc, s[255], ce;
 
    ifstream infile;
 
    int n;
 
    fun *a;
 
    F f5,f6,f7,f8,f9;
 
  
    while(true)
+
                function3 = function1 / function2;
    {
+
                function3.out();
    start :
+
                function3.outinfile ();
        system("cls");
+
                break;
        cout << "1 - Vvesti 1uu func"            << endl;
+
            }
        cout << "2 - Vvesti 2uu func"            << endl;
+
            case 5:
        cout << "3 - Sloshit'"                  << endl;
+
            {
        cout << "4 - Umnozhit'"                  << endl;
+
 
        cout << "5 - Vozvesti v stepen'"        << endl;
+
                stars function1 (firstnumber1, lastnumber1, step1);
        cout << "6 - Aproximirovat'"            << endl;
+
                function1.out();
        cout << "7 - Zapics' v file func"        << endl;
+
                function1.outinfile ();
        cout << "8 - Zapics' v file aprok fun"  << endl;
+
 
        cout << "0 - Vihod"                      << endl;
+
                stars function2 (firstnumber2, lastnumber2, step2);
        cin  >> vc;
+
                function2.out();
        switch (vc)
+
                function2.outinfile ();
        {
+
 
             case '0':
+
                function3 = function1 - function2;
                return 0 ;
+
                function3.out();
             case '1':
+
                function3.outinfile ();
 +
                break;
 +
             }
 +
             case 6:
 
                 {
 
                 {
                system("cls");
+
                    approx you;
                strcpy(s,"");
+
                    function3.approximate();
                delete []a;
+
                    outfile.open ("meow", ios :: app);
                a = NULL;
+
                    outfile << "Y = "<< you.koefficientA <<"* x + "<<you.koefficientB << endl;
                cout << "Vvedite imya fila" << endl;
+
                    outfile << endl;
                cin >> s;
+
                    outfile.close();
                strcat(s, ".txt");
+
 
                 infile.open(s);
+
 
                infile >> n;
+
                 }
                a = new fun [n];
+
            }
                for(int i = 0; i < n; i ++)
+
        }
                    infile >> a[i].x >> a[i].y;
+
    };
                f5.ad(a,n);
+
 
                f5.FOut();
+
 
                infile.close();
+
</syntaxhighlight>
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
</div>
                cin >> ce;
+
 
                while (true)
+
 
                if (ce == 'b')
+
 
                    goto start;
+
 
                }
+
 
            case '2':
+
'''[[Лосева Татьяна]]'''
                {
+
                system("cls");
+
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.
                strcpy(s,"");
+
 
                delete []a;
+
'''Инструкция к программе:''' Начальная координата и шаг,для задания координат функций,передаются при вызове методов,создающих функции.Начальный шаг,шаг интерполяции,а так же количество выводимых координат заданы глобально.Поэтому просто запускайте программу, при желании поменяйте заданные
                a = NULL;
+
величины.
                cout << "Vvedite imya fila" << endl;
+
 
                cin >> s;
+
Cкачать программу можно  [http://tm.spbstu.ru/Файл:Loseva.rar здесь]
                strcat(s, ".txt");
+
 
                infile.open(s);
+
<div class="mw-collapsible-content">
                infile >> n;
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
                a = new fun[n];
+
#include <iostream>
                for(int i = 0; i < n; i ++)
+
 
                    infile >> a[i].x >> a[i].y;
+
using namespace std;
                f6.ad(a,n);
+
 
                f6.FOut();
+
#define N 5//количество точек
                infile.close();
+
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
const double l1 = 5;//задаём начальный шаг функций
                cin >> ce;
+
const double l2 = 0.7;//шаг для интерполяции
                while (true)
+
 
                if (ce == 'b')
+
class Func
                    goto start;
+
{//класс,хранящий функцию,содержащий методы:печать,перегрузка,интерполяция,апроксимация
                }
+
 
            case '3':
+
public:
                system("cls");
+
Func(int size) : size_(size), ax(new double[size]), by(new double[size])//создаём два массива,заполняем нулями
                f5.FOut();
+
{
                f6.FOut();
+
for (int i = 0; i< size_; i++)
                f7 = f5 + f6;
+
{
                f7.FOut();
+
ax[i] = 0;
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
by[i] = 0;   //все элементы обоих массивов обнуляются
                cin >> ce;
+
}
                while (true)
+
}
                if (ce == 'b')
+
 
                    goto start;
+
void print()//вывод на экран
            case '4':
+
{
                system("cls");
+
cout << "x: ";
                f5.FOut();
+
for (int i = 0; i < size_; i++)
                f6.FOut();
+
cout << ax[i] << " ";
                f7 = f5 * f6;
+
cout << endl << "y: ";
                f7.FOut();
+
for (int i = 0; i < size_; i++)
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
cout << by[i] << " ";
                cin >> ce;
+
cout << endl;
                while (true)
+
}
                if (ce == 'b')
+
 
                    goto start;
+
Func &operator+(Func &f2)//функция перегрузки:cложение функций
            case '5':
+
{
                system("cls");
+
Func *result = new Func(size_);//создаём результирующую функцию,равную сумме двух f2 и this
                f5.FOut();
+
for (int i = 0; i < size_; i++)
                f6.FOut();
+
{
                f7 = f5 ^ f6;
+
result->ax[i] = this->ax[i];//суммируем координаты X
                f7 = f5 ^ f6;
+
result->by[i] = f2.by[i] + this->by[i];//суммируем координаты Y
                f7.FOut();
+
}
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
cout << "Sum f(x)=f1+f2:" << endl;//выводим на экран сумму функций
                cin >> ce;
+
result->print();
                while (true)
+
return *result;
                if (ce == 'b')
+
}
                    goto start;
 
            case '6':
 
            {
 
                system("cls");
 
                ap tmp = aproks(f7.geta(), f7.getlength());
 
                f8.addpar(tmp.k, tmp.b, f7.getlength(), f7.geta());
 
                f8.FOut();
 
                cout << "Nazhmite \"b\" chotibi viti" << endl;
 
                cin >> ce;
 
                while (true)
 
                if (ce == 'b')
 
                    goto start;
 
            }
 
            case '7':
 
            {
 
                system("cls");
 
                strcpy(s,"");
 
                cout << "Vvedite imya fila" << endl;
 
                cin >> s;
 
                strcat(s, ".txt");
 
                ofstream outfile(s);
 
                outfile << "x          y" << endl;
 
                for (int i = 0; i < f7.getlength(); i ++)
 
                    outfile << f7.getelx(i) << "          " << f7.getely(i) << endl;
 
  
                cout << "done" << endl;
+
void Int(double L) //метод Интерполяции
                cout << "Nazhmite \"b\" chotibi viti" << endl;
+
{
                cin >> ce;
+
int M = (this->ax[this->size_ - 1] - this->ax[0]) / L + 1; //M- количество элементов массива с координатами интерполирующей функции;
                while (true)
+
Func result = Func(M);//cоздаём функцию,в кторой будет храниться результат интерполяции
                if (ce == 'b')
+
cout << "M =" << M << endl;//выводим M для проверки
                    goto start;
+
cout << "Interpolation: " << endl;
            }
+
int t;
            case '8':
+
for (int i = 1; i < M; i++)
                system("cls");
+
{
                strcpy(s,"");
+
result.ax[0] = this->ax[0];
                cout << "Vvedite imya fila" << endl;
+
result.ax[i] = result.ax[i - 1] + L;//интерполируем Х,прибавляя шаг к каждому предыдущему элементу
                cin >> s;
+
t = (result.ax[i - 1] - result.ax[0]) / l1;//считаем номер элемента,"левого" от искомого
                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>
 
  
'''[[Лобанов Илья]]'''
+
                      //интерполируем 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]);
  
'''Описание программы''':
+
}
Программа позволяет складывать , вычитать , делить,умножать 2 функции,заданные на одном интервале.При считывании с файла сначала указывается отрезок, потом величина шага, а потом дискретные значения.
 
  
Скачать можно [[http://tm.spbstu.ru/File:func.rar тут]]
+
result.print();//выводим результат
 +
}
  
 +
void aprox()//Апроксимация
 +
{
 +
double a=0;
 +
          for(int i=0;i<size_;i++)//считаем сумму x
 +
  a=this->ax[i]+a;
 +
       
  
'''[[Лосева Татьяна]]'''
+
double b=0;
+
for(int i=0;i<size_;i++)//считаем сумму y
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.
+
b=this->by[i]+b;
 +
  
'''Инструкция к программе:''' Начальная координата и шаг,для задания координат функций,передаются при вызове методов,создающих функции.Начальный шаг,шаг интерполяции,а так же количество выводимых координат заданы глобально.Поэтому просто запускайте программу, при желании поменяйте заданные
+
double c=0;
величины.
+
for(int i=0;i<size_;i++)//считаем сумму квадратов x
 +
c=(this->ax[i])*(this->ax[i])+c;
 +
  
Cкачать программу можно  [http://tm.spbstu.ru/Файл:Loseva.rar здесь]
+
double d=0;
 +
for(int i=0;i<size_;i++)//считаем сумму xy
 +
d=(this->ax[i])*(this->by[i])+d;
 +
  
<div class="mw-collapsible-content">
+
//затем решаем систему для у=kx+m
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
//(1)c*k+a*m=d
#include <iostream>
+
//(2)a*k+size_*m=b;
 +
//k=(d-am)/с
 +
//подставим в (2)
 +
double m;
 +
m=(b*c-a*d)/(c*size_-a*a);
 +
double k;
 +
k=(d-a*m)/c;
 +
cout<<"aproximacia :: ";
 +
cout<<"y="<<k<<"x+"<<m<<endl;
  
using namespace std;
+
}
  
#define N 5//количество точек
 
  
const double l1 = 5;//задаём начальный шаг функций
+
double *ax;
const double l2 = 0.7;//шаг для интерполяции
+
double *by;
  
class Func
+
private:
{//класс,хранящий функцию,содержащий методы:печать,перегрузка,интерполяция,апроксимация
+
int size_;//размер массива
 +
};
  
 +
 +
 +
 +
class Cord//класс,создающий и хранящий значение функций
 +
{
 
public:
 
public:
Func(int size) : size_(size), ax(new double[size]), by(new double[size])//создаём два массива,заполняем нулями
+
Cord(double x0, double s) :x0(x0), s(s)//x0-начальная координата;s-шаг
 
{
 
{
for (int i = 0; i< size_; i++)
 
{
 
ax[i] = 0;
 
by[i] = 0;  //все элементы обоих массивов обнуляются
 
}
 
 
}
 
}
  
void print()//вывод на экран
+
void Fyx1(Func func)//метод,считающий координаты нашей функции y=x
 
{
 
{
cout << "x: ";
+
int i;
for (int i = 0; i < size_; i++)
+
func.ax[0] = x0;
cout << ax[i] << " ";
+
for (i = 1; i < N; i++)//считаются иксы
cout << endl << "y: ";
+
{
for (int i = 0; i < size_; i++)
+
func.ax[i] = x0 + s;
cout << by[i] << " ";
+
x0 = func.ax[i];
 +
}
 +
for (i = 0; i<N; i++)
 +
func.by[i] = func.ax[i];//считаем координаты у
 +
cout << "f1 :" << endl;
 +
func.print();
 
cout << endl;
 
cout << endl;
 
}
 
}
  
Func &operator+(Func &f2)//функция перегрузки:cложение функций
+
void Fyx2(Func func)//метод,считающий координаты нашей функции y=x+1
 
{
 
{
Func *result = new Func(size_);//создаём результирующую функцию,равную сумме двух f2 и this
+
int i;
for (int i = 0; i < size_; i++)
+
func.ax[0] = x0;
 +
for (i = 1; i<N; i++)//считаем иксы
 
{
 
{
result->ax[i] = this->ax[i];//суммируем координаты X
+
func.ax[i] = x0 + s;
result->by[i] = f2.by[i] + this->by[i];//суммируем координаты Y
+
x0 = func.ax[i];
 
}
 
}
cout << "Sum f(x)=f1+f2:" << endl;//выводим на экран сумму функций
+
for (i = 0; i<N; i++)
result->print();
+
func.by[i] = func.ax[i] + 1;//считаем игрики
return *result;
+
cout << "f2 :" << endl;
 +
func.print();
 +
cout << endl;
 
}
 
}
  
void Int(double L) //метод Интерполяции
+
private:
{
+
double x0;//начальная координата
int M = (this->ax[this->size_ - 1] - this->ax[0]) / L + 1; //M- количество элементов массива с координатами интерполирующей функции;
+
double s;//шаг
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 по формуле
+
int main()
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]);
+
{
 +
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);
  
result.print();//выводим результат
+
f1.Int(l2);//Интерполируем f1 с новым шагом l2
}
+
f1.aprox();//Апроксимируем f1
 
+
void aprox()//Апроксимация
+
getchar();
{
+
return 0;
double a=0;
+
}
          for(int i=0;i<size_;i++)//считаем сумму x
 
  a=this->ax[i]+a;
 
       
 
  
double b=0;
+
</syntaxhighlight>
for(int i=0;i<size_;i++)//считаем сумму y
+
</div>
b=this->by[i]+b;
 
 
  
double c=0;
 
for(int i=0;i<size_;i++)//считаем сумму квадратов x
 
c=(this->ax[i])*(this->ax[i])+c;
 
 
  
double d=0;
 
for(int i=0;i<size_;i++)//считаем сумму xy
 
d=(this->ax[i])*(this->by[i])+d;
 
 
  
//затем решаем систему для у=kx+m
 
//(1)c*k+a*m=d
 
//(2)a*k+size_*m=b;
 
//k=(d-am)/с
 
//подставим в (2)
 
double m;
 
m=(b*c-a*d)/(c*size_-a*a);
 
double k;
 
k=(d-a*m)/c;
 
cout<<"aproximacia :: ";
 
cout<<"y="<<k<<"x+"<<m<<endl;
 
  
}
+
'''[[Козловская Анна]]'''
  
 +
'''Описание программы''': программа позволяет сложить, умножить, возвести одну в степень другой две таблично заданные функции, а также линейно аппроксимировать результат. Чтение и вывод происходит через файл.
  
double *ax;
+
'''Пояснения к алгоритму''': Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
double *by;
 
  
private:
 
int size_;//размер массива
 
};
 
  
 +
Скачать можно  [http://tm.spbstu.ru/File:project1.rar тут].
  
  
  
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
+
Скачать можно  [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 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:
+
<div class="mw-collapsible-content">
double x0;//начальная координата
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
double s;//шаг
 
};
 
  
int main()
+
#include <iostream>
{
+
#include <vector>
Func f1(N);//создание функции f1
+
#include<math.h>
Func f2(N);//создание f2
 
Cord s1(0, l1);//cоздаём объект s1
 
Cord s2(0, l1);//cоздаём объект s2
 
s1.Fyx1(f1);//задаём координаты 1ой функции
 
s2.Fyx2(f2);//задаём координаты 2ой функции
 
  
      //сложение функций:
+
using namespace std;
+
class f{
Func f3 = f2 + f1;//есть тоже ,что и Func f3 = f2.operator+(f1);
+
    private:
 
+
    double st, en, d; //начало, конец, дельта
f1.Int(l2);//Интерполируем f1 с новым шагом l2
+
    vector<double> v;//вектор, содержащий y
f1.aprox();//Апроксимируем f1
+
    public:
+
    f(double _st, double _en, double _d, vector<double> _v){
getchar();
+
        st=_st;
return 0;
+
        en=_en;
}
+
        d=_d;
 
+
        for(int i=0;i<_v.size();i++) //копируем массив, который вводим в консоль
</syntaxhighlight>
+
            v.push_back(_v[i]);
</div>
+
        //return *this;
 
+
    }
'''[[Сергей Ляжков]]'''
+
    f(){};
'''Описание программы''':программа позволяет проводить следующие действия с функциями: сложение, вычитание, умножение, те же действия с числами, проводить аппроксимацию и интерполяцию
+
    f aprox(double _st, double _en, double _d){ //метод интерполяции, поиск коэфф a и b для y=ax+b
Скачать можно [[http://tm.spbstu.ru/File:Функции.zip тут]]
+
        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));
  
<br>'''[[Нарядчиков Александр]]'''<br>
+
        vector<double> v1;//вектор, содержащий проинтерполированную функцию
'''Инструкция:''' Пользователю достаточно просто запустить программу.<br>
+
            for(int i=0; i<=(en-st)/d; i++)
'''Описание программы:''' В окне рисуются графики с разным шагом, количеством точек, начальными и конечными координатами, по клавише 'G' происходит их кубическая интерполяция, также рисуется график их суммы. По клавише 'S' можно сохранить полученный график в текстовый документ в виде координат его точек. По клавише 'L' можно загрузить график из текстового документа, и он появится в окне программы. Также происходит линейная аппроксимация графика суммы, и график аппроксимации рисуется на экран.<br>
+
                v1.push_back(a*(st+i*d)+b);//добавление значений проинтерполированной ф-ции с шагом другой функции
'''Описание алгоритма:''' Вся графика написана с помощью библиотек OpenGL и GLUT. Кубическая интерполяция написана с помощью кривых Безье(интерполяция по четырем точкам - кубическая кривая). При сложение двух графиков происходит их интерполяция, для приведения их к общему шагу. Линейная аппроксимация написана с помощью метода наименьших квадратов.<br>
+
        return f(_st,_en,_d,v1);
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
"'''T05GRAPH.CPP'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
/* FILENAME: T05GRAPH.CPP
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#include "GRAPH.H"
+
    }
  
/* Глобальные переменные */
+
    f operator +(f x){//оператор сложения
// Глобальная переменная, хранящая время в секундах с момента старта программы
+
        double _en,_st,_d;
double SyncTime;
+
        _en=min(en,x.en); //поиск области пересечения
// Глобальные переменные для отслеживания нажатия клавиш
+
        _st=max(st,x.st);
bool IsGraph, IsSave, IsLoad, IsLoaded;
+
        if (_en>_st){//проверяем, пересекаются ли функции
 
+
            vector<double> _v;
/* Timer function */
+
            f y;
// Подсчет времени
+
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
void Timer( void )
+
                vector<double> _v;
{
+
                y=x.aprox(_st, _en, d);
long t;
+
                for (int i=0; i<=(_en-_st)/d; i++)
static long StartTime = -1;
+
                    _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);
 +
            }
 +
        }
 +
    }
  
t = clock();
+
    f prot(){ //поиск противоположной функции
if (StartTime == -1)
+
        for (int i=0; i<=(en-st)/d; i++)
StartTime = t;
+
            v[i]=(-1)*v[i];
SyncTime = (double)(t - StartTime) / CLOCKS_PER_SEC;
+
        return *this;
} /* End of 'Timer' function */
+
    }
  
/* Display function */
+
    f operator - (f x){ //разность функций
// Стандартная функция, вызываемая при перерисовке окна
+
        return(*this + x.prot());
void Display( void )
+
    }
{
 
graph G1(-15, 15, 0.1), G2(2, 10, 0.4), G3, G4;
 
  
// Запуск времени
+
f operator *(f x){//оператор умножения
Timer();
+
        double _en,_st,_d;
 +
        _en=min(en,x.en); //поиск области пересечения
 +
        _st=max(st,x.st);
 +
        if (_en>_st){//проверяем, пересекаются ли функции
 +
            vector<double> _v;
 +
            f y;
 +
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
 +
                vector<double> _v;
 +
                y=x.aprox(_st, _en, d);
 +
                for (int i=0; i<=(_en-_st)/d; i++)
 +
                    _v.push_back(y.v[i]*v[i]); //вектор с суммой функций
 +
                return f(_st,_en,d,_v);
 +
            }
 +
            else{
 +
                vector<double> _v;
 +
                y=this->aprox(_st, _en, x.d); //this-> функция, в которой мы работаем
 +
              for (int i=0; i<=(_en-_st)/x.d; i++)
 +
                    _v.push_back(y.v[i]*x.v[i]);
 +
                return f(_st,_en,x.d,_v);
 +
            }
 +
        }
 +
    }
  
// Установка цвета закраски фона в белый
+
f obr(){
glClearColor(1, 1, 1, 1);
+
  for (int i=0; i<=(en-st)/d; i++)
// Очищаем цветовой буфер для создания нового изображения
+
            v[i]=1/v[i];
glClear(GL_COLOR_BUFFER_BIT);
+
        return *this;
 +
}
  
glLoadIdentity();
+
f operator /(f x){
glScaled(0.1 / (1366 / 768.0), 0.1, 0.1);
+
return(*this*x.obr());
 +
}
  
// Отрисовка осей X и Y
+
    void vivod(){ //вывод
glBegin(GL_LINE_STRIP);
+
    for(int i=0; i<v.size(); i++)
 +
        cout<<v[i]<<" ";
  
glColor3d(0, 0, 1);
+
    }
glVertex2d(0, -1000);
+
};
glVertex2d(0, 1000);
+
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);
 +
    }
  
glColor3d(1, 0, 0);
+
    cout << "Проделаем ровно то же самое для 2 функции ";
glVertex2d(-1000, 0);
+
    cout << "Введите начала и конец отрезка и дельту: ";
glVertex2d(1000, 0);
+
    cin >> a1 >> b1 >> d1;
  
glEnd();
+
    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;
// Отрисовка первого графика и его интерполяция по клавише "G"
+
    cout<<"Введите число, соответсвующее порядковому номеру операции(1-4) - ";
G1.Draw(sin);
+
    cin>>o;
if (IsGraph == 1)
+
    if(o==1){              //по невыясненным причинам одновременно написанные слева идущие if -ы не работают,
G1.Interpolation_Draw(1.0 / 32);
+
        cout<<"Сумма:";    //но если заккоментить их и менять знак + в скобке на другие, то все работает
 +
        (g+h).vivod();
  
// Отрисовка второго графика и его интерполяция по клавише "G"
+
    }
G2.Draw(log);
 
if (IsGraph == 1)
 
G2.Interpolation_Draw(1.0 / 32);
 
  
// Отрисовка графика суммы для первого и второго графиков
+
    if(o==2){
G3 = G2 + G1;
+
        cout<<"Разность:"
glColor3d(0, 1, 0);
+
        (g-h).vivod();
G3.Draw();
 
// Аппроксимация графика суммы
 
G3.Approximation();
 
  
// Сохранение графика по клавише "S"
+
    }
if (IsSave == 1)
 
{
 
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;
 
}
 
  
// Чистка памяти
+
    if(o==3){
delete[] G1.mas;
+
        cout<<"Произведение:"
delete[] G1.Color;
+
        (g*h).vivod();
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 )
 
{
 
// Выход из программы
 
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 */
+
    if(o==3){
int main( int argc, char *argv[] )
+
        cout<<"Отношение:"
{
+
        (g/h).vivod();
// Инициализации OpenGL и GLUT
+
    }
glutInit(&argc, argv);
+
 
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
+
 
 +
}
  
// Задача размеров и позиции окна
+
</syntaxhighlight>
glutInitWindowPosition(0, 0);
+
</div>
glutInitWindowSize(500, 500);
 
// Создание окна
 
glutCreateWindow("T05GRAPH");
 
  
// Установка функций 'обратного вызова'
 
glutDisplayFunc(Display);
 
glutKeyboardFunc(Keyboard);
 
  
// Запускаем основной цикл построения
 
glutMainLoop();
 
return 0;
 
} /* End of 'main' function */
 
  
/* END OF 'T05GRAPH.CPP' FILE */
 
</syntaxhighlight>
 
"'''GRAPH.CPP'''"
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
/* FILENAME: GRAPH.CPP
 
* LAST UPDATE: 17.01.2016
 
*/
 
  
#include "GRAPH.H"
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
 
  
/* Load Array of points function */
 
// Загрузка графика из файла по точкам
 
void graph::LoadArray( char *FileName )
 
{
 
// Создание указателя на тип FILE
 
FILE *F;
 
  
// Создание файла и открытие его в режиме чтения
 
fopen_s(&F, FileName, "rt");
 
  
// Количество точек
 
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);
 
}
 
  
// Закрытие файла
+
'''Инструкция к программе''': пользователь вводит начало и конец отрезка и шаг для функций, после чего создается две функции. Затем функции суммируются, после чего пользователь вводит значение нового шага, суммированная функция интерполируется по новому шагу, после этого по МНК(методу наименьших квадратов) функция апроксимируется.
fclose(F);
 
} /* End of 'LoadArray' function */
 
  
/* Fill mas function */
 
// Заполнение массива координат точек с цветом
 
void graph::Fill( double(*f)(double) )
 
{
 
// Выделение памяти под массив точек
 
mas = new vec[N];
 
// Выделение памяти под массив цветов
 
Color = new vec[N];
 
  
// Заполнение массивов
 
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 */
+
Скачать программу можно по [http://mech.spbstu.ru/File:Untitled1.rar ссылке]
// Рисование заполненного графика на экран
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
void graph::Draw( void )
+
Метод наименьших квадратов
{
+
задача состоит в том, чтобы минимизировать выражение:
  // Задача размер точки
+
1: http://mech.spbstu.ru/images/b/b0/003.png
glPointSize(1);
+
Доказано, что минимум достигается при:
// Рисование
+
2: http://mech.spbstu.ru/images/2/20/005.png
glBegin(GL_POINTS);
+
записываем пункт 2 в нашу программу, находим коэффициенты и находим значение линейной функции y=ax+b, по интерполированным значениям x.
for (int i = 0; i < N; i++)
+
 
glVertex2d(mas[i].X, mas[i].Y);
 
glEnd();
 
} /* End of 'Draw' function */
 
  
/* Draw graph function */
+
<div class="mw-collapsible-content">
// Рисование не заполненного еще графика на экран
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
void graph::Draw( double(*f)(double) )
 
{
 
// Заполнение массива
 
graph::Fill(f);
 
  
// Задача цвета и размера точки
+
#include <iostream>
glColor3d(0, 0, 0);
+
#include <math.h>
glPointSize(1);
+
#include <iomanip>
// Рисование
+
#include<stdlib.h>
glBegin(GL_POINTS);
+
using namespace std;
for (int i = 0; i < N; i++)
 
glVertex2d(mas[i].X, mas[i].Y);
 
glEnd();
 
} /* End of 'Draw' function */
 
  
/* Interpolation draw graph function */
+
class func
// Рисование интерполированного графика на экран
 
void graph::Interpolation_Draw( double i_step )
 
 
{
 
{
// Коэффициент Катмулл-Рома
+
private:
double alpha = 1.0 / 6;
+
    double a/*начало*/,b/*конец*/,c/*шаг*/,k/**/,m/**/,rr/**/;
+
    int d/*переменная для изменения типа, кол-во элементов для начальных элементов*/,tt/*переменная для изиенения типа, кол-ва элементов для счёта суммы*/;
// Кубическая интерполяция кривыми Безье
+
    double *F/*массив для значений У*/, *X/*Массив для значений Х*/, *R/*массив для значений У после интерполяции*/, *Q;
for (int i = 0; i < N - 1; i++)
+
public:
{
 
// Создание 4 точек для интерполяции по ним
 
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
 
vec Color0 = mas[i], Color1, Color2, Color3 = mas[i + 1];
 
  
// Значения для первого и последнего отрезков
+
    func (double a1, double b1, double c1):a(a1),b(b1),c(c1)//создаём конструктор для функции
if (i == 0)
+
    {
{
+
        double p = (b-a)/c;
P1 = (mas[1] - mas[0]) * alpha + mas[0];
+
        d = (int)p;
Color1 = (mas[1] - mas[0]) * alpha + mas[0];
+
        if (b > (d*c+a)) d += 2; //в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
}
+
        else d += 1;
else
 
{
 
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
 
Color1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
 
}
 
if (i == N - 2)
 
{
 
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
 
Color2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
 
}
 
else
 
{
 
P2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
 
Color2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
 
}
 
  
glLineWidth(2);
+
        F = new double [d];//создание динамического массива для У
glBegin(GL_LINE_STRIP);
+
        X = new double [d];// создание динамического массива для Х
for (double t = 0; t <= 1; t += i_step)
+
        X[0]=a;//первый элемент
{
+
        X[d-1]=b;//последний элемент, для того чтобы последний элемент был в конце промежутка, чтобы его не потерять
vec p, color;
+
        for(int i = 1; i < d-1; i++) X[i]=a+c*i; //присваивание значений всех Х
  
// Вычисление точки интерполированного графика по 4 точкам
+
    }
p = P0 * (1 - t) * (1 - t) * (1 - t) + P1 * 3 * (1 - t) * (1 - t) * t + P2 * 3 * (1 - t) * t * t + P3 * t * t * t;
+
    void first ()//функция для первой функции
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;
+
    {
 +
        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;//пробел и конец строки
glColor3d(color.X / 10, 0, color.Y);
+
    }
glVertex2d(p.X, p.Y);
 
}
 
glEnd();
 
}
 
} /* End of 'Interpolation_Draw' function */
 
  
/* Interpolation graph function */
+
    void second ()//функция для второй функции
// Интерполяция графика
+
    {
graph graph::Interpolation( double i_step )
+
        if(a==0 || b==0) return;
{
+
        F[0]=1*a*a; //присваивание значения функции в начале промежутка
graph G_New;
+
        F[d-1]=1*b*b;//присваивание значения функции в конце промежутка
// Коэффициент Катмулл-Рома
 
double alpha = 1.0 / 6;
 
  
// Заполнение параметров для нового графика
+
        for(int k = 1; k <d-1; ++k)
G_New.MinX = MinX;
+
        {
G_New.MaxX = MaxX;
+
            double n = c*k+a;
G_New.Step = Step * i_step;
+
            if (n != 0)//условие неделимости на ноль
G_New.N = (int)((G_New.MaxX - G_New.MinX) / G_New.Step);
+
            {
G_New.mas = new vec[G_New.N];
+
                F[k] = 1*n*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 G_New;
+
    void operator +(func Q)//перегрузка оператора +
} /* End of 'Interpolation' function */
+
    {
 +
        sum(Q);
 +
    }
  
/* Sum of 2 graphics function */
+
    void sum (func Q)//функция суммирования функций на интерполированном шаге
// Сложение двух графиков
+
    {  double m, p = (b-a)/c;
graph graph::operator+( graph &G )
+
    int i;
{
+
        R=new double[d+2];
graph G_New, G1, G2;
+
          if (b > (d*c+a)) d += 2; //в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
int i, j;
+
        else d += 1;
 +
    m=a;
 +
cerr<<"\n";
  
// Заполнение параметров графика суммы
+
        for(i = 0; i <d-1; ++i)//цикл суммирования функций и вывода значений суммы, функций и иксов
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];
 
  
// Интерполяция слагаемых графиков, для приведение к общему шагу
+
            cerr <<"YFirst: "<< F[i] << "  ";
G1 = Interpolation(G.Step);
+
            cerr << "YSecond: "<< Q.F[i] << "  ";
G2 = G.Interpolation(Step);
+
            R[i] = F[i] + Q.F[i];
 +
            cerr << "Ysum: "<< R[i] << "  ";
 +
            cerr << "X:" << m << '\n';
  
// Поиск общего начала и конца графиков
+
            m=m+c;
for (i = 0; i < G1.N; i++)
+
        }
if (fabs(G1.mas[i].X - G_New.MinX) <= Threshold)
+
  for(i = 0; i <d-1; ++i)
break;
+
        {Q.F[i]=R[i];
 +
}
 +
        cerr << " " << endl;
 +
    }
  
for (j = 0; j < G2.N; j++)
+
double interp( double pnt/*новый шаг*/, func Q)//функция для интерполяции функции
if (fabs(G2.mas[j].X - G_New.MinX) <= Threshold)
+
    {double p,h,i,w,*X,aApr,bApr,X2sm,XYsm,Xsm/*хранит сумму интерполированных иксов*/,Ysm/*хранит сумму интерполированных игреков*/;
break;
+
    int q,k,l,o;
 +
    p=(b-a)/pnt+1;
 +
    q=int(p);
 +
    R=new double [q];
 +
    X=new double [q];
  
// Заполнение графика суммы
+
    l=0;
for (int k = 0; k < G_New.N; k++)
+
    k=0;
{
 
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;
+
    for(h=a/*начало функции*/; h<=b/*конец функции*/; h=h+c/*старый шаг*/) //шагает по нормальному шагу
} /* End of 'Sum' function */
+
    {
 +
        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;
  
/* Save Array of points function */
+
    for(o=0;o<=k;o++)//цикл подготавливает суммы для МНК
// Сохранение графика в файл по точкам
+
        {Xsm+=X[o];
void graph::SaveArray( void )
+
        Ysm+=R[o];
{
+
        XYsm+=X[o]*R[o];
// Создание указателя на тип FILE
+
        X2sm+=X[o]*X[o];
FILE *F;
+
        }
  
// Создание файла и открытие его в режиме записи
+
aApr=(k*XYsm-Xsm*Ysm)/(k*X2sm-Xsm*Xsm);//находим коэфициенты по МНК
fopen_s(&F, "graph.txt", "wt");
+
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" ;
 +
        }
  
/* Запись в файл данных */
 
// Количество точек
 
fprintf(F, "%d\n", N);
 
// Шаг функции
 
fprintf(F, "%lf\n", Step);
 
// Начальная координата по X
 
fprintf(F, "%lf\n", MinX);
 
// Конечная координата по X
 
fprintf(F, "%lf\n", MaxX);
 
  
// Координаты всех точек
+
    return 0;}
for (int i = 0; i < N; ++i)
+
};
  fprintf(F, "%lf %lf ", mas[i].X, mas[i].Y);
 
  
// Закрытие файла
+
int main(){
fclose(F);
+
    double x, xn, s1,pnt;
} /* End of 'SaveArray' function */
+
    cout << "Input the beginning of the function: " << endl;
 
+
    cin >> x;
/* Approximation of function function */
+
    cout << "Input the ending of the function: " << endl;
// Аппроксимация графика
+
    cin >> xn;
void graph::Approximation( void )
+
    cout << "Input step for the function: " << endl;
{
+
    cin >> s1;
double k, b, s1 = 0, s2 = 0, s3 = 0, s4 = 0;
+
    func H(x,xn,s1);
 +
    H.first();
 +
    func G(x,xn,s1);
 +
    G.second();
 +
    H+G;
 +
    cout<<"\n" << "Input new step for the function: " << endl;
 +
    cin >> pnt;
 +
    H.interp(pnt,G);
 +
 
 +
return 0;}
 +
</syntaxhighlight>
 +
</div>
  
// Линейная аппроксимация
 
for (int i = 0; i < N; i++)
 
{
 
if (fabs(mas[i].X) < MAX && fabs(mas[i].Y) < MAX)
 
{
 
s1 += mas[i].X * mas[i].Y;
 
s2 += mas[i].X;
 
s3 += mas[i].X * mas[i].X;
 
s4 += mas[i].Y;
 
}
 
}
 
  
k = (N * s1 - s2 * s4) / (double(N) * s3 - s2 * s2);
+
<div class="mw-collapsible mw-collapsed" style="width:100%" >
b = (s4 - k * s2) / double(N);
+
'''[[Рубинова Раиса]]'''
  
// Задача цвета и ширины линии
+
'''Описание программы''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции.
glColor3d(1, 0.5, 0);
 
glLineWidth(1);
 
// Рисование
 
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>
+
1. Пользователь вводит параметры первой функции
"'''GRAPH.H'''"
+
2. Пользователь вводит параметры второй функции (при этом шаг второй функции меньше шага первой)
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
3. Происходит интерполяция первой функции по второй
/* FILENAME: GRAPH.H
+
4. Пользователь выбирает арифметическую операцию
* LAST UPDATE: 17.01.2016
+
5. При желании пользователь может выполнить аппроксимацию полученного результата
*/
 
  
#ifndef _GRAPH_H_
 
#define _GRAPH_H_
 
  
#define _CRT_SECURE_NO_WARNINGS
+
Скачать можно [http://tm.spbstu.ru/File:Funcc.rar тут].
  
#include <iostream>
 
#include <stdio.h>
 
#include <stdlib.h>
 
#include <math.h>
 
#include <time.h>
 
#include <GL\glut.h>
 
  
#define MAX 100
+
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#ifndef FUNC_H
 +
#define FUNC_H
  
using namespace std;
 
  
/* Useful constants */
+
class Func
const double Threshold = 1e-10;
 
const double Infinity = 1e+10;
 
 
 
/* Vector representation type */
 
class vec
 
 
{
 
{
public:
+
    public:
double X, Y;
+
        Func(double a1, double b1, double c1);
 
+
        virtual ~Func();
/* Default constructor */
+
        void DefFunc ();    // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
vec( void )
+
        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;
 +
};
  
/* Class constructor */
+
#endif // FUNC_H
vec( double A ) : X(A), Y(A)
 
{
 
}
 
  
/* Class constructor */
 
vec( double A, double B ) : X(A), Y(B)
 
{
 
}
 
  
static double R0( void )
 
{
 
return rand() / (double)RAND_MAX;
 
} /* End of 'R0' function */
 
  
static vec Rnd( void )
+
#include "Func.h"
{
+
#include <fstream>
return vec(R0(), R0());
+
#include <iostream>
} /* End of 'Rnd' function */
+
#include <math.h>
  
/* The functions of operations on vectors */
+
Func::Func(double a1, double b1, double c1):a(a1),b(b1),c(c1)  // конструктор для класса Func, создающий объект данного класса, определенный тремя значениями, введенными пользователем
 
+
{
/* Vector = vector function */
+
    double d=(b-a)/c;  // расчет количества элементов, определяющих функцию
vec operator=( vec &B )
+
    j=floor(d);    // созданной целочисленной переменной присваивается значение, равное целой части числа, рассчитанного выше, с округлением в меньшую сторону
{
+
    A = new double [j+1];   // создание массива
X = B.X;
+
}
Y = B.Y;
 
  
return B;
+
Func::~Func()  // деструктор для класса Func
} /* end of 'operator+' function */
+
{
 +
    //dtor
 +
}
  
/* Vector add vector function */
+
void Func::Viv ()  // Функция вывода на экран значений
vec operator+( const vec &B ) const
+
{
{
+
    std::cout << "x ";
return vec(X + B.X, Y + B.Y);
+
    for (int z=0; z<=j; ++z)
} /* end of 'operator+' function */
+
    {
 +
        std::cout << z+1 << " ";
 +
    }
 +
}
  
/* Vector sub vector function */
+
void Func::DefFunc ()  // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
vec operator-( const vec &B ) const
+
{
{
+
    double x;  // создание переменной, используемой для расчета значений функции
return vec(X - B.X, Y - B.Y);
+
    for(int i=0; i<=j; ++i) // создание цикла, рассчитывающего j элементов
} /* end of 'operator-' function */
+
    {
 +
        x =i*c+a;  // задание значения перемнной x, определенной выше
 +
        A[i]=x*x;  // задание значения самой функции (при этом в данной ситуации нам неважно, как именно задается функция, ее значения могут быть определены любым способом, от этого алгоритм не меняется)
 +
        std::cerr << A[i] << " ";   // вывод на экран значения функции
 +
    }
 +
}
  
vec operator-( void ) const
+
void Func::PluFunc (Func D)  // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
{
+
{
return vec(-X, -Y);
+
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
} /* end of 'operator-' function */
+
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
 
+
    {
/* Vector mul number function */
+
        B[i]=B[i]+D.A[i];   // сложение значений двух функций для одного и того же значения переменной
vec operator*( const double N ) const
+
    }
{
+
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
return vec(X * N, Y * N);
+
    {
} /* end of 'operator*' function */
+
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
 
+
    }
/* Vector div number function */
+
    out.close();    // закрытие файла после записи в него значений
vec operator/( const double N ) const
+
    D.Viv();
{
+
    std::cout << std::endl << "y ";
return vec(X / N, Y / N);
+
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
} /* end of 'operator/' function */
+
    {
 
+
        std::cout << B[i] << " ";
/* Vector dot vector function */
+
    }
double operator&( const vec &B ) const
+
}
{
+
void Func::operator +(Func D)  // перегрузка оператора '+'
return double(X * B.X + Y * B.Y);
+
{
} /* end of 'operator&' function */
+
    PluFunc(D);                        // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1+f2 будет работать аналогично записи f1.PluFunc(f2)
 
+
}
vec & operator+=( const vec &B )
+
void Func::MinFunc (Func D)   // функция, линейно вычитающая значения второй функции из значений первой функции
{
+
{
X += B.X;
+
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
Y += B.Y;
+
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
 
+
    {
return *this;
+
        B[i]=B[i]-D.A[i];   // вычитание значений второй функций из значений первой для одного и того же значения переменной
} /* end of 'operator+=' function */
+
    }
 
+
    for (int i=0; i<=D.j; ++i)  // создание цикла, рассчитанного на то же количество раз, что и предыдущий
vec & operator-=( const vec &B )
+
    {
{
+
        out << B[i] << '\n';   // запись значений, полученных в предыдущем цикле, в файл
X -= B.X;
+
    }
Y -= B.Y;
+
    out.close();    // закрытие файла после записи в него значений
 
+
    D.Viv();
return *this;
+
    std::cout << std::endl << "y ";
} /* end of 'operator-=' function */
+
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
 
+
    {
vec & operator*=( const double N )
+
        std::cout << B[i] << " ";
{
+
    }
X *= N;
+
}
Y *= N;
+
void Func::operator -(Func D)   // перегрузка оператора '-'
 
+
{
return *this;
+
    MinFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1-f2 будет работать аналогично записи f1.MinFunc(f2)
} /* end of 'operator*=' function */
+
}
 
+
void Func::UmnFunc (Func D)    // функция, линейно переумножающая значения функций
vec & operator/=( const double N )
+
{
{
+
    std::ofstream out("zap.txt");    // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
X /= N;
+
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
Y /= N;
+
    {
 
+
        B[i]=B[i]*D.A[i];   // умножение значений первой функций на значенийя второй для одного и того же значения переменной
return *this;
+
    }
} /* end of 'operator/=' function */
+
    for (int i=0; i<=D.j; ++i)     // создание цикла, рассчитанного на то же количество раз, что и предыдущий
 
+
    {
double operator!( void ) const
+
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
{
+
    }
return double(X * X + Y * Y);
+
    out.close();    // закрытие файла после записи в него значений
} /* end of 'operator!' function */
+
    D.Viv();
 
+
    std::cout << std::endl << "y ";
/* Access vector components by index function */
+
    for (int i=0; i<=D.j; ++i)   // аналогичный предыдущему цикл, выводящий значения на экран
double operator[]( const int i ) const
+
    {
{
+
        std::cout << B[i] << " ";
switch (i)
+
    }
{
+
}
case 0:
+
void Func::operator *(Func D)  // перегрузка оператора '*'
return double(X);
+
{
case 1:
+
    UmnFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1*f2 будет работать аналогично записи f1.UmnFunc(f2)
return double(Y);
+
}
}
+
void Func::DelFunc (Func D)    // функция, линейно делящая значения первой функци на значения второй функции
} /* 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:
+
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
double MinX, MaxX, Step; // Начальная координата по X; Конечная координата по X; Шаг функции
+
    for(int i=0; i<=D.j; ++i)    // создание цикла, повторяющегося (D.j+1) раз
int N; // Количество точек
+
    {
vec *mas, *Color; // Массивы точек и цветов
+
        B[i]=B[i]/D.A[i];      // деление значений первой функций на значенийя второй для одного и того же значения переменной
 
+
    }
/* Default constructor */
+
    for (int i=0; i<=D.j; ++i)      // создание цикла, рассчитанного на то же количество раз, что и предыдущий
graph( void )
+
    {
{
+
        out << B[i] << '\n';        // запись значений, полученных в предыдущем цикле, в файл
MinX = -10, MaxX = 10, Step = 0.1, N = 200;
+
    }
}
+
    out.close();   // закрытие файла после записи в него значений
 
+
    D.Viv();
/* Class constructor */
+
    std::cout << std::endl << "y ";
graph( double _MinX, double _MaxX, double _Step ) : MinX(_MinX), MaxX(_MaxX), Step(_Step)
+
    for (int i=0; i<=D.j; ++i)      // аналогичный предыдущему цикл, выводящий значения на экран
{
+
    {
N = (int)((MaxX - MinX) / Step);
+
        std::cout << B[i] << " ";
// Выделение памяти
+
    }
mas = new vec[N];
+
}
Color = new vec[N];
+
void Func::operator /(Func D)  // перегрузка оператора '/'
}
+
{
 
+
    DelFunc(D);    // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1/f2 будет работать аналогично записи f1.DelFunc(f2)
/* Load Array of points function */
+
}
void LoadArray( char *FileName );
+
void Func::In (Func D)     // функция, интерполирующая первую функцию по второй
 
+
{
/* Fill mas function */
+
    double l=c/D.c;    // создаем переменную, которой присваиваем значение, обозначающее, во сколько раз один шаг больше другого
void Fill( double(*f)(double) );
+
    c=D.c;      // приводим больший шаг к меньшему значению
 
+
    z=D.j+1;    // ранее созданной переменной присваиваем значение, равное количеству элементов плюс один
/* Draw graph function */
+
    int p=l;   // создаем целочисленную переменную, равную переменной l
void Draw( double(*f)(double) );
+
    B = new double [D.j+2];    // создание массива с количеством элементов D.j+2
 
+
    D.Viv(); std::cout << std::endl << "y ";
/* Draw graph function */
+
    B[0]=A[0]; std::cerr << B[0] << " ";    // присваиваем первому элементу нового массива значение первого элемента старого массива и выводим его на экран
void Draw( void );
+
    int k=0;    // создаем вспомогательную целочисленную переменную
 +
    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();
 +
}
  
/* Interpolation draw graph function */
 
void Interpolation_Draw( double i_step );
 
  
/* Interpolation graph function */
 
graph Interpolation( double i_step );
 
  
/* Sum of 2 graphics function */
+
#include <iostream>
graph operator+( graph &G );
+
#include <fstream>
 +
#include "Func.h"
  
/* Save Array of points function */
+
using namespace std;
void SaveArray( void );
+
double m,n,o, m1, n1, o1;
 +
int a;
 +
char b;
  
/* Approximation of function function */
+
int main()
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>
 
 
 
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 
'''[[Рубинова Раиса]]'''
 
 
 
'''Описание программы''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции.
 
 
 
'''Инструкция к программе''':
 
1. Пользователь вводит параметры первой функции
 
2. Пользователь вводит параметры второй функции (при этом шаг второй функции меньше шага первой)
 
3. Происходит интерполяция первой функции по второй
 
4. Пользователь выбирает арифметическую операцию
 
5. При желании пользователь может выполнить аппроксимацию полученного результата
 
 
 
 
 
Скачать можно [http://tm.spbstu.ru/File:Funcc.rar тут].
 
 
 
 
 
<div class="mw-collapsible-content">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#ifndef FUNC_H
 
#define FUNC_H
 
 
 
 
 
class Func
 
 
{
 
{
     public:
+
     cout << "Enter the beginning, the end and the step of a function." << endl; // ввод опорных значений первой функции: начало, конец, шаг;
        Func(double a1, double b1, double c1);
+
    cin >> m >> n >> o; // считывание значений
        virtual ~Func();
+
    cout << "Enter the beginning, the end and the step of another function." << endl; // ввод опорных значений второй функции: начало, конец, шаг;
        void DefFunc ();   // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
+
    cin >> m1 >> n1 >> o1; // считывание значений
        void PluFunc (Func D); // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
+
    Func F(m,n,o); // создание объекта класса Func, определяющий первую функцию
        void operator +(Func D); // перегрузка оператора '+'
+
    cout << "The first function is" << endl; F.Viv(); cout << endl << "y ";
        void MinFunc (Func D); // функция, линейно вычитающая значения второй функции из значений первой функции
+
    F.DefFunc(); // определение первой функции через создание массива с ее значениями
        void operator -(Func D); // перегрузка оператора '-'
+
    cout << endl;
        void UmnFunc (Func D); // функция, линейно переумножающая значения функций
+
    Func F1(m1,n1,o1); // создание объекта класса Func, определяющий вторую функцию
        void operator *(Func D); // перегрузка оператора '*'
+
    cout << "The second function is" << endl; F1.Viv(); cout << endl << "y ";
        void DelFunc (Func D); // функция, линейно делящая значения первой функци на значения второй функции
+
    F1.DefFunc(); // определение второй функции через создание массива с ее значениями
        void operator /(Func D); // перегрузка оператора '/'
+
    cout << endl;
        void In (Func D);  // функция, интерполирующая первую функцию по второй
+
    cout << "As two functions have different steps, we made the interpolation of the first function." << endl;
        void App (); // функция, аппроксимирующая полученную в результате сложения/вычитания/деления/умножения двух функций функцию
+
    F.In(F1); // линейная интерполяция первой функции по второй
        void Viv (); // Функция вывода на экран значений
+
    cout << endl;
     protected:
+
    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;
     private:
+
    cin >> a;
        double a,b,c;
+
    if (a==1)
        int j,z;
+
    {cout << "Function 1 + function 2 =" << '\n'; F+F1;// сложение двух функций с одинаковым шагом и интервалом
        double *A,*B;
+
    else if (a==2)
};
+
    {cout << "Function 1 - function 2 =" << '\n'; F-F1;// вычитание двух функций с одинаковым шагом и интервалом
 
+
    else if (a==3)
#endif // FUNC_H
+
    {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>
  
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
'''[[Савельева Ольга]]'''
 +
 +
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
 +
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
//Бибилотека необходимая для возможности включения русского языка в консоли
 +
#include <locale.h>
  
#include "Func.h"
+
class fun
#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);    // созданной целочисленной переменной присваивается значение, равное целой части числа, рассчитанного выше, с округлением в меньшую сторону
+
fx - массив с дискретными значениями функции
    A = new double [j+1];   // создание массива
+
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
  
Func::~Func()   // деструктор для класса Func
+
public:
{
+
//Коструктор по умолчанию
    //dtor
+
fun();
}
+
//Конструктор копирования
 +
fun(fun &tmp);
 +
//Деструктор
 +
~fun();
 +
 
 +
//Перегруженные операторы. Ключевое слово 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) const;
 +
const fun& operator=(const fun& right);
 +
 
 +
//Метод считывания из файла
 +
void readFile(const char *path);
 +
//Метод вывода в файл
 +
void writeFile(const char *path);
 +
 
 +
//Метод изменения шага
 +
void changeDx(double newDx);
 +
//Метод вычисления значения в заданной точке
 +
double getX(double x1);
 +
};
  
void Func::Viv ()   // Функция вывода на экран значений
+
//В конструкторе по умолчанию все просто.
 +
fun::fun()
 
{
 
{
    std::cout << "x ";
+
a = b = dx = 0;
    for (int z=0; z<=j; ++z)
+
fx = NULL;
    {
 
        std::cout << z+1 << " ";
 
    }
 
 
}
 
}
  
void Func::DefFunc ()   // функция, определяющая количество элементов j на промежутке от a до b, с шагом c
+
//Конструктор копирования
 +
fun::fun(fun &tmp)
 
{
 
{
    double x;   // создание переменной, используемой для расчета значений функции
+
int i, n;
    for(int i=0; i<=j; ++i) // создание цикла, рассчитывающего j элементов
+
//Копирование свойств объекта tmp в текущий объект
    {
+
a = tmp.a;
        x =i*c+a;   // задание значения перемнной x, определенной выше
+
b = tmp.b;
        A[i]=x*x;   // задание значения самой функции (при этом в данной ситуации нам неважно, как именно задается функция, ее значения могут быть определены любым способом, от этого алгоритм не меняется)
+
dx = tmp.dx;
        std::cerr << A[i] << " ";   // вывод на экран значения функции
+
//Вычисление количества дискретных значений
    }
+
n = (b - a) / dx + 1;
 +
//Выделение необходимой памяти для хранения дискретных значений
 +
fx = new double[n];
 +
//Копирование дискретных значений объекта tmp в текущий объект
 +
for (i = 0; i<n; ++i)
 +
fx[i] = tmp.fx[i];
 
}
 
}
  
void Func::PluFunc (Func D)  // функция, складывающая значения двух функций линейно (то есть значения первой функции при определенной переменной x складывается со значением второй функции при том же значении переменной)
+
//Деструктор
 +
fun::~fun()
 
{
 
{
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
//Освобождение памяти выделенной для массива дискретных значений
    for(int i=0; i<=D.j; ++i)  // создание цикла, повторяющегося (D.j+1) раз
+
if (fx != NULL) delete[] fx;
    {
 
        B[i]=B[i]+D.A[i];  // сложение значений двух функций для одного и того же значения переменной
 
    }
 
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
 
    {
 
        out << B[i] << '\n';   // запись значений, полученных в предыдущем цикле, в файл
 
    }
 
    out.close();    // закрытие файла после записи в него значений
 
    D.Viv();
 
    std::cout << std::endl << "y ";
 
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
 
    {
 
        std::cout << B[i] << " ";
 
    }
 
 
}
 
}
void Func::operator +(Func D)   // перегрузка оператора '+'
+
//Оператор сложения.
 +
const fun fun::operator+(const fun& right) const
 
{
 
{
    PluFunc(D);                         // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1+f2 будет работать аналогично записи f1.PluFunc(f2)
+
//Создание результирующего объекта
 +
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;
 
}
 
}
void Func::MinFunc (Func D)   // функция, линейно вычитающая значения второй функции из значений первой функции
+
 
 +
//Этот оператор аналогичен оператору сложение
 +
const fun fun::operator-(const fun& right) const
 
{
 
{
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
fun result;
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
+
int i, n;
    {
+
result.dx = dx;
        B[i]=B[i]-D.A[i];   // вычитание значений второй функций из значений первой для одного и того же значения переменной
+
result.a = a;
    }
+
result.b = b;
    for (int i=0; i<=D.j; ++i) // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
n = (b - a) / dx + 1;
    {
+
result.fx = new double[n];
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
+
for (i = 0; i<n; ++i)
    }
+
result.fx[i] = fx[i] - right.fx[i];
    out.close();    // закрытие файла после записи в него значений
+
 
    D.Viv();
+
return result;
    std::cout << std::endl << "y ";
 
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
 
    {
 
        std::cout << B[i] << " ";
 
    }
 
 
}
 
}
void Func::operator -(Func D)   // перегрузка оператора '-'
+
 
 +
//Этот оператор аналогичен оператору сложение
 +
const fun fun::operator*(const fun& right) const
 
{
 
{
    MinFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1-f2 будет работать аналогично записи f1.MinFunc(f2)
+
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;
 
}
 
}
void Func::UmnFunc (Func D)     // функция, линейно переумножающая значения функций
+
 
 +
//Этот оператор аналогичен оператору сложение
 +
const fun fun::operator/(const fun& right) const
 
{
 
{
    std::ofstream out("zap.txt");   // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
fun result;
    for(int i=0; i<=D.j; ++i)   // создание цикла, повторяющегося (D.j+1) раз
+
int i, n;
    {
+
result.dx = dx;
        B[i]=B[i]*D.A[i];   // умножение значений первой функций на значенийя второй для одного и того же значения переменной
+
result.a = a;
    }
+
result.b = b;
    for (int i=0; i<=D.j; ++i)     // создание цикла, рассчитанного на то же количество раз, что и предыдущий
+
n = (b - a) / dx + 1;
    {
+
result.fx = new double[n];
        out << B[i] << '\n';    // запись значений, полученных в предыдущем цикле, в файл
+
for (i = 0; i<n; ++i)
    }
+
result.fx[i] = fx[i] / right.fx[i];
    out.close();    // закрытие файла после записи в него значений
+
 
    D.Viv();
+
return result;
    std::cout << std::endl << "y ";
 
    for (int i=0; i<=D.j; ++i)  // аналогичный предыдущему цикл, выводящий значения на экран
 
    {
 
        std::cout << B[i] << " ";
 
    }
 
 
}
 
}
void Func::operator *(Func D)   // перегрузка оператора '*'
+
 
 +
//Оператор присваивания
 +
const fun& fun::operator=(const fun& right)
 
{
 
{
    UmnFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1*f2 будет работать аналогично записи f1.UmnFunc(f2)
+
//Проверка на самоприсваивание
 +
if (this == &right)
 +
//Возвращение в качестве результата текущий объект
 +
return *this;
 +
 
 +
 
 +
int i, n;
 +
//Присваивание свойств объекта right текущему объекту
 +
a = right.a;
 +
b = right.b;
 +
dx = right.dx;
 +
//Вычисление количества дискретных значений
 +
n = (b - a) / dx + 1;
 +
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
 +
if (fx != NULL) delete[] fx;
 +
//Выделение необходимой памяти для хранения дискретных значений
 +
fx = new double[n];
 +
 
 +
//Копирование дискретных значений объекта right в текущий объект
 +
for (i = 0; i<n; ++i)
 +
fx[i] = right.fx[i];
 +
 
 +
//Возвращение в качестве результата текущий объект
 +
return *this;
 
}
 
}
void Func::DelFunc (Func D)    // функция, линейно делящая значения первой функци на значения второй функции
+
 
{
+
/*
    std::ofstream out("zap.txt");  // открытие файла "zap.txt", находящегося в той же папке, что и программа, для работы
+
Метод считывания из файла
    for(int i=0; i<=D.j; ++i)    // создание цикла, повторяющегося (D.j+1) раз
+
path - путь к файлу из которого считывать
    {
+
*/
        B[i]=B[i]/D.A[i];      // деление значений первой функций на значенийя второй для одного и того же значения переменной
+
 
    }
+
void fun::readFile(const char *path)
    for (int i=0; i<=D.j; ++i)      // создание цикла, рассчитанного на то же количество раз, что и предыдущий
 
    {
 
        out << B[i] << '\n';        // запись значений, полученных в предыдущем цикле, в файл
 
    }
 
    out.close();    // закрытие файла после записи в него значений
 
    D.Viv();
 
    std::cout << std::endl << "y ";
 
    for (int i=0; i<=D.j; ++i)      // аналогичный предыдущему цикл, выводящий значения на экран
 
    {
 
        std::cout << B[i] << " ";
 
    }
 
}
 
void Func::operator /(Func D)   // перегрузка оператора '/'
 
 
{
 
{
    DelFunc(D);     // с помощью данного куска программы мы позволяем записать функцию в несколько ином виде: теперь запись f1/f2 будет работать аналогично записи f1.DelFunc(f2)
+
//Открытие файла для считывания
 +
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);
 
}
 
}
void Func::In (Func D)     // функция, интерполирующая первую функцию по второй
+
 
{
+
/*
    double l=c/D.c;    // создаем переменную, которой присваиваем значение, обозначающее, во сколько раз один шаг больше другого
+
Метод вывода в файл
    c=D.c;     // приводим больший шаг к меньшему значению
+
path - путь к файлу в который нужно вывести
    z=D.j+1;   // ранее созданной переменной присваиваем значение, равное количеству элементов плюс один
+
*/
    int p=l;   // создаем целочисленную переменную, равную переменной l
+
 
    B = new double [D.j+2];     // создание массива с количеством элементов D.j+2
+
void fun::writeFile(const char *path)
    D.Viv(); std::cout << std::endl << "y ";
+
{
    B[0]=A[0]; std::cerr << B[0] << " ";   // присваиваем первому элементу нового массива значение первого элемента старого массива и выводим его на экран
+
//Открытие файла для вывода
    int k=0;    // создаем вспомогательную целочисленную переменную
+
FILE *out = fopen(path, "w");
    for (int i=0; i<=j; i+=p)   // создаем цикл, рассчитанный на j повторов через p
+
int i, n;
    {
+
double x = a;
        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)-ому элементу значение, выссчитанного по формуле через заданные изначально значения и вывод егона экран
+
n = (b - a) / dx + 1;
        B[i+p]=A[k+1];     // присваивание значению (i+p)-ого элемента нового массива значения (k+1)-ого элемента старого массива
+
//Вывод информации о отрезке и шаге в файл
        std::cerr << B[i+p] << " ";    // вывод высчитанного выше значения на экран
+
fprintf(out, "[%.5lf, %.5lf] dx=%.5lf\n", a, b, dx);
        k=k+1; // увеличение k на единицу
+
//Последовательный вывод пары (точка, значение в точке) в файл
    }
+
for (i = 0; i<n; ++i, x += dx)
 +
fprintf(out, "x=%.5lf f(x)=%.5lf\n", x, fx[i]);
 +
//Закрытие файла
 +
fclose(out);
 
}
 
}
void Func::App ()   // функция, аппроксимирующая полученную в результате сложения/вычитания/деления/умножения двух функций функцию
+
 
 +
/*
 +
Метод изменения величины шага
 +
*/
 +
void fun::changeDx(double newDx)
 
{
 
{
    double d=0,e=0,f=0,g=0;     // создание переменных
+
int i, j, n, newN;
    double k=0,l=0;     // создание переменных
+
double *newFx, x, newX, x1, y1, x2, y2, K, B;
    for (int i=0; i<z; ++i)    // цикл, который высчитывает сумму произведений зависимой и независимой переменных
+
//Вычисление количества старых дискретных значений
        {d=i*B[i]+d;}
+
n = (b - a) / dx + 1;
    for (int i=0; i<z; ++i)    // цикл, который высчитывает сумму всех значений функции
+
//Вычисление количества новых дискретных значений
        {e=B[i]+e;}
+
newN = (b - a) / newDx + 1;
    for (int i=0; i<z; ++i)     // цикл, высчитывающий сумму всех аргументов функции
+
//Выделение памяти под новые дискретные значения
        {f=i+f;}
+
newFx = new double[newN];
    for (int i=0; i<z; ++i)     // цикл, высчитывающий сумму квадратов всех аргументов функции
+
//Определение первой точки в которой вычисляется новое дискретное значение
        {g=i*i+g;}
+
newX = a;
    k=(z*d-f*e)/(z*g-f*f);     // расчет углового коэффициента прямой
+
//Переменная которая бежит по старым дискретным значениям
    l=(e-k*f)/z;       // расчет свободного коэффициента прямой
+
i = 0;
    std::cout << "y=" << k << "x+" << l;   // вывод уравнения полученной прямой на экран
+
//Определение первой точки в которой вычисляется старое дискретное значение
    std::ofstream out("ap.txt");       // запись полученного уравнения в файл
+
x = a;
    {
+
//Цикл для формирования новых дискретных значений
        out << "y=" << k << "x+" << l;
+
for (j = 0; j<newN; ++j, newX += newDx)
    }
+
{
    out.close();
+
//В цикле находим отрезок где лежит точка в которой нужно вычислить новое дискретное значение
}
+
for (; i<n - 1; ++i, x += dx)
 
+
//Если без eps, то сравнения такие: x<=newX<=x+dx
 
+
if ((newX - x>-eps) && ((x+dx) - newX>-eps))
 
+
{
#include <iostream>
+
//Линейная интерполяция
#include <fstream>
+
x1 = x;
#include "Func.h"
+
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;
 +
}
  
using namespace std;
+
/*
double m,n,o, m1, n1, o1;
+
Метод вычисляет значение в точке xAns с помощью линейной интерполяции.
int a;
+
*/
char b;
+
double fun::getX(double xAns)
 
 
int main()
 
 
{
 
{
    cout << "Enter the beginning, the end and the step of a function." << endl; // ввод опорных значений первой функции: начало, конец, шаг;
+
int i, n;
    cin >> m >> n >> o; // считывание значений
+
double x, x1, y1, x2, y2, K, B;
    cout << "Enter the beginning, the end and the step of another function." << endl; // ввод опорных значений второй функции: начало, конец, шаг;
+
x = a;
    cin >> m1 >> n1 >> o1; // считывание значений
+
//Вычисление количества дискретных значений
    Func F(m,n,o); // создание объекта класса Func, определяющий первую функцию
+
n = (b - a) / dx + 1;
    cout << "The first function is" << endl; F.Viv(); cout << endl << "y ";
+
//Ищем отрезок в котором лежит точка xAns
    F.DefFunc(); // определение первой функции через создание массива с ее значениями
+
for (i = 0; i<n - 1; ++i, x += dx)
    cout << endl;
+
{
    Func F1(m1,n1,o1); // создание объекта класса Func, определяющий вторую функцию
+
//Если без eps, то сравнения такие: x<=newX<=x+dx
    cout << "The second function is" << endl; F1.Viv(); cout << endl << "y ";
+
if (((x+dx) - xAns>-eps) && (xAns - x>-eps))
    F1.DefFunc(); // определение второй функции через создание массива с ее значениями
+
{
    cout << endl;
+
//Линейная интерполяция
    cout << "As two functions have different steps, we made the interpolation of the first function." << endl;
+
x1 = x;
    F.In(F1); // линейная интерполяция первой функции по второй
+
x2 = x + dx;
    cout << endl;
+
y1 = fx[i];
    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;
+
y2 = fx[i + 1];
    cin >> a;
+
K = (y2 - y1) / (x2 - x1);
    if (a==1)
+
B = (y2*x1 - y1*x2) / (x1 - x2);
    {cout << "Function 1 + function 2 =" << '\n'; F+F1;}  // сложение двух функций с одинаковым шагом и интервалом
+
//Вычисления значения функции в заданной точке с помощью линейной интерполяции
    else if (a==2)
+
return K*xAns + B;
    {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>
+
int main()
</div>
+
{
 +
//Включение поддержки русского языка в консоли
 +
setlocale(LC_ALL, "Russian");
 +
//Объявление трех переменных типа fun
 +
fun a, b, c;
 +
//Считывания первых дискретных значений из файла inputA.txt
 +
a.readFile("inputA.txt");
 +
//Считывания вторых дискретных значений из файла inputB.txt
 +
b.readFile("inputB.txt");
 +
 
 +
//Первая функция
 +
a.writeFile("outputA.txt");
 +
//Вторая функция
 +
b.writeFile("outputB.txt");
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
c = a + b;
'''[[Савельева Ольга]]'''
+
//Результат сложения двух функций
+
c.writeFile("outputAaddB.txt");
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале. Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать методом наименьших квадратов. Данные берутся из файла. При считывании с файла сначала указывается отрезок, потом величина, а потом дискретные значения.
 
<div class="mw-collapsible-content">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
#include <stdio.h>
 
#include <stdlib.h>
 
//Бибилотека необходимая для возможности включения русского языка в консоли
 
#include <locale.h>
 
  
class fun
 
{
 
/*
 
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:
+
c = a - b;
//Коструктор по умолчанию
+
//Результат вычитания второй функции из первой
fun();
+
c.writeFile("outputAsubB.txt");
//Конструктор копирования
 
fun(fun &tmp);
 
//Деструктор
 
~fun();
 
  
//Перегруженные операторы. Ключевое слово const в конце означает, что объект от которого вызвается метод не изменяется
+
c = a*b;
const fun operator+(const fun& right) const;
+
//Результат умножения двух функций
const fun operator-(const fun& right) const;
+
c.writeFile("outputAmultiB.txt");
const fun operator*(const fun& right) const;
 
const fun operator/(const fun& right) const;
 
const fun& operator=(const fun& right);
 
  
//Метод считывания из файла
+
c = a / b;
void readFile(const char *path);
+
//Результат деления первой функции на вторую
//Метод вывода в файл
+
c.writeFile("outputAdivB.txt");
void writeFile(const char *path);
 
  
//Метод изменения шага
+
//У первой функции изменили шаг на 0.5
void changeDx(double newDx);
+
a.changeDx(0.5);
//Метод вычисления значения в заданной точке
+
//Вывели её дискретные значения
double getX(double x1);
+
a.writeFile("outputChangeDx.txt");
};
 
  
//В конструкторе по умолчанию все просто.
+
//Функция, которая аппроксимирует её кусочно линейная.
fun::fun()
+
//Для примера нашли значение аппроксимируещей функции в точке не совпадающей с дискретными значениями.
{
+
printf("Значение в точке 1.8 первой функции %.5lf\n", a.getX(1.8));
a = b = dx = 0;
 
fx = NULL;
 
}
 
  
//Конструктор копирования
+
//Нужно чтобы окно консоли автоматически не закрылось
fun::fun(fun &tmp)
+
system("pause");
{
+
return 0;
int i, n;
 
//Копирование свойств объекта tmp в текущий объект
 
a = tmp.a;
 
b = tmp.b;
 
dx = tmp.dx;
 
//Вычисление количества дискретных значений
 
n = (b - a) / dx + 1;
 
//Выделение необходимой памяти для хранения дискретных значений
 
fx = new double[n];
 
//Копирование дискретных значений объекта tmp в текущий объект
 
for (i = 0; i<n; ++i)
 
fx[i] = tmp.fx[i];
 
 
}
 
}
 +
</syntaxhighlight>
 +
</div>
  
//Деструктор
 
fun::~fun()
 
{
 
//Освобождение памяти выделенной для массива дискретных значений
 
if (fx != NULL) delete[] fx;
 
}
 
//Оператор сложения.
 
const fun fun::operator+(const fun& right) const
 
{
 
//Создание результирующего объекта
 
fun result;
 
int i, n;
 
//Копирование свойств в результирующий объект
 
result.dx = dx;
 
result.a = a;
 
result.b = b;
 
//Вычисление количества дискретных значений
 
n = (b - a) / dx + 1;
 
//Выделение необходимой памяти для хранения дискретных значений
 
result.fx = new double[n];
 
//Вычисление дискретных значений результирующего объекта
 
for (i = 0; i<n; ++i)
 
result.fx[i] = fx[i] + right.fx[i];
 
  
//Возвращение результата
 
return result;
 
}
 
  
//Этот оператор аналогичен оператору сложение
+
Скачать можно [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 здесь]
const fun fun::operator-(const fun& right) const
+
 
{
+
 
fun result;
+
'''[[Сенников Иван]]'''
int i, n;
+
result.dx = dx;
+
'''Суть программы:''' Программы позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
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;
+
'''Идея:''' Класс работы с функциями содержит такие функции как функция введения данных функции - ее создание, перегрузки оператора сложения, линейных интерполяции и аппроксимации, выделения и освобождения памяти. Линейная интерполяция написана с помощью теории аналитической геометрии на плоскости, а линейная аппроксимация с помощью метода наименьших квадратов.
}
 
  
//Этот оператор аналогичен оператору сложение
+
'''Инструкция:''' Программа выполнена в виде меню на английском языке: пользователю будет предоставлена возможность выйти из программы, создать обе функции, а также поработать с ними в индивидуальном порядке и сложить две уже существующие функции. Комментарии к программе написаны также на английском языке.
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;
+
Ссылка для скачиваний: [http://tm.spbstu.ru/Файл:Func.zip здесь].
}
 
  
//Этот оператор аналогичен оператору сложение
 
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;
+
'''[[Степанянц Степан]]'''
}
+
 +
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.Данныеберутся из файла.
 +
<div class="mw-collapsible-content">
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
  
//Оператор присваивания
 
const fun& fun::operator=(const fun& right)
 
{
 
//Проверка на самоприсваивание
 
if (this == &right)
 
//Возвращение в качестве результата текущий объект
 
return *this;
 
  
 
+
#include <iostream>
int i, n;
+
#include <vector>
//Присваивание свойств объекта right текущему объекту
+
#include <math.h>
a = right.a;
+
#include <fstream>
b = right.b;
+
#include <stdio.h>
dx = right.dx;
+
#include <string>
//Вычисление количества дискретных значений
+
#include <time.h>
n = (b - a) / dx + 1;
+
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
+
using namespace std;
if (fx != NULL) delete[] fx;
+
//Выделение необходимой памяти для хранения дискретных значений
+
class func {
fx = new double[n];
+
    vector <double> vals;
 
+
    double a, b, step, sz;
//Копирование дискретных значений объекта right в текущий объект
+
for (i = 0; i<n; ++i)
+
public:
fx[i] = right.fx[i];
+
    func (string fil) { //конструктор для ввода функции из файла
 
+
        ifstream f(fil.c_str());
//Возвращение в качестве результата текущий объект
+
        double a, b, step, y;
return *this;
+
        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++) {
path - путь к файлу из которого считывать
+
            f >> y;
*/
+
            this->vals.push_back(y); //считываем и записываем значения из файла
 
+
        }
void fun::readFile(const char *path)
+
        f.close();
{
+
    }
//Открытие файла для считывания
+
    func () {} //еще один конструктор
FILE *in = fopen(path, "r");
+
    func operator + (func a) { // эта и ближайшие четыре метода -- калькулятор функций
int i, n;
+
        func f = *new func(); //создаем новый экземпляр класса, ответ
//Считывание границ отрезка и шага из файла
+
        for (int i = 0; i < sz; i++) {
fscanf(in, "%lf%lf%lf", &a, &b, &dx);
+
            f.vals.push_back(this->vals[i] + a.vals[i]); // складываем покоординатно
//Вычисление количества дискретных значений
+
        }
n = (b - a) / dx + 1;
+
        f.step = a.step; // копируем все значения в ответ (возможно, это можно сделать гораздо проще и не писать 4*4 строк но почему-то ничего умнее я не придумал)
//Если в текущем объекте есть какие-то дискретные значения, то их нужно удалить. То есть удалить память выделенную под них
+
        f.a = a.a;
if (fx != NULL) delete[] fx;
+
        f.b = a.b;
//Выделение необходимой памяти для хранения дискретных значений
+
        f.sz = a.sz;
fx = new double[n];
+
        return f;
//Считывание дискретных значений из файла
+
    }//Перегрузки операторов
for (i = 0; i<n; ++i) fscanf(in, "%lf", &fx[i]);
+
    func operator - (func a) {
//Закрытие файла
+
        func f = *new func();                  
fclose(in);
+
        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;
path - путь к файлу в который нужно вывести
+
        f.b = a.b;
*/
+
        f.sz = a.sz;
 
+
        return f;
void fun::writeFile(const char *path)
+
    }
{
+
    func operator * (func a) {
//Открытие файла для вывода
+
        func f = *new func();
FILE *out = fopen(path, "w");
+
        for (int i = 0; i < a.sz; i++) {
int i, n;
+
            f.vals.push_back(this->vals[i] * a.vals[i]);   //умножение
double x = a;
+
        }
//Вычисление количества дискретных значений
+
        f.step = a.step;
n = (b - a) / dx + 1;
+
        f.a = a.a;
//Вывод информации о отрезке и шаге в файл
+
        f.b = a.b;
fprintf(out, "[%.5lf, %.5lf] dx=%.5lf\n", a, b, dx);
+
        f.sz = a.sz;
//Последовательный вывод пары (точка, значение в точке) в файл
+
        return f;
for (i = 0; i<n; ++i, x += dx)
+
    }
fprintf(out, "x=%.5lf f(x)=%.5lf\n", x, fx[i]);
+
    func operator / (func a) {
//Закрытие файла
+
        func f = *new func();
fclose(out);
+
        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;
void fun::changeDx(double newDx)
+
        f.sz = a.sz;
{
+
        return f;
int i, j, n, newN;
+
    }
double *newFx, x, newX, x1, y1, x2, y2, K, B;
+
//Вычисление количества старых дискретных значений
+
    pair<double, double> approx() { //аппроксимация.
n = (b - a) / dx + 1;
+
        double mid = 0;
//Вычисление количества новых дискретных значений
+
        for (int i = 0; i < this->sz; i++) {
newN = (b - a) / newDx + 1;
+
            mid += this->a + i * this->step;
//Выделение памяти под новые дискретные значения
+
        }
newFx = new double[newN];
+
        mid /= this->sz;
//Определение первой точки в которой вычисляется новое дискретное значение
+
        double d = 0;
newX = a;
+
        for (int i = 0; i < this->sz; i++) {
//Переменная которая бежит по старым дискретным значениям
+
            d += pow((this->a + i * this->step - mid), 2.);
i = 0;
+
        }
//Определение первой точки в которой вычисляется старое дискретное значение
+
        double a = 0;
x = a;
+
        for (int i = 0; i < this->sz; i++) {
//Цикл для формирования новых дискретных значений
+
            a += (this->a + i * this->step - mid) * this->vals[i];
for (j = 0; j<newN; ++j, newX += newDx)
+
        }
{
+
        a /= d;
//В цикле находим отрезок где лежит точка в которой нужно вычислить новое дискретное значение
+
        double midy = 0;
for (; i<n - 1; ++i, x += dx)
+
        for (int i = 0; i < this->sz; i++) {
//Если без eps, то сравнения такие: x<=newX<=x+dx
+
            midy += this->vals[i];
if ((newX - x>-eps) && ((x+dx) - newX>-eps))
+
        }
{
+
        midy /= this->sz;
//Линейная интерполяция
+
        double c = midy - a * mid;
x1 = x;
+
        return {a, c}; //{x,y} возвращает пару (на самом деле не пару а просто какой-нибудь объект) с первым значением x и вторым y
x2 = x + dx;
+
    }
y1 = fx[i];
+
y2 = fx[i + 1];
+
    func inter(double step) {
K = (y2 - y1) / (x2 - x1);
+
        func f = *new func(); //ответ
B = (y2*x1 - y1*x2) / (x1 - x2);
+
        double curr2, curr1;
//Вычисления значения в точке с помощью линейной интерполяции
+
        int j = 0;
newFx[j] = newX*K + B;
+
        f.a = this->a, f.b = this->b, f.step = step, f.sz = (int)((b - a) / step + 1);
//Выход из цикла по i
+
        for (int i = 0; i < f.sz; i++) {
break;
+
            curr2 = a + i * step;
}
+
            curr1 = a + j * this->step;
}
+
            while (curr1 + this->step <= curr2) {
//Смена величины шага на новый
+
                j++, curr1 += this->step;
dx = newDx;
+
            }
//Удаление старых дискретных значений
+
            if (curr1 == curr2) {
delete[] fx;
+
                f.vals.push_back(this->vals[j]);
//Присвоение текущему объекту новых дискретных значений
+
                continue;
fx = newFx;
+
            }
}
+
            f.vals.push_back((this->vals[j + 1] - this->vals[j]) * (curr2 - curr1) / this->step + this->vals[j]);//я хз, тут видимо какая-то математика
 
+
        }
/*
+
        return f;
Метод вычисляет значение в точке xAns с помощью линейной интерполяции.
+
    }
*/
+
    void write(string fil) { //запись. чтобы записать не в файл, а в консоль вывести, надо передать "-1"
double fun::getX(double xAns)
+
        ofstream f(fil.c_str());
{
+
        if (fil != "-1") {
int i, n;
+
            f << this->a << ' ' << this->b << ' ' << this->step << '\n';
double x, x1, y1, x2, y2, K, B;
+
        }
x = a;
+
        else
//Вычисление количества дискретных значений
+
            cout << this->a << ' ' << this->b << ' ' << this->step << '\n';
n = (b - a) / dx + 1;
+
        for (int i = 0; i < sz; i++) {
//Ищем отрезок в котором лежит точка xAns
+
            if (fil != "-1")
for (i = 0; i<n - 1; ++i, x += dx)
+
                f << this->vals[i] << '\n';
{
+
            else
//Если без eps, то сравнения такие: x<=newX<=x+dx
+
                cout << this->vals[i] << '\n';
if (((x+dx) - xAns>-eps) && (xAns - x>-eps))
+
        }
{
+
        f.close();
//Линейная интерполяция
+
x1 = x;
+
    }
x2 = x + dx;
+
};
y1 = fx[i];
+
y2 = fx[i + 1];
+
int main() {
K = (y2 - y1) / (x2 - x1);
+
    string fil;
B = (y2*x1 - y1*x2) / (x1 - x2);
+
    cout << "Input the file name with the function values\n";
//Вычисления значения функции в заданной точке с помощью линейной интерполяции
+
    cin >> fil;
return K*xAns + B;
+
    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>
  
int main()
 
{
 
//Включение поддержки русского языка в консоли
 
setlocale(LC_ALL, "Russian");
 
//Объявление трех переменных типа fun
 
fun a, b, c;
 
//Считывания первых дискретных значений из файла inputA.txt
 
a.readFile("inputA.txt");
 
//Считывания вторых дискретных значений из файла inputB.txt
 
b.readFile("inputB.txt");
 
  
//Первая функция
+
<br>'''[[Нарядчиков Александр]]'''<br>
a.writeFile("outputA.txt");
+
'''Инструкция:''' Пользователю достаточно просто запустить программу.<br>
//Вторая функция
+
'''Описание программы:''' В окне рисуются графики с разным шагом, количеством точек, начальными и конечными координатами, по клавише 'G' происходит их кубическая интерполяция, также рисуется график их суммы. По клавише 'S' можно сохранить полученный график в текстовый документ в виде координат его точек. По клавише 'L' можно загрузить график из текстового документа, и он появится в окне программы. Также происходит линейная аппроксимация графика суммы, и график аппроксимации рисуется на экран.<br>
b.writeFile("outputB.txt");
+
'''Описание алгоритма:''' Вся графика написана с помощью библиотек OpenGL и GLUT. Кубическая интерполяция написана с помощью кривых Безье(интерполяция по четырем точкам - кубическая кривая). При сложение двух графиков происходит их интерполяция, для приведения их к общему шагу. Линейная аппроксимация написана с помощью метода наименьших квадратов.<br>
 +
<div class="mw-collapsible mw-collapsed" style="width:100%" >
 +
"'''T05GRAPH.CPP'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: T05GRAPH.CPP
 +
* LAST UPDATE: 17.01.2016
 +
*/
 +
 
 +
#include "GRAPH.H"
  
c = a + b;
+
/* Глобальные переменные */
//Результат сложения двух функций
+
// Глобальная переменная, хранящая время в секундах с момента старта программы
c.writeFile("outputAaddB.txt");
+
double SyncTime;
 +
// Глобальные переменные для отслеживания нажатия клавиш
 +
bool IsGraph, IsSave, IsLoad, IsLoaded;
  
 +
/* Timer function */
 +
// Подсчет времени
 +
void Timer( void )
 +
{
 +
long t;
 +
static long StartTime = -1;
  
c = a - b;
+
t = clock();
//Результат вычитания второй функции из первой
+
if (StartTime == -1)
c.writeFile("outputAsubB.txt");
+
StartTime = t;
 +
SyncTime = (double)(t - StartTime) / CLOCKS_PER_SEC;
 +
} /* End of 'Timer' function */
  
c = a*b;
+
/* Display function */
//Результат умножения двух функций
+
// Стандартная функция, вызываемая при перерисовке окна
c.writeFile("outputAmultiB.txt");
+
void Display( void )
 +
{
 +
graph G1(-15, 15, 0.1), G2(2, 10, 0.4), G3, G4;
  
c = a / b;
+
// Запуск времени
//Результат деления первой функции на вторую
+
Timer();
c.writeFile("outputAdivB.txt");
 
  
//У первой функции изменили шаг на 0.5
+
// Установка цвета закраски фона в белый
a.changeDx(0.5);
+
glClearColor(1, 1, 1, 1);
//Вывели её дискретные значения
+
// Очищаем цветовой буфер для создания нового изображения
a.writeFile("outputChangeDx.txt");
+
glClear(GL_COLOR_BUFFER_BIT);
  
//Функция, которая аппроксимирует её кусочно линейная.
+
glLoadIdentity();
//Для примера нашли значение аппроксимируещей функции в точке не совпадающей с дискретными значениями.
+
glScaled(0.1 / (1366 / 768.0), 0.1, 0.1);
printf("Значение в точке 1.8 первой функции %.5lf\n", a.getX(1.8));
 
  
//Нужно чтобы окно консоли автоматически не закрылось
+
// Отрисовка осей X и Y
system("pause");
+
glBegin(GL_LINE_STRIP);
return 0;
 
}
 
</syntaxhighlight>
 
</div>
 
  
 +
glColor3d(0, 0, 1);
 +
glVertex2d(0, -1000);
 +
glVertex2d(0, 1000);
  
 +
glColor3d(1, 0, 0);
 +
glVertex2d(-1000, 0);
 +
glVertex2d(1000, 0);
  
Скачать можно [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 здесь]
+
glEnd();
 
 
  
'''[[Сенников Иван]]'''
+
/* Отрисовка графиков */
+
// Отрисовка первого графика и его интерполяция по клавише "G"
'''Суть программы:''' Программы позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
+
G1.Draw(sin);
 +
if (IsGraph == 1)
 +
G1.Interpolation_Draw(1.0 / 32);
  
'''Идея:''' Класс работы с функциями содержит такие функции как функция введения данных функции - ее создание, перегрузки оператора сложения, линейных интерполяции и аппроксимации, выделения и освобождения памяти. Линейная интерполяция написана с помощью теории аналитической геометрии на плоскости, а линейная аппроксимация с помощью метода наименьших квадратов.
+
// Отрисовка второго графика и его интерполяция по клавише "G"
 +
G2.Draw(log);
 +
if (IsGraph == 1)
 +
G2.Interpolation_Draw(1.0 / 32);
  
'''Инструкция:''' Программа выполнена в виде меню на английском языке: пользователю будет предоставлена возможность выйти из программы, создать обе функции, а также поработать с ними в индивидуальном порядке и сложить две уже существующие функции. Комментарии к программе написаны также на английском языке.
+
// Отрисовка графика суммы для первого и второго графиков
 
+
G3 = G2 + G1;
Ссылка для скачиваний: [http://tm.spbstu.ru/Файл:Func.zip здесь].
+
glColor3d(0, 1, 0);
 
+
G3.Draw();
 
+
// Аппроксимация графика суммы
'''[[Степанянц Степан]]'''
+
G3.Approximation();
 
'''Краткое описание алгоритма :''' Программа создаёт и хранит значения двух функций с одинаковом шагом и заданных на одинаковом интервале.Методы позволяют сложить эти две функции,интерполировать одну из них по заданному шагу или апроксимировать,методом наименьших квадратов.Данныеберутся из файла.
 
<div class="mw-collapsible-content">
 
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
  
 +
// Сохранение графика по клавише "S"
 +
if (IsSave == 1)
 +
{
 +
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;
 +
}
  
#include <iostream>
+
// Чистка памяти
#include <vector>
+
delete[] G1.mas;
#include <math.h>
+
delete[] G1.Color;
#include <fstream>
+
delete[] G2.mas;
#include <stdio.h>
+
delete[] G2.Color;
#include <string>
+
delete[] G3.mas;
#include <time.h>
+
delete[] G3.Color;
+
delete[] G4.mas;
using namespace std;
+
delete[] G4.Color;
+
 
class func {
+
glFinish();
    vector <double> vals;
+
// Копируем вторичный буфер в окно
    double a, b, step, sz;
+
glutSwapBuffers();
+
// Вызываем функцию обновления кадра
public:
+
glutPostRedisplay();
    func (string fil) { //конструктор для ввода функции из файла
+
} /* End of 'Display' function */
        ifstream f(fil.c_str());
+
 
        double a, b, step, y;
+
/* Keyboard function */
        f >> a >> b >> step; //вводим основные значения из файла
+
// Стандартная функция, вызываемая при нажатие клавиш на клавиатуре
        this->step = step;
+
void Keyboard( unsigned char Key, int X, int Y )
        this->sz = (int)((b - a) / step + 1); //считаем размер
+
{
        this->a = a, this->b = b;
+
// Выход из программы
        for (int i = 0; i < this->sz; i++) {
+
if (Key == 27)
            f >> y;
+
exit(0);
            this->vals.push_back(y); //считываем и записываем значения из файла
+
// Отрисовка интерполированных графиков
        }
+
else if ((Key == 'G') || (Key == 'g'))
        f.close();
+
IsGraph = !IsGraph;
    }
+
// Сохранение графика суммы в файл
    func () {} //еще один конструктор
+
else if ((Key == 'S') || (Key == 's'))
    func operator + (func a) { // эта и ближайшие четыре метода -- калькулятор функций
+
IsSave = !IsSave;
        func f = *new func(); //создаем новый экземпляр класса, ответ
+
// Загрузка графика из файла
        for (int i = 0; i < sz; i++) {
+
else if ((Key == 'L') || (Key == 'l'))
            f.vals.push_back(this->vals[i] + a.vals[i]); // складываем покоординатно
+
IsLoad = !IsLoad;
        }
+
// Открытие программы в полном экране
        f.step = a.step; // копируем все значения в ответ (возможно, это можно сделать гораздо проще и не писать 4*4 строк но почему-то ничего умнее я не придумал)
+
else if ((Key == 'F') || (Key == 'f'))
        f.a = a.a;
+
glutFullScreen();
        f.b = a.b;
+
} /* End of 'Keyboard' function */
        f.sz = a.sz;
+
 
        return f;
+
/* Main function */
    }//Перегрузки операторов
+
int main( int argc, char *argv[] )
    func operator - (func a) {
+
{
        func f = *new func();                  
+
// Инициализации OpenGL и GLUT
        for (int i = 0; i < a.sz; i++) {
+
glutInit(&argc, argv);
            f.vals.push_back(this->vals[i] - a.vals[i]);   //Вычитание
+
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
        }
+
 
        f.step = a.step;
+
// Задача размеров и позиции окна
        f.a = a.a;
+
glutInitWindowPosition(0, 0);
        f.b = a.b;
+
glutInitWindowSize(500, 500);
        f.sz = a.sz;
+
// Создание окна
        return f;
+
glutCreateWindow("T05GRAPH");
    }
+
 
    func operator * (func a) {
+
// Установка функций 'обратного вызова'
        func f = *new func();
+
glutDisplayFunc(Display);
        for (int i = 0; i < a.sz; i++) {
+
glutKeyboardFunc(Keyboard);
            f.vals.push_back(this->vals[i] * a.vals[i]);  //умножение
+
 
        }
+
// Запускаем основной цикл построения
        f.step = a.step;
+
glutMainLoop();
        f.a = a.a;
+
return 0;
        f.b = a.b;
+
} /* End of 'main' function */
        f.sz = a.sz;
+
 
        return f;
+
/* END OF 'T05GRAPH.CPP' FILE */
    }
+
</syntaxhighlight>
    func operator / (func a) {
+
"'''GRAPH.CPP'''"
        func f = *new func();
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
        for (int i = 0; i < a.sz; i++) {
+
/* FILENAME: GRAPH.CPP
            f.vals.push_back(this->vals[i] / a.vals[i]);    // Деление
+
* LAST UPDATE: 17.01.2016
        }
+
*/
        f.step = a.step;
+
 
        f.a = a.a;
+
#include "GRAPH.H"
        f.b = a.b;
+
 
        f.sz = a.sz;
+
/* Load Array of points function */
        return f;
+
// Загрузка графика из файла по точкам
    }
+
void graph::LoadArray( char *FileName )
+
{
    pair<double, double> approx() { //аппроксимация.
+
// Создание указателя на тип FILE
        double mid = 0;
+
FILE *F;
        for (int i = 0; i < this->sz; i++) {
+
 
            mid += this->a + i * this->step;
+
// Создание файла и открытие его в режиме чтения
        }
+
fopen_s(&F, FileName, "rt");
        mid /= this->sz;
+
 
        double d = 0;
+
// Количество точек
        for (int i = 0; i < this->sz; i++) {
+
fscanf(F, "%d", &N);
            d += pow((this->a + i * this->step - mid), 2.);
+
// Шаг функции
        }
+
fscanf(F, "%lf", &Step);
        double a = 0;
+
// Начальная координата по X
        for (int i = 0; i < this->sz; i++) {
+
fscanf(F, "%lf", &MinX);
            a += (this->a + i * this->step - mid) * this->vals[i];
+
// Конечная координата по X
        }
+
fscanf(F, "%lf", &MaxX);
        a /= d;
+
        double midy = 0;
+
// Выделение памяти под массив точек
        for (int i = 0; i < this->sz; i++) {
+
mas = new vec[N];
            midy += this->vals[i];
+
 
        }
+
// Заполнение массива точек из файла
        midy /= this->sz;
+
for (int i = 0; i < N; ++i)
        double c = midy - a * mid;
+
{
        return {a, c}; //{x,y} возвращает пару (на самом деле не пару а просто какой-нибудь объект) с первым значением x и вторым y
+
// Заполнение по X
    }
+
fscanf(F, "%lf", &mas[i].X);
+
// Заполнение по Y
    func inter(double step) {
+
fscanf(F, "%lf", &mas[i].Y);
        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);
+
fclose(F);
        for (int i = 0; i < f.sz; i++) {
+
} /* End of 'LoadArray' function */
            curr2 = a + i * step;
+
 
            curr1 = a + j * this->step;
+
/* Fill mas function */
            while (curr1 + this->step <= curr2) {
+
// Заполнение массива координат точек с цветом
                j++, curr1 += this->step;
+
void graph::Fill( double(*f)(double) )
            }
+
{
            if (curr1 == curr2) {
+
// Выделение памяти под массив точек
                f.vals.push_back(this->vals[j]);
+
mas = new vec[N];
                continue;
+
// Выделение памяти под массив цветов
            }
+
Color = new vec[N];
            f.vals.push_back((this->vals[j + 1] - this->vals[j]) * (curr2 - curr1) / this->step + this->vals[j]);//я хз, тут видимо какая-то математика
+
 
        }
+
// Заполнение массивов
        return f;
+
for (int i = 0; i < N; i++)
    }
+
{
    void write(string fil) { //запись. чтобы записать не в файл, а в консоль вывести, надо передать "-1"
+
mas[i] = vec(MinX + i * Step, f(MinX + i * Step));
        ofstream f(fil.c_str());
+
Color[i] = vec::Rnd();
        if (fil != "-1") {
+
}
            f << this->a << ' ' << this->b << ' ' << this->step << '\n';
+
} /* End of 'Fill' function */
        }
+
 
        else
+
/* Draw graph function */
            cout << this->a << ' ' << this->b << ' ' << this->step << '\n';
+
// Рисование заполненного графика на экран
        for (int i = 0; i < sz; i++) {
+
void graph::Draw( void )
            if (fil != "-1")
+
{
                f << this->vals[i] << '\n';
+
  // Задача размер точки
            else
+
glPointSize(1);
                cout << this->vals[i] << '\n';
+
// Рисование
        }
+
glBegin(GL_POINTS);
        f.close();
+
for (int i = 0; i < N; i++)
+
glVertex2d(mas[i].X, mas[i].Y);
    }
+
glEnd();
};
+
} /* End of 'Draw' function */
+
 
int main() {
+
/* Draw graph function */
    string fil;
+
// Рисование не заполненного еще графика на экран
    cout << "Input the file name with the function values\n";
+
void graph::Draw( double(*f)(double) )
    cin >> fil;
+
{
    func f = *new func(fil);
+
// Заполнение массива
    int a;
+
graph::Fill(f);
    char ch;
+
 
    double st;
+
// Задача цвета и размера точки
    while (true) {
+
glColor3d(0, 0, 0);
        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";
+
glPointSize(1);
        cin >> a;
+
// Рисование
        if (a == 4) {
+
glBegin(GL_POINTS);
            cout << "input file name to write to\n";
+
for (int i = 0; i < N; i++)
            cin >> fil;
+
glVertex2d(mas[i].X, mas[i].Y);
            f.write(fil);
+
glEnd();
        }
+
} /* End of 'Draw' function */
        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>
 
  
'''[[Сюрис Александр]]'''
+
/* Interpolation draw graph function */
Задаются две функции с разными шагами и начальными и конечными значениями. Аппроксимирует одну функцию по шагу другой и складывает/умножает/вычитает/делит их
+
// Рисование интерполированного графика на экран
 +
void graph::Interpolation_Draw( double i_step )
 +
{
 +
// Коэффициент Катмулл-Рома
 +
double alpha = 1.0 / 6;
 +
 +
// Кубическая интерполяция кривыми Безье
 +
for (int i = 0; i < N - 1; i++)
 +
{
 +
// Создание 4 точек для интерполяции по ним
 +
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
 +
vec Color0 = mas[i], Color1, Color2, Color3 = mas[i + 1];
  
Скачать можно  [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 тут].
+
// Значения для первого и последнего отрезков
 +
if (i == 0)
 +
{
 +
P1 = (mas[1] - mas[0]) * alpha + mas[0];
 +
Color1 = (mas[1] - mas[0]) * alpha + mas[0];
 +
}
 +
else
 +
{
 +
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
 +
Color1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
 +
}
 +
if (i == N - 2)
 +
{
 +
P2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
 +
Color2 = -(mas[N - 1] - mas[N - 2]) * alpha + mas[N - 1];
 +
}
 +
else
 +
{
 +
P2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
 +
Color2 = -(mas[i + 2] - mas[i]) * alpha + mas[i + 1];
 +
}
  
<div class="mw-collapsible-content">
+
glLineWidth(2);
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
glBegin(GL_LINE_STRIP);
 
+
for (double t = 0; t <= 1; t += i_step)
#include <iostream>
+
{
#include <vector>
+
vec p, color;
#include<math.h>
 
  
using namespace std;
+
// Вычисление точки интерполированного графика по 4 точкам
class f{
+
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;
    private:
+
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;
    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;//вектор, содержащий проинтерполированную функцию
+
// Рисование
            for(int i=0; i<=(en-st)/d; i++)
+
glColor3d(color.X / 10, 0, color.Y);
                v1.push_back(a*(st+i*d)+b);//добавление значений проинтерполированной ф-ции с шагом другой функции
+
glVertex2d(p.X, p.Y);
        return f(_st,_en,_d,v1);
+
}
 +
glEnd();
 +
}
 +
} /* End of 'Interpolation_Draw' function */
  
    }
+
/* Interpolation graph function */
 +
// Интерполяция графика
 +
graph graph::Interpolation( double i_step )
 +
{
 +
graph G_New;
 +
// Коэффициент Катмулл-Рома
 +
double alpha = 1.0 / 6;
  
    f operator +(f x){//оператор сложения
+
// Заполнение параметров для нового графика
        double _en,_st,_d;
+
G_New.MinX = MinX;
        _en=min(en,x.en); //поиск области пересечения
+
G_New.MaxX = MaxX;
        _st=max(st,x.st);
+
G_New.Step = Step * i_step;
        if (_en>_st){//проверяем, пересекаются ли функции
+
G_New.N = (int)((G_New.MaxX - G_New.MinX) / G_New.Step);
            vector<double> _v;
+
G_New.mas = new vec[G_New.N];
            f y;
+
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
+
// Кубическая интерполяция кривыми Безье
                vector<double> _v;
+
for (int i = 0; i < N - 1; i++)
                y=x.aprox(_st, _en, d);
+
{
                for (int i=0; i<=(_en-_st)/d; i++)
+
// Создание 4 точек для интерполяции по ним
                    _v.push_back(y.v[i]+v[i]); //вектор с суммой функций
+
vec P0 = mas[i], P1, P2, P3 = mas[i + 1];
                return f(_st,_en,d,_v);
+
            }
+
// Значения для первого и последнего отрезков
            else{
+
if (i == 0)
                vector<double> _v;
+
P1 = (mas[1] - mas[0]) * alpha + mas[0];
                y=this->aprox(_st, _en, x.d); //this-> функция, в которой мы работаем
+
else
              for (int i=0; i<=(_en-_st)/x.d; i++)
+
P1 = (mas[i + 1] - mas[i - 1]) * alpha + mas[i];
                    _v.push_back(y.v[i]+x.v[i]);
+
if (i == N - 2)
                return f(_st,_en,x.d,_v);
+
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;
  
    f prot(){ //поиск противоположной функции
+
// Вычисление точки интерполированного графика по 4 точкам
        for (int i=0; i<=(en-st)/d; i++)
+
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;
            v[i]=(-1)*v[i];
+
}
        return *this;
+
}
    }
 
  
    f operator - (f x){ //разность функций
+
return G_New;
        return(*this + x.prot());
+
} /* End of 'Interpolation' function */
    }
 
  
f operator *(f x){//оператор умножения
+
/* Sum of 2 graphics function */
        double _en,_st,_d;
+
// Сложение двух графиков
        _en=min(en,x.en); //поиск области пересечения
+
graph graph::operator+( graph &G )
        _st=max(st,x.st);
+
{
        if (_en>_st){//проверяем, пересекаются ли функции
+
graph G_New, G1, G2;
            vector<double> _v;
+
int i, j;
            f y;
 
            if(x.st<st){ //сравниваем начала двух отрезков, для того, чтобы выбрать, какую функцию апроксимировать
 
                vector<double> _v;
 
                y=x.aprox(_st, _en, d);
 
                for (int i=0; i<=(_en-_st)/d; i++)
 
                    _v.push_back(y.v[i]*v[i]); //вектор с суммой функций
 
                return f(_st,_en,d,_v);
 
            }
 
            else{
 
                vector<double> _v;
 
                y=this->aprox(_st, _en, x.d); //this-> функция, в которой мы работаем
 
              for (int i=0; i<=(_en-_st)/x.d; i++)
 
                    _v.push_back(y.v[i]*x.v[i]);
 
                return f(_st,_en,x.d,_v);
 
            }
 
        }
 
    }
 
  
f obr(){
+
// Заполнение параметров графика суммы
  for (int i=0; i<=(en-st)/d; i++)
+
G_New.MinX = (MinX >= G.MinX) ? MinX : G.MinX;
            v[i]=1/v[i];
+
G_New.MaxX = (MaxX <= G.MaxX) ? MaxX : G.MaxX;
        return *this;
+
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];
  
f operator /(f x){
+
// Интерполяция слагаемых графиков, для приведение к общему шагу
return(*this*x.obr());
+
G1 = Interpolation(G.Step);
}
+
G2 = G.Interpolation(Step);
  
    void vivod(){ //вывод
+
// Поиск общего начала и конца графиков
    for(int i=0; i<v.size(); i++)
+
for (i = 0; i < G1.N; i++)
        cout<<v[i]<<" ";
+
if (fabs(G1.mas[i].X - G_New.MinX) <= Threshold)
 +
break;
  
    }
+
for (j = 0; j < G2.N; j++)
};
+
if (fabs(G2.mas[j].X - G_New.MinX) <= Threshold)
int main(){
+
break;
    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 << "Введите начала и конец отрезка и дельту: ";
+
for (int k = 0; k < G_New.N; k++)
    cin >> a1 >> b1 >> d1;
+
{
 +
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;
 +
}
  
    amount2=(b1-a1)/d1+1;
+
return G_New;
    vector<double>y;
+
} /* End of 'Sum' function */
    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;
+
/* Save Array of points function */
    cout<<"Введите число, соответсвующее порядковому номеру операции(1-4) - ";
+
// Сохранение графика в файл по точкам
    cin>>o;
+
void graph::SaveArray( void )
    if(o==1){               //по невыясненным причинам одновременно написанные слева идущие if -ы не работают,
+
{
        cout<<"Сумма:";    //но если заккоментить их и менять знак + в скобке на другие, то все работает
+
// Создание указателя на тип FILE
        (g+h).vivod();
+
FILE *F;
  
    }
+
// Создание файла и открытие его в режиме записи
 +
fopen_s(&F, "graph.txt", "wt");
  
    if(o==2){
+
/* Запись в файл данных */
        cout<<"Разность:"
+
// Количество точек
        (g-h).vivod();
+
fprintf(F, "%d\n", N);
 +
// Шаг функции
 +
fprintf(F, "%lf\n", Step);
 +
// Начальная координата по X
 +
fprintf(F, "%lf\n", MinX);
 +
// Конечная координата по X
 +
fprintf(F, "%lf\n", MaxX);
  
    }
+
// Координаты всех точек
 +
for (int i = 0; i < N; ++i)
 +
  fprintf(F, "%lf %lf ", mas[i].X, mas[i].Y);
  
    if(o==3){
+
// Закрытие файла
        cout<<"Произведение:"
+
fclose(F);
        (g*h).vivod();
+
} /* End of 'SaveArray' function */
  
 +
/* Approximation of function function */
 +
// Аппроксимация графика
 +
void graph::Approximation( void )
 +
{
 +
double k, b, s1 = 0, s2 = 0, s3 = 0, s4 = 0;
  
    }
+
// Линейная аппроксимация
 
+
for (int i = 0; i < N; i++)
    if(o==3){
+
{
        cout<<"Отношение:"
+
if (fabs(mas[i].X) < MAX && fabs(mas[i].Y) < MAX)
        (g/h).vivod();
+
{
    }
+
s1 += mas[i].X * mas[i].Y;
 +
s2 += mas[i].X;
 +
s3 += mas[i].X * mas[i].X;
 +
s4 += mas[i].Y;
 +
}
 +
}
  
 +
k = (N * s1 - s2 * s4) / (double(N) * s3 - s2 * s2);
 +
b = (s4 - k * s2) / double(N);
  
}
+
// Задача цвета и ширины линии
 +
glColor3d(1, 0.5, 0);
 +
glLineWidth(1);
 +
// Рисование
 +
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>
 
</syntaxhighlight>
</div>
+
"'''GRAPH.H'''"
 +
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 +
/* FILENAME: GRAPH.H
 +
* LAST UPDATE: 17.01.2016
 +
*/
  
'''[[Тимошенко Валентина]]'''
+
#ifndef _GRAPH_H_
 +
#define _GRAPH_H_
  
'''Краткое описание алгоритма''': в классе создаются две различные функции, а также функции для осуществления арифметических операций - сложения, вычитания, умножения и деления. Кроме того, созданы функции интерполяции и аппроксимации результата. Все результаты записываются в файлы, названия которых выводятся на экран в процессе работы программы.
+
#define _CRT_SECURE_NO_WARNINGS
  
'''Инструкция к программе''': при запуске программа предлагает ввести начало интервала, его конец и шаг для обеих функций. Далее пользователь выбирает одну из предложенных арифметических операций - сложение, вычитание, умножение или деление. После проведения вычислений программа предлагает пользователю интерполировать и аппроксимировать результат выбранной арифметической операции. Пользователь может давать команды на выполнение арифметических операций неограниченное число раз, программа завершает работу по команде пользователя.
+
#include <iostream>
 +
#include <stdio.h>
 +
#include <stdlib.h>
 +
#include <math.h>
 +
#include <time.h>
 +
#include <GL\glut.h>
  
 +
#define MAX 100
  
Скачать программу можно здесь: [http://tm.spbstu.ru/Файл:Program2.zip].
+
using namespace std;
  
<div class="mw-collapsible-content">
+
/* Useful constants */
<syntaxhighlight lang="cpp" line start="1" enclose="div">
+
const double Threshold = 1e-10;
#include <iostream> ///программа, перегружающая операторы для работы с двумя функциями,
+
const double Infinity = 1e+10;
#include <fstream>  ///интерполирующая и аппроксимирующая результат арифметических операций над этими функциями
 
#include <math.h>
 
  
using namespace std;
+
/* Vector representation type */
 
+
class vec
class functions ///класс, хранящий значения введенных пользователем значений начала и конца исследуемого интервала, а также шага функции
 
 
{
 
{
private:
+
public:
    double *massiv1, *massiv2, *massiv3; ///указатели на массивы, которые будут использованы в программе
+
double X, Y;
    ///massiv1 - массив, хранящий изначальные значения функций, massiv2 - массив, хранящий значения одной из функций после интерполяции
 
    ///massiv3 - массив, хранящий значения суммы/разности/умножения/деления функций
 
    double quantity_before_interpolation, Begin, End, Step;
 
    ///quantity - количество элементов в массиве(переменная типа double), Begin и End - начало и конец рассматриваемого отрезка, Step - шаг функции
 
  
public:
+
/* Default constructor */
 +
vec( void )
 +
{
 +
}
  
    int amount_before_interpolation; ///amount - количество элементов в массиве (переменная типа int)
+
/* Class constructor */
    functions (double Begin1, double End1, double Step1 ):Begin(Begin1), End(End1), Step(Step1) ///переменные, в которые закладываются значения, введенные пользоватедем
+
vec( double A ) : X(A), Y(A)
    {
+
{
        quantity_before_interpolation =((End-Begin)/Step) + 1; ///расчёт количества элементов в массиве
+
}
        amount_before_interpolation = static_cast < int >(quantity_before_interpolation); ///перевод значения количества элементов из типа double в тип int
 
    }
 
  
    void function1(double Begin, double End, double Step) ///задание первой функции
+
/* Class constructor */
    {
+
vec( double A, double B ) : X(A), Y(B)
        massiv1 = new double [amount_before_interpolation]; ///создание массива для хранения значений функций
+
{
        ofstream out ("Function1.txt"); ///запись в файл значений первой функции
+
}
        out << "The size of the range = " << amount_before_interpolation << '\n' << endl;; ///вывод на экран количества элементов данного массива
+
 
        for (int i = 0; i < amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
+
static double R0( void )
        {
+
{
            massiv1[i] = 2*i*Step+Begin; ///формула вычисления
+
return rand() / (double)RAND_MAX;
            out << "y(x=" << i << ")= " << massiv1[i] << endl; ///вывод на экран полученных значений
+
} /* End of 'R0' function */
        }
 
        out.close(); ///завершение записи в файл
 
    }
 
  
    void function2(double Begin,double End,double Step) ///задание второй функции
+
static vec Rnd( void )
    {
+
{
        massiv1 = new double [amount_before_interpolation]; ///создание массива для хранения значений функции
+
return vec(R0(), R0());
        ofstream out ("Function2.txt"); ///запись в файл значений второй функции
+
} /* End of 'Rnd' function */
        out << "The size of the range = " << amount_before_interpolation << '\n' << endl;; ///вывод на экран количества элементов данного массива
 
        for (int i = 0; i < amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 
        {
 
            massiv1[i] = i*Step; ///формула вычисления
 
            out << "y(x=" << i << ")= " << massiv1[i] << endl; ///вывод на экран полученных значений
 
        }
 
        out.close(); ///завершение записи в файл
 
    }
 
  
    void interpolation (double Begin1, double End1, double Step2) ///интерполяция результата по новому шагу
+
/* The functions of operations on vectors */
    {
 
        ofstream out ("Interpolation.txt"); ///запись в файл интерполированных значений функции
 
        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;
 
  
        massiv3 = new double [amount_after_interpolation]; ///создание массива для хранения значений функции
+
/* Vector = vector function */
        for (int i = 0; i < amount_after_interpolation; ++i) ///цикл, вычисляющий значения функции
+
vec operator=( vec &B )
        {
+
{
            double x = i*Step2 + Begin1; ///расчёт х-вой координаты
+
X = B.X;
            double x0 = static_cast < int >((x - Begin1)/Step + Begin1); ///расчёт нулевой х-вой координаты
+
Y = B.Y;
            ///перевод значения х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(); ///завершение записи в файл
 
    }
 
  
    void approximation(double Begin1, double End1, double Step2) ///функция, аппроксимирующая результат сложения/вычитания/умножения/деления функций
+
return B;
    {
+
} /* end of 'operator+' function */
        amount_before_interpolation=(End1-Begin1)/Step2+1;
 
        int SIZE = static_cast <int> (amount_before_interpolation); /// для удобства вводим переменную SIZE и закладываем в нее значение размера массива
 
  
        ///обнуление переменных
+
/* Vector add vector function */
        double sumX = 0; ///переменная, хранящая значение суммы х-вых координат
+
vec operator+( const vec &B ) const
        double sumY = 0; ///переменная, хранящая значение суммы у-вых координат
+
{
        double sumXY = 0; ///переменная, хранящая значение суммы произведений х-вой и у-вой координат
+
return vec(X + B.X, Y + B.Y);
        double sumX2 = 0; ///переменная, хранящая значение суммы х-вых координат, взятых в квадрате
+
} /* end of 'operator+' function */
        double k=0; ///переменная, хранящая значения углового коэффициента касательной к графику данной функции
 
        double b=0; ///переменная, хранящая значение свободного коэффициента
 
        double d;
 
  
        ofstream out ("Approximation.txt"); ///запись в файл аппроксимированных значений
+
/* Vector sub vector function */
        for (int i = 0; i < SIZE; ++i) ///цикл для расчёта сумм, указанных выше
+
vec operator-( const vec &B ) const
        {
+
{
            d=i*Step2+Begin1; ///расчёт х-вой координаты
+
return vec(X - B.X, Y - B.Y);
 +
} /* end of 'operator-' function */
  
            sumX = d + sumX; ///расчёт суммы х-вых координат
+
vec operator-( void ) const
 +
{
 +
return vec(-X, -Y);
 +
} /* end of 'operator-' function */
  
            sumY = massiv3[i] + sumY; ///расчёт суммы у-вых координат
+
/* Vector mul number function */
 +
vec operator*( const double N ) const
 +
{
 +
return vec(X * N, Y * N);
 +
} /* end of 'operator*' function */
  
            sumXY = d*massiv3[i] + sumXY; ///расчёт суммы произведений х-вой и у-вой координат
+
/* Vector div number function */
 +
vec operator/( const double N ) const
 +
{
 +
return vec(X / N, Y / N);
 +
} /* end of 'operator/' function */
  
            sumX2 = d*d + sumX2; ///расчёт суммы х-вых координат, взятых в квадрате
+
/* Vector dot vector function */
        }
+
double operator&( const vec &B ) const
 +
{
 +
return double(X * B.X + Y * B.Y);
 +
} /* end of 'operator&' function */
  
        k =(SIZE*sumXY - sumX*sumY)/(SIZE*sumX2- sumX*sumX); ///расчёт углового коэффициента
+
vec & operator+=( const vec &B )
 +
{
 +
X += B.X;
 +
Y += B.Y;
  
        b =(sumY - k*sumX)/SIZE; ///расчёт свободного коэффициента
+
return *this;
 +
} /* end of 'operator+=' function */
  
        out << "The equation, which is got as a result of approximation" << endl; ///вывод уравнения на экран
+
vec & operator-=( const vec &B )
 +
{
 +
X -= B.X;
 +
Y -= B.Y;
  
        if (b > 0) ///вывод уравнения при положительном свободном коэффициенте
+
return *this;
        {
+
} /* end of 'operator-=' function */
            out << "y = " << k << "*x+" << b << endl;
 
        }
 
  
        else if (b < 0) ///вывод уравнения при отрицательном свободном коэффициенте
+
vec & operator*=( const double N )
        {
+
{
            out << "y = " << k <<"*x" << b << endl;
+
X *= N;
        }
+
Y *= N;
        out.close(); ///завершение записи в файл
 
    }
 
  
    ///перегрузка операторов
+
return *this;
 +
} /* end of 'operator*=' function */
  
    functions operator+ (functions func3) ///сумма двух функций
+
vec & operator/=( const double N )
    {
+
{
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
+
X /= N;
 +
Y /= N;
  
        ofstream out ("Results_of_sum.txt"); ///запись в файл значений после суммирования значений функций
+
return *this;
        out << "sum of the functions" << '\n' << endl;
+
} /* end of 'operator/=' function */
  
        for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
+
double operator!( void ) const
        {
+
{
            massiv2[i] = massiv1[i] + func3.massiv1[i]; ///формула вычисления
+
return double(X * X + Y * Y);
            out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
+
} /* end of 'operator!' function */
        }
 
        out.close(); ///завершение записи в файл
 
  
        char d; ///переменная для команды интерполировать результат
+
/* Access vector components by index function */
        cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
+
double operator[]( const int i ) const
        cin >> d;
+
{
 +
switch (i)
 +
{
 +
case 0:
 +
return double(X);
 +
case 1:
 +
return double(Y);
 +
}
 +
} /* end of 'operator[]' function */
  
        if (d=='+') ///если команда для интерполяции дана
+
/* Normalizing vector function */
        {
+
vec & Normalize( void )
            double Step2; ///переменная, хранящая значение нового шага
+
{
            cout << '\n' << "Input the step for interpolation" << endl;
+
double len = !*this;
            cin >> Step2;
 
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
 
  
            char w; /// переменная для команды аппроксимировать результат
+
if (len != 1 && len != 0)
            cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
+
*this /= sqrt(len);
            cin >> w;
+
return *this;
 +
} /* end of 'Normalize' function */
 +
}; /* end of 'vec' class */
  
            if (w=='+') ///если команда на аппроксимацию дана
+
/* Graph class */
            {
+
class graph
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
+
{
            }
+
public:
        }
+
double MinX, MaxX, Step; // Начальная координата по X; Конечная координата по X; Шаг функции
    }
+
int N; // Количество точек
 +
vec *mas, *Color; // Массивы точек и цветов
  
    functions operator- (functions func3) ///разность двух функций
+
/* Default constructor */
    {
+
graph( void )
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
+
{
 +
MinX = -10, MaxX = 10, Step = 0.1, N = 200;
 +
}
  
        ofstream out ("Results_of_difference.txt"); ///запись в файл значений второй функции
+
/* Class constructor */
        out << "difference of the functions" << '\n' << endl;
+
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];
 +
}
  
        for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
+
/* Load Array of points function */
        {
+
void LoadArray( char *FileName );
            massiv2[i] = massiv1[i] - func3.massiv1[i]; ///формула вычисления
 
            out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
 
        }
 
        out.close(); ///завершение записи в файл
 
  
        char d; ///переменная для команды интерполировать результат
+
/* Fill mas function */
        cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
+
void Fill( double(*f)(double) );
        cin >> d;
 
  
        if (d=='+') ///если команда для интерполяции дана
+
/* Draw graph function */
        {
+
void Draw( double(*f)(double) );
            double Step2; ///переменная, хранящая значение нового шага
 
            cout << '\n' << "Input the step for interpolation" << endl;
 
            cin >> Step2;
 
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
 
  
            char w; /// переменная для команды аппроксимировать результат
+
/* Draw graph function */
            cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
+
void Draw( void );
            cin >> w;
 
  
            if (w=='+') ///если команда на аппроксимацию дана
+
/* Interpolation draw graph function */
            {
+
void Interpolation_Draw( double i_step );
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
+
 
            }
+
/* Interpolation graph function */
        }
+
graph Interpolation( double i_step );
    }
 
  
    functions operator* (functions func3) ///произведение двух функций
+
/* Sum of 2 graphics function */
    {
+
graph operator+( graph &G );
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
 
  
        ofstream out ("Results_of_multiplying.txt"); ///запись в файл значений второй функции
+
/* Save Array of points function */
        out << "multiplying of the functions" << '\n' << endl;
+
void SaveArray( void );
  
        for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
+
/* Approximation of function function */
        {
+
void Approximation( void );
            massiv2[i] = massiv1[i] * func3.massiv1[i]; ///формула вычисления
+
}; /* end of 'graph' class */
            out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
 
        }
 
        out.close(); ///завершение записи в файл
 
  
        char d; ///переменная для команды интерполировать результат
+
#endif /* _GRAPH_H_ */
        cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
 
        cin >> d;
 
  
        if (d=='+') ///если команда для интерполяции дана
+
/* End of 'GRAPH.H' file */
        {
+
</syntaxhighlight>
            double Step2; ///переменная, хранящая значение нового шага
+
</div>
            cout << '\n' << "Input the step for interpolation" << endl;
+
[http://tm.spbstu.ru/File:T05GRAPH.7z Скачать архив]
            cin >> Step2;
+
<br>
            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); ///вызов функции и аппроксимация результата
 
            }
 
        }
 
    }
 
  
    functions operator/ (functions func3) ///деление двух функций
+
'''Алгоритм''': функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно двумя способами: с помощью математических функций из стандартных библиотек, указывая начало и конец отрезка, а также шаг, с которым определена функция, и считывая координаты точек из файла, предварительно считав их количество. Далее с любыми функциями можно производить следующие действия и их комбинации: сложение, вычитание, кубическая интерполяция и линейная аппроксимация. При этом результат каждого из этих действий - новая функция, с которой можно продолжать работу. Функции можно выводить на экран с помощью средств графической библиотеки OpenGL, а также печатать её значения в файл.
    {
 
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
 
  
        ofstream out ("Results_of_dividing.txt"); ///запись в файл значений после деления значения первой функции на значения второй функции
+
'''Инструкция''': пользователь вводит необходимые действия с функциями в функции Display. На данный момент при запуске программы можно увидеть пример её работы: первая функция считывается из файла, интерполируется и выводится на экран. Затем вторая функция вводится из библиотеки math.h интерполируется и выводится на экран. Затем функции суммируются, интерполируются и выводятся на экран. [[:File:Func_Abramov.rar]]
        out << "dividing of the functions" << '\n' << endl;
 
  
      for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
+
Ссылка на скачивание: [http://tm.spbstu.ru/File:Func_Abramov.rar]
        {
 
            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=='+') ///если команда для интерполяции дана
+
'''[[Анастасия Бальцер]]'''
        {
 
            double Step2; ///переменная, хранящая значение нового шага
 
            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); ///вызов функции и аппроксимация результата
 
            }
 
        }
 
    }
 
};
 
  
int main()
+
Скачать можно  [http://tm.spbstu.ru/Файл:inter.zip тут].
{
+
 
    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/Файл:Program2.zip].
  
    char s; ///переменная, используется в цикле
+
<div class="mw-collapsible-content">
    do
+
<syntaxhighlight lang="cpp" line start="1" enclose="div">
    {
+
#include <iostream> ///программа, перегружающая операторы для работы с двумя функциями,
        char c; ///переменная, хранящая выбор арифметической операции пользователем
+
#include <fstream>  ///интерполирующая и аппроксимирующая результат арифметических операций над этими функциями
        cout << '\n' << "Input your choice: + for sum,- for difference,* for multiplying,/ for dividing" << endl;
+
#include <math.h>
        cin >> c;
 
  
        if (c=='+') ///цикл, запускающий функцию расчёта суммы двух функций, их интерполяцию и аппроксимацию
+
using namespace std;
        {
 
            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;
+
class functions ///класс, хранящий значения введенных пользователем значений начала и конца исследуемого интервала, а также шага функции
        ///команда пользователя на продолжение работы цикла или же на его завершение
+
{
        cin >> s;
+
private:
 +
    double *massiv1, *massiv2, *massiv3; ///указатели на массивы, которые будут использованы в программе
 +
    ///massiv1 - массив, хранящий изначальные значения функций, massiv2 - массив, хранящий значения одной из функций после интерполяции
 +
    ///massiv3 - массив, хранящий значения суммы/разности/умножения/деления функций
 +
    double quantity_before_interpolation, Begin, End, Step;
 +
    ///quantity - количество элементов в массиве(переменная типа double), Begin и End - начало и конец рассматриваемого отрезка, Step - шаг функции
  
        if (s=='-') ///если дана команда на завершение работы цикла
+
public:
        {
 
            cout << '\n' << "All results are saved in files." << endl; ///вывод на экран сообщения о записи в файл всех результатов
 
            cout << '\n' << "The program is finished." << endl; ///вывод на экран сообщения о завершении работы программы
 
            return 0;
 
        }
 
    }
 
    while (s != '-'); ///работа цикла не завершается до тех пор, пока пользователь не даст соответствующую команду
 
  
}
+
    int amount_before_interpolation; ///amount - количество элементов в массиве (переменная типа int)
 +
    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
 +
    }
  
</syntaxhighlight>
+
    void function1(double Begin, double End, double Step) ///задание первой функции
</div>
+
    {
 +
        massiv1 = new double [amount_before_interpolation]; ///создание массива для хранения значений функций
 +
        ofstream out ("Function1.txt"); ///запись в файл значений первой функции
 +
        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; ///формула вычисления
 +
            out << "y(x=" << i << ")= " << massiv1[i] << endl; ///вывод на экран полученных значений
 +
        }
 +
        out.close(); ///завершение записи в файл
 +
    }
  
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
    void function2(double Begin,double End,double Step) ///задание второй функции
'''[[Уманский Александр]]'''
+
    {
 
+
        massiv1 = new double [amount_before_interpolation]; ///создание массива для хранения значений функции
'''Инструкция к программе''': пользователь вводит начало и конец отрезка и шаг для функций, после чего создается две функции. Затем функции суммируются, после чего пользователь вводит значение нового шага, суммированная функция интерполируется по новому шагу, после этого по МНК(методу наименьших квадратов) функция апроксимируется.
+
        ofstream out ("Function2.txt"); ///запись в файл значений второй функции
 +
        out << "The size of the range = " << amount_before_interpolation << '\n' << endl;; ///вывод на экран количества элементов данного массива
 +
        for (int i = 0; i < amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 +
        {
 +
            massiv1[i] = i*Step; ///формула вычисления
 +
            out << "y(x=" << i << ")= " << massiv1[i] << endl; ///вывод на экран полученных значений
 +
        }
 +
        out.close(); ///завершение записи в файл
 +
    }
  
 +
    void interpolation (double Begin1, double End1, double Step2) ///интерполяция результата по новому шагу
 +
    {
 +
        ofstream out ("Interpolation.txt"); ///запись в файл интерполированных значений функции
 +
        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;
  
 +
        massiv3 = new double [amount_after_interpolation]; ///создание массива для хранения значений функции
 +
        for (int i = 0; i < amount_after_interpolation; ++i) ///цикл, вычисляющий значения функции
 +
        {
 +
            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(); ///завершение записи в файл
 +
    }
  
Скачать программу можно по [http://mech.spbstu.ru/File:Untitled1.rar ссылке]
+
    void approximation(double Begin1, double End1, double Step2) ///функция, аппроксимирующая результат сложения/вычитания/умножения/деления функций
<div class="mw-collapsible mw-collapsed" style="width:100%" >
+
    {
Метод наименьших квадратов
+
        amount_before_interpolation=(End1-Begin1)/Step2+1;
задача состоит в том, чтобы минимизировать выражение:
+
        int SIZE = static_cast <int> (amount_before_interpolation); /// для удобства вводим переменную SIZE и закладываем в нее значение размера массива
1: http://mech.spbstu.ru/images/b/b0/003.png
+
 
Доказано, что минимум достигается при:
+
        ///обнуление переменных
2: http://mech.spbstu.ru/images/2/20/005.png
+
        double sumX = 0; ///переменная, хранящая значение суммы х-вых координат
записываем пункт 2 в нашу программу, находим коэффициенты и находим значение линейной функции y=ax+b, по интерполированным значениям x.
+
        double sumY = 0; ///переменная, хранящая значение суммы у-вых координат
 +
        double sumXY = 0; ///переменная, хранящая значение суммы произведений х-вой и у-вой координат
 +
        double sumX2 = 0; ///переменная, хранящая значение суммы х-вых координат, взятых в квадрате
 +
        double k=0; ///переменная, хранящая значения углового коэффициента касательной к графику данной функции
 +
        double b=0; ///переменная, хранящая значение свободного коэффициента
 +
        double d;
  
 +
        ofstream out ("Approximation.txt"); ///запись в файл аппроксимированных значений
 +
        for (int i = 0; i < SIZE; ++i) ///цикл для расчёта сумм, указанных выше
 +
        {
 +
            d=i*Step2+Begin1; ///расчёт х-вой координаты
  
<div class="mw-collapsible-content">
+
            sumX = d + sumX; ///расчёт суммы х-вых координат
<syntaxhighlight lang="cpp" line start="1" enclose="div">
 
  
#include <iostream>
+
            sumY = massiv3[i] + sumY; ///расчёт суммы у-вых координат
#include <math.h>
+
 
#include <iomanip>
+
            sumXY = d*massiv3[i] + sumXY; ///расчёт суммы произведений х-вой и у-вой координат
#include<stdlib.h>
+
 
using namespace std;
+
            sumX2 = d*d + sumX2; ///расчёт суммы х-вых координат, взятых в квадрате
 +
        }
  
class func
+
        k =(SIZE*sumXY - sumX*sumY)/(SIZE*sumX2- sumX*sumX); ///расчёт углового коэффициента
{
 
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)//создаём конструктор для функции
+
        b =(sumY - k*sumX)/SIZE; ///расчёт свободного коэффициента
    {
 
        double p = (b-a)/c;
 
        d = (int)p;
 
        if (b > (d*c+a)) d += 2; //в зависимости от случая прибавляем либо 2 либо 1, чтобы не произошло переполнения массива
 
        else d += 1;
 
  
         F = new double [d];//создание динамического массива для У
+
         out << "The equation, which is got as a result of approximation" << endl; ///вывод уравнения на экран
        X = new double [d];// создание динамического массива для Х
 
        X[0]=a;//первый элемент
 
        X[d-1]=b;//последний элемент, для того чтобы последний элемент был в конце промежутка, чтобы его не потерять
 
        for(int i = 1; i < d-1; i++) X[i]=a+c*i; //присваивание значений всех Х
 
  
    }
+
        if (b > 0) ///вывод уравнения при положительном свободном коэффициенте
    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));//высчитываем значения У внутри промежутка
+
             out << "y = " << k << "*x+" << b << endl;
            F[i] = y;//присваиваем массиву значения по У
 
 
         }
 
         }
  
         cout << " " << endl;//пробел и конец строки
+
         else if (b < 0) ///вывод уравнения при отрицательном свободном коэффициенте
 +
        {
 +
            out << "y = " << k <<"*x" << b << endl;
 +
        }
 +
        out.close(); ///завершение записи в файл
 
     }
 
     }
  
     void second ()//функция для второй функции
+
     ///перегрузка операторов
 +
 
 +
    functions operator+ (functions func3) ///сумма двух функций
 
     {
 
     {
         if(a==0 || b==0) return;
+
         massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
        F[0]=1*a*a; //присваивание значения функции в начале промежутка
+
 
         F[d-1]=1*b*b;//присваивание значения функции в конце промежутка
+
         ofstream out ("Results_of_sum.txt"); ///запись в файл значений после суммирования значений функций
 +
        out << "sum of the functions" << '\n' << endl;
  
         for(int k = 1; k <d-1; ++k)
+
         for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
 
         {
 
         {
             double n = c*k+a;
+
             massiv2[i] = massiv1[i] + func3.massiv1[i]; ///формула вычисления
             if (n != 0)//условие неделимости на ноль
+
             out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
            {
 
                F[k] = 1*n*n;
 
            }
 
 
         }
 
         }
 +
        out.close(); ///завершение записи в файл
  
    }
+
        char d; ///переменная для команды интерполировать результат
 +
        cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
 +
        cin >> d;
  
    void operator +(func Q)//перегрузка оператора +
+
        if (d=='+') ///если команда для интерполяции дана
    {
+
        {
        sum(Q);
+
            double Step2; ///переменная, хранящая значение нового шага
    }
+
            cout << '\n' << "Input the step for interpolation" << endl;
 +
            cin >> Step2;
 +
            interpolation(Begin, End, Step2); ///вызов функции и интерполяция результата
  
    void sum (func Q)//функция суммирования функций на интерполированном шаге
+
            char w; /// переменная для команды аппроксимировать результат
    {  double m, p = (b-a)/c;
+
            cout << '\n' << "If you want to approximate the results, input +, in not, input -" << endl;
    int i;
+
            cin >> w;
        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)//цикл суммирования функций и вывода значений суммы, функций и иксов
+
            if (w=='+') ///если команда на аппроксимацию дана
        {
+
            {
 
+
                approximation(Begin, End, Step2); ///вызов функции и аппроксимация результата
            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)//функция для интерполяции функции
+
    functions operator- (functions func3) ///разность двух функций
     {double p,h,i,w,*X,aApr,bApr,X2sm,XYsm,Xsm/*хранит сумму интерполированных иксов*/,Ysm/*хранит сумму интерполированных игреков*/;
+
     {
    int q,k,l,o;
+
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
    p=(b-a)/pnt+1;
 
    q=int(p);
 
    R=new double [q];
 
    X=new double [q];
 
  
    l=0;
+
        ofstream out ("Results_of_difference.txt"); ///запись в файл значений второй функции
    k=0;
+
        out << "difference of the functions" << '\n' << endl;
  
    for(h=a/*начало функции*/; h<=b/*конец функции*/; h=h+c/*старый шаг*/) //шагает по нормальному шагу
+
         for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
    {
+
        {
         for(i=a-1; i<=b; i=i+pnt/*новый шаг*/)
+
             massiv2[i] = massiv1[i] - func3.massiv1[i]; ///формула вычисления
          if((i>h)&&(i<=(h+c)))//проверяет лежит ли новый шаг между точками старого
+
             out << "y (x=" << i << ") = " << massiv2[i] << "\n"; ///вывод на экран полученных значений
             {  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" ;
 
 
         }
 
         }
 +
        out.close(); ///завершение записи в файл
  
 +
        char d; ///переменная для команды интерполировать результат
 +
        cout << '\n' << "If you want to interpolate the results, input +, in not, input -" << endl;
 +
        cin >> d;
  
    return 0;}
+
        if (d=='+') ///если команда для интерполяции дана
};
+
        {
 +
            double Step2; ///переменная, хранящая значение нового шага
 +
            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); ///вызов функции и аппроксимация результата
 +
            }
 +
        }
 +
    }
 +
 
 +
    functions operator* (functions func3) ///произведение двух функций
 +
    {
 +
        massiv2=new double[amount_before_interpolation]; ///создание массива для хранения значений функций
  
int main(){
+
        ofstream out ("Results_of_multiplying.txt"); ///запись в файл значений второй функции
    double x, xn, s1,pnt;
+
        out << "multiplying of the functions" << '\n' << endl;
    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;}
+
        for (int i=0; i<amount_before_interpolation; ++i) ///цикл, вычисляющий значения функции
</syntaxhighlight>
+
        {
 +
            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=='+') ///если команда для интерполяции дана
 +
        {
 +
            double Step2; ///переменная, хранящая значение нового шага
 +
            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); ///вызов функции и аппроксимация результата
 +
            }
 +
        }
 +
    }
 +
 
 +
    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=='+') ///если команда для интерполяции дана
 +
        {
 +
            double Step2; ///переменная, хранящая значение нового шага
 +
            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); ///вызов функции и аппроксимация результата
 +
            }
 +
        }
 +
    }
 +
};
 +
 
 +
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); ///вызов третьей функции
 +
 
 +
    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>
 +
 +
 +
 +
 +
 +
'''[[Васильева Анастасия]]'''
 +
 +
'''Инструкция к программе''':сначала в папке с программой создаются два файла input1 и input2, в которых на первой строчке число точек в функции, а потом в два столбика значения х и у (функции должны быть с одинаковым шагом). Пользователь поочередно выбирает действия: 1 - нужно будет написать имя файла, откуда считывать значения для первой функции (х и у), 2 - для второй функции, 3 - сложение функций, пишем название файла, куда будут записываться значения, 4 - разность, 5 - умножение, 6 - интерполяция функции с шагом 0,5 , получившейся в результате сложения двух начальных,(можно сделать интерполяцию функций, которые получились в результате разности или умножения, но нужно будет в коде в case 6: newf3.Inter(0.5).output() поменять индекс функции и новый шаг), 7 - аппроксимация функции, получившейся в результате сложения двух начальных,(можно сделать аппроксимацию функций, которые получились в результате разности или умножения, но нужно будет в коде в case 7: newf3.Approxy().output() поменять индекс функции), 8 - выход.
 +
 +
'''Краткое описание алгоритма''':  функции хранятся в программе как массив точек, заданных с определённым шагом по X на заданном отрезке. Вводить значения функции в программу можно считывая координаты точек из файла. Далее с любыми функциями можно производить следующие действия: сложение, вычитание, умножение, интерполяция и аппроксимация. При этом результат каждого из этих действий - новая функция. Результаты выводятся в файл.
 +
Скачать программу можно по ссылке [http://tm.spbstu.ru/Файл:1.zip].
 +
 +
 +
 +
'''[[Капитанюк Светлана]]'''
 +
 +
'''Описание программы:''': программа, позволяющая складывать, вычитать, умножать и делить две функции, заданные на одном интервале, интерполирующая первую функцию по второй и аппроксимирующая результат арифметической операции с заданными пользователем функции. 
 +
 +
Скачать можно  [http://tm.spbstu.ru/File:Function_02.zip тут].
 +
 +
'''[[Демченко Артём]]'''
 +
 +
'''Описание программы''': В программе создается две функции, которые мы можем просуммировать, интерполировать каждую из них и аппроксимировать каждую из них. После каждой операции ( кроме аппроксимации ) значения записываются в файл.
 +
 +
'''Инструкции''': Запустите программу и выбором одного из трех параметров в меню выберете желаемую операцию. Далее следуйте указаниям из меню.
 +
 +
 +
Скачать можно  [http://tm.spbstu.ru/File:MyFunc.zip тут].
 +
 +
 +
'''[[Лобанов Илья]]'''
 +
 +
'''Описание программы''':
 +
Программа позволяет складывать , вычитать , делить,умножать 2 функции,заданные на одном интервале.При считывании с файла сначала указывается отрезок, потом величина шага, а потом дискретные значения.
 +
 +
Скачать можно [[http://tm.spbstu.ru/File:func.rar тут]]
 +
 +
'''[[Гильманов Илья]]'''
 +
 +
'''Описание программы''': программа, с помощью которой можно складывать, умножать, вычитать, делить 2-е функции, аппроксимировать,интерполировать.
 +
 +
'''Суть программы:''' Программа позволяет задать 2 функции с любыми областями определения и любыми множествами значений, интерполировать их на любом шаге, аппроксимировать, а так же сложить 2 существующие функции. Программа написана в классе работы с функциями.
 +
 +
'''Инструкция к программе''':
 +
1. Пользователь вводит параметры первой функции
 +
2. Пользователь вводит параметры второй функции
 +
3. Происходит интерполяция первой функции по второй
 +
4. Пользователь выбирает арифметическую операцию
 +
5. При желании пользователь может выполнить аппроксимацию полученного результата
 +
 +
Скачать можно [[http://mech.spbstu.ru/File:Gilmanov_Func.rar здесь]]
 +
 +
'''[[Киселёв Лев]]'''
 +
'''Описание программы''':программа позволяет интерполировать и аппроксимировать значения функции, а также складывать две функции, используя перегрузку.
 +
 +
Скачать можно [[http://mech.spbstu.ru/File:Interpol.rar здесь]]
 +
 +
'''[[Сергей Ляжков]]'''
 +
'''Описание программы''':программа позволяет проводить следующие действия с функциями: сложение, вычитание, умножение, те же действия с числами, проводить аппроксимацию и интерполяцию
 +
Скачать можно [[http://tm.spbstu.ru/File:Функции.zip тут]]
Вам запрещено изменять защиту статьи. 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:

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