---
jupytext:
  text_representation:
    extension: .md
    format_name: myst
    format_version: 0.13
kernelspec:
  display_name: C++17
  language: C++17
  name: xcpp17
---

+++ {"tags": ["solution"]}

# Exercice : Transactions bancaires

Nous nous occupons de la gestion de comptes bancaires. Il faut nous
assurer qu'aucune somme d'argent n'est créée ou perdue dans les
virements et que les comptes restent toujours au-dessus du solde
autorisé. Nous disposons des comptes tels que définis dans le fichier
`banque.cpp` fourni.

1. Définissez la fonction suivante :

    ``` cpp
    bool virement(int compte_orig, int compte_dest, int somme);
    ```
     
    qui verse si possible (c'est-à-dire si le versement ne rend pas le
    solde de ` compte_orig` négatif) un montant d'argent égal à
    `somme` depuis le ` compte_orig` vers le `compte_dest`. De plus,
    cette fonction doit renvoyer `true` si le versement a été effectué
    et renvoie `false` sinon.
     
    BEGIN SOLUTION
    
    :::{literalinclude} banque.cpp
    :start-after: BEGIN SOLUTION virement
    :end-before: END SOLUTION virement
    :::
     
    END SOLUTION

2.  Lisez le code du programme principal puis exécutez le programme.
    Vérifiez alors les valeurs des comptes qui ont été passées en
    paramètres de la fonction `virement`. Vous constaterez que ces
    valeurs sont inchangées, alors qu'un virement devait normalement
    les avoir changées. Ceci est dû au fait que les paramètres ont été
    passés par valeur à la fonction.

3.  Pour résoudre le problème constaté à la question précédente, nous
    allons transformer la fonction en procédure et passer les
    paramètres par référence. Ouvrez maintenant le fichier
    `banque_ref.cpp` et définissez maintenant la fonction `virement`
    comme une procédure :

    ``` cpp
    void virement(int &compte_orig, int &compte_dest,
                  int somme, bool &virement_ok)
    ```
     
    Cette procédure doit mettre `true` dans le paramètre `virement_ok`
    si le versement a été effectué et `false` sinon.
     
    BEGIN SOLUTION
     
    :::{literalinclude} banque_ref.cpp
    :start-after: BEGIN SOLUTION virement
    :end-before: END SOLUTION virement
    :::

    END SOLUTION

1.  Appelez enfin cette procédure dans le programme `main` en
    affichant «Virement effectué» ou «Virement impossible» selon le
    cas. Vérifier que, cette fois, les valeurs des comptes sont bien
    changées.

    BEGIN SOLUTION
     
    :::{literalinclude} banque_ref.cpp
    :start-after: BEGIN SOLUTION main
    :end-before: END SOLUTION main
    :::
     
    END SOLUTION
