Evaluation de l'option "Programmation Avancée" en L2.2

Les notes sont sur 20. Elles sont définitives. Leur signification est la suivante:

Tous les commentaires ne sont pas marqués: aussi, il ne faut pas s'étonner d'avoir une note un peu faible par rapport aux commentaires: il s'agit peut être de problèmes de lisibilité du code, par exemple, qui n'est pas reporté dans les commentaires. Il peut s'agir également d'un problème d'attente: quelqu'un qui est bon et qui n'a pas assez travaillé par rapport à son niveau général peut être un peu sanctionné par rapport à un moins bon qui a fait le même travail: qui aime bien châtie bien (mais pas trop...).

Note finale

Elle est obtenue en faisant la moyenne du nibbler et du compresseur. L'analyseur n'est pas pris en compte (trop facile). Attention: s'il vous manque une note dans cette page, c'est que cette note est 0 !!

                           Nibbler       Compresseur         Moyenne
Ben Taleb                        0                10               5
Bassinot                        17                19              18
Brisset                         15                 9              12
Cabot                           10                 7             8.5
Carlier                         15                15              15
Lambinet                        15                 3               9
Coppex                          16                20              18
Becquet                         12                 0               6
Gassama                         15                10            12.5
Jordao                          14                14              14
Vaillant                        13                 4             8.5
Neou                            14                16              15
Noel                            19                20            19.5
Pilliet                         19                 8            13.5
Ruppin                          13.5               0               7

Le nibbler

Bassinot

Note: 17

Commentaires: L'extraction du tar.gr devrait créer un répertoire contenant votre projet. Bug: un serpent de taille 4 qui tourne en rond se mord la queue. Parenthésez votre macro completement: #define HEIGHT ((DAMIERX)+120). Le code suivant:

typedef enum
{
        VIDE,
        PROIE,
        TETE,
        CORPS,
}Case, Damier;

#define VIDE 0
#define PROIE 1
#define TETE 2
#define CORPS 3
n'est pas correct: par exemple, VIDE est défini deux fois: une fois par le type énuméré, une autre fois par de define: redondance. Prenez l'habitude de commenter vos .h. Pour rand, extrait du manuel:
Dans Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukol??
       sky, William T. Vetterling; New York: Cambridge University Press, 1990 (1st ed, p. 207)), le  commentaire  suivant
       apparaît :
              « Si  vous  désirez  engendrer un entier aléatoire entre 1 et 10, vous devez toujours procéder en utilisant
              les bits de poids forts, comme dans :

                     j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

              et jamais ainsi :

                     j = 1 + (rand() % 10);

              (car cette dernière version utilise les bits de poids faibles). »
N'oubliez pas de tester l'échec potentiel des appels aux fonctions la bibliothèque standard (par exemple, fopen). Globalement, bon travail.

Brisset

Note: 15

Commentaires: Organisez un peu votre projet (code source: repertoire src, etc). Bug sur un serpent de taille 2, qui peut revenir en arrière. Vous pourriez demander si on veut rejouer. La structure de Serpent contient un tableau: passez-la aux fonction par adresse en employant const, pas par valeur. Evitez les contantes en dur, du style

coord_x > 25 && coord_x < 625 && coord_y > 25 && coord_y < 625
. N'oubliez pas de liberer les ressources allouées avant de sortir (close_window, par exemple). Vous auriez pu initialiser le générateur aléatoire.

Cabot

Note:10

Commentaires: Des bugs dans le fonctionnement du serpent, en particulier quand on essaie de revenir en arrière. Bug sur le serpent de taille 4 qui tourne en rond. Le test de fin de partie en cas de gain ne fonctionne pas. Ne mettez pas de #include qui ne sont pas necessaire, y compris dans les .h. Protégez les inclusions multiples des .h. Le code suivant:

typedef enum
{
        VIDE,
        PROIE,
        TETE,
        CORPS,
}Case, Damier;

#define VIDE 0
#define PROIE 1
#define TETE 2
#define CORPS 3
n'est pas correct: par exemple, VIDE est défini deux fois: une fois par le type énuméré, une autre fois par de define: redondance. Fonction Oppose: la suite de if/then/else devrait plutot être implantée par un switch/case, plus lisible. Fonction restart: evitez les constantes en dur. La structure de serpent contient un tableau, passez-la aux fonctions par adresse plutot que par valeur, en specifiant const. initialisation: une proie peut avoir été posée sur la case du milieu du damier, sur laquelle on va mettre le serpent.

Carlier

Note: 15

Commentaires: Mettez votre code source dans un repertoire src. Bug serpent de taille 4 qui tourne en rond. Ne mettez pas de #include qui ne sont pas necessaire, y compris dans les .h. Mettez les valeurs des types énumérés en majuscules, comme les #define. Si vous separez le code de l'interface graphique de celle du moteur du jeu, par exemple, vous devez avoir un .h par module et pas tout dans le même. N'oubliez pas de liberer les ressources allouées avant de sortir (close_window, par exemple). Vous auriez pu initialiser le générateur aléatoire. Qu'est-ce que c'est que cette fonction random() que vous employez ?

Lambinet

Note: 15

Commentaires: N'oubliez pas de liberer les ressources allouées avant de sortir (close_window, par exemple). I manquait un $(inc) dans votre makefile. Pour rand, extrait du manuel:

Dans Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukol??
       sky, William T. Vetterling; New York: Cambridge University Press, 1990 (1st ed, p. 207)), le  commentaire  suivant
       apparaît :
              « Si  vous  désirez  engendrer un entier aléatoire entre 1 et 10, vous devez toujours procéder en utilisant
              les bits de poids forts, comme dans :

                     j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

              et jamais ainsi :

                     j = 1 + (rand() % 10);

              (car cette dernière version utilise les bits de poids faibles). »
La sortie de jeu est un peu brutale (exit quand on perd). Bug serpent de taille 4 qui tourne en rond.

Coppex

Note: 16

Commentaires: Mettez votre code source dans un repertoire src. Jeu sympa ! Test de fin de partie gagnée pas correct (j'ai fait une partie, il ne restait plus de fruits à manger et le jeu continuait).

#define WSCREEN         TAILLE*WCASE
mérite un parenthésage.
#include stdio.h
inutile dans define.h. Il n'y a aucune raison de déclarer des variables globales static dans main.c. Code bien commenté.

Becquet

Note: 12

Commentaires: Votre tar.gz devrait créé un repertoire à votre nom à l'extraction. Séparez votre code: déclartions dans les .h, lee code de l'interface graphique dans un .c, celui du moteur de jeu dans un autre, ... Evitez les constantes en dur. Bug serpent de taille 4 qui tourne en rond. Je ne vois pas le serpent !

Gassama

Note: 15

Commentaires: Makefile incorrect. Protégez les .h contre les inclusions multiples. Votre nibbler.h est une mauvaise idée. Il ne faut pas inclure des choses qui ne sont pas nécessaires. Evitez les constantes en dur. Separez le code de l'IHM de celui du moteur de jeu. Liberez les ressources allouées (il manque, par exemple, le close_window)

Jordao

Note: 14

Commentaires: On peut revenir en arrière avec un serpent de taille 2. Sortie de jeu sur perte ou gain brutale. Evitez les #include ../../toto.h

Vaillant

Note: 13

Commentaires: Organisez votre code src en plusieurs fichiers. Bug sur un serpent de taille 4 qui tourne en rond. On peut obtenir un affichage plus rapide et moins désagréable en ne réaffichant pas tout le damier à chaque fois: ça n'est pas nécessaire. L'implantation du serpent (file d'attente) par tableau est plus efficace que la vôtre allouée dynamiquement.

Neou

Note: 14

Commentaires: Ne mettez pas les .c dans le repertoire include. Bug sur un serpent de taille 4 qui tourne en rond. Parenthésez vos #define. Donnez un nom significatif à tout: en particulier, le fichier define.h n'a pas un nom très informatif.

Noel

Note: 19

Commentaires: Il ne faut pas appeler tar.gz un tar tout court. L'arrêt du jeu en cas de perte/gain est un peu brutal. Le jeu est sympathique ! Evitez les #include ../toto/titi.h, le chemin d'inclusion est une option du compilateur. Bon travail !

Pilliet

Note: 19

Commentaires: Evitez les #include ../toto/titi.h, le chemin d'inclusion est une option du compilateur. C'est très joli, et je me suis bien amusé ! Mais ça fait quand même chauffer un bipro. Il doit y avoir un problème d'attente active quelque part... Commentez plus votre code. Parenthesez vos macros. Testez les retours des appels de la bib C (ex: fopen). N'oubliez pas de liberer les ressources allouées (par exemple, de fermer les fichiers ouverts). Pour rand, extrait du manuel:

Dans Numerical Recipes in C: The Art of Scientific Computing (William H. Press, Brian P. Flannery, Saul A. Teukol??
       sky, William T. Vetterling; New York: Cambridge University Press, 1990 (1st ed, p. 207)), le  commentaire  suivant
       apparaît :
              « Si  vous  désirez  engendrer un entier aléatoire entre 1 et 10, vous devez toujours procéder en utilisant
              les bits de poids forts, comme dans :

                     j = 1 + (int) (10.0 * (rand() / (RAND_MAX + 1.0)));

              et jamais ainsi :

                     j = 1 + (rand() % 10);

              (car cette dernière version utilise les bits de poids faibles). »

Ruppin

Note: 13.5

Commentaires: Organisez votre code src en plusieurs fichiers. Bug sur un serpent de taille 4 qui tourne en rond. Evitez les constantes en dur.

Le compresseur

Le compresseur a été testé sur : J'ai regardé si la compression/décompression fonctionnait sur ce fichier. Les compresseurs qui restituent les espacements correctement sont bien sûr bonnifiés.

Ben Taleb

Note: 10

Commentaires: Vous n'utilisez pas les opérations bit à bit sur les fichiers, parce que vous ne les avez pas terminées ! Vous pourriez afficher un mode d'emploi quand les paramètres du programme sont incorrects, plutôt qu'un message d'erreur faux. Le code est clair, bien présenté. Dommage que vous n'ayez fait que la moitié du travail.

Bassinot

Note: 19

Commentaires: C'est un peu dommage que les fichiers à compresser doivent être placés dans un répertoire figé: d'une manière générale, l'interface d'utiisation peut être améliorée (abandonnez le mode "console" au profit du mode "ligne de commande"). La sortie erreur standard est réservée aux erreurs. Le format de fichier compréssé n'est pas tout-àfait celui proposé, mais il est bien aussi. Dans la décompression octet/octet vous mélangez les fread et readOctetOctet, ce qui, au niveau du style de programmation, est dérangeant. Dans votre programme ça fonctionne car vous êtes ordonné, mais d'une manière générale il ne faut pas accéder à une même ressources en utilisant plusieurs méthode de couches logicielles différentes (c'est ce que vous faites). Ne faites jamais scanf("%s",...) mais scanf("%10s",...), par exemple. Le code est très clair, bien présenté et bien commenté. C'est du très bon travail.

Brisset

Note: 9

Commentaires: Compilez avec les options -ansi et -Wall au minimum. Dans ce genre de programme, evitez le mode interactif pour être en mode ligne de commande seul. Vous n'utilisez pas la compression des entiers (bit à bit ou octet par octet).

Cabot

Note: 7

Commentaires: La commande lancée sur un exemple ne fait rien ! La constante CHAR_BIT est définie dans limits.h. N'incluez pas de fichiers inutiles, en particulier dans les .h. Evitez les constantes en dur. Par exemple, dans la fonction qui calcule le nombre d'octets, pourquoi ne pas utiliser une formule ? Les erreurs devraient être affichées sur la sortie d'erreur. La décompression ne fonctionne pas.

Carlier

Note: 15

Commentaires: Faire un sprintf(..."%c"...) fonctionne, mais c'est un peu lourd. Les paramètres de la fonction de compression sont dangereux pour deux raisons: la première, ils sont basés sur le type File, qu'on pourrait confondre avec FILE: ne pas jouer sur les différences maj/min. D'autre part, le fait que le premier paramètre peut produire une situation dangereuse. En effet, la fonction modifie la tête de lecture dans le fichier, donc la strcuture interne FILE. Dans votre cas ça fonctionne, car le champ fd est un pointeur, mais c'est de la programmation dangereuse. Quand une fonction doit modifier un paramètre, alors ce dernier doit être passé par adresse. Bon travail.

Lambinet

Note: 3

Commentaires: Que viennent faire les lib X11 dans le makefile? Votre programme n'est pas graphique ! Mettez un mode d'emploi. Je n'arrive pas à compresser un fichier. Les fichiers bit à bit ne fonctionne pas. La fonction libereListe est complètement fausse ! Pas grand chose ne fonctionne.

Coppex

Note: 20

Commentaires: Très bon travail.

Becquet

Note: 0

Commentaires: Non rendu.

Gassama

Note: 10

Commentaires: En cas d'erreur sur la ligne de commande, vous devriez fournir des messages plus explicites pour aider l'utilisateur. Le programme est parti en boucle quand je l'ai essayé sur un gros exemple. La fonction de fermeture des fichiers bit à bit est incorrecte.

Jordao

Note: 14

Commentaires: On n'obtient pas toujours le fichier d'origine quand on décompresse. Pourquoi écrire un \0 dans le fichier avant d'écrire la position d'un mot q'on a trouvé dans la liste ? Le programme semble fonctionner à peu près, mais les taux de compression sont réellement mauvais ! Le code est clair.

Vaillant

Note: 4

Commentaires: On vous demande une archive au format tar, pas rar, et qui se développe dans un repertoire à votre nom, avec une organisation en sous-repertoires contenant code, documentation, tests, etc. Le programme ne compile pas.

Neou

Note: 16

Commentaires: Dans ce genre de programme, préferez le mode texte au mode ligne de commande. Seg fault quand le fichier n'existe pas: vous avez oublié de tester un code de retour d'une fonction. Faire un realloc à chaque lecture de caractère est beaucoup trop lourd. N'oubliez pas de liberer les resources allouées (par exemple, la liste dans l'algo de compression/decompression). Vous pourriez mieux gerer les séparateurs. Vous avez travaillé.

Noel

Note: 20

Commentaires: Un makefile, c'est aussi fait pour ne pas tout recompiler à chaque fois (o, c'est ce que vous faites). Il faudrait également un makefile general, qui compile d'abord les bibliothèques, les place dans le repertoire libs du programme, puis compile le programme. Code très clair, bien présenté et commenté. Le taux de compression devrait être meilleur. Rapport: bien. Très bon travail.

Pilliet

Note: 8

Commentaires: Que fait la lib graphique mlv dans le makefile ? et X11 ? La décompression a planté sur un gros et un petit exemple (pb de liste+seg fault). Vos fonctions pour les fichiers bit à bit ne sont pas utilisées.

Ruppin

Note: 0

Commentaires: pas rendu.