Initiation au Lua avec Scribunto/Exercices/Sur la gestion de l'environnement
Exercice 9-1
[modifier | modifier le wikicode]On considère les trois fonctions f, g, h définies par
Après avoir programmé ces trois fonctions dans un module, on écrira une fonction chrono qui accepte une fonction en argument et qui nous retourne le temps d'exécution de la fonction passée en argument.
Dans la fonction principale p.rapide, on comparera le temps d'exécution des trois fonctions f, g, h et on retournera à l'utilisateur un message indiquant la fonction qui s'exécute le plus rapidement.
Contrainte : Le nom de la fonction chrono ne devra apparaître qu'une seule fois dans la fonction p.rapide.
Le programme se trouve dans le Module:Rapidité
Son listing est :
local p = {}
function f(x)
return math.sqrt((x+1)/(x+3))
end
function g(x)
return (x*x+x+5)^2
end
function h(x)
return 1/math.log(x+5)
end
function chrono(x)
local temps = os.clock()
x(1)
return os.clock() - temps
end
function p.rapide()
local fonction = {f, g, h}
local t, ecoule, repere = 1, 1, 1
for i = 1, 3 do
ecoule = chrono(fonction[i])
if ecoule < t then
repere = i
t = ecoule
end
end
if repere == 1 then repere = "f" end
if repere == 2 then repere = "g" end
if repere == 3 then repere = "h" end
return "La fonction la plus rapide est la fonction "..repere
end
return p
{{#invoke:Rapidité|rapide}} nous donne : La fonction la plus rapide est la fonction g
Ici aussi, cet exercice est très théorique. En réalité, comme nous fonctionnons sur un système multitâche, la fonction chrono peut donner un temps d'exécution très variable en fonction du moment de son exécution. Pour avoir un certain degré de certitude sur la fonction qui est la plus rapide, il est préférable de relancer l'exécution du programme plusieurs fois en purgeant le cache et ainsi avoir une confirmation statistique du résultat.
Exercice 9-2
[modifier | modifier le wikicode]Dans le chapitre sur les fonctions basiques, nous avons écrit, pour donner un exemple d'utilisation de la fonction next, le programme suivant :
local Categorie = { ["Prénom"] = "Christine", ["Mois"] = "Avril", ["Métier"] = "Boulanger", ["Poisson"] = "Truite", ["Métal"] = "Argent", ["Planète"] = "Saturne", ["Instrument"] = "Piano"}
function p.yatil(frame)
local suivant
local trouve = false
repeat
suivant = next(Categorie,suivant) --Cherche la clé suivante et la met dans suivant
if Categorie[suivant] == frame.args[1] then trouve = true end
until suivant == nil or trouve -- On tourne dans la boucle jusqu'à ce que toute la table ait été parcourue ou jusqu'à ce qu'on ait trouvé
if trouve then
return "Le mot figure dans la table"
else
return "Le mot ne figure pas dans la table"
end
end
L'écriture de la fonction p.yatil est-elle correcte ? Donner une meilleure façon d'écrire cette fonction.
On remarque la présence de frame.args[1] dans le corps de la boucle repeat..until. Les instructions, à l'intérieur d'une boucle, peuvent être répétées un grand nombre de fois. Par conséquent, nous devons être particulièrement vigilants au temps d'exécution des instructions d'une boucle. Nous savons que frame.args[1] va chercher des informations à l'extérieur du module et consomme donc beaucoup de temps. Il est donc recommandé d’éviter de mettre frame.args[1] dans une boucle. Le programme aurait dû être écrit ainsi :
local Categorie = { ["Prénom"] = "Christine", ["Mois"] = "Avril", ["Métier"] = "Boulanger", ["Poisson"] = "Truite", ["Métal"] = "Argent", ["Planète"] = "Saturne", ["Instrument"] = "Piano"}
function p.yatil(frame)
local article = frame.args[1]
local suivant
local trouve = false
repeat
suivant = next(Categorie,suivant) --Cherche la clé suivante et la met dans suivant
if Categorie[suivant] == article then trouve = true end
until suivant == nil or trouve -- On tourne dans la boucle jusqu'à ce que toute la table ait été parcourue ou jusqu'à ce qu'on ait trouvé
if trouve then
return "Le mot figure dans la table"
else
return "Le mot ne figure pas dans la table"
end
end
Exercice 9-3
[modifier | modifier le wikicode](à 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 ?
Exercice 9-4
[modifier | modifier le wikicode](à 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 ?