Я пытаюсь сделать программу для калькулятора матриц и до сих пор это сделал. Я хочу избежать повторения или репликации операторов в моем коде, но хочу ограничить использование указателей в этом коде. Можете ли вы предложить улучшения с помощью кода, который я могу сделать?
Я знаю, что могу использовать и структуры, но, похоже, вижу в этом некоторую проблему. Пожалуйста, помогите мне предложить какие-либо улучшения в этом, также приемлемы и другие отзывы, связанные с модуляцией. Любая помощь будет заметна. Спасибо!
#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 ответ
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
— Джаскират Сингх
Понятно, как мне это исправить?
— Джаскират Сингх
Я только что снова проверил, и у меня он полностью работает. Я не знаю, почему в вашем случае это так.
— Джаскират Сингх