Convertir des nombres entre différentes bases en C

CBeginner
Pratiquer maintenant

Introduction

Dans ce laboratoire (lab), nous apprendrons à convertir des nombres entre différentes bases en utilisant le langage de programmation C. Le laboratoire couvre les étapes suivantes :

  1. Lire le nombre et la base cible à partir de l'entrée utilisateur.
  2. Implémenter l'algorithme de conversion en utilisant la division et les restes pour convertir le nombre décimal en la base cible.
  3. Afficher le nombre converti.

Le laboratoire fournit un guide étape par étape pour développer un programme de conversion de base en C, couvrant les concepts nécessaires de la théorie des nombres et des mathématiques discrètes.

Lire le nombre et la base cible

Dans cette étape, nous apprendrons à lire un nombre et sa base cible pour la conversion en programmation C. Nous allons créer un programme simple qui permet aux utilisateurs de saisir un nombre décimal et de spécifier la base dans laquelle ils veulent le convertir.

Tout d'abord, créons un nouveau fichier C pour notre programme de conversion de base :

cd ~/project
nano base_converter.c

Maintenant, écrivons le code initial pour lire le nombre et la base cible :

#include <stdio.h>

int main() {
    int number, base;

    // Demande à l'utilisateur d'entrer le nombre décimal
    printf("Entrez un nombre décimal à convertir : ");
    scanf("%d", &number);

    // Demande à l'utilisateur d'entrer la base cible
    printf("Entrez la base cible (2-16) : ");
    scanf("%d", &base);

    // Valide l'entrée de la base
    if (base < 2 || base > 16) {
        printf("Base invalide. Veuillez entrer une base entre 2 et 16.\n");
        return 1;
    }

    printf("Nombre entré : %d\n", number);
    printf("Base cible : %d\n", base);

    return 0;
}

Compilons et exécutons le programme :

gcc base_converter.c -o base_converter
./base_converter

Exemple de sortie :

Entrez un nombre décimal à convertir : 42
Entrez la base cible (2-16) : 2
Nombre entré : 42
Base cible : 2

Explication du code :

  • Nous utilisons scanf() pour lire le nombre décimal et la base cible à partir de l'entrée utilisateur.
  • Nous validons la base pour nous assurer qu'elle est comprise entre 2 et 16 (supportant le binaire jusqu'à l'hexadécimal).
  • Le programme affiche le nombre et la base entrés pour confirmer l'entrée.

Convertir en utilisant la division et les restes

Dans cette étape, nous allons implémenter l'algorithme de base pour convertir un nombre décimal en une autre base en utilisant la division et les restes. Nous allons modifier notre programme précédent pour ajouter la logique de conversion.

Ouvrez le fichier existant et mettez à jour le code :

cd ~/project
nano base_converter.c

Remplacez le code précédent par l'implémentation suivante :

#include <stdio.h>
#include <string.h>

// Fonction pour convertir un nombre décimal en n'importe quelle base
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";

    // Gérer le cas spécial du nombre 0
    if (number == 0) {
        result[index++] = '0';
        result[index] = '\0';
        return;
    }

    // Convertir en utilisant la division et les restes
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // Inverser la chaîne de caractères
    result[index] = '\0';
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        char temp = result[i];
        result[i] = result[j];
        result[j] = temp;
    }
}

int main() {
    int number, base;
    char result[33];  // Max 32 bits + caractère de fin de chaîne

    // Demande à l'utilisateur d'entrer le nombre décimal
    printf("Entrez un nombre décimal à convertir : ");
    scanf("%d", &number);

    // Demande à l'utilisateur d'entrer la base cible
    printf("Entrez la base cible (2-16) : ");
    scanf("%d", &base);

    // Valider l'entrée de la base
    if (base < 2 || base > 16) {
        printf("Base invalide. Veuillez entrer une base entre 2 et 16.\n");
        return 1;
    }

    // Convertir et afficher le résultat
    convertToBase(number, base, result);

    printf("Le nombre décimal %d en base %d est : %s\n", number, base, result);

    return 0;
}

Compilez et exécutez le programme :

gcc base_converter.c -o base_converter
./base_converter

Exemple de sortie :

Entrez un nombre décimal à convertir : 42
Entrez la base cible (2-16) : 2
Le nombre décimal 42 en base 2 est : 101010

Entrez un nombre décimal à convertir : 255
Entrez la base cible (2-16) : 16
Le nombre décimal 255 en base 16 est : FF

Explication du code :

  • La fonction convertToBase() implémente l'algorithme de conversion de base
  • Utilise la division et le reste pour extraire les chiffres de droite à gauche
  • Prend en charge les bases de 2 à 16 en utilisant un ensemble de chiffres prédéfini
  • Gère le cas spécial du nombre 0
  • Inverse la chaîne de résultat pour obtenir l'ordre correct des chiffres
  • Utilise un tableau de chiffres pour mapper les restes aux caractères de base correspondants

Afficher le nombre converti

Dans cette étape finale, nous allons améliorer notre programme de conversion de base en ajoutant des options de sortie et de formatage plus complètes pour afficher le nombre converti.

Ouvrez le fichier existant et mettez à jour le code :

cd ~/project
nano base_converter.c

Mettez à jour le code avec un affichage et un formatage améliorés :

#include <stdio.h>
#include <string.h>

// Fonction pour convertir un nombre décimal en n'importe quelle base
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";
    int original = number;  // Stocke le nombre original pour l'affichage

    // Gérer le cas spécial du nombre 0
    if (number == 0) {
        result[index++] = '0';
        result[index] = '\0';
        return;
    }

    // Convertir en utilisant la division et les restes
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // Inverser la chaîne de caractères
    result[index] = '\0';
    for (int i = 0, j = index - 1; i < j; i++, j--) {
        char temp = result[i];
        result[i] = result[j];
        result[j] = temp;
    }
}

// Fonction pour afficher des informations détaillées sur la conversion
void printConversionInfo(int decimal, int base, const char *converted) {
    printf("\n--- Détails de la conversion de nombre ---\n");
    printf("Nombre original (Décimal) : %d\n", decimal);
    printf("Base cible : %d\n", base);
    printf("Nombre converti : %s\n", converted);

    // Représentations supplémentaires en d'autres bases
    printf("\nReprésentations en différentes bases :\n");
    printf("  Décimal :    %d\n", decimal);

    // Représentation binaire
    if (base!= 2) {
        char binaryResult[33];
        convertToBase(decimal, 2, binaryResult);
        printf("  Binaire :     %s\n", binaryResult);
    }

    // Représentation hexadécimale
    if (base!= 16) {
        char hexResult[9];
        convertToBase(decimal, 16, hexResult);
        printf("  Hexadécimal : %s\n", hexResult);
    }
}

int main() {
    int number, base;
    char result[33];  // Max 32 bits + caractère de fin de chaîne

    // Demande à l'utilisateur d'entrer le nombre décimal
    printf("Entrez un nombre décimal à convertir : ");
    scanf("%d", &number);

    // Demande à l'utilisateur d'entrer la base cible
    printf("Entrez la base cible (2-16) : ");
    scanf("%d", &base);

    // Valider l'entrée de la base
    if (base < 2 || base > 16) {
        printf("Base invalide. Veuillez entrer une base entre 2 et 16.\n");
        return 1;
    }

    // Convertir le nombre
    convertToBase(number, base, result);

    // Afficher des informations détaillées sur la conversion
    printConversionInfo(number, base, result);

    return 0;
}

Compilez et exécutez le programme :

gcc base_converter.c -o base_converter
./base_converter

Exemple de sortie :

Entrez un nombre décimal à convertir : 42
Entrez la base cible (2-16) : 16

--- Détails de la conversion de nombre ---
Nombre original (Décimal) : 42
Base cible : 16
Nombre converti : 2A

Représentations en différentes bases :
  Décimal :    42
  Binaire :     101010
  Hexadécimal : 2A

Explication du code :

  • Ajout de la fonction printConversionInfo() pour fournir une sortie détaillée de la conversion
  • Affiche le nombre décimal original, la base cible et le résultat converti
  • Inclut des représentations supplémentaires en d'autres bases (binaire et hexadécimal)
  • Affiche conditionnellement les représentations en d'autres bases pour éviter les redondances
  • Fournit une sortie plus informative et pédagogique

Résumé

Dans ce laboratoire (lab), nous avons appris à lire un nombre et sa base cible pour la conversion en programmation C. Nous avons créé un programme simple qui permet aux utilisateurs de saisir un nombre décimal et de spécifier la base dans laquelle ils veulent le convertir. Nous avons également implémenté l'algorithme de base pour convertir un nombre décimal en une autre base en utilisant la division et les restes. Enfin, nous avons appris à afficher le nombre converti dans la base souhaitée.

Les principaux points d'apprentissage de ce laboratoire incluent la compréhension de l'utilisation de la fonction scanf() pour lire l'entrée utilisateur, la validation de l'entrée pour s'assurer que la base cible est dans la plage valide, et la mise en œuvre de la logique de conversion de base en utilisant la division et les restes. Le programme démontre une application pratique de ces concepts en programmation C.