Cod sursa(job #1113964)

Utilizator TeOOOVoina Teodora TeOOO Data 21 februarie 2014 09:02:13
Problema Algoritmul lui Gauss Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.7 kb
//Include
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
using namespace std;

FILE *in, *out;

//Constante
const int sz = 318;
const int err = 1e-7;

//Functii
void lineswap(double *line1, double *line2);
template <class T> T Abss (T var);
bool notZero (double var);

//Variabile
int variables, equations;
double Sys[sz][sz];
double answer[sz];

//Main
int main()
{
    in=fopen("gauss.in", "rt");
    out=fopen("gauss.out", "wt");

    fscanf(in,"%d%d", &equations, &variables);
    ++variables;

    for(int i=1; i<=equations; ++i)
        for(int j=1; j<=variables; ++j)
            fscanf(in,"%lf", &Sys[i][j]);

    int currentEquation=1, currentVariable =1;
    while(currentEquation <= equations && currentVariable < variables)
    {
        int eq;

        for(eq=currentEquation; eq<=equations && !notZero(Sys[eq][currentVariable]) ; ++eq);
        if(eq == equations+1)
        {
            currentVariable++;
            continue;
        }

        if(eq!=currentEquation)
            lineswap(Sys[currentEquation], Sys[eq]);

        for(int i=currentVariable+1; i<=variables; ++i)
            Sys[currentEquation][i] /= Sys[currentEquation][currentVariable];
        Sys[currentEquation][currentVariable] = 1;

        for(int eq=currentEquation+1; eq<=equations; ++eq)
        {
            for(int i=currentVariable+1; i<=variables; ++i)
                Sys[eq][i] = Sys[currentEquation][i]*Sys[eq][currentVariable] - Sys[eq][i];
            Sys[eq][currentVariable] = 0;
        }

        ++currentEquation;
        ++currentVariable;

    }

    for(int currentEquation=equations; currentEquation; --currentEquation)
    {
        int currentVariable = find_if(Sys[currentEquation]+1, Sys[currentEquation]+variables+1, notZero) - Sys[currentEquation];

        if(currentVariable > variables)
            continue;
        if(currentVariable == variables)
        {
            fprintf(out,"Imposibil\n");
            fclose(in);
            fclose(out);
            return 0;
        }

        answer[currentVariable] = Sys[currentEquation][variables];

        for(int eq = 1; eq < currentEquation; ++eq)
            Sys[eq][variables] -= answer[currentVariable]*Sys[eq][currentVariable];
    }

    for(int i=1; i<variables; ++i)
        fprintf(out,"%.10lf ", answer[i]);
    fprintf(out, "\n");

    fclose(in);
    fclose(out);
    return 0;
}

void lineswap(double *line1, double *line2)
{
    for(int t=1; t<=variables; ++t)
        swap(line1[t], line2[t]);
}

template <class T> T Abss (T var)
{
    return var<0? -var:var ;
}

bool notZero (double var)
{
    return Abss(var) > err;
}