Advertisement
Guest User

Untitled

a guest
Dec 20th, 2014
193
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.96 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <math.h>
  5.  
  6. using namespace std;
  7.  
  8. void mat(double** matice, int N, int M, int res);
  9. void vypis(double** matice,int N, int n, int m);
  10. void PocReseni(double** matice, double* r, int N, int M, int res);
  11. double det(double** matice, int N, int M);
  12.  
  13. int main(int argc, char** argv){
  14.     int M, N, res, n, m;
  15.     char vstup,vstup2;
  16.     cout << "Vitejte v programu na vypocet Gausovy eliminace a determinantu." << endl;\
  17.     cout << endl << "Nyni vyberte jednu z moznosti:" << endl;
  18.     cout << endl << "a: Zadani matice z klavesnice" << "  b: Zadani matice ze souboru" << endl;
  19.     cin >> vstup;
  20.     if(cin.fail()){
  21.         cout << "Nespravny vstup." << endl;
  22.         return 0;
  23.     }
  24.     switch(vstup){
  25.     case 'a':{
  26.     cout << "Zadejte rozmer matice (pocet radku, poctet sloupcu vcetne prave strany matice):" << endl;
  27.     cin >> N >> M;
  28.     if(cin.fail() || N <= 0 || M <= 0){
  29.         cout << "Nespravny vstup." << endl;
  30.         return 0;
  31.     }
  32.     double **matice = new double*[M];
  33.     for(int i = 0;i < M;i++) {
  34.             matice[i] = new double[N];
  35.         }
  36.    cout << "Zadejte hodnoty matice (po radcich):" << endl;
  37.    for (int i = 0; i < N; i++){
  38.         for (int j = 0; j < M; j++){
  39.             cin >> matice[i][j];
  40.             if(cin.fail()){
  41.                 cout << "Nespravny vstup." << endl;
  42.                 return 0;
  43.                 }
  44.                 //if(M == N)
  45.                 //matice[i][M+1] = 0;
  46.             }
  47.         }
  48.         if(M == N){ //pokud je matice ctvercova
  49.             M++;
  50.             res = M-2;
  51.             n = N-1;
  52.             m = M-1;
  53.             }
  54.         else{
  55.             res = M;
  56.             n = N;
  57.             m = M;
  58.             }
  59.         cout << endl << "Matice byla uspesne nactena." << endl;
  60.     cout << endl << "Zadana matice:" << endl;
  61.     vypis(matice, N, n, m);
  62.     cout << endl << "Vyberte jakou operaci chcete dal provest:" << endl;
  63.     cout << endl << "a: Gaussovu eliminaci" << "  b: Vypocet determinantu" << endl;
  64.     cin >> vstup2;
  65.     if(cin.fail()){
  66.         cout << "Nespravny vstup." << endl;
  67.         cin.clear();
  68.         delete[] matice;
  69.         return 0;
  70.     }
  71.     switch(vstup2){
  72.     case 'a':
  73.     mat(matice, N, M, res);
  74.     cout << endl;
  75.     cout << "Matice v trojuhelnikovem tvaru:" << endl;
  76.     vypis(matice, N, n, m);
  77.     cin.clear();
  78.     /*for(int i = 0; i < N; i++) {
  79.             delete [] matice[i];
  80.             } */
  81.         break;
  82.     case 'b':
  83.         cout << endl << "Determinant = ";
  84.         det(matice, N, M);
  85.         break;
  86.     default:
  87.         cout << "Nespravny vstup." << endl;
  88.         break;
  89.     }
  90.     delete[] matice;
  91.     break;
  92.     }
  93.     case 'b':
  94.         cout << "Hello world" << endl;
  95.         break;
  96.     default:
  97.         cout << "Nespravny vstup." << endl;
  98.         break;
  99.     }
  100.     return 0;
  101. }
  102. void mat(double** matice, int N, int M, int res){
  103.     int max = 0,pr = 0;
  104.     double pom;
  105.     for(int i = 0; i < N; i++){
  106.             max = i;
  107.     for(int j = i + 1; j < N; j++)
  108.         if(fabs(matice[j][i])>fabs(matice[i][i]))
  109.         max = j;
  110.     for(int k = i; k < M; k++){
  111.         pom = matice[i][k];
  112.         matice[i][k] = matice[max][k];
  113.         matice[max][k]=pom;
  114.     }
  115.     for(int j = i + 1; j < N; j++)
  116.     for(int k = N; k >= i; k--)
  117.         if(matice[i][i] != 0)
  118.         matice[j][k]= matice[j][k] - matice[i][k] * matice[j][i] / matice[i][i];
  119.   }
  120.      double *r = new double[N]; // reseni soustavy
  121.      for(int i = 0; i < N; i++)
  122.         r[i] = matice[i][res];
  123.      if(pr == 0){
  124.         for(int j = N - 1; j >= 0; j--){
  125.                 pom = 0;
  126.         for(int k = j + 1; k <= N; k++)
  127.             pom = pom + matice[j][k]*r[k];
  128.         r[j] = (matice[j][N] - pom) / matice[j][j];
  129.         }
  130.    }
  131.    PocReseni(matice, r, N, M, res);
  132. }
  133. void vypis(double** matice, int N, int n, int m)
  134. {
  135.     for(int i = 0; i < N; i++){
  136.             for(int j = 0; j < m; j++)
  137.             {
  138.                 cout.setf(ios::fixed);cout.precision(2);
  139.                 cout << matice[i][j] << "\t";
  140.         if(j == n - 1)
  141.             cout << "| ";
  142.         if(j == n)
  143.             cout << endl;
  144.             }
  145.         }
  146. }
  147. void PocReseni(double** matice, double* r, int N, int M, int res){
  148.     double *mpr = new double[N];
  149.    for(int i = 0; i < N; i++)
  150.        mpr[i] = matice[i][res]; //prave strany
  151.        int p = 0, pr = 0;
  152.    for(int j = 0; j < res; j++){
  153.         while(p < N){
  154.            if(matice[p][j] == 0){
  155.                if(mpr[p] == 0) //nekonecne reseni
  156.                pr = 1;
  157.                else if(mpr[p] != 0) //zadne reseni
  158.                pr = 2;
  159.                break;
  160.                 }
  161.            else{
  162.              pr = 0; //jedno reseni
  163.              p++;
  164.            }
  165.         }
  166.     }
  167.     if(pr == 1)
  168.       cout << endl << "Soustava ma nekonecne mnoho reseni." << endl;
  169.       else if(pr == 2)
  170.       cout << endl << "Soustava nema reseni." << endl;
  171.       else if(pr == 0){
  172.       cout << endl << "Soustava ma jedno reseni:" << endl;
  173.       int k = 1;
  174.       for (int i = 0; i < N; i++){
  175.             cout.setf(ios::fixed);cout.precision(2);
  176.             cout << "k" << k << " = " << r[i] << "\t";
  177.             k++;
  178.       }
  179.       cout << endl;
  180.     }
  181. }
  182. double det(double** matice, int N, int M){
  183.     int subi, subj;
  184.     double d = 0;
  185.     double **mat = new double*[M];
  186.     for(int i = 0;i < M;i++) {
  187.             mat[i] = new double[N-1];
  188.         }
  189.     /*if (N-1 == 2){
  190.         return( (matice[0][0] * matice[1][1]) - (matice[1][0] * matice[0][1]));
  191.     } */
  192.     //else{
  193.         for(int c = 0; c < N-1; c++){
  194.             subi = 0;
  195.     for(int i = 1; i < N-1; i++){
  196.         subj = 0;
  197.     for(int j = 0; j < N-1; j++){
  198.         if (j == c){
  199.             continue;
  200.                 }
  201.         mat[subi][subj] = matice[i][j];
  202.         subj++;
  203.             }
  204.         subi++;
  205.             }
  206.         d += (pow(-1 ,c) * matice[0][c] * det(mat, N, M));
  207.         }
  208.     //}
  209.     return d;
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement