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

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

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 9081 | 回復(fù): 6
打印 上一主題 下一主題

字符串表達(dá)式 計算表達(dá)式 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-08-09 17:08 |只看該作者 |倒序瀏覽
calc.exe   v1*v1+v2*v3   10  20  30  40
           calc.exe : 程序名
v1*v1+v2*v3 : 字符串表達(dá)式
10  20  30  40 : 4個參數(shù)

最重要的是把字符串表達(dá)式v1*v1+v2*v3 轉(zhuǎn)化成計算表達(dá)式,現(xiàn)在沒有什么可行的思路, 請各位給點指導(dǎo),謝謝。

論壇徽章:
0
2 [報告]
發(fā)表于 2011-08-09 17:13 |只看該作者
沒太明白

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
3 [報告]
發(fā)表于 2011-08-09 17:24 |只看該作者
本帖最后由 yulihua49 于 2011-08-09 17:51 編輯
calc.exe   v1*v1+v2*v3   10  20  30  40
           calc.exe : 程序名
v1*v1+v2*v3 : 字符串表達(dá)式 ...
jz1043 發(fā)表于 2011-08-09 17:08


哈哈,我有類似的玩意兒。
不過,變量是項號,可以理解為數(shù)組下標(biāo)。

  1. 2. 字典編寫規(guī)則

  2.         ① 基本運(yùn)算符

  3.             ()
  4.             算術(shù)運(yùn)算符:         +, -, *, /, %  ( 優(yōu)先級 )
  5.             邏緝運(yùn)算符:         =, <=, >=, <>, !=,
  6.                                 &,|
  7.                                 :?

  8.         ② 基本格式

  9.             每行由兩部分組成,前半部份為表達(dá)式, 由分號隔開的后半部份
  10.             為格式說明, '#'后可跟注釋,如需打印#,可用\#.


  11.             1. 算術(shù)表達(dá)式

  12.                算術(shù)表達(dá)式可由三種最基本的表達(dá)式組成

  13.                (1)    a1,a2,a3,a4,a5, n 尾標(biāo)
  14.                       ┃          ┃  ┃
  15.                       ┗━━┳━━━┛  ┗━━━━━━━━┓
  16.                            ┃                        ┃
  17.                            ┃                        ┃
  18.                            ┃                        ┃
  19.                          索引標(biāo)記                     項號

  20.                索引標(biāo)記: 由字母或數(shù)字構(gòu)成, 若含有 + - * / % , \
  21.                                  應(yīng)前置 \ 引導(dǎo).
  22.                        項    號: 由數(shù)字構(gòu)成.
  23.                        尾    標(biāo): 由一個字母構(gòu)成 a - z, A - Z.
  24.                (2)    nL
  25.                     字典用存儲變量. 詳見存儲規(guī)則
  26.                (3) 浮點表達(dá)式, 代表立即數(shù). 例: 0.5, -5e10.
  27.     2. 條件表達(dá)式

  28.             單行條件表達(dá)式:
  29.                若e1, e2和e3是三個算術(shù)表達(dá)式, 則在條件表達(dá)式
  30.                        e1?e2:e3
  31.                e1的格式:變量或數(shù)值 操作符 變量或數(shù)值 邏輯操作符 ...
  32.                中, 首先計算e1的值, 若非零(真), 則計算e2的值, 并且此值就是該表達(dá)
  33.                式的值; 否則, 計算e3的值, 并且此值就是該表達(dá)式的值. e2和e3僅有一
  34.                個被求值.  e2 和 e3 含有格式說明.

  35.             多行條件表達(dá)式:
  36.                        條件表達(dá)式?
  37.                         條件為真的語句
  38.                        :
  39.                         條件為假的語句
  40.                        $
  41.                        條件表達(dá)式?
  42.                         條件為真的語句
  43.                        :第二個條件表達(dá)式?       # else if,可以有多個
  44.                         第二個條件為真的語句
  45.                        :                         # 可以沒有
  46.                         條件為假的語句
  47.                        $

  48.            條件表達(dá)式可以嵌套使用。

  49.             3. 輸出格式規(guī)則

  50.                若表達(dá)式后跟有分號, 則表明本行字典值要輸出. 格式為 ;m.n
  51.                其中: m 為保留小數(shù)位數(shù)
  52.                      無n時m:為小數(shù)點左移位數(shù).
  53.                   n 為舍入規(guī)則
  54. n: 0-- 遇0輸出0 四舍五入.
  55.    以下遇0輸出空
  56.    1-- 向-舍入.
  57.    2-- 向+舍入.
  58.    3-- 向0舍入.
  59.    4-- 只入.
  60.    5-- 四舍五入.
  61.    無- 小數(shù)點左移m位,四舍五入.  為加權(quán)四舍五入.
  62.                 例:
  63.                      3450.495;2.5
  64.                      3450.50

  65.                      3450.495;2
  66.                      34.50

  67.                      3450.50;2
  68.                      34.51

  69.                     ;g float format
  70.                     ;y: 年
  71.                     ;m: 月
  72.                     ;d: 日
  73.                     ;w: 星期
  74.                     ;Y: 年月日
  75.                     ;j: 季度
  76.                     ;l: 字符串打印小寫
  77.                     ;u: 字符串打印大寫
  78.                     ;n: 不打印

  79.                     ;+m.n  輸出需要+-號
  80.                     ;0m    輸出m位寬, 補(bǔ)前0
  81.                     ; m    輸出m位寬, 補(bǔ)空格
  82.              基本格式之后跟其他字符將被打印出來, 行尾的&表示不換行.

  83.             4. 字典日期

  84.                     D:  日期
  85.                     0D:  數(shù)據(jù)庫日期 本月  幾日
  86.                     1D:  記錄的日
  87.                     2D:  當(dāng)日的日 (程序日期)
  88.                     3D:  當(dāng)年的天數(shù)
  89.                     4D:  程序指定的月份
  90.                     6D:  內(nèi)部日
  91.                     7D:  季度天數(shù)

  92.                 日期表達(dá)式

  93.                     .               當(dāng)日
  94.                     \+1          明天
  95.                     \-1           昨天
  96.                     .\-1.,2D;   昨日日期
  97.                     .L,2D;      月底日
  98.                     . .,4D;     當(dāng)日月份

  99.         ③ 存儲規(guī)則

  100.             字典具有變量存儲功能. 要將某字典行的值存儲, 可寫成 nL=表達(dá)式.
  101.             (其中, n為正整數(shù)),  其中, nL即為變量,其中 0<= n <=9,若超過此
  102.             值,則須用 LABN=n  加以說明. 此說明應(yīng)單獨占一行.


  103.         ④ 缺省規(guī)則

  104.             編寫字典時, 索引標(biāo)記部分的值均可省略, 若某個值缺省, 則其值為
  105.             前一次查找記錄所使用的索引值, 依此類推.


  106.         ⑤ 幾個完整字典行

  107.             LABN=m
  108.             nL=A+B/C+1000.;      #  (即存儲又輸出)
  109.             pL=E+nL              #         (存儲不輸出)
  110.             A?B;:C-D;2.0          #         (若A為真, 則輸出B, 否則輸出C,
  111.                                  #          輸出格式為保留兩位小數(shù), 全舍)

  112.             注: 上例中 A,B,C,D,E 均為算術(shù)表達(dá)式. m,n,p為正整數(shù).

  113.         ⑥ 字典特別說明


  114.             表達(dá)式  項  操作符
  115.             表達(dá)式  [; 格式]
  116.                      ; 輸出

  117.                日期,單位,表名,標(biāo)記,項號

  118.               例如:
  119.               .,1000,kyl,101,1..14;
  120.                                ↑
  121.                              1 至 14 項輸出

  122.               .,1000,byb2,101,1..61=.,1000,yb2,101,1&&-,,qyb2,,1&&;
  123.                                ↑                  ↑          ↑
  124.                        byb2的  1 至 61 項     =    yb2的1 至 61 項 -  qyb2的1 至 61 項

  125.                              ;ABC 輸出 ABC
  126.                              9++14;    9+10+11+12+13+14  之和輸出

  127.               賦值表達(dá)式
  128.                .,1000,kyl,102,19=.,1000,kyl,102,18/17  第 19 項為第 18 項 / 第 17 項


復(fù)制代碼

論壇徽章:
0
4 [報告]
發(fā)表于 2011-08-09 17:25 |只看該作者
首先 程序中 應(yīng)將 字符串表達(dá)式作為第一個參數(shù)傳入進(jìn)行分離 ,然后使其中的變量=其后的參數(shù)吧

論壇徽章:
2
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11
5 [報告]
發(fā)表于 2011-08-09 17:39 |只看該作者
變量替換比較簡單。復(fù)雜的是運(yùn)算符如果有優(yōu)先級,則需要使用棧來實現(xiàn)。沒有優(yōu)先級則簡單。

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
6 [報告]
發(fā)表于 2011-08-09 17:41 |只看該作者
本帖最后由 yulihua49 于 2011-08-09 17:54 編輯
變量替換比較簡單。復(fù)雜的是運(yùn)算符如果有優(yōu)先級,則需要使用棧來實現(xiàn)。沒有優(yōu)先級則簡單。
cobras 發(fā)表于 2011-08-09 17:39



    逆波蘭表達(dá)式。
遞歸棧。

項號替換是回調(diào)函數(shù)。你自己定義如何取得數(shù)據(jù)。

論壇徽章:
15
射手座
日期:2014-11-29 19:22:4915-16賽季CBA聯(lián)賽之青島
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16賽季CBA聯(lián)賽之四川
日期:2017-02-07 21:08:572015年亞冠紀(jì)念徽章
日期:2015-11-06 12:31:58每日論壇發(fā)貼之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-08-04 06:20:00程序設(shè)計版塊每日發(fā)帖之星
日期:2015-07-12 22:20:002015亞冠之浦和紅鉆
日期:2015-07-08 10:10:132015亞冠之大阪鋼巴
日期:2015-06-29 11:21:122015亞冠之廣州恒大
日期:2015-05-22 21:55:412015年亞洲杯之伊朗
日期:2015-04-10 16:28:25
7 [報告]
發(fā)表于 2011-08-09 17:57 |只看該作者
本帖最后由 yulihua49 于 2011-08-09 18:06 編輯
變量替換比較簡單。復(fù)雜的是運(yùn)算符如果有優(yōu)先級,則需要使用棧來實現(xiàn)。沒有優(yōu)先級則簡單。
cobras 發(fā)表于 2011-08-09 17:39

基本的表達(dá)式計算,不包括條件語句的處理。
  1. cat calcu.c
  2. /* @(#) calc.c 1.4 91/04/19 */
  3. #include <stdio.h>
  4. #include <ctype.h>
  5. #include <regex.h>
  6. #include <sdbc.h>

  7. #include "calc.h"

  8. struct args {
  9.         double (*getdata)(int,int,char *[CALCID]);
  10.         int argc;
  11.         char *argv[CALCID];
  12.         char argbuf[130];
  13.         char *cp;
  14. };

  15. /*double getdata(int,char,int,char[CALCID][CALCIDLEN]);*/
  16. static char * setarg(struct args *);
  17. static double cal(double,int,struct args *),F0=0.;

  18. static char Moper_src[]="^[     ]*(-{0,1}[0-9]{1,5})[+][+](-{0,1}[0-9]{1,5})";
  19. static regex_t Moper;
  20. static int regflg=0;
  21. #define MAXREG 5
  22. static regmatch_t pmatch[MAXREG];
  23. /*
  24. static char Moper[] = {
  25. 040,031,03,040,011,027,055,00,01,033,04,020,
  26. 060,071,01,05,030,02,053,030,02,053,074,00,
  27. 027,055,00,01,033,04,020,060,071,01,05,014,
  28. 00,00,064,
  29. 0};
  30. */

  31. static char *__loc1;
  32. //主要函數(shù),getdata是取數(shù)回調(diào)函數(shù)。
  33. double calculator(str,getdata)
  34. char *str;
  35. double (*getdata)(int,int,char *[CALCID]);
  36. {
  37. struct args arg;
  38.         if(!str||*str=='#'||*str==';') return 0.;
  39.         if(!regflg) {
  40.         int ret;
  41.         char errbuf[200];
  42.                 ret=regcomp(&Moper,Moper_src,REG_EXTENDED);
  43.                 if(ret) {
  44.                         regerror(ret,&Moper,errbuf,sizeof(errbuf));
  45.                         fprintf(stderr,"%s\n",errbuf);
  46.                         return 0;
  47.                 }
  48.                 regflg=1;
  49.         }
  50.         arg.getdata=getdata;
  51.         arg.cp=str;
  52.         return(cal(0.,ADD,&arg));
  53. }
  54. //遞歸計算。
  55. static double cal(x,op,arg)
  56. double x;
  57. int op;
  58. register struct args *arg;
  59. {
  60. char *rp;
  61. double tmp;
  62. union {
  63.         int n;
  64.         long l;
  65.         } m;

  66.         if(!*arg->cp) return(calc(x,op,0.));
  67.         tmp=F0,m.l=0;
  68.         do {

  69.                 if(*arg->cp=='('/*)*/) {
  70.                         arg->cp++;
  71.                         tmp=cal(0.,ADD,arg);
  72.                         rp=arg->cp;
  73.                         goto oper;
  74.                 }
  75.                 setarg(arg);
  76.                 if(*arg->cp<=' ') {
  77.                         arg->cp++;
  78.                         if(!*arg->cp) x=calc(x,op,tmp);
  79.                         continue;
  80.                 }
  81.                 m.l=0;
  82.                 if(tolower(*arg->cp)=='c') {
  83.                         tmp=strtod(arg->cp+1,&rp);
  84.                         if(isdigit(*rp)) rp++;
  85.                         if(rp==arg->cp+1) {
  86.                                 arg->cp=++rp;
  87.                                 if(!*rp)  {
  88.                                         x=calc(x,op,tmp);
  89.                                         break;
  90.                                 }
  91.                                 continue;
  92.                         }
  93.                 }
  94.                 else {
  95.                 char right[7];
  96.                 char *p;
  97.                         tmp=strtod(arg->cp,&rp);
  98.                         if(rp!=arg->cp) {
  99.                                 if(isdigit(*rp)) rp++;
  100.                                 if(!arg->getdata) goto oper;
  101.                                 for(p=arg->cp;p<rp;p++) {
  102.                                         if(*p=='.' || *p=='E' || *p=='e') {
  103.                                                 goto oper;
  104.                                         }
  105.                                 }
  106.                         }
  107.                         if(!regexec(&Moper,arg->cp,MAXREG,pmatch,0)) {
  108.                         int i;

  109.                                 p=arg->cp+pmatch[0].rm_eo;
  110.                                 __loc1=arg->cp+pmatch[1].rm_so;// 線程不安全。
  111.                                 i=pmatch[2].rm_eo-pmatch[2].rm_so;
  112.                                 strncpy(right,arg->cp+pmatch[2].rm_so,i);
  113.                                 right[i]=0;

  114. /* XXXXX   1++80  
  115. fprintf(stderr,"calc:left=%s, right=%s\n",lft,right);
  116. */
  117.                            tmp=F0;
  118.                            if(isalpha(*p)) *arg->argv[0]=*p++;
  119.                            else *arg->argv[0]=0;
  120.                             m.l=atoi(right);
  121.                             for(i=atoi(__loc1);i<=m.n;i++) {
  122.                                if(arg->getdata)
  123.                                   tmp+=(*arg->getdata)(i,arg->argc,arg->argv);
  124.                                else tmp+=(double)i;
  125.                             }
  126.                             rp=p;
  127.                         }
  128.                         else {
  129.                            if(*arg->cp) m.l=strtol(arg->cp,&rp,0);
  130.                            if(isalpha(*rp)) *arg->argv[0]=*rp++;
  131.                            else *arg->argv[0]=0;
  132.                            if(arg->getdata) {
  133.                               tmp=(*arg->getdata)(m.n,arg->argc,arg->argv);
  134.                            }
  135.                            else tmp=(double)m.l;
  136.                         }
  137.                 }
  138. oper:
  139.                 if(!*rp) {
  140.                         x=calc(x,op,tmp);
  141.                         arg->cp=rp;
  142.                         break;
  143.                 }
  144.                 while(isspace(*rp)) rp++;
  145.                 switch(*rp) {
  146.                 case '+': m.n=ADD;
  147.                           rp++;
  148.                           break;
  149.                 case '-': m.n=SUBT;
  150.                           rp++;
  151.                           break;
  152.                 case '*': m.n=MUL;
  153.                           rp++;
  154.                           break;
  155.                 case '/': m.n=DIV;
  156.                           rp++;
  157.                           break;
  158.                 case '%': m.n=MOD;
  159.                           rp++;
  160.                           break;
  161. /*
  162.                 case ')':
  163. printf("op=%d,x=%f m.n=%d tmp=%f rp=%s\n",op,x,m.n,tmp,rp);
  164.                           if(*rp) rp++;
  165.                           if(x==0. && op==0) {
  166.                                 return tmp;
  167.                           }
  168.                           m.n=-1;
  169.                           break;
  170. */
  171.                 case '\n':
  172.                 case '\r':
  173.                 case ';':
  174.                 case '#': *rp=0;
  175.                 default: m.n=-1;
  176.                           if(*rp) rp++;
  177.                           break;
  178.                 }
  179.                 arg->cp=rp;

  180.                 if(m.n==-1) {
  181.                         x=calc(x,op,tmp);
  182.                         break;
  183.                 }
  184.                 else if((m.n>>2) > (op>>2)){
  185.                         tmp=cal(tmp,m.n,arg);
  186.                         rp=arg->cp;

  187.                         goto oper;
  188.                 }
  189.                 x=calc(x,op,tmp);
  190.                 if((m.n>>2) == (op>>2)) {
  191.                         op=m.n;
  192.                 }
  193.                 else  {
  194.                         arg->cp--;
  195.                         break;
  196.                 }

  197.         } while(*arg->cp);
  198.         return(x);
  199. }

  200. let(str,x,putdata)
  201. char *str;
  202. double x;
  203. int (*putdata)(int,int,char *[CALCID],double);
  204. {
  205. struct args arg;
  206. int n=0;
  207. char *p;
  208.         arg.cp=str;
  209.         setarg(&arg);
  210.         n=strtol(arg.cp,&p,0);
  211.         if(p==arg.cp) return(-1);
  212.         if(p&&isalpha(*p)) *arg.argbuf=*p;
  213.         return((*putdata)(n,arg.argc,arg.argv,x));
  214. }
  215. static char * setarg(arg)
  216. register struct args *arg;
  217. {
  218. int n;
  219. register char *rp;
  220. char *p;
  221.         arg->argc=0;
  222.         *(arg->argv[0]=arg->argbuf)=0;
  223.         for(n=1;n<CALCID;n++) {
  224.                 *(p=arg->argv[n]=arg->argv[n-1]+strlen(arg->argv[n-1])+1)=0;
  225. again:
  226.                 if((p-arg->argbuf) >= sizeof(arg->argbuf)-1)
  227.                         break;
  228.                 rp=stptok(arg->cp,p,
  229.                         sizeof(arg->argbuf)-(p-arg->argbuf),
  230.                         ",+*-/%()#;");
  231.                 if(*rp && rp[-1]=='\\') {
  232.                         p=arg->argv[n]+strlen(arg->argv[n])-1;/* del \\ */
  233.                         *p++=*rp++;
  234.                         *p=0;
  235.                         arg->cp=rp;
  236.                         goto again;
  237.                 }
  238.                 if(*rp!=',') break;
  239.                 arg->cp=rp+1,arg->argc=n;
  240.         }
  241.         return(arg->cp);
  242. }
  243. int strlet(label,str,putdata)
  244. char *label;
  245. char *str;
  246. int (*putdata)(int,int,char *[CALCID],char *str);
  247. {
  248. struct args arg;
  249. int n=0;
  250. char *p;
  251.         arg.cp=label;
  252.         setarg(&arg);
  253.         n=strtol(arg.cp,&p,0);
  254.         if(p==arg.cp) return(-1);
  255.         if(p&&isalpha(*p)) *arg.argbuf=*p;
  256.         return((*putdata)(n,arg.argc,arg.argv,str));
  257. }
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP