Cod sursa(job #2857009)

Utilizator rARES_4Popa Rares rARES_4 Data 24 februarie 2022 19:17:38
Problema Algoritmul lui Gauss Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 3.19 kb
#include <iostream>
#include <fstream>
#include <iomanip>
#define EPS 0.0000001
using namespace std;
ifstream f ("gauss.in");
ofstream g ("gauss.out");
int n,m;
double matr_gauss[301][301],rasp[301];
double copie_matrice[301][301];
void citire()
{
    f >> n>>m;
    for(int i = 1; i<=n; i++)
    {
        for(int j = 1; j<=m+1; j++)
        {
            f >> matr_gauss[i][j];
            copie_matrice[i][j] = matr_gauss[i][j];
        }
    }
}
bool null(double nr)
{
    if(-EPS<=nr && nr<=EPS)
        return true;
}
void schimba_linii(int l1,int l2)
{
    for(int i = 1; i<=m+1; i++)
        swap(matr_gauss[l1][i],matr_gauss[l2][i]);
}
void aflare_rasp()
{
    for(int i=1; i<=n; i++)
    {
        double suma=0;
        //verificam suma pentru fiecare linie inmultind variabila cu coeficientul
        //in cazul in care suma nu e egala sistemul nu merge
        for(int j=1; j<=m; j++)
        {
            suma+=copie_matrice[i][j]*rasp[j];
        }
        if(!null(suma-copie_matrice[i][m+1]))
        {
            g<<"Imposibil";
            exit(0);
        }
    }

}
void afisare()
{
    for(int i = 1; i<=m; i++)
    {
        g <<fixed<< setprecision(10)<< rasp[i]<< " ";
    }
}
void calculare_sistem()
{
    for(int coloana = 1; coloana<=m; coloana++)
    {
        //cautam primul rand cu coloana nenula
        int coloana_nenula = coloana;
        for(int rand = coloana; rand<=n; rand++)
        {
            if(!null(matr_gauss[rand][coloana]))
            {
                coloana_nenula = rand;
                break;
            }
        }

        schimba_linii(coloana_nenula,coloana);

        if(null(matr_gauss[coloana][coloana]))
            continue;

        //facem 1 primul element de pe linie
        double primul_element = matr_gauss[coloana][coloana];
        for(int i = coloana; i<=m+1; i++)
        {
            matr_gauss[coloana][i] = (matr_gauss[coloana][i]*1.00)/primul_element;
        }


        //facem primul element de pe urmatoarea si restul liniilor 0 si scadem ca la efectuarea unui sitem gauss
        for(int i = coloana+1; i<=n; i++)
        {
            double primul_element_pe_fiecare_linie = matr_gauss[i][coloana];
            for(int j = 1; j<=m+1; j++)
            {
                matr_gauss[i][j]-=matr_gauss[coloana][j]*primul_element_pe_fiecare_linie;
            }
        }

        //facem primul element de pe anterioara si restul liniilor 0 si scadem ca la efectuarea unui sitem gauss
        //iar toata matricea va ramane pe fiecare linie cu varibila cu coeficientul 1 si raspunsul sau
        //deci pe fiecare linie pe coloana m+1 se va afla raspunsul pentru fiecare variabila
        for(int i = coloana-1; i>=1; i--)
        {
            double primul_element_pe_fiecare_linie = matr_gauss[i][coloana];
            for(int j = 1; j<=m+1; j++)
            {
                matr_gauss[i][j]-=matr_gauss[coloana][j]*primul_element_pe_fiecare_linie;
            }
        }


    }
}
int main()
{
    citire();
    calculare_sistem();
    for(int i=1; i<=n; i++)
    {
        rasp[i]=matr_gauss[i][m+1];
    }

    aflare_rasp();
    afisare();
}