Matriz

Matriz

Médio

Instruções

Dada uma string que representa uma matriz de números, devolve as linhas e as colunas dessa matriz.

Assim, dada uma string com quebras de linha incorporadas como esta:

9 8 7
5 3 2
6 6 7

que representa esta matriz:

    1  2  3
  |---------
1 | 9  8  7
2 | 5  3  2
3 | 6  6  7

o teu código deve conseguir produzir:

  • Uma lista das linhas, lendo cada linha da esquerda para a direita enquanto percorres as linhas de cima para baixo,
  • Uma lista das colunas, lendo cada coluna de cima para baixo enquanto avanças da esquerda para a direita.

As linhas da nossa matriz de exemplo:

  • 9, 8, 7
  • 5, 3, 2
  • 6, 6, 7

E as suas colunas:

  • 9, 5, 6
  • 8, 3, 6
  • 7, 2, 7

Novos conceitos de AWK

Este é o primeiro exercício em que a solução não é um script "main". O objetivo é escrever uma biblioteca de funções para serem incluídas noutros programas awk. Há vários conceitos novos e interessantes para explorar neste exercício.

As secções seguintes assinaladas com "(gawk)" são extensões específicas do GNU awk.

Ler a partir de um ficheiro

Neste exercício, vais ler dados de um ficheiro, e não do fluxo de entrada principal. Lê sobre getline no manual do Gnu awk, em particular as formas Getline/File e Getline/Variable/File.

Mais sobre arrays

Um array bidimensional pode ser uma forma de implementar esta solução. O GNU awk tem duas formas de representar um:

Incluir ficheiros (gawk)

Repara na diretiva @include no ficheiro de teste.
Isto diz ao gawk para ler e avaliar o ficheiro indicado.

Espaços de nomes (gawk)

Todas as variáveis do awk são globais (exceto os parâmetros de função, que são locais à função). Há um elevado potencial de colisões de nomes, sobretudo quando se incluem bibliotecas de terceiros. Os espaços de nomes são uma forma de dividir o local onde as variáveis são guardadas. Repara na diretiva @namespace nos ficheiros do exercício.

O espaço de nomes predefinido chama-se "awk". Ter um espaço de nomes predefinido permite ao programador chamar uma função incorporada do awk a partir de dentro de uma função que está noutro espaço de nomes.

Como são passados os parâmetros de função

Os parâmetros do tipo array são passados por referência. As alterações feitas ao array dentro da função são visíveis em quem a chamou.

Os parâmetros que não são arrays são passados por valor.

No caso dos parâmetros sem tipo, tudo depende do que a função faz com eles:

  • se a função o inicializar como array, passa a ser um parâmetro passado por referência;
  • se a função o inicializar como um valor escalar (um número ou uma string), então não é uma referência.

Encontras todos os detalhes no manual, em Passar argumentos de função por valor ou por referência.

Variáveis locais

É possível criar variáveis com âmbito de função (locais) recorrendo a parâmetros "passados por valor". Não é um erro passar menos valores a uma função do que o número de parâmetros listados; os parâmetros a mais ficam "sem tipo" até serem utilizados. Eles estão disponíveis para lhes serem atribuídos valores escalares dentro da função, que não são guardados no espaço de nomes global.

  • Se atribuíres um valor escalar a um parâmetro, esse valor é local à função.
  • Se atribuíres um escalar a uma variável que não consta na lista de parâmetros, essa variável é global.

Por convenção, na assinatura da função aparecem primeiro os parâmetros esperados, seguidos de algum espaço em branco e, depois, os parâmetros locais. Um exemplo:

function add(a, b,    total) {
    # here, `typeof(total)` is "untyped"
    total = a + b
    # now, `typeof(total)` is "number"
    return total
}

BEGIN {
    sum = add(5, 10)
    print sum             # 15
    print typeof(total)   # untyped, meaning "total" is unused in this scope
}
Editar via GitHub A ligação abre numa nova janela ou separador
AWK Exercism

Estás pronto para começar Matriz?

Inscreve-te no Exercism para aprenderes e dominares AWK com 3 conceitos92 exercícios, e mentoria humana real, tudo grátis.