TP1
Commentaires générals
Le rapport
Lorsque vous rendez un rapport de tp, il est de bon goût d'inscrire vos noms et groupes lisiblement sur la première page. En ce qui concerne le code source, pensez à fournir l'ensemble de fichiers que vous avez modifié. De plus pour ne pas pauser de problèmes de compatibilité, il serai bien de dire sous quel environnement vous avez développer votre TP (50% des tp ne compile pas du premier coup sur ma machine ...)
Le code
En ce qui concerne l'archive :
Pour le nom du répertoire, quelque chose comme Login1_Login2_tpX, par exemple Combes_Vanderha_tp2
Notation
Pour les tps que j'ai corrigé, j'ai facilement donnée la moyenne, par exemple même si la fonction ne
marche pas, j'ai donné les points pour les commentaires, les explications, et même parfois les tests
;) Mais le mieux quand vous avez une fonction qui ne marche pas, c'est de le voir et de le dire
!
D'une copie à l'autre la comparaison est difficile, j'ai essayer de suivre au mieux mon barème pour
faire le moins d'écart non justifiés.
Les erreurs récurrentes
Oublie de vérifier Coin_HG dans Est_present : dans ce cas, dès qu'une partie de l'âne rouge couvre la case (3,1) l'état est trouvé gagnant.
|
__________________________
|  ___   _________   ___  | | |   | |         | |   | | | |   | |_________| |   | | | |   |  ___   ___  |   | | | |   | |   | |   | |   | | | |___| |___| |___| |___| | |  ___   _________   ___  | | |   | |         | |   | | | |   | |         | |   | | | |   | |         | |   | | | |   | |         | |   | | | |___| |_________| |___| | |  ___               ___  | | |   |   1     2   |   | | | |___|             |___| | |______             ______|         |           |       Bravo, coup gagnant en 0 coups ! |
Essayer de factoriser votre code : moins de lignes pour plus de cas.
|
case NP is
    when Carre1 =>         begin             if PiecesAVoir(Carre1)/=0 then                 Occupation(Pos.L,Pos.C).N:=Carre1;                 Occupation(Pos.L,Pos.C).Coin_HG:= Pos;                 PiecesAVoir(Carre1):=PiecesAVoir(Carre1)-1;             else                 raise ErreurConfig;             end if;         end;     when Carre2 =>       begin         if PiecesAVoir(Carre2)/=0 then              if (Occupation(Pos.L,Pos.C+1).N = Trou                 and Occupation(Pos.L+1,Pos.C).N = Trou                 and Occupation(Pos.L+1,Pos.C+1).N = Trou) then                 Occupation(Pos.L,Pos.C).N := Carre2;                 Occupation(Pos.L,Pos.C).Coin_HG:= Pos;                 Occupation(Pos.L,Pos.C+1).N := Carre2;                 Occupation(Pos.L,Pos.C+1).Coin_HG := Pos;                 Occupation(Pos.L+1,Pos.C).N := Carre2;                 Occupation(Pos.L+1,Pos.C).Coin_HG := Pos;                 Occupation(Pos.L+1,Pos.C+1).N := Carre2;                 Occupation(Pos.L+1,Pos.C+1).Coin_HG := Pos;                 PiecesAVoir(Carre2):=PiecesAVoir(Carre2)-1;                 else                   raise ErreurConfig;               end if;             else                   raise ErreurConfig;             end if;           end; . . . |
|
            if PiecesAVoir(NP)/=0 then
                for I in Pos.L .. Pos.L+Hauteur(NP)-1 loop                     for J in Pos.C .. Pos.C+Largeur(NP)-1 loop                         if Occupation(I,J).N /= Trou then                             raise ErreurConfig ;                         end if ;                     Occupation(I,J):=(NP,Pos) ;             else                   raise ErreurConfig;             end if; |
Les tests
Faites des tests, mais les bons. En générale dire "on regarde si ça marche sur un exemple : ça
marche" ne sert à rien. Il faut trouver les tests pertinents qui entrent dans chacune des parties de
vos fonctions. Si vous faites 50 cas (if, cases ... ) faites 50 tests, un pour ces chacun des cas.
Vous comprendrez vite qu'il vaut mieux réduire le nombre de cas pour faire moins de tests avant
d'arriver à une fonction dont on est "sûr".