Initiation au Lua avec Scribunto/Exercices/Sur les fonctions basiques
Exercice 5-1
modifierUn des problèmes possibles, lorsqu'on écrit une grande table dont les clés sont des chaînes de caractère, est que, sans le faire exprès, on risque d’utiliser la même clé plusieurs fois. Nous allons donc étudier ce cas de figure dans cet exercice.
Soit la table suivante :
local Categorie = { ["Prénom"] = "Christine", ["Mois"] = "Avril", ["Métier"] = "Boulanger", ["Poisson"] = "Truite",
["Métal"] = "Argent", ["Poisson"] = "Sardine", ["Planète"] = "Saturne", ["Instrument"] = "Piano"}
Nous voyons que nous avons utilisé la clé "Poisson" deux fois.
Écrire une fonction p.listecle qui permet d'énumérer le contenu de cette table en utilisant la fonction pairs.
Que remarque-t-on ?
La solution de l'exercice se trouve dans le Module:Doublon.
local p = {}
local Categorie = { ["Prénom"] = "Christine", ["Mois"] = "Avril", ["Métier"] = "Boulanger", ["Poisson"] = "Truite",
["Métal"] = "Argent", ["Poisson"] = "Sardine", ["Planète"] = "Saturne", ["Instrument"] = "Piano"}
function p.listecle()
local reponse = "<u>Description de la table</u>"
for index, objet in pairs(Categorie) do
reponse = reponse.."<br />à la clé numéro "..index.." se trouve l’objet "..objet.."."
end
return reponse
end
return p
{{#invoke:Doublon|listecle}} nous donne :
Description de la table
à la clé numéro Prénom se trouve l’objet Christine.
à la clé numéro Instrument se trouve l’objet Piano.
à la clé numéro Planète se trouve l’objet Saturne.
à la clé numéro Métal se trouve l’objet Argent.
à la clé numéro Mois se trouve l’objet Avril.
à la clé numéro Poisson se trouve l’objet Sardine.
à la clé numéro Métier se trouve l’objet Boulanger.
Nous remarquons que l'erreur n’est pas signalée. Une des deux clés "Poisson" n'a, tout simplement, pas été enregistrée. Lorsque l’on écrit une longue table, nous devons donc faire particulièrement attention de ne pas utiliser deux fois la même clé car cette erreur n’est pas signalée et l'une des deux clés ne sera pas prise en compte.
Exercice 5-2
modifierNous savons que la fonction pairs retourne trois valeurs : Une fonction itérative, la table concernée et la valeur nil. Écrire une fonction p.test testant le type des valeurs retournées par la fonction ainsi que leur action sur un exemple. Réécrire la fonction p.farfouille donnée en exemple dans le cours en court-circuitant la fonction pairs. On utilisera la fonction next comme fonction itérative.
Le programme se trouve dans le Module:iteratif.
local p = {}
local fouillis = {["Nourriture"] = "Fromage", ["Boisson"] = "Limonade", ["Bestiole"] = "Cafard", ["Couvert"] = "Fourchette", ["Truc"] = "Machin chose"}
function p.test()
local f,t,n = pairs(fouillis)
local reponse = ""
reponse = reponse.."<br />La première valeur est de type "..type(f).." et la clé suivant la clé couvert est la clé "..f(fouillis,"Couvert")
reponse = reponse.."<br />La seconde valeur est de type "..type(t).." et t[Boisson] = "..t["Boisson"]
reponse = reponse.."<br />La troisième valeur est de type "..type(n)
return reponse
end
function p.farfouille()
local reponse = " "
for index, objet in next,fouillis,nil do
reponse = reponse.."<br />à la clé "..index.." se trouve l’objet "..objet.."."
end
return reponse
end
return p
{{#invoke:iteratif|test}} nous retourne :
La première valeur est de type function et la clé suivant la clé couvert est la clé Truc
La seconde valeur est de type table et t[Boisson] = Limonade
La troisième valeur est de type nil
{{#invoke:iteratif|farfouille}} nous retourne :
à la clé Nourriture se trouve l’objet Fromage.
à la clé Boisson se trouve l’objet Limonade.
à la clé Couvert se trouve l’objet Fourchette.
à la clé Truc se trouve l’objet Machin chose.
à la clé Bestiole se trouve l’objet Cafard.
Exercice 5-3
modifierMême exercice que précédemment avec la fonction p.description donnée en exemple dans le cours pour la fonction ipairs :
local souk = {"flute", "pipo", "manche à balaie", "serpière", "jeu de cartes", "coton tige", "tourne vis", "rateau", "stylo", "poupée"}
function p.description()
local reponse = " "
for index, objet in ipairs(souk) do
reponse = reponse.."<br />à la clé numéro "..index.." se trouve l’objet "..objet.."."
end
return reponse
end
On court-circuitera la fonction ipairs en utilisant une fonction itérative suivant que l’on écrira pour l’occasion.
La solution se trouve dans le Module:iteratif
local souk = {"flute", "pipo", "manche à balaie", "serpière", "jeu de cartes", "coton tige", "tourne vis", "rateau", "stylo", "poupée"}
function suivant(tab,n)
if n == nil then n = 0 end
if tab[n+1] == nil then
return nil,nil
else
return n+1,tab[n+1]
end
end
function p.description()
local reponse = " "
for index, objet in suivant,souk,nil do
reponse = reponse.."<br />à la clé numéro "..index.." se trouve l’objet "..objet.."."
end
return reponse
end
{{#invoke:iteratif|description}} nous retourne :
à la clé numéro 1 se trouve l’objet flute.
à la clé numéro 2 se trouve l’objet pipo.
à la clé numéro 3 se trouve l’objet manche à balaie.
à la clé numéro 4 se trouve l’objet serpière.
à la clé numéro 5 se trouve l’objet jeu de cartes.
à la clé numéro 6 se trouve l’objet coton tige.
à la clé numéro 7 se trouve l’objet tourne vis.
à la clé numéro 8 se trouve l’objet rateau.
à la clé numéro 9 se trouve l’objet stylo.
à la clé numéro 10 se trouve l’objet poupée.
Exercice 5-4
modifier(à compléter)
Cette solution n'a pas été rédigée. Vous pouvez le faire en modifiant le paramètre « contenu
» du modèle. Comment faire ?