码迷,mamicode.com
首页 > 其他好文 > 详细

集算器初体验

时间:2018-07-10 11:18:04      阅读:154      评论:0      收藏:0      [点我收藏+]

标签:菜单   循环   alt   斜杠   esproc   enter   结果   aqs   通用   

技术分享图片

1、从经典的Hello, world! 开始

先看图(1):

技术分享图片图(1)

新建p1程序文件,在A1格子中输入=output(“Hello, world!”)。点击图(1)中红圈圈住的三角按钮,执行p1的代码,就可以在控制台中看到输出结果,如红色方框所示。

从这个例子可以看出,集算语言不同于传统语言,没有main函数入口,也没有引入类、或者头文件。那么程序是如何工作的呢?从图(1)可以看到,代码是写在类似Excel命名的格子里面的。既然有了行列,集算语言就按照“先行后列”的顺序开始计算。所以程序的入口就是A1格,依次执行B1直到最后一列,再从A2开始,直到最后一个包含代码的格子为止。

2、变量都去哪了?

无论是C语言还是Java,都有一个变量声明的概念。例如,我们要用到一个字符串时,需要先定义好名字以及类型,就像:

char* msg=”Hello,world!”;   //C   风格

String msg=”Hello,world!”;   //Java风格

而在集算语言中,这个例子会写成表(1):


A
1Hello,world!
2=output(A1)

表(1)

运行后,输出结果一样。但我们并没有将“Hello,world! ”先赋值给某个变量。而是在A2中直接引用了格子的名字A1,也就是说,集算语言中格子的名字就可以直接用作变量名。所以集算语言中初看并没有“变量”,实际是集算语言自动使用了格子名字作为缺省变量名,这样一方面可以省去我们为变量取名的烦恼,同时也让代码看起来更加简便和整洁。

但是,你可能会说:“那我要取一个有意义的名字来作为变量,支持不?”

——当然支持!

很显然,如果全是字母加数字的变量名而变量又很多,想要寻找某个有特殊含义的变量时,结果一定是你在众里寻它千百度,它却问你的眼镜有没有千百度,这就尴尬了……所以,我强烈建议:只针对真正有意义的变量进行命名!

那么,要取个有含义的变量名,是不是在A1中写入 String msg=”Hello,world!” 就可以了? 这个问题我先给出答案:“输入错误。”至于原因嘛,下面第4节再讲。别急,先让我们熟悉一下语法。

3、格子内容的几种表示方法

我们知道,传统程序文件通常都是由常量、变量、关键字、函数名、函数体、语句和注释等部分构成。集算语言也不例外,也有上述各种组成部分,只不过组织结构有点不同。

首先,有别于传统C语言,集算语言中一个文件只能定义一个函数,且文件名就是函数名。而C语言的一个文件中是可以定义多个函数的。

另外,由于集算语言的代码都位于格子中,而为了区分格子中代码的不同类型,我们需用不同的字符开头来表示不同的代码类型,具体来说有:

1、单或双斜杠开头

这个跟常规语言类似,斜杠后面直接跟注释,不过在集算语言中,单斜杠表示注释当前格,双斜杠表示注释当前格以及该行后面的所有格,这类格子我们称作“注释格”。参考表(2):


AB
1/这是一个集算语言注释格/A1为一个 注释格
2//这是一行注释因为A2是双斜杠,B2后面都是注释格

表(2)

2、直接输入内容

这部分包括常量(但在集算语言中,常量被赋值后仍然是可变的),这样的格子我们称作“常数格”;关键字开头的语句(比如表示循环的for,返回值的return等),这类格子我们称作“语句格”。参考表(3):


AB
1Hello,world!/A1为一个 常数格
2return A1/A2为一个 语句格,返回A1的内容

表(3)

3、等号开头

 凡是需要计算一下的代码,或者说表达式都可以由等号开头。包括定义一个变量、计算一个表达式或者执行一个函数。这类格子我们称作“计算格。参考表(4):


AB
1=msg=”Hello,world!”/A1为一个 计算格,计算后产生变量msg,值为字符串Hello,world!同时A1格子的值也为Hello,world!
2=to(1,100)/A2为一个 计算格,计算后A2的值为1到100的一个序列

表(4)

4、大于号开头

同样是要计算一下的代码,但计算过后,如果有返回值,会直接扔掉忽略,并不返回给格子变量,这样的代码我们也叫做代码块,这类格子我们称做“执行格”。参考表(5):


AB
1>msg=”Hello,world!”/A1为一个 执行格,执行后产生变量msg,值为字符串Hello,world! 不同于计算格,此时的A1并没有值
2>output(A1)/A2为一个 执行格,执行后在控制台输出A1的内容Hello,world!

表(5)

上述计算格和执行格两种类型,后面跟的都是要执行的语句,那么它们之间到底有何区别,又该如何使用呢?一般来说,我们会根据有返回值和没返回值两种情况,对语句或者表达式进行区分。

对于有返回值的语句,一般规范为使用计算格,例如给当前格赋值:=3.14。但是如果返回值在后面不再使用时,建议使用执行格,以减少内存占用。

对于无返回值的语句,一般规范是使用执行格。例如:> output(“Hello world!”)

下面用表(6)来对上面描述的各种格子类型进行一下总结:


ABC
1//这是一个示例代码
由于A1是双斜杠的注释,所以C1也是注释格
2Hello,world!
/给A2格赋常量初值
3>output(A2)
/使用output函数输出A2的内容
4>msg=”Hello,world!”
/A4定义了一个名为msg的字符串变量
5>output(msg)
/output函数没有返回值,所以采用执行格
6=to(1,100)
/A6使用to函数返回1到100的整数集合,返回序列对象到当前格。由于后面需要引用A6,故此格只能为计算格
7=summary=0
/定义名为summary整数型变量,并赋初值为0。虽然有返回值,但我们只用summary变量,故此格定义为计算格,执行格均可以
8for A6
/A8为一个for关键字开头的语句,表示循环遍历序列A6。关键字不需要任何标记开头,是为语句格
9
>summary=summary+A8/执行高斯同学的加法,没有高斯聪明,挨个加。注意,代码B9是循环体内容,相对于for关键字要退一格,据说Python也有强制退格,这样子,层次更分明。
10return summary
/该函数返回计算后的值

表(6)

4、变量的类型

前面已经提到,格子的名称可以直接作为变量使用,也就是定义变量时,在格子里面输入值就行了。那么变量的类型如何确定呢?熟悉JS的同学都知道,不管什么类型的变量都用Var来定义,至于值到底是什么类型,取决于值的写法。集算语言比JS更简便,Var都不用写,那么集算语言的基本变量类型有哪些呢?

1、整数

直接输入数字即可,例如:100

2、长整数

数字后面加上字母L,例如:100L

3、浮点数

直接输入带小数的数值,例如:14

4、布尔数

用true或false来表示,当然也可以是一个比较条件,例如:true、a>b

5、日期  

缺省用连接符‘-’分开的年月日表示法,例如:2018-1-31。但是在表达式中引用时,得用日期函数转换。例如:=date(“2018-1-31”)。

注意:用连接符‘-’分开的年月日是集算器缺省的格式,可以通过菜单“工具>选项”打开选项对话框,在“环境”页面的“日期格式”的一致,否则集算器无法解析,就会被当成普通字符串,而在表达式中引用时,就会报解析异常。

6、时间  

缺省用冒号‘:’分开的时分秒表示法,例如:20:30:50。同样地,在表达式中需要用时间函数来转换。例如:=time(“20:30:50”)。

注意:和日期类型一样,时间的格式也必须和选项对话框中的“时间格式”选项设置的格式一致。

7、字符串  

直接输入字符串即可,例如: Hello,world!。但是对于有歧义的字符,比如电话号码,直接输入时,会被当成长整数,此时需要用单引号开头表示后面跟的是字符串,例如:’13901020888。在表达式中时则需要加上双引号。

下图是这些基本数据类型的一个汇总:

技术分享图片 图(2)

这里简单介绍一下这里例子中用到的debug函数,在集算语言中,它用于调试输出中间变量的值。但是有些值,比如100,光看到值我们分不清它是普通整数100,还是长整数的100,甚至可能是字符串100。这时可以加上函数选项@t,将变量的类型也一并输出。

上述7种基本数据类型是集算语言中能够直接使用的,但是光有它们,计算的便利性远远不够。集算语言发明出来就是用来应对数据计算的。所以,集算语言自身提供了一些专门用于计算的对象,只要使用对象的内置方法就能很轻松地完成大部分数据运算。

不过,集算语言自身还不算是一门通用程序语言,还不能像Java一样自定义对象。

8、对象

集算语言针对数据的处理,预置了很多的对象,常用的有数据库、序列、记录、序表、排列和游标等。

其中,序列、记录、序表和排列尤为常用,这里先简单介绍一下。

序列:就是一堆数据的集合,但同时成员是有序的,相应地,你也可以理解为Java中的数组Array。上面表(6)例子中,A6格子的表达式“=to(1,100) ”返回的就是一个序列。此时我们知道,对A6的求和,只要调用序列的“sum”方法即可,就像这样:“=A6.sum()”。

记录跟数据库中的记录相同,即一个由表结构描述的一组数据。通常由一些字段组成。

序表:是序列的子集,当序列中的全部成员都是记录时,我们称之为序表。序表跟数据库中的数据表类似。用数据库对象的“query”方法查询出来的表就是序表。

排列:是序表经过过滤运算后,得到的一张引用序表成员的序表。有点拗口,意思就是排列仍然是序表,只不过排列里面的记录跟计算出它的源表的记录是同一个对象。通常情况下,不用刻意区分排列和序表,只需要注意到修改排列里面字段的内容时,它的源表字段也会跟着改掉,因为本来就是同一条记录。

5、是时候演示真正的数据处理了

数据处理最常见的当然是从数据库取数,使用SQL查询出自己想要的数据表。我们来看看使用集算语言如何做这些事情。

首先当然得有数据库,我们在这里直接使用集算器现成的示例数据库。找到“安装路径\esproc\bin\startDataBase.bat”,双击它启动示例数据库。下面按步骤来:

第1步,连接到数据源。这里是连接到一个叫demo的数据源,连接信息已经由安装包事先配置好了。如果要用自定义的数据源,只需打开菜单“工具>数据连接”,然后在弹出的“数据源”对话框中增加自己的数据源。那么如何连接它呢?会不会像Java一样要先使用DriverManager去注册Driver,然后获取Driver再获得连接?……听着就有点晕,又是注册,又是连接什么的。集算语言可不会这么干,直截了当,一句connect就已足够,如图(3)中A3所示,根本不用去懂那么多大道理。

技术分享图片 图(3)

第2步,查询取数。demo同样地,不会像Java一样要构建什么Statement 、设参数、再执行查询得到结果集,然后遍历结果集才能取数。在集算语言中,仍然是一句话的事,直接使用数据库对象的查询方法query就好,执行过后,直接得到序表对象,如图(3)中A4所示。

第3步,过滤序表。这一步看似多余(你完全可以打击我,在上面第2步的SQL中加上WHERE条件不就行了么?何必多此一举?嘿嘿,不带这样打击人的。我的例子是帮你入门,目的是让你了解集算语言的特点和结构。真要弄一个只能通过多步SQL才能算出结果的实例来时,我们就绕到例子里面出不来了)……但不要着急,这“多余”的一步正是体现了集算语言是为了SQL的分步计算而设计的。在后续章节的很多例子中,你会学习到面对令人头疼的复杂SQL时,使用分步运算将是一件多么爽心悦目、轻松愉快的事。回到主题,这一步过滤出库存量少于10(斤)的商品,看看哪些商品比较畅销,函数仍然简单,一句select加上条件,如图(3)中A5所示。

第4步,修改商品值。从第3步得到的排列中,取出需要修改值的记录,由于记录就是序表的成员,所以只要像引用数组一样,给出坐标就可以得到记录对象。区别于Java中用中括号“[]” 进行数组引用,序表是一个对象,获取它的成员时,采用小括号“()”,如图(4)的A6格所示。可以看到该记录是花生,把这条记录的 “单价” 字段修改为20(元),直接引用属性的字段名并赋值。如图(3)的A7所示。

另外,图(3)中还有A1跟A2两个格子,是为了演示集合的sum运算。

现在我们来看看执行结果,单击图(1)红圈中的三角形按钮,代码很快运行完毕,算完后,A列格子的背景都从白色变成了×××,这说明A列格子里面都有了返回值。


不过这样一次性从头到尾的执行,不利于我们更好地理解排列跟序表之间的成员关系。因此我们使用分解动作,一步步执行,每走一步停下来看看当前的执行结果。为此我们只要重复单击图(1)中蓝色圆圈里的单步执行按钮。

单步执行第一步,算出A1的结果如图(4):

技术分享图片 图(4)

可见A1是一个序列对象,它的成员为1到100的整数。

第二步,A2为A1对象sum后的结果,返回的就是一个整数值,如图(5):

技术分享图片
图(5)

第三步,A3为数据库对象,执行后可以看到数据库的一些属性设置,如图(6):

技术分享图片
图(6)

第四步,A4为从数据库对象A3中执行查询方法query后得到的序表对象,列出各种产品以及库存,如图(7):

技术分享图片
图(7)

注意图(7)的红圈表示,此时花生的单价为10(元)。

第五步,A5为从序表A4中,过滤出库存量不到10(斤)的产品。返回一个排列,内容如图(8):

技术分享图片
图(8)

第六步,A6为从排列A5中取出第3条记录,返回一条记录,内容如图(9):

技术分享图片
图(9)

第七步,经过A7中对花生的单价重新赋值后,A6格中记录的单价字段变为了20(元),如图(10):

技术分享图片
图(10)

上面第七步看似只是修改了排列中第3条记录的单价,但我们再回头看看序表A4的内容,发现序表中的花生的单价也变为了20(元)。这就说明,排列和序列中的记录,其实就是同一条记录,A4格的内容此时如图(11):

技术分享图片
图(11)

经过本例的学习,我们对集算语言已经有了一个大致印象,也了解了集算语言在进行数据处理时使用的一些最基础的概念。当然,作为一门专业的数据处理语言,集算语言还有很多概念需要熟悉,还有很多函数需要了解。但这些都不是问题,老话不是说,磨刀不误砍柴工嘛,让我们通过后面的教程把刀磨得越来越锋利吧。


集算器初体验

标签:菜单   循环   alt   斜杠   esproc   enter   结果   aqs   通用   

原文地址:http://blog.51cto.com/12749034/2139593

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!