![]() |
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:
gibt es so etwas?
If c = g bis z then
writeln('Fehler') beginne von vorne. 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. |
AW: Code erweitern
Welcher Teil ist denn das Problem?
Die Bedingung fürs IF? Oder das "beginn von vorne"? |
AW: Code erweitern
Moin...
nur im Fehlerfalle "beginne von vorne" oder grundsätzlich. In diesem Falle wie oft ? |
AW: Code erweitern
Also beginne von vorne hab ich keine Idee zu, das andere würde ich so versuchen:
Code:
Nur in diesem Fehlerfall soll er von vorne beginnen, so dass man wieder eine neue Zahl eingeben kann.
if c=g..z then
begin writeln('Fehler') //beginne von vorne end; |
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']; |
AW: Code erweitern
dann bekomm ich die fehlermedlung:
Zitat:
Da ich ja schon ein repeat und until in meinem code habe und du noch ein until hinzugefügt hast... |
AW: Code erweitern
Delphi-Quellcode:
repeat
EingabeEinlesenUndPruefen; writeln('Beenden? [y]'); readln(y); until y='y';
Delphi-Quellcode:
Versuch es mal so. Musst nur noch die eigentliche Umwandlung und Ausgabe in eine procedure "WandleHexInDez" packen.
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; Zitat:
|
AW: Code erweitern
Deine
Delphi-Quellcode:
-Logik ist falsch; es sei denn, Du betrachtest aus unerfindlichen Gründen einen Leerstring als gültige Hexzahl.
erfolgreich
|
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. |
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 08:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz