Pagini recente » Cod sursa (job #642476) | Cod sursa (job #2097269) | Cod sursa (job #1351869) | Cod sursa (job #1215648) | Cod sursa (job #1113985)
//Include
#include <stdio.h>
#include <algorithm>
#include <stdlib.h>
#include <math.h>
using namespace std;
FILE *in, *out;
//Constante
const int sz = 318;
const double err = 1e-10;
//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;
}