Как не принимать спецсимволы в строке на Delphi 10.3 - PullRequest
0 голосов
/ 08 мая 2020

Я пытаюсь написать программу для школьного задания. Предполагается, что он принимает имена как string s, а ввод зарплаты как integer, и сообщает вам, неразборчивы ли вы или можете ли участвовать в партийных секциях, и повторяется до stop=9.

Все прошло хорошо, но проблема в том, что переменные string принимают ошибочные имена в качестве входных данных и продолжают. Например, 'John32@#$^^'.

Я хочу, чтобы программа не принимала эти входные данные и написала строку, в которой говорилось, что она не будет продолжать с любым именем с чем-либо, кроме символов. Это также не должно добавлять число к остановке. Исходный код ниже.

program Sba;

Uses
  Windows;

var
  FName,LName:String;
  Stop,Salary:Integer;

//procedure Sleep(milliseconds: Cardinal); stdcall; external 'kernel32.dll'; //Added sleep as a procedure for delay

Begin
  Repeat //Repeats until stop = 9
    Writeln('Hi User,please Enter your First Name'); //Prompting user to enter their First initials
    Readln(FName); //Attaches the string entered to the variable FName
    Sleep(1000);//Delay 1second
    Writeln('First Name entered');  //Lets the user know they have entered their first initials
    Sleep(1000);
    Writeln('Please Enter your Last name'); //Prompting user to enter their last initial
    Readln(LName);  //Attaches the string entered to the variable LName
    Sleep(1000);
    Writeln('Last Name entered'); //Lets the user know they have entered their last initials
    Sleep(800);
    Writeln('Hi ',' ',FName,' ',LName); //Writes Line Hi (First Name) (Last Name)
    Sleep(1000);
    Writeln('Please enter The amount you have paid');//Prompts user for their payment
    Readln(Salary); //Atttached value entered to Salary
    Writeln('Reading your payment will be done in four seconds');
    Sleep(4000);//delay 4 seconds
    Writeln('Done!');
    If (Salary<1000) Then
    Begin
      Writeln('You do not have sufficient funds to play in a section');
    Sleep(1000);
    End;
    Sleep(1000);
    If (Salary>=1000) AND (Salary<=2000) then //Testing conditions
    Begin
      Sleep(1000);
      Writeln('Congrats, You are eligible to play in the Tribe Section'); //Tells use what section they are available to play in
    End;
    If (Salary>=2100) AND (Salary<=3000) then //Testing conditions
    Begin
      Sleep(1000);
      Writeln('Congrats, You are eligible to play in the Poison Section');
    End;
    If (Salary>=3100) AND (Salary<=5000) then //Testing conditions
    Begin
      Sleep(1000);
      Writeln('Congrats, You are eligible to play in the Harts Section');
    End;
    Writeln('Press enter to continue');
    Readln;
    Writeln('Enjoy your day ' , FName,'!');
    Stop:=Stop+1; //Repeats until stop= 9
    Sleep(1000);
  Until Stop=9;//Repeats this 10 times
  Writeln('Written By Timothy Adams 4-1');
  Readln;
end.

1 Ответ

2 голосов
/ 08 мая 2020

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

Во-первых, мы должны решить, как выглядит допустимое имя. Потому что, если мы не знаем точно, какие имена следует считать действительными, мы, конечно же, не сможем запрограммировать компьютер, чтобы различать разницу!

В качестве игрушечного примера допустим, что имя действительно iff :

  1. Он содержит только буквы, пробелы и символ ДЕФИС-МИНУС (-). [Обратите внимание, что все в строке является символом. Примерами классов символов являются буквы, цифры, пробелы и знаки препинания. Поэтому, когда вы говорите, что строка должна содержать только «символы», вы имеете в виду что-то другое, например «только буквы».]

  2. Она содержит как минимум две буквы.

Этого явно недостаточно для реального приложения. Это не позволит использовать многие допустимые имена. Но для этого примера с игрушкой этого вполне достаточно.

Давайте реализуем это!

function IsValidName(const S: string): Boolean;
var
  i, c: Integer;
begin

  // The string must only contain letters, whitespace, and HYPHEN-MINUS

  for i := 1 to S.Length do
    if not (S[i].IsLetter or S[i].IsWhiteSpace or (S[i] = '-')) then
      Exit(False);

  // The string must contain at least two letters

  c := 0;
  for i := 1 to S.Length do
    if S[i].IsLetter then
      Inc(c);

  if c < 2 then
    Exit(False);

  Result := True;

end;

Изучите эту функцию, пока полностью не поймете, как она работает!

Готово? Большой! Теперь давайте воспользуемся этим:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Character;

var
  Name: string;

function IsValidName(const S: string): Boolean;
begin
  // same as above, won't repeat it here
end;

begin
  try
    try

      Writeln('Hello! What is your name?');

      while True do
      begin
        Readln(Name);
        Name := Name.Trim;
        if IsValidName(Name) then
        begin
          Writeln('Welcome, ', Name, '!');
          Break;
        end
        else
          Writeln('Surely that isn''t your real name? What is your actual name?');
      end;

    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    Writeln('Program about to end. Press Return to exit.');
    Readln;
  end;
end.

Опять же, поскольку я почти нарушаю правила, делая за вас домашнее задание, я не буду подробно объяснять logi c. Вместо этого я дам вам понять, как это работает. Так вы узнаете гораздо больше.

Обновление: Полная программа должна выглядеть так:

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  System.SysUtils,
  Character;

var
  Name: string;

function IsValidName(const S: string): Boolean;
var
  i, c: Integer;
begin

  // The string must only contain letters, whitespace, and HYPHEN-MINUS

  for i := 1 to S.Length do
    if not (S[i].IsLetter or S[i].IsWhiteSpace or (S[i] = '-')) then
      Exit(False);

  // The string must contain at least two letters

  c := 0;
  for i := 1 to S.Length do
    if S[i].IsLetter then
      Inc(c);

  if c < 2 then
    Exit(False);

  Result := True;

end;

begin
  try
    try

      Writeln('Hello! What is your name?');

      while True do
      begin
        Readln(Name);
        Name := Name.Trim;
        if IsValidName(Name) then
        begin
          Writeln('Welcome, ', Name, '!');
          Break;
        end
        else
          Writeln('Surely that isn''t your real name? What is your actual name?');
      end;

    except
      on E: Exception do
        Writeln(E.ClassName, ': ', E.Message);
    end;
  finally
    Writeln('Program about to end. Press Return to exit.');
    Readln;
  end;
end.
...