Introduction à l'Algorithmique et au C
Introduction à l'Algorithmique et au C
1ère Année GC
Ecole Hassania des Travaux Publics
Karim Guennoun
1
Plan du cours
2
Partie 1:
Algorithmique
3
Un algorithme, c’est quoi?
Origine étymologique:
– Vient du nom du mathématicien Al Khawarizmi latinisé en
« algoritmi »
Définitions:
– Académie Française: Méthode de calcul qui indique la
démarche à suivre pour résoudre une série de problèmes
équivalents en appliquant dans un ordre précis une suite
finie de règles.
– Wikipedia: Un algorithme est un moyen pour un humain de
présenter la résolution par calcul d’un problème à une autre
personne physique (un autre humain) ou virtuelle (un
4 calculateur)
Pour faire simple:
Un algorithme est une suite d’instructions, d’actions permettant de
résoudre un problème donné
– Aller quelque part: le chemin
– Réaliser un plat de cuisine: la recette
– Faire un calcul mathématique: la méthode
La granularité des instructions correspond au contexte d’utilisation
de l’algorithme
– Le chemin: l’interlocuteur
– La recette : Le cuisiner
– Le calcul: Les bibliothèques et la puissance de l’ordinateur
Heureusement, les ordinateurs sont à peu près aussi idiots les uns
que les autres: même types d’instructions élémentaires
5 compréhensibles
Qualités d’un bon concepteur
d’algorithmes
L’intuition:
– Pas de méthode universelle absolue pour résoudre
un problème
La rigueur et la logique
– La méthodologie, la capacité à se mettre à la place
de la machine et d’être aussi idiot qu’elle!
L’expérience
– Renforce les deux premiers points
– Plus on écrit d’algorithmes, plus on est performant à
6 le faire
Algorithmique Vs programmation
Un langage de programmation n’est que l’outil de
réalisation de l’algorithme
L’algorithme permet de concevoir la solution alors
que la programmation permet de la mettre en œuvre
L’algorithme est généralement à un niveau
d’abstraction plus haut que la programmation
Il est, cependant, nécessaire de prendre en compte
la nature, la puissance et l’expressivité du langage
de programmation avant de concevoir l’algorithme
7
Les variables
8
L’intérêt des variables
Parfois, il est nécessaire de stocker de l’information
au cours du calcul effectué par un algorithme
– Pour additionner deux valeurs, j’ai besoin de stocker ces
deux valeurs
– Pour additionner trois valeurs, j’ai besoin de stocker, en
plus, le résultat intermédiaire
Une variable est donc une case où on peut stocker
de l’information repérée par une étiquette permettant
d’écrire dedans et de lire depuis.
Physiquement, c’est une case de la mémoire vive de
l’ordinateur repérée par une adresse binaire
9
Cycle de vie d’une variable
La déclaration
L’instruction d’affectation
10
La déclaration d’une
variable
11
La déclaration
12
Bonnes pratiques pour les
étiquettes
Pour plus de lisibilité,
– Toujours privilégier les étiquettes qui ont du sens
– Éviter des étiquettes à rallonge
Le nom doit observer certaines règles
dépendantes du langage de programmation
ciblé. Règles absolues:
– Une suite de lettres et de chiffres
– Pas de signes de ponctuation
– Surtout pas d’espaces
13
Les types classiques
Le type booléen
14
Les types numériques
Question:
– Pourquoi, pour éviter tout problème, ne pas tout déclarer
en Réel double?
Réponse:
– Parce que les ressources d’un programme sont limitées
Bonne nouvelle:
– en algorithmique, on se contentera de faire le distinguo
entier/réel (existence de la virgule ou non)
– Le raffinement vers les autres sous-types numériques
17 sont laissés à l’étape de programmation
Pseudo-code
18
Types alphanumériques
20
Type booléen
22
L’affectation
e1 5
e2 e1 * 2
e1 e1+10
e2e1+e2
25
Ordre des instructions
L’ordre des instructions est déterminant:
– Elles s’exécutent séquentiellement dans l’ordre où elles
apparaissent
Variable e1: entier
e110
e15
Vs
e1 5
e110
Les deux algorithmes sont pour illustration, si vous écrivez
26 quelque chose de semblable, posez-vous des questions!
Pause exercices
27
Exo1
28
Exo2
Problème classique
– écrire un algorithme permettant d’échanger les
valeurs de deux variables A et B, et ce quel que
soit leur contenu préalable.
33
Exo7
34
Expressions et opérateurs
35
Opérateurs numériques
3*4/2
3+2*5
3+4-2*3
3+(4-2)*3
(3+(4-2))*3
37
Opérateurs alphanumériques
Opérateurs de concaténation
– En pseudo code: « & » ou « + » ou « ^ »
Exemples
– Variable v: caractères
v " Bon" + "jour"
38
Opérateurs booléens
Le ET: ˄
Le OU: v
La négation: ˥
Exemples
– Vrai ˄ Faux
– Vrai v Faux
– Faux v ˥ Faux
Ordre de priorité: ˥ puis ˄ puis v
39
Les opérateurs de comparaison
40
Mathématique Vs Informatique
Quelques pièges à éviter pour les grands mathématiciens
que vous êtes:
– La notion de variable n’est pas vraiment la même dans les deux
cas:
x=2*y en mathématique est une équation à résoudre ou une assertion
liant deux variables
En informatique,
– cette expression n’a de sens que si "y" possède une valeur fixe
– Le rapport entre x et y n’est plus maintenu après l’exécution de cette
affectation
– L’opérateur n’est pas symétrique:
x=y et y=x sont deux expressions identiques
x y et yx ne le sont absolument pas!
41
Lecture et écriture
42
Motivation
Un programme effectue des calculs mais, au
final, il serait intéressant de voir le résultat
quelque part:
– Un programme qui additionne 2 et 3 puis l’affiche à
l’écran est un peu plus intéressant qu’un programme
qui garde le résultat pour lui-même!
Il
est parfois intéressant de pouvoir lui fournir des
entrées pendant son exécution
– Un programme qui additionne deux valeurs que vous
lui donnez en entrée est un peu plus intéressant qu’un
43 programme qui additionne toujours 2 et 3!
L’opération d’écriture
46
Re-pause exercices
47
Exo1
48
Exo2
49
Exo3
50
Les Tests
51
Motivation
Deux structures:
– Si expression booléenne Alors
Instructions
Finsi
– Si booléen Alors
Instructions 1
Sinon
Instructions 2
Finsi
L’expression conditionnelle peut être une
53 variable de type booléen ou une condition
La condition
54
Sémantique
55
Sémantique
56
L’œuf à la coque
Prendre un œuf frais, Beldi de préférence
Si vous avez un micro-ondes Alors
Mettre l’œuf dans ce micro-ondes
Le sortir après 20s
Sinon
Prendre une casserole
Remplir la casserole d’eau
Mettre l’œuf dans la casserole
Le sortir après 5min
FinSi
Mettre l’œuf dans un coquetier
57 Le déguster
Un petit exo
58
Les conditions composées
59
Tables de vérité
C1 et C2 C2 Vrai C2 Faux
C1 Vrai Vrai Faux
C1 Faux Faux Faux
C1 ou C2 C2 Vrai C2 Faux
C1 Vrai Vrai Vrai
C1 Faux Vrai Faux
L’utilisation
des tests imbriqués n’est pas
indispensable, cependant elle permet d’avoir:
– des programmes plus lisibles
– des conditions moins complexes
– des programmes "plus performants"
64
La pause exos!
65
Exo1
66
Exo2
67
Exo3
69
Exo5
72
Justification, un exemple
Posons le problème suivant:
– Nous voulons réaliser un programme qui renvoie l’inverse d’un
chiffre: pour N, renvoyer 1/N.
– En bon concepteur, le programmeur veut prendre en compte le
fait que l’utilisateur ne doit pas rentrer un 0.
En utilisant une structure conditionnelle, on peut écrire:
– Variable UnChiffre: Entier
Ecrire "donner un chiffre et je vous renvoie son inverse"
Lire UnChiffre
Si UnChiffre =0 Alors
Ecrire "Saisie erronnée. Donner un chiffre non nul !"
Lire UnChiffre
FinSi
73
Ecrire 1/UnChiffre
Justification
74
La solution: une boucle itérative
Structure:
– TantQue booléen
…
Instructions
…
FinTantQue
Pour notre problème, cela donnerait:
– Variable UnChiffre: Entier
Ecrire "donner un chiffre et je vous renvoie son inverse"
Lire UnChiffre
TantQue (UnChiffre=0)
Ecrire "Saisie erronée. Donner un chiffre non nul !"
Lire UnChiffre
FinTantQue
75 Ecrire 1/UnChiffre
Principe de la boucle
77
Exo2
78
Exo3
79
Les boucles « Pour »:
Boucler en comptant
81
Arbitrage,
boucle «TantQue» Vs boucle «Pour»
85
Exo6
86
Exo7
Ecrire un algorithme qui demande successivement 20
nombres à l’utilisateur, et qui lui dit ensuite quel était le
plus grand parmi ces 20 nombres, e.g. :
– Entrez le nombre numéro 1 : 12
Entrez le nombre numéro 2 : 14
etc.
Entrez le nombre numéro 20 : 6
Le plus grand de ces nombres est : 14
Modifiez ensuite l’algorithme pour que le programme
affiche de surcroît en quelle position avait été saisie ce
nombre :
– C’était le nombre numéro 2
87
Exo8
88
Exo9
Écrire un algorithme qui permet de connaître ses
chances de gagner au tiercé, quarté, quinté:
– On demande à l’utilisateur le nombre de chevaux partants,
et le nombre de chevaux joués. Les deux messages
affichés devront être :
– Dans l’ordre : une chance sur X de gagner
Dans le désordre : une chance sur Y de gagner
– X et Y nous sont donnés par la formule suivante, si n est le
nombre de chevaux partants et p le nombre de chevaux
joués :
X = n ! / (n - p) !
Y = n ! / (p ! * (n – p) !)
89
Les tableaux
90
Motivation
Il
est nécessaire parfois de stocker et de traiter un
certains nombres d’informations du même type
– Les noms d’utilisateurs d’un forum
– Les notes d’une classe, …
Une première possibilité est de créer autant de
variables que d’informations
Pbs:
– Leur nombre peut être assez conséquent
– Ce nombre peut ne pas être connu à l’avance
91 – Ce nombre peut fluctuer pendant l’exécution
La solution magique:
Utiliser la structure tableau
92
Notation
95
Solution
Tableau Note(10) : Réel
Variable Moyenne, Somme: Réel
Variable i: Entier
Pour i 0 à 9
Ecrire "Entrez la note numéro: "
Ecrire i+1
Lire Note(i)
i Suivant
Som 0
Pour i 0 à 9
Som Som + Note(i)
i Suivant
Moyenne Somme / 10
96 Ecrire "la moyenne de la classe est égale à : " + Moyenne
Exo1
97
Exo2
101
Exemple
Tableau Note() : Réel
Variable Moyenne, Somme: Réel
Variable taille, i: Entier
Ecrire "donner le nombre d’élèves"
Lire taille
Redim Note(taille)
Pour i 0 à (taille-1)
Ecrire "Entrez la note numéro: "
Ecrire i+1
Lire Note(i)
i Suivant
……..
102
Exo5
103
Exo6
104
Exo7
105
Exo8
107
Les algorithmes
classiques pour les
tableaux
108
Objectif
109
Algorithmes classiques
Algorithmes de Tri
– Tri par sélection
– Tri à bulles
Algorithme de recherche
– Utilisation d’un drapeau (flag)
110
Tri par sélection
111
L’algorithme:
Pour i 0 à taille-2
posmini i
Pour j i + 1 à taille-1
Si t(j) < t(posmini) Alors
posmini j
Finsi
j suivant
temp t(posmini)
t(posmini) t(i)
t(i) temp
112 i suivant
Algorithme de recherche:
l’utilisation des flags
113
Exemple de problème
A l’intérieur de la boucle
– Faire le test
A l’extérieur
– Récupérer le résultat des traitements
– Effectuer les affichages correspondants
Solution magique: utiliser un flag!
– Flag = true y est
– Flag = false y est pas
116
Algorithme
Tableau Tab(20) : Entier
Variable N : Entier
Variable Trouvé: Booléen
Ecrire "Entrez une valeur entière"
Lire N
Trouvé ← Faux
Pour i ← 0 à 19
Si N = Tab(i) Alors
Trouvé ← Vrai
FinSi
i suivant
Si Trouvé Alors
Ecrire "y est!"
Sinon
Ecrire "y est pas!"
117
FinSi
Le tri à bulles
Tri
à bulles = tri de tableau + flag
Pour le tri par sélection, l’idée simple:
– Le plus petit élément est dans position 0
– Le suivant est dans la position 1
– Ainsi de suite
Maintenant, une autre propriété simple: pour
un tableau trié:
– Dans un tableau trié, tout élément est plus petit
que l’élément qui le suit
118
Principe de base du à bulles
fonctionnement:
– Si un élément est plus grand que l’élément qui le suit,
on les permute
– Continuer tant que notre propriété simple n’est pas
vérifiée
Dispositif:
– Nous utiliserons un flag correspondant à la vérification
de notre propriété
– À chaque parcours du tableau, les éléments les plus
petits remontent vers le haut
119 – Quand le flag est à true, le tableau est trié
Le flag
Variable Trié: Booléen
Trié ← Faux
TantQue non Trié
Trié ← VRAI
Pour i ← 0 à 9
Si t(i) > t(i+1) Alors
temp ← t(i)
t(i) ← t(i+1)
t(i+1) ← temp
Trié ← FAUX
Finsi
i suivant
120
FinTantQue
Un autre algorithme classique:
La recherche dichotomique
121
Démarche
Subdiviser le tableau en deux parties
identifier la partie où peut être l’élément
Prendre cette partie et la subdiviser à son tour en
deux sous parties
Identifier la sous partie où est susceptible de se
trouver l’élément
Continuer, jusqu’à
– trouver l’élément sur un milieu de sous partie élément
trouvé, Ou:
– Qu’il n’y aie plus de partie à subdiviser élément absent
122
L’algorithme
Variable Sup, Inf, i, Comp : Entier TantQue Non(arret)
Tableau tab(N): Entier Comp ← (Sup + Inf)/2
Variable arret : Booléen Si i < tab(Comp) Alors
Ecrire "Entrez l’entier à trouver" Sup ← Comp - 1
Lire i Sinon
Sup ← N - 1 Inf ← Comp + 1
Inf ← 0 FinSi
arret ← Faux arret ← (i = tab(Comp) ou
Sup < Inf)
FinTantQue
Si i = tab(Comp) Alors
Ecrire "y est!"
Sinon
Ecrire "y est pas!"
123
Finsi
Exo1
12
Exo2
125
Exo3
126
Partie 4:
Les tableaux
mutidimensionnels
127
Motivation
130
Exo2
Quel résultat produira cet algorithme ?
Tableau X(2, 3) : Entier
Variables i, j, val : Entier
Val ← 1
Pour i ← 0 à 1
Pour j ← 0 à 2
X(i, j) ← Val
Val ← Val + 1
j Suivant
i Suivant
Pour i ← 0 à 1
Pour j ← 0 à 2
Ecrire X(i, j)
131 j Suivant
i Suivant
Exo3
134
Exo6
135
Tableau à N dimensions
137
Utilité
141
Exo1
142
Exo2
143
Exo3
144
Exemples
Méthode résultat
Len("Bonjour, ça va ?") 16
Len("") 0
Mid("Zorro is back", 4, 7) "ro is b"
Mid("Zorro is back", 12, 1) "c"
Left("Et pourtant…", 8) "Et pourt"
Right("Et pourtant…", 4) "t…"
Trouve("Un pur bonheur", "pur") 4
Trouve("Un pur bonheur", "Sur terre") 0
145
Quelques exemples de fonctions
prédéfinies classiques
146
Exo1
147
Exo2
149
Complexité des Algorithmes
15
La double problématique de
l’algorithmique:
Trouver une méthode de résolution (exacte
ou approchée) du problème.
– E.g. calculer pour un X réel et un n entier la
valeur X^n
Trouver une méthode efficace.
Savoir résoudre un problème est une chose,
le résoudre efficacement en est une autre.
151
Motivation
Calcul de x^n
Données : un entier naturel n et un réel x. On
veut calculer x^n.
Moyens :
– Nous partons de y1 = x.
– Nous allons construire une suite de valeurs y1, ..., ym
telle que la valeur yk soit obtenue par multiplication de
deux puissances de x précédemment calculées :
yk = yu yv, avec 1 u;v < k, k [2;m].
But : ym= x^n.
– Le coût de l’algorithme sera alors de m-1, le nombre de
153
multiplications faites pour obtenir le résultat recherché
Algorithme trivial
y[1] =x
Pour i de 2 à n faire
y[i] = y[i-1] y[1]
renvoyer y[n]
Le coût de l’algorithme: n-1 multiplications
154
Méthode binaire
Écrire
n sous forme binaire
Remplacer chaque :
– 1 par la paire de lettres « SX » ;
– 0 par la lettre « S ».
Éliminer la paire « SX » la plus à gauche.
Résultat : un mode de calcul de x^n, en partant
de x où
– S signifie « élever au carré » (squaring)
– X signifie « multiplier par x ».
155 – SX élevé au carré puis multiplier par X
Illustration
Illustration avec n = 25
n = 11001
1 1 0 0 1
SX SX S S SX
SX S S SX
Nous partons de x et nous obtenons successivement :
x^2, x^3, x^6, x^12, x^24, x^25.
Nous sommes donc capables de calculer x^25 en 6
multiplications au lieu de 24 pour l’algorithme trivial
156
La complexité
Trivialement :
–
On obtient donc:
–
158
Y a t-il mieux?
Prenons le cas n = 15 = 1111
1 1 1 1
SX SX SX SX
SX SX SX
Nous partons de x et nous obtenons successivement :
– x2, x3, x6, x7, x14, x15.
Nous sommes donc capables de calculer x^15 en 6 multiplications
par la méthode binaire
Autre schéma de calcul : x2, x3, x6, x12, x15 = x12x3.
Nous obtenons ainsi x15 en 5 multiplications
La méthode binaire n’est donc pas optimale (c’est-à-dire que l’on
peut faire mieux).
159
Algorithme de l’arbre
x^2
x^3 x^4
162
En conclusion…
164
La complexité
165
Complexité au meilleur
166
Complexité au pire
167
Complexité en moyenne
C’est la moyenne des complexités de
l’algorithme sur les jeux de données d’une taille
donnée
Parfois, il faut prendre en compte la probabilité
de leur apparition
reflète le comportement « général » de
l’algorithme si les cas extrêmes sont rares ou si
la complexité varie peu en fonction des données
168
Optimalité
169
Caractéristiques des études de
complexité
170
Contexte de l’étude
171
Ordre de grandeurs pour la
complexité
172
Exemple
O :
– n = O(n), 2n = O(3n), n+2 = O(n), pn = O(n),
– log(n) = O(n),
– n = O(n2).
o :
– Racine(n) = o(n), n = o(n2),
– log(n) = o(n), log(n) = o(racine(n)).
: n+log(n) = (n+racine(n)).
173
Illustration:
Algorithme du tri par
sélection
174
L’algo
175
(
Etude de complexité:
tableau de taille n
Pour j 0 à n-2
posmini j c1 n-1
Pour i j + 1 à n-1
Si t(i) < t(posmini) Alors
posmini i c2
Finsi
i suivant
temp t(posmini) c4 n-1
t(posmini) t(j) c5 n-1
t(j) temp c6 n-1
j suivant c7 n-1
C_boucle(j) = nbre d’exécution de l’instruction pour un i donné
Complexité =
176
(
177
Complexité au pire
– T(n)=
Complexité de la forme ax^2+bx+c : complexité
178 quadratique
Complexité en moyenne
179
Ordre de grandeur
180
Autres classes des complexités
Les algorithmes usuels peuvent être classés en un certain nombre
de grandes classes de complexité :
– Les algorithmes sub-linéaires : O(log n)
– Les algorithmes linéaires: O(n)
– Les algorithmes polynomiaux en O(n^k) pour k > 2
– Exponentiels: la complexité est supérieure à tout polynôme en n)
Les algorithmes linéaires et sub-linéaires sont considérés comme
rapides
Les algorithmes polynomiaux sont considérés comme lents
Les algorithmes exponentiels sont considérés comme très lents et
impraticable au-delà d’une taille des données supérieure à quelques
dizaines d’unités.
181
THE END
182