Турбо Паскаль: проверить, содержит ли строка числа

Как сказано в названии, я не могу найти решение о том, как проверить, является ли строка PW содержит номер или нет. Как я могу проверить в ТП, если строка PW содержит цифру?

repeat
        writeln;
        writeln('Ok, please enter your future password.');
        writeln('Attention: The Text can only be decoded with the same PW');
        readln(PW);
        pwLength:= Length(PW);
        error:=0;
          for i:= 1 to Length(PW) do begin
            if Input[i] in ['0'..'9'] then begin
            error:=1;
            end;
          end;

           if Length(PW)=0 then
           begin
           error:=1;
           end;

            if Length(PW)>25 then
            begin
            error:=1;
            end;

        if error=1 then
        begin
        writeln('ERROR: Your PW has to contain at least 1character, no numbers and has to be under 25characters long.');
        readln;
        clrscr;
        end;

      until error=0;

1 ответ

Решение

Вот как бы я написал ваш код:

var
  PW : String;
  Error : Integer;

const
  PWIsOk = 0;
  PWIsBlank = 1;
  PWTooLong = 2;
  PWContainsDigit = 3;

procedure CheckPassword;
var
  i : Integer;
begin

  writeln;
  writeln('Ok, please enter your future password.');
  writeln('Attention: The Text can only be decoded with the same PW');
  writeln('Your password must be between 1 and 25 characters long and contain no digits.');

  repeat
    error := PWIsOk;
    readln(PW);

    if Length(PW) = 0 then
      Error := PWIsBlank;

    if Error = PWIsOk then begin
      if Length(PW) > 25 then
        Error := PWTooLong;
      if Error = 0 then begin
        for i := 1 to Length(PW) do begin
          if (PW[i] in ['0'..'9']) then begin
            Error := PWContainsDigit;
            Break;
          end;
        end;
      end;
    end;

    case Error of
      PWIsOK : writeln('Password is ok.');
      PWIsBlank : writeln('Password cannot be blank.');
      PWTooLong : writeln('Password is too long.');
      PWContainsDigit : writeln('Password should not contain a digit');
    end; { case}
  until Error = PWIsOk;
  writeln('Done');
end;

Вот некоторые вещи, на которые стоит обратить внимание:

  • Не используйте одно и то же значение кода ошибки для представления разных типов ошибок. Использование одного и того же значения для разных ошибок только затрудняет отладку кода, потому что вы не можете сказать, какой тест дал Error значение 1.

  • Определите константы для представления различных типов ошибок. Таким образом, читатели не должны задаваться вопросом "Что означает 3" в if error = 3 ...

  • После того, как вы обнаружили цифру в пароле, нет смысла проверять символы после него, поэтому Break в моем for петля.

  • Если бы я был пользователем, меня бы раздражало, что мне не скажут, каковы правила, пока программа не скажет мне, что я сделал что-то не так. Скажите заранее, каковы правила использования.

  • На самом деле, было бы лучше включить дополнительную константу Unclassified со значением, скажем, -1, и начать каждую итерацию цикла, назначив Error к нему и, на последующих этапах, проверить Error = Unclassified скорее, чем PWIsOk,

  • case оператор - это аккуратный и легко поддерживаемый способ выбора одного из нескольких взаимоисключающих путей выполнения на основе порядкового значения.

Другие вопросы по тегам