Ce TD n'est pas noté directement -- les rendus seront examinés à la main, et incorporés a la note globale (avec d'autres éléments tels le style)
Exercice 1: Classes, mini-projet
Dans un fichier student.h, écrivez le prototype (i.e. déclaration) d'une classe Student contenant:
Le nom de l'étudiant (limité à 127 caractères: on n'utilisera pas string)
La date de naissance de l'étudiant, encodée dans un entier au format YYYYMMDD.
Le constructeur de cette classe devra prendre ces données en argument.
Ajoutez à cette classe les fonctions (seulement les déclarations!):
Name(), qui renvoie le nom (un const char*).
Birthday(), qui renvoie un entier representant l'anniversaire de l'étudiant au format MMDD (donc s'il est né le 23/07, on renvoie 723)
RENDU:student.h
Dans un fichier student.cc, écrivez l'implémentation de cette classe.
Indications:
N'oubliez pas d'inclure le .h au début.
La syntaxe pour définir une fonction de classe hors de la classe ressemble à:
type Class::Method(type_arg arg1, type_arg arg2) {
...
}
Copiez bien la chaine de caractères (le nom), caractère par caractère. Ne gardez pas que le pointeur!
On pourra par exemple utiliser strncpy mais attention à bien ajouter le caractère '\0' si nécessaire!
Vérifiez en compilant vos fichiers: g++ student.cc -c -o student.o. Réparez student.h si besoin.
RENDU:student.cc
Dans 2 fichiers class.h et class.cc, écrivez le prototype et l'implémentation (i.e. déclaration et définition) d'une classe Class contenant:
Le nom du cours (taille illimitée), par exemple "XML", et une fonction Name() le renvoyant.
Mais cette fois, utilisez string au lieu de char* ou char[]! vous aurez besoin de #include <string> et de using std::string;.
Le nombre maximal d'étudiants pouvant s'inscrire à ce cours (qui ne dépassera jamais 1000), et une fonction MaxNumberOfStudents() le renvoyant.
La liste des étudiants inscrits a ce cours:
Le nombre d'étudiants inscrits: une fonction NumStudents().
La possibilité d'inscrire un étudiant au cours: une fonction AddStudent(Student* student), qui renvoie l'index de l'étudiant (0 pour le premier étudiant, 1 pour le deuxième, etc), ou -1 si le cours est déjà rempli au maximum.
Consulter un étudiant inscrit: une fonction GetStudent(int student_index). Que va-t'elle renvoyer?
Note: Pensez à inclure le fichier student.h Note: Pour construire une Class, on prendra son nom et son nombre maximal d'étudiants, et on aura aucun étudiant inscrit au début.
Pensez à Vérifier votre code, au moins en le compilant!
RENDUS:class.h et class.cc
Dans des fichiers io.h et io.cc, écrivez le prototype puis l'implémentation des fonctions:
void PrintStudent(const Student&), qui "affiche" la description d'un étudiant (avec cout << ...) sur une ligne.
void PrintClass(const Class&) qui affiche la description d'une classe (sur une ligne) et de tous les étudiants qui y sont inscrits (un par ligne)
Student* EnterStudent() qui crée et remplit un Student (nom, date de naissance) avec l'entrée interactive cin, et en utilisant l'opérateur new
Class* EnterClass() qui fait la même chose pour une classe, puis qui demande le nombre d'étudiants a inscrire, et qui les saisit un par un et les ajoute.
Incluez bien les fichiers student.h et class.h dans le fichier io.h.
Cela provoquera sans doute une erreur de compilation de "déclaration dupliquée": la solution, classique en C++, est un #ifdef guard dans les fichiers .h. Je vous expliquerai au tableau.
RENDUS:io.h et io.cc
Dans un fichier main.cc, écrivez une fonction main() qui, à l'aide des fonctions faites plus haut, demandera l'entrée interactive d'une Class, et l'affichera ensuite.
Compilez-le par étapes séparées:
Pour chaque module fait précédemment: g++ -c module.cc -o module.o
Pour le main.cc, au choix:
g++ module1.o module2.o .. main.cc [-o main]
Idem, mais avec l'option -c, et avec -o main.o, et ensuite g++ module1.o module2.o .. main.o [-o main]
Faites-le tourner!
RENDU:main.cc
(*) Écrivez un Makefile qui orchestrera tout ça, avec une target par défaut qui sera le binaire main, et une targetmodule.o par module.