Outils pour utilisateurs

Outils du site


credits_bancaires_cpp

Calcul de crédits bancaires

NB: je ne suis pas banquier !!!

La théorie

  • Capital emprunté: C
  • Intérêt annuel: IA → intéret mensuel: I = IA/12
  • Nombre de mensualités=N
  • Mensualité=M

On cherche à calculer n'importe lequel de ces 4 nombres à partir des 3 autres.

Chaque fin de mois k, la mensualité est composée d'une partie du capital remboursé (Ck), et des intérêts (Ik) correspondant au travail pendant un mois du capital non encore remboursé en début de mois. Et, bien sûr, toutes les mensualités sont égales.

Le 1er mois, on paye: C1 + I1 = M

  • avec I1 = I * C puisqu'on n'a encore rien remboursé du capital
  • donc, C1 = M - I*C

Le 2ème mois, on paye: C2 + I2 = M

  • avec I2 = I * (C-C1)
  • donc, C2 = M - I * (C-C1)
  • et comme C1=M-I*C → C2=M-I*(C-M+I*C) → C2=M-I*C+I*M-I2*C
  • soit: C2=(M-I*C)*(1+I)

le 3ème mois, on paye: C3+I3=M

  • En remplaçant I2 par sa valeur issue des équations précédentes, on trouve:
  • C3=(M-I*C)*(1+I)2

etc… jusqu'à la dernière mensualité:

  • CN=(M-I*C)*(1+I)N-1

Si on fait la somme de toutes ces formules, on trouve:

  • C1+C2+C3+…+CN = C = (M-I*C)*(1+(1+I)+(1+I)2+(1+I)3+….+(1+I)N-1)
  • On reconnait la somme d'une progression géométrique de raison (1+I)
  • En remplaçant par son résultat, on trouve les formules suivantes:


  • M=C*I*(1-1/(1-(1+I)N))
  • C=M / (I*(1-(1/(1-(1+I)N))))
  • N=ln(1-1/(1-M/(C*I))) / ln(1+I) (ln=logarithme)


Pour le calcul de l'intérêt, nous avons une équation implicite à résoudre, puisque I apparait plusieurs fois dans la formule. On ne peut donc pas avoir une formule de type “I=…”: il s'agit donc de trouver I par programme, tel que f(I)=0, avec par exemple la formule de M :

  • M-C*I*(1-1/(1-(1+I)N)) = 0

C'est d'ailleurs très amusant de résoudre une équation implicite par programme:

  • On choisit une valeur arbitraire de i (tel que ia=10% par exemple)
  • On choisit un incrément di=i/10 par exemple
  • On calcule f(i+di)
  • On compare avec le f(i) calculé avant:
  • Si la valeur absolue augmente, on s'éloigne du point cherché → on fait di=-di
  • Si les signes de f(i) et du précédent sont différents, la valeur cherchée est entre les 2: on fait di=-di/2
  • Ceci jusqu'à ce qu'on atteigne une précision donnée (notée “eps”)

Pour le calcul du tableau d'amortissement, on a déjà les formules plus haut. Ainsi, pour le mois k:

  • Capital remboursé: Ck=(M-I*C)*(1+I)k-1
  • Intérêt remboursé: Ik=M-Ck

Voilà, c'est fini, il ne reste plus qu'à programmer ! cliquez sur le lien ci-dessous

Programmation en C++:

Outil de développement utilisé :

kdevelop configuré pour c/c++ sur suse linux 10.0.

Ecrit en c++ pour exécution dans une console.

Pour mettre en œuvre dans kdevelop, c'est simple:

  • lancer kdevelop configuré pour c/c++ dans une console
  • faire “nouveau projet”
  • demander le projet c++: simple hello, avec le nom de projet que vous voulez (calculdecredit ?), et dans votre zone de travail (/home/toto/developpement par exemple).
  • kdevelop vous fabrique alors dans cette zone un répertoire calculdecredit avec tout ce qu'il faut.
  • vous placez la partie du code que vous trouvez ci-dessous et qui manque dans le hello.
  • la 1ère fois que vous demandez de construire le projet, il fabrique le makefile qui manque.
  • si “succès”, demandez l'exécution du programme.
  • bon amusement !

Commentaires sur le code

Attention, ce n'est pas un programme de banquier ! pour garder un code simple, je n'ai pas traité les points suivants:

  • Je n'ai rien fait pour vérifier les données. rien ne vous empêche de rentrer n'importe quoi (y compris un nombre de mois négatif…) mais dans ce cas, ne vous attendez pas à des résultats intéressants, mais plutôt à de beaux plantages… ! “garbage in, garbage out” disent les américains (vous rentrez des ordures, il sort des ordures…).
  • les problèmes d'arrondis ne sont pas résolus. Par exemple, si la mensualité calculée est 879.159, vous payerez en fait 879.16, et il faudrait recalculer le tableau d'amortissement en conséquence. Pareil pour les intérêts ou pour le capital.
  • Dans le calcul du nombre de mois, que fait-on s'il n'est pas entier ? il devrait y avoir un dernier mois avec une mensualité inférieure ! De même, on devrait pouvoir évaluer le taux d'intérêt d'une offre comportant une dernière mensualité inférieure aux précédentes. A voir pour une prochaine amélioration…

Autre remarque:

  • Ce programme est indépendant des unités monétaires utilisées: en entrant des Euros, vous avez des résultats en Euros !
  • Ce programme peut vous permettre de recalculer le teg (taux effectif global) en intégrant les frais complémentaires (frais de dossier, assurances, etc…). Attention cependant, si vous payez les frais à part, je ne suis pas sûr qu'il faille les intégrer dans le teg.
  • Amélioration possible: comme les principales données du crédit sont en variables globales (ce n'est pas par hasard) on pourrait les proposer par défaut à partir du 2ème calcul, ce qui éviterait de rentrer pusieurs fois les même données quand vous faites plusieurs simulations.

Un exemple pour vérifier

(c'est une copie d'écran du tableau d'amortissement) !

Tableau d'amortissement
Capital= 10000.00
Intérêt annuel (%)= 10.00
Nombre de mois=  12
Mensualités=   879.16   (en fait 879.159 !)

   1 mens=  879.16 int=   83.33 cap=   795.83 cum=   795.83 rest=  9204.17
   2 mens=  879.16 int=   76.70 cap=   802.46 cum=  1598.28 rest=  8401.72
   3 mens=  879.16 int=   70.01 cap=   809.14 cum=  2407.43 rest=  7592.57
   4 mens=  879.16 int=   63.27 cap=   815.89 cum=  3223.31 rest=  6776.69
   5 mens=  879.16 int=   56.47 cap=   822.69 cum=  4046.00 rest=  5954.00
   6 mens=  879.16 int=   49.62 cap=   829.54 cum=  4875.54 rest=  5124.46
   7 mens=  879.16 int=   42.70 cap=   836.46 cum=  5712.00 rest=  4288.00
   8 mens=  879.16 int=   35.73 cap=   843.43 cum=  6555.42 rest=  3444.58
   9 mens=  879.16 int=   28.70 cap=   850.45 cum=  7405.88 rest=  2594.12
  10 mens=  879.16 int=   21.62 cap=   857.54 cum=  8263.42 rest=  1736.58
  11 mens=  879.16 int=   14.47 cap=   864.69 cum=  9128.11 rest=   871.89
  12 mens=  879.16 int=    7.27 cap=   871.89 cum= 10000.00 rest=    -0.00
total payé= 10549.91  coût du crédit=   549.91 (  5.50%)

En conclusion, ce programme, à part de contribuer à vous amuser en c++, peut vous permettre:

  • de vérifier que votre organisme de crédit ne vous raconte pas d'histoire,
  • de comparer plusieurs offres entre elles,
  • de mieux négocier en simulant par avance les offres qui vous intéressent.

Mais n'en profitez pas pour vous surendetter !!!

le code :

/***************************************************************************
 *   Copyright (C) 2005 by Tyrtamos   *
 *   tyrtamos@jpvweb.com   *
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 *   This program is distributed in the hope that it will be useful,       *
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
 *   GNU General Public License for more details.                          *
 *                                                                         *
 *   You should have received a copy of the GNU General Public License     *
 *   along with this program; if not, write to the                         *
 *   Free Software Foundation, Inc.,                                       *
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
 ***************************************************************************/
 
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
 
#include <iostream>
#include <sstream>  // nécessaire pour les flux de chaine (fonction formdb())
#include <iomanip>  // nécessaire pour les fonctions de formatage de flux
#include <string>
#include <cstdlib>
#include <math.h>
 
using namespace std;
 
double c=0, m=0, ia=0, n=0;
char car, car2;
 
// ***************************************************
string formdb(double nombre, int nbcol, int prec) {
    // formate un nb double et renvoie un string
    // en utilisant un flux de chaine
    // nbcol=nb total de car,
    // prec=nb de chiffres après la virgule
    stringstream chdb;
    chdb << fixed << right << setw(nbcol) << setprecision(prec) << nombre;
    return chdb.str();
    }
 
// ***************************************************
double calcul_m(double c, double ia, double n) {
    // calcul de la mensualité
    double i=ia/1200;
    m=c*i*(1-1/(1-pow(1+i,n))); 
    return m;
    }
 
// ***************************************************
double calcul_c(double m, double ia, double n) {
    // calcul du capital emprunté
    double i=ia/1200;
    c=m/(i*(1-1/(1-pow(1+i,n))));
    return c;
    }
 
// ***************************************************
double calcul_n(double c, double m, double ia) {
    // calcul du nombre de mois de remboursement
    double i=ia/1200;
    n=log(1-1/(1-m/(c*i)))/log(1+i);
    return n;
    }
 
// ***************************************************
double calcul_i(double c, double m, double n) {
    // calcul du taux d'intérêt annuel
    ia=10;
    double di=1;
    double eps=0.000001;
    double F1=m-calcul_m(c,ia,n);
    double F2=F1;
    while(fabs(F1)>eps) {
        F1=F2;
        ia=ia+di;
        F2=m-calcul_m(c,ia,n);
        if((F2*F1)<0){
            di=-di/2;
            }
        else {
            if(fabs(F2)>fabs(F1)) {
                di=-di;
                }
            }
        }
    return ia;
    }
 
// ***************************************************
void calcul_amortissement(double c, double m, double ia, double n) {
    // calcul et édition à l'écran du tableau d'amortissement
    // mens=la mensualité à payer
    // int=la part des intérets dans la mensualité
    // cap=la part du capital rembousé dans la mensualité
    // cum=cumul du capital déjà remboursé (après le versement du mois)
    // rest=capital restant à rembourser (après le versement du mois)
    int k;
    double cc=0, ck, ik;
    double i=ia/1200;
    cout << "Tableau d'amortissement " << endl;
    cout << "Capital= " << formdb(c,8,2) << endl;
    cout << "Intéret annuel (%)= " << formdb(ia,5,2) << endl;
    cout << "Nombre de mois= " << formdb(n,3,0) << endl;
    cout << "Mensualités= " << formdb(m,8,2) << endl << endl;
    for(k=1; k<=n; k++){
        cout << formdb(k,4,0);
        cout << " mens=" << formdb(m,8,2);
        ck=(m-i*c)*pow(1+i,k-1);    // part de capital du mois k
        ik=m-ck;        // part d'intéret du mois k
        cout << " int= " << formdb(ik,7,2);
        cout << " cap= " << formdb(ck,8,2);
        cc=cc+ck;           // capital déjà remboursé
        cout << " cum= " << formdb(cc,8,2);
        cout << " rest= " << formdb(c-cc,8,2) << endl;
        }
    cout << "total payé= " << formdb(n*m,8,2);
    cout << "  cout du crédit= " << formdb((n*m)-c,8,2);
    cout << " (" << formdb((((n*m)-c)/c*100),6,2) << "%)";
    cout << endl << endl;
    }
 
// ***************************************************
int main(int argc, char *argv[]) {
    do {
        cout << "Calcul de crédits bancaires" << endl << endl;
        cout << "1- calcul de la mensualité" << endl;
        cout << "2- calcul du capital à emprunter" << endl;
        cout << "3- calcul du nombre de mois de remboursement" << endl;
        cout << "4- calcul de l'intérêt annuel" << endl << endl;
        cout << "0- fin du programme" << endl << endl;
        cout << "quel calcul demandez-vous (donnez le chiffre) ? ";
        cin >> car; cout << endl << endl;
        if(car!='0') {
            switch (car) {
                case '1':
                cout << "Calcul de la mensualité du crédit" << endl << endl;
                cout << "capital emprunté= "; cin >> c; cout << endl;
                cout << "intérêt annuel en %= "; cin >> ia; cout << endl;
                cout << "nombre de mois de remboursement= "; cin >> n; cout << endl;
                m=calcul_m(c,ia,n);
                cout << "mensualité= " << formdb(m,8,2) << endl << endl;
                    break;
                case '2':
                cout << "Calcul du capital à emprunter" << endl << endl;
                cout << "mensualités souhaitées= "; cin >> m; cout << endl;
                cout << "intérêt annuel en %= "; cin >> ia; cout << endl;
                cout << "nombre de mois de remboursement= "; cin >> n; cout << endl;
                c=calcul_c(m, ia, n);
                cout << "capital à emprunter= " << formdb(c,8,2) << endl << endl;
                    break;
                case '3':
                cout << "Calcul du nombre de mois de remboursement" << endl << endl;
                cout << "capital emprunté= "; cin >> c; cout << endl;
                cout << "mensualités souhaitées= "; cin >> m; cout << endl;
                cout << "intérêt annuel en %= "; cin >> ia; cout << endl;
                n=calcul_n(c, m, ia) + 0.000005;
                cout << "nombre de mois de remboursement= " << formdb(n,8,2) << endl << endl;
                    break;
                case '4':
                cout << "Calcul de l'intérêt annuel" << endl << endl;
                cout << "capital emprunté= "; cin >> c; cout << endl;
                cout << "mensualités souhaitées= "; cin >> m; cout << endl;
                cout << "nombre de mois de remboursement= "; cin >> n; cout << endl;
                ia=calcul_i(c, m, n);
                cout << "intérêt annuel en %= " << formdb(ia,8,2) << endl << endl;
                    break;
                default:
                    cout << "caractère erroné: recommencez" << endl;
                    break;
                }
            cout << "voulez-vous le tableau d'amortissement (o/n) ?"; cin >> car2; cout << endl;
            if((car2=='O') || (car2=='o')) {calcul_amortissement(c, m, ia, n);}
            }
        } while(car!='0');
    cout << "Programme terminé ! à la prochaine !" << endl << endl;
    return EXIT_SUCCESS;
    }

credits_bancaires_cpp.txt · Dernière modification: 2010/01/03 20:13 de tyrtamos

Outils de la page