Sie sind auf Seite 1von 45

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Un livre de Wikibooks.

Une version jour et ditable de ce livre est disponible sur Wikilivres, une bibliothque de livres pdagogiques, l'URL: //fr.wikibooks.org/wiki/Algorithmique_imp%C3%A9rative
Vous avez la permission de copier, distribuer et/ou modifier ce document selon les termes de la Licence de documentation libre GNU, version 1.2 ou plus rcente publie par la Free Software Foundation; sans sections inaltrables, sans texte de premire page de couverture et sans Texte de dernire page de couverture. Une copie de cette licence est inclue dans l'annexe nomme Licence de documentation libre GNU .

Introduction
Les ordinateurs sont inutiles, ils ne savent que donner des rponses. (Pablo Picasso).

qui s'adresse ce livre ?


Ce livre s'adresse aux tudiants dmarrant une formation autour de l'informatique thorique, c'est dire principalement dans un cadre universitaire, en dbut de premier cycle. Ce livre n'a pas pour objectif d'enseigner la programmation vite fait bien fait, des lecteurs qui voudraient obtenir des rsultat rapidement. Si vous souhaitez apprendre programmer et tre vite oprationnel, la prsente lecture vous ennuiera et ne vous mnera pas l o vous voulez aller. Nous vous recommandons particulirement de vous tourner vers un ouvrage tel que Apprendre programmer avec Python qui devrait parfaitement convenir.

Conseils de lecture
Selon vos motivations, vous n'aborderez pas le sujet de la mme faon : aux tudiants dbutant une licence universitaire en informatique il s'agit ici d'aborder les fondations du savoir que vous allez acqurir tout au long de votre cursus. Ne le ngligez aucun prix (au niveau international, on peut parler des formations en Computer sciences) aux tudiants dbutant une formation d'ingnieur ou une prparation aux coles d'ingnieurs pour ces tudiants : l'importance de notre sujet dpend de la proximit de la formation avec l'informatique. aux tudiants universitaires des formations scientifiques "pures" mathmaticiens, physiciens, chimistes, biologistes... : vous aborderez peut-tre ce sujet comme premire approche de l'informatique. Il ne vous sera pas familier de prime abord mais c'est nanmoins un sujet scientifique qui ne devrait donc pas vous drouter tant donn votre bagage mathmatique. Il y a srement des tudiants en informatique sur votre lieu de formation (UFR, facult...) : profitez de leur caractre habituellement accueillant ; vous pourrez srement trouver des tudiants informaticiens qui seront ravis de vous aider. Si vous avez accs une bibliothque universitaire, elle contient srement des ouvrages qui peuvent vous servir. Conseil : certains problmes poss seront peut-tre trop matheux pour vous. Travaillez plutt les exercices proposs dans votre formation qui traiteront de notions plus familires. aux linguistes vous allez surement tre rebuts par ces lectures bien loignes de votre littrature habituelle. Nanmoins, sachez qu'il n'y a que peu de prrequis cette tude et que vos faibles acquis mathmatiques (disons de niveau baccalaurat Srie L pour la France) seront suffisants. Conseil : jetez un il aux premiers problmes poss mais ne vous souciez pas des suivants trop matheux pour vous. Attachez-vous cependant bien comprendre ce nouveau langage, sa syntaxe et sa smantique en insistant sur la partie Thorie de l'algorithmique imprative . aux tudiants de formations professionalisantes BTS, DUT en rapport direct avec l'informatique vous allez en fait apprendre un (plusieurs ?) langage(s) impratif(s) dans votre formation. Cependant, vous allez surtout aborder l'aspect pratique des choses. Ce wikilivre vous permettra de prendre de la hauteur par rapport vos programmes et de les voir de faon plus abstraite. Concrtement, vous utiliserez votre langage au mieux parce que vous verrez mieux les simplifications possibles : cela allgera d'autant votre travail.

1 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Conseil : ne vous concentrez pas trop sur la syntaxe du langage thorique qui sera prsent dans cette ouvrage (vous aurez tt fait de l'oublier). En effet, vous apprendrez srement un ou plusieurs langages dans votre formation (apprenez-les bien, car buter sur des questions de syntaxe est aussi tragique que buter sur des fautes de franais au cours d'une dissertation de philosophie). Concentrez-vous donc plutt sur l'aspect algorithmique des problmes : comment cela se droule, comment obtient-on le rsultat (...simplement) sans vous soucier du langage que nous allons utiliser. Prenez quand mme le temps de faire le parallle entre les deux langages : cela ne devrait pas prendre trop de temps ni tre trop difficile, tant donn que les langages reprennent des concepts les uns aux autres (concepts que nous avons gnraliss ici dans notre langage thorique : les similitudes devraient tre assez flagrantes).

propos de cet ouvrage


L'algorithmique imprative est souvent la premire forme d'algorithmique que l'on aborde car elle est la plus intuitive. C'est en fait l'abstraction des concepts propres aux langages de programmation impratifs. L'tude de l'algorithmique imprative permet donc d'aborder les langages typiquement impratifs d'une faon plus rigoureuse. Afin d'aborder le sujet de faon complte, ce document se compose de trois parties : 1. Une partie thorique qui prsente les divers aspects de l'algorithmique imprative et la faon de les exploiter. 2. Une partie sur les outils de travail de l'algorithmicien. 3. Des problmatiques concrtes, une analyse simple puis approfondie du problme et de ses solutions.

Petit historique
Comme dans tout cours scientifique qui se respecte, il serait judicieux de contextualiser ce que nous allons aborder dans cet ouvrage. L'tude tant assez fastidieuse, nous allons la rduire au strict minimum. Surtout pour une science si jeune et si vieille la fois. Ce que nous abordons exploite des concepts dont le plus rcent est la Programmation structure, concept d'Edsger Dijkstra qui publia ce sujet en 1968. La justesse de ses conclusions rendit la programmation structure populaire ds 1970. Bien qu'aujourd'hui de nouveaux concepts soient apparus, les conclusions d'Edsger Dijkstra n'ont jamais t remises en cause et ces principes sont encore en uvre dans les langages de programmation actuels. Nous voici satisfaits pour la partie humaine, quitte ne retenir qu'une date et un nom, en voici de bons. Pour la partie technique maintenant, le langage de programmation Pascal, que nous aborderons tout au long de l'ouvrage, a t dvelopp par Niklaus Wirth dans les annes 1970 pour suivre dans les faits les thories de Dijkstra. Il a t cr avant tout, des fins pdagogiques, afin d'viter d'enseigner la programmation structure avec un langage de l'poque, qui ne respecterait pas ces concept alors nouveaux. Pour l'anecdote, vous vous en doutiez srement, ce nom a t choisi en hommage au mathmaticien franais Blaise Pascal. Dsol d'avoir fait si court, nous vous invitons lire les articles Programmation imprative et Pascal sur wikipdia.

Premire approche
On peut faire le parallle entre un algorithme et une recette de cuisine. La recette donne les indications ncessaires pour transformer, tape par tape, des ingrdients de dpart en un plat prt servir. En suivant la recette, le cuisinier en transpose le texte en actions concrtes. Il en va de mme pour l'algorithme : une fois qu'on l'a crit, on le donne l'ordinateur qui va le suivre tape par tape, cette fois-ci pour transformer des donnes de dpart en donnes d'arrive : les rsultats. Attention toutefois, ce parallle donne une ide gnrale mais cache quelques subtilits. En effet, si le cuisinier peut faire deux choses en mme temps (faire cuire quelque chose au four pendant qu'il pluche autre chose), l'ordinateur, lui, ne fait qu'une seule chose la fois. L'objectif de ce livre est donc d'apprendre crire des recettes qu'un ordinateur pourra comprendre. Cela implique le respect des rgles d'un langage que nous allons apprendre. Nous pourrons ainsi crire des recettes qui seront en fait des mthodes pour rsoudre des problmes ou calculer des rsultats. L'ordinateur pourra alors suivre la recette et donner les rsultats, aprs avoir effectu tous les calculs (fastidieux) votre place. Un objectif concret est tout simplement de pouvoir assigner un ordinateur une tche trop rbarbative pour en dbarrasser un humain.

Dfinition
Tout d'abord, un algorithme impratif est une squence d'actions. C'est une squence car les actions s'effectuent les unes aprs les autres et non en mme temps. Un algorithme a une fonction, un objectif. Pour cela, il transforme des entres (aucune, une ou plusieurs) en sorties (une ou plusieurs) : vous lui entrez des donnes, il vous en sort d'autres. Distinction algorithme / programme : de l'algorithme dcoule un programme informatique que l'on peut excuter sur une machine. Le programme informatique est une traduction de l'algorithme dans un langage de programmation (par exemple Pascal). On peut crer plusieurs programmes informatiques diffrents partir d'un mme algorithme car chaque langage de programmation a ses particularits. On peut donc dire que l'algorithme est thorique, il est l'abstraction du programme informatique. Par exemple, l'algorithme par lequel on entre deux nombres entiers et qui donne en sortie la somme de ces deux nombres a pour objectif de faciliter le calcul des sommes de deux nombres, oprations qui peuvent tre fastidieuses faire de tte pour un humain. Il y a dans la vie courante de nombreux exemples d'algorithmes impratifs qui nous donnent des marches suivre (mathmatiques, recettes de cuisine,...).

2 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Un algorithme complet, pris ci-dessous comme exemple, donne une ide simple de ce qu'on pourra produire la fin de l'tude de l'algorithmique imprative. Tous les concepts mis en uvre dans cet algorithme sont expliqus plus loin, ne vous inquitez donc pas si certains aspects vous chappent pour l'instant. Cet algorithme calcule et affiche le primtre, l'aire et le volume du cercle ou de la sphre dont le rayon est donn par l'utilisateur :

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

Algorithme cercle Constantes pi = 3,1416 Lexique rayon : rel (* le rayon donn par l'utilisateur *) primtre : rel (* le primtre du cercle *) Dbut Afficher("Donner le rayon : ") Lire(rayon) primtre 2 * pi * rayon Afficher("Le primtre est de : ", primtre) Afficher("L'aire du cercle est de ", pi * rayon) Afficher("Le volume de la sphre est de ",(4/3) * pi * rayon) Fin

la fin de l'apprentissage propos dans ce livre, vous serez mme de crer ce genre d'algorithme et d'autres bien plus complexes.

Nous entrons maintenant dans le vif du sujet. Cette premire partie est plutt abstraite et une fois que vous l'aurez tudie, vous aurez surement une sensation de confusion, de ne pas savoir ce qu'est la substance ( quoi a me sert de savoir a ?! ). cet effet, vous trouverez en fin de document une partie Ce qu'il faut retenir . Lors de votre premire lecture, n'essayez pas de comprendre mais plutt d'admettre. Une seconde lecture vous permettra d'avoir une vue d'ensemble et de constater qu'en fait, tout se tient.

Premire approche
Un type est la faon de comprendre la signification d'une donne. Prenons la donne 4 : elle peut tre de type entier (de valeur 4 : 3+1), de type caractre (le caractre "4"), est-ce un rel... ? Un oprateur transforme des donnes. Par exemple, la somme est un oprateur qui transforme des donnes en une autre donne. Il convient de se demander sur quel(s) type(s) un oprateur fonctionne. Par exemple, la somme de deux donnes de type "entier" est de type "entier". On peut donc supposer que la somme de deux donnes de type "rel" sera de type "rel" (rassurez-vous : ce sera le cas). Qu'en est-il de la somme de deux donnes de type "caractre" et de la somme d'une donne de type "rel" et d'une autre de type "entier" ? Une expression est une combinaison d'oprateur et de donnes. Par exemple "4+3" est une expression comportant un oprateur et deux donnes de type "entier". Toutes les expressions ont une valeur, "4+3" a la valeur 7 ; 7 est une donne de type "entier". Nous avons donc trois notions diffrentes, mais lies entre elles par des rgles que nous allons voir.

Spcification
Chaque type a donc son ensemble de valeurs possibles et des oprateurs qui lui sont propres. Par exemple, le type entier qui peut prendre des valeurs telles que 10 ou 12345... Les oprateurs sont des fonctions mathmatiques et ce titre, ils ont un espace de dpart et un espace d'arrive. Cette proprit s'tend aux oprateurs puisque chaque oprateur un ou plusieurs types de dpart (fonction une ou plusieurs variables) et un type d'arrive. Prenons la fonction mathmatique somme . On pourrait noter : somme : : x,y x+y. De la mme faon, l'oprateur somme ajoute deux donnes de type "entier" et renvoie un "entier". Remarquez que "a+b" est une notation de somme(a,b). Pour chaque oprateur que vous dcouvrez ou utilisez, demandez-vous toujours quels sont les types de dpart et d'arrive. Beaucoup d'erreurs sont dues des oprateurs mal utiliss. Une expression est donc une suite d'oprateurs et de donnes qui doit respecter les rgles imposes par l'usage des oprateurs. Dans notre cours nous allons introduire cinq types, les plus couramment utiliss en informatique : entier rel caractre chane de caractres boolen Ce(s) dernier(s) vous est (sont) probablement trangers : ne vous inquitez pas, nous allons y revenir.

3 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Les entiers et les rels


Voici deux types fidles leur dfinition mathmatique. Les oprateurs sur les entiers sont "+", "-" "*" "/", respectivement la somme, le diffrence, le multiplication et la division entire. Un dernier oprateur est l'oprateur mod, donnant le reste de la division entire. Tous ces oprateurs prennent deux donnes de type "entier" pour en renvoyer une autre du mme type. (Rappel : a = a / b + a mod b) Les oprateurs sur les rels sont "+", "-" "*" "/", respectivement la somme, la diffrence, la multiplication et la division. Tous ces oprateurs prennent deux donnes de type "rel" pour en renvoyer une autre du mme type. Il convient de se demander ce qu'il se passe quand on considre l'expression "a+b" avec a entier et b rel. Cela est cens ne jamais arriver. Nanmoins, on pourra considrer que l'entier se transforme en rel avant l'opration.

Les caractres et les chanes de caractres


Un caractre est tout simplement une lettre, un chiffre ou un symbole : par exemple, "1", "a", "A", "|" sont des caractres. Aucun oprateur n'existe sur les caractres. Une chane de caractres est une suite de caractres telle que dcrite prcdemment. "1", "1abc" (par exemple) sont des chanes de caractres. noter que "" est une chane de caractres (la seule comportant 0 caractre). Il n'existe qu'un seul oprateur sur les chanes. Il s'agit de l'oprateur de concatnation qu'on notera "+". La concatnation revient mettre la seconde chane la suite de la premire. Par exemple "abc"+"def" est quivalente a "abcdef". Remarquez que l'oprateur de concatnation, mme s'il est not "+", n'est pas commutatif comme l'est la somme, nous n'avons videmment pas a+b=b+a. Attention, par la suite, ne pas confondre 1+2 qui est l'entier de valeur 3 avec "1"+"2" qui est la concatnation des chanes "1" et "2" qui vaut "12" (et srement pas "3"). Il n'existe pas de convention pour dsigner l'oprateur de concatnation. Nous pourrons galement utiliser la notation ".". Bien que cela ne doive pas arriver, nous pouvons considrer que l'opration de concatnation effectue sur des caractres fonctionne et donne une chane de caractres.

Introduction l'arithmtique boolenne


En informatique on introduit un nouveau type un peu moins familier : le boolen. Au mme titre que les entiers ou les rels : un boolen peut prendre un ensemble de valeurs et possde ses propres oprateurs. Il n'est donn ici que quelques explications (ncessaires et suffisantes pour la suite du cours) sur le boolen. Il existe cependant toute une algbre permettant de travailler sur les boolens. Un complment essentiel de ce cours d'algorithmique imprative est l'tude de l'algbre de Boole.

Premire approche
En mathmatiques, les entiers ont t invits pour dnombrer, les rels pour reprsenter les distances, les volumes, etc... Le boolen a galement pour utilit de reprsenter le rel. Il sert reprsenter la vracit, c'est dire dclarer si une chose est vraie ou fausse. L'ensemble des valeurs possibles d'un boolen est de deux (!). Ces deux valeurs sont notes VRAI et FAUX. Voici deux exemples comportant des informations reprsentes par des boolens : Premier exemple : Supposons que E soit en ensemble qui contient les lments a, b, c et d. 1. 2. 3. 4. L'information cardinal de E est une information qui peut tre reprsente par un entier (ici 4). L'information b appartient E est une information qui peut tre reprsente par un boolen (ici VRAI). L'information e appartient E est une information qui peut tre reprsente par un boolen (ici FAUX). L'information 'E comporte au moins 2 lments est une information qui peut tre reprsente par un boolen (ici VRAI).

Second exemple : Prenons l'ascenseur d'un immeuble. 1. 2. 3. 4. L'information nombre de personnes dans l'ascenseur peut tre reprsente par un entier. L'information il y a au moins une personne dans l'ascenseur peut tre reprsente par un boolen. L'information l'ascenseur est au premier tage peut tre reprsente par un boolen. etc.

Vous voyez donc qu'un boolen peut servir reprsenter une multitude d'informations diffrentes mais ne remplace pas les entiers, les rels ou tout autre type. Chaque type un usage et il convient d'user du boolen a bon escient tout comme on ne reprsente pas une distance avec un entier ou un dnombrement avec un rel.

Oprateurs boolens
Au mme titre que pour les autres types, il existe des oprateurs sur les boolen. Nous avons vu que la somme tait un oprateur qui prenait deux entiers et renvoyait un rsultat de type entier galement. Il en va de mme pour les boolen.

4 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Oprateur

not

Type des paramtres

Type du rsultat

Valeur du rsultat

Exemple

Remarque

ngation

non ou

un boolen

un boolen

Si VRAI alors FAUX. Si FAUX alors VRAI

non(VRAI) a pour non() est une fonction mathmatique rsultat FAUX dite rciproque : non(non(truc)) vaut non(FAUX) a pour truc. rsultat VRAI

conjonction et

un deux boolen boolen

Le rsultat vaut VRAI seulement si les deux paramtres sont VRAI. FAUX sinon.

VRAI et VRAI a pour rsultat VRAI VRAI et FAUX a pour rsultat FAUX

On pourra aussi dire "Pour que le rsultat soit VRAI il faut que tous les paramtres soient VRAI".

disjonction ou

deux boolen

un boolen

Le rsultat vaut VRAI si au moins un des deux paramtres est VRAI. FAUX si tous les paramtres sont FAUX

VRAI ou VRAI a pour rsultat VRAI VRAI ou FAUX a pour rsultat VRAI

Vous en serez dj arriv ces conclusions : si b est un boolen,


b et FAUX b ou VRAI

vaut FAUX quelque soit b vaut VRAI quelque soit b

Ces oprateurs peuvent bien sr former des expressions. Quelques exemples :


non(non(FAUX)) vaut FAUX ((VRAI et FAUX) ou VRAI)

vaut VRAI

La ngation est prioritaire sur la conjonction. La conjonction est prioritaire sur la disjonction.

Tableau rcapitulatif
Tableau rcapitulatif des types et de leurs oprateurs Type Entier Rel Boolen Caractre Chane de caractres Concatnation Ensemble de valeurs {VRAI ; FAUX}
+ +

Oprateurs (somme), - (diffrence), * (multiplication), / (division entire) (somme), - (diffrence), * (multiplication), / (division) (ngation), et (conjonction), ou (disjontion)

Ce qu'il faut retenir


Ce chapitre est abstrait et ne donne rien de concret. N'apprenez pas par cur, tout ceci se tient et est assez cohrent par rapport ce que vous avez appris sur les mathmatiques. Voici ce qui doit retenir votre attention : Retenez les noms des diffrents types et de leurs oprateurs en retenant bien quel oprateur fait quoi et avec quoi. Vous devriez pouvoir reconstruire de tte le tableau rcapitulatif (encore une fois, vous ne devriez pas avoir l'apprendre, vous devriez pouvoir le dduire des types). Retenez que les boolen, les caractres et les chanes de caractres et leurs oprateurs fonctionnent exactement de la mme faon que les entiers et les rels. Ce sont des types, qui ont un ensemble de valeurs possibles et des oprateurs spcifiques. On peut crire des expressions condition de respecter certaines rgles. Essayez de voir un peu comment on manipule cette arithmtique boolenne qui, comme l'arithmtique entire, vous permet de calculer des expressions et d'en simplifier d'autres. Remarquez que cette arithmtique est plus simple puisque vous n'avez que deux valeurs possibles (c'est peu par rapport l'infinit d'entiers...). Vous pouvez dj faire les exercices sur ce chapitre. Si vous avez su les rsoudre sans relire ce cours. Vous avez retenu l'essentiel ! N'oubliez pas que tout a est simple (eh oui !).

Dans un algorithme, il faut stocker les donnes traiter. Certaines de ces donnes sont connues et ne varieront pas tout le long de l'algorithme : il s'agit des constantes. D'autres donnes peuvent tre inconnues (elle seront fonction du choix de l'utilisateur, ou du temps...) ou susceptibles d'voluer au cours de l'algorithme : il s'agit des variables.

Les variables

5 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Toutes les variables ont un type. Dans chaque algorithme, toutes les variables et leurs types sont explicites dans le lexique. On dit que la variable est dclare. D'un point de vue mathmatique, la dclaration revient l'expression "Soit ... un ...". Le lexique est not comme suit : Variables identifiant_de_la_variable : type de la variable; ...

Un exemple
Variables n : r : b,c : chaine :

entier rel boolens chane de caratres

Dans cet exemple, nous avons 5 variables. Du point de vue mathmatique, on aurait pu noncer "Soit n un entier", "Soit r un rel", "Soient b et c deux boolens", etc.

Les constantes
De la mme faon, les constantes sont dclares dans une partie Constantes de cette faon : Constantes nom_de_la_constante = valeur

Un exemple
A priori, on peut considrer que PI ne risque pas de changer de valeur pendant un algorithme. On peut donc dclarer PI en tant que constante. Constantes pi = 3.14 ... Une seule constante est dclare.

Nous avons vu qu'un algorithme est une squence d'instructions ; de quoi s'agit-il exactement ? Les instructions sont les actions devant tre effectues par l'algorithme. Elle peuvent requrir que l'on prcise certaines informations.

Deux instructions de base


Voici expliques deux instructions que l'on retrouvera trs frquemment dans des algorithmes. Il s'agit des instructions Afficher et Lire.

Afficher
Afficher

permet d'afficher des donnes l'cran et ainsi de communiquer avec l'utilisateur. Pour cette instruction, on doit prciser une expression qui sera value avant d'tre affiche. Quelques exemples : Afficher ("ceci est un exemple : on affiche une chane, sans utiliser de variables") Ce programme affiche : ceci est un exemple : on affiche une chane, sans utiliser de variables

Si l'algorithme contient

6 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Constantes PI = 9 Le programme Afficher(PI) affiche 9

Lire
La fonction Lire permet de demander l'utilisateur de fournir des informations. Chaque information donne par l'utilisateur est stocke dans une variable (attention au type !). Vous prcisez cette variable dans les parenthses. Un exemple : nous ralisons un algorithme qui demande l'utilisateur d'entrer son ge. Tout d'abord il apparatra dans le lexique : Lexique age : entier (* l'ge donn par l'utilisateur *) Pour demander l'ge : Lire(age)

Les blocs d'instructions


Souvent, l'excution d'une seule instruction ne suffit pas pour faire un algorithme complet. Nous pouvons faire en sorte que plusieurs instructions soient considres comme une seule. Pour cela, il faut crer un bloc d'instructions. Partout on l'on peut mettre une instruction, on peut mettre un bloc d'instructions. Concrtement, on procde ainsi : les instructions sont spares par un saut de ligne ou par ;. Le bloc d'instruction est prcd de Dbut et suivi de Fin. Un exemple : Dbut instruction1 instruction2 Afficher("Cet affichage est la troisime instruction") instruction4 Fin Une autre notation, courante dans les langages de programmation, est plus courte. Les instructions formant un bloc sont entre { et }.

L'assignation est une instruction qui consiste inscrire dans une variable une valeur calcule depuis une expression. Attention : la nouvelle valeur affecte crase la prcdente. C'est donc la deuxime faon que nous apprenons de donner une valeur une variable. La premire tait d'utiliser l'instruction Lire qui permet de demander la valeur l'utilisateur. On peut dire que l'instruction Lire est une forme particulire d'affectation. Pour effectuer une assignation, on utilise l'instruction Assigner. On prcise entre parenthses la variable affecte ainsi que l'expression de la valeur de l'affectation. On pourra galement noter l'affectation ou :=. Ce symbole peut tre nonc prend pour valeur . Attention toutefois ne pas la noter = bien que certains langages utilisent cette notation. Ce serait un dangereux raccourci de pense avec les mathmatiques (voir la mise en garde ci-dessous). Un exemple : voici notre lexique Lexique n : entier On assigne n :

7 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Assigner(n, 12) A partir de maintenant la variable n vaut 12. Ainsi, l'instruction Afficher(n) provoquera l'affichage suivant : 12 Dans la suite du cours, nous utiliserons la notation , moins lourde.

Mise en garde sur le parallle avec les mathmatiques


Au moment de l'affectation, la valeur affect est value, c'est--dire calcule, les constantes et les variables sont donc remplaces par leurs valeurs respectives. Exemple : dans le lexique nous avons : Lexique a,b,c : entiers

a1 b2 ca+b (* quivaut c2+1 et c3 *) afficher(c) (* affiche 3 *) b5 afficher(c) (* affiche toujours 3 et non 6 *) c conserve sa valeur tant qu'elle n'a pas t affecte, le changement de la valeur de b n'affecte pas la valeur de c. Certains seraient tents de noter l'affectation avec l'oprateur "=", elle est d'ailleurs note ainsi dans le langage de programmation C. C'est pourtant une erreur vis--vis du sens mathmatique de ce symbole. En effet, cette expression : x = x+1 est tout fait correcte en informatique si on considre l'affectation note ainsi ; cela revient incrmenter x. Mais du point de vue mathmatique c'est une aberration. Voyons cela en appliquant une rsolution d'quation du premier degr : x=x+1 par soustraction de x dans les deux membres : xx=1 donc 0=1 En revanche, l'affectation note := est valide en mathmatique comme en informatique. En prenant cette convention, tout le monde est content...

Vous savez que les instructions s'excutent les unes aprs les autres. C'est intressant mais insuffisant pour laborer des algorithmes complexes. En effet, nous pourrions avoir besoin d'excuter certaines instructions seulement dans un certain contexte. Les structures permettant d'imposer la succession des instructions sont appeles structures de contrles. L'excution conditionnelle, que nous allons voir ici, est la plus simple de ces structures de contrles.

SI...ALORS...
L'excution conditionnelle permet de n'excuter une instruction que si une certaine condition est remplie. La syntaxe est la suivante : SI condition ALORS instruction FINSI

8 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

condition est une expression boolenne. L'instruction n'est excute que si cette l'expression boolenne est value VRAI. Si condition est value FAUX aucune instruction n'est excute. Dans les deux cas, le programme poursuit son excution par ce qui se trouve aprs le FINSI. instruction est une instruction normale. Vous pouvez bien sr excuter plusieurs instructions : il suffit pour cela d'un bloc d'instructions.

Exemples
SI FAUX ALORS Afficher("Cet affichage ne se produira jamais, la condition n'tant jamais VRAI") FINSI Cet extrait d'algorithme n'a aucun intrt. S'il est effac du programme, on obtient un programme quivalent. SI VRAI ALORS Afficher("Cet affichage se produit toujours") FINSI Cet extrait d'algorithme n'a aucun intrt. Il aurait videmment suffit d'crire : Afficher ("Cet affichage se produit toujours")

...SINON
Il est possible de prciser une instruction excuter si la condition n'est pas vrifie, c'est--dire si elle est value FAUX. Il suffit pour cela d'ajouter une partie SINON entre ALORS et FINSI. Cette partie SINON n'est pas toujours utile, elle est donc facultative. SI condition ALORS instruction SINON instruction FINSI

Exemples
SI condition ALORS Afficher("La condition vaut VRAI") SINON Afficher("La condition vaut FAUX") FINSI

Une quivalence utile


Remarquez que ces deux blocs conditionnels sont quivalents : SI condition ALORS instruction_A SINON instruction_B FINSI

SI non(condition) ALORS instruction_B SINON instruction_A FINSI

Les structures de contrle itratives permettent d'excuter plusieurs fois de suite une ou plusieurs instructions. Il en existe trois distinctes.

Structure POUR
La structure POUR permet d'excuter une instruction un nombre connu de fois. Voici la syntaxe :

9 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

POUR i DE deb A fin FAIRE instruction FINPOUR


i est

l'identifiant d'une variable (qui doit bien sr tre dclare). deb et fin sont deux expressions de mme type que i : ce sont les valeurs entre lesquelles i va parcourir l'ensemble des valeurs intermdiaires. La structure s'excute de la faon suivante : 1. 2. 3. 4.
i est affect la valeur de deb (ideb) si i est diffrent de fin alors on excute instruction incrmenter i (ii+1)

revenir au point 2

Il est vident que pour que le programme fonctionne deb<fin.

Exemples
Dix itrations Lexique i : entier Dbut POUR i de 1 10 FAIRE Afficher(i); FINPOUR FIN Ce programme va afficher : 1 2 3 4 5 6 7 8 9 10

Structure TANTQUE
TANTQUE condition instruction FINTANTQUE
condition

est une expression boolenne, comme dans la structure SI condition ALORS...

Cette structure est excute comme suit : 1. si condition est vraie : excuter instruction sinon, continuer aprs FINTANTQUE 2. reprendre au point 1

La boucle infinie
Il est possible grce cette structure de crer une boucle infinie : TANTQUE VRAI instruction FTQ

Une boucle POUR


Il est possible de simuler une boucle POUR l'aide d'un TANTQUE

10 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

ideb TANTQUE i <= fin instuction ii+1 FTQ

Exemples

Stucture REPETER
REPETER instruction JUSQU'A condition
condition

est une expression boolenne.

Cette structure s'excute comme suit : 1. excuter instruction 2. si condition est vrai : continuer au point 3 sinon, reprendre au point 1 3. excuter ce qui suit le JUSQU'A

La boucle infinie
Il est possible grce cette structure de crer une boucle infinie : REPETER instruction JUSQU'A FAUX

Une boucle POUR


Il est possible de simuler une boucle POUR l'aide d'un REPETER ideb REPETER instuction ii+1 JUSQU'A i=fin

Exemples

Comment dterminer la structure utiliser ?

Premire approche
Le tableau est un nouveau type. Il contient un ensemble d'lments indics par des entiers ; on peut donc utiliser des variables tableaux. Nous n'tudierons que les tableaux une dimension galement appels vecteurs.

Spcification
Les tableaux sont dclars comme suit : Lexique tab : tableau DEBUT FIN de TYPE tab est l'identifiant de la variable tableau DEBUT est un entier : l'indice du premier lment du tableau, gnralement 0 ou 1. FIN est un entier : l'indice du dernier lment, cela peut tre un entier fix ou, plus intressant, une constante dclare. On a videmment FIN > DEBUT TYPE est le type de chacun des lments du tableau.

11 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Par exemple, un tableau d'entiers de 10 cases Lexique tab : tableau 1 10 de entier On accde au ime du tableau comme suit tab[i] i est un entier qui doit videmment tre compris entre DEBUT et FIN (prciss dans la dclaration de tab) la variable tab[i] est donc du type TYPE (prcis dans la dclaration de tab)

Utilisation
La tableau est utilis lorsqu'il faut stocker des suites de variables de mme rle. Par exemple, les notes d'un groupe d'tudiants en algorithmique imprative. La structure POUR se prte trs bien au parcours d'un tableau. En supposant le tableau tab dclarer comme suit : Lexique tab : tableau MIN MAX de TYPE Il suffit pour afficher ses lments de Pour i de MIN MAX Afficher(tab[i]) FP

Premire approche
Les procdures et les fonctions sont des sous-programmes qui permettent une rutilisation du code plus facile. En effet, si par exemple on code l'algorithme de calcul de T.V.A. et qu'on l'utilise divers endroits du programme, plutt que de recopier le code chaque fois, il est prfrable de crer un sous-programme de calcul. La recopie a toutefois les inconvnients suivants : La recopie du code s'accompagne souvent d'un changement des noms de variables, voire de la valeur de certains paramtres, Chaque copie du code augmente la taille des programmes source et compil, La maintenance est plus difficile : s'il faut modifier l'algorithme, il faut modifier toutes les copies sans en oublier une seule. L'utilisation d'un sous-programme vite tous ces problmes : Les sous-programmes utilisent des variables locales et des paramtres formels, c'est--dire qu'on leur passe les valeurs (voire les variables, par adresse ou rfrence) qu'ils doivent utiliser. L'algorithme n'est cod qu'une seule fois, ce qui n'augmente pas la taille du programme. La maintenance est facilite par le point prcdent : s'il faut modifier l'algorithme, la modification n'a lieu qu'en un seul endroit.

Procdure et fonction : quelle diffrence ?


Une procdure traite les informations qu'on lui passe, mais ne retourne, en gnral, aucun rsultat. En gnral, cette procdure a un effet de bord. Une fonction traite les informations qu'on lui passe, et retourne un rsultat. Si la fonction n'a aucun effet de bord, on peut la comparer une fonction mathmatique. Effet de bord un sous-programme avec effet de bord modifie l'tat global de l'application. En gnral, appeler deux fois un mme sous-programme avec effet de bord en lui passant les mmes paramtres ne produit pas le mme rsultat.

Premire approche
L'enregistrement est une faon de crer un nouveau type, ou encore un mta-type, c'est--dire un type qui contient d'autres variables de types dj dfinis.

12 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Spcification
On dclare un nouveau type dans la partie Types comme suit : identifiant_du_type = enregistrement identifiant_premire_sous_valeur : type_de_la_premire_sous_valeur identifiant_deuxime_sous_valeur : type_de_la_deuxime_sous_valeur ... fin on peut ensuite dclarer normalement les variables de ce nouveau type : identifiant_variable : identifiant_du_type Pour accder une sous-valeur de la variable, nous utiliserons l'expression : identifiant_variable.identifiant_sous_valeur Cette expression est du type de identifiant_sous_valeur.

Exemple
Supposons que nous voulions un nouveau type couple (de deux entiers). Nous allons dclarer le type couple comme suit : couple = enregistrement a : entier b : entier fin Supposons maintenant que nous avons le lexique suivant : Lexique c : couple Si nous assignons : c.a 1 c.b 2 afficher(c.a) (* affichera 1 *) Le projet sur les dates propose un travail complet sur le sujet.

Utilisation
Cela n'est pas obligatoire en algorithmique imprative, mais pour travailler sur un nouveau type , il convient de dfinir quelques fonctions lmentaires pour crer une variable partir de ses sous-valeurs. Remarquez que les types de paramtres seront semblables aux types des sous-variables de nouveau type (exception faite dans le cas de sous-valeurs par dfaut...).

Exemple
Pour reprendre notre exemple, nous pourrions crer une fonction : fonction creerCouple(m, n : entiers) (* crer un couple partir de ses deux lments *) lexique NouveauCouple : couple debut NouveauCouple.a m NouveauCouple.b n renvoyer NouveauCouple fin

13 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Au final, l'algorithme se compose de la faon suivante : 1. 2. 3. 4. 5.


Algorithme

suivi du nom de l'algorithme De la dclaration des procdures et des fonctions De la dclaration des constantes de l'algorithme principal De la dclaration des variables de l'algorithme principal De l'algorithme principal

Algorithme nom_de_l'algorithme Fonction1(paramtre1 : type du paramtre 1 (* objet du paramtre1 *) paramtre2 : type du paramtre 1 (* objet du paramtre2 *)) : type de la valeur de retour Constantes locales de la Fonction1 constante1 = valeur_de_la_constante1 constante2 = valeur_de_la_constante2 constante3 = valeur_de_la_constante3 Variables locales de la Fonction1 variable1 : type_de_la_variable1 variable2 : type_de_la_variable2 variable3 : type_de_la_variable3 Dbut instruction1 instruction2 Retourner valeur Fin Procdure1(E|S|ES paramtre1 : type du paramtre 1 (* objet du paramtre1 *) E|S|ES paramtre1 : type du paramtre 2 (* objet du paramtre2 *) E|S|ES paramtre1 : type du paramtre 3 (* objet du paramtre3 *)) Constantes locales de la Procdure1 constante1 = valeur_de_la_constante1 constante2 = valeur_de_la_constante2 constante3 = valeur_de_la_constante3 Variables locales de la Procdure1 variable1 : type_de_la_variable1 variable2 : type_de_la_variable2 variable3 : type_de_la_variable3 Dbut instruction1 instruction2 Fin Constantes de l'algorithme principal constante1 = valeur_de_la_constante1 constante2 = valeur_de_la_constante2 constante3 = valeur_de_la_constante3 Variables de l'algorithme principal variable1 : type_de_la_variable1 variable2 : type_de_la_variable2 variable3 : type_de_la_variable3 Dbut instruction1 instruction2 Fin

Types, expressions et oprateurs


Questions thoriques
1. Citez des exemples de types 2. Donnez un oprateur polymorphe Solutions : 1. boolen, entier, rel, caractre, chane de caractres 2. + (polymorphe car fonctionne avec des entiers et des rels)

Types et valeurs
Donner le type des expressions suivantes et leur valeur 1. 0

14 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

2. 3. 4. 5. 6.

1+2 0.0+1.0 "a" "a"."b"="b" "a"."b"

Donner le type de a et de l'expression : 1. a+1 2. a."b" 3. a=1.0 Solutions 1. 2. 3. 4. 5. 6. entier : 0 entier : 3 rel : 1.0 caractre : "a" boolen : FAUX chane de caractres : "ab"

Questions avec la variable a : 1. entier ; a entier 2. chane de caractres : a caractre ou chane de caractres 3. boolen : a rel

Calcul boolen
Quelle est la valeur de ces expressions boolennes ? 1. 2. 3. 4. 5. 6. 7. non(VRAI) VRAI et FAUX FAUX ou FAUX VRAI et VRAI non(FAUX ou VRAI) FAUX et ((VRAI et VRAI) ou (VRAI et (FAUX ou (VRAI et FAUX))))) VRAI ou (VRAI et (FAUX ou ((FAUX et VRAI) ou VRAI))) des boolens, simplifier les expressions :

a et b sont

1. 2. 3. 4. 5. 6. 7. 8. 9.

non(non(a)) non(non(non(b))) faux ou a faux et a vrai et a vrai ou a a et non(a) a ou non(a) non(a=b) et (a=b)

Solutions 1. 2. 3. 4. 5. 6. FAUX FAUX FAUX VRAI FAUX Il suffit de lire "FAUX et ..." au dbut de l'expression pour savoir tout de suite le rsultat. Quel que soit ce qu'il y avait aprs le et cela aurait t FAUX. 7. De mme, il suffit de lire "VRAI ou ..." au dbut de l'expression pour savoir tout de suite le rsultat : peu importe ce qu'il y a aprs le ou, cela aurait t VRAI 8. ...

Simplifications : 1. 2. 3. 4. 5. 6. 7. 8. 9. a non(b) a faux a vrai faux vrai faux

15 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Condition
Donner un extrait d'algorithme quivalent celui-ci sans utiliser de sinon : si condition alors instruction1 sinon instruction2

Solution
si condition alors instruction1 finsi si non(condition) alors instruction2 finsi

Boucles
13 47
Donner une boucle qui affiche les entiers de 13 47 Solution: Pour i de 13 37 Afficher(i) FP

de 5 en 5
Donner une boucle affichant les entiers de 5 en 5 et de 5 100 Solutions : i0 Rpter ii+5 afficher(i) Jusqu' i=100

i5 Rpter afficher(i) ii+5 Jusqu' i=105

pour i de 5 100 si i mod 5 = 0 alors afficher i fp

pour i de 1 20 afficher(5*i) fp Remarque : ces algorithmes fonctionnent tous mais certains sont plus efficaces que d'autres. Cette rflexion est laisse au lecteur.

Tableaux
Selon la dclaration suivante tab : tableau 0 10 de T

16 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Combien le tableau a-t-il d'lments ? 9, 10, 11 ?

Procdures et fonctions
crire ces fonctions en procdures, ces procdures en fonctions :

Lorsqu'on rdige un algorithme, il faut toujours garder l'esprit qu'il doit pouvoir tre lu et compris par quelqu'un d'autre. A fur et mesure de la pratique, les rdacteurs ont dgag quelques principes dont les plus simples sont expliqus ici. Il convient de respecter ces principes d'une faon rigoureuse. Remarque pour les tudiants : il est parfaitement admis que le respect de ces rgles de rdaction soit pris en compte dans la note finale. Quand vous crivez une dissertation, il convient de respecter la grammaire et l'orthographe mme si ce n'est pas ce qui doit tre valu, il en est de mme ici.

Indenter son code


L'indentation d'une ligne est l'espace qui la spare de la marge gauche.

Problme
Considrons l'algorithme (incomplet) suivant : Dbut si condition1 alors instruction1 sinon si condition2 alors instruction2 sinon instruction3 finsi finsi Fin Voici le mme algorithme mais sans l'indentation : Dbut si condition1 alors instruction1 sinon si condition2 alors instruction2 sinon instruction3 finsi finsi Fin Il est dj moins vident de comprendre le fonctionnement de l'algorithme. Ce dernier est toutefois plus abordable que : Dbut si condition1 alors instruction1 sinon si condition2 alors instruction2 sinon instruction3 finsi finsi Fin et pourquoi pas... Dbut si condition1 alors instruction1 sinon si condition2 alors instruction2 sinon instruction3 finsi fi

Comment faire
Pour bien indenter, considrez les blocs et mettez au mme niveau le dbut du bloc et la fin du bloc. Par exemple, un fin devrait se trouver au mme niveau que son dbut : on devrait l'apercevoir immdiatement tant donn que tout ce qu'il y a entre les deux devrait se trouver un niveau d'indentation plus loin.

17 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

dbut ... dbut ... fin ... fin Procdez ainsi avec SI...FINSI TANTQUE...FTQ REPETER...JUSQU'A POUR...FP De mme : placez les alors et les sinon au mme niveau. Vous pouvez transformer ces rgles, l'important tant de les fixer et de s'y tenir. Il existe plusieurs faons d'indenter et chaque auteur ses prfrences.

Utiliser des identifiants pertinents


Pour choisir un identifiant de variable ou de fonction, souvenez-vous qu'il doit remplir deux utilits principales dcrire son rle (sans toutefois remplacer le commentaire en dclaration) distinguer des autres (ne pas se retrouver avec deux fonctions calculer_nombre et calculer_nb, quotient et division...) vitez : de rpter le type de la variable dans son identifiant (entier_n, chaine_dpart) les conventions utilises en maths (n ou x ne suffisent pas pour dcrire le rle d'un entier/rel) Pensez galement aux conventions, notamment : i (j, k...) comme variable de boucle utiliser un prfixe pour signaler les variables entres du programme qui seront donnes par l'utilisateur.

Commenter utile
Il ne faut pas dcrire ce que vous faites : mais pourquoi vous le faites POUR i de 1 24 FAIRE instruction FINPOUR Pour cet algorithme le commentaire... est pertinent. Plus particulirement : le commentaire rpond la question "pourquoi 24 et pas 25 ?". (* i va de 1 24 *) n'est pas pertinent. Il ne rpond pas la question "pourquoi 24 et pas 23 ?".
(* il a 24 heures dans une journe donc 24 instruction *)

Servez-vous galement des commentaires pour indiquer ce que vous supposez : les conditions dans lesquelles votre algorithme fonctionne.

Tester un programme peut montrer la prsence de bugs, pas leur absence .


(Edsger Dijkstra : Notes On Structured Programming, 1970)

Le langage de programmation le plus simple permettant d'implmenter directement un algorithme impratif par simple traduction de celui-ci est le langage Pascal, qui a t dvelopp dans cette optique. Ainsi, un travail pratique qui peut accompagner l'apprentissage peut tre simplement d'exprimenter des programmes en les recopiant et en visionnant le rsultat en situation, sur une machine.

Prrequis
Prrequis cognitif
l'algorithmique imprative, il est videmment ncessaire d'avoir cr des algorithmes avant de vouloir les mettre sur une machine. Utilisation simple de l'ordinateur (dition de texte).

Prrequis logiciels

18 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Un diteur de texte : le plus simple suffit. Toutefois, il existe des diteurs de texte qui facilitent l'dition d'un code source. On les appelle les diteurs de code-source. En plus du simple diteur de texte, ils proposent les fonctionnalits suivantes : Coloration syntaxique Compltion automatique des mots cls Numrotation des lignes (vous verrez que c'est indispensable : en effet, si le compilateur trouve une erreur dans votre code source, il vous indiquera le numro de la ligne o elle se trouve) Aide l'indentation

Paquet logiciel Ubuntu (? (http://doc.ubuntu-fr.org fpc /tutoriel geany /comment_installer_un_paquet) )

Quelques diteurs de code source : Notepad++ (Windows), TextMate (Mac OS), SciTE (Windows et Linux) pour les plus abordables mais aussi emacs, vi (voir la catgorie diteur de texte sur wikipdia pour une liste exhaustive). Un compilateur Pascal : Free Pascal est bon, libre, gratuit et fonctionne srement sur votre plateforme. Un terminal, pour lancer et tester vos programmes. Vous pouvez utiliser un terminal classique sous Linux et Mac OS X. Sous Windows, cela s'appelle Ligne de commande DOS . Il existe des logiciels qui runissent toutes ces fonctionnalits : diteur de code + compilateur + terminal. On les appelle les environnements de dveloppement, certains sont complexes mais il en existe de trs simples qui vous permettent de compiler le code et de lancer le programme simplement en appuyant sur un bouton. Geany (Linux) est parfait notre niveau. Note aux tudiants : votre salle de Travaux Pratiques sera srement quipe, votre enseignant vous indiquera comment accder tout a.

Prrequis matriels
Un ordinateur, n'importe lequel et de n'importe qu'elle architecture (PC ou Mac), du moment que les prrequis logiciels sont respects.

Les limites de l'ordinateur


Un ordinateur est une machine finie (par curiosit, vous pouvez voir la notion d'automate fini). De ce fait on ne peut pas tout calculer en un temps fini. Votre algorithme peut tre bon mais ne pas fonctionner sur ordinateur. La finitude se voit aussi dans les grandeurs. Vous ne pouvez pas manipuler des nombres aussi grand que vous voulez. Les technologies ont leur limite. Cependant, les ordinateurs d'aujourd'hui sont assez dvelopps pour que vous ayez une assez grande marge de manuvre.

Problme de la valeur entire maximale


Petit TP : faites un algorithme qui prend une valeur entire, l'augmente et l'affiche sans cesse et observez partir de quand le programme commence donner des valeurs incohrentes. En Pascal par exemple : l'entier maximal reprsentable est contenu dans la constante MAXINT (qui vaut 32767). Cela a pour effet d'avoir 32765 + 1 = -32768. Note hors-sujet : pour comprendre pourquoi ce problme se pose : voir la partie codage des entiers signs dans le cours d'architecture des ordinateurs. viter ce problme Si vous tes confront au problme : essayez de changer votre algorithme en privilgiant les calculs approchant les 0. Voici un exemple plus clair : a et b sont deux entiers entre 5000 et 10000 avec a > b

1. c:=30000+a 2. c:=c-b

peut ne pas fonctionner car on a dpass 32767. Par contre,

1. c:=30000-b 2. c:=c+a

peut fonctionner car on n'a pas dpass 32767.

Comment programme-t-on ?
Vous avez donc votre algorithme, comme vous tes dou(e) : vous tes sr(e) qu'il fonctionne, cependant vous voulez le vrifier in situ sur un ordinateur. Voici les tapes (toutes expliques ci-aprs) suivre pour obtenir votre programme informatique : 1. Traduire l'algorithme en Pascal : cette tape peut se faire sur papier, au brouillon. Comme c'est simple et rapide on peut traduire en mme temps qu'on fait l'tape suivante. 2. Recopier la traduction (le code source) dans un diteur de texte.

19 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

3. Compiler le code source pour le transformer en programme machine (ou binaire). Le compilateur a engendr un programme, il ne vous reste qu' l'excuter pour vous en servir ou le tester.

Traduire l'algorithme en Pascal


Pascal ayant t prvu dans cette optique, il est trs facile de convertir un algorithme (sur papier) en un programme excutable (fichier texte sur un ordinateur). Voici un exemple de traduction afin de vous montrer que la ressemblance est relle et que la traduction est facile. Cet exemple reprend l'algorithme donn dans le chapitre d'introduction. Voici l'algorithme :

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

Algorithme cercle Constantes pi = 3.1415 Lexique rayon : rel (* le rayon donn par l'utilisateur *) primtre : rel (* le primtre du cercle *) Dbut Afficher("Donner le rayon : ") Lire(rayon) primtre2*pi*rayon Afficher("Le primtre est de : ", primtre) Afficher("L'aire du cercle est de ", pi*rayon) Afficher("Le volume de la sphre est de ",(4/3)*pi*rayon) Fin

et le code source en langage Pascal

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

program cercle; const pi = 3.1415; var rayon : real; (* le rayon donn par l'utilisateur *) perimetre : real; (* le primtre du cercle *) begin writeln('Donner le rayon : '); readln(rayon); perimetre:=2*pi*rayon; writeln('Le primtre est de : ', perimetre); writeln('L''aire du cercle est de ', pi*sqr(rayon)); writeln('Le volume de la sphre est de ',(4/3)*pi*power(rayon,3)) end.

Pour traduire n'importe quel algorithme dans le langage Pascal, il suffit de respecter un certain nombre de rgles de syntaxe simples. Tout ceci est dvelopp dans le guide de traduction en Pascal. Pour ce qui est de l'indentation : utiliser la caractre de tabulation prvu pour et surtout pas d'espaces. Il s'agit de la touche gauche de la touche A (clavier AZERTY) ou de la touche Q (en clavier QWERTY). Il est possible que vous trouviez ce caractre trop large, un bon diteur permet de rgler cette largeur en donnant la taille souhaite en largeurs de caractres, par exemple donner 4 comme valeur fera que les tabulations ont une largeur de 4 caractres si vous utiliser une police mono-espace (ce qui doit tre le cas dans un diteur de code). Dans le cas contraire, c'est la taille du caractre d'espacement qui est considre (dans notre exemple, la tabulation aura la mme largeur que 4 espaces). Par dfaut la taille des tabulations est de 8, nous vous recommandons 2,3 ou 4 rgler selon que me nombre des niveaux d'indentations est trs lev ou plus modr. noter qu'on peut essayer avec un rglage 4 puis dcrmenter a posteriori si besoin est.

Avant l'excution, la compilation


tape (que beaucoup trouvent la plus agrable, allez savoir pourquoi...) o il n'y a rien faire puisque le compilateur se dbrouille tout seul. Il vous suffit de lui demander de compiler votre code source. Nous n'allons pas dcrire ici toutes les faons de faire car il y en a de multiples : cela dpend de vos choix logiciels. (si vous tes tudiant, votre responsable de TP est cens vous expliquer tout a). Lancez la compilation, deux issues sont possibles : Premier cas : la compilation choue. Ne paniquez pas car rien n'est jou ! C'est trs courant, mme les informaticiens qui ont 20 ans de mtier font encore parfois des erreurs. La plupart des compilateurs vous diront pourquoi ils refusent de compiler, ils vous indiqueront mme o se situe l'erreur (ligne du code source) voire, dans certains cas, ils vous donnerons l'erreur et la correction faire. Retournez diter votre code source et corrigez l'erreur. Vous verrez que la plupart du temps il s'agit de fautes d'inattention (des '=' la place des ':=', d'oublis de points-virgules en fin d'instructions, etc). Relancez la compilation. Parfois il faut recompiler vingt fois avant d'arriver finir la compilation (c'est fou ce qu'il peut y avoir comme point-virgules...).

20 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Second cas : la compilation fonctionne. Le compilateur vous indique qu'il a russi. Vous devriez avoir maintenant ct de votre fichier source un excutable.

Excuter le programme
L encore, il existe tellement de possibilits de faire que nous ne les expliquerons pas ici. Assurez-vous de connatre un moyen d'arrter un programme rcalcitrant. (les tudiants se tourneront encore une fois vers leur enseignants de TP). Pour tester votre programme, entrez des valeurs comme si vous l'utilisiez. Essayez de tester "toutes" les combinaisons en faisait des essais reprsentatifs. expliciter...

Un problme ?
Voici les erreurs que vous pourriez constater en excutant votre programme et des pistes pour les rsoudre : Erreur d'excution O chercher l'erreur Assurez-vous que le programme boucle sans fin en attendant un temps assez long pour en tre sr (certains calculs peuvent tre trs longs) ou que le programme indique qu'il s'est arrt car il ne peut plus continuer consommer autant. Le programme boucle sans fin Si le programme boucle effectivement sans fin : vous avez dans votre code source une boucle rpter ou tant que dont la condition n'est jamais atteinte. Vrifiez que vous avez une instruction qui fait tendre la ou les variables d'arrt vers le cas d'arrt (par exemple, n'avez-vous pas oubli d'incrmenter le i ?).

Vrifiez votre code source (oubli d'une instruction ?). Il est trs peu probable que l'ordinateur Le programme ne donne pas les bons rsultats (un fasse des erreurs de calculs donc si vous tes sr de votre code source : c'est peut-tre votre algorithme qui est faux (retour la case dpart :(). Si votre algorithme est bon alors faites un bogue ) dboguage. Le programme donne des rsultats compltement hors de propos (comme une opration sur deux chiffres donnant = 29876 ???) erreur de segmentation (ou segfault ) Vous n'avez touch rien (promis) et pourtant a fonctionnait tout--l'heure" (problme le plus courant : confirm par nombre de professeurs...) Votre programme traite de trop grands nombres et vous avez dpass les limites de Pascal. arg :( le problme ne vient pas de l'ordinateur qui, lui, n'est pas de mauvaise foi ;)

Le dboguage Il existe des logiciels dbogueurs dont c'est le rle, cependant nous allons expliquer la dmarche manuelle ici. Le dboguage manuel a pour but de dceler les bogues rcalcitrants qu'on a cherchs pendant des heures en mettant contribution les collgues. Il faut comprendre par l que ce doit tre un (ultime) recours et non une pratique courante. Pdagogiquement, il est prfrable, pour votre apprentissage, que vous trouviez l'erreur en raisonnant et en relisant attentivement votre code source ou en revrifiant votre algorithme. Si vous dcidez malgr tout de vous lancer dans ce processus fastidieux, pnible et coteux en temps, si plus personne ne peut vous en dissuader, voici la situation et sa solution : Vous avez donc relu votre code source 15 fois, revrifi votre algorithme 15 fois, demand vos collgues qui n'ont rien pu vous dire, mme votre professeur a laiss tomber et pourtant il subsiste, le bogue. Introuvable, la fois nulle part et partout. Si vous n'en dormez plus, voil la solution. Le dboguage (ou debugging) consiste afficher ce que votre programme fait en arrire plan. Concrtement, cela revient placer des afficher partout dans votre code. Chaque Affichage doit tre unique, de sorte que ds que vous voyez une ligne en particulier vous devez pouvoir retrouver la ligne de code ayant produit cet affichage. Exemple, considrons le programme suivant :

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

... writeln('Donnez a'); readln(a); writeln('Donnez b'); readln(b); c:=a+b; if c >= 100 then b:=4*c+15; else b:=b*c+10; c:=b-a; writeln(c); repeat readln(a);

21 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

15. c:=c+a 16. until (a=0); 17. writeln(c); 18. ...

Crons un autre fichier .pas contenant la version dboguage du code prcdant :

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38.

... writeln('Donnez a'); readln(a); writeln('Donnez b'); readln(b); writeln('on va faire c:=a+b avec a valant',a,' et b valant ', b); c:=a+b; writeln('on a maintenant c valant : ',c) if c >= 100 then begin writeln('on est pass dans le cas c >= 100'); b:=4*c+15; writeln('b vaut maintenant ',b); end; else begin writeln('on est pass dans le cas c < 100'); b:=b*c+10; writeln('b vaut maintenant ',b); end; writeln('on est sorti du if c >= 100 '); writeln('on a a,b,c qui valent ',a,b,c); writeln('on fait c:=b-a'); c:=b-a; writeln('c vaut maintenant ',c); writeln('on l affiche '); writeln(c); writeln('on est avant le repeat'); repeat writeln('on est dans la boucle'); readln(a); writeln('on fait c:=c+a avec a et c qui valent',a,c); c:=c+a writeln('c vaut maintenant ',c); writeln('fin de l interieur de boucle'); until (a=0); writeln('on est sorti de la boucle'); writeln('on affiche c'); writeln(c); ...

L'ide tant que chaque tape, vous pouvez vrifier que toutes les donnes sont valides. En suivant l'excution avec ce qui s'affiche vous devriez voir partir de quand l'erreur se produit.

Exemple complet
Dans cette partie, nous allons voir un cycle de programmation complet. Comme environnement de travail, on a choisi de travailler sur le systme d'exploitation Ubuntu pour PC. On utilisera gedit comme diteur de texte et le compilateur Free Pascal car tous deux sont disponibles sur ubuntu. Nous allons implmenter l'algorithme suivant :

1. Algorithme inversion_calcul 2. Variables 3. a : entier 4. b : entier 5. Dbut 6. Afficher("Donnez a") 7. Lire(a) 8. Afficher("Donnez b") 9. Lire(b) 10. a := a+b

gedit

22 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

11. b := a-b 12. a := a-b 13. Afficher("a vaut ",a) 14. Afficher("b vaut ",b) 15. Fin

Il s'agit de l'algorithme demandant deux nombres et les inversant avant de les afficher (inutile mais c'est un exemple). Traduisons-le :

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.

program inversion_calcul; Var a : integer; b : integer; begin writeln('Donnez a'); readln(a); writeln('Donnez b'); readln(b); a := a+b; b := a-b; a := a-b; writeln('a vaut ',a); writeln('b vaut ',b); end.

On recopie la traduction dans gedit, puis on enregistre dans un fichier inversion.pas :

Remarquez que gedit colorie le code de faon le rendre plus lisible (on parle de coloration syntaxique). Passons la compilation : on a ouvert un terminal et taper la commande fpc inversion.pas

23 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Le terminal affiche alors :

1. 2. 3. 4. 5. 6.

Free Pascal Compiler version 2.0.4 [2006/08/22] for i386 Copyright (c) 1993-2006 by Florian Klaempfl Target OS: Linux for i386 Compiling inversion.pas Linking inversion 15 Lines compiled, 0.0 sec

./inversion

Les 15 lignes ont bien t compiles (ligne 6), le compilateur cr un binaire inversion. Testons-le : dans le terminal, on donne la commande pour lancer le programme.

Le programme se lance. Voici un test :

On a entr nos deux nombres : notre programme va nous donner le rsultat.

24 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Notre programme semble fonctionner. Les deux nombres ont bien t inverss. L'exprience est concluante, cependant, voyons ce qu'il se passe si on atteint les limites du codage des entiers. Testons avec deux grands nombres :

Le programme nous indique les rsultats 5123 et -30969. Notre programme, comme tous les programmes a donc ses limites mme si notre algorithme est bon.

Voici un guide de traduction d'un algorithme impratif en Pascal.

Le Squelette
Pour le squelette de l'algorithme :

1. Algorithme mon_algo 2. 3. Constantes 4. 5. Types

25 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

6. 7. Variables 8. 9. Dbut 10. 11. Fin

On traduit ainsi :

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

program mon_programme; Const Type Var begin end. (* notez ce point *)

Commentaires
Les commentaires nots (* un commentaire *) s'crivent de la mme faon (* un commentaire *)

Types
Voici l'quivalence des types type boolen entier rel caractre Pascal bool integer real char

chane de caractres string Les valeurs boolennes sont true et false. Les parties entire et dcimale d'un rel sont spares par un point et non une virgule. les chanes sont dclares entre deux apostrophes ' pour chapper un caractre on le double. Exemple sur ce dernier point : pour inclure une apostrophe dans une chane, writeln('l''apostrophe s''est chappe') affiche l'apostrophe s'est chappe

Constantes et variables
Les constantes et les variables ont des identifiants qui doivent respectes une syntaxe prcise. l'identifiant ne peut comporter que des caractres alpha-numriques (de A Z, de a z et de 0 9) et des tirets-bas ou underscore : _.

26 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

le premier caractre est une lettre. les variables sont dclares dans le Lexique du programme dlimit par sa partie Var. Chaque dclaration est de la forme identifiant : type; Ainsi le lexique Lexique un_reel : rel une_chaine : chane de caractres se traduit Var un_reel : real; une_chaine : string;

(* un rel quelconque *) (* une chane quelconque *)

(* un rel quelconque *) (* une chane quelconque *)

Les identifiants des constantes respectent les mme rgles. Par convention, on prfrera les noter en majuscules. La dclaration d'une constante a pour syntaxe identifiant = valeur; Ceci Constantes PI = 3,14 G = 9,81 s'crit en pascal : Const PI = 3.14; G = 9.81;

Instructions et blocs d'instructions


Pour excuter une instruction (assignation, appel de fonction ou procdure) il suffit de l'crire. Les paramtres sont prciss entre parenthses et spars par des virgules. Les bloc d'instructions dbutent par un begin et se terminent par un end. Les instructions du bloc sont spares par des point-virgules. On gardera la convention algorithmique prfrant une instruction par ligne. Voici une ligne comportant une instruction unique : une_instruction Voici un bloc de k d'instructions : begin instruction_1; instruction_2; (* ... *) instruction_k end Remarquez qu'aucun point-virgule ne ponctue la dernire instruction. En effet le ';' est un sparateur : il spare les instructions entre elles. Il n'y a donc pas de point-virgule aprs la dernire instruction, pas plus qu'il n'y en a avant la premire. Cela explique galement pourquoi lorsqu'on crit une seule instruction, elle n'est pas suivie d'un point-virgule. Il est souvent affirm tort que toutes les instructions se terminent par un point-virgule . Ce n'est pas tout fait vrai, comme nous venons de le voir. Cependant, cette croyance rpandue a t prise en considration par les dveloppeurs des compilateurs qui ignorent cette erreur. Il convient de remarquer que le programme principal est un bloc d'instructions ponctu d'un point, ni plus ni moins.

27 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Lecture et criture (affichage)


L'affichage s'effectue l'aide de la procdure write. Elle peut prendre de un plusieurs paramtres de n'importe quel type de base. Elle affiche tous les paramtres les uns aprs les autres (rsultat identique celui d'une concatnation). Il existe une variante de write ayant la mme spcification mais effectuant un retour la ligne la fin : il s'agit de la procdure writeln. On peut galement appeler la procdure writln sans prciser de paramtres, cela effectue un retour la ligne. La lecture se fait l'aide de la fonction read() qui prend en paramtre l'identifiant de la variable qui sera assigne.
readln est

indentique read() mais fait un retour la ligne une fois la donne lue.

Exemple begin write('abc'); write('def'); end affiche abcdef alors que begin writeln('abc'); write('def'); end affiche abc def

Assignation
L'assignation est une instruction et ce titre elle doit respecter les rgles sur les instructions (points-virgules...) L'oprateur d'assignation est := (et non = qui est le test d'galit) La syntaxe de l'assignation est (espaces facultatifs) : identifiant := expression Il va sans dire que le type de l'expression doit tre compatible avec celui de la variable assigne.

Excution conditionnelle
On rappelle qu'une excution conditionnelle est une instruction. Elle ne comporte pas de point-virgule sauf si elle est l'intrieur d'un bloc. On suppose ici que l'instruction est au sein d'un bloc. si condition alors instruction donne if condition then instruction; si il y a plusieurs instructions, et bien on utilise un bloc :

28 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

if condition then begin instruction_1; instruction_2; instruction_k; end;

if condition alors instruction_1 sinon instruction_2 se traduit if condtion then instruction_1 else instruction_2; De mme on peut utiliser des blocs : if condition then begin instruction_1; instruction_2; instruction_k; end else begin instruction_3; instruction_4; instruction_l; end;

Structures itratives
POUR i de deb fin faire instruction donne for i:=deb to fin do instruction; on peut toujours utiliser un bloc comme instruction for i:=deb to fin do begin instruction_1; instruction_2; instruction_k; end; De mme, repeat instruction until condition;

while condition do instruction end;

Tableaux
lexique tab : tableau de deb fin de T

29 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

donne : var tab : array [deb..fin] of T; Par exemple tab : array [1..10] of integer;

Procdures et fonctions Le type enregistrement


type T = enregistrement champ : type_champ fin donne type T = record champ : type; end;

Une traduction complte

Problmatique
Nous disposons de deux entiers a et b. Nous voulons intervertir ces deux nombres. la fin du programme : la valeur de a sera gale celle de b lors du lancement du programme et inversement : b sera gal au a initial. Exemple : au dbut du programme nous posons a=2 et b=3. la fin du programme nous aurons a=3 et b=2.

Solutions
Voici deux solutions acceptables : Algorithme inversion_stockage Variables a : entier b : entier temp : entier (* variable dans laquelle on stockera le contenu d'une variable pour ne pas l'craser au moment de la premire assignation *) Dbut temp := a (* on sauvegarde a qui sera efface la ligne suivante pour pouvoir la placer dans b plus tard *) a := b b := temp Fin

Algorithme inversion_calcul Variables a : entier b : entier Dbut a := a+b b := a-b a := a-b Fin

Remarque
30 sur 45 28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Ces deux solutions prsentent en fait une notion cl de l'informatique : tudions nos deux solutions de plus prs : Simplifions le fonctionnement d'une machine au maximum : supposons Qu'il faut utiliser une unit de mmoire pour stoker une variable en mmoire Qu'il faut une unit de temps au processeur pour effectuer un calcul et qu'une opration entire et l'assignation consistent toutes en 1 calcul. Temps de calcul requis par chaque algorithme : Pour inversion_stockage : 3 units de temps (3 assignations) Pour inversion_calcul : 6 units de temps (3 assignations + 1 somme + 2 diffrences) Mmoire requise par chaque algorithme : Pour inversion_stockage : 3 units de mmoire (a, b et temps) Pour inversion_calcul : 2 units de mmoire (a et b) On a donc que
inversion_stockage prend plus de mmoire mais moins de temps de calcul que inversion_calcul inversion_calcul prend plus de temps de calcul mais moins de mmoire que inversion_stockage

Et c'est l un concept gnralisable : D'un faon gnrale, vous pouvez faire des algorithmes plus rapides en utilisant plus de mmoire et des algorithmes utilisant moins de ressources mmoire mais qui seront plus lents. Attention cependant, cela ne veut surtout pas dire qu'aucun algorithme n'est amliorable sans perte de ressources en calcul ou en mmoire. Bien au contraire, vous devez toujours essayer d'tre le plus efficace possible. Ce constat ne permet pas de dire si un des algorithme est plus efficace que l'autre : notre analyse a t trop simplifie pour cela. En effet, nous n'avons pas considr que la mise en mmoire peut aussi prendre un temps non ngligeable peut-tre que les calculs de sommes et de diffrences sont trs coteux en temps peut-tre que le processeur est assez avanc technologiquement pour effectuer un premier calcul et en commencer un deuxime avant d'avoir obtenu le premier rsultat. l'algorithme pourrait utiliser des rels, et, en gnral, les calculs sur les rels sont plus longs que sur les entiers. Vous contesterez, avec raison, que sur cet exemple, aujourd'hui : nos ordinateurs sont parfaitement capables d'excuter ces deux programmes en un temps record et qu'on ne distinguera pas la diffrence suivant qu'on utilise l'un ou l'autre. C'est vrai, mais vous ngligez que peut-tre que ce programme sera excut sur une machine minuscule, une micro-puce de quelques millimtres dans laquelle on n'a pu mettre que trs peu de mmoire et un minuscule processeur. que peut-tre que ce programme doit pouvoir tre excut simultanment des milliers des fois sur la mme machine. que peut-tre que ce programme ne sera pas excut plusieurs fois en mme temps mais des milliers de fois, les unes aprs les autres, et que le programme ayant besoin d'inverser des milliers de valeurs la suite doit pouvoir donner un rsultat dans la seconde...

Ce problme traite de la cration d'une interface graphique rudimentaire dans un environnement textuel (un terminal).

Problmatique
Nous supposons que nous avons dclar 3 procdures dont les identifiants sont les suivants (peu nous importe ce qu'elles font : le sujet n'est pas ici)
Procedure_A Procedure_B Procedure_C

Vous devez crer le programme principal permettant l'utilisateur de choisir laquelle des trois il veut lancer. Le programme doit avoir les fonctionnalits suivantes : Une fois que la procdure choisie par l'utilisateur a t excute, le menu est de nouveau propos. L'utilisateur doit pouvoir quitter le programme depuis le menu. Le programme doit expliquer l'utilisateur comment utiliser le programme. (optionnel) on suppose que l'utilisateur est distrait et qu'il peut ne pas donner une bonne rponse. Grez ce cas.

Premire analyse
Voici quelques ides directrices formant une premire analyse de la problmatique. Chacun de ces points seront analyss dans la section suivante. ...permettant l'utilisateur de choisir... : l'utilisateur doit intervenir. Il va falloir faire intervenir un Lire afin qu'il puisse nous donner son choix. ...laquelle des trois... : ...le menu est de nouveau propos : il s'agit d'une rptition. ...quitter le programme depuis le menu : une autre possibilit. En fait, l'utilisateur aura le choix entre quatre possibilits : A, B, C ou quitter.

31 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

...expliquer l'utilisateur comment utiliser le programme' : on affichera les instructions avec Afficher.

Analyse approfondie
Voici les rflexions qu'il faut mener sur les questions cls du problmes.

Grer le choix de l'utilisateur


Nous allons reprsenter le choix de l'utilisateur par un entier. Finalement, l'utilisateur quatre possibilits pour le menu (entre parenthse : l'entier que nous allons y associer) : Excuter la procdure A (1) Excuter la procdure B (2) Excuter la procdure C (3) Quitter (0) Nous allons donc lui poser la question "Que voulez vous faire ?", il rpondra par un entier en fonction duquel on fera un SLECTIONNER. (optionnel) l'utilisation d'une chane de caractres nous permettra de contrler l'erreur si l'utilisateur entre autre chose que 1,2,3 ou 0. Si on utilise un entier et que l'utilisateur entre "truc" il va y avoir un problme (sur une machine, le programme se bloquera...).

L'utilisateur retrouve le menu


Pour que l'utilisateur retombe sur le menu, il va falloir utiliser une structure itrative, mais laquelle ? Petite rflexion : 1. A priori, on ne sait pas combien de fois l'utilisateur va excuter une procdure. Cela exclut le POUR. 2. REPETER ou TANTQUE ? Le menu va s'afficher au moins une fois ce qui nous laisse penser qu'un REPETER est plus appropri. De plus la situation est bien dcrite par la phrase " fficher le menu jusqu' ce qu'il choisisse de quitter" ce qui conforme notre choix. Nous utiliserons donc A , un REPETER.

Solution finale
Algorithme menu (* on suppose que les procdures sont dclares *) Procedure_A ... Procedure_B ... Procedure_C ... Variables reponse : chane de caractres (* entre de l'utilisateur *) Debut Rpter Afficher("Que voulez-vous faire ? Donnez l'entier correspondant") Afficher("1 : excuter la procdure A") Afficher("2 : excuter la procdure B") Afficher("3 : excuter la procdure C") Afficher("0 : quitter") Lire(reponse) Slectionner reponse parmis 1 : Procedure_A() 2 : Procedure_B() 3 : Procedure_C() 0 : (* on ne fait rien *) * : Afficher("Merci d'entrer un code valide") Jusqu' (reponse='0') Fin

Problmatique
crire un algorithme sous forme d'une fonction qui calcule la somme des n premiers entiers, n tant pass en paramtre. Exemple : somme(5) calculera 1+2+3+4+5 et renverra donc 15

Solution
Voici une premire rponse acceptable :

32 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Function somme(n : entier) Lexique somme : entier (* la somme qu'on complte au fur et mesure et qu'on retournera la fin *) Dbut somme:=0 POUR i de 0 n somme:=somme+i FP retourner somme Fin Pourquoi partir de 0 et pas 1 ? Cela sert tout simplement grer le cas n=0. Cela ne change rien pour les autres cas puisque (en reprenant l'exemple de la problmatique) somme(5) va calculer 0+1+2+3+4+5, c'est dire 1+2+3+4+5 (=15).

Remarque
Essayons une analyse un peu plus mathmatique du problme : En fait notre fonction calcule pour n : . L'tude des sries nous apprend que

. On peut en dduire que la fonction peut s'crire Function somme_directe(n : entier) Dbut retourner (n*(n+1))/2 Fin Ce qui d'une part est plus simple mais galement, comme nous allons le voir, plus efficace. Simplifions le fonctionnement d'une machine au maximum : supposons qu'il faut une unit de temps au processeur pour effectuer un calcul et qu'une opration entire et l'assignation consistent toutes en 1 calcul. Supposons que nous voulions calculer somme(1000) : Avec somme() : nous allons effectuer : 1000 incrmentation de i 1000 sommes somme+i 1000 assignation Soit au moins 3000 calculs. Avec somme_directe() : nous allons effectuer une somme : n+1 une multiplication n*(n+1) une division par 2 Soit 3 calculs. Conclusion : 3000 calculs pour le premier algorithme, 3 calculs pour le second. La diffrence entre les deux : le mathmaticien qui doit se retrouver en chaque algorithmicien. Et dire que de nombreux tudiants en informatique sont souvent tonns de la prsence importante de mathmatiques durant leur cursus... (pour info : wikilivres propose des cours de mathmatiques...)

Problmatique
crire un algorithme donnant le Plus Grand Commun Diviseur (PGCD) de deux nombres donns par l'utilisateur. On supposera que l'utilisateur ne donne que des entiers strictement suprieurs zro. Il faudra crire une fonction, prenant en entre deux entiers strictement positifs et renvoyant leur PGCD. L'algorithme principal y fera appel. Question subsidiaire : on considrera que l'utilisateur peut entrer n'importe quels entiers. Tenez-en compte pour que l'algorithme ne commette pas d'erreur et qu'il informe l'utilisateur.

33 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Aide
Il faut avoir tudi ce problme d'algbre pour avoir la solution. Elle consiste appliquer l'algorithme d'Euclide.

Solution
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. Algorithme pgcd Fonction euclide( u : entier v : entier ) : entier Variables r : entier (* le reste d'une division entire *) Dbut Tant que v <> 0 faire r := u mod v u := v v := r FTQ retourner u Fin Variables u,v : entier (* les deux entiers donns par l'utilisateur *) Dbut crire("Donner les deux nombres : ") Lire(u,v) (* Dbut question subsidiaire *) si u=0 et v=0 alors crire("Le PGCD n'existe pas") sinon dbut si u < 0 alors u := -u si v < 0 alors v := -v (* Fin Question subsidiaire *) crire(euclide(u,v)) fin Fin

Pas vraiment de difficult pour l'algorithme principal. La difficult tant la fonction implmentant l'algorithme d'Euclide. Le jeu d'assignation rpter jusqu' obtenir un reste nul est difficile visualiser. Question subsidiaire : il y a trois vnements contrler : Le cas o u=v=0 et o le pgcd n'existe pas et il faut arrter le programme (ligne 22) Le cas o u ou v (ou les deux) est ngatif est il faut prendre son oppos (lignes 24 et 25) Pour la solution sans la question subsidiaire : ter les lignes 21 26 et la 28 de la solution propose.

Problmatique
Voici un problme fondamental d'informatique. Supposons qu'il soit dclar tab, un tableau. Pour crire le programme on prendra la dclaration suivante var tab : tableau MIN MAX de T Pour simplifier le problme, vous pourrez considrer que T = entier. Note : sachez toutefois que les oprateurs <, <=, >, >= sont gnriques et permettent de comparer toutes donnes tant qu'elles font partie du mme ensemble ordonn (Par exemple : l'alphabet). Question subsidiaire : considrez le cas particulier o les lments sont distincts. L'algorithme fonctionne-t-il ?

Solution

34 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Il est tout d'abord important de savoir qu'il existe de nombreuses faon de procder. Pour connaitre ces algorithmes de tri, lment important de la culture de tout algorithmicien, nous vous invitons consulter l'article Algorithme de tri sur wikipdia ainsi que les articles sur les diffrents algorithmes de tri existants. Pour vous corriger : vrifiez que votre algorithme ne tombe pas sur une erreur courante en supposant que tous les entiers sont distincts. En effet, il est facile de faire un algorithme qui, voulant inverser deux lments pour les remettre en ordre, boucle sans fin en voulant inverser sans fin : lorsqu'il tombe sur deux lments gaux.

Une solution "simple"


Le tri par slection est un des plus simples algorithmes de tri. Il consiste rechercher le plus petit (ou le plus grand) lment du tableau et de le placer sa place dfinitive : au dbut (ou la fin du tableau). Une fois un tel lment plac sa place dfinitive, on recommence avec le reste du tableau. Lorsqu'on place un lment, on n'crase pas ce qui tait l (on perdrait un lment du tableau) mais on le dplace la position qu'on vient de librer (ce qui revient faire une permutation). Une implmentation testable en Pascal

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.

program tris; const DEB = 0; FIN = 5; type T_tabint = array [DEB..FIN] of integer; procedure permuter(var i : integer; var j : integer); (* la fin, i vaut le j donn et j vaut le i donn *) var tmp : integer; (* un tampon pour stocker l'lment que va remplacer l'lment minimum p begin tmp := i; i := j; j := tmp end; procedure afficher(var t : T_tabint); (* procdure qui affiche le tableau pass en paramtre *) (* sur une ligne et sous la forme [a|b|c|d...|l|m] *) var i : integer; (* variable de boucle *) begin write('['); for i := DEB to FIN-1 do write(t[i],'|'); write (t[FIN],']'); end; procedure remplir(var t : T_tabint); (* procdure qui remplit le tableau pass en paramtre *) (* avec des nombres alatoires pris entre 0 et 99 *) var i : integer; (* variable de boucle *) begin for i := DEB to FIN do t[i] := random(99); end;

procedure TriSelection(var t : T_tabint); var i, j : integer; (* variables de boucle *) (* indice du plus petit lment parmi ceux qui reste trier min : integer; begin for i:=DEB to FIN-1 do begin min := i; for j:=i+1 to FIN do if (t[j] < t[min]) then min:=j; if (i <> min) then permuter(t[i],t[min]); end; end;

35 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96.

procedure TriBulle(var t: T_tabint); var i, j : integer; (* variables de boucle *) begin for i:=DEB to FIN-1 do begin j := i+1; for j := FIN-1 downto i do if t[j+1]<t[j] then permuter(t[j],t[j+1]); end; end; var tab : T_tabint; begin (* pour chaque tri on recre un tableau alatoire, on l'affiche *) (* puis on le trie et on l'affiche nouveau *) (* Tri slection *) writeln('TRI SELECTION'); remplir(tab); afficher(tab); writeln(' <- tableau donn'); TriSelection(tab); afficher(tab); writeln(' <- tableau tri'); (* Tri bulle *) writeln('TRI BULLE'); remplir(tab); afficher(tab); writeln(' <- tableau donn'); TriBulle(tab); afficher(tab); writeln(' <- tableau tri'); end.

Voici un exemple d'excution : TRI SELECTION [54|58|70|83|59|84] [54|58|59|70|83|84] TRI BULLE [53|83|41|61|63|38] [38|41|53|61|63|83]

<- tableau donn <- tableau tri <- tableau donn <- tableau tri

Problmatique
Supposons que nous avons dclar un tableau tab d'entiers comme suit : Variables tab : tableau MIN MAX de entiers Supposons que ce tableau est rempli d'entiers inconnus mais tris dans l'ordre croissant. Proposez un algorithme qui, tant donn un entier indiqu par l'utilisateur, trouve son indice dans le tableau. On supposera que l'entier indiqu par l'utilisateur est effectivement dans le tableau.

Aide
Vous remarquerez que ce problme s'apparente au problme de recherche d'un mot dans le dictionnaire. Pensez donc la mthode que vous employez dans cette situation...

36 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Solutions
Solutions moyennes
Voici une solution, qui n'est pas celle attendue. L'algorithme parcourt le tableau du dbut la fin et compare l'lment l'entier indiqu par l'utilisateur. Il s'arrte lorsqu'il est trouv. Remarquez que la faiblesse de cette algorithme provient du fait qu'il fonctionne mme quand le tableau n'est pas tri, il n'exploite donc pas cet avantage trop important pour tre nglig.

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.

Algorithme recherche Variables q : entier (* l'entier recherch *) i : entier (* ce sera l'indice de parcours *) Dbut Afficher("Donner l'entier trouver") Lire(q) i MIN tantque tab[i] != q i i+1 ftq Afficher("L'indice o se trouve ", q ," est ", i) Fin

L'algorithme suivant fonctionne mais le dfaut de continuer parcourir le tableau mme quand l'lment a t trouv.

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.

Algorithme recherche_mauvais Variables q : entier (* l'entier recherch *) i : entier (* ce sera l'indice de parcours pour la boucle *) resultat : entier (* l'indice rsultat sera stock ici *) Dbut Afficher("Donner l'entier trouver") Lire(q) i MIN pour i de MIN MAX (* on parcourt tout le tableau *) si tab[i] = q alors resultat i (* si on a trouv on mmorise l'indice *) ftq Afficher("L'indice o se trouve ", q ," est ", rsultat) Fin

Solution attendue
Voici enfin la solution attendue. Vous tiez peut-tre arriv cette dduction seul ou en consultant l'aide mais vous avez compris que ce problme s'apparente celui de la recherche dans un dictionnaire. En effet, on cherche un mot dans un ensemble de mots inconnus mais tris. Si vous avez dj cherch un mot dans le dictionnaire, vous avez certainement remarqu que lire le premier, regarder si c'est celui qu'on cherche, puis passer au suivant, et ainsi de suite n'est pas la solution la plus efficace... La solution est donc l'algorithme de recherche dichotomique (du grec dichotomie : couper en deux ). On ouvre le dictionnaire au milieu et un prend un mot au hasard, si le mot qu'on cherche est avant, recommence avec la premire moiti du dictionnaire, s'il est aprs, avec la deuxime moiti. Dans la bonne moiti on prend un mot au milieu, etc...

1. Algorithme recherche_dichotomique 2. Variables 3. q : entier (* l'entier recherch *) 4. i : entier (* ce sera l'indice de parcours pour la boucle *) 5. deb, fin : entiers (* deux entiers pour dsigner le dbut et la fin de la zone dans laquelle on 6. Dbut 7. Afficher("Donner l'entier trouver") 8. Lire(q) 9. (* on commence en recherchant dans tout le tableau *) 10. deb MIN 11. fin MAX 12. rpter 13. i = arrondir((fin+deb)/2) (* on prend i entre deb et fin *) 14. si tab[i] > q 15. alors fin i (* on est tomb trop haut : on ramne la borne suprieure *)

37 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

16. sinon si tab[i] < q 17. alors deb i (* on est tomb trop bas : on ramne la borne infrieure *) 18. jusqu' tab[i]=q 19. Afficher("L'indice o se trouve ", q ," est ", i) 20. Fin

Traduction en Pascal Voil sa traduction en Pascal, le tableau tant rempli la main :

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35.

program recherche_dichotomique; Const MIN = 0; MAX = 10; Var tab : array [MIN..MAX] of integer; q : integer; (* l'entier recherch *) i : integer; (* ce sera l'indice de parcours pour la boucle *) deb, fin : integer; (* deux entiers pour dsigner le dbut et la fin de la zone dans laquelle Begin tab[0] := 1; tab[1] := 4; tab[2] := 9; tab[3] := 10; tab[4] := 24; tab[5] := 24; tab[6] := 74; tab[7] := 75; tab[8] := 76; tab[9] := 90; tab[10] := 99; Writeln('Donner l''entier trouver : '); Readln(q); (* on commence en recherchant dans tout le tableau *) deb := MIN; fin := MAX; repeat i := round((fin+deb)/2); (* on prend i entre deb et fin *) if tab[i] > q then fin := i (* on est tomb trop haut : on ramne la borne suprieure *) else if tab[i] < q then deb := i; (* on est tomb trop bas : on ramne la borne infrieure *) until tab[i]=q; Writeln('L''indice o se trouve ', q ,' est ', i); End.

Problmatique
On cherche implmenter un jeu dont voici les rgles : Rgles du jeu : On commence avec un tas de billes, le jeu se joue deux, Les joueurs jouent l'un aprs l'autre, Chaque joueur, son tour, peut retirer une, deux, ou trois billes du tas, Le joueur qui prend la dernire bille a perdu. En plus d'implmenter le mcanisme du jeu, on veillera respecter les consignes suivantes : Au lancement, le programme rappelle les rgles du jeu nonces ci-dessus. Le contenu du tas de dpart est demand au lancement. Si le nombre donn est 0 ou moins, on prend un nombre alatoire entre 10 et 30 et on l'annonce. Les deux joueurs entreront leurs noms en dbut de partie. chaque tour, le programme rappelle qui est le tour, en appelant les joueurs par leurs noms. Pour qu'on voie que le tour pass, l'affichage est vid des informations et saisies du tour prcdent. chaque tour, le programme rappelle combien il reste de billes dans le tas et donne une reprsentation graphique s'il reste moins de 30 billes (afficher sur une seule ligne un '.' par bille restante fera amplement l'affaire).

38 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Le programme gre les tentatives de triche et rappelle les rgles si ncessaire. la fin du jeu, le gagnant est dsign par son nom.

Premire analyse Analyse approfondie Solution


Trouver un algorithme pour ce jeu n'est pas aussi vident qu'il y parait.

Implmentation en Pascal

1. program billes; 2. 3. var 4. nb_billes : integer; (* le nombre de billes dans le tas *) coup : integer; 5. (* nombre de billes retirer lors d'un t 6. tour : boolean; (* vrai si c'est le tour du joueur 1 *) 7. joueur1, joueur2 : string; (* noms des joueurs *) 8. i : integer; (* variable de boucle *) 9. 10. begin 11. (* Affichage des rgles *) 12. writeln('Rgles du jeu :'); 13. writeln('* On commence avec un tas de billes, le jeu se joue deux.'); 14. writeln('* Les joueurs jouent l''un aprs l''autre.'); 15. writeln('* Chaque joueur, son tour, peut retirer une, deux, ou trois billes du tas.'); 16. writeln('* Le joueur qui prend la dernire bille a perdu.'); 17. 18. (* Recueil des informations ncessaires au jeu *) 19. writeln('Donner le nom du joueur 1 : '); 20. readln(joueur1); 21. writeln('Donner le nom du joueur 2 : '); 22. readln(joueur2); 23. writeln('Donner le nombre de billes : '); 24. readln(nb_billes); 25. 26. (* gestion du nombre de billes *) if (nb_billes <= 0) then begin 27. 28. nb_billes := 10+random(20); (* random(n) renvoie un nombre entre 0 et n *) 29. writeln('Un nombre alatoire est pris : ',nb_billes); 30. end; 31. 32. (* on dmarre false, ainsi c'est le joueur 1 qui jouera en premier *) 33. tour := false; 34. 35. repeat 36. (* nettoyer l'cran, un appel de clsrc() peut fonctionner galement *) 37. for i:=1 to 20 do writeln(); 38. 39. (* on change le joueur qui est le tour *) 40. tour := not(tour); 41. 42. (* on indique qui est le tour *) 43. write('C''est au tour de '); if (tour) then writeln(joueur1) else writeln(joueur2); 44. 45. 46. (* affichage (textuel et graphique) du nombre de billes restant *) 47. writeln('Il reste ',nb_billes,' billes. '); 48. if (nb_billes <= 30) then for i:= 1 to nb_billes do write('.'); 49. writeln(); 50. 51. (* demande au joueur son coup , gestion de la triche *) 52. writeln('Combien retirez-vous de billes ?'); 53. readln(coup); while ((coup < 1) or (coup > 3) or (coup > nb_billes)) do begin 54. 55. writeln('Tricheur !'); 56. writeln('* On ne peut retirer qu''entre une et trois billes.'); 57. writeln('* On ne peut plus de billes qu''il n''y en a.'); 58. writeln('Combien retirez-vous de billes ?');

39 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

59. readln(coup) 60. end; 61. 62. (* on a le coup voulu, on le joue *) 63. nb_billes := nb_billes - coup 64. 65. until (nb_billes = 0); 66. 67. (* c'est le joueur qui a jou en dernier qui est perdant *) 68. (* on inverse pour indiquer le gagnant *) 69. if (not(tour)) then write(joueur1) else write(joueur2); 70. writeln(' gagne !'); 71. 72. end.

Problmatique
On cherche implmenter un programme qui, tant donne une base de donnes de questions et de rponses correspondantes posent les questions et demande la rponse un joueur. Le programme comptabilise les bonnes rponses et donne le score final. Le nombre de questions poser est demand au dbut de la partie, si le nombre donn est nul ou ngatif, on choisit un nombre alatoire entre un et le nombre de questions dans la base de donnes. Les rponses seront soit vrai/faux une rponse en toutes lettres une rponse sous forme de nombre Il est demand d'implmenter seulement une de ces trois possibilits. chaque question, le score actuel et le nombre de questions restantes est affich On ne demande pas que le programme ne pose pas deux fois la mme question au cours d'une mme partie, rflchir tout de mme un moyen de faire cela.

Donnes
questions : tableau de 0 NBQ de chaine; (* bases de donnes des questions *) rponses : tableau de 0 NBQ de T (* bases de donnes des rponses *) On suppose ces tableaux remplis, bien videment la rponse la question questions[i] est rponses[i]. T est boolen, integer, ou chaine : vous de choisir et d'assumer ce choix dans l'algorithme.

Solution
Implmentation en Pascal
L'auteur vous demande de l'excuser pour la pitre qualit du contenu de la base de donnes...

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.

program quiz; const NBQ = 4; (* nombre de questions dans la base de donnes *) var questions : array [1..NBQ] of string; (* bases de donnes des questions *) reponses : array [1..NBQ] of boolean; (* bases de donnes des rponses *) nb_questions : integer; (* le nombre de questions poser *) numero_question : integer; (* l'indice d'une question dans la BdD *) i : integer; (* variable de boucle *) reponse : char; (* entre clavier *) r : boolean; (* l'interprtation boolenne de l'entre au clavier; *) rep_valide : boolean; (* rponse entre valide *) score : integer; (* le score de joueur *) begin (* remplissage de la base de donnes des questions *)

40 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

20. questions[1] := 'La rponse est 42'; 21. questions[2] := 'faux et (vrai et (faux ou vrai))'; 22. questions[3] := 'L''algorithmique imprative c''est cool'; 23. questions[4] := 'si six scies scient six cyprs six-cent scies scient six-cent cyprs'; 24. 25. (* remplissage de la base de donnes des rponses *) 26. reponses[1] := true; 27. reponses[2] := false; 28. reponses[3] := true; 29. reponses[4] := true; 30. 31. (* demande et gestion du nombre de questions *) 32. Writeln('Donner le nombre de questions voulues pour ce quiz :'); readln(nb_questions); 33. 34. if nb_questions <= 0 then nb_questions := random(NBQ)+1; 35. 36. (* initialisations *) 37. score := 0; 38. 39. for i:=nb_questions downto 1 do begin 40. 41. (* Information du joueur : nombre de questions restantes et score *) 42. Writeln('Il reste ',i, ' questions | SCORE : ', score); 43. 44. (* on choisit une question au hasard dans le BdD et on l'affiche *) 45. numero_question := 1+random(NBQ); 46. writeln(questions[numero_question]); 47. 48. (* on lit la rponse et on essaie de la comprendre *) 49. (* si on ne la comprend pas, on passe la question suivante. Tant pis pour le score *) readln(reponse); 50. 51. rep_valide := true; 52. case reponse of 53. 'o' : r := true; 54. 'O' : r := true; 55. 'v' : r := true; 56. 'V' : r := true; 57. 'n' : r := false; 58. 'N' : r := false; 59. 'f' : r := false; 60. 'F' : r := false; else rep_valide := false; 61. 62. end; 63. 64. if rep_valide then begin (* on a la rponse du joueur, gestion du score et de l'affichage en fonction de la rpon 65. 66. if r = reponses[numero_question] then begin 67. score := score+1; 68. writeln('Bonne rponse \o/'); 69. end 70. else begin 71. writeln('Mauvaise rponse :('); 72. end; 73. else begin writeln('je n''ai pas compris la rponse : entrer o(ui), v(rai), f(aux) o 74. 75. end; 76. end; 77. 78. (* informations finales *) 79. Writeln('Score final : ', score) 80. end.

Problmatique
On souhaite raliser un programme qui donne les solutions d'un polynme dont les coefficients sont donns par l'utilisateur. On peut aborder le problme selon des difficults croissantes : 1. Rsoudre dans les polynmes du premier degr 2. Rsoudre dans les polynmes du second degr

41 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

3. Rsoudre dans les polynmes du second degr

Problmatique
Donner un algorithme qui, tant donn un tableau d'entiers, trouve le plus petit cart entre deux lments. Exemples : [1|10|4|6] : 6-4 = 2 [1|10] : 10-1 = 9 [5|5] : 5-5 = 0 Donner un algorithme qui, tant donn un tableau d'entiers, trouve le plus grand cart entre deux lments.

Solution
Une implmentation testable en Pascal

1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.

program ecarts; const DEB = 0; FIN = 10; type T_tabint = array [DEB..FIN] of integer; procedure afficher(var t : T_tabint); (* procdure qui affiche le tableau pass en paramtre *) (* sur une ligne et sous la forme [a|b|c|d...|l|m] *) var i : integer; (* variable de boucle *) begin write('['); for i := DEB to FIN-1 do write(t[i],'|'); write (t[FIN],']'); end; procedure remplir(var t : T_tabint); (* procdure qui remplit le tableau pass en paramtre *) (* avec des nombres alatoires pris entre 0 et 99 *) var i : integer; (* variable de boucle *) begin for i := DEB to FIN do t[i] := random(99); end; procedure RechercheEcartMin(t : T_tabint); var i,j : integer; (* variables de boucle *) ind1,ind2 : integer; (* indices *) ecart_min_trouve : integer; begin ecart_min_trouve := MAXINT; for i := DEB to FIN-2 do begin for j:= i+1 to FIN do begin if (abs(t[i]-t[j]) <= ecart_min_trouve) then begin ecart_min_trouve := abs(t[i]-t[j]); ind1 := i; ind2 := j; end; end; end; writeln('cart minimal trouv : ',t[ind1],' - ',t[ind2],' = ',ecart_min_trouve) end;

42 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76.

procedure RechercheEcartMax(t : T_tabint); var i : integer; (* variable de boucle *) min,max : integer; (* indices du plus petit lment et du plus grand lment *) begin min := DEB; max := DEB; for i:= DEB to FIN do begin if t[i] < t[min] then min := i; if t[i] > t[max] then max := i; end; writeln('cart maximal trouv : ',t[max],' - ',t[min],' = ',t[max]-t[min]) end; var tab : T_tabint; begin remplir(tab); afficher(tab); writeln(' <- tableau donn'); RechercheEcartMin(tab); RechercheEcartMax(tab); end.

Exemple de rsultat produit par le programme : [54|58|70|83|59|84] <- tableau donn cart minimal trouv : 83 - 84 = 1 cart maximal trouv : 84 - 54 = 30

Cette partie introduit un ensemble de sujets d'ouverture possibles pour la poursuite de l'apprentissage.

Algorithmique
Comme nous l'avons vu, notamment sur le problme du tri des tableaux, il existe de multiples algorithmes connus dont l'tude est intressante pour la culture de l'algorithmicien. C'est l'objet du wikilivre Programmation Algorithmique.

Calculabilit et complexit
Vous allez srement vous poser cette question un jour : Peut-on crire un algorithme qui... ?. Grande question, nos ordinateurs d'aujourd'hui drivent de la Machine de Turing. Toute une branche des mathmatiques est ddie au problme de la Calculabilit. Au fil des remarques dans les problmes poss,nous avons abord la notion d'efficacit d'un algorithme. Notamment dans le problme sur la somme des n premiers entiers o nous avons clairement constat qu'il existait deux faons d'obtenir un rsultat : l'une prenant beaucoup plus de ressources (en temps et en mmoire) que l'autre. Eh bien ce concept est formalis : il est possible d'valuer grce aux mathmatiques si un algorithme est plus efficace qu'un autre. Il s'agit de la complexit Finalement, il s'agit de rpondre deux questions : peut-on obtenir un rsultat en un temps fini (calculabilit) ? et si oui, dans quel ordre de grandeur de temps (complexit) ?

Algorithmique fonctionnelle
Nous avons tudi l'algorithmique imprative : cette prcision est effectivement ncessaire. Une autre algorithmique existe. Elle pose d'autres bases de dpart, d'autres concepts. Elle est plus complexe apprendre et comprendre que l'algorithmique imprative mais la puissance de ses axiomes permet d'viter de nombreux problmes. Cet exemple exploite le concept de la rcursion, fondamental dans cette algorithmique.

43 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Algorithme itratif (impratif)

Algorithme rcursif (fonctionnel)

Fonction factorielle(n : entier) Lexique i : entier (* variable de boucle *) rsultat : entier (* le rsultat final qu'on retournera *) Dbut si i=0 Fonction factorielle(n : entier) alors rsultat1 Dbut sinon dbut si n<=1 alors 1 sinon n*factorielle(n-1) rsultat1 (* on initialise le rsultat *) Fin pour i de 2 n rsultatrsultat*i finpour fin finsi Fin

C'est un bon complment et une bonne suite l'apprentissage de l'algorithmique imprative : voir le wikilivre Algorithmique fonctionnelle.

Structures de donnes
Nous n'avons jusqu'ici utilis qu'une structure de donnes, le tableau. Cette structure de donnes pose un problme : elle occupe la mmoire en fonction de sa dclaration. Ce qui signifie que si on ignore combien l'utilisateur va ncessiter d'indice, il va falloir rserver le tableau le plus grand possible afin d'tre sr qu'il puisse contenir autant d'lments que l'utilisateur souhaitera. Il serait plus judicieux de rserver l'espace au fur et mesure de la demande. C'est ce que l'on appelle le gestion dynamique de la mmoire (par opposition statique). Nous avons galement vu qu'un tableau est gnrique : c'est--dire qu'au moment de sa dclaration, nous pouvons dire que tous ses lments sont d'un type donn et choisir ce type. Nous avons vu que les tableaux sont homognes : c'est--dire qu'un tableau donn ne peut contenir qu'un seul type d'lment (celui prcis dans la dclaration du tableau). Nous pourrions avoir besoin d'un tableau dont certains lments seraient des entiers, d'autres des chanes, d'autres encore des boolens. Il s'agit l de la problmatique de l'htrognit. Note : attention ne pas confondre la notion de gnricit avec celle d'htrognit. La premire dsigne la capacit contenir des lments d'un mme type que l'on peut choisir en le fixant au moment de la dclaration. La seconde dsigne la capacit contenir des lments de types diffrents. Supposons maintenant que nous devions utiliser des formes d'information qui ne font pas partie de type de bases : les listes, les matrices, les rationnels, les arbres, l'ADN, la couleur, etc. Comment crer les lments ncessaires au stockage de telle information quand un simple tableau ou un simple enregistrement ne suffisent plus ? Dynamicit, gnricit, htrognit et la cration de nouveau types non-lmentaires sont autant de problmes traits dans le wikilivre Structures de donnes.

Thorie des langages


La langage algorithmique est compos de rgles de syntaxe bien prcises dont la raison peut paratre obscure. Les langages de programmation ont galement de nombreuses rgles d'criture. Qu'est ce qui dtermine qu'un langage peut tre compris par un ordinateur ? Pourquoi ne peut-on pas tout simplement crire nos algorithmes en franais littral ? C'est l'objet de la thorie des langages.

Architecture des ordinateurs


Nos algorithmes sont implments dans un langage informatique puis compils pour tre transforms en un fichier binaire excutable. Pourquoi le binaire ? Comment l'ordinateur peut-il simplement avec l'lectricit stocker des donnes et effectuer des opration sur celles-ci ? Que fait exactement le compilateur ? Pourquoi un binaire compil pour Linux ne fonctionne pas sous Windows ? Une infinit de questions peut se poser sur le fonctionnement de l'ordinateur au-del de l'cran. Il s'agit de l'Architecture des ordinateurs

Correction des algorithmes


De la mme faon que pour la calculabilit et la complexit, une branche des mathmatiques permet de prouver qu'un algorithme fonctionne. Il s'agit de la logique de Hoare

Conclusion
Il existe une multitude de domaines d'extension et de connaissances qui touchent l'informatique en plus de l'algorithmique imprative. La plupart sont lies aux mathmatiques. Chacune de ces matires suscitera plus ou moins votre curiosit...

44 sur 45

28/10/2011 13:48

Algorithmique imprative/Version imprimable - Wikibooks

http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...

Bibliographie
Daniel Canevet - L'algorithmique et le Pascal - Collection Informatique et communication, ditions Paris : Delagrave - 1992 - 95 pages - ISBN 2-206-00698-7 (fr) Claude Delannoy - Initiation la programmation - ditions Eyrolles - 1997 - 192 pages - ISBN 2-212-08983-X
(fr)

Wikilivres
Programmation Pascal

Sur la Wikiversit
Introduction gnrale la programmation. Certaines notions exposes dans ce module dpassent le cadre du prsent ouvrage. Algorithmique Langage Pascal

Sur Wikipdia
le langage Pascal

Liens externes
Le projet Euler (http://projecteuler.net/) [archive] propose une collection de problmes mathmatiques rsoudre l'aide de l'informatique et notamment de l'algorithmique imprative. Attention, il s'agit l de problmes bien plus difficiles que ceux qui ont t abords ici. Le site tant de surcrot en anglais, il est donc rserver aux courageux. Pascal sur developpez.com (http://pascal.developpez.com/) [archive] France-IOI (http://www.france-ioi.org/) [archive] : site francophone sur les Olympiades Internationales d'Informatique

Rcupre de http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9rative/Version_imprimable&oldid=139706 Dernire modification de cette page le 30 octobre 2007 15:10. Les textes sont disponibles sous licence Creative Commons attribution partage lidentique ; dautres termes peuvent sappliquer. Voyez les termes dutilisation pour plus de dtails.

45 sur 45

28/10/2011 13:48

Das könnte Ihnen auch gefallen