lua练习题

本文展示了使用Lua进行数组操作,包括获取最大值、计算阶乘,以及实现斐波那契数列。此外,还涵盖了循环、函数、条件判断和递归等基本编程概念,如输入输出、循环执行函数、判断闰年和平年、数组排序及自定义迭代器的创建。
摘要由CSDN通过智能技术生成
--1、获得数组中最大值
--知识点:定义数组、使用math.max取参数中最大值、使用table.unpack将集合拆分为参数列表。
arr={1,2,3,4,5,6,7,8,9,0}
max=math.max(table.unpack(arr))
print(max)

--2、实现 输入数字 num 与输入次方 n  进行计算结果,(中间的print为查看循环输出,输出结果顺序为终端列表的从下到上)
--知识点:16行循环执行函数
function my(x,n)
   local sum
   if n == 1 then
       sum = x
      print(000)
   else
       sum = my(x, n - 1) * x
      print(n)
   end
   return sum
end

print('请输入数字')
num = io.read()

print('请输入该数的次方')
n = io.read()

print(num.."的"..n.."次方是:"..my(num,n))

--3、定义一个函数,传入两个参数并相加,相减,相乘,相除,取余,返回他们的运行结果
--知识点:利用..来进行字符串拼接
function my(x,y)
    local xy1 = x + y
    print(userNumberOne..'+'..userNumberTwo..'='..xy1)
    local xy2 = x - y
    print(userNumberOne..'-'..userNumberTwo..'='..xy2)
    local xy3 = x * y
    print(userNumberOne..'*'..userNumberTwo..'='..xy3)
    local xy4 = x / y
    print(userNumberOne..'/'..userNumberTwo..'='..xy4)
    local xy5 = x % y
    print(userNumberOne..'%'..userNumberTwo..'='..xy5)
end
print("请输入第一个数")
userNumberOne = io.read()

print("请输入第二个数")
userNumberTwo = io.read()
 
print(my(userNumberOne,userNumberTwo))

--4、定义一个函数利用循环让这个函数能够计算n的阶乘
--知识点:repeat...until 循环 ,先执行repeat 当 until后的 判断语句(n==0) 为ture时停止,否则重复执行repeat
function my(n)
   local i=1
   if n<1 then
      return 1
   end
   repeat i=n*i
      n=n-1
   until n==0
   print(i)
end

print(my(5))

--5、返回数组的最大值索引和最大值
--知识点:ipairs为迭代器,i为值在数组中的索引(下标、位置),val为值本身
local function maximum (a)
    local mi = 1             -- 最大值索引
    local m = a[mi]          -- 最大值
    for i,val in ipairs(a) do
       if val > m then
           mi = i
           m = val
       end
    end
    return m, mi
end

print(maximum({8,10,23,12,5}))


--6、斐波那契数列
function my(n)
    if n == 0 or n == 1 then
        return 0
    elseif n == 2 then
        return 1
    elseif n == 3 then
        return 2
    else
        return my(n - 1) + my(n - 2)
    end
end
 
print(my(5))

--7、输出三角形的形状
--知识点:嵌套循环
a = 10
for i = 1, a, 1 do
    for j = 1, a - i, 1 do
        io.write(' ')
    end
    for k = 1, 2 * i - 1, 1 do
        io.write('*')
    end
    print(a)
end

--8、99乘法表
--知识点:嵌套循环
for a = 1,9 do                
   local s = ""              
   for b=1,9 do              
       if b <= a then        
           s = s..a.."X"..b.."="..a*b 
           if a ~= b then    
               s = s.."\t"   
           end
       end
   end
   print(s)                  
end

--9、要求用户输入一个年份,判断并输出该年份是闰年还是平年。
--知识点:%为取余  ~=为不等于
 year = io.read()
 if(year%4==0 and year%100~=0) then
   print("闰年")
 else
   print("平年")
 end

 --10、要求用户输入一个年份和一个月份,判断(要求使用嵌套的if…else和switch分别判断一次)该年该月有多少天。
print("请输入年份")
year = io.read();
print("请输入月份")
month = io.read();
if(year%4 == 0 and year%100 ~= 0) then
    print(year.."是闰年:366天")
    local month = tonumber(month)
    if(month == 2) then
        print(month.."月是28天")
    end
else                                   
    print(year.."是平年:365天")      
    local month = tonumber(month)
    if(month == 2) then
        print(month.."月是29天")
    end
end
 
monthMax = {1,3,5,7,8,10,12}        
months = {4,6,9,11}                    
for i,m in ipairs(monthMax)do        
    local lable = tonumber(month)    
    if m == lable then            
        print(lable.."月是31天")
    end
end
 
