1

IDを確認しようとしています。

私はこのクラスManejadorTicketsを呼び出しており、とりわけ、ID を検証するメソッドを呼び出しています (ID は Cedula であり、米国では SSN のようなものです)。

    public void venderTicket ()
    {
        // more code...

        Console.Write("\nCedula: ");
        string cedula = Validador.validarCedula(Console.ReadLine().Trim());

        // more code...
    }

これはクラスでの私のvalidarCedula方法です。Validador

public static String validarCedula (string cedula)
        {
            // Limpiar la entrada de caracteres extraños
            cedula = cedula.Replace("-", "");
            cedula = cedula.Replace(" ", "");

            // Debe tener 11 caracteres
            if (cedula.Length != 11)
            {
                Impresor.imprimirOpExitosa(cedula.Length.ToString());
                Impresor.imprimirError("La cedula debe tener 11 digitos", "Cedula: ");
                validarCedula(Console.ReadLine().Trim());
            }

            // Todos los caracteres deben ser numeros
            char[] arrayLetras = cedula.ToCharArray();
            foreach (char c in arrayLetras)
            {
                if (NUMEROS.IndexOf(c) == -1)
                {
                    Impresor.imprimirError("Todos los caracteres deben ser numericos." +
                                            " Los guiones o espacios no se toman en cuenta.", "Cedula: ");
                    validarCedula(Console.ReadLine().Trim());

                }
            }

            return cedula;
        }

上記の方法は、入力からハイフンとスペースを削除します。また、入力が正確に 11 文字であるかどうか、およびすべての文字が数字であるかどうかもチェックします。

注: NUMBERS は、クラスの最初に宣言した定数です。 private const string NUMEROS = "0123456789";

しかし、プログラムを実行しているときに、Cedula(検証方法をテストするために) "foo" などの間違った値を入力すると、何が起こるべきかが起こります (値をもう一度尋ねます)。これまでのところ、00114905656 (すべての数字と 11 桁) などの正しい値を入力すると、再度値を要求されますが、最後に入力した値が正しいため、これは発生しないはずです。

アプリケーションのデバッグを試みたところ、メソッドが正常に実行されることがわかりましたが、コンパイラがステートメントreturn cedula;(メソッドの最後の文) を実行すると、ステートメント内の最初のステートメントにジャンプし ます。そして、なぜそれが起こるのか理解できません。が実行されると、メソッドは終了するはずです。validarCedula(Console.ReadLine().Trim()); if (cedula.Length != 11)return

4

3 に答える 3

4

あなたは自分自身の中で呼んvalidarCedulaでいます。これは再帰と呼ばれます。

最初からステップスルーしてみてください。コール スタック ウィンドウを見てください。

プログラムを少し再構築する必要があると思います。

validarCedula次のようにさらに実装してみてください。

static bool validarCedula(string cedula) {
   // do your string replace here
   // if it's ok, return true
   // if it's bad, return false.  
   // do not call validarCedula from here!      
}

そして、vendorTicket関数でこれを行うと、合格するまで再プロンプトが表示されます。

string cedula;
bool ok = false;
while (!ok) {
    Console.Write("\nCedula: ");
    cedula = Console.ReadLine().Trim();
    ok = validarCedula(cedula);
}
于 2012-06-15T03:31:02.400 に答える
1

関数を呼び出すというあなたの考えは、まだ手続き型プログラミングのパラダイムと正しく一致していないと思います。

関数を呼び出すとき、まだ「その関数にジャンプする」と考えるかもしれません。ただし、実際には「その関数にジャンプし、終了すると戻ってきます」ということです。ジャンプバックは、プログラムが去った場所に戻る部分です。

于 2012-06-15T03:38:12.113 に答える
0

あなたのvalidarCedulaメソッドは再帰的に呼び出されているため、return cedula;プログラム制御がヒットすると、コールスタックのさらに下の前の呼び出しに戻ります。

于 2012-06-15T03:41:43.893 に答える