Lasanha

Lasanha

Exercício de aprendizagem

Introdução

Ao longo de todo o percurso de Julia vais ter de tratar a tua solução como se fosse uma pequena biblioteca, ou seja, vais precisar de definir funções, tipos, etc., que vão depois ser executados contra um conjunto de testes. Por isso mesmo, vamos começar por introduzir as funções com nome como o primeiro conceito de todos.

A Julia é uma linguagem de programação dinâmica e fortemente tipada. O estilo de programação é sobretudo funcional, ainda que com mais flexibilidade do que em linguagens como Haskell.

Variáveis e atribuição

Não precisas de declarar uma variável com antecedência. Basta atribuir um valor a um nome adequado:

julia> myvar = 42  # an integer
42

julia> name = "Maria"  # strings are surrounded by double-quotes ""
"Maria"

Constantes

Se um valor tiver de estar disponível ao longo de todo o programa, mas não for suposto mudar, o melhor é marcá-lo como uma constante.

Antepor a palavra-chave const a uma atribuição permite ao compilador gerar código mais eficiente do que seria possível com uma variável.

As constantes também ajudam a proteger-te contra erros ao programar. Se tentares mudar o valor de uma const por engano, recebes um aviso:

julia> const answer = 42
42

julia> answer = 24
WARNING: redefinition of constant Main.answer. This may fail, cause incorrect answers, or produce other errors.
24

Repara que uma const só pode ser declarada fora de qualquer função. Normalmente fica perto do topo do ficheiro *.jl, antes das definições de funções.

Operadores aritméticos

São os mesmos que em muitas outras linguagens:

2 + 3  # 5 (addition)
2 - 3  # -1 (subtraction)
2 * 3  # 6 (multiplication)
8 / 2  # 4.0 (division with floating-point result)
8 % 3  # 2 (remainder)

Funções

Há duas formas comuns de definir uma função com nome em Julia:

  1. Com a palavra-chave function

    function muladd(x, y, z)
        x * y + z
    end
    

    A indentação de 4 espaços é a convenção habitual para facilitar a leitura, mas o compilador ignora isso. A palavra-chave end é essencial.

    Repara que podíamos ter escrito return x * y + z. No entanto, as funções em Julia devolvem sempre a última expressão avaliada, por isso a palavra-chave return é opcional. Muitos programadores preferem incluí-la para tornar as suas intenções mais explícitas.

  2. Com a "forma de atribuição"

    muladd(x, y, z) = x * y + z
    

    É o que se usa mais habitualmente para criar funções concisas de uma única expressão.

    A palavra-chave return nunca se usa na forma de atribuição.

As duas formas são equivalentes e usam-se exatamente da mesma maneira, por isso escolhe a que for mais legível.

Para invocar uma função, indicas o nome dela e passas argumentos para cada um dos parâmetros da função:

# invoking a function
muladd(10, 5, 1)

# and of course you can invoke a function within the body of another function:
square_plus_one(x) = muladd(x, x, 1)

Convenções de nomenclatura

Como em muitas linguagens, a Julia exige que os nomes (de variáveis, funções e muitas outras coisas) comecem por uma letra, seguida de qualquer combinação de letras, algarismos e underscores.

Por convenção, os nomes de variáveis, constantes e funções escrevem-se em minúsculas, com os underscores reduzidos a um mínimo razoável.

Instruções

Neste exercício vais escrever algum código para te ajudar a cozinhar uma lasanha fantástica, tirada do teu livro de receitas preferido.

Tens quatro tarefas, todas relacionadas com o tempo gasto a cozinhar a lasanha.

1. Guarda o tempo de cozedura esperado numa constante

Define a constante expected_bake_time, que devolve quantos minutos a lasanha deve cozer no forno.

De acordo com o livro de receitas, a lasanha tem de estar no forno num total de 60 minutos.

julia> expected_bake_time
60

2. Calcula o tempo de preparação em minutos

Define a função preparation_time, que recebe como argumento o número de camadas que adicionaste à lasanha e devolve quantos minutos gastaste a preparar a lasanha, partindo do princípio de que cada camada demora 2 minutos a preparar.

julia> preparation_time(4)
8

3. Calcula o tempo restante no forno em minutos

Define a função remaining_time, que recebe como parâmetro os minutos reais que a lasanha já esteve no forno e devolve quantos minutos a lasanha ainda tem de permanecer no forno.

julia> remaining_time(50)
10

4. Calcula o tempo total de trabalho em minutos

Define a função total_working_time, que recebe dois argumentos: o primeiro argumento é o número de camadas que adicionaste à lasanha e o segundo argumento é o número de minutos que a lasanha já esteve no forno.

A função deve devolver quantos minutos, no total, trabalhaste a cozinhar a lasanha. Isto corresponde à soma do tempo de preparação em minutos com o tempo, em minutos, que a lasanha já passou no forno até ao momento.

julia> total_working_time(3, 20)
26
Editar via GitHub A ligação abre numa nova janela ou separador
Julia Exercism

Estás pronto para começar Lasanha?

Inscreve-te no Exercism para aprenderes e dominares Julia com 35 conceitos128 exercícios, e mentoria humana real, tudo grátis.