for i,m in ipairs(months)do        
    local lable = tonumber(month)
    if m == lable then
        print(lable.."月是30天")
    end
end

--11、使用while循环求1~100以内所有奇数的和。
i = 1;
J = 1;
while(i < 99)
do
    local num = i + 2
    i = num
    J = J + i
end
print(J)

--12、将数组进行逐条显示
--知识点:1.table.sort() 为排序函数,自开始到结束将数组中的内容进行从小到大的排序显示;
--在 #am 其中 # 的作用是显示数组中数据长度,在此处为4
am = {"cc","nn","ll","dd"}
arr = function ()
    for i =1,#am do
        print(i..","..am[i])
    end
end
table.sort(am)
arr()

--13、冒泡排序的另外一种写法
--知识点:利用比较将数组中数据前后更换位置;
function bubble_sort(array)
   local tmp = 0
   for i =1,#array-1 do 
      for j =1,#array-i do 
            if array[j]>array[j+1] then 
               tmp = array[j]
               array[j]=array[j+1]
               array[j+1] = tmp
            end
      end
   end
end
function main(...)
   local arr = {54,25,66,45,555,666,321,88,665,89}
   bubble_sort(arr)
   for i,v in pairs (arr) do 
      print("排序后的结果为:",i.."->"..v)
   end
end
main()

--14、按降序进行排列
--知识点:table.sort(数组,) 
tabl={"b", "a", "g", "c"}
function sortFunc(a,b) 
   return a>b 
end

table.sort(tabl,sortFunc)
print(table.concat(tabl,","))
 
--15.获得table中最大值的例子
--知识点:使用pairs()遍历集合,t为集合
--pairs 和 ipairs(5、10笔记)异同
--同:
--都是能遍历集合(表、数组)
--异:
--ipairs 仅仅遍历值,按照索引升序遍历,索引中断停止遍历。即不能返回 nil,只能返回数字 0,如果遇到 nil 则退出。它只能遍历到集合中出现的第一个不是整数的 key。
--pairs 能遍历集合的所有元素。即 pairs 可以遍历集合中所有的 key,并且除了迭代器本身以及遍历表本身还可以返回 nil。
 function maxTable(t)
     local temp = nil
     for k,v in pairs(t) do 
         if(temp==nil) then 
             temp = v
         end
         if temp<v then
             temp = v
         end
     end
     return temp
 end
 tab = {[1]=55,[2]=43,[3]=89,[4]=9,[5]=1}
 print("该表中的最大值为:",maxTable(tab))

--16.创建自己的迭代器
--知识点:手写迭代器
array2 = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}

function elementIterator2(countTable)
   local inde =0 
   local coun1 = #countTable  --获得其长度
   return function()   --匿名函数
         inde = inde+1   
         if inde<=coun1 then
            return countTable[inde]
         end
   end
end

for element in elementIterator2(array2) do 
   print(element)
end

--17.一个简单的例子来实现迭代,实现数字n的平方
function square(iteratorMaxCount,currentNumber)
   if currentNumber<iteratorMaxCount then 
         currentNumber = currentNumber+1
         return currentNumber,currentNumber*currentNumber
   end
end
for i ,n in square ,3,0 do 
   print(i,n)
end

--18.lua中我们可以将“函数作为参数”传递给“函数”>> 函数可以作为数据赋值,也可以作为参数进行传递;等同于C#中的委托(delegate)
--知识点:函数PrintMy作为add函数的第三个参数进行传递
 PrintMy = function(parm)
   print("打印函数-print",parm,"????")
end
function add(num1,num2,functionP)
   re = num1+num2
   functionP(re)
end
PrintMy(10)
add(5,10,PrintMy)

--19.求几个数的平均值
--知识点:
--average(...)其中...代表可变参数,此函数为可变函数;
--arg={...}其中...代表可变参数,将可变参数赋值给了这个变量
function average(...)
   resule = 0
   local arg={...}
   for i,v in ipairs(arg) do 
      result = resule+v
   end
   print("总共传入"..#arg.."个数")
   print("平均值为",result/#arg)
end
average(10,20,5,36,5,8)

--20.将阿拉佰数字改成汉字形式的数字 
--tostring为将输入内容转换为字符串格式;#为取其长度
local function NumToCn(num)
   local size = #tostring(num)  --先转换为字符串,然后 求其长度
   local Cn = ""
   local StrCn = {"一","二","三","四","五","六","七","八","九"}
   for i =1,size do 
      Cn = Cn..StrCn[tonumber(string.sub(tostring(num),i,i))]
   end
   return Cn
end
print(NumToCn(7788555789))  --竟然不能写很多函数,如果是很多的话,会报错
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值