お知らせ

電子会議

ライブラリ

パレット

Delphi FAQ検索

Delphi FAQ一覧

サンプル蔵





FDelphi FAQ
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