Algorithme -1-

Schéma de programme (partie-1)

On se souvient que l’écriture d’un schéma d’algorithme permet de préparer un schéma de programme en s’affranchissant des contraintes syntaxiques liées aux langages de programmation. D’un point de vue algorithmique, la phase d’analyse d’un problème se concrétise par l’écriture d’un ou plusieurs schémas d’algorithmes. L’étape suivante, la phase de conception est exprimée à l’aide de que l’on appelle un schéma de programme qui consiste en la traduction du schéma d’algorithme afin d’introduire certains concepts et abstractions spécifiques aux langages de programmation. Cette démarche permet de modéliser la logique d’un problème en allant du plus abstrait au plus concret par transitions successives.

Un schéma de programme permet donc de faire mentalement la différence entre ce qui relève de la structure logique d’un problème à résoudre et de ce qui relève du langage de programmation particulier.

On conviendra cependant, que cette approche pour la construction de programmes, doit être suivie dans une optique d’apprentissage progressif de la programmation. Lorsque les bons principes de programmation sont acquis, un développeur pourra faire l’impasse de l’écriture des schémas d’algorithme pour se consacrer uniquement à la réalisation d’un schéma de programme. Quant à lui, un développeur averti écrira ses algorithmes directement dans le langage de son choix, bien que le schéma de programme reste un bon exercice de réflexion et permet aussi de documenter un algorithme indépendamment des langages de programmation.

Le schéma de programme est un modèle de programme ou l’on introduit quelques spécificités des langages de programmation . Le schéma de programme est exprimé comme une suite d’actions, réalisées par des instructions. Sa syntaxe est proche de celles de langages classiques comme Java, C, Ada, Go, Objective-C ou Swift. Notre approche pour la réalisation d’un programme informatique se décrit en trois étapes importantes selon trois niveaux d’abstraction:

  • Algorithme: écrire un schéma d’algorithme pour résoudre un problème algorithmique (phase d’analyse).
  • Modèle de programme: décliner le schéma d’algorithme en schéma de programme (phase de conception).
  • Programme: Coder le schéma de programme dans le langage de programmation retenu (phase de construction).

Il est démontré que pour traduire un schéma de programme dans n’importe quel langage de programmation, il suffit de connaitre trois types de construction, quelque soit la complexité du problème à résoudre:

  • L’assignation de données aux structures de données
  • La lecture et l’écriture de données
  • Le contrôle de la logique par la Séquence, le Choix conditionnel, la Répétition
Exemple: calcul de la moyenne de math
L’algorithme en texte libre
  1-Faire 3 fois les 2 instructions Suivantes 
     2-Entrer "la note de math" 
     3-Placer "la note de math" dans la mémoire avec la touche "addition"
  4-Activer la touche "division" Entrer le nombre 3
  5-Afficher le résultat
  6-Si le résultat est inférieur à 10 alors Afficher le message "Travail insuffisant"
  7-Si le résultat est inférieur à 14 alors Afficher le message "Bon travail"
  8-Si le résultat est supérieur ou égal à 14 alors Afficher le message "Excellent Travail"
Schéma Algorithme
Schéma algorithme CalculMoyenne
    Description
        Objectif:    Calcul de la moyenne de trois notes.
        Donnée: 
           nombreTrimestre   nombreTrimestre" est un nombre
           compteur          compteur" de boucle  est un nombre
           resultat          résultat" est un nombre 
        Résultat: La moyenne calculée
    Fin-Description 
    
    Action CalculMoyenne 
        Afficher("Calcul de la moyenne") 
        Affecter(3,nombreTrimestre) 
        Affecter(0,résultat) 
        Affecter(0,compteur) 
        TantQue Inferieur (compteur,nombreTrimestre) 
        Faire 
           Prendre(note) -- Fonction externe pour demander une note
           Additionner(note, resulat) -- Addition de note à resultat
           PlusUn(compteur)   
        Fin-Faire 
        Diviser (resultat, nombreTrimeste)  
        Afficher ("Le résultat est ", resultat) 
        Si Inférieur(resulat,10) 
        Alors 
           Afficher ("Doit mieux faire" ) 
        Sinon 
           Si Inférieur(resulat,14)
           Alors 
              Afficher ("Bon travail") 
           Sinon 
              Afficher ("Excellent travail") 
           Fin-Si 
        Fin-Si 
      Fin-Instruction 
   Fin-Action 
Fin-Schéma 
Schéma de programme
Schéma programme CalculMoyenne
    Procedure Calcul  
        Déclaration
           nombreTrimestre : Nombre -- "nombreTrimestre" est un nombre
           compteur : Nombre        -- "compteur" de boucle  est un nombre
           resultat : Nombre        -- "résultat" est un nombre
        Instruction 
            Afficher("Calcul de la moyenne")
            nombreTrimestre = 3   
            résultat = 0
            compteur = 0
            TantQue (compteur < nombreTrimestre) 
                Faire 
                    Prendre (note)  -- Fonction externe pour demander une note
                    resulat = resultat + note
                    compteur = compteur + 1 
                Fin-Faire
                resulat = resultat / nombreTrimestre
                Afficher ("Le résultat est ", resultat)  
                Si (resulat < 10)
                Alors 
                    Afficher ("Doit mieux faire" )
                Sinon 
                    Si (resulat < 14)
                    Alors 
                        Afficher ("Bon travail") 
                    Sinon 
                        Afficher ("Excellent travail")
                    Fin-Si
                Fin-Si       
        Fin-Procedure     
   Fin-Schéma

Définition formelle
Les types de schéma de programme

Un schéma de programme utilise des instructions, des variables et des données pour permettant la résolution d’un problème. Les instructions sont les actions à effectuer, les variables représentent les données dont certaines sont connues dés le départ d’autres sont calculées lors de l’exécution de l’algorithme. On distingue 4 genres de schéma de programme:

  • Schéma Principal pour la représentation abstraite d’un programme principal
  • Schéma Procédure pour la représentation abstraite d’un sous-programme de type Procédure
  • Schéma Fonction pour la représentation abstraite d’un sous-programme de type Fonction
  • Schéma Objet pour la représentation abstraite d’un Objet selon la paradigme Orienté-Objet

On notera les améliorations syntaxiques suivantes pour se rapprocher de la syntaxe des langages de programmation:

  • Ajout de mot-clef (Déclaration, Instruction, Interface)
  • Déclaration des variables de données avec leur type
  • Utilisation du signe = pour l’assignation de valeur à une variable
  • Introduction des opérateurs logiques ( <, >, etc…)
  • Introduction des opérateurs arithmétiques
  • Changement du mot clé Description du schéma algorithmique en Interface
  • Le schéma de programme est appelé Schéma Principal et porte un nom
  • Le groupement d’instruction Action porte une nom

Un schéma de programme est défini avec un vocabulaire et une syntaxe suffisamment précise pour permettre une traduction aisée dans la plupart des langages de programmation. Le schéma d’algorithmique ne précise volontairement pas la notion de type de données alors que le schéma de programme introduit des types abstraits (nombre, mot, caractères, élement) nécessaires pour aborder la programmation. Nous avons jusqu’à présent étudié comment écrire un schéma d’algorithme comme préalable au schéma de programme, il va sans dire que cette approche est purement pédagogique , elle vise simplement à préparer un débutant à l’art de programmer. Une fois les concepts de programmation compris et assimilés, il suffit d’exprimer la conception d’un problème informatique directement avec un schéma de programme tels que nous en définissons la structure, le vocabulaire et la syntaxe dans cet article

Fonctions:

Nous appellerons Fonction les primitives du schéma d’algorithme, Ils permettent de symboliser des actions abstraites mais nécessaires pour la compréhension du programme. On trouve souvent les mots :

  • Prendre ou Lire: pour demander à l’utilisateur d’entrer une donnée
  • Écrire: pour afficher une donnée qui peut être lue par l’utilisateur ou par tout autre média
Délimiteurs

Les délimiteurs sont des marques utilisées pour délimiter des blocs d’instructions afin de faciliter la lecture et la compréhension de l’algorithme: Si et Fin-Si, Instruction et Fin-instruction sont des mots délimiteurs.

Types de données
Structure simple
  • Le type Nombre permet de déclarer une variable composée de chiffres. On ne se préoccupe pas de savoir si c’est un nombre réel, entier fractionnaire, etc…
  • Le type Mot permet de déclarer une variable composée d’une suite de caractères numériques ou alphanumériques)
  • Le type Texte permet de déclarer une suite se mots souvent nommée chaine de caractères
  • Le type Caractère permet de déclarer une variable composée d’un caractère unique quel qu’il soit numérique, alphabétique, ou autres….
  • Le type Element permet de déclarer une variable générique qui peut être de type Nombre, Caractère,Texte ou Mot
