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.
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 lecompte_orig
vers lecompte_dest
. De plus, cette fonction doit renvoyertrue
si le versement a été effectué et renvoiefalse
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
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.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 fonctionvirement
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ètrevirement_ok
si le versement a été effectué etfalse
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
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