Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Funktion die Zahlensysteme umrechnen kann bitte testen (https://www.delphipraxis.net/109107-funktion-die-zahlensysteme-umrechnen-kann-bitte-testen.html)

Christian18 24. Feb 2008 16:26


Funktion die Zahlensysteme umrechnen kann bitte testen
 
Hallo,

ich habe mir eine kleine Function geschrieben, die mir eine Dezimal Zahl in andere Zahlensysteme umrechnen kann. Ich bin mir nun nicht sicher, ob die funktion auch wirklich das tut, was sie soll. Könntet ihr die mal testen?

Muss ich eigentlich noch prüfen, ob die Basis > 10 ist? weil es ab Basis 11 ja mit A beginnt. Oder kann ich das so machen wie ich das gemacht habe?

Kann es bei einer Basis < 11 einen rest geben, der 10 oder größer ist?

Delphi-Quellcode:
function DecToX(Value, Basis : Byte) : String;
begin
  Result:='';
  while Value > 0 do
    begin
      case Value mod Basis of
        10 : Result:=Result + 'A';
        11 : Result:=Result + 'B';
        12 : Result:=Result + 'C';
        13 : Result:=Result + 'D';
        14 : Result:=Result + 'E';
        15 : Result:=Result + 'F';
        else Result:=Result + IntToStr(Value mod Basis);
      end;
      Value:=Value div Basis;
    end;
  Result:=ReverseString(Result);
end;
MFG Christian18

Corpsman 24. Feb 2008 16:55

Re: Funktion die Zahlensysteme umrechnen kann bitte testen
 
Also es echt witzig deinen Beitrag zu lesen.

Ich hätte das ein wenig anders gemacht.

Denn eine Basis > 16 ist durchaus auch denkbar
Delphi-Quellcode:

function DectoX(Value:Integer;Basis):String;
var t:Integer;
begin
  Result := '';
  if Value < 0 then begin
    Result := '-';
    value := - Value;
  end;
  while Value > 0 do begin
    t := Value Mod Basis;
    if t < 10 then
      result := Result + inttostr(t)
    else
      Result := Result + chr(55+T);
    Value := Value div Basis;
  end;
end;
Diese Variante dürfte bis Basis 26 gehn, ist aber so aus dem Kopf gecoded ..

Martin K 24. Feb 2008 18:33

Re: Funktion die Zahlensysteme umrechnen kann bitte testen
 
@Christian18: deinen Code kann man noch vereinfachen bzw. das case verallgemeinern, ähnlich wie es Corpsman gemacht hat.
@Corpsman: bei dir ist der String nachher falsch herum.
Anstatt den String nachher rumzudrehen, kann man ihn aber gleich anders herum zusammen stellen.
Außerdem kommt bei euch beiden bei einer 0 ein leerer String heraus.
Mein Vorschlag:
Delphi-Quellcode:
function DecToX(Value: Cardinal; const Basis: Byte): String;

  function GetChar(const b: Byte): Char;
  begin
    if b < 10 then
      Result := Chr(b + 48)
    else
      Result := Chr(b + 55);
  end;

begin
  if (Basis < 2) or (Basis > 36) then
    raise Exception.Create('Basis ' + IntToStr(Basis) + ' wird nicht unterstützt.');
  Result := '';
  repeat
    Result := GetChar(Value mod Basis) + Result;
    Value := Value div Basis;
  until Value = 0;
end;
Das ist getestet und es funktioniert!

Ach ja, noch das ganze umgekehrt:
Delphi-Quellcode:
function XToDec(s: String; const Basis: Byte): Cardinal;

  function GetDec(const c: Char): Byte;
  begin
    if c in ['0'..'9'] then
      Result := Ord(c) - 48
    else
    if c in ['A'..'Z'] then
      Result := Ord(c) - 55
    else
    if c in ['a'..'z'] then
      Result := Ord(c) - 87
    else
      raise Exception.Create('Zeichen "' + c + '" wird nicht unterstützt.');
  end;

var i, j: Cardinal;
begin
  if (Basis < 2) or (Basis > 36) then
    raise Exception.Create('Basis ' + IntToStr(Basis) + ' wird nicht unterstützt.');
  Result := 0;
  if s = '' then
    s := '0';
  j := 1;
  for i := Length(s) downto 1 do
  begin
    Result := Result + GetDec(s[i]) * j;
    j := j * Basis;
  end;
end;

omata 24. Feb 2008 18:47

Re: Funktion die Zahlensysteme umrechnen kann bitte testen
 
Hier auch noch ein Vorschlag...

Delphi-Quellcode:
function zahl_to_dez(zahl:string; basis:byte; erlaubte_zeichen:string):integer;
var exponent:byte;
    faktor:integer;
begin
  exponent:=0;
  Result:=0;
  repeat
    faktor:=pos(copy(zahl, length(zahl) - exponent, 1), erlaubte_zeichen)-1;
    Result:=round(Result + faktor * exp(exponent*ln(basis)));
    inc(exponent);
  until exponent = length(zahl);
end;
Für HEX:
Delphi-Quellcode:
  dez:=zahl_to_dez('FF', 16, '0123456789ABCDEF');
und andersherum...
Delphi-Quellcode:
function dez_to_zahl(dez_zahl:word; basis:byte; erlaubte_zeichen:string):string;
var teil_ergebnis:integer;
begin
  Result:='';
  repeat
    Result:=erlaubte_zeichen[(dez_zahl mod basis)+1] + Result;
    dez_zahl:=dez_zahl div basis;
  until dez_zahl = 0;
end;
Für HEX:
Delphi-Quellcode:
  hex:=dez_to_zahl(255, 16, '0123456789ABCDEF');
Gruss
Thorsten


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:12 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