练习1.1:运行阶乘的示例并观察,如果输入负数,程序会出现什么问题?试着修改代码来解决问题。

答:当输入负数时,循环无法终止,因为原本程序中的终止条件为n==0,而在输入为负数情况下,无法达成此终止条件。

程序在输入为负数时会失效,在输入为0和整数以外的其他数时都会失效,因为每次迭代将值减少1;在其他情况下,无法出现恰好==0的终止条件,从而导致堆栈溢出。

解决办法有两个思路:1.在调用方进行约束;2.在被调用方进行约束。

为函数本身简单起见,函数中终止条件修改为<=0,调用方负责传入的数值为非负整数。最后得到的代码如下:

--定义一个计算阶乘的函数
function fact(n)
if n<=0 then
return 1;
else
return n*fact(n-1);
end
end print("enter a number:");
a= io.input():read("n");--读取一个数字
print(fact(math.max(0,math.floor(a))));  

练习1.2:分别使用-l参数和dofile运行twice示例,并感受你喜欢哪种方式。

--方式1: -l
--重要提示:必须在lua解释器之外运行,例如cmd环境中,否则会报错,无法执行。
lua -llib1
--或者
lua -l lib1
--重要:千万不要输入.lua后缀,否则会报错,无法执行。
--这样载入库之后就可以在lua 交互环境中使用twice了 --方式2: dofile
--重要提示:指令必须由lua解释器来执行,在cmd环境中执行。
dofile "lib1.lua"--引号不可省略,.lua不可省略
--【【
两者的区别:
1.前者载入的库,后者读取的是文件。后缀不同,对象有形式上的区别。
2.使用环境不同:前者在解释器之外;后者在解释器环境之内。
由于调试中通常处于解释器环境,可能后者用得更多。如书中所言,一边在解释器中dofile,一边在编辑器中编辑,这样操作,比较爽利。
--】】

练习1.3:你是否能够举出其他使用“--”作为注释的语言?

答:不知道。

练习1.4:以下字符串中哪些是有效的标识符?

___,  _end,End,end,until?,nil,NULL,one-step

答:one-step中有非法字符"-",NULL,nil,end都是关键字;until?中有非法字符”?“,前面三个都是有效的标识符。

练习1.5:表达式type(nil)==nil的值是什么?你可以直接在Lua中运行来得到答案,但是你能够解释原因吗?

答:值为false,因为type的返回值为字符串,与nil的类型不同,所以不可能相等,所以值为false.

练习1.6:除了使用函数type外,如何检查一个值是否为Boolean类型?

答:假设检查形式为是Boolean类型就返回true,否则返回false.

function isBoolean( value )
-- body
return (value==true or value==false);
end

练习1.7:考虑如下的表达式:

(x and y and (not z)) or ((not y) and x)

其中的括号是否是必须的?你是否推荐在这个表达式中使用括号?

答:not的优先级最高,因此,not的括号首先不是必须的;and优先度高于or;由此可见,从语义角度,括号没有必要;但为了清晰起见,在这个表达式中应当使用括号。

练习1.8:请编写一个可以打印出脚本自身名称的程序(事先不知道脚本自身的名称)。

 

