Autor Beitrag
Lauzijungs
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 01.05.06 23:10 
Ich habe ein Problem hinsichtlich der Umwandlung von Dual- in Dezimalzahl. Zwar habe ich die richtige Lösung, weiß aber nicht wie man darauf kommt.

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
function dezimal(zahl:integer):string;
var dez,i,faktor:integer;
duzahl:string;
begin;
duzahl:=inttostr(zahl);
dez:=0;
faktor:=1;
for i:=length(duzahl) downto 1 do begin
dez:=dez+faktor*(strtoint(duzahl[i]));
faktor:=faktor*2;
end;
dezimal:=inttostr(dez);
end;


procedure TForm1.Button1Click(Sender: TObject);
VAR umwandlung:integer;
eingabe,berechnung:string;
begin
eingabe:=Form1.Edit1.text;
IF RadioButton1.checked THEN umwandlung:=1
ELSE IF RadioButton2.checked THEN umwandlung:=2
ELSE IF RadioButton3.Checked THEN umwandlung:=3
ELSE IF Radiobutton4.checked THEN umwandlung:=4;
CASE umwandlung OF
1:berechnung:=dual(strtoint(eingabe));
2:berechnung:=hex(strtoint(eingabe));
3:berechnung:=dezimal(strtoint(eingabe));
4:berechnung:=hexadezi(eingabe);
END;

Edit2.text:=berechnung;
end;

end.

-------------
Im unten gegebenen Hauptprogramm seh ich ja noch durch.
Die Function ist für mich an einigen Stellen aber nicht durchschaubar.

Beispiel: Umwandlung von Dualzahl 1100 (Dezimalzahl wäre also 12)

1. Frage: Wozu genau legt man die Variablen dez und faktor mit 0 bzw. 1 fest?

Dann wenn man der Function folgt, würde man ja für dez=4 erhalten (denn i=4, da Dualzahl 1100 4stellig ist)
Als Faktor würde man den Wert 2 erhalten.

Dann kommt das eigentlich größte Problem:

for i:=length(duzahl) downto 1 do begin

Diese Zählschleife sagt ja eigentlich aus, dass die nachfolgenden Schritte so lange ausgeführt werden sollen, bis i=1 ist. An welcher Stelle aber ist beschrieben, dass i was ja am Anfang den Wert 4 hat, nachfolgend kleiner wird, dass es überhaupt den Wert 1 erreichen kann?


Also wie gesagt, dass das Programm so funktioniert, habe ich schon festgestellt, aber wie man darauf kommt, darin liegt mein Problem. Es wäre schön, wenn mir hier jemand weiterhelfen könnte und sagen könnte wo mein Denkfehler liegt.
Über eine möglichst schnelle Antwort würde ich mich sehr freuen.

Moderiert von user profile iconraziel: Delphi-Tags hinzugefügt
Jetstream
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Mo 01.05.06 23:19 
is eigentlich echt einfach.

dez wird mit null und faktor mit eins initialisiert.
dann startet die for-schleife, beginnend von der länge der binärzahl bis runter zu eins.
length(duzahl) ist die länge der eingabe, downto sagt, dass runtergezählt wird.

in deinem beispiel 1100 liefe die schleife von 4 bis 1.

in jedem durchlauf der schleife wird der faktor verdoppelt (erst eins, dann zwei, dann vier, dann acht, ...)
und auf dez draufaddiert, wenn die zahl, bei der er grade ist, eins ist.

er addiert auf dez einfach den faktor multipliziert mit der zahl. ist sie null,
wird nicht addiert, ist sie eins, genau der faktor.

am ende ist auf dez alles draufaddiert worden, die zahl wird noch in nen string gecastet und fertig.
Lauzijungs Threadstarter
Hält's aus hier
Beiträge: 13



BeitragVerfasst: Mo 01.05.06 23:32 
Klingt einiges schon ganz logisches. Aber an dieser Stelle hab ich noch ein Problem:

dez:=dez+faktor*(strtoint(duzahl[i]));

Erstmal versteh ich nicht, woher das Programm erkennen soll, wann dez 1 und wann 0 ist, also wann er den Fakto hinzuaddieren soll und wann nicht.

Außerdem hab ich keine Idee wie der Wert in der Klammer berechnet wird.

