Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Oktalzahl zu Dezimalzahl (https://www.delphipraxis.net/18387-oktalzahl-zu-dezimalzahl.html)

KermitFrosch 17. Mär 2004 19:42


Oktalzahl zu Dezimalzahl
 
Hallo erst mal... Ich wollte mal fragen, wie ich Oktalzahlen in Dezimalzahlen umwandeln kann.
Das prinzip ist mir schon klar

dezimal -->12344

4 · 1 = 4
4 · 8 = 32
3 · 64 = 192
2 · 512 = 1024
1 · 4096 = 4096
—————
5348

oktal --> 5348

aber wie ist dies programmiertechnisch zu meistern?

Bitte nicht auf den anderen Forumeintrag "Oct zu Integer" verweisen, dass hilf mir nicht weiter

thx schon mal

der FRosch

Skiron 17. Mär 2004 20:03

Re: Oktalzahl zu Dezimalzahl
 
Zitat:

Zitat von Illuminator-23-5
Delphi-Quellcode:
function xToDec(Nb: string; sys: byte): integer;
const
  ch = '0123456789ABCDEF'
var
  i: integer;
begin
  result := 0;
  if sys in [2..16] then begin
    for i := 1 to length(Nb) do
      result := result*sys + pos(upCase(Nb[i]), ch) - 1;
  end;
end;

wenn du unter sys nun 8 mitgibst, und unter Nb die nummer (oder IntToStr(Nummer), falls es ein integer ist), und schon dürfts klappen!

KermitFrosch 17. Mär 2004 20:40

Re: Oktalzahl zu Dezimalzahl
 
thx, dass ist ja sehr gut... doch jez erblicke ich meinen fehler nicht...

Delphi-Quellcode:
procedure TForm1.btnoctalClick(Sender: TObject);
function xToDec(octal: string; sys: byte): integer;
var
i: integer;
const
  ch = '0123456789ABCDEF';
begin
  octal:=(edtoctal.Text);
  sys:=8;
  result := 0;
  if sys in [2..16] then
   begin
    for i := 1 to length(octal) do
      result := result*sys + pos(upCase(octal),ch) - 1;
  end;
end;
end;
bei der rot markierten stelle, gibt er n fehler aus mit inkom. typen, aba warum?

Skiron 17. Mär 2004 20:47

Re: Oktalzahl zu Dezimalzahl
 
probiers mal so:
Delphi-Quellcode:
procedure TForm1.btnoctalClick(Sender: TObject);
var
  i: integer;
  octal: string;
  sys: byte;
  dec: integer;
const
  ch = '0123456789ABCDEF';
begin
  octal:=(edtoctal.Text);
  sys:=8;
  dev := 0;
  if sys in [2..16] then
   begin
    for i := 1 to length(octal) do
      dec := dec*sys + pos(upCase(octal),ch) - 1;
  end;
  edtdecimal.Text := IntToStr(dec); //oder wie halt das edit heißt
end;

KermitFrosch 17. Mär 2004 21:03

Re: Oktalzahl zu Dezimalzahl
 
hmm, er sagt mir immer noch bei

dec := dec*sys + pos(upCase(octal),ch) - 1;

[Fehler] Unit1.pas(316): Inkompatible Typen: 'Char' und 'String'
[Fataler Fehler] Project1.dpr(6): Verwendete Unit 'Unit1.pas' kann nicht compiliert werden

Sharky 18. Mär 2004 06:20

Re: Oktalzahl zu Dezimalzahl
 
Hai Frosch,

upCase erwartet als Parameter ein CHAR deine Variable octal ist aber vom Typ String.
Für einen String musst du UpperCase verwenden.

KermitFrosch 18. Mär 2004 12:25

Re: Oktalzahl zu Dezimalzahl
 
Hey, ja jez funzt es... aba die richtige zahl kommt nich raus... gibt man zb als octalzahl
173 an, sollte bei dezimal 123 stehen... tut es aba nicht. da steht jez: -73

Skiron 18. Mär 2004 12:36

Re: Oktalzahl zu Dezimalzahl
 
probiers mit
Delphi-Quellcode:
  octal[i]

KermitFrosch 18. Mär 2004 16:45

Re: Oktalzahl zu Dezimalzahl
 
JAAA :hello: das iss es!!! Thx, endlich... :-D :-D :-D

KermitFrosch 21. Mär 2004 17:22

Re: Oktalzahl zu Dezimalzahl
 
kann mir jemand sagen, was dieses uppercase bedeutet? Und wie die zeichen abgerufen werden, also wie die schleife sie verwändet? also ch

fkerber 21. Mär 2004 17:29

Re: Oktalzahl zu Dezimalzahl
 
Hi!

UpperCase macht alles zu Großbuchstaben.
LowerCase macht alles zu Kleinbuchstaben.

Delphi-Quellcode:
showmessage(Uppercase('teSt'));  // = TEST
showmessage(Lowercase('teSt'));  // = test

Ciao fkerber

KermitFrosch 21. Mär 2004 17:40

Re: Oktalzahl zu Dezimalzahl
 
begin
for i := 1 to length(octal) do
dec := dec*sys + pos(upCase(octal),ch) - 1;

thx, aber wie wird dieses ch verwendet. Woher weiß das prog, wann es verwändet wird

fkerber 21. Mär 2004 17:42

Re: Oktalzahl zu Dezimalzahl
 
Hi!

Wie meinst du das?

ch ist ein String, aus dem mit Pos die benötigte Stelle gesucht wird, wenn ich das richtig interpretiere.


Ciao fkerber

KermitFrosch 21. Mär 2004 17:59

Re: Oktalzahl zu Dezimalzahl
 
woher weiß er denn die richtige posi?

fkerber 21. Mär 2004 18:38

Re: Oktalzahl zu Dezimalzahl
 
Hi!

Du rufts die Funktion Pos doch so auf, dass du ihr ein Zeichen übergibst, dass sie in dem konstanten String suchen soll.

Der String sieht ja so aus: 0123456789ABCDEF

Übergibst du jetzt das Zeichen A, dann gibt Pos 10 zurück (ich hoff mal, dass 10 stimmt, bin mir nicht sicher, ob der ab 0 zählt oder wie auch immer, aber fürs Prinzip wird es hoffentlich klar :oops: )


Ciao fkerber

Jens Schumann 21. Mär 2004 18:52

Re: Oktalzahl zu Dezimalzahl
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von KermitFrosch
Das prinzip ist mir schon klar

dezimal -->12344

4 · 1 = 4
4 · 8 = 32
3 · 64 = 192
2 · 512 = 1024
1 · 4096 = 4096
—————
5348

oktal --> 5348

Ist Euch eigentlich schon mal aufgefallen, dass die hier gezeigte Umrechnung einer Dezimalzahl in eine Octalzahl völlig falsch ist?
Das erste Indiz ist, dass in der vermeintlichen Lösung die Basis als Ziffer vorkommt.
Kann nicht sein.
Das zweite Indiz ist, dass die vermeintliche Lösung weniger Ziffer hat als die Dezimalzahl.
Kann nicht sein. Es können nur gleiche viele oder mehr Ziffern sein. Weil die Basis des
Octalensystems kleiner ist als die des Dezimalensystems.

Die richtige Lösung lautet: 12344(dezimal) ist 30070(octal)

Der Algorithmus für die Umrechnung einer Dezimalzahl in ein beliebiges Zahlensystem kann aus der Anlage abgeleitet werden.

KermitFrosch 24. Mär 2004 13:48

Re: Oktalzahl zu Dezimalzahl
 
ja, ok, dieses beispiel von mir war falsch... aber die schleife rechnet es richtig...
doch weiß ich immer noch nichts mit der besagten Zeile anzufangen

Nieswood 6. Apr 2006 09:58

Re: Oktalzahl zu Dezimalzahl
 
hallo erstmal,

habe diese diskussion brennend verfolgt, nur hänge ich einwenig ... würde gerne mal den kompletten quellcode sehen. denn er gibt mir zwar die ersten oktalzahlen richtig aus aber danach erhalte ich immer nur eine '-9' :wall: hatte das mit dem octal[i] nit ganz geschnitten ... danke schon mal im vorraus für die hilfe!

Phantom1 6. Apr 2006 10:20

Re: Oktalzahl zu Dezimalzahl
 
Ich hab ne function die jedes Zahlensystem ins andere Rechnen kann (warum sollte man auch für jede umrechnung eine function schreiben?):

Delphi-Quellcode:
function BaseToBase(Value: string; StartBase, EndBase: byte): string;
const Digits = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var i: Integer; dez, j: Int64;
begin
  Result:='';
  if (StartBase<2) or (StartBase>36) or
     (EndBase<2) or (EndBase>36) then Exit;
  for i:=1 to Length(Value) do begin
    j:=Pos(Value[i], Digits);
    if (j>StartBase) or (j=0) then Exit;
  end;
  j:=1;
  dez:=0;
  for i:=Length(Value) downto 1 do begin
    dez:=dez + (Pos(Value[i], Digits)-1) * j;
    j:=j*StartBase;
  end;
  repeat
    Result:=Digits[dez mod EndBase+1] + Result;
    dez:=dez div EndBase;
  until dez=0;
end;
Beispiele:
Delphi-Quellcode:
ShowMessage(BaseToBase('101010', 2, 16)); // umrechnung von Binär in Hex
ShowMessage(BaseToBase('12345', 10, 8)); // umrechnung von Dezimal in Oct
mfg

Klaus01 6. Apr 2006 10:28

Re: Oktalzahl zu Dezimalzahl
 
will dann mal meine Version auch mal in den Ring werfen.

Delphi-Quellcode:

function dec2oct(zahl:Integer):String;
begin
  if zahl DIV 8 > 0 then
    begin
      result:=IntToStr(zahl MOD 8)+result;
      zahl := zahl DIV 8;
      result:=dec2oct(zahl)+result;
    end
  else
    result:=IntToStr(zahl)+result;
end;
edit: uups falsch herum


Grüße
Klaus

Phistev 6. Apr 2006 10:51

Re: Oktalzahl zu Dezimalzahl
 
Zitat:

Zitat von Jens Schumann
Zitat:

Zitat von KermitFrosch
dezimal -->12344

oktal --> 5348

Ist Euch eigentlich schon mal aufgefallen, dass die hier gezeigte Umrechnung einer Dezimalzahl in eine Octalzahl völlig falsch ist?

Die richtige Lösung lautet: 12344(dezimal) ist 30070(octal)

Oder 12344 ist die Oktalzahl, dann wäre 5348 die korrekte Dezimalzahl

Nieswood 6. Apr 2006 11:14

Re: Oktalzahl zu Dezimalzahl
 
danke leutz für die anderen tollen vorschläge, nur mich würde gerne die zuerst diskutierte procedure interessieren! das macht mich ganz kirre ... :spin:

Klaus01 6. Apr 2006 11:23

Re: Oktalzahl zu Dezimalzahl
 
Delphi-Quellcode:
procedure TForm1.btnoctalClick(Sender: TObject);
function xToDec(octal: string; sys: byte): integer;
var
  i: integer;
const
  ch = '0123456789ABCDEF';
begin
  octal:=(edtoctal.Text);
  sys:=8;
  result := 0;
  if sys in [2..16] then
    begin
      for i := 1 to length(octal) do
        result := result*sys + pos(upCase(octal[i]),ch) - 1;
    end;
end;
wenn es das ist was Du meinst.

Grüße
Klaus


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