Structure de donnée logique
  • Le type Booléen permet de déclarer une variable prenant la valeur vrai ou faux .
Structure de donnée complexe

Parmi les plus courantes on trouve:

  • Enregistrement: Un groupe d’éléments structuré comme des “champs” séparés
  • Phrase: un groupe d’éléments formant un texte libre
  • File séquentielle: Une suite finie d’éléments.
  • Vecteur: Un ensemble fini d’éléments accessible grâce à un index de type nombre entier
  • Table: Un ensemble fini d’éléments dont chaque élément est associé un nom appelé clé ou indicatif
  • Pile: Un ensemble fini d’éléments organisé comme une pile d’assiette dont on ne peut q’agir sur l’élément du sommet, à savoir ajouter un élément sur le sommet ou retirer le dernier élément du sommet.
  • Liste linéaire: Un ensemble fini d’éléments dont chaque élément contient un indicatif permettant d’accéder au suivant.
  • Arbre: Un ensemble fini d’éléments organisé sous forme arborescente à la manière d’un arbre généalogique.
  • Graphe: Un ensemble fini d’éléments dont certaines paires sont directement reliées par un ou plusieurs lien(s).

 

Variables: Déclaration & affectation

Pour désigner l’emplacement ou se trouve une valeur on utiliser un nom appelé identificateur. L’emplacement dans lequel on va pouvoir placer une valeur et éventuellement la remplacer par une autre induit la notion de variable. Un identificateur permet donc de nommer une variable qui va servir de rangement temporaire ou définitif à une valeur. La valeur rangée dans une variable peut ainsi varier au cours du temps. Le fait de nommer une variable grâce à son identificateur permet d’accéder à la valeur qu’elle contient.

L’opération d’effacement et de rangement d’une valeur dans une variable s’appelle affectation. Ainsi l’ancienne valeur est perdue après une opération d’affectation. On note que la valeur contenue dans une variable peut être de nature simple ou structurée.

Afin de déclarer une variable on utilise la primitive de déclaration Variable pour indiquer son nom et son type. Le type d’une valeur renseigne sur la forme de la valeur qui peut être un nombre, une lettre, un texte, une photo etc…

L’opération d’effacement et de rangement d’une valeur s’appelle l’opération d’affectation à une variable schématisée par l’opérateur « = ».

Les primitives de déclaration et d’affectation s’écrivent:

-- Déclaration d'une variable dont l'identificateur est Val. 
-- la variable Val ne  peut recevoir que des nombres entiers
Variable Val : Nombre
Val = 1         -- Attribuer la valeur 1 à la variable Val 
Val = Val + 1   -- Attribuer la valeur 2 à la variable Val 

On remarque que:

  • L’ancienne valeur de la variable est perdue après l’opération d’affectation
  • La valeur peut être le résultat d’une expression arithmétique ou logique
  • La variable peut apparaître dans une expression et sert d’opérande dans l’expression comme « heure = heure + 1 »
Interface

La partie Interface est la partie visible ou abstraite du modèle de programme, elle contient la description et la spécification de ce que sera le programme à développer. C’est la partie QUOI que l’on peut comparer à l’étiquette d’un colis postal donnant toutes les informations utiles sans avoir à connaitre à priori ce qui se trouve à l’intérieur.

    Description
       Objectif: Description du but poursuivi par le programme à développer
       Données:  Description des données de l'algorihme
       Résultat: Description des résultats attendus
       Remarque: Description des contraintes et limitations de l'algorithme
    Fin-Description
    Déclaration
       Variable
          -- déclaration de variable 
       Fin-Variable
       Opération
          -- Déclaration de Procedure
          -- Déclaration de Fonction
          -- Déclaration de Prédicat
       Fin-Opération
    Fin-Déclaration
Condition: Choix

Un moyen de composer des actions est d’en sélectionner certaines en fonction d’une condition Vrai-Faux de type Booléen. On utilise deux formes de structure conditionnelle:

  • Le choix simplifié à une alternative Si <condition> Alors <séquence d’actions> Finsi
  • Le choix à deux alternatives: Si <condition> Alors <séquence d’actions> Sinon <séquence d’actions> Finsi
  • le choix multiple
