Q&A
HOME
Tips & Tech
Q&A
Discuss
Download
자유게시판
홍보 / 광고
구인 / 구직
LOGIN
회원가입
d=a+b+c 이런 공식을...
안녕들 하신가요?
어떤 공식을 입력시켜 두고 데이타를 공식에 적용하려 합니다.
공식이 영구적이라면 프로그램 코드에 함수로 만들어 놓겠는데...
수정가능성이 있는거라서...
위와같은 공식을 프로그램 수행중에 변경할 수 있는 방법이 있나요?
공식은 a=b+c 나 a=b*c+d등 여러가지가 될수 있어요...
참고로 db는 오라클을 쓰고 있습니다.
질문이 너무 초보적인가요? 그래도 좀...
그럼 오늘도 즐거운 코딩되시길...
1
COMMENTS
김영대
•
1999.04.29 19:14
송동일 wrote:
> 안녕들 하신가요?
> 어떤 공식을 입력시켜 두고 데이타를 공식에 적용하려 합니다.
> 공식이 영구적이라면 프로그램 코드에 함수로 만들어 놓겠는데...
> 수정가능성이 있는거라서...
>
> 위와같은 공식을 프로그램 수행중에 변경할 수 있는 방법이 있나요?
> 공식은 a=b+c 나 a=b*c+d등 여러가지가 될수 있어요...
>
> 참고로 db는 오라클을 쓰고 있습니다.
> 질문이 너무 초보적인가요? 그래도 좀...
> 그럼 오늘도 즐거운 코딩되시길...
문자열 수식문장(expression)의 결과 구하기
안녕하세요 김영대입니다
아래 소스는 전에 제 홈페이지의 Delphi Tip & Trick 에 올렸던
예제인데 정확한 해답은 아니지만 조금만 수정하면 원하시는 결과를
얻을 수 있을것 같아서 올립니다
아래 예제는 화면의 Edit1의 Text에 sqrt(43.23*12+3.1/1.64) 등등의 임의의
수식을 입력하고 버튼을 클릭하면 그 결과를 계산해서 보여주고 만약 잘못된
수식이면 에러난 문자로 캐럿을 이동시킵니다
이 소스를 보시고
sqrt(43.23*12+3.1/1.64) -> sqrt(a*b+c/d) 이런 식으로 입력하고
해당 변수(a,b,c,d)에 값을 넣은 식으로 바꾸시면 될 듯 합니다
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, forms, Dialogs,
StdCtrls;
type
Tform1 = class(Tform)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
form1: Tform1;
implementation
{$R *.DFM}
procedure Eval(formula: String; {Expression to be evaluated}
var Value: double; {Return value}
var ErrPos: Integer); {error position}
const
Digit: Set of Char = ['0'..'9'];
var
Posn: Integer; {Current position in formula}
CurrChar: Char; {character at Posn in formula}
procedure ParseNext;
begin
repeat
Posn := Posn+1;
if Posn <= Length(formula) then
CurrChar := formula[Posn]
else
CurrChar := ^M;
until CurrChar<>' ';
end {ParseNext};
function add_subt: Real;
var
E: Real;
Opr: Char;
function mult_DIV: Real;
var
S : Real;
Opr : Char;
function Power: Real;
var
T : Real;
function Signedop: Real;
function Unsignedop: Real;
type
StdFunc = (fabs, fsqrt, fsqr, fsin, fcos,
farctan, fln, flog, fexp, ffact);
StdFuncList = array[StdFunc] of String[6];
const
StdFuncName: StdFuncList =
('ABS','SQRT','SQR','SIN','COS',
'ARCTAN','LN','LOG','EXP','FACT');
var
E, L, Start : Integer;
Funnet : Boolean;
F : Real;
Sf : StdFunc;
function Fact(I: Integer): Real;
begin
if I > 0 then
begin
Fact := I*Fact(I-1);
end
else
Fact := 1;
end {Fact};
begin {function Unsignedop}
if CurrChar in Digit then
begin
Start := Posn;
repeat
ParseNext
until not (CurrChar in Digit);
if CurrChar = '.' then
repeat
ParseNext
until not (CurrChar in Digit);
if CurrChar = 'E' then
begin
ParseNext;
repeat
ParseNext
until not (CurrChar in Digit);
end;
Val(Copy(formula,Start,Posn-Start),F,ErrPos);
end
else if CurrChar = '(' then
begin
ParseNext;
F := add_subt;
if CurrChar=')' then
ParseNext
else
ErrPos := Posn;
end
else
begin
Funnet := False;
for sf := fabs tO ffact do
if not Funnet then
begin
l := Length(StdFuncName[sf]);
if Copy(formula,Posn,l)=StdFuncName[sf] then
begin
Posn := Posn+l-1;
ParseNext;
f := Unsignedop;
case sf of
fabs: f := abs(f);
fsqrt: f := SqrT(f);
fsqr: f := Sqr(f);
fsin: f := Sin(f);
fcos: f := Cos(f);
farctan: f := ArcTan(f);
fln : f := LN(f);
flog: f := LN(f)/LN(10);
fexp: f := EXP(f);
ffact: f := fact(Trunc(f));
end;
Funnet := True;
end;
end;
if not Funnet then
begin
ErrPos := Posn;
f := 0;
end;
end;
Unsignedop := F;
end {Unsignedop};
begin {Signedop}
if CurrChar='-' then
begin
ParseNext;
Signedop := -Unsignedop;
end
else
Signedop := Unsignedop;
end {Signedop};
begin {Power}
T := Signedop;
while CurrChar='^' do
begin
ParseNext;
if t <> 0 then
t := EXP(LN(abs(t))*Signedop)
else
t := 0;
end;
Power := t;
end {Power};
begin {mult_DIV}
s := Power;
while CurrChar in ['*','/'] do
begin
Opr := CurrChar;
ParseNext;
case Opr of
'*': s := s * Power;
'/': s := s / Power;
end;
end;
mult_DIV := s;
end {mult_DIV};
begin {add_subt}
E := mult_DIV;
while CurrChar in ['+','-'] do
begin
Opr := CurrChar;
ParseNext;
case Opr of
'+': e := e + mult_DIV;
'-': e := e - mult_DIV;
end;
end;
add_subt := E;
end {add_subt};
begin {PROC Eval}
if formula[1] = '.' then
formula := '0' + formula;
if formula[1]='+' then
Delete(formula,1,1);
for Posn:=1 to Length(formula) do
formula[Posn] := Upcase(formula[Posn]);
Posn := 0;
ParseNext;
Value := add_subt;
if CurrChar=^M then
ErrPos := 0
else
ErrPos := Posn;
end {PROC Eval};
procedure Tform1.Button1Click(Sender: TObject);
var
Value: double;
ErrPos: Integer;
begin
Eval(Edit1.Text, Value, ErrPos);
Label1.Caption := FloatToStr(Value); // 결과값
if ErrPos > 0 then // 에러가 있다면 해당 문자로 캐럿을 위치 시킨다
begin
Edit1.SetFocus;
{두번째 문자 위치로 커서를 보낸대}
Edit1.SelStart := ErrPos - 1;
{문자를 선택하지 않은 상태로 만든다}
Edit1.SelLength := 0;
end;
end;
end.
0
0
삭제
수정
댓글
(NOTICE) You must be
logged in
to comment on this post.
정정례
•
1999.04.29 19:35
1
COMMENTS
/
0
LIKES
가상Key번호를 알려주세요
신인재
•
1999.04.29 19:44
정정례 wrote: > 가상Key번호 중에서 PageUp과 PageDown번호를 알려주세요 천랸 PDSPF에서 퍼 왔습니다...
장 아무개
1999.04.29 19:08
0
COMMENTS
/
0
LIKES
[824번에 대한 재질문] Add watch에 대해서?
송동일
•
1999.04.29 18:55
1
COMMENTS
/
0
LIKES
d=a+b+c 이런 공식을...
안녕들 하신가요? 어떤 공식을 입력시켜 두고 데이타를 공식에 적용하려 합니다. 공식이 영구적이라면 프로그램 코드에 함수로 만들어 놓겠는데... 수정가능성이 있는거라서... 위와같은 공식을 프로그램 수행중에 변경할 수 있는 방법이 ...
김영대
•
1999.04.29 19:14
송동일 wrote: > 안녕들 하신가요? > 어떤 공식을 입력시켜 두고 데이타를 공식에 적용하려 합니다. > ...
김봉재
•
1999.04.29 18:49
1
COMMENTS
/
0
LIKES
델파이 컴파일중 디버거 에러!!
이정욱
•
1999.04.29 22:15
잠깐 Command프롬프트로 가셔서 그 BORDBP40.DLL이 있는 디렉토리로 이동하신 후에 Regsvr32 BORDBK40.DLL ...
이누리
•
1999.04.29 18:22
1
COMMENTS
/
0
LIKES
공통 Pas 에서 사용하는 SelectNext 함수..
mephy
•
1999.04.29 22:31
이누리 wrote: > 안녕하세요 > > 각 Form 에서 SelectNext 를 사용한 경우 Error 가 나지 않았는데 > ...
장 아무개
•
1999.04.29 10:47
1
COMMENTS
/
0
LIKES
824번 재질문- true가 아니라 false 일때는요?
안치봉
•
1999.04.29 19:36
장 아무개 wrote: > 답변중에 > 집합형이라고 하셨는데 > printer_DBGrid.Options.dgRowLines := true ...
이호선
•
1999.04.29 06:31
1
COMMENTS
/
0
LIKES
[재질문817번]Drag&Drop내용이 어디 있나요?
안치봉
•
1999.04.29 07:03
이호선 wrote: > 안녕하세요. > Drag&Drop내용이 델파이 강의에 있다하는데 어디인지 못찾겠는데요. > ...
이호선
•
1999.04.29 06:02
2
COMMENTS
/
0
LIKES
[재질문826번]프로그램 도중 기본 프린트를 ...
이정욱
•
1999.04.29 21:53
제가 만든 기본프린터 바꾸는 함수 입니다. 참고하시구요... 이것은 프린터 이름의 일부만 넣어줘도 됩니...
안치봉
•
1999.04.29 07:10
이호선 wrote: > 안녕하세요. > 별다른 것은 없고요 현재 설정된 기본 프린트를 바꿀려하는데 바꿔도 > ...
권만섭
•
1999.04.29 05:27
1
COMMENTS
/
0
LIKES
이런 막막함...통계는 어떻게
정영호
•
1999.04.30 07:28
권만섭 wrote: > 여기에 자주 답변 올려주시는 많은 분들께 감사드리면서 > > 저희가 주고객과 주고객...
이호선
•
1999.04.29 02:07
1
COMMENTS
/
0
LIKES
프로그램 도중 기본 프린트를 설정 할려면..
이정욱
•
1999.04.29 05:30
인쇄루틴을 조금 보여주셔야 답을 찾을 수 있을것 같네요. 이호선 wrote: > 안녕하세요. > HP Laser...
장아무개
•
1999.04.29 02:02
1
COMMENTS
/
0
LIKES
DBGrid에서 propetics중에 options...
안치봉
•
1999.04.29 03:38
장아무개 wrote: > DBGrid name : printer_DBGrid 이고요 > > properties 중에 options 라는 항목 있습...
Faster
1999.04.29 00:23
0
COMMENTS
/
0
LIKES
GridXLS 사용하시는분...
처음처럼
1999.04.28 23:58
0
COMMENTS
/
0
LIKES
델파이 4.0과 visual FOxpro 6.0 BDE연결
WhiteDragon
1999.04.28 21:20
0
COMMENTS
/
0
LIKES
델파이 디베이스 중 [급]
Heaven
•
1999.04.28 17:33
1
COMMENTS
/
0
LIKES
데이타베이스에 관한 중요한 질문
rain
•
1999.04.28 20:48
음..제 개인적인 의견으로는 table 컴퍼넌트 보다는 query 컴퍼넌트를 사용하시는게 더욱 나을것 같습니다....
이호선
•
1999.04.28 09:40
1
COMMENTS
/
0
LIKES
drag&drop에 대하여
신인재
•
1999.04.28 20:12
이호선 wrote: > 안녕하세요. > 일반 Control들의 Drag&Drop은 어떻게 해야 하는지 궁금합니다. > 예를...
이호선
•
1999.04.28 09:04
1
COMMENTS
/
0
LIKES
프린트가 끝났는지 알려면?
김영대
•
1999.04.28 21:33
이호선 wrote: > 안녕하세요. > 한 폼에서 프린트가 끝난상태를 알고 폼을 닫을려 합니다. > 프린트가 ...
강두헌
•
1999.04.28 06:57
1
COMMENTS
/
0
LIKES
WM_DDE_ACK가 무엇입니까?
안치봉
•
1999.04.28 07:54
강두헌 wrote: > Window Message중에 WM_DDE_ACK란게 있는 모양인데 > 제가 가지고 있는 자료에는 없네요...
김근영
•
1999.04.28 03:58
1
COMMENTS
/
0
LIKES
image삽입하는 방법~
신인재
•
1999.04.28 05:35
아래는 델코의 하영재님의 글을 갈무리 한것입니다. 참고하세요.... Blob 필드에서 불러오기 3가지 ...
신호철
•
1999.04.28 02:59
1
COMMENTS
/
0
LIKES
신인재님께서 올리신 내용중 이해가 않되서
신인재
•
1999.04.28 05:23
신호철 wrote: > 안녕하세요, 전에 이정욱님에게 답하신 텍스트파일 dbase(혹은 패러독스) 에구 이정욱...
송동일
1999/04/29 18:55
Views
143
Likes
0
Comments
1
Reports
0
Tag List
수정
삭제
목록으로
한델 로그인 하기
로그인 상태 유지
아직 회원이 아니세요? 가입하세요!
암호를 잊어버리셨나요?
> 안녕들 하신가요?
> 어떤 공식을 입력시켜 두고 데이타를 공식에 적용하려 합니다.
> 공식이 영구적이라면 프로그램 코드에 함수로 만들어 놓겠는데...
> 수정가능성이 있는거라서...
>
> 위와같은 공식을 프로그램 수행중에 변경할 수 있는 방법이 있나요?
> 공식은 a=b+c 나 a=b*c+d등 여러가지가 될수 있어요...
>
> 참고로 db는 오라클을 쓰고 있습니다.
> 질문이 너무 초보적인가요? 그래도 좀...
> 그럼 오늘도 즐거운 코딩되시길...
문자열 수식문장(expression)의 결과 구하기
안녕하세요 김영대입니다
아래 소스는 전에 제 홈페이지의 Delphi Tip & Trick 에 올렸던
예제인데 정확한 해답은 아니지만 조금만 수정하면 원하시는 결과를
얻을 수 있을것 같아서 올립니다
아래 예제는 화면의 Edit1의 Text에 sqrt(43.23*12+3.1/1.64) 등등의 임의의
수식을 입력하고 버튼을 클릭하면 그 결과를 계산해서 보여주고 만약 잘못된
수식이면 에러난 문자로 캐럿을 이동시킵니다
이 소스를 보시고
sqrt(43.23*12+3.1/1.64) -> sqrt(a*b+c/d) 이런 식으로 입력하고
해당 변수(a,b,c,d)에 값을 넣은 식으로 바꾸시면 될 듯 합니다
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, forms, Dialogs,
StdCtrls;
type
Tform1 = class(Tform)
Edit1: TEdit;
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
form1: Tform1;
implementation
{$R *.DFM}
procedure Eval(formula: String; {Expression to be evaluated}
var Value: double; {Return value}
var ErrPos: Integer); {error position}
const
Digit: Set of Char = ['0'..'9'];
var
Posn: Integer; {Current position in formula}
CurrChar: Char; {character at Posn in formula}
procedure ParseNext;
begin
repeat
Posn := Posn+1;
if Posn <= Length(formula) then
CurrChar := formula[Posn]
else
CurrChar := ^M;
until CurrChar<>' ';
end {ParseNext};
function add_subt: Real;
var
E: Real;
Opr: Char;
function mult_DIV: Real;
var
S : Real;
Opr : Char;
function Power: Real;
var
T : Real;
function Signedop: Real;
function Unsignedop: Real;
type
StdFunc = (fabs, fsqrt, fsqr, fsin, fcos,
farctan, fln, flog, fexp, ffact);
StdFuncList = array[StdFunc] of String[6];
const
StdFuncName: StdFuncList =
('ABS','SQRT','SQR','SIN','COS',
'ARCTAN','LN','LOG','EXP','FACT');
var
E, L, Start : Integer;
Funnet : Boolean;
F : Real;
Sf : StdFunc;
function Fact(I: Integer): Real;
begin
if I > 0 then
begin
Fact := I*Fact(I-1);
end
else
Fact := 1;
end {Fact};
begin {function Unsignedop}
if CurrChar in Digit then
begin
Start := Posn;
repeat
ParseNext
until not (CurrChar in Digit);
if CurrChar = '.' then
repeat
ParseNext
until not (CurrChar in Digit);
if CurrChar = 'E' then
begin
ParseNext;
repeat
ParseNext
until not (CurrChar in Digit);
end;
Val(Copy(formula,Start,Posn-Start),F,ErrPos);
end
else if CurrChar = '(' then
begin
ParseNext;
F := add_subt;
if CurrChar=')' then
ParseNext
else
ErrPos := Posn;
end
else
begin
Funnet := False;
for sf := fabs tO ffact do
if not Funnet then
begin
l := Length(StdFuncName[sf]);
if Copy(formula,Posn,l)=StdFuncName[sf] then
begin
Posn := Posn+l-1;
ParseNext;
f := Unsignedop;
case sf of
fabs: f := abs(f);
fsqrt: f := SqrT(f);
fsqr: f := Sqr(f);
fsin: f := Sin(f);
fcos: f := Cos(f);
farctan: f := ArcTan(f);
fln : f := LN(f);
flog: f := LN(f)/LN(10);
fexp: f := EXP(f);
ffact: f := fact(Trunc(f));
end;
Funnet := True;
end;
end;
if not Funnet then
begin
ErrPos := Posn;
f := 0;
end;
end;
Unsignedop := F;
end {Unsignedop};
begin {Signedop}
if CurrChar='-' then
begin
ParseNext;
Signedop := -Unsignedop;
end
else
Signedop := Unsignedop;
end {Signedop};
begin {Power}
T := Signedop;
while CurrChar='^' do
begin
ParseNext;
if t <> 0 then
t := EXP(LN(abs(t))*Signedop)
else
t := 0;
end;
Power := t;
end {Power};
begin {mult_DIV}
s := Power;
while CurrChar in ['*','/'] do
begin
Opr := CurrChar;
ParseNext;
case Opr of
'*': s := s * Power;
'/': s := s / Power;
end;
end;
mult_DIV := s;
end {mult_DIV};
begin {add_subt}
E := mult_DIV;
while CurrChar in ['+','-'] do
begin
Opr := CurrChar;
ParseNext;
case Opr of
'+': e := e + mult_DIV;
'-': e := e - mult_DIV;
end;
end;
add_subt := E;
end {add_subt};
begin {PROC Eval}
if formula[1] = '.' then
formula := '0' + formula;
if formula[1]='+' then
Delete(formula,1,1);
for Posn:=1 to Length(formula) do
formula[Posn] := Upcase(formula[Posn]);
Posn := 0;
ParseNext;
Value := add_subt;
if CurrChar=^M then
ErrPos := 0
else
ErrPos := Posn;
end {PROC Eval};
procedure Tform1.Button1Click(Sender: TObject);
var
Value: double;
ErrPos: Integer;
begin
Eval(Edit1.Text, Value, ErrPos);
Label1.Caption := FloatToStr(Value); // 결과값
if ErrPos > 0 then // 에러가 있다면 해당 문자로 캐럿을 위치 시킨다
begin
Edit1.SetFocus;
{두번째 문자 위치로 커서를 보낸대}
Edit1.SelStart := ErrPos - 1;
{문자를 선택하지 않은 상태로 만든다}
Edit1.SelLength := 0;
end;
end;
end.