The user-defined Sum function in this sample demonstrates
many features, including an unusual but powerful concept, where an expression
can be passed as an argument (note: this is different than simply passing the
resulting value of the expression). It also demonstrates variable type
arguments, as well as optional arguments. Expressions such as the
following can be evaluated:
Sum(x^2+5, 1, 10)
Sum(x - 6, 2, 8, .5)
Sum(4q+3, 1, 100, , q)
Sum(MyExpression, Sum(x+1,1,3), Sum(x,1,55), 1, MyVar)
Visual Basic
Private Sub Form_Load()
ucDefineFunction _
"Sum(Expression&,start,finish,step=1,var@=x)", _
AddressOf ucalcSum
ucDefineVariable "MyVar = 'z' "
ucDefineVariable "MyExpression = '2*z^2 +10' "
End Sub
Private Sub Command1_Click()
Expression$ = InputBox("Enter an expression",, _
"Sum(x^2+5, 1, 10)")
MsgBox ucEvalStr(Expression$)
End Sub
Function ucalcSum() As Double
Dim ExpressionPtr As Long, VariablePtr As Long
Dim Total As Double, sstep As Double
Dim Start As Double, Finish As Double
ExpressionPtr = ucParam(1)
Start = ucParam(2)
Finish = ucParam(3)
sstep = ucParam(4)
VariablePtr = ucParam(5)
For x = Start To Finish Step sstep
ucSetVariableValue VariablePtr, x
Total = Total + ucEvaluate(ExpressionPtr)
Next
ucalcSum = Total
End Function
VC++ or C++ Builder
#include <iostream>
#include "ucalc.cpp"
using namespace std;
long double ucalcSum();
int main()
{
char Expression[80];
ucDefineFunction(
"Sum(Expression&,start,finish,step=1,var@=x)",
reinterpret_cast<long>(ucalcSum));
ucDefineVariable("MyVar = 'z' ");
ucDefineVariable("MyExpression = '2*z^2 +10' ");
while(1)
{
cout << "Enter an expression: " << endl;
cin.getline(Expression, 80, '\n');
cout << "Answer: " << ucEvalStr(Expression)
<< endl;
}
return 0;
}
long double ucalcSum()
{
long ExpressionPtr, VariablePtr;
long double x, sstep, Start, Finish, Total;
ExpressionPtr = ucParam[1];
Start = ucParam[2];
Finish = ucParam[3];
sstep = ucParam[4];
VariablePtr = ucParam[5];
Total = 0;
x = Start;
while (x <= Finish)
{
ucSetVariableValue(VariablePtr, x);
Total = Total + ucEvaluate(ExpressionPtr);
x = x + sstep;
}
return Total;
}
Delphi
procedure TForm1.FormCreate(Sender: TObject);
begin
ucDefineFunction(
'Sum(Expr&,start,finish,step=1,var@=x)',
Longword( @ucalcSum ));
ucDefineVariable('MyVar = "z" ');
ucDefineVariable('MyExpression = "2*z^2 +10" ');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
Expression: string;
begin
Expression := InputBox('', 'Enter an expression:',
'Sum(x^2+5, 1, 10)');
Edit1.Text := ucEvalStr(Expression);
end;
function ucalcSum: Extended;
var
ExpressionPtr, VariablePtr: Longint;
x, sstep, Start, Finish, Total: Extended;
begin
ExpressionPtr := Trunc(ucParam[1]);
Start := ucParam[2];
Finish := ucParam[3];
sstep := ucParam[4];
VariablePtr := Trunc(ucParam[5]);
Total := 0;
x := Start;
while x <= Finish do
begin
ucSetVariableValue(VariablePtr, x);
Total := Total + ucEvaluate(ExpressionPtr);
x := x + sstep;
end;
ucalcSum := Total;
end;
Download
fastmath.zip (~145K)