Itération : Boucle

La structure itérative permet de répéter autant de fois que l’on veut une séquence d’actions. La séquence d’actions est exécutée tant que la condition qui contrôle l’itération est vérifiée.

Opérateurs

Les opérateurs sont définis sur un ensemble de valeurs et l’on doit, dans chaque cas particulier, définir avec soin, les valeurs que l’on manipule et les opérateurs sur ces valeurs. Ci-dessous une liste des opérateurs les plus usités:

  • L’opérateur d’affectation « = » souvent utilisé dans les langages de programmation
  • Les opérateurs arithmétiques « +,-,*,/,% » addition, soustraction, multiplication, division et pourcentage de nombres réels
  • Les opérateurs de comparaison « ==,!=,<=,>=,<,> » égal, différent, plus petit ou égal, plus grand ou égal, plus petit, plus grand
  • Les opérateurs logiques « &&, ||, ! » ET, OU, NON ( dont les symboles varient suivant le langage de programmation).
  • Opérateurs unaires d’affectation « ++, – » Plus, Moins ( symbole utilisés dans le langage C, Objective-C, …)

 

Action

La partie Action est la partie concrète qui permet de réaliser la logique du modèle de programmation. C’est la partie COMMENT qui contient la suite d’instructions permettant de décrire la logique de ce que sera le programme à développer. Les instructions sont une suite de commandes que l’on exécute l’une après l’autre en partant de la première jusqu’à la dernière suivant un ordre séquentiel.

Les instructions sont de plusieurs types

  • Composée : Choix, Boucle
  • Simple: déclaration ou affectation de variables
  • Primitive: déclaration des fonctions établissant une communication entre cette action et l’extérieur
  • Appel de fonction externe: procédure, fonction, prédicat ou objet.


D’un manière générale une Action ou fonction peut se définir comme le regroupement d’une séquence d’instructions dont l’un de objectifs principaux est de découper le problème global en plusieurs sous-problème. Cette approche modulaire présente l’avantage de pouvoir réutiliser des Actions définies dans d’autres schéma de programme favorisant ainsi la réutilisation du code.
Une Action exécute le bloc d’instruction en utilisant la liste de paramètres qu’on lui donne et généralement retourne un ou plusieurs résultats (remarque: une fonction qui renvoie systématiquement la même valeur de retour pour les mêmes paramètres, est une fonction au sens mathématique du terme). En particularisant le concept d’Action défini ci-dessus, on détermine en informatique quatre types d’Action dont les noms et propriétés sont:

  • Une Action appelée Fonction rend un et un seul résultat.
  • Une Action appelée Prédicat délivre un seul résultat de type booléen.
  • Une Action appelée Procédure renvoie de zéro à plusieurs résultats.
  • Une Action appelée Principale permet de définir le point d’entrée du schéma de programme

Les Actions ont un Nom et une liste d’Instructions à exécuter. Elle se décompose en deux parties distinctes l’Interface (spécification) et le Corps (Implémentation).

On parle de la Signature d’une Action pour designer les éléments qui la décrivent, la signature comprend:

  • Un mot réservé ou mot clé: Fonction, Procédure ou Prédicat
  • Un identifiant qui est le nom donné par l’utilisateur
  • Une liste de paramètres ou variables contenant les données en entrée et en sortie.

Le Corps est composé d’une suite d’instructions assurant l’ensemble des traitements de la fonction. Le corps est donc composé d’un ensemble d’instructions et de déclarations de variables (dites locales) ainsi que de ses propres fonctions et procédures (dites imbriquées).

Chaque schéma possède une Interface et une ou plusieurs Actions. Rappel: une Interface ou spécification désigne le « quoi » du schéma, la partie Action représente le « comment » autrement dit l’implémentation de l’interface.
Structure d’un schéma de programme

Rappelez vous la syntaxe d’un schéma d’algorithme qui se veut simple est déconnectée de tout paradigme de programmation. La syntaxe du schéma de programme est définie pour faciliter sa traduction dans la plupart des langages. Pour cela quelques modifications syntaxiques ont été apportées:

  • Le mot réservé Description devient Interface ( terme très souvent utilisé en programmation
  • L’affectation s’écrit plus simplement avec un signe égal
  • Un nouveau mot-clef Variable est introduit pour définir le type et le nom d’une donnée
  • Les schéma Principal, Fonction, Procédure, Prédicat permettent la modularisation du schéma de programme
  • Dans la partie Interface on introduit le mot réserve Schéma pour déclarer un sous-schéma utilisés dans un schéma de programme
  • On utilise les opérateurs arithmétiques et logiques classiques
Types de schéma

Il est le point d’entrée d’un schéma de programme. L’exemple suivant de calcul de puissance montre comment inclure dans un schéma Principal une Fonction, une Procédure et un Prédicat. Chaque schéma porte le nom de son Interface comme précisé ci-dessous:

  • Schéma principal: Puissance-Nombre
  • Schéma Fonction: CalculPuisance
  • Schéma Procédure: CalculPuissance
  • Schéma Prédicat: NombrePlusPetitQue5
Exemple: Calcul de la puissance d’un nombre

Le schéma principal de calcul de puissance utilise trois fonctions externes déclarées dans le schéma de programme PuissanceDeNombre. Elles dont déclarées dans la partie Interface avec le mot clé Opération.

Schéma Programme PuissanceDeNombre    
    Interface 
        Objectif: Élever un nombre plus petit que 5 à une puissance
        Résultat: le nombre n élevé à la puissance p
        Variable 
            n : Nombre     -- Le nombre à choisir
            p : Nombre    -- La puissance à choisir
            resultat : Nombre
        Opération 
            Fonction  resultat = CalculPuissance (n Nombre,p Nombre)
            Procédure CalculPuissance (n Nombre,p Nombre)
            Prédicat  EstPlusPetitQue5 (n Nombre)
        Résultat: le nombre  n élevé à la puissance p
    Fin-Interface

    Principal
        Afficher ("Calcul d'un nombre à une  puissance")
        Prendre  ("Entrez le nombre", n )
        Prendre  ("Entrez la puissance", p )
        Si  PuissanceDeNombre.EstPlusPetitQue5(n)  -- Test avec Prédicat
        Alors 
            -- Calcul de la puissance d'un nombre avec une Fonction
            resultat = PuissanceDeNombre.CalculPuissance (n,p)
            Afficher ("Le résultat est", resultat) 
            -- Calcul de la puissance d'un nombre avec une Procédure
            PuissanceDeNombre.CalculPuissance (n,p,resultat)
            Afficher ("Le résultat est", resultat)  
        Sinon 
            Afficher ("Désolé Le nombre est plus grand ou égal à 5") 
        Fin-Si     
    Fin-Principal

    Fonction résultat = CalculPuissance (n,p)
        Déclaration
            Variable (compteur,Nombre)  -- un compteur d'itération et un nombre
        Instruction
            Co Cette Action utilise une boucle itérative et 
               un compteur pour calculer la puissance p de n oC
            compteur = 0
            resultat = 1
            TantQue  (compteur < p ) 
            Faire 
                compteur =  compteur + 1  
                resultat =  resultat * n            
            Fin-Faire 
            Retourner resultat 
        Fin-Instruction
    Fin-Fonction

    Procédure CalculPuissance (n,p,resultat)
        Déclaration 
             Variable (compteur,Nombre) -- un compteur d'itération et un nombre
        Instruction
            CO Cette Action utilise une boucle itérative et 
               un compteur pour calculer la puissance p de n 
            OC
            compteur = 0
            résultat = 1
            TantQue (compteur < p) 
            Faire 
                compteur =  compteur + 1  
                resultat =  résultat * n            
            Fin-Faire 
        Fin-Instruction
    Fin-Procédure   

    Prédicat EstPlusPetitQue5 (n)
        Objectif
            Vérifier que le nombre est plus petit que 5 
            et retourner la valeur "Vrai "ou "Faux" 
        Résultat: le résultat est "Vrai "ou "Faux"  
        Déclaration 
            Variable estPlusPetit : Booléen
        Instruction
            CO    Cette Action utilise une structure conditionnelle  OC
            estPlusPetit  = Faux
            Si  (n <  5) Alors 
                estPlusPetit  = Vrai            
            Fin-Si 
            Retourner estPlusPetit 
        Fin-Instruction    
    Fin-Prédicat
Fin_Schéma

 

En Résumé
  • Cet article est une brève présentation du langage de schéma de programme
  • L’article suivant présente des exemples de programme en C, Ada, Go afin de donnent un aperçu de quelques règles de de traduction de schéma de programme