Académique Documents
Professionnel Documents
Culture Documents
Chapitre 1
Chapitre 1
Notions algorithmiques
1.1 Introduction
Dans ce premier chapitre, nous allons introduire les notions de base de l’algorithmique ;
nous allons voir comment à partir d’un problème concret nous arriverons à proposer une
solution écrite sous forme d’un algorithme.
Définition 1.1
1
2 1.2. NOTIONS DE BASE
Définition 1.2
Définition 1.3
Définition 1.4
La programmation est considérée comme l’aboutissement d’une série des étapes Le pro-
cessus montré par la figure 1.1, représente la chaîne de la production d’un programme. Dans
ce processus, l’algorithmique et l’algorithme forment sa phase la plus importante. Parce que,
un algorithme exprime la structure logique d’un programme informatique, qui sera traduite
vers le langage de programmation choisi.
De l’autre coté, le processus montre les différents modes d’exécution d’un programme
source qui sont :
— Compilation : La compilation consiste à traduire la totalité du code source en une fois.
Le compilateur lit le programme entier et produit une nouvelle suite de codes appelé
code objet, qui peut désormais être exécuté par l’ordinateur. Les langages C, C++,
Pascal sont des exemples de langages compilés.
— Interprétation : L’interprétation consiste à traduire le programme ligne par ligne en
quelques instructions du langage machine, qui sont ensuite directement exécutées. Les
langages Lisp et Prolog sont des exemples de langages interprétés.
— Semi-compilation : La semi-compilation est la combinaison des deux techniques afin de
retirer le meilleur de chacune. C’est le cas des langages Python et Java par exemple.
Définition 1.5
Algorithme : c’est une suite ordonnée et finie d’instructions qui montre la démarche à
suivre pour résoudre un problème.
D’après cette définition, on comprend qu’un algorithme ne résout pas le problème, mais
plutôt il donne une série des étapes, si elles sont bien suivies, elles se termineront par une
solution pour le problème.
Définition 1.6
Algorithmique : c’est l’ensemble des méthodes permettant de définir et/ou d’étudier des
algorithmes.
Exemple 1.1. Changer un pneu crevé d’une voiture, les 9 étapes suivantes expliquent com-
ment changer une roue crevée :
1. Serrez le frein à main et passez la première vitesse ;
2. Placez le triangle de panne à la distance réglementaire ;
3. Desserrez légèrement les écrous du pneu ;
4. Installez le cric ;
5. Dévissez complètement les écrous de la roue ;
6. Placez la nouvelle roue ;
7. Mettez tous les écrous sans trop les serrer ;
8. Redescendez la voiture et retirez le cric ;
9. Serrez bien tous les écrous.
Dans ce cours, nous nous intéresserons aux instructions disponibles dans le langage de
programmation Python et nous choisirons d’exprimer les solutions dans ce langage
de programmation sans passer par un langage algorithmique intermédiaire. En plus,
malgré les différences, nous nous utiliserons les termes : (algorithme/programme) et
(algorithmique/ programmation) d’une manière interchangeable.
Comme nous l’avons dit avant, l’algorithme s’agit d’une suite des étapes à suivre pour
résoudre un problème. La résolution du problème commence par une étude qui permet d’ex-
traire de l’énoncé du problème des éléments de modélisation c’est ce qu’on appelle l’analyse
du problème. L’analyse (voir Figure 1.2), permet de comprendre le problème pour déter-
miner les données nécessaires à utiliser pour résoudre le problème, les résultats souhaités. En
suite d’expliquer la méthode de résolution, c’est-à-dire, les étapes à suivre qui, en partant des
données nous conduisant aux résultats tout en respectant un ordre précis. L’étape d’analyse
permet de répondre aux trois questions suivantes, pour mieux comprendre le problème :
1. Quelles sont les données nécessaires (les entrées) ;
2. Quelles sont les étapes à suivre pour arriver aux résultats et comment utiliser les
données( le traitement) ;
3. Quels sont les résultats attendus (les sorties).
Toutes les données manipulées par un algorithme sont des objets, et les opérations et actions
qui agissent sur les objets s’appellent des Instructions ou (Statements).
En algorithmique, il existe plusieurs types d’instructions et d’objets, ce qu’on va voir dans
ce qui suit.
Définition 1.7
En informatique, un objet est un espace mémoire, qui contient des informations et des
mécanismes concernant un sujet, manipulés dans un programme. Il est désigné par un
nom ou une appellation dite : identificateur, et un type (la classe a laquelle il appartient).
a.blaIdentificateur
Définition 1.8
Syntaxe 1. bla
— On appelle lettre un caractère de 0 a0 ..0 z 0 ou0 A0 ..0 Z 0 ou0 _’ ;
— On appelle digit un caractère de ’0’..’9’ ;
— Un identificateur algorithmique (Python) est une suite de lettres ou de digits accolés,
de longueur quelconque, commençant par une lettre ;
Ex. 1. bla
x, Y1, jour, mois, note, adresse, nom_etudiant, NbCouleurs : sont des identificateurs valides.
1x, nom_étudiant, nb couleurs, @ : sont des identificateurs non-valides.
note, Note : sont des identificateurs différents.
true, false sont deux identificateurs valides, ils ne représentent pas la même chose que les
deux mots réserves True et False ( 1.4).
b.blaConstantes
Définition 1.9
Une constante est un objet qui associe un nom à une valeur, cette valeur ne doit pas être
modifiée, et ne peut pas être une expression.
Remarque 1.2
En Python, les constantes sont généralement déclarées et affectées dans un module (un
nouveau fichier) qui est importé dans le fichier du programme principal. À l’intérieur
du module, les constantes sont écrites en MAJUSCULES et des traits de soulignement
séparant les mots.
Syntaxe 2. blabla
IDENTIFICATEUR = valeur_constante
Ex. 2. bla
PI = 3.14 ; GRAVITATION = 10
Remarque 1.3
c.blaVariables
Définition 1.10
Une variable est un objet qui associe un nom à une valeur qui peut éventuellement être
modifiée ou changée ultérieurement dans le programme.
Syntaxe 3. blabla
identificateur = valeur
Ex. 3. blabla
nom = "mohamed"
note = 15
note = 17.5 (ici nous avons modifié la valeur associée à la variable note).
Définition 1.11
Un type décrit un ensemble de valeurs qui peut prendre un objet de ce type ainsi que
l’ensemble d’opérateurs sur ces valeurs.
En Python et dans ce chapitre, nous nous intéressons aux quatre types de base :
— int : Entier, représente une quantité indivisible (leurs valeurs possibles ne comportent
pas de virgule.) ;
— float : Réel, représente les valeurs numériques fractionnelles et avec des virgules flot-
tantes ;
— str : String, représente tous les caractères imprimables, il peut être une lettre alphabé-
tique (A. . . Z, a. . . z) ou un caractère spécial ( ?, +, -, *, /, !,. . . ) ou un chiffre (1. . . 9).
Une valeur de ce type peut être une séquence d’un ou plusieurs caractères ;
— bool : Booléen, autrement dit le type logique, il représente les deux valeurs vrai (True)
et faux (False).
Il existe autres types de données en Python, ce sont des types de données composés à
savoir : list, dict, tuple, que nous allons les traiter dans les prochaines chapitres.
Remarque 1.4
Une variable n’a pas de type propre : elle a le type de l’objet qu’elle référence. c’est ce
qu’on appelle le typage dynamique.
Ex. 4. blabla
x = 3 blabla → x est de type int.
x = 4.5 blabla → x est devenue de type float.
x = ’salut’ bla → cette fois-si, x prend comme type str.
Remarque 1.5
En Python, le type bool est en fait une forme de type entier. La valeur booléenne True
signifie la valeur entière 1, et la valeur booléenne False signifie la valeur entière 0.
1.3.2 Expressions
Définition 1.12
Les expressions sont composées des objets (constantes, variables, valeurs) et/ou des fonc-
tions appelés opérandes liés par des opérateurs. Une expression donne une valeur comme
résultat après son évaluation.
Dans ce chapitre, nous représentons les opérateurs de base qui s’appliquent sur les types
de base vu au dessus. Ces opérateurs sont représentés dans le Tableau 1.1.
Remarque 1.6
Python possède autres types que les types de base présentés dans ce chapitre, et par
conséquent leur ensemble des opérateurs. Nous allons découvrir ces types dans les cha-
pitres suivants.
Remarque 1.7
Les parenthèses et les fonctions (à voir ultérieurement) sont considérées comme des
opérateurs primaires.
On évalue les expressions logiques par l’utilisation des tables de vérité, voir Figure 1.5 .
Domaine Opération Signification Types Exemple Résultat
+ addition 5+7 12
− soustraction 6−4 2
∗ multiplication 2∗7 14
Arithmétique ∗∗ puissance int, float, bool 2 ∗ ∗3 8
/ division 7/3 3.5
% reste de la division (modulo) 7%3 1
// quotient 7//3 2
+ concaténation ’bon’ + ’jour’ bonjour
∗ répétition ’ab’ ∗ 3 ababab
Chaînes de caractères str
in appartenance ’a’ in ’bgas’ True
not in non appartenance ’a’ not in ’ bgas’ False
and et logique x and y
Logique or ou logique bool x or y voir Figure 1.5
not non logique not x
> supériorité 6>5 True
< infériorité 6<5 False
Comparaison == égalité 6 == 6 True
int, float
relationnel <= supérieur ou égal 6 <= 6 True
>= inférieur ou égal 5>= 6 True
!= non égalité 6 != 5 True
Figure 1.5 – Les tables de vérité pour les opérateurs and, or et not.
Pour une évaluation correcte de l’expression, elle doit être bien écrite et bien formée. Si
l’expression contient plusieurs opérandes et opérateurs, il faudra mieux les organiser par des
parenthèses selon le sens voulu par l’expression. Il faut aussi respecter l’association (opéra-
teur/opérande) selon leur application comme le montre le Tableau 1.1.
L’expression bien formée a un type qui dépend des règles d’évaluation de l’expression.
Ex. 5. blabla
— 5 and 7 : une expression mal formée, on ne peut pas appliquer l’opérateur logique sur
des opérandes numériques.
— 5 + 3 ∗ 2 : une expression peut être mal formée, car elle donne un résultat égal 11 alors
que peut être, on est en train de chercher à calculer 5 + 3 en premier puis le multiplier
par 2, le mieux est d’utiliser les parenthèses pour expliquer le sens d’évaluation.
Remarque 1.8
Comme nous avons mentionné dans la remarque 1.5, True et False représente respective-
ment les deux valeurs 1 et 0. Par conséquent, True + Flase donne 1, True > False donne
True .
Règles d’évaluation
En algorithmique, les différents opérateurs sont classés par ordre de priorité. Dans une
expression, les opérateurs de plus forte priorité étant évalués avant ceux de faible priorité, et
lorsque deux opérateurs sont de priorité égale, on évalue de gauche à droite.
En algorithmique (Python), les priorités sont classées comme dans la liste suivante, com-
mençant par la priorité la plus forte, les opérateurs sur la même ligne ayant une priorité
égale :
1. Parenthèses
2. la puissance ** ;
3. le moins unitaire, le plus unitaire ;
4. *, /, //, % ;
5. +, - ;
6. in, not in, >, >=, <,<=, ==, != ;
7. not ;
8. and ;
9. or.
Solution : voir Figure 1.6 pour l’expression E1, et Figure 1.7 pour l’expression E2.
L’évaluation de l’expression E3 donne -4.0.
Définition 1.13
Syntaxe 5. blabla
Variable = variable1
Variable = valeur
Variable = constante
Variable = expression
Ex. 6. blabla
X=Y
Z=5
Si on veut mettre plusieurs instruction sur la même ligne, il faudra les séparées par un point
virgule ’ ;’.
Y = X + Z – 2 ; T = True ; P = ’S’
Principes : blabla
Remarque 1.9
En Python, l’affectation peut être écrite sous une forme contractée. Voir Tableau 1.2.
Ex. 7. blabla
x = y = z = 4 blablablablatoutes les variables reçoivent la valeur 4.
On peut aussi effectuer des affectations parallèles à l’aide d’un seul opérateur.
Ex. 8. blabla
x,y,z = a, ’salut’, 5 blablaéquivalent à x = a ; y = ’salut’ ; z = 4
Remarque 1.10
Définition 1.14
Une instruction de sortie des données correspond à l’opération d’affichage des valeurs
des variables après traitement.
L’affichage se ferra sur l’écran ou sur un outil de sortie. Cette instruction permet aussi
d’afficher des messages (chaîne de caractères).
Syntaxe 6. blabla
— print(variable)
— print(variable1, variable2,. . . , variable_n)
— print(’ message’) ; print("message")
— print (valeur)
— print(constante)
— print(expression)
Ex. 9. blabla
print( X, Y) ; print(10) ; print(’ cours de programmation’) ; print(X + Y - 3) ; print(’Mon
nom est : ’, nom)
Dans un programme, il est très pratique de pouvoir demander à l’utilisateur de saisir une
donnée.
Définition 1.15
Une instruction d’entrée de données correspond à l’opération de saisir des valeurs et les
attribuer aux variables.
La saisie se fait via le clavier ou un outil d’entrée des données. La valeur sera stockée dans
un emplacement mémoire.
On peut utiliser la fonction input() en laissant les parenthèses vides, comme on peut
placer en argument un message explicatif destiné à l’utilisateur.
Syntaxe 7. blabla
Remarque 1.11
Si nous souhaitons que l’utilisateur nous donne une valeur numérique, nous devrons convertir
la valeur entrée en une valeur numérique du type qui nous convient, par l’intermédiaire des
fonctions et méthodes prédéfinies et intégrées. C’est ce que nous allons découvrir dans la
section suivante.
Syntaxe 8. blabla
— Saisir une valeur entière : blabla x = int(input()) ;
— Saisir une valeur flottante : blabl y = f loat(input()) ;
Remarque 1.12
Figure 1.8 présente l’exécution sous console (shell) des deux instructions avec et sans
conversion de type, et démontre le type de résultat pour chaque instruction.
Bien-que Python possède d’autres fonctions prédéfinies comme par exemple :
1. len() qui renvoie la taille d’une chaîne de caractère (taille d’un objet de type str) ;
2. min() et max() qui retournent respectivement le plus petit et le plus grand élément
d’un ensemble de données ou de variables ;
3. abs() qui renvoie la valeur absolue de son argument.
.
Remarque 1.13
Syntaxe 9. blabla
Parmi les modules disponibles, nous nous intéressons par le module math qui contient
des fonctions mathématiques comme la racine carrée sqrt(), le cosinus cos(), le sinus sin(),
etc.
1.4 Exemples
Dans cette partie, on va voir des solutions complètes pour quelques exemples de problèmes
simples.
Exemple 1.4. Écrire un algorithme qui calcule la distance entre deux points sur un plan
cartésien.
L’analyse du problème :
— Les entrées : les coordonnées des deux points A et B,(Ax, Ay)et(Bx, By) ;
— Le traitement : D= racine_carrée((Bx - Ax)**2 + (By - Ay)**2) ;
— Les sorties : la distance D entre A et B ;
La transformation de la solution et l’écriture d’algorithme : (voir Listing 1.1).
1 import math
2 # la saisie des entrees
3 ax = float ( input ( " Donner l abscisse du point A : " ) )
4 ay = float ( input ( ’ Donner l ordonnee du point A : ’) )
5 bx = float ( input ( ’ Donner l abscisse du point B : ’) )
6 by = float ( input ( ’ Donner l ordonnee du point B : ’) )
7 # le calcul de la distance
8 distance = math . sqrt (( bx - ax ) **2 + ( by - ay ) **2)
9 # l ’ affichage du resultat
10 print ( " la distance entre le point A et B = " , distance )
Remarque 1.14
Dans un éditeur Python, on peut choisir notre mode d’écriture du programme, soit dans
la fenêtre script soit dans la console (shell)
La fenêtre script d’un éditeur Python est le lieu où le programmeur rédige son code (pro-
gramme : les instructions et fonctions), qui peut être par la suite enregistré pour utilisation
et modification ultérieures. Alors que la console (shell) est l’endroit où s’exécutent le pro-
gramme, c’est l’endroit aussi là où l’utilisateur tape les entrées demandées par le programme.
La console peut être aussi utilisée pour tester une partie du programme ou une instruction
pour vérifier son bon déroulement sans avoir besoin d’exécuter tout le programme, notamment
si ce dernier est assez long.
Pour le code Python sous la fenêtre script et son exécution sous la console, voir Figure
1.9.
La trace d’exécution :
Les lignes de code du programme sont numérotées par ordre croissant de la première instruc-
tion jusqu’à la dernière (les commentaires ne sont pas inclus dans la trace), l’exécution est
séquentielle, elle donne la table suivante : (voir Figure 1.10)
Exemple 1.5. Écrire un algorithme qui calcule les surfaces et les périmètres : d’un rectangle
et d’un disque. Exploiter la solution pour déduire la surface et le volume d’un cylindre formé
à base de ce disque.
L’analyse du problème :
On doit découper le problème en sous-problème et on résout chacun des sous-problèmes à
part, puis on les regroupe dans la solution finale.
Le premier sous-problème est constitué des calculs des périmètres et surface des objets
(rectangle et cercle), tandis que le deuxième est de calculer la surface et le volume du cylindre
à partir de la solution trouvée pour le premier problème.
Sous-problème 1 :
— Les entrées : pour le rectangle, on a besoin de :( longueur Lo, largeur La), pour le
disque (rayon R) ;
— Le traitement : P r = 2 ∗ (Lo + La), Sr = Lo ∗ La, P d = 2 ∗ R ∗ P i, Sd = R ∗ ∗2 ∗ P i
— Les sorties : afficher le périmètre Pr, surface Sr pour le rectangle, et surface Sd,
périmètre Pd pour le disque.
Sous-problème 2 :
— Les entrées : pour le volume, on a besoin de la surface de la base donc Sd et la hauteur
du cylindre H. Pour sa surface, on a besoin de la surface de ses deux bases inférieure
et supérieure Sd et la surface de son coté Sc (son coté est formé d’un rectangle de
largeur H et longueur égale au périmètre du disque).
— Le traitement :Sc = 2 ∗ Sd + H ∗ P d, V c = Sd ∗ H
— Les sorties : la surface Sc et volume Vc.
La transformation de la solution et l’écriture de l’algorithme :
L’algorithme est composé de deux parties des sous-problèmes traitées dans la phase d’analyse.
Voir Listing 1.2 pour le code et la Figure 1.11 pour son exécution.