16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"括弧・演算子優先計算/修正"
この発言は #00666 J-OH! さんの括弧・演算子優先計算 に対するコメントです
◆説明◆
・・・バグがありました。 (^^;; ヤハリ・・・
前回のモノでは、例えば ((4-8)*-3)*(11*(-8+1)) ナド、マイナス値の
データを扱った場合にエラーとなってしまいます。
function SubCalk を、下記に変更して下さい。 m(__)m
=================================
function TForm1.SubCalk(Value: String): String;
var
Stt, Bgn: Integer;
Moto, data, Moji, Kigou, Frnt, Back: String;
Usen, Fin, M: Boolean;
Fext, Bext: Extended;
begin
Moto := Value;
Fin := False;
while Fin = False do
begin
if Copy(Moto, 1, 1) = '-' then
begin
Fin := True;
for Stt := 2 to Length(Moto) do
begin
Moji := Copy(Moto, Stt, 1);
if (Moji = '*') or (Moji = '/') or
(Moji = '-') or (Moji = '+') then Fin := False;
end;
if Fin = True then
begin
Result := Moto;
Exit;
end;
end;
Usen := False;
for Stt := 1 to Length(Moto) do
begin
Moji := Copy(Moto, Stt, 1);
if (Moji = '*') or (Moji = '/') then Usen := True;
end;
if Usen = True then
begin
if Copy(Moto, 1, 1) = '-' then Stt := 1 else Stt := 0;
Moji := '';
while (Moji <> '*') and (Moji <> '/') do
begin
inc(Stt);
Moji := Copy(Moto, Stt, 1);
end;
Kigou := Moji;
data := '';
Bgn := Stt-1;
M := False;
if Copy(Moto, 1, 1) = '-' then
begin
Moto := Copy(Moto, 2, Length(Moto)-1);
M := True;
dec(Bgn);
dec(Stt);
end;
Moji := Copy(Moto, Bgn, 1);
while (Moji <> '+') and (Moji <> '-') and
(Moji <> '*') and (Moji <> '/') and (Bgn > 0) do
begin
data := Moji + data;
dec(Bgn);
if Bgn > 0 then Moji := Copy(Moto, Bgn, 1) else
if (Bgn = 1) and (Moji = '-') then data := '-' + data;
end;
Fext := StrToFloat(data);
if M = True then Fext := -Fext;
Frnt := Copy(Moto, 1, Bgn);
//
data := '';
Bgn := Stt+1;
M := False;
Moji := Copy(Moto, Bgn, 1);
if Moji = '-' then
begin
M := True;
inc(Bgn);
Moji := Copy(Moto, Bgn, 1);
end;
while (Moji <> '+') and (Moji <> '-') and
(Moji <> '*') and (Moji <> '/') and
(Bgn <= Length(Moto)) do
begin
data := data+Moji;
inc(Bgn);
if Bgn <= Length(Moto) then Moji := Copy(Moto, Bgn, 1);
end;
Bext := StrToFloat(data);
if M = True then Bext := -Bext;
Back := Copy(Moto, Bgn, Length(Moto)-Bgn+1);
if Kigou = '*' then data := FloatToStr(Fext*Bext) else
if Bext = 0 then data := '0' else
data := FloatToStr(Fext/Bext);
Moto := Frnt + data + Back;
end else
begin
Fin := True;
for Stt := 1 to Length(Moto) do
begin
Moji := Copy(Moto, Stt, 1);
if (Moji = '+') or (Moji = '-') then Fin := False;
end;
if Fin = False then
begin
if Copy(Moto, 1, 1) = '-' then Stt := 1 else Stt := 0;
Moji := '';
while (Moji <> '+') and (Moji <> '-') do
begin
inc(Stt);
Moji := Copy(Moto, Stt, 1);
end;
Kigou := Moji;
data := '';
Bgn := Stt-1;
M := False;
if Copy(Moto, 1, 1) = '-' then
begin
Moto := Copy(Moto, 2, Length(Moto)-1);
M := True;
dec(Bgn);
dec(Stt);
end;
Moji := Copy(Moto, Bgn, 1);
while (Moji <> '+') and (Moji <> '-') and
(Moji <> '*') and (Moji <> '/') and
(Bgn > 0) do
begin
data := Moji + data;
dec(Bgn);
if Bgn > 0 then Moji := Copy(Moto, Bgn, 1);
end;
Fext := StrToFloat(data);
if M = True then Fext := -Fext;
Frnt := Copy(Moto, 1, Bgn);
data := '';
Bgn := Stt+1;
M := False;
Moji := Copy(Moto, Bgn, 1);
if Moji = '-' then
begin
M := True;
inc(Bgn);
Moji := Copy(Moto, Bgn, 1);
end;
while (Moji <> '+') and (Moji <> '-') and
(Moji <> '*') and (Moji <> '/') and
(Bgn <= Length(Moto)) do
begin
data := data+Moji;
inc(Bgn);
if Bgn <= Length(Moto) then
Moji := Copy(Moto, Bgn, 1);
end;
Bext := StrToFloat(data);
if M = True then Bext := -Bext;
Back := Copy(Moto, Bgn, Length(Moto)-Bgn+1);
if Kigou = '+' then data := FloatToStr(Fext+Bext) else
data := FloatToStr(Fext-Bext);
Moto := Frnt + data + Back;
if Copy(Moto, 1, 1) = '-' then
begin
Fin := True;
for Stt := 2 to Length(Moto) do
begin
Moji := Copy(Moto, Stt, 1);
if (Moji = '+') or (Moji = '-') then Fin := False;
end;
end;
end;
end;
end;
Result := Moto;
end;
J-OH!(VEC05267)
Original document by J-OH! 氏 ID:(VEC05267)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|