• Ошибка C++ zsh: segmentation fault "/var/folders/y7/hbkvnly103qb7050nfdxcx100000gn/T/"tempCodeRunnerFile?

    @m4t1k_matik Автор вопроса
    #include <clocale>
    #include <iostream>
    #include <cmath>
    
    class mGauss
    {
    private:
        int IM, h, sm;
        double MaxA, Sum;
        double **chA;
        double *chB;
    public:
        mGauss(double **A, double *B, int m)
        {
            sm=m;
            chB = new double[m];
            chA = new double *[m];
            for (int i=0; i<m; i++)
            {
                chA[i]=new double [m];
            }
            for (int r = 0; r<m; r++)
            {
                for (int c = 0; c<m; c++)
                {
                    chA[r][c] = A[r][c];
                }
            }
            for (int r = 0;r<m;r++)
            {
                chB[r]=B[r];
            }
        }
    
    
        int ved(int i) // функция определения ведущего уравнения
        {
            int g,h,k;
            double MaxA, temp;
            MaxA=0;
            h = -1;
            for (k = i; k < sm; k++)
            {
                if (fabs(chA[k][i]) >fabs(MaxA))
                {
                    MaxA = chA[k][i];
                    h = k;
                }
                if (h == -1)
                {
                    std::cout <<" Матрица вырождена \n ";
                }
            return h;
            }
                
        } 
    
        void perestanovka(int IM,  int i) // функция перестановки уравнений системы
        {
            double temp; 
            if (IM != i)
            {
                for (int j = i; j < sm; j++)
                {
                    temp = chA[i][j] ;
                    chA[i][j] = chA[IM][j];
                    chA[IM][j] = temp;
                }
                temp = chB[i];
                chB[i] = chB[IM];
                chB[IM] = temp;
            }
        } 
    
        void rkoef(int i, int l) // функция пересчета коэффициентов
        {
            float Q;
            Q=chA[l][i] / chA[i][i] ;
            chA[l][i] = 0;
            for (int j=i+1; j < sm; j++)
            chA[l][j] = chA[l][j] - Q*chA[i][j];
            chB[l] = chB[l] - Q*chB[i];
        }
    
        void prgauss() // функция прямого хода метода Гаусса
        {
            int i, l, IM;
            float Q;
            for (i=0;i<sm;i++)
            {
                IM = ved(i);
                perestanovka(IM, i);
                for (l=i+1;l<sm;l++)
                rkoef(i,l);
            }
        }
    
        void obgauss(double* C) // функция обратного хода метода Гаусса
        {
            int k, j; 
            C[sm-1] = chB[sm-1] / chA[sm-1][sm-1];
            for(k=sm - 2; k>=0; k--)
                {
                    Sum = chB[k];
                    for (j=k+1; j<sm; j++)
                    Sum = Sum - chA[k][j]*C[j];
                    C[k] = Sum / chA[k][k];
                }
        } 
         ~mGauss()
        {
            delete [] chB;
            for (int i=0; i<sm; i++)
            {
                delete [] chA[i];
            }
            delete [] chA;
            chA=nullptr;
        }
    };
    void vvod (double *ax, double *ay, int fxn, int fyn);
    
    void vivodxy (double *ax, double *ay, int fxn, int fyn);
    
    void vivod (int nn,double *array);
    
    void vivodA(int mm, double **arrA);
    
    double FI0();
    
    double FI1(double *ax, int i);
    
    double FI2(double *ax, int i);
    
    float FI(double *ax1, int i, int k);
    
    void koeff (double **Ak, double *ax, double *Bk, double *ay, int mm, int nn);
    
    void Y1_kr_d(double *Y1, double *C, double *D, int nn, double *ax, double *ay);
    
    
    int main()
    {
        int xn, yn, k, l, m ,n;
        double x, y;
        std::cout << "Введите количество x, которое вы хотите ввести: ";
        std::cin >> xn;
        std::cout << '\n';
        std::cout << "Введите количество y, которое вы хотите ввести: ";
        std::cin >> yn;
        std::cout << '\n';
        double *arrx = new double [xn];
        double *arry = new double [yn];
        std::cout<<"m = ";
        std::cin >> m;
        std::cout<<"n = ";
        std::cin >> n;
        double *B=new double[m];
        double **A=new double* [m];
        for (int i=0; i<m; i++)
        {
            A[i]=new double [n];
        }
        vvod(arrx,arry,xn,yn);
        vivodxy(arrx,arry,xn,yn);
        koeff(A, arrx, B, arry, m, n);
        delete [] arrx;
        delete [] arry;
        for (int i=0; i<m; i++)
        {
            delete [] A[i];
        }
        delete [] A;
        A=nullptr;
        delete [] B;
        double *Y1 = new double [n];
        double *D = new double [n];
        double *C= new double [n];
        mGauss Obj(A, B, m);
        Obj.prgauss();
        Obj.obgauss(C);
        Y1_kr_d(Y1,C,D,n,arrx,arry);
        return 0;
    }
    
    void vvod (double *ax, double *ay, int fxn, int fyn)
    {
        std::cout << "\nВведите значения чисел массива x: ";
        for (int i = 0; i < fxn; i++) { 
            std::cin >> ax[i];  
        }
        std::cout << "\nВведите значения чисел массива y: ";
        for (int i = 0; i < fyn; i++) { 
            std::cin >> ay[i];  
        }
        std::cout << "\n";
    }
    void vivodxy (double *ax, double *ay, int fxn, int fyn)
    {
        std::cout << "Массив x: ";
        for (int i = 0; i < fxn; i++) { 
        std::cout << ax[i] <<" ";
        }
        std::cout << "\n";
        std::cout << "Массив y: ";
        for (int i = 0; i < fyn; i++) { 
        std::cout << ay[i] <<" ";
        }
        std::cout << "\n";
    }
    void vivod (int nn,double *array)
    {
        for (int i = 0; i < nn; i++) { 
        std::cout << array[i] <<" ";
        }
        std::cout << "\n";
    }
    
    void vivodd (int mm, double **arr)
    {
        int k, l;
        for (k = 0; k < mm; k++)
        {
            for (l = 0; l < mm; l++)
            {
                std::cout << arr[k][l] << " ";
            }
            std::cout << "\n";
        }
    
    }
    
    double FI0()
    {
        return 1;
    }
    
    double FI1(double *ax, int i)
    {
        return ax[i];
    }
    
    double FI2(double *ax, int i)
    {
        return pow(ax[i],3);
    }
    
    float FI(double *ax1, int i, int k)
    {
        if (k == 0)
        return FI0();
        
        if (k == 1)
        return FI1(ax1, i);
        
        if (k==2)
        return FI2(ax1, i);
    }
    
    void koeff (double **Ak, double *ax, double *Bk, double *ay, int mm, int nn)
    {
        int k,l;
        std::cout<<"Матрица А: "<<std::endl;
        for (k = 0; k < mm; k++)
        {
            for (l = 0; l < mm; l++)
            {
                Ak[k][l]=0;
                for (int i = 0; i < nn; i++)
                {
                    Ak[k][l]=Ak[k][l]+FI(ax, i, k) * FI(ax, i, l);
                    
                }
                
            }
        }
        vivodd (mm, Ak);
    
        std::cout << "Вектор столбец: ";
        for (k = 0; k < mm; k++)
        {
            Bk[k]=0;
            for (int i = 0; i < nn; i++)
            {
                Bk[k]=Bk[k]+ay[i]*FI(ax, i, k);
            }
        }
        vivod(k, Bk);
    }
    
    void Y1_kr_d(double *Y1, double *C, double *D, int nn, double *ax, double *ay)
    {
        double kr=0,k=0,Dmax;
        int IM=0;
        for (int i=0; i<nn; i++)
        {
            Y1[i]=C[i]*FI(ax, i, k)+C[i+1]*FI(ax, i, k+1)+C[i+2]*FI(ax, i, k+2);
            D[i]=ay[i]-Y1[i];
            kr=kr+D[i]*D[i];
            std::cout << "Y1 = ";
            vivod(i,Y1);
            std::cout<< "\n";
            vivod(i, D);
            std::cout<< "\n";
            std::cout << "kr = " << kr << "\n";
        }
        Dmax=D[0];
        for (int i=0; i<nn; i++)
        {
            if (fabs(D[i])>Dmax)
            {
                Dmax=D[i];
                IM=i;
    
                std::cout << "Dmax= "<<Dmax<<"IM = "<<IM;
            }
            std::cout<< "\n";
        }
    }