| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 403 人关注过本帖
标题:[求助]大家快来帮个忙啊,急!
取消只看楼主 加入收藏
裂羽
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-1-12
收藏
 问题点数:0 回复次数:2 
[求助]大家快来帮个忙啊,急!
做了一个计算器,实验报告中的数据分析和算法分析该怎么样写啊???我都快愁死了,各位大哥大姐帮帮忙啊,小弟不胜感激。计算器程序如下,如有错误希望大哥大姐指出,谢谢
搜索更多相关主题的帖子: 计算器 分析 不胜感激 实验报告 大哥 
2007-01-12 16:50
裂羽
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-1-12
收藏
得分:0 

interface

uses
classes,sysutils;

type
TJStack=class
private
Lines:TStrings;
public
constructor Create;
destructor Destroy;
procedure init;
procedure push(s:string);
function GetTop:String;
function Pop:String;
end;
TJExpr=class
private
Expr:String;
Position:Integer;
Min,max:Integer;
Eof:Boolean;
public
constructor Create(pExpr:String);
function read:String;
procedure GoFirst;
end;

function CalcExpr(sExpr:String):String;
function CalcExprItem(sOptr,sA,sB:String):String;
function OptrIndex(w:string):Integer;
function GetParamCount(pFunc:String):Integer;
function ExecFunc(pFunc:String;pParam:Array of string;pParamCount:Integer):string;

implementation

constructor TJStack.Create;
begin
inherited Create;
lines:=TStringList.create;
end;

procedure TJStack.init;
begin
lines.free;
end;

destructor TJStack.Destroy;
begin
lines.free;
inherited Destroy;
end;

procedure TJStack.push(s:string);
begin
lines.add(s);
end;

function TJStack.GetTop:String;
begin
if Lines.count>0 then
Result:=lines[lines.count-1]
else
Result:='';
end;

function TJStack.Pop:String;
begin
if Lines.Count>0 then
begin
Result:=GetTop;
lines.delete(lines.count-1);
end
else
Result:='';
end;

//////////////////////TJExpr////////////////

constructor TJExpr.Create(pExpr:String);
begin
Expr:=lowercase(pExpr)+'#';
Min:=1;
Max:=length(Expr);
Position:=1;
Eof:=false;
end;

function TJExpr.read:String;
function SameType(s1,s2:string):boolean;
var
c1,c2:string;
begin
c1:='';c2:='';
if length(s1)>0 then c1:=s1[length(s1)];
if length(s2)>0 then c2:=s2[Length(s2)];
if ((pos(c1,'0123456789.')>0) and (pos(c2,'0123456789.')>0))
then
begin
result:=true;
end
else
begin
Result:=false;
end;
if (c1='-')and(c2='-') then Result:=false;
if s1+s2='>=' then Result:=true;
if s1+s2='<=' then Result:=true;
if s1+s2='<>' then Result:=true;
if pos(s1+s2,'max(')>0 then Result:=true;
if pos('-',s1+s2)>1 then Result:=false;
if (s1='')or(s2='') then result:=true;
end;
begin
if Position<=Max then
begin
Result:=trim(Expr[Position]);
Inc(Position);
while Position<=Max do
begin
if SameType(Result,Expr[Position]) then
begin
Result:=Result+trim(Expr[Position]);
Inc(Position);
end
else
begin
exit;
end;
end;
end
else
begin
Result:='';
Eof:=true;
end;
end;

procedure TJExpr.GoFirst;
begin
Position:=1;
Eof:=false;
end;

/////////////////////////////////////////

function DiffOptr(a,b:string):Integer;
const
sa:array [1..17,1..17] of
integer=(
// + - * / ( ) # > < >= <= = <> & : , max(
{+}(2 ,2 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{-}(2 ,2 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{*}(2 ,2 ,2 ,2 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{/}(2 ,2 ,2 ,2 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{(}(0 ,0 ,0 ,0 ,0 ,1 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0),
{)}(2 ,2 ,2 ,2 ,1 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,1),
{#}(0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0),
{>}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{<}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{>=}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{<=}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{=}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{<>}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,2 ,0),
{&}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,2 ,2 ,2 ,0),
{:}(0 ,0 ,0 ,0 ,0 ,2 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,2 ,2 ,0),
{,}(0 ,0 ,0 ,0 ,0 ,1 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0),
{max(}(0 ,0 ,0 ,0 ,0 ,1 ,2 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0 ,0)
);
var
aIndex,bIndex:integer;
begin
aIndex:=OptrIndex(a);
bIndex:=OptrIndex(b);
if (aIndex>0)and(bIndex>0) then
Result:=sa[aIndex,bIndex]-1
else
Result:=1;
end;

function CalcExpr(sExpr:String):String;
var
optr,opnd:TJStack;
w,theta,a,b:string;
position:integer;
jexpr:TJExpr;
sParam:array[1..20] of string;
sFunc:String;
i,nParamCount:integer;
begin
jexpr:=TjExpr.Create(sExpr);
optr:=TJStack.create;
opnd:=TJStack.create;
optr.push('#');
w:=jexpr.read;
while (not ((w='#')and(optr.GetTop='#'))) and (jexpr.Eof =false) do
begin
if OptrIndex(w)<0 then
begin
opnd.push(w);
w:=jexpr.read;
end
else
begin
Case DiffOptr(optr.GetTop,w) of
-1://<
begin
optr.push(w);
w:=jexpr.read;
end;
0://=
begin
sFunc:=optr.pop;
if sFunc<>'(' then
begin
nParamCount:=1;
while sFunc=',' do
begin
Inc(nParamCount);
sFunc:=optr.pop;
end;
if GetParamCount(sFunc)=0 then nParamCount:=0;
for i:=1 to nParamCount do sParam[i]:=opnd.Pop;
opnd.push(ExecFunc(sFunc,sParam,nParamCount));
end;
w:=jexpr.read;
end;
1://>
begin
theta:=optr.pop;
b:=opnd.pop;
a:=opnd.pop;
opnd.push(CalcExprItem(theta,a,b));
end;
end;
end;
end;
Result:=opnd.GetTop;
opnd.free;
optr.free;
end;

function CalcExprItem(sOptr,sA,sB:String):String;
begin
if sOptr='+' then
begin
if (sA<>'')and(sB<>'') then
begin
Result:=floattostr(strtofloat(sA)+strtofloat(sB));
end
else
begin
Result:=sA+sB;
if Result='' then Result:='0';
end;
exit;
end;
if sOptr='-' then
begin
if sA='' then
Result:=floattostr(-strtofloat(sB))
else
Result:=floattostr(strtofloat(sA)-strtofloat(sB));
exit;
end;
if sOptr='*' then
begin
Result:=floattostr(strtofloat(sA)*strtofloat(sB));
exit;
end;
if sOptr='/' then
begin
Result:=floattostr(strtofloat(sA)/strtofloat(sB));
exit;
end;
if sOptr='>' then
begin
if strtofloat(sA)>strtofloat(sB) then
Result:='1'
else
Result:='0';
exit;
end;
if sOptr='<' then
begin
if strtofloat(sA)<strtofloat(sB) then
Result:='1'
else
Result:='0';
exit;
end;
if sOptr='>=' then
begin
if strtofloat(sA)>=strtofloat(sB) then
Result:='1'
else
Result:='0';
exit;
end;
if sOptr='<=' then
begin
if strtofloat(sA)<=strtofloat(sB) then
Result:='1'
else
Result:='0';
exit;
end;
if sOptr='=' then
begin
if strtofloat(sA)=strtofloat(sB) then
Result:='1'
else
Result:='0';
exit;
end;
if sOptr='<>' then
begin
if strtofloat(sA)<>strtofloat(sB) then
Result:='1'
else
Result:='0';
exit;
end;
if sOptr='&' then
begin
if (strtofloat(sA)<>0)and(strtofloat(sB)<>0) then
Result:='1'
else
Result:='0';
exit;
end;
if sOptr=':' then
begin
if strtofloat(sA)=0 then
Result:='0'
else
Result:=sB;
exit;
end;
end;

function GetParamCount(pFunc:String):Integer;
begin
if pFunc='max(' then result:=2;
end;

function OptrIndex(w:string):Integer;
begin
if w='+' then begin result:=1; exit; end;
if w='-' then begin result:=2; exit; end;
if w='*' then begin result:=3; exit; end;
if w='/' then begin result:=4; exit; end;
if w='(' then begin result:=5; exit; end;
if w=')' then begin result:=6; exit; end;
if w='#' then begin result:=7; exit; end;
if w='>' then begin result:=8; exit; end;
if w='<' then begin result:=9; exit; end;
if w='>=' then begin result:=10; exit; end;
if w='<=' then begin result:=11; exit; end;
if w='=' then begin result:=12; exit; end;
if w='<>' then begin result:=13; exit; end;
if w='&' then begin result:=14; exit; end;
if w=':' then begin result:=15; exit; end;
if w=',' then begin result:=16; exit; end;
if w='max(' then begin Result:=17; exit; end;
result:=-1;
end;

function ExecFunc(pFunc:String;pParam:Array of string;pParamCount:Integer):string;
var
tmpFloat:real;
i:integer;
begin
//
if pFunc='max(' then
begin
tmpFloat:=strtofloat(pParam[0]);
for i:=1 to pParamCount-1 do
begin
if tmpFloat<strtofloat(pParam[i]) then
tmpFloat:=strtofloat(pParam[i]);
end;
Result:=floattostr(tmpFloat);
end;
end;

end.

2007-01-12 16:53
裂羽
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2007-1-12
收藏
得分:0 

为什么没人回我的帖子啊????

2007-01-12 20:50
快速回复:[求助]大家快来帮个忙啊,急!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.048058 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved