
这种运算比较麻烦,不过4种运算符号优先级相同应该简单写,我这里有个算法,能进行简单的四则运算,delphi的,供参考
Function Math_Evaluate(S0:string):Extended
Function Evaluate(S0:String):ExtendedForward
Procedure CleanUp(var s0:string)
Var
I:integer
Begin
S0:=LowerCase(s0)
I:=Pos(' ',s0)
While I>0 Do
Begin
Delete(S0,I,1)
I:=Pos(' ',S0)
End
End
Function GetFirstOpp(Tot:IntegerS0:String):Integer
Const
Sopps:String=('+-*/^')
Var
I:Integer
Begin
If Tot=0 Then Tot:=Length(S0)
For I:=1 To 5 Do
Begin
Result:=Pos(Sopps[i],S0)
If ((I<3) And (Result>0)) Then
If ((Result=1) Or (Pos(S0[Result-1],Sopps)>0)) Then
Result:=0
If Result>0 Then
If Result<Tot Then
Exit
End
If Result>Tot Then
Result:=0
End
Function SpecialF(P1:IntegerS0:String):Extended
Var
Operstr:String
Arg:Extended
Begin
Result:=0
Operstr:=Copy(S0,1,P1-1)
If S0[Length(S0)]<>')' Then
Exit
Operstr:=LowerCase(Operstr)
Arg:=Evaluate(Copy(S0,P1+1,Length(S0)-P1-1))
if Operstr ='sin' Then
Result:=Sin(Arg)
Else if Operstr ='cos' Then
Result:=Cos(Arg)
Else if Operstr ='tan' Then
Result:=Sin(Arg)/Cos(Arg)
Else if Operstr ='arctan' Then
Result:=Arctan(Arg)
Else if Operstr ='log' Then
Result:=Ln(Arg)/Ln(10)
Else if Operstr ='ln' Then
Result:=Ln(Arg)
Else if Operstr ='exp' Then
Result:=Exp(Arg)
Else if Operstr ='sqrt' Then
Result:=Sqrt(Arg)
{enter additional functions here}
Else Exit
End
Function GetValue(S0:String):Extended
Begin
Result:=0
If Length(S0)<1 Then Exit
If Length(S0)=1 Then
Result:=StrToFloat(S0)
Else
Case s0[1] Of
'x':Result:=1
'y':Result:=1
'z':Result:=1
Else Result:=StrToFloat(S0)
End
End
Procedure MatchBracket(Var I:IntegerS0:String)
Var
J,Len:Integer
Begin
J:=1
Len:=Length(S0)
Repeat Inc(I)
If I>Len Then Exit
If S0[I]='(' Then Inc(J)
If S0[I]=')' Then Dec(J)
If J<0 Then Exit
Until J=0
End
Function Calculate(P1:IntegerS0:String):Extended
Var
V1,V2:Extended
Begin
Result:=0
V1:=Evaluate(Copy(S0,1,P1-1))
V2:=Evaluate(Copy(S0,P1+1,Length(s0)-P1))
Case S0[P1] Of
'+': Result:=V1+V2
'-': Result:=V1-V2
'/': Result:=V1/V2
'*': Result:=V1*V2
'^': Result:=Exp(V2*Ln(V1))
Else Exit
End
End
Function Evaluate(S0:string):Extended
Var
P1,P2,Q1:Integer
Begin
P1:=Pos('(',S0)
P2:=P1
If P2>0 Then
MatchBracket(P2,S0)
If P1=1 Then
Begin
If P2=Length(S0) Then
Begin
Delete(S0,P2,1)
Delete(S0,1,1)
Result:=Evaluate(S0)
End Else
Result:=Calculate(P2+1,S0)
Exit
End
Q1:=GetFirstOpp(P1,S0)
If (P1+Q1=0) Then
Begin
Result:=GetValue(S0)
Exit
End
If Q1<>0 Then
Result:=Calculate(Q1,S0)
Else If Length(S0)>P2 Then
Result:=Calculate(P2+1,S0)
Else
Result:=SpecialF(P1,S0)
End
Begin
Try
CleanUp(S0)
Result:=Evaluate(S0)
Except
Result:=0
End
End
//数值计算程序-特征值和特征向量//////////////////////////////////////////////////////////////
//利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵
//a-长度为n*n的数组,存放n阶实对称矩阵
//n-矩阵的阶数
//q-长度为n*n的数组,返回时存放Householder变换矩阵
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
void eastrq(double a[],int n,double q[],double b[],double c[])
//////////////////////////////////////////////////////////////
//求实对称三对角对称矩阵的全部特征值及特征向量
//利用变型QR方法计算实对称三对角矩阵全部特征值及特征向量
//n-矩阵的阶数
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
//q-长度为n*n的数组,若存放单位矩阵,则返回实对称三对角矩阵的特征向量组
// 若存放Householder变换矩阵,则返回实对称矩阵A的特征向量组
//a-长度为n*n的数组,存放n阶实对称矩阵
int ebstq(int n,double b[],double c[],double q[],double eps,int l)
//////////////////////////////////////////////////////////////
//约化实矩阵为赫申伯格(Hessen berg)矩阵
//利用初等相似变换将n阶实矩阵约化为上H矩阵
//a-长度为n*n的数组,存放n阶实矩阵,返回时存放上H矩阵
//n-矩阵的阶数
void echbg(double a[],int n)
//////////////////////////////////////////////////////////////
//求赫申伯格(Hessen berg)矩阵的全部特征值
//返回值小于0表示超过迭代jt次仍未达到精度要求
//返回值大于0表示正常返回
//利用带原点位移的双重步QR方法求上H矩阵的全部特征值
//a-长度为n*n的数组,存放上H矩阵
//n-矩阵的阶数
//u-长度为n的数组,返回n个特征值的实部
//v-长度为n的数组,返回n个特征值的虚部
//eps-控制精度要求
//jt-整型变量,控制最大迭代次数
int edqr(double a[],int n,double u[],double v[],double eps,int jt)
//////////////////////////////////////////////////////////////
//求实对称矩阵的特征值及特征向量的雅格比法
//利用雅格比(Jacobi)方法求实对称矩阵的全部特征值及特征向量
//返回值小于0表示超过迭代jt次仍未达到精度要求
//返回值大于0表示正常返回
//a-长度为n*n的数组,存放实对称矩阵,返回时对角线存放n个特征值
//n-矩阵的阶数
//u-长度为n*n的数组,返回特征向量(按列存储)
//eps-控制精度要求
//jt-整型变量,控制最大迭代次数
int eejcb(double a[],int n,double v[],double eps,int jt)
//////////////////////////////////////////////////////////////
选自<<徐世良数值计算程序集(C)>>
每个程序都加上了适当地注释,陆陆续续干了几个月才整理出来的啊。
今天都给贴出来了
#include "stdio.h"
#include "math.h"
//约化对称矩阵为三对角对称矩阵
//利用Householder变换将n阶实对称矩阵约化为对称三对角矩阵
//a-长度为n*n的数组,存放n阶实对称矩阵
//n-矩阵的阶数
//q-长度为n*n的数组,返回时存放Householder变换矩阵
//b-长度为n的数组,返回时存放三对角阵的主对角线元素
//c-长度为n的数组,返回时前n-1个元素存放次对角线元素
以下是我编的简易计算器程序,基本成功//4*4键盘检测程序,按下键后相应的代码显示在液晶屏上
//显示5位后,第6次显示 *** 作符号
//再显示下一个数
// 键值与功能对应表
//键值 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
//功能 0 1 2 3 4 5 6 7 8 9 + - × ÷ = 清零
#include<reg52.h>
sbit beep=P2^3
sbit lcden=P3^4
sbit rs=P3^5
sbit rw=P3^6
#define uint unsigned int
#define ulint unsigned long int
#define uchar unsigned char
#define lcddata P0
ulint bb,dd,ee,ff
uchar d,flag1
uchar fd1,fd2
uchar b1=16,b2=16,b3=16,b4=16,b5=16
uchar d1=16,d2=16,d3=16,d4=16,d5=16
uchar f1=16,f2=16,f3=16,f4=16,f5=16,f6=16,f7=16,f8=16,f9=16,f10=16
uchar key,keyval,c,temp
void Delay1ms(uint i) //1ms延时程序
{
uint j
for(i>0i--)
{
for(j=0j<125j++)
{}
}
}
void write_com(uchar com)
{
lcddata=com
rs=0
rw = 0
lcden=0
Delay1ms(10)
lcden=1
Delay1ms(10)
lcden=0
}
void write_date(uchar date)
{
lcddata=date
rs=1
rw=0
lcden=0
Delay1ms(10)
lcden=1
Delay1ms(10)
lcden=0
}
void init2()
{
rw=0
write_com(0x38)
Delay1ms(10)
write_com(0x0f)
Delay1ms(10)
write_com(0x06)
Delay1ms(10)
write_com(0x01)
Delay1ms(10)
}
void display1(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第1个数显示程序
{
init2()
write_com(0x80)//第1行,第1字
Delay1ms(10)
write_date(0x30+A1)
Delay1ms(10)
write_date(0x30+A2)
Delay1ms(10)
write_date(0x30+A3)
Delay1ms(10)
write_date(0x30+A4)
Delay1ms(10)
write_date(0x30+A5)
Delay1ms(10)
}
void display2(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5) //第2个数显示程序
{
write_com(0x88)//第1行,第1字
Delay1ms(10)
write_date(0x30+A1)
Delay1ms(10)
write_date(0x30+A2)
Delay1ms(10)
write_date(0x30+A3)
Delay1ms(10)
write_date(0x30+A4)
Delay1ms(10)
write_date(0x30+A5)
Delay1ms(10)
}
void display3(uchar a) // *** 作符号显示程序
{
write_com(0x86)//第1行,第1字
Delay1ms(10)
switch(a)
{
case 10:
write_date('+')
Delay1ms(10)
case 11:
write_date('-')
Delay1ms(10)
case 12:
write_date('x')
Delay1ms(10)
case 13:
write_date('/')
Delay1ms(10)
}
}
void display4(uchar A1,uchar A2,uchar A3,uchar A4,uchar A5,uchar A6,uchar A7,uchar A8,uchar A9,uchar A10,uchar A11,uchar A12) //结果显示程序
{
write_com(0x80+0x40)//第2行,第1字
Delay1ms(10)
if (flag1==0)
{
write_date('-')
}
else write_date('+')
Delay1ms(10)
write_date(0x30+A1)
Delay1ms(10)
write_date(0x30+A2)
Delay1ms(10)
write_date(0x30+A3)
Delay1ms(10)
write_date(0x30+A4)
Delay1ms(10)
write_date(0x30+A5)
Delay1ms(10)
write_date(0x30+A6)
Delay1ms(10)
write_date(0x30+A7)
Delay1ms(10)
write_date(0x30+A8)
Delay1ms(10)
write_date(0x30+A9)
Delay1ms(10)
write_date(0x30+A10)
Delay1ms(10)
write_date('.')
Delay1ms(10)
write_date(0x30+A11)
Delay1ms(10)
write_date(0x30+A12)
Delay1ms(10)
}
uchar keyscan()
{
key=16
P3=0xef//P3.7输出1个低电平
temp=P3//读取
temp=temp&0x0f//屏蔽高4位
if(temp!=0x0f)
{
Delay1ms(10)
if(temp!=0x0f)
{
temp=P3
switch(temp)
{
case 0xee:
key=0
break
case 0xed:
key=4
break
case 0xeb:
key=8
break
case 0xe7:
key=12
break
}
while(temp!=0x0f)
{
temp=P3
temp=temp&0x0f
beep=0
}
beep=1
}
}
P3=0xdf
temp=P3
temp=temp&0x0f
if(temp!=0x0f)
{
Delay1ms(10)
if(temp!=0x0f)
{
temp=P3
switch(temp)
{
case 0xde:
key=1
break
case 0xdd:
key=5
break
case 0xdb:
key=9
break
case 0xd7:
key=13
break
}
while(temp!=0x0f)
{
temp=P3
temp=temp&0x0f
beep=0
}
beep=1
}
}
P3=0xbf
temp=P3
temp=temp&0x0f
if(temp!=0x0f)
{
Delay1ms(10)
if(temp!=0x0f)
{
temp=P3
switch(temp)
{
case 0xbe:
key=2
break
case 0xbd:
key=6
break
case 0xbb:
key=10
break
case 0xb7:
key=14
break
}
while(temp!=0x0f)
{
temp=P3
temp=temp&0x0f
beep=0
}
beep=1
}
}
P3=0x7f
temp=P3
temp=temp&0x0f
if(temp!=0x0f)
{
Delay1ms(10)
if(temp!=0x0f)
{
temp=P3
switch(temp)
{
case 0x7e:
key=3
break
case 0x7d:
key=7
break
case 0x7b:
key=11
break
case 0x77:
key=15
break
}
while(temp!=0x0f)
{
temp=P3
temp=temp&0x0f
beep=0
}
beep=1
}
}
return(key)
}
void main()
{ while(1)
{
c=1
while(c<6)//输入第1个5 位数
{
keyval=keyscan()
if(keyval<10)
{
switch(c)
{
case 1:b1=keyval break
case 2:b2=keyval break
case 3:b3=keyval break
case 4:b4=keyval break
case 5:b5=keyval break
}
c++
}
display1(b1,b2,b3,b4,b5)
}
while(c==6) //输入计算符号
{
keyval=keyscan()
if((keyval>=10)&&(keyval<14)) //可去一层括号,因逻辑运算优先级较低
{
d=keyval
}
c=1
display3(d)
}
while(c<6) //输入第2个5 位数
{
keyval=keyscan()
if(keyval<10)
{
switch(c)
{
case 1:d1=keyval break
case 2:d2=keyval break
case 3:d3=keyval break
case 4:d4=keyval break// 除
case 5:d5=keyval break
}
c++
}
display2(d1,d2,d3,d4,d5)
}
bb= b1*10000+b2*1000+b3*100+b4*10+b5
dd=d1*10000+d1*1000+d3*100+d4*10+d5
while(keyval!=14) //等待按下"="
{
keyval=keyscan()
}
Delay1ms(10)
switch(d)
{
case 10:ee=bb+dd break//+
case 11:
flag1=1
if(bb>=dd)
{
ee=bb-dd //-
flag1=0
}
else ee=dd-bb
break
case 12:ee=bb*dd break//*可能会溢出
case 13:ee=bb/dd //除法小数部分会丢失,保留2位
ff=bb%dd
fd1=ff*10/dd
fd2=ff*100/dd%10
break
}
f10=ee/1000000000%10
f9=ee/100000000%10
f8=ee/10000000%10
f7=ee/1000000%10
f6=ee/100000%10
f5=ee/10000%10
f4=ee/1000%10
f3=ee/100%10
f2=ee/10%10
f1=ee%10
display4(f10,f9,f8,f7,f6,f4,f4,f3,f2,f1,fd1,fd2)
while(keyval!=15)
{
keyval=keyscan()
}
b1=0b2=0b3=0b4=0b5=0
d1=0d2=0d3=0d4=0d5=0
bb=0dd=0ee=0
init2()
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)