規范化以下PB代碼,加入足夠注釋,提交格式化后的txt文本
GetExpVal.srf
//得到符合運算式字串的值,各單詞用空格隔開,
//并且是一個正確的運算式,免去對錯誤校驗的代碼
//引數說明:
//ai_how_getvar=0 從GCFYB中的FYVAL
//ai_how_getvar=1 從GCFYB中的tempVAL
//ai_how_getvar=2 從gds_number_varb中的FYVAL
//回傳為空表示錯誤
string ls_wordarr[],ls_sharestack[]
string ls_wordtype,ls_wordstr,ls_temp,ls_wordfxmes
integer li_wordnum,opndtop,optrtop,li_wordcount,li_pos
dec{6} ld_cval
IF isNull(as_expstr) OR trim(as_expstr)='' THEN
RETURN 0
END IF
IF right(as_expstr,1)<>' ' THEN as_expstr+=' '
li_wordnum=0
li_pos=pos(as_expstr,' ')
DO WHILE li_pos>1
ls_wordstr=left(as_expstr,li_pos -1)
CHOOSE CASE ls_wordstr
CASE '+','-','*','/','!','(',')','=','>','<','>=','<=','<>','NOT','AND','OR'
ls_wordtype='符號'
CASE ELSE
IF IsNumber(ls_wordstr) THEN
ls_wordtype='數字'
ELSE
IF right(ls_wordstr,1)=')' THEN
ls_wordtype='函式'
ELSE
ls_wordtype='變數'
END IF
END IF
END CHOOSE
li_wordnum++
ls_wordarr[li_wordnum*2]=ls_wordstr
ls_wordarr[li_wordnum*2 -1]=ls_wordtype
as_expstr=replace(as_expstr,1,li_pos,'')
li_pos=pos(as_expstr,' ')
LOOP
ls_sharestack[li_wordnum+2]='#' //左邊為符號堆疊,堆疊底為句子括號#,右邊為運算量堆疊
opndtop=0
optrtop=li_wordnum+2
FOR li_wordcount=1 TO li_wordnum+1
IF li_wordcount=li_wordnum+1 THEN
ls_wordtype='符號'
ls_wordstr='#'
ELSE
ls_wordtype=ls_wordarr[li_wordcount*2 -1]
ls_wordstr=ls_wordarr[li_wordcount*2]
END IF
CHOOSE CASE ls_wordtype
CASE '變數'
//查找變數的值
IF ai_how_getvar=0 THEN
ls_wordstr=gwf_getvar_from_dw_gcfy(ls_wordstr,0)
ELSEIF ai_how_getvar=1 THEN
ls_wordstr=gwf_getvar_from_dw_gcfy(ls_wordstr,1)
ELSE
ls_wordstr=string(uf_getvarval_from_gds(ls_wordstr))
END IF
IF isNull(ls_wordstr) THEN
SetNull(ld_cval)
RETURN ld_cvalEND IF
opndtop++
ls_sharestack[opndtop]=ls_wordstr
CASE '數字'
opndtop++
IF right(ls_wordstr,1)='%' THEN
ls_wordstr=string(dec(left(ls_wordstr,len(ls_wordstr) -1))/100)
ELSEIF right(trim(ls_wordstr),2)='%' THEN
ls_wordstr=string(dec(left(ls_wordstr,len(ls_wordstr) -2))/100)
END IF
ls_sharestack[opndtop]=ls_wordstr
CASE '符號'
IF ls_wordstr='-' THEN
IF li_wordcount=1 THEN ls_wordstr='!'
IF li_wordcount>1 THEN
IF ls_wordarr[li_wordcount*2 -2]='(' THEN ls_wordstr='!'
END IF
END IF
CHOOSE_ENTRY:
ls_wordfxmes=precede(ls_sharestack[optrtop],ls_wordstr)
CHOOSE CASE ls_wordfxmes
CASE '>'
CHOOSE CASE ls_sharestack[optrtop]
CASE '!'
ls_sharestack[opndtop]=string( -dec(ls_sharestack[opndtop]))
CASE '+'
opndtop --
ls_sharestack[opndtop]=string(dec(ls_sharestack[opndtop])+&
dec(ls_sharestack[opndtop+1]))
CASE '-'
opndtop --
ls_sharestack[opndtop]=string(dec(ls_sharestack[opndtop])-&
dec(ls_sharestack[opndtop+1]))
CASE '*'
opndtop --
ls_sharestack[opndtop]=string(dec(ls_sharestack[opndtop])*&
dec(ls_sharestack[opndtop+1]))
CASE '/'
IF dec(ls_sharestack[opndtop])=0 THEN
MessageBox('錯誤','除零錯誤!')
SetNull(ld_cval)
RETURN ld_cval
END IF
opndtop --
ls_sharestack[opndtop]=string(dec(ls_sharestack[opndtop])/&
dec(ls_sharestack[opndtop+1]))
CASE '='
opndtop --
IF dec(ls_sharestack[opndtop])=dec(ls_sharestack[opndtop+1]) THEN
ls_sharestack[opndtop]='1'
ELSE
ls_sharestack[opndtop]='0'
END IF
CASE '>'
opndtop --
IF dec(ls_sharestack[opndtop])>dec(ls_sharestack[opndtop+1]) THEN
ls_sharestack[opndtop]='1'
ELSE
ls_sharestack[opndtop]='0'
END IF
CASE '<'
opndtop --
IF dec(ls_sharestack[opndtop])<dec(ls_sharestack[opndtop+1]) THEN
ls_sharestack[opndtop]='1'
ELSE
ls_sharestack[opndtop]='0'
END IF
CASE '>='
opndtop --
IF dec(ls_sharestack[opndtop])>=dec(ls_sharestack[opndtop+1]) THEN
ls_sharestack[opndtop]='1'
ELSE
ls_sharestack[opndtop]='0'
END IF
CASE '<='
opndtop --
IF dec(ls_sharestack[opndtop])<=dec(ls_sharestack[opndtop+1]) THEN
ls_sharestack[opndtop]='1'
ELSE
ls_sharestack[opndtop]='0'
END IF
CASE '<>'
opndtop --
IF dec(ls_sharestack[opndtop])<>dec(ls_sharestack[opndtop+1]) THEN
ls_sharestack[opndtop]='1'
ELSE
ls_sharestack[opndtop]='0'
END IF
CASE 'NOT'
IF dec(ls_sharestack[opndtop])=0 THEN
ls_sharestack[opndtop]='1'
ELSE
ls_sharestack[opndtop]='0'
END IF
CASE 'AND'
IF dec(ls_sharestack[opndtop])*dec(ls_sharestack[opndtop+1])=0 THEN
ls_sharestack[opndtop]='0'
ELSE
ls_sharestack[opndtop]='1'
END IF
CASE 'OR'
IF dec(ls_sharestack[opndtop])+dec(ls_sharestack[opndtop+1])=0 THEN
ls_sharestack[opndtop]='0'
ELSE
ls_sharestack[opndtop]='1'
END IF
END CHOOSE
optrtop++
GOTO CHOOSE_ENTRY
CASE '='
IF ls_wordstr=')' THEN optrtop++
CASE '<'
optrtop --
ls_sharestack[optrtop]=ls_wordstr
CASE ELSE
MessageBox("","求值錯誤!")
SetNull(ld_cval)
RETURN ld_cval
END CHOOSE
CASE '函式'
opndtop++
ls_wordstr=gf_replace_fun_var(ls_wordstr,ai_how_getvar) //將函式的變數替換成值
ls_sharestack[opndtop]=string(gf_exec_fun(ls_wordstr,ai_how_getvar))
END CHOOSE
NEXT
RETURN dec(ls_sharestack[1]) //回傳堆疊底的值
uj5u.com熱心網友回復:
里面的代碼有錯誤嗎?有空試一下轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/36587.html
標籤:基礎類
上一篇:新手 求教 PB代碼
