Vous êtes sur la page 1sur 13

http://prepa-info.blogspot.com/ said_anis@hotmail.

com
1
SERIE DEXERCICES :
LES SOUS-PROGRAMMES
Exercice n1 :
Enonc :
1) Factorielle
Faire une fonction facto(n) qui renvoie n!.
2) Puissance
Faire une fonction puiss(x,n) qui renvoie x
n
.
3) Exponentielle


Solution :

1) Factorielle

FONCTION facto (n: entier):entier
VAR
f, i : entier
DEBUT
f<-- 1
Pour i de 2 n faire
f <-- f * i
Fin pour
facto <-- f
FIN





http://prepa-info.blogspot.com/ said_anis@hotmail.com
2

2) Puissance

FONCTION puiss (x, n : entier):entier
VAR
i, p: entier
DEBUT
p<-- 1
Pour i de 1 n faire
p<-- p * x
Fin pour
Retourner p
FIN

3) Exponentielle

FONCTION expn (x, n : entier):entier
VAR
i, e: rel
DEBUT
e<-- 0
Pour i de 1 n faire
e<-- e + (puiss(x, i)/facto(i))
Fin pour
Retourner e
FIN

http://prepa-info.blogspot.com/ said_anis@hotmail.com
3
Exercice n2 :
Enonc :
1-Ecrire une procdure trois paramtres entiers qui fait la somme des deux premiers et range cette valeur
dans le troisime.
2-Transformer la procdure prcdente en fonction.

Solution :
1)
PROCEDURE sommeRange (n1, n2 : entier, VAR n3 : entier)
DEBUT
n3 <-- n1 + n2
FIN

2)

FONCTION sommeRange (n1, n2 : entier): entier
DEBUT
sommeRange <-- n1 + n2
FIN

Exercice n3 :
Enonc :

1. Faire une fonction calcpi qui calcule la valeur approche de en s'arrtant lorsque le terme 1 / x est
plus petit que .
2. Faire un programme qui lit rel, appelle calcpi puis affiche le rsultat.
Solution :

http://prepa-info.blogspot.com/ said_anis@hotmail.com
4
1)
FONCTION calcPi (epsilon : rel):rel
VAR
valeur : rel
signe : entier
DEBUT
valeur <-- 1
n <-- 1
Signe <-- 1
Tant que (valeur > epsilon) faire
If (signe mod 2 = 0) alors
valeur <-- valeur + (1/n)
Sinon
valeur <-- valeur - (1/n)
Fin si
Signe <-- signe + 1
n <-- n + 2
Fin tant que
Retourner valeur
FIN
2)
ALGORITHME CALCUL_PI
VAR
epsilon, pi: rel
DEBUT
crire ("Merci de saisir la valeur de :")
// on ne choisit pas comme un nom de variable
Lire (epsilon)
pi <-- calcPi (epsilon)
crire ("Pi =", pi)
FIN
http://prepa-info.blogspot.com/ said_anis@hotmail.com
5
Exercice n4 :
Enonc :
Soit la suite rcurrente U suivante dfinie par
1
2
3
3 1 2
4
2
1
2
n n n n
U
U
U
U U U U

=

= + +


Ecrire une procdure algorithmique nomme PSuitequi calcule le n-ime terme de U.
Solution :

PROCEDURE PSuite (n : entier)
VAR
u, u1, u2, u3 : rel
DEBUT
u1 <-- 4
u2 <-- 2
u3 <-- 1
Si (n=1) alors
u <-- u1
Sinon si (n = 2) alors
u <-- u2
Sinon si (n = 3) alors
u <-- u1
Sinon si (n>=4) alors
Pour compteur de 4 n faire
u <-- racine carr (2 * u1 + u3) + u2
u1 <-- u2
u2 <-- u3
u3 <-- u
Fin pour
crire ("U", n,"=", u)
http://prepa-info.blogspot.com/ said_anis@hotmail.com
6
Sinon
crire ("argument invalide")
Fin si
FIN
Exercice n5 :
Enonc :
A partir dun entier n strictement positif, on cherche se ramener 1, pour cela on applique la mthode
suivante : Suite de SYRACUS
Si n est pair on le remplace par
2
n

Si n est impair on le remplace par 3 1 n +

Et ainsi de suite jusqu ce que lon arrive 1.
Ecrire une procdure algorithmique SYRACUS, permettant de compter et dafficher le nombre ditrations
ncessaires pour le ramener un entier n strictement positif 1.
Solution :

PROCEDURE SYRACUS (n : entier)
VAR
nb_it : entier
DEBUT
nb_it <-- 0
Rpter
Si (n mod 2 = 0) alors
n <-- n/2
Sinon
n<-- 3 * n + 1
Fin si
nb_it <-- nb_it + 1
Jusqu (n=1)
crire (" Le nombre d'itrations = ", nb_it)
FIN
http://prepa-info.blogspot.com/ said_anis@hotmail.com
7

Exercice n6 : Algorithmes des babyloniens
Enonc :
Supposons que lon cherche calculer une valeur approche de la racine carre a du nombre a . On
considre la suite rcurrente suivante :
0
1
1
1
2
n n
n
u
a
u u
u
+
=

| |

= +
|

\ .


Le calcul des termes sarrte lorsque la diffrence entre deux termes conscutifs soit infrieure
8
10

.
Ecrire une procdure algorithmique BABYLONE qui permet de calculer puis dafficher la racine carre
dun rel positif a donn.
Solution:

PROCEDURE BABYLONE (a: rel)
CONST
VALEUR = 10 ^ (-8)
VARIABLES
u, up : rel
DEBUT
u <-- 1
Rpter
up <-- u
u <-- 1/2 * (u + a/u)
Jusqu (u - up <= VALEUR)
crire ("la racine carre de ", a," est = ", u)
FIN



http://prepa-info.blogspot.com/ said_anis@hotmail.com
8
Exercice n7 : Suite de Feigenbaum

Enonc:
On considre la suite rcurrente (suite de Feigenbaum) dfinie par :

( )
0
1
1
n n n
u
u au u
+
e



Ecrire une procdure algorithmique FEIGNBAUM, qui partir dun rel a, un rel u0 et un entier n
calcule et affiche la valeur de
n
u .
Solution:

PROCEDURE FEIGNBAUM (n : entier, a, u : rel)
VAR
I : entier
DEBUT
Pour I de 1 n faire
u <-- a * u * (1 - u)
Fin pour
crire ("U", n," = ", u)
FIN


Exercice n8 : Algorithme Euclide
Enonc:
Lalgorithme d Euclide est un algorithme qui dtermine le PGCD de deux nombres naturels a et b.
Le processus de lalgorithme est le suivant :
Si un des nombres est nul, l'autre est le PGCD.
Sinon il faut soustraire le plus petit du plus grand et laisser le plus petit inchang.
Puis, recommencer ainsi avec la nouvelle paire jusqu' ce quun des deux nombres soit nul.
| |
o est un nombre rel, 0, 4 a ae

//u
0
appartient IR

http://prepa-info.blogspot.com/ said_anis@hotmail.com
9
Dans ce cas, l'autre nombre est le PGCD.
Ecrire une procdure permettant calculer et afficher le PGCD de deux nombres a et b en utilisant
lalgorithme lEuclide.
Solution :

PROCEDURE Algorithme_Euclide (a, b: entier)
VARIABLES
pgcd : entier
DEBUT
Si (a = 0) alors
pgcd <-- b
Sinon si (b = 0) alors
pgcd <-- a
Sinon
Rpter
Si (a >= b) alors
a <-- a - b
Sinon
b <-- b - a
Fin si
Jusqu (a = 0 ou b = 0)
Fin si
Si (a = 0) alors
pgcd <-- b
Sinon
pgcd <-- a
Fin si
crire ("pgcd (", a, ", ", b, ") = ", pgcd)
FIN

