Exercice : Transactions bancaires

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 :

    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

    bool virement(int compte_orig, int compte_dest, int somme) {
        if (somme <= 0) return false;
        if (compte_orig - somme < 0) return false;
        compte_orig -= somme;
        compte_dest += somme;
        return true;
    }
    

    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 :

    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

    void virement(int &compte_orig, int &compte_dest, int somme, bool &virement_ok) {
        if (somme <= 0 || compte_orig - somme < 0) {
    	virement_ok = false;
        } else {
    	virement_ok = true;
    	compte_orig -= somme;
    	compte_dest += somme;
        }
    }
    

    END SOLUTION

  4. 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

        bool v;
        etat_comptes();
        virement(compte1, compte2, 100, v);
        etat_comptes();
        if (v) cout << "Virement effectué !" << endl;
        else   cout << "Virement impossible !"<< endl;
    

    END SOLUTION