Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Dualzahl in Dezimalzahl


Stinke - Di 06.12.05 16:56
Titel: Dualzahl in Dezimalzahl
So ich muss ein programm entwickeln dualzahl in dezimalzahl aber naja ich komm nich weiter :D aber naja seht selber hier ist der quellcode:




Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
procedure TForm1.ButtondualdeziClick(Sender: TObject);
Var
      dezi:integer;
      anzahl:integer;
      position:integer;
      zeichen:integer;
begin
  dezi:=0;
  Anzahl:=length(editdual.text);  //length ermittelt die Anzahl der Stellen...
  position:=1;                   //welche Stelle der Zahl... in diesem fall die erste
  while Anzahl=0
    do
      begin
        dezi:=Zeichen(Position)*2^(anzahl-1);   <----- hier macht der nie weiter!!!
        dec(anzahl);        // Anzahl=Anzahl-1
        inc(position);      // Position=Position-1
        dezi:=dezi+dezi
      end;
  editdezi.text:=IntToStr(dezi);

end;


Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.


chrisw - Di 06.12.05 17:06

http://www.plauener.de/lessing/delphi/dpue125.htm eine Hilfe zu dem Thema


Allesquarks - Di 06.12.05 17:20

Wenn deine Dualzahl kleiner als 32 Bit ist könntest du Bitweise die Bits eines Cardinal setzen (Wenn Ziffer 1=true dann setze Bit 0 usw.), da der ja auch binär codiert ist und anschließend inttostr aufrufen.


Ironwulf - Di 06.12.05 17:26

hy,


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
  while Anzahl=0  
    do  
      begin  
        dezi:=Zeichen(Position)*2^(anzahl-1);   <----- hier macht der nie weiter!!!  
        dec(anzahl);        // Anzahl=Anzahl-1  
        inc(position);      // Position=Position-1  
        dezi:=dezi+dezi  
      end;


also mag sein das ich da jetz falsch lieg aber wenn die länge größer is als null geht der doch niemals in die schleife rein, wenn er die nur solang durchführt wie anzahl 0 ist...
ich würd das mit ner for schleife machen


Delphi-Quelltext
1:
2:
for i:= 1 to Length(editdual.text) Do
 bla...


jasocul - Di 06.12.05 17:27

Wir haben auch eine schöne Library:
Das könnte helfen [http://www.delphi-library.de/topic_Zahlen+von+jeder+Basis+236+in+eine+andere+umrechnen_38507.html]


Allesquarks - Di 06.12.05 17:51

Das Problem warum der da nie weiter geht ist, dass der ^-Operator nur zur Compilierzeit ausgewertet wird, das heißt insbesondere der Exponent muss konstant sein. Zur Laufzeit musst du hierzu eine Funktion aufrufen z.B. EXP() oder Intpower() oder du baust dir die Potenz selbst mit ner Schleife.


Stinke - Mi 07.12.05 17:42

ok dann frag ich mal so!

ich hab ja die anzahl der stellen ermittelt mit dem befehl....
naja und bei z.B. 1011 wären das 4!!!!!
so jetzt will ich die position "1" auswählen d.h. die erste ziffer von den zahlen...
und dann will ich, dass eine andere variable diese 1. zahl speichert und dann
die zahl *2 hoch die (anzahl minus ... [kommt drauf an])

naja und dann will ich dass er beim nächsten durchlauf die 2. position wählt und die ziffer 0 nimmt...
ich hab die befehle bl0oß nich drauf und delphi hilfe kann mir nich heflen


Allesquarks - Mi 07.12.05 18:56

Wie schon gesagt. Du solltest die Tipps auch lesen! Dein Algo sollte funktionieren nur das 2^(anzahl-1) musst du durch eine Exponentialfunktion, die3 ich dir oben genannt habe ersetzen.


Stinke - Do 08.12.05 16:48

hehe habs hinbekommen (etwas unkomplizierter):


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:
procedure TForm1.ButtondualdeziClick(Sender: TObject);
Var
     
      faktor:integer;
      dezi:integer;
      laenge:integer;
      dual:string;

begin
  Faktor:=1;
  Dezi:=0;
  laenge:=length(editdual.text);   
  while laenge>0
    do
      begin
        dual:=editdual.text;
        dezi:=StrToInt(dual[laenge])*faktor+dezi;
        dec(laenge);
        faktor:=faktor*2;
      end;
  editdezi.text:=IntToStr(dezi);

end;


funktioniert einwandfrei :)
thx an alle die zu diesem thema geschrieben haben

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt.