Einzelnen Beitrag anzeigen

Benutzerbild von implementation
implementation

Registriert seit: 5. Mai 2008
940 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Zahlensystem Oktal fehler

  Alt 23. Dez 2010, 17:56
Ich habe mir mal die Arbeit gemacht und den Code sauber formatiert, damit du siehst, wie du es demnächst auch machen solltest, um Überblick zu behalten
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);

function FOctToDec(FWert: string): string;
function FBinToHex(FWert: string): string;
function FDecToBin(FWert: string): string;

var
  h, d, b, x, a, y, i: Integer;
  c: extended;
  s: string;
begin
  { Hexadezimal in Dezimal }
  if (Radiogroup1.ItemIndex = 1) and (Radiogroup2.ItemIndex = 0) then
  begin
    // Umwandlung von h in Integer, Methode mit Dollarzeichen aus Internet erworben.
    h := StrToInt('$' + Eingabefeld.Text);
    // Ausgabe von h
    Ausgabefeld.Text := IntToStr(h);
  end;
  { Dezimal in Hexadezimal }
  if (Radiogroup1.ItemIndex = 0) and (Radiogroup2.ItemIndex = 1) then
  begin
    // Umwandlung von d in Integer
    d := StrToInt(Eingabefeld.text);
    // Ausgabe von d, Methode mit Format(...) aus Internet erworben.
    Ausgabefeld.Text := Format('%x', [d]);
  end;
  { Dezimal in Binär }
  if (Radiogroup1.ItemIndex = 0) and (Radiogroup2.ItemIndex = 2) then
  begin
    // Löschen Des Textes Im Ausgabefeld, sonst kommt das Ergebnis der darauffolgenden Rechnung dazu
    Ausgabefeld.Text := '';
    // Umwandlung von b in Integer
    b := StrToInt(Eingabefeld.text);
    for x:= 1 to 16 do
    begin
      // Formel für Umrechnung aus Internet erworben, wären nie drauf gekommen.
      BinArray[x] := b mod 2;
      b := b div 2;
      Ausgabefeld.Text := IntToStr(BinArray[x]) + Ausgabefeld.Text;
      if b = 0 then
        break;
    end;
  end;
  { Binär in Dezimal }
  if (Radiogroup1.ItemIndex = 2) and (Radiogroup2.ItemIndex = 0) then
  begin
    // Drehen des Eingabestrings
    s := ReverseString(Eingabefeld.Text);
    // Ermittlung der Länge des Eingabetextes/Eingabestrings
    a := Length(s);
    // c wird auf 0 deklariert
    c := 0;
    for y := 1 to a do
    begin
      c := c + StrToInt(s[y]) * Power(2, (-1 + y));
    end;
    // Ausgabe von c
    Ausgabefeld.Text := FloatToStr(c);
  end;
  { Oktal in... }
  if Radiogroup1.ItemIndex = 3 then
  begin
    for i := 1 to Length(Eingabefeld.Text) do
      // Eingabe Überprüfen, Bolpruef aus Internet erworben
      BolPruef := Eingabefeld.Text[i] in ['0'..'7'];
    if BolPruef then
    begin
      // Umwandlung von Oktal in Dezimal
      if Radiogroup1.ItemIndex = 0 then Ausgabefeld.text := FOctToDec(Eingabefeld.Text);
      // Erst Umwandlung von Oktal in Dezimal, dann von Dezimal in Binär, und schließlich von Bimär in Hexadezimal
      if Radiogroup1.ItemIndex = 1 then Ausgabefeld.text := FBinToHex(FDecToBin(FOctToDec(Eingabefeld.Text)));
      // Erst Umwandlung von Oktal in Dezimal, dann von Dezimal in Hexadezimal
      if Radiogroup1.ItemIndex = 2 then Ausgabefeld.text := FDecToBin(FOctToDec(Eingabefeld.Text));
      if Radiogroup1.ItemIndex = 3 then Ausgabefeld.text := Eingabefeld.Text;
    end else
      // Fehlermeldung, wenn Inhalt vom Eingabefeld nicht dem Oktalzahlensystem entspricht
      Application.Messagebox('Wert nicht Oktal', 'Oktalsystem', MB_OK);
  end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  Eingabefeld.Text := '';
  Ausgabefeld.Text := '';
end;
Ist doch schon gleich viel besser lesbar, oder?

[edit]
Es hat sich eingebürgert bzw. ist im Delphi-StyleGuide vorgeschrieben, dass
  • Blöcke (alles zwischen begin und end) um zwei Leerzeichen eingerückt werden
  • Vor und nach ':=' sowie den Vergleichsoperatoren ('=', '<>', '<=', ...) jeweils ein Leerzeichen gelassen wird.
  • Schlüsselwörter durchgängig klein geschrieben werden
  • Nach (nicht vor) Kommata, Doppelpunkten und Doppelslashes ein Leerzeichen gelassen wird
  • ... und noch einiges mehr, aber das sind die wichtigsten, die reichen, um den Code übersichtlich zu halten.

[edit2]
Übrigens ist in den verschachtelten Funktionen das anführende 'F' sehr verwirrend.
Man hält sie zunächst für Felder (Variablen in Objekten).

Geändert von implementation (23. Dez 2010 um 18:20 Uhr)
  Mit Zitat antworten Zitat