Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Umrechnen von Zahlensystemen (https://www.delphipraxis.net/162536-umrechnen-von-zahlensystemen.html)

JP29 27. Aug 2011 13:34

Umrechnen von Zahlensystemen
 
Hallo Leute,
und zwar habe ich ein Problem bezüglich von Umrechnungen in verschiedene Zahlensyseme. In der Schule haben wir jetzt gelernt verschiedene Zahlensysteme (dezimal, binär, hexadezimal) umzurechnen und in diesen zu rechnen.
Jetzt hat unser Info-Lehrer die Aufgabe erteilt in einem Programm Zahlen von dezimal zu binär und anders rum umzurechnen. Die Theorie versteh ich ja, aber ich weiß nicht wie ich das umsetzen soll. Ich geh übrigens in die 10. Klasse, also es sollte möglichst einfach gehalten sein, so dass ich das auch verstehe.

Mfg JP29. :)

waldforest 27. Aug 2011 13:45

AW: Umrechnen von Zahlensystemen
 
Hallo,
schau mal hier im Forum nach und nutze die Suchfunktion.
Hier gibt es schon einen Beitrag zu diesem Thema

z.B.
http://www.delphipraxis.net/143001-u...lensystem.html

oder in der CodeLib
http://www.delphipraxis.net/36897-vo...n-anderes.html
weitere Beispiele, unter den Begriffen Zahlensystem

JP29 27. Aug 2011 14:01

AW: Umrechnen von Zahlensystemen
 
Ja, den habe ich auch schon gesehen, aber da sehe ich nicht durch :o.

JP29 27. Aug 2011 14:15

AW: Umrechnen von Zahlensystemen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var x, y : Integer;
    result, c : String;
begin
 x:=StrToInt(Edit1.Text);
 repeat
  begin
   x DIV 2:= x;
   x MOD 2:= y;
   c:=IntToStr(y);
   result:=copy(c,1,1);
  end;
 until x=0;
edit2.Text:=(result);
hier hab ich mal ausprobiert, wie es gehen könnte, aber das funktioniert nicht. könnt ihr mir bitte, bitte helfen!!

Aphton 27. Aug 2011 14:21

AW: Umrechnen von Zahlensystemen
 
Lern die Syntax zuerst.

himitsu 27. Aug 2011 15:26

AW: Umrechnen von Zahlensystemen
 
Zitat:

hier hab ich mal ausprobiert
Du hast in
Delphi-Quellcode:
n
deine Zahl ... warum rechnest du dann niemals mit
Delphi-Quellcode:
n
?

Und zur Syntax:
Zitat:

Delphi-Quellcode:
x DIV 2:= x;
x MOD 2:= y;

Delphi-Quellcode:
x := n MOD 2;
v := n DIV 2;
Zitat:

Delphi-Quellcode:
c:=IntToStr(y);
result:=copy(c,1,1);

Was soll das COPY?
Über
Delphi-Quellcode:
MOD 2
bekommt man doch sowieso nur eine einstellige Zahl raus.
Und wo läßt du die vorherigen Ergebnisse? Result würd jedesmal überschrieben
Delphi-Quellcode:
result := Result + IntToStr(x);
.

Tipp: Nenn besser keine Variable Result ... denn so heißt das "Result" jeder Funktion und das könnte mal missverständlich enden.

Tipp 2: Im Debugger kann man sich die Werte seiner Variablen ansehn und so erkennen was wie wo (falsch) läuft.

JP29 27. Aug 2011 17:41

AW: Umrechnen von Zahlensystemen
 
also...ok mit dem n war ein fehler.
aber das result hab ich ja als string und ich kopiere das neu errechnete ja dann immer den string result rein damit das vorherige erhalten bleibt.

himitsu 27. Aug 2011 20:04

AW: Umrechnen von Zahlensystemen
 
Zitat:

Zitat von JP29 (Beitrag 1119928)
aber das result hab ich ja als string und ich kopiere das neu errechnete ja dann immer den string result rein damit das vorherige erhalten bleibt.

