Telechargé par Fleur De Lune

258962024-Les-Bases-de-l-Algorithme

publicité
Cours A.Denise du lundi 13 septembre 2004
Chapitre I : Bases de l’algorithme
I.
Introduction
Le nom ‘algorithme’ vient d’un mathématicien arabe ‘Abu Ja Far Mohammed Ibn
mûsâ Al-Kha-Rizme’ (Bagdad, vers 780 – 850 ). Mais la notion d’algorithme est plus
ancienne. Dans l’antiquité par exemple, l’algorithme d’Euclide (300 avant J-C) permettait de
trouver les PGCD (Plus Grand Commun Diviseur) :
PGCD (42,63) = 21
42/21 = 2
63/21 = 3
La notion d’algorithme est indépendante de celle d’ordinateur.
Définition : Un algorithme est ‘Une suite finie d’instructions qui décrit un traitement
sur un nombre fini de données structurées, et qui doit se terminer après un nombre fini
d’opérations pour donner un résultat.’
L’architecture de l’algorithme doit être réfléchie, selon une décomposition du
problème en sous problèmes.
Pour comprendre :
Pour faire un gratin d’endives au jambon (pour 4 personnes)
- 4 endives
- un plat en pyrex
- 4 tranches de jambon
- du gruyère
- ingrédients pour une béchamel
- …
•
•
•
•
•
•
•
faire cuire les endives à la vapeur *
les entourer de jambon
les mettre dans un plat allant au four *
préparer une sauce béchamel
recouvrir les endives de béchamel
râper le gruyère, le mettre sur le plat
mettre à gratiner 20 minutes au four
Certaines étapes devraient être détaillées (*), mais pour qu’un algorithme soit lisible,
il ne faut pas tout écrire d’un coup ( par exemple : ‘aller acheter du jambon cher l’épicier, s’il
est fermer aller au supermarché, etc.…’ )
II.
Un premier algorithme informatique
Action DuréeDeVol
/* Demande l’heure et la minute de départ et l’heure et la minute d’arrivée
d’un avion, puis écrit la durée de vol. On suppose que le départ et l’arrivée ont
lieu le même jour et qu’il n’y a pas de décalage horaire. */
Spécification
Que fait le
programme ?
lexique
hd, md, /*heure & minute de départ */
ha, ma, /* heure & minute d’arrivée */
ht, mt, /* heure et minute de la durée du trajet */
cd, ca: /* conversion en minutes des horaires de départ & d’arrivée */
entiers
début
lire (hd, md, ha, ma)
cd ← 60 x hd + md /* ‘←’ est le symbole d’affectation */
ca ← 60 x ha + ma
mt ← ca – cd /*mt contient la durée du voyage en minutes */
ht ← mt div 60 /* division entière ou euclidienne */
mt ← mt mod 60 /* donne le reste de la division entière */
écrire (ht, mt)
Réalisation
Comment le
fait-il ?
fin
Les spécifications sont très importantes pour les personnes susceptibles de reprendre le
programme, par exemple pour l’inclure dans un autre programme plus complexe.
L’écriture d’un algorithme est assez libre. On n’est pas obligé de tout écrire, par
exemple en ce qui concerne les interactions utilisateur / machine. Dans le programme, il faut
écrire ces instructions pour que l’utilisateur comprenne.
III.
Les instructions
1. L’affectation
< nom de variable > ← < expression >
ou
< nom de variable > := < expression >
L’affectation calcule la valeur de l’expression et range cette valeur dans la variable.
Exemples :
a←2
x ← 2y + 1
Il ne faut pas utiliser ‘=’ pour l’affectation, pour qu’il n’y ait pas d’ambiguïté avec le
test d’égalité ( ‘si a=3 alors…’ )
Pb : En langage C, l’affectation s’écrit ‘ := ’ et l’opérateur d’égalité s’écrit ‘ = = ’.
2. Lecture et écriture
Pour que l’ordinateur communique avec l’utilisateur :
- lecture : sur le clavier (ou dans un fichier, …)
- écriture : sur l’écran ( ou fichiers, imprimante, …)
• lire ( <nom de variable > )
→ Range dans la variable la valeur que l’utilisateur tape au clavier.
Exemple :
lire ( < var1 >, < var2 >, < var3 >, … , < var n > )
•
écrire ( < expression > )
Exemples :
Ecrire ( 3 )
Ecrire ( x ) /* si x est une variable */
Ecrire ( ‘Bonjour’ )
Ecrire ( 3x – 7 )
Ecrire ( ‘Bonjour je m’appelle’ , mon_nom, ‘j’ai’, mon_age, ‘ans’ )
3. Séquence et bloc d’instructions
•
Séquence d’instructions
lire ( x, y )
y ← y +2
écrire ( x – y )
ou
lire ( x, y ) ; y ← y+2 ; écrire ( x – y )
•
Bloc d’instructions
début
lire (x)
y←y+2
écrire ( x – y )
fin
On peut remplacer début et fin par des accolades ‘{ … }’.
4. Instructions conditionnelles
Si < expression booléenne >
Alors < instruction ou bloc >
Sinon < instruction ou bloc >
Une expression booléenne est une expression dont la valeur est soit VRAI soit FAUX.
•
Exemple :
Si x mod 2 = 0
Alors écrire ( ‘nombre pair’)
Sinon écrire ( ‘nombre impair’)
Si l’expression est VRAIE, exécute le ‘alors’ puis passe à l’instruction suivante. Si elle
est FAUSSE, exécute le ‘sinon’ puis passe à l’instruction suivante.
Si < expression booléenne >
Alors < instruction ou bloc >
Si l’expression est VRAIE, exécute le ‘alors’ puis passe à l’instruction suivante, sinon
passe directement à l’instruction suivante.
Exemple :
Si x < 0
Alors x ← -x
Ecrire (x)
Si x < 0
Alors
y←x+2
x←-x
Ce n’est pas un bloc d’instructions
Ecrire (x)
Il faut écrire :
Si x < 0
Alors {
y←x+2
x←-x}
Ecrire (x)
Mardi 14 septembre 2004
•
‘ selon le cas’
Si a = 0 alors …
Sinon si a = 1 alors …
Sinon si a = 2 alors …
Sinon …
‘Selon le cas’ permet de simplifier la syntaxe :
Selon le cas a
a=0:…
a=1:…
a=2:…
Sinon …
Syntaxe générale :
Selon le cas < nom de variable >
< expression booléenne sur la variable > : < instruction ou bloc >
< expression booléenne sur la variable > : < instruction ou bloc >
< expression booléenne sur la variable > : < instruction ou bloc >
…
[Sinon < instruction ou bloc >]
/* Les ‘[…]’ signifient que cette instruction est
optionnelle */
exécute l’instruction ou le bloc d’instruction correspondant à la première
expression VRAIE dans la liste. Si aucune n’est vraie, exécute l’instruction ou le bloc du
sinon s’il y en a un. Puis passe à l’instruction suivante.
Exemple :
Lire (n)
Selon le cas n :
n = 1 : écrire ( ‘lundi’ )
n = 2 : écrire ( ‘mardi’ )
n = 3 : écrire ( ‘mercredi’ )
n = 4 : écrire ( ‘jeudi’ )
n = 5 : écrire ( ‘vendredi’ )
n = 6 : écrire ( ‘samedi’ )
n = 7 : écrire ( ‘dimanche’ )
sinon écrire ( ‘le numéro doit être compris entre 1 et 7’ )
5. Itérations
Exemple : /* sans itération */
Action TableDeMultiplication
/* Lit un entier et écrit sa table de multiplication */
Lexique
n : entier
Début
Lire (n)
Ecrire ( ‘1 x’, n , ‘=’ , n )
Ecrire ( ‘2 x’, n , ‘=’ , 2 x n )
Ecrire ( ‘3 x’, n , ‘=’ , 3 x n )
…
Ecrire ( ‘10 x’, n , ‘=’ , 10 x n )
Fin
Problème : Si on veut écrire jusqu’à 1000 x n, le programme devient très long.
On fait une itération ( ou boucle ) qui permet de faire une même instruction en
changeant une variable à chaque tour de boucle
•
La boucle ‘pour’
Pour < nom de variable >
allant de < expression entière 1>
à < expression entière 2 >
faire < instruction ou bloc >
La variable prend la valeur de la première expression, puis le bloc est exécuté ( * ),
puis la variable est incrémentée de 1.
Si sa valeur est inférieure ou égale à l’expression 2, on revient à ( * ), sinon on passe à
l’instruction suivante.
Exemple :
Lexique
n, i : entiers
Début
Lire (n)
Pour i allant de 1 à 10 faire
Ecrire ( i, ‘x’, n, ‘=’, i x n )
Fin
Il est interdit de :
-
modifier la valeur de l’indice de boucle ( i ) à l’intérieur de la
boucle
modifier les valeurs des bornes à l’intérieur de la boucle, par
exemple quand on a :
b←4
pour j allant de a à b faire
j←0
b ← 2b
Remarque : Si a>b, le bloc ne s’exécute pas.
Mercredi 15 septembre 2004
•
Les boucles ‘tant que’
Il en existe deux :
1. Tant que < expression booléenne >
Faire < instruction ou bloc >
2. Faire < instruction ou bloc >
Tant que < expression booléenne >
La boucle 1. : (*) Regarde la valeur de l’expression
Si elle est VRAIE, exécute l’instruction ou le bloc et revient à (*)
Sinon, passe à l’instruction suivante
La boucle 2. : (*) Exécute l’instruction ou le bloc, puis
Si l’expression a pour valeur VRAI, revient en (*)
Sinon passe à l’instruction suivante
Dans la version 2, l’instruction (ou bloc) est exécutée au moins une fois, ce qui n’est
pas le cas dans la version 1.
Exemples :
- Tables de multiplication :
lire (x)
i←1
tant que i ≤ 10 faire
{
écrire (i, ‘*’, x, ‘=’, i * x)
i←i+1
}
- /* Nombre de fois qu’un nombre entier est divisible par 2*/
lire (x)
compteur ← 0
tant que n mod 2 = 0 faire
{
n ← n div 2
compteur ← compteur +1
}
écrire (compteur)
Téléchargement