TP 2 : objets d'un programme
Préambule
Ce TP concerne la création et la manipulation maîtrisée des objets nécessaires à la bonne marche d'un programme. Ce dernier doit pouvoir créer et manipuler de nouveaux types (i.e non fournis par le langage), il peut avoir besoin, rarement, d'objets connus par toutes ses instructions ou, de façon plus courante, d'objets connus uniquement à l'intérieur d'un contexte donné (principe d'encapsulation), enfin il doit avoir connaissance à tout instant des objets existants et de ceux qui ont cessé de l'être.
Exercice 1 : définition du type ``boolean``.
Cette définition se fait en deux temps :
- création des constantes TRUE et FALSE
- création du type énuméré
booleancomportant les deux identificateurs, dans l'ordre, FALSE et TRUE
Il est à noter que ce type existe dans la norme du C99 (voir le fichier d'en-têtes stdbool.h).
Exercice 2 : un type structuré.
- Définissez le type
information, comportant les champs :instancie(un booléen qui indique si l'information est instanciée),nom(une chaîne de 40 caractères qui renseigne l'information),emplacement(une chaîne de 20 caractères qui indique dans quelle portion du programme est l'information),quantite(un entier qui donne le nombre d'information du même type existant),
- Déclarez une variable de type
informationet initialisez-la (i.einstancieàTRUE,nometemplacementà des valeurs choisies par vous,quantiteà 1).
Exercice 3 : tout par valeur.
- Implantez une fonction qui affiche une
informationexistante ; cette fonction ne devant pas avoir d'incidence sur le reste du programme il faut donc lui transmettre un paramètre de typeinformationpar valeur. - Instanciez une autre
informationpar affectation de l'informationdéfinie à l'exercice 2 puis affichez les deux informations. Modifiez le 1er caractère du nom de la 1ère information puis affichez à nouveau les 2 informations : à quoi aurait-on pu s'attendre vis à vis des champs de type chaînes de caractères ? Expliquez. - Implantez une fonction qui retourne une
informationcréée localement (i.e dans la fonction) et affichez la valeur de retour (dans lemain()par exemple). Qu'en déduisez-vous ?
Exercice 4 : tout par adresse.
- Déclarez un tableau de 10
informationet initialisez tous ses éléments (i.einstancieàFALSE,nometemplacementà la chaîne vide,quantiteà 0). - Implantez une fonction qui permet d'instancier un élément du tableau d'
informationpuis utilisez-la pour les 3 premiers éléments de votre tableau afin de les initialiser à diverses valeurs. - Déclarez un pointeur sur une
informationpuis affectez lui l'adresse du 2ième élément de votre tableau d'information, enfin affichez les valeurs de ses attributs. - Implantez une fonction qui alloue dynamiquement une
information, initialise ses champs et renvoie un pointeur sur cet objet, puis initialisez le pointeur de la question précédent par un appel à cette fonction et affichez l'élément qu'il pointe.
Exercice 5 : durée de vie.
Recopiez la fonction suivante :
void encore()
{
information echo = {TRUE, "un echo", "encore()", 1};
printf("%d\n", echo.quantite);
++echo.quantite;
}Faites appel à deux reprises à cette fonction puis modifiez la déclaration de la variable en : static information echo = ... et faites à nouveau appel à la fonction. Conclusion ?
Exercice 6 : visibilité.
Recopiez le bloc suivant (au début de votre
main()par exemple) :{ information infoloc = {TRUE, "infoloc", "un bloc du main()", 1}; } printf("%s\n", infoloc.nom);Conclusion ?
Recopiez le programme suivant (en complétant avec la définition de type) :
information info = {TRUE, "visible", "global", 1}; void f(information info) { information info = {TRUE, "visible", "f()", 3}; printf("%d\n", info.quantite); } int main() { information info = {TRUE, "visible", "main()", 2}; f(info); }Ajoutez d'autres demandes d'affichage, identique à celle existante dans la fonction f(), dans le programme. Conclusion (le compilateur vous aide pour l'un des cas) ?