Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Hexadezimal in Binär (https://www.delphipraxis.net/162340-hexadezimal-binaer.html)

Marcel2906 18. Aug 2011 09:39

Hexadezimal in Binär
 
Hey Leute,

ich bins wieder :-D
Nun soll ich ein Programm schreiben, dass Hexadezimalzahlen in Binärzahlen umschreibt.
Ich habe schon viel gesucht, aber nicht meinen Lösungsweg gefunden den ich wählen möchte.
Und zwar soll es so ablaufen.

Ich gebe eine Hexadezimalzahl ein und jede/r Zahl/Buchstabe wird von links nach rechts ins Binärsystem umgeschrieben und hintereinander geschrieben.
Mit meinem Code kann ich bis jetzt lediglich eine einstellige Hexadezimalzahl umwandeln.
Gibt es einen Befehl der die Eingabe von links nach rechts durchgeht??

Mein Code:

Code:
program HexToBin;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  h:integer;
  e,y,b:string;

begin

repeat


  writeln('Gebe Hexadezimalzahl ein:');
  readln(e);

  if e='0' then
  begin
    b:='0000';
  end;

  if e='1' then
  begin
    b:='0001';
  end;

  if e='2' then
  begin
    b:='0010';
  end;

  if e='3' then
  begin
    b:='0011';
  end;

  if e='4' then
  begin
    b:='0100';
  end;

  if e='5' then
  begin
    b:='0101';
  end;

  if e='6' then
  begin
    b:='0110';
  end;

  if e='7' then
  begin
    b:='0111';
  end;

  if e='8' then
  begin
    b:='1000';
  end;

  if e='9' then
  begin
    b:='1001';
  end;

  if e='A' then
  begin
    b:='1010';
  end;

    if e='B' then
  begin
    b:='1011';
  end;

    if e='C' then
  begin
    b:='1100';
  end;

    if e='D' then
  begin
    b:='1101';
  end;

    if e='E' then
  begin
    b:='1110';
  end;

    if e='F' then
  begin
    b:='1111';
  end;

writeln(b);
writeln('');
writeln('Beenden?[y]');
readln(y);
until y='y';
end.

DeddyH 18. Aug 2011 09:47

AW: Hexadezimal in Binär
 
Hier im Forum suchenIntToBin

Neutral General 18. Aug 2011 10:02

AW: Hexadezimal in Binär
 
Hallo,

Also deinen Code umgewandelt würde folgendes ergeben:
Delphi-Quellcode:
program HexToBin;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  h:integer;
  e,y,b:string;

begin
  repeat
    writeln('Gebe Hexadezimalzahl ein:');
    readln(e);

    b := '';
    for i:= 1 to Length(e) do
    begin
      if e[i] = '0' then
        b := b + '0000'
      else
      if e[i] ='1' then
        b := b + '0001'
      else
      if e[i] = '2' then
        b := b + '0010'
      else
      if e[i] = '3' then
        b := b + '0011'
      else
      if e[i] = '4' then
        b := b + '0100'
      else
      if e[i] = '5' then
        b := b + '0101'
      else
      if e[i] = '6' then
        b := b + '0110'
      else
      if e[i] = '7' then
        b := b + '0111'
      else
      if e[i] = '8' then
        b := b + '1000'
      else
      if e[i] = '9' then
        b := b + '1001'
      else
      if e[i] = 'A' then
        b := b + '1010'
      else
      if e[i] = 'B' then
        b := b + '1011'
      else
      if e[i] = 'C' then
        b := b + '1100'
      else
      if e[i] = 'D' then
        b := b + '1101'
      else
      if e[i] = 'E' then
        b := b + '1110'
      else
      if e[i] = 'F' then
        b := b + '1111';
    end;

    writeln(b);
    writeln('');

    writeln('Beenden?[y]');
    readln(y);
  until y='y';
end.
ALLERDINGS:

Du solltest unabhängig von Groß- und Kleinschreibung prüfen.
Außerdem ist diese Lösung alles andere als ideal - Allerdings an deine Kenntnisse angepasst.
Das ganze wäre mit einem Case wahrscheinlich auch um einiges Übersichtlicher.
Einfacher wäre es aber auch den Hex-String in ein Integer umzuwandeln (IntToStr('$' + HexString)) und diese Zahl dann in einer Funktion in eine Binärzahl umzuwandeln.
Zu diesem Zweck hat DeddyH ja schon eine Antwort gegeben.

DeddyH 18. Aug 2011 10:05

AW: Hexadezimal in Binär
 
Japp. Und vielleicht sollte man vorher noch überprüfen, ob die Eingabe überhaupt eine gültige Hexadezimaldarstellung einer Zahl ist und auch verarbeitet werden kann (sie kann ja gültig sein, aber so groß, dass sie jeden verarbeitbaren Zahlenbereich sprengt).

Marcel2906 18. Aug 2011 11:01

AW: Hexadezimal in Binär
 
vielen dank, ich werde mich mal weiter informieren um es zu optimieren :lol:

Marcel2906 18. Aug 2011 11:49

AW: Hexadezimal in Binär
 
ich hab mich auch mal an Hex to Dez gewagt.
Nun fehlt mir ein Befehl, falls es diesen überhaupt gibt.
Dort wo die Kommentare sind, fehlt mir der Befehl.
Ich wäre sehr dankbar für jeden Tipp

Code:
program HexToDez;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a,b,d: integer;
  h,c,y: string;
begin

repeat

writeln('Bitte Hexadezimalzahl eingeben:');
readln(h);
a:= 1;
// c:= Wert von h an Stelle [a]; <------------------hier
b:=c;

 while a < length(h) do
  begin
   a:=a+1;
 //c:=Wert.Stelle[a]   <-----------und das selbe nochmal hier

    if c='A' then
     begin
      d:=10;
      c:=d;
     end;

    if c='B' then
     begin
      d:=11;
      c:=d;
    end;

    if c='C' then
     begin
      d:=12;
      c:=d;
    end;

    if c='D' then
     begin
      d:=13;
      c:=d;
    end;

    if c='E' then
     begin
      d:=14;
      c:=d;
    end;

    if c='F' then
     begin
      d:=15;
      c:=d;
    end;

 b:=b*16+c
end;
writeln(b);
writeln('');
writeln('Beenden? [y]');
readln(y);
until y='y';
end.

Medium 18. Aug 2011 11:51

AW: Hexadezimal in Binär
 
Du hast es fast schon richtig stehen gehabt :)
"c := h[a];"

DeddyH 18. Aug 2011 12:10

AW: Hexadezimal in Binär
 
Und wenn man c nicht als String, sondern als Char deklariert, lässt sich sogar case verwenden.
Delphi-Quellcode:
var c: char;
...
c := Upcase(h[a]); //vorsichtshalber in Großschreibung wandeln
case c of
  'A': d := 10;
  'B': d := 11;
  //usw.
end;
Es geht natürlich auch noch kürzer und einfacher mit Ord(), aber ich lass das erstmal so stehen.

gammatester 18. Aug 2011 12:31

AW: Hexadezimal in Binär
 
Wenn Du für das erste Zeichen keine Extrabehandlung einbaust, kann man alles in der Schleife machen, d.h. nur einmal die verschachtelte if-Anweisung bzw. case.

Man muß dann nur b vor der Schleife auf 0 setzen.

Marcel2906 18. Aug 2011 13:08

AW: Hexadezimal in Binär
 
ich hab es jetzt mal mit case versucht, aber nun klappt mein code nicht mehr.

Vorher:

Code:
program HexToDez;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a,b,d: integer;
  h,c,y: string;
begin

repeat

writeln('Bitte Hexadezimalzahl eingeben:');
readln(h);
a:= 1;
c:= h[a];

if c='A' then
     begin
      d:=10;
      c:=IntToStr(d);
     end;

    if c='B' then
     begin
      d:=11;
      c:=IntToStr(d);
    end;

    if c='C' then
     begin
      d:=12;
      c:=IntToStr(d);
    end;

    if c='D' then
     begin
      d:=13;
      c:=IntToStr(d);
    end;

    if c='E' then
     begin
      d:=14;
      c:=IntToStr(d);
    end;

    if c='F' then
     begin
      d:=15;
      c:=IntToStr(d);
    end;

    d:=StrToInt(c);
    b:=d;


 while a < length(h) do
  begin

  a:=a+1;
  c:=h[a];

    if c='A' then
     begin
      d:=10;
      c:=IntToStr(d);
     end;

    if c='B' then
     begin
      d:=11;
      c:=IntToStr(d);
    end;

    if c='C' then
     begin
      d:=12;
      c:=IntToStr(d);
    end;

    if c='D' then
     begin
      d:=13;
      c:=IntToStr(d);
    end;

    if c='E' then
     begin
      d:=14;
      c:=IntToStr(d);
    end;

    if c='F' then
     begin
      d:=15;
      c:=IntToStr(d);
    end;

 d:=StrToInt(c);
 b:=b*16+d;

end;
writeln(b);
writeln('');
writeln('Beenden? [y]');
readln(y);
until y='y';
end.
Nachher:

Code:
program HexToDez1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a,b,d: integer;
  h,y: string;
  c:char;
begin

repeat

writeln('Bitte Hexadezimalzahl eingeben:');
readln(h);
a:= 1;
c:= UpCase(h[a]);

case c of
'A': d := 10;
'B': d := 11;
'C': d := 12;
'D': d := 13;
'E': d := 14;
'F': d := 15;


end;

d:=StrToInt(c);
b:=d;


 while a < length(h) do
  begin

  a:=a+1;
  c:=h[a];

case c of
'A': d := 10;
'B': d := 11;
'C': d := 12;
'D': d := 13;
'E': d := 14;
'F': d := 15;
end;

d:=StrToInt(c);
b:=b*16+d;

end;
writeln(b);
writeln('');
writeln('Beenden? [y]');
readln(y);
until y='y';
end.

Habe Case noch nie benutzt :pale:
Was muss ich anders machen??


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:20 Uhr.
Seite 1 von 2  1 2      

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