2016-09-30 6 views
0

Comme il est dit dans le titre Im ayant du mal à trouver une solution sur la façon de vérifier si une chaîne PW contient un nombre ou non. Comment puis-je vérifier dans TP si la chaîne PW contient un chiffre?Turbo Pascal: vérifier si la chaîne contient des nombres

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

Vous avez 2 votes down et 3 votes à fermer. C'est probablement parce que votre q manque d'une déclaration claire de ce que vous essayez de faire en ce qui concerne les caractères numériques dans le mot de passe et les textes écrits ne sont pas en anglais. Si vous ne mettez pas à jour votre q pour résoudre ces problèmes, il y aura probablement deux votes de plus à fermer et personne ne pourra poster une réponse. – MartynA

+0

Comme vous l'avez lu dans l'introduction de [** Tour **] (http://stackoverflow.com/tour), SO est un site de questions et réponses. Il n'y a pas de question dans votre message. Vous devez modifier votre message pour indiquer clairement quel problème vous souhaitez poser et formuler cette question comme une question. Une bonne mise en forme du code facilite la lecture, et si le texte du code est important pour comprendre votre question, il doit être en anglais. –

+0

@ Tom Brun modifier le post après vos suggestions, merci pour l'info. Je suis désolé si certains articles ne sont pas à la hauteur pour ce site, car je ne le connais pas encore très bien. – Nikolas

Répondre

2

Voici comment j'écrire votre code:

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; 

Ce sont quelques-unes des choses à noter:

  • Ne pas utiliser la même valeur de code d'erreur pour représenter différents types d'erreur. L'utilisation de la même valeur pour différentes erreurs rend plus difficile le débogage de votre code, car vous ne pouvez pas dire quel test a donné Error la valeur 1.

  • Définir des constantes pour représenter les différents types d'erreur. De cette façon, les lecteurs ne pas se demander « Qu'est-ce que 3 moyenne » dans if error = 3 ...

  • Une fois que vous avez détecté un caractère chiffre du mot de passe, il n'y a pas de point après examen des caractères, d'où l'Break dans mon for boucle.

  • Si j'étais un utilisateur je serais ennuyé de ne pas être dit quelles sont les règles jusqu'à ce que le programme me dise que j'ai fait quelque chose de mal. Dites l'utilisation d'avance quelles sont les règles.

  • En fait, il serait préférable d'inclure un Unclassified constant supplémentaire d'une valeur de par exemple, -1, et commencer à chaque itération de la boucle en affectant Error à elle et, dans les étapes suivantes, essai pour Error = Unclassified plutôt que PWIsOk.

  • Une instruction case est un moyen propre et facilement maintenable de sélectionner l'un des nombreux chemins d'exécution mutuellement exclusifs basés sur une valeur ordinale.

+0

merci beaucoup pour la réponse rapide, je vais essayer de garder ces conseils à l'esprit pour le reste du code. laisse voir comment ça se passe: D – Nikolas

+0

aussi je voudrais demander pourquoi il est préférable d'ajouter une constante supplémentaire plutôt que de le faire avec "PWIsOk"? – Nikolas

+0

@Nikolas: Eh bien, dans ce cas, il n'y a pas beaucoup de différence, mais si vous aviez une série de vérifications beaucoup plus compliquées (disons, avec plus d'une façon de conclure que le PW est correct), par expérience, je pense 'd trouver plus facile de déboguer et de vérifier avec une erreur de démarrage avec une valeur différente. – MartynA