Advertisement
Guest User

tuasdkguyafsdgyusfdyagufadsgy

a guest
Apr 23rd, 2019
114
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <cmath>
  4. using namespace std;
  5. double det(double** A, int n){
  6. double d=0;
  7. double** sub=new double*[n];
  8. for(int i=0;i<n;i++){
  9. sub[i]=new double[n];
  10. }
  11. if(n==2){
  12. return((A[0][0]*A[1][1])-(A[1][0]*A[0][1]));
  13. }
  14. else{
  15. for(int x=0;x<n;x++){
  16. int subi=0;
  17. for (int i=1;i<n;i++){
  18. int subj=0;
  19. for (int j=0;j<n;j++){
  20. if(j==x) continue;
  21. sub[subi][subj]=A[i][j];
  22. subj++;
  23. }
  24. subi++;
  25. }
  26. d+=(pow(-1,x)*A[0][x]*det(sub,n-1));
  27. }
  28. }
  29. for(int i=0;i<n;i++){
  30. delete[] sub;
  31. }
  32. delete[] sub;
  33. return d;
  34. }
  35. double** mac(const int n){
  36. double** a=new double*[n];
  37. for(int i=0;i<n;i++){
  38. a[i]=new double[n];
  39. }
  40. return a;
  41. }
  42. double** man(double** a,const int n){
  43. double s;
  44. cout<<"Podaj macierz:\n";
  45. for(int i=0;i<n;i++){
  46. cout<<"Wiersz "<<i+1<<".: ";
  47. for(int j=0;j<n;j++){
  48. cin>>s;
  49. a[i][j]=s;
  50. }
  51. }
  52. return a;
  53. }
  54. void clr(double** a,const int n){
  55. for(int i=0;i<n;i++){
  56. delete[] a[i];
  57. }
  58. delete[] a;
  59. }
  60. double* wyn(const int n){
  61. double* w=new double[n];
  62. double s;
  63. cout<<"Podaj macierz wynikową: ";
  64. for(int i=0;i<n;i++){
  65. cin>>s;
  66. w[i]=s;
  67. }
  68. return w;
  69. }
  70. void w1(double** A,double* Y,int n){
  71. for(int i=0;i<n;i++){
  72. for(int j=0;j<n;j++){
  73. cout<<setw(4)<<setprecision(3)<<A[i][j]<<" ";
  74. }
  75. if(i==n/2){
  76. cout<<" * ";
  77. }
  78. else{
  79. cout<<" ";
  80. }
  81. cout<<"X"<<i+1;
  82. if(i==n/2){
  83. cout<<" = ";
  84. }
  85. else{
  86. cout<<" ";
  87. }
  88. cout<<setw(4)<<setprecision(3)<<Y[i]<<endl;
  89. }
  90. }
  91. void w2(double* Y,int n){
  92. cout<<"Rozwiązanie:\n";
  93. for(int i=0;i<n;i++){
  94. cout<<"X"<<i+1<<": "<<setw(3)<<setprecision(3)<<Y[i]<<" ";
  95. }
  96. cout<<endl;
  97. }
  98. double* gauss(double** A,double *B,int n){
  99. for(int i=0;i<n;i++){
  100. if(A[i][i]==0){
  101. if(A[i+1][i+1]!=0&&i<n-1){
  102. double* h=new double[n+1];
  103. for(int j=0;j<n;j++){
  104. h[j]=A[i][j];
  105. A[i][j]=A[i+1][j];
  106. A[i+1][j]=h[j];
  107. }
  108. h[n+1]=B[i];
  109. B[i]=B[i+1];
  110. B[i+1]=h[n+1];
  111. delete[] h;
  112. gauss(A,B,n);
  113. }
  114. else{
  115. cerr<<"Sprzeczny układ równań!";
  116. exit(0);
  117. }
  118. }
  119. else{
  120. double h=A[i][i];
  121. if(h!=0){
  122. for(int j=i;j<n;j++){
  123. A[i][j]/=h;
  124. }
  125. B[i]/=h;
  126. }
  127. for(int j=i+1;j<n;j++){
  128. h=A[j][i];
  129. if(h!=0){
  130. for(int k=0;k<n;k++){
  131. A[j][k]-=h*A[i][k];
  132. }
  133. B[j]-=h*B[i];
  134. }
  135. }
  136. }
  137. }
  138. cout<<"Układ po pierwszym przekształceniu:\n";
  139. w1(A,B,n);
  140. for(int i=n-1;i>=0;i--){
  141. for(int j=i-1;j>=0;j--){
  142. double h=A[j][i];
  143. B[j]-=h*B[i];
  144. }
  145. }
  146. for(int i=0;i<n;i++){
  147. double s=0;
  148. for(int j=0;j<n;j++){
  149. s+=A[i][j];
  150. }
  151. if(s==0) return 0;
  152. }
  153. return B;
  154. }
  155. int main(){
  156. int n;
  157. cout<<"Podaj stopień macierzy: ";
  158. cin>>n;
  159. double** a=man(mac(n),n);
  160. double* b=wyn(n);
  161. cout<<"Podany do rozwiązania układ:\n";
  162. w1(a,b,n);
  163. if(det(a,n)!=0){
  164. w2(gauss(a,b,n),n);
  165. }
  166. else{
  167. cout<<"Macierz jest osobliwa!\n";
  168. }
  169. clr(a,n);
  170. delete[] b;
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement