Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <condefs.h>
- #include <iostream.h>
- #include <conio.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <exception>
- #include <ctype.h>
- int x1,x2,y1,y2;
- double **create(int, int); // funkcja tworzaca puste matryce
- void fill(double **, int, int); //funkcja wypelniajaca matryce
- void show(double **, int, int); //funkcja wyswietlania macierzy
- double **adding(double **, double **, int, int); // funkcja dodajaca
- void add(); //procedura rozpoczynajaca dodawanie
- void erase(double **, int, int); //funkcja zwalniania pamieci
- double **adding(double **, double **, int, int); // funkcja dodajaca
- void erase(long double **, int, int); //funkcja zwalniania pamieci
- double **subtraction(double **,double **, int, int); //funkcja odejmujaca jedna matryce od drugiej
- void sub(); //procedura rozpoczynajaca odejmowanie
- double **multum(double **, int, int, double); //funkcja mnozaca przez liczbe
- double **multiplication(double **, double **, int, int, int, int); //funkcja mnozaca
- void multi(); //procedura rozpoczynajaca mnozenie
- int exp(int,int); //funkcja potegujaca
- double **bound(double **, int, int, int); //funkcja ograniczajaca macierz
- double **minor(double **, int); //funkcja liczaca minory
- double **cofactor(double **, int); //funkcja macierz dopelnien
- double det(double **, int); //funkcja liczaca wyznacznik
- void determinant(); //procedura liczenia przykladowego wyznacznika
- double **create(int m, int n)
- {
- double **matrix;
- matrix = new double *[m];
- for(int j = 0; j<m; j++) matrix[j] = new double[n];
- return matrix;
- }
- void fill(double **matrix, int m, int n)
- {
- for (int i = 0; i < m; i++)
- for (int j = 0; j < n; j++)
- {
- cout<< "Podaj wspolrzedna matrix["<<i<<"]["<<j<<"]= ";
- cin >> matrix[i][j];
- }
- }
- void show(double **matrix, int m, int n)
- {
- cout<<endl;
- cout<<endl;
- for (int i = 0; i < m; i++)
- {
- for (int j = 0; j < n; j++)
- cout << matrix[i][j] << " ";
- cout << "\n" << endl;
- }
- }
- void erase(double **matrix, int m, int n)
- {
- for (int i = 0; i < m; i++)
- delete[] matrix[i];
- delete[] matrix;
- }
- double **adding(double **matrix1, double **matrix2,int m, int n)
- {
- double **matrix3=create(m,n);
- for (int i=0; i<m; i++)
- for (int j=0; j<n; j++)
- matrix3[i][j]=matrix1[i][j] + matrix2[i][j];
- return matrix3;
- }
- void add(void)
- {
- cout << "Dodawanie macierzy" << endl;
- printf("Podaj ilosc wierszy: ");
- scanf("%d", &x1);
- printf("Podaj ilosc kolumn: ");
- scanf("%d", &y1);
- double **A=create(x1,y1);
- double **B=create(x1,y1);
- cout << "Podaj dane matrycy A:" << endl;
- fill(A,x1,y1);
- cout << "Podaj dane matrycy B:" << endl;
- fill(B,x1,y1);
- double **C=adding(A,B,x1,y1);
- show(A,x1,y1);
- cout << " + "<< endl;
- show(B,x1,y1);
- cout << " = "<< endl;
- show(C,x1,y1);
- erase(A,x1,y1);
- erase(B,x1,y1);
- erase(C,x1,y1);
- getch();
- }
- double **multum(double **a, int m, int n, double liczba)
- {
- double **b=create(m,n);
- for (int i=0; i<m; i++)
- {
- for (int j=0; j<n; j++)
- {
- b[i][j]=a[i][j]*liczba;
- }
- }
- return b;
- }
- double **subtraction(double **matrix1, double **matrix2, int m, int n)
- {
- double **matrix3=create(m,n);
- matrix3=adding(matrix1, multum(matrix2, m, n, -1), m, n);
- return matrix3;
- }
- void sub()
- {
- cout << "Odejmowanie macierzy" << endl;
- printf("Podaj ilosc wierszy: ");
- scanf("%d", &x1);
- printf("Podaj ilosc kolumn: ");
- scanf("%d", &y1);
- double **A=create(x1,y1);
- double **B=create(x1,y1);
- cout << "Podaj dane matrycy A:" << endl;
- fill(A,x1,y1);
- cout << "Podaj dane matrycy B:" << endl;
- fill(B,x1,y1);
- double **C=subtraction(A,B,x1,y1);
- show(A,x1,y1);
- cout << " - "<< endl;
- show(B,x1,y1);
- cout << " = "<< endl;
- show(C,x1,y1);
- erase(A,x1,y1);
- erase(B,x1,y1);
- erase(C,x1,y1);
- getch();
- }
- double **multiplication(double **a, double **b, int m1, int n1, int m2, int n2) //funkcja mnozaca
- {
- int m,n,p;
- double **c;
- double **A;
- double **B;
- if (n1==m2)
- {
- m=m1;
- n=n2;
- p=n1;
- A=create(m1,n1);
- B=create(m2,n2);
- A=a;
- B=b;
- }
- else
- {
- p=n2;
- m=m2;
- n=n1;
- A=create(m2,n2);
- B=create(m1,n1);
- A=b;
- B=a;
- }
- c=create(m,n);
- for (int i=0; i<m; i++)
- for (int k=0; k<n; k++)
- {
- long double temp=0;
- for (int j=0; j<p; j++)
- {
- temp=temp+(A[i][j]*B[j][k]);
- }
- c[i][k]=temp;
- }
- return c;
- }
- void multi() //procedura rozpoczynajaca mnozenie
- {
- cout << "Dodawanie macierzy" << endl;
- cout << "Dane 1. macierzy" << endl;
- printf("Podaj ilosc wierszy: ");
- scanf("%d", &x1);
- printf("Podaj ilosc kolumn: ");
- scanf("%d", &y1);
- double **A=create(x1,y1);
- cout << "Dane 2. macierzy" <<endl;
- cout << "Ilosc wierszy macierzy 2 musi byc rowna ilosci kolumn macierzy 1! " << endl;
- printf("Podaj x2: ");
- scanf("%d", &x2);
- if (x2==y1)
- {
- printf("Podaj y2: ");
- scanf("%d", &y2);
- }
- else
- {
- y2=0;
- while (y2!=x1){ printf("Podaj y2: "); scanf("%d", &y2); }
- }
- double **B=create(x2,y2);
- cout << "Podaj dane matrycy A:" << endl;
- fill(A,x1,y1);
- cout << "Podaj dane matrycy B:" << endl;
- fill(B,x2,y2);
- double **C=multiplication(A,B,x1,x2,y1,y2);
- show(A,x1,y1);
- cout << " x "<< endl;
- show(B,x2,y2);
- cout << " = "<< endl;
- show(C,x1,y2);
- erase(A,x1,y1);
- erase(B,x2,y2);
- erase(C,x1,y2);
- getch();
- }
- int exp(int a,int b)
- {
- int temp=1;
- if (b==0)
- {
- if (a==0) temp=0;
- else temp=1;
- }
- else for (int i=0; i<b; i++)
- {
- temp=temp*a;
- }
- return temp;
- }
- double **bound(double **matrix, int n, int x, int y)
- {
- double **temp=create(n-1,n-1);
- int a=0;
- for (int i=0; i<n; i++)
- {
- int b=0;
- if (i!=x)
- {
- for (int j=0; j<n; j++)
- {
- if (j!=y)
- {
- temp[a][b]=matrix[i][j];
- b++;
- }
- }
- a++;
- }
- }
- return temp;
- }
- double **minor(double **matrix, int n)
- {
- double **temp=create(n,n);
- for (int i=0; i<n; i++)
- {
- for (int j=0; j<n; j++)
- {
- temp[i][j]=det(bound(matrix,n,i,j),(n-1));
- }
- }
- return temp;
- }
- double **cofactor(double **matrix, int n)
- {
- double **temp=create(n,n);
- for (int i=0; i<n; i++)
- {
- for (int k=0; k<n; k++)
- {
- temp[i][k]=matrix[i][k]*exp(-1,(i+k+2));
- }
- }
- return temp;
- }
- double det(double **a, int n)
- {
- double wyzn=0;
- double **A=create(n,n);
- if (n==1) wyzn=a[0][0];
- else
- {
- A=cofactor(minor(a,n),n);
- int i=0;
- for (int j=0; j<n; j++)
- {
- wyzn+=a[i][j]*A[i][j];
- }
- }
- return wyzn;
- }
- void determinant()
- {
- cout << "Liczenie wyznacznikow" << endl;
- cout << "Dane macierzy" << endl;
- printf("Podaj ilosc wierszy: ");
- scanf("%d", &x1);
- printf("Podaj ilosc kolumn: ");
- scanf("%d", &y1);
- cout << "Kolumn jest tyle samo" << endl;
- double **matrix=create(x1,y1);
- int n=x1;
- fill(matrix,n,n);
- double wyzn=det(matrix,n);
- cout << "Wyznacznikiem macierzy:";
- cout<<endl;
- show(matrix,n,n);
- cout<<endl;
- cout << "jest liczba: "<<wyzn << endl;
- getch();
- }
- /*float odejmowanie()
- {
- printf("Odejmowanie");
- }
- float wyswietlanie()
- {
- printf("Wyswietlanie");
- } */
- int main()
- {
- char wybor;
- char znak;
- do{
- cout<<"Co chcesz robic:\nD - dodaj macierze\nO - odejmij macierze\nM - pomnoz macierz\nW - Oblicz Wyznacznik \nK - koniec \n:";
- cin>>wybor;
- switch(wybor)
- {
- case 'd':
- case 'D':
- add();
- break;
- case 'o':
- case 'O':
- sub();
- break;
- case 'm':
- case 'M':
- multi();
- break;
- case 'w':
- case 'W':
- determinant();
- case 'k':
- case 'K':
- break;
- default:
- printf("Zly wybor");
- }
- cout<<"Czy chcesz zakonczyc program? - Wcisnij q: ";
- cin>>znak;
- }
- while(znak!='q' && znak!='Q');
- getch();
- }
- //---------------------------------------------------------------------------
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement