工学易语言经典教程.docx
- 文档编号:8825373
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:78
- 大小:1.04MB
工学易语言经典教程.docx
《工学易语言经典教程.docx》由会员分享,可在线阅读,更多相关《工学易语言经典教程.docx(78页珍藏版)》请在冰豆网上搜索。
工学易语言经典教程
开始时间:
2005年11月10日,13:
56:
50
第一章、基础知识
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文件的自校验》
WindowsAPI和动态链接库
<枚举窗口,枚举进程>
<使窗口可移动>
<窗口子类化>
<动态菜单>
<动态组件>
<文件拖放>
<读取dll中的资源-扑克牌图片>
<读DOS程序执行结果>
<自制皮肤>
<远程线程>
。
。
。
。
。
文件系统
<模拟资源管理器>
<文件格式>
《编写自己的文件格式》
易语言模块编程
注册表
文件关联、命令行处理、文件右键菜单
枚举注册表
注册表模拟器
图像处理
取图像宽度、高度
取像素字节集
各种图像运算方法
面向对象编程
类、封装、属性、行为、继承、多态性
矢量图形(面向对象程序设计)
CAD系统
EMF文件的读写
OpenGL三维图形编程
DirectX游戏编程
网络编程
<聊天程序>
<远程控制>
<邮箱登录器>
<天气查询>
数据库编程
界面编程
<使用《易容大师》进行界面编程>
第一章、基础知识
1.1基本数据类型
计算机程序是用来采集和处理现实世界的数据的,而现实世界的数据又是多样的,比如数量、名称、状态、温度、时间、图像等等,计算机程序要处理这些数据,那么其编程语言也必须规定相应的类型,不同的数据类型用来保存不同类型的数据。
易语言中的基本数据类型和其存储的信息如下表所示:
表1.1易语言中的数据类型
数据类型名
能存储的数据
初始值
字节型
数值型,表数范围:
[0,255],占用1个字节的存储空间。
0
短整数型
数值型,表数范围:
[-32768,32767],占用2个字节的存储空间。
0
整数型
数值型,表数范围:
[-2147483648,2147483648],占用4个字节的存储空间。
0
长整数型
数值型,表数范围:
[-9223372036854775808,9223372036854775807],占用8个字节的存储空间。
0
小数型
数值型,表数范围:
,占用4个字节的存储空间。
0
双精度小数型
数值型,表数范围:
,占用8个字节的存储空间。
0
逻辑型
表示真假、男女等具有二值性的数据,占用4个字节的存储空间。
假
日期时间型
表示年月日时分秒的数据,占用8个字节的存储空间。
*
文本型
用来表示描述性的文字、符号等的数据。
易语言的文本行变量可以大于64KB。
“”
字节集
可用来表示任何数据,比如图片、视频、声音等,其表示的数据的意义取决于数据的设计者。
{}
子程序指针
表示子程序在内存中的地址,这是专门为编程而设的数据类型。
占用4个字节的存储空间。
0
*日期时间型的初始值是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易语言中的运算符
运算符类型
运算符名
中文操作符号
英文操作符号
位运算符
位与
位与
band
位或
位或
bor
位取反
位取反
bnot
位异或
位异或
bxor
左移
左移
shl
右移
右移
shr
算术运算符
负
-
-
相乘
×
*
相除
÷
/
整除
\
\
求余数
%
%或Mod
相加
+
+
相减
-
-
逻辑运算符
大于
>
>
小于
<
<
等于
=
=或==
不等于
≠
<>或!
=
大于或等于
≥
>=
小于或等于
≤
<=
约等于
≈
?
=
且
且
and或&&
或
或
or或||
赋值运算符
赋值
=
=
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流程控制
如同现实世界的数据是多样性的,现实世界的条件也是多样性并且在时刻发生变化的。
假如我们要设计计算机程序来处理类似这样的事务:
1通过判断外界的温度来控制通过电炉丝的电流以保持大致的恒温——当温度高于40℃的时候,减小通过的电流以降温;当温度低于37℃的时候,增大通过的电流以升温;
2根据考试得分评等级的程序,如果得分高于85分为优秀;介于60分到85分之间的为优良;低于60分的为不及格;
3一个图像处理程序,要给一张图片加上1000个随机的彩点;
如果计算机始终只能按照指令的顺序一条条地执行,那么很显然,要处理这样的事情就很棘手了。
这样就引入了流程控制的概念,流程控制允许计算机根据不同的条件跳过一段代码继续执行后面的代码,或者跳转到任意指定的指令行去继续执行,或者重复地执行指定的程序段。
易语言中设计到流程控制的关键字如下表。
关键字
说明
VB或C中的类似关键字
如果
满足条件执行一个分支,不满足则执行另一个分支。
if…else…endif
如果真
满足条件则指令下面的分支。
if…endif
判断
满足条件则执行该分支,其他的分支不再进行条件判断。
如果条件都不满足,则执行最后一条分支(缺省分支)。
也就是说,始终只执行其中的一个分支。
selectcasenumber
case1:
casen…..
caseelse
判断循环首
如果条件满足,则执行循环体。
循环体有可能一次也不被执行。
while
wend
循环判断首
先执行循环体,再进行条件判断。
循环体至少被执行一次。
do
loopwhile
计次循环首
执行指定次数的循环,循环的当前次数存入指定的变量中。
变量循环首
根据指定的取值范围进行循环,循环的当前值存入指定的变量中。
fori=5to8
nexti
到循环尾
不执行此次循环后面的语句而直接进行下次循环。
continue
跳出循环
不再执行循环。
break
返回
返回到调用程序,用于子程序中。
return
结束
退出程序。
end
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-
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 工学 语言 经典 教程