Программа Matrix Calculator на языке C. Как избежать дублирования

Я пытаюсь сделать программу для калькулятора матриц и до сих пор это сделал. Я хочу избежать повторения или репликации операторов в моем коде, но хочу ограничить использование указателей в этом коде. Можете ли вы предложить улучшения с помощью кода, который я могу сделать?

Я знаю, что могу использовать и структуры, но, похоже, вижу в этом некоторую проблему. Пожалуйста, помогите мне предложить какие-либо улучшения в этом, также приемлемы и другие отзывы, связанные с модуляцией. Любая помощь будет заметна. Спасибо!

#include <stdio.h>

void matrixReadValues(int rows, int columns, int readInput[rows][columns]);
void matrixPrint(int rows, int columns, int readOutput[rows][columns]);
void matrixAddition(int rows, int columns, int matrix1[rows][columns], int matrix2[rows][columns]);
void matrixSubtraction(int rows, int columns, int matrix1[rows][columns], int matrix2[rows][columns]);
void matrixMultiplication(int rowsA, int columnsA, int rowsB, int columnsB, int matrix1[rowsA][columnsA], int matrix2[rowsB][columnsB]);
void matrixTransposePrint(int rows, int columns, int matrixTranspose[rows][columns]);
int matrixDeterminant(int rows, int columns, int matrixDet[rows][columns], int matrixOrder);
void matrixRowEchleonForm(int rows, int columns, int matrix1[rows][columns]);

int main(void){
    
    int operation; //used in swtich statements
    char again = 'Y';
    
    int rowsA, columnsA;
    int rowsB, columnsB;
    int matrixA[rowsA][columnsA];
    int matrixB[rowsB][columnsB];
    
    while (again == 'Y'){


        //this is the operation menu just type A, B, C or D to calculate
        printf("n tttOperation Menunn");
        printf("t1. to Addn");
        printf("t2. to Subtractn");
        printf("t3. to Multiply two matricesn");
        printf("t4. to find the transpose of the matrixn");
        printf("t5. to find the determinant of the matrixnn");
        printf("t6. to find the rowecheleon form of the matrixnn");
        printf("tEnter your choice: ");
        scanf(" %d", &operation);
        
        switch (operation){
            
        //Case 1 is for addition of 2 matrices 
        
        case 1:
            printf("ntEnter the #rows and #columns for matrix A: ");
            scanf("%d%d", &rowsA, &columnsA);

            printf("tEnter the #rows and #cols for matrix B: ");
            scanf("%d%d", &rowsB, &columnsB);

            while ((rowsA != rowsB) && (columnsA != columnsB)){
                printf("ntMatrices must be of the same sizen");
                printf("ntEnter the #rows and #columns for matrix A: ");
                scanf("%d%d", &rowsA, &columnsA);

                printf("ntEnter the #rows and #cols for matrix B: ");
                scanf("%d%d", &rowsB, &columnsB);

            }


            printf("ntNow Let us enter the elements of Matrix A %d x %d matrix.nn", rowsA, columnsA);
            
            matrixReadValues(rowsA, columnsA, matrixA);
            printf("nttMatrix Ann");
            matrixPrint(rowsA, columnsA, matrixA);
            
            printf("ntNow Let us enter the elements of Matrix B %d x %d matrix.nn", rowsB, columnsB);
            
            matrixReadValues(rowsB, columnsB, matrixB);
            printf("nttMatrix Bnn");
            matrixPrint(rowsB, columnsB, matrixB);
            
            printf("tnAdding the 2 matrices now, we get Matrix A + B:nn");
            matrixAddition(rowsA, columnsA, matrixA, matrixB);


            break;
            
            // Case 2 is for subtraction of the 2 matrices
            case 2:
            printf("ntEnter the #rows and #columns for matrix A: ");
            scanf("%d%d", &rowsA, &columnsA);

            printf("tEnter the #rows and #cols for matrix B: ");
            scanf("%d%d", &rowsB, &columnsB);

            while ((rowsA != rowsB) && (columnsA != columnsB)){
                printf("ntMatrices must be of the same sizen");
                printf("ntEnter the #rows and #columns for matrix A: ");
                scanf("%d%d", &rowsA, &columnsA);

                printf("ntEnter the #rows and #cols for matrix B: ");
                scanf("%d%d", &rowsB, &columnsB);

            }


            printf("ntNow Let us enter the elements of Matrix A %d x %d matrix.nn", rowsA, columnsA);
            
            matrixReadValues(rowsA, columnsA, matrixA);
            printf("nttMatrix Ann");
            matrixPrint(rowsA, columnsA, matrixA);
            
            printf("ntNow Let us enter the elements of Matrix B %d x %d matrix.nn", rowsB, columnsB);
            
            matrixReadValues(rowsB, columnsB, matrixB);
            printf("nttMatrix Bnn");
            matrixPrint(rowsB, columnsB, matrixB);
            
            printf("tnSubtracting the 2 matrices now, we get Matrix A - Matrix B:nn");
            matrixSubtraction(rowsA, columnsA, matrixA, matrixB);


            break;
            
            
        //Case 3 is for addition of 2 matrices 
        
        case 3:
            printf("ntEnter the #rows and #columns for matrix A: ");
            scanf("%d%d", &rowsA, &columnsA);

            printf("tEnter the #rows and #cols for matrix B: ");
            scanf("%d%d", &rowsB, &columnsB);

            while ((rowsA != rowsB) && (columnsA != columnsB)){
                printf("ntMatrices must be of the same sizen");
                printf("ntEnter the #rows and #columns for matrix A: ");
                scanf("%d%d", &rowsA, &columnsA);

                printf("ntEnter the #rows and #cols for matrix B: ");
                scanf("%d%d", &rowsB, &columnsB);

            }


            printf("ntNow Let us enter the elements of Matrix A %d x %d matrix.nn", rowsA, columnsA);
            
            matrixReadValues(rowsA, columnsA, matrixA);
            printf("nttMatrix Ann");
            matrixPrint(rowsA, columnsA, matrixA);
            
            printf("ntNow Let us enter the elements of Matrix B %d x %d matrix.nn", rowsB, columnsB);
            
            matrixReadValues(rowsB, columnsB, matrixB);
            printf("nttMatrix Bnn");
            matrixPrint(rowsB, columnsB, matrixB);
            
            printf("tntMultiplying the 2 matrices now:nn");
            matrixMultiplication(rowsA, columnsA, rowsB, columnsB, matrixA, matrixB);
            
            //Adding the default statemnt if no option matches
            default:
            printf("nIncorrect option! Please choose a number between 1-4.");
            break;
            
        //Case 4 is for doing the transpose of the matrix
            
        case 4:
            printf("ntEnter the #rows and #columns for matrix A: ");
            scanf("%d%d", &rowsA, &columnsA);

            printf("ntNow Let us enter the elements of Matrix %d x %d matrix.nn", rowsA, columnsA);
            
            matrixReadValues(rowsA, columnsA, matrixA);
            printf("nttMatrixnn");
            matrixPrint(rowsA, columnsA, matrixA);
            
            printf("tnDoing the transpose of the above matrix:nn");
            matrixTransposePrint(rowsA, columnsA, matrixA);


            break;
        // Case 5 is for finding the determinant of a matrix    
            case 5:
            printf("ntEnter the #rows and #columns for matrix A. Make sure you add the square matrix: ");
            scanf("%d%d", &rowsA, &columnsA);

            printf("ntNow Let us enter the elements of Matrix %d x %d matrix.nn", rowsA, columnsA);
            
            matrixReadValues(rowsA, columnsA, matrixA);
            printf("nttMatrixnn");
            matrixPrint(rowsA, columnsA, matrixA);
            
            printf("tn Finding the determinant of the above matrix:nn");
            
            int detRecievedFromFunction;
            detRecievedFromFunction = matrixDeterminant(rowsA, columnsA, matrixA, rowsA);
            
            printf("%d", detRecievedFromFunction);


            break;
            
            //Writing the Row Echeleon form
            case 6:
            printf("ntEnter the #rows and #columns for matrix A. Make sure you add the square matrix: ");
            scanf("%d%d", &rowsA, &columnsA);

            printf("ntNow Let us enter the elements of Matrix %d x %d matrix.nn", rowsA, columnsA);
            
            matrixReadValues(rowsA, columnsA, matrixA);
            printf("nttMatrixnn");
            matrixPrint(rowsA, columnsA, matrixA);
            
            printf("tn Finding the RowElcheleon form of the above matrix:nn");
            
            matrixRowEchleonForm(rowsA, columnsA, matrixA);
            
            matrixPrint(rowsA, columnsA, matrixA);


            break;
        }
        
            
    }

}

