Vous êtes sur la page 1sur 14

Algorithmique Travaux Dirigs

Master Technologie et Handicap : Intensifs 1

Corrig

Exercice 1 Affectations
1. Considrons les algorithmes ci-dessous.
(a) Quel sera le contenu des variables a, b et ventuellement c aprs leur excution ?
(b) Dans chacun des cas ci-dessus, y a-t-il des lignes inutiles, et si oui lesquelles ?
1 // algo 1.1 1 // algo 1.2 1 // algo 1.3
2 var a, b, c : entier 2 var a, b : entier 2 var a, b : entier
3 debut 3 debut 3 debut
4 a 1 4 a 1 4 a 2
5 b a + 2 5 b a + 2 5 b a + 2
6 c b - 3 6 a 3 6 a a + 2
7 fin 7 fin 7 b a - 2
8 fin
Solution Solution
Solution
// a = 1 // a = 3
// b = 3 // b = 3 // a = 4
// c = 0 // b = 2

1 // algo 1.4 1 // algo 1.5 1 // algo 1.6


2 var a, b, c : entier 2 var a, b, c : entier 2 var a, b : car
3 debut 3 debut 3 debut
4 a 2 4 a 1 4 a 1
5 b 4 5 b 2 5 b 2
6 c a + b 6 b a + b 6 a a + b
7 a 1 7 c a + b 7 fin
8 c b - a 8 fin
Solution
9 fin
Solution Ne marche pas. On ne peut pas
Solution additionner des caractres.
// a = 1
// a = 1 // b = 3
// b = 4 // c = 4
// c = 3
// ligne 3 inutile

Solution (Complment)
Dans la plupart des langages de programmation le dernier exemple (1.6) ne gnrera pas derreur mais le rsultat
ne sera pas souvent 3. Selon le langage, ce sera la concatnation de ces caractres en une chane de caractres
ab (cas des langages Python ou javascript), voire a+b (cas du shell) ou bien la somme des codes ASCII
correspondant aux caractres 1 et 2, soit 49 + 50 = 99 : le caractre c (cas des langages C, C++ ou java).
Dans trs peu de langages, comme PHP ou perl, en revanche, le rsultat sera bien 3. Enfin dans dautres langages
comme pascal, qui est un langage fortement typ, la compilation gnrera une erreur.

Master Handi Universit Paris 8 2012 Algo Corrig TD 1


2. Considrons lalgorithme ci-contre 1 var a, b : entier
(a) Permet-il de permuter les valeurs des valeurs des variables a et b ? 2 debut
(b) Proposer des solutions pour permuter les valeurs de 2 variables 3 a 1
numriques ? Chacune des solutions proposes marche-t-elle dans 4 b 2
le cas de variables non numriques. 5 a b
6 b a
(c) tant donnes 3 variables a, b et c, proposer un algorithme pour
7 fin
les permuter circulairement, en transfrant les valeurs initiales de
a b, de b c, et de c a.
Solutions
(a) Bien sr que non ! Le rsultat est // a = 2, b = 2
(b) (c) Permutation de 3 variables
var a, b, c : entier var a, b, c : entier var a, b, c, t : entier
debut debut debut
a 1 a 1 a 1
b 2 b 2 b 2
c a a a + b c 3
a b b a - b t a
b c a a - b a c
fin fin c b
// Fonctionne avec // Ne fonctionne b t
// nimporte quel // quavec des nombres ! fin
// type de donnes

Exercice 2
1. Quels sont les affichages provoqus par les algo- 1 // algo 2.1 1 // algo 2.2
rithmes ci-contre. 2 var a, b : reel 2 var a, b : entier
Solutions 3 var c : entier 3 var c : reel
algo 2.1 algo 2.2 4 debut 4 debut
4.21 8.42 5 2 5 a 4.21 5 a 5
16.84 2 6 b a * 2 6 b 2
16 2.0 7 ecrire a, b 7 ecrire a, b
8 ecrire b * 2 8 ecrire a / b
Pour lalgo 2.2, si on veut que le rsultat soit bien 9 c b * 2 9 c a / b
la moyenne de 5 et de 2, cest dire 2.5 et non 2.0, 10 ecrire c 10 ecrire c
il faut forcer la conversion en rel avant la divi- 11 fin 11 fin
sion, soit en faisant successivement, la place de
la ligne 9, c a et c c / b, ou bien directe-
ment : c (1.0 * a) / 2.

2. crire un algorithme qui demande un entier luti-


lisateur, puis affiche son carr.
Solution
var a : entier
debut
lire "Saisissez un entier ", a
ecrire a * a
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 2


Exercice 3 Conditionnelles
1. crire un algorithme qui demande un entier lutilisateur, teste si ce nombre est positif ( 0) ou non, et affiche
positif ou ngatif.
2. crire un algorithme qui demande un entier lutilisateur, teste si ce nombre est strictement positif, nul ou stricte-
ment ngatif, et affiche ce rsultat.
3. crire un algorithme qui demande un rel lutilisateur et affiche sa valeur absolue (sans utiliser de fonction
prdfinie videmment).
4. crire un algorithme qui demande un rel lutilisateur et larrondit lentier le plus proche (les x,5 seront arrondis
lentier suprieur).
5. crire un algorithme qui demande le numro dun mois et affiche le nombre jours que comporte ce mois.
6. crire un algorithme qui vrifie si une anne est bissextile. On rappelle quil y a des annes bissextiles tous les
4 ans, mais la premire anne dun sicle ne lest pas (1800, 1900 ntaient pas bissextiles) sauf tous les 400 ans
(2000 tait une anne bissextile).
7. crire un algorithme qui demande une date sous la forme de 2 nombres entiers (numro du jour et numro du mois)
et affiche la saison (ex : 12/02 ; hiver). On supposera que le premier jour de la saison est toujours le 21.
8. crire un programme qui demande les coordonnes (x, y) des sommets A, B et C dun triangle et affiche la nature
du triangle (isocle, quilatral, rectangle ou quelconque).
Solutions
1. Entier positif 2. Signe dun entier
var a : entier var a : entier
debut debut
lire "tapez un entier",a lire "tapez un entier",a
si a 0 crire "ce nombre est :"
alors si a > 0
ecrire "il est positif" alors
finsi ecrire "strict. positif"
fin sinon
si a < 0
3. Valeur absolue alors
ecrire "strict. ngatif"
var a : reel sinon
debut ecrire "nul"
lire "tapez un rel",a finsi
si a>0 finsi
alors fin
ecrire "|",a,"|=",a
sinon
ecrire "|",a,"|=",-a 5. Nombre de jours du mois
finsi var mois : entier
fin debut
lire "tapez un numro de mois
(entre 1 et 12)",mois
4. Arrondi
si mois = 2
var a : reel alors
var b : entier ecrire "28 ou 29 jours"
debut sinon
lire "tapez un rel",a si mois = 4 ou mois = 6
b a ou mois = 9 ou mois = 11
si a-b < .5 alors
alors ecrire "30 jours"
ecrire "arrondi: ", b sinon
sinon ecrire "31 jours"
ecrire "arrondi: ", b+1 finsi
finsi finsi
fin fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 3


6. Annes bissextiles
var annee : entier
debut
lire "tapez une anne", annee
si annee%4 = 0 et annee%100 6= 0
alors
ecrire annee, "est bissextile"
sinon
si annee%400 = 0
alors
ecrire annee, "est bissextile"
sinon
ecrire annee, "nest pas bissextile"
finsi
finsi
fin

ou encore
var annee : entier
debut
lire "tapez une anne", annee
si ( annee%4 = 0 et annee%100 6= 0 ) ou annee%400 = 0
alors
ecrire annee, "est bissextile"
sinon
ecrire annee, "nest pas bissextile"
finsi
fin

7. Saisons
var jour, mois : entier
debut
lire "Quel est le jour ?",jour
lire "Quel est le mois (entre 1 et 12)",mois
si (mois=12 et jour21) ou mois=1 ou mois=2 ou (mois=3 et jour<21)
alors
ecrire "Cest lhiver !"
sinon
si (mois=3 et jour21) ou mois=4 ou mois=5 ou (mois=6 et jour<21)
alors
ecrire "Vive le printemps !"
sinon
si (mois=6 et jour21) ou mois=7 ou mois=8 ou (mois=9 et jour<21)
alors
ecrire "Enfin lt !"
sinon
ecrire "Dj lautomne !"
finsi
finsi
finsi
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 4


8. Triangles
var xA, yA, xB, yB, xC, yC : reel
lAB, lAC, lBC, precision : reel
debut
precision=.001
lire "Donnez les coordonnes (x,y) du point A", xA, yA
lire "Donnez les coordonnes (x,y) du point B", xB, yB
lire "Donnez les coordonnes (x,y) du point C", xC, yC
p p
lAB= |xA xB|2 + |yA yB|2
p p
lAC= |xA xC|2 + |yA yC|2
p p
lBC= |xB xC|2 + |yB yC|2

si lAB-lAC < precision et lAB-lBC< precision


alors
ecrire "Le triangle est quilatral"
sinon
si lAB*lAB + lAC*lAC -lBC*lBC < precision
alors
si lAB - lAC < precision
alors
ecrire "Le triangle est isocle et rectangle en A"
sinon
ecrire "Le triangle est rectangle en A"
finsi
sinon
si lAB*lAB + lBC*lBC -lAC*lAC < precision
alors
si lAB - lBC < precision
alors
ecrire "Le triangle est isocle et rectangle en B"
sinon
ecrire "Le triangle est rectangle en B"
finsi
sinon
si lAC*lAC + lBC*lBC -lAB*lAB < precision
alors
si lAC - lBC < precision
alors
ecrire "Le triangle est isocle et rectangle en C"
sinon
ecrire "Le triangle est rectangle en C"
finsi
sinon
si lAB-lAC < precision ou lAB-lBC< precision ou lAC-lBC< precision
alors
ecrire "Le triangle est isocle"
sinon
ecrire "Le triangle est quelconque"
finsi

finsi
finsi
finsi
finsi
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 5


Exercice 4 Itrations
1. crire un algorithme qui demande un entier positif, et le rejette tant que le nombre saisi nest pas conforme.
Solution
var a : entier
debut
ecrire "Saisir un entier positif"
lire a
tantque a < 0
faire
ecrire "on a dit positif!, recommencez"
lire a
fait
fin

2. crire un algorithme qui demande 10 entiers, compte le nombre dentiers positifs saisis, et affiche ce rsultat.
Solution
var a, i, cc : entier
ou bien, avec une boucle de type pour
debut
ecrire "Saisir des entiers" var a, cc, n : entier
i 0 debut
cc 0 ecrire "Saisir des entiers"
tantque i < 10 cc 0
faire pour i allantde 1 a 10
lire a faire
i i + 1 lire a
si a 0 si a 0
alors alors
cc cc + 1 cc cc + 1
finsi finsi
fait fait
ecrire cc, "sont positifs" ecrire cc, "sont positifs"
fin fin

3. crire un algorithme qui demande des entiers positifs lutilisateur, les additionne, et qui sarrte en affichant le
rsultat ds quun entier ngatif est saisi.
Solution
var a, s : entier
debut
ecrire "Saisir des entiers"
lire a
s 0
tantque a 0
faire
s s + a
lire a
fait
ecrire "Rsultat : ", s
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 6


4. Modifier ce dernier algorithme pour afficher la moyenne de la srie dentiers positifs saisis.
Solution
var a, s, cc : entier
var m : reel
debut
ecrire "Saisir des entiers"
lire a
s 0
cc 0
tantque a 0
faire
cc += 1
s s + a
lire a
fait
m s // pour le convertir en rel
si cc > 0 alors
m m / cc
ecrire "Moyenne : ", m
sinon
ecrire "Aucun nombre saisi, pas de moyenne!"
fin

Attention, si on crit directement m s/cc le rsultat sera faux car converti en entier.

Exercice 5 Conversion en binaire


1. crire un algorithme de conversion dun nombre entier dcimal en binaire.
2. (Facultatif) crire un algorithme de conversion dun nombre entier dcimal en une base b quelconque. binaire.
Solutions
1. Conversion en binaire 2. Conversion en base b (b<10)
var n : entier var n, base : entier
var bin : chaine var out : chaine
debut debut
lire "Saisir un entier", n lire "Saisir un entier", n
bin="" lire "Saisir la base (<10)", b
out=""
si n=0
alors si n=0 alors out="0" finsi
bin="0"
finsi tantque n>0
faire
tantque n>0 ch=char(n%b=0) + ch
faire n=n/b
si n%2=0 fait
alors
ch = "0" + ch ecrire(n, "en base",b," : ", out)
sinon fin
ch = "1" + ch
finsi Notes :
fait On suppose que char(int n) est une fonction qui
transforme un entier n en la chane de caractres
ecrire(n, "en binaire : ", bin) correspondante.
fin Pour les bases suprieures 10, on a besoin de plus
de 10 chiffres, (en gnral on utilise des lettres),
quil faut placer dans un tableau.

Master Handi Universit Paris 8 2012 Algo Corrig TD 7


Exercice 6 Suites
crire un algorithme pour afficher les premiers termes des suites suivantes (nombre de termes demand lutilisateur) :
1. Suite arithmtique 2. Suite de Newton 3. Suite
de Fibonacci
a

u = u0 = 0

u0 = 1 0 2
1 a
un+1 = un + 2 u n+1 = 2 (un + un ) u1 = 1
un+2 = un+1 + un

(a est demand lutilisateur)
1. Solution 2. Solution 3. Solution
var u, i, n entier var n, a entier var u, u1, u2, n entier
debut var u : reel debut
lire "nb de termes ?", n debut lire "nb de termes ?", n
u 1 lire "a", a u1 0
i 0 lire "nb de termes ?", n u2 1
tantque i n faire u 1 ecrire "U(0)=0"
ecrire "U(",i,")=",u i 0 ecrire "U(1)=1"
u u + 2 tantque i n faire i 1
i i + 1 ecrire "U(",i,")=",u tantque i < n faire
fait u (u + a / u)/2 u u1 + u2
fin i i + 1 u1 u2
fait u2 u
fin i i + 1
ecrire "U(",i,")=",u
Note : il sagit dune lapproxima- fait
tion de la racine carre fin

Exercice 7 Devinez un nombre


1. crire un algorithme permettant de joueur au jeu du plus petit-plus grand. On tire un nombre au hasard pour le
faire deviner au joueur en lui disant chaque tour si le nombre propos est plus grand ou plus petit que le nombre
chercher. Lorsque le joueur a trouv, lalgorithme se termine en affichant le nombre de tours.
Note : On suppose quon a une fonction entier nombreAlatoire(var max : entier) qui tire un
nombre au hasard et le renvoie.
2. Modifier ensuite cet algorithme pour limiter 10 le nombre de propositions du joueur, et afficher "Perdu !" si le
joueur na pas trouv.
var x, prop, cc : entier
Solutions debut
cc 1
var x, prop, cc : entier
x nombreAlatoire(1000)
debut
lire "Ta proposition ?", prop
cc 1
tantque (prop 6= x) et (cc < 10)
x nombreAlatoire(1000)
faire
lire "Ta proposition ?", prop
si prop > x
tantque prop 6= x
alors
faire
ecrire "trop grand"
si prop > x
sinon
alors
ecrire "trop petit"
ecrire "trop grand"
finsi
sinon
lire "Ta proposition ?", prop
ecrire "trop petit"
cc cc + 1
finsi
fait
lire "Ta proposition ?", prop
si prop = x
cc cc + 1
alors
fait
ecrire "Trouv en ", cc, "coups"
ecrire "Trouv en ", cc, "coups"
sinon
fin
ecrire "Perdu!"
finsi
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 8


Exercice 8 Boucles imbriques
1. chiquiers
(a) crire un algorithme permettant dcrire un carr de 8 fois 8 caractres x.
(b) crire un algorithme permettant dcrire un chiquier. On reprsentera les case noires par des x et les cases
blanches par des espaces.
(c) Modifier lalgorithme prcdent pour afficher un cadre autour de lchiquier, en utilisant les caractres | ,
et +.
(d) Modifier de nouveau cet algorithme pour afficher lensemble des cases avec ces mmes caractres (voir
exemple 4 ci-dessous incomplet).
// a // b // c // d
++ ++++ ... +
xxxxxxxx x x x x |x x x x | |x| |x| ... |
xxxxxxxx x x x x | x x x x| ++++ ... +
xxxxxxxx x x x x |x x x x | | |x| | ... |
xxxxxxxx x x x x | x x x x| ++++ ... +
xxxxxxxx x x x x |x x x x | |x| |x| ... |
xxxxxxxx x x x x | x x x x| ++++ ... +
xxxxxxxx x x x x |x x x x | ... .
xxxxxxxx x x x x | x x x x| ... .
++ ++++ ... +

Solutions
On suppose dans ce qui suit que ecrire ninsre pas de fin de ligne. On utilisera le caractre EOL comme
caractre de retour a ligne. On procde de faon incrmentale, en modifiant le code de (a) pour faire (b) et ainsi
de suite.
(a) Carr (b) chiquier (c) chiquier encadr
var i, j : entier var i, j : entier var i, j : entier
debut debut debut
pour i allantde 1 a 8 pour i allantde 1 a 8 ecrire "+"
faire faire pour i allantde 1 a 8
pour j allantde 1 a 8 pour j allantde 1 a 8 faire
faire faire ecrire "-"
ecrire "x" si (i+j)%2=0 fait
fait alors ecrire "+\n"
ecrire EOL ecrire "x"
fait sinon pour i allantde 1 a 8
fin ecrire " " faire
finsi ecrire "|"
fait pour j allantde 1 a 8
ecrire EOL faire
fait si (i+j)%2=0
Autre solution construisant la solu- fin alors
tion dans une chane de caractres ecrire "x"
var i, j : entier sinon
var s : chaine ecrire " "
debut finsi
s "" fait
pour i allantde 1 a 8 ecrire "|\n"
faire fait
pour j allantde 1 a 8
faire ecrire "+"
(d) chiquier avec cases dessines.
s s + "x" pour i allantde 1 a 8
On construira la solution partir
fait faire
de celle de (c) en dplaant sim-
s s + EOL ecrire "-"
plement quelques caractres (un
fait fait
|, deux + et en dplaant 1
ecrire s ecrire "+\n"
fait.
fin fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 9


2. crire un algorithme permettant dcrire une 1 2 3 4 5 6 7 8 9 10
table de multiplication comme celle prsente ci- 2 4 6 8 10 12 14 16 18 20
contre. Dans un premier temps on ne soccupera 3 6 9 12 15 18 21 24 27 30
pas du nombre despaces entre les nombres, puis 4 8 12 16 20 24 28 32 36 40
on affinera en en tenant compte. 5 10 15 20 25 30 35 40 45 50
...
10 20 30 40 50 60 70 80 90 100

Solutions
(sans tenir compte des espaces) (en alignant correctement les colonnes)
var i, j : entier var i, j : entier
debut debut
pour i allantde 1 a 10 faire pour i allantde 1 a 10 faire
pour j allantde 1 a 10 faire pour j allantde 1 a 10 faire
ecrire i * j, " " si i*j < 100 alors ecrire " " finsi
fait si i*j < 10 alors ecrire " " finsi
ecrire EOL // Attention ici les 2 tests ne
fait // peuvent pas tre combins
fin // car si i*j<10 il faut 2 espaces
ecrire i * j, " "
fait
ecrire EOL
fait
fin

Exercice 9 Tableaux
1. Que font les algorithmes suivants ?
1 var i, n[10] entier 1 var i, n[10] entier
2 debut 2 debut
3 n[0] 1 3 pour i allantde 0 a 9
4 pour i allantde 1 a 9 4 faire
5 faire 5 n[i] 2 * i
6 n[i] n[i-1] + 2 6 fin
7 fin
Solution : Initialisation dun tableau avec les 10
Solution : Initialisation dun tableau avec les 10 premiers nombres pairs
premiers nombres impairs

2. crire un algorithme qui dclare un tableau de 10 lments et initialise toutes ses valeurs 1
Solution
var i, n[10] entier
debut
pour i allantde 0 a 9
faire
n[i] 1
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 10


3. crire un algorithme qui calcule les n premiers nombres premiers.
Solution
var premiers[], nb , n, cc, i : entier
debut
lire "Combien de nombres premiers voulez vous?", nb
dimension premiers[nb]
// Invariant de boucle: chaque itration, on connat les cc premiers
// nombres premier rangs de p[0] p[cc-1]
// version 1 // version 2
premiers[0] 1 premiers[0] 1
cc 1 cc 1
n 2 n 2
tantque cc < nb tantque cc < nb
faire faire
i 2 i 0
tantque (i < n) et (n % i 6= 0) tantque (i < cc)
faire et (n % premier[i] 6= 0)
i i + 1 faire
fait i i + 1
si i = n alors fait
premiers[cc] n si i = cc alors
cc cc+1 premiers[cc] n
finsi cc cc+1
n n+1 finsi
fait n n+1
fin fait
On peut lamliorer en remplaant (i<n) par (i< n). fin

Exercice 10 Le triangle de Pascal


crire un algorithme permettant de calculer le triangle de Pascal au rang n, dans 1
lequel la ligne i et la colonne j (0 j i) est plac le coefficient binomial Cji . 1 1
On le construit aisment par rcurrence, en remarquant qu chaque ligne i, le coef- 1 2 1
ficient numro j est la somme des coefficients j 1 et j de la ligne prcdente (pour 1 3 3 1
0 < j < i). Les lignes 1 et 2 sont initialises 1 ainsi que les coefficients 1 et i de 1 4 6 4 1
chaque ligne i. 1 5 10 10 5 1
Autrement dit :
i1
i, j | 0 < j < i, Cji = Cj1 + Cji1

0 i
Ci = Ci = 1
Solution
var i, j, n : entier
var pascal[][] : entier
debut
lire "Jusqu quelle ligne ?", n
dimension pascal[n][n]
i 0
tantque i n faire
pascal[i,0] 1
j 1
tantque j < i faire
pascal[i,j] pascal[i-1,j-1] + pascal[i-1,j]
j j + 1
fait
pascal[i,i] 1
i i + 1
fait
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 11


Exercice 11 Fonctions numriques
1. crire une fonction qui calcule la somme de 3 entiers fournis en arguments
Solution
fonction sommeDeTrois(var a, b, c : entier par valeur)
debut
retourner a+b+c
fin

2. crire une fonction qui calcule la moyenne des lments dun tableau. Le tableau et la taille du tableau sont fournis
en argument
Solution
fonction moyenne(var t[] : reel par reference, n : entier par valeur)
var s : reel
var i : entier
debut
pour i allantde 0 a n-1 faire
s s + t[i]
faire
retourner s/n
fin

3. crire une fonction qui affiche la dcomposition en facteurs premiers dun nombre. Indication : le plus petit diviseur
strictement suprieur 1 dun nombre est ncessairement premier.
Solution
fonction decomposition(var n : entier par valeur)
debut
i 2
tantque in faire
si n % i = 0 alors
n n / i
ecrire i
si n 6= 1 alors
ecrire "*"
finsi
sinon
i i + 1
finsi
fait
fin

|ab|
4. En utilisant la fonction PGCD vue en cours, crire une fonction PPCM. On rappelle que P P CM (a, b) = P GCD(a,b) .

Solution
fonction PPCM(var a, b : entier par valeur)
var m : entier
debut
m a * b
si m<0 alors
m -m
finsi
retourner m/PGCD(a,b)
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 12


Exercice 12 Fonctions de traitement de chanes de caractres
On donne le type chaine pour reprsenter les chanes de caractres. On utilisera loprateur + pour concatner des chanes
et on donne les 2 fonctions suivantes :
fonction taille(var s : chaine par variable) : renvoie la taille de la chane, en entier.
fonction charAt(var s : chaine par variable, var i : entier par valeur) :
renvoie le caractre numro i de la chane.
1. crire une fonction contient qui prend 2 chanes en paramtres en renvoie vrai si la seconde est incluse dans la
premire.
Solution
fonction contient(var s, c : chaine par reference)
debut
pour i allantde 0 a taille(s)-taille(c)+1 faire
j 0
tantque j<taille(c) et charAt(s,i+j)=charAt(c,j) faire
j j + 1
fait
si j = taille(c) alors
retourner vrai
finsi
fait
retourner faux
fin

2. crire une fonction qui purge une chane dun caractre, la chane comme le caractre tant passs en argument. Si
le caractre spcifi ne fait pas partie de la chane, celle-ci devra tre retourne intacte. Par exemple :
purge("Bonjour","o") renverra "Bnjur".
purge(" Jaime pas les espaces "," ") renverra "J aimepaslesespaces ".
purge("Moi, je men fous ", "y") renverra "Moi, je men fous".
Solution
fonction purge(var s : chaine par reference, var c : car par valeur)
var s2 : chaine
debut
s2 ""
pour i allantde 0 a taille(s) faire
si charAt(s,i) 6= c alors
s s + charAt(s,i)
finsi
fait
retourner s2
fin

3. crire deux fonctions start et end qui prennent 1 chane s et un entier n en paramtres et qui renvoient une chane
contenant respectivement les n premiers caractres et les n derniers caractres de s
Solutions
fonction start(var s : chaine par reference, var n : entier par valeur)
var s2 : chaine
debut
s2 ""
if n > taille(s) alors
n = taille(s)
finsi
pour i allantde 0 a n faire
s s + charAt(s,i)
fait
retourner s2
fin

Master Handi Universit Paris 8 2012 Algo Corrig TD 13


fonction end(var s : chaine par reference, var n : entier par valeur)
var s2 : chaine
debut
s2 ""
if n > taille(s) alors
n = taille(s)
finsi
pour i allantde 0 a n faire
s charAt(s,taille(s)-i-1) + s
fait
retourner s2
fin

4. crire une fonction middle qui prend 1 chane et 2 entiers p et q en paramtres et qui renvoie la partie de la chane
comprise entre les caractres p et q. On utilisera les fonctions dfinies prcdemment.
Solution
fonction middle(var s : chaine par reference, var p, q : entier par valeur)
debut
retourner fin(debut(s,p),q)
fin

Exercice 13 Fonctions rcursives


1. crire un algorithme de PGCD rcursif. On rappelle que si q < p alors P GCD(p, q) = P GCD(p q, q).
Solution
fonction PGCD(var p, q : entier par valeur)
debut
si p = q alors
retourner p
finsi
si q < p alors
retourner PGCD(p - q, q)
finsi
retourner PGCD(q - p, p)
fin

2. On reprend la Suite de Fibonacci, quon a dj utilise dans lexercice 6 sur les suites.

u0 = 0, u1 = 1
un+2 = un+1 + un

(a) crire une fonction rcursive de calcul des n premiers termes de cette suite. Quen pensez vous ?
Solution
fonction fibo(var n : entier par valeur)
debut
si n<2 alors
retourner n
finsi
retourner fibo(n-1)+fibo(n-2)
fin

Ce nest pas efficace du tout. La complexit est exponentielle.


Lalgo itratif vu dans lexercice 6 est bien meilleur (complexit linaire).

Master Handi Universit Paris 8 2012 Algo Corrig TD 14