Застрял на oop при попытке проверить символы из текстового файла - PullRequest
0 голосов
/ 28 марта 2020

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

Условия: - иметь ровно 4 цифры, - иметь ровно 8 символов, - иметь как минимум одну заглавную букву и как минимум одну строчную букву

Программа читает файл и выводит число действительные пароли.

Это формат текстового файла: "eR68G12a 91jY643ebjp eRty74kLh 24fG92 aj85gt32 dGb9357jKoup2" (в одну строку)

Код: ´´´

Program Ej23_version3;

var 
char1,char2:char;
mayus,minus:boolean; // mayus and minus would be uppercase and lowercase respectively
cantDigitos,cantCaracteres,contrasenasValidas:integer;
datos:text;

Begin 
assign(datos,'Datos_guia3_ej23.txt'); reset(datos);
contrasenasValidas := 0;

char1 := ' ';

Read(datos,char2);
while not eof(datos) do 
Begin 
    mayus := false; minus := false; cantDigitos := 0; cantCaracteres := 0;
    if (char1 = ' ') and (char2 <> ' ') then //check if its the beggining of the word
    Begin 
        while not eof(datos) and (char2 <> ' ') do 
        Begin 
            cantCaracteres := cantCaracteres + 1;
            if char2 = UPCASE(char2) then  // if the character2 is equal to the uppercase version of the character2, character2 is uppercase
                mayus := true
            else
                if (char2 in ['0'..'9']) then
                cantDigitos := cantDigitos + 1
                else
                    minus := true;
        if eof(datos) then // when it reaches the end of the file, it also reads and checks the last character
            if char2 = UPCASE(char2) then 
                mayus := true
            else
                if (char2 in ['0'..'9']) then
                cantDigitos := cantDigitos + 1
                else
                    minus := true;
        End;

        if minus and mayus and (cantDigitos = 4) and (cantCaracteres = 8) then //if all conditions are met, the password is valid and its added to the counter
            contrasenasValidas := contrasenasValidas + 1;

        char1 := char2; Read(datos, char2); //char2 should be an empty character by this point, so it passes that value to char1 and reads the next character
    End
End;

WriteLn(contrasenasValidas);
End.

Но когда я запускаю его, он просто застревает там только с галочкой

1 Ответ

1 голос
/ 23 апреля 2020

Проблема в том, как вы читаете файл (символ за символом).

Было бы лучше прочитать все сразу и проверить все последовательности из восьми символов один за другим.

uses
  SysUtils;

var
  LFile: TextFile;
  LStr, LSubStr: string;
  LStartIndex: integer;
  LExit: boolean;

begin
  AssignFile(LFile, 'Datos_guia3_ej23.txt');
  Reset(LFile);
  ReadLn(LFile, LStr); // Get the whole line

  LStartIndex := 1; // Search all 8 characters sequences, starting from the first character
  LExit := FALSE;
  repeat
    LSubStr := Copy(LStr, LStartIndex, 8);
    if Length(LSubStr) = 8 then
    begin
      // Here check other conditions
      // ...

      Inc(LStartIndex);
    end else
      LExit := TRUE;
  until LExit;

  CloseFile(LFile);
end.
...