Introduction aux algorithmes en informatique
Introduction aux algorithmes en informatique
— Obje tifs —
Les capacités évaluées dans cette partie de la formation sont :
• comprendre un algorithme et expliquer ce qu’il fait,
• modifier un algorithme existant pour obtenir un résultat différent,
• concevoir un algorithme répondant à un problème précisément posé,
• expliquer le fonctionnement d’un algorithme,
• écrire des instructions.
— Algorithme —
Un algorithme est une suite d’instructions, qui une fois exécutée correctement, conduit à un résultat donné.
Les manuels d’utilisation des appareils actuels de la vie courante sont essentiellement des recueils d’algo-
rithmes : des instructions sont données afin de faire fonctionner une fonction quelconque.
Les exemples de la vie courante ne manquent pas : automobiles, appareils divers, . . .
Une recette de cuisine est également un algorithme simple.
Celui-ci comporte grossièrement trois étapes :
1. Réunir les ingrédients
2. Préparer
3. Déguster
La préparation consiste à exécuter une suite d’instructions : par exemple, plonger les tomates dans une
casserole d’eau bouillante pendant quelques instants avant de les peler. On ne sait pas pourquoi il faut
procéder de la sorte et d’ailleurs, ça n’a aucune importance : la recette a été écrite par quelqu’un qui sait.
Elle marche.
En comparant avec les algorithmes de mathématiques, on pourrait dire que les ingrédients de la recette sont
les entrées du processus auxquelles on applique le traitement (la préparation) pour obtenir, en sortie, un
plat que l’on dégustera.
ellaSaL - hpesoJ tniaS tnemessilbatÉ - - IST EGPC euqitamrofnI
• Sortie :
On affiche le résultat.
Vous pourrez, pour vous entraîner, télécharger le logiciel libre AlgoBox à l’adresse suivante :
[Link]
Il existe une quantité de langages de programmation et de logiciels permettant de définir des algorithmes.
Cette année, nous serons amenés à utiliser les outils suivants :
Considérons un algorithme historiquement célèbre, l’algorithme d’Euclide, qui sert à calculer le plus grand
commun diviseur (pgcd) :
Étant donnés deux entiers, retrancher le plus petit au plus grand et recommencer jusqu’à ce que les deux
nombres soient égaux. La valeur obtenue est le plus grand diviseur commun. L’idée de départ est de prendre
les 2 nombres et tant qu’ils ne sont pas égaux, de retirer le plus petit au plus grand.
L’algorithme se présente sous la forme suivante :
1: VARIABLES
2: a : int # "int" signifie entier comme integer
3: b : int
4: DEBUT_ALGORITHME
5: TANT_QUE a et b sont différents FAIRE
6: DEBUT_TANT_QUE
7: SI a est le plus grand ALORS
8: DEBUT_SI
9: remplacer a par a - b
e l s e : b=b−a
return a / * CODE C * /
i n t pgdc ( i n t a , i n t b )
{
# CODE JAVA while ( a != b ) {
p u b l i c s t a t i c i n t p g cd ( i n t a , i f ( a >b ) a=a−b ;
int b) { e l s e b=b−a ; }
w h i l e ( a ! =b ) { return a ;
i f ( a >b ) a=a−b }
e l s e b=b−a
}
return a ; # CODE RUBY
} d e f pgdc ( a , b )
w h i l e a ! =b
i f a >b t h e n a=a−
( * Code OCaml * ) b
l e t r e c p g cd ( a , b ) = e l s e b=b−a end
i f a = b then a els e end
i f a > b then a
p g cd ( a−b , b ) end
e l s e p g cd ( a , b−a )
;;
; Code Scheme
( d e f i n e ( pgdc a b )
Rem Code OOBasic ( co n d
F u n c t i o n Pgdc ( ByVal a As I n t e g e r (( < a b ) ( pgdc a
, (− b a ) ) )
ByVal b (( > a b ) ( pgdc
As (− a b ) b ) )
Integer ( else a )
) As )
)
Integer
Le langage naturel, pour nous, est le français. Nous utiliserons seulement des mots simples, le texte doit
être clair et bien structuré. »
On sait que la longueur d’un segment AB est définie par : AB = (xB − xA )2 + (yB − yA )2 .
On peut construire l’algorithme suivant :
Ou sous forme d’organigramme :
Variables :
xA est l’abscisse de A Début
yA est l’ordonnée de A
xB est l’abscisse de B
yB est l’ordonnée de B
D est la distance entre A et B Lire
entrées xA , yA , xB , yB
Initialisation, entrées :
Saisir xA
Saisir yA
Calculer D :
Saisir xB calculs p
(xB − xA )2 + (yB − yA )2
Saisir yB
Traitement :
» prend la valeur
D
sortie Afficher D
(xB − xA )2 + (yB − yA )2
Sortie :
Afficher la valeur de D
Fin
Python est un langage de programmation facile à utiliser et puissant. Il offre des structures de données de
haut niveau et une approche simple mais réelle de la programmation.
Il est téléchargeable à l’adresse :
[Link]
[Link] :
1 # -*- coding: utf-8 -*-
2
3 from math import sqrt
4 # ou from math import *
5
6 # commentaire : entrée des données
7 print ("Entrez l’abscisse de A")
8 x_A = float(input())
9 print ("Entrez l’ordonnée de A")
10 y_A = float(input())
11 print ("Entrez l’abscisse de B")
12 x_B = float(input())
13 print ("Entrez l’ordonnée de B")
14 y_B = float(input())
15 # calcul de la distance (commentaires)
16 d = sqrt((x_B-x_A)**2+(y_B-y_A)**2)
17 # affichage du résultat
18 print ("La distance entre A et B est :")
19 print (d)
20 # affichage du résultat arrondi
21 print("Avec 2 décimales, cela donne : %.2f" %d)
⇒ Activité 2. 1
Construisez un algorithme en langage naturel qui permet de déterminer les coordonnées du milieu I d’un
segment [AB] connaissant les coordonnées de A et de B dans un repère quelconque.
Initialisation, entrées :
Saisir xA
Saisir yA
Saisir xB calculs
Saisir yB
Afficher xI
sortie
Afficher yI
Fin
[Link] :
1 # -*- coding: utf-8 -*-
2
3 from math import *
4
5 # commentaire : entrée des données
6 print ("Entrez l’abscisse de A")
7 x_A = float(input())
8 print ("Entrez l’ordonnée de A")
9 y_A = float(input())
10 print ("Entrez l’abscisse de B")
11 x_B = float(input())
12 print ("Entrez l’ordonnée de B")
13 y_B = float(input())
14
15 # calcul des coordonnées du milieu
16 x_I = (x_A+x_B)/2
17 y_I = (y_A+y_B)/2
18
19 # affichage du résultat
20 print ("Le milieu a pour coordonnées :")
21 print (x_I, y_I)
22 # affichage du résultat arrondi
23 print("Avec 2 décimales, cela donne \
24 %.2f pour l’abscisse et \
25 %.2f pour l’ordonnée" %(x_I,y_I))
26 # \ permet de passer à la ligne
— Remarque —
Les commentaires seront placés après le symbole # comme dans python pour faciliter la lecture.
⇒ Activité 2. 2
On considère l’algorithme suivant :
1: VARIABLES
2: x : int # "int" signifie entier comme integer
3: y : int
4: z : int
5: DEBUT_ALGORITHME
6: x ← 2 # x prend la valeur 2
7: y←3
8: z ←x+y
9: FIN_ALGORITHME
Algorithme 3 : Valeurs de x, y z
⇒ Activité 2. 3
On considère l’algorithme suivant :
1: VARIABLES
2: x : int
3: DEBUT_ALGORITHME
4: x ←2
5: x←x+1
6: FIN_ALGORITHME
Algorithme 4 : Valeur de x
⇒ Activité 2. 4
⇒ Activité 2. 5
On considère l’algorithme suivant :
1: VARIABLES
2: y : int
3: DEBUT_ALGORITHME
4: y←2
5: y←y+1
6: y ← 4∗y
7: FIN_ALGORITHME
Algorithme 5 : Valeur de y
⇒ Activité 2. 6
On considère l’algorithme suivant :
1: VARIABLES
2: a : int
3: b : int
4: c : int
5: DEBUT_ALGORITHME
6: a←5
7: b←3
8: c←a+b
9: b←b+a
10: a←c
11: FIN_ALGORITHME
Algorithme 6 : Valeurs de a, b, c
⇒ Activité 2. 7
On considère l’algorithme suivant :
1: VARIABLES
2: x : int
3: y : int
4: z : int
5: ENTRÉES
6: LIRE x
7: SORTIES
8: AFFICHER z
9: DEBUT_ALGORITHME
10: y ← x−2
11: z ← −3 ∗ y − 4
12: AFFICHER z
13: FIN_ALGORITHME
Algorithme 7 : Afficher z
On cherche maintenant à obtenir un algorithme équivalent sans utiliser la variable y. Complétez la ligne 9
dans l’algorithme ci-dessous pour qu’il réponde au problème.
1: VARIABLES
2: x : int
3: z : int
4: ENTRÉES
5: LIRE x
6: SORTIES
7: AFFICHER z
8: DEBUT_ALGORITHME
9: z ← .......
10: AFFICHER z
11: FIN_ALGORITHME
SI...ALORS...SINON
Comme nous l’avons vu ci-dessus, un algorithme permet d’exécuter une liste d’instructions les unes à
la suite des autres. Mais on peut aussi "dire" à un algorithme de n’exécuter des instructions que si une
certaine condition est remplie. Cela se fait grâce à la commande SI...ALORS :
SI...ALORS
DEBUT_SI
...
ellaSaL - hpesoJ tniaS tnemessilbatÉ - - IST EGPC euqitamrofnI
FIN_SI
Il est aussi possible d’indiquer en plus à l’algorithme de traiter le cas où la condition n’est pas vérifiée
avec la commande SINON. On obtient alors la structure suivante :
SI...ALORS
DEBUT_SI
...
FIN_SI
SINON
DEBUT_SINON
...
FIN_SINON
⇒ Activité 2. 8
On cherche à créer un algorithme qui demande un nombre à l’utilisateur et qui affiche la racine carrée de ce
nombre s’il est positif. Complétez la ligne 9 dans l’algorithme ci-dessous pour qu’il réponde au problème.
1: VARIABLES
2: x : int
3: racine : float
4: ENTRÉES
5: LIRE x
6: SORTIES
7: AFFICHER racine
8: DEBUT_ALGORITHME
9: SI (.........) ALORS
10: DEBUT_SI
11: racine ← sqrt(x)
12: AFFICHER racine
13: FIN_SI
14: FIN_ALGORITHME
⇒ Activité 2. 9
On cherche à créer un algorithme qui demande à l’utilisateur d’entrer deux nombres entiers (stockés dans
les variables x et y) et qui affiche le plus grand des deux. Complétez les lignes 12 et 16 dans l’algorithme
ci-dessous pour qu’il réponde au problème.
1: VARIABLES
2: x : int
3: y : int
4: ENTRÉES
5: LIRE x
6: LIRE y
7: SORTIES
8: AFFICHER le plus grand des deux (x, y)
9: DEBUT_ALGORITHME
10: SI (x > y) ALORS
11: DEBUT_SI
12: AFFICHER .......
13: FIN_SI
14: SINON
15: DEBUT_SINON
16: AFFICHER ......
17: FIN_SINON
18: FIN_ALGORITHME
Algorithme 10 : Comparaison
⇒ Activité 2. 10
On considère l’algorithme suivant :
1: VARIABLES
2: a : int
3: b : int
4: DEBUT_ALGORITHME
5: a←1
6: b←3
7: SI (a > 0) ALORS
8: DEBUT_SI
⇒ Activité 2. 11
On cherche à concevoir un algorithme correspondant au problème suivant :
1: VARIABLES
2: x : int
3: y : int
4: ENTRÉES
5: LIRE .....
6: SORTIES
7: AFFICHER ......
8: DEBUT_ALGORITHME
9: SI (........) ALORS
10: DEBUT_SI
11: ....... ← .......
12: AFFICHER .......
13: FIN_SI
14: FIN_ALGORITHME
Algorithme 12 : Inverse
2.3.3 Boucles
Boucles POUR...DE...A
• Les boucles permettent de répéter des instructions autant de fois que l’on souhaite.
• Lorsqu’on connaît par avance le nombre de fois que l’on veut répéter les instructions, on utilise
une boucle du type POUR...DE...A... dont la structure est la suivante :
POUR...ALLANT_DE...A...
ellaSaL - hpesoJ tniaS tnemessilbatÉ - - IST EGPC euqitamrofnI
DEBUT_POUR
...
FIN_POUR
• Exemple : l’algorithme ci-dessous permet d’afficher la racine carrée de tous les entiers de 1 jusqu’à
50. La variable n est appelée « compteur de la boucle ».
1: VARIABLES
2: n : int
3: racine : float
4: SORTIES
5: AFFICHER racine
6: DEBUT_ALGORITHME
7: POUR n ALLANT_DE 1 A 50
8: DEBUT_POUR
9: racine ← sqrt(n)
10: AFFICHER racine
11: FIN_POUR
12: FIN_ALGORITHME
Algorithme 13 : Racine carrée 2
— Remarques —
• La variable servant de compteur pour la boucle doit être du type NOMBRE et doit être déclarée
préalablement (comme toutes les variables).
• Sauf précision, cette variable est automatiquement augmentée de 1 à chaque fois.
• On peut utiliser la valeur du compteur pour faire des calculs à l’intérieur de la boucle, mais les ins-
tructions comprises entre DEBUT_POUR et FIN_POUR ne doivent pas modifier la valeur de la variable
qui sert de compteur.
⇒ Activité 2. 12
On cherche à concevoir un algorithme qui affiche, grâce à une boucle POUR...DE...A, les résultats des
calculs suivants : 8 ∗ 1, 8 ∗ 2, 8 ∗ 3, 8 ∗ 4, . . . jusqu’à 8 ∗ 10.
La variable n sert de compteur à la boucle et la variable produit sert à stocker et afficher les résultats.
Complétez les lignes 7 et 9 dans l’algorithme ci-dessous pour qu’il réponde au problème :
1: VARIABLES
2: n : int
3: produit : int
4: SORTIES
5: AFFICHER produit
6: DEBUT_ALGORITHME
7: POUR n ALLANT_DE .... A .....
8: DEBUT_POUR
9: produit ← .......
10: AFFICHER produit
11: FIN_POUR
12: FIN_ALGORITHME
Algorithme 14 : Table de 8
⇒ Activité 2. 13
• Lorsque le compteur n de la boucle vaut 1 et après exécution du calcul de la ligne 11, la variable
somme vaut : .
• Lorsque le compteur n de la boucle vaut 2 et après exécution du calcul de la ligne 11, la variable
somme vaut : .
• Lorsque le compteur n de la boucle vaut 3 et après exécution du calcul de la ligne 11, la variable
somme vaut : .
⇒ Activité 2. 14
Complétez les lignes 9 et 11 de l’algorithme ci-dessous pour qu’il permette de calculer la somme 52 + 62 +
25
X
72 + · · · + 242 + 252 , c’est-à-dire la somme n2 .
5
1: VARIABLES
2: n : int
3: somme : int
4: SORTIES
5: AFFICHER somme
6: INITIALISATION
7: somme ← 0
8: DEBUT_ALGORITHME
9: POUR n ALLANT_DE .... A ......
10: DEBUT_POUR
11: somme ← somme+......
12: FIN_POUR
13: AFFICHER somme
14: FIN_ALGORITHME
Cette structure de boucle permet de répéter une série d’instructions (comprises entre DE-
1: VARIABLES
2: n : int
3: SORTIES
4: AFFICHER n
5: INITIALISATION
ellaSaL - hpesoJ tniaS tnemessilbatÉ - - IST EGPC euqitamrofnI
6: n ← 583
7: DEBUT_ALGORITHME
8: TANT_QUE n >= 25 FAIRE
9: DEBUT_TANT_QUE
10: n ← n − 25
11: FIN_TANT_QUE
12: AFFICHER n
13: FIN_ALGORITHME
Algorithme 17 : Tant que
— Remarques —
• Si la condition du TANT QUE est fausse dès le début, les instructions entre DEBUT_TANT_QUE et
FIN_TANT_QUE ne sont jamais exécutées (la structure TANT QUE ne sert alors strictement à rien).
• Il est indispensable de s’assurer que la condition du TANT QUE finisse par être vérifiée (le code entre
DEBUT_TANT_QUE et FIN_TANT_QUE doit rendre vraie la condition tôt ou tard), sans quoi l’algorithme
ne pourra pas fonctionner.
⇒ Activité 2. 15
On cherche à connaître le plus petit entier N tel que 2N soit supérieur ou égal à 10000. Pour résoudre ce
problème de façon algorithmique :
• On utilise une variable N à laquelle on donne au début la valeur 1.
• On augmente de 1 la valeur de N tant que 2N n’est pas supérieur ou égal à 10000.
Une structure TANT QUE est particulièrement adaptée à ce genre de problème car on ne sait pas a priori
combien de calculs seront nécessaires.
Compléter les lignes 8 et 10 de l’algorithme ci-dessous pour qu’il réponde au problème :
1: VARIABLES
2: N : int
3: SORTIES
4: AFFICHER N
5: INITIALISATION
6: N ←1
7: DEBUT_ALGORITHME
N
8: TANT_QUE 2 ....... FAIRE
9: DEBUT_TANT_QUE
10: N ← .......
11: FIN_TANT_QUE
12: AFFICHER N
13: FIN_ALGORITHME
Algorithme 18 : 2 puissance N
⇒ Activité 2. 16
On considère le problème suivant :
• On lance une balle d’une hauteur initiale de 3 m.
• On suppose qu’à chaque rebond, la balle perd 10% de sa hauteur (la hauteur est donc multipliée par
0,9 à chaque rebond).
• On cherche à savoir le nombre de rebonds nécessaire pour que la hauteur de la balle soit inférieure
ou égale à 10 cm.
Complétez les lignes 10 et 13 de l’algorithme ci-dessous pour qu’il réponde au problème.
1: VARIABLES
2: nombre_rebonds : int
3: hauteur : float
4: SORTIES
5: AFFICHER nombre_rebonds
6: INITIALISATION
7: nombre_rebonds ← 0
8: DEBUT_ALGORITHME
9: hauteur ← 300
10: TANT_QUE (hauteur......) FAIRE
11: DEBUT_TANT_QUE
12: nombre_rebonds ← nombre_rebonds + 1
⇒ Activité 2. 17
Écrivez une fonction qui prend en entrée un entier naturel a et retourne (c’est-à-dire renvoie) cet entier
écrit à l’envers. Par exemple, si a = 1234, la fonction devra retourner a = 4321. Vous pourrez utiliser les
fonctions quotient(n, p) et reste(n, p) qui donnent le quotient et le reste de la division de n par p.
— Remarque —
La fonction return signifie "retourner", c’est-à-dire "envoyer en retour" ou "renvoyer"
L’idée est que si l’on prend le reste de a dans la division par 10, on récupère le dernier chiffre, et si on prend
le quotient, on récupère a privé de son dernier chiffre. Il suffit d’itérer le procédé, en décalant à chaque fois
le résultat provisoire vers la gauche.
1: VARIABLES
2:
3:
4: ENTRÉES
5: LIRE a
6: SORTIES
7: AFFICHER b "inverse" de a
8: INITIALISATION
9:
10: DEBUT_ALGORITHME
11: TANT_QUE ................. FAIRE
12: DEBUT_TANT_QUE
13:
14:
15:
16: FIN_TANT_QUE
17: AFFICHER b
18: FIN_ALGORITHME
Algorithme 20 : Renversement