Beruflich Dokumente
Kultur Dokumente
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).
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
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).
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
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 :
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
Oprateur
not
Type du rsultat
Valeur du rsultat
Exemple
Remarque
ngation
non ou
un boolen
un boolen
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
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
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)
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
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 :
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.
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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)
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
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.
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
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
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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
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
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
10 sur 45
28/10/2011 13:48
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
Exemples
Stucture REPETER
REPETER instruction JUSQU'A condition
condition
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
Exemples
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
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.
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
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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 et valeurs
Donner le type des expressions suivantes et leur valeur 1. 0
14 sur 45
28/10/2011 13:48
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
2. 3. 4. 5. 6.
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. ...
15 sur 45
28/10/2011 13:48
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
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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.
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
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.
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.
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
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
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.
1. c:=30000+a 2. c:=c-b
1. c:=30000-b 2. c:=c+a
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
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.
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
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.
20 sur 45
28/10/2011 13:48
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 :
... 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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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
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 :
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.
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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.
24 sur 45
28/10/2011 13:48
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.
Le Squelette
Pour le squelette de l'algorithme :
25 sur 45
28/10/2011 13:48
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
On traduit ainsi :
1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
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
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;
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;
27 sur 45
28/10/2011 13:48
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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;
Tableaux
lexique tab : tableau de deb fin de T
29 sur 45
28/10/2011 13:48
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;
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
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
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.
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
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
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
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.
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
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
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.
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.
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
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
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
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.
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
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
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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
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
http://fr.wikibooks.org/w/index.php?title=Algorithmique_imp%C3%A9...
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.
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
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