Wahrscheinlich ganz einfach, aber ich steh hier irgendwie aufm Schlauch.
UGrohne
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Veteran
Beiträge: 5502
Erhaltene Danke: 220

Windows 8 , Server 2012
D7 Pro, VS.NET 2012 (C#)
BeitragVerfasst: Di 02.05.06 09:11 
user profile iconLauzijungs hat folgendes geschrieben:
dez:=dez+faktor*(strtoint(duzahl[i]));

Erstmal versteh ich nicht, woher das Programm erkennen soll, wann dez 1 und wann 0 ist, also wann er den Fakto hinzuaddieren soll und wann nicht.

duzahl ist doch der String, der den Binärwert enthält, damit liest Du doch die aktuelle Stelle aus. i ist die Laufvariable, die mit jedem Durchlauf der for-Schleife um 1 erniedrigt wird, damit wird dann immer die nächste Stelle ausgelesen. strtoint wandelt dieses Zeichen dann in eine Zahl um, um es dann mit Faktor zu multiplizieren. Wenn die aktuelle Stelle 0 ist, wird nichts dazuaddiert, wenn sie 1 ist, wird der Faktor dazuaddiert.

user profile iconLauzijungs hat folgendes geschrieben:
Außerdem hab ich keine Idee wie der Wert in der Klammer berechnet wird.

Du meinst in der eckigen Klammer? Das i? Das ist wie oben schon beschrieben die Laufvariable.
Jetstream
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 222



BeitragVerfasst: Di 02.05.06 10:16 
Nehmen wir mal dein Beispiel: 1100

i wird von 4 auf 1 runtergezählt, ist also am anfang der for-schleife 4.
dez ist null, faktor ist eins.

dann passiert im ersten durchlauf der schleife folgendes:

duzahl[i] ist '0' (ein string ist ein array aus characters, also einzelnen buchstaben, duzahl[4] gibt das zeichen zurück, das an vierter stelle steht.
strtoint(duzahl[i]) ist 0. (gleiches wie vorher, nur kein character mehr, sondern eine zahl)
faktor*(strtoint(duzahl[i])) ist 0 (weil 1 * 0 = 0)
dez+faktor*(strtoint(duzahl[i])) ist 0 (weil 0 + 0 = 0)

dann wird der faktor verdoppelt. die schleife fängt wieder oben an und i wird zur 3.

duzahl[i] ist wieder '0'
strtoint(duzahl[i]) ist wieder 0
faktor*(strtoint(duzahl[i])) ist 0
dez+faktor*(strtoint(duzahl[i])) ist 0

wieder wird der faktor verdoppelt. faktor ist jetzt 4. i wird zur 2.

duzahl[i] ist '1'
strtoint(duzahl[i]) ist 1
faktor*(strtoint(duzahl[i])) ist 4 (4 * 1 = 4)
dez+faktor*(strtoint(duzahl[i])) ist 4 (0 + 4 = 4)

faktor ist jetzt 8. dez ist 4. i ist 1.

duzahl[i] ist '1'
strtoint(duzahl[i]) ist 1
faktor*(strtoint(duzahl[i])) ist 8 (8 * 1 = 8 )
dez+faktor*(strtoint(duzahl[i])) ist 12 (4 + 8 = 12)

dez ist jetzt 12. fertig.


Zuletzt bearbeitet von Jetstream am Do 18.05.06 23:39, insgesamt 2-mal bearbeitet
Allesquarks
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 510

Win XP Prof
Delphi 7 E
BeitragVerfasst: Di 02.05.06 13:12 
Vielleicht nochmal generelles zu Zahlen. Eine Zahl ist ein mathematisches Objekt. Die Dualzahl oder Dezimalzahl wie diverse andere hingegen nur Schreibweisen Dieser Zahl und zwar beruhend auf immer der gleichen Operation.

Zahl=Summe über i (Ziffer * Basis^i); einschließlich der Null

So ist die Zwölf: 1 * 10 ^ 1 + 2 * 10 ^ 0 Basis zehn = 12

oder: 1 * 2 ^ 3 + 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0 Basis zwei = 1100



Nebenbei strtoint für nen Charakter ist mit Kanonen auf Spatzen geschossen:

ord(mydualzahl[i])-den Offset in der Ascii-Tabelle