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).
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