APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 191 APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU CHAPITRE 8 OBJECTIF INTÉGRER LES DIFFÉRENTES NOTIONS ET APPRO- CHES, EXPOSÉES DANS LES CHAPITRES PRÉCÉDENTS, DANS UNE DÉMARCHE CONCRÈTE DE RÉSOLUTION DE PROBLÈME EN PASCAL/DELPHI.
192 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 193 Après avoir abordé les éléments de base de l algorithme et du langage PASCAL, il apparaît naturel de chercher à intégrer ces différentes notions et approches dans une démarche concrète de résolution de problème. Dans ce chapitre, nous allons étudier un problème de traitement d une liste de fournisseurs et de calcul des coûts d acquisition de matériel électronique de bureau. Le traitement d une liste de fournisseurs peut être résolu par l utilisation de pointeurs, lesquels nous permettent de garder en mémoire des enregistrements, de les visionner et de supprimer un ou plusieurs enregistrements. Pour faciliter la compréhension de l exposé, posons le problème. 8.1 SPÉCIFICATION DU PROBLÈME Concevons un programme PASCAL qui nous permettra d utiliser un menu, de garder en mémoire des enregistrements, de les visionner et de supprimer un ou plusieurs enregistrements, de calculer les frais d intérêt et l amortissement du matériel électronique de bureau. Les grandes étapes du programme sont les suivantes : 1. Créer des enregistrements 2. Afficher les enregistrements à l écran 3. Supprimer un enregistrement 4. Saisir l entrée des données pour le calcul des frais d intérêt et de l amortissement 5. Calculer les frais d intérêt et la somme du versement par mois 6. Calculer l amortissement et la valeur actuelle du bien 7. Imprimer les résultats des calculs des frais d intérêt et de l amortissement. Ce programme utilise des pointeurs pour l entrée des données des fournisseurs. Le type pointeur permet de garder en mémoire les données des enregistrements (nom, prénom et adresse du fournisseur), d afficher à l écran les enregistrements entrés et de supprimer un ou plusieurs enregistrements. Les calculs des frais d intérêt et de l amortissement du capital commencent par l entrée des données suivantes : prénom et nom de l emprunteur, montant du prêt,
194 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI durée des remboursements du capital et des frais d intérêt, taux d intérêt annuel, valeur originale du produit et nombre d années couvertes par l amortissement. Pour connaître les intérêts avec la méthode du capital décroissant à taux d intérêt constant, le programme calcule le nombre de mois prévus pour le remboursement du prêt. Il détermine la somme totale des frais d intérêt et du capital qui servira à rembourser le prêt. Enfin, il calcule la somme mensuelle du remboursement en capital et intérêts. Avec l amortissement décroissant à taux constant, la valeur du bien décroît d un pourcentage constant chaque année. Pour obtenir le facteur d amortissement, nous divisons le nombre 2 par la durée de vie du bien. Pour obtenir l amortissement annuel, on multiplie la valeur du bien au début de chaque année par ce facteur. Lorsque les calculs sont terminés, le programme imprime le taux d intérêt annuel, le total des frais d intérêt et le montant à payer par mois. Il imprime aussi le taux d amortissement, la valeur de l amortissement et la valeur actuelle du bien pour chaque année, et ce pour la durée prévue. 8.2 DIAGRAMME HIÉRARCHIQUE ET ALGORITHME Le diagramme hiérarchique, aussi appelé structurogramme, définit les grandes étapes que le programme aura à franchir pour résoudre le problème. Avant même de commencer l élaboration d un diagramme hiérarchique (structurogramme), il est important de bien comprendre le problème à résoudre. La figure 8.1 présente le diagramme hiérarchique correspondant au problème que nous étudions.
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 195 Programme principal Options Visualiser Supprimer Interet_ Amortissement Entrer_ Fournisseurs Supprimer_ Nom Entrer_Inter et Amortissement Calcul_Interet Calcul_ Amortissement Impression Impression_ Interet Impression_ Amortissement FIGURE 8.1 DIAGRAMME HIÉRARCHIQUE. 8.3 PROCÉDURES ET PROGRAMME Pour programmer un ordinateur, il faut lui donner des ordres très précis, afin que tout fonctionne bien. Nous parlons ainsi d une série d étapes à préciser à l ordinateur, à lui dicter, en utilisant pour ce faire le langage de programmation PASCAL. Dans les pages qui suivent, nous présentons la programmation en PASCAL des modules du diagramme hiérarchique.
196 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI 8.3.1 La procédure Options La procédure Options permet de choisir une option du programme parmi les options suivantes : Entrer les données des fournisseurs Visualiser les enregistrements Supprimer un enregistrement Calculer les intérêts et l amortissement Retourner au menu Quitter le programme. Exemple 8.1 PROCEDURE Options; (* But : Afficher les options du menu à l écran *) WRITELN(' ': 10,' 1 : Entrer les données des fournisseurs '); WRITELN(' ': 10,' 2 : Visualiser les enregistrements '); WRITELN(' ': 10,' 3 : Supprimer un enregistrement '); WRITELN(' ': 10,' 4 : Calculer l''intérêt et l''amortissement '); WRITELN(' ': 10,' 5 : Retourner au menu '); WRITELN(' ': 10,' 6 : Quitter le programme '); 8.3.2 Procédure Entrer_Fournisseurs On utilise, dans cette procédure, un type pointeur. Le type pointeur permet de définir les emplacements des variables d un enregistrement en mémoire et leur taille durant la compilation. La procédure Entrer_Fournisseurs demande la saisie du nom, du prénom et de l adresse des fournisseurs, laquelle comprend le numéro civique, la rue, la ville, la province et le code postal.
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 197 Exemple 8.2 PROCEDURE Entrer_Fournisseurs; (* But : Permet d entrer les données des enregistrements *) VAR P,Pt : Pointeur; NEW(P); IF Premier=NIL THEN Premier:=P ELSE Pt:=Premier; WHILE Pt^.Suivant<>NIL DO Pt:=Pt^.Suivant; Pt^.Suivant:=P; N:=1; REPEAT (* Entrée des données *) WRITE('Entrez le prénom : '); READLN(P^.Prenom); WRITE('Entrez le nom : '); READLN(P^.Nom); WRITE('Entrez le numéro de porte et l''appartement : '); READLN(P^.No); WRITE('Entrez la rue : '); READLN(P^.Rue); WRITE('Entrez la ville : '); READLN(P^.Ville); WRITE('Entrez la province : '); READLN(P^.Province); WRITE('Entrez le code postal : '); READLN(P^.CodePostal); UNTIL P^.Nom<>' '; P^.Suivant:=NIL; {Fait pointer le dernier élément sur NIL}
198 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI 8.3.3 Procédure Supprimer La procédure Supprimer utilise aussi des pointeurs. Le type pointeur, dans cette procédure, permet de supprimer l élément de l emplacement de l enregistrement en mémoire. En supprimant l élément de l emplacement, les données de cet enregistrement ne sont plus accessibles. Exemple 8.3 PROCEDURE Supprimer(Nom:String); (* But : Supprime un enregistrement *) VAR Pt : Pointeur; IF Premier<>NIL THEN IF Premier^.Nom=Nom THEN Premier:=Premier^.Suivant ELSE Pt:=Premier; WHILE Pt^.Suivant<>NIL DO IF Pt^.Suivant^.Nom=Nom THEN Pt^.Suivant:=Pt^.Suivant^.Suivant; Pt:=Pt^.Suivant; 8.3.4 Procédure Supprimer_Nom La procédure Supprimer_Nom permet d entrer le nom de l élément qui va être supprimé.
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 199 Exemple 8.4 PROCEDURE Supprimer_Nom; (* But : Permet d entrer le nom de l élément qui va être supprimé *) VAR Nom : String[20]; Pt : Pointeur; WRITELN('Entrez le nom à supprimer'); READLN(Nom); Supprimer(Nom); 8.3.5 Procédure Visualiser La procédure Visualiser permet d afficher à l écran tous les enregistrements en mémoire. Les variables des enregistrements affichés à l écran sont les mêmes qu à la saisie, c est-à-dire le nom, le prénom et l adresse des fournisseurs, laquelle comprend le numéro civique, la rue, la ville, la province et le code postal. Exemple 8.5 PROCEDURE Visualiser; (* But : Permet de visualiser les enregistrements *) VAR Pt : Pointeur; Pt:=Premier; WHILE Pt<>NIL DO WRITELN(' Prénom : ', Pt^.Prenom:15, ' Nom : ', Pt^.Nom:15); WRITE(' Numéro de porte et l''appartement : ', Pt^.No); WRITELN(' ':3, 'Rue : ', Pt^.Rue); WRITE(' La ville : ', Pt^.Ville); WRITELN(' ':3, 'La province : ', Pt^.Province); WRITELN(' Le code postal : ', Pt^.CodePostal); Pt:=Pt^.Suivant; WRITELN('Fin de la liste');
200 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI 8.3.6 Procédure Entrer_Interet_Amortissement La procédure Entrer_Interet_Amortissement n utilise pas de pointeur. Cette procédure permet de saisir à l écran les données nécessaires au calcul des intérêts et de l amortissement, selon la méthode de l amortissement du capital décroissant à taux constant. On utilise, dans cette procédure, les variables suivantes : le nom, le prénom, le montant du prêt, la durée des remboursements en capital et intérêts, le taux d intérêt annuel, le montant de l amortissement et le nombre d années de l amortissement. Exemple 8.6 PROCEDURE Entrer_Interet_Amortissement (* But : Entrée des données pour le calcul *) (* du prêt et de l amortissement *) REPEAT WRITE('Entrez le prénom : '); READLN(PrenomI); WRITE('Entrez le nom : '); READLN(NomI); WRITE('Entrez le montant du prêt : '); READLN(Montant); WRITE('Entrez la durée des remboursements : '); READLN(Nans); WRITE('Entrez le taux d intérêt : '); READLN(Interet); WRITE('Entrez le montant de l''amortissement : '); READLN(MontantA); WRITE('Entrez le nombre d années de l''amortissement : '); READLN(NansA); UNTIL NomI <> ' ';
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 201 8.3.7 Procédure Calcul_Interet La procédure Calcul_Interet calcule les frais d intérêt avec la méthode du capital décroissant à taux d intérêt constant. Principalement, elle calcule les frais d intérêt pour toute la durée prévue et le montant à payer en capital et intérêts par mois, et ce pour toute la période prévue. Exemple 8.7 PROCEDURE Calcul_Interet; (* But : Calculer les intérêts et le montant des remboursements *) (* Calcul des intérêts *) Interet100:=Interet/100; Nmois:=12*Nans; Interet12:=Interet100/12; Montant_Deduit:=Montant/Nmois; MRestant:=Montant; MInteret_Debut:=Montant*Interet12; FOR Y:=1 TO Nmois DO Minteret:=MInteret+(MRestant*Interet12); Mrestant:=MRestant-Montant_Deduit; Total:=MInteret+Montant; Payer_Mois:=Total/Nmois; Impression_Interet; 8.3.8 Procédure Calcul_Amortissement La procédure Calcul_Amortissement permet de calculer le taux d amortissement du capital annuel décroissant et la valeur actuelle. Pour obtenir le facteur d amortissement, nous divisons le nombre deux par la durée de vie du bien. On multiplie ce facteur par la valeur du bien au début de chaque année, ce qui donne l amortissement annuel.
202 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI Exemple 8.8 PROCEDURE Calcul_Amortissement; (* But : Calculer l amortissement *) X:=NansA; Taux:=2/X; Valeur:=MontantA; FOR N:=1 to x DO Amortissement:=Taux*valeur; Valeur:=Valeur-amortissement; Impression_Amortissement; 8.3.9 Procédure Impression_Interet La procédure Impression_Interet imprime les résultats des calculs de la méthode du capital décroissant à taux d intérêt constant. Elle imprime le nom, le prénom, le montant du prêt, le taux d intérêt annuel, le total des frais d intérêt, le total des frais en capital et intérêts, ainsi que le montant à payer en capital et intérêts par mois. Elle imprime également le montant du capital pour l amortissement.
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 203 Exercice 8.9 PROCEDURE Impression_Interet; (*But : Permet d imprimer les résultats des calculs *) WRITELN(f, 'Prénom : ', PrenomI:20, ' ':12, 'Nom : ', NomI:20); WRITELN(f, 'Le montant du prêt : ', Montant:10:2); WRITELN(f, 'Le taux d''intérêt annuel: ', Interet:4:3); WRITELN(f, 'Total des frais d''intérêt : ', MInteret:10:2); WRITELN(f, 'Total des frais de crédit : ', Total:9:2); WRITELN(f, 'Montant à payer par mois : ', Payer_Mois:9:2); WRITELN(f, 'Durée du prêt : ', Nans); WRITELN(f, 'Montant de l''amortissement : ', MontantA:10:2); 8.3.10 Procédure Impression_Amortissement La procédure Impression_Amortissement imprime les résultats des calculs de l amortissement du capital décroissant à taux constant. Cette procédure permet d imprimer, pour chaque fin d année, la valeur de l amortissement en capital et la valeur actuelle. Exemple 8.10 PROCEDURE Impression_Amortissement; (* But : Imprime les résultats de l'amortissement *) VAR Y : INTEGER;
204 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI WRITE(f, 'Fin de l année : ', N:2, ' ':5); WRITE(f, 'Taux : ', Taux:4:2 ); WRITE(f, ' ':5, ' Amortissement : ', Amortissement:5:0); WRITELN(f, ' ':5,' Valeur actuelle : ', Valeur:6:0); 8.3.11 Procédure Terminer Cette procédure détermine la condition pour terminer. Exemple 8.11 PROCEDURE Terminer; (* But : Condition pour terminer *) WRITELN ('Au revoir'); Drapeau:=FALSE; 8.3.12 Procedure Interet_Amortissement Enfin, dans cette procédure, on désire simplement que la procédure Interet_Amortissement exécute les procédures Entrer_Interet_Amortissement, Calcul_Interet et Calcul_Amortissement. Exemple 8.12 PROCEDURE Interet_Amortissement; Entrer_Interet_Amortissement; Calcul_Interet; Calcul_Amortissement; Terminer;
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 205 8.3.13 Programme principal Le programme principal fait exécuter l ensemble des instructions du programme. Exemple 8.13 (* Programme principal *) Premier:=NIL; Options; ASSIGNPRN(f); REWRITE(f); Drapeau:=TRUE; REPEAT WRITELN(' ' : 10, 'Entrez votre choix'); WRITELN(' ' : 10, 'Pesez sur une des touches suivantes : '); WRITELN(' ' : 10, '1, 2, 3, 4, 5, 6'); READLN(Choix); IF Choix <= 6 THEN CASE Choix OF 1 : Entrer_Fournisseurs; 2 : Visualiser; 3 : Supprimer_Nom; 4 : Interet_Amortissement; 5 : Options; 6 : Terminer; UNTIL Drapeau:=FALSE; SYSTEM.CLOSEFILE(f); END.
206 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI 8.4 LISTE DU PROGRAMME Program INTERAMORTIS; USES FORMS, printers; {$R *.RES} Type Pointeur = ^Fiche; Fiche = RECORD Nom : STRING[20]; Prenom : STRING[20]; No : STRING[20]; Rue : STRING[20]; Ville : STRING[20]; Province : STRING[20]; CodePostal :STRING[7]; Suivant : Pointeur; VAR Premier : Pointeur; Drapeau : BOOLEAN; Choix : INTEGER; f : text; NomI, PrenomI: STRING[20]; Total_Mois, Nmois, Nans, NansA, Y, N, X : INTEGER; Total, Interet12, Interet100, MRestant, Montant, MontantA, Interet, Montant_Plus, MInteret_Debut, MInteret, Montant_Deduit, Total_Interet, Payer_Mois, Amortissement, Valeur, Taux : CURRENCY;
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 207 PROCEDURE Entrer_Fournisseurs; (* But : Permet d entrer les données des enregistrements *) VAR P,Pt : Pointeur; Y : INTEGER; NEW(P); IF Premier=NIL THEN Premier:=P ELSE Pt:=Premier; WHILE Pt^.Suivant<>NIL DO Pt:=Pt^.Suivant; Pt^.Suivant:=P; N:=1; REPEAT (* Entrée des données *) WRITE('Entrez le prénom : '); READLN(P^.Prenom); WRITE('Entrez le nom : '); READLN(P^.Nom); WRITE('Entrez le numéro de porte et l''appartement : '); READLN(P^.No); WRITE('Entrez la rue : '); READLN(P^.Rue); WRITE('Entrez la ville : '); READLN(P^.Ville); WRITE('Entrez la province : '); READLN(P^.Province); WRITE('Entrez le code postal : '); READLN(P^.CodePostal); UNTIL P^.Nom<>' '; P^.Suivant:=NIL; {Fait pointer le dernier élément sur NIL}
208 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI PROCEDURE Visualiser; (* But : Permet de visualiser les enregistrements *) VAR Pt : Pointeur; Pt:=Premier; WHILE Pt<>NIL DO WRITELN(' Prénom : ', Pt^.Prenom:15, ' Nom : ', Pt^.Nom:15); WRITE(' Numéro de porte et l 'appartement: ', Pt^.No ); WRITELN(' ':3, Rue : ', Pt^.Rue); WRITE(' La ville : ', Pt^.Ville); WRITELN(' ':3, 'La province : ', Pt^.Province); WRITELN(' Le code postal : ', Pt^.CodePostal); Pt:=Pt^.Suivant; WRITELN('Fin de la liste'); PROCEDURE Supprimer(Nom:STRING); (* But : Supprime un enregistrement *) VAR Pt : Pointeur; IF Premier<>NIL THEN IF Premier^.Nom=Nom THEN Premier:=Premier^.Suivant ELSE Pt:=Premier; WHILE Pt^.Suivant<>NIL DO IF Pt^.Suivant^.Nom=Nom THEN Pt^.Suivant:=Pt^.Suivant^.Suivant; Pt:=Pt^.Suivant;
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 209 PROCEDURE Supprimer_Nom; (* But : Permet d'entrer le nom de l'élément qui va être supprimé *) VAR Nom : STRING[20]; Pt : Pointeur; WRITELN(' Entrez le nom à supprimer '); READLN(Nom); Supprimer(Nom); PROCEDURE Impression_Interet; (* But : Permet d'imprimer les résultats des calculs *) WRITELN(f, 'Prénom : ', PrenomI:20,' ':12, 'Nom : ', NomI:20); WRITELN(f, 'Le montant du prêt : ', Montant:10:2 ); WRITELN(f, 'Le taux d''intérêt annuel: ', Interet:4:3); WRITELN(f, 'Total des frais d''intérêt : ', MInteret:10:2); WRITELN(f, 'Total des frais de crédit : ', Total:9:2); WRITELN(f, 'Montant à payer par mois : ', Payer_Mois:9:2); WRITELN(f,' Durée du prêt : ', Nans); WRITELN(f,' Montant de l''amortissement : ', MontantA:10:2);
210 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI PROCEDURE Entrer_Interet_Amortissement; (* But : Entrée des données pour le calcul *) (* du prêt et de l'amortissement *) REPEAT WRITE('Entrez le prénom : '); READLN(PrenomI); WRITE('Entrez le nom : '); READLN(NomI); WRITE('Entrez le montant du prêt : '); READLN(Montant); WRITE('Entrez la durée des remboursements : '); READLN(Nans); WRITE('Entrez le taux d''intérêt : '); READLN(Interet); WRITE('Entrez le montant de l''amortissement : '); READLN(MontantA); WRITE('Entrez le nombre d années de l''amortissement : '); READLN(NansA); UNTIL NomI <> ' ';
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 211 PROCEDURE Calcul_Interet; (* But : Calculer les intérêts et le montant des remboursements *) (* Calcul des intérêts *) Interet100:=Interet/100; Nmois:=12*Nans; Interet12:=Interet100/12; Montant_Deduit:=Montant/Nmois; MRestant:=Montant; MInteret_Debut:=Montant*Interet12; FOR Y:=1 TO Nmois DO MInteret:=MInteret+(MRestant*Interet12); MRestant:=MRestant-Montant_Deduit; Total:=MInteret+Montant; Payer_Mois:=Total/Nmois; Impression_Interet; PROCEDURE Impression_Amortissement; (* But : Imprime les résultats de l amortissement *) VAR Y : INTEGER; WRITE(f, 'Fin de l''année : ', N:2, ' ':5); WRITE(f, 'Taux : ', Taux: 4:2 ); WRITE(f, ' ':5, ' Amortissement : ', Amortissement:5:0); WRITELN(f, ' ':5,' Valeur actuelle : ', Valeur:6:0);
212 INTRODUCTION À LA PROGRAMMATION EN PASCAL/DELPHI PROCEDURE Calcul_Amortissement; (* But : Calculer l amortissement *) X:=NansA; Taux:=2/X; Valeur:=MontantA; FOR N :=1 TO x DO Amortissement:=Taux*valeur; Valeur:=Valeur-amortissement; Impression_Amortissement; PROCEDURE Options; (* But : Afficher les options du menu à l écran *) WRITELN(' ': 10,' 1 : Entrer les données des fournisseurs'); WRITELN(' ': 10,' 2 : Visualiser les enregistrements'); WRITELN(' ': 10,' 3 : Supprimer un enregistrement'); WRITELN(' ': 10,' 4 : Calculer l''intérêt et l''amortissement'); WRITELN(' ': 10,' 5 : Retourner au menu'); WRITELN(' ': 10,' 6 : Quitter le programme'); PROCEDURE Terminer; (* But : Condition pour terminer *) WRITELN('Au revoir'); Drapeau:=FALSE;
APPLICATION : CALCUL DES COÛTS D ACQUISITION DE MATÉRIEL DE BUREAU 213 PROCEDURE Interet_Amortissement; Entrer_Interet_Amortissement; Calcul_Interet; Calcul_Amortissement; Terminer; (* Programme principal *) Premier:=NIL; Options; ASSIGNPRN(f); REWRITE(f); Drapeau:=TRUE; REPEAT WRITELN(' ' : 10, 'Entrez votre choix'); WRITELN(' ' : 10, 'Pesez sur une des touches suivantes : ' ); WRITELN(' ' : 10, '1, 2, 3, 4, 5, 6'); READLN(Choix); IF Choix<=6 THEN CASE Choix OF 1 : Entrer_Fournisseurs; 2 : Visualiser; 3 : Supprimer_Nom; 4 : Interet_Amortissement; 5 : Options; 6 : Terminer ; UNTIL Drapeau=FALSE; SYSTEM.CLOSEFILE(f); END.