Inscription / Connexion Nouveau Sujet
Niveau logiciels
Partager :

Fonction en scilab

Posté par
sasaki93
23-04-12 à 19:59

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.

Posté par
pgeod
re : Fonction en scilab 23-04-12 à 20:27

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

Posté par
sasaki93
re : Fonction en scilab 24-04-12 à 08:41

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.

Posté par
pgeod
re : Fonction en scilab 24-04-12 à 10:13

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 !

Posté par
sasaki93
re : Fonction en scilab 24-04-12 à 11:35

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.

Posté par
pgeod
re : Fonction en scilab 24-04-12 à 13:03



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !