吾爱光设

 找回密码
 注册
会员须知
会员须知
实用帮助
实用帮助
查看: 4739|回复: 0

RP Fiber Power 光纤激光器及激光器设计软件一脚本语言25 算术概述

[复制链接]
  • TA的每日心情
    奋斗
    2022-4-11 09:15
  • 签到天数: 38 天

    [LV.5]常住居民I

    542

    主题

    140

    回帖

    6

    积分

    小白

    积分
    6
    发表于 2020-2-26 11:33 | 显示全部楼层 |阅读模式
    25算术概述
    这个软件具有非常广泛的算术特性,从JPLOT继承的。本手册(在线帮助系统除外)并未提供这些特性的完整文档,而是概述了通常需要的所有功能。
    25.1常规属性
    没有特殊指示的变量名可以具有实数值。复变量的名称以“%”(例如E%)结尾,而字符串变量则使用“$”符号。
    实数可以用通常的指数表示法书写,例如3e-5=3file:///C:/Users/DELL/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif10-5。对于复数,例如3+4*i或3%4。
    可用的算术运算符是“+”、“-”、“*”、“/”和“^”, “^”表示“幂”。这些运算符具有通常的层次结构。此外,还有常见的关系运算符<,<=,>=,>,=,和<>。
    预定义的常量是i(虚单位)和pi。
    25.2复合表达式
    对于复杂的计算,通常使用复合表达式,由几个项组成,这些项依次进行计算,最终结果由最后一个项确定。语法是
    (expr1; expr2; ...; exprN)
    begin expr1; expr2; ...; exprN; end
    其中expr1等是正常数学表达式。例如,
    (a := 4; b := B/a; c := -3 * sqrt(C);(-b+sqrt(b^2-4*a*c))/(2*a))
    首先为变量a、b和c赋值,然后根据这些值计算最终结果。
    在这种复合表达式中,可以使用局部变量:
    f(x) :=
    begin
       globalB, C;
       var a,b, c;
       a := 4* x;
    b := B/ a;
       c :=-3 * sqrt(C); (-b + sqrt(b^2 – 4 * a * c)) / (2 * a));
    end
    其中a、b和c是局部的,在这个意义上,不干扰具有这些名称的任何全局变量。
    自版本V5以来,可以(并且应该)声明对全局变量的访问。(此类声明仅在函数定义的begin/end块中需要,并且仅在软件的常规设置要求时才需要。)示例:
    g(x) :=
    begin
        globallast_x;
        last_x:= x;
        sin(x);
    end
    使用指令global allow all可以访问某个函数中的所有全局变量(例如,当列出这些变量太不方便时)。
    另一种可能是声明局部常量:
    E(r) :=
    begin
       conste = 1.609e-19;
       e /r^2;
    end
    25.3算术函数
    下表列出了一系列用于算术的标准函数。以下部分将解释一些特殊函数。
      
    函数
      
    描述
    sgn(r)
    正负号函数,当r﹥0为1,当r﹤0为-1,当r=0为0
    round(r)
    四舍五入到最近的整数,例如:3.8→4,-3.8→-4
    trunc(r)
    四舍五入到下一个较小的整数,例如:3.8→3,-3.8→-4
    abs(z)
    模数(绝对值)
    abs2(z)
    模数的平方
    sqr(z)
    平方(z2)
    sqrt(z)
    平方根
    cube(z)
    三次幂(z3)
    rt3(z)
    立方根(z1/3)
    rnd(r)
    r﹥0:等分布随机数0≤x﹤r
      
    r﹤0:标准差为的高斯分布
      
    r=0:根据init_rnd()的参数设置的随机数(见下文)
    rnd_c(r)
    r﹥0:等分布随机数0≤Re(z)﹤r和0≤Im(z)﹤r
      
    r﹤0:对于实部和虚部标准差为的高斯分布
      
    r=0:根据init_rnd()的参数设置的随机数(见下文)
    rnd_seed(r)
    可以设置生成随机数的种子值。如果参数在整数范围内,则以下随机数由该种子值确定。(这对于生成可再生的随机数序列很有用。)对于一个非常大的参数(例如1E10),种子是随机的,即它是在当前系统时间的影响下产生的。
    init_rnd(sigma,tau,f0)
    用rnd(0)初始化随机数的生成:sigma=标准差,tau=相干时间(后续样本的时间间隔),f0=最大光谱功率密度的频率
    fac(n)
    阶乘(等于n!)
    re(z)
    复数的实部
    im(z)
    复数的虚部
    reim(r1,r2)
    将实部和虚部组合成复数r1 + i*r2
    r2c(r)
    将实数转换为复数
    rphi(r1,r2)
    将模(绝对值)和相位组合为复数r1  * exp(i*r2)
    conj(z)
    复数的复共轭
    exp(z)
    指数函数,基底e ≈ 2.7182818
    expi(r)
    exp(i*r)
    expd(r)
    10r
    expb(r)
    2r
    ln(z)
    自然对数
    lg(z)
    以10为底的对数
    lb(z)
    以2为底的对数
    sin(z)
    三角函数,类似有:cos, tan, cot, arcsin, arccos,  arctan, arccot
    sinh(r)
    双曲函数,类似有:cosh, tanh, coth, arcsinh,  arcosh, artanh, arcoth
    not(r)
    逻辑非(r=0为1,其他为0)
    minr(r1,r2)
    最小值(最多8个变量)
    maxr(r1,r2)
    最大值(最多8个变量)
    sum(j  := 1 to n, f(j))
    求和
    prod(j  := 1 to n, f(j))
    乘积
    FFT(...)
    快速傅里叶变换
    int(...)
    数值积分
    numdif(...)和
      
    numdif4(...)
    数值微分
    zero()
    数值寻根
    inc(v),  dec(v)
    将变量或数组值递增或递减1
    inc(v,r),  dec(v,r)
    将变量或数组值递增或递减r
    defined(term)
    如果term定义了则为1,否则为0
      
    例子:defined(sqrt(2)) = 1,
      
    defined(sqrt(-2))  = 0
    25.4数组
    数组可以保存实数、复数或字符串值,可以有多个(最多8个)维度,并且具有非整数索引值。例如
    defarray z%[1, 2, 0.5; 0, 10]
    定义一个二维复数组,第一个索引以0.5为步长从1到2,第二个索引以1为步长从0到10。当调用某个值时,例如使用z%[1.3,5.8],数组索引将四舍五入为最接近的索引值。括号前的“~”表示线性插值,双“~”表示二次插值,三“~”表示三次样条插值。
    除了如上所示的命令defarray之外,还可以使用函数调用def_array(‘z%’,1, 2, 0.5, 0, 10, 1)。(函数调用可以在数学表达式中完成,这样可以提供更多的灵活性。)这里,需要为每个维度指定三个索引值(最小、最大和步长尺寸)。由于参数的数量有限,只能通过这种方式定义最多二维数组。

    可以使用各种函数来操作数组:
      
    函数
      
    描述
    def_array('a',  0, 1, 1e-3)
    定义具有给定名称和索引范围(最小、最大和步长尺寸)的一维数组。使用另外三个索引参数,还可以定义二维数组。(备注:还有一个名为defarray的命令,可以用它定义数组。它适用于最大为8的数组维度,但不能在算术表达式中调用。)
    i1(a[]),  i2(a[]), 和di(a[])
    一维数组的第一个索引、最后一个索引和步长尺寸。对于更高维度的数组,可以使用第二个参数指定维度。
    copyarray(a1[],  a2[])
    将第一个数组的内容复制到第二个数组中。这也适用于复数组和字符串数组。两个数组的索引范围不需要相同,但数组必须具有相同数量的元素。
    processarray(a[],  '*', r)
    将所有数组元素与值r相乘。第二个参数可以是运算符“+”、“-”、“*”、“/”之一。第三个参数通常是实值,但在复数组的情况下也可能是复数。它也可以是一个表达式,而不是一个常量值,具体取决于数组索引x。
    processarrays(a[],  a1[], '+', a2[])
    将数组a1[]和a2[]逐元素相加,并将结果分配给a[]。第三个参数可以是运算符“+”、“-”、“*”、“/”之一。该函数也适用于复数组和字符串数组,但对于字符串数组,只支持加法。
    arraysum(a[])
    返回所有数组元素的和。数组必须是实数。
    arraysumsqr(a[])
    返回所有数组元素的绝对平方和。数组必须是实数或复数。
    moment(a[],  j)
    计算一维数组的j阶矩,即它将所有元素乘以数组索引的j次幂并求和。对于二维数组,该函数可用于三个索引:moment(b[],j,k)用第一个索引的j次幂和第二个索引的k次幂计算矩。
    dotprod(a1[],  a2[])
    返回两个实数数组的标量积(点积),即元素的所有乘积之和。
    cdotprod(a1[],  a2[])
    返回两个复数组的标量积(点积),即元素所有积的和。在这里,乘积是由第一个数组元素的复共轭构成的。
    findmax(a[])和findmin(a[])
    返回具有最大或最小数组值的元素索引。数组必须是一维的。数组类型可以是实数、复数(其中最小值或最大值适用于绝对值)或字符串。
    savearray(a[],  FName$)
    将数组的内容保存到文件中(也可以将索引范围指定为第三个和第四个参数)
    loadarray(a[],  FName$)
    从文件加载数组的内容(也可以指定第一个索引和元素数作为第三个和第四个参数)
    25.5数值积分
    数值积分是通过函数int()完成的。默认情况下,此函数使用扩展的Simpson方法,这对于平滑函数是精确的。被积函数在等距点上计算,包括积分区间的两端。例如,
    int(f(x), x := a to b, tol = 1e-6)
    将数值地计算f(x)的积分,其中积分变量x在a…b范围内,tol是所需(绝对)公差。在结果的变化小于tol之前,对数值近似进行了改进。因此,数值误差通常比tol小很多,但由于通常采用数值方法,因此无法保证。可以使用相对公差rtol代替绝对公差tol。
    使用附加选项algorithm = trapezoid,可以使用梯形规则而不是扩展的Simpson方法;这对于非光滑函数更为可靠。
    交互式帮助系统包含更多详细信息。
    25.6数值微分
    函数numdif()和numdif4()可用于数值微分。他们的参数是:
    待微分的表达
    微分变量
      变量值
    数值步长尺寸
    微分阶数(0..4,默认为1)
    示例:numdif(sin(x), x, 2, 1e-3)将在x=2处近似d/dx sin(x),使用步长尺寸1e-3,而numdif(sin(x), x, 2,1e-3, 2)近似二阶导数。
    选择适当的数值步长是很重要的。对于太大的步长,由于高阶导数的影响,结果变得不准确。对于太小的步长,四舍五入误差变得太大。如果将这些函数应用于精度有限的数值计算函数,则较大的步长可能更好。
    函数numdif4()的作用基本相同,但使用的是高阶公式。如果数值步长尺寸较大,它可以在不增加计算时间的情况下产生更精确的结果。对于非常小的步长尺寸,由于它对四舍五入误差更为敏感,因此不推荐使用。
    25.7数值寻根
    一个特殊的情况是用于寻根的函数zero。
    语法是:
    zero(f(x), x in [a, b], ytol = c, xtol = d)
    其中a、b、c、d可以是数或表达式。这将在数值上搜索区间[a,b]中实函数f(x)的零点。(如果f(a) * f(b) > 0,程序将尝试扩展间隔,使其包含一个零,但通常应选择间隔[a,b]使其包含零,并且f(a) * f(b) ≤ 0。)假定函数f是连续的(但不一定是可微的)。迭代用于查找根。当找到一个值x时,我们有|f(x)|≤|ytol|或 |x - x_0|≤|xtol|(x_0是精确的零),迭代就结束了。只需指定xtol或ytol即可。
    25.8快速傅立叶变换(FFT
    函数 FFT() 执行一维快速傅立叶变换。它有三个参数:
    l  第一个参数是输入数组(带空括号),它必须是实数的或复数的,并且必须有许多2次方幂的元素。
    l  第二个参数是输出数组(带空括号),它必须是复数的。
    l  第三个参数必须是+1或-1,表示转换的方向,+1表示积分的参数包含参数+iωt的指数。
    然后,函数计算输入数组的傅立叶变换,并将结果存储在输出数组中。它还设置输出数组的尺寸和正确的索引范围(这样初始数组尺寸和索引范围就不重要)。例如,如果输入数组的索引范围为1到1024,则输出数组的1024个元素的范围为-511/1024到+512/1024,步长为1/1024。(将此转换回,索引范围将是-511到+512。)
    例子:
    calc FFT(x[], X%[],+1)
    25.9控制结构
    为了区分表达式中的不同情况,可以使用if-then-else结构。例子:
    a := if b >= 0 then sqrt(b) else 0
    对于迭代,有三种基本上不需要解释的循环类型。例如,以下内容可以是表达式的一部分:
    while n > 1 do n := n / 2;
    repeat
      n :=n / 2;
    until n < 1;
    for z := 1 to 2 step 0.1 do n := n + 1 / z;
    while-do循环和repeat-until循环之间的基本区别是,在后一种情况下,循环体至少执行一次,因为只在结束时检查条件。在for-do循环中,如果结束值低于开始值,则可以将to替换为downto。
    交互式帮助包含更多详细信息。
    25.10字符串处理函数
    各种函数可以用于操纵字符串,它包含的各种字符:
      
    函数
      
    描述
    length(s$)
    字符串长度
    pos(s1$,  s2$)
    字符串s1在s2中的位置。例子:pos('es','Test') = 2
    copy(s$,  p, l)
    复制字符串中位置p处长度l的一部分;负p值表示从右端开始计数的位置。
    between(s1$,  s2$, s$)
    s$  的部分在s1$和s2$之间。例子:between('[',']','Test[abc]-') = 'abc'
    char(n)
    Unicode值为n的字符
    ord(s$)
    字符的Unicode值
    replacestr(s$,  old$, new$)
    在s$中用new$代替old$
    uppercase(s$)
    将小写字母转换为大写字母
    lowercase(s$)
    将大写字母转换为小写字母
    str(t)
    实数或复数项t的字符串形式。
      
    一个格式说明符(见下一节)可以附加到参数后面。
    rval(s$)
    字符串参数的实数值,例如 rval('3.5') = 3.5
    cval(s$)  
    字符串参数的复数值,例如 rval('3%4') = 3+4i
    matches_re(s$,  reg$, options$)
    检查字符串S$是否与正则表达式reg$匹配。第三个参数是可选的,可以包含一些选项,例如'i' =忽略大小写(将小写字母视为大写字母)或 'n=10' =最多查找10个匹配项。如果正则表达式在括号中包含一个或多个部分,则可选的第四个参数(例如m$[])是存储匹配项的字符串数组。
    replace_re(s$,  reg$, new$, options$)
    根据正则表达式reg$将s$中的结果替换为new$并返回结果。第四个参数是可选的,可以包含一些选项,例如'i' = 忽略大小写(将小写字母视为大写字母)或 'n=3' = 最多替换3个匹配项。
    split_re(s$,  reg$, p$[])
    将字符串s$拆分为单个字符串,将其存储在数组p$[]中,使用作为正则表达式reg$给定的分隔符。结果是获得的部分数。
    25.11数值和字符串值的格式
    对于输出到文件或输出区域,通常需要格式化数值,例如限制数字的数量并使用一些单位。例如,您可能希望获得“1.34 Thz”,而不是1.3452989014e12的未格式化值。格式化是通过在表达式末尾附加冒号(":")和一些附加字符来实现的。规则是:
    l  可以附加多个格式指令,每个指令以冒号(":")开头。
    l  用非零自然数定义字符串的最小总长度;如有字符串长度小于定义的最小总长度,通过插入空格来实现最小总长度。最小总长度数字后面的字母l、c或r表示对正:左、中或右
    l  像 :d3 这样的指令指定总数字位数。
    l  使用 :e3(示例),最后一个数字表示103,使用 :e-3表示10-3。
    l  格式 :f3的结果是小数点后3位。
    l  格式 :z3 四舍五入为整数,如果长度小于3位,则前面添加零。
    l  默认情况下,小数点后的末尾处的零将被抑制。要更改这,添加:n,例如:d3:n。
    l  在双引号之间指定单位(最多20个字符),例如"Hz"。默认情况下,数字和单位之间会写一个空白;可以通过在单位前面写一个反斜杠(“\”)来避免这一点(例如::"\Hz")。如果合适的话,会使用类似k的前缀为“kilo”(103)或m(10-3);如果您更喜欢指数型前缀,请添加 :np(“无前缀”)。如果单位字符串以括号中的前缀开头,程序将使用此前缀(如果数字字符串不会太长)。类似地,括号中的数字指定首选指数。如果单位字符串以“/”或“%”开头,则不使用前缀。
    l  格式 :c提供非数值输出:如果给定数字为1,则返回单位字符串的第一个字符。对于2,它是第二个字符等。对于有效范围之外的数字的,返回“?”。
    l  格式:w类似于:c,但适用于使用逗号分隔的单词:如果给定数字为2,则返回单位字符串的第二个单词。对于有效范围之外的数字,返回“?”。请注意,单位字符串不能包含超过20个字符。
    l  格式 :m提供单位字符串的多个副本。例如,3:m:"*-"结果为"*-*-*-"。
    对于字符串表达式,有以下规则:
    l  可以添加多个格式指令,每个指令以冒号(":")开头。
    l  非零自然数定义了结果字符串的最小总长度;如果需要,可以通过插入空格来实现最小长度。数字后面的字母l、c或r表示对正:左、中或右。
    l  格式 :*3 生成字符串的3个副本。(在这种情况下,最小长度(如果指定)适用于整个字符串。)
    25.12图形函数
      
    函数
      
    描述
    point(z%,m$)  
    在位置z%(包含x和y坐标的复数)处绘制一个标记,类型m$表示矩形("r")、实心圆("O")、三角形("t")、倒三角形("n")、菱形("h")、十字("x")、星形("*")、单像素点("p")或更粗点("P")
    pixelcolor(z%)  
    返回坐标系中某点的颜色
    moveto(z%)  
    设置当前点
    lineto(z%)  
    从当前点到给定点绘制一条线
    rmoveto(z%),  rlineto(z%)
    使用相对于当前点的坐标
    line(z1%,  z2%)
    从点z1%到z2%绘制一条线
    rect(z1%,  z2%)
    绘制矩形
    box(z1%,  z2%)
    绘制用当前颜色填充的矩形
    circle(z%,  r)
    以半径r围绕点z%绘制一个圆
    fill(p%,  fcol, bcol)
    用填充颜色fcol填充点p%周围的区域,直至颜色bcol定义的边框。如果bcol为负,则边框定义为没有颜色abs(bcol)的任何颜色。
    getpos%()
    返回当前绘图位置
    rgb(r,g,b)
    返回RGB颜色值(参数介于0和1之间)
    egacolor(j)
    生成一个EGA颜色值(参数介于0=黑色和15=白色之间)
    color_I(r)
    基于从蓝色到绿色到深红色的标准颜色标尺,返回介于0和1之间的参数的颜色值。
    color_A(z%)
    返回大小不超过1的复参数的颜色值。复相位决定颜色(例如,红色代表正实值,绿色代表负实值),大小决定颜色饱和度。
    setcolor(c)
    为下列绘图操作设置颜色;例如:setcolor(blue)或
      
    setcolor(rgb(0.6,0.4,0.3))
    setrgb(r,  g, b)
    和 setcolor(rgb(r, g, b))一样
    setwidth(w)  
    设置线宽(以图形全宽的1/1000为单位)
    set_scaling(sx,  sy)
    允许更改以下绘图操作的缩放比例。默认情况下,所有x坐标都根据主x轴缩放,所有y坐标都根据第一个y轴缩放。但是,如果使用命令y2:定义了第二个Y轴,则可以使用set_scaling(1, 2)根据该轴缩放所有y值。同样,用set_scaling(2, 1)可以使用第二个x轴,而不是使用主y轴
    draw_cs()  
    重新绘制坐标系,例如,在坐标系的某些部分被其他图形元素覆盖之后
    clear_diagram()
    清除坐标系
    save_diagram(j,  fname$)
    将索引为j(0=当前绘制的图表)的图形窗口的图形内容保存到名为fname$的文件中。
    add_to_movie(delay)  
    将当前显示的图像添加到动画图像(通过调用save_movie()完成)
    save_movie(fname$)
    将生成的电影保存到动画GIF文件中
    clear_movie()
    从内存中删除当前电影
    5.25.13处理文件的函数
      
    函数
      
    描述
    fileexists(n$)  
    如果具有给定名称的文件存在,则返回1,否则返回0
    copyfile(n1$,  n2$)
    将文件复制到另一个文件,如果成功,则返回1,否则返回0
    deletefile(n$)
    删除一个文件,如果成功则返回1,否则返回0
    open_file(n$,  m$)
    这将打开一个名为n$的文件;文件模式由字符串m$给出,例如, "wt" =写入文本文件,"at " =附加文本文件,"rb " =读取二进制文件。(有关更多选项,请参阅下表。)
      
    返回一个文件句柄,这对于该文件的进一步操作是必需的。
    close_file(f)  
    关闭具有给定文件句柄的文件
    write(f,  x, ',', y:d4)
    将数据写入文本文件
    write_line(f,  x, ',', y)
    与write()类似,但在其他项后面输出行尾
    write_bin(f,  x, y)
    将数据写入二进制文件
    read_line(f,  s$)
    从文本文件中读取一行
    read_bin(f,  x)
    从二进制文件读取数据
    eof(f)
    检查是否到达文件结尾
    read_file_content(n$,  s$)
    将文本文件的全部内容读取到字符串s$或文本数组s$[]
    write_file_content(n$,s$)
    将字符串s$的内容(或数组s$[])写入文本文件(用UTF8编码)
    read_directory(dir$,files$[],  options$)
    将Windows目录的内容读取到字符串数组。如果成功,则结果为1(目录存在),否则为0。可选字符串options$ 可以包含’r’(递归子目录)。
    以下是有关文件模式(函数open_file()的第二个参数)的更多说明:
    l  编写文本文件时的编码:没有进一步的规范,文本文件是用UTF-8编码编写的,这样就可以存储任何字符而不会丢失数据。但是,可以将ANSI编码与特定的代码页一起使用,例如西欧的代码页1252或日语的代码页932。文件模式可以是"wt,encoding=cp1252" 或"wt,encoding=utf16"。也可以禁止写入字节顺序标记(BOM),例如 "wt,encoding=utf8-noBOM"。另一种可能是使用"wt,encoding=default" 获取Windows系统的默认编码。
    l  读取文本文件时编码:还可以指定读取文件时假定的编码,例如 "rt,encoding=cp1252" 或"rt,encoding=utf8"。这里,默认值是自动模式("rt,encoding=auto"):如果文件包含字节顺序标记,则将其视为UTF,否则将假定ANSI代码页1252(西欧)为默认值。
    l  对于写入文本文件,函数write_line()使用的换行符序列默认为crlf(回车+换行)。可以更改,例如,使用文件模式"wt,lb=lf"获取Unix样式的格式。
    25.14各种其他函数
      
    函数
      
    描述
    showmessage(...)
    显示1到8条实数、复数或字符串类型的消息(每行一条);当用户关闭表单时,执行将继续
    showoutput(...)
    在输出区域中显示参数
    now()
    当前日期和时间,以秒为单位,从2000年1月1日0:00起
    play(f,  T)
    产生频率为f(赫兹,即振荡每秒)和持续时间为T(秒)的声音
    exec(cmd$,  params$, folder$)
    执行程序或Windows命令或打开文档(有关详细信息,请参阅下面的内容)
    download(URL$)
    下载文件,以字符串形式传递文件内容
    debug(msg$)
    进入或退出表达式调试模式(参数为空)
    get_env_var(name$)
    获取Windows环境变量的值
    有关函数exec()的更多详细信息:
    l  参数通常是可执行文件的文件名(通常具有完整的文件路径)、命令行参数(可选)和执行程序的文件夹(可选)。
    l  如果第一个参数是“win”,则第二个参数将解释为Windows命令。示例:exec("win","dir *.pdf >filelist.txt", "D:\")
    l  通常,在启动的程序完成之前,执行将继续,而不需要等待。但是,可以通过在第一个参数前面放一个“@”来让执行等待。示例:使用exec("@win","dir *.pdf >filelist.txt", "D:\"),可以确保在继续执行时命令生成的文件存在。不幸的是,对于某些程序,等待不起作用。
    l  如果函数成功,则返回1,否则返回0。注意,“成功”是指成功启动一个程序,而不是成功执行。

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?注册

    ×
    发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    联系我们|本论坛只支持PC端注册|手机版|小黑屋|吾爱光设 ( 粤ICP备15067533号 )

    GMT+8, 2024-11-23 08:08 , Processed in 0.156250 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表