COURS ACCELERE D'ALGORITHMIQUE
Objectifs : ce cours a pour but de présenter les fondamentaux en algorithmique au niveau du lycée : y seront traitées notamment les notions d'entrées et de sorties de données, de boucle et d'instruction conditionnelle. On utilisera le langage naturel pour décrire les algorithmes employés ; leur mise en œuvre s'effectuera via votre calculatrice ou sur ordinateur en utilisant le langage Python.
Sommaire
• Entrées et sorties de données ; variables informatiques
• Notion de boucle
• Notion d'instruction conditionnelle
• Simulation du hasard
• Applications dans divers contextes
Pour la première année depuis la réforme de la classe de seconde GT en 2009, l'algorithmique est au programme du bac. Ne la négligez pas ! Vous aurez au moins une question cette année !
Bon, rappelons quand même une définition plausible de l'algorithmique :
Définitions : On peut définir un algorithme comme une suite d'instructions précises, à appliquer dans un ordre précis, pour arriver en un nombre fini d'étapes à un certain résultat. L'algorithmique est la science des algorithmes (création, amélioration )
Exemple : préparer une recette de cuisine !
Considérons l'exemple simple suivant consistant à écrire un algorithme qui étant donné la longueur et la largeur d'un rectangle (disons exprimées en cm) renvoie son aire en cm².
Nous aurons besoin de 3 variables :
1. Une variable longueur saisie par l'utilisateur (donc variable d'entrée)
2. Une variable largeur saisie par l'utilisateur (donc également une variable d'entrée)
3. Enfin une variable aire renvoyée par l'ordinateur (donc variable de sortie)
L'algorithme pourrait se formuler ainsi :
écrire « Saisir la longueur du rectangle » lire longueur
écrire « Saisir la largeur du rectangle » lire largeur aire ? longueur*largeur écrire aire
La valeur affectée à la variable aire dépend des valeurs affectées aux variables longueur et largeur et est donnée par la formule bien connue longueur*largeur
Exercice 1 : écrire un algorithme en langage naturel qui étant donné un triangle ABC rectangle en A, demande à l'utilisateur de saisir les côtés AB et AC et renvoie la valeur de l'hypoténuse BC.
Exercice 2 : écrire un algorithme en langage naturel qui étant donné un triangle équilatéral ABC renvoie la mesure de sa hauteur.
SYNTHESE
Définitions
1. Dans un programme, une variable correspond à un emplacement de la mémoire de la calculatrice ou de l'ordinateur. Elle est repérée par un nom et contient une valeur.
2. La notion d'affectation (ou d'assignation) désigne l'opération par laquelle on établit un lien entre le nom de la variable et sa valeur (son contenu). On l'a noté ici avec le symbole ?
3. L'entrée des données (ou lecture des données) est l'opération qui consiste à saisir des valeurs pour qu'elles soient utilisées par le programme. On la note « Saisir valeur » ou « lire valeur ». Remarque : une valeur peut être un nombre entier, un nombre réel, une chaîne de caractères
4. La sortie des résultats (ou écriture des résultats) permet d'afficher les valeurs des variables après traitement. On note cette instruction « Afficher valeur » ou « écrire valeur »
Dans les deux exercices qui suivent, vous pouvez utiliser les instructions suivantes :
1. Avancer (d'une longueur donnée)
2. Tourner à gauche ou à droite (d'un angle donné en degré)
On suppose que le « crayon » se déplace par défaut horizontalement et vers la droite au départ.
Exercice 1 : Écrire un programme permettant de construire un carré de côté 50 tout en revenant à la position de départ.
Exercice 2 : Écrire un programme permettant de construire un triangle équilatéral de côté 100 tout en revenant à la position de départ.
Remarque : Dans l'exercice 1 comme dans le suivant, un même bloc d'instructions a été répété plusieurs fois. Repérer lequel dans chacun des deux cas.
Cette répétition des mêmes instructions un certain nombre de fois peut être « résumée » en introduisant une notion très importante en programmation, et très économique au niveau du nombre de lignes à écrire.
Les instructions répétitives : notion de boucle
Il existe essentiellement deux méthodes pour écrire une boucle, c'est-à-dire un procédé qui permet la répétition un certain nombre de fois d'un même processus (addition, multiplication, etc ).
Afin de les mettre en pratique, nous allons résoudre l'exercice 1 de cette manière.
METHODE 1
Analysons le programme en langage naturel suivant :
i ? 0 Tant que i i ? i + 1 Fin Tant que |
J'affecte à i la valeur 0 Tant que la condition annoncée est vraie, on effectue les deux instructions qui suivent On réaffecte à i sa valeur précédente augmentée de 1 |
Quel est le résultat obtenu ?
On peut alors résumer la structure de boucle décrite ici de la manière suivante :
Tant quecondition vérifiée faire Bloc d'instructions Fin Tant que |
Remarques : Si la condition n'est pas vérifiée au début, alors le bloc d'instructions ne sera pas exécuté du tout.
ATTENTION ! Pour que l'algorithme soit correct, il est nécessaire que la condition cesse d'être vérifiée au bout d'un nombre fini de répétitions. Sinon, le programme « boucle indéfiniment ».
Exercice 3 : Que fait le programme suivant ?
S ? 80
Tant que S>20 faire S ? S + 10
METHODE 2
Une autre manière courante d'écrire une boucle est :
Pouri variant de 0 à 3 (ou de 1 à 4) faire avancer de 50 tourner à gauche de 90° Fin Pour |
La variable i évolue comme indiqué, par défaut de 1 en 1. Les deux instructions suivantes sont alors effectuées |
Le résultat obtenu est exactement le même : le dessin d'un carré de côté 50.
On peut alors résumer la structure de boucle décrite ici de la manière suivante :
Pourivariant de 0 à N (ou de 1 à N) faire
Bloc d'instructions Fin Pour
Problème type : on veut calculer la somme S = 1?2?3?…?99?100 .
Analyse : Bien évidemment, on ne va pas saisir à la machine cette longue opération ! Il nous faut donc trouver un moyen pour que cette dernière l'exécute, mais en écrivant le moins de lignes possible.
On commence par remarquer que l'opération qui est sans cesse utilisée est l'addition. D'où l'idée d'utiliser une boucle : on répète plusieurs fois le même procédé : ici additionner.
Additionner oui, mais quoi ? 1 d'abord, puis 2, puis 3, … , jusqu'à 100. Autrement dit on additionne une suite de nombres qui « varient », dans le cas présent de 1 en 1.
L'idée essentielle est de calculer S petit à petit, comme on le ferait à la main en ajoutant peu à peu tous les termes contenus dans l'addition.
Comme S va évoluer et les termes qui la composent aussi, on a l'idée d'introduire deux variables : S elle-même et un « compteur » i, qui devra prendre successivement les valeurs 1, 2, 3, …, 100.
Nous allons résoudre ce problème en créant un algorithme efficace, utilisant (mais ce n'est pas une obligation), le premier type de boucle.
Mise en œuvre :
Instructions |
Signification |
S ? 0 i ? 1 Tant quei ? 100 faire S ? S + i i ? i + 1 Fin Tant que Afficher S |
On affecte à S la valeur 0 (valeur initiale) On affecte à i la valeur 1 (valeur initiale) La condition est posée: i varie jusqu'à 100 On réaffecte à S sa valeur précédente plus la valeur actuelle de i On réaffecte à i sa valeur augmentée de 1 Une fois sorti de la boucle, on affiche S |
Vous allez à présent « faire tourner l'algorithme à la main », c'est-à-dire regarder, étape par étape l'évolution des variables i et S, et enfin le résultat final. Pour cela, compléter le tableau suivant. Vous ne donnerez pas le résultat du calcul de S à chaque étape, mais seulement l'écriture de S sous la forme d'une somme.
Après l'itération |
i |
S |
0 |
1 |
0 |
1 |
||
2 |
||
3 |
||
99 |
||
100 |
Quelle est la dernière valeur prise par la variable S ? Quel est le résultat affiché par le programme ?
Exercice 5 : Écrire un programme utilisant une boucle Tant que ou une boucle Pour calculant et affichant le résultat de :
1. S = 3?6?9?…?201
2. P = 2×4×6×8×…×40
3. S = 1? ? ? ?
Exercice 6 : Construire la figure suivante en utilisant l'instruction Tant que (longueur d'un côté du quadrillage 50).On partira du point A.
Exercice 7 : En utilisant une boucle Tant que, écrivez un programme permettant de calculer puis d'afficher le résultat de la somme suivante :
T = 1?1? 1 ? 1 ?… 1
2 2×3 2×3×4 2×3×4×…×10
Indication : bien analyser de combien de variables vous avez besoin.
Exercice 8 :
En utilisant l'instruction Tant que, soit une fois soit deux fois dans le même programme, obtenir le dessin suivant :
Carré de côté 10 et intervalle entre les carrés 10.
Vous pouvez encore utiliser les instructions suivantes :
• Avancer (d'une longueur donnée)
• Tourner à gauche ou à droite (d'un angle donné en degré) Vous disposez en plus de deux instructions : lever le crayon (permet d'avancer sans que ceci dessine quoi que ce soit) baisser le crayon (permet de redessiner à nouveau)
Nous avons vu à la séance précédente la notion de boucle, utilisée dans le cas où une même suite d'opérations est répétée un certain nombre de fois. Nous allons nous intéresser ici au cas d'instructions conditionnelles.
Cette notion permet à un algorithme d'effectuer certaines instructions seulement si une certaine condition est remplie.
Ceci prend la forme suivante en pseudo-langage :
Si(condition vérifiée) faire Bloc d'instructions
Fin Si
Dans le cas où la condition de départ n'est pas vérifiée, il est également possible d'indiquer à l'algorithmeune alternative qu'il doit effectuer. On obtient alors la structure suivante :
Si(condition vérifiée) faire Bloc d'instructions n°1 Sinon faire Bloc d'instruction n°2 Fin Si |
Exercice 1
Écrire dans la zone de texte adjacente le résultat affiché à l'écran par l'ordinateur pour chacun des programmes suivants :
Question 1 N ? 4 a ? 7
Si i est divisible par 2 faire écrire 3*i
a) Si l'utilisateur saisit M, l'ordinateur affichera : Bonjour monsieur !
• écrire (un texte apparaissant à l'écran)
• lire (un texte sur l'écran de l'ordinateur)
Méthode n°1 |
Méthode n°2 |
Si(condition 1 vérifiée) faire Si(condition 2 vérifiée) faire Si(condition 3 vérifiée) faire … Si(condition k vérifiée) faire Bloc d'instructions |
Si(condition 1 vérifiée ET condition 2 vérifiée ET… ET condition k vérifiée) faire Bloc d'instructions Fin Si |
Vous avez le droit aux instructions suivantes :
• écrire (un texte apparaissant à l'écran)
• lire (une valeur sur l'écran de l'ordinateur)
Si(condition 1 vérifiée) faire Bloc d'instructions n°1 Sinonsi(condition 2 vérifiée) faire Bloc d'instruction n°2 …etc Sinon si(condition N-1 vérifiée) faire Bloc d'instructions n° N-1 Sinon faire Bloc d'instruction n° N Fin Si |
Note |
Appréciation |
N >= 16 |
A |
16 > N >=12 |
B |
12 > N >= 10 |
C |
10 > N >= 8 |
D |
N < 8 |
E |
Vous avez le droit aux instructions suivantes :
• écrire (un texte apparaissant à l'écran)
• lire (une valeur sur l'écran de l'ordinateur)
En langage Python l'opération d'affectation s'écrit « = ».
En Python, nous travaillerons avec 4 types de variables :
1. Les entiers relatifs : type int (comme integer)
Exemple : en saisissant a=-4, vous définissez a comme une variable de type string
2. Les nombres flottants : type float
3. Les chaînes de caractères : type str (string)
Exemple : en saisissant c='salut', vous définissez c comme une variable de type str
Exemple : en saisissant d=[12,3.14,'hello',100], vous définissez d comme une variable de type list.
Remarque : notez bien la différence entre le symbole d'affectation = et l'égalité mathématique ==
Syntaxe en langage usuel |
Syntaxe en Python |
Tant quecondition vérifiée faire bloc d'instructions Fin Tant que |
whilecondition vérifiée: bloc d'instructions |
• Les : sont obligatoires après la condition associée à while.
• l'indentation du bloc d'instructions associé à while est obligatoire.
reset() goto(x,y) forward(x) backward(x) up() down() left(x) right(x) |
On efface tout et on recommence Aller à l'endroit(x,y) Avancer de la distance x Reculer de la distance x Relever le crayon (pour pouvoir avancer sans dessiner). Abaisser le crayon pour recommencer à dessiner. Tourner à gauche d'un angle en degrés égal à x. Tourner à droite d'un angle en degrés égal à x. |
Syntaxe en langage usuel |
Syntaxe en Python |
Sicondition vérifiée faire bloc d'instructions Fin Si |
ifcondition vérifiée: bloc d'instructions |
• Les : sont obligatoires après la condition associée à if.
• l'indentation du bloc d'instructions associé à if est obligatoire.
Syntaxe en langage usuel |
Syntaxe en Python |
Sicondition vérifiée faire bloc d'instructions 1 Sinon faire bloc d'instructions 2 Fin Si |
ifcondition vérifiée: bloc d'instructions 1 else: bloc d'instructions 2 |
• Les : sont obligatoires après la condition associée à if ainsi qu'après else.
• if et else sont indentés identiquement
Syntaxe en langage usuel |
Syntaxe en Python |
Si(condition 1 vérifiée) faire bloc d'instructions n°1 Sinon si(condition 2 vérifiée) faire bloc d'instructions n°2 …etc Sinon si(condition N-1 vérifiée) faire bloc d'instructions n° N-1 Sinon faire bloc d'instruction n° N Fin Si |
if(condition 1 vérifiée): bloc d'instructions n°1 elif(condition 2 vérifiée): bloc d'instructions n°2 etc elif(condition N-1 vérifiée): bloc d'instructions n° N-1 else: bloc d'instruction n°N |
• if, elif et else sont indentés identiquement
• Toutes les conditions énoncées sont par construction incompatibles deux à deux .
Pour saisir une chaîne de caractères : c=input("Saisir votre texte ")
Pour saisir un entier : d=int(input("Saisir un entier "))
Pour saisir un nombre flottant : e=float(input("Saisir un nombre réel "))
Remarque : la commande input() permet de saisir un message de votre choix.
Pour écrire la valeur d'une variable saisie ou traitée auparavant : print(variable)
print("Texte") Le texte est entre guillemets
print("Texte 1",variable 1,"Texte 2",variable 2, etc )
Exercice 1 : un peu de travail sur les vecteurs
Exercice 2 : Résolution d'une équation du second degré
Écrire un programme en langage naturel et à l'aide du logiciel Python qui :
1. demande à l'utilisateur de saisir les coefficients a,b et c
2. détermine le nombre de solutions de a x2?b x?c=0
3. précise le nombre de solutions, et dans le cas où elles existent, écrive ces solutions.
Exercice 3 : Méthode de dichotomie
• f est strictement monotone sur [a;b]
Alors (théorème de la bijection) il existe un unique réel c appartenant à ]a; b[ tel que f ?c? = 0 .
Principe de la dichotomie : Supposons que l'on sache qu'il y a une racine x0 dans l'intervalle
• Si f ?a? f ?m??0 alors x0?[a ;m] . On pose alors a1=a et b1=m .
• Si f ?a? f ?m??0 alors x0?[m;b] . On pose alors a1=m et b1=b
2. Testez ce programme pour les fonctions suivantes :
a) f est définie sur [?5;10] par f ?x? = x3?2 x?1
b) f est définie sur [?0,5;1] par f ?x? = x?cos x
Exercice 4 : Un peu de probabilités conditionnelles
On considère un dé à 6 faces parfait et 3 urnes numérotées de 1 à 3.
L'urne 1 contient 3 boules blanches, 4 boules noires et 3 boules vertes.
L'urne 2 contient 2 boules blanches, 2 boules noires et 6 boules vertes.
L'urne 3 contient 4 boules blanches, 4 boules noires et 2 boules vertes.
Toutes ces boules sont indiscernables au toucher.
On considère l'expérience aléatoire qui consiste à lancer lancer d'abord le dé puis :
• Sinon, on tire une boule dans l'urne n°3.
4. Compléter le tableau donné en annexe avec n=50000
5. Calculer p(B), p(N) et p(V) et comparer avec les résultats trouvés à la question précédente.
Fréquence Expérience n° |
fB |
fN |
fV |
1 |
|||
2 |
|||
3 |
|||
4 |
|||
5 |
|||
Moyenne des fréquences |
fB est la fréquence d'apparition de l'événement B, etc
Exercice 5 : Travail sur une suite.
On définit la suite de Collatz de la manière suivante :
? On se donne un entier u0 strictement positif.
? Pour tout entier n?1 , on calcule un?1 en fonction de un de la manière suivante : un
a) Si un est pair, on a un?1 = 2
b) Si un est impair, on a un?1 = 3un?1
n |
u n |
0 |
5 |
1 |
16 |
2 |
8 |
3 |
4 |
4 |
2 |
5 |
1 |
6 |
4 |
7 |
2 |
8 |
1 |
9 |
4 |
10 |
2 |
11 |
1 |
12 |
4 |
13 |
2 |
14 |
1 |
15 |
4 |
16 |
2 |
17 |
1 |
18 |
4 |
19 |
2 |
20 |
1 |
2. Écrire en langage naturel puis en Python un programme demandant à l'utilisateur de :
a) saisir à l'écran un entier u0 strictement positif,
b) de saisir un entier n (l'indice maximum de calcul des uk )
c) et qui affiche tous les termes de u0 à un .
3. Tester votre programme avec u0 = 3 puis u0 = 7 . (faire varier n également)
Remarques : 1) La suite ?un? définie de la manière précédente est dite définie par récurrence.
On calcule chacun de ses termes de proche en proche.
2) On ne sait toujours pas prouver ce que vous avez constaté ! C'est un problème ouvert.
Soit . A le point de C d'abscisse 1.
• renvoie la valeur de xn défini précédemment.
5. Le tester avec n=2, n=3, n=10.
On souhaite répondre à deux questions :
• La suite ?xn?n?0 converge-t-elle ? Si oui, est-ce bien vers x* ?
1. Quelle est la valeur exacte de x* ? Justifier que x*?[1;2] .
3. Démontrer que g? x?=x si et seulement si f ?x?=0 . (on s'est ramené à un problème de point fixe).
• ?un?n?0 converge vers un réel l
a) Étudier les variations de g sur l'intervalle [1 ; 2].
c) Prouver que la suite ?xn?n?0 est décroissante. En déduire que ?xn?n?0 converge, et ce vers x* .
On pose pour tout entier naturel n, en=xn– x* .
5. Démontrer que en?1=21xn e2n puis que en?1?12 e2n .
6. Démontrer par récurrence que pour tout entier naturel n que en??12?2n
7. Soit p>0 la précision recherchée.. On supposera pN, alors en? p .
8. Écrire un programme à l'aide du logiciel Python qui demande à l'utilisateur :
• de saisir la précision recherchée p • renvoie la valeur de x* à p près.
Les cinq liaisons sont indépendantes les unes des autres en ce qui concerne leurs pannes.
a) i) Justifier que X suit une loi binomiale dont on précisera les paramètres.
Remarque : comme A dépend de ? et de n on écrira p? A?=g ??,n? .
b) En déduire la probabilité h??, n? de fonctionnement du réseau ainsi constitué.
c) Écrire un script qui demande à l'utilisateur :
• de saisir le nombre n de brins constituant chaque segment
• de saisir la probabilité ? de fonctionnement de l'un des n brins d'un segment
a) Calculer l'espérance du gain de l'opérateur pour une unité de temps.