亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
12下一頁(yè)
最近訪問(wèn)板塊 發(fā)新帖
查看: 6177 | 回復(fù): 16
打印 上一主題 下一主題

[原創(chuàng)] 表達(dá)式求值程序 by AWK  關(guān)閉 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2006-04-13 20:50 |只看該作者 |倒序?yàn)g覽
今天看到論壇中有人問(wèn): awk如何計(jì)算命令行的輸入?
仔細(xì)想了想用awk確實(shí)不好做。因?yàn)閍wk中沒(méi)有像其它語(yǔ)言
中的eval函數(shù),于是自己試著編了一個(gè)eval函數(shù),用來(lái)進(jìn)
行表達(dá)式求值。
   用stack對(duì)運(yùn)算符號(hào)及數(shù)值進(jìn)行處理是這個(gè)腳本的關(guān)鍵。
由于時(shí)間有限,我只實(shí)現(xiàn)了+-*/%五種運(yùn)算。代碼寫的比較
粗糙,歡迎大家批評(píng)指正。


用法(表達(dá)式必須以"@"結(jié)束):


  1. echo "(3-1)*2.3-8.5%3-(9.12+2*3)/2@" | awk -f eval
  2. echo 1+2+3*2 @| awk -f eval
  3. awk -f eval <( seq 1 100|tr "\n" "+"|sed 's/+/@/100' )
復(fù)制代碼



代碼:


  1. #! /usr/bin/awk
  2. # simple expression evaluator awk version
  3. # author : dbcat at chinaunix.net
  4. # email: deeperbluecat@gmail.com
  5. # usage: example :
  6. # echo "(3-1)*2.3-8.5%3-(9.12+2*3)/2@" | awk -f eval
  7. # echo 1+2+3*2 @| awk -f eval
  8. # awk -f eval <( seq 1 100|tr "\n" "+"|sed 's/+/@/100' )
  9. # expression must be end with "@"
  10. # have fun




  11. BEGIN{

  12. # 運(yùn)算符集合
  13. symbol="+-*%/()@";


  14. # 構(gòu)造運(yùn)算符優(yōu)先級(jí)關(guān)系
  15. oppr["++"]=">";oppr["+-"]=">";oppr["+*"]="<";oppr["+/"]="<";oppr["+%"]="<";oppr["+("]="<"; oppr["+)"]=">";oppr["+@"]=">";
  16. oppr["-+"]=">";oppr["--"]=">";oppr["-*"]="<";oppr["-/"]="<";oppr["-%"]="<";oppr["-("]="<"; oppr["-)"]=">";oppr["-@"]=">";
  17. oppr["*+"]=">";oppr["*-"]=">";oppr["**"]=">";oppr["*/"]=">";oppr["*%"]="<";oppr["*("]="<"; oppr["*)"]=">";oppr["*@"]=">";
  18. oppr["/+"]=">";oppr["/-"]=">";oppr["/*"]=">";oppr["//"]=">";oppr["/%"]="<";oppr["/("]="<"; oppr["/)"]=">";oppr["/@"]=">";
  19. oppr["%+"]=">";oppr["%-"]=">";oppr["%*"]=">";oppr["%/"]=">";oppr["%%"]=">";oppr["%("]="<"; oppr["%)"]=">";oppr["%@"]=">";
  20. oppr["(+"]="<";oppr["(-"]="<";oppr["(*"]="<";oppr["(/"]="<";oppr["(%"]="<";oppr["(("]="<"; oppr["()"]="=";
  21. oppr[")+"]=">";oppr[")-"]=">";oppr[")*"]=">";oppr[")/"]=">";oppr[")%"]=">";                oppr["))"]=">";oppr[")@"]=">";
  22. oppr["@+"]="<";oppr["@-"]="<";oppr["@*"]="<";oppr["@/"]="<";oppr["@("]="<";oppr["@%"]="<";                oppr["@@"]="=";


  23. }



  24. {
  25.    gsub(/[-*%+()/@]/," & ",$0);
  26.    expression=$0;
  27. }



  28. END{
  29. # 分解表達(dá)式
  30. split(expression,Ex," ");

  31. print evaluate(Ex);

  32. }






  33. # 表達(dá)式求值函數(shù)

  34. function evaluate(Ex,OP,OF,c,k,t,x,str,y,r)
  35. {
  36.     k=1;
  37.     push(OP,"@");
  38.     c=Ex[k];
  39.     while(c!="@" || gettop(OP)!="@")
  40.       {
  41.         if(index(symbol,c)==0)
  42.           {         
  43.             push(OF,c);
  44.             k=k+1;
  45.             c=Ex[k];
  46.             
  47.           }else
  48.           {
  49.             t=priority(oppr,gettop(OP),c);
  50.             if(t=="<")
  51.              {
  52.                push(OP,c);
  53.                k=k+1;
  54.                c=Ex[k];
  55.                
  56.              }else if(t=="=")
  57.              {

  58.                pop(OP);
  59.                k=k+1;
  60.                c=Ex[k];
  61.              }else{
  62.                
  63.                str=pop(OP);
  64.                y=pop(OF);
  65.                x=pop(OF);
  66.                r=calculate(x,str,y);
  67.                push(OF,calculate(x,str,y));
  68.      
  69.             }
  70.         
  71.           }

  72.       }
  73.   return gettop(OF);
  74. }


  75. # 二元運(yùn)算函數(shù)

  76. function calculate(x,st,y)
  77. {
  78.     if(st=="+")
  79.       return x+y;
  80.     else if(st=="-")
  81.       return x-y;
  82.     else if(st=="*")
  83.       return x*y;
  84.     else if(st=="%")
  85.       return x%y;
  86.     else if(st=="/")
  87.       return x/y;
  88. }


  89. # 優(yōu)先級(jí)別比較

  90. function priority(oppr,op1,op2)
  91. {
  92.    return oppr[op1""op2];
  93. }


  94.   # 取棧頂

  95. function gettop(arr,k,t)
  96. {
  97.     k=0;
  98.     for(t in arr)
  99.      {
  100.         k++;
  101.      }
  102.     return arr[k-1];
  103. }

  104. #  進(jìn)棧函數(shù)

  105. function push(arr,x,t,k)
  106. {
  107.   k=0;
  108.   for(t in arr)
  109.    {
  110.       k++;
  111.    }
  112. arr[k]=x;

  113. }

  114. #  出棧函數(shù)

  115. function pop(arr,va,t,u)
  116. {
  117.   u=0;
  118.   for(t in arr)
  119.     {
  120.       u++;
  121.     }
  122.   va=arr[u-1];
  123.   delete arr[u-1];
  124.   return va;
  125. }


復(fù)制代碼

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2006-04-13 21:01 |只看該作者
dbcat你真厲害!

我也問(wèn)了一個(gè)問(wèn)題:
我知道怎么逐行讀取一個(gè)文件,但怎么逐字讀取一個(gè)文件?

幫幫我。

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2006-04-13 21:06 |只看該作者
你想干蝦米?

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2006-04-13 21:11 |只看該作者
原帖由 dbcat 于 2006-4-13 21:06 發(fā)表
你想干蝦米?

我想知道方法。暫時(shí)還沒(méi)想到有什么用,是一個(gè)字符一個(gè)字符地去讀,就是相當(dāng)于:
cat 1.txt>2.txt的功能。

[ 本帖最后由 xlink 于 2006-4-13 21:14 編輯 ]

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2006-04-13 21:14 |只看該作者
我猜用dd可以

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2006-04-13 21:24 |只看該作者
原帖由 dbcat 于 2006-4-13 21:14 發(fā)表
我猜用dd可以

dd好象是用來(lái)cp文件的,我不是想去cp一個(gè)文件。
如果把一個(gè)文件全部讀進(jìn)一組變量里,你想想,多好的事情。

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2006-04-13 22:21 |只看該作者
謝謝 dbcat 費(fèi)心寫出的這個(gè)函數(shù),我在windows下只有 GAWK 能夠通過(guò), awk95、nawk、mawk 都不能通過(guò)。
你的代碼我現(xiàn)在還看不懂,看來(lái)我自己是不能通過(guò)簡(jiǎn)單修改來(lái)滿足最初的需求了。先收藏起來(lái),努力學(xué)習(xí)吧。

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2006-04-13 23:02 |只看該作者
原帖由 xlink 于 2006-4-13 21:24 發(fā)表

dd好象是用來(lái)cp文件的,我不是想去cp一個(gè)文件。
如果把一個(gè)文件全部讀進(jìn)一組變量里,你想想,多好的事情。


dd是可以的,小弟試了一下,不過(guò)又缺陷

  1. #  while char=`dd bs=1 count=1 2>/dev/null`; do echo $char; done <file
復(fù)制代碼

由于小弟學(xué)藝不精,導(dǎo)致當(dāng)dd讀完了整個(gè)文件后,還在繼續(xù)讀,望高手指點(diǎn)

用awk實(shí)現(xiàn)了一下,請(qǐng)?jiān)囋?br />

  1. # awk 'BEGIN { FS="" } { for (i=1;i<=NF;i++) print $i }' file
復(fù)制代碼

論壇徽章:
1
榮譽(yù)會(huì)員
日期:2011-11-23 16:44:17
9 [報(bào)告]
發(fā)表于 2006-04-14 11:19 |只看該作者
dbcatMM is A awk's master ~ ^_^

論壇徽章:
0
10 [報(bào)告]
發(fā)表于 2006-04-14 11:42 |只看該作者
如果把乘階運(yùn)算符“^” , 和"sin cos exp ...." 加進(jìn)去就好了
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP