Delphi-PRAXiS

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??

DeddyH 18. Aug 2011 13:11

AW: Hexadezimal in Binär
 
Delphi-Quellcode:
case c of
  'A', 'a': d := 10;
  'B', 'b': d := 11;
  'C', 'c': d := 12;
  'D', 'd': d := 13;
  'E'; 'e': d := 14;
  'F', 'f': d := 15;
  '0'..'9': d:=StrToInt(c);
  else
    //Fehler: ungültiges Zeichen, irgendwie behandeln
end;

Marcel2906 18. Aug 2011 13:25

AW: Hexadezimal in Binär
 
aber fehlt nicht dieser ausdruck noch bei jedem fall von c:

Code:
c:=IntToStr(d);
nur leider geht das nicht

DeddyH 18. Aug 2011 13:31

AW: Hexadezimal in Binär
 
Wieso willst Du aus der Zahl nun wieder einen String machen? Das brauchst Du doch erst ganz am Schluss, wenn Du das Ergebnis in binärer Schreibweise wieder ausgeben willst. Aber wir können uns das auch einfacher machen, ich weiß nur nicht, ob das Deinem Lehrer/Ausbilder gefällt.
Delphi-Quellcode:
var
  Zahl: integer; //oder Cardinal oder oder...
begin
  ...
  if TryStrToInt('$' + h, Zahl) then
    writeln(IntToBin(Zahl));

Marcel2906 18. Aug 2011 13:32

AW: Hexadezimal in Binär
 
sry, ich bin nicht mehr bei dem binär, sondern hex in dezimal...
hatte gedacht ich mach nicht extra ein neues Thema auf

DeddyH 18. Aug 2011 13:37

AW: Hexadezimal in Binär
 
Wie gezeigt ginge es auch, ein $ dem String voranzustellen und das an (Try)StrToInt zu übergeben, aber das soll ja wahrscheinlich nicht der Zweck der Übung sein. Dann also zu Fuß:
- String von hinten nach vorn durchgehen
- Multiplikator initial auf 1 setzen
- Ergebnis initial auf 0
- Zeichen in Zahl wandeln (case-Verzweigung wie gezeigt)
- ermittelte Zahl mit Multiplikator multiplizieren und zum Ergebnis addieren
- Multiplikator mit 16 miltiplizieren

Wenn ich nichts vergessen habe, sollte es so funktionieren.

TBx 18. Aug 2011 14:14

AW: Hexadezimal in Binär
 
Zitat:

Zitat von Marcel2906 (Beitrag 1117851)
sry, ich bin nicht mehr bei dem binär, sondern hex in dezimal...
hatte gedacht ich mach nicht extra ein neues Thema auf

doch, genau das solltest Du.

Von daher

*** Closed ***


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:09 Uhr.

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