Cod sursa(job #1143282)

Utilizator toncuvasileToncu Vasile toncuvasile Data 15 martie 2014 12:25:55
Problema Algoritmul lui Gauss Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 kb
// Infoarena. Arhiva Educationala. Algoritmul lui Gauss.
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;

void ReadMatrix(float[][310],int,int);
void ReadVector(float[],int);
void PrintMatrix(float[][310],int,int);
void PrintVector(float[],int);
int  FindMaxColoumn(float[][310],int,int);
void ChangeLines(float[][310],int,int,int);
void ReduceLines(float[][310],int,int,int);
void SolveUpperTriungular(float [][310],int,float[310]);


int main(){
    freopen("gauss.in","r",stdin);
    freopen("gauss.out","w",stdout);

    int n,m;  //n -> nr. de ecuatii; m -> nr. de necunoscute;
    float A[310][310], B[310], X[310];

    cin>>n>>m;

    ReadMatrix(A,n,m+1);

    for(int k=1;k<=n-1;k++){
        int p=FindMaxColoumn(A,n,k);
        if(p!=k) ChangeLines(A,m+1,p,k);
        for(int i=k+1;i<=n;i++){
            ReduceLines(A,m+1,i,k);
        }
    }

    if(n==m){
        SolveUpperTriungular(A,n,X);
        PrintVector(X,n);
    }
}

void ReadMatrix(float A[][310],int n,int m){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cin>>A[i][j];
        }
    }
}
void PrintMatrix(float A[][310],int n,int m){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            cout<<A[i][j]<<" ";
        }
        cout<<"\n";
    }
    cout<<"\n";
}
void PrintVector(float B[],int n){
    for(int i=1;i<=n;i++){
        cout<<B[i]<<" ";
    }
    cout<<"\n\n";
}
int FindMaxColoumn(float A[][310],int n,int k){
    int p=k;
    float m=fabs(A[k][k]);
    for(int i=k+1;i<=n;i++){
        if(fabs(A[i][k])>m){
            m=fabs(A[i][k]);
            p=i;
        }
    }
    return p;
}
void ChangeLines(float A[][310],int m,int p, int k){
    for(int j=1;j<=m;j++){
        swap(A[p][j],A[k][j]);
    }
}
void ReduceLines(float A[][310],int m,int i,int k){
    float aux=A[i][k]/A[k][k];
    for(int j=k;j<=m;j++){
        A[i][j]=A[i][j]-A[k][j]*aux;
    }
}
void SolveUpperTriungular(float A[][310],int n,float X[310]){
    X[n]=A[n][n+1]/A[n][n];
    for(int i=n-1;i>=1;i--){
        float s=0;
        for(int j=i+1;j<=n;j++){
            s+=A[i][j]*X[j];
        }
        X[i]=(A[i][n+1]-s)/A[i][i];
    }
}