Нужна подсказка по исправлению бага с написанным валидатором - Free Pascal

Узнай цену своей работы

Формулировка задачи:

В общем написал приложение, чтобы считало число по формуле. К нему же написал валидатор: он полностью отсеивает все символы, которые могут привести к ошибке. Но есть одно НО: если в строки вводить минусовые дробные значения - валидатор вернет "false". Посмотрите пожалуйста код и скажите - где я допустил ошибку или как исправить этот баг. Вот код приложения:
unit Unit1;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
  ExtCtrls, math, Validator2;
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Image1: TImage;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Image1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;       
var
  Form1: TForm1;
  x, y, z, a, b, c, d, e, koren, sns, q, kk, qwe: double;
  prov1, prov2, prov3: boolean;
  str1, str2, str3: string;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
     str1:=edit1.text;
     str2:=edit2.text;
     str3:=edit3.text;
     trim(str1);
     trim(str2);
     trim(str3);
     prov3:=validnost3(str1, str2, str3);
     if (prov3=false) then
     label1.caption:='Введені символи некоректні. Введіть цифри.'
     else begin
     prov1:=validnost1(str1, str2, str3);
     if (prov1=false) then
     begin
     label1.caption:='Введені символи некоректні. Введіть цифри.';
     exit
     end
     else begin
     x:=StrToFloat(str1);
     y:=StrToFloat(str2);
     z:=StrToFloat(str3);
     a:=abs(5-x);
     prov2:=validnost2(a);
     if(prov2=false) then
     label1.caption:='Знаменник|5-x| дорівнює 0, а ділення на 0 неможливе'
     else begin
     b:=pi*(z+y);
     c:=b/a;
     e:=abs(z);
     qwe:=power(x,e);
     d:=12*qwe;
     kk:=d-c;
     if (kk<0) then
     label1.caption:='Вираз під корнем менше 0, тому продовження обчислення неможливе'
     else begin
     koren:=sqrt(kk);
     sns:=sin(koren);
     q:=3*sns;
     label1.caption:=FloatToStr(q)[1..6];
     end;
     end;
     end;
     end;
     end;
А вот сам валидатор:
unit validator2;
 
{$mode objfpc}{$H+}
 
interface
function Validnost1(var x,y,z: string):boolean;
function validnost2(a: double): boolean;
function Validnost3(var x,y,z: string):boolean;
 
implementation
  function Validnost1(var x,y,z: string):boolean;
  {var a,b,c:byte;
  numb,symb:set of char ;
  begin
  numb:=['0','1','2','3','4','5','6','7','8','9'];
  symb:=[',','-'];
  validnost1 := true;
  if (x='')or(y='')or(z='') then
   begin
    validnost1:=false;
     exit;
      end;
       while (pos('.',x)<>0) do
       x[pos('.',x)]:=',';
   while (pos('.',y)<>0) do
       y[pos('.',y)]:=',';
   while (pos('.',z)<>0) do
       z[pos('.',z)]:=',';
   if (x='-')or(y='-')or(z='-') then
   begin
    validnost1:=false;
     exit;
      end;
end; }
  var a,b,c:byte;
    numb,symb:set of char ;
  begin
   numb:=['0','1','2','3','4','5','6','7','8','9'];
   symb:=[',','-'];
    validnost1:=true;
     b:=1;
     c:=1;
   if (x='')or(y='')or(z='') then
   begin
    validnost1:=false;
     exit;
      end;
   while (pos('.',x)<>0) do
       x[pos('.',x)]:=',';
   while (pos('.',y)<>0) do
       y[pos('.',y)]:=',';
   while (pos('.',z)<>0) do
       z[pos('.',z)]:=',';
       for a:=1 to length(x) do
    begin
      if not(x[a] in numb)and not(x[a] in symb) then
       begin
      validnost1:=false;
      exit;
      end;
      if ((x[a] in symb)and ((b=0)or (c=0))) or ((a<>1) and (x[a]='-'))then
      begin
        validnost1:=false;
        exit;
        end
      else
      begin
      if (x[a]=',') then
       begin
       b:=0;
       end;
       if(x[a]='-') then
           c:=0;
                 end;
        end;
       b:=1;
        c:=1;
   for a:=1 to length(y) do
   begin
     if not(y[a] in numb)and not(y[a] in symb) then
      begin
     validnost1:=false;
     exit;
     end;
     if ((y[a] in symb)and ((b=0)or (c=0))) or ((a<>1) and (y[a]='-'))then
      begin
        validnost1:=false;
        exit;
        end
      else
      begin
      if (y[a]=',')  then
       begin
       b:=0;
       end;
       if(y[a]='-') then
           c:=0;
                 end;
        end;
          b:=1;
          c:=1;
         for a:=1 to length(z) do
    begin
      if not(z[a] in numb)and not(z[a] in symb) then
       begin
      validnost1:=false;
      exit;
      end;
     if ((z[a] in symb)and ((b=0)or (c=0))) or ((a<>1) and (z[a]='-'))then
      begin
        validnost1:=false;
        exit;
        end
      else
      begin
      if (z[a]=',') then
       begin
       b:=0;
       end;
       if(z[a]='-') then
           c:=0;
                 end;
        end;
       end;
function validnost2(a: double): boolean;
begin
    if (a=0) then
    validnost2:=false;
    end;
function Validnost3(var x,y,z: string):boolean;
begin
     if (x='.') or (y='.') or (z='.') then
         validnost3:=false
         else if (x=',') or (y=',') or (z=',') then
              validnost3:=false
              else
                validnost3:=true;
end;
end.

Решение задачи: «Нужна подсказка по исправлению бага с написанным валидатором»

textual
Листинг программы
function IsDouble(const s: String; var t: Double): Boolean;
var e: Word;
begin
  Val(Trim(s),t,e);
  IsDouble := e=0;
end;

Объяснение кода листинга программы

  1. Функция IsDouble принимает два параметра: s (строка) и t (тип Double).
  2. В функции используется переменная e типа Word.
  3. Сначала строка s проходит через функцию Trim, чтобы удалить лишние пробелы.
  4. Затем происходит попытка преобразования строки в число с помощью функции Val.
  5. Если преобразование прошло успешно, то переменная e будет равна 0.
  6. Функция возвращает значение e равное 0, если преобразование прошло успешно, и 1 в противном случае.
  7. Значение e используется для проверки на ноль перед выполнением дальнейших операций.
  8. Если e равно 0, то это означает, что строка была успешно преобразована в число.
  9. Если e не равно 0, то это означает, что строка не может быть преобразована в число.
  10. В этом случае функция возвращает значение false.
  11. Если e равно 0, то это означает, что строка была успешно преобразована в число.
  12. Если e равно 0, то это означает, что строка была успешно преобразована в число.
  13. В этом случае функция возвращает значение true.
  14. Значение t используется для проверки на ноль перед выполнением дальнейших операций.
  15. Если t равно 0, то это означает, что строка не может быть преобразована в число.
  16. В этом случае функция возвращает значение false.
  17. Если t не равно 0, то это означает, что строка была успешно преобразована в число.
  18. В этом случае функция возвращает значение true.
  19. Значение t используется для проверки на ноль перед выполнением дальнейших операций.
  20. Если t равно 0, то это означает, что строка не может быть преобразована в число.
  21. В этом случае функция возвращает значение false.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.583 из 5
Похожие ответы