Advertisement
Guest User

Untitled

a guest
Dec 19th, 2014
158
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.68 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define R 20
  5. #define S 21
  6.  
  7. void PocReseni(float a[R][S], float r[R], int N, int M, int res);
  8.  
  9. // Gaussova eliminace -------------------------------
  10. void mat(float a[R][S], int N, int M, int res)
  11. {
  12. int max = 0,pr=0;
  13. float pom;
  14.  
  15. for(int i=0; i<N; i++) //nalezení pivota
  16. {
  17. max=i;
  18. for(int j=i+1; j<N; j++)
  19. if(fabs(a[j][i])>fabs(a[i][i]))
  20. max=j;
  21.  
  22. for(int k=i; k<M; k++)
  23. {
  24. pom=a[i][k];
  25. a[i][k]=a[max][k];
  26. a[max][k]=pom;
  27. }
  28. for(int j=i+1; j<N; j++)
  29. for(int k=N; k>=i; k--)
  30. if(a[i][i]!=0)
  31. a[j][k]= a[j][k] - a[i][k] * a[j][i] / a[i][i];
  32. }
  33. //----------------------------------------------------------------
  34. //Zpětný chod - řešení soustavy
  35.  
  36. float r[N];
  37. for(int i=0; i<N; i++)
  38. r[i]=a[i][res];
  39.  
  40. if(pr==0)
  41. {
  42. for(int j=N-1; j>=0; j--)
  43. {
  44. pom=0;
  45. for(int k=j+1; k<=N; k++)
  46. pom=pom+a[j][k]*r[k];
  47. r[j]=(a[j][N]-pom)/a[j][j];
  48. }
  49. }
  50.  
  51. PocReseni(a,r, N, M, res);
  52. //----------------------------------------------------------------
  53. //---------------------------------------------------------------
  54. }
  55.  
  56. //Výpis soustavy ----------------------------------------
  57. void vypis(float a[R][S],int N, int n, int m)
  58. {
  59. //Výpis
  60. for(int i=0; i<N; i++)
  61. {//vypisuje prvky, když dojde na konec řadky, odřádkuje
  62. for(int j=0; j<m; j++)
  63. {
  64. printf("%5.3f ", a[i][j]);
  65. if(j==n-1)
  66. printf(" | ");
  67.  
  68. if(j==n)
  69. printf("\n");
  70. }
  71. }
  72. }
  73. //----------------------------------------------------------------
  74.  
  75. //Počet řešení ---------------------------------------------------
  76. void PocReseni(float a[R][S],float r[R], int N, int M, int res)
  77. {
  78. float rP[R]; //Pro testování počtu řešení
  79. //Osetreni poctu reseni
  80. for(int i=0; i<N; i++)
  81. rP[i]=a[i][res]; //vektor pravych stran
  82.  
  83. int p=0,pr=0;
  84. for(int j=0; j<res; j++)
  85. {
  86. while(p<N)
  87. {
  88. if(a[p][j]==0)
  89. {
  90. if(rP[p]==0) //má nekonečně mnoho řešení
  91. pr=1;
  92. else if(rP[p]!=0) //nemá žádné řešení
  93. pr=2;
  94.  
  95. break;
  96. }
  97. else
  98. {
  99. pr=0; //má jedno řešení
  100. p++;
  101. }
  102. }
  103.  
  104. }
  105.  
  106.  
  107. //Reseni--------
  108. printf("\n");
  109. if(pr==1)
  110. printf("\n!!!Soustava ma nekonecne mnoho reseni!!!\n\n");
  111. else if(pr==2)
  112. printf("\n!!!Soustava nema reseni!!!\n\n"); //např. pokud je více rovnic než proměnných a žádná nejpřejde na nulový řádek
  113. else if(pr==0) // vyjde tedy 0=něco
  114. {
  115. printf("\n!!!Soustava ma jedno reseni!!!\n\n");
  116. printf("\nVektor reseni:\n");
  117. for (int i = 0; i < N; i++)
  118. {
  119. printf("%5.3f ", r[i]);
  120. }
  121. printf("\n");
  122. }
  123. }
  124.  
  125. //----------------------------------------------------------------
  126. //----------------------------------------------------------------
  127.  
  128. int main(int argc, char** argv) {
  129. int i, j, k,M,N, res, n, m;
  130. float X[R][S];
  131.  
  132. //Nacitani cisel-------------------------------------------------
  133. int cisla=0;
  134. printf("Zadej pocet radku a sloupcu (max 20x21)\n ----------------------------------\n");
  135. printf("Pokud je vektor pravych stran nulovy zadejte nuly (pokud ho nezadate dostanete\nspatny vysledek) : ");
  136. while(N>20 || M>21)
  137. {
  138. scanf("%i %i",&N,&M);
  139. if(N<=20 && M<=21) break;
  140. printf("pocet radku a sloupku musi byt < 20 a 21, Zadejte pocet radku a sloupku: \n");
  141. }
  142.  
  143. printf("Zadavej hodnoty matice (po radcich): \n");
  144. for (int i = 0; i < N; i++)
  145. {
  146. for (int j = 0; j < M; j++)
  147. {
  148. scanf("%i", &cisla);
  149. X[i][j]=cisla;
  150. if(M==N)
  151. X[i][M+1]=0;
  152. }
  153. }
  154. //-----------------------------------------------------------------------
  155. // Pokud je matice ctvercova - rovnice navic
  156. if(M==N)
  157. {
  158. M++;
  159. res=M-2;
  160. n=N-1;
  161. m=M-1;
  162. }
  163. else
  164. {
  165. res=M;
  166. n=N;
  167. m=M;
  168. }
  169. //------------------------------------------------------------------------
  170. printf("\n Matice A:\n");
  171. vypis(X,N, n,m);
  172.  
  173. printf("\n");
  174. mat(X, N, M, res); // Volání fce, která provádí eliminace
  175. printf("\n");
  176.  
  177. printf("\n Matice GEA(A):\n");
  178. vypis(X,N, n,m);
  179.  
  180. system("pause");
  181. return (0);
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement