UE N5EE02A –
Algorithmique et
Programmation Impérative
-
Du raffinage à l’algorithme
Pré-requis:
Aucun en particulier, sinon avoir déjà interagi avec un ordinateur au cours de sa vie…
Objectifs:
En appui de ces enseignements théoriques, une large part est donnée aux aspects
pratiques avec un bureau d'étude. Il permettra d'illustrer de manière pratique
l'ensemble des notions vues en cours, du son raffinage jusqu’a l'organisation
algorithmique du projet, jusqu’à son implantation et son utilisation sur un calculateur.
Analyse
Programme
spécification conception Compilation
codage exécution
Problème
besoin
Algorithmique et
méthode de raffinage Langage C
COURS
COURS
Algorithmique et
méthode de raffinage
COURS
Cours / TD
BE : 8 séances
Evaluation
Pseudo-code Organigramme
Début
Prendre un verre
Prendre un verre
Fraise
Si CHOIX menthe Choix
FinSi Mettre de la
limonade
Mettre de la limonade
Mettre un glaçon Mettre un
glaçon
Fin
L’objectif est, dès le départ du projet, d’avoir une idée la plus précise possible de la demande
afin d’éviter les malentendus de conception
Le raffinage permet de détailler le cahier des charges afin d’avoir une idée précise de la
réalisation avant de commencer la conception de l’algorithme et sa programmation
Exemples de processeur
1 Il faut exprimer l’action principale R0 que l’on veut réaliser et avec quel
processeur on souhaite le faire
Tant que l’on considère que les actions sont trop complexes
pour être comprise par le processeur, la décomposition
continue par ajout de niveaux ( R1, R2, R3,…)
Version Arbre
R0 : Préparer un diabolo menthe Niveau 0
R2 : Verser la R2 : Remettre
R2 : Ouvrir le R2 : Prendre la R2 : Fermer le
frigo limonade
limonade dans le limonade au
frigo
Niveau 2
verre frigo
R0 : Action Principale
R1 : A1 R1 : A2 Niveau 0
R2 - A1 R2 - A2 R2 - A3 R2 - A4 Niveau 1
Actions réalisables
par le processeur
Version Ecrite
Version Arbre
R0 - Action Principale Niveau 0
R1 - A1 R1 - A2 Niveau 1
R2 - A1 R2 - A2 R2 - A3 R2 - A4 Niveau 2
Structures de contrôle
• Si … Alors … FinSi
• Si … Alors … Sinon … FinSi
• Selon … dans …Sinon … FinSelon
• Tant que … Faire … FinTQ
• Faire … tant que …
• Répéter … jusqu’à …
• Pour … jusqu’à … FinPour
• …
Exemple 1
Version Ecrite
R0 : Action Principale
Version Arbre
R0 : Action Principale Niveau 0
R1 - Action 1 R1 - Action 2
Exemple 2
Version Ecrite
R0 : Action Principale
Version Arbre
R0 : Action Principale Niveau 0
OUI NON
Réponse Niveau 1
R1 - Action 1 différent de 1 R1 - Action 2
Reprenons l’exemple de la préparation d’un diabolo mais avec une petite variante. Le
diabolo peut maintenant être à la fraise ou à la menthe
Données
Verre
Processeur : Humain Sirop de menthe
Sirop de fraise
Glaçon
Version Ecrite
R0 : Préparer un diabolo Limonade
Données
Verre
Sirop de menthe
Sirop de fraise
Processeur : Humain
Glaçon
Menthe R2 : Mettre du
Choix
sirop de menthe
Fraise
R2 : Mettre du sirop de
fraise
Zone A
Données Zone B
Boulon
Action élémentaires : Le processeur peut
DEBUT DU RAFFINAGE
A ce stade, il est impossible de décrire directement les actions de Niveau 0 avec les actions
élémentaires. On utilise donc des étapes intermédiaires :
Version Ecrite
Version Arbre
R0 : Fonction Principale :
Aller de la Zone A à la Zone B en récupérant le boulon
Niveau 0
Version Ecrite
Le processeur ne sait faire que 4 actions : Avancer d’un pas, Tourner à droite,
Tourner à gauche, Prendre un objet
Est-ce que le processeur ( le robot ) est en mesure d’exécuter les actions de niveau 2 ?
Version Ecrite
Version Arbre
R0 Fonction Principale :
Niveau 0
Aller de la Zone A à la Zone B en récupérant le boulon
Niveau 3
Ici OUI
Le processus de raffinage est terminé
Données Eau
Thé
Tasse
Bouilloire
Version Ecrite
Version Arbre
R0 : Préparation d’un thé
Version Ecrite
Version Ecrite
R0 : Préparation d’un thé
Version Arbre
R2 : Contrôler la
R2 : Remplir la bouilloire Niveau 2
température de l’eau
Version Ecrite
R0 : Préparation d’un thé
Complexification : On veut pouvoir préparer des cafés – noisettes et des thés au lait
Le raffinage va par contre faire apparaitre de nouvelles actions et des nouvelles données
Données :
R0 : Préparation d’une boisson
Données Niveau 0
chaude
Eau
Thé
Café Choix
?
Bouilloire
Lait Café
Choix
Chaque sous-action peut maintenant être décomposée en niveaux inférieurs. Par exemple,
pour la préparation d’un café noisette, on obtient :
Choix ? Niveau 0
Niveau 2
R2 : Faire bouillir R2 : Faire chauffer R2 : Mettre le lait R2 : Mettre le café R2 : Mettre l’eau dans
de l’eau le lait dans la tasse dans la tasse la tasse
La méthode de raffinage permet de faire apparaitre des actions communes qui pourront
être ré-utilisées ( Faire bouillir de l’eau et Mettre l’eau dans la tasse existent déjà dans le
raffinnage précédent ) .
On perçoit déjà à ce stade l’intérêt que cela va présenter par la suite en terme d’organisation
pour la phase de programmation
Si l’on déroule la méthode de raffinage pour cet exemple, une solution peut être :
Choix ?
Niveau 1
R1 : Préparer un R1 : Préparer un thé
R1 : Préparer un café R1 : Préparer un thé
café-noisette au lait
R2 : Mettre l’eau dans R2 : Mettre le café dans R2 : Mettre l’eau dans R2 : Mettre le thé
la tasse la tasse la tasse dans la tasse
A vous de jouer …
Données
- Aspirateur
- Serpillière
Le processeur, c’est vous - Seau
-…
Actions élémentaires :
pas clairs à ce stade …
On va dire que vous avez 3 endroits à gérer : Salon (dans lequel vous dormez ) ,
Salle de Bain+WC, Coin cuisine
Version Ecrite
Niveau 2
R1 : Raffinage de {Accueillir dignement vos invités dans un appartement propre et préparer un repas}
| Nettoyer Appartement
| Préparer un repas
R3 : Raffinage de {Cuisiner le repas}
R2 : Raffinage de {Nettoyer Appartement} | Préparer les ingrédients
| Nettoyer Salon | Réaliser la recette
| Nettoyer Salle de bain | Réserver le plat pour le repas
| Nettoyer Cuisine
Dans l’algorithme, la CHRONOLOGIE des instructions est très importante car elle définit
l’ordre dans lequel seront exécutées les différentes actions par le processeur
Les variables devront bien sûr être manipulables par le processeur qui devra exécuter le
programme
Algorithme en organigramme
Raffinage Variables : … Début
R0 : Action Principale
Pas de
raffinage de Algorithme en Pseudo Code
Niveau 2 pour
R2 - A3 R2 - A4
R1-A1
Variables : …
Raffinage
R0 : Action Principale Début Algorithme
Algorithme en Organigramme
Raffinage
Demander choix
Mettre un glaçon
Fin
L’algorithme complet peut parfois être fastidieux à écrire. On fait donc apparaître la notion de sous-
programme (SP). Le sous-programme est une instruction algorithmique qui regroupe plusieurs autres
instructions.
Début
R0 - Action Principale
Action R2-A1
R1 - A1 R1 - A2 Algorithme du Niveau 1
Action R2-A2
R2 - A1 R2 - A2 R2 - A3 R2 - A4 Début
Fin
R0 : Action Principale Action R1-A1
R1 : Raffinage de {Action Principale}
| Action R1-A1 Action R1-A2
| Action R1-A2
Algorithme du SP R1-A1
Action R2-A4
Fin
- Les sous-programmes qui ne renvoient aucune donnée vers l’appelant : ils sont
appelés PROCEDURES.
- Les sous-programmes qui renvoient une UNIQUE donnée vers l’appelant : ils
sont appelés FONCTIONS. Ces sous-programmes se comportent comme une
fonction mathématique y=f(x). Il faut alors utiliser le mot clef retourne pour
spécifier quelle donnée doit être renvoyée au programme appelant
soit locales au sous-programme, c’est-à-dire que lui seul les connait et les utilise
soit proviennent de l’extérieur, c’est-à-dire que ce sont des variables transmises au
sous-programme. On parle aussi d’arguments du sous-programme.
Un sous-programme qui reçoit des variables de l’extérieur possède 3 modes d’accès à ces
variables :
Toujours dans les spécifications Il faut ensuite donner le contrat que l’algorithme
doit respecter, c’est-à-dire les pré-conditions et post-conditions qui sont
associées à son utilisation.
Une fois les spécifications établies, on peut donner l’algorithme qui décrit
précisément comment est réalisée la tâche assurée par le sous-programme
Rôle et variables
Sémantique: Décrire ce que réalise sous-programme
Spécifications
Param_1 : Mode d’accès (IN, OUT, IN/OUT ) ; Type ; Rôle du paramètre
…
Param_n2 : Mode d’accès (IN, OUT, IN/OUT ) ; Type ; Rôle du paramètre
Contrat
Post-condition : Conditions sur les paramètres en sortie
Tests
================================================================
Test : si les entrées sont … alors l’algorithme doit répondre …
================================================================
Algorithme
[ FONCTION ou PROCEDURE ] [ Nom du sous-programme ] [ Arguments du SP]
Début
...
Fin
Département EEEA 1ère année 64
Exemple 1 : FONCTION
Il reçoit un prix et une réduction. Pas besoin de modifier ces variables donc accès en entrée
(IN)
Il retourne une seule valeur ( OUT ) qui correspond au prix avec la réduction C’est une
FONCTION
Rôle et variables
Nom : FONCTION CALCUL PRIX
Sémantique: calcul le prix d’un article avec réduction
Paramètres:
prix (IN) - réel - prix de l’article sans réduction
Spécifications
reduction (IN) - réel - valeur de la réduction en %
prix final (OUT) - réel - prix avec réduction
Contrat
Pré-condition : prix > 0 et 0 < reduction en % < 100 doivent être initialisés
Post-condition : aucune
=====================================================================================
Tests
Test : prix = 100 ; réduction = 20 ; prix_final = 80 ;
=====================================================================================
Ecriture del’algorithme
============================================================================
Nom : FONCTION CALCUL PRIX
Sémantique: calcul le prix d’un article avec réduction
Paramètres:
Spécifications
FONCTION CALCUL PRIX ( prix, reduction (IN) : réel ) retourne réel prix_final
Algorithme
Début Algorithme
prix_final = prix*(1-reduction/100)
retourner prix_final
Fin Algorithme
Appel du sous-programme
Algorithme Programme Principal
FONCTION CALCUL PRIX ( prix (IN) , reduction (IN) réel ) retourne réel prix final
Exemple pour un sous-programme qui reçoit deux variables de type entier val1 et val2
qu’il doit afficher
Pas besoin de modifier les variables donc accès en entrée seulement (IN)
Pas de retour de données vers le programme principale : le sous-programme
est une PROCEDURE
==================================================================================================
Nom : PROCEDURE AFFICHE PARAMETRE
Sémantique: affiche à l’écran les valeurs des 2 paramètres transmis au sous-programme
Spécifications
Paramètres:
val1 (IN) ; entier ; paramètres N°1 à afficher
val2 (IN) ; entier ; paramètres N°2 à afficher
Pré-condition : val1 et val2 doivent être initialisés
Post-condition : aucune
==================================================================================================
Test : val1 = 20 ; val2 = 5 ; La programme affiche : La valeur 1 vaut 20 , La valeur 2 vaut 5
===================================================================================================
Ecriture de l’algorithme
==================================================================================================
Nom : PROCEDURE AFFICHE PARAMETRE
Sémantique: affiche à l’écran les valeurs des 2 paramètres transmis au sous-programme
Spécifications
Algorithme
Début Algorithme
Fin Algorithme
Appel du sous-programme
Algorithme
Algorithme du SP Afficher
Début Algorithme
Aucun retour
Afficher "La valeur 1 vaut" , val1
Afficher "La valeur 2 vaut" , val2
Fin Algorithme
Exemple pour un sous-programme qui reçoit deux variables val1 et val2 qu’il doit
modifier avec 2 nouvelles valeurs newVal1 et newVal2
Besoin de modifier les variables donc accès en entrée / sortie (IN /OUT)
Spécifications
val2 (IN / OUT) - entier - paramètres N°2 à modifier
newVal1 (IN) - entier - nouvelle valeur du paramètres N°1
newVal2 (IN) - entier - nouvelle valeur du paramètres N°2
Pré-condition : aucune
Post-condition : newVal1 et newVal2 doivent impérativement contenir une valeur
=====================================================================================
Test : val1 = x, val2 = x, newVal1 = 5, newVal2 = 3 ; Réponse : val1 = 5, val2 = 3 ;
=====================================================================================
Ecriture de l’algorithme
====================================================================================
Nom : PROCEDURE MODIFIER PARAMETRES
Sémantique: modifie la valeur des 2 paramètres transmis au sous-programme
Spécifications
val1 (IN / OUT) - entier - paramètres N°1 à modifier
val2 (IN / OUT) - entier - paramètres N°2 à modifier
newVal1 (IN) - entier - nouvelle valeur du paramètres N°1
newVal2 (IN) - entier - nouvelle valeur du paramètres N°2
Pré-condition : aucune
Post-condition : newVal1 et newVal2 doivent impérativement contenir une valeur
=====================================================================================
Test : val1 = x, val2 = x, newVal1 = 5, newVal2 = 3 ; Réponse : val1 = 5, val2 = 3 ;
=====================================================================================
Début Algorithme
Algorithme
val1 = newVal1
Val2 = newVal2
Fin Algorithme
Appel du sous-programme
Algorithme
PROCEDURE MODIFIER PARAMETRES (val1 , val2 (IN/OUT) , newVal1, newVal2 (IN) : entier )
v1=3 Début Algorithme
v2=4
val1 = newVal1
v1 et v2 du
programme Val2 = newVal2
Précise que les variables sont en
principale entrée/sortie (IN / OUT) donc
modifiés Fin Algorithme
modifiables par le sous-programme
Exercices et Corrections
=================================================================
Nom : Nom du sous-programme et type ( FONCTION ou PROCEDURE )
Rôle et variables
Sémantique: Décrire ce que réalise sous-programme
Spécifications
Param_1 : Mode d’accès (IN, OUT, IN/OUT ) ; Type ; Rôle du paramètre
…
Param_n2 : Mode d’accès (IN, OUT, IN/OUT ) ; Type ; Rôle du paramètre
Contrat
Post-condition : Conditions sur les paramètres en sortie
Tests
================================================================
Test : si les entrées sont … alors l’algorithme doit répondre …
================================================================
Algorithme
[ FONCTION ou PROCEDURE ] [ Nom du sous-programme ] [ Arguments du SP]
Début
...
Fin
Département EEEA 1ère année 75
Exercices d’applications
Dans ces exercices, le raffinage de l’application est déjà réalisé. Il s’agit donc de se
concentrer sur la traduction en algorithmique des raffinages fournis.
| Afficher le résultat
=====================================================================
Nom : Algorithme de moyenne
Sémantique : Programme principal
Paramètres :
n1 - réels - premier nombre à moyenner
n2 - réels - second nombre à moyenner
moy - réels - valeur de la moyenne
Pré-condition : Aucune
Post-condition : La moyenne des 2 nombres est affichée
=====================================================================
Test : n1 = 15.5 , n2 = 41.3 – résultat : moy = 28.4
=====================================================================
Début Algorithme
m = (n1+n2) / 2
Fin Algorithme
Algorithme SP Saisie_Nombres
========================================================
Nom : PROCEDURE Saisie_Nombres
Sémantique: Assure la saisie des 2 nombres à moyenner
Spécifications
Paramètres:
n1 (IN/OUT) - réel – premier nombre à saisir
n2 (IN/OUT) - réel – second nombre à saisir
pré-condition : Aucune
post-condition : n1 et n2 doivent comporter des valeurs
========================================================
Test : Saisir n1=15.5 , n2 = 41.3 . De retour dans le programme
principale afficher les valeurs qui doivent être correctes
========================================================
Algorithme
=================================
Ecrire "Entrer la valeur du nombre 1 " …
Lire n1 ================================
Ecrire "Entrer la valeur du nombre 2 " Variables : n1, n2,moy : réels
Lire n2
Début Algorithme
Fin Algorithme
Saisie_Nombres ( n1,n2 )
moy = (n1+n2) / 2
Ecrire "La moyenne vaut :" , moy
Fin Algorithme
Début Algorithme
Ecrire " Entrer la valeur de x pour point A "
Lire xA
Ecrire " Entrer la valeur de y pour point A "
Lire yA
Ecrire " Entrer la valeur de x pour point B "
Lire xB
Ecrire " Entrer la valeur de y pour point B "
Lire yB
c = (yB-yA) / (xB-xA)
Ecrire "Le coefficient directeur vaut :" , c
Fin Algorithme
On décide d’utiliser un sous-programme pour saisir les coordonnée des points. Ce sous-
programme gère la saisie de xA,yA,xB,yB
Début Algorithme
Saisie_Points (xA,yA,xB,yB)
c = (yB-yA) / (xB-xA)
Ecrire "Le coefficient directeur vaut :" , c
Fin Algorithme
Spécifications
Paramètres:
Début Algorithme
Algorithme
Lire xA
Ecrire " Entrer la valeur de y pour point A "
Lire yA
Ecrire " Entrer la valeur de x pour point B "
Lire xB
Ecrire " Entrer la valeur de y pour point B "
Lire yB
Fin Algorithme
Fin Algorithme
Sous-Programme Saisie_Points
Algorithme SP Saisie_Points
============================================================
Nom : PROCEDURE Saisie_Points
Sémantique: Assure la saisie des coordonnées des 2 points
Paramètres:
Spécifications
Début Algorithme
Ecrire " pour xA "
Algorithme
xA <- SP Demander_Valeur
Ecrire " pour yA "
yA <- SP Demander_Valeur Sous programme
Ecrire " pour xB " demandé
xB <- SP Demander_Valeur
Ecrire " pour yB "
yB <- SP Demander_Valeur
Fin Algorithme
Sous-Programme Demander_Valeur
Algorithme SP Demander_Valeur
========================================================
Spécifications
Sémantique: Assure la saisie d’une valeur
Paramètres:
valeur (OUT) - réel – valeur à saisir
pré-condition : aucune
post-condition : avoir saisi la valeur
========================================================
Test : Entrer une valeur et vérifier cette valeur dans le
programme principal
==================================================================
FONCTION Demander_Valeur retourne réel valeur
Algorithme
Début Algorithme
Fin Algorithme
| Lire nombre_a_deviner
| Si nombre_a_deviner < 0 ou nombre_a_deviner > 10
| Alors Afficher " Le nombre doit être compris entre 0 et 10 "
| Fin Si
| Tant que nombre_a_deviner < 0 ou nombre_a_deviner > 10 Question : On choisit
| retourner nombre_a_deviner
de faire 4 sous-
R2 : Raffinage de {Entrer une proposition de nombre} programmes à partir du
| Faire
| Ecrire " Entrer votre proposition entre 0 et 10 : " raffinage. Donner la
| Lire nombre_proposé
| Si nombre_proposé < 0 ou nombre_proposé > 10 définition de ces sous-
| Alors Afficher " Le nombre doit être compris entre 0 et 10 "
| Fin Si programmes et du
| Tant que nombre_proposé < 0 ou nombre_proposé > 10 programme principale
| retourner nombre_proposé
Algorithme SP Saisir_nombre_a_deviner
==============================================================================
Nom : FONCTION Saisir_nombre_a_deviner
Spécifications
Sémantique: Assure la saisie du nombre à deviner
Début Algorithme
Algorithme
Faire
Ecrire " Entrer le nombre à deviner : "
Lire nombre_a_deviner
Si nombre_a_deviner < 0 ou nombre_a_deviner > 10
Alors Afficher " Le nombre doit être compris entre 0 et 10 "
Fin Si
Tant que nombre_a_deviner < 0 ou nombre_a_deviner > 10
retourner nombre_a_deviner
Fin Algorithme
1
Algorithme SP Entrer_proposition_nombre
========================================================
Nom : FONCTION Entrer_proposition_nombre
Sémantique: Assure la saisie de la proposition du joueur
Spécifications
Paramètres:
Début Algorithme
Algorithme
Faire
Ecrire " Entrer votre proposition de nombre "
Lire nombre
Si nombre < 0 ou nombre > 10
Afficher " Le nombre doit être compris entre 0 et 10 "
Fin Si
Tant que nombre < 0 ou nombre > 10
Retourner nombre
2
Fin Algorithme
Algorithme SP Contrôler_proposition_correcte
================================================================================
===========
Nom : FONCTION Contrôler_proposition_correcte
Début Algorithme
Algorithme
Variable : victoire : entier
Si prop = sol
Alors victoire=1
Sinon victoire=0
FinSi
Retourner victoire
Fin Algorithme
3
Algorithme SP Afficher_message_utilisateur
========================================================
Spécifications
Nom : PROCEDURE Afficher_message_utilisateur
Début Algorithme
Algorithme
Si victoire=1
Alors Afficher " Gagné !! Bien joué "
Sinon Afficher " Ce n’est pas le bon nombre !! "
FinSi
Fin Algorithme
Début Algorithme
Fin Algorithme