Exercice programmation C recherche de points-cols

 

Exercice langage C : Matrices 

Rechercher dans une matrice donnée A les éléments qui sont à la fois un maximum sur leur ligne et un minimum sur leur colonne. Ces éléments sont appelés des points-cols. Afficher les positions et les valeurs de tous les points-cols trouvés.

Exemples: Les éléments soulignés sont des points-cols:

 
 /          \    /        \    /          \   /       \
| 1 8 3 4 0 |   | 4 5 8 9 |   | 3 5 6 7 7 |   | 1 2 3 |
|           |   | 3 8 9 3 |   | 4 2 2 8 9 |   | 4 5 6 |
| 6 7 2 7 0 |   | 3 4 9 3 |   | 6 3 2 9 7 |   | 7 8 9 |
 \          /    \        /    \          /   \       /

Méthode: Etablir deux matrices d'aide MAX et MIN de même dimensions que A, telles que:

 

/ 1 si A[i,j] est un maximum

MAX[i,j] = | sur la ligne i
\ 0 sinon
/ 1 si A[i,j] est un minimum
MIN[i,j] = | sur la colonne j

\ 0 sinon

 

 


 

 

Corrigé exercice programmation C recherche de points-cols

#include <stdio.h>
main()
{
 /* Déclarations */
 int A[50][50];  /* matrice donnée */
 int MAX[50][50];/* matrice indiquant les maxima des lignes   */
 int MIN[50][50];/* matrice indiquant les minima des colonnes */
 int N, M;    /* dimensions des matrices */
 int I, J;    /* indices courants */
 int AIDE;    /* pour la détection des extréma */
 int C;       /* compteur des points-cols */

 /* Saisie des données */
 printf("Nombre de lignes   (max.50) : ");
 scanf("%d", &N );
 printf("Nombre de colonnes (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", &A[I][J]);
        }
 /* Affichage de la matrice */
 printf("Matrice donnée :\n");
 for (I=0; I<N; I++)
    {
     for (J=0; J<M; J++)
          printf("%7d", A[I][J]);
     printf("\n");
    }

 /* Construction de la matrice d'aide MAX */
 /* qui indique les positions de tous les */
 /* maxima sur une ligne. */
 for (I=0; I<N; I++)
     {
      /* Recherche du maximum sur la ligne I */
      AIDE=A[I][0];
      for (J=1; J<M; J++)
           if (A[I][J]>AIDE) AIDE=A[I][J];
      /* Marquage de tous les maxima sur la ligne */
      for (J=0; J<M; J++)
           if (A[I][J]==AIDE)  /* ou bien :                   */
                MAX[I][J]=1;   /* MAX[I][J] = (A[I][J]==AIDE) */
           else
                MAX[I][J]=0;
     }
 /* Construction de la matrice d'aide MIN */
 /* qui indique les positions de tous les */
 /* minima sur une colonne. */
 for (J=0; J<M; J++)
     {
      /* Recherche du minimum sur la colonne J */
      AIDE=A[0][J];
      for (I=1; I<N; I++)
           if (A[I][J]<AIDE) AIDE=A[I][J];
      /* Marquage de tous les minima sur la colonne J */
      for (I=0; I<N; I++)
           if (A[I][J]==AIDE)  /* ou bien :                   */
                MIN[I][J]=1;   /* MIN[I][J] = (A[I][J]==AIDE) */
           else
                MIN[I][J]=0;
     }

 /* Edition du résultat */
 /* Les composantes qui sont marquées comme extréma */
 /* dans MAX et dans MIN sont des points-cols. */
 printf("Points - cols :\n");
 for (C=0, I=0; I<N; I++)
      for (J=0; J<M; J++)
           if (MAX[I][J]&&MIN[I][J])
              {
               C++;
               printf("L'élément %d\test un maximum "
                      "sur la ligne %d\n"
                      "             \t et un minimum "
                      "sur la colonne %d\n", A[I][J], I, J);
              }
 if (C==0)
     printf("Le tableau ne contient pas de points-cols.\n");
 return 0;
}