Проверка номера TPIN в Java, C ++ или C # - PullRequest
5 голосов
/ 03 мая 2011

У меня небольшое требование для проверки TPIN в моем проекте колледжа. Требование состоит в том, что мы не должны позволять пользователю устанавливать свой TPIN в следующих сценариях.

  1. TPIN не должен быть в последовательности.(восходящий или нисходящий, например: 123456, 456789, 987654 или 654321)
  2. TPIN не должен начинаться с нуля (например: 0127865, 098764)
  3. TPIN не должен быть повторяющейся цифрой (например: 888888, 222222 и т. Д.)

Для третьего я хочу разделить число на 11 и проверить наличие напоминания ..

Любые идеи, плз ..

public class Validate
{
   public static void main(String[] args)
   {
        int iTpin = Integer.parseInt(args[0]); // Converted string to int
        System.out.println("The entered TPIN is:"+iTpin);
        boolean flag = validate(iTpin);
        if (flag== true)
            System.out.println("The entered TPIN is valid");
        else 
            System.out.println("The entered TPIN is Invalid");
    }

    public static boolean validate(int passedTpin)
    {
        if (passedTpin == 0)
            return false;
        else if ( passedTpin%11 == 0)
            return false;
        else
            return true;
    }
}

Окончательно создан код для последовательности цифр.Это может быть полезно для других

private static boolean containsRepetitiveDigits(String tpin) {
    char firstChar = tpin.charAt(0);
    for (int i = 1; i < tpin.length(); i++) {
        char nextChar = tpin.charAt(i);
        if ((Character.valueOf(nextChar)).compareTo(Character
                .valueOf(firstChar)) != 0) {
            return false;
        }
    }
    System.out.println("Error:TPIN contains repetitive digits");
    return true;
}

Ответы [ 2 ]

6 голосов
/ 03 мая 2011

Для начала, использование Int32 для сохранения числа означает, что оно не должно превышать 2,147,483,647 .И кроме этого, вы не сможете проверить начальный ноль после преобразования в число, поскольку начальные нули, очевидно, исчезают, когда вы получаете число.

Это означает, чтовы должны сохранить ввод как string во время проверки.Это на самом деле облегчает вашу работу, поскольку вы можете индексировать отдельные символы без необходимости использования арифметических операций.

Поскольку вы работаете со строками, вам также следует проверить, содержит ли входная строка недопустимые (не цифры)символы перед чем-либо еще:

bool ContainsInvalidCharacters(string input)
{
    // check if there is a non-digit character
    foreach (char c in input)
        if (!char.IsDigit(c))
            return true;

    return false;
}

Затем вы можете продолжить добавление отдельных правил.Например, чтобы проверить, повторяются ли символы, вы сделаете что-то вроде:

bool ContainsRepetitiveDigits(string input)
{
    if (input.Length == 0)
        return false;

    // get the first character
    char firstChar = input[0];

    // check if there is a different character
    foreach (char c in input)
        if (c != firstChar)
            return false;

    // if not, it means it's repetitive
    return true;
}

bool StartsWithZero(string input)
{
    if (input.Length == 0)
        return false;

    return (input[0] == '0');
}

Чтобы обнаружить последовательности, самый простой способ - получить разницу первых двух символов, а затем проверить, изменяется ли она черезвся строка:

bool IsSequence(string input)
{
    // we need at least two characters
    // for a sequence
    if (input.Length < 2)
        return false;

    // get the "delta" between first two
    // characters
    int difference = input[1] - input[0];

    // allowed differences are:
    //   -1: descending sequence
    //    0: repetitive digits
    //    1: ascending sequence
    if (difference < -1 || difference > 1)
        return false;

    // check if all characters are equally
    // distributed
    for (int i = 2; i < input.Length; i++)
        if (input[i] - input[i - 1] != difference)
            return false;

    // this is a sequence
    return true;
}

Как только вы определили все свои правила, вы можете создать один метод, который будет проверять их один за другим:

bool Validate(string input)
{
    // list of all predicates to check
    IEnumerable<Predicate<string>> rules = new Predicate<string>[]
    {
        ContainsInvalidCharacters,
        ContainsRepetitiveDigits,
        StartsWithZero,
        IsSequence
    };

    // check if any rule matches
    foreach (Predicate<string> check in rules)
        if (check(input))
            return false;

    // if no match, it means input is valid
    return true;
}

Обратите внимание, что IsSequence обнаруживает также повторяющиеся цифры (когда разница символов равна нулю).Если вы хотите явно предотвратить это, измените условие, где проверяются разрешенные различия.Кроме того, вы можете полностью удалить правило ContainsRepetitiveDigits.

[Редактировать]

Поскольку я вижу, что вы используете Java вместо C #, я попытаюсь привести лучший пример.

Отказ от ответственности: Я обычно не программирую на Java, но насколько я знаю, Java не поддерживает делегатов, как в C #.Поэтому я постараюсь предоставить пример Java (надеюсь, он будет работать), который лучше выражает мое намерение «составной проверки».

(следует подозрительный код Java)

Сначала определите интерфейс, который будут реализованы во всех правилах проверки:

// (java code)
/**
 * Defines a validation rule.
 */
public interface IValidationRule
{
    /**
     * Returns a description of this
     * validation rule.
     */
    String getDescription();

    /**
     * Returns true if this rule
     * is matched.
     */
    boolean matches(String tpin);
}

Затем определите каждое правило в отдельном классе, реализуя методы getDescription и matches:

// (java code)
public class RepetitiveDigitsRule implements IValidationRule
{
    public String getDescription()
    {
        return "TPIN contains repetitive digits";
    }

    public boolean matches(String tpin)
    {
        char firstChar = tpin.charAt(0);
        for (int i = 1; i < tpin.length(); i++)
            if (tpin.charAt(i) != firstChar)
                return false;
        return true;
    }
}

public class StartsWithZeroRule implements IValidationRule
{
    public String getDescription()
    {
        return "TPIN starts with zero";
    }

    public boolean matches(String tpin)
    {
        if (tpin.length() < 1)
            return false;

        return tpin.charAt(0) == '0';
    }
}

Вы можете видеть, что matches метод не выводит что-либо на консоль.Он просто возвращает true, если правило соответствует, и оставляет его вызывающей стороне , чтобы решить, печатать ли его описание (в консоль, окно сообщения, веб-страницу и т. Д.).

НаконецВы можете создать все известные правила (реализации IValidationRule) и проверить их одно за другим:

// (java code)
public class Validator
{
    // instantiate all known rules
    IValidationRule[] rules = new IValidationRule[] {
        new RepetitiveDigitsRule(),
        new StartsWithZeroRule()
    };

    // validate tpin using all known rules
    public boolean validate(String tpin)
    {
        System.out.print("Validating TPIN " + tpin + "... ");

        // for all known rules
        for (int i = 0; i < rules.length; i++)
        {
            IValidationRule rule = rules[i];

            // if rule is matched?
            if (rule.matches(tpin))
            {
                // print rule description
                System.out.println("Error: " + rule.getDescription());
                return false;
            }
        }
        System.out.println("Success.");
        return true;
    }
}

Я рекомендую попытаться следовать этому шаблону.Вы получите код, который будет намного проще использовать и поддерживать.

2 голосов
/ 03 мая 2011

Вы можете сгенерировать последовательный tpin (восходящий и нисходящий) на основе первой цифры, а затем сравнить ее с введенным tpin.Если он совпадает, то он недействителен.

public static bool IsSequential(string pin, bool descending)
{
    int p = Convert.ToInt32(pin.Substring(0,1));
    string tpin = string.Empty;

    for (int i = 0; i < 6; i++)
    {
        tpin += descending ? (p--).ToString() : (p++).ToString();
    }
    return pin.Equals(tpin);          
}

Для элемента 3 нельзя просто разделить на 11, потому что у некоторого вывода будет остаток 0. (т. Е. 221199 является допустимым, но остаток равен 0).Вы можете получить первую цифру и использовать цикл для сравнения с остальными цифрами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...