Les tableaux dynamiques en C sont des structures de données flexibles et puissantes qui permettent aux programmeurs de gérer efficacement la mémoire et de manipuler des collections de données de taille variable. Dans cet article, nous explorerons en détail la déclaration et l’utilisation de tableaux dynamiques en C en utilisant des pointeurs. Nous examinerons également certaines astuces, les erreurs courantes à éviter et proposerons des exercices pour renforcer votre compréhension.
malloc()
pour allouer de la mémoire. int *tab;
int taille = 10;
tab = (int *)malloc(taille * sizeof(int));
free()
.*
). for (int i = 0; i < taille; i++) {
tab[i] = i * 2;
}
realloc()
.malloc()
ou realloc()
est NULL.Voici comment je pourrais présenter les erreurs à éviter en utilisant des exemples de code illustrant le bon et le mauvais code :
int *tab = (int *)malloc(10 * sizeof(int));
// Utilisation du tableau...
// Oubli de libérer la mémoire
Bon Code :
int *tab = (int *)malloc(10 * sizeof(int));
// Utilisation du tableau...
free(tab); // Libération de la mémoire
int *tab = (int *)malloc(10 * sizeof(int));
tab[10] = 42; // Accès hors limites
Bon Code :
int *tab = (int *)malloc(10 * sizeof(int));
tab[9] = 42; // Accès valide à l'indice 9
int *tab = (int *)malloc(10 * sizeof(int));
// Non-vérification de l'allocation de mémoire
Bon Code :
int *tab = (int *)malloc(10 * sizeof(int));
if (tab == NULL) {
printf("Erreur lors de l'allocation de mémoire");
return 1;
}
int *tab = (int *)malloc(10 * sizeof(int));
tab = (int *)realloc(tab, 20 * sizeof(int)); // Redimensionnement incorrect
Bon Code :
int *tab = (int *)malloc(10 * sizeof(int));
int *nouveau_tab = (int *)realloc(tab, 20 * sizeof(int)); // Redimensionnement correct
if (nouveau_tab == NULL) {
// Gestion de l'échec du redimensionnement
} else {
tab = nouveau_tab;
}
int *tab = (int *)malloc(10 * sizeof(int));
free(&tab); // Utilisation incorrecte du pointeur
Bon Code :
int *tab = (int *)malloc(10 * sizeof(int));
free(tab); // Utilisation correcte du pointeur
En évitant ces erreurs courantes et en suivant les bonnes pratiques de programmation, vous pouvez écrire un code plus robuste et plus fiable lors de l’utilisation de tableaux dynamiques en C.
Écrivez un programme en C qui prend en entrée deux matrices carrées de taille m×n et n×p et calcule leur produit. Utilisez des pointeurs pour manipuler les matrices.
Solution :
#include <stdio.h>
void matrixProduct(int *A, int *B, int *C, int n) {
int i, j, k;
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
*(C + i*n + j) = 0;
for (k = 0; k < n; k++) {
*(C + i*n + j) += *(A + i*n + k) * *(B + k*n + j);
}
}
}
}
int main() {
int n = 3; // Taille des matrices carrées
int A[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
int B[3][3] = {{9, 8, 7}, {6, 5, 4}, {3, 2, 1}};
int C[3][3];
// Calculer le produit
matrixProduct((int *)A, (int *)B, (int *)C, n);
// Afficher le résultat
printf("Produit de A et B :\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", C[i][j]);
}
printf("\n");
}
return 0;
}
Écrivez un programme en C qui prend en entrée deux matrices de taille m×nm \times nm×n et n×pn \times pn×p et calcule leur produit. Assurez-vous que les dimensions des matrices sont compatibles pour effectuer le produit.
#include <stdio.h>
void matrixProduct(int *A, int *B, int *C, int m, int n, int p) {
int i, j, k;
for (i = 0; i < m; i++) {
for (j = 0; j < p; j++) {
*(C + i*p + j) = 0;
for (k = 0; k < n; k++) {
*(C + i*p + j) += *(A + i*n + k) * *(B + k*p + j);
}
}
}
}
int main() {
int m = 2, n = 3, p = 2; // Tailles des matrices
int A[2][3] = {{1, 2, 3}, {4, 5, 6}};
int B[3][2] = {{7, 8}, {9, 10}, {11, 12}};
int C[2][2];
// Calculer le produit
matrixProduct((int *)A, (int *)B, (int *)C, m, n, p);
// Afficher le résultat
printf("Produit de A et B :\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < p; j++) {
printf("%d ", C[i][j]);
}
printf("\n");
}
return 0;
}
Écrivez une fonction en C qui prend en entrée une matrice A de taille m×n et calcule sa transposée AT. Utilisez des pointeurs pour manipuler les matrices.
#include <stdio.h>
void transpose(int *A, int *A_T, int m, int n) {
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
*(A_T + j*m + i) = *(A + i*n + j);
}
}
}
int main() {
int m = 3, n = 2; // Taille de la matrice A
int A[3][2] = {{1, 2}, {3, 4}, {5, 6}};
int A_T[2][3];
// Calculer la transposée
transpose((int *)A, (int *)A_T, m, n);
// Afficher le résultat
printf("Matrice A :\n");
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
printf("%d ", A[i][j]);
}
printf("\n");
}
printf("\nTransposée de A :\n");
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
printf("%d ", A_T[i][j]);
}
printf("\n");
}
return 0;
}
Modifiez le programme de l’exercice 1 pour utiliser l’allocation dynamique de mémoire pour les matrices. Assurez-vous de libérer la mémoire correctement après avoir terminé le calcul du produit.
#include <stdio.h>
#include <stdlib.h>
// Fonction pour calculer le produit de deux matrices rectangulaires
void matrixProduct(int **A, int **B, int **C, int m, int n, int p) {
int i, j, k;
// Parcourir les lignes de la première matrice
for (i = 0; i < m; i++) {
// Parcourir les colonnes de la deuxième matrice
for (j = 0; j < p; j++) {
// Initialiser l'élément (i, j) de la matrice résultante à 0
C[i][j] = 0;
// Parcourir les colonnes de la première matrice / les lignes de la deuxième matrice
for (k = 0; k < n; k++) {
// Calculer le produit et l'ajouter à l'élément (i, j) de la matrice résultante
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
int main() {
int m = 2, n = 3, p = 2; // Tailles des matrices
int **A, **B, **C;
int i, j, k;
// Allocation dynamique de mémoire pour les matrices
A = (int **)malloc(m * sizeof(int *));
B = (int **)malloc(n * sizeof(int *));
C = (int **)malloc(m * sizeof(int *));
for (i = 0; i < m; i++) {
A[i] = (int *)malloc(n * sizeof(int));
C[i] = (int *)malloc(p * sizeof(int));
}
for (i = 0; i < n; i++) {
B[i] = (int *)malloc(p * sizeof(int));
}
// Initialisation des matrices A et B (exemple d'initialisation arbitraire)
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
A[i][j] = i + j;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < p; j++) {
B[i][j] = i - j;
}
}
// Calcul du produit
matrixProduct(A, B, C, m, n, p);
// Affichage du résultat
printf("Matrice A :\n");
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
printf("%d ", A[i][j]);
}
printf("\n");
}
printf("\nMatrice B :\n");
for (i = 0; i < n; i++) {
for (j = 0; j < p; j++) {
printf("%d ", B[i][j]);
}
printf("\n");
}
printf("\nProduit de A et B :\n");
for (i = 0; i < m; i++) {
for (j = 0; j < p; j++) {
printf("%d ", C[i][j]);
}
printf("\n");
}
// Libération de la mémoire allouée
for (i = 0; i < m; i++) {
free(A[i]);
free(C[i]);
}
for (i = 0; i < n; i++) {
free(B[i]);
}
free(A);
free(B);
free(C);
return 0;
}
Modifiez votre programme pour afficher les matrices d’entrée et la matrice résultante du produit dans un format lisible à l’écran. Assurez-vous d’aligner correctement les éléments des matrices pour une meilleure lisibilité.
#include <stdio.h>
#include <stdlib.h>
// Fonction pour calculer le produit de deux matrices rectangulaires
void matrixProduct(int **A, int **B, int **C, int m, int n, int p) {
int i, j, k;
// Parcourir les lignes de la première matrice
for (i = 0; i < m; i++) {
// Parcourir les colonnes de la deuxième matrice
for (j = 0; j < p; j++) {
// Initialiser l'élément (i, j) de la matrice résultante à 0
C[i][j] = 0;
// Parcourir les colonnes de la première matrice / les lignes de la deuxième matrice
for (k = 0; k < n; k++) {
// Calculer le produit et l'ajouter à l'élément (i, j) de la matrice résultante
C[i][j] += A[i][k] * B[k][j];
}
}
}
}
// Fonction pour afficher une matrice
void printMatrix(int **matrix, int rows, int cols) {
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
printf("%d ", matrix[i][j]);
}
printf("\n");
}
}
int main() {
int m = 2, n = 3, p = 2; // Tailles des matrices
int **A, **B, **C;
int i, j, k;
// Allocation dynamique de mémoire pour les matrices
A = (int **)malloc(m * sizeof(int *));
B = (int **)malloc(n * sizeof(int *));
C = (int **)malloc(m * sizeof(int *));
for (i = 0; i < m; i++) {
A[i] = (int *)malloc(n * sizeof(int));
C[i] = (int *)malloc(p * sizeof(int));
}
for (i = 0; i < n; i++) {
B[i] = (int *)malloc(p * sizeof(int));
}
// Initialisation des matrices A et B (exemple d'initialisation arbitraire)
for (i = 0; i < m; i++) {
for (j = 0; j < n; j++) {
A[i][j] = i + j;
}
}
for (i = 0; i < n; i++) {
for (j = 0; j < p; j++) {
B[i][j] = i - j;
}
}
// Calcul du produit
matrixProduct(A, B, C, m, n, p);
// Affichage des matrices
printf("Matrice A :\n");
printMatrix(A, m, n);
printf("\nMatrice B :\n");
printMatrix(B, n, p);
printf("\nProduit de A et B :\n");
printMatrix(C, m, p);
// Libération de la mémoire allouée
for (i = 0; i < m; i++) {
free(A[i]);
free(C[i]);
}
for (i = 0; i < n; i++) {
free(B[i]);
}
free(A);
free(B);
free(C);
return 0;
}
Voici une série d’exercices conçus pour perfectionner vos compétences Excel. Les corrigés sont inclus pour…
Excel offre plusieurs méthodes pour calculer une moyenne tout en tenant compte des filtres ou…
Excel propose plusieurs fonctions pour insérer ou manipuler la date actuelle. Voici les principales méthodes…
Lorsque des nombres sont stockés sous forme de texte dans Excel, ils ne peuvent pas…
Extraire uniquement les chiffres d'une cellule contenant du texte et des nombres mélangés est une…
Pour supprimer plusieurs caractères spécifiques (par exemple, des symboles, chiffres ou lettres indésirables) dans des…
This website uses cookies.