16番会議室「玉石混淆みんなで作るSample蔵」に寄せられたサンプル
"計算マクロ"
この発言に対し以下のコメントが寄せられています
#00216 J-OH! さん 計算マクロバグ ( );
◆説明◆
例えば、数値データ入力用の Edit 2つ、マクロ式入力用の Edit
1つを配置していて、
・Edit1 には「5」
・Edit2 には「2」
などと入力されているとします。
で、仮に、
・Edit3 に「Edit1 + Edit2」(5 + 2)
と入力されている場合には「7」
・Edit3 に「10 * Edit1 / Edit2」(10 * 5 / 2)
と入力されている場合には「25」
といった結果が得られる、というものです。
◆注意◆
1: Edit3 に使用される識別子としては "E1"・"E2" などの方が
良いかも知れません。
2: このサンプルでは、本来の演算子の優先順位には対応してお
りません。
3: 更に「()」内優先順位にも対応しておりません。 ( );
(つまり、ただ単に「左から順に計算」しているだけのものです)
4: 計算式には、左から順に
「数値 or 識別子」>「演算子」>「数値 or 識別子」>「演算子」・・・
の順で入力されているという前提のものです。
5: 数値・識別子・演算子の間には、半角スペースが1つ以上あると
いう前提のものです。
例:「Edit1 * 10 + Edit2」
^ ^ ^ ^
◆サンプルコード◆
var
全文字数, i: Integer;
式, 1文字, オブジェ, 演算子, data: String;
最初, 計算: Boolean;
結果, 値: Extended;
begin
// 初期設定
全文字数 := Length(Edit3.Text);
式 := Edit3.Text;
i := 1;
最初 := True;
計算 := True;
// 実行部分
while i <= 全文字数 do
begin
1文字 := Copy(式, i, 1);
オブジェ := '';
// 空白をパス 主に2巡目以降のための処理
while (1文字 = ' ') and (i <= 全文字数) do inc(i);
// 式 の値を1文字づつ順に読み取り オブジェ に追加代入
// これを次の半角スペースまで繰り返す
while (1文字 <> ' ') and (i <= 全文字数) do
begin
inc(i);
オブジェ := オブジェ + 1文字;
1文字 := Copy(式, i, 1);
end;
//「数値 or 識別子」>「演算子」>「数値 or 識別子」・・・
// の順で繰り返されるという前提の中で、演算子が読み込ま
// れるループでの処理
if 計算 = False then
begin
if (オブジェ <> '+') and (オブジェ <> '-') and
(オブジェ <> '*') and (オブジェ <> '/') then
begin
ShowMessage('演算子が不正です');
Exit;
end;
演算子 := オブジェ;
end else
begin
try
値 := StrToFloat(オブジェ);
except
on EConvertError do
begin
try
if オブジェ = 'Edit1' then
begin
data := Edit1.Text;
値 := StrToFloat(Edit1.Text);
end else
if オブジェ = 'Edit2' then
begin
data := Edit2.Text;
値 := StrToFloat(Edit2.Text);
end else
begin
ShowMessage('"'+オブジェ+'" 未定義の識別子です');
Edit3.SetFocus;
Exit;
end;
except
on EConvertError do
begin
ShowMessage('"'+data+'" 数値以外のデータが入力されています');
Edit1.SetFocus;
Exit;
end;
end;
end;
end;
end;
if 最初 = True then
begin
結果 := 値;
最初 := False;
end else
if 計算 = True then
begin
if 演算子 = '+' then 結果 := 結果 + 値 else
if 演算子 = '-' then 結果 := 結果 - 値 else
if 演算子 = '*' then 結果 := 結果 * 値 else
if 演算子 = '/' then 結果 := 結果 / 値;
end;
計算 := not 計算;
inc(i);
end;
Label1.Caption := FloatToStr(結果);
end;
97/11/24(月) J-OH!(VEC05267)
Original document by J-OH! 氏 ID:(VEC05267)
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum の16番会議室「玉石混淆みんなで作るSample蔵」に投稿されたサンプルです。これらのサンプルはボーランド株式会社がサポートする公式のものではありません。また、必ずしも動作が検証されているものではありません。これらのサンプルを使用したことに起因するいかなる損害も投稿者、およびフォーラムスタッフはその責めを負いません。使用者のリスクの範疇でご使用下さい。
Copyright 1996-2002 Delphi Users' Forum
|