Mathématiques
Introduction à l’algorithmique
Un algorithme en mathématiques ou en informatique est une succession d’instructions permettant de ré- soudre un problème donné. De nombreux problèmes n’ayant pas particulièrement trait aux mathématiques peu- vent être traduits sous une forme permettant d’être résolus de la sorte, comme la recherche d’un mot dans un dictionnaire, la compression des images ou du son, indiquer son chemin à quelqu’un qui est perdu, etc...
Nous allons rappeler quelques-unes des bases de l’algorithmique, dans le but d’être efficaces le plus rapi- dement en informatique. Pour cela, les instructions ne seront pas écrites dans un langage particulier (chaque logiciel, chaque langage possède sa propre syntaxe), mais dans un langage « universel » appelé pseudo-code, qu’il conviendra ensuite de traduire dans le langage utilisé.
Ne perdons pas de vue que l’objectif d’un algorithme est de produire une suite d’instructions compréhensibles et interprétables par la personne (qui sera en l’occurrence un ordinateur) chargée de l’exécuter.
I – Les variables
1o) Définition et calculs sur les variables
Une variable informatique est l’association entre un nom (un espace mémoire en fait) et une valeur, qui peut être de plusieurs types (valeur numérique, chaîne de caractères, variable booléenne, liste). Une variable permet par conséquent de stocker une valeur, en lui donnant un nom de variable, dans le but de l’utiliser par la suite lors de calculs ou pour les besoins d’un algorithme.
Pour affecter une valeur à une variable, la syntaxe diffère selon le logiciel informatique utilisé. En algorith- mique, nous utiliserons le symbole ← (présent sur certaines calculatrices, correspond sur Algobox à PREND_LA_VALEUR). Par exemple,a←2 signifie que l’on affecte la valeur 2 à la variablea. On peut également définir une variable à partir d’une variable précédemment définie : une fois quea est définie (c’est-à-dire une fois qu’on lui a affecté une valeur), une instruction du typeb←a−4 est valide, et elle aura pour conséquence d’affecter la valeur−2 à la nouvelle variableb. En revanche, elle ne modifie en rien la valeur de la variablea (la seule variable modifiée est celle qui se trouve à gauche de la flèche).
Pour ce qui est du choix des noms de variables, vous serez assez libres : un nom de variable peut comporter des lettres et des chiffres, mais il exclut la plupart des signes de ponctuation, en particulier les espaces, ainsi que les accents, et il doit également impérativement commencer par une lettre. Quant au nombre maximal de signes pour un nom de variable, il dépend du langage utilisé.
Attention à l’ordre des instructions, la procédure d’affectation d’une valeur à une variable n’est pas compara- ble à la voyance, elle ne peut pas prévoir le futur : un algorithme du typeb←a−4 puisa←2 posera un problème car lors de l’exécution de la première instruction,a ne contient rien du tout, ce qui a le don d’énerver profondé- ment le logiciel se chargeant d’interpréter l’algorithme (Python en tout cas, d’autres logiciels de calcul formel sont plus souples d’utilisation à ce sujet).
Deuxième écueil à éviter, l’affectation de variable ne correspond pas mathématiquement à la définition d’une fonction. Examinons cela sur l’algorithme suivant :
a←2 b←a−5 a←3
Que contient la variableb à l’issue de ces 3 instructions ? Elle ne contient pas la valeur−2, mais la valeur−3 : le changement de valeur dansaétant postérieur à la définition deb, la valeur debest inchangée. Si l’on souhaite quebsuive l’évolution dea, il faudra réécrire la ligneb←a−5 (ou passer par d’autres moyens plus compliqués, que nous n’évoquerons pas pour l’instant).
En ce qui concerne les calculs, les opérations algébriques usuelles seront notées comme d’habitude (addition : +, soustraction : -, multiplication : *, division : /, exposant : **), avec une précision importante : la multiplication doit toujours apparaître clairement entre les variables. Écrireax+2 ne revient pas à ajouter 2 au produit dea et dex, mais à ajouter 2 à une variable qui s’appelle ax. Ceci est valable même en présence de parenthèses : x(x+1) sera mal interprété par tous les langages. Les fonctions usuelles seront notées de manière usuelle, les
notations pouvant ensuite varier en fonction des logiciels (la fonction racine carrée en notation anglo-saxonne est habituellement notéesqrt, la fonction valeur absolue étant quant à elle notéeabs, et la fonction partie entière floor).
EXERCICE1:Petits calculs sur les variables
Écrire un algorithme qui réalise les opérations suivantes :
1o) Affecter la valeur−5 à la variablex, et la valeur 16 à la variablemaths. 2o) Calculerx2−3mathset l’affecter à la variablef1.
3o) Calculer3 cos(x)−2x 1−p
−x et l’affecter à une variable portant le nom de votre choix.
EXERCICE2:Mais qu’y a-t-il donc dans ces variables ?
Déterminer quelles seront les valeurs des différentes variables à la fin des algorithmes suivants :
1o) a←4 2o) x←2
b← −3 y←8
c←a+b z←x+y
a←2 y←x+z
b←b+1 x←y−z
c←b−a
2o) Lecture et écriture
Toutes les lignes écrites précédemment se contentent de faire des calculs, sans qu’il y ait nécessairement l’affichage des résultats (ce qui est très pratique lorsque l’algorithme effectuera plusieurs milliers voire millions de calculs...).
Lorsqu’on souhaite que l’algorithme affiche un texte ou la valeur d’une variable, on utilisera l’instructionécrire (analogue à AFFICHER sous Algobox). Par exemple, écrire(a) affichera à l’écran la valeur de la variable a, écrire(’Comme les mathématiques sont belles !’) permettra de contempler un texte intéressant et de méditer sur les intentions de l’auteur de cette maxime.
D’autre part, un algorithme étant la plupart du temps destiné à accomplir des tâches en interaction avec un utilisateur, il faut une instruction permettant à cet utilisateur d’entrer une valeur, afin que celle-ci soit ensuite affectée à une variable et puisse servir lors des calculs ultérieurs. Pour cela, on utilisera l’instructionlire. Par exemple, lire(a) conduit à attendre que l’utilisateur daigne bien vouloir donner une valeur (qu’il saisit sur le clavier et valide par la touche Entrée), et à stocker cette valeur entrée dans la variablea.
EXERCICE3:Encore du calcul, à l’aide d’un algorithme
Créer un algorithme qui affiche « Entrez la valeur dex», attend une valeur et affecte le nombre saisi àx, puis affecte la valeur 5 ày, puis remplaceypary+x, et enfin affiche la valeur dexet dey.
EXERCICE4:Échange de deux variables
Plus difficile, créer un algorithme qui demande de saisir les valeurs de deux variables, échange ces 2 valeurs, puis les affiche à nouveau.Bien vérifier l’état de vos variables à la fin de l’algorithme...
II – Éléments de programmation
1o) Boucles
Dans un algorithme il est fréquemment nécessaire de répéter une suite d’instructions, et ce un grand nombre voire un très grand nombre de fois (exploitant ainsi les capacités de calcul d’un ordinateur). L’outil de programmation permettant de réaliser cela s’appelle les boucles, qui sont de deux types selon que le nombre de répétitions est connu à l’avance ou non.
a) Lorsque l’on sait où l’on va
Un premier type de boucle est adapté lorsqu’on connaît à l’avance le nombre de répétitions que l’on a à effectuer.
Leur schéma est le suivant :
Pournom de variableallant devaleur minimaleàvaleur maximalefairesuite d’instructionsfin Exemple 1 : Essayons une première boucle toute simple :
Pouri←1 à 5
écrire(’lorsque i vaut ’,i) a←2∗i∗ ∗2+1
écrire(’2i2+1 vaut ’,a) FinPour
Attention, il faut éviter de modifier la variable qui sert de compteur dans la boucle, préférez d’autres noms de variables queidans le cas précédent.
EXERCICE5:Suite définie par récurrence Examiner la boucle suivante :
a←0
Pouri←1 à 6 a←a+i∗ ∗2 FinPour
écrire(a)
1o) Écrire la valeur dealors de chaque tour de boucle, puis sa valeur finale.
2o) Proposer une écriture d’une suite définie par récurrence qui corresponde aux valeurs calculées, et proposer une écriture mathématique directe de l’expression générale dun-ième terme de cette suite en fonction de n.
EXERCICE6:Factorielle
Écrire un algorithme qui calcule à l’aide d’une boucle la factorielle d’un entier fourni par l’utilisateur.
b) Des boucles à n’en plus finir...
Il est possible que l’algorithme nécessite une répétition d’un grand nombre d’instructions, sans que l’on sache à l’avance combien : une série d’instructions doit être répétée tant qu’une condition est réalisée. Le schéma correspondant à ce type de boucles est le suivant :
Tant queconditionfairesuite d’instructionsFin
Exemple 2 : Essayons sur un exemple lié aux suites : la suite de Fibonacci est définie paru0=1,u1=1 et la relation de récurrenceun+2=un+1+un. Voilà un algorithme qui permet de calculer ses termes successifs : écrire(’Entrez l’indice de la suite’)
lire(n) u←1 v←1 i←1
Tant quei<n w←v v←u+v u←w i←i+1 FinTantQue
écrire(’Le terme u’,n,’ de la suite de Fibonacci vaut ’,v)
On note dans cet exemple qu’il est important de ne pas s’embrouiller dans les variables, et surtout qu’il est impératif de savoir tester un tel algorithme, avec un papier et un stylo. Remplir un tableau similaire à ce qui suit permet de clarifier les choses et de s’assurer que tout marche bien, tout en remarquant qu’à la fin de chaque tour de bouclevest le termeuide la suite, et de donner une condition d’arrêt correcte :
Variables u v i
Valeurs initiales 1 1 1 Valeurs prises 1 2 2 successivement 2 3 3
au cours 3 5 4
des itérations 5 8 5 . . . .
Signalons deux risques d’erreur importants inhérents à ce type de boucle : le premier consiste à ne jamais exécuter la boucle, si la condition qui est écrite dans leTant quen’est jamais vérifiée (l’algorithme ne produit pas grand chose dans ce cas).
Le second conduit à des situations cocasses que vous ne manquerez pas d’apprécier pleinement lorsque vous serez sur vos ordinateurs, il se produit lorsque la condition spécifiée est toujours réalisée : dans ce cas, il n’y a aucune raison pour que l’algorithme s’arrête de lui-même, il vous faudra recourir à la force.
EXERCICE7:Factorielle
Écrire un algorithme qui calcule avec une boucleTant quela factorielle d’un entier fourni par l’utilisateur.
La condition inclut souvent des tests de comparaisons entre variables (où l’on utilise les symboles >, <, !=, ==), et il est possible d’utiliser des connecteurs logiques (et, ou).
Une des activités principales du programmeur consistant à tenter (vainement le plus souvent) de corriger ses erreurs, préparons-nous avec ce petit exercice.
EXERCICE8:Recherche d’erreur
Il s’agit de réaliser un algorithme permettant de calculer len-ième terme de la suite définie par récurrence paru0=2,u1=5 et la relation de récurrenceun=5un−1−6un−2. Trois programmeurs inexpérimentés ont écrit ce qui suit : vérifiez si ces algorithmes fonctionnent et conduisent au résultat attendu, et dans le cas contraire ciblez les erreurs commises voire corrigez-les:
Algorithme 1 :
écrire(’Entrez l’indice de la suite’) lire(n)
u←2 v←5
Pouri←2 àn v←5∗v−6∗u u←v
FinPour
écrire(’Le ’,n,’-ième terme de la suite vaut ’,v)
Algorithme 2 :
écrire(’Entrez l’indice de la suite’) lire(n)
u←2 v←5
Pouri←0 àn w←5∗v−6∗u v←w
u←v FinPour
écrire(’Le ’,n,’-ième terme de la suite vaut ’,v) Algorithme 3 :
écrire(’Entrez l’indice de la suite’) lire(n)
u←2,v←5,i←1 Tant quei<n
w←5∗v−6∗u u←v
v←w FinTantQue
écrire(’Le ’,n,’-ième terme de la suite vaut ’,u)
2o) Instructions conditionnelles
Les instructions conditionnelles permettent d’imposer une condition pour qu’une suite d’instructions soit réal- isée. Il est alors également possible d’effectuer des instructions variables par disjonction de cas. Leur schéma est le suivant :
Siconditionalorssuite d’instructionsfin ou Siconditionalorssuite d’instructionssinonsuite d’instructionsfin Exemple 3 : Examinez l’algorithme suivant et essayez de deviner ce qu’il peut bien faire :
écrire(’Entrez la valeur dea:’) lire(a)
écrire(’Entrez la valeur deb:’) lire(b)
Sia>b c←b Sinon
c←a FinSi
EXERCICE9:Contrôle de saisie
Écrire un algorithme qui demande un nombre à l’utilisateur compris entre 0 et 50, jusqu’à ce que le nombre saisi soit correct. L’algorithme affichera « Nombre trop grand » s’il dépasse 50, et «nombre trop petit » s’il est strictement négatif.
Petite variante : l’algorithme pourra compter le nombre d’essais nécessaires à l’utilisateur avant d’arriver à quelque chose de correct, et vilipender violemment ce dernier si ce nombre d’essais dépasse votre seuil de tolérance.
Une fois cet exercice maîtrisé, vous pouvez reprendre vos algorithmes précédents pour y inclure des tests permettant de contrôler la saisie d’un éventuel utilisateur trop facétieux. Par exemple, si un entier est attendu, il faudra vérifier que le nombre saisi en est bien un (réfléchissez à un moyen mathématique simple).
EXERCICE10:Un petit jeu pour finir
Programmez un jeu tout simple consistant à faire deviner un nombre entier compris entre 1 et 50 au joueur.
À chaque proposition faite par le joueur, le programme doit préciser si le nombre fourni est trop grand ou trop petit. Le jeu s’arrête lorsque le joueur a trouvé le bon nombre. Le nombre à trouver doit être généré aléatoirement par l’ordinateur (il varie donc à chaque jeu), utilisez pour cela la fonctionaleaqui représente un nombre réel aléatoire compris entre 0 et 1.
Petit raffinement possible : indiquez le nombre de tentatives qui ont été nécessaires pour que le joueur trouve la solution, et adaptez le message que vous affichez alors au joueur (félicitations chaleureuses, encouragements embarrassés, insultes moyenâgeuses,...).