Advertisement
aimon1337

Untitled

Feb 6th, 2022
873
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <vector>
  4. #include <algorithm>
  5.  
  6. using namespace std;
  7.  
  8. void citire_sistem(vector<vector<double>>& sistem, int& n, int& m)
  9. {
  10.     int numar;
  11.     vector <double>vectorAux;
  12.     ifstream fin;
  13.     fin.open("input.in");
  14.     fin >> n >> m;
  15.     for (int i = 0; i < n; i++)
  16.     {
  17.         for (int j = 0; j < m; j++)
  18.         {
  19.             fin >> numar;
  20.             vectorAux.push_back(numar);
  21.         }
  22.         sistem.push_back(vectorAux);
  23.         vectorAux.clear();
  24.     }
  25.     vectorAux.clear();
  26. }
  27.  
  28. void afisare_sistem(vector<vector<double>>sistem, int n, int m)
  29. {
  30.     for (int i = 0; i < n; i++)
  31.     {
  32.         cout << endl;
  33.         for (int j = 0; j < m; j++)
  34.         {
  35.             cout << sistem[i][j] << " ";
  36.         }
  37.     }
  38.     cout << endl;
  39. }
  40.  
  41. void determinare_nr_necunoscute_principale(vector<vector<double>>sistem, int n, int& nrNecunoscutePrincipale)
  42. {
  43.  
  44.     for (int i = 0; i < n; i++)
  45.     {
  46.         if (sistem[i][i] == 1)
  47.         {
  48.             nrNecunoscutePrincipale++;
  49.         }
  50.  
  51.     }
  52. }
  53.  
  54. void afisare_solutii(vector<vector<double>>sistem, int n, int m, int tipSistem)
  55. {
  56.     vector<double>vectorDeSolutii;
  57.     if (tipSistem == 1)
  58.     {
  59.         cout << endl << "Solutiile sunt S={";
  60.         for (int i = 0; i < n - 1; i++)
  61.         {
  62.             cout << sistem[i][m - 1] << ", ";
  63.         }
  64.         cout << sistem[n - 1][m - 1] << "}";
  65.     }
  66.     if (tipSistem == 2)
  67.     {
  68.         int nrNecunoscutePrincipale=0;
  69.         determinare_nr_necunoscute_principale(sistem, n, nrNecunoscutePrincipale);
  70.         char indice[8];
  71.         for (int i = 0; i < m - nrNecunoscutePrincipale; i++)
  72.         {
  73.             indice[i] = 'a' + i;
  74.         }
  75.         cout << endl << "Solutiile sunt S={ ";
  76.         for (int i = 0; i < nrNecunoscutePrincipale; i++)
  77.         {
  78.             if (sistem[i][i] == 1)
  79.             {
  80.                 cout << sistem[i][m - 1];
  81.                 for (int j = nrNecunoscutePrincipale; j < m - 1; j++)
  82.                 {
  83.                     if (sistem[i][j] > 0 && sistem[i][j]!=0)
  84.                     {
  85.                         cout<<"-"<< sistem[i][j] << "*" << indice[j - nrNecunoscutePrincipale];
  86.                     }
  87.                     else if(sistem[i][j]!=0)
  88.                     {
  89.                         cout<<"+"<< -1*sistem[i][j] << "*" << indice[j - nrNecunoscutePrincipale];
  90.                     }
  91.                 }
  92.             }
  93.             cout << " ; ";
  94.         }
  95.         for (int i = 0; i < m-nrNecunoscutePrincipale-1; i++)
  96.         {
  97.             cout << indice[i] << " ; ";
  98.         }
  99.         cout << "}";
  100.         exit(1);
  101.     }
  102. }
  103.  
  104.  
  105. void afisare_tip_sistem(vector<vector<double>>sistem, int n, int m, int& tipSistem)
  106. {
  107.     for (int i = 0; i < n; i++)
  108.     {
  109.         if (sistem[i][i] == 1)
  110.         {
  111.             continue;
  112.         }
  113.         else
  114.         {
  115.             cout << endl << "Sistemul este compatibil nedeterminat" << endl;
  116.             tipSistem = 2;
  117.             return;
  118.         }
  119.     }
  120.     for (int i = 0; i < n; i++)
  121.     {
  122.         for (int j = 0; j < m - 1; j++)
  123.         {
  124.             if (i != j && sistem[i][j] != 0)
  125.             {
  126.                 cout << endl << "Sistemul este compatibil nedeterminat" << endl;
  127.                 tipSistem = 2;
  128.                 afisare_solutii(sistem, n, m, tipSistem);
  129.                 return;
  130.             }
  131.         }
  132.     }
  133.     cout << endl << "Sistemul este compatibil determinat" << endl;
  134.     tipSistem = 1;
  135. }
  136.  
  137. void mutare_linie_cu_elemente_nulle(vector<vector<double>>& sistem, int i, int n, int m)
  138. {
  139.     vector<double>vectorAux;
  140.     for (int j = 0; j < m; j++)
  141.     {
  142.         vectorAux.push_back(sistem[i][j]);
  143.     }
  144.     for (int j = i; j < n - 1; j++)
  145.     {
  146.         int counter = 0;
  147.         for (int index = 0; index < m; index++)
  148.         {
  149.             if (sistem[j + 1][index] == 0)
  150.             {
  151.                 counter++;
  152.             }
  153.         }
  154.         if (counter != m)
  155.         {
  156.             for (int k = 0; k < m; k++)
  157.             {
  158.                 sistem[j][k] = sistem[j + 1][k];
  159.             }
  160.         }
  161.         else
  162.         {
  163.             cout << endl << "Sistemul este compatibil determinat" << endl;
  164.             afisare_solutii(sistem, n - 2, m, 1);
  165.             exit(1);
  166.         }
  167.     }
  168.     cout << endl << "Linia" << i << " a ajuns pe ultima pozitie" << endl;;
  169.     for (int j = 0; j < m; j++)
  170.     {
  171.         sistem[n - 1][j] = vectorAux[j];
  172.     }
  173.     afisare_sistem(sistem, n, m);
  174. }
  175.  
  176. void interschimbare_linii(vector<vector<double>>& sistem, int linie1, int linie2, int m)
  177. {
  178.     cout << endl << "L" << linie1 << " <-> " << " L" << linie2 << endl;
  179.     for (int j = 0; j < m; j++)
  180.     {
  181.         swap(sistem[linie1][j], sistem[linie2][j]);
  182.     }
  183. }
  184.  
  185. void verificare_daca_toata_linia_este_zero(vector<vector<double>>& sistem, int& i, int n, int m, bool& interschimbareLinie)
  186. {
  187.     bool esteGasitUnElementNenull = false;
  188.     for (int j = 0; j < m - 1 && esteGasitUnElementNenull == false; j++)
  189.     {
  190.         if (sistem[i][j] != 0)
  191.         {
  192.             esteGasitUnElementNenull = true;
  193.         }
  194.     }
  195.     if (esteGasitUnElementNenull == true)
  196.     {
  197.         if (i + 1 < n)
  198.         {
  199.             interschimbare_linii(sistem, i, i + 1, m);
  200.             afisare_sistem(sistem, n, m);
  201.             interschimbareLinie = true;
  202.         }
  203.     }
  204.     if (interschimbareLinie == false)
  205.     {
  206.         if (sistem[i][m - 1] == 0)
  207.         {
  208.             mutare_linie_cu_elemente_nulle(sistem, i, n, m);
  209.         }
  210.         else
  211.         {
  212.             int counter = 0;
  213.             for (int j = 0; j < m; j++)
  214.             {
  215.                 if (sistem[i][j] == 0)
  216.                 {
  217.                     counter++;
  218.                 }
  219.             }
  220.             if (counter == m - 1)
  221.             {
  222.                 cout << "Sistemul este incompatibil";
  223.                 exit(1);
  224.             }
  225.         }
  226.     }
  227. }
  228.  
  229. void verificare_daca_elementul_de_pe_diagonala_principala_este_1(vector<vector<double>>& sistem, int i, int n, int m, bool& interschimbareLinie)
  230. {
  231.     if (sistem[i][i] == 1) return;
  232.     else
  233.     {
  234.         if (sistem[i][i] == 0)
  235.         {
  236.             verificare_daca_toata_linia_este_zero(sistem, i, n, m, interschimbareLinie);
  237.         }
  238.         else
  239.         {
  240.             cout << endl << "L" << i << " <- " << 1 / sistem[i][i] << "L" << i << endl;
  241.             double inmultitorul = 1.0 / sistem[i][i];
  242.             for (int j = 0; j < m; j++)
  243.             {
  244.                 if (sistem[i][j] != 0)
  245.                 {
  246.                     sistem[i][j] *= inmultitorul;
  247.                 }
  248.             }
  249.             afisare_sistem(sistem, n, m);
  250.         }
  251.     }
  252. }
  253.  
  254. void modificare_elemente_de_sub_diagonala_principala(vector<vector<double>>& sistem, int i, int n, int m)
  255. {
  256.     if (sistem[i][i] == 1)
  257.     {
  258.         for (int j = i + 1; j < n; j++)
  259.         {
  260.             if (sistem[j][i] != 0)
  261.             {
  262.                 double inmultitor = sistem[j][i];
  263.                 cout << endl << "L" << j << " <- " << "L" << j << " - " << inmultitor << "L" << i << endl;
  264.                 for (int k = 0; k < m; k++)
  265.                 {
  266.                     sistem[j][k] -= inmultitor * sistem[i][k];
  267.                 }
  268.                 afisare_sistem(sistem, n, m);
  269.             }
  270.         }
  271.     }
  272. }
  273.  
  274. void modificare_elemente_de_peste_diagonala_principala(vector<vector<double>>& sistem, int i, int n, int m)
  275. {
  276.     if (sistem[i][i] == 1)
  277.     {
  278.         for (int j = 0; j < i; j++)
  279.         {
  280.             if (sistem[j][i] != 0)
  281.             {
  282.                 double inmultitor = sistem[j][i];
  283.                 cout << endl << "L" << j << " <- " << "L" << j << " - " << inmultitor << "L" << i << endl;
  284.                 for (int k = 0; k < m; k++)
  285.                 {
  286.                     sistem[j][k] -= inmultitor * sistem[i][k];
  287.                 }
  288.                 afisare_sistem(sistem, n, m);
  289.             }
  290.         }
  291.     }
  292. }
  293.  
  294. void interschimbare_coloane(vector<vector<double>>& sistem, int coloana1, int coloana2, int n, int m)
  295. {
  296.     for (int i = 0; i < n; i++)
  297.     {
  298.         swap(sistem[i][coloana1], sistem[i][coloana2]);
  299.     }
  300.     cout << endl << "Am interschimbat coloana " << coloana1 << " cu coloana " << coloana2 << endl;
  301.     afisare_sistem(sistem, n, m);
  302. }
  303.  
  304. void verificare_daca_coloanele_se_pot_interschimba(vector<vector<double>>& sistem, int i, int n, int m, bool& interschimbareColoane)
  305. {
  306.     for (int j = i + 1; j < m && interschimbareColoane == false; j++)
  307.     {
  308.         if (sistem[i][j] != 0)
  309.         {
  310.             interschimbare_coloane(sistem, i, j, n, m);
  311.             interschimbareColoane = true;
  312.         }
  313.     }
  314. }
  315.  
  316. void determinare_solutie_sistem(vector<vector<double>>& sistem, int n, int m)
  317. {
  318.     for (int i = 0; i < n; i++)
  319.     {
  320.         bool interschimbareLinie = false;
  321.         verificare_daca_elementul_de_pe_diagonala_principala_este_1(sistem, i, n, m, interschimbareLinie);
  322.         if (interschimbareLinie == false)
  323.         {
  324.             modificare_elemente_de_sub_diagonala_principala(sistem, i, n, m);
  325.             modificare_elemente_de_peste_diagonala_principala(sistem, i, n, m);
  326.             if (i == n - 1 && sistem[i][i] == 0)
  327.             {
  328.                 bool interschimbareColoane = false;
  329.                 verificare_daca_coloanele_se_pot_interschimba(sistem, i, n, m, interschimbareColoane);
  330.                 if (interschimbareColoane == true)
  331.                 {
  332.                     i--;
  333.                 }
  334.             }
  335.         }
  336.         else
  337.         {
  338.             i--;
  339.         }
  340.     }
  341.     int tipSistem;
  342.     afisare_tip_sistem(sistem, n, m, tipSistem);
  343.     afisare_solutii(sistem, n, m, tipSistem);
  344. }
  345.  
  346. int main()
  347. {
  348.     vector<vector<double>>sistem;
  349.     int n, m;
  350.     citire_sistem(sistem, n, m);
  351.     determinare_solutie_sistem(sistem, n, m);
  352.     return 0;
  353. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement