Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- #include <iomanip>
- #include <string>
- using namespace std;
- ofstream fout("matriceOUT.txt");
- string solutie;
- int nrPasi;
- struct frecventa
- {
- int coordLinie = 0, coordColoana = 0;
- string necPP;
- }frc1[10];
- void citireMatrice(float mat[][10], int& nrL, int& nrC)
- {
- ifstream fin("matriceIN.txt");
- fin >> nrL >> nrC;
- for (int i = 0; i < nrL; i++)
- for (int j = 0; j < nrC; j++)
- fin >> mat[i][j];
- }
- void afisareMatrice(float mat[][10], int nrL, int nrC)
- {
- for (int i = 0; i < nrL; i++)
- {
- for (int j = 0; j < nrC; j++)
- {
- if (mat[i][j] == -0) mat[i][j] = 0;
- fout << setw(10) << mat[i][j] << ' ';
- }
- fout << "\n";
- }
- fout << "\n";
- }
- void interschimbareLinii(float mat[][10], int nrC, int linie1, int linie2) //S_ij sau L_i <-> L_j
- {
- for (int i = 0; i < nrC; i++)
- swap(mat[linie1][i], mat[linie2][i]);
- }
- void multiplicareLinie(float mat[][10], int nrC, int linie, float a) // M_i(a) sau L_i -> a*L_i
- {
- for (int i = 0; i < nrC; i++)
- mat[linie][i] = mat[linie][i] * a;
- }
- 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
- {
- for (int j = 0; j < nrC; j++)
- if ((float)(mat[linie1][j] - a * mat[linie2][j]) < (float)0.001 && (float)(mat[linie1][j] - a * mat[linie2][j]) > (float)-0.001)
- mat[linie1][j] = 0;
- else
- mat[linie1][j] = mat[linie1][j] - a * mat[linie2][j];
- }
- int liberColoana(float mat[][10], int nrL, int linie, int coloana)
- {
- for (int i = linie; i < nrL; i++)
- if (mat[i][coloana] != 0)
- return i;
- return -1;
- }
- bool liberLinie(float mat[][10], int nrC, int linie, int coloana)
- {
- for (int i = coloana; i < nrC; i++)
- if (mat[linie][i] != 0)
- return false;
- return true;
- }
- //3. Solutia sistemului
- void Determinat(float mat[][10], int nrL, int nrC)
- {
- for (int i = 0; i < nrL; i++)
- if (liberLinie(mat, nrC - 1, i, 0) == false)
- {
- solutie += to_string(mat[i][nrC - 1]);
- if (i + 1 < nrL && liberLinie(mat, nrC - 1, i + 1, 0) == false)
- solutie += ", ";
- }
- solutie += ")}. ";
- }
- void Nedeterminat(float mat[][10], int nrL, int nrC, int frv, string text)
- {
- int suma = 0, colNedet1, colNedet2 = 0;
- if (text == "beta")
- {
- for (int i = 0; i < frv; i++)
- {
- for (int j = 0; j < nrC - 1; j++)
- if (j != frc1[i].coordColoana)
- colNedet2 = j;
- }
- }
- for (int i = 0; i < frv; i++)
- suma += frc1[i].coordColoana;
- colNedet1 = (nrC - 2) * (nrC - 1) / 2 - (suma + colNedet2);
- if (text == "alfa")
- {
- cout << "Indicele coloanei care da necunoscuta secundara: " << colNedet1 + 1 << "\n\n";
- colNedet2 = -1;
- }
- else
- cout << "Indicii coloanelor care dau necunoscutele secundare: " << colNedet1 + 1 << ' ' << colNedet2 + 1 << "\n\n";
- for (int i = 0; i < frv; i++)
- {
- if (mat[frc1[i].coordLinie][nrC - 1] != 0)
- {
- frc1[i].necPP += to_string(mat[frc1[i].coordLinie][nrC - 1]);
- if (liberLinie(mat, nrC - 1, i, frc1[i].coordColoana + 1) == false && frc1[i].coordColoana + 1 < nrC - 1)
- frc1[i].necPP += " + ";
- }
- else
- {
- if (liberLinie(mat, nrC - 1, i, frc1[i].coordColoana + 1) == true)
- frc1[i].necPP += "0";
- }
- for (int j = 0; j < nrC - 1; j++)
- if (j != frc1[i].coordColoana)
- {
- if (mat[i][j] != 0)
- {
- if (j != colNedet1 && j != colNedet2)
- frc1[i].necPP += to_string(-mat[i][j]);
- else
- {
- if (j == colNedet1)
- frc1[i].necPP += "(" + to_string(-mat[i][j]) + ")*alfa";
- if (j == colNedet2 && text == "beta")
- frc1[i].necPP += "(" + to_string(-mat[i][j]) + ")*beta";
- }
- if (liberLinie(mat, nrC - 1, i, j + 1) == false && j + 1 < nrC - 1)
- frc1[i].necPP += " + ";
- }
- }
- }
- int i = 0, parcurgCol = 0, okAlfa = 0;
- while (parcurgCol < nrC - 1 && i < frv)
- {
- if (parcurgCol == frc1[i].coordColoana)
- {
- solutie += frc1[i].necPP;
- i++;
- }
- else
- {
- if (okAlfa == 0)
- {
- solutie += "alfa";
- okAlfa = 1;
- }
- else
- solutie += "beta";
- }
- if (parcurgCol + 1 < nrC - 1)
- solutie += ", ";
- parcurgCol++;
- }
- if (parcurgCol + 1 < nrC - 1)
- solutie += "alfa, ";
- if (parcurgCol < nrC - 1)
- {
- if (text == "beta")
- solutie += text;
- else
- solutie += "alfa";
- }
- }
- //2. Tipul sistemului
- void tipSistem(float mat[][10], int nrL, int nrC, int frv)
- {
- for (int i = 0; i < nrL; i++)
- if (liberLinie(mat, nrC - 1, i, 0) == true && mat[i][nrC - 1] != 0)
- {
- fout << "incompatibil. \n";
- fout << "3) Nu avem solutie. ";
- return;
- }
- solutie += "3) S = {(";
- if (frv == nrC - 1)
- {
- fout << "compatibil determinat. \n";
- Determinat(mat, nrL, nrC);
- }
- else
- if (frv == (nrC - 1) - 1)
- {
- fout << "compatibil simplu nedeterminat. \n";
- Nedeterminat(mat, nrL, nrC, frv, "alfa");
- solutie += ") | alfa apartine numerelor reale}. ";
- }
- else
- if (frv == (nrC - 1) - 2)
- {
- fout << "compatibil dublu nedeterminat. \n";
- Nedeterminat(mat, nrL, nrC, frv, "beta");
- solutie += ") | alfa si beta apartin numerelor reale}. ";
- }
- else
- {
- fout << "compatibil - nedeterminat. ";
- solutie = "";
- return;
- }
- fout << solutie;
- }
- //1. Pasii intermediari
- void parcurgereMatrice(float mat[][10], int nrL, int nrC, int& frv)
- {
- int contorLinie = 0, contorColoana = 0;
- while (contorLinie < nrL && contorColoana < nrC - 1)
- {
- if (mat[contorLinie][contorColoana] == 0)
- {
- int indiceLinie = liberColoana(mat, nrL, contorLinie, contorColoana);
- if (indiceLinie != -1)
- {
- if (nrPasi == 0) fout << "\n\n";
- fout << "L_" << contorLinie + 1 << " <-> L_" << indiceLinie + 1 << ", matricea devine: \n\n";
- interschimbareLinii(mat, nrC, contorLinie, indiceLinie);
- afisareMatrice(mat, nrL, nrC);
- nrPasi++;
- }
- else
- contorColoana++;
- }
- else
- if (mat[contorLinie][contorColoana] != 1 && mat[contorLinie][contorColoana] != 0)
- {
- if (nrPasi == 0) fout << "\n\n";
- fout << "L_" << contorLinie + 1 << " -> " << "(1/" << mat[contorLinie][contorColoana] << ")*L_" << contorLinie + 1 << ", matricea devine: \n\n";
- multiplicareLinie(mat, nrC, contorLinie, 1 / mat[contorLinie][contorColoana]);
- afisareMatrice(mat, nrL, nrC);
- nrPasi++;
- }
- else
- if (mat[contorLinie][contorColoana] == 1)
- {
- for (int i = 0; i < nrL; i++)
- {
- if (i != contorLinie && mat[i][contorColoana] != 0)
- {
- if (nrPasi == 0) fout << "\n\n";
- fout << "L_" << i + 1 << " -> " << "(" << -mat[i][contorColoana] << ")*L_" << contorLinie + 1 << " + L_" << i + 1 << ", matricea devine: \n\n";
- operatieLinii(mat, nrC, i, contorLinie, mat[i][contorColoana]);
- afisareMatrice(mat, nrL, nrC);
- nrPasi++;
- }
- }
- frc1[frv].coordLinie = contorLinie++;
- frc1[frv++].coordColoana = contorColoana++;
- }
- }
- if (contorLinie == nrL || contorColoana == nrC - 1)
- {
- if (nrPasi == 0)
- fout << "nu s-au efectuat schimbari in matricea initiala. \n";
- fout << "2) Tipul sistemului: sistemul este ";
- tipSistem(mat, nrL, nrC, frv);
- }
- }
- int main()
- {
- float mat[10][10];
- int nrL, nrC, frv = 0;
- citireMatrice(mat, nrL, nrC);
- fout << "Matricea extinsa a sistemului: \n\n";
- afisareMatrice(mat, nrL, nrC);
- fout << "1) Pasi intermediari: ";
- parcurgereMatrice(mat, nrL, nrC, frv);
- cout << "Indicii coloanelor care dau necunoscutele principale: \n";
- for (int i = 0; i < frv; i++)
- cout << frc1[i].coordLinie + 1 << ' ' << frc1[i].coordColoana + 1 << endl;
- return 0;
- }
Add Comment
Please, Sign In to add comment