TD1 : traduction en Visual BASIC des exemples du cours sur les structures de contrôle de l'exécution page 1 'TRADUCTION EN VBA DES EXEMPLES ALGORITHMIQUES SUR LES STRUCTURES 'DE CONTROLE DE L'EXECUTION (conditionnelles et repetitives) ' 'C. Monteil (mailto:monteil@ensat.fr) - INP/ENSAT (http://www.ensat.fr) Sub CalculAnnuite() 'ROLE Déterminer la valeur de chaque annuité de remboursement ' d'un emprunt à partir du montant de l'emprunt, du taux ' d'intérêt annuel et de la durée de l'emprunt. On affiche ' également le taux d'intérêt global équivalent. ' ' Info. saisies : Capital emprunté (Euros) ' Taux d'intérêt annuel (%) ' Durée de l'emprunt (années) ' ' Affichages : Annuité de remboursement (Euros) ' Taux d'intérêt global équivalent (%) ' 'TEST pour un capital de 10000 Euros sur 5 ans a 10% ' l'annuite vaut 2637.97 Euros et le taux global 0.319 (31,9%) Const TITRE As String = "Calcul d'annuité de remboursement d'un emprunt" Dim Annuite As Currency, Capital As Currency Dim TauxAnnuel As Double, TauxGLOBAL As Double Dim Duree As Integer 'Nombre d'années '1.saisie des données : Afficher "Capital emprunté (en Euros) : " Saisir Capital, 10000 Afficher "Durée de l'emprunt (en années) : " Saisir Duree, 5 Afficher "Taux d'intérêt annuel (en %) : " Saisir TauxAnnuel, 10 '2.calcul de l'annuité et du taux global TauxAnnuel = TauxAnnuel / 100 'normalisation : 100% = 1 Annuite = Capital * TauxAnnue1 / (1-1 / (1 + TauxAnnuel) ^ Duree) TauxGL0BAL = Duree * Annuite / Capital - 1 '3.affichage des résultats Afficher "Montant de chaque annuité : " & Format(Annuite, "0.00 ") Afficher "Taux d'intérêt global : " & Format(TauxGLOBAL, "0.0%") Sub Equation1erDegre() ' ROLE: tester la structure de contrôle Si...Alors...Sinon ' sur l'exemple de resolution d'une equation du 1er degre ' DONNEES : les 2 coefficients a et b de l'equation a*x+b = 0 ' RESULTAT: la racine de l'equation (si elle existe) Dim CoefA As Double, CoefB As Double, Racine As Double EffacerEcran "Equation du 1er degré a.x + b = 0" '1.saisie des données Afficher "Coefficient a :" : Saisir CoefA, 2 Afficher "Coefficient b :" : Saisir CoefB, -10 '2.resolution et affichage de la solution If CoefA = 0 Then If CoefB = 0 Then Afficher "Equation indeterminee!" Afficher "Equation impossible!" Racine = -CoefB / CoefA : Afficher "Racine = " & Racine Sub DivisionEuclidienne() ' ROLE: tester la structure de contrôle Do... Loop sur l'exemple ' de calcul du quotient et du reste d'une division euclidienne ' DONNEES : le dividende n et le diviseur d ' RESULTATS: le quotient q et le reste r Dim n As Integer, d As Integer 'dividende et diviseur Dim q As Integer, r As Integer 'quotient et reste EffacerEcran "Division euclidienne" '1.saisie des données Do 'saisie de n avec vérification n>=0 Afficher "Entrer un nombre n (entier >= 0)": Saisir n, 20 Loop Until n >= 0 Do 'saisie de d avec vérification d>0 Afficher "Entrer un diviseur d (entier > 0)": Saisir d, 7 Loop Until d > 0 '2.calcul du quotient q et du reste r q = 0: r = n Do While r >= d 'invariant: n = d.q + r q = q + 1 : r = r - d Afficher " Pas n " & q & " : " & n & " - " & q & " * " & d & " = " & r Loop '3.affichage du résultat Afficher "Division de " & N & " par " & d & ": quotient = " & q & ", reste = " & r
TD1 : traduction en Visual BASIC des exemples du cours sur les structures de contrôle de l'exécution page 2 Sub Equation2ndDegre() ' ROLE afficher les racines d'une équation du second degré ' de la forme: CoefA.x2 + CoefB.x + CoefC = 0 ' TEST DE LA STRUCTURE DE CONTROLE Select Case ' DONNEES : les 3 coefficients a, b et c de l'equation a*x^2 + b*x + c = 0 ' RESULTATS: la (ou les) racine(s) de l'equation (si elles existent) Const INDETERMINE = 1, IMPOSSIBLE = 2, AUCUNE_RACINE = 3, _ UNE_RAC_SIMPLE = 4, UNE_RAC_DOUBLE = 5, DEUX_RACINES = 6 Dim CoefA As Double, CoefB As Double, CoefC As Double 'coefficients Dim Racine1 As Double, Racine2 As Double 'racines Dim Determinant As Double Dim CodeCas As Single 'code du cas correspondant : cf. constantes EffacerEcran "Résolution d'une équation du 2nd degré" '1.saisie des données Afficher "Coefficient a : " Saisir CoefA, 1 Afficher "Coefficient b : " Saisir CoefB, -1 Afficher "Coefficient c : " Saisir CoefC, -1 '2.résolution If CoefA = 0 Then 'équation du 1er degré If CoefB = 0 Then If CoefC = 0 Then CodeCas = INDETERMINE CodeCas = IMPOSSIBLE Racine1 = -CoefC / CoefB: CodeCas = UNE_RAC_SIMPLE 'équation du 2nd degré Determinant = CoefB ^ 2-4 * CoefA * CoefC If Determinant > 0 Then Racine1 = (-CoefB - Sqr(Determinant)) / (2 * CoefA) Racine2 = (-CoefB + Sqr(Determinant)) / (2 * CoefA) CodeCas = DEUX_RACINES If Determinant = 0 Then Racine1 = -CoefB / (2 * CoefA) CodeCas = UNE_RAC_DOUBLE CodeCas = AUCUNE_RACINE '3.affichage des solutions Select Case CodeCas Case INDETERMINE Caractères Espace et Souligné pour signifier le prolongement d'une même instruction sur 2 lignes différentes Forme abrégée du If (puisque Then est suivi d'une instruction sur la même ligne) : absent et implicite en fin de ligne Afficher "Equation indéterminée" Case IMPOSSIBLE Afficher "Equation impossible" Case AUCUNE_RACINE Afficher "Pas de racines réelles" Afficher "pas de chance!" Case UNE_RAC_SIMPLE Afficher "Une seule racine " & Racine1 Case UNE_RAC_DOUBLE Afficher "Une racine double" & Racine1 Case DEUX_RACINES Afficher "Deux racines " & Racine1 & " et " & Racine2 Case Afficher "Cas non prevu!!!" End Select Sub CalculMoyenne() ' ROLE: saisir plusieurs notes et afficher leur moyenne ' TEST DE LA STRUCTURE DE CONTROLE Pour ' DONNEES : le nombre de notes a saisir, et chaque note ' RESULTAT: la moyenne des notes saisies Dim NbNotes As Integer 'nombre de notes Dim Total As Integer 'total des notes saisie jusqu'alors Dim Note As Integer 'derniere note saisie Dim Numero As Integer 'numéro de la note à saisir EffacerEcran "Calcul de la moyenne de plusieurs notes" '1.saisie du nombre de notes Afficher "Indiquer le nombre de notes a saisir : " Saisir NbNotes, 4 If NbNotes <= 0 Then Afficher "Nombre de notes (" & NbNotes & ") non valide!" '2.boucle de saisie des notes avec cumul du total Total = 0 For Numero = 1 To NbNotes ' saisir une note et cumuler Afficher "Note " & Numero & "? " Saisir Note, 10 + Numero Total = Total + Note Next Numero '3.affichage du resultat Afficher "La moyenne des " & NbNotes & " notes vaut " & Total / NbNotes
TD2 : algorithmes sur les structures de contrôle de l'exécution page 1 Titre (énoncé implicite) Rôle (énoncé explicite) Particularités somme des nombres de 1 à n Donnée : un nombre entier n >= 1 Résultat : un nombre Somme = 1 + 2 +... + n On affichera pour vérification le nombre : n * (n+1) / 2 Exemple : n = 5 => S = 1 + 2 + 3 + 4 + 5 = 15 boucle simple avec cumul puissance entière d'un nombre quelconque Données : un nombre x (réel non nul), une puissance n (entier positif ou nul) Résultat : un nombre y = x n (rappel : la puissance 0 d'un nombre quelconque non nul vaut 1, et non 0) Méthode : y est calculé sans utiliser l'exponentiation directe, mais par un produit de n facteurs : y = x * x * * x Exemples : 2 3 = 8, 2 0 = 1 test de nombre premier Donnée : un nombre entier n > 1 Résultat : indiquer s'il est premier, sinon Afficher son 1 er diviseur Exemple : 15 n'est pas premier (1 er diviseur = 3) affichage de nombres parfaits tableau de remboursement d'un emprunt Nombre parfait = nombre égal à la somme de ses diviseurs (lui-même étant exclu) Donnée : un nombre entier n > 1 Résultat : indiquer s'il est parfait ou non, et Afficher la liste de ses diviseurs et leur somme Exemple : 6 est parfait (liste de ses diviseurs 1+2+3 = 6) (autres nombres < 10000 : 28 = 1+2+4+7+14 ; 496 = 1+2+4+8+16+31+62+124+248 ; 8128=1+2+4+8+16+32+64+127+254+508+1016+2032+4064) Données : capital emprunté ( ), taux d'intérêt annuel (%), durée emprunt (années) Résultats : - annuité de remboursement ( ), intérêts totaux ( ) et taux d'intérêt global (%) - pour chaque année : montant des intérêts de l'année, de la part de capital remboursée, et du capital restant à rembourser - Afficher ensuite pour vérification le cumul des intérêts annuels, des parts en capital annuelles, et le rapport (en pourcentage) entre ces 2 grandeurs Exemple : emprunt de 10 000 à 10% pendant 3 ans => annuité = 4 021.15, intérêts totaux = 2 063.44, taux global = 20.6% Année Part intérêt Part capital Capital restant du 1 1 000.00 3 021.15 6 978.85 2 697.89 3 323.26 3 655.59 3 365.56 3 655.59 0.00 Total 2 063.44 10 000.00 (rapport : 20.6%) boucle simple avec cumul multiplicatif boucle de recherche à double condition d'arrêt boucle avec cumul partiel boucle avec plusieurs variables interdépendantes et plusieurs cumuls
Programme CalculerSommeNombres Rôle : calcule la somme des n premiers nombres entiers (n = nombre à saisir) Saisie : un nombre entier n >= 1 Affichage : un nombre Somme = 1 + 2 +... + n On affichera pour vérification le nombre : n * (n+1) / 2 _Exemple: n = 5 => Somme = 1 + 2 + 3 + 4 + 5 = 15 Var n, Somme, i : entier TD2 : algorithmes sur les structures de contrôle de l'exécution page 2 Programme TesterNombrePremier Rôle : indique si un nombre saisi au clavier est premier Saisie : un nombre entier n > 1 Affichage : indique s'il est premier, sinon affiche son 1er diviseur _Exemple : 15 n'est pas premier (1er diviseur = 3) Var n, d : entier _ ExisteDiviseur : booléen {vrai si on trouve un diviseur} {1.saisie de la donnée} Afficher ("Entrer un nombre strictement positif"); Saisir (n) {2.calcul de la somme} Somme 0 Pour i de 1 à n Répéter {Somme = somme des nombres de 1 à i} _Somme Somme + i {3.affichage du résultat} Afficher ("La somme des ", n, " premiers nombres entiers vaut ", Somme) Afficher ("Vérification : ", n, "*(", n, "+1)/2 = ", n * (n + 1) / 2) Programme CalculerPuissanceEntiere Rôle : élever un nombre réel (saisi au clavier) à une puissance entière (saisie au clavier) (rappel : la puissance 0 d'un nombre quelconque non nul vaut 1, et non 0) Saisie : un nombre x (réel non nul), un exposant n (entier positif ou nul) Affichage : un nombre y = x puissance n Exemples : 2 puissance 3 = 8, 2 puissance 0 = 1 _NOTA : on n'utilise pas l'opérateur d'exponentiation, mais une boucle multiplicative Var x, y : réel; _ n, i : entier {1.saisie des données} Afficher ("Entrer un nombre réel non nul"); Saisir (x) Afficher ("Entrer un nombre entier positif (exposant)"); Saisir (n) {2.calcul de la puissance} y 1 Pour i de 1 à n répéter {y = x puissance i} _y y * x {3.affichage du résultat} Afficher (x, " puissance ", n, " vaut ", y) {1.saisie de la donnée} Afficher ("Entrer un nombre supérieur à 1"); Saisir (n) {2.boucle de recherche du 1er diviseur autre que 1 et le nombre} d 2 ; ExisteDiviseur FAUX {a priori, pas de diviseur} Tant que (d < n) et Non ExisteDiviseur Répéter {teste si d divise n} _ Si n Mod d = 0 Alors ExisteDiviseur VRAI Sinon d d + 1 {3.affichage du résultat} Si ExisteDiviseur Alors Afficher (n, " n'est pas premier (premier diviseur : ", d, ")") Sinon _ Afficher (n, " est premier") Programme TesterNombreParfait Rôle : indique si un nombre saisi au clavier est parfait : un nombre est dit "parfait" s'il est égal à la somme de ses diviseurs (lui-même étant exclu) Saisie : un nombre entier n > 1 Affichage : indiquer s'il est parfait ou non, et afficher la liste et la somme de ses diviseurs _Exemple : 28 est parfait (diviseurs : 1 + 2 + 4 + 7 + 14 = 28) Var n, d, SommeDiviseurs : entier _ ChaineDiviseurs : chaîne {liste des diviseurs trouvés} {1.saisie de la donnée} Afficher ("Entrer un nombre supérieur à 1"); Saisir (n) {2.boucle de cumul des diviseurs} SommeDiviseurs 1; ChaineDiviseurs "1" {1 est forcement un diviseur} Pour d de 2 à n - 1 répéter {teste si d divise n ; si oui, l'ajoute à SommeDiviseurs} Si n Mod d = 0 Alors SommeDiviseurs SommeDiviseurs + d ChaineDiviseurs ChaineDiviseurs & "+" & d {3.affichage du résultat} Si SommeDiviseurs <> n Alors Afficher (n, " n'est pas parfait ") Sinon _ Afficher (n, " est parfait ") Afficher ("Somme de ses diviseurs : ", ChaineDiviseurs, " = ", SommeDiviseurs)
Programme CalculerRemboursementEmprunt Rôle : Déterminer la valeur de chaque annuité de remboursement d'un emprunt à partir du montant de l'emprunt ( ), du taux d'intérêt annuel (%) et de la durée de l'emprunt (années). On affiche également le tableau de remboursement en indiquant pour chaque année la part d'intérêts remboursée, la part de capital remboursée, et le capital restant a rembourser TEST : emprunt de 10 000 à 10% pendant 3 ans => annuité = 4 021.15, intérêts totaux = 2 063.44, taux global = 20.6% Année Part intérêt Part capital Capital restant du 1 1 000.00 3 021.15 6 978.85 2 697.89 3 323.26 3 655.59 3 365.56 3 655.59 0.00 _ Total 2 063.44 10 000.00 (rapport : 20.6%) Var Annuite, Capital, FraisTotaux, TauxAnnuel, TauxGLOBAL : réel Duree {Nombre d'années}, An {année courante lors du parcours du tableau} : entier _ PartInteret, PartCapital, CapitalRestant, CumulInteret, CumulCapital : réel {1.saisie des données} Afficher ("Capital emprunté (en Euros) : ") ; Saisir (Capital) Afficher ("Durée de l'emprunt (en années) : ") ; Saisir (Duree) Afficher ("Taux d'intérêt annuel (en %) : ") ; Saisir (TauxAnnuel) {2.calcul et affichage de l'annuité et des frais totaux} TauxAnnuel TauxAnnuel / 100 {normalisation : 100% = 1} Annuite Capital * TauxAnnuel / (1-1 / (1 + TauxAnnuel) ^ Duree) FraisTotaux Duree * Annuite - Capital TauxGLOBAL FraisTotaux / Capital Afficher ("Montant de chaque annuité : ", Annuite) Afficher ("Frais totaux : ", FraisTotaux) Afficher ( "Taux d'intérêt global : ", TauxGLOBAL) {3.calcul et affichage du tableau de remboursement} Afficher ("Année", "Part intérêt", "Part capital", "Capital restant du") CumulInteret 0: CumulCapital 0: CapitalRestant Capital Pour An de 1 à Duree Répéter {calcule et affiche les résultats à la fin de l'année An} PartInteret CapitalRestant * TauxAnnuel CumulInteret CumulInteret + PartInteret PartCapital Annuite - PartInteret CumulCapital CumulCapital + PartCapital CapitalRestant CapitalRestant - PartCapital _ Afficher (An, PartInteret, PartCapital, CapitalRestant) Afficher ("Cumul des intérêts : ", CumulInteret) Afficher ("Cumul du capital : ", CumulCapital) Afficher ("Rapport Intérêts/Capital : ", CumulInteret / CumulCapital) TD2 : algorithmes sur les structures de contrôle de l'exécution page 3
TD3 : traduction en Visual BASIC des algorithmes du TD2 sur les structures de contrôle de l'exécution page 1 Sub CalculerSommeNombres() 'ROLE : calcule la somme des n premiers nombres entiers (n = nombre à saisir) 'Info à saisir : un nombre entier n >= 1 'Affichages : un nombre Somme = 1 + 2 +... + n ' pour vérification le nombre : n * (n+1) / 2 'Exemple: n = 5 => s = 1 + 2 + 3 + 4 + 5 = 15 Const TITRE As String = "Somme des n premiers nombres entiers" Dim n As Integer, Somme As Integer, i As Integer '1.saisie de la donnee Afficher "Entrer un nombre strictement positif" Saisir n, 5 '2.calcul de la somme Somme = 0 For i = 1 To n 'Somme = somme des nombres de 1 à i} Somme = Somme + i Next i '3.affichage du resultat Afficher "La somme des " & n & " premiers nombres entiers vaut " & Somme Afficher "Vérification : " & n & "*(" & n & "+1)/2 = " & n * (n + 1) / 2 Sub CalculerPuissanceEntiere() 'ROLE : élever un nombre reel (saisi au clavier) à une puissance entiere (saisie au clavier) ' (rappel : la puissance 0 d'un nombre quelconque non nul vaut 1, et non 0) 'Infos à saisir : un nombre x (réel non nul), une puissance n (entier positif ou nul) 'Affichage : un nombre y = x puissance n 'Exemples : 2 puissance 3 = 8, 2 puissance 0 = 1 'NOTA : on n'utilise pas l'operateur d'exponentiation, mais une boucle multiplicative Const TITRE As String = "Puissance entière d'un nombre réel" Dim x As Double, n As Integer, Puissance As Double, i As Integer '1.saisie des donnees Afficher "Entrer un nombre réel non nul": Saisir x, 2 Afficher "Entrer un nombre entier (exposant)": Saisir n, 10 '2.calcul de la puissance Puissance = 1 For i = 1 To n 'Puissance = x puissance i} Puissance = Puissance * x Next i '3.affichage du resultat Afficher x & " puissance " & n & " vaut " & Puissance Sub TesterNombrePremier() 'ROLE : indique si un nombre saisi au clavier est premier 'Info à saisir: un nombre entier n > 1 'Affichage : indique s'il est premier, sinon affiche son 1er diviseur 'Exemple : 15 n'est pas premier (1er diviseur = 3) Const TITRE As String = "Test de nombre premier" Dim n As Integer, d As Integer, ExisteDiviseur As Boolean 'vrai si on trouve un diviseur '1.saisie de la donnee Afficher "Entrer un nombre supérieur à 1": Saisir n, 15 '2.boucle de recherche du 1er diviseur autre que 1 et le nombre d = 2: ExisteDiviseur = False ' a priori, pas de diviseur Do While (d < n) And Not ExisteDiviseur 'teste si d divise n If n Mod d = 0 Then ExisteDiviseur = True d = d + 1 Loop '3.affichage du resultat If ExisteDiviseur Then Afficher n & " n'est pas premier (premier diviseur : " & d & ")" Afficher n & " est premier" Sub TesterNombreParfait() 'ROLE : indique si un nombre saisi au clavier est parfait : un nombre est dit ' "parfait" s'il est égal à la somme de ses diviseurs (lui-même étant exclu) 'Info à saisir: un nombre entier n > 1 'Affichage : indiquer s'il est parfait ou non, et afficher la somme de ses diviseurs 'Exemple : 28 est parfait (diviseurs 1 + 2 + 4 + 7 + 14 = 28) Const TITRE As String = "Test de nombre parfait" Dim n As Integer, d As Integer, SommeDiviseurs As Integer Dim ChaineDiviseurs As String 'liste des diviseurs trouvés '1.saisie de la donnee Afficher "Entrer un nombre superieur à 1": Saisir n, 28 '2.boucle de cumul des diviseurs SommeDiviseurs = 1: ChaineDiviseurs = "1" '1 est forcement un diviseur For d = 2 To n - 1 'teste si d divise n ; si oui, l'ajoute a SommeDiviseurs If n Mod d = 0 Then SommeDiviseurs = SommeDiviseurs + d ChaineDiviseurs = ChaineDiviseurs & "+" & d Next d '3.affichage du resultat If SommeDiviseurs <> n Then Afficher n & " n'est pas parfait " Afficher n & " est parfait " Afficher "Somme de ses diviseurs : " & ChaineDiviseurs & " = " & SommeDiviseurs
Sub CalculerRemboursementEmprunt() 'ROLE : Déterminer la valeur de chaque annuité de remboursement ' d'un emprunt à partir du montant de l'emprunt (Euros), du taux ' d'intérêt annuel (%) et de la durée de l'emprunt (annees). ' On affiche également le tableau de remboursement en indiquant ' pour chaque année la part d'interets remboursee, la part de ' capital remboursee, et le capital restant a rembourser 'TEST : emprunt de 10 à 10% pendant 3 ans ' => annuité = 4 021.15, intérêts totaux = 2 063.44, taux global = 20.6% 'Année Part intérêt Part capital Capital restant du '1 1 000.00 3 021.15 6 978.85 '2 697.89 3 323.26 3 655.59 '3 365.56 3 655.59 0.00 'Total 2 063.44 10.00 (rapport : 20.6%) Const TITRE As String = "Remboursement d'un emprunt" Dim Annuite As Currency, Capital As Currency, FraisTotaux As Currency Dim TauxAnnuel As Double, TauxGLOBAL As Double, Duree As Integer 'Nombre d'années Dim PartInteret As Currency, PartCapital As Currency, CapitalRestant As Currency Dim An As Integer 'annee courante Dim Message As String 'message multi-lignes a afficher apres la boucle de calcul Dim CumulInteret As Currency, CumulCapital As Currency '1.saisie des données : Afficher "Capital emprunté (en Euros) : " : Saisir Capital, 10000 Afficher "Durée de l'emprunt (en années) : " : Saisir Duree, 3 Afficher "Taux d'intérêt annuel (en %) : " : Saisir TauxAnnuel, 10 '2.calcul et affichage de l'annuité et des frais totaux TauxAnnuel = TauxAnnuel / 100 'normalisation : 100% = 1 Annuite = Capital * TauxAnnuel / (1-1 / (1 + TauxAnnuel) ^ Duree) FraisTotaux = Duree * Annuite - Capital TauxGLOBAL = FraisTotaux / Capital Afficher "Montant de chaque annuité : " & Format(Annuite, "# ##0.00 ") Afficher "Frais totaux : " & Format(FraisTotaux, "# ##0.00 ") Afficher "Taux d'intérêt global : " & Format(TauxGLOBAL, "0.0%") '3.calcul et affichage du tableau de remboursement Afficher "Année", "Part intérêt", "Part capital", "Capital restant du" CumulInteret = 0: CumulCapital = 0: CapitalRestant = Capital For An =1 To Duree 'calcule les resultats a la fin de l'annee An PartInteret = CapitalRestant * TauxAnnuel : CumulInteret = CumulInteret + PartInteret PartCapital = Annuite - PartInteret : CumulCapital = CumulCapital + PartCapital CapitalRestant = CapitalRestant - PartCapital Afficher An, Format(PartInteret, "# ##0.00 "), _ Format(PartCapital, "# ##0.00 "), Format(CapitalRestant, "# ##0.00 ") Next An Afficher "TOTAUX : ", Format(CumulInteret, "# ##0.00 "), Format(CumulCapital, "# ##0.00 ") Afficher "Rapport Intérêts/Capital : " & Format(CumulInteret / CumulCapital, "0.0%") TD3 : traduction en Visual BASIC des algorithmes du TD2 sur les structures de contrôle de l'exécution page 2
TD4 - Procédures et fonctions Titre Description Particularités Corrigé du TD2 distribution du corrigé du TD2 (TD2.DOC) (4 pages) (uniquement algo, pas VBA) procédure Echanger (pdx, pdy) programme Tester_Procedure_Echanger procédure CalculerSommeDiviseurs programme ChercherNombresParfaits fonction SommeDiviseurs programme ChercherNombresPremiers programme ChercherNbAmis Saisir (pdvariable, pdvaleurpardefaut) en s'inspirant du programme TesterNombreParfait du TD2, définir un programme ChercherNombresParfaits recherchant les nombres parfaits inférieurs à une limite fixée (par ex. 30) et utilisant une procédure CalculerSommeDiviseurs (pdnombre, pdsomme, pddiviseurs ) où pddiviseurs = chaîne des diviseurs "1+2 + " définir une fonction SommeDiviseurs (pdnb) : entier renvoyant la somme des diviseurs seule (sans la liste) et appelant la procédure précédente CalculerSommeDiviseurs ; tester cette fonction en définissant un programme ChercherNombresPremiers affichant la liste des nombres 1 ers inférieurs à une borne fixée définir un programme ChercherNbAmis recherchant les nombres amis inférieurs ou égaux à une borne à saisir au clavier : 2 nombres sont amis si la somme des diviseurs de l'un est égal à l'autre nombre, et réciproquement Mode de passage des paramètres? (la procédure équivaut à : pdvariable pdvaleurpardefaut, ou bien : pdvariable Valeur tapée par l'utilisateur) Paramètres en mise à jour - permutation de 2 variable Procédure avec 2 sorties Fonction appelant une procédure 2 appels d'une même fonction Carte fonctionnelle des appels de procédures / fonctions : Proc. ChercherNombresParfaits Proc. ChercherNombresPremiers Proc. ChercherNbAmis Fonc. SommeDiviseurs Proc. CalculerSommeDiviseurs Traduction en Visual BASIC : cf. TD5.doc et TD5b.xls
TD4 - Procédures et fonctions Procédure Echanger (pdx, pdy) ROLE : échanger le contenu des paramètres pdx et pdy M.A J. pdx, pdy : réel Var z : réel _z pdx ; pdx pdy ; pdy z Programme Tester_Procedure_Echanger ROLE : tester le fonctionnement de la procedure Echanger Var variable1, variable2 : réel variable1 1 ; variable2 2 Afficher ("Avant appel : variable 1 = ", variable1, ", variable 2 = ", variable2) Echanger (variable1, variable2) _Afficher ("Après appel : variable 1 = ", variable1, ", variable 2 = ", variable2) Procédure CalculerSommeDiviseurs (pdnombre, pdsomme, pdliste) ROLE : calculer la somme des diviseurs d'un nombre (lui-meme exclu) _ ainsi que la liste des diviseurs trouves sous la forme "1+2+..." ENTREE pdnombre : entier {nombre a traiter} SORTIE pdsomme : entier {somme des diviseurs de pdnombre (pdnombre exclu)} _ pdliste : chaine {contenant la liste sous forme d'addition} Var d : entier pdsomme 1 ; pdliste "1" {1 est forcement un diviseur} Pour d de 2 à pdnombre - 1 répéter {teste si d divise pdnombre ; si oui, l'ajoute} Si pdnombre Mod d = 0 Alors _ pdsomme pdsomme + d ; pdliste pdliste & "+" & d Programme ChercherNombresParfaits ROLE : afficher les nombres parfaits inférieurs a une borne saisie au clavier Var nmax, n, SommeDiviseurs : entier ; ChaineDiviseurs : chaîne {liste des diviseurs trouvés} {1.saisir la borne de recherche} Afficher ("Entrer une borne de recherche (>1) ") ; Saisir (nmax) {2.boucle de calcul et affichage des nombres parfaits inférieurs à nmax} Pour n de 2 à nmax répéter {tester si n est parfait} {2.1.calculer la somme de ses diviseurs} CalculerSommeDiviseurs (n, SommeDiviseurs, ChaineDiviseurs) {2.2.afficher le resultat} Si SommeDiviseurs = n Alors _Afficher ( n, " est parfait (", ChaineDiviseurs, " = ", SommeDiviseurs, ")" ) Fonction SommeDiviseurs(pdNb) : entier ROLE : renvoyer la somme des diviseurs d'un nombre (lui-meme exclu) ENTREE pdnb : entier {nombre a traiter} {Nota : cette fonction appelle la procédure CalculerSommeDiviseurs} Var SommeDiv : entier ; ListeDiv : chaîne CalculerSommeDiviseurs (pdnb, SommeDiv, ListeDiv) _ SommeDiviseurs SommeDiv Programme ChercherNombresPremiers ROLE : afficher les nombres premiers inférieurs à une borne saisie au clavier Var nmax, n : entier {1.saisir la borne de recherche} Afficher ( "Saisir une borne de recherche (>1) :" ) ; Saisir ( nmax) {2.boucle de calcul et affichage des nombres premiers inférieurs à nmax} Pour n de 2 à nmax répéter {tester si n est premier} Si SommeDiviseurs(n) = 1 Alors _Afficher (n, " est premier") Programme ChercherNombresAmis ROLE: Afficher les couples de nombres amis inferieurs a une limite choisie ; 2 nombres N et P sont amis si la somme des diviseurs de N est egale a P et si la somme des diviseurs de P est egale a N _ EXEMPLE : 220 et 284 sont amis Var BorneMaxi : entier {borne maximale de recherche} _ n, SommeN, p : entier {variables locales auxiliaires} {1.saisir la borne de recherche} Afficher ( "entrez la borne de recherche (>1): " ) ; Saisir (BorneMaxi) {2.boucle de calcul et affichage des couples de nombres amis inférieurs à Bornemaxi} Pour n de 2 à BorneMaxi répéter {tester si n peut etre ami avec un autre nombre} {2.1.calculer la somme des diviseurs de n} SommeN SommeDiviseurs(n) {2.2.filtrer les sommes inférieures au nombre n} Si SommeN < n Alors {2.3.calculer la somme des diviseurs de SommeN=p} p SommeN {seul candidat possible} Si SommeDiviseurs(p) = n Alors Afficher (n, " est ami avec ", p) Institut National Polytechnique de Toulouse Claude MONTEIL Ecole Nationale Supérieure Agronomique de Toulouse
Sub Echanger(ByRef pdx As Double, ByRef pdy As Double) 'ROLE : echanger le contenu des 2 paramètres spécifiés 'M.A J.pd x,pd y Dim z As Double z = pdx: pdx = pdy: pdy = z Sub Tester_Procedure_Echanger() 'ROLE : tester le fonctionnement de la procedure Echanger Dim variable1 As Double, variable2 As Double variable1 = 1: variable2 = 2 Afficher "Avant appel : variable 1 = " & variable1 & ", variable 2 = " & variable2 Echanger variable1, variable2 Afficher "Après appel : variable 1 = " & variable1 & ", variable 2 = " & variable2 Sub CalculerSommeDiviseurs(ByVal pdnombre As Integer, _ ByRef pdsomme As Integer, ByRef pdlistediviseurs As String) 'ROLE : calculer la somme des diviseurs d'un nombre (lui-meme exclu) ' ainsi que la liste des diviseurs trouves sous la forme "1+2+..." 'ENTREE pdnombre : nombre a traiter 'SORTIE pdsomme : somme des diviseurs de n (n exclu) ' pdlistediviseurs : chaine contenant la liste des diviseurs sous forme d'addition Dim d As Integer pdsomme = 1: pdlistediviseurs = "1" '1 est forcement un diviseur For d = 2 To pdnombre - 1 'teste si d divise Nombre ; si oui, l'ajoute If pdnombre Mod d = 0 Then pdsomme = pdsomme + d : pdlistediviseurs = pdlistediviseurs & "+" & d Next d Sub ChercherNombresParfaits() 'ROLE : afficher les nombres parfaits inférieurs a une borne saisie au clavier 'EXEMPLES : 6, 28, 496 et 8128 sont les nombres parfaits inférieurs à 10000 Dim nmax As Integer, n As Integer, SommeDiviseurs As Integer Dim ChaineDiviseurs As String 'liste des diviseurs trouvés EffacerEcran "Nombres parfaits" '1.saisir la borne de recherche Afficher "Entrer une borne de recherche (>1) ": Saisir nmax, 500 '2.boucle de calcul et affichage des nombres parfaits inférieurs à nmax For n = 2 To nmax 'tester si n est parfait '2.1.calculer la somme de ses diviseurs CalculerSommeDiviseurs n, SommeDiviseurs, ChaineDiviseurs '2.2.afficher le resultat If SommeDiviseurs = n Then Afficher n & " est parfait (" & ChaineDiviseurs & " = " & SommeDiviseurs & ")" Next n TD5 : traduction en Visual BASIC des algorithmes du TD4 sur les procédures et fonctions page 1 Function SommeDiviseurs(ByVal pdnb As Integer) As Integer 'ROLE : renvoyer la somme des diviseurs d'un nombre (lui-meme exclu) 'ENTREE pdnb : nombre a traiter 'NOTA : cette fonction appelle la procédure CalculerSommeDiviseurs Dim SommeDiv As Integer, ListeDiv As String CalculerSommeDiviseurs pdnb, SommeDiv, ListeDiv SommeDiviseurs = SommeDiv End Function Sub ChercherNombresPremiers() 'ROLE : afficher les nombres premiers inférieurs à une borne saisie au clavier Dim nmax As Integer, n As Integer EffacerEcran "Nombres premiers" '1.saisir la borne de recherche Afficher "Saisir une borne de recherche (>1) :" Saisir nmax, 50 '2. boucle de calcul et affichage des nombres premiers inférieurs à nmax For n = 2 To nmax 'tester si n est premier If SommeDiviseurs(n) = 1 Then Afficher n & " est premier" Next n Sub ChercherNombresAmis() 'ROLE: Afficher les couples de nombres amis inferieurs a une limite saisie au clavier ' 2 nombres N et P sont amis si la somme des diviseurs de N est egale a P ' et si la somme des diviseurs de P est egale a N 'EXEMPLES : (220,284), (1184,1210), (2620,2924), (5020,5564) (couples < 10000) Dim BorneMaxi As Integer 'borne maximale de recherche Dim n As Integer, SommeN As Integer Dim p As Integer, SommeP As Integer EffacerEcran "Nombres Amis" '1.saisir la borne de recherche Afficher "entrez la borne de recherche (>1): " Saisir BorneMaxi, 300 '2.boucle de calcul et affichage des couples de nombres amis inférieurs à BorneMaxi For n = 2 To BorneMaxi 'tester si n peut etre ami avec un autre nombre '2.1.calculer la somme des diviseurs de n SommeN = SommeDiviseurs(n) '2.2.filtrer les sommes supérieures au nombre n If SommeN > n Then '2.3.calculer la somme des diviseurs de SommeN p = SommeN 'seul candidat possible If SommeDiviseurs(p) = n Then Afficher n & " est ami avec " & p Next n Institut National Polytechnique de Toulouse Claude MONTEIL Ecole Nationale Supérieure Agronomique de Toulouse