Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Dezimalzahl in Binärzahl - Frage zum Quelltext (https://www.delphipraxis.net/168478-dezimalzahl-binaerzahl-frage-zum-quelltext.html)

haui95 23. Mai 2012 17:40

Dezimalzahl in Binärzahl - Frage zum Quelltext
 
Guten Tag,
ich komme gerade aus der Schule und hatte in den letzten beiden Stunden Informatikunterricht. Wir haben uns in diesen beiden Stunden noch einmal mit dem Dezimalsystem und dem Binärsystem auseinandergesetzt, jedoch haben wir dieses Mal eine Dezimalzahl in eine Binärzahl umgewandelt und als Programm umgesetzt.


Delphi-Quellcode:
function Reverse(eingabe: String): String;
var
  i: Integer;
begin
  for i := length(eingabe) downto 0 do
    result := result + eingabe[i];
end;

function DecToBin(eingabe: Integer): String;
var
  i: integer;
  ergebnis: String;
begin
  ergebnis := '';
  repeat
    begin
      ergebnis := ergebnis + IntToStr(eingabe mod 2);
      eingabe := eingabe div 2;
    end;
  until (eingabe = 0);
  result := Reverse(ergebnis); // <-- Den String mit einer Zählschleife umzudrehen ist laut unserem Lehrer unkomplizierter und einfacher zu verstehen.

Delphi-Quellcode:
function DecToBin(eingabe: Integer): String;
var
  ergebnis: String;
begin
  ergebnis := '';
  repeat
    begin    
      ergebnis := IntToStr(eingabe mod 2) + ergebnis;  // <--  Instruktion laut unserem Lehrer schwerer zu verstehen.
      eingabe := eingabe div 2;
    end;
  until (eingabe = 0);
  result := ergebnis;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Edit2.Text := DecToBin(StrToInt(Edit1.Text));
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  close;
end;
end.
Nun frage ich mich, warum unser Lehrer meinte, dass er die Anweisung
Delphi-Quellcode:
ergebnis := IntToStr(eingabe mod 2) + ergebnis;
, um einen String gleich richtig anzuordnen
nicht kannte und gleichzeitig meinte, dass dieses keine vernünftige Lösung wäre und zugleich auch noch zu komplizierter zu verstehen. Ist da wirklich etwas dran ? Kann man den String besser mit einer Zählschleife umdrehen als in der Repeat-Until-Schleife den Rest gleich vor das Ergebnis zu setzen. Was ist effizienter und eleganter ? Trotzdem bevorzuge ich immer noch diese Anweisung
Delphi-Quellcode:
ergebnis := IntToStr(eingabe mod 2) + ergebnis;
MfG

Hauke

DeddyH 23. Mai 2012 17:51

AW: Dezimalzahl in Binärzahl - Frage zum Quelltext
 
Abgesehen davon, dass die Reverse-Funktion auf String[0] zugreift, kann ich der Argumentation auch nicht folgen. Performanter dürfte jedenfalls die Variante ohne anschließendes Umdrehen sein, da sie eben nicht erst noch umdrehen muss.

himitsu 23. Mai 2012 17:58

AW: Dezimalzahl in Binärzahl - Frage zum Quelltext
 
Zitat:

Zitat von DeddyH (Beitrag 1167774)
Abgesehen davon, dass die Reverse-Funktion auf String[0] zugreift, ...

Mit aktiviertet Bereichsprüfung würde man diesen Fehler auch ganz gut entdecken. :angle2:


Man könnte die suboptimalen String-Concatinierungen noch weglassen.
Delphi-Quellcode:
function Reverse(eingabe: String): String;
var
  i: Integer;
begin
  SetLength(Result, Length(eingabe));
  for i := Length(eingabe) downto 1 do // oder for i := 1 to Length(eingabe) do
    Result[Length(eingabe) - i + 1] := eingabe[i];
end;
oder Delphi-Referenz durchsuchenReverseString, falls erlaubt und vorhanden.

shmia 23. Mai 2012 18:07

AW: Dezimalzahl in Binärzahl - Frage zum Quelltext
 
Also theoretisch ist es besser wenn man an einen String hinten ein Zeichen anhängt anstatt das Zeichen vorne einzufügen.

Beim Anhängen müssen weniger viel Daten bewegt werden als beim Einfügen.
Delphi-Quellcode:
ergebnis := ergebnis + IntToStr(eingabe mod 2); // anhängen
ergebnis := IntToStr(eingabe mod 2) + ergebnis; // einfügen
ABER (!) so wie das programmiert wurde, wird auch beim Anhängen jedes Mal der alte String an einen neuen Ort im Speicher kopiert.

Da der Europärer von links nach rechts schreibt ist Anhängen an einen String mental einfacher zu begreifen als wenn man "links" immer wieder ein neues Zeichen einfügt.
Wahrscheinlich ist das der Gedanke hinter "unkomplizierter und einfacher zu verstehen".

haui95 23. Mai 2012 18:44

AW: Dezimalzahl in Binärzahl - Frage zum Quelltext
 
Vielen Dank für eure Antworten !
Die Funktionen DecToBin und Reverse habe ich allerdings selber geschrieben, um den Quelltext ein bisschen besser zu strukturieren und um eine dauerhafte Verwendung der Button Prozedur zu vermeiden. Desweiteren hatte mein Informatiklehrer nur die Button Prozedur verwendet und seinen Quelltext mit Zählschleife in diese hineingeschrieben.
Manchmal denke ich wirklich, dass einige Lehrer nicht in der Lage sind den Schülern etwas Vernünftiges beizubringen, zumal mein Lehrer seinen Quelltext für uns noch nicht einmal gemäß der Delphi Syntax der Übersichtlichkeit halber formatiert.

MfG

Hauke

sx2008 23. Mai 2012 22:27

AW: Dezimalzahl in Binärzahl - Frage zum Quelltext
 
Zitat:

Zitat von haui95 (Beitrag 1167785)
Die Funktionen DecToBin und Reverse habe ich allerdings selber geschrieben, um den Quelltext ein bisschen besser zu strukturieren und um eine dauerhafte Verwendung der Button Prozedur zu vermeiden

Das ist absolut der richtige Weg!
Selbst wenn die Funktion nur von einer Stelle aufgerufen wird, verbessert dies die Lesbarkeit und Testbarkeit des Codes (solange man es nicht übertreibt).
In ganz seltenen Fällen (z.B. bei zeitkritischen Berechnungen) gibt es auch das Gegenteil - der Code von kleinen Funktionen wird an der Stelle des Aufrufs eingefügt; man spart dabei einige Mikrosekunden für den Funktionsaufruf.
Manche Compiler helfen dabei mit Inline Funktionen oder Makros.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:34 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz