Нужна подсказка по исправлению бага с написанным валидатором - 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;
Объяснение кода листинга программы
- Функция
IsDouble
принимает два параметра:s
(строка) иt
(тип Double). - В функции используется переменная
e
типа Word. - Сначала строка
s
проходит через функциюTrim
, чтобы удалить лишние пробелы. - Затем происходит попытка преобразования строки в число с помощью функции
Val
. - Если преобразование прошло успешно, то переменная
e
будет равна 0. - Функция возвращает значение
e
равное 0, если преобразование прошло успешно, и 1 в противном случае. - Значение
e
используется для проверки на ноль перед выполнением дальнейших операций. - Если
e
равно 0, то это означает, что строка была успешно преобразована в число. - Если
e
не равно 0, то это означает, что строка не может быть преобразована в число. - В этом случае функция возвращает значение
false
. - Если
e
равно 0, то это означает, что строка была успешно преобразована в число. - Если
e
равно 0, то это означает, что строка была успешно преобразована в число. - В этом случае функция возвращает значение
true
. - Значение
t
используется для проверки на ноль перед выполнением дальнейших операций. - Если
t
равно 0, то это означает, что строка не может быть преобразована в число. - В этом случае функция возвращает значение
false
. - Если
t
не равно 0, то это означает, что строка была успешно преобразована в число. - В этом случае функция возвращает значение
true
. - Значение
t
используется для проверки на ноль перед выполнением дальнейших операций. - Если
t
равно 0, то это означает, что строка не может быть преобразована в число. - В этом случае функция возвращает значение
false
.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д