Falsch,
Delphi-Quellcode:
Result := ...;
weißt Result immer einen komplett neuen Wert zu ... das erste Zeichen des String c.
Und dabei geht natürlich der vorherige Inhalt von Result verloren.

Soll das neue Zeichen angehängt werden, dann mußt du entweder Result nehmen und c anhängen (
Delphi-Quellcode:
Result + c
) und das Ergebnis an Result übergeben (siehe mein Beispiel in #6)
oder du nimmst Delphi-Referenz durchsuchenInsert und fügst das c hinten ein.

JP29 27. Aug 2011 20:14

AW: Umrechnen von Zahlensystemen
 
also danke erstmal für die hilfe...deine antwort habe ich verstanden, aber vom prinzip her also wie ich das meine die einzelnen werte in einem string zu speichern is in ordnung oder?!

JP29 27. Aug 2011 20:24

AW: Umrechnen von Zahlensystemen
 
cool...das programm an sich funktioniert jetzt, allerdings rechnet er nicht richtig z.b rechnet er 12 in 011101111000010101010110 um:
Was ist denn an meinen rechenweg falsch??

JP29 27. Aug 2011 20:26

AW: Umrechnen von Zahlensystemen
 
Zitat:

Zitat von himitsu (Beitrag 1119924)

Tipp 2: Im Debugger kann man sich die Werte seiner Variablen ansehn und so erkennen was wie wo (falsch) läuft.

wie kommt man in den debugger??

JP29 27. Aug 2011 20:35

AW: Umrechnen von Zahlensystemen
 
ok war n dummer fehler, ich hatte nicht x dem edit 1 zugewiesen, aber er rechnet immer noch nicht ganz richtig:
12 sind jetzt 0110 statt 0011.
und 0110 sind nur 6...aber ich erkenne en fehler nicht.
bitte hilfe.

himitsu 27. Aug 2011 20:49

AW: Umrechnen von Zahlensystemen
 
Bitte editiere deine Beiträge, wenn du kurz hintereinander mehreres sagen willst. (Mehrfachposts sind nicht so gerne gesehn)

Und zum Debugger: schau dir mal das Menü "Start" genauer an.

Ich weiß jetzt nicht genau, was alles schon in D6 möglich war, aber


z.B. auf die erste Zeile deiner Prozedur gehen und F5 drücken (Haltepunkt setzen)
dann mit F9 das Programm starten
mit F7 / F8 kann man dann einzelne Zeilen/Befehle ausführen

Mit der Maus über eine Variable zeigen und dann zeigt Delphi einem den Wert an
und eventuell gibt es unter Ansicht > Debugfenster auch sowas wie Überwachte Ausdrücke, wo man den Namen einer Variable eintragen und sich deren Wert anzeigen kann.
Auch versteckt sich vermutlich im Kontextmenü des Codefensters einige schöne Einträge zum Anzeigen/ändern von Werten.

JP29 28. Aug 2011 08:45

AW: Umrechnen von Zahlensystemen
 
mhhh naja, aber ich würd gern mal wissen warum er falsch rechnet, eigentlich stimmt doch die syntax

edit:
hab jetztnoch was entdeckt:
er versetzt immer eine null an die falsche stelle:
50 wären ja: 110010
programm rechnet: 011001
genau wie bei 12
12 wären: 1100
programm rechnet:0110

habt ihr vlt. ne idee woran das liegen könne!?

DeddyH 28. Aug 2011 09:23

AW: Umrechnen von Zahlensystemen
 
Du merkst Dir den Wert des niederwertigsten Bits nicht, sondern dividierst sofort durch 2.

JP29 28. Aug 2011 09:35

AW: Umrechnen von Zahlensystemen
 
ok, das versteh ich nicht so richtig,
könntest du mir das genauer erklären.
danke

Aphton 28. Aug 2011 10:01

AW: Umrechnen von Zahlensystemen
 
Das allererste, was du machst, ist, durch zwei zu dividieren. Dadurch verlierst du schon ein "y" Wert.
Dh. du musst die Reihenfolge vertauschen:
y := x mod 2
x := x div 2

Edit
Zitat:

Zitat von himitsu
Insert und fügst das c hinten ein.

hinten? Ach du hast es dir echt damit angetan...
Diesmal muss es aber vorne dran:
denn du müsstest folgendes aussagen, anstatt dieses
Zitat:

Zitat von JP29
12 sind jetzt 0110 statt 0011.

12 sind jetzt 0110 statt 1100.

JP29 28. Aug 2011 10:10

AW: Umrechnen von Zahlensystemen
 
ja jetzt funktioniert es,
vielen dank an alle von euch, dass ihr mir so geholfen habt.

Jetzt habe ich allerdings noch ein Problem beim umrechnen von binaer zu dezimal, und zwar rechnet er hier auch nicht richtig.
Könntet ihr mal bitte einen blick drauf werfen:

Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var n, result, y: Integer;
    x, s1, s2, s3, s4: String;
begin
 x:=(edit1.Text);
 n:=Length(x);
  if n=1 then
   begin
    y:=StrToInt(edit1.Text);
    result:=y*1;
    edit2.Text:=IntToStr(result);
   end;
  if n=2 then
   begin
    s1:=copy(x,2,2);
    s2:=copy(x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2;
    edit2.Text:=IntToStr(result);
   end;
  if n=3 then
   begin
    s1:=copy(x,3,3);
    s2:=copy(x,2,2);
    s3:=copy(x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2 + StrToInt(s3)*4;
    edit2.text:=IntToStr(result);
   end;
  if n=4 then
   begin
    s1:=copy(x,4,4);
    s2:=copy(x,3,3);
    s3:=copy(x,2,2);
    s4:=copy(x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2 + StrToInt(s3)*4 + StrToInt(s4)*8;
    edit2.Text:=IntToStr(result);
   end;
  if n>4 then
   begin
    showmessage('Es können nur Zahlen mit max 4 Stellenumgerechnet werden.');
   end;


end;

oder habt ihr vlt einde idee, wie man das in einer schleife umsetzen kann, ohne diese if-Verschachtelung.

danke schon mal im vorraus.

Aphton 28. Aug 2011 11:04

AW: Umrechnen von Zahlensystemen
 
Du weist nirgendswo Werte den s1, .., s4 Variablen zu!

Mit ner Schleife ginge es evt. so (sollte auch für dich verständlich sein)
Delphi-Quellcode:
var
  binStr : String;
  binVal : Integer;
  decVal : Integer;
  i     : Integer;
begin
  binStr := edit1.Text;
  decVal := 0;
  binVal := 1;
  for i := Length(binStr) downto 1 do
  begin
    if binStr[i] = '1' then
      decVal := decVal + binVal;
    binVal := binVal * 2;
  end;
  edit2.Text := IntToStr(decVal);
end;

Bjoerk 28. Aug 2011 11:10

AW: Umrechnen von Zahlensystemen
 
Beitrag gecancelt, hatte die Frage falsch verstanden.

JP29 28. Aug 2011 16:32

AW: Umrechnen von Zahlensystemen
 
na doch ich kopiere doch immer einen teilstring aus dem gesamten string (der eingegeben wird) in die strings s1....s4 herein

und zur schleife, ich verstehe die syntax nicht und du hast ja auch eine if.verschachtelung, dass müsstest du mir bittenoch einmal erklären

Aphton 28. Aug 2011 16:42

AW: Umrechnen von Zahlensystemen
 
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var n, result, y: Integer;
    x, s1, s2, s3, s4: String;
begin
 x:=(edit1.Text);
 n:=Length(x);
  if n=1 then
   begin
    y:=StrToInt(edit1.Text);
    result:=y*1;
    edit2.Text:=IntToStr(result);
   end;
  if n=2 then
   begin
    s1:=copy(x,2,2);
    s2:=copy(x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2;
    edit2.Text:=IntToStr(result);
   end;
  if n=3 then
   begin
    s1:=copy(x,3,3);
    s2:=copy(x,2,2);
    s3:=copy(x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2 + StrToInt(s3)*4;
    edit2.text:=IntToStr(result);
   end;
  if n=4 then
   begin
    s1:=copy(x,4,4);
    s2:=copy(x,3,3);
    s3:=copy(x,2,2);
    s4:=copy(x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2 + StrToInt(s3)*4 + StrToInt(s4)*8;
    edit2.Text:=IntToStr(result);
   end;
  if n>4 then
   begin
    showmessage('Es können nur Zahlen mit max 4 Stellenumgerechnet werden.');
   end;
end;
Ich sehe da nirgendswo ein "copy" oder was auch immer... keine Zuweisung die etwas mit s1, ..., s4 zu tun hätte (Zuweisung ist ":=").

Weiters
Delphi-Quellcode:
var
  binStr : String;
  binVal : Integer;
  decVal : Integer;
  i : Integer;
begin
  binStr := edit1.Text; // weise binStr den Inhalt von edit1.Text
  decVal := 0; // initialisiere ein paar Werte
  binVal := 1;
  for i := Length(binStr) downto 1 do // gehe alle Elemente rückwärts durch -> richtige Reihenfolge
  begin
    if binStr[i] = '1' then // wenn das Element an der Stelle i = 1 ist, dann
      decVal := decVal + binVal; // addiere dem dezimalen Wert den binären Zählwert hinzu
    binVal := binVal * 2; // aktualisiere den binären Zählwert!
  end;
  edit2.Text := IntToStr(decVal);
end;
Wenn du die Syntax einmal gerafft hast und die Logik dahinter immernoch nicht, dann führe einen Schreibtischtest durch - dh. gehe alles manuell per Hand auf Blatt Papier Schritt für Schritt durch!

JP29 28. Aug 2011 17:00

AW: Umrechnen von Zahlensystemen
 
Zitat:

Zitat von Aphton (Beitrag 1120015)
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var n, result, y: Integer;
    x, s1, s2, s3, s4: String;
begin
 x:=(edit1.Text);
 n:=Length(x);
  if n=1 then
   begin
    y:=StrToInt(edit1.Text);
    result:=y*1;
    edit2.Text:=IntToStr(result);
   end;
  if n=2 then
   begin
    [B]s1:=[/B][B]copy[/B](x,2,2);
    [B]s2:=[/B][B]copy[/B](x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2;
    edit2.Text:=IntToStr(result);
   end;
  if n=3 then
   begin
    s1:=copy(x,3,3);
    s2:=copy(x,2,2);
    s3:=copy(x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2 + StrToInt(s3)*4;
    edit2.text:=IntToStr(result);
   end;
  if n=4 then
   begin
    s1:=copy(x,4,4);
    s2:=copy(x,3,3);
    s3:=copy(x,2,2);
    s4:=copy(x,1,1);
    result:= StrToInt(s1)*1 + StrToInt(s2)*2 + StrToInt(s3)*4 + StrToInt(s4)*8;
    edit2.Text:=IntToStr(result);
   end;
  if n>4 then
   begin
    showmessage('Es können nur Zahlen mit max 4 Stellenumgerechnet werden.');
   end;
end;
Ich sehe da nirgendswo ein "copy" oder was auch immer... keine Zuweisung die etwas mit s1, ..., s4 zu tun hätte (Zuweisung ist ":=").

da steht doch copy und :=
Zitat:

Weiters
Delphi-Quellcode:
var
  binStr : String;
  binVal : Integer;
  decVal : Integer;
  i : Integer;
begin
  binStr := edit1.Text; // weise binStr den Inhalt von edit1.Text
  decVal := 0; // initialisiere ein paar Werte
  binVal := 1;
  for i := Length(binStr) downto 1 do // gehe alle Elemente rückwärts durch -> richtige Reihenfolge
  begin
    if binStr[i] = '1' then // wenn das Element an der Stelle i = 1 ist, dann
      decVal := decVal + binVal; // addiere dem dezimalen Wert den binären Zählwert hinzu
    binVal := binVal * 2; // aktualisiere den binären Zählwert!
  end;
  edit2.Text := IntToStr(decVal);
end;
Wenn du die Syntax einmal gerafft hast und die Logik dahinter immernoch nicht, dann führe einen Schreibtischtest durch - dh. gehe alles manuell per Hand auf Blatt Papier Schritt für Schritt durch!
ok ist schon verständlicher, aber was ist wenn das element 0 ist?
und das mit dem binval*2 versteh ich auch nicht

DeddyH 28. Aug 2011 18:01

AW: Umrechnen von Zahlensystemen
 
Binär in Dezimal ist IMHO einfacher als anders herum. Hier mal etwas Pseudo-Code:
Code:
i = Stringlänge
Zahl = 1
Ergebnis = 0
solange i > 0
  falls String[i]
    '0' oder '1': Ergebnis = Ergebnis + Zahl * AlsZahl(String[i])
    sonst: falsche Eingabe
  Zahl = Zahl * 2
  i = i - 1

JP29 28. Aug 2011 18:08

AW: Umrechnen von Zahlensystemen
 
sorry leute,
aber ich raff das einfach nicht...:?

JP29 28. Aug 2011 18:24

AW: Umrechnen von Zahlensystemen
 
also leute, ist ein noob fehler gewesen,
ich hab bei dem copy befehl was falsch verstanden(ich dachte man kopiert immer nur von position zu position, aber man kopiert ja ab position x Stellen),
jetzt klappt das auch.
Mit der schleife werd ich jetzt selber mal ein bisschen noch tüfteln.
Vielen dank an alle von euch für eure hilfe

mfg julian. :-D

Amateurprofi 28. Aug 2011 19:21

AW: Umrechnen von Zahlensystemen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Julian,
ich hab dir mal eine Funktion zusammengetippt, die numerische Strings von einer Basis in eine andere Basis umwandelt.
Vielleicht hilft dir das bei deinen Überlegungen.

Delphi-Quellcode:
FUNCTION BaseToBase(const source:string; sourcebase,destbase:integer):string;
.
source : Der String der die umzuwandelnde Zahl enthält.
sourcebase : Basis für source.
destbase : Basis für das Resultat.
result : Ergebnis der Umwandlung.

sourcebase und destbase können Werte von 2 bis 62 haben.
Die Ziffern werden
für 0 bis 9 durch '0'..'9'
für 10 bis 35 durch 'A'..'Z'
für 36 bis 61 durch 'a'..'z'
dargestellt.

Wenn du zum Beispiel Dezimal '100' in Hex umwandeln willst, dann rufst du die Funktion so auf
ergebnis:=BaseToBase('100',10,16);

Nehmen wir folgende Situation an
Edit1 : Die umzuwandelnde Zahl (source)
Edit2 : Das Ergebnis
Edit3 : Die Basis für die umzuwandelnde Zahl (sourcebase)
Edit4 : Die Basis für das Ergebnis (destbase)
und nehmen wir weiterhin an, es sei sichergestellt, dass Edit3 und Edit4 numerische Strings enthalten, dann kannst du die Umrechnung so vornehmen:

Delphi-Quellcode:
begin
   try
      Edit2.Text:=BaseToBase(Edit1.Text, StrToInt(Edit3.Text), StrToInt(Edit4.Text));
   except
      on E:EConvert do Edit2.Text:=E.Message;
   end;
end;
Delphi-Quellcode:
type EConvert=Class(Exception);

FUNCTION BaseToBase(const source:string; sourcebase,destbase:integer):string;
type
   TExtDump=array[0..9] of byte;
const
   maxU64:TExtDump=($FF,$FF,$FF,$FF,$FF,$FF,$FF,$FF,$3E,$40); // 2^64-1
var
   i,digit,len:integer;
   value,help:extended;
   c:char;
begin
   // Kontrolle ob source leer und sourcebase und destbase gültig sind
   if source='' then
      raise EConvert.Create('Source is empty');
   if (sourcebase<2) or (sourcebase>62) then
      raise EConvert.Create('Invalid source base');
   if (destbase<2) or (destbase>62) then
      raise EConvert.Create('Invalid dest base');
   // Umwandlung von source in numerischen Wert
   value:=0;
   for i:=1 to Length(source) do begin
      case source[i] of
         '0'..'9' : digit:=Ord(source[i])-Ord('0');
         'A'..'Z' : digit:=Ord(source[i])-Ord('A')+10;
         'a'..'z' : digit:=Ord(source[i])-Ord('a')+36;
         else digit:=63;
      end;
      if digit>=sourcebase then
         raise EConvert.Create('Invalid char in source');
      value:=value*sourcebase+digit;
      if value>Extended(maxu64) then
         raise EConvert.Create('Overflow Error');
   end;
   // Umwandlung des Wertes in einen Ziffernstring der Basis destbase
   if value=0 then begin
      result:='0'
   end else begin
      SetLength(result,64);
      len:=0;
      while value>0 do begin
         help:=Int(value/destbase);
         digit:=Trunc(value-(help*destbase));
         value:=help;
         inc(len);
         if digit<10 then result[len]:=Chr(digit or Ord('0'))
            else if digit<36 then result[len]:=Chr(digit+Ord('A')-10)
               else result[len]:=Chr(digit+Ord('a')-36);
      end;
      SetLength(result,len);
      i:=1;
      while i<len do begin
         c:=result[len];
         result[len]:=result[i];
         result[i]:=c;
         inc(i);
         dec(len);
      end;
   end;
end;

Im Anhang sind die Sourcetexte eines kleinen Zahlenumwandlers.

Aphton 28. Aug 2011 19:56

AW: Umrechnen von Zahlensystemen
 
Zitat:

Zitat von DeddyH (Beitrag 1120027)
Binär in Dezimal ist IMHO einfacher als anders herum. Hier mal etwas Pseudo-Code:
Code:
i = Stringlänge
Zahl = 1
Ergebnis = 0
solange i > 0
  falls String[i]
    '0' oder '1': Ergebnis = Ergebnis + Zahl * AlsZahl(String[i])
    sonst: falsche Eingabe
  Zahl = Zahl * 2
  i = i - 1

Kuck mal hier

Und btw, JP29, sry, habs überlesen xD

Deutlichere Erklärung zum Algorithmus:
Die binäre Zahl "101011" hat im dezimalen System den Wert 43.
So, wie kommt man nun von dem binären Wert zum Dezimalen?
Der von mir zuvor geposteter Algorithmus macht es, den ich nun mal speziell für dich per Hand ausführen werde:
Code:
binStr := "101011"
decVal := 0
binVal := 1
i := Länge von binStr = 6 = Startwert -> runter bis 1, wiederhole folgendes:
i = 6:
  wenn binStr[6] den Wert "1" hat:
    decVal (=0) := decVal (=0) + binVal (1) // dies wird ausgeführt, da zuvorige Bedingung erfüllt -> decVal = 1
  binVal (=1) := binVal(=1) * 2 // daraus ergibt sich 2
i = 5:
  wenn binStr[5] den Wert "1" hat:
    decVal (=1) := decVal (=1) + binVal (2) // dies wird ausgeführt, da zuvorige Bedingung erfüllt -> decVal = 3
  binVal (=2) := binVal(=2) * 2 // daraus ergibt sich 4
i = 4:
  wenn binStr[4] den Wert "1" hat:
    decVal (=3) := decVal (=3) + binVal (4)
  binVal (=4) := binVal(=4) * 2 // daraus ergibt sich 8
i = 3:
  wenn binStr[3] den Wert "1" hat:
    decVal (=3) := decVal (=3) + binVal (8) // dies wird ausgeführt, da zuvorige Bedingung erfüllt -> decVal = 11
  binVal (=8) := binVal(=8) * 2 // daraus ergibt sich 16
i = 2:
  wenn binStr[2] den Wert "1" hat:
    decVal (=3) := decVal (=3) + binVal (16)
  binVal (=16) := binVal(=16) * 2 // daraus ergibt sich 32
i = 1:
  wenn binStr[1] den Wert "1" hat:
    decVal (=3) := decVal (=3) + binVal (32) // dies wird ausgeführt, da zuvorige Bedingung erfüllt -> decVal = 43
  binVal (=32) := binVal(=32) * 2 // daraus ergibt sich 64
decVal = 43

JP29 31. Aug 2011 15:57

AW: Umrechnen von Zahlensystemen
 
hey leute, ich hab noch mal ne frage
ich hab jetzt eine schleifeentwickelt, die von binär in dezimal umrechnet, aber es kommt ein falsches ergebnis raus...könnt ihr mirhelfen
hier der quelltext:

Delphi-Quellcode:
if radiobutton4.checked=true then
 begin
  x:=(edit1.Text);
  n:=Length(x);
  e:=0;
  y:=n;
  summe:=0;
   for i:=1 to n do
    begin
     s1:=copy(x,y,1);
     j:=StrToFloat(s1);
     potenz:=power(j, e);
     summe:=potenz+summe;
     e:=e+1;
     y:=y-1;
    end;
  edit2.Text:=FloatToStr(summe);
end;
end;
mfg julian.

DeddyH 31. Aug 2011 16:40

AW: Umrechnen von Zahlensystemen
 
Das sieht aber sehr umständlich aus. Geh doch den String von hinten nach vorn durch und erhöhe das Ergebnis um eine Zahl, die bei 1 beginnt und bei jedem Durchlauf verdoppelt wird. Das Copy kannst Du Dir übrigens sparen, da man einzelne Zeichen eines Strings direkt per Index ansprechen kann (1. Zeichen hat Index 1).

Aphton 31. Aug 2011 17:00

AW: Umrechnen von Zahlensystemen
 
Zitat:

Zitat von JP29 (Beitrag 1120693)
hey leute, ich hab noch mal ne frage
ich hab jetzt eine schleifeentwickelt, die von binär in dezimal umrechnet, aber es kommt ein falsches ergebnis raus...könnt ihr mirhelfen

Nie wieder!

JP29 31. Aug 2011 17:06

AW: Umrechnen von Zahlensystemen
 
mhh..ich geh doch den string von hinten nach vorne durch...aber dass mit dem verdoppeln und +1 addieren versteh ich nicht.

DeddyH 31. Aug 2011 17:16

AW: Umrechnen von Zahlensystemen
 
Ich weiß nicht, was daran so schwer ist. Aber gut, dann mal ganz von vorn: angenommen, Du hast den String 00101010 und willst eine Zahl daraus machen. Dann nehmen wir zuerst den Wert des kleinsten Bits (=1) und vergleichen mit '1'
Code:
00101010
00000001 <-- 1
========
00000000

--> Ergebnis 0
Nun verdoppeln wir diesen Wert und vergleichen wieder
Code:
00101010
00000010 <-- 2
========
00000010

--> Ergebnis 2
Nächster Durchlauf:
Code:
00101010
00000100 <-- 4
========
00000010

--> Ergebnis 2
Usw. bis zur Stringposition 1.

Wenn also im String an der aktuellen Position '1' steht, dann wird der Wert, den das Bit an dieser Stelle hat, dazuaddiert. Am Ende sollte die Antwort auf die Frage nach dem Universum, dem Leben und einfach allem in diesem Beispiel herauskommen.

JP29 31. Aug 2011 19:30

AW: Umrechnen von Zahlensystemen
 
tut mir jetzt echt leid, aber ich versteh das jetzt nicht, also wir haben in der schule gelernt , dass man die zahl in potenzen zerlegen muss, also bei z.b 1010:
=0*2^0+1*2^1+0*2^2+1*2^3,
deswegen versteh ich nicht wie ihr das rein mathematisch löst

himitsu 31. Aug 2011 19:45

AW: Umrechnen von Zahlensystemen
 
Aber genau das macht DeddyH doch?
Er geht jede mögliche Zweierpotenz durch, schaut ob diese (als Bit) enthalten ist und wenn ja, wird sie zum Ergebnis dazugerechnet.

PS: man kann auch andersrum vorgehen. (ein Vorzeichen gibt es nicht)
- man fängt mit der größten zweierpotenz an, als Vergleichswert (bei Integer also 2^31)
- Schleife:
- nun vergleicht man, ob die Zahl mindestens so groß ist, wie der Vergleichswert
- - wenn ja
- - - dann wird dieser Wert zum Ergebnis addiert
- - - und der Wert wird auch noch von der Zahl abgezogen
- jetzt halbiert man den Vergleichswert (ganzzahlig mit DIV)
- und wiederholt die Schleife, solange der Vergleichswert größer als 0 ist (Vergleichswert > 0.5, aber da wir ja ganzahlig Rechnen VW > 0)

oder
- Ergebnis = 0
- Summand = 1
- Schleife:
- wenn Wert ungerade, dann Summand zum Ergebnis addieren
- Summand verdoppeln
- Wert halbieren (ganzzahlig mit DIV)
- so lange wie der Wert größer 0 ist, die Schleife wiederholen

Bjoerk 31. Aug 2011 23:25

AW: Umrechnen von Zahlensystemen
 
Zitat:

Zitat von JP29 (Beitrag 1120754)
tut mir jetzt echt leid, aber ich versteh das jetzt nicht, also wir haben in der schule gelernt , dass man die zahl in potenzen zerlegen muss, also bei z.b 1010:
=0*2^0+1*2^1+0*2^2+1*2^3,
deswegen versteh ich nicht wie ihr das rein mathematisch löst

waum machst du's dann nicht so?

Delphi-Quellcode:
  Potenz:= Power(2, E);
  Summe:= Summe + Potenz * J;
BTW, der Algorithmus von Aphton wird etwas leichter verständlich, wenn du
die Nullen mit multiplizierst, was du aber nicht brauchst, da ja eben Null, weshalb sich Aphton das geschenkt hat.

Delphi-Quellcode:
function BinToDec (const S: string): string;
var
  I, J, P: Integer;
begin
  J:= 0;
  P:= 1;
  for I:= Length(S) downto 1 do
    if S[I] in ['0', '1'] then
    begin
      J:= J + P * StrToInt(S[I]);
      P:= P * 2;
    end
    else
    begin
      J:= -1;
      Break;
    end;
  Result:= IntToStr(J);
end;

DeddyH 1. Sep 2011 07:00

AW: Umrechnen von Zahlensystemen
 
Ich würde bei falschen Zeichen aber nicht -1 zurückgeben, sondern eine Exception werfen.

[edit] Also so (ist ja jetzt auch egal):
Delphi-Quellcode:
function BinToInt(const BinStr: string): Cardinal;
const
  ERR_TOO_LONG = 'Eingabe "%s" ist zu lang für eine Konvertierung';
  ERR_INVALID_CHAR = 'Ungültiges Zeichen: "%s"';
var
  i, BinWert: Cardinal;
begin
  if Length(BinStr) > SizeOf(Result) * 8 then
    raise Exception.CreateFmt(ERR_TOO_LONG, [BinStr]);
  Result := 0;
  BinWert := 1;
  for i := Length(BinStr) downto 1 do
    begin
      case BinStr[i] of
        '0': ;
        '1': Result := Result or BinWert;
        else
          raise Exception.CreateFmt(ERR_INVALID_CHAR, [BinStr[i]]);
      end;
      BinWert := BinWert shl 1;
    end;
end;
[/edit]


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