怎样编程简单的计算器程序?

怎样编程简单的计算器程序?,第1张

这种运算比较麻烦,不过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()

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/11340913.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-15
下一篇2023-05-15

发表评论

登录后才能评论

评论列表(0条)

    保存