C++ TP - Schéma itératif [it] Exercices de cours Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner Unisciel algoprog Version 17 avril 2015 Table des matières 1 Appréhender le cours 2 1.1 Le nombre de poissons / pg-itnpoissons1.................. 2 1.2 Somme des cubes / pg-itscubes1....................... 3 1.3 Calcul par récurrence d un minimum / pg-itvmin1............. 4 1.4 Comptage d entiers / pg-itcomptage1.................... 5 2 Appliquer le cours 6 2.1 Fonction puissance / puissancea1...................... 6 2.2 PREVU pour produit de deux entiers.................... 6 2.3 Procédure quorest / quoresta1....................... 7 2.4 Fonctions gerase / gerasea1......................... 8 3 Approfondir le cours 9 3.1 Fonction euclide / euclidea1......................... 9 3.2 Fonction arithgeo / arithgeoa1....................... 10 3.3 Fonction arcsinapprox / pg-itarcsina1................... 11 1
Unisciel algoprog it00aexerc-texte, April 17, 2015 2 1 Appréhender le cours Cette section n utilise pas le module @[Algorithmes paramétrés]. 1.1 Le nombre de poissons / pg-itnpoissons1 Un poissonnier sert un client qui a demandé x Kg de poisson. Il pèse successivement différents poissons et s arrête dès que le poids total égale ou dépasse x Kg. Cet exercice donne le nombre de poissons servis. Exemple d exécution. Poids voulu (en gr)? 1000 Poids du poisson? 350 ==> 1 poisson(s) pour un poids total de 350 gr Poids du poisson? 280 ==> 2 poisson(s) pour un poids total de 630 gr Poids du poisson? 375 ==> 3 poisson(s) pour un poids total de 1005 gr En vous basant sur l exemple d exécution, comment faut-il procéder? Écrivez un programme qui demande et saisit le poids voulu de poissons dans poidsvoulu (réel). Affichez l invite : Poids voulu (en gr)? Déclarez puis initialisez à zéro les variables poidstotal (poids total, réel) et npoissons (nombre de poissons, entier). Demandez successivement le poids du poisson dans poidspoisson (réel), actualisez vos variables et affichez l état actuel jusqu à ce que le poidstotal égale ou dépasse le poidsvoulu (où [x] désigne le contenu de x) : ==> [npoissons] poisson(s) pour un poids total de [poidstotal] Testez.
Unisciel algoprog it00aexerc-texte, April 17, 2015 3 1.2 Somme des cubes / pg-itscubes1 Écrivez un programme qui demande et saisit le nombre d entiers dans n (entier). Affichez l invite : Somme des cubes jusqu a? Calculez la somme des cubes de 1 à n dans rs (entier) : n j 3 j=0 Affichez le résultat. Somme des cubes jusqu à? 9 ==> 2025
Unisciel algoprog it00aexerc-texte, April 17, 2015 4 1.3 Calcul par récurrence d un minimum / pg-itvmin1 Écrivez un programme qui demande et saisit le nombre d entiers dans n. Affichez l invite : n? Comment trouver le minimum de n entiers donnés au fur et à mesure? Donnez une définition par récurrence du minimum. Comment initialiser la suite? Complétez votre programme de sorte à calculer le minimum des n entiers donnés au fur et à mesure dans vmin (entier). Affichez (où [x] désigne le contenu de x) : ==> Le minimum est [vmin] n? 5 9 4 12-6 3 ==> Le minimum est -6
Unisciel algoprog it00aexerc-texte, April 17, 2015 5 1.4 Comptage d entiers / pg-itcomptage1 Cet exercice demande une série d entiers puis compte le nombre de valeurs positives et de valeurs négatives. Définissez la constante sentinelle de valeur 0. Écrivez un programme qui demande et saisit une série d entiers dans nombre jusqu à ce que l utilisateur introduit la valeur sentinelle. Testez. Déclarez et initialisez les compteurs du nombre de valeurs positives npos (entier) et celui des valeurs négatives nneg (entier). Complétez la structure TantQue afin d actualiser le compteur concerné selon le signe de nombre. Aide simple Notez que le test «Si nombre = sentinelle» n est jamais réalisé dans la boucle puisque c est la condition d arrêt du TantQue. Affichez (où [x] désigne le contenu de x) : Le nombre de valeurs positives est [npos] Le nombre de valeurs negatives est [nneg] Entrez une serie d entiers (Finir par 0) 5 3 8-5 2-2 0 Le nombre de valeurs positives est 4 Le nombre de valeurs negatives est 2
Unisciel algoprog it00aexerc-texte, April 17, 2015 6 2 Appliquer le cours 2.1 Fonction puissance / puissancea1 Les relations suivantes définissent la puissance n-ème d un réel x : 0 pour n = 0 x n = x n 1 x pour n 1 1/x n pour n < 0 Écrivez une fonction puissance(x,n) qui calcule et renvoie x n avec x réel et n entier. Outil C++ La fonction valeur-absolue abs(x) est définie dans la bibliothèque <cstdlib>. Écrivez un programme qui demande un réel dans x et un entier dans n puis calcule et affiche x n et x n. Votre réel et votre entier? 3 4 ==> 3^4 vaut 81 ==> 3^(-4) vaut 0.012345679 2.2 PREVU pour produit de deux entiers
Unisciel algoprog it00aexerc-texte, April 17, 2015 7 2.3 Procédure quorest / quoresta1 La relation de la division entière est : a = q n b + r n avec 0 r n < b les suites étant définies par : q n = q n 1 + 1 r n = r n 1 b q 0 = 0, r 0 = a Pouvez la relation. Écrivez une procédure quorest(a,b,quotient,reste) qui calcule par opérations additives le quotient de la division entière de a par b dans quotient (entier) et le reste de cette division dans reste (entier). Les entiers a et b sont supposés positifs. Aide simple Initialisez le quotient et le reste, puis utilisez une boucle TantQue (son équivalent en programmation) qui traduit la récurrence. Écrivez un programme qui demande deux entiers positifs dans a et b, calcule le quotient et le reste de a par b puis affiche l opération de la division entière. Deux entiers positifs? 50 6 50 = 8 * 6 + 2
Unisciel algoprog it00aexerc-texte, April 17, 2015 8 2.4 Fonctions gerase / gerasea1 Ce problème calcule le PGCD (plus grand commun diviseur) et le PPCM (plus petit commun multiple) de deux entiers positifs par l algorithme de De Gerase. Rappel : le PGCD de deux entiers positifs est le plus grand entier qui divise les deux entiers. L algorithme de De Gerase calcule le PGCD de deux entiers positifs a et b par soustraction du plus petit dans le plus grand des deux entiers jusqu à ce que les deux entiers soient égaux. Écrivez le SDR de l algorithme de De Gerase. Déduisez une fonction gerase(a,b) qui calcule et renvoie le PGCD des entiers a et b supposés positifs en appliquant l algorithme de De Gerase. Pour calculer le PPCM de deux entiers positifs a et b, la méthode de De Gerase consiste à faire converger les valeurs a et b vers une valeur commune en augmentant a de a si elle est plus petite que b ou en augmentant b de b si elle est plus petite que a. Écrivez une fonction geraseppcm(a,b) qui calcule et renvoie le PPCM de deux entiers a et b supposés positifs en appliquant l algorithme de De Gerase. Écrivez un programme qui demande deux entiers positifs dans a et b puis calcule et affiche leur PGCD et leur PPCM. Deux entiers positifs? 24 42 ==> PGCD(24,42) = 6 ==> PPCM(24,42) = 168
Unisciel algoprog it00aexerc-texte, April 17, 2015 9 3 Approfondir le cours 3.1 Fonction euclide / euclidea1 L algorithme d Euclide [mathématicien grec du IIIè siècle avant J.C.] calcule le PGCD (plus grand commun diviseur) de deux entiers positifs a et b comme suit : a si b = 0 gcd(a, b) = gcd(b, a mod b) sinon Écrivez le SDR (Système De Récurrence) de l algorithme d Euclide. Concluez. Écrivez une fonction euclide(a,b) qui calcule et renvoie le PGCD de deux entiers a et b supposés positifs en appliquant l algorithme d Euclide. Outil C++ L opération mod (reste de la division entière) est noté %. Écrivez un programme affiche leur PGCD. qui demande deux entiers positifs dans a et b puis calcule et Deux entiers positifs? 24 42 ==> PGCD(24,42) = 6
Unisciel algoprog it00aexerc-texte, April 17, 2015 10 3.2 Fonction arithgeo / arithgeoa1 Soient a et b deux réels tels que 0 < a < b et soient (u n ) et (v n ) les suites définies par : Il est mathématiquement prouvé que : u 0 = a, v 0 = b u n+1 = u n v n v n+1 = un+vn 2 1. n N : u 0 u n < u n+1 < v n+1 < v n v 0 2. Les deux suites sont adjacentes. Leur limite commune l est appelée moyenne arithmético-géométrique de a et b. Le graphe de précédence u v ayant un circuit, comment obtenir un graphe sans circuit? Soient deux variables un et vn représentant les deux suites (u n ) et (v n ). Écrivez une fonction arithgeo(a,b,epsilon) qui calcule et renvoie une valeur approchée de la moyenne arithmético-géométrique de a (réel) et b (réel) à la précision epsilon (réel) près. Outil C++ Les fonctions racine-carrée sqrt(x) et valeur-absolue fabs(x) sont définies dans la bibliothèque <cmath>. Écrivez un programme qui demande deux réels dans a et b puis calcule et affiche la moyenne arithmético-géométrique de a et b à 10 5 près. Deux réels? 5 11 ==> Moyenne arithgeo est 7.7053344807
Unisciel algoprog it00aexerc-texte, April 17, 2015 11 3.3 Fonction arcsinapprox / pg-itarcsina1 Lorsque x est proche de 0, le développement limité de l arc sinus est : arcsin(x) = x + x3 2 3 + 1 3 x5 1 3 5... (2n 1)x2n+1 + 2 4 5 2 4 6... (2n) (2n + 1) + o(x2n+2 ) = 1 3... (2j 1)x 2j+1 2 j (j!)(2j + 1) j=1 Écrivez une fonction arcsinapprox(x,n) qui calcule et renvoie une approximation de arcsin(x) jusqu au rang n en évitant tout calcul inutile et en factorisant au maximum les opérations. Écrivez un programme qui demande un réel dans x et un entier dans n puis calcule et affiche l arc sinus approximé de x à l ordre n. Votre réel et votre entier? 0.01 10 Arcsin de 0.01 approximé à l ordre 10 vaut 0.0000001667