http://prepa-info.blogspot.com/ said_anis@hotmail.com
10
Exercice n9 : Polynmes de TChebychev
Enonc :
Soit | | X IR T
n n
e dfini par :
1
0
= T , X T =
1
et , 2 > n
2 1
2

=
n n n
T XT T .
Ecrire une procdure permettant de calculer le
me
n polynme de Tchebychev avec n donn tel que 2 > n .

Solution :

REMARQUE:
- Cest une procdure qui manipule des expressions formelles, donc ne peut pas tre implmente
que sur des logiciels de calcul formel tel que MAPLE.
- Le type de T(i) dpend de types des valeurs de x.
- On va choisir dans notre solution le type rel pour toutes les variables.

PROCEDURE Tchebychev (n : Entier)
VAR
T, Tn_1, Tn_2, X : rel
DEBUT
Tn_2 1 // Tn_2 = T0
Tn_1 X // Tn_1 = T1
Pour I de 2 n faire
T 2 * X * Tn_1 Tn_2
Tn_2 Tn_1
Tn_1 T
Fin pour
Ecrire ("le ", n," me polynme de Tchebychev =", T)
FIN




http://prepa-info.blogspot.com/ said_anis@hotmail.com
11
Traduction en langage formelle (MAPLE):
> t2 := 1:
t1 := x:
n := 12:
for i from 2 to n do
t := 2 * x * t1 - t2:
t2 := t1:
t1 := t:
od:
print('t'=t):

Exercice n10:
Enonc:
- On appelle diviseur propre de n, un diviseur quelconque de n, n exclu; Exemple : 6 = 1 + 2 + 3
- Un entier est dit parfait sil est gal la somme de tous ses diviseurs propres
- On appelle nombre premier tout entier naturel suprieur a 1 qui possde exactement deux diviseurs, lui-
mme et 1 ;
- Les nombres premiers a tel que : (a+n+n
2
) est premier pour tout n tel que 0 n (a-1) sont appeles
nombres chanceux.
1. Ecrire une procdure nomme, SOMDI V qui calcule et renvoie dans sd la somme des diviseurs propres
dun entier n donne.

PROCEDURE SOMDIV (n : entier, VAR sd : entier)
VAR
i : entier
DEBUT
sd <-- 0
Pour i de 1 (n div 2) faire
Si (n mod i = 0) alors
sd <-- sd + 1
Fin si
Fin pour
FIN
http://prepa-info.blogspot.com/ said_anis@hotmail.com
12

2. Ecrire les instructions algorithmiques (on ne demande pas dcrire un algorithme principal) permettant
dafficher les nombres parfaits de lintervalle [2,1000].
Pour I de 2 1000 faire
SOMDIV (I, sd)
Si (I = sd) alors
crire (I, "est un nombre parfait")
Fin si
Fin pour

3. Ecrire une fonction nomme, estpremier, rsultat boolen permettant de vrifier si un entier e donn
est premier ou non.

FONCTION estPremier (n : entier) : boolen
VAR sd : entier
DEBUT
SOMDIV (n, sd)
Si (sd <> 1) alors
Retourner FAUX
Fin si
Retourner VRAI
FIN


4. Ecrire une fonction nomme, estchanceux, rsultat boolen permettant de vrifier si un entier a
donn est chanceux ou non.





http://prepa-info.blogspot.com/ said_anis@hotmail.com
13

FONCTION estChanceux (a : entier) : boolen
VAR
n : entier
DEBUT
Si estPremier(a) alors
Pour n de 0 (a - 1) faire
Si (non estPremier (a + n + n^2)) alors
estChanceux <-- FAUX
Fin si
Fin pour
estChanceux <-- VRAI
Fin si
estChanceux <-- FAUX
FIN