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.