Application d’APL*PLUS III versions 1.1 & 1.2
à un simple problème de prêt
par Daniel Massi
SOMMAIRE
1. Emprunt indivis remboursable par annuités constantes à terme échu 42
2. Remarques et hypothèses .......................... 42
3. Problème et Questions ............................ 42
4. Approche méthodologique........................... 43
4.1. ENTRÉES : Données à
introduire ................ 45
4.1.1. Premier Groupe
............................... 45
4.1.2. Deuxième Groupe
............................. 45
4.1.3. Le Principe 3 ==> 4 ......................... 45
4.1.4. L’Autre Champ
................................ 46
4.2. SORTIES : Fenêtres à
constituer ............... 46
4.2.1. Fenêtre
a
.................................... 46
4.2.2. Fenêtre
b .................................... 46
4.2.3. Descriptif de la fonction
FmAcPr ............ 47
4.2.4. Explications
................................. 47
4.3. TRAITEMENT : Fonctions « CallBack » .......... 50
4.3.1. Lancement de l’Application Emprunt ........... 50
4.3.2. Déclenchement d’un Événement
................. 51
4.3.3. Réponse à un Événement
....................... 51
4.3.3.1. La fonction
CallBack FnAcPr1 ............ 51
4.3.4. Les Boutons
.................................. 52
4.3.4.1. bouton b n 1 .............................. 52
4.3.4.2. bouton b n 2 .............................. 52
4.3.4.3. bouton b n 3 .............................. 52
4.3.5. Les Fonctions Annexes
........................ 56
4.3.5.1. Fonction FnAcDt
.......................... 56
4.3.5.2. Fonction FnAcKc
.......................... 56
4.3.5.3. Fonction FnAcTx
.......................... 58
4.3.5.4. Fonction FnAcTy
.......................... 59
4.3.5.5. Fonction Ani
............................. 60
4.3.5.6. Fonction Sni
............................. 60
4.3.5.7. Relations remarquables
..................... 60
4.3.5.8. Fonction FnSais
.......................... 61
4.3.5.9. Fonction FnPrin
.......................... 62
4.3.6. Les Utilitaires
.............................. 63
4.3.6.1. Forme FmMsg ............................... 63
4.3.6.2. Fonction de
Lancement et d’Affichage ...... 64
4.3.6.3. Fonction
d’Effacement de la fenêtre ....... 64
5.
Le Menu et les Commandes attachées ............... 64
5.1. Menu ‘File’.................................... 64
5.2. Menu ‘Calculs’................................. 64
6. Conclusion........................................ 65
BIBLIOGRAPHIE........................................ 65
A N N E X E..................................... 66
1. Emprunt indivis remboursable par annuités constantes à terme échu
Dans la gamme étendue des prêts, plans d'épargne et autres plans de remboursement obligataires, choisissons d'effectuer un petit tour dans ce que les financiers ont coutume de dénommer ainsi.
Le problème est simple à mettre en œuvre : sa résolution a, alors, pour seule ambition de montrer une utilisation très concrète, mais, oh! combien puissante!, d' APL III, v1.1.
2. Remarques et hypothèses
Pour ne pas obvier au propos de l’article et, partant, alourdir la présentation, plusieurs hypothèses ont volontairement été posées :
H1.- La saisie des montants s’effectue sous le format exclusif : 99999999.99, c’est-à-dire sans espace, ni séparateur de milliers, mais avec l'utilisation du point décimal.
H2.- Le taux saisi se présente sous le format exclusif en % : 99.99
H3.- Le taux saisi sera recalculé, en fonction du type de l'annuité et du mode de calcul, c’est-à-dire en taux Équivalent, ou en taux Proportionnel.
H4.- Les données peuvent être introduites en notation scientifique, de façon à ne pas se tromper dans le nombre de zéros à introduire :
1E6 = 1 million ; 1.1E6 = 1.100.000,00 ; 1.23E9 = 1.230.000.000,00
(la lettre E est obligatoirement en Majuscule)
H5.- Le taux à 0 % est le taux minimum imposé.
Ce problème de prêt peut se poser en ces termes :
–
J'emprunte un montant de
K Francs, au taux de
i % l'an, qui
sera remboursé pendant
n annuités
consécutives et constantes : quel sera, alors,
le montant
a de l'annuité à rembourser pour chaque période
?
– Puis-je avoir un Plan de Remboursement ?
– Puis-je ajuster l’un des paramètres ?
Au-delà de cette mise en œuvre, nous pourrons aussi effectuer une simulation de certains paramètres, sous des contraintes déterminées.
Alors ? Prêt à suivre le guide pas-à-pas .... pour partir vers d'autres aventures avec APL III, v1.1.?
Allons.
La séquence du travail à effectuer se décompose en trois étapes successives :
1. Collationner les données nécessaires aux différents calculs : les ENTRÉES.
2. Constituer les fenêtres destinées à l'affichage : les SORTIES.
3. Déterminer les fonctions à écrire : le TRAITEMENT.
La résolution du problème s'appuiera, tout au long de l'exposé, sur un écran unique, affiché dès le lancement de l’Application, et dont la représentation est proposée ci-après.
Cette image d'écran est constituée de deux parties:
.. Fenêtre a : permet de saisir et faire varier les informations nécessaires;
.. Fenêtre b : affiche le plan d'amortissement à la demande.
Le menu permet d’aligner des commandes destinées à fournir des calculs ponctuels – et qui pourront être implémentées dans de prochains numéros –.
La représentation des fenêtres peut prendre l’allure suivante :
4.1. ENTRÉES : Données à introduire
Les données de base sont reparties en deux groupes logiques d’inégale importance :
Le premier groupe comprend les données obligatoires, nécessaires aux calculs :
–
Montant
du prêt : exprimé en Francs et/ou centimes, quelle que
soit la
monnaie : Voir H1 et H4.
– Nombre d'annuités : nombre entier
– Taux annuel du Prêt : exprimé en %. Voir H2, H3 et H5.
–
Montant de l'Annuité : exprimé dans
la même unité monétaire que le montant
du prêt, et dans le même format. Voir H1 et H4.
- Type de l'annuité : à choisir éventuellement dans la table correspondante car la valeur « Annuité, Équivalent » est choisie par défaut.
Le substantif
"annuité" est un
terme générique désignant une suite de règlements effectués à intervalles de
temps égaux. La fréquence de paiement
s’étale de mensuelle à annuelle. Cette
suite de règlements constitue une « rente »
pour celui qui en bénéficie.
Le deuxième groupe est constitué simplement de :
. Date de Départ : utilisée lors de l'établissement du plan d’amortissement.
– Sa forme est JJ/MM/AA ou JJ-MM-AA.
– Si le champ n'est pas renseigné :
les chiffres, allant de 1 à n, seront, alors, générés.
4.1.3. Le Principe 3 ==> 4
Dans une première approche, trois données seulement du premier groupe doivent être introduites : la quatrième sera alors calculée (Voir les formules de calcul, en Annexe).
Ultérieurement, nous
pourrons simuler deux ou trois de ces paramètres en indiquant une fourchette ou
une tendance.
Il est bien sûr possible de tenter plusieurs essais pour ajuster telle ou telle donnée
– les trois données sont modifiables à l'infini,
– mais la quatrième doit être effacée avant chaque recalcul.
(Au moyen de la touche de tabulation, ou par double-clic du bouton gauche de la souris, en ayant positionné, au préalable, le curseur n'importe où dans la zone : les chiffres sont sélectionnés ; puis, en appuyant sur la touche "DEL", effacés : il est alors possible d'appuyer à nouveau sur le bouton " Calcul_4° ", avec génération d'une nouvelle valeur).
Le
Type de l'annuité est positionné,
par défaut, sur "Annuel, Équivalent"
:
le choix, s'il ne correspond pas au désir de l'emprunteur, doit s'effectuer par
simple clic sur le libellé adéquat, en utilisant les touches fléchées.
4.2. SORTIES : Fenêtres à constituer
Les données nécessaires aux calculs sont, à ce stade, connues.
Étudions la manière de les recevoir et de les traiter, au travers des différentes fonctions à écrire.
Les Fenêtres a et b sont crées, constituées et générées dans la fonction
FmAcPr.
4.2.1. Fenêtre
a
La Fenêtre a est destinée à établir un dialogue avec l'utilisateur.
Elle est donc constituée de trois types de zone :
. Label : pour afficher un descriptif de la zone située en vis-à-vis.
. Edit : destinée à recevoir les données numériques.
[Ces binômes ont été regroupés, au sein de la fonction, pour
faciliter leur lecture et leur repérage]
. Liste
: pour sélectionner un libellé, sans risque de se tromper.
4.2.2. Fenêtre
b
La
Fenêtre
b
ne servira qu'en fin de parcours puisqu’elle est destinée à recevoir le
Plan
d'Amortissement.
4.2.3. Descriptif de la fonction FmAcPr
L'image, représentée au paragraphe 4., et qui est celle qui s'affiche sur votre écran dès le lancement de la fonction, est créée par la fonction FmAcPr .
Elle génère une forme fmAcPr constituée de :
Lignes 3 - 94 : description de la forme : Fenêtre
a
Lignes 3 - 6 : création de la forme
Lignes 8 - 24 : description de la barre de menu : voir § 5.
(Ici, s’ajouteront d’autres
commandes à la demande).
Lignes 26 -
83 : description des zones de saisie (cf. § 4.1.).
Lignes 66 - 83 : description des types d’annuités et de taux
Lignes 74 - 80 : préparent la liste des libellés devant être
affichée pour sélectionner le type d’annuité.
Lignes 96 - 109 : description des trois boutons (cf. § 4.3.4.).
Lignes 110 - 139 : description de l'en-tête du Plan de l'emprunt
Lignes 141 - 145 : description
du corps du Plan devant recevoir
les
données du Plan : Fenêtre b.
Le descriptif de la "Forme" a été écrit sous forme didactique, c'est-à-dire en ne présentant qu’un paramètre par ligne.
Cependant, il est possible de regrouper ces Propriétés sur une seule ligne ... en ajoutant la "Méthode Set" et en la portant juste après la Fonction Système wi, comme indiqué dans les premières lignes de la fonction.
FmAcPr;M;N;Z
[1] © 01-11-1995
[2] 'fmAcPr' wi 'Delete'
[3] wself 'fmAcPr' wi 'New'
'Form' 'Close'
[4] wi 'where' 0 0 30 80
[5] wi 'caption' 'Prêt simple'
[6] wi 'border' 113
[7]
[8] M (wself,'.mFile') wi 'New'
'Menu' 'Close'
[9] M wi 'Set' ('caption' 'File')
[10] N (M,'.mVac')
wi 'New' 'Menu' 'Close'
[11] N wi
'Set' ('caption' 'Impression Tableau')
('onClick' 'FnPrin')
[12] N (M,'.mSep1')
wi 'New' 'Menu' 'Close'
[13] N wi 'separator' 1
[14] N
(M,'.mQut') wi 'New' 'Menu' 'Close'
[15] N wi
'Set' ('caption' 'Quit') ('onClick' 'FnAcKc')
[16]
[17] M
(wself,'.mCalc') wi 'New' 'Menu' 'Close'
[18] M wi
'Set' ('caption' 'Calculs')
[19] N
„(M,'mVac')wi 'New' 'Menu' 'Close'
[20] N wi
'Set' ('caption' 'Valeur Acquise') ('onClick''FbAcKc')
[21] N
„(M,'.mSep1') wi 'New' 'Menu' 'Close'
[22] N wi 'separator' 1
[23] N
„(M,'.mInt') wi 'New' 'Menu' ' Close'
[24] N wi
'Set' ('caption' 'Total Intérêts') ('onClick''FnAcKc')
[25]
[26] M
(wself,'.lb1') wi 'New' 'Label' 'Close'
[27] M wi
'where' .2 .2 .9 14
[28] M wi
'style' 1
[29] M wi
'caption' 'Montant du Prêt'
[30] M wi
'font' 'Arial' 1 1
[31] M
(wself,'.ed1') wi 'New' 'Edit'
[32] M wi
'where' .2 15.5 1.5 11
[33] M wi
'style' 1
[34] M wi
'font' 'Arial' 1 1
[35]
[36] M
(wself,'.lb2') wi 'New' 'Label' 'Close'
[37] M wi
'where' 2 .2 .9 15
[38] M wi
'style' 1
[39] M wi
'caption' 'Nombre d''annuités'
[40] M wi
'font' 'Arial' 1 1
[41] M
(wself,'.ed2') wi 'New' 'Edit' 'Close'
[42] M wi
'where' 2 15.5 1.5 6
[43] M wi
'style' 1
[44] M wi
'font' 'Arial' 1 1
[45]
[46] M
(wself,'.lb3') wi 'New' 'Label' 'Close'
[47] M wi
'where' .2 27 .9 17
[48] M wi
'style' 1
[49] M wi
'caption' 'Taux Annuel du Prêt'
[50] M wi
'font' 'Arial' 1 1
[51] M
(wself,'.ed3') wi 'New' 'Edit' 'Close'
[52] M wi
'where' .2 45 1.5 10
[53] M wi
'style' 1
[54] M wi
'font' 'Arial' 1 1
[55]
[56] M
(wself,'.lb4') wi 'New' 'Label' 'Close'
[57] M wi
'where' 2 27 .9 17
[58] M wi
'style' 1
[59] M wi
'caption' 'Montant de l''Annuité'
[60] M wi
'font' 'Arial' 1 1
[61] M
(wself,'.ed4') wi 'New' 'Edit'
[62] M wi
'where' 2 45 1.5 10
[63] M wi
'style' 1
[64] M wi
'font' 'Arial' 1 1
[65]
[66] M
(wself,'.lb10') wi 'New' 'Label' 'Close'
[67] M wi
'where' .2 60 .9 12
[68] M wi
'style' 1
[69] M wi
'caption' 'Type d''Annuités'
[70] M wi
'font' 'Arial' .9 1
[71] M
(wself,'.ls10') wi 'New' 'List'
[72] M wi
'where' 1.7 56 3.5 23
[73] M wi
'style' 0
[74] Z'Annuel
équivalent' 'Mensuel équivalent'
[75] ZZ,'Bimestriel
équivalent' 'Trimestriel équivalent'
[76] ZZ,'Quadrimestriel
équivalent' 'Semestriel équivalent'
[77] ZZ,'Annuel
proportionnel' 'Mensuel proportionnel'
[78] ZZ,'Bimestriel
proportionnel' 'Trimestriel proportionnel'
[79] ZZ,'Quadrimestriel
proportionnel' 'Semestriel proportionnel'
[80] ZZ
[81] M wi
'list' Z
[82] M wi
'value' 1
[83] M wi
'font' 'Courier New' 1.05 1
[84]
[85] M
(wself,'.lb11') wi 'New' 'Label' 'Close'
[86] M wi
'where' 4.3 60 .9 17
[87] M wi
'style' 1
[88] M wi
'caption' 'Date de Départ J/M/A'
[89] M wi
'font' 'Arial' 1 1
[90] M
(wself,'.ed11') wi 'New' 'Edit'
[91] M wi
'where' 5.3 60 1.4 13
[92] M wi
'style' 0
[93] M wi
'text' (' ')
[94] M wi
'font' 'Courier New' 1.1 1
[95]
[96] M
(wself,'.bn1') wi 'New' 'Button' 'Close'
[97] M wi
'caption' 'Exit'
[98] M wi
'where' 4 .2 1.5 7
[99] M wi
'onClick' 'FnAcPr1'
[100]
[101] M (wself,'.bn2') wi 'New'
'Button' 'Close'
[102] M wi 'caption' 'Calcul 4°'
[103] M wi 'where' 4 8.2 1.5 11
[104] M wi 'onClick' 'FnAcPr1'
[105]
[106] M (wself,'.bn3') wi 'New'
'Button' 'Close'
[107] M wi 'caption' 'Tableau Amt'
[108] M wi 'where' 4 20 1.5 11
[109] M wi 'onClick' 'FnAcPr1'
[110]
[111] M (wself,'.lb5') wi 'New'
'Label' 'Close'
[112] M wi 'where' 8 .1 1 6
[113] M wi 'style' 1
[114] M wi 'caption' 'Date'
[115] M wi 'font' 'Arial' 1 1
[116]
[117] M (wself,'.lb6') wi 'New'
'Label' 'Close'
[118] M wi 'where' 8 13 1 15
[119] M wi 'style' 1
[120] M wi 'caption' 'Capital restant dû'
[121] M wi 'font' 'Arial' 1 1
[122]
[123] M (wself,'.lb7') wi 'New'
'Label' 'Close'
[124] M wi 'where' 8 30 1 12
[125] M wi 'style' 1
[126] M wi 'caption' 'Amortissement'
[127] M wi 'font' 'Arial' 1 1
[128]
[129] M (wself,'.lb8') wi 'New'
'Label' 'Close'
[130] M wi 'where' 8 47 1 12
[131] M wi 'style' 1
[132] M wi 'caption' 'Intérêt'
[133] M wi 'font' 'Arial' 1 1
[134]
[135] M (wself,'.lb9') wi 'New'
'Label' 'Close'
[136] M wi 'where' 8 64 1 9
[137] M wi 'style' 1
[138] M wi 'caption' 'T O T A L'
[139] M wi 'font' 'Arial' 1 1
[140]
[141] M (wself,'.ls1') wi 'New'
'List' 'Close'
[142] M wi 'where' 9 .1 18 80
[143] M wi 'style' 0
[144] M wi 'list' ' '
[145] M wi 'font' 'Courier New' 1.05 1
4.3. TRAITEMENT : Fonctions « CallBack »
Le but de l'étude et la manière de procéder étant connus, nous pouvons aborder la réalisation de l'œuvre, pas-à-pas.
4.3.1. Lancement de l’Application Emprunt
– La fonction FnAcPr, (dont le nom peut se trouver, à la fois, dans LX –pour un lancement automatique lors d’un double-clic sur l’icône– et/ou dans une touche de fonction Ctrl Fx –créée dans Option / Tools, Add suivi de Lx Ctrl+F1 dans ‘Menu Item’ et –lx dans ‘Command’...–), permet de lancer les opérations :
elle affiche la forme fmAcPr et se met en attente d'une action de l'utilisateur.
FnAcPr
[1] © 03-11-1995
[2] io1
[3] 0 0½ex 'K a i n t p'
[4] pw55
[5] FmAcPr
[6] FmMsg
[7]
[8] 'fmAcPr' wi 'Open'
[9] 'fmAcPr.ed1' wi 'Focus'
[10] 0 0½ex 'K a i n t p'
– Les lignes 5 et 6 exécutent les fonctions de création des Formes et les rendent disponibles pour une utilisation ultérieure.
– La ligne 8 rend opérationnelle la forme fmAcPr, et permet d'afficher les fenêtres visualisées au paragraphe 4.,
– La ligne 9 permet de positionner le curseur dans le champ 'Montant du prêt'.
4.3.2. Déclenchement d’un Événement
Lorsque les fenêtres sont affichées, la main est alors donnée à l'utilisateur.
Il peut se servir, soit de la souris, soit du clavier; et son action déclenche alors un événement qui est traité comme suit :
- Le clavier sera tout d'abord être sollicité pour qu’il puisse introduire ses données.
Les champs respectifs sont alors renseignés : trois sur quatre ; plus le cinquième, si besoin est.
- La souris sera alors utilisée pour actionner l'un des trois boutons, à travers le simple clic de son bouton gauche, ou, toujours le clavier, avec la touche de tabulation.
Une action a été déclenchée : clavier ou souris.
Comment traiter cet événement et quelles réponses sont apportées ?
Cet événement a permis d'activer la fonction CallBack FnAcPr1 qui est chargée de répondre à la sollicitation.
(Pour éviter le test de la variable système wself, il est possible de créer une fonction par événement ; ce choix n’a pas été retenu ici pour des raisons de place, mais il est évident que cela simplifie le travail, et permet de réutiliser ces fonctions dans d’autres WS, pour d'autres causes.).
4.3.3.1. La fonction CallBack FnAcPr1
Cette fonction concentre les réponses à toutes les sollicitations.
Elles sont au nombre de trois et répondent à l'enfoncement d'un des trois boutons qui sont situés dans la fenêtre a.
Le moyen de déterminer quel est le bouton enfoncé est de tester la variable-système wself, qui fournit l'information utile : quel événement en a été le déclencheur ?
Ici, les déclencheurs sont dénommés bn1, bn2 et bn3 pour les trois boutons de la forme, et sont présentés dans le paragraphe suivant.
4.3.4. Les Boutons
Chaque bouton a une action spécifique qui a été distribuée lors de la conception du projet : le libellé (‘caption’) permet de préciser cette action à l’utilisateur.
Le bouton bn1 "Exit" permet d'arrêter l'exécution du programme, de fermer toutes les formes précédemment ouvertes, et de revenir à APL III. Il est traité aux lignes 4 à 6.
Le bouton bn2 "Calcul 4° " permet de calculer et d'afficher la valeur du quatrième paramètre qui est resté vide d'information.
Le traitement va déterminer et colorier le champ calculé pour le distinguer des champs initiaux.
Il est traité aux lignes 8 à 59.
– La ligne 9 permet l'appel à la fonction de saisie et de contrôle des cinq champs.
Elle renvoie la valeur zéro si aucune erreur n'a été détectée, et a initialisé les
variables K, a, n et i.
– Les lignes 11 à 59 permettent de calculer la valeur 'manquante' :
Þ 11 à 22 pour la montant de l'annuité,
Þ 24 à 35 pour le montant du prêt
Þ 37 à 51 pour le nombre d'annuités
Þ 53 à 59 pour la valeur du taux annuel.
Le bouton bn3 "Tableau Amt" permet de lancer la constitution et l'affichage du Plan d'Amortissement de l'emprunt. Il est traité aux lignes 61 à 106.
– La ligne 62 permet l'appel à la fonction de saisie et de contrôle des cinq champs. Elle renvoie la valeur zéro si aucune erreur n'a été étectée, et a initialisé les variables K, a, n, i et p.
– Les lignes 63 - 80 initialisent les valeurs nécessaires à la génération du tableau.
– La ligne 79 génère soit les nombres de 1 à n –nombre d'annuités–, soit les dates de remboursement, calculées à partir du quatrième champ, si la date de départ est présente, et valide, dans le champ 5.
– Lignes 81 - 103 effectuent les calculs nécessaires à la constitution du corps du tableau, et le présente à la visualisation.
Afin de minimiser les erreurs dues aux arrondis, les calculs doivent être effectués dans un ordre précis :
Þ la première ligne du tableau est d'abord calculée; les colonnes 2, 'Capital Restant Dû', et 3, 'Amortissement', sont ensuite déterminées;
Þ la colonne 4, 'Intérêts', est la différence, par ligne, des deux précédentes colonnes;
Þ la colonne 5 reçoit le montant de l'annuité.
– La ligne 98 met le tableau numérique sous forme de caractères, c'est-à-dire propre à être visualisé et/ou édité;
– La ligne 100 s'occupe de l'affichage du tableau dans la fenêtre b.
L'impression du tableau ne doit poser aucun problème :
. Il est possible d'imprimer le tableau en direct, au moyen de la commande « Impression Tableau » du menu « File » : voir § 5.
. Il est peut-être plus intéressant de porter le tableau, au moyen d'un DDE,
* dans une feuille de tableur de type EXCEL,
* et, toujours à partir d'APL III, d'agrémenter et compléter
l'environnement du tableau proprement dit, avant son édition.
FnAcPr1;D;F;G;J;S;T;X;Y;io
[1] © 01-11-1995
[2] io1 ª S¯3Gwself
[3] :SELECT S
[4] :CASE
'bn1'
[5] 0 0½ex 'K a i n t p'
[6] '#' wi 'Reset'
[7]
[8] :CASE
'bn2'
[9]
(FnSais 1)/0
[10]
[11] :IF 0 =
½a
[12] :IF 0 = i
[13] a
0.005 + K ÷ n
[14] :ELSE
[15] i
.01 × i
[16] i
FnAcTx (t n i)
[17] a
15 2 K ÷ Ani n i
[18] :ENDIF
[19] ((7G),'ed4') wi 'text' ((15 2a)~'
')
[20] ((7G),'ed4') wi 'color' 0 255 0
[21]
0
[22] :ENDIF
[23]
[24] :IF 0 =
½K
[25] :IF 0 = i
[26] K
a × n
[27] :ELSE
[28] i .01
× i
[29] i
FnAcTx (t n i)
[30] K
15 2 a × Ani n i
[31] :ENDIF
[32] ((7G),'ed1') wi 'text' ((15 2K)~'
')
[33] ((7G),'ed1') wi 'color' 0 255 0
[34]
0
[35] :ENDIF
[36]
[37] :IF 0 =
½n
[38] :IF 0 = i
[39] n
K ÷ a
[40] :ELSE
[41] i .01
× i ª i FnAcTx (t t i)
[42] :IF 0
> 1 - K×i÷a
[43] FnMsg1 (31' Impossible. Changer la'),(31'valeur
d''un des paramètres'),31'pour le calcul de n'
[44]
0
[45] :ENDIF
[46] n 15 0 .5+( - µ (1-
((K×i)÷a))) ÷ µ (1 + i)
[47] :ENDIF
[48] ((7G),'ed2') wi 'text' ((15 0n)~'
')
[49] ((7G),'ed2') wi 'color' 0 255 0
[50]
0
[51] :ENDIF
[52]
[53] :IF 0 =
½i
[54] i .01
[55] i ¯1FnKaTx (K a n i)
[56] i FnAcTy (t n i)
[57] ((7G),'ed3') wi 'text' ((15 2
100 × 6i)~' ')
[58] ((7G),'ed3') wi 'color' 0 255 0
[59] :ENDIF
[60]
[61] :CASE 'bn3'
[62]
(FnSais
2)/0
[63] i
.01 × i
[64] Y
1 + i FnAcTx (t n i)
[65] p((n+1),7)½0
[66] D((7G),'ed11')
wi 'text'
[67] :IF
D^.=' '
[68] p[¼n;3] ¼n
[69] :ELSE
[70] D[(~D¹av[48+¼10])/¼½D]' '
[71] :IF 3 ¬ ½DD
[72] FnMsg1 (30'Date incertaine ou
incorrecte.'),(30'Retaper la Date sous la forme'),30'JJ/MM/AA ou J
J-MM-AA.'
[73]
0
[74] :ENDIF
[75] :IF ~^/1 1 ³ </D°.<3 2½ 1 32 1 13 80 99
[76] FnMsg1 (30' Date fausse.'),(30'Retaper la Date sous
la forme'),30'JJ/MM/AA ou
JJ-MM-AA.'
[77]
0
[78] :ENDIF
[79] p[¼n;1 2 3] FnAcDt(n D t)
[80] :ENDIF
[81] p[1;4]
K
[82] p[¼n;7]
a
[83] p[1;6]
15 2K × i
[84] p[1;5]
15 2-/p[1;7 6]
[85] p[2;4]
15 2-/p[1;4 5]
[86] :FOR J
:IN 2+¼n-2
[87] :IF i=0
[88] p[J;4]
15 2 p[J-1;4] - a
[89] :ELSE
[90] p[J;4]
15 2 a × Ani (n-J-1) i
[91] :ENDIF
[92] :ENDFOR
[93] :FOR J
:IN 1+¼n-1
[94] p[J;5] 15 2 p[J-1;5] × Y
[95] p[J;6] 15 2 a - p[J;5]
[96] :ENDFOR
[97] p[n;5]
15 2p[n;5] +K-15 2+/p[¼n;5]
[98] p[n;6]
15 2 -/p[n;7 5]
[99] p[n+1;5] 15 2+/p[¼n;5]
[100] p[n+1;6] +/p[¼n; 6]
[101] p[n+1;7] +/p[¼n; 7]
[102] pp[;1 2 3],'4K2G<ZZZ.ZZZ.ZZZ,Z9
>'fmt p[;3+¼4]
[103] p[n+1;¼9]'T O T A L'
[104] ((7G),'ls1') wi 'list' p
[105]
0
[106] :ENDSELECT
La
fonction FnMsg1 permet de prévenir
l’utilisateur d’une anomalie détectée ou d’une impossibilité de continuer le traitement
du fait de la rencontre d’une valeur erronée ou hors limites.
La fonction FnAcDt permet de générer toutes les dates pour la première colonne du plan d'amortissement.
Pour rester dans le droit fil de notre propos et ne pas alourdir la présentation, JJ est supposé être au plus égal à 28 : des contrôles de structures doivent être introduits pour traiter un JJ supérieur à 28 en fonction du mois et du caractère bissextile de l'année traitée.
RFnAcDt
P;A;B;F;I;J;K;M;N;S;T;V;X;Z
[1] © 03-11-1995
[2] X12
3½'JanFévMarAvrMaiJuiJulAoûSepOctNovDéc'
[3] (J M A)2P ª S1P ª F3P
[4] Z12 1 2 3 4 6 12 1 2 3 4 6[3P]
[5] T12½1 12 6 4 3 2
[6] KS½J
[7] V(M-Z)+Z×¼12÷Z
[8] N S½V-12×V>12
[9] B100|A,A++(¯1N)1N
[10] :FOR I
:IN ¼S
[11] N[I] X[N[I];]
[12] :ENDFOR
[13] R³K®N,[0.5]B
La fonction FnAcKc permet de calculer, pour l’instant, deux valeurs :
- la Valeur Acquise, par rapport à une date donnée, par un montant K francs, n années plus tard et au taux constant de i % l'an.
- le Total des Intérêts qui aura été versé au terme habituel de l’emprunt.
Elle est disponible dans le Menu, sous la rubrique "Calculs"
(ce
menu est destiné à recevoir ultérieurement d'autres commandes, selon l'intérêt
porté à ce propos).
FnAcKc;G;S
[1] © 03-11-1995
[2] Gwself ª SG wi 'name'
[3] :SELECT S
[4] :CASE 'mVac'
[5] :IF 6 = +/nc 'K n i'
[6] T
„
K
× (1+i)n
[7] :IF 15 <
½•|˜T
[8] FnMsg1 (31'Un des paramètres est'),(31†'outrancier.'),31†'Veuillez le corriger'
[9] :ELSE
[10] FnMsg1
(31†La Valeur Acquise est
de:'),,'K2G<ZZZ.ZZZ.ZZZ.ZZ9,99>'Œfmt T
[11] :ENDIF
[12] :ENDIF
[13] :CASE
'mQut'
[14] 0 0 ½ ex
'K n i a t'
[15] '#' wi
'Reset'
[16] :CASE
'mInt'
[17] :IF 6 =
+/Œnc 'K n a'
[18] T
„ (n
× a) - K
[19] :IF 15
<
½•|˜T
[20]
FnMsg1 (31'Un des paramètres est'),(31†'outrancier.'),31†Veuillez le corriger'
[21] :ELSE
[22] FnMsg1 (31†Le Total des Intérêts payés'),
31†'est de',,'K2G<ZZZ.ZZZ.ZZZ.ZZ9,99>'Œfmt T
[23]
[24] :ENDIF
[25] :ENDIF
[26]
[27] :ENDSELECT
La ligne 5 s'assure de la présence des trois valeurs nécessaires aux calculs :
- le montant,
- le nombre d'annuités,
- le taux par période.
Les lignes 8 et 20 indiquent à l’utilisateur que l’une des valeurs saisies ne permet pas de calculer correctement la valeur demandée : il suffit de saisir une nouvelle valeur et de relancer la commande.
La fonction FnAcTx est utilisée dans le calcul d'un taux dont l'annuité ne correspond pas à une année (prise ici comme type d'annuité par défaut) :
ce taux est le taux, équivalent ou proportionnel, choisi et remplace le taux annuel i initial, dans les formules (voir Annexe).
Les données en entrée sont le type d’annuités choisi, le nombre d’annuités et le taux de la période.
RFnAcTx P
[1] © 03-11-1995 t n i
[2] P,P
[3] :SELECT 1P
[4] :CASE 1
[5] R 3P
[6] :CASE 2
[7] R
¯1+(1+3P)*÷12
[8] :CASE 3
[9] R ¯1+(1+3P)*÷6
[10] :CASE 4
[11] R
¯1+(1+3P)*÷4
[12] :CASE 5
[13] R
¯1+(1+3P)*÷3
[14] :CASE 6
[15] R
¯1+(1+3P)*÷2
[16] :CASE 7
[17] R
(3P) × Sni 1, 3P
[18] :CASE 8
[19] R (3P) × Sni (÷12), 3P
[20] :CASE 9
[21] R (3P) × Sni (÷6), 3P
[22] :CASE 10
[23] R (3P) × Sni (÷4), 3P
[24] :CASE 11
[25] R (3P) × Sni (÷3) ,3P
[26] :CASE 12
[27] R (3P) × Sni (÷2) ,3P
[28] :ENDSELECT
[29] R 17
8 R
La fonction FnAcTy est utilisée en contrepoint de FnAcTx, dans le calcul d'un taux dont l'annuité ne correspond pas à une année, et le restitue sous forme de taux annualisé.
RFnAcTy P
[1] © 03-11-1995
[2] P,P
[3] :SELECT 1P
[4] :CASE 1
[5] R 3P
[6] :CASE 2
[7] R ¯1+(1+3P)*12
[8] :CASE 3
[9] R ¯1+(1+3P)*6
[10] :CASE 4
[11] R ¯1+(1+3P)*4
[12] :CASE 5
[13] R ¯1+(1+3P)*3
[14] :CASE 6
[15] R ¯1+(1+3P)*2
[16] :CASE 7
[17] R
3P
[18] :CASE 8
[19] R
12
× 3P
[20] :CASE 9
[21] R
6
× 3P
[22] :CASE 10
[23] R
4
× 3P
[24] :CASE 11
[25] R
3
× 3P
[26] :CASE 12
[27] R
2
× 3P
[28] :ENDSELECT
[29] :IF R
> 100
[30] FnMsg1
(30¯25'Erreur.'),(30' Taux annuel supérieur à 100.'),¯10'Ignorer.'
[31] R
0
[32] :ENDIF
[33] R
15 8 R
Cette fonction permet de calculer la Valeur actuelle de n versements de 1 F, et qui, divisée de K permet de calculer la valeur de l'annuité (voir formule en Annexe).
Les données en entrée sont le nombre d’annuités et le taux de la période.
RAni P
[1] © 03-11-1995 n i
[2] R 15 8 (1 - (1 + 2P)
* -1P) ÷ 2P
Cette fonction permet de calculer la Valeur Acquise par n versements de 1 F (voir formule en Annexe).
Les données en entrée sont le nombre d’annuités et le taux de la période.
RSni P
[1] © 01-11-1995 n i
[2] R 15 8 (((1 + 2P) * 1P)
- 1) ÷ 2P
4.3.5.7. Relations remarquables
Il est intéressant de noter que :
Ani P = ( 1
+ i) * –n
×
Sni P
Sni P = ( 1
+ i) * n
×
Ani P
i = (Ani P ) –1 – (Sni P ) –1
Cette fonction concerne la saisie et le contrôle des trois ou quatre données du premier groupe : voir § 4.1.1.
– Les lignes 3 à 6 initialisent la couleur des champs.
– Les lignes 8 à 21 traitent du montant K de l'emprunt : lecture en 8, contrôles ensuite, si le champ a une valeur significative et numérique.
– Les lignes 23 à 31 traitent du nombre n d'annuités : lecture en 23, contrôles ensuite, si le champ a une valeur significative et numérique.
– Les lignes 33 à 41 traitent du taux i annuel : lecture en 33, contrôles ensuite, si le champ a une valeur significative et numérique.
– Les lignes 43 à 51 traitent du montant a de l'annuité : lecture en 43, contrôles ensuite, si le champ a une valeur significative et numérique.
– La ligne 53 s'occupe de récupérer le type d'annuité sous forme d'index.
– Les lignes 55 à 65 testent la présence ou l'absence des trois ou quatre zones obligatoires, selon la valeur passée par la fonction appelante.
RFnSais P;G;T;io
[1] © 03-11-1995
[2] ioR1 ª Gwself
[3] ((7G),'ed1') wi 'color' 255 255
255
[4] ((7G),'ed2') wi 'color' 255 255
255
[5] ((7G),'ed3') wi 'color' 255 255
255
[6] ((7G),'ed4') wi 'color' 255 255
255
[7]
[8] K((7G),'ed1') wi 'text'
[9] :IF 0 < ½K
[10] :IF 0 < ½T(vi K)/fi K
[11] K
T
[12] :IF
99999999 < K
[13] :ORIF
999 K
[14] FnMsg1 (31¯25'Attention !'),(31'Le
Montant doit être compris entre '),31'1.000 et 99.999.999'
[15]
0
[16] :ENDIF
[17] :ELSE
[18] FnMsg1
(31¯25'Attention !'),(31' Le Montant'),31'n''est pas
numérique'
[19]
0
[20] :ENDIF
[21] :ENDIF
[22]
[23] n((7G),'ed2')
wi 'text'
[24] :IF 0
< ½n
[25] :IF 0 < ½T(vi n)/fi n
[26] n
T
[27] :ELSE
[28] FnMsg1
(31¯25'Attention !'),(31' Le nombre d''annuités'),31'n''est
pas numérique'
[29]
0
[30] :ENDIF
[31] :ENDIF
[32]
[33] i((7G),'ed3')
wi 'text'
[34] :IF 0
< ½i
[35] :IF 0 ½T(vi i)/fi i
[36] i
T
[37] :ELSE
[38] FnMsg1
(31¯25'Attention !'),(31' Le taux annuel'),31'n''est
pas numérique'
[39]
0
[40] :ENDIF
[41] :ENDIF
[42]
[43] a((7G),'ed4')
wi 'text'
[44] :IF 0
< ½a
[45] :IF 0 < ½T(vi a)/fi a
[46] a
T
[47] :ELSE
[48] FnMsg1
(31¯25'Attention !'),(31'L''annuité'),31'n''est pas
numérique'
[49]
0
[50] :ENDIF
[51] :ENDIF
[52]
[53] t(((7G),'ls10')
wi 'value')~' '
[54]
[55] :IF P =
1
[56] :IF 3 ¬ +/(K>0),(n>0),(i0),a>0
[57] FnMsg1
(31¯25'Attention !'),(31'Il faut 3 paramétres sur 4'),31'signicatifs.'
[58]
0
[59] :ENDIF
[60] :ELSEIF
P = 2
[61] :IF 4 ¬ +/(K>0),(n>0),(i0),a>0
[62] FnMsg1
(31¯25'Attention !'),(31'Il faut les 4 paramétres'),31'signicatifs.'
[63]
0
[64] :ENDIF
[65] :ENDIF
[66] R0
Le Tableau d'Amortissement ayant été constitué, il est possible de l'imprimer, agrémenté d'un en-tête rappelant les paramètres introduits.
– La ligne 3 initialise la variable, devant recevoir le tableau destiné à être imprimé, de sept lignes à blanc pour l'en-tête, suivies du Plan d'Amortissement.
– Les lignes 4-7 créent l'en-tête.
– La ligne 9 lance l'ordre d'impression en utilisant l'utilitaire correspondant.
FnPrin;A;I;T
[1] © 03-11-1995
[2] I½p ª pwI[2]
[3] A((7,I[2])½' ')®p
[4] A[1;]I[2],((2×½T)½1 0)\T'Amortissement
d''un PRET indivis'
[5] A[3;]I[2],'K2G<Capital :
ZZ.ZZZ.ZZ9,99>,K4G<Taux de
Z9,99 %>' fmt K (FnAcTy t n i)
[6] A[4;]I[2],'G<Nombre de périodes
: Z.ZZ9>,K2G<Montant de l''Annuité ZZ.ZZZ.ZZ9,99>'fmt
n a
[7] A[6;]I[2],'D a t e Capital Amortissement Intérêts
Annuité'
[8]
[9] UCMD ']PRINT A /F'
Un mot seulement sur la forme et sur les deux fonctions suivantes.
Elles sont issues d’un espace de travail personnel, commun à plusieurs WS.
Elles permettent d'afficher un message (le test de la réponse a été volontairement supprimé, mais existe dans la fonction générique).
FmMsg
[1] © 03-11-1995
[2] 'fmMsg' wi 'Delete'
[3]
[4] wself 'fmMsg' wi 'New'
'Form' 'Close'
[5] wi 'where' 6 19 11 40
[6] wi 'caption' 'M E S S A G E R I E'
[7]
[8] wself 'fmMsg.lb1' wi 'New'
'Label' 'Close'
[9] wi 'where' 0.2 0.2 2 38
[10] wi
'style' 0
[11] wi
'font' 'Arial' 1.3 1 'ansi'
[12]
[13] wself
'fmMsg.lb2' wi 'New' 'Label' 'Close'
[14] wi
'where' 2.2 0.2 2 38
[15] wi
'style' 0
[16] wi
'font' 'Arial' 1.3 1 'ansi'
[17]
[18] wself
'fmMsg.lb3' wi 'New' 'Label' 'Close'
[19] wi
'where' 4.2 0.2 2 38
[20] wi
'style' 0
[21] wi
'font' 'Arial' 1.3 1 'ansi'
[22]
[23] wself
'fmMsg.bn1' wi 'New' 'Button' 'Close'
[24] wi
'where' 7 11 1.3 7
[25] wi
'caption' 'OUI'
[26] wi
'onClick' 'FnMsg0'
[27]
4.3.6.2. Fonction de Lancement et d’Affichage
FnMsg1 P
[1] ©
03-11-1995
[2] 'fmMsg'
wi 'Open' 'visible' 1
[3]
[4] 'fmMsg.lb1' wi 'caption' (30P)
[5] 'fmMsg.lb2' wi 'caption' (3030P)
[6] 'fmMsg.lb3' wi 'caption' (3060P)
[7]
[8] 0 0½
'fmMsg' wi 'Wait'
4.3.6.3. Fonction d’Effacement de la fenêtre
FnMsg0;G;S;Y
[1] © 03-11-1995
[2] G6Swself
[3] Y¯1S
[4]
[5] (G,'bn1') wi 'data' Y
[6]
[7] 0 0½ 'fmMsg' wi 'Close'
La
barre de Menu, située en deuxième ligne de la première fenêtre, comporte deux
Menus nommés "File" et "Calculs".
Le menu 'File' est destiné à gérer les Entrées / Sorties générales de l'application.
Il comporte deux commandes en son sein.
La commande 'Impression Tableau' permet de lister le tableau d'Amortissement, précédé d'un en-tête récapitulant les données fournies.
La commande 'Quitter' permet de quitter l'Application.
5.2. Menu 'Calculs'
Le menu 'Calculs' recense certains calculs intéressants, immédiatement déduits des calculs relatifs à la détermination du plan d'amortissement.
Cet exercice banal a été écrit en une après-midi pluvieuse : nous reconnaissons, ici, la puissance et la simplicité de mise en œuvre d'APL III[1].
Il a permis de mettre en pratique plusieurs concepts nouveaux d'APL III et d'en étudier pleinement les différentes articulations:
conception-réalisation, forme-fonction, déclenchement-réponse, ....
Au-delà de cet exemple, il est loisible de compliquer cet ensemble et d'introduire les développements idoines –et conséquents– pour répondre à d'autres besoins :
– emprunts à taux multiples;
– emprunts à taux variant selon une ou plusieurs lois;
– emprunts ayant des particularités relatif à son mode de remboursement.
mais aussi :
– simulations de tous les paramètres pour répondre à certaines contraintes;
– versements apériodiques;
– comparaison graphique entre les
montants remboursés selon le Type
d'Annuités choisi, le
taux,...
Cette liste –non exhaustive– fournit des éléments pour des développements rapides et... peut-être ultérieurs, si le besoin s'en faisait sentir au niveau des lecteurs.
Alors ?
Convaincu (e) ?
A vos claviers !
BIBLIOGRAPHIE
BONNEAU : Mathématiques Financières, DUNOD.
E. LESCASSE, Première Application en APL*PLUS III, Les Nouvelles d'APL, No 12-13 (sept.-déc. 1994).
ANNEXE
Les formules mathématiques de base, utilisées dans le corps du texte, sont présentées ci-dessous.
La relation, entre le capital K et l'annuité a, est donnée par la formule suivante :
avec (voir fonctions Ani et Sni) :
i étant le Taux correspondant au type d’annuités
n le nombre d’annuités de remboursement
Le taux équivalent, devant remplacer le taux annuel i de la formule [ I ], si le paiement de l’annuité n’est pas de type annuel, s'obtient selon :
Le taux proportionnel s'obtient par la formule :
avec m = 12 si type annuité = mensuel
jusqu'à m = 2 = semestriel
[1] Il a été vérifié que le logiciel, écrit pour la version 1.1, s’exécute correctement aussi avec la version 1.2 d’APL*PLUS III