Initiation au Lua avec Scribunto/Exercices/Sur les méta-tables
Exercice 10-1
modifierOn considère un programme gérant des comptes se trouvant dans une table appelée banque dont l'accès se fait avec des clés sous forme de chaîne de caractères indiquant le nom d'une personne ayant un compte dans la table banque. Nous savons que, lorsque l’on essaye d'accéder à une table avec une clé qui n'existe pas, on obtient nil. Dans cet exercice, on modifiera ce comportement en faisant en sorte que, lorsque l’on essaye d'accéder à un compte dans la banque avec une clé indiquant un nom inexistant dans la banque, alors le compte doit être automatiquement créé avec une valeur égale au nombre 0 et on doit avoir comme retour une chaîne de caractères indiquant "compte créé". En utilisant ce comportement particulier, écrire une fonction p.place dans un module qui nous permettra de placer une certaine somme en banque sur le compte d'une personne dont on indiquera le nom. Si, par exemple, on souhaite placer 20 euros sur le compte d'Annabelle, on écrira {{#invoque:"nom du module"|place|Annabelle|20}}. En retour, on devra avoir un message indiquant si un nouveau compte a été créé et si l'opération s'est bien déroulée (on gérera les erreurs possibles).
Pour fixer les idées nous poserons que la table banque sera initialisée ainsi :
local banque = {["Jean"]=150,["Aurore"]=80,["Cindy"]=10,["Pénéloppe"]=110,["Gabriel"]=320}
Contrainte : Le programme ne devra utiliser qu'une seule table.
Le programme se trouve dans le module:Gestion.
local p = {}
local banque = {["Jean"]=150,["Aurore"]=80,["Cindy"]=10,["Pénéloppe"]=110,["Gabriel"]=320}
setmetatable(banque,banque)
function banque.__index(tab,cle)
tab[cle] = 0
return "compte créé"
end
function p.place(frame)
local nom = frame.args[1]
local argent = tonumber(frame.args[2])
local creation = banque[nom]
local reponse = " "
if creation == "compte créé" then
reponse = reponse.."Le compte a été créé."
end
if argent == nil then
reponse = reponse.."La somme que vous avez rentrée n'a pas pu être décriptée."
else
banque[nom] = banque[nom] + argent
reponse = reponse..nom.." a maintenant "..banque[nom].." euros."
end
return reponse
end
return p
Comme l'énoncé nous imposait d’utiliser une seule table, nous avons déclaré la table banque comme étant sa propre méta-table.
{{#invoke:Gestion|place|Pénéloppe|30}}, nous donne : Pénéloppe a maintenant 140 euros.
{{#invoke:Gestion|place|Louise|70}}, nous donne : Le compte a été créé.Louise a maintenant 70 euros.
{{#invoke:Gestion|place|Jean|vingt euros}}, nous donne : La somme que vous avez rentrée n'a pas pu être décriptée.
Exercice 10-2
modifierSoit un espace vectoriel de dimension 3. Soit deux vecteurs A et B de coordonnées respectives (2,7,4) et (3,2,9). Écrire un programme permettant de faire le produit vectoriel de A et B en utilisant une instruction sous la forme P = A*B.
Le produit vectoriel se définit ainsi :
Le programme se trouve dans le module:Produit
local p = {}
local A = {2,7,4}
local B = {3,2,9}
local Vecteur = {}
setmetatable(A,Vecteur)
setmetatable(B,Vecteur)
function Vecteur.__mul(s,t)
local u = {}
u[1] = s[2]*t[3] - s[3]*t[2]
u[2] = s[3]*t[1] - s[1]*t[3]
u[3] = s[1]*t[2] - s[2]*t[1]
return u
end
function p.vectoriel()
local P = {}
P = A*B
return "Le produit vectoriel de A et B a pour coordonnées ("..P[1]..","..P[2]..","..P[3]..")."
end
return p
{{#invoke:Produit|vectoriel}}, nous donne : Le produit vectoriel de A et B a pour coordonnées (55,-6,-17).
Exercice 10-3
modifierSoient deux matrices carrées A et B d'ordre 2 ainsi définies :
Écrire un programme permettant de faire le produit matriciel de A et B en utilisant une instruction sous la forme P = C*D.
Le produit matriciel se définit ainsi :
Le programme se trouve dans le module:Produit
local p = {}
local C = {{2,5},{-3,1}}
local D = {{4,-2},{1,6}}
local Matrice = {}
setmetatable(C,Matrice)
setmetatable(D,Matrice)
function Matrice.__mul(s,t)
local u = {{},{}}
u[1][1] = s[1][1]*t[1][1] + s[1][2]*t[2][1]
u[1][2] = s[1][1]*t[1][2] + s[1][2]*t[2][2]
u[2][1] = s[2][1]*t[1][1] + s[2][2]*t[2][1]
u[2][2] = s[2][1]*t[1][2] + s[2][2]*t[2][2]
return u
end
function p.matriciel()
local P = {}
P = C*D
return "Le produit matriciel de C et D est donné par la matrice : <br />"..P[1][1].." , "..P[1][2].." <br /> "..P[2][1].." , "..P[2][2]
end
return p
{{#invoke:Produit|matriciel}}, nous donne : Le produit matriciel de C et D est donné par la matrice :
13 , 26
-11 , 12
Exercice 10-4
modifierÉcrire un programme permettant de concaténer les matrices colonnes : B = et C = sous la forme de la matrice carrée P = en utilisant une instruction sous la forme P = B..C.
Le programme se trouve dans le module:Concaténation
local p = {}
local B,C = {3,7},{1,9}
local Point = {}
setmetatable(B,Point)
setmetatable(C,Point)
function Point.__concat(s,t)
local P = {{},{}}
P[1][1] = s[1]
P[1][2] = t[1]
P[2][1] = s[2]
P[2][2] = t[2]
return P
end
function p.colle(s,t)
local P = {{},{}}
P = B..C
return "La concaténation de B et C est donnée par la matrice : <br />"..P[1][1].." , "..P[1][2].." <br /> "..P[2][1].." , "..P[2][2]
end
return p
{{#invoke:Concaténation|colle}}, nous donne : La concaténation de B et C est donnée par la matrice :
3 , 1
7 , 9