《2022年MM实验报告 .pdf》由会员分享,可在线阅读,更多相关《2022年MM实验报告 .pdf(11页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、M2M 实验报告名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 11 页 - - - - - - - - - 实验一 Lua语言编程一、实验原理Lua 是一种 轻量语言,它的官方版本只包括一个精简的核心和最基本的库。这使得 Lua 体积小、启动速度快。它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。和许多 大而全 的语言不一样,网路通讯、图形界面等都没有默认提供。但是Lua 可以很容易地被扩展:由宿主语言(通常是C或 C+ )提供这些
2、功能, Lua 可以使用它们,就像是本来就内置的功能一样。事实上,现在已经有很多成熟的扩展模块可供选用。Lua 是一种多重编程范式的程序设计语言:它只提供了很小的一个特性集合来满足不同编辑范式的需要,而不是为某种特定的编辑范式提供繁杂的特性支持。例如, Lua 并不提供继承这个特性,但是你可以用元表来模拟它。诸如名字空间、类这些概念都没有在语言基本特性中实现,但是我们可以用表结构(Lua唯一提供的复杂数据结构)轻易模拟。Lua可以在运行时随时构造出一个函数,并把它看作一个对象(正是所谓的first class function),这个特性可以很好的满足函数式编程的需要。这是提供了这些基本的元特
3、性,我们可以任意的对语言进行自需的改造。二、实验目的1. 了解什么是 Lua语言及其优势和 Lua与 C/C+ 的关系2. 掌握 Lua的基本编程,包括类型和值、表达式(各类运算符、优先级和表的构造) 、基本语法和函数等。3. 掌握 Lua的编译、运行和调试。三、实验内容1. 配置 Lua的运行环境,使其在命令行中可以进行编译。2. 验证实验指导书中编写的计算输入参数n 的阶乘。3. 编写输出 50以内的质数的程序。4. 编写二分法的程序四、实验过程1. Lua在 Windows 下的搭建(1)首先从 Lua官网下载 Lua5.2.3压缩包。下载地址: http:/www.lua.org/do
4、wnload.html(2)将压缩包解压后得到如下文件:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 11 页 - - - - - - - - - (3)在环境变量的 Path 中添加解压后所得文件的路径并保存。如图:(3)打开记事本编写代码,完成后另存为*.lua 文件。(4)打开命令行输入lua *.lua 运行。如图:2. 计算输入参数 n 的阶乘(1)源代码function fact(n)if n=0 thenreturn 1else return n*fact
5、(n-1)endend名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 11 页 - - - - - - - - - print(enter a number:)a = io.read(*number)print(fact(a)(2)结果截图3. 求 50 以内的质数(1)源代码- sieve.lua- the sieve of Eratosthenes programmed with coroutines- typical usage: lua -e N=500 siev
6、e.lua | column- generate all the numbers from 2 to nfunction gen (n)return coroutine.wrap(function ()for i=2,n do coroutine.yield(i) endend)end- filter the numbers generated by g, removing multiples of pfunction filter (p, g)return coroutine.wrap(function ()for n in g doif n%p = 0 then coroutine.yie
7、ld(n) endendend)endN=N or 50- from command linex = gen(N)- generate primes up to Nwhile 1 do名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 11 页 - - - - - - - - - local n = x()- pick a number until doneif n = nil then break endprint(n)- must be a prime numberx =
8、 filter(n, x) - now remove its multiplesend(2)结果截图4. 二分法(1)源代码- bisect.lua- bisection method for solving non-linear equationsdelta=1e-6- tolerancefunction bisect(f,a,b,fa,fb)local c=(a+b)/2io.write(n, c=,c, a=,a, b=,b,n)if c=a or c=b or math.abs(a-b)delta then return c,b-a endn=n+1local fc=f(c)if fa
9、*fc0 then return bisect(f,a,c,fa,fc) else return bisect(f,c,b,fc,fb) endend- find root of f in the inverval a,b. needs f(a)*f(b)0function solve(f,a,b)名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 11 页 - - - - - - - - - n=0local z,e=bisect(f,a,b,f(a),f(b)io.wri
10、te(string.format(after %d steps, root is %.17g with error %.1e, f=%.1en,n,z,e,f(z)end- our functionfunction f(x)return x*x*x-x-1end- find zero in 1,2solve(f,1,2)(2)结果截图五、实验总结Lua语言是一种成熟的机器语言,它十分快速、便携性好、功能强大、可嵌入式、内存占用率小,并且是免费的。经过 Lua语言的学习,我们对它的功能和使用有了基本的了解:Lua的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它由标准 C
11、编写而成,代码简介优美,几乎在所有操作系统和平台上都可以编译,运行。但 Lua并没有提供强大的库,所以它不适合作为开发独立应用程序的语言。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 11 页 - - - - - - - - - Lua脚本可以很容易的被C/C+ 代码调用,也可以反过来调用C/C+ 的函数,这使得 Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。一个完整的 Lua解释器不
12、过 200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 11 页 - - - - - - - - - 实验二 基于 Lua语言案例分析一实验目的掌握 Lua中的面向对象编程。二实验原理表:Lua中的数据结构,可以存放各种域。由于Lua中的函数也是第一类值,于是表可以存放属性域和方法域,因此表可以描述一个类。元表:元表也是一个表,可以设置给一个本表。一个表作为元表概念存在的意义
13、在于它可以通过定义自身的一系列元方法来改变本表的行为。如果一个元表不被设置给一个本表,那么他是没有意义的,一个本表的元表可以是自身。元方法: Lua给表预备了一些特殊的行为(如表之间的相加/减/乘/除等) ,这些行为可以通过元方法来定义。一个表的元方法需要定义在它的元表中,一个没有元表的表无法使用任何元方法。如果一个表的元表是自身,那么在该表中定义的元方法将影响该表的行为。_index 元方法:当访问到表中不存在的域时,将调用其元表的_index元方法(如果该表指定了元表并且元表定义了_index元方法的话)。如果其元表的 _index 方法返回一个表中含有该域,则访问该域。三实验步骤及结果:
14、1.封装将具备相同性质的一类事物抽象成一组属性域和方法域,在C+中这个概念叫做类。在 Lua 中没有类的概念,而是用一个表来存储这一组属性域和方法域。通过对类的实例化可以产生可以操作的对象,但是在Lua 中没有实例化的概念,Lua 使用“ 原型” 的思路来实现对象的实例化:一个原型表用来描述一个类,在原型表中填写类属性和方法。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 11 页 - - - - - - - - - 实例化对象时,创建一个新表,将新表的元表设置为原型表。
15、将原型表的_index 指向自身。于是,所有使用该方法产生的新表都将拥有相同的元表,相当于所有的新表都可以访问到相同的域:Base = x = 0 , y = 0; Base. new = function( self) local o = ; - 创建新表 setmetatable(o,self); -新表的元表设置为原型表self._index = self; -原型表的 _index为原型表return o; end Base.setXY = function ( self,x,y) self.x = x; self.y = y; end b1 = Base:new(); b1:setX
16、Y(666,999); b2 = Base:new(); b2:setXY(333,999); print(b1.x); -666这样看起来一切正常, b1 和 b2的元表都是 Base。访问 b1,b2 中不存在的域 setXY 会通过元表 Base._index 返回 Base.setXY。但是当 b1 生成的时候他的 x 域根本不存在,直到b1:setXY(b1,666,999)的时候通过一个赋值才生成的x。这个 x 在表 b1 中,各个实例之间互不影响,但是在多个实例访问Base中的表成员数据时会产生错误:Base = x = 0 , y = 0, t = h = 0 ; ; b1 =
17、 Base:new(); b1.t.h = 100; b2 = Base:new(); print(b2.t.h); -100t 不在对象表中,而在原型表Base 中,通过 _index 访问到了类中的数据,看起来像个 static 成员。于是,类中的成员最好声明在构造函数内的新表中,而方法可以声明在原型表中(由于在调用的时候会传入self 引用)。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 11 页 - - - - - - - - - Base = ; Base.
18、new = function( self) local o = x = 0 , y = 0, t= h = 0 , ; setmetatable(o,self); self._index = self; return o; end这样当 b1,b2 被创建的时候就存在xy 和 t 域。Lua 中的继承很有趣,派生一个类只需要一个原型表的新实例:2. 继承Deriver = Base:new();Deriver 表现在看起来是一个Base 原型表的新实例,它的元表是Base重写 Deriver 的 new 方法,在 new 方法中扩充 Deriver 的新属性:Deriver.new = fun
19、ction(self) local o = getmetatable(self).new(self); o.z = 999; return o; enddobj1 = Deriver:new(); dobj1:setXY(1,2); print(dobj1.x,dobjdobj1.z); - 1 2 999Deriver 实例化的新对象 dobj1 实际上为表 o,o 表带有 Deriver 原型表中定义的所有属性 ,由于实例化时 Deriver.new 传入的 self 参数是 Deriver ,因此 o 的元表是Deriver,Deriver 的元表是 Base,这样构成了一个继承链。当派
20、生表中定义了和原型表相同的域时,会优先执行派生表中的域,因此方法重载和多态性是天然产生的。四实验总结Lua是一种完全免费的脚本语言, 可以和 C/C+ 语言紧密结合 ,它的官方网站在 http:/www.lua.org./ 在网站上可以下载到lua 的源码 , 没有可执行版本 , 不过名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 11 页 - - - - - - - - - 不用担心 , 因为 lua 源码可以在任何一种C/C+ 的编译器上编译 .如果要学习 Lua,
21、官方网站上的 Reference是必备的,上面有每个命令的用法,非常详细。Lua语言是一种成熟的机器语言,它十分快速、便携性好、功能强大、可嵌入式、内存占用率小,并且是免费的。经过 Lua语言的学习,我们对它的功能和使用有了基本的了解:Lua的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。它由标准 C编写而成,代码简介优美,几乎在所有操作系统和平台上都可以编译,运行。但 Lua并没有提供强大的库,所以它不适合作为开发独立应用程序的语言。Lua脚本可以很容易的被C/C+ 代码调用,也可以反过来调用C/C+ 的函数,这使得 Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,Ini等文件格式,并且更容易理解和维护。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 11 页 - - - - - - - - -