![]() |
Konversion von dezimal zu binär
Hallo zusammen, ich hab mal wieder ein Problem.
Meine Aufgabe ist es, ein Programm zu schreiben, das ein Zahl(<>0) liest und diese dann in binär tranformiert. Sprich: 43 --> 101011 wegen 1*2^5+0*2^4... Vorneweg, ich habe delphi 6, da war die math.pas nicht dabei. Diese musste ich downloaden, da die Funktion n^i nicht funktionniert hat. Ich hab es dort gespeichert: C:\Program Files (x86)\Borland\Delphi6\Source\Rtl\Sys, um die Funktion 'power' verwenden zu können. Als "Information" kommt nach Eingeben der Zahl '...raised too many consecutive exceptions....process stopped. use step or run to continue.' Zum Script:
Delphi-Quellcode:
program Project2;
{$APPTYPE CONSOLE} uses SysUtils,math; var number:extended; i,k:integer; square:array of integer; begin { TODO -oUser -cConsole Main : Insert code here } readln(number); i:=0; while number>power(2,i) do inc(i); k:=i; while (number<>0) do begin while number>power(2,i) do inc(i); i:=i-1; number:=(number-(power(2,i))); square[i]:=1; end; for i:=k downto 0 do writeln(square[i]); readln; end. Wär sehr nett wenn wer mir sagen könnte was ich falsch gemacht habe. :) LG |
AW: Konversion von dezimal zu binär
Abgesehen davon, dass mir das unnötig kompliziert erscheint gegenüber einem Binärvergleich hast Du vergessen, das Array zu dimensionieren (SetLength).
|
AW: Konversion von dezimal zu binär
Zitat:
Delphi-Quellcode:
{$Q+} => oder über die Projektoptionen und neuerdings auch via {$OVERFLOWCHECKS ON}
Dann wäre das fehlende SetLength sofort aufgefallen. Und wenn du so wild rumrechnest, dann eventuell auch noch die Überlaufprüfung.
Delphi-Quellcode:
{$R+} => oder über die Projektoptionen und neuerdings auch via {$RANGECHECKS ON}
Und wegen dem "kompliziert": Können sich auch ein paar Nachteile (Rechenfehler) ergeben, wenn man "Binäroperationen" (Auslesen der Bits für einen "Integer") über Fließkommazahlen und -Fließkommaperationen abwickelt (Extended), wo es diese gewünschten "Bits" so eigentlich nicht gibt. |
AW: Konversion von dezimal zu binär
Zitat:
Zitat:
Zitat:
|
AW: Konversion von dezimal zu binär
Es ist egal ob du vorher weißt wie lang es wird.
Spätestens wenn es benutzt werden soll, muß du die Größe anpassen, denn was es nicht gibt, das kann man nicht benutzen. Notfalls eben mehrmals, wenn man es vorher nicht weiß. Zitat:
Nja, dieses Kompilerschalter baut Prüfcodes ein, welche z.B. prüfen ob man auf "nichtvorhandenen" Array-Felder zugreifen will und erzeugt dann Exception mit einer "ordentliche" Fehlermeldung. Ohne diese Prüfung passiert sonstewas, wenn man nicht auf ein existierendes Feld zugreift. (z.B. ein ![]() Tja, Konsolenprogramme haben halt ein paar Nachteile. (die VCL initialisiert und benutzt ein paar nette Features, vorallem in Bezug auf die Fehlerbehandlung) Bau mal Folgendes um deinen Code drumrum (zwischen "begin" und "end.").
Delphi-Quellcode:
(in "halbwegs" aktuellen Delphis ist sowas ähnliches schon direkt in der Vorlage für ein neues Konsolenprogram mit drin)
try
// hier dein Code except on E: Exception do begin WriteLn('Error (', E.ClassName, ') : ', E.Message); ReadLn; end; end; |
AW: Konversion von dezimal zu binär
Zitat:
Zitat:
Zitat:
|
AW: Konversion von dezimal zu binär
Du ermittelst doch, wie viele Elemente Dein Array braucht. Sobald Du das weißt, forderst Du mit SetLength dementsprechend Speicher an. Und try-except-Blöcke sind absolute Grundlagen, die sollte man kennen.
|
AW: Konversion von dezimal zu binär
Zitat:
Ein "Fehler in der Bereichsprüfung" ist doch viel verständlicher, als eine wilde "Zugriffsverletzung", welche je nach Position und Art des Zugriffs manchmal garnicht erkannt wird oder sich sonstwie auswirkt. - es werden zufällig an dieser Stelle gefunde Daten gelesen ... welche von anderen Variablen - es exisitert an dieser Stelle nix oder es ist schreibgeschützt (bei einem Schreibzugriff) = Zugriffsverletzung - man weist der Variable was zu, an dieser Stelle existiert was Fremdes (andere Variable), dadurch wird dieses überschrieben ... und dann kann später (auch erst viel später) das Programm sonstwie reagieren, jenachdem was dort überschrieben wurde. Und wenn man dazu noch den Debugger verwendet, dann sagt einem Delphi sogar die Fehlerstelle, welche in deinem Fall zuerst
Delphi-Quellcode:
sein wird, weil das Array viel zu klein ist, da du verggessen hast die Größe zu setzen. :angle2:
square[i]:=1;
[OH]Wie soll ich das verstehen spätestens die Größe anzupassen wenn man es benutzt? Kann ich eine variable mitten im Programm anders deklarieren?[/OH] Nein, das hat auch niemand gesagt. SetLength ändert die Größe des "dynamischen" Arrays, welches du in der Variable "square" deklariert hast. > "dynamisch änderbar", also zur Laufzeit über ![]() PS: Strg+C in Fehlerdialogen = Kopieren der Fehlermeldung |
AW: Konversion von dezimal zu binär
Ich hab jetzt nicht ganz verstanden was das Problem ist, der Array oder wie man konvertiert. Ich hab mal auf die Schnelle eine Funktion erstellt, gebe das Ergebnis aber als String aus. Wer es anders will, bitte anders machen:
Delphi-Quellcode:
Es funktioniert auch ohne Power.
function IntToBinStr(Value: Integer; Digits: Byte = 32): String;
var i, k: Integer; begin if Digits > 32 then Digits := 32; // 32 Bit Int, oder Value Typ ändern Result := ''; k := 1; for i := 1 to Digits do //(4 * 8) = 32 Bit begin if (Value and k) = k then Result := '1' + Result else Result := '0' + Result; k := k * 2; end; end; procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(IntToBinStr(43)); end; |
AW: Konversion von dezimal zu binär
Das ist aber kein fair play: Du machst Dir die Tatsache zunutze, dass die Dezimalzahl intern ohnehin schon als Binärzahl konvertiert vorliegt. Du konvertierst nicht die Dezimalzahl in eine Binärzahl, sondern liest die bereits vorhandenen Bits der Binärdarstellung aus. Ich glaube nicht, dass das im Sinne des Aufgabenstellers ist.
Trotzdem geht es natürlich auch ohne die Power Funktion, man muss dazu nur die Zahl wiederholt durch zwei dividieren und die aufeinanderfolgenden Divisionsreste zu einem Binärzahlenstring zusammenhängen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:30 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz