2

J'ai fait ce programme pour un devoir et il se bloque sans erreur lors de l'exécution. De plus, après correction, toutes les suggestions pour augmenter l'efficacité de mon approche de codage sont appréciées. Premièrement, je déclarais m, n, p, q comme variables globales et je passais seulement les tableaux aux fonctions, mais le programme se comportait bizarrement.tableaux multidimensionnels de longueur variable

Puis j'ai inclus les dimensions des tableaux comme arguments dans chaque fonction et les ai déclarés partout. CRASH

* VLA SOUTENU

//functions on matrices 
#include<stdio.h> 

int i, j; 
void getMatrix(int m, int n, int values[m][n]); 
void displayMatrix(int m, int n, int values[m][n]); 
void transposeMatrix(int m, int n, int values[m][n]); 
void addMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]); 
void multiplyMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]); 

int main() 
{ 
    int m, n, p, q, A[m][n], B[p][q]; 

    printf("Enter the no. of Rows of the first Matrix : "); 
    scanf("%d", &m); 
    printf("Enter the no. of Columns of the first Matrix : "); 
    scanf("%d", &n); 

    printf("Enter the elements of the first matrix: \n"); 
    getMatrix(m, n, A); 
    printf("The entered Matrix:\n"); 
    displayMatrix(m, n, A); 
    printf("The transpose of the entered Matrix:\n"); 
    transposeMatrix(m, n, A); 

    printf("Enter the no. of Rows of the second Matrix : "); 
    scanf("%d", &p); 
    printf("Enter the no. of Columns of the second Matrix : "); 
    scanf("%d", &q); 

    printf("Enter the elements of the secong matrix: \n"); 
    getMatrix(p, q, B); 
    printf("The entered Matrix:\n"); 
    displayMatrix(p, q, B); 
    printf("The transpose of the entered Matrix:\n"); 
    transposeMatrix(p, q, B); 

    printf("Addition of the Matrices:\n"); 
    addMatrices(m, n, p, q, A, B); 
    printf("Multiplication of the Matrices:\n"); 
    multiplyMatrices(m, n, p, q, A, B); 

    return 0; 
} 

void getMatrix(int m, int n, int values[m][n]) 
{ 
    for(i = 0; i < m; ++i) 
    for(j = 0; j < n; ++j) 
     scanf("%d", &values[i][j]); 
} 

void displayMatrix(int m, int n, int values[m][n]) 
{ 
    for(i = 0; i < m; ++i) 
    { 
    for(j = 0; j < n; ++j) 
     printf("%3d ", values[i][j]); 

    printf("\n"); 
    } 
} 

void transposeMatrix(int m, int n, int values[m][n]) 
{ 
    int transpose[n][m]; 

    for(i = 0; i < n; ++i) 
    for(j =0; j < m; ++j) 
     transpose[i][j] = values[j][i]; 

    displayMatrix(n, m, transpose); 
} 

void addMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]) 
{ 
    int C[m][n]; 

    if(m == p && n == q) 
    { 
    for(i = 0; i < m; ++i) 
    for(j = 0; j < n; ++j) 
     C[i][j] = A[i][j] + B[i][j]; 

    displayMatrix(m, n, C); 
    } 
    else 
    printf("Cannot add these Matrices!\n"); 
} 

void multiplyMatrices(int m, int n, int p, int q, int A[m][n], int B[p][q]) 
{ 
    int C[m][q], k, sum = 0; 
    if(n == p) 
    { 
    for(i = 0; i < m; ++i) 
     for(j = 0; j < q; ++j) 
     { 
     for(k = 0; k < n; ++k) 
      sum += A[i][j] * B[j][i]; 

     C[i][j] = sum; 
     sum = 0; 
     } 

    displayMatrix(m, q, C); 
    } 
    else 
    printf("Cannot multiply these Matrices!\n"); 
} 
+0

@BLUEPIXY .: Vous êtes si vite ... mais je répondu presque en même temps – coderredoc

+0

Comment que le code source peut compiler avec sur la même ligne 'int m, n, p, q, A [m] [n], B [p] [q]; '? Sans avertissement aussi? –

Répondre

5

Initiliazie m et n afin que vous ne recevez pas UB lors de leur utilisation dans l'index de tableau dans VLA.

boucle Unsed dans les matrices se multiplient

for(k = 0; k < n; ++k) 
      sum += A[i][j] * B[j][i]; 

sera

for(k = 0; k < n; ++k) 
      sum += A[i][k] * B[k][j]; 

Ne pas utiliser des variables globales à moins que vous devez. C'est une bonne pratique de faire des variables d'index de for loop locale.

for(int i=0;i<n;i++) 
... 
+0

mais si je dois utiliser beaucoup de boucles pour la même fonction? devrais-je encore m'entraîner à rendre l'index local? –

+0

Il n'est pas bon d'utiliser des globales pour ces variables ... oui vous pouvez bien sûr ... mais c'est assez difficile à suivre. – coderredoc

+0

vous êtes très rapide pour répondre! j'apprécie beaucoup... –