Zahlen zwischen Basen in C umrechnen

CCBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

In diesem Lab werden wir lernen, wie man Zahlen zwischen verschiedenen Zahlensystemen mit der Programmiersprache C umwandelt. Das Lab umfasst die folgenden Schritte:

  1. Einlesen der Zahl und der Zielbasis aus der Benutzereingabe.
  2. Implementieren des Umrechnungsalgorithmus mithilfe von Division und Resten, um die Dezimalzahl in die Zielbasis umzuwandeln.
  3. Ausgabe der umgewandelten Zahl.

Das Lab bietet eine schrittweise Anleitung zur Entwicklung eines Basisumrechnungsprogramms in C und behandelt die erforderlichen Konzepte aus der Zahlentheorie und der diskreten Mathematik.

Einlesen der Zahl und der Zielbasis

In diesem Schritt werden wir lernen, wie man in der Programmiersprache C eine Zahl und ihre Zielbasis für die Umrechnung einliest. Wir werden ein einfaches Programm erstellen, das es Benutzern ermöglicht, eine Dezimalzahl einzugeben und die Basis anzugeben, in die sie diese umwandeln möchten.

Zuerst erstellen wir eine neue C-Datei für unser Basisumrechnungsprogramm:

cd ~/project
nano base_converter.c

Jetzt schreiben wir den Anfangscode, um die Zahl und die Zielbasis einzulesen:

#include <stdio.h>

int main() {
    int number, base;

    // Aufforderung an den Benutzer, die Dezimalzahl einzugeben
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // Aufforderung an den Benutzer, die Zielbasis einzugeben
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // Überprüfung der Basis-Eingabe
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    printf("Number entered: %d\n", number);
    printf("Target base: %d\n", base);

    return 0;
}

Wir kompilieren und starten das Programm:

gcc base_converter.c -o base_converter
./base_converter

Beispielausgabe:

Enter a decimal number to convert: 42
Enter the target base (2-16): 2
Number entered: 42
Target base: 2

Code-Erklärung:

  • Wir verwenden scanf(), um die Dezimalzahl und die Zielbasis aus der Benutzereingabe einzulesen.
  • Wir überprüfen die Basis, um sicherzustellen, dass sie zwischen 2 und 16 liegt (unterstützt Binär bis Hexadezimal).
  • Das Programm gibt die eingegebene Zahl und Basis zurück, um die Eingabe zu bestätigen.

Umrechnung mit Division und Resten

In diesem Schritt werden wir den Kernalgorithmus zur Umrechnung einer Dezimalzahl in eine andere Basis mithilfe von Division und Resten implementieren. Wir werden unser vorheriges Programm ändern, um die Umrechnungslogik hinzuzufügen.

Öffnen Sie die vorhandene Datei und aktualisieren Sie den Code:

cd ~/project
nano base_converter.c

Ersetzen Sie den vorherigen Code durch die folgende Implementierung:

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

// Funktion zur Umrechnung von Dezimal in eine beliebige Basis
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";

    // Sonderfall 0 behandeln
    if (number == 0) {
        result[index++] = '0';
        result[index] = '\0';
        return;
    }

    // Umrechnung mit Division und Resten
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // Zeichenkette umkehren
    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 + Null-Terminator

    // Benutzer auffordern, die Dezimalzahl einzugeben
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // Benutzer auffordern, die Zielbasis einzugeben
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // Basis-Eingabe überprüfen
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    // Umrechnen und das Ergebnis ausgeben
    convertToBase(number, base, result);

    printf("Decimal %d in base %d is: %s\n", number, base, result);

    return 0;
}

Kompilieren und starten Sie das Programm:

gcc base_converter.c -o base_converter
./base_converter

Beispielausgabe:

Enter a decimal number to convert: 42
Enter the target base (2-16): 2
Decimal 42 in base 2 is: 101010

Enter a decimal number to convert: 255
Enter the target base (2-16): 16
Decimal 255 in base 16 is: FF

Code-Erklärung:

  • Die Funktion convertToBase() implementiert den Kern-Umrechnungsalgorithmus.
  • Nutzt Division und Rest, um die Ziffern von rechts nach links zu extrahieren.
  • Unterstützt Basen von 2 bis 16 mithilfe eines vordefinierten Ziffern-Satzes.
  • Behandelt den Sonderfall 0.
  • Kehrt die Ergebniszeichenkette um, um die richtige Ziffernreihenfolge zu erhalten.
  • Nutzt ein Array von Ziffern, um die Reste auf die entsprechenden Basiszeichen abzubilden.

Ausgabe der umgewandelten Zahl

In diesem letzten Schritt verbessern wir unser Basisumrechnungsprogramm, indem wir umfassendere Ausgabe- und Formatierungsoptionen hinzufügen, um die umgewandelte Zahl anzuzeigen.

Öffnen Sie die vorhandene Datei und aktualisieren Sie den Code:

cd ~/project
nano base_converter.c

Aktualisieren Sie den Code mit verbesserten Ausgabe- und Formatierungsfunktionen:

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

// Funktion zur Umrechnung von Dezimal in eine beliebige Basis
void convertToBase(int number, int base, char *result) {
    int index = 0;
    char digits[] = "0123456789ABCDEF";
    int original = number;  // Ursprüngliche Zahl für die Anzeige speichern

    // Sonderfall 0 behandeln
    if (number == 0) {
        result[index++] = '0';
        result[index] = '\0';
        return;
    }

    // Umrechnung mit Division und Resten
    while (number > 0) {
        int remainder = number % base;
        result[index++] = digits[remainder];
        number = number / base;
    }

    // Zeichenkette umkehren
    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;
    }
}

// Funktion zur Ausgabe detaillierter Umrechnungsinformationen
void printConversionInfo(int decimal, int base, const char *converted) {
    printf("\n--- Number Conversion Details ---\n");
    printf("Original Number (Decimal): %d\n", decimal);
    printf("Target Base: %d\n", base);
    printf("Converted Number: %s\n", converted);

    // Zusätzliche Basisdarstellungen
    printf("\nBase Representations:\n");
    printf("  Decimal:    %d\n", decimal);

    // Binäre Darstellung
    if (base!= 2) {
        char binaryResult[33];
        convertToBase(decimal, 2, binaryResult);
        printf("  Binary:     %s\n", binaryResult);
    }

    // Hexadezimale Darstellung
    if (base!= 16) {
        char hexResult[9];
        convertToBase(decimal, 16, hexResult);
        printf("  Hexadecimal: %s\n", hexResult);
    }
}

int main() {
    int number, base;
    char result[33];  // Max. 32 Bits + Null-Terminator

    // Benutzer auffordern, die Dezimalzahl einzugeben
    printf("Enter a decimal number to convert: ");
    scanf("%d", &number);

    // Benutzer auffordern, die Zielbasis einzugeben
    printf("Enter the target base (2-16): ");
    scanf("%d", &base);

    // Basis-Eingabe überprüfen
    if (base < 2 || base > 16) {
        printf("Invalid base. Please enter a base between 2 and 16.\n");
        return 1;
    }

    // Zahl umrechnen
    convertToBase(number, base, result);

    // Detaillierte Umrechnungsinformationen ausgeben
    printConversionInfo(number, base, result);

    return 0;
}

Kompilieren und starten Sie das Programm:

gcc base_converter.c -o base_converter
./base_converter

Beispielausgabe:

Enter a decimal number to convert: 42
Enter the target base (2-16): 16

--- Number Conversion Details ---
Original Number (Decimal): 42
Target Base: 16
Converted Number: 2A

Base Representations:
  Decimal:    42
  Binary:     101010
  Hexadecimal: 2A

Code-Erklärung:

  • Hinzufügen der Funktion printConversionInfo() zur Ausgabe detaillierter Umrechnungsinformationen
  • Anzeige der ursprünglichen Dezimalzahl, der Zielbasis und des umgewandelten Ergebnisses
  • Einbeziehung zusätzlicher Basisdarstellungen (binär und hexadezimal)
  • Bedingte Ausgabe alternativer Basisdarstellungen, um Redundanzen zu vermeiden
  • Bereitstellung einer informativeren und lehrreichen Ausgabe

Zusammenfassung

In diesem Lab haben wir gelernt, wie man in der Programmiersprache C eine Zahl und ihre Zielbasis für die Umrechnung einliest. Wir haben ein einfaches Programm erstellt, das es Benutzern ermöglicht, eine Dezimalzahl einzugeben und die Basis anzugeben, in die sie diese umwandeln möchten. Wir haben auch den Kernalgorithmus zur Umrechnung einer Dezimalzahl in eine andere Basis mithilfe von Division und Resten implementiert. Schließlich haben wir gelernt, wie man die umgewandelte Zahl in der gewünschten Basis ausgibt.

Die wichtigsten Lernpunkte aus diesem Lab umfassen das Verständnis, wie man die Funktion scanf() verwendet, um Benutzereingaben einzulesen, die Eingabe zu überprüfen, um sicherzustellen, dass die Zielbasis innerhalb des gültigen Bereichs liegt, und die Basisumrechnungslogik mithilfe von Division und Resten zu implementieren. Das Programm zeigt eine praktische Anwendung dieser Konzepte in der C-Programmierung.