//Function to read the value from the users
void matrixReadValues(int rows, int columns, int readInput[rows][columns]){
    
    int i,j;
    for(i=0; i < rows; i++ ){
        for(j=0; j < columns; j++){
            
            printf("tEnter the elemnts [%d][%d]: ", i+1, j+1);
            scanf("%d", &readInput[i][j]);
                        
        }
    }
    
}

//Printing the matrix values

void matrixPrint(int rows, int columns, int readOutput[rows][columns]){
    
    int i,j;
    for(i=0; i < rows; i++ ){
        for(j=0; j < columns; j++){
            
            printf("t%dt", readOutput[i][j]);
        }
        printf("n");
    }
        
}

//Function to add the 2 matrices

void matrixAddition(int rows, int columns, int matrix1[rows][columns], int matrix2[rows][columns]){
    
    int sum[rows][columns];
    int i,j;
    for(i=0; i < rows; i++ ){
        for(j=0; j < columns; j++){
            
            sum[i][j] = matrix1[i][j] + matrix2[i][j];
            printf("t%dt", sum[i][j]);
        }
        printf("n");               
    }
}

//Function to subtract the 2 matrices

void matrixSubtraction(int rows, int columns, int matrix1[rows][columns], int matrix2[rows][columns]){
    
    int difference[rows][columns];
    int i,j;
    for(i=0; i < rows; i++ ){
        for(j=0; j < columns; j++){
            
            difference[i][j] = matrix1[i][j] - matrix2[i][j];
            printf("t%dt", difference[i][j]);
        }
        printf("n");               
    }
}

//Functrion to multiply the 2 matrices

void matrixMultiplication(int rowsA, int columnsA, int rowsB, int columnsB, int matrix1[rowsA][columnsA], int matrix2[rowsB][columnsB]){
    
    int multiply[rowsA][columnsB];
    int i, j, k;
    
    //Initializing all the elemnts of multiply to 0
    for (i = 0; i<rowsA; ++i)
    
        for (j = 0; j<columnsB; ++j)
        {
            multiply[i][j] = 0;
        }
    
    
    // Checking whether the user wants to do "AB" or "BA" multiplication
    
    int options;
    printf("t What type of operation do you want to perform from A x B or B x A? <Write either 1 for A x B or 2 for B x A>" );
    scanf("%d", &options);
    
    if(options == 1){
        
        // Running the loop for the multiplication of the 2 matrices 
        for (i = 0; i<rowsA; i++){
        
            for (j = 0; j<columnsB; j++){
            
                for (k = 0; k<columnsA; k++){
                
                  multiply[i][j] += matrix1[i][k] * matrix2[k][j];
                }
            printf("t%dt", multiply[i][j]);
            }
        printf("n");
       }
       
    }
    
    
    else if( options == 2){
        
        // Running the loop for the multiplication of the 2 matrices 
        for (i = 0; i<rowsB; i++){
        
            for (j = 0; j<columnsA; j++){
            
                for (k = 0; k<columnsB; k++){
                
                  multiply[i][j] += matrix2[i][k] * matrix1[k][j];
                }
            printf("t%dt", multiply[i][j]);
            }
        printf("n");
       }
    }
       
    
    
    else {
        
        printf("Please add the appropiate values:");
        printf("What type of operation do you want to perform from A x B or B x A? <Write either 1 for A x B or 2 for B x A>" );
        scanf("%d", &options);
    }
    

}

//Printing the transpose matrix values

void matrixTransposePrint(int rows, int columns, int matrixTranspose[rows][columns]){
    
    int i,j;
    for(i=0; i < rows; i++ ){
        for(j=0; j < columns; j++){
            
            printf("t%dt", matrixTranspose[j][i]);
        }
        printf("n");
    }
        
}

//Printing the Determinant of Matrix
int matrixDeterminant(int rows, int columns, int matrixDet[rows][columns], int matrixOrder){
    
    int determinant=0, currentColumn, s = 1, i, j, m, n;
    int subMatrixDet[rows][columns];  //This is the matrix which extracted from the enterred matrix (matrixDet[rows][columns]) as a sub matrix
    
    if(matrixOrder == 1){
        
        return(matrixDet[0][0]);
        
    }
    
    else{
        
        // We would be applying the loop to perform the operation for every column
        for(currentColumn = 0; currentColumn < matrixOrder - 1; currentColumn++){
            m = 0, n = 0; //We initialized it because everytime loop will run we will extract new determinant 
            
            //Loop for writing/extracting the sub matrix from the original matrix in order to calculate the minor
            for(i=0; i < matrixOrder; i++){
                for(j=0; j < matrixOrder; j++){
                    
                    subMatrixDet[i][j] = 0;
                    
                    //Since we have to exclude the element which we multiply with the sub determinant matrix
                    if(i !=0 && j !=0 ){
                        subMatrixDet[m][n] = matrixDet[i][j];
                        
                        //Incrementing the Value of n because first the different columns gets filled.
                        if(n < (matrixOrder - 2)){
                            n++;
                        }
                        
                        else{
                            n=0;
                            m++;
                        }
                        
                    }
                    
                }
                
            }   
            
        }
        determinant = determinant + s*(matrixDet[0][currentColumn] * matrixDeterminant(rows, columns, subMatrixDet, matrixOrder-1) );
        s = -1 * s;
    }
    return determinant;
}

// Converting in the row echleon form
void matrixRowEchleonForm(int rows, int columns, int matrix1[rows][columns]){
    
    int i,j, nextRow;
    int firstElement;
    int firstElementNextRow;
    for(i = 0; i < rows; i++){
        
        if(matrix1[i][i] != 1){
            
            firstElement = matrix1[i][i];
            
            //Checking if the furst element is the 0
            if(firstElement == 0){
                continue; //We are avoiding to divide the first element by 0
            }
            
            //Now dividing the specific row with different column number by the First element of the row
            for(j=0; j < columns ; j++){
                
                matrix1[i][j] = matrix1[i][j] / firstElement;
                
            }
            
        }
        
        for(nextRow = i + 1; nextRow < rows; nextRow++){
            
            //We are now subtracting the next row with the previous row in order to make the very first elements 0
            firstElementNextRow = matrix1[nextRow][i];
            
            for(j=0; j < columns; j++){
                
                matrix1[nextRow][j] = matrix1[nextRow][j] - (matrix1[i][j] * firstElementNextRow);
            }
        }
        
    }
}

```

1 ответ
1

matrixA и B одинаковы, как показано на этом printf:

int matrixA[rowsA][columnsA];
int matrixB[rowsB][columnsB];
printf("%p %d %d %pn", matrixA, rowsA, columnsA, matrixB);
return;

Обе матрицы имеют одинаковый адрес:

0x7ffd8a489790 0 0 0x7ffd8a489790

как следствие объявления int matrixA[0][0].

Это приводит к неверным результатам.


        Enter the elemnts [1][1]: 5

                Matrix A

        5

        Now Let us enter the elements of Matrix B 1 x 1 matrix.

        Enter the elemnts [1][1]: 30

                Matrix B

        30

Adding the 2 matrices now, we get Matrix A + B:

        60

Разве это не должно быть 35?


Перезапись A также можно увидеть, показывая ее снова после ввода B:

    Now Let us enter the elements of Matrix A 2 x 2 matrix.

    Enter the elemnts [1][1]: 1
    Enter the elemnts [1][2]: 2
    Enter the elemnts [2][1]: 3
    Enter the elemnts [2][2]: 4

            Matrix A

    1               2
    3               4

    Now Let us enter the elements of Matrix B 2 x 2 matrix.

    Enter the elemnts [1][1]: 6
    Enter the elemnts [1][2]: 7
    Enter the elemnts [2][1]: 8
    Enter the elemnts [2][2]: 9

            Matrix B

    6               7
    8               9

            Matrix A

    6               7         <------- now A has B's values
    8               9

Adding the 2 matrices now, we get Matrix A + B:

    12              14        <-------- we get B + B
    16              18        

  • но это работает для меня. не могли бы вы объяснить больше, а также помочь мне узнать, как это можно улучшить?

    — Джаскират Сингх

  • Кроме того, я сделал этот код из этого, но это просто печать адреса для меня, и я не знаю, почему это так. pastie.org/p/5Qr5UA9qVYyYuJnVz7Eh8m

    — Джаскират Сингх

  • Понятно, как мне это исправить?

    — Джаскират Сингх

  • Я только что снова проверил, и у меня он полностью работает. Я не знаю, почему в вашем случае это так.

    — Джаскират Сингх

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *