Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #define R 20
- #define S 21
- void PocReseni(float a[R][S], float r[R], int N, int M, int res);
- // Gaussova eliminace -------------------------------
- void mat(float a[R][S], int N, int M, int res)
- {
- int max = 0,pr=0;
- float pom;
- for(int i=0; i<N; i++) //nalezení pivota
- {
- max=i;
- for(int j=i+1; j<N; j++)
- if(fabs(a[j][i])>fabs(a[i][i]))
- max=j;
- for(int k=i; k<M; k++)
- {
- pom=a[i][k];
- a[i][k]=a[max][k];
- a[max][k]=pom;
- }
- for(int j=i+1; j<N; j++)
- for(int k=N; k>=i; k--)
- if(a[i][i]!=0)
- a[j][k]= a[j][k] - a[i][k] * a[j][i] / a[i][i];
- }
- //----------------------------------------------------------------
- //Zpětný chod - řešení soustavy
- float r[N];
- for(int i=0; i<N; i++)
- r[i]=a[i][res];
- if(pr==0)
- {
- for(int j=N-1; j>=0; j--)
- {
- pom=0;
- for(int k=j+1; k<=N; k++)
- pom=pom+a[j][k]*r[k];
- r[j]=(a[j][N]-pom)/a[j][j];
- }
- }
- PocReseni(a,r, N, M, res);
- //----------------------------------------------------------------
- //---------------------------------------------------------------
- }
- //Výpis soustavy ----------------------------------------
- void vypis(float a[R][S],int N, int n, int m)
- {
- //Výpis
- for(int i=0; i<N; i++)
- {//vypisuje prvky, když dojde na konec řadky, odřádkuje
- for(int j=0; j<m; j++)
- {
- printf("%5.3f ", a[i][j]);
- if(j==n-1)
- printf(" | ");
- if(j==n)
- printf("\n");
- }
- }
- }
- //----------------------------------------------------------------
- //Počet řešení ---------------------------------------------------
- void PocReseni(float a[R][S],float r[R], int N, int M, int res)
- {
- float rP[R]; //Pro testování počtu řešení
- //Osetreni poctu reseni
- for(int i=0; i<N; i++)
- rP[i]=a[i][res]; //vektor pravych stran
- int p=0,pr=0;
- for(int j=0; j<res; j++)
- {
- while(p<N)
- {
- if(a[p][j]==0)
- {
- if(rP[p]==0) //má nekonečně mnoho řešení
- pr=1;
- else if(rP[p]!=0) //nemá žádné řešení
- pr=2;
- break;
- }
- else
- {
- pr=0; //má jedno řešení
- p++;
- }
- }
- }
- //Reseni--------
- printf("\n");
- if(pr==1)
- printf("\n!!!Soustava ma nekonecne mnoho reseni!!!\n\n");
- else if(pr==2)
- printf("\n!!!Soustava nema reseni!!!\n\n"); //např. pokud je více rovnic než proměnných a žádná nejpřejde na nulový řádek
- else if(pr==0) // vyjde tedy 0=něco
- {
- printf("\n!!!Soustava ma jedno reseni!!!\n\n");
- printf("\nVektor reseni:\n");
- for (int i = 0; i < N; i++)
- {
- printf("%5.3f ", r[i]);
- }
- printf("\n");
- }
- }
- //----------------------------------------------------------------
- //----------------------------------------------------------------
- int main(int argc, char** argv) {
- int i, j, k,M,N, res, n, m;
- float X[R][S];
- //Nacitani cisel-------------------------------------------------
- int cisla=0;
- printf("Zadej pocet radku a sloupcu (max 20x21)\n ----------------------------------\n");
- printf("Pokud je vektor pravych stran nulovy zadejte nuly (pokud ho nezadate dostanete\nspatny vysledek) : ");
- while(N>20 || M>21)
- {
- scanf("%i %i",&N,&M);
- if(N<=20 && M<=21) break;
- printf("pocet radku a sloupku musi byt < 20 a 21, Zadejte pocet radku a sloupku: \n");
- }
- printf("Zadavej hodnoty matice (po radcich): \n");
- for (int i = 0; i < N; i++)
- {
- for (int j = 0; j < M; j++)
- {
- scanf("%i", &cisla);
- X[i][j]=cisla;
- if(M==N)
- X[i][M+1]=0;
- }
- }
- //-----------------------------------------------------------------------
- // Pokud je matice ctvercova - rovnice navic
- if(M==N)
- {
- M++;
- res=M-2;
- n=N-1;
- m=M-1;
- }
- else
- {
- res=M;
- n=N;
- m=M;
- }
- //------------------------------------------------------------------------
- printf("\n Matice A:\n");
- vypis(X,N, n,m);
- printf("\n");
- mat(X, N, M, res); // Volání fce, která provádí eliminace
- printf("\n");
- printf("\n Matice GEA(A):\n");
- vypis(X,N, n,m);
- system("pause");
- return (0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement