# Base : appel de procédure et de fonction

Objectifs : Maîtriser l'appel de fonctions, de procédures, et les procédures de test.

Les corrigés de ces exercices ne sont pas fournis. Par contre, des indications sont données vous permettant de vérifier que votre programme est correct.

D'autre part, en cas de difficulté, vous pouvez contacter vos enseignants.

### Appel de procédure

- Copiez chez vous le programme suivant : mission1.adb
- En ne complétant que les deux zones indiquées dans le programme, faites en sorte qu'il affiche la valeur de la variable X en invoquant la procédure Afficher. Voir page 30 du manuel pour afficher, et page 18 pour invoquer une procédure.

## Questions de compréhension

- Peut-on afficher la valeur de l'argument `Arg` dans le corps du programme ?
- Comment afficher la valeur de X² - 12X ? (sans modifier X, ni la procédure Afficher)

### Appel de fonction

- Copiez chez vous le programme suivant : mission2.adb. Commencez par corriger l'erreur contenue dans ce programme.
- Pour l'instant, la fonction `Calcul` renvoie toujours 0. Complétez le corps du programme pour afficher la valeur renvoyée par la fonction, quelle qu'elle soit. (Page 30 du manuel pour afficher.) Pour tester, vérifiez que votre programme affiche 0. Si vous changez le 0 affecté à la variable `Resultat` dans la fonction Calcul, en le remplaçant par 99, votre programme doit bien afficher 99.
- Maintenant, ajoutez à la fonction Calcul un argument nommé `Prix`. La fonction Calcul doit renvoyer 0 si l'argument prix est négatif, et 2 * Prix si le prix est positif. Voici le schéma de la fonction Calcul avec argument :
- Dans le corps du programme, afficher la valeur renvoyée par la fonction en passant en argument la valeur de la variable Y.
- Essayez votre programme avec différentes valeurs de Y, par exemple -5 (le programme affiche alors 0) et 10 (le programme affiche alors 20).
- Si tout marche bien, ajoutez maintenant une deuxième fonction `Somme` qui reçoit deux arguments entiers U et V.
  La fonction Somme renvoie la somme `U1` + `V1`, où `U1` est le résultat de la fonction Calcul lorsque l'argument est U, et `V1` est le résultat de la fonction Calcul lorsque l'argument est V. Votre fonction Somme doit donc invoquer deux fois la fonction Calcul. Voici un schéma algorithmique de la fonction Somme :
- Dans le corps du programme, afficher la valeur de Somme pour divers couples d'arguments, par exemple -10 et 5 (le programme affiche 10), -4 et -2 (le programme affiche 0), 8 et 2 (le programme affiche 20).
- Enfin, effectuer le test suivant : afficher la valeur de Somme lorsque les arguments sont eux-mêmes des appels à la fonction Calcul, cf schéma ci-dessous. Essayer de prévoir à l'avance ce qui va être affiché.

### Procédure de test ou comment récupérer le résultat d'une fonction

- Copiez chez vous le programme suivant : mission3.adb
- Avant de l'exécuter, réflechissez à ce qu'il devrait afficher.
- Compilez-le, exécutez-le et regardez ce qu'il affiche.
- Corriger la procédure de test pour qu'elle affiche la valeur de la fonction Affine à laquelle on passe les arguments VA, VB, et VX.
- Si vous avez bien travaillé, votre programme devrait afficher 149.
- Vérifiez que la fonction Affine apparaît une fois et une seule dans votre procédure de test.

## Questions de compréhension

- Dans le programme initial, avant que vous ne l'ayez modifié, quel était le lien entre la variable `Resultat` de la fonction `Affine` et la variable `Resultat` de la procédure de test ?
- Si on renomme la variable `Resultat` de la procédure de test avec un autre nom, doit-on renommer la variable `Resultat` de la fonction ?
- Comment le compilateur fait-il pour savoir que VA correspond à l'argument A, VB à l'argument B et VX à l'argument X ?