1樓:匿名使用者
這種運算比較麻煩,不過4種運算子號優先順序相同應該簡單寫,我這裡有個演算法,能進行簡單的四則運算,delphi的,供參考
function math_evaluate(s0:string):extended;
function evaluate(s0:string):extended;forward;
procedure cleanup(var s0:string);
vari: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:integer;s0:string):integer;
const
sopps:string=('+-*/^');
vari: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 resultexit;
end;
if result>tot then
result:=0;
end;
function specialf(p1:integer;s0:string):extended;
varoperstr: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)
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:integer;s0:string);
varj,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:integer;s0:string):extended;
varv1,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;
varp1,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
trycleanup(s0);
result:=evaluate(s0);
except
result:=0;
end;
end;
2樓:匿名使用者
#include
#include
#include
#include
#define maxqsize 80
float qlist[maxqsize],qlist1[maxqsize],qlist2[maxqsize]; //定義三個全域性佇列
int front=0,rear=0,front1=0,front2=0,rear1=0,rear2=0,count=0,count1=0,count2=0;//定義三個佇列頭結點、尾結點、資料個數
main()
count++;
qlist[rear]=*c;
rear=(rear+1)%maxqsize;
break;}
case '-':
count++;
qlist[rear]=*c;
rear=(rear+1)%maxqsize;
break;}
case '=':
pop(); //顯示結果
break;
case 'c':
clearstack();
break;
case 'q':
clearstack();
exit(1);
default:
enter(atof(c));
break;}}
return 0;
}void enter(float num) //將資料入第二個佇列
count1++;
qlist1[rear1]=num;
rear1=(rear1+1)%maxqsize;
}void clearstack() //將三個佇列清空
void pop() //顯示結果
if(count!=0 && temp=='s')
sum=sqrt(qlist2[front2]);
if(count!=0 && temp=='n')
sum=sin(qlist2[front2]);
if(count!=0 && temp=='o')
sum=cos(qlist2[front2]);
printf("%f",sum);
}float qfront(float num1,float num2,char *temp)
else
break;
case '-':
if(count2==0)
else
break;
case '*':
if(count2==0) //如果第三個佇列中沒有資料,則從第二個佇列中讀出一個資料
else //否則,從第三個佇列中讀出資料
break;
case '/':
if(count2==0)
else
}else
else
}break;
case 's':
if(count2==0)
else
break;
case 'n':
if(count2==0)
else
break;
case 'o':
if(count2==0)
else
break;
}return number;
}float qfront1() //從第一個資料讀資料
temp=qlist1[front1];
count1--;
front1=(front1+1)%maxqsize;
return temp;
}void qinsert(float number) //將結果存入第三個佇列
count2++;
qlist2[rear2]=number;
rear2=(rear2+1)%maxqsize;
}其實這個程式用連結串列實現更好,但是由於時間關係,所以用了陣列。當然,這個程式還不是很完善,還有很多地方需要改進,比如可以用圖形介面來進行操作、可以將三個佇列放入一個結構體中等。
vb程式設計設計題 紅綠燈,VB程式設計設計題 紅綠燈
如圖在窗體上新增 1 四個shape控制元件,作為燈框 紅燈 黃燈 綠燈,分別命名為 lampbox redlamp yellowlamp greenlamp 2 一個命令按鈕,命名為 cmdrun,標題為 啟動 3 三個文字框控制元件,來設定紅燈 黃燈 綠燈亮的時間 秒 分別命名為 txtredt...
c 程式設計,設計最多可存放10整數的類,要求將資料從小到大排列存放在類中的陣列中
巨潤利 include include using namespace std class myint void del int n void inst int n int i 0 while n num i i cnt i for int j cnt j i j num i n cnt int g...
C 物件導向程式設計設計電視機類要求1) 電
這個很簡單的啊。h檔案 class ctv cpp檔案 int ctv m inum 0 ctv ctv string strtype m strtype strtype int ctv getnum conststring ctv gettvtype const main測試程式 int main...