📄 u_point24.pas
字号:
if (MulPos=0) then //如果没有*号
MulPos:=200; //将MulPos设置成一个不可能的值
if (DivPos=0) then //如果没有/号
DivPos:=200; //将DivPos设置成一个不可能的值
Operator:='-';
tempPos:=SubPos;
if(tempPos>PluPos) then
begin
tempPos:=PluPos;
Operator:='+';
end;
if(tempPos>MulPos) then
begin
tempPos:=MulPos;
Operator:='*';
end;
if(tempPos>DivPos) then
begin
//tempPos:=DivPos;
Operator:='/';
end;
Result:=Operator; //结束函数,返回位置
end;
//此计算用于计算不带()号的加、减、乘、除运算
function TFrm_Point.SubCompute(Str: String): integer;
var
Middle:String;
Mul2:String;
Right:String;
First:integer;
tempStr:String;
temp:integer;
Left:String;
Mul1:String;
MulPos:Integer;
DivPos:Integer;
Fuhao:Char;
begin
Middle:='';
Mul2:='';
Right:='';
//定位第一个^号位置 ,计算乘方
First:=Pos('^',Str);
while (First<>0) do//循环计算乘方
begin
tempStr:=Copy(Str,1,First-1);
temp:=AnyLastPos(tempStr);
Left:=Copy(Str,1,temp);
Mul1:=Copy(str,temp+1,First-temp-1);
tempStr:=Copy(str,First+1,Length(str)-First);
temp:=AnyFirstPos(tempStr);
if(temp=200) then
begin
Mul2:=tempStr;
Right:='';
end
else
begin
Mul2 :=Copy(tempStr,1,temp-1);
Right:=Copy(tempStr,temp,Length(tempStr)-temp+1);
end;
Middle:=FloatToStr(IntPower(StrToInt(Mul1),StrToInt(Mul2)));
Str:=Left+Middle+Right;
First:=Pos('^',Str);
end;
//定位第一个*号或/号的位置
MulPos:=Pos('*',Str);
DivPos:=Pos('/',Str);
First:=MulPos;
if (MulPos>DivPos) then
First:=DivPos;
if ((DivPos=0) and (MulPos<>0)) then
begin
First:=MulPos;
DivPos:=2000; // 将除号所在位置设置成一个大于MulPos但又不可能的值
end;
if ((DivPos<>0) and (MulPos=0)) then
begin
First:=DivPos; // 将乘号所在位置设置成一个大于DivPos但不可能的值
MulPos:=2000;
end;
while(First<>0) do//循环计算乘、除
begin
tempStr:=Copy(Str,1,First-1);
temp:=AnyLastPos(tempStr);
Left:=Copy(Str,1,temp);
Mul1:=Copy(Str,temp+1,First-temp-1);
tempStr:=Copy(Str,First+1,Length(Str)-First);
temp:=AnyFirstPos(tempStr);
if(temp=200) then
begin
Mul2:=tempStr;
Right:='';
end
else
begin
Mul2 :=Copy(tempstr,1,temp-1);
Right:=Copy(tempStr,temp,Length(tempStr)-temp+1);
end;
if(MulPos>DivPos) then
Middle:=IntToStr(StrToInt(Mul1) div StrToInt(Mul2))
else
Middle:=IntToStr(StrToInt(Mul1)*StrToInt(Mul2));
Str:=Left+Middle+Right;
MulPos:=Pos('*',Str);
DivPos:=Pos('/',Str);
First:=MulPos;
if (MulPos>DivPos) then
First:=DivPos;
if((DivPos=0) and (MulPos<>0)) then
begin
First:=MulPos;
DivPos:=2000; // 将除号所在位置设置成一个大于MulPos但又不可能的值
end;
if((DivPos<>0) and (MulPos=0)) then
begin
First:=DivPos; // 将乘号所在位置设置成一个大于DivPos但不可能的值
MulPos:=2000;
end;
end;
//定位+、-号首先出现的位置
First:=AnyFirstPos(Str);
if (First=200) then//如果没有+、-号,则可以直接返回结果
begin
SubCompute:=StrToInt(Str);
exit;
end;
Fuhao:=AnyFirstF(Str); //确定首先出现的符号是+号还是-号
while (First<>0) do
begin
//如果找到+号或-号
tempStr:=Copy(Str,1,First-1);
temp:=AnyLastPos(tempStr);
Left:=Copy(Str,1,temp);
Mul1:=Copy(Str,temp+1,First-temp-1);
tempStr:=Copy(Str,First+1,Length(Str)-First);
temp:=AnyFirstPos(tempStr);
if(temp=200) then
begin
Mul2:=tempStr;
Right:='';
end
else
begin
Mul2 :=Copy(tempStr,1,temp-1);
Right :=Copy(tempStr,temp,Length(tempStr)-temp+1);
end;
if (Fuhao='+') then
Middle:=IntToStr(StrToInt(Mul1)+StrToInt(Mul2))
else
Middle:=IntToStr(StrToInt(Mul1)-StrToInt(Mul2));
Str:=Left+Middle+Right;
First:=AnyFirstPos(Str);
if (First=200) then break;
Fuhao:=AnyFirstF(Str);
end;
Result:=StrToInt(Middle);
end;
//用于计算表达式的结果
function TFrm_Point.TotalCompute(Str: String): integer;
var
First:integer;
Last:integer;
SubStr:String;
LeftStr:String;
Middle:String;
Right:String;
temp:integer;
begin
First:=LastDelimiter ('(',Str); //定位最后一个(号位置
while(First<>0) do
begin
SubStr:=Copy(Str,First+1,Length(Str)-First);
Last:= Pos (')',SubStr);
Last:=Last+First; //定位最后一个(号以后的最开始的)号位置
LeftStr:=Copy(Str,1,First-1); //(号左边的字符串
Middle:=Copy(Str,First+1,Last-First-1); //()号中间的字符串
Right:=Copy(Str,Last+1,Length(Str)-Last); //)号右边的字符串
temp:=SubCompute(Middle); //进入下面的计算
Middle:=IntToStr(temp);
Str:=LeftStr+Middle+Right;
First:=LastDelimiter ('(',Str);
end;
Result:=SubCompute(Str);
end;
function TFrm_Point.isInputValid: Boolean;
var
tempStr,Current:String;
ppos:Integer;
InputData:array of Integer;
i:integer;
begin
tempStr:=E_Point.Text;
//去掉(和)号
ppos:=Pos('(',tempStr);
while(ppos<>0) do
begin
Delete(tempStr,ppos,1);//删除括号
ppos:=Pos('(',tempStr);
end;
ppos:=Pos(')',tempStr);
while(ppos<>0) do
begin
Delete(tempStr,ppos,1);//删除括号
ppos:=Pos(')',tempStr);
end;
//获取输入的数字
setLength(InputData,4);
ppos:=AnyFirstPos(tempStr);
InputData[0]:=StrToInt(Copy(tempStr,1,ppos-1));
tempStr:=Copy(tempStr,ppos+1,Length(tempStr)-ppos);
ppos:=AnyFirstPos(tempStr);
InputData[1]:=StrToInt(Copy(tempStr,1,ppos-1));
tempStr:=Copy(tempStr,ppos+1,Length(tempStr)-ppos);
ppos:=AnyFirstPos(tempStr);
InputData[2]:=StrToInt(Copy(tempStr,1,ppos-1));
tempStr:=Copy(tempStr,ppos+1,Length(tempStr)-ppos);
ppos:=AnyFirstPos(tempStr);
InputData[3]:=StrToInt(Copy(tempStr,1,ppos-1));
//将大于10的数设置为1
for i:=0 to 3 do
begin
if(RandomData[i]>10) then
RandomData[i]:=1;
end;
//利用循环判断当前字符是不是不属于4个数中的任何一个
for i:=0 to 3 do
begin
Current:=Copy(tempStr,i+1,1);
//如果不属于4个数中的任何一个,则返回false,表示输入有误
if((InputData[i]<>RandomData[0])
and (InputData[i]<>RandomData[1])
and (InputData[i]<>RandomData[2])
and (InputData[i]<>RandomData[3])) then
begin
isInputValid:=false;//返回False
exit;
end;
end;
Result:=true;
end;
procedure TFrm_Point.E_PointKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (E_Point.Text <> '') and (key = VK_RETURN) then
Btn_Calc.Click;
end;
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -