Matrice

Matrice

Moyen

Instructions

Étant donné une string représentant une matrice de nombres, renvoie les lignes et les colonnes de cette matrice.

Ainsi, étant donné une string contenant des retours à la ligne, comme celle-ci :

9 8 7
5 3 2
6 6 7

qui représente cette matrice :

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

ton code doit pouvoir produire :

  • Un tableau des lignes, en lisant chaque ligne de gauche à droite tout en descendant de haut en bas dans les lignes,
  • Un tableau des colonnes, en lisant chaque colonne de haut en bas tout en allant de gauche à droite.

Les lignes de notre matrice d'exemple :

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

Et ses colonnes :

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

Nouveaux concepts AWK

C'est le premier exercice où la solution n'est pas un script main. L'objectif est d'écrire une bibliothèque de fonctions destinée à être incluse dans d'autres programmes awk. Cet exercice te fera découvrir plusieurs nouveaux concepts intéressants.

Les sections suivantes, signalées par la mention «\u00A0(gawk)\u00A0», sont des extensions propres à GNU awk.

Lis depuis un fichier

Dans cet exercice, tu liras les données depuis un fichier, et non depuis le flux d'entrée principal. Renseigne-toi sur getline dans le manuel de Gnu awk, en particulier les formes Getline/File et Getline/Variable/File.

En savoir plus sur les tableaux

Pour implémenter cette solution, on pourrait utiliser un tableau à deux dimensions. GNU awk propose deux façons de représenter un tel tableau\u00A0:

Fichiers inclus (gawk)

Remarque la directive @include présente dans le fichier de test.
Elle demande à gawk de lire et d'évaluer le fichier indiqué.

Espaces de noms (gawk)

Toutes les variables awk sont globales (à l'exception des paramètres de fonction, qui sont locaux à la fonction). Le risque de collisions de noms est élevé, en particulier lorsqu'on inclut des bibliothèques tierces. Les espaces de noms permettent de cloisonner l'endroit où les variables sont stockées. Remarque la directive @namespace dans les fichiers de l'exercice.

L'espace de noms par défaut s'appelle «\u00A0awk\u00A0». Disposer d'un espace de noms par défaut permet au programmeur d'appeler une fonction awk native depuis l'intérieur d'une fonction située dans un autre espace de noms.

Comment les paramètres de fonction sont passés

Les paramètres de type tableau sont passés par référence. Les modifications apportées au tableau dans la fonction sont visibles par l'appelant.

Les paramètres qui ne sont pas des tableaux sont passés par valeur.

Pour les paramètres non typés, tout dépend de ce que la fonction en fait\u00A0:

  • si la fonction l'initialise comme un tableau, il devient alors un paramètre passé par référence\u00A0;
  • si la fonction l'initialise comme une valeur scalaire (un nombre ou une string), il ne s'agit pas d'une référence.

Tous les détails se trouvent dans le manuel, à la section Passer les arguments de fonction par valeur ou par référence.

Variables locales

On peut créer des variables locales à une fonction en utilisant des paramètres passés «\u00A0par valeur\u00A0». Ce n'est pas une erreur de passer moins de valeurs à une fonction que le nombre de paramètres déclarés\u00A0; les paramètres en trop restent «\u00A0non typés\u00A0» jusqu'à ce qu'ils soient utilisés. Ils peuvent recevoir des valeurs scalaires dans la fonction sans être stockés dans l'espace de noms global.

  • Si tu affectes une valeur scalaire à un paramètre, celle-ci est locale à la fonction.
  • Si tu affectes un scalaire à une variable qui ne figure pas dans la liste des paramètres, cette variable est globale.

Par convention, dans la signature de la fonction, les paramètres attendus apparaissent en premier, suivis d'un espace, puis des paramètres locaux. Un exemple\u00A0:

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
}
Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet
AWK Exercism

Prêt à commencer Matrice ?

Inscris-toi sur Exercism pour apprendre et maîtriser AWK avec 3 concepts92 exercices, et un vrai mentorat humain, le tout gratuitement.