2016-05-27 13 views
0
Function GetPlayersName: String; 
Var 
    PlayerName: String; 
    i: Integer; 
Begin 
    Write('What is your name? '); 
    Readln(PlayerName); 

    for i := 1 to length(PlayerName) do 
    begin 
    PlayerName[i] := Upcase(PlayerName[i]); 
    if not(PlayerName[i] in ['A' .. 'Z']) AND (PlayerName[i] <> ' ') then 
    begin 
     writeln('Letters and spaces please'); 
    end; 
    end 
else 
    GetPlayersName := PlayerName; 
end; 

何らかの理由で、上記の検証中にelseステートメントがコンパイルされません。文字と文字列のDelphiのバリデーション

[DCC32エラー] AQA_Reverse.dpr(125):ここで、エラー・メッセージであるE2029 'END' が期待しかし 'ELSE'

だけでなく、このように見出され、メッセージが印刷されるとき、それは文字の数で印刷され、私はそれをどのように変更するのか分からない。

+0

'end'をセミコロンなしで2行下に移動してください。ソースをフォーマットしなければなりません。そのようなエラーが表示されます – MBo

+0

http://stackoverflow.com/a/28221465/62576 –

答えて

1

あなたはPythonとDelphiを混同しているようです。 Pythonのforループにはelse句がある可能性があります。これは、ループを早期に終了しないと実行されます。 Delphiにはその機能はありません。

追加の変数とロジックを使用してその動作をエミュレートする方法がありますが、それはあなたが実際に必要とするものではないと思います。

26種類の文字とスペースを検出しようとすると、文字列の内容の検証は問題になりません。 (26文字以上ありますが、あなたはそのことに興味がないと思っています)。あなたのコードは、非文字、非空白の文字を正しく検出してレポートします。

エラーが検出されたときに関数がどのように機能するかを再考する必要があります。今のところ、この関数はエラーメッセージ(の場合はすべての文字が無効です)を出力しますが、戻り値はどうなりますか?その場合は結果を割り当てません。おそらく、ユーザーが有効な値を入力するまで関数の名前を再入力するつもりです。それがあなたが望むなら、もちろんループ内にReadLnへの呼び出しを含める必要があります。あなたの現在のコードは明らかに入力を1回だけ読み込みます。

2

elseにはifステートメントが関連付けられていないため、エラーメッセージが表示されます。そして、あなたは容認できないキャラクターに遭遇したときにループを破ることはありません。

あなたの機能全体を書き直す必要があります。

Function GetPlayersName: String; 
Var 
    PlayerName: String; 
    i: Integer; 
Begin 
    Repeat 
    Write('What is your name? '); 
    Readln(PlayerName); 
    PlayerName := Trim(PlayerName); 

    for i := 1 to Length(PlayerName) do 
    begin 
     if not (PlayerName[i] in ['A' .. 'Z', 'a'..'z', ' ']) then 
     begin 
     Writeln('Letters and spaces please'); 
     PlayerName := ''; 
     Break; 
     end; 
    end; 
    Until PlayerName <> ''; 
    GetPlayersName := PlayerName; 
end; 
関連する問題