lua程序设计 第一章习题答案的更多相关文章

  1. javascript高级程序设计第一章有感

    第一章JavaScript简介 Javascript的诞生最早是为了处理表单数据验证的问题,以前主要是使用perl这个强大的服务端脚本语言处理的.在未诞生javascript之前, 人们每次提交表单就 ...

  2. 读书笔记 - javascript 高级程序设计 - 第一章 简介

      第一章 简介   诞生时间 1995 最初用途 客服端验证 第一版标准 注意是标准 1997年 Ecma-262  一个完整的js实现由三部分组成 ECMAScript DOM 文档对象模型 BO ...

  3. 谭浩强 c++程序设计第一章课后习题 第10题

    #include <iostream> using namespace std; int main() { int a,b,c; cout<<"请输入三个整数类型的数 ...

  4. 谭浩强 c++程序设计第一章课后习题 第7题

    #include <iostream> using namespace std; int main() { int a,b,c; int f(int x,int y,int z);//这是 ...

  5. C++面向对象程序设计第三章习题答案解析

    整理一下自己写的作业,供考试前复习用,哈哈 进入正题!!! 题目: 2.分析下面的程序,写出其运行时的输出结果 这里就不展示课本源代码,直接给出修改后的代码,错误部分代码已给出具体的注释 #inclu ...

  6. 04373 C++程序设计 2019版 第一章习题五、程序设计题

    题目: 1.编写一个程序,将从键盘输入的n个字符串保存在一个一维数组A中.在输入字符串之前,先输入n的值.要求,数组A需要动态申请空间,程序运行结束前再释放掉. #include <iostre ...

  7. Java语言程序设计基础篇第10版第5章习题答案

    5.1 1 public class Demo { public static void main(String[] args) { // 创建一个输入对象 java.util.Scanner inp ...

  8. Python《学习手册:第一章-习题》

    人们选择Python的六大主要原因是什么? 软件质量:Python注重可读性.一致性和软件质量. Python代码的设计致力于可读性,因此具备了比传统脚本语言更优秀的可重用性和可维护性. Python ...

  9. 算法竞赛入门经典第二版第一章习题-(练习Java和C++语法)

    习题1-1 平均数(average) 输入三个整数,输出他们的平均值,保留三位小数 Java: package suanfa; import java.util.Scanner; public cla ...

随机推荐

  1. [Google Guava] 2.3-强大的集合工具类:java.util.Collections中未包含的集合工具

    原文链接 译文链接 译者:沈义扬,校对:丁一 尚未完成: Queues, Tables工具类 任何对JDK集合框架有经验的程序员都熟悉和喜欢java.util.Collections包含的工具方法.G ...

  2. Java 加解密算法

    目前加密算法中分两种 一种是对称加密,一种是非对称加密 那么什么是对称加密呢?对称加密可以理解为加密和解密用的是一个钥匙. 而非对称加密,加锁用的是一个钥匙,而解锁用的是另外一个钥匙. 目前市面上用的 ...

  3. 用pyinstaller打包python程序、打包pyqt程序

    将.py脚本拷贝到一个文件夹中: 然后shift+右键,打开Powershell窗口: -F:设置打包为一个.exe文件.(缺点打开速度慢,不加-F则不打包为一个.exe,优点简洁方便) -w:设置不 ...

  4. 数据结构---Set和Map

    1.Set数据结构 Set本质上是一个没有重复数据,但是具有irerator接口可以遍历的一种集合. Set本身也是一种数据结构的构造函数. 1.Set的初始化 var obj = new Set(参 ...

  5. Oracle 11g关闭用户连接审计

    sys.aud$表数据量增长较快.这时,不想关闭数据库的审计,但是又不想频繁的清理sys.aud$表.可进行如下操作关闭数据库连接的审计 noaudit connect;

  6. 富文本编辑器粘贴word内容

    很多时候我们用一些管理系统的时候,发布新闻.公告等文字类信息时,希望能很快的将word里面的内容直接粘贴到富文本编辑器里面,然后发布出来.减少排版复杂的工作量. 下面是借用百度doc 来快速实现这个w ...

  7. P3979 遥远的国度 树剖

    P3979 遥远的国度 树剖 题面 需要想一下的树剖题,对于询问三需要处理换跟后的情况.我们以1为树根跑一遍剖分,对于换跟进行分类讨论,算出实际答案.讨论有三种情况: (以1为树根的树上) 跟在询问节 ...

  8. 逆元 x

    逆元: 丢线 1.首先定义: 若存在正整数a,x,m,且满足ax≡1(mod m),则称a是x的乘法逆元,或称x是a的乘法逆元. Eg: 模7意义下,3的乘法逆元是5(或模7意义下,5的乘法逆元是3) ...

  9. CF55D Beautiful numbers (数位dp)

    题目链接 题解 一个数能被一些数整除,那么一定被这些数的\(lcm\)整除 那么我们容易想到根据\(lcm\)设状态 我们可以发现有用的\(lcm\)只有\(48\)个 那么按照一般的数位\(dp\) ...

  10. Ubuntu14.04 系统复制迁移到新的机器上

    1.打包系统文件 制作启动盘,然后进入bios, #进入bios的boot标签选择sandisk启动 如果没有找到u盘进入save & exit标签页选择boot override中的sand ...