USTL - Licence ST-A 1ère année 2008-2009 1 Le problème Initiation à la programmation Structure conditionnelle État initial : Tas 1 un trèe ou un pique les autres tas vides. État nal : tas 1 et 4 vides et le tas 2 contient au plus un trèe, et le tas 3 contient au plus un pique. 1.1 Algorithme La résolution du problème nécessite une étude de cas : si la carte au sommet du tas 1 est un trèfle alors mettre la carte sur le tas 2 sinon mettre la carte sur le tas 3 finsi 2 Expressions booléennes 2.1 Booléens On appelle booléen 1 l'une des deux valeurs de vérité vrai ou faux. On désigne en abrégé ces deux valeurs par les deux lettres V et F. Une expression booléenne est une expression qui prend une valeur booléenne, autrement dit l'une ou l'autre des deux valeurs V ou F. Les expressions booléennes servent à exprimer des conditions. Elles peuvent être simples ou composées 2.2 Expressions simples Les expressions booléennes simples la carte au sommet du tas 1 est un trèfle 2.3 Expressions composées 2.3.1 L'opérateur ou L'expression E ="la carte au sommet du tas 1 est un trèe ou un carreau" peut se décomposer en deux expressions simples 1. E 1 ="la carte au sommet du tas 1 est un trèe", 2. E 2 ="la carte au sommet du tas 1 est un carreau" le lien les unissant étant le connecteur ou opérateur logique ou E = E 1 ou E 2 L'expression E est donc composée. L'expression E ne prend la valeur V que si au moins l'une des deux expressions E 1, E 2 est vraie. On résume cette dénition de l'opérateur ou par la table de vérité représentée par le tableau 1 1 du nom du mathématicien anglais du XIXème siècle George Boole 1
E 1 E 2 E 1 ou E 2 V V V V F V F V V F F F Tab. 1 Table de vérité de l'opérateur ou 2.3.2 L'opérateur et L'expression E ="la carte au sommet du tas 1 est un trèe et sa valeur est supérieure à celle de la carte située au sommet du tas 2" peut se décomposer en deux expressions simples 1. E 1 ="la carte au sommet du tas 1 est un trèe", 2. E 2 ="la carte au sommet du tas 1 a une valeur supérieure ou égale à celle du tas 2" le lien les unissant étant le connecteur ou opérateur logique et E = E 1 et E 2 L'expression E est donc composée. L'expression E ne prend la valeur V que si les deux expressions E 1, E 2 sont vraies. On résume cette dénition de l'opérateur et par la table de vérité représentée par le tableau 2. E 1 E 2 E 1 et E 2 V V V V F F F V F F F F Tab. 2 Table de vérité de l'opérateur et 2.3.3 L'opérateur non L'expression E ="la carte au sommet du tas 1 n'est pas un trèe'" peut se décomposer en une expressions plus simple 1. E 1 ="la carte au sommet du tas 1 est un trèe", que l'on nie. logique et E = non(e 1 ) L'expression E est donc composée. La valeur de l'expression E est opposée à celle de E 1. On résume cette dénition de l'opérateur non par la table de vérité représentée par le tableau 3. E 1 non(e 1 ) V F Tab. 3 Table de vérité de l'opérateur non F V 2.4 Propriétés des opérateurs a, b et c sont trois expressions booléennes. 2
Double négation non(non(a)) = a Élément neutre du ou a ou F = a Élément neutre du et a et V = a Élément absorbant du ou a ou V = V Élément absorbant du et a et F = F Idempotence du ou a ou a = a Idempotence du et a et a = a Tautologie a ou non(a) = V Contradiction a et non(a) = F Commutativité du ou a ou b = b ou a Commutativité du et a et b = b et a Associativité du ou (a ou b) ou c = a ou (b ou c) Associativité du et (a et b) et c = a et (b et c) Distributivité du et par rapport au ou a et (b ou c) = (a et b) ou (a et c) Distributivité du ou par rapport au et a ou (b et c) = (a ou b) et (a ou c) Loi de Morgan (1) non(a ou b) = non(a) et non(b) Loi de Morgan (2) non(a et b) = non(a) ou non(b) 3 En Pascal 3.1 Booléens En Pascal, les deux valeurs booléennes dénissent le type Boolean. vrai faux true false Tab. 4 Booléens en Pascal 3.2 Expressions booléennes Les expressions booléennes simples peuvent s'exprimer en Pascal par des valeurs littérales true ou false, une variable booléenne, une expression décrivant une relation, un appel à une fonction à valeurs booléennes. Exemples TasVide(1), CouleurSommet(1)=PIQUE Les expressions composées se traduisent avec les opérateurs logiques and, or et not. Opérateur logique et ou non En Pascal and or not Tab. 5 Opérateurs logiques en Pascal Exemples SommetTrefle(1) or SommetCarreau(1), TasNonVide(1) and TasNonVide(2) not (CouleurSommet(1)=PIQUE) 3.3 Instructions conditionnelles Instruction conditionnelle complète ou alternative 3
if <condition> then (*bloc d instruction*) else (*bloc d instruction*) Exemple traduction en Pascal de l'algorithme décrit à la section 1.1. if SommetTrefle(1) then begin end else begin DeplacerSommet(1,3); end {if} La condition est ici exprimée par l'expression booléenne (simple) SommetTrefle(1), le premier bloc d'instructions (celui qui suit le mot réservé then) est begin end et le second bloc (qui suit le mot réservé else) begin end Notez qu'il n'y a pas de ; après le end qui précède le else. En revanche, si cette instruction conditionnelle est suivie d'une autre, il faudra ajouter un ; après le end du second bloc (end {if};). if <condition> then (*bloc d instruction*) Exemple déplacer la carte située au sommet du tas 1 si c'est un trèe sinon ne rien faire. if SommetTrefle(1) then begin end {if} 3.4 Attention! Les opérateurs and et or agissent sur des booléens! On pourrait être tenté, pour exprimer que la carte au sommet du tas 1 est un trèe ou un carreau, d'écrire CouleurSommet(1) = TREFLE or CARREAU Mais cela est incorrecte car TREFLE et CARREAU ne sont pas des booléens, mais des couleurs. Il faut donc écrire (CouleurSommet(1) = TREFLE) or (CouleurSommet(1) = CARREAU) (même si cela semble bien lourd) 3.5 Remarque sur les priorités d'opérateurs En Pascal, si on écrit l'expression CouleurSommet(1) = PIQUE or CouleurSommet(1) = TREFLE on obtient le message d'erreur suivant lors de la compilation erreur1.pas(7,30) Error: Operation "or" not supported for types "Couleurs" and "Couleurs" 4
Cela provient du fait que l'opérateur or est prioritaire sur l'opérateur = (et oui, = est un opérateur!). Par conséquent, le compilateur comprend l'expression précédente comme signiant CouleurSommet(1) = (PIQUE or CouleurSommet(1)) = TREFLE et se rend compte que le programmeur a appliqué le or sur des valeurs non booléennes (des couleurs). D'où le message d'erreur. Pour remédier à ce problème, il faut parenthéser de la façon suivante (CouleurSommet(1) = PIQUE) or (CouleurSommet(1) = TREFLE) 3.6 Remarque sur les opérateurs and et or En logique booléenne, les opérateurs et et ou sont commutatifs a et b = b et a a ou b = b ou a Avec Free Pascal, ces opérateurs ne sont pas commutatifs : les arguments des opérateurs logiques sont évalués séquentiellement de gauche à droite. Par exemple, les expressions TasNonVide(1) and SommetTrefle(1) et SommetTrefle(1) and TasNonVide(1) ne sont pas équivalentes : l'évaluation de la première expression ne déclenche jamais d'exception, car si le tas 1 est vide, SommetTrefle(1) n'est pas évalué, puisque la valeur de l'expression complète est alors déterminée en revanche l'évaluation de la seconde expression déclenche une exception si le tas 1 est vide. 4 Méthodologie Voici quelques principes méthodologiques concernant la conception d'instructions conditionnelles. 1. Etude des cas intervenant dans le problème commencer par distinguer les diérents cas, vérier que ces cas sont bien exhaustifs (on n'oublie aucune situation) vérier que ces cas ne sont pas redondants (cas exclusifs) donner un exemple de comportement attendu de l'instruction pour chacun des cas 2. Pour chacun des cas établir un test (expression booléenne) permettant de distinguer le cas déterminer la séquence d'instructions à exécuter dans ce cas 3. Construire un jeu de tests qui permet de s'assurer de la validité du programme : ce jeu doit comprendre au moins un test pour chacun des cas envisagés. Exemple Considérons une situation initiale où les tas numérotés de 1 à 3 contiennent un nombre quelconque non nul de cartes, et le tas 4 est vide. InitTas(1, (T+K+C+P)[T+K+C+P] ); InitTas(2, (T+K+C+P)[T+K+C+P] ); InitTas(3, (T+K+C+P)[T+K+C+P] ); InitTas(4, ); L'objectif à atteindre est de déplacer la carte de plus grande valeur au sommet d'un des trois tas vers le tas 4. Résoudre ce problème revient à repérer quel tas possède en son sommet la carte de plus grande valeur. Étude des cas Il y a évidemment trois possibilités : c'est le tas 1 ou le tas 2 ou le tas 3. Comment les distinguer? c'est le tas 1, si la carte au sommet du tas 1 est supérieure ou égale à celle du tas 2, et est supérieure ou égale à celle du tas 3. c'est le tas 2, si la carte au sommet du tas 2 est supérieure ou égale à celle du tas 1, et est supérieure ou égale à celle du tas 3. 5
c'est le tas 3, si la carte au sommet du tas 3 est supérieure ou égale à celle du tas 1, et est supérieure ou égale à celle du tas 2. Autrement dit c'est le tas i si la condition Superieur(i,j) and Superieur(i,k) (dans laquelle j et k désignent les dux numéros de tas autres que i) est satisfaite. Les conditions distinguant les trois cas ne sont pas exclusives (penser aux cas d'égalité). 5 Exercices Exercice 1. En utilisant les tables de vérité, prouvez quelques propriétés des opérateurs logiques et, ou et non. Exercice 2. Ou exclusif Si a et b sont deux expressions booléennes, le ou-exclusif de ces deux expressions, noté a b, est une nouvelle expression booléenne qui est vraie si et seulement si une seule des deux expressions a ou b est vraie. La table de vérité du ou-exclusif est donnée a b a b V V F V F V F V V F F F Tab. 6 Table de vérité de l'opérateur ou-exclusif Question 1. Écrire l'expression a b à l'aide des opérateurs et, ou et non. Exercice 3. Question 1. Exprimer le fait que [a, b] et [c, d] sont des intervalles disjoints, attention au cas des intervalles vides, par exemple si a = 15 et b = 5. Question 2. Exprimer le fait que [a, b] et [c, d] sont des intervalles qui se recouvrent partiellement de deux manières : 1. en utilisant la solution de la question précédente (c'est très simple). 2. directement (c'est compliqué!). Exercice 4. Écrire l'instruction ci-dessous sans utiliser l'opérateur non si non(a) alors instr1 sinon instr2 finsi; Exercice 5. Écrire l'instruction cidessous sans utiliser l'opérateur et si a et b alors instr1 finsi; Exercice 6. Expliquez pourquoi le programme if Superieur(1,2) and Superieur(1,3) then begin DeplacerSommet(1,4); end; if Superieur(2,1) and Superieur(2,3) then begin DeplacerSommet(2,4); end; if Superieur(3,1) and Superieur(3,2) then begin DeplacerSommet(3,4); end; 6
n'est pas correct pour le problème posé dans la section 4 Exercice 7. Reprenez le problème de la section 4 en admettant qu'un ou plusieurs des trois premiers tas peut être vide. Si les trois tas sont vides, on ne déplace aucune carte. Exercice 8. Les exercices de manipulation de cartes 7