Lua – Linguagem de Programação – Parte 12

Como informado na décima parte desta série de artigos sobre apresentação da linguagem Lua, esporadicamente seriam mostrados outros artigos complementares com recursos que anteriormente não foram abordados. Cumprindo o prometido, apresenta-se neste artigo recursos relacionados a definição de pausa (aguardar o acionamento da tecla Enter para continuar o fluxo do programa), definição e uso da função sleep() com o objetivo de aguardar um certo tempo em segundos e a ordenação decrescente de elementos em uma matriz do tipo vetor.

Os detalhes aqui descritos são assuntos que surgiram durante os cursos de linguagem Lua ministrados.

Pausa no Programa

A realização de pausa na execução de um programa Lua que aguarde o acionamento da tecla Enter pode ser definida com a instrução io.read '*l'.

-- inicio do programa P11_01
  io.write("Entre o 1o. valor: ")
  A = tonumber(io.read())
  io.write("Entre o 2o. valor: ")
  B = tonumber(io.read())
  X = A + B
  io.write("Soma = ", X, "\n\n")
  io.write("Acione <Enter>... ")
  io.read '*l'
-- fim do programa P11_01

Em seguida escreva o código do programa em um editor de texto, gravando-o com o nome P11_01.lua e execute-o com a linha de comando lua 5.1 P11_01.lua.

O programa P11_01.lua além do uso do recurso de pausa que aguarda o uso da tecla Enter faz uso da função tonumber() para a leitura de um valor numérico.

A leitura de valores numéricos na linguagem Lua pode ser efetuada com o uso da forma io.read("*number") ou com o uso da forma tonumber(io.read()). A diferença entre os dois métodos de entrada é que o segundo faz a limpeza do buffer do teclado após a entrada dos valores.

Função sleep()

A linguagem Lua não possui definida uma função que efetue uma pausa controlada por tempo, mas por meio da função clock() da biblioteca io é possível criar tal função. Note o código seguinte.

-- inicio do programa P11_02
  function sleep(TMP)
    local I = os.clock()
    while (os.clock() - I <= TMP) do
    end
  end

  function pause()
    io.read '*l'
  end
 
  FAT = 1
  CONT = 1
 
  for CONT = 1, 5, 1 do
    FAT = FAT * CONT
  end
 
  sleep(4) -- 4 segundos
  print(FAT)
  
  io.write("\nAcione <Enter>... ")
  pause()

-- fim do programa P11_02

Em seguida escreva o código do programa em um editor de texto, gravando-o com o nome P11_02.lua e execute-o com a linha de comando lua 5.1 P11_02.lua.

A função definida sleep() recebe como valor de parâmetro o limite de tempo de espera em segundos e marca o tempo inicial para a variável I a partir do tempo atual. O ciclo while consome o tempo de execução dentro do limite estabelecido para TMP enquanto o tempo atual descontado do valor inicial de tempo em I seja menor ou igual ao valor definido para TMP.

Ordenação Decrescente/Descendente

Anteriormente, no artigo 7, foi abordado o uso da função sort() da biblioteca table para a colocação de elementos em ordem crescente ou ascendente, mas nada foi dito sobre como proceder para a definição de uma ordem de disposição inversa.

Neste sentido o uso da função sort() é efetuado de maneira diferenciada. Observe o programa exemplo a seguir.

-- inicio do programa P11_03

  local VETOR = {}
 
  for I = 1, 5 do
    NOME = io.read()
    table.insert(VETOR, NOME)
  end
 
  for I = 1, 5 do
    print("["..I.."] = "..VETOR[I])
  end
 
  table.sort(VETOR,
    function(A, B) return A > B end)
  print()
 
  for I = 1, 5 do
    print("["..I.."] = "..VETOR[I])
  end
 
-- fim do programa P11_03

Em seguida escreva o código do programa em um editor de texto, gravando-o com o nome P11_03.lua e execute-o com a linha de comando lua 5.1 P11_03.lua.

Após entrar cinco nomes serão mostrados os nomes na ordem de entrada e ordenados de forma descendente.

Para conseguir ordenar os elementos do vetor em ordem decrescente faz-se uso no segundo parâmetro de sort() de um recurso baseado em uma função em estilo lambda: function(A, B) return A > B end que recebe dois parâmetros e retorna o maior entre os dois valores fornecidos.

Conclusão

Neste artigo foi apresentado o uso de recursos para a definição de pausa, ciclos de tempo em segundos e ordenação de vetor em sentido decrescente/descendente.

Em outras ocasiões serão apresentados outras possibilidades de uso da linguagem Lua. Até lá.

Publicado na edição 46 (PDF) da Revista PROGRAMAR.