![]() |
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. :) |
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. ![]() oder in der CodeLib ![]() weitere Beispiele, unter den Begriffen Zahlensystem |
AW: Umrechnen von Zahlensystemen
Ja, den habe ich auch schon gesehen, aber da sehe ich nicht durch :o.
|
AW: Umrechnen von Zahlensystemen
Delphi-Quellcode:
hier hab ich mal ausprobiert, wie es gehen könnte, aber das funktioniert nicht. könnt ihr mir bitte, bitte helfen!!
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); |
AW: Umrechnen von Zahlensystemen
Lern die Syntax zuerst.
|
AW: Umrechnen von Zahlensystemen
Zitat:
Delphi-Quellcode:
deine Zahl ... warum rechnest du dann niemals mit
n
Delphi-Quellcode:
?
n
Und zur Syntax: Zitat:
Delphi-Quellcode:
x := n MOD 2;
v := n DIV 2; Zitat:
Über
Delphi-Quellcode:
bekommt man doch sowieso nur eine einstellige Zahl raus.
MOD 2
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. |
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. |
AW: Umrechnen von Zahlensystemen
Zitat:
Delphi-Quellcode:
weißt Result immer einen komplett neuen Wert zu ... das erste Zeichen des String c.
Result := ...;
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:
) und das Ergebnis an Result übergeben (siehe mein Beispiel in #6)
Result + c
oder du nimmst ![]() |
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?!
|
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?? |
AW: Umrechnen von Zahlensystemen
Zitat:
|
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. |
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. |
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!? |
AW: Umrechnen von Zahlensystemen
Du merkst Dir den Wert des niederwertigsten Bits nicht, sondern dividierst sofort durch 2.
|
AW: Umrechnen von Zahlensystemen
ok, das versteh ich nicht so richtig,
könntest du mir das genauer erklären. danke |
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:
Diesmal muss es aber vorne dran: denn du müsstest folgendes aussagen, anstatt dieses Zitat:
|
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. |
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; |
AW: Umrechnen von Zahlensystemen
Beitrag gecancelt, hatte die Frage falsch verstanden.
|
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).
|
AW: Umrechnen von Zahlensystemen
Zitat:
|
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.
|
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:
Nun verdoppeln wir diesen Wert und vergleichen wieder
00101010
00000001 <-- 1 ======== 00000000 --> Ergebnis 0
Code:
Nächster Durchlauf:
00101010
00000010 <-- 2 ======== 00000010 --> Ergebnis 2
Code:
Usw. bis zur Stringposition 1.
00101010
00000100 <-- 4 ======== 00000010 --> Ergebnis 2 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. |
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 |
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 |
AW: Umrechnen von Zahlensystemen
Zitat:
Delphi-Quellcode:
BTW, der Algorithmus von Aphton wird etwas leichter verständlich, wenn du
Potenz:= Power(2, E);
Summe:= Summe + Potenz * J; 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; |
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:
[/edit]
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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 by Thomas Breitkreuz