Affichage ordonné

À travers cet exercice, nous voyons qu'une valeur n'est pas indissociablement liée à une variable.

Voici un programme de base :

1
#include <stdlib.h>
2
int main(void) {
3
  int a, b, c;
4
  printf("entrez 3 valeurs entieres :");fflush(stdout);
5
  scanf("%d %d %d", &a, &b, &c);
6
  printf("les valeurs sont %d, %d, %d\n", a, b, c);
7
  return 0;
8
}

Étudiez les instructions pour comprendre le fonctionnement.

Question

En vous basant sur le programme précédent, écrivez un programme qui lit 3 valeurs entières au clavier et les affiche en ordre croissant.

Vous utiliserez des instructions d'affectations et des conditionnelles. Vous aurez comme objectif d'utiliser un minimum d'instructions conditionnelles.

Indice

Les instructions conditionnelles doivent vous permettre d'obtenir un état choisi de votre programme. Une fois cet état obtenu, une seule instruction d'affichage suffit.

Indice

Pensez au fait que les relations variables et valeurs contenues sont mobiles. Ainsi, les valeurs contenues dans les variables peuvent être échangées sans, bien sûr, perdre une valeur.

Solution

L'affichage doit se faire en ordre croissant. Si les contenus des données a, b et c reflètent l'ordre d'affichage souhaité, il suffit de reprendre l'instruction d'affichage donnée.

Nous cherchons donc à obtenir l'état : a<=b<=c.

Nous introduisons une séquence de tests/échanges pour obtenir ce résultat.

1
int main (){
2
  int a, b, c;
3
  int tmp;
4
  printf("entrez 3 valeurs entieres :");fflush(stdout);
5
  scanf("%d %d %d", &a, &b, &c);
6
  printf("les valeurs sont %d, %d, %d\n", a, b, c);
7
  if (a>b) {
8
    tmp=a;
9
    a=b;
10
    b=tmp;
11
  }      /* a<b et ? c */
12
  if (b>c) {
13
    tmp=b;
14
    b=c;
15
    c=tmp;  /* a<c et b<c */
16
    if (a>b) {
17
      tmp=a;
18
      a=b;
19
      b=tmp;
20
    }     /* a<c et b<c et a<b */
21
  }       /* état souhaité vérifié : a<b<c */
22
  printf("les valeurs en ordre croissant : %d, %d, %d\n", a, b, c);
23
  return 0 ;
24
}

La 3e instruction conditionnelle n'est nécessaire que si la 2e a donné lieu à un échange de valeurs.

Il est possible de réduire d'une instruction ou deux en choisissant l'ordre de notre seconde séquence d'échange. Toutefois, la clarté n'en n'est pas améliorée.

1
int main (){
2
  int a, b, c;
3
  int tmp;
4
  printf("entrez 3 valeurs entieres :"); fflush(stdout);
5
  scanf("%d %d %d", &a, &b, &c);
6
  printf("les valeurs sont %d, %d, %d\n", a, b, c);
7
  if (a>b) {
8
    tmp=a;
9
    a=b;
10
    b=tmp;
11
  }
12
  if (b>c) {
13
    tmp=c;
14
    c=b;
15
    if (a>tmp) {
16
      b=a;
17
      a=tmp;
18
    }
19
    else  b=tmp;
20
  }
21
  printf("les valeurs en ordre croissant : %d, %d, %d\n", a, b, c);
22
  return 0 ;
23
}