BCPST 851 15 octobre 2012 Scilab – Correction du TD 4 Exercice 1 On considère la suite définie par u0 = 4 et ∀n ∈ N, un+1 = u2n + 1. 1. À l’aide d’une boucle while, écrire un programme prenant en entrée un réel x et renvoyant la valeur du premier terme de la suite qui soit supérieur ou égal à x. x = i n p u t (" valeur de x ?"); u=4; while u < x u = u^2 + 1; end disp (u) Pour x = 17, on doit obtenir 17 et pour x = 1000 obtenir 84101. 2. Modifier votre programme pour qu’il renvoie également l’indice de ce terme. Pour x = 1000, on doit obtenir un = 84101 et n = 3. x = i n p u t (" valeur de x ?"); u=4; n=0; while u < x u = u^2 + 1; n = n + 1; end / / a f f i c h a g e b a s i q u e de u disp ("u=") disp (u) / / a f f i c h a g e " e v o l u e " de n message = "n=" + s t r i n g (n); disp ( message ) Exercice 2 Écrire un programme prenant en entrée un entier (positif) n et déterminant s’il est premier. On procédera en testant tous les diviseurs possibles et on essaiera de ne pas faire trop d’opérations inutiles. On rappelle qu’un entier est dit premier s’il a exactement 2 diviseurs. 1 n’est donc pas premier, et les premiers nombres premiers sont 2, 3, 5, 7, 11. . . √ √ Si n s’écrit pq, alors on a nécessairement √ p 6 n ou q 6 n. Cela signifie que si l’on a testé tous les diviseurs possibles jusqu’à n sans rien trouver, il est inutile de continuer. n = i n p u t (" Valeur de n ?"); borne = s q r t (n); p = 2; / / p e s t l e d i v i s e u r p o t e n t i e l de n w h i l e ( modulo (n,p) ~= 0) & (p <= borne ) / / t a n t que p ne d i v i s e p a s n / / e t que p e s t i n f e r i e u r a s q r t ( n ) p = p+1; / / on p a s s e au c a n d i d a t s u i v a n t end // // // // S i l ’ on a d e p a s s e l a b o r n e s a n s t r o u v e r de d i v i s e u r , c ’ e s t que n e s t p r e m i e r , s a u f s i n =1. Sinon , n n ’ e s t p a s p r e m i e r . i f (p > borne ) & (n > 1) then disp (’n est premier ’) else disp ("n n’’est pas premier ") end ; Exercice 3 On considère le programme suivant : cible = f l o o r (100* rand ()) + 1: essai = i n p u t (" Votre choix ? ") w h i l e essai ~= cible i f essai > cible then disp ("Trop grand .") e l s e disp ("Trop petit ") ; end essai = i n p u t (" Votre choix ?"); end disp ("Gagné !") 1. Que fait ce programme ? C’est un jeu de devinette dont la compréhension ne pose pas trop de problème avec les commentaires présents dans l’énoncé. . . 2. Modifier ce programme pour que l’ordinateur choisisse le nombre à deviner entre 27 et 117 inclus. cible = f l o o r (101* rand ()) + 27 / / 101∗ r a n d ( ) donne un r e e l a l e a t o i r e d a n s ] 0 , 1 0 1 [ / / f l o o r ( 1 0 1 ∗ r a n d ( ) ) donne un e n t i e r a l é a t o i r e d a n s [ 0 , 1 0 0 ] / / p u i s on r a j o u t e 27 / / Le r e s t e du programme e s t i n c h a n g e 3. Modifier ce programme pour qu’il affiche le nombre d’essais dont le joueur a eu besoin pour trouver. cible = f l o o r (100* rand ()) + 1; essai = i n p u t ("Votre choix ? "); n = 1; w h i l e ( essai ~= cible) i f (essai > cible) then disp ("Trop grand.") e l s e disp ("Trop petit") end essai = i n p u t ("Votre choix ?"); n = n+1; end disp ("Gagné !") disp ("Vous avez utilise " + s t r i n g (n) + " essais ") 4. Modifier ce programme pour que le joueur n’ait droit qu’à 7 essais (on affichera «Perdu !» si le joueur ne trouve pas au septième essai). cible = f l o o r (100* rand ()) + 1; essai = i n p u t ("Votre choix ? "); n = 1; w h i l e ( essai ~= cible) & (n < 7) i f (essai > cible) then disp ("Trop grand.") e l s e disp ("Trop petit") end essai = i n p u t ("Votre choix ?"); n = n+1; end i f essai == cible then disp ("Gagné !") disp ("Vous avez utilise " + s t r i n g (n) + " essais ") else disp ("Perdu , la reponse etait") disp ( cible ) end 5. Le joueur a-t-il une stratégie pour être sûr de trouver en au plus 7 essais ? Oui, même si c’est un peu pénible à prouver. En procédant par dichotomie (c’est-àdire en essayant de couper l’intervalle en deux parts égales à chaque étape), le joueur utilisera au plus 7 essais.