Cod sursa(job #1763955)

Utilizator hiticas_abelhiticasabel hiticas_abel Data 24 septembrie 2016 20:32:54
Problema Algoritmul lui Gauss Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.58 kb
#include<stdio.h>
#define NMAX 301
#define EPS 0.0000001

int main(){
	
	FILE *fin=fopen("gauss.in","r");
	FILE *fout=fopen("gauss.out", "w");
	int n, m, i, j;
	
	double a[NMAX][NMAX], rez[NMAX];
	fscanf(fin, "%d %d", &n, &m);
	
	for(i=1; i<=n; i++)
		for(j=1; j<=m+1; j++)
			fscanf(fin, "%lf", &a[i][j]);
			
	int k;
	i=1; j=1;		
			
	while( i<=n && j<=m ){
		
		//caut linia i care are coloana j diferita de 0
		
		for(k=i; k<n; k++)
			if( a[k][j]<-EPS || a[k][j]>EPS )
				break;
		
		//daca nu gasim linia - j variabila libera
		if(k==n+1){
			j++;
			continue;
		} 
		
		//skimb linia k cu linia i
		
		double aux=0;
		int p;
		if( k!=i )
			for( p=1; p<=m+1; p++) {
				aux=a[i][p];
				a[i][p]=a[k][p];
				a[k][p]=aux;
			}
			
		//impart toata ecuatia de pe linia i la a[i][j]
		for(p=j+1; p<=m+1; p++){
			a[i][p]=a[i][p]/a[i][j];
		}
		a[i][j]=1;
		
		int u;
		
		//scad din ec i+1..n ecuatia i inmultia cu cosntata
		for( u=i+1; u <= n; u++ ){
			
			for(p = j+1; p <= m+1; p++ )
				a[u][p] -=a[u][j]*a[i][p];
			a[u][j]=0;
		}
		
		++i; ++j;
	}
	
	//calc necunoscute
	int p;
	for( i = n; i >= 1; i-- )
		for( j = 1; j <= m+1; j++ )
			if( a[i][j] > EPS && a[i][j] < -EPS){
				
				if( j == m+1 ){
					fprintf(fout, "Imposibil\n");
					return 0;
				}
			
			rez[j]=a[i][m+1];
			
			for ( p=j+1; p <= m; p++ )
				rez[j]=rez[j]-(rez[p]*a[i][p]);
			break;
			} 
			
		
	
			
		
			
			
			
			
for(i=1; i<=m; i++)
	fprintf(fout, "%.8f ", rez[i]);
	fprintf(fout, "\n");
	//system("pause");
	
	
	return 0;
}