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.
#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 cin >> decimal;
// calcul du nombre de bits
n = decimal;
bits = 0;
while (n > 0) {
bits++;
n /= 2;
}
cout if (bits > 10) {
cout return 0;
}
// conversion en binaire
n = decimal;
binaire = 0;
for (int i=bits-1; i>=0; i--) {
puissance2 = 1;
for (int j=0; j puissance2 *= 2;
puissance10 = 1;
for (int j=0; j puissance10 *= 10;
if (n / puissance2 > 0) {
n = n - puissance2;
binaire += puissance10;
}
}
cout // calcul du nombre de bits
n = binaire;
bits = 0;
while (n > 0) {
bits++;
n /= 10;
}
cout // conversion de binaire en decimal
original = 0;
n = binaire;
for (int i=bits-1; i>=0; i--) {
puissance2 = 1;
for (int j=0; j puissance2 *= 2;
puissance10 = 1;
for (int j=0; j puissance10 *= 10;
if (n / puissance10 > 0) {
n = n - puissance10;
original += puissance2;
}
}
cout return 0;
}
#include
using namespace std;
// calcule a^b
int puissance(int a, int b) {
int resultat = 1;
for (int i=0; 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 cin >> decimal;
// calcul du nombre de bits de 'decimal'
bits = log_entier(decimal, 2);
cout if (bits > 10) {
cout return 0;
}
// conversion en binaire
binaire = conversion(decimal, bits, 10, 2);
cout // calcul du nombre de bits
bits = log_entier(binaire, 10);
cout // conversion de binaire en decimal
original = conversion(binaire, bits, 2, 10);
cout return 0;
}