Exercice langage C: Modularisation

Le code ci-dessous convertit un nombre décimal en binaire, l'affiche et fait la conversion inverse. Recopiez ce code dans un buffer d'Emacs, et essayez de le comprendre. Vous pouvez ensuite le compiler - il devrait fonctionner sans problème - et le tester.

 

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
70
71
72
73
74
75
76
77
78
79
#include 

using namespace std;

int main(int argc, char **argv) {
  const int max_bits = 10;
  int decimal, binaire, original, n, bits;
  long puissance2, puissance10;

  cout << "Entrez un nombre entier: ";
  cin >> decimal;

  // calcul du nombre de bits
  n = decimal;
  bits = 0;
  while (n > 0) {
    bits++;
    n /= 2;
  }

  cout << decimal << " a " << bits << " bits." << endl;
  if (bits > 10) {
    cout << "Nous ne pouvons pas convertir de nombres plus grands que " 
	 << max_bits << " bits." << endl;
    return 0;
  }

  // conversion en binaire
  n = decimal;
  binaire = 0;
  for (int i=bits-1; i>=0; i--) {
    puissance2 = 1;
    for (int j=0; j<i; j++)
      puissance2 *= 2;

    puissance10 = 1;
    for (int j=0; j<i; j++)
      puissance10 *= 10;

    if (n / puissance2 > 0) {
      n = n - puissance2;
      binaire += puissance10;
    }
  }

  cout << decimal << " vaut '" << binaire << "' en binaire." << endl;

  // calcul du nombre de bits
  n = binaire;
  bits = 0;
  while (n > 0) {
    bits++;
    n /= 10;
  }

  cout << decimal << " a " << bits << " bits." << endl;

  // conversion de binaire en decimal
  original = 0;
  n = binaire;
  for (int i=bits-1; i>=0; i--) {
    puissance2 = 1;
    for (int j=0; j<i; j++)
      puissance2 *= 2;

    puissance10 = 1;
    for (int j=0; j<i; j++)
      puissance10 *= 10;

    if (n / puissance10 > 0) {
      n = n - puissance10;
      original += puissance2;
    }
  }

  cout << "Nombre original: " << original << endl;

  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
70
71
72
73
74
75
76
77
78
#include 

using namespace std;

// calcule a^b
int puissance(int a, int b) {
  int resultat = 1;
  for (int i=0; i<b; i++)
    resultat *= a;

  return resultat;
}

// calcule le log entier de n en base 'base'
int log_entier(int n, int base) {
  int resultat = 0;
  while (n > 0) {
    resultat++;
    n /= base;
  }

  return resultat;
}

// converti 'original', de taille 'bits' bits de la
// base de depart a la base d'arrivee
int conversion(int original, int bits, 
               int base_depart, int base_arrivee) {
  int converti = 0;
  int puissance_depart;
  int puissance_arrivee;
  for (int i=bits-1; i>=0; i--) {
    puissance_depart = puissance(base_depart, i);
    puissance_arrivee = puissance(base_arrivee, i);

    if (original / puissance_arrivee > 0) {
      original -= puissance_arrivee;
      converti += puissance_depart;
    }
  }

  return converti;
}

int main(int argc, char **argv) {
  const int max_bits = 10;
  int decimal, binaire, original, bits;

  cout << "Entrez un nombre entier: ";
  cin >> decimal;

  // calcul du nombre de bits de 'decimal'
  bits = log_entier(decimal, 2);

  cout << decimal << " a " << bits << " bits." << endl;
  if (bits > 10) {
    cout << "Nous ne pouvons pas convertir de nombres plus grands que " 
         << max_bits << " bits." << endl;
    return 0;
  }

  // conversion en binaire
  binaire = conversion(decimal, bits, 10, 2);

  cout << decimal << " vaut '" << binaire << "' en binaire." << endl;

  // calcul du nombre de bits
  bits = log_entier(binaire, 10);

  cout << decimal << " a " << bits << " bits." << endl;

  // conversion de binaire en decimal
  original = conversion(binaire, bits, 2, 10);

  cout << "Nombre original: " << original << endl;

  return 0;
}