Notes exercice noté 1 (homework)

Notes exercice noté 1 (homework)

by Jean-Cédric Chappelier -
Number of replies: 1
(re)Bonjour,

Je viens enfin de mettre dans Moodle (onglet Notes sur le coté gauche) les notes du premier exercice noté (exercice à la maison). Je vais vous envoyer sous peu vos copies corrigées par email et vous fais part ici des commentaires généraux.

Mais avant tout, toutes mes excuses pour le délai de communication de ces notes. Nous avons malheureusement eu cette année plusieurs causes diverses de retard (et en plus Moodle à la lenteur d'un escargot neurasthénique aujourd'hui).

Concernant les notes publiées dans Moodle :
  •     Les notes publiées correspondent à la fraction que vous avez obtenue, multipliée par 100 : par exemple pour cet exercice noté, cela correspond à
    100 * votre total / 70
    car l'épreuve a été notée sur 70 points hors bonus.
  • La note «Note Finale (SAC)» correspond à la note arrondie, sur l'échelle habituelle 1-6 au quart de point, que vous auriez si on arrêtait là. Je la remettrai à jour à chaque nouvelle épreuve, suivant les pondérations indiquées dans mon message de ce matin.
  • La note «Total du cours» est calculée automatiquement par Moodle et correspond à la fraction moyenne, laquelle est arrondie pour calculer la note "Finale (SAC)" mentionnée ci-dessus. (> 55% = 4, > 60% = 4.25, etc.)

MERCI DE LES LIRE ATTENTIVEMENT les commentaires faits par vos correcteurs dans le fichier rendu par email (fichier YAML et ou directement dans votre code sourde), AINSI QUE que les remarques générales que voici :

Globalement, c'est un devoir très bien réussi (98.7% de réussite ; points allant de 19 à 74 sur 70, moyenne à 61.7 points, médiane à 63.1).
Néanmoins, plusieurs remarques ci-dessous pour encore vous améliorer ; la première étant : veuillez ai moins à rendre un fichier qui compile ! (quelques rares ne compilaient pas)


Types

Erreur la plus courante était l'oubli de const, soit pour teammate,
  soit pour QueryResult, soit pour les deux.
SCIPER était aussi majoritairement déclaré comme (unsigned) int, et pas uint32_t.
Autrement cette partie était bien réussie.

Globalement, par contre (concernant les type), encore trop d'étudiants n'utilisent pas des size_t pour les boucles qui se font en comparant à des tailles.


get_student_by_sciper() & get_student_by_type()

Une erreur courante sans être majoritaire dans ces fonctions était de
parcourir toute la db allouée statiquement (itérer sur i < DB_MAX_SIZE),
plutôt que la taille réelle de la db (db_entry_count(db))

La moitié des étudiants a souvent lu en dehors de la base de données en raison d'une mauvaise logique de condition de terminaison de boucle: while (db[k].sciper != 0 && k < DB_MAX_SIZE) {...; k++; } // lit en dehors de db lorsque k vaut DB_MAX_SIZE

                                                                                                                                                                            
Oubli de padding de QueryResult et Database

Erreur bien trop courante qui a touché les fonctions get_students_by_type(), get_least_homogenous_teams() et load_database() était l'oubli de terminer/remplir les tableaux de résultats par NULL/0/.sciper=0 pour marquer la fin de ces tableaux. En règle général, si un étudiant oubliait de le faire dans une fonction, il ne le faisait pas dans toutes les autres fonctions non plus.


get_least_homogenous_teams()

Quand on pense au challenge conceptuel que pouvait représenter cette fonction, elle a globalement était très bien réussie. Beaucoup d'étudiants ont eu la très bonne approche de facilement la modulariser.

D'autres semblent par contre avoir oublié leur bases d'algorithmique. Un copie contenait par exemple  3 boucles for imbriquées et utilisait une douzaine de variables locales pour get_least_homogeneous_teams()... Une tâche donnée ne doit pourtant pas être beaucoup plus compliquée à coder en C qu'en Java. Il faut d'abord penser à l'algorithme **avant** de commencer à coder.

                                                                                                                                                                            
load_database()

La fonction la plus problématique. La gestion de lecture des fichiers semble être encore un sujet difficile pour beaucoup d'élèves. L'erreur la plus courante était l'oubli du fclose() pour fermer le fichier d'entrée, pas mal d'étudiants ont pensé le mettre en fin de fonction, mais très très peu pensent à fermer le fichier d'entrée dans tout les cas d'erreurs où il y a un return.

Par ailleurs, certains étudiants ne pensent pas à contrôler les valeurs de retour de fscanf(), d'autres se compliquent la vie à utiliser fscanf(), fgets(), et fgetc() en même temps pour gérer les retours à la ligne.


Style

Globalement, le style est assez bon. Il y a bien sûr certains
étudiants qui ont encore de mauvaises indentations, mais comparé aux
premières corrections faites dans le projet du mercredi, nous
remarquons une nette amélioration dans le style de code.




In reply to Jean-Cédric Chappelier

Re: Notes exercice noté 1 (homework)

by Jean-Cédric Chappelier -

Un complément au sujet des notes : les deux dernières lignes (style et bonus/malus) sont prévues pour être normalement à 0.
En particulier un style de 0 ne veut pas dire que votre style est mauvais, simplement qu'il est normal (ni bonus, ni malus).