AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Umrechnen von Zahlensystemen

Ein Thema von JP29 · begonnen am 27. Aug 2011 · letzter Beitrag vom 1. Sep 2011
Antwort Antwort
Seite 3 von 4     123 4   
JP29

Registriert seit: 27. Aug 2011
45 Beiträge
 
Delphi 6 Personal
 
#21

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 17:32
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
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#22

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 17:42
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] = '1then // 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!
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
JP29

Registriert seit: 27. Aug 2011
45 Beiträge
 
Delphi 6 Personal
 
#23

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 18:00
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] = '1then // 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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#24

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 19:01
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
JP29

Registriert seit: 27. Aug 2011
45 Beiträge
 
Delphi 6 Personal
 
#25

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 19:08
sorry leute,
aber ich raff das einfach nicht...
  Mit Zitat antworten Zitat
JP29

Registriert seit: 27. Aug 2011
45 Beiträge
 
Delphi 6 Personal
 
#26

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 19:24
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.
  Mit Zitat antworten Zitat
Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.039 Beiträge
 
Delphi XE2 Professional
 
#27

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 20:21
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.

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.
Angehängte Dateien
Dateityp: zip Unit1.zip (208,8 KB, 2x aufgerufen)
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#28

AW: Umrechnen von Zahlensystemen

  Alt 28. Aug 2011, 20:56
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
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG

Geändert von Aphton (28. Aug 2011 um 20:59 Uhr)
  Mit Zitat antworten Zitat
JP29

Registriert seit: 27. Aug 2011
45 Beiträge
 
Delphi 6 Personal
 
#29

AW: Umrechnen von Zahlensystemen

  Alt 31. Aug 2011, 16:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.534 Beiträge
 
Delphi 11 Alexandria
 
#30

AW: Umrechnen von Zahlensystemen

  Alt 31. Aug 2011, 17:40
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).
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 17:16 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