TD C2  2425v1

 

Objectifs :

-    réviser les notions d'adresse, de pointeur, de passages de paramètres : Rappels

-    s'entraîner à écrire sur papier un programme C avec des pointeurs

I. L'adresse et le pointeur

Lors du TP C2, vous avez appris à calculer l'adresse d'une variable et à la stocker dans un pointeur, ainsi qu'à accéder à la valeur se trouvant à une certaine adresse.

I.a   Dans le main, déclarer une variable réelle vX ainsi qu'un pointeur de double vPtr contenant l'adresse de vX.

I.b    Écrire un scanf pour remplir la variable vX en utilisant vPtr, et un printf pour l'afficher en utilisant vX.

I.c    Écrire un scanf pour remplir la variable vX en utilisant vX, et un printf pour l'afficher en utilisant vPtr.

II. Les passages de paramètres

Lors du TP C2, vous avez appris à passer les paramètres soit par valeur (en entrée seulement comme en Java), soit par adresse (en entrée/sortie). Il vous faudra donc bien choisir entre ces 2 possibilités pour chaque paramètre lorsque vous écrirez une procédure par la suite.

II.a Écrire une procédure modifV à 2 paramètres qui permet de mettre la valeur du second paramètre dans le réel qu'on lui passe en premier paramètre.

Appeler modifV avec vPtr dans le main pour que vX reçoive la valeur 12.345 et afficher vX pour le vérifier.

II.b Écrire une procédure modifP à 2 paramètres qui modifie son premier paramètre pointeur de double de telle sorte qu'il pointe à l'adresse passée en second paramètre.

Dans le main, déclarer une deuxième variable réelle vY initialisée à 0.0 puis appeler modifP pour que vPtr pointe désormais sur vY. Appeler modifV avec vPtr pour que vY reçoive la valeur -3.21, puis afficher vX et vY pour vérifier que les 2 valeurs sont correctes.

III. La définition de type

Lors de la séquence C1, vous avez appris à déclarer de nouveaux types.

Transformer le programme II.b pour qu'il utilise partout le type PtrReel au lieu de double *.

IV. Échanges et tableaux

Lors du TP C2, vous avez appris à écrire une procédure d'échange de 2 variables.

IV.a    Écrire une procédure echangeR qui permettra dans le main d'échanger les valeurs de 2 variables réelles.

IV.b    Sur le même modèle, écrire une procédure echangeP qui permettra dans le main d'échanger les valeurs de 2 chaînes de caractères.

Pour cela :

-    Déclarer une constante MAXCHAR valant 9, puis dans toute la suite du main, ne plus utiliser la valeur mais toujours MAXCHAR, de telle sorte que sa valeur soit aisément modifiable à un seul endroit.

-    Déclarer un nouveau type Chaine9 permettant de stocker des chaînes d'au plus 9 caractères utiles.

Attention ! En C, les [] se mettent après le nouvel identificateur et non après le type ...

-    Déclarer 2 variables vMot1 et vMot2 de ce type.

-    Initialiser vMot1 avec "Mathematiques" et vMot2 avec "Informatique".

Attention ! Pour éviter tout problème, il ne faut pas recopier plus de 9 caractères utiles ! strncpy nous permet cela, car elle accepte un 3ème paramètre pour préciser ce nombre maximal. L'inconvénient par rapport à strcpy, c'est qu'il ne faut pas oublier de positionner le caractère nul dans la dernière case ...

-    Très peu de changements sont nécessaires pour passer d'echangeE à echangeP ; par contre, dans le main, on ne peut pas utiliser directement vMot1 et vMot2, il faut d'abord les recopier dans des pointeurs de caractères (=> nouveau type PtrChar) : pourquoi ?

-    Afficher les 2 mots (en utilisant les 2 pointeurs) avant et après l'appel à echangeP.

-    Passer cet exercice sur machine en travail personnel pour vérifier votre assimilation de ces techniques.