Table des matières

Calcul de crédits bancaires

NB: je ne suis pas banquier !!!

La théorie

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

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

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

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

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



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 :

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

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

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:

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:

Autre remarque:

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:

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;
    }