Programme de baccalauréat en informatique Algorithmique et programmation IFT Abder Alikacem Abder Alikacem Semaine 3 Bâtir un algorithme Département d’informatique et de génie logiciel Édition septembre 2007
Plan Conception des algorithmes La documentation dans les algorithmes Lecture: chapitres 3 et 4 des notes de cours
Étapes de la construction d’un programme Analyse et définition des besoins Spécification du programme Conception Programmation Tests et validation Maintenance Documentation du programme Algorithme Programme Ordinateur Description formelle Transcription Compilation Langage de programmation Langage machine Exécution Solution Problème
Les commentaires dans les algorithmes Vous aurez à considérer 4 types de commentaires des commentaires d'identification des grandes étapes; des commentaires explicatifs; des commentaires du type assertions; les commentaires de spécification formelle; les commentaires de spécification d’un bloc;
Il est très important de bien documenter un algorithme, il n’en sera que plus facile à lire. On retrouve 2 types de commentaires que l’on peut utiliser pour documenter un algorithme: –Les commentaires généraux. –Les assertions. Les commentaires dans les algorithmes
Placer dansfact la valeur de n! sans modifier l'entier n 0. Début { de l'algorithme } { Assertion : n est un entier 0 } « Voici tout de que nous savons ici. » Si n = 1 ou n = 0 alors Début { des cas n = 1 ou n = 0 } { Assertion : n est un ent ier dans [0, 1], inchangé } « Cette assertion est exacte à chaque fois que nous passons ici. » fact 1 { Assertion : n est un entier dans [0,1], inchangé etfact contient n!} « Notre objectif est atteint dans ces cas. » Fin { des cas n = 1 ou n = 0 } Sinon Début { des cas 2 } { Assertion : n est un entier 2 inchangé} « Voici tout ce que nous savons ici. » fact 1 Répéter i [1, n] : Début { Répéter } { Assertion : n est un entier 2 inchangé, i est un entier dans [1, n] etfact contient (i-1)! } fact fact * i { Assertion : n est un entier 2 inchangé, i est un entier dans [1, n] etfact contient i!} Fin { Répéter} { Assertion : n est un entier 2 inchangé etfact contient n!} « Notre objectif est atteint dans ces cas. » Fin { des cas 2} { Assertion : n est un entier 0 inchangé etfact contient n!} « Notre objectif est atteint dans tous les cas exigés. » Fin { de l'algorithme } Exemple p. 52
Les commentaires généraux auront 2 utilités: –Identifier les grandes étapes de l’algorithme –Expliquer certaines séquences d’opérations qui peuvent sembler plus ou moins claires à première vue Les commentaires dans les algorithmes
Forme structurée et validation des algorithmes Le principal avantage de la forme structurée est la restriction du nombre possible de «chemins» dans l’exécution de l’algorithme. En chaque point de l’algorithme on n’a qu’une provenance possible. On peut alors prouver l’exactitude d’un algorithme en insérant des assertions. Une assertion est une expression logique qui est vraie. Elle est utilisée pour montrer certaines conditions que l’on suppose vraies à un point donné d’un algorithme. Une assertion dans un algorithme doit être considérée lors de l’implantation de l’algorithme : les conditions sont à être interprétées dans le langage de programmation choisi; elles devraient également pouvoir être vérifiées lors de l’exécution du programme.
Début Demander n { Assertion : n est un entier 0 } Si n = 1 ou n = 0 alors Début fact 1 Fin Sinon Début fact 1 Répéter i [1, n] : Début fact fact * i Fin { Assertion : n est un entier 0 inchangé et fact contient n!} Fin Si Alors Les assertions (2) Les post-conditions Les pré-conditions
Idée de base Abstraire Décomposer Combiner Structuration des actions Séquentielle Conditionnelle Itérative Tout ce qu’on peut faire sur ordinateur peut être exprimé au moyen de l’affectation, d’alternatives et des répétitions. Conception d’algorithmes
Question à résoudre par une solution informatique Instance d'un problème = entrée nécessaire pour calculer une solution du problème. Ensemble de données Ensemble de résultats solution informatique au problème = Description d’un ensemble d'actions Exécution dans un certain ordre Problème Algorithme La démarche Conception d’algorithmes Tout ce qu’on peut faire sur ordinateur peut être exprimé au moyen de l’affectation, d’alternatives et des répétitions.
Souvent le problème est "mal posé"... Rechercher l'indice du plus petit élément d'une suite => Spécifier = produire un énoncé Énoncé = texte où sont définies sans ambiguïté : L'entrée (données du problème) La sortie (résultats recherchés) Les relations (éventuelles) entre les données et les résultats Que dois-je obtenir ? Soit I l'ensemble des indices des éléments égaux au minimum d'une suite. Déterminer le plus petit élément de I , 4 ? Conception d’algorithmes
Synthèse Les 3 étapes principales pour arriver à la résolution d’un problème sur un ordinateur: comprendre le problème initial et préciser les données fournies (entrées); préciser les résultats attendus (sorties); déterminer le processus qui permet de passer des entrées aux sorties (l’algorithme): Commencer par décrire les grandes étapes Raffiner chacune des étapes jusqu’à avoir tout décrit en termes d’instructions primitives Insérer des assertions aux endroits clés dans l’algorithme
Calcul de l'intérêt et de la valeur acquise par une somme placée pendant un an à intérêt simple. Données fournies: Deux nombres représentant les valeurs de la somme placée et du taux d'intérêt Résultats désirés: Deux nombres représentant l'intérêt fourni par la somme placée ainsi que la valeur obtenue après placement d'un an Exemple (1)
Les grandes étapes de l'algorithme : (1) Prendre connaissance de la somme initiale et du taux d'intérêt. (2) Multiplier la somme par le taux; diviser ce produit par 100; le quotient obtenu est l'intérêt de la somme. (3) Additionner ce montant et la somme initiale; cette somme est la valeur acquise. (4) Afficher les valeurs de l'intérêt et de la valeur acquise. Toutes ces étapes peuvent être exprimées directement par des instructions primitives… aucun raffinement à faire. Exemple (1)
L’algorithme en pseudo code: DEMANDER sommeInitiale {Assertion: sommeInitiale est un réel > 0} DEMANDER taux {Assertion: taux est un réel > 0 et <= 100} intérêt sommeInitiale * taux / 100 valeurAcquise sommeInitiale + intérêt AFFICHER intérêts, valeurAcquise {Assertion: intérêts et valeurAcquises représentent l'intérêt fourni par le placement de sommeInitiale et la somme obtenue après placement d'un an } Exemple (1)
Méthode de résolution de problèmes qui nous aide à formuler de bons algorithmes. Elle consiste à considérer un problème dans son ensemble, préciser les données nécessaires et les résultats attendus décomposer le problème en plusieurs sous-problèmes plus simples qui seront traités séparément et éventuellement décomposés eux-mêmes de manière encore plus fine ( raffinement) L’approche descendante
Exemple p.32 dans les notes de cours Imaginons un robot domestique à qui nous devons fournir un algorithme lui permettant de préparer une tasse de café soluble. Une première version de l'algorithme pourrait être: (1) faire bouillir de l'eau (2) mettre le café dans la tasse (3) ajouter l'eau dans la tasse L’approche descendante
(1) faire bouillir l'eau peut être affinée en (1.1) remplir la bouilloire d'eau (1.2) brancher la bouilloire sur le secteur (1.3) attendre l'ébullition (1.4) débrancher la bouilloire (2) mettre le café dans la tasse pourrait être affiné en (2.1) ouvrir le pot à café (2.2) prendre une cuiller à café (2.3) plonger la cuiller dans le pot (2.4) verser le contenu de la cuiller dans la tasse (2.5) fermer le pot à café L’approche descendante
(3) ajouter de l'eau dans la tasse pourrait être raffinée en (3.1) verser de l'eau dans la tasse jusqu'à ce que celle-ci soit pleine Certaines étapes sont encore trop complexes pour notre robot, il faut les raffiner davantage. (1.1) remplir la bouilloire d'eau peut être raffiné comme suit: (1.1.1) mettre la bouilloire sous le robinet (1.1.2) ouvrir le robinet (1.1.3) attendre que la bouilloire soit pleine (1.1.4) fermer le robinet L’approche descendante
Quand doit-on arrêter le raffinement? Lorsque l’on a décrit l’algorithme en des termes que l’ordinateur peut comprendre On doit donc connaître les instructions primitives, quelle sorte d‘instructions le processeur peut interpréter. Un programme sera donc une suite d’instructions primitives, comprises directement par l’ordinateur. Les algorithmes que nous écrivons doivent donc refléter cette décomposition. L’approche descendante
Dans le cas du robot, « Brancher la bouilloire » est une instruction que le robot est en mesure de comprendre Par contre, « Remplir la bouilloire » est une instruction trop complexe et doit être décomposée à nouveau. L’approche descendante
Si une instruction donnée n'est pas primitive, c'est-à-dire qu'elle n'est pas assez explicite pour qu'un ordinateur l'interprète directement, elle doit être décomposée en instructions primitives. Quand doit-on arrêter le raffinement? Chaque décomposition sera encapsulée dans un bloc d ’instructions. L’ analyse descendante est une des méthodes pour obtenir cette décomposition. La décomposition fonctionnelle permet de rapides construction de programmes, la possibilité de leur réutilisation pour en construire d’autres en plus d’en assurer une rapide et efficace maintenance. L’approche descendante
Les blocs algorithmiques Utilisés afin de découper un algorithme en plusieurs sous- tâches. Cette façon de procéder s’inscrit très bien dans l’approche descendante et la décomposition fonctionnelle. Chaque tâche à accomplir est alors détaillée au sein d’un bloc algorithmique.
Un algorithme qui ajoute une journée à une date donnée. Exemple (2)
DEBUT DEMANDER j,m,a {A: a représente une année dans le calendrier grégorien, m un mois dans l’année et j un jour du mois} max 30 SI m=1 OU m=3 OU m=5 OU m=7 OU m=8 OU m=10 OU m=12 ALORS début max 31 fin SI m=2 ALORS début max 28 SI (a % 4 = 0) ET NON (a % 100 =0) ALORS début max 29 fin SI (a % 400=0) ALORS début max 29 fin j j+1 SI j>max ALORSdébut j 1 m m+1 SI m>12 ALORS début m 1 a a+1 fin AFFICHER j,m,a {A: j, m et a représentent la date du lendemain} FIN
On peut ré-écrire l’algorithme lendemain de la façon suivante: Bloc B1 – la date du lendemain DEBUT Déterminer une date (Bloc B2) Déterminer le dernier jour du mois m (Bloc B3) Déterminer la date du jour suivant (Bloc B4) AFFICHER « La journée suivante est: », j, m, a {A:….} FIN Les blocs algorithmiques
Bloc B2 – Déterminer une date DEBUT DEMANDER j, m, a {A: j est un entier compris entre 1 et 31} {A: m est un entier compris entre 1 et 12} {A: a est un entier représentant une année dans le calendrier} {A:…} FIN Les blocs algorithmiques
Bloc B3 – Déterminer le dernier jour du mois DEBUT max 30; SI m=1 OU m=3 OU m=5 OU m=7 OU m=8 OU m=10 OU m=12 ALORS DEBUT max 31; FIN SI m=2 ALORS début max 28; SI a est une année bissextile (voir B5) ALORSdébut max 29; fin {A:…} FIN Les blocs algorithmiques
Bloc B4 – Déterminer la date du jour suivant DÉBUT j j+1; SI j > max ALORS début j 1; m m+1; SI m>12 ALORS début m 1; a a+1; fin {A:…} FIN Les blocs algorithmiques
Bloc B5 Vérification si une année donnée est une année bissextile DEBUT bis FAUX SI (a % 4 = 0) ET NON (a % 100 = 0) ALORS début bis VRAI; fin SI (a % 400=0) ALORS début bis VRAI; fin {A:…} FIN Les blocs algorithmiques
Les commentaires de spécification dans les algorithmes Vous aurez à considérer 4 types de commentaires des commentaires d'identification des grandes étapes; des commentaires explicatifs; des commentaires du type assertions; les commentaires de spécification formelle d’un bloc; les commentaires de spécification internes à un bloc;
Les (4) commentaires de spécification formelle nous aideront à spécifier l’interface de chaque bloc issu d’une décomposition. Les (8) commentaires internes à un bloc nous aideront à construire les instructions du bloc tout en assurant sa rapide maintenance. Les commentaires de spécification
L’en-tête :du bloc d ’instruction implantant une tâche Pré-conditions :conditions devant être vraies au départ pour assurer le bon fonctionnement du bloc d ’instructions Post-conditions :conditions étant vraies (observables) après exécution (correcte, i.e. les pré-conditions sont respectées) des instructions du bloc. Sinon, indiquer la ou les actions à entreprendre dans l ’exécution du bloc. Valeur(s) retournée(s) : en output de l ’exécution des instructions du bloc si les pré- conditions sont respectées, sinon indiquer ce que fournira le bloc. Ce type de commentaires spécialisés sera utilisé essentiellement lors de la décomposition fonctionnelle d’une solution lors d ’une résolution d’un problème donné. Ainsi, chaque tâche qui en découle de la décomposition doit être spécifiée par les 4 commentaires suivant: Les commentaires d’interface d’un bloc
Les commentaires de spécification internes Les commentaires de spécification servent à spécifier un bloc d’un algorithme: Ce qu’il fait La façon dont il procède pour atteindre son but Les données nécessaires Les résultats qu’il fournit Ces commentaires sont internes aux blocs. Ils aideront au développement rapide des blocs, ainsi qu’à leur validation de façon plus efficace.
Définitions Objectifs: ce commentaire sert à décrire le but visé par le bloc. Méthode: la façon dont on procède pour atteindre le but décrit au commentaire précédent Besoins: toutes les données dont le bloc aura besoin pour atteindre son but. Connus: les données que l’on connaît d’avance, que l’on n’aura pas besoin de demander au bloc appelant ni à l’usager. Les (8) commentaires de spécification d’un bloc
Entrées: les données qui parviennent du bloc appelant. Sorties: les données que le bloc renvoie au bloc appelant Résultats: toute conséquence du bloc qui n’est pas visible par les autres blocs, exemple: les affichages. Hypothèses: Les conditions nécessaires au bon fonctionnement du bloc. Ces hypothèses concernent: les données en entrée du bloc; les données lues (saisies) dans le bloc. Les (8) commentaires de spécification d’un bloc
DEMANDER nbEtudiants {Assertion: nbEtudiants 0} Bloc B2… {.. Besoin : n, le nombre entier dont il faut calculer le factoriel Entrée : n.. Hypothèses : n 0 } Début {début du bloc} {A: n 0 } ….. Les assertions (3) Validation des hypothèses
Bloc B3.. { les 8 commentaires de spécification internes } début {début du bloc} … {A: post-condition de B3} fin {fin du bloc} Bloc B1… { les 8 commentaires de spécification internes } début{début du bloc} … Calcul de la moyenne d'une série de notes (voir B3) {A: la variable moy contient la moyenne des notes} …. {A: post-condition de B1} fin {fin du bloc } Les assertions (4) Les post-conditions
Exemple 3. Algorithme avec un tableau Algorithme: trier un tableau { Objectif: trier un tableau en ordre croissant Connu: - Entrées: tab: le tableau et nbValeurs: son nombre d’éléments Sorties: le tableau trié en ordre croissant Résultats: - Hypothèse: nbValeurs > 0 }
Début {A:nbValeurs > 0} Répéter i[1,nbValeurs-1] Début plusPetit i Répéter candidat[i+1,nbValeurs] Début si(tab[candidat] < tab[plusPetit]) alors Début plusPetit candidat Fin …….. tampon tab[i] tab[i] tab[plusPetit] tab[plusPetit] tampon Fin {A:tab est trié en ordre croissant} Fin
Bloc B1: Calculer la somme de deux entiers positifs { Objectif: Calculer et afficher la somme de deux entiers positifs Méthode: usage de l’opérateur d’addition Besoin: a et b : les deux entiers Connu:- Entrée:- Sortie:- Résultat: la somme des deux entiers Hypothèses : a et b > 0 } Début Saisie des données ( Voir Bloc B 2 ) {A : a et b sont deux entiers positifs} Calcul de la somme de a et b ( Voir Bloc B3 ) {A : somme contient la somme des deux entiers} Affichage de la somme (Voir bloc B4 ) {A : La somme est affichée à l’usager} {A : La somme de deux entiers positifs est calculée} fin. Exemple 4 (très simple)
Bloc B2: Saisie des données { Objectif : Saisie de données Méthode : Sollicitation de l’usager Besoin: entier1 et entier2 : deux entiers Connu:- Entrée:- Sortie:entier1, entier2 Résultat: - Hypothèses : entier1 et entier2 sont deux entiers positifs } Début Demander entier1, entier2 {A : entier1 et entier2 sont deux entiers positifs} {A : La saisie de données est effectuée} Fin.
Bloc B3: Calculer la somme de deux nombres { Objectif: Calculer la somme de deux nombres Méthode: usage de l’opérateur d’addition Besoin: x et y : les deux nombres Connu:- Entrée:x, y Sortie:la somme de x et y Résultat: - hypothèses : x et y sont deux nombres} Début {A : x et y sont deux nombres} z x + y {A : z contient la somme de x et y} Fin.
Bloc B4: Affichage d’un nombre entier { Objectif: afficher un nombre entier Méthode: sollicitation du périphérique de sortie Besoin: w : le nombre Connu:- Entrée:w Sortie:- Résultat: affichage de w Hypothèses : w est un nombre entier} Début {A : w est un nombre entier} Afficher w {A : un nombre entier est affiché} Fin.
Exemple 5 Écrire un algorithme qui calcule une approximation de e x, le nombre népérien. Les données en entrée ? Les données en sortie ?
L’algorithme ? Exemple 5
Le critère d’arrêt ? Exemple 5
Le critère d’arrêt ? Fixer un n. Exemple 5
Bloc B1 : Bloc B1 : Calculer et afficher e x Objectif : Objectif :Calculer e x Méthode : Méthode :Approximation par le développement en série Besoins : Besoins : x : L’exposant N : Le nombre d’itérations Connu : Connu : N (entier > 0) Entrée : Entrée : Aucune Sortie : Sortie : Aucune Résultat : Résultat : Afficher l’approximation de e x Hypothèse : Hypothèse : x est un réel.
Bloc B1 : Bloc B1 : Calculer et afficher e x DÉBUT DEMANDER x {A : x est un nombre réel} Approximer e x {voir le bloc B2} {A : résultat contient l’approximation de e x } AFFICHER résultat {A : Le résultat est affiché à l’utilisateur} FIN
Bloc B2 : Bloc B2 : Calculer e x Objectif : Objectif :Calculer e x Méthode : Méthode :Approximation par le développement en série Besoins : Besoins : x : l’exposant N : Le nombre d’itération Connu : Connu : N (entier > 0) Entrée : Entrée : x Sortie : Sortie : L’approximation de e x Résultat : Résultat : Aucun Hypothèse : Hypothèse : x est un réel.
Bloc B2 : Bloc B2 : Calculer e x DÉBUT {A : x est un réel} résultat 1 Si x ≠0 Alors début i 1 TANT QUE i < N DÉBUT Calculer la factoriel de i ( voir le bloc B3) {A : fact contient le factoriel de i} Calculer x exposant i (voir le bloc B4) {A : xi contient x exposant i } résultat résultat + (xi/fact) i i+1 FIN fin {A : résultat contient l’approximation de e x } FIN
Bloc B3 : Bloc B3 : Calculer la factoriel de n Objectif : Objectif :Calculer la factoriel de i Méthode : Méthode :1 * 2 * 3 * … * (n-1) * n Besoins : Besoins : n : un entier. Connu : Connu : Aucun Entrée : Entrée : n Sortie : Sortie : La factorielle de n Résultat : Résultat : Aucun Hypothèse : Hypothèse : n est un entier positif ou nul
Bloc B3 : Bloc B3 : Calculer la factoriel de n DÉBUT {A : n est un entier positif ou nul} x 1 k 1 {Si n = 0, x vaut 1 et on n’entre pas dans la boucle} TANT QUE k < n DÉBUT x x * k k k + 1 FIN {A : x contient n! } FIN
Bloc B4 : Bloc B4 : Calculer x exposant i Objectif : Objectif :Calculer x à la i Méthode : Méthode :multiplier x par lui-même i fois Besoins : Besoins : i : l’exposant x : un réel Connu : Connu : Aucun Entrée : Entrée : i, x Sortie : Sortie : x exposant i Résultat : Résultat : Aucun Hypothèse : Hypothèse : i est un entier positif ou nul
Bloc B4 : Bloc B4 : Calculer x exposant i DÉBUT {A : i est un entier positif ou nul} y 1 RÉPÉTER i FOIS DÉBUT y y * x FIN {A : y contient x i } FIN
Le critère d’arrêt ? Fixer un n. Exemple 5
Le critère d’arrêt ? Un degré de précision P. Exemple 5
Bloc B2 : Bloc B2 : Calculer e x Objectif : Objectif :Calculer e x Méthode : Méthode :Approximation par le développement en série Besoins : Besoins : x : l’exposant P : La précision Connu : Connu : P(réel > 0) Entrée : Entrée : x Sortie : Sortie : L’approximation de e x Résultat : Résultat : Aucun Hypothèse : Hypothèse : x est un réel. PRISE II
Bloc B2 : Bloc B2 : Calculer e x DÉBUT {A : x est un réel} résultat 1 {(x 0 /0!) = 1} SI x 0 ALORS DEBUT résultat2 1 résultat 1 + x {resultat + (x 1 /1!) =1+x} i 2 TANT QUE résultat – résultat2 > P DÉBUT Calculer la factoriel de i (voir bloc B3) {A : fact contient i!} Calculer x exposant i {B4} {A : xi contient x exposant i} résultat2 résultat résultat résultat + (xi / fact) i i+1 FIN {A : résultat contient l’approximation de e x avec une précision égale à P} FIN PRISE II
Réutilisation Conception d’un bloc algorithmique Bx Primitives
Bx Conception d’un autre bloc algorithmique (B n ) Primitives Réutilisation
Passage de paramètres Algorithme Bloc B3 n! n i Bloc B2 DEBUT … … B3( i ) … FIN Paramètre effectif Paramètre formel
Algorithme: un traitement de texte! début Demander CP {A: CP est un caractère} Afficher CP TANT QUE CP ‘!’ début Demander CL {A: CL est un caractère} SI CL = CP ALORS début Afficher le caractère de soulignement '_ ' fin Afficher CL CP CL fin Exercice. Trace d’un algorithme Qu’affiche cet algorithme si les données lues sont: " Etes vous efficace?... Bonne chance!! " (Les guillemets ne font pas partie des données)
Proposez une décomposition fonctionnelle de l’algorithme précédent. Complétez chaque bloc par: les assertions aux endroits requis; les 8 commentaires de spécification internes. Exercice…suite
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = CP ALORS début Afficher le caractère de soulignement '_ ’ fin Afficher CL CP CL fin
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = CP ALORS début Afficher le caractère de soulignement '_ ’ fin Afficher CL CP CL fin J’ai besoin de quoi?
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = CP ALORS début Afficher le caractère de soulignement '_ ’ fin Afficher CL CP CL fin On quitte B1
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = CP ALORS début Afficher le caractère de soulignement '_ ’ fin Afficher CL CP CL fin On a quitté... J ’ai besoin de quoi?
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = CP ALORS début Afficher le caractère de soulignement '_ ’ fin Afficher CL CP CL fin On a quitté... CP et CL!
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = CP ALORS début Afficher le caractère de soulignement '_ ’ fin Afficher CL CP CL fin Flux de données entre B1 et B2 CP et CL!
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = CP ALORS début Afficher le caractère de soulignement '_ ’ fin Afficher CL CP CL fin CP CP…CL Une entrée Une sortie
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = CP ALORS début Afficher le caractère de soulignement '_ ’ fin Afficher CL CP CL fin On revient au point d’appel Le point d ’appel
Bloc B1: un traitement bien spécial début Demander CP Afficher CP TANT QUE CP ‘!’ début faire le traitement (voir détails Bloc B2) fin Bloc B2: le traitement début Demander CL SI CL = X ALORS début Afficher '_ ’ fin Afficher CL X CL fin Paramètres formels de B2 Paramètre formel deB1 mais effectif pour B2
Bloc B1: un traitement bien spécial {Objectif: intercaler le caractère de soulignement entre chaque suite de 2 caractères identiques dans une phrase fournie par l'usager Méthode: lecture séquentielle d'une suite de caractères, test sur 2 caractères successives Besoin: la phrase à traiter Entrée: - Connu: - Sortie: - Résultat: ré-affichage de la phrase avec éventuellement le caractère '_' séparant deux caractères successifs identiques. Hypothèse:la phrase se termine par le caractère ‘!’ }
Bloc B2: le traitement {Objectif: ajout du caractère de soulignement entre 2 caractères successifs identiques Méthode: comparaison de 2 caractères successifs Besoin: CP : le caractère précédent, CL: le caractère suivant Entrée: CP Connu: - Sortie: le caractère suivant Résultat:affichage éventuel du caractère '_', CL Hypothèse: CP et CL sont deux caractères }
Question Est ce que c’est le même espace mémoire qui est associé à CP dans B1 et B2? En d’autres termes, est ce que c’est la même variable? Attention, ne confondez pas valeur assignée à une variable et variable (l’abstraction d’une cellule mémoire). Exercice
Retour au laboratoire #1 La syntaxe décrit les formes correctes que peuvent prendre les éléments (expressions) d'un programme. La sémantique correspond à la signification des formes syntaxiques (c'est à dire aux constructions) d'un langage. Syntaxe et sémantique
Retour au laboratoire #1 Syntaxe = l’ordre des éléments pour former une séquence correcte Compilateur Détecte les erreurs de syntaxe Indique approximativement le lieu Est incapable de les corriger Un programme doit être syntaxiquement correct
Retour au laboratoire #1 Sémantique = Quel est le sens de ce qu’on écrit? Erreurs sémantiques Pas vues par le compilateur Découvertes lors de l’exécution du programme Il « plante » Il ne fait pas ce qui est demandé Il ne s’arrête plus …
Laboratoire #2 Les erreurs de type sémantique dans un programme sont dues généralement à une mauvaise construction de l’algorithme correspondant (résolution du problème erronée). Un manière de contrer ce problème est de tester tout algorithme conçu (trace à la main : simulation à la main de l’exécution d’un algorithme) en choisissant adéquatement le jeu de données pour cette fin (il faut toujours penser aux cas limites ou d’exception). Attention : rien ne prouve qu’un algorithme est correct s’il passe correctement tous les tests que l’on peut imaginer! Il existe d’autres méthodes plus formelles pour démontrer l’exactitude d’un algorithme donné. On en reparlera sûrement.
Voici ce que vous êtes supposés de connaître: L'architecture de Von Neuman: les périphériques d’entrée, de sortie: assurent la "conversation" avec un ordinateur via le clavier, l'écran, lecteur quelconque etc… L’unité de commande et de contrôle: le chef d'orchestre capable d'interpréter les instructions d'un programme et lancer des "ordres" aux autres composantes afin qu'elles soient exécutées. L’unité arithmétique et logique: la calculatrice. La mémoire principale (rôle important dans la programmation impérative):la partie déclarative de variables, réservation de la mémoire pour y entreposer les données utiles à l’exécution de la mémoire. Cette mémoire est comme un espace de rangement avec des « tiroirs » de différentes tailles : dans la réservation, on doit indiquer le type du tiroir. Laboratoire #2
Laboratoire #3 Construction d’algorithmes simples Il n’est pas nécessaire qu’ils décomposent leur solution en plusieurs blocs. Si certains zélés s’essayent, il faudrait que leur décomposition soit naturelle : la décomposition modulaire doit venir de la manière qu’ils ont résolu le problème en suivant une démarche descendante, les grandes lignes de la solution, chaque grande ligne doit être raffinée dans un bloc à part, le raffinement doit se terminer lorsque chaque instruction est décrite à l’aide d’une instructions de base.
Algorithme Programme Ordinateur Description formelle Transcription Compilation Langage de programmation Langage machine Exécution Solution Problème Algorithme, programme et ordinateur
Exercice. Retour à Rosalie dans le labyrinthe Entrée Sortie Faire un pas devant elle. Tourner d'un quart de tour à gauche ou à droite. Détecter un mur placé devant elle. Détecter l'entrée du labyrinthe. Détecter la sortie du labyrinthe. Les primitives Le problème de Rosalie revu avec la décomposition fonctionnelle
Bloc B1: Sortir du labyrinthe en longeant le mur de gauche { objectif: faire sortir le Rosalie du labyrinthe méthode: en longeant le mur de gauche besoin: - connu: - entrée: sortie: - résultat: Rosalie est sortie du labyrinthe hypothèses : Rosalie est en face de la porte d'entrée} Début {A: Rosalie est en face de la porte d'entrée du labyrinthe } avancer d'un pas {A: Rosalie a le dos face de la porte d’entrée barrée} Repérer le mur de gauche (voir bloc B2)bloc B2 {A: le mur à longer est à gauche} Longer le mur de gauche jusqu'à la sortie (voir bloc B3)bloc B3 {A: Rosalie est sortie du labyrinthe} Fin.
Bloc B2: Repérer le mur de gauche { objectif: repérer le mur de gauche méthode: pivoter une fois vers la gauche besoin: connu: - entrée: sortie: - résultat: Rosalie a fait un quart de tour à gauche hypothèses : - } Début Faire un quart de tour à gauche {A: le mur à longer est à gauche} Fin
Bloc B3: Longer le mur de gauche jusqu'à la sortie { objectif: longer le mur de gauche jusqu'à la sortie méthode: avancer d'un pas et longer le mur de gauche besoin: connu: - entrée: sortie: - résultat: Rosalie est sortie du labyrinthe par la porte de sortie hypothèses : - } Début Tant que Rosalie n'est pas sortie Début avancer d'un pas en longeant le mur de gauche (voir bloc B4)bloc B4 {A: Rosalie avance d'un pas en longeant le mur de gauche} Fin {A: Rosalie est sorti du labyrinthe } Fin
Bloc B4: Avancer d'un pas en longeant le mur de gauche { objectif: avancer d'un pas en longeant le mur de gauche méthode: se mettre dans la bonne direction et avancer d'un pas besoin: connu: - entrée: sortie: - résultat: Rosalie avance d'un pas en longeant le mur de gauche hypothèses : -} Début se mettre dans la bonne direction (voir bloc B5)bloc B5 {A: Rosalie est dans la bonne direction} avancer d'un pas {A: Rosalie avance d'un pas en longeant le mur de gauche} Fin
Bloc B5: Se mettre dans la bonne direction { objectif: se mettre dans la bonne direction méthode: faire des quarts de tour besoin: connu: - entrée: sortie: - résultat: Rosalie est dans la bonne direction hypothèses : -} Début faire un quart de tour à gauche Tant que mur en face Début faire un quart de tour à droite Fin {A: il n'y a pas de mur en face} {A: Rosalie est dans la bonne direction} Fin