Advertisement
patryk

Wyznacznik

May 17th, 2011
373
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.00 KB | None | 0 0
  1. #include <condefs.h>
  2. #include <iostream.h>
  3. #include <conio.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #include <exception>
  8. #include <ctype.h>
  9.  
  10.  
  11. int x1,x2,y1,y2;
  12. double **create(int, int); // funkcja tworzaca puste matryce
  13. void fill(double **, int, int); //funkcja wypelniajaca matryce
  14. void show(double **, int, int);  //funkcja wyswietlania macierzy
  15. double **adding(double **, double **, int, int); // funkcja dodajaca
  16. void add(); //procedura rozpoczynajaca dodawanie
  17. void erase(double **, int, int); //funkcja zwalniania pamieci
  18. double **adding(double **, double **, int, int); // funkcja dodajaca
  19. void erase(long double **, int, int); //funkcja zwalniania pamieci
  20. double **subtraction(double **,double **, int, int); //funkcja odejmujaca jedna matryce od drugiej
  21. void sub(); //procedura rozpoczynajaca odejmowanie
  22. double **multum(double **, int, int, double); //funkcja mnozaca przez liczbe
  23. double **multiplication(double **, double **, int, int, int, int); //funkcja mnozaca
  24. void multi(); //procedura rozpoczynajaca mnozenie
  25. int exp(int,int); //funkcja potegujaca
  26. double **bound(double **, int, int, int); //funkcja ograniczajaca macierz
  27. double **minor(double **, int); //funkcja liczaca minory
  28. double **cofactor(double **, int); //funkcja macierz dopelnien
  29. double det(double **, int); //funkcja liczaca wyznacznik
  30. void determinant(); //procedura liczenia przykladowego wyznacznika
  31.  
  32.  
  33.  
  34.  
  35. double **create(int m, int n)
  36. {
  37.   double **matrix;
  38.   matrix = new double *[m];
  39.   for(int j = 0; j<m; j++) matrix[j] = new double[n];
  40.   return matrix;
  41. }
  42.  
  43. void fill(double **matrix, int m, int n)
  44. {
  45.   for (int i = 0; i < m; i++)
  46.     for (int j = 0; j < n; j++)
  47.     {
  48.  
  49.  
  50.         cout<< "Podaj wspolrzedna matrix["<<i<<"]["<<j<<"]= ";
  51.         cin >> matrix[i][j];
  52.  
  53.     }
  54. }
  55.  
  56.  
  57. void show(double **matrix, int m, int n)
  58. {
  59.    cout<<endl;
  60.    cout<<endl;
  61.    for (int i = 0; i < m; i++)
  62.    {
  63.      for (int j = 0; j < n; j++)
  64.      cout << matrix[i][j] << " ";
  65.      cout << "\n" << endl;
  66.    }
  67. }
  68.  
  69. void erase(double **matrix, int m, int n)
  70. {
  71.   for (int i = 0; i < m;  i++)
  72.   delete[] matrix[i];
  73.   delete[] matrix;
  74. }
  75.  
  76.  
  77. double **adding(double **matrix1, double **matrix2,int m, int n)
  78. {
  79.   double **matrix3=create(m,n);
  80.   for (int i=0; i<m; i++)
  81.     for (int j=0; j<n; j++)
  82.       matrix3[i][j]=matrix1[i][j] + matrix2[i][j];
  83.   return matrix3;
  84. }
  85.  
  86. void add(void)
  87. {
  88.   cout << "Dodawanie macierzy" << endl;
  89.   printf("Podaj ilosc wierszy: ");
  90.   scanf("%d", &x1);
  91.   printf("Podaj ilosc kolumn: ");
  92.   scanf("%d", &y1);
  93.   double **A=create(x1,y1);
  94.   double **B=create(x1,y1);
  95.   cout << "Podaj dane matrycy A:" << endl;
  96.   fill(A,x1,y1);
  97.   cout << "Podaj dane matrycy B:" << endl;
  98.   fill(B,x1,y1);
  99.   double **C=adding(A,B,x1,y1);
  100.   show(A,x1,y1);
  101.   cout << "   +   "<< endl;
  102.   show(B,x1,y1);
  103.   cout << "   =   "<< endl;
  104.   show(C,x1,y1);
  105.   erase(A,x1,y1);
  106.   erase(B,x1,y1);
  107.   erase(C,x1,y1);
  108.   getch();
  109. }
  110.  
  111. double **multum(double **a, int m, int n, double liczba)
  112. {
  113.   double **b=create(m,n);
  114.   for (int i=0; i<m; i++)
  115.   {
  116.     for (int j=0; j<n; j++)
  117.     {
  118.       b[i][j]=a[i][j]*liczba;
  119.     }
  120.   }
  121.   return b;
  122. }
  123.  
  124.  
  125. double **subtraction(double **matrix1, double **matrix2, int m, int n)
  126. {
  127.   double **matrix3=create(m,n);
  128.   matrix3=adding(matrix1, multum(matrix2, m, n, -1), m, n);
  129.   return matrix3;
  130. }
  131. void sub()
  132. {
  133.   cout << "Odejmowanie macierzy" << endl;
  134.   printf("Podaj ilosc wierszy: ");
  135.   scanf("%d", &x1);
  136.   printf("Podaj ilosc kolumn: ");
  137.   scanf("%d", &y1);
  138.   double **A=create(x1,y1);
  139.   double **B=create(x1,y1);
  140.   cout << "Podaj dane matrycy A:" << endl;
  141.   fill(A,x1,y1);
  142.   cout << "Podaj dane matrycy B:" << endl;
  143.   fill(B,x1,y1);
  144.   double **C=subtraction(A,B,x1,y1);
  145.   show(A,x1,y1);
  146.   cout << "   -   "<< endl;
  147.   show(B,x1,y1);
  148.   cout << "   =   "<< endl;
  149.   show(C,x1,y1);
  150.   erase(A,x1,y1);
  151.   erase(B,x1,y1);
  152.   erase(C,x1,y1);
  153.   getch();
  154. }
  155.  
  156.  
  157. double **multiplication(double **a, double **b, int m1, int n1, int m2, int n2) //funkcja mnozaca
  158. {
  159.   int m,n,p;
  160.   double **c;
  161.   double **A;
  162.   double **B;
  163.   if (n1==m2)
  164.   {
  165.     m=m1;
  166.     n=n2;
  167.     p=n1;
  168.     A=create(m1,n1);
  169.     B=create(m2,n2);
  170.     A=a;
  171.     B=b;
  172.   }
  173.   else
  174.   {
  175.     p=n2;
  176.     m=m2;
  177.     n=n1;
  178.     A=create(m2,n2);
  179.     B=create(m1,n1);
  180.     A=b;
  181.     B=a;
  182.  
  183.   }
  184.   c=create(m,n);
  185.   for (int i=0; i<m; i++)
  186.     for (int k=0; k<n; k++)
  187.     {
  188.       long double temp=0;
  189.       for (int j=0; j<p; j++)
  190.       {
  191.         temp=temp+(A[i][j]*B[j][k]);
  192.       }
  193.       c[i][k]=temp;
  194.     }
  195.   return c;
  196. }
  197.  
  198. void multi() //procedura rozpoczynajaca mnozenie
  199. {
  200.   cout << "Dodawanie macierzy" << endl;
  201.   cout << "Dane 1. macierzy" << endl;
  202.  printf("Podaj ilosc wierszy: ");
  203.   scanf("%d", &x1);
  204.   printf("Podaj ilosc kolumn: ");
  205.   scanf("%d", &y1);
  206.   double **A=create(x1,y1);
  207.   cout << "Dane 2. macierzy" <<endl;
  208.   cout << "Ilosc wierszy macierzy 2 musi byc rowna ilosci kolumn macierzy 1! " << endl;
  209.   printf("Podaj x2: ");
  210.   scanf("%d", &x2);
  211.  
  212.   if (x2==y1)
  213.   {
  214.  
  215.   printf("Podaj y2: ");
  216.   scanf("%d", &y2);
  217.   }
  218.   else
  219.   {
  220.     y2=0;
  221.     while (y2!=x1){ printf("Podaj y2: "); scanf("%d", &y2); }
  222.   }
  223.   double **B=create(x2,y2);
  224.   cout << "Podaj dane matrycy A:" << endl;
  225.   fill(A,x1,y1);
  226.   cout << "Podaj dane matrycy B:" << endl;
  227.   fill(B,x2,y2);
  228.   double **C=multiplication(A,B,x1,x2,y1,y2);
  229.   show(A,x1,y1);
  230.   cout << "   x   "<< endl;
  231.   show(B,x2,y2);
  232.   cout << "   =   "<< endl;
  233.   show(C,x1,y2);
  234.   erase(A,x1,y1);
  235.   erase(B,x2,y2);
  236.   erase(C,x1,y2);
  237.   getch();
  238. }
  239. int exp(int a,int b)
  240. {
  241.   int temp=1;
  242.   if (b==0)
  243.   {
  244.     if (a==0) temp=0;
  245.     else temp=1;
  246.   }
  247.   else for (int i=0; i<b; i++)
  248.   {
  249.     temp=temp*a;
  250.   }
  251.   return temp;
  252. }
  253.  
  254.  
  255. double **bound(double **matrix, int n, int x, int y)
  256. {
  257.   double **temp=create(n-1,n-1);
  258.   int a=0;
  259.   for (int i=0; i<n; i++)
  260.   {
  261.     int b=0;
  262.     if (i!=x)
  263.     {
  264.       for (int j=0; j<n; j++)
  265.       {
  266.         if (j!=y)
  267.         {
  268.           temp[a][b]=matrix[i][j];
  269.           b++;
  270.         }
  271.       }
  272.     a++;
  273.     }
  274.   }
  275.   return temp;
  276. }
  277.  
  278.  
  279. double **minor(double **matrix, int n)
  280. {
  281.   double **temp=create(n,n);
  282.   for (int i=0; i<n; i++)
  283.   {
  284.     for (int j=0; j<n; j++)
  285.     {
  286.       temp[i][j]=det(bound(matrix,n,i,j),(n-1));
  287.     }
  288.   }
  289.   return temp;
  290. }
  291.  
  292. double **cofactor(double **matrix, int n)
  293. {
  294.   double **temp=create(n,n);
  295.   for (int i=0; i<n; i++)
  296.   {
  297.     for (int k=0; k<n; k++)
  298.     {
  299.       temp[i][k]=matrix[i][k]*exp(-1,(i+k+2));
  300.     }
  301.   }
  302.   return temp;
  303. }
  304.  
  305.  
  306. double det(double **a, int n)
  307. {
  308.   double wyzn=0;
  309.   double **A=create(n,n);
  310.  
  311.   if (n==1) wyzn=a[0][0];
  312.   else
  313.   {
  314.     A=cofactor(minor(a,n),n);
  315.     int i=0;
  316.     for (int j=0; j<n; j++)
  317.     {
  318.       wyzn+=a[i][j]*A[i][j];
  319.     }
  320.   }
  321.   return wyzn;
  322. }
  323.  
  324.  
  325. void determinant()
  326. {
  327.   cout << "Liczenie wyznacznikow" << endl;
  328.   cout << "Dane macierzy" << endl;
  329.   printf("Podaj ilosc wierszy: ");
  330.   scanf("%d", &x1);
  331.   printf("Podaj ilosc kolumn: ");
  332.   scanf("%d", &y1);
  333.   cout << "Kolumn jest tyle samo" << endl;
  334.   double **matrix=create(x1,y1);
  335.   int n=x1;
  336.   fill(matrix,n,n);
  337.   double wyzn=det(matrix,n);
  338.  
  339.   cout << "Wyznacznikiem macierzy:";
  340.   cout<<endl;
  341.   show(matrix,n,n);
  342.   cout<<endl;
  343.   cout << "jest liczba: "<<wyzn << endl;
  344.   getch();
  345. }
  346.  
  347.  
  348.  
  349.  
  350. /*float odejmowanie()
  351. {
  352. printf("Odejmowanie");
  353. }
  354. float wyswietlanie()
  355. {
  356. printf("Wyswietlanie");
  357. }     */
  358.  
  359. int main()
  360. {
  361. char wybor;
  362. char znak;
  363. do{
  364. cout<<"Co chcesz robic:\nD - dodaj macierze\nO - odejmij macierze\nM - pomnoz macierz\nW - Oblicz Wyznacznik \nK - koniec \n:";
  365. cin>>wybor;
  366. switch(wybor)
  367. {
  368.   case 'd':
  369.   case 'D':
  370.     add();
  371.     break;
  372.   case 'o':
  373.   case 'O':
  374.     sub();
  375.     break;
  376.   case 'm':
  377.   case 'M':
  378.     multi();
  379.     break;
  380.   case 'w':
  381.   case 'W':
  382.     determinant();
  383.   case 'k':
  384.   case 'K':
  385.      break;
  386.   default:
  387.      printf("Zly wybor");
  388. }
  389. cout<<"Czy chcesz zakonczyc program? - Wcisnij q: ";
  390. cin>>znak;
  391. }
  392. while(znak!='q' && znak!='Q');
  393. getch();
  394.  
  395. }
  396. //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement