Skip to content

Instantly share code, notes, and snippets.

@Yegorsh
Created December 21, 2021 21:03
Show Gist options
  • Select an option

  • Save Yegorsh/4b82a47164c1244ab6f00b38050b28bb to your computer and use it in GitHub Desktop.

Select an option

Save Yegorsh/4b82a47164c1244ab6f00b38050b28bb to your computer and use it in GitHub Desktop.

Revisions

  1. Yegorsh created this gist Dec 21, 2021.
    140 changes: 140 additions & 0 deletions cramers_rule.cpp
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,140 @@
    #include <iostream>
    using namespace std;

    void PrintMatrix(int **matrix, const int size){
    for (int i=0; i<size; i++){
    for (int j=0; j<size+1; j++){
    if (j<size) {
    cout << matrix[i][j] << "*X" << j+1 << " ";
    }
    else{
    cout << "=\t" << matrix[i][j] << "\t";
    }
    }
    cout << endl;
    }
    }

    void FillMatrix(int **matrix, const int size){
    for (int i=0; i<size; i++) {
    for (int j = 0; j < size + 1; j++){
    if (j<size) {
    cout << "a[" << i+1 << "][" << j+1 << "] = ";
    cin >> matrix[i][j];
    }
    else{
    cout << "b[" << i+1 << "] = ";
    cin >> matrix[i][j];
    }
    }
    }
    }

    void clearMemory(int** matrix, int size){
    for (int i = 0; i < size; i++){
    delete[] matrix[i];
    }
    delete [] matrix;
    }

    int calcDet(int** matrix, int size){
    int Det=0;
    if (size==1){
    return matrix[0][0];
    }
    else if (size==2){
    return matrix[0][0]*matrix[1][1] - matrix[0][1]*matrix[1][0];
    }

    else{
    int sign = 1;

    int** newMatrix = new int*[size-1];
    for (int s=0; s<size-1; s++) {
    newMatrix[s] = new int[size-1];
    }

    for (int k = 0; k < size; k++){
    int sub_i = 0;
    for (int i = 1; i < size; i++){
    int sub_j = 0;
    for (int j = 0; j < size; j++){
    if (j == k){
    continue;
    }
    else{
    newMatrix[sub_i][sub_j] = matrix[i][j];
    sub_j++;
    }
    }
    sub_i++;
    }
    Det += sign * matrix[0][k] * calcDet(newMatrix,size-1);
    sign = -sign;
    }
    clearMemory(newMatrix,size-1);
    }
    return Det;
    }

    int main(){
    double X_i;
    double MainDet, Det_i;
    int size;
    cout << "Введите количество уравнений" << endl;
    cin >> size;

    int **system = new int *[size]; //Массив системы линейных уравнений
    for (int i = 0; i < size; i++) {
    system[i] = new int [(size+1)];
    }

    cout << "Введите коэффициенты матрицы системы" << endl;
    FillMatrix(system, size);
    cout << endl;
    PrintMatrix(system, size);
    cout << endl;

    int **main_det = new int *[size]; //Определитель системы
    for (int i = 0; i < size; i++) {
    main_det[i] = new int [size];
    }
    for (int i=0; i<size; i++){
    for (int j=0; j<size; j++){
    main_det[i][j] = system[i][j];
    }
    }

    MainDet = calcDet(main_det, size);

    if (MainDet != 0) {
    int **iDet = new int *[size];
    for (int i = 0; i < size; i++) {
    iDet[i] = new int[size];
    }

    for (int k = 0; k < size; k++) {
    for (int i = 0; i < size; i++) {
    for (int j = 0; j < size; j++) {
    if (j != k) {
    iDet[i][j] = system[i][j];
    } else {
    iDet[i][j] = system[i][size];
    }
    }
    }

    Det_i = calcDet(iDet, size);
    X_i = double(Det_i) / (MainDet);
    cout << "X" << (k + 1) << " = " << X_i << endl;
    }
    clearMemory(iDet, size);
    }
    else{
    cout << "Определитель матрицы равен нулю!" << endl;
    }

    clearMemory(main_det, size);
    clearMemory(system, size);
    return 0;
    }