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/)
-   -   Delphi Hex to Bin -> Falsche eingabe (https://www.delphipraxis.net/162364-hex-bin-falsche-eingabe.html)

Marcel2906 19. Aug 2011 06:39


Hex to Bin -> Falsche eingabe
 
Hey Leute,

ich habe ein Programm geschrieben, dass Hexadezimalzahlen in Dezimalzahlen umrechnet.
Aber ein wichtiges Element bekomme ich nicht hin.
Und zwar bräuchte ich ein Art Befehl, der sagt.

Code:
If c = g bis z then
writeln('Fehler')
beginne von vorne.
gibt es so etwas?

Hier mein Code:

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:= Upcase(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:=upcase(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.

chaosben 19. Aug 2011 06:44

AW: Code erweitern
 
Welcher Teil ist denn das Problem?
Die Bedingung fürs IF? Oder das "beginn von vorne"?

haentschman 19. Aug 2011 06:52

AW: Code erweitern
 
Moin...
nur im Fehlerfalle "beginne von vorne" oder grundsätzlich. In diesem Falle wie oft ?

Marcel2906 19. Aug 2011 06:54

AW: Code erweitern
 
Also beginne von vorne hab ich keine Idee zu, das andere würde ich so versuchen:

Code:
if c=g..z then
begin
writeln('Fehler')
//beginne von vorne
end;
Nur in diesem Fehlerfall soll er von vorne beginnen, so dass man wieder eine neue Zahl eingeben kann.

KrasserChecker 19. Aug 2011 07:04

AW: Code erweitern
 
Meinst Du sowas hier:
Delphi-Quellcode:
repeat
  writeln('Bitte Hexadezimalzahl eingeben:');
  readln(h);
  a:= 1;
  c:= Upcase(h[a]);
  if not (c in ['0'..'9','A'..'F']) then
    writeln('Fehler');
until c in ['0'..'9','A'..'F'];

Marcel2906 19. Aug 2011 07:12

AW: Code erweitern
 
dann bekomm ich die fehlermedlung:

Zitat:

[DCC Fehler] HexToDez.dpr(20): E2010 Inkompatible Typen: 'string' und 'AnsiChar'
kann ich zu einem repeat auch mehrere untils machen??
Da ich ja schon ein repeat und until in meinem code habe und du noch ein until hinzugefügt hast...

ensaron 19. Aug 2011 08:05

AW: Code erweitern
 
Delphi-Quellcode:
repeat
  EingabeEinlesenUndPruefen;
  writeln('Beenden? [y]');
  readln(y);
until y='y';
Delphi-Quellcode:
procedure EingabeEinlesenUndPruefen;
var
  erfolgreich: Boolean;
  eingabe: string;
  i: Integer;
begin
  erfolgreich := True;
  repeat
    writeln('Bitte Hexadezimalzahl eingeben:');
    readln(eingabe);
    for i := 1 to Length(eingabe) do
    begin
      if not (AnsiChar(eingabe[i]) in ['0'..'9','A'..'F','a'..'f']) then
      begin
        Writeln('Fehlerhafte Eingabe!');
        erfolgreich := False;
        Break;
      end;
    end;
  until erfolgreich;
  WandleHexInDez(eingabe);
end;
Versuch es mal so. Musst nur noch die eigentliche Umwandlung und Ausgabe in eine procedure "WandleHexInDez" packen.

Zitat:

kann ich zu einem repeat auch mehrere untils machen??
Nein.

gammatester 19. Aug 2011 08:13

AW: Code erweitern
 
Deine
Delphi-Quellcode:
erfolgreich
-Logik ist falsch; es sei denn, Du betrachtest aus unerfindlichen Gründen einen Leerstring als gültige Hexzahl.

Marcel2906 19. Aug 2011 08:36

AW: Code erweitern
 
Ich hab es jetzt mal Versucht, aber ich habe vorher noch nie mit 'procedure' gearbeitet, deswegen klappt es auch wahrscheinlich nicht. Hier mein Code:

Code:
program HexToDez;

{$APPTYPE CONSOLE}

uses
  SysUtils;

type

procedure EingabeEinlesenUndPruefen(Sender: HexToDez)
procedure WandleHexInDez(Sender: HexToDez);

var
y: string;

begin
 repeat
  EingabeEinlesenUndPruefen;
  writeln('Beenden? [y]');
  readln(y);
 until y='y';
end;

procedure EingabeEinlesenUndPruefen;
 var
  erfolgreich: Boolean;
  eingabe: string;
  i: Integer;

begin
erfolgreich := True;
 repeat
  writeln('Bitte Hexadezimalzahl eingeben:');
  readln(eingabe);
   for i := 1 to Length(eingabe) do
    begin
     if not (AnsiChar(eingabe[i]) in ['0'..'9','A'..'F','a'..'f']) then
      begin
       Writeln('Fehlerhafte Eingabe!');
       erfolgreich := False;
       Break;
      end;
     end;
 until erfolgreich;
WandleHexInDez(eingabe);
end;

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

begin
 writeln('Bitte Hexadezimalzahl eingeben:');
 readln(h);
 a:= 1;
 c:= Upcase(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:=upcase(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('');
writeln('Zahl im Dezimalsystem:');
writeln(b);
writeln('');
end;
end.

ensaron 19. Aug 2011 08:44

AW: Code erweitern
 
Ok den Fall einer leeren Eingabe sollte man natürlich noch behandeln.
Und die Initialisierung von "erfolgreich" gehört natürlich in die Schleife, sonst wird nach einer falschen Eingabe keine andere Eingabe mehr als richtig betrachtet.

Delphi-Quellcode:
..
repeat
  erfolgreich := True;
  writeln('Bitte Hexadezimalzahl eingeben:');
  readln(eingabe);
  if not length(eingabe) >= 1 then
    erfolgreich := False;
..


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:26 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