AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Funktion die Zahlensysteme umrechnen kann bitte testen
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion die Zahlensysteme umrechnen kann bitte testen

Ein Thema von Christian18 · begonnen am 24. Feb 2008 · letzter Beitrag vom 24. Feb 2008
Antwort Antwort
Christian18

Registriert seit: 9. Dez 2003
Ort: Hamburg
1.279 Beiträge
 
#1

Funktion die Zahlensysteme umrechnen kann bitte testen

  Alt 24. Feb 2008, 17:26
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
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Funktion die Zahlensysteme umrechnen kann bitte testen

  Alt 24. Feb 2008, 17:55
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 ..
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Benutzerbild von Martin K
Martin K

Registriert seit: 20. Okt 2005
919 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Funktion die Zahlensysteme umrechnen kann bitte testen

  Alt 24. Feb 2008, 19:33
@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;
Mit den Menschen ist es wie mit Computern -
es gibt Nullen und Einsen.
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Funktion die Zahlensysteme umrechnen kann bitte testen

  Alt 24. Feb 2008, 19:47
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:
  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:
  hex:=dez_to_zahl(255, 16, '0123456789ABCDEF'); Gruss
Thorsten
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:01 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