![]() |
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 |
AW: Umrechnen von Zahlensystemen
Delphi-Quellcode:
Ich sehe da nirgendswo ein "copy" oder was auch immer... keine Zuweisung die etwas mit s1, ..., s4 zu tun hätte (Zuweisung ist ":=").
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; Weiters
Delphi-Quellcode:
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!
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; |
AW: Umrechnen von Zahlensystemen
Zitat:
Zitat:
und das mit dem binval*2 versteh ich auch nicht |
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 |
AW: Umrechnen von Zahlensystemen
sorry leute,
aber ich raff das einfach nicht...:? |
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 |
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. |
AW: Umrechnen von Zahlensystemen
Zitat:
![]() 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:
decVal = 43
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 |
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:
mfg julian.
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; |
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).
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz