• 四、Snapman多人协作电子表格之——Exprtk脚本


    Snapman多人协作电子表格是一个即时工作系统。

    Snapman中嵌入了Exprtk脚本进行公式数据运算。Exprtk是一种高性能的脚本,经测试它的数据运算性能只比C#和java底20%。

    一、Exprtk的类型和变量定义

      Exprtk的数据类型只有三种:Scalar(数字), Vector(数字数组), String(字符串);特别说明:Exprtk没有字符串数组

      基本的运算符有:+, -, *, /, %, ^

      赋值运算符有::=, +=, -=, *=, /=, %=

      判断运算符有:=, ==, <>, !=, <, <=, >, >=

      逻辑运算符有:and, mand, mor, nand, nor, not, or, shl, shr,xnor, xor, true, false

      字符串运算符有:in, like, ilike, concatenation

      Exprtk的变量定义为:

    var iData := 100;          //数字变量定义
    var sData := 'Hello word.';    //字符串变量定义
    var vData[4] := {1,2,3,4};     //数组变量定义

       Snapman中Exprtk定义了四种特殊变量:

      1、单元格数字变量,列字母+行号数字,如:A1H234

      2、单元格字符串变量,列字母+行号数字+下划线,如:A1_H234_

      3、选择集数组,列字母+行号数字+冒号+列字母+行号数字,这是一个数字数组元素次序是按单元格从左往右从上往下,如:F2:G5

      4、列数组,列字母+冒号+列字母,这是一个数字数组元素次序是按单元格从左往右从上往下,如:F:H

      所以Snapman中Exprtk的变量定义都不要使用数字结尾或数字加下划线结尾

    二、Exprtk的if、switch、for、while、continue、break语句

      1、if语句的类型

        A、if表达式:if (x, y, z) ;如果x为真返回y否则返回z;例如:

    var x := 100;
    var y := 300;
    var z := 500;
    var w := 58.7;
    var v := 32;
    var data := if ((x + 1) > 2y, z + 1, w / v) ;
    print(tostring(data));

        B、if语句块

    if (x < y or (x + z) > y)
    {
        z := x + 3;
        y := x - z;
    }
    else if (abs(2y - z) >= 3)
        y := x - z;
    else
    {
        z := abs(x * x);
        x * y * z;
    };

      2、switch语句的类型

        switch语句会逐句判断case的条件,成立就执行代码表达式,如果case条件都不成立就执行default的代码表达式,最后将代码表达式的结果返回,如:

    var x := 100;
    var y := 300;
    var z := 500;
    var a := switch
    {
    case x > (y + z) : 2 * x / abs(y - z);
    case x < 3       : sin(x + y);
    default          : 1 + x;
    };
    print(tostring(a));

        注意:case的条件和语句只允许有一条语句

      3、for语句

      for语句和C语言类似,但是它是一个表达式所以记住大括号后面需要有分号,如:

    for (var x := 0; (x < n) and (x != y); x += 1)
    {
      y := y + x / 2 - z;
      w := u + y;
    };

      4、while语句

      while语句和C语言类似,但它是一个表达式所以记住大括号后面需要有分号,如:

    while ((i += 1) < 10)
    {                    
      if (i < 5)         
        j -= i + 2;      
      else if (i % 2 == 0)
        break;           
      else               
        break[2i + 3];   
    };

      5、continue、break、break[]语句

      continue、break和其C语言类似,break[]的意思是for和while语句是一条有返回值的表达式,break返回的是NaN,而break[]却是返回中括号中表达式的值,如上一个样例。

    三、Exprtk的数组运算

      Exprtk有一个非常强大的数组运算,可以对数组变量进行批量运算和赋值

      1、赋值运算符都支持数组变量,如下面样例数组中每个变量都增加了13:

    var vData[5] := {1, 2, 3, 4, 5};
    vData += 13;

      2、其他支持数组的运算符:+, -, *, /, %, ^

      3、支持的函数:avg, max, min, mul, sum, count

      4、当存在2个数组变量的时候,运算以个数少的为运算次数;当运算符为单维运算符或者单维函数,数组变量会取第一个元素进行运算

    四、Exprtk的Snapman函数接口

      1、tolower(str),将字符串str转换成小写字母并返回,例如:e2_:=tolower('AHFGHJHKJDewiuri73972389HHJGJG中华人民共和国')
      2、toupper(str),将字符串str转换成大写字母并返回,例如:e3_:=toupper('AHFGHJHKJDewiuri73972389HHJGJG中华人民共和国')
      3、tostring(double),将数字转换成字符串并返回,例如:e4_:=tostring(0.4444488)
      4、tonumber(str),将字符串转换成数字并返回,例如:e5:=tonumber('5643786587')
      5、get(row,col),获取第row行、col列的单元格的数字,例如:e6:=get(7,1)
      6、set(row,col,double),设置第row行、col列的单元格的数字,例如:set(7,5,98766)
      7、get_(row,col),获取第row行、col列的单元格的字符串,例如:e8_:=get_(8,2)
      8、set_(row,col,str),设置第row行、col列的单元格的字符串,例如:set_(9,5,'大不了的给开发商')
      9、set_progress(n),设置进度条,n必须大于等于0,例如:set_progress(10)
      10、set_total_progress(t),设置进度条的最大值,t必须大于0,例如:set_total_progress(100)
      11、sleep(n),让线程睡眠n毫秒,例如:sleep(1000)
      12、get_tick_count(),获取从操作系统启动所经过的毫秒数,例如:E12:=get_tick_count()
      13、save(),保存当前电子表格,例如:save()
      14、count(vec),获取数组vec的个数,例如:E14:=count(C4:C11)
      15、print(str),打印str的内容,例如:print('Hello world.')
      16、set_background(row,col,str_lafer),设置第row行、col列的单元格背景的lafer,例如:set_background(16,5,'[[18,#9845f2,8,8,8],[18,#F865f2,16,55,8]]')

      17,get_row_count(),获取当前表格有内容的单元格行数,例如:set(18,5,get_row_count())
      18,get_col_count(),获取当前表格有内容的单元格列数,例如:set(19,5,get_col_count())

      19、E17或者e17,表格数据变量:字母表示列,数字表示行,例如:E17 := 100000.567;
      20、E18_或者e18_,表格字符串变量:字母表示列,数字表示行,例如:E18_ := '我是中国人。'
      21、E19:E21或者A:B,表格数据变量数组,先从左到右然后从上到下,没有数字代表从某列到某列,例如:E19:E21 := A17:A19

    五、Exprtk自带的函数

        +----------+---------------------------------------------------------+
        | FUNCTION | DEFINITION                                              |
        +----------+---------------------------------------------------------+
        | abs      | Absolute value of x.  (eg: abs(x))                      |
        +----------+---------------------------------------------------------+
        | avg      | Average of all the inputs.                              |
        |          | (eg: avg(x,y,z,w,u,v) == (x + y + z + w + u + v) / 6)   |
        +----------+---------------------------------------------------------+
        | ceil     | Smallest integer that is greater than or equal to x.    |
        +----------+---------------------------------------------------------+
        | clamp    | Clamp x in range between r0 and r1, where r0 < r1.      |
        |          | (eg: clamp(r0,x,r1))                                    |
        +----------+---------------------------------------------------------+
        | equal    | Equality test between x and y using normalised epsilon  |
        +----------+---------------------------------------------------------+
        | erf      | Error function of x.  (eg: erf(x))                      |
        +----------+---------------------------------------------------------+
        | erfc     | Complimentary error function of x.  (eg: erfc(x))       |
        +----------+---------------------------------------------------------+
        | exp      | e to the power of x.  (eg: exp(x))                      |
        +----------+---------------------------------------------------------+
        | expm1    | e to the power of x minus 1, where x is very small.     |
        |          | (eg: expm1(x))                                          |
        +----------+---------------------------------------------------------+
        | floor    | Largest integer that is less than or equal to x.        |
        |          | (eg: floor(x))                                          |
        +----------+---------------------------------------------------------+
        | frac     | Fractional portion of x.  (eg: frac(x))                 |
        +----------+---------------------------------------------------------+
        | hypot    | Hypotenuse of x and y (eg: hypot(x,y) = sqrt(x*x + y*y))|
        +----------+---------------------------------------------------------+
        | iclamp   | Inverse-clamp x outside of the range r0 and r1. Where   |
        |          | r0 < r1. If x is within the range it will snap to the   |
        |          | closest bound. (eg: iclamp(r0,x,r1)                     |
        +----------+---------------------------------------------------------+
        | inrange  | In-range returns 'true' when x is within the range r0   |
        |          | and r1. Where r0 < r1.  (eg: inrange(r0,x,r1)           |
        +----------+---------------------------------------------------------+
        | log      | Natural logarithm of x.  (eg: log(x))                   |
        +----------+---------------------------------------------------------+
        | log10    | Base 10 logarithm of x.  (eg: log10(x))                 |
        +----------+---------------------------------------------------------+
        | log1p    | Natural logarithm of 1 + x, where x is very small.      |
        |          | (eg: log1p(x))                                          |
        +----------+---------------------------------------------------------+
        | log2     | Base 2 logarithm of x.  (eg: log2(x))                   |
        +----------+---------------------------------------------------------+
        | logn     | Base N logarithm of x. where n is a positive integer.   |
        |          | (eg: logn(x,8))                                         |
        +----------+---------------------------------------------------------+
        | max      | Largest value of all the inputs. (eg: max(x,y,z,w,u,v)) |
        +----------+---------------------------------------------------------+
        | min      | Smallest value of all the inputs. (eg: min(x,y,z,w,u))  |
        +----------+---------------------------------------------------------+
        | mul      | Product of all the inputs.                              |
        |          | (eg: mul(x,y,z,w,u,v,t) == (x * y * z * w * u * v * t)) |
        +----------+---------------------------------------------------------+
        | ncdf     | Normal cumulative distribution function.  (eg: ncdf(x)) |
        +----------+---------------------------------------------------------+
        | nequal   | Not-equal test between x and y using normalised epsilon |
        +----------+---------------------------------------------------------+
        | pow      | x to the power of y.  (eg: pow(x,y) == x ^ y)           |
        +----------+---------------------------------------------------------+
        | root     | Nth-Root of x. where n is a positive integer.           |
        |          | (eg: root(x,3) == x^(1/3))                              |
        +----------+---------------------------------------------------------+
        | round    | Round x to the nearest integer.  (eg: round(x))         |
        +----------+---------------------------------------------------------+
        | roundn   | Round x to n decimal places  (eg: roundn(x,3))          |
        |          | where n > 0 and is an integer.                          |
        |          | (eg: roundn(1.2345678,4) == 1.2346)                     |
        +----------+---------------------------------------------------------+
        | sgn      | Sign of x, -1 where x < 0, +1 where x > 0, else zero.   |
        |          | (eg: sgn(x))                                            |
        +----------+---------------------------------------------------------+
        | sqrt     | Square root of x, where x >= 0.  (eg: sqrt(x))          |
        +----------+---------------------------------------------------------+
        | sum      | Sum of all the inputs.                                  |
        |          | (eg: sum(x,y,z,w,u,v,t) == (x + y + z + w + u + v + t)) |
        +----------+---------------------------------------------------------+
        | swap     | Swap the values of the variables x and y and return the |
        | <=>      | current value of y.  (eg: swap(x,y) or x <=> y)         |
        +----------+---------------------------------------------------------+
        | trunc    | Integer portion of x.  (eg: trunc(x))                   |
        +----------+---------------------------------------------------------+
        | acos     | Arc cosine of x expressed in radians. Interval [-1,+1]  |
        |          | (eg: acos(x))                                           |
        +----------+---------------------------------------------------------+
        | acosh    | Inverse hyperbolic cosine of x expressed in radians.    |
        |          | (eg: acosh(x))                                          |
        +----------+---------------------------------------------------------+
        | asin     | Arc sine of x expressed in radians. Interval [-1,+1]    |
        |          | (eg: asin(x))                                           |
        +----------+---------------------------------------------------------+
        | asinh    | Inverse hyperbolic sine of x expressed in radians.      |
        |          | (eg: asinh(x))                                          |
        +----------+---------------------------------------------------------+
        | atan     | Arc tangent of x expressed in radians. Interval [-1,+1] |
        |          | (eg: atan(x))                                           |
        +----------+---------------------------------------------------------+
        | atan2    | Arc tangent of (x / y) expressed in radians. [-pi,+pi]  |
        |          | eg: atan2(x,y)                                          |
        +----------+---------------------------------------------------------+
        | atanh    | Inverse hyperbolic tangent of x expressed in radians.   |
        |          | (eg: atanh(x))                                          |
        +----------+---------------------------------------------------------+
        | cos      | Cosine of x.  (eg: cos(x))                              |
        +----------+---------------------------------------------------------+
        | cosh     | Hyperbolic cosine of x.  (eg: cosh(x))                  |
        +----------+---------------------------------------------------------+
        | cot      | Cotangent of x.  (eg: cot(x))                           |
        +----------+---------------------------------------------------------+
        | csc      | Cosecant of x.  (eg: csc(x))                            |
        +----------+---------------------------------------------------------+
        | sec      | Secant of x.  (eg: sec(x))                              |
        +----------+---------------------------------------------------------+
        | sin      | Sine of x.  (eg: sin(x))                                |
        +----------+---------------------------------------------------------+
        | sinc     | Sine cardinal of x.  (eg: sinc(x))                      |
        +----------+---------------------------------------------------------+
        | sinh     | Hyperbolic sine of x.  (eg: sinh(x))                    |
        +----------+---------------------------------------------------------+
        | tan      | Tangent of x.  (eg: tan(x))                             |
        +----------+---------------------------------------------------------+
        | tanh     | Hyperbolic tangent of x.  (eg: tanh(x))                 |
        +----------+---------------------------------------------------------+
        | deg2rad  | Convert x from degrees to radians.  (eg: deg2rad(x))    |
        +----------+---------------------------------------------------------+
        | deg2grad | Convert x from degrees to gradians.  (eg: deg2grad(x))  |
        +----------+---------------------------------------------------------+
        | rad2deg  | Convert x from radians to degrees.  (eg: rad2deg(x))    |
        +----------+---------------------------------------------------------+
        | grad2deg | Convert x from gradians to degrees.  (eg: grad2deg(x))  |
        +----------+---------------------------------------------------------+

    六、Exprtk样例

    //1、各行求和
    for(var row := get_row_count() - 3; row > 1; row := row - 1)
    {
        var isum := 0;
        for(var col := get_col_count() - 2; col >= 1; col := col - 1)
        {
            isum += get(row,col);
        }
        set(row,get_col_count() - 1,isum);
    };
    //2、各列求和
    for(var col := get_col_count() - 1; col >= 1; col := col - 1)
    {
        var isum := 0;
        for(var row := get_row_count() - 3; row > 1; row := row - 1)
        {
            isum += get(row,col);
        }
        set(get_row_count() - 2,col,isum);
    };

      Exprtk的具体语法,请参考:Exprtk语言语法说明

    七、Snapman的下载地址

      Snapman下载的官网地址:http://www.snapman.xyz

      Snapman技术支持QQ群:596654328

      

  • 相关阅读:
    css列表
    css字体
    css文本
    css背景
    css里的属性
    MySQL语法大全_自己整理的学习笔记
    必看的 jQuery性能优化的38个建议
    p​h​p​异​常​机​制
    常用软件
    php过滤危险html代码
  • 原文地址:https://www.cnblogs.com/virtualNatural/p/9941994.html
Copyright © 2020-2023  润新知