Tucancitto

FAI - PROGRAM2

Nov 29th, 2020 (edited)
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.50 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <iomanip>
  4. #include <string>
  5. using namespace std;
  6.  
  7. ofstream fout("matriceOUT.txt");
  8.  
  9. string solutie;
  10. int nrPasi;
  11.  
  12. struct frecventa
  13. {
  14.     int coordLinie = 0, coordColoana = 0;
  15.     string necPP;
  16. }frc1[10];
  17.  
  18.  
  19. void citireMatrice(float mat[][10], int& nrL, int& nrC)
  20. {
  21.     ifstream fin("matriceIN.txt");
  22.     fin >> nrL >> nrC;
  23.     for (int i = 0; i < nrL; i++)
  24.         for (int j = 0; j < nrC; j++)
  25.             fin >> mat[i][j];
  26. }
  27. void afisareMatrice(float mat[][10], int nrL, int nrC)
  28. {
  29.     for (int i = 0; i < nrL; i++)
  30.     {
  31.         for (int j = 0; j < nrC; j++)
  32.         {
  33.             if (mat[i][j] == -0)    mat[i][j] = 0;
  34.             fout << setw(10) << mat[i][j] << ' ';
  35.         }
  36.         fout << "\n";
  37.     }
  38.     fout << "\n";
  39. }
  40.  
  41. void interschimbareLinii(float mat[][10], int nrC, int linie1, int linie2) //S_ij sau L_i <-> L_j
  42. {
  43.     for (int i = 0; i < nrC; i++)
  44.         swap(mat[linie1][i], mat[linie2][i]);
  45. }
  46.  
  47. void multiplicareLinie(float mat[][10], int nrC, int linie, float a) // M_i(a) sau L_i -> a*L_i
  48. {
  49.     for (int i = 0; i < nrC; i++)
  50.         mat[linie][i] = mat[linie][i] * a;
  51. }
  52.  
  53. void operatieLinii(float mat[][10], int nrC, int linie1, int linie2, float a) //T_i(a*L_j) sau L_i -> aL_j + L_i
  54.  
  55. {
  56.     for (int j = 0; j < nrC; j++)
  57.         if ((float)(mat[linie1][j] - a * mat[linie2][j]) < (float)0.001 && (float)(mat[linie1][j] - a * mat[linie2][j]) > (float)-0.001)
  58.             mat[linie1][j] = 0;
  59.         else
  60.             mat[linie1][j] = mat[linie1][j] - a * mat[linie2][j];
  61. }
  62.  
  63. int liberColoana(float mat[][10], int nrL, int linie, int coloana)
  64. {
  65.     for (int i = linie; i < nrL; i++)
  66.         if (mat[i][coloana] != 0)
  67.             return i;
  68.     return -1;
  69. }
  70.  
  71. bool liberLinie(float mat[][10], int nrC, int linie, int coloana)
  72. {
  73.     for (int i = coloana; i < nrC; i++)
  74.         if (mat[linie][i] != 0)
  75.             return false;
  76.     return true;
  77. }
  78.  
  79. //3. Solutia sistemului
  80. void Determinat(float mat[][10], int nrL, int nrC)
  81. {
  82.     for (int i = 0; i < nrL; i++)
  83.         if (liberLinie(mat, nrC - 1, i, 0) == false)
  84.         {
  85.             solutie += to_string(mat[i][nrC - 1]);
  86.             if (i + 1 < nrL && liberLinie(mat, nrC - 1, i + 1, 0) == false)
  87.                 solutie += ",   ";
  88.         }
  89.     solutie += ")}. ";
  90. }
  91.  
  92. void Nedeterminat(float mat[][10], int nrL, int nrC, int frv, string text)
  93. {
  94.     int suma = 0, colNedet1, colNedet2 = 0;
  95.     if (text == "beta")
  96.     {
  97.         for (int i = 0; i < frv; i++)
  98.         {
  99.             for (int j = 0; j < nrC - 1; j++)
  100.                 if (j != frc1[i].coordColoana)
  101.                     colNedet2 = j;
  102.         }
  103.     }
  104.  
  105.     for (int i = 0; i < frv; i++)
  106.         suma += frc1[i].coordColoana;
  107.     colNedet1 = (nrC - 2) * (nrC - 1) / 2 - (suma + colNedet2);
  108.  
  109.     if (text == "alfa")
  110.     {
  111.         cout << "Indicele coloanei care da necunoscuta secundara: " << colNedet1 + 1 << "\n\n";
  112.         colNedet2 = -1;
  113.     }
  114.     else
  115.         cout << "Indicii coloanelor care dau necunoscutele secundare: " << colNedet1 + 1 << ' ' << colNedet2 + 1 << "\n\n";
  116.  
  117.     for (int i = 0; i < frv; i++)
  118.     {
  119.         if (mat[frc1[i].coordLinie][nrC - 1] != 0)
  120.         {
  121.             frc1[i].necPP += to_string(mat[frc1[i].coordLinie][nrC - 1]);
  122.             if (liberLinie(mat, nrC - 1, i, frc1[i].coordColoana + 1) == false && frc1[i].coordColoana + 1 < nrC - 1)
  123.                 frc1[i].necPP += " + ";
  124.         }
  125.         else
  126.         {
  127.             if (liberLinie(mat, nrC - 1, i, frc1[i].coordColoana + 1) == true)
  128.                 frc1[i].necPP += "0";
  129.         }
  130.         for (int j = 0; j < nrC - 1; j++)
  131.             if (j != frc1[i].coordColoana)
  132.             {
  133.                 if (mat[i][j] != 0)
  134.                 {
  135.                     if (j != colNedet1 && j != colNedet2)
  136.                         frc1[i].necPP += to_string(-mat[i][j]);
  137.                     else
  138.                     {
  139.                         if (j == colNedet1)
  140.                             frc1[i].necPP += "(" + to_string(-mat[i][j]) + ")*alfa";
  141.  
  142.                         if (j == colNedet2 && text == "beta")
  143.                             frc1[i].necPP += "(" + to_string(-mat[i][j]) + ")*beta";
  144.                     }
  145.  
  146.                     if (liberLinie(mat, nrC - 1, i, j + 1) == false && j + 1 < nrC - 1)
  147.                         frc1[i].necPP += " + ";
  148.                 }
  149.             }
  150.     }
  151.  
  152.     int i = 0, parcurgCol = 0, okAlfa = 0;
  153.     while (parcurgCol < nrC - 1 && i < frv)
  154.     {
  155.         if (parcurgCol == frc1[i].coordColoana)
  156.         {
  157.             solutie += frc1[i].necPP;
  158.             i++;
  159.         }
  160.         else
  161.         {
  162.             if (okAlfa == 0)
  163.             {
  164.                 solutie += "alfa";
  165.                 okAlfa = 1;
  166.             }
  167.             else
  168.                 solutie += "beta";
  169.         }
  170.         if (parcurgCol + 1 < nrC - 1)
  171.             solutie += ",   ";
  172.         parcurgCol++;
  173.     }
  174.  
  175.     if (parcurgCol + 1 < nrC - 1)
  176.         solutie += "alfa,   ";
  177.  
  178.     if (parcurgCol < nrC - 1)
  179.     {
  180.         if (text == "beta")
  181.             solutie += text;
  182.         else
  183.             solutie += "alfa";
  184.     }
  185. }
  186.  
  187. //2. Tipul sistemului
  188. void tipSistem(float mat[][10], int nrL, int nrC, int frv)
  189. {
  190.  
  191.     for (int i = 0; i < nrL; i++)
  192.         if (liberLinie(mat, nrC - 1, i, 0) == true && mat[i][nrC - 1] != 0)
  193.         {
  194.             fout << "incompatibil. \n";
  195.             fout << "3) Nu avem solutie. ";
  196.             return;
  197.         }
  198.  
  199.     solutie += "3) S = {(";
  200.     if (frv == nrC - 1)
  201.     {
  202.         fout << "compatibil determinat. \n";
  203.         Determinat(mat, nrL, nrC);
  204.     }
  205.     else
  206.         if (frv == (nrC - 1) - 1)
  207.         {
  208.             fout << "compatibil simplu nedeterminat. \n";
  209.             Nedeterminat(mat, nrL, nrC, frv, "alfa");
  210.             solutie += ") | alfa apartine numerelor reale}. ";
  211.         }
  212.         else
  213.             if (frv == (nrC - 1) - 2)
  214.             {
  215.                 fout << "compatibil dublu nedeterminat. \n";
  216.                 Nedeterminat(mat, nrL, nrC, frv, "beta");
  217.                 solutie += ") | alfa si beta apartin numerelor reale}. ";
  218.             }
  219.             else
  220.             {
  221.                 fout << "compatibil - nedeterminat. ";
  222.                 solutie = "";
  223.                 return;
  224.             }
  225.     fout << solutie;
  226. }
  227.  
  228. //1. Pasii intermediari
  229. void parcurgereMatrice(float mat[][10], int nrL, int nrC, int& frv)
  230. {
  231.     int contorLinie = 0, contorColoana = 0;
  232.     while (contorLinie < nrL && contorColoana < nrC - 1)
  233.     {
  234.         if (mat[contorLinie][contorColoana] == 0)
  235.         {
  236.             int indiceLinie = liberColoana(mat, nrL, contorLinie, contorColoana);
  237.             if (indiceLinie != -1)
  238.             {
  239.                 if (nrPasi == 0) fout << "\n\n";
  240.                 fout << "L_" << contorLinie + 1 << " <-> L_" << indiceLinie + 1 << ", matricea devine: \n\n";
  241.                 interschimbareLinii(mat, nrC, contorLinie, indiceLinie);
  242.                 afisareMatrice(mat, nrL, nrC);
  243.                 nrPasi++;
  244.             }
  245.             else
  246.                 contorColoana++;
  247.         }
  248.         else
  249.             if (mat[contorLinie][contorColoana] != 1 && mat[contorLinie][contorColoana] != 0)
  250.             {
  251.                 if (nrPasi == 0) fout << "\n\n";
  252.                 fout << "L_" << contorLinie + 1 << " -> " << "(1/" << mat[contorLinie][contorColoana] << ")*L_" << contorLinie + 1 << ", matricea devine: \n\n";
  253.                 multiplicareLinie(mat, nrC, contorLinie, 1 / mat[contorLinie][contorColoana]);
  254.                 afisareMatrice(mat, nrL, nrC);
  255.                 nrPasi++;
  256.             }
  257.             else
  258.                 if (mat[contorLinie][contorColoana] == 1)
  259.                 {
  260.                     for (int i = 0; i < nrL; i++)
  261.                     {
  262.                         if (i != contorLinie && mat[i][contorColoana] != 0)
  263.                         {
  264.                             if (nrPasi == 0) fout << "\n\n";
  265.                             fout << "L_" << i + 1 << " -> " << "(" << -mat[i][contorColoana] << ")*L_" << contorLinie + 1 << " + L_" << i + 1 << ", matricea devine: \n\n";
  266.                             operatieLinii(mat, nrC, i, contorLinie, mat[i][contorColoana]);
  267.                             afisareMatrice(mat, nrL, nrC);
  268.                             nrPasi++;
  269.                         }
  270.                     }
  271.                     frc1[frv].coordLinie = contorLinie++;
  272.                     frc1[frv++].coordColoana = contorColoana++;
  273.                 }
  274.     }
  275.     if (contorLinie == nrL || contorColoana == nrC - 1)
  276.     {
  277.         if (nrPasi == 0)
  278.             fout << "nu s-au efectuat schimbari in matricea initiala. \n";
  279.  
  280.         fout << "2) Tipul sistemului: sistemul este ";
  281.         tipSistem(mat, nrL, nrC, frv);
  282.     }
  283. }
  284.  
  285.  
  286. int main()
  287. {
  288.     float mat[10][10];
  289.     int nrL, nrC, frv = 0;
  290.  
  291.     citireMatrice(mat, nrL, nrC);
  292.  
  293.     fout << "Matricea extinsa a sistemului: \n\n";
  294.     afisareMatrice(mat, nrL, nrC);
  295.     fout << "1) Pasi intermediari: ";
  296.     parcurgereMatrice(mat, nrL, nrC, frv);
  297.  
  298.     cout << "Indicii coloanelor care dau necunoscutele principale: \n";
  299.     for (int i = 0; i < frv; i++)
  300.         cout << frc1[i].coordLinie + 1 << ' ' << frc1[i].coordColoana + 1 << endl;
  301.     return 0;
  302. }
Add Comment
Please, Sign In to add comment