2016-09-30 9 views
0

Как сказано в заголовке Im, не имея проблем с поиском решения, как проверить, содержит ли строка PW номер или нет. Как я могу проверить TP, если строка PW содержит цифру?Turbo Pascal: проверьте, содержит ли строка цифры

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; 
+0

У вас есть 2 голоса и 3 голоса, чтобы закрыть. Вероятно, это связано с тем, что у вашего q нет четкого описания того, что вы пытаетесь сделать в отношении числовых символов в пароле, а тексты writeln - не на английском языке. Если вы не обновите свой q, чтобы исправить эти вещи, он, скорее всего, получит еще два голоса, чтобы закрыть, а затем никто не сможет опубликовать ответ. – MartynA

+0

Как вы прочли во введении к [** Tour **] (http://stackoverflow.com/tour), SO - это вопрос и ответ. В вашем посте нет вопросов. Вам нужно отредактировать сообщение, чтобы четко указать, какую проблему вы хотите задать, и сформулировать это как вопрос. Правильное форматирование кода облегчает чтение, и если текст в коде важен для понимания вашего вопроса, он должен быть на английском языке. –

+0

@Tom Brunberg редактирует сообщение после ваших предложений, спасибо за информацию. Прошу прощения, если некоторые сообщения не соответствуют стандарту для этого сайта, поскольку я все еще очень незнакома с ним. – Nikolas

ответ

2

Это, как я хотел бы написать код:

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 - это аккуратный и легко поддерживаемый способ выбора одного из нескольких взаимоисключающих путей выполнения на основе порядкового значения.

+0

Большое спасибо за быстрый ответ, я постараюсь сохранить эти советы в виду для остальной части кода. давайте посмотрим, как это происходит: D – Nikolas

+0

также я хотел бы спросить, почему лучше добавить дополнительную константу, а не делать это с помощью «PWIsOk»? – Nikolas

+0

@Nikolas: Ну, в этом случае нет большой разницы, но если у вас было намного более сложная серия проверок (скажем, с более чем одним способом сделать вывод, что PW в порядке), из опыта я думаю, что вы 'd легче отлаживать и проверять с ошибкой, начинающейся с другого значения. – MartynA

Смежные вопросы