Bonsoir, j'ai un problème avec une fonction sur Scilab.
Le problème est le suivant: j'ai une matrice carré remplie avec des 0, des 1 et des 2. Quand le coefficient est 0 on dit que la case est jouable (il s'agit d'un jeu de morpion bref).
Le but de la fonction est, étant donné une matrice, dire si une case est jouable ou pas. On construit donc la fonction caseJouable d'arité 3 qui prend en argument une matrice M, un numéro de ligne i et un numéro de colonne j et qui rend vrai si les indices i et j correspondent à une case jouable ie les indices i et j doivent correspondre à une case de la matrice (i et j doivent êtres positifs strictement et inférieurs à la taille de la matrice) et ils doivent correspondre à une case 0.
Voici la fonction que j'ai fait:
function [r] = caseJouable(M,i,j)
[imax, jmax]=size(M);
r=and([i>0; j>0; i<=imax; j<=jmax; M(i,j)==0])
endfunction
Alors la fonction me parait juste mais quand je la testes ça marche.... uniquement quand (i,j) est dans la matrice ie que si je fait caseJouable(M,0,0) ça affiche error ou encore caseJouable(M,10,2) affiche error si M est de taille (7,5) par exemple. Par contre, aucun problème pour caseJouable(M,2,6) si M est de taille (5,10) par exemple.
Bref, je ne vois vraiment pas pourquoi ça ne marche pas car la fonction me semble correcte. Merci d'avance de votre aide.
Il me semble que dans scilab, la fonction and et or
évalue tous ses arguments, avant de retourner la variable booléenne
corespondant au produit ou à l'addition.
Donc il te faut mettre les conditions i>0 & j>0 & i<=imax & j<=jmax
dans une boucle if, avant dévaluer M(i,j)==0
Hum c'est ce que j'avais comencé à faire mais je me suis ravisé après. Puisque avant j'ai fait plusieurs fonction avec and, or et ça marchait très bien.
Exemple:
function [r] = colonneFaite(M,v)
r=or(and(M==v,1))
endfunction
(pour savoir si il y a une ligne avec uniquement des 1 ou des 2)
function [r] = colonneFaite(M,v)
r=or(and(M==v,1))
endfunction
function [r] = diagonaleFaite(M,v)
r=and(diag(M)==v)
endfunction
function [r] = antidiagonaleFaite(M,v)
r=and(diag(M(:,$:-1:1))==v)
endfunction
Bref toutes ces fonctions marchent très bien. J'ai utilisé le and et le or. Et je ne vois pas la différence avec la fonction que je veux faire.
Par exemple, si j'observe cette fonction:
function [r] = ligneFaite(M,v)
r=or(and(M==v,2))
endfunction
l'instruction M==v transforme la matrice M en matrice avec des vrai ou faux comme coeff. Ensuite appliquer le and (avec 2) va faire "et" sur les lignes pour donner un vecteur colonne de vrai ou faux.
Si je reprend ma fonction:
function [r] = caseJouable(M,i,j)
[imax, jmax]=size(M);
r=and([i>0; j>0; i<=imax; j<=jmax; M(i,j)==0])
endfunction
je creer un vecteur colonne: [i>0; j>0; i<=imax; j<=jmax; M(i,j)==0] avec des vrais et des faux. Et ensuite j'applique and comme dans ligneFaite. Pour moi c'est la même chose.
et ben non, c'est pas la même chose.
la fonction and et or évalue tous ses arguments,
donc avec and([i>0; j>0; i<=imax; j<=jmax; M(i,j)==0])
on passe le test [i>0; ---> VRAI ou FAUX
on passe le test [j>0; ---> VRAI ou FAUX
on passe le test [i<=imax; ---> VRAI ou FAUX
on passe le test j<=jmax; ---> VRAI ou FAUX
et puis on se retrouve à accéder à la case du tableau M(i,j)
avec des indexes de tableau qui sont invalides !!!
et là c'est pas VRAI ou FAUX qui est retourné mais ERROR !
ok je vois la différence. C'est subtil.
Donc la fonction est:
function [r] = caseJouable(M,i,j)
[imax, jmax]=size(M);
if i>0 & j>0 & i<=imax & j<=jmax & M(i,j)==0
r = %t
else
r = %f
end
endfunction
et ça marche !
Merci bien.
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :