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_orignégatif) un montant d’argent égal àsommedepuis lecompte_origvers lecompte_dest. De plus, cette fonction doit renvoyertruesi le versement a été effectué et renvoiefalsesinon.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.cppet définissez maintenant la fonctionvirementcomme une procédure :void virement(int &compte_orig, int &compte_dest, int somme, bool &virement_ok)
Cette procédure doit mettre
truedans le paramètrevirement_oksi le versement a été effectué etfalsesinon.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
mainen 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