Le Monde Merveilleux de l'AlgorithmiqueMD

Bienvenue dans le Monde Merveilleux de l'AlgorithmiqueMD. Ce cours se veut une introduction à l'algorithmique et à la programmatique, deux termes que nous définirons plus loin.

Vous êtes au bon endroit si vous n'avez pas, ou à peu près pas, programmé, mais avez envie d'apprendre cette science (ou cet art, tout dépendant du point de vue).

Vous êtes au mauvais endroit si vous avez déjà un bagage en programmation ou en langage C++, ou encore si votre objectif est d'approfondir votre savoir en la matière plutôt que d'y être introduit.

Note: une partie de ce document provient des efforts de Vincent Echelard, professeur lui aussi au département d'informatique du Collège Lionel-Groulx. Si vous le voyez, remerciez-le et offrez-lui un café

La programmatique et la résolution de problèmes

En effet, si l'algorithmique est une science exacte, au même titre que les mathématiques ou la physique, la programmatique comporte de son côté une part d'investissement humain et d'esthétique, tout en étant une composante à part entière (et essentielle) de la programmation.

Les principaux éléments de la programmatique, et donc les étapes fondamentales requises pour la rédaction d'un programme, sont:

Prenons, dans ce qui suit, les éléments dans l'ordre.

La raison d'être d'un algorithme

À la base de toute la programmatique se trouve l'algorithmique, la science propre à la conception et à l'analyses des algorithmes.

C'est pourquoi le problème lui-même fait partie intégrante de notre définition. Pas de problème, pas de plaisir pour nous.

Pour parvenir à produire un véritable algorithme, il faut d'abord procéder à une analyse du problème, mais pas n'importe quelle analyse: une analyse structurée.

Exemple: supposons que nous recherchons un algorithme qui nous permettra de nous faire cuire un oeuf.

Si notre analyse ressemble par exemple à ce qui suit:

Problème: se faire cuire un oeuf
Algorithme: «euh... bien, on fait cuire l'oeuf!»

nous ne serons pas vraiment plus avancés qu'avant même de se poser la question «comment résoudre le problème?».

Analyse structurée

Analyser un problème de façon structurée peut être abordé de plusieurs manières. Dans ce cours, nous chercherons surtout à décomposer un problème en plus petits problèmes, dans le but de le simplifier.

Définition, décomposition et solution d'un problème

Lorsque l'on veut appliquer une solution informatique pour résoudre un problème, il faut éviter de se précipiter devant un écran d'ordinateur.

Programmer sans réfléchir a priori ne cause que des problèmes. On risque, en programmant sans analyse au préalable, d'aboutir à une solution incomplète (dans la mesure où on arrive effectivement à une solution).

En effet, le processus qui permet de résoudre un problème en informatique comporte habituellement deux (2) phases principales:

Chacune de ces phases comporte un certain nombre d'opérations qu'on peut regrouper en étapes.

La phase de résolution du problème peut être scindée en trois (3) étapes :
La phase de mise en oeuvre peut être scindée en deux (2) étapes :
Le schéma suivant dénote les relations entre ces diverses étapes:

Il est à relever que le processus de développement est cyclique. Un schéma plus complet (le temps m'a manqué cette fois-ci) en ferait état.

Énoncé du problème et données

Nous l'avons souligné auparavant: il n'y a pas de plaisir sans problème. C'est pourquoi il nous faut d'abord et avant tout deux choses:
Dans le cas d'un meuble à assembler, le problème serait de passer de l'état désassemblé d'un meuble à celui assemblé, et les données seraient les objets à composer pour constituer le meuble lui-même. Les instructions... sont du ressort de l'algorithme

La phase de résolution du problème

Une fois l'étape de la compréhension du problème résolue (ce qui n'est pas toujours simple), il faut passer à l'étape suivante qui consiste à examiner différentes approches générales permettant de résoudre le problème.

Une des méthodes les plus employées en informatique (et qui sera, comme mentionné précédemment) est l'approche par sous-objectifs.

Cette méthode consiste à fractionner un problème difficile en plusieurs petits problèmes plus simples. On dit d'elle qu'elle est une «méthode descendante» (top down method), du fait qu'elle part du problème général pour en faire une décomposition.

Le terme algorithme est utilisé en l'honneur d'un mathématicien persan, Mohammed ibn Musa al-Khuwarizmi (825 A.D.), dont le 2ème livre nous a donné le mot algèbre (Al-jabr).

Étant donné un problème spécifique, un algorithme est la séquence complète et ordonnée de toutes les opérations (actions) à faire pour en obtenir la solution. Cette séquence d'opérations est dictée par le problème à résoudre et par la méthode de résolution choisie.

Exemples d'algorithmes:

En informatique, ce terme se réfère à une méthode de résolution de problèmes, comme nous l'avons mentionné précédemment. Nous faisons usage d'un ordinateur pour implanter nos algorithmes dans le but d'automatiser le processus de résolution de problèmes. L'idée est donc, fondamentalement, de se simplifier la vie pour longtemps en se la compliquant une fois.

Un algorithme se compose d'une série finie d'étapes, chacune nécessitant une ou plusieurs opérations. Chaque opération doit:
Par exemple, l'ordinateur peut:

Les étapes d'un algorithme

Un algorithme comprend généralement trois (3) étapes:

Exemple: le calcul du volume d'une sphère.

  1. Identifier le rayon;
  2. Formule pour le calcul du volume de la sphère : 4/3 * PI * r3;
  3. Affichage de la valeur du volume

Représentation de l'algorithme

Un algorithme peut être présenté sous deux (2) formes:

Définition des actions de base (opérations, instructions)

Il existe trois grandes catégories d'opérations :

Définition des structures de contrôle (structures de base)

En programmation structurée, pour construire des algorithmes, on se sert des trois structures de base suivantes:

La séquence

La structure de contrôle qu'on nomme la séquence se réclame de ce qui suit: une suite d'opérations consécutives et ordonnées. Puisqu'on parle d'algorithmique, la séquence aura un début, une fin, et aura un objectif précis.

Formes de la séquence

L'exemple suivant décrit la structure de contrôle «séquence» à la fois sous la forme de morphogramme et de pseudo-code.

Exemple de problème à résoudre: se faire une tasse de thé.
Pseudo-code
Morphogramme

Faire bouillir de l'eau

Prendre une tasse

Y déposer un sachet de thé

Y verser de l'eau bouillante

Presser le sachet et le retirer

Ajouter un peu d'eau froide

Remarques

Au sujet de la séquence, remarquez les choses suivantes:
Types d'opérations

Par exemple, pour faire bouillir de l'eau, on peut:

Mettre de l'eau dans la bouilloire;
Brancher la bouilloire;
attendre que l'eau bouille.



Exercices sur les séquences

Exercice 1--Solution proposée

Une personne utilise sa voiture pour se rendre au travail. Écrire le pseudo-code et le morphogramme représentant l'algorithme qui permet à cette personne de calculer et d'afficher son coût de déplacement.

Pour cela votre algorithme devra préalablement lire les trois (3) renseignements suivants :
Exercice 2

Les ouvriers d'une entreprise ont reçu une augmentation de salaire de 4%. Cette augmentation est rétroactive de 6 mois.

Écrire le pseudo-code et le morphogramme représentant l'algorithme qui lit:
et affiche:
Exercice 3--Solution proposée--Solution alternative (devinette: laquelle est la meilleure?)

Écrire le pseudo-code et le morphogramme de l'algorithme permettant d'échanger le contenu de deux variables, X et Y.

Vous devrez donc:
Exercice 4

Écrire le pseudo-code et le morphogramme de l'algorithme permettant de calculer et d'afficher et d'afficher le salaire net d'un employé.

Pour cela, il vous faudra lire les informations suivantes:
Il vous faudra tenir compte que l'employé devra payer:
Exercice 5

Un chef d'entreprise veut connaître combien lui coûte la fabrication d'un exemplaire de son produit. Écrire le pseudo-code et le morphogramme représentant l'algorithme qui permet à d'exécuter ce calcul et d'afficher le résultat.

Pour cela votre algorithme devra préalablement lire les trois (3) renseignements suivants :
Exercice 6

Écrire le pseudo-code et le morphogramme de l'algorithme permettant d'échanger le contenu de trois variables: X, Y et Z.

Vous devrez donc:
Exercice 7--Solution proposée

Écrire le pseudo-code et le morphogramme de l'algorithme permettant de calculer et d'afficher le salaire net d'un employé ainsi que le détail des déductions.

Pour cela, il vous faudra lire les informations suivantes:
Il vous faudra tenir compte que l'employé devra payer:

L'alternative

La structure de contrôle qu'on nomme l'alternative se réclame de ce qui suit:

Un exemple de prédicat serait «Jean est plus grand que Roger». En effet, cet énoncé est soit vrai, soit faux, au moment où il est formulé, et pour un Jean et un Roger bien précis.

Un exemple de choix de séquences étant donné la valeur d'un prédicat serait «s'il pleut dehors, alors rester à la maison et lire un livre, sinon aller au parc».

En effet, le prédicat «il pleut dehors» est évalué, et dans le cas où il est vrai (s'il pleut effectivement dehors) la séquence «rester(maison); lire(livre)» sera suivie. Dans le cas où le prédicat s'avère faux (si le temps est ensoleillé), la séquence «aller au parc» sera plutôt celle suivie dans le déroulement du programme.
La forme générale de l'alternative prête aux énoncés suivant le modèle «si (condition) alors (opérations) sinon (opérations)».

Formes de l'alternative

L'alternative peut se présenter sous deux formes:
Première forme de l'alternative
Exemple de problème à résoudre en première forme d'alternative: la pause café.
Pseudo-code
Morphogramme
s'il y a du café frais, alors
   prendre un café
sinon
   faire du café

On remarquera (avec justesse) que ceci représente une pause café bien incomplète. Par exemple, s'il n'y a pas de café frais lors de l'évaluation de la condition, on fera du café, mais on ne le boira pas.

Nous reviendrons à une solution plus satisfaisante (dans tous les sens du mot) sous peu, qui impliquera de composer et d'imbriquer dans notre algorithme à la fois la séquence et l'alternative.
Seconde forme de l'alternative
Exemple de problème à résoudre en seconde forme d'alternative: le noctambule.
Pseudo-code
Morphogramme
si c'est la nuit, alors
   faire la fête
Variante sur la seconde forme d'alternative

La seconde forme d'alternative peut aussi se prêter à une séquence d'opérations seulement dans le cas d'une évaluation du prédicat comme faux, avec un résultat équivalent; par contre, on tend dans ce cas à perdre un peu en élégance.

Par exemple:
Pseudo-code
Morphogramme
si le plancher est propre, alors
sinon
   passer le balai

La même expression aurait pu s'écrire «si le plancher est sale, alors passer le balai» et éviter la suite «si le plancher est propre, alors (rien) sinon ...».

Le résultat aurait été le même, toutefois, en terme d'exactitude et de réalisation de l'objectif fixé. Au sens algorithmique, les deux variantes présentées sont équivalentes; mais au sens de la programmatique, nous privilégierons la première des deux.

Remarques

Imbrication des structures de contrôle: étude de la pause café

Bien entendu, nombreux seront les algorithmes qui combineront plus d'une structure de contrôle dans la poursuite méthodique d'un objectif. Le cas de la pause café se prête bien à un petit exercice d'analyse à ce sujet.
Nous avons:
Pseudo-code
Morphogramme
s'il y a du café frais, alors
   prendre un café
sinon
   faire du café

Pour s'assurer de jouir des fruits de nos efforts, cet algorithme n'est pas tout à fait suffisant: en effet, dans le cas où nous devons faire nous-mêmes le café, l'algorithme n'indique pas que nous en boirons.

Ainsi, mieux vaut enrichir la séquence rencontrée dans le cas où le prédicat «il y a du café frais» s'avère faux, surtout si nous sommes de fervents amateurs du breuvage en question.

Par exemple:
Pseudo-code
Morphogramme
s'il y a du café frais, alors
   prendre un café
sinon
   faire du café
   prendre un café

Mais on se retrouve à insérer une forme de redondance dans notre algorithme: en effet, peu importe le chemin emprunté, on finit dans chaque cas par «prendre un café», et ce en dernier lieu dans chaque cas.

On pourra tirer avantage de cette réalisation pour simplifier notre algorithme:
Pseudo-code
Morphogramme
s'il n'y a pas de café frais, alors
   faire du café
prendre un café
La beauté de tout ceci, c'est que la séquence et l'alternative se joignent l'une à l'autre et se combinent tout naturellement. Nous tirerons d'ailleurs continuellement avantage de cette propriété.

Exercices sur l'alternative

Exercice 8--Solution proposée
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de:
Exercice 9
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de:
Exercice 10
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de:
Exercice 11

Vous devez calculer et afficher la note finale d'un étudiant, ainsi que la mention succès ou échec. Cet étudiant a passé trois (3) examens et la note de passage est soixante (60).

La note finale est calculée comme étant la moyenne des examens.

Créez le pseudo-code et le morphogramme de l'algorithme permettant de résoudre ce problème.
Exercice 12--Solution proposée
Vous devez calculer et afficher la note finale d'un étudiant, ainsi que la mention succès ou échec. Cet étudiant a passé trois (3) examens ayant les pondérations suivantes:
La note de passage est soixante (60%). La note finale est calculée comme étant la moyenne des examens en tenant compte de la pondération de chaque examen. Créez le pseudo-code et le morphogramme de l'algorithme permettant de résoudre ce problème.
Exercice 13

Vous devez calculer et afficher la note finale d'un étudiant, ainsi que la mention succès ou échec. Cet étudiant a passé trois (3) examens et la note de passage est soixante (60).

La note finale est calculée comme étant la moyenne des examens. Si l'étudiant obtient une note finale se situant entre 55% et 60%, il a droit à un examen de reprise, et obtiendra la note de 60% dans la mesure où il réussit ce dernier.

Créez le pseudo-code et le morphogramme de l'algorithme permettant de résoudre ce problème.
Exercice 14
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de lire deux (2) nombres et d'afficher le plus grand des deux. Il ne peut y avoir d'égalité entre les nombres.
Exercice 15
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de lire deux (2) nombres et d'afficher le plus petit des deux. Présumez que ces nombres ne sont pas égaux entre eux.
Exercice 16
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de lire trois (3) nombres et d'afficher le plus grand des trois. Présumez que ces nombres ne sont pas égaux entre eux.
Exercice 17
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de lire trois (3) nombres et d'afficher le plus petit des trois. Présumez que ces nombres ne sont pas égaux entre eux.
Exercice 18
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de lire le rayon d'un cercle, ainsi que le choix de l'utilisateur et imprime:
Le choix de l'utilisateur peut être:
Tout autre choix doit générer un message d'erreur.
Exercice 19
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de lire la largeur et la longueur d'un rectangle, ainsi que le choix de l'utilisateur et affiche:
Le choix de l'utilisateur peut être:
Tout autre choix doit générer un message d'erreur.
Exercice 20
On donne à un vendeur le choix suivant:
  1. un salaire fixe de 300 $ par semaine;
  2. un salaire fixe de 140 $ par semaine plus 10% de commission sur les ventes;
  3. 15% de commission sur les ventes.
Écrire le pseudo-code et le morphogramme de l'algorithme permettant de lire:
et d'afficher:

La répétitive

La structure de contrôle qu'on nomme la répétitive se réclame de ce qui suit:
Le principe de revenir au point d'évaluation du prédicat jusqu'à ce que celui-ci devienne faux évoque l'image d'une boucle; on dira d'ailleurs souvent des répétitives qu'elles sont, simplement, des boucles.

La forme générale de la répétitive se prête aux énoncés suivant le modèle «tant que (condition) faire (opérations)».

Exemple: surveillance de la crème en cours de cuisson.
Pseudo-code
Morphogramme
tant que la crème ne bout pas
   brasser la crème
         

Le morphogramme d'une répétitive est intéressant car il permet de bien saisir son aspect dynamique. La figure précédente permet de bien représenter le mouvement qui anime cette structure.

Le point d'entrée est en haut. Tant que la condition à évaluer représentée par le losange reste vraie, il y a exécution de l'opération représentée par le rectangle. La ligne qui remonte à gauche indique qu'il faut retourner évaluer la condition.

Le terme boucle qu'on emploie dans le cas de répétitives désigne surtout ce mouvement quasi circulaire.

Quand que la condition devient fausse, on quitte la répétitive en passant par la voie à droite du losange pour atteindre le point de sortie en bas (voir l'exemple de la pile d'examens à corriger, plus bas).

Dans notre exemple, le prédicat à satisfaire est «la crème ne bout pas». Tant que ce prédicat est vrai, l'algorithme indique que la séquence d'opérations à exécuter comprend une seule opération, soit «brasser la crème».

Bien entendu, s'il y a des séquence d'opérations simples comme «brasser la crème», il y en a aussi de plus longues et de plus complexes.

Prenons par exemple le cas d'un pauvre professeur face à une pile d'examens à corriger, où chaque examen comporte quatre questions. Il est possible, si l'on sait combien d'examens se trouvent dans la pile, de rédiger un algorithme permettant la correction de chacun d'entre eux avec une séquence. Toutefois, cette séquence pourrait devenir arbitrairement longue en fonction du nombre d'examens dans la pile.

Toutefois, avec une répétitive, nous pouvons arriver à un algorithme relativement simple et élégant pour résoudre ce problème:
Pseudo-code
Morphogramme
Tant qu'il reste au moins une copie
   prendre cette copie
   corriger la question 1
   corriger la question 2
   corriger la question 3
   corriger la question 4
   inscrire le total sur la 1ière page
   ranger cette copie
Question piège: si on voulait écrire l'algorithme précédent à l'aide d'une séquence seulement, en sachant qu'il y a cinquante (50) examens dans la pile, combien notre séquence comporterait-elle d'étapes?

Remarques

On peut considérer les traits verticaux ajoutés au pseudo-code comme les marques des niveaux d'indentation.

Exercices sur la répétitive

Exercice 21
Écrire le pseudo-code et le morphogramme d'un algorithme de compte à rebours qui aura pour objet d'écrire successivement les valeurs entières de 10 à 0 inclusivement.
Exercice 22--Solution proposée
Écrire le pseudo-code et le morphogramme d'un algorithme qui aura pour objet d'écrire successivement les nombres pairs de 2 à 50 inclusivement.
Exercice 23
Écrire le pseudo-code et le morphogramme d'un algorithme de compte à rebours qui aura pour objet d'écrire successivement les valeurs entières de 20 à 10 inclusivement.
Exercice 24
Écrire le pseudo-code et le morphogramme d'un algorithme qui aura pour objet d'écrire successivement les nombres impairs de 3 à 49 inclusivement.
Exercice 25
Écrire le pseudo-code et le morphogramme d'un algorithme qui aura pour objet d'établir la somme des nombres impairs de 1 à 99 inclusivement et d'écrire cette somme.
Exercice 26
Écrire le pseudo-code et le morphogramme d'un algorithme qui aura pour objet d'établir la somme des nombres impairs de 77 à 7 inclusivement et d'écrire cette somme.
Exercice 27
Écrire le pseudo-code et le morphogramme d'un algorithme qui aura pour objet d'établir la somme des nombres pairs de 64 à 32 inclusivement et d'écrire cette somme.
Exercice 28
Écrire le pseudo-code et le morphogramme d'un algorithme qui aura pour objet d'établir la somme des nombres pairs de 2 à 32 inclusivement et des nombres impairs de 33 à 65. Votre algorithme devra faire afficher cette somme.
Exercice 29--Solution proposée

Vous devez calculer la moyenne des examens d'un groupe de dix-huit (18) étudiants. Chaque étudiant a passé trois (3) examens.

Vous désirez obtenir la moyenne de chacun des étudiants aux examens, ainsi qu'un commentaire qui variera selon la moyenne obtenue (voir tableau ci-dessous). Créez le pseudo-code et le morphogramme de l'algorithme permettant de résoudre ce problème.
Condition
Commentaire
0 <= Moyenne < 60 ( 0 à 59)
Échec
60 <= Moyenne < 70 (60 à 69)
Bien
70 <= Moyenne < 85 (70 à 84)
Très Bien
85 <= Moyenne <= 100 (85 à 100)
Formidable
Exercice 30
Vous devez calculer la moyenne des examens d'un groupe d'étudiants. Le nombre d'étudiants dans le groupe peut varier selon la demande de l'utilisateur.
Chaque étudiant a passé trois (3) examens dont la pondération est la suivante:

Vous désirez obtenir la moyenne aux examens de chacun des étudiants, ainsi qu'un commentaire qui variera selon la moyenne obtenue (voir tableau de la question précédente). Créez le pseudo-code et le morphogramme de l'algorithme permettant de résoudre ce problème.

La méthode du développement graduel

La méthode du développement graduel (ou développement progressif) permet de percevoir un problème complexe comme une problème plus simple mais composé de sous problèmes. L'idée derrière ce concept est de parvenir à résoudre le problème malgré son apparence abrupte.

Changer de lunettes

Résoudre un problème par voie de développement graduel ne signifie pas concrètement de changer le problème rencontré pour un autre, du moins pas en changeant sa nature. On a plutôt en tête de changer le regard que l'on pose sur le problème.

Cela peut se faire de plusieurs manières. Les plus fréquemment rencontrées sont:
La méthode du développement graduel s'inspire de chacune de ces méthodes, en les intégrant dans un tout cohérent:

Exercices de développement graduel

Pour résoudre les exercices 31 à 35, inspirez-vous de cet exemple de la technique du développement graduel.

Exercice 31

Écrire le pseudo-code et le morphogramme d'un algorithme qui aura pour objet de produire à l'écran un rectangle de 10 lignes sur 8 colonnes identique à celui présenté ci-dessous:

********
********
********
********
********
********
********
********
********
********

Exercice 32

Écrire, en utilisant la technique du développement graduel, le pseudo-code et le morphogramme d'un algorithme qui aura pour objet de produire à l'écran un triangle identique à celui présenté ci-dessous:

*
**
***
****
*****
******
*******
********
*********
        



Exercice 33

Écrire, en utilisant la technique du développement graduel, le pseudo-code et le morphogramme d'un algorithme qui aura pour objet de produire à l'écran un triangle identique à celui présenté ci-dessous:

**********
*********
********
*******
******
*****
****
***
**
*
          


Exercice 34

Écrire, en utilisant la technique du développement graduel, le pseudo-code et le morphogramme d'un algorithme qui aura pour objet de produire à l'écran un triangle identique à celui présenté ci-dessous:

<****>
<<****>>
<<<****>>>
<<<<****>>>>
<<<<<****>>>>>
<<<<<<****>>>>>>
<<<<<<<****>>>>>>>
<<<<<<<<****>>>>>>>>
<<<<<<<<<****>>>>>>>>>
<<<<<<<<<<****>>>>>>>>>>

 

Exercice 35

Écrire, en utilisant la technique du développement graduel, le pseudo-code et le morphogramme d'un algorithme qui aura pour objet de produire à l'écran un triangle identique à celui présenté ci-dessous:


         *
        ---
       *****
      -------
     *********
    -----------
   *************
  ---------------
 *****************
-------------------

 



[1] Nous reviendrons sur la notion de décomposition lors de l'étude du développement graduel.
[2] ... ou vraie, c'est selon; les deux formes sont, en fait, équivalentes entre elles.
[3] Incrémenter est un anglicisme pour «augmenter de 1». L'opération est tellement commune en informatique qu'on en est venu à utiliser un terme spécifique pour la dénoter.