文档库 最新最全的文档下载
当前位置:文档库 › 易语言--基础知识第一章

易语言--基础知识第一章

第一章、基础知识

1.1 基本数据类型

1.2 变量和常量

1.2.1 变量和常量的命名

1.2.2 变量的作用范围

1.2.3 静态变量

1.2.4 变量的初始值

1.3 运算符

1.3.1运算符的优先级

1.4流程控制

1.4.1 如果、如果真、判断

1.4.2 判断循环、循环判断

1.4.3 计次循环、变量循环

1.4.4 到循环尾、跳出循环

1.4.5 返回、结束

1.5 子程序(函数)

1.5.1 子程序参数(参考、可空)

1.5.2 子程序的递归

1.5.3 子程序的静态局部变量

1.6 自定义数据类型

1.6.1[例]黑客帝国屏保

1.6.2 自定义数据类型的内存存储

1.7 数组

1.7.1 数组的维数

1.7.2 数组的排序

1.7.

2.1冒泡排序

1.7.

2.2 选择排序

1.7.

2.3 插入排序

1.7.

2.4 快速排序

1.7.

2.5 自定义数据类型数组的多级排序

1.7.3 [例]扫雷游戏

第二章、字节集

《将字节集显示为十六进制》

《文件分割机》

《数据隐藏》

《电子贺卡》

《配置信息写入exe文件》

《exe文件捆绑》

《exe文件的自校验》

Windows API和动态链接库

<枚举窗口,枚举进程>

<使窗口可移动>

<窗口子类化>

<动态菜单>

<动态组件>

<文件拖放>

<读取dll中的资源-扑克牌图片>

<读DOS程序执行结果>

<自制皮肤>

<远程线程>

。。。。。

文件系统

<模拟资源管理器>

<文件格式>

《编写自己的文件格式》

易语言模块编程

注册表

文件关联、命令行处理、文件右键菜单

枚举注册表

注册表模拟器

图像处理

取图像宽度、高度

取像素字节集

各种图像运算方法

面向对象编程

类、封装、属性、行为、继承、多态性

矢量图形(面向对象程序设计)

CAD 系统

EMF 文件的读写

OpenGL 三维图形编程

DirectX 游戏编程

网络编程

<聊天程序>

<远程控制>

<邮箱登录器>

<天气查询>

数据库编程

界面编程

<使用《易容大师》进行界面编程>

第一章、基础知识

1.1基本数据类型

计算机程序是用来采集和处理现实世界的数据的,而现实世界的数据又是多样的,比如数量、名称、状态、温度、时间、图像等等,计算机程序要处理这些数据,那么其编程语言也必须规定相应的类型,不同的数据类型用来保存不同类型的数据。易语言中的基本数据类型和其存储的信息如下表所示:

表1.1 易语言中的数据类型

*日期时间型的初始值是1899 年12 月30 日0 时0 分0 秒

在上表中我们主要看一下数值型的数据类型,因为这种类型的数据我们接触到最多的。我们看到,长整数型的数据表示的整数范围最大,而双精度型的数据表示的范围也大,精确度也最高,那为什么还需要有比他们范围小的数据类型呢?呵呵,这正如尺有所短,寸有所长。首先,它们在内存和磁盘中占用的空间不同,对于字节型的数据,只占用1个字节,而长整型的数据则占用8个字节之多,对于要表示人的年龄这样的数据,字节型经济又实惠——人的年龄不会是负数,也不可能超过255岁;其次,运算速度不一样。我们知道,当前主流的计算机都是32位的,在内存中数据是4字节对齐的,那么长度为4字节的数据,在运算时和在内存中移动时速度是最快的,如果你的程序不吝惜内存,而更在乎速度的话,就尽量采用长度为4字节

的数据类型吧。

字节集数据类型是其他的编程语言中所没有的,是易语言的一个很有特色的数据类型,在文件处理、类对象的持久化中有重要用途,以后会有专门章节讲述。

1.2 变量和常量

所谓变量,就是其中保存的数据可以变化的一个数据容器(在易语言的早期版本中,变量都叫容器)。简单地说,变量就是在内存中保存数据的地方,而其中的数据是可以随时修改的。顾名思义,常量就是恒定不变的量,其中的数据不能被修改。如果在程序中有语句修改了常量的值,编译器会报错。在编辑源代码的任何时候,可以通过点选菜单〔插入>常量〕来插入常量。在易语言中,要使用某个常量,必须在前面加上“#”号。有同学可能会问:“既然常量的值是不可改变的,那么要常量有什么意义呢?在源代码中直接使用其值不就行了吗?要定义一个常量,还要想心思取个名字,不是多此一举吗?”其实不然,使用常量有很多好处:

1. 简化代码输入。比如你要写个与数学相关的程序,要大量使用π,我们知道π= 3.1415926535897932384626433832795,每次在使用π的时候,输入这么一长串数字是不是很麻烦?容易输错且不说,读代码的时候还不知其含义,所以我们不如定义一个常量“派”,这样写代码和读代码都方便多了,运行时速度也快,最后编译成exe文件占用的存储空间也少。

2. 使代码更易于阅读。对于键盘上的每一个按键,都有一个数字型的扫描码,比如空格键的代码是32,回车是13,如果不使用常量,你如何记得住它们?幸好易语言编程环境已经给我们定义好了这些常量,我们可以直接使用。

随着编码的深入,你会更多地发现常量有时很好的——不要怕麻烦,巧妙地使用常量,有时会有意想不到的效果。

1.2.1 变量和常量的命名

在易语言中,对常量名、变量名和函数名的等需要命名的地方有一定的命名规则,这些名称的命名规则为:名称的首字母必须为全半角字母或汉字,其它字符必须为全半角字母、全半角数字或者汉字。虽然名称中允许半角字符“_”存在,但它被保留为系统专用,因此建议不要使用。与其它的编程语言相比,易语言的命名规则有以下特点:

·无长度限制,用户可以尽情地使用长名称来进行名称描述;

·永远不会与易语言的关键字产生冲突。譬如:现已存在“如果”命令,但用户仍然可以定义一个名称为“如果”的变量,两者之间不会产生任何冲突。虽然如此,最好还是不要以关键字来命名,因为这样的代码难于阅读和理解。

这里顺便说一下“关键字”的概念。在计算机语言中,有些词汇和符号是作为语言的某种特殊的用途而使用的,比如类型定义、流程控制、算术逻辑运算符、预处理指令、编译指令等,在其他的编程语言中,这些词汇和符号是不能作其他用的,比如不能作为变量名。这就好比我的名字是曾劲松,那我生的孩子我能给他取名“曾祖父”吗?不能,因为“曾祖父”就是一个关键字,已经有其特定的用途了。再说一遍,在易语言中虽然可以用关键字来命名变量、常量和函数名等,但建议不要这样——当然,中国的考试有时候会刁钻古怪,难免以后易语言进入课堂而有老师出此偏门的考试题目——嘿嘿,话题扯远了。

1.2.2 变量的作用范围

在易语言中,常量是全局范围的,也就是说,在程序的任何地方都可以使用该常量。而变

量的使用就没有那么随意了,根据变量的作用范围不同,变量可以分为全局变量、程序集变量和和局部变量。

全局变量的值在程序的任何地方都可以访问和修改,这虽然方便了编程,但实际上在编程的过程中,如果使用了太多的全局变量,程序写复杂了之后,很容易导致思维的混乱,因为你往往不知道你在程序的哪里修改了该变量。最后往往程序虽然通过了编译,运行的结果却常常莫名其妙。所以,记住一条忠告:能够不使用全局变量,就不要使用,全局变量越少越好。要插入全局变量,请按键盘快捷键[Ctrl]+[G],也可以点选菜单〔插入>全局变量〕。

程序集变量是在当前程序集的范围内都可以访问的变量,它的范围比全局变量要小些。易语言中的程序集,是指一系列相关子程序和变量的有机组合,说简单点,你可以把程序集想像成资源管理器中的文件夹。一般来说,一个窗口对应一个程序集,当然也有独立于窗口的程序集,关键在于你如何组织你的代码。对于一个有窗口的程序集,你可以把程序集变量看成该窗口的“额外”的属性,这个小技巧在编程时很有用。除去范围小些外,程序集变量的使用和全局变量差不多。所以,程序集变量也要谨慎使用。要插入程序集变量,请将光标放置在程序集名的后面,然后按回车键。

局部变量表示在当前子程序(也称函数)的范围内可以访问的变量,它的作用范围最小,也是使用得最多的变量。要在当前子程序内加入局部变量,请按[Ctrl]+[L]。

在本书中,对于变量和子程序参数的命名有一个约定,那就是:全局变量都以“全”字开头,程序集变量都以“集”字开头,函数参数都以“参”字开头,类的成员数据都以“私”字开头。有了这个约定之后,我们一看变量名就知道它是在何处定义的,方便编写和阅读源代码。

1.2.3 静态变量

只有子程序中的变量可以指定为“静态”类型的变量,所以有关静态变量请参看“子程序”一节。

1.2.4 变量的初始值

变量的初始值是值变量在声明后未给其赋值的情况下变量里面存储的内容。具体的初始值请参见表1.1。

1.3 运算符

运算符就是用来进行运算的符号。在计算机中,运算又分为算术运算、逻辑运算、位运算和赋值运算。算术运算用来计算加减乘除求余数等,这些我们在数学中已经学过了。逻辑运算是进行是非判断以及是非组合的运算,其基本运算规则为:非真为假,非假为真;真且真为真,真且假为假,假且假为假;真或真为真,真或假为真,假或假为假。位运算是对数据位进行操作。我们知道,在计算机内部,所有的数据都是以二进制表示的,比如字符“A”,其ASCII码为65,二进制为1000001,二进制中只有两个数学符号:0和1,数据中的每一个1或0,叫做一位,位运算正是针对这些数据位进行操作的。在易语言中,位运算符以函数的形式存在,其基本规则如下:

位与(1,1)=1,位与(1,0)=0,位与(0,0)=0,规则为“有0则0”;

位或(1,1)=1,位或(1,0)=1,位或(0,0)=0,规则为“有1则1”;

位异或(1,1)=0,位异或(1,0)=1,位异或(0,0)=0,位异或(0,1)=1,规则为“同0异1”;

位取反(1)=0,位取反(0)=1;

左移是将所有的位左移指定的位数,移出位的被丢掉,右边补0,比如左移(10000012,3)=00010002,这里3是十进制数,其他的是二进制数。同理,右移是将所有的位右移,移出的位被丢掉,左边补0。

赋值运算是指将值赋给一个或多个变量。易语言中所有的运算符如下表所示:

表1.2易语言中的运算符

1.3.1运算符的优先级

考虑这样一个数学算式:8+3*4^2,它的结果是如何计算的呢?从数学知识中,我们知道要先算4的平方,再与3相乘最后加上8,而不是简单地按从左至右的顺序来计算。这就是运算符的优先级。同样地,在编程环境中,对一个表达式进行求值时,也有个运算符优先级的问题。上表是按运算符的优先级进行排列的,我们可以看到,在易语言中,位运算的优先级最高(其实它们都是函数),接下来依次是算术运算、逻辑运算、赋值运算。同一个运算符类别中不同的运算符也有优先级的差别,例如对于算术运算符来说,取反(-)运算符是最高的,其次是乘除,再次是整除、求余、加减等(易语言中没有求幂运算符,是函数)。

在上表中,相邻的背景色相同的运算符有相同的优先级。比如相乘和相除有相同的优先级,易语言中的位运算全部是函数,所以也有相同的优先级。相同优先级的运算符按从左至右的顺序求值。对于如下的表达式,变量1的最终值是什么呢?

变量1=位或(左移(3, 2), 3) >-(5 -3 ×8)

求值过程如下:先计算左移(3,2),3=(11)2,左移两位是(1100) 2=12,再与3位或,即(1100) 2与(0011) 2位或,结果为(1111)2=15;再算大于号右边,结果为19,显然15>19 的结果是假,所以变量1的值为假。在易语言中可以通过以下代码查看运行结果:

输出调试文本(位或(左移(3, 2), 3) >-(5 -3 ×8))

跟数学算式类似,程序中的表达式也可以通过添加括号来改变运算顺序。如果你不清楚究竟是那个运算符的优先级高,那么就加括号吧!这是确保正确的省事办法。

1.4流程控制

如同现实世界的数据是多样性的,现实世界的条件也是多样性并且在时刻发生变化的。假如我们要设计计算机程序来处理类似这样的事务:

①通过判断外界的温度来控制通过电炉丝的电流以保持大致的恒温——当温度高于4

0℃的时候,减小通过的电流以降温;当温度低于37℃的时候,增大通过的电流

以升温;

②根据考试得分评等级的程序,如果得分高于85分为优秀;介于60分到85分之

间的为优良;低于60分的为不及格;

③一个图像处理程序,要给一张图片加上1000个随机的彩点;

如果计算机始终只能按照指令的顺序一条条地执行,那么很显然,要处理这样的事情就很棘手了。这样就引入了流程控制的概念,流程控制允许计算机根据不同的条件跳过一段代码继续执行后面的代码,或者跳转到任意指定的指令行去继续执行,或者重复地执行指定的程序段。易语言中设计到流程控制的关键字如下表。

1.4.1 如果、如果真、判断

在论坛上,经常看到有朋友问“如果”和“如果真”有什么区别、“如果真”和“判断”有什么区别的问题,这里我作一个简要的解答。

“如果”语句带有两个分支,如果条件成立,执行第一个分支,否则执行第二个分支;“如果真”则仅有一个分支,只有条件满足才执行。如果把“如果”语句的第二个分支留空,那么它的效果和“如果真”是一样的,但在易语言的编程环境中会绘制一条空的流程线,不太美观。所以,如果你要根据条件是否成立来执行某些指令,而不管相反的条件,就要用“如果真”,如果正反两个条件都要兼顾,则需要使用“如果”。易语言的示例代码如图1.4.1-a和图1.4.1-b所示:

图1.4.1-a “如果”和“如果真”的区别

图1.4.1-b “如果”和“如果真”的等效

下面说说“判断”和“如果真”的区别。从表面上看,“判断”也是只有条件为真时执行,但要注意,判断是基于多分支的,只要发现其中一条分支的条件满足,后续分支的条件就不再进行判断,当然其中的代码也不会被执行,如果所有的条件都不满足,则执行默认的分支。用多个“如果真”语句可以写出与“判断”语句等效的效果,但程序执行的效率没有“判断”语句高,为何?因为使用“判断”语句只要发现一条分支满足就不再进行后续判断,而“如果真”语句对每个条件都要进行判断。“判断”语句通常用来对类似的多个条件且在同一个时刻下最多只有一个条件满足的事务进行处理,例如根据用户按下了键盘的某个键、选择了工具条上的哪个按钮来执行相应的功能;在消息循环中处理当前的消息等。图1.4.1-c的示例代码演示了在易语言中用“判断”语句来处理用户单击的工具条按钮。

图1.4.1-c 用“判断”语句来处理用户单击工具条按钮

1.4.2 判断循环、循环判断

顾名思义,判断循环就是先判断条件是否成立,成立则执行循环体,不成立就结束循环;而循环判断是先执行循环体,再判断条件是否成立,成立则再次执行循环体,否则结束循环。这两个语句很简单,就不再敖述。图1.4.2-a 和图1.4.2-b 分别是使用“判断循环”和“循环判断”的例子。

图1.4.2-a使用“判断循环”将一个文本文件的内容读入列表框中

图1.4.2-b 使用循环判断随机画圆,直至用户按下ESC键

1.4.3 计次循环、变量循环

记得我读小学的时候,老师常对我说“把每个写错了的字抄写100遍!”,我想大家都有过类似的经历吧。对于计算机来说,这正是一个“计次循环”的问题。在你明确知道要循环的次数的时候,推荐使用“计次循环”。计次循环的计数器从1开始,每循环一次,计数器自动加1,如果需要的话,可以指定一个变量来保存计数器的值。“变量循环”是高级的“计次循环”,使用起来也稍微复杂一些,可以指定计数器的起始值、终止值和每次递增的数量,同样的,你也可以把计数器的值存入变量中使用。

图1.4.3-a 用“计次循环”求10的阶乘

图1.4.3-b 用“变量循环”计算100以内能被3整除的数的和

从原理上来说,所有的循环都可以使用“判断循环”来实现,但不同的实现方法除代码量不同之外,执行的效率差距也很显著。推荐的原则如下:能够使用“计次循环”和“变量循环”实现的,就不要使用“判断循环”或“循环判断”,因为前者的执行效率要高得多,尤其是对于次数较多的循环。为什么呢?因为使用“判断循环”或“循环判断”,每循环一次都要执行一次条件判断,而进行条件判断的开销往往是比较大的(尤其是进行文本比较和字节集比较),而“计次循环”则是“明确目的,直奔主题”,效率当然就高多啦!

1.4.4 到循环尾、跳出循环

OK,刚才老师罚你把“羸”字写100遍,也就是给你发了个“计次循环”的指令。当你写到第13个字中途的时候,却差点写成了“赢”字,下面的小“贝”都快写完了,此时你决定放弃继续写这个字,因为错字老师是不算数的,搞不好要再发写100遍呢。于是你把笔移到了下一格,开始写下一个“羸”字——暂停!你的这个过程就是“到循环尾”。“到循环尾”并不是放弃整个循环,而是仅仅放弃当前循环中尚未完成的步骤,直接进入下一循环;你继续写阿写,当你写到第90个字的时候,老师突然说“好了,今天时间比较晚了,大家都回家吃饭吧!”。“真郁闷,又让我功败垂成!真是行百里者半九十阿。”,当你心理这样想着的时候,却不知已经深入计算机语言的真谛,因为你已经“跳出循环”。“跳出循环”就是不再继续循环了。这句话对吗?错!如果你在一个多层的嵌套循环中,中层循环中的“跳出循环”指令仅仅跳出当前这一层循环,外层循环还得继续执行的阿。

1.4.5 返回、结束

“返回”主要用在子程序中,返回到子程序的调用者,在返回时可以携带一个返回值。

“结束”指令用来终止当前进程,退出程序。

这两个很简单,不再敖述。

1.5 子程序(函数)

在我们编程的时候,有一些经常使用的功能,比如求一段文本的长度、计算某个数的平方根、弹出一个消息框提示用户等,如果每次实现这些功能都写一大段代码,是不是很烦琐?结构化的程序设计提出了代码功能模块化的思想,这些实现特定功能的代码模块我们称之为“子程序”。子程序有系统内置的,更多的则需要我们自己编写。

系统内置的子程序实现的都是一些通用的功能,是我们编写其他子程序的基石,所以要好好掌握。这些内置的子程序涉及文本处理、算术运算、数组操作、拼音处理、文件读写、系统

处理等诸多方面。我的建议是把“工作夹”上“支持库”页中的核心支持库中的所有子程序及其在“提示”窗口中的简要说明都仔细看一遍,不需要全部记下来,只要大概知道有哪些东西、能实现什么样的功能就行了,用的时候再仔细查阅。

1.5-a易语言中系统内置函数及其简要说明

很显然,仅仅使用易语言内置的子程序无法满足我们编写多种应用程序的要求,所以我们常常要编写自己的子程序。在编辑代码的时候,你可以随时按[Ctrl]+[N]或单击菜单项〔插入>子程序〕来添加子程序。

1.5.1 子程序参数(参考、可空)

“吃的是草,挤出来的是奶”,这是鲁迅先生对“孺子牛”的亲切描述。我们写的子程序就跟鲁迅先生笔下孺子牛差不多,这里,“草”就是子程序的参数,而“奶”就是子程序返回的结果。当然,有的牛奉献精神更佳,不需要吃草也能挤奶,这就相当于不需要参数的子程序;当然,如果是公牛,吃了草也挤不出奶来,那就是无返回值的子程序——虽然它不能挤奶出来,那么肯定有别的用途,比如说跟能挤奶的牛待在一起,会使她们心情舒畅,产出优质量多的奶来;还有的牛,可能不光要吃草,还要吃树叶饲料之类的,那就是带有多个参数的子程序了。

通常情况下,一个子程序最多有一个返回值,如果要同时返回多个值该怎么办呢?这里介绍几个技巧:

①:使用“参考”类型的参数。当你勾中了参数名后面的那个“参考”选项的时候,参数传递的就不是它的值,而是它在内存中的地址。你在子程序中对该参数的修改,实际上是对相应的内存中的数据的修改,所以在子程序返回的时候,调用程序中的变量已经被修改了。请看下面的代码片断。

1.5.1-a 使用“参考”参数类型返获得多个返回值:平均值、最小值和最大值

②使用数组类型的参数。如果返回的参数个数不定,但类型是一致的,那最好用“数组”类型的参数了。不管勾不勾中“参考”,数组类型始终是传址的。

③使用自定义数据类型。自定义数据类型将在后面介绍。同样地,不管是否勾中“参考”,自定义数据类型也是传址的。

子程序参数的“可空”选项允许用户在调用该子程序时该参数位置不输入参数,这样极大

地方便了使用该子程序的用户(很多情况下就是你自己啦),但对于编写该类子程序的程序员来说,会稍微麻烦一些,因为你要考虑到用户是否传入了参数,一般来说,你应该使用如图1.4.1-b 所示的形式来设定空参数的默认值。

图1.5.1-b 设置子程序“可空”参数的默认值

1.5.2 子程序的递归

“从前有座山,山上有座庙,庙里有一个老和尚和一个小和尚。有一天,老和尚给小和尚讲故事,他说:‘从前有座山,山上有座庙,庙里有个老和尚和一个小和尚。有一天,老和尚给小和尚讲故事,他说:“从前有座山,山上有座庙……”’”我倒,这故事还有玩没玩?!也许你觉得这个故事纯粹是瞎胡闹,那么你错了,这里面可蕴含了巧妙的计算机编程思想——递归。

“递归”并不是子程序的某个特点,而是一种编程思想。也许你问:递归到底有什么用阿?递归用处可大了,在计算机编程——不,在生活中都随处可见,也许只是你没有感觉到。当你在和别人下棋的时候,你是如何思索每一个要下的棋步的呢?或许你是这样思考的:如果我这么走,那么对手会怎样怎样,我再如何如何……;如果我那么走,又如何如何……等等,根据推理的几步棋,从中挑出一个最优的走法。计算机程序与人类对弈,它的算法也是与此类似的,

它会遍历棋盘上当前情况下每一个可能的走法,在内存中形成很多个新的棋局,再以这些棋局为基础,站在你的角度遍历你的所有可能的走法,同时再生成很多新的棋局……这样循环到指定的深度(通常就是指思考的“步数”)后,挑出棋局最优的那一盘,回到计算的起始点,,再举一个例子,伸出你的左手,看到你掌心的血管没有?从一根主血管分成很多子分支,这些子分支下再分子子分支,子子分支下再分……这就是计算机的分形图的基础,而分形图的核心算法必须依赖于递归。还有你每天使用的计算机的资源管理器的目录树,也是递归。这些都是看得见的,还有看不见的,比如编译器的表达式解析,也要用到递归。由此可见,递归是无处不在而且功能强大的,所以一定要好好理解。

计算机编程中的递归,指的是子程序不断调用它自身,这想起来总觉得有点不可思议,但确实可以做到。当然计算机中的递归不可能象我前面讲的那个故事那样,否则执行起来没玩没了,任何一台电脑都会死机。所以在使用递归的时候,一定要注意设定终止条件,否则会死得很难看。

1.5.2-a 使用递归计算阶乘

图1.5.2-a 的子程序用递归来计算指定数的阶乘。我们知道,任何一个大于1的整数的阶乘实际上等于该数乘以比它小1的数的阶乘,而1的阶乘是1。用数学式子表述如下:

???>-?==1 )!1(1 1!n n n n n

用易语言程序来表述正是如上的算法。

图 1.5.2-b 则使用递归来遍历指定的目录,列出指定目录下的所有文件(包括子目录下的文件)。虽然我们不知道一个目录下面有多少层子目录,但子目录与目录间有共性:目录下可能有文件,也可能有目录。当我们发现文件的时候,就输出它;发现目录的时候,就用同样的方式来遍历它。具体代码实现的时候,我们是把当前目录下所有的文件输出,所有的子目录存入一个数组中,再逐个遍历。易语言的“寻找文件”子程序会将当前目录“.”和当前目录的父目录“..”也都列出来,所以在递归的时候要注意排除这两个目录,否则始终在当前目录循环,直至死机。这里如果对易语言的“寻找文件”函数不太理解,可以查看编程环境下的即时帮助。

图1.5.2-b 使用递归来列出指定目录及其子目录下的所有文件

1.5.3 子程序的静态局部变量

前面提到过,子程序的局部变量可以设置为“静态”类型。所谓“静态”,就是指该变量具有“记忆”功能,对该子程序调用后,该局部变量的值不会被销毁,到下次进入该子程序,它仍然保留上次调用该子程序后的值。普通的子程序变量在每次进入子程序内后都要重新分配内存空间,在退出子程序时自动释放所占用的空间;而“静态”类型的子程序变量跟全局变量和程序集变量一样,在程序启动时就分配了内存空间并初始化(只初始化一次,而不是每次进入子程序都初始化),并且在整个程序运行期间都不释放,所以该类型的变量有“记忆”效应。图1.5.3所示的代码使用静态局部变量和递归分解指定自然数的质因数,理解起来可能有些困难,请仔细思考体会。

图1.5.3 使用静态局部变量和递归来分解质因数

1.6 自定义数据类型

易语言的基本数据类型可以满足我们普通的编程需求,而对于复杂的应用程序,往往需要我们自己定义专用的数据类型,以简化编程。比如说我们要编一个学生信息管理程序,我们知道,一个学生的信息通常包含以下方面:姓名(文本型)、学号(文本型)、性别(逻辑型)、出生日期(日期时间型)、年级和班级(文本型)、专业(文本型)等。而这些不同类型的信息其实是一个整体,如果能把这些不同的数据类型整合成一个新的数据类型,那么编程起来会方便很多。

在易语言编程环境中,点选菜单〔插入>数据类型〕来加入新的数据类型,先更改数据类型名称,然后按回车键来添加数据成员。申明好新的数据类型之后,就可以象使用普通变量那样来申明变量了,差别就是在赋值和访问时要使用点语法。

图 1.6 定义和使用一个“学生信息”的数据类型

1.6.1[例]黑客帝国屏保

如果你对自定义数据类型使用不习惯,那么下面这个小例子或许会让你熟悉自定义数据类型并增强对编程的兴趣。这里我们来做一个很酷的类似《黑客帝国》中片头的字符下落特效的屏保,让你的电脑更富有个性!请按下面的步骤操作。

1>新建一个易程序。在上面加一个画板,改名为“画板缓冲”,设置画板的背景色为黑色、

文本颜色为绿色,选择一个长型的字体,比如“Impact”,字号为四号,注意,还要将

其“可视”属性设为“假”,“自动重画”设为“真”。这个画板我们将作为在后台绘制

的一个缓冲画板,用户是看不见的。再加一个画板,改名为“画板可视”,其他的保持

默认值。

2>往窗体上添加一个时钟控件,将其“时钟周期”改为50,我们需要每秒钟刷新20张画

面。

3>点选菜单〔插入>数据类型〕,添加一个如图1.6.1-a的数据类型:

图 1.6.1-a 黑客帝国特效的数据类型

4> 双击“_启动窗口”,如图1.5.1-b添加几个程序集变量。

图 1.5.1-b 黑客帝国特效的数据类型

5> 在“__启动窗口_创建完毕”中添加图1.6.1-c所示代码。

图 1.6.1-c “__启动窗口_创建完毕”事件中的代码

这段代码中,读者可能会对初始化下落字符数组下面的计次循环中的代码有点费解,这里解释一下。

①“字符(取随机数(33, 126))”这一句用来随机取一个ASCII范围在33到126之间字符。从图1.6.1-d所示的ASCII表可以看到,这些字符包含所有的可见英文字符和标点符号。如果你只想要数字,那么把这句改成“字符(取随机数(48, 57))”。

相关文档
相关文档 最新文档