Fraternité d entiers (Version tableau) [th08] - Exercice Karine Zampieri, Stéphane Rivière, Béatrice Amerein-Soltner Unisciel algoprog Version 10 avril 2015 Table des matières 1 Stratégie naïve 1 1.1 Stratégie naïve................................ 1 1.2 Tableau de présence............................. 2 1.3 Test de fraternité............................... 3 2 Autre stratégie, Version Tableau 3 2.1 Autre stratégie................................ 3 2.2 Procédure decomposer............................ 4 2.3 Procédure unifiertab (unification d un tableau trié)............ 5 2.4 Fonction identiquestab (égalité de tableaux)................ 5 2.5 Procédure triselection (tri par sélection).................. 5 2.6 Test de fraternité............................... 5 3 Autre stratégie bis, Version Tableau 6 3.1 Autre stratégie bis.............................. 6 3.2 Fonction evalchiffres............................. 7 3.3 Test de fraternité............................... 7 4 Recherche exhaustive 8 Fraternité d entiers / pg-fraternitea1 (C++, TP) Cet exercice réalise une recherche exhaustive d entiers frères dans un intervalle [a..b]. 1 Stratégie naïve 1.1 Stratégie naïve 1
Unisciel algoprog Fraternité d entiers / th08 2 Entiers frères Deux entiers positifs sont dits frères si chaque chiffre différent (entier dans [0..9]) qui constitue l un apparaît au moins une fois dans l autre. Exemple 1288218 et 822112122 sont frères mais 1288218 et 4812 ne le sont pas. Stratégie naïve Pour déterminer si deux entiers sont frères, une stratégie naïve consiste à : 1. Décomposer les deux entiers en la séquence (tableau) de ses chiffres. 2. Calculer le tableau de présence des chiffres de chacun des entiers. 3. Vérifier si ces deux tableaux de présence sont identiques. Exemple Pour chacun des entiers, les tableaux de présence sont (V dénote Vrai ; l absence de valeur signifie Faux) : 0 1 2 3 4 5 6 7 8 9 n1=1288218 V V V n2=822112122 V V V n3=4812 V V V V Comme vp(n1)=vp(n2) donc n1 et n2 sont frères, mais vp(n1)<>vp(n3) donc n1 et n3 ne sont pas frères. 1.2 Tableau de présence Définissez la constante BASEDECIMALE (base décimale) de valeur 10 et le type TabPresence comme étant un tableau de booléens des chiffres [0..9]. Écrivez une procédure initialiserpresence(t) qui initialise à Faux un TabPresence t. Écrivez une procédure calculerpresence(n,t) qui calcule le tableau de présence des chiffres d un entier positif n dans un TabPresence t. Aide méthodologique Initialisez le TabPresence t puis tant que n n est pas nul, récupérez chacun des chiffres u (par un modulo de 10) puis une division par 10 de n et marquez à Vrai, l élément t[u].
Unisciel algoprog Fraternité d entiers / th08 3 1.3 Test de fraternité Écrivez une fonction identiques(t1,t2) qui teste et renvoie Vrai si deux TabPresence t1 et TabPresence t2 sont identiques, Faux sinon. Déduisez une fonction fraternite(n1,n2) qui teste et renvoie Vrai si deux entiers positifs n1 et n2 sont frères, Faux sinon. Écrivez une procédure test_fraternite qui demande et saisit deux entiers (supposés positifs) dans n1 et n2. Affichez l invite : Deux entiers positifs? Calculez et affichez s ils sont frères ou non. Testez. Exemples d exécution. Deux entiers positifs? 1218 82122 Les entiers 1218 et 82122 SONT freres Deux entiers positifs? 82122 4812 Les entiers 82122 et 4812 NE SONT PAS freres 2 Autre stratégie, Version Tableau 2.1 Autre stratégie Autre stratégie Une autre stratégie consiste à : 1. Décomposer les deux entiers en la séquence (tableau) de ses chiffres. 2. Trier la séquence des chiffres de chacun des entiers. 3. Unifier (c.-à-d. supprimer les doublons de) la séquence triée des chiffres de chacun des entiers. 4. Vérifier que les deux séquences unifiées sont identiques.
Unisciel algoprog Fraternité d entiers / th08 4 Exemple La séquence triée de n1=1288218 est [1,1,2,2,8,8,8] et l unification donne [1,2,8]. Celle triée de n2=822112122 est [1,1,1,2,2,2,2,2,8] et l unification donne [1,2,8]. Les deux séquences unifiées de n1 et n2 sont bien identiques. La séquence triée unifiée de n3=4812 est [1,2,4,8]. Les séquences unifiées de n1 et n3 sont différentes. 2.2 Procédure decomposer Ce problème décompose un entier positif en sa séquence de chiffres (entiers dans [0..9]). Définissez la constante NMAX (taille maximale des tableaux) de valeur 20 puis le type Tableau comme étant un tableau d entiers de taille NMAX. Écrivez une procédure initialiserchiffres(cs,nc) qui initialise un Tableau cs à la séquence vide, l entier nc représentant le nombre de chiffres dans cs. Aide simple Il suffit d initialiser nc à zéro. Écrivez une procédure ajouterchiffre(cs,nc,val) qui ajoute un chiffre de valeur val à la fin d un Tableau cs de nc chiffres. Exemple : Soient: cs=[8,1,2,2], nc=4 Après: ajouterchiffre(cs,nc,6) Ici: cs=[8,1,2,2,6], nc=5 Aide simple Il faut mettre val en fin de cs et modifiez sa longueur nc. Écrivez une procédure decomposer(n,cs,nc) qui décompose un entier positif n en ses chiffres (base 10) dans un Tableau cs et restitue dans l entier nc le nombre de chiffres contenu dans cs. Exemple : Pour 3012 = 2 10 0 + 1 10 1 + 0 10 2 + 3 10 3 la procédure doit initialiser cs avec [2,1,0,3] et l entier nc avec 4.
Unisciel algoprog Fraternité d entiers / th08 5 2.3 Procédure unifiertab (unification d un tableau trié) Ce problème supprime les doublons adjacents dans un Tableau. Exemple : [1,2,2,2,8,9,11,11,20] ==> [1,2,8,9,11,20] Écrivez une procédure unifiertab(t,n) qui unifie (c.-à-d. supprime les doublons) adjacents des n éléments d un Tableau t trié. Attention, le tableau est supposé trié. La procédure modifiera également l entier n qui mémorise le nombre d éléments dans t. 2.4 Fonction identiquestab (égalité de tableaux) On dira que deux Tableau sont identiques s ils ont les mêmes valeurs en même position. Écrivez une fonction identiquestab(t1,t2,n) qui teste et renvoie Vrai si les Tableau t1 et Tableau t2 sont identiques (mêmes valeurs en j), Faux sinon. 2.5 Procédure triselection (tri par sélection) Ce problème effectue le tri par sélection (du maximum) d un Tableau. Écrivez une fonction indicemaximum(t,binf,bsup) qui recherche et renvoie la position d un maximum d un Tableau t[binf..bsup], c.-à-d que la recherche s effectue dans le sous-tableau entre les indices binf et bsup uniquement. Écrivez une procédure triselection(t,n) qui effectue le tri par sélection de n éléments d un Tableau t. La procédure utilise la fonction indicemaximum pour la recherche de l indice d un maximum dans un sous-tableau. 2.6 Test de fraternité Écrivez une procédure unifierseq(n,cs,nc) qui calcule la séquence ordonnée des chiffres d un entier positif n dans un Tableau cs et restitue dans l entier nc la taille de cs.
Unisciel algoprog Fraternité d entiers / th08 6 Écrivez une fonction identiquesseq(cs1,nc1,cs2,nc2) qui teste et renvoie Vrai si deux séquences de chiffres d un Tableau cs1 de longueur nc1 et Tableau cs2 de longueur nc2 sont identiques, Faux sinon. Déduisez une fonction fraternite2(n1,n2) du test de fraternité de deux entiers positifs n1 et n2. Modifiez la procédure test_fraternite de sorte à appeler la fonction fraternite2. Testez. 3 Autre stratégie bis, Version Tableau 3.1 Autre stratégie bis Autre stratégie bis Plutôt que de vérifier que les deux séquences unifiées sont identiques, on peut : 1. Évaluer la valeur d une séquence unifiée de chiffres. 2. Vérifier que les deux entiers sont égaux.
Unisciel algoprog Fraternité d entiers / th08 7 Exemple La séquence triée de n1=1288218 est [1,1,2,2,8,8,8], l unification donne [1,2,8] et sa valeur est donc 128. Celle triée de n2=822112122 est [1,1,1,2,2,2,2,2,8], l unification [1,2,8] fournie la valeur 128. Les deux valeurs des séquences unifiées de n1 et n2 sont bien identiques. La séquence triée unifiée de n3=4812 est [1,2,4,8] de valeur 1248. Les valeurs des séquences unifiées de n1 et n3 sont différentes. 3.2 Fonction evalchiffres Ce problème évalue une séquence de chiffres. Écrivez une fonction evalchiffres(cs,nc) qui calcule et renvoie la valeur de l entier représenté par un Tableau cs de longueur nc en utilisant le schéma de Hörner. Exemple : Pour la séquence de chiffres [2,1,0,3], la fonction doit retourner l entier de valeur 3012. 3.3 Test de fraternité Ce problème utilise la fonction evalchiffres. Écrivez une fonction identiquesseq2(cs1,nc1,cs2,nc2) du test d égalité des séquences de chiffres Tableau cs1 de longueur nc1 et Tableau cs2 de longueur nc2 en utilisant la fonction evalchiffres. Copiez/collez la fonction fraternite2 en la fonction fraternite3(n1,n2) puis modifiezla pour qu elle appelle la fonction identiquesseq2. Modifiez la procédure test_fraternite de sorte qu elle appelle la fonction fraternite3.
Unisciel algoprog Fraternité d entiers / th08 8 Testez. 4 Recherche exhaustive Ce problème réalise une recherche exhaustive d entiers frères. Écrivez une procédure test_recherche qui demande deux entiers positifs dans a et dans b. Affichez l invite : Intervalle a..b pour la recherche? Comptez et affichez tous les entiers frères de l intervalle [a..b]. Aide simple La fraternité est une relation d équivalence : réflexive, symétrique et transitive... Tenez en compte dans le cas du décompte. Testez. Sont-ils nombreux?