Exercices langage C pointeurs et tableaux à deux dimensions

 Exercices langage C pointeurs et tableaux à deux dimensions


Exercice 1


Ecrire un programme qui lit une matrice A de dimensions N et M au clavier et affiche les données suivantes en utilisant le formalisme pointeur à chaque fois que cela est possible:

a) la matrice A

b) la transposée de A

c) la matrice A interprétée comme tableau unidimensionnel


Exercice 2


Ecrire un programme qui lit deux matrices A et B de dimensions N et M respectivement M et P au clavier et qui effectue la multiplication des deux matrices. Le résultat de la multiplication sera affecté à la matrice C, qui sera ensuite affichée. Utiliser le formalisme pointeur à chaque fois que cela est possible.


Exercice 3


Ecrire un programme qui lit 5 mots d'une longueur maximale de 50 caractères et les mémorise dans un tableau de chaînes de caractères TABCH. Inverser l'ordre des caractères à l'intérieur des 5 mots à l'aide de deux pointeurs P1 et P2. Afficher les mots.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
main()
{   
 /* Déclarations */
 int A[50][50];  /* matrice */
 int N, M; /* dimensions de la matrice */
 int I, J; /* indices courants */    
 /* Saisie des données */
 printf("Nombre de lignes   (max.50) : ");
 scanf("%d", &N );
 printf("Nombre de colonnes (max.50) : ");
 scanf("%d", &M );
 /* Lecture de la matrice au clavier */
 for (I=0; I<N; I++)
   for (J=0; J<M; J++)
      {
       printf("Elément[%d][%d] : ",I,J);
       scanf("%d", (int *)A+I*50+J);
      }

 /* a) Affichage de la matrice */
  printf("Matrice donnée :\n");
 for (I=0; I<N; I++)
   {
    for (J=0; J<M; J++)
        printf("%7d", *((int *)A+I*50+J));
    printf("\n");
   }

 /* b) Affichage de la transposée de A */
  printf("Matrice transposée :\n");
 for (J=0; J<M; J++)
   {
    for (I=0; I<N; I++)
        printf("%7d ", *((int *)A+I*50+J));
    printf("\n");
   }

 /* c) Interprétation de la matrice comme vecteur : */
 /* Attention, ce serait une faute grave d'afficher */
 /*'simplement' les NxM premiers éléments de A !    */
  printf("Matrice affichée comme vecteur :\n");
 for (I=0; I<N; I++)
    for (J=0; J<M; J++)
        printf(" %d ", *((int *)A+I*50+J));
 printf("\n");
 return 0;
}

 




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#include <stdio.h>
main()
{
 /* Déclarations */
 int A[50][50]; /* matrice donnée */
 int B[50][50]; /* matrice donnée */
 int C[50][50]; /* matrice résultat */
 int N, M, P;   /* dimensions des matrices */
 int I, J, K;   /* indices courants */

  /* Saisie des données */
 printf("*** Matrice A ***\n");
 printf("Nombre de lignes de   A (max.50) : ");
 scanf("%d", &N );
 printf("Nombre de colonnes de A (max.50) : ");
 scanf("%d", &M );
 for (I=0; I<N; I++)
   for (J=0; J<M; J++)
      {
       printf("Elément[%d][%d] : ",I,J);
       scanf("%d", (int *)A+I*50+J);
      }
 printf("*** Matrice B ***\n");
 printf("Nombre de lignes de   B : %d\n", M);
 printf("Nombre de colonnes de B (max.50) : ");
 scanf("%d", &P );
 for (I=0; I<M; I++)
   for (J=0; J<P; J++)
      {
       printf("Elément[%d][%d] : ",I,J);
       scanf("%d", (int *)B+I*50+J);
      }

  /* Affichage des matrices */
 printf("Matrice donnée A :\n");
 for (I=0; I<N; I++)
   {
    for (J=0; J<M; J++)
        printf("%7d", *((int *)A+I*50+J));
    printf("\n");
   }
 printf("Matrice donnée B :\n");
 for (I=0; I<M; I++)
   {
    for (J=0; J<P; J++)
        printf("%7d", *((int *)B+I*50+J));
    printf("\n");
   }


 /* Affectation du résultat de la multiplication à C */
 for (I=0; I<N; I++)
    for (J=0; J<P; J++)
       {
        *((int *)C+I*50+J)=0;
        for (K=0; K<M; K++)
*((int*)C+I*50+J) += *((int*)A+I*50+K) * *((int*)B+K*50+J);
       }

 /* Edition du résultat */
 printf("Matrice résultat C :\n");
 for (I=0; I<N; I++)
   {
    for (J=0; J<P; J++)
        printf("%7d", *((int *)C+I*50+J));
    printf("\n");
   }
 return 0;
}

 





1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <stdio.h>
main()
{
 /* Déclarations */
 char TABCH[5][51];/* tableau de chaînes de caractères */
 char AIDE;        /* pour la permutation des caractères */
 char *P1, *P2;    /* pointeurs d'aide */
 int I;            /* indice courant   */

 /* TABCH+I est l'adresse de la I-ième chaîne du tableau */
 /* Il vaut mieux convertir TABCH+I en pointeur sur char */
  /* Saisie des données */
 printf("Entrez 5 mots :\n");
 for (I=0; I<5; I++)
     {
      printf("Mot %d (max.50 caractères) : ", I);
      gets((char *)(TABCH+I));
     }

 /* Inverser l'ordre des caractères à l'intérieur des mots */
 for (I=0; I<5; I++)
     {
      P1 = P2 = (char *)(TABCH+I);
      /* Placer P2 à la fin de la chaîne */
      while (*P2)
             P2++;
      P2--; /* sinon '\0' est placé au début de la chaîne */
      while (P1<P2)
           {
            AIDE = *P1;
            *P1  = *P2;
            *P2  = AIDE;
            P1++;
            P2--;
           }
     }

  /* Affichage des mots inversés */
 for (I=0; I<5; I++)
      puts((char *)(TABCH+I));
 return 0;
}