zahlensysteme umwandeln



  • hallo ihr lieben,

    ich hoffe ihr könnt mir helfen. wir müssen in der schule ein programm schreiben, welches alle zahlensysteme untereinander umwandeln kann. wie man von einer binärzahl zur dezimalzahl gelangt, weiß ich, aber von dem rest hab ich eigentlich gar ni so die ahnung. 😕

    das ist der anfang, eine dezimalzahl in eine binärzahl umzuwandeln, aber es funzt ni:

    void __fastcall TForm_BinD::Button_umwandelnClick(TObject *Sender)
    {
     char a[33],dual[33];         
     int auswahl, f=1, n=strlen(a);
     long s=0,Dual_Dez(char *);
    
     dual[12]=StrToInt(Edit_Binaer->Text);
     s=Dual_Dez(dual);
     Edit_Dezimal->Text=IntToStr(s);
     long Dual_Dez(char a[]);
    
     for(n=n-1;n>=0;n--)
      {
       s+=((int)a[n]-48)*f; 
       f=f*2; 
      }
    }
    

    und dann ist da noch das problem mit den hexadezimalen zahlen in oktal- und dezimalzahlen umzuwandeln und umgekehrt, aber auch oktal- und hexadezimale zahlen in eine dualzahl umzuwandeln und ebenso umgekehrt macht es noch schwieriger für mich.

    bitte helft mir.

    danke im voraus.



  • Hallo,

    ich würde an deiner Stelle immer kleiner Schritte machen. Mach doch für jede Umwandlung einen extra Button und eine eigene Ausgabe (Label oder Edit). Dann hast du schonmal etwas Struktur im Programm drin und die Klick-Methoden sind übersichtlicher.

    Zuerst muss der Benutzer übrigens angeben, aus welchem Zahlensystem er eine Zahl umgewandelt haben will. Dazu würde ich 4 CheckBox-Komponenten nehmen. Die kannst du dann bei jedem Button-Klick abfragen und so herausfinden, was du rechnen musst. Sonst weißt du ja garnicht aus welchem System die Zahl im Eingabe-Edit sein soll. Das geht nämlich nicht immer aus der Zahl selbst hervor. Beispiel: Im Eingabe-Edit wurde 64 eingetragen - welchem Zahlensystem kann man die nun EINDEUTIG zuweisen? Keinem! 😉

    So, dann kannst du Schritt für Schritt nachschauen (im Internet steht bestimmt schon Alles was du brauchst), was du je Button-Klick für Rechenwege brauchst.
    Ist die CheckBox "Dual" ausgewählt, braucht bei Dual-Button-Klick zB gar keine Rechnung gemacht werden und du kannst die Zahl aus dem Eingabe-Edit einfach auf dem Dual-Ergebnis-Edit ausgeben...

    Wenn du nun mit EINER Rechnung (zB Dualzahl nach Hexadezimalzahl) gar nicht klarkommst, weil du über die Forum-Suchfunktion , Suchmaschinen und eigene Gedanken zu keiner Lösung kommst - dann machst du dazu ein Thema auf!

    Unterteile die Aufgabe in viele kleine Teile und löse immer nacheinander jedes kleine Teil!

    PS: Dein CodeSchnipsel sieht recht wüst aus... Versuch immer genau zu erklären, welche Variable du wofür gedacht hast, welche Codezeile was machen soll, welche Codezeile einen anderen Effekt als den Gewünschten erzielt und wie dieser andere Effekt aussieht. Dazu musst du dich möglicherweise erstmal mit dem Debugger auseinandersetzen (Haltepunkte, Ausdrücke beobachten, Untersuchen etc).

    Versuche auch, recht genaue Fragen zu stellen - wahrscheinlich gabs noch keine Antwort, weil dein Post sich zusammengefasst so liest: "Ich hab keine Ahnung und keine Lust, macht mal bitte meine Schulaufgabe, Danke."



  • hallo kolumbus,

    so wie du sagtest habe ich das schon gemacht. Ich habe erst ein Auswahlfenster, in dem man anklicken kann, was man in welches Zahlensystem umwandeln will. Daraufhin (bei OK-Klick) öffnet sich jeweils eine Fenster mit einem Ein- und Ausgabe Edit-Feld. Das dokumentieren muss ich mehr machen, da hast du völlig Recht und ich wollte auch nicht, dass es so aussieht, als ob ich keine Lust dazu hätte, es überfordert mich nur etwas. Manch einer aus meiner Klasse hat ein einfaches Thema wie beispielsweise Datenbanken in C++ einbinden. Das könnt ich auch ohne Hilfe nur bei diesem Umrechenzeugs hab ich eben gar keen Plan. 🙂 Na ich werd mal schauen wie weit ichs bringe, aber zum Theme Hexadezimale Zahlen in Oktalzahlen umwandeln und umgekehrt habe ich irgendwie nichts finden können. Oder muss ich etwa die eingegeben Zahl in eine Binär- und dann erst in das gewünschte Zahlenformat bringen?

    fire



  • Noch ein Hinweis: Es mussten sich schon viele Menschen damit beschäftigen, Zahlen in andere Systeme zu konvertieren (sprich: DEREN DARSTELLUNG ZU ÄNDERN), daher ist das Internet voll von Hinweisen. Einen geb ich dir sofort: Klick hier im Forum auf Suchen, wähle als zu durchsuchendes Forum Alle und gib als Suchbegriff *Zahlensystem* ein und schau dir an wie viele Treffer es gibt... Wenn deine Verwunderung sich gelegt hat (ich war zumindest oft überrascht was die Suche Alles ausspuckt), konzentriere dich zB. auf den 9. Treffer. 😉



  • Hallo,

    die Umrechnung von einem Zahlenformat in ein anderes ist eigentlich relativ einfach, nehmen wir mal die Zahl 93, die in das oktale System umgewandelt werden soll.

    93 = 1 x 8^2, Rest 29
    29 = 3 x 8^1, Rest 5
    5 = 5 x 8^0

    Also ist 93 oktal 135.

    Das Problem liegt nun darin, was der erste Teiler ist, mit dem man beginnen muss, also woher weiss ich, warum ich bei 93 zuerst durch 64 und den Rest dann durch 8 teilen muss? Um das rauszufinden braucht man den Logarithmus von 93 zur Basis 8 (ist ~ 2.18, nur der Ganzzahlanteil ist relevant). Die grösste 8er Potenz in 93 ist also 64, da 8^2 64 sind. Um den Logarithmus einer Zahl X zur Basis B zu bestimmen kann man folgende Formel benutzen log(X,B) = log(X) / log(B).
    Die ganze Umwandlung sieht dann so aus:

    #include <cmath>
    #include <string>
    #include <sstream>
    
    using namespace std;
    
    string convert( unsigned int uiBase, int iValue )
    {
       // Grösste Potenz bestimmen
       int n = log( static_cast<double>( uiValue ) ) /
                                 log( static_cast<double>( uiBase ) );
    
       ostringstream oss;
       while( n >= 0 )
       {
          // B^n ausrechnen
          unsigned int uiDigitValue = pow( static_cast<double>( uiBase ),
                                           static_cast<double>( n ) );
          // Ganzzahldivision X / B^n
          unsigned int uiDigit = uiValue / uiDigitValue;
    
          // Zeichen ausgeben
          // TO DO: Berücksichtigung des Alphabets für Zahlen mit Basis > 10
          oss << uiDigit;
    
          // beim nächsten Schleifendurchlauf nächstkleinere Potenz benutzen
          --n;
    
          // Ausgangswert korrigieren
          uiValue -= uiDigit * uiDigitValue;
       }
       return oss.str();
    }
    
    int main()
    {
       string s1 = convert( 8, 93 );
       string s2 = convert( 2,  8 );
       string s3 = convert( 7, 13 );
    }
    

    Das Prinzip sollte klar sein, mit dem umgekehrten Weg kannst du jede Zahl in eine Dezimalzahl wandeln und von dort in eine Zahl jeder anderen Basis. Du musst dir lediglich noch was einfallenlassen für Zahlen, deren Basis grösser als 10 ist.

    Gruß,
    Doc



  • danke für eure hilfe... ich hoff ich bekomms jetz hin 😃


Anmelden zum Antworten