You are on page 1of 45

Algorithmique impérative/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 bibliothèque de livres pédagogiques, à 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 récente publiée par la Free Software Foundation; sans sections inaltérables, sans texte de première page de couverture et sans Texte de dernière page de couverture. Une copie de cette licence est inclue dans l'annexe nommée « Licence de documentation libre GNU ».

Introduction
« Les ordinateurs sont inutiles, ils ne savent que donner des réponses. » (Pablo Picasso).

À qui s'adresse ce livre ?
Ce livre s'adresse aux étudiants démarrant une formation autour de l'informatique théorique, c'est à dire principalement dans un cadre universitaire, en début de premier cycle. Ce livre n'a pas pour objectif d'enseigner la programmation vite fait bien fait, à des lecteurs qui voudraient obtenir des résultat rapidement. Si vous souhaitez apprendre à programmer et être vite opérationnel, la présente lecture vous ennuiera et ne vous mènera pas là où vous voulez aller. Nous vous recommandons particulièrement 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 même façon : aux étudiants débutant une licence universitaire en informatique il s'agit ici d'aborder les fondations du savoir que vous allez acquérir tout au long de votre cursus. Ne le négligez à aucun prix (au niveau international, on peut parler des formations en Computer sciences) aux étudiants débutant une formation d'ingénieur ou une préparation aux écoles d'ingénieurs pour ces étudiants : l'importance de notre sujet dépend de la proximité de la formation avec l'informatique. aux étudiants universitaires des formations scientifiques "pures" mathématiciens, physiciens, chimistes, biologistes... : vous aborderez peut-être ce sujet comme première approche de l'informatique. Il ne vous sera pas familier de prime abord mais c'est néanmoins un sujet scientifique qui ne devrait donc pas vous dérouter étant donné votre bagage mathématique. Il y a sûrement des étudiants en informatique sur votre lieu de formation (UFR, faculté...) : profitez de leur caractère habituellement accueillant ; vous pourrez sûrement trouver des étudiants informaticiens qui seront ravis de vous aider. Si vous avez accès à une bibliothèque universitaire, elle contient sûrement des ouvrages qui peuvent vous servir. Conseil : certains problèmes posés seront peut-être trop « matheux » pour vous. Travaillez plutôt les exercices proposés dans votre formation qui traiteront de notions plus familières. aux linguistes vous allez surement être rebutés par ces lectures bien éloignées de votre littérature habituelle. Néanmoins, sachez qu'il n'y a que peu de prérequis à cette étude et que vos « faibles » acquis mathématiques (disons de niveau baccalauréat Série L pour la France) seront suffisants. Conseil : jetez un œil aux premiers problèmes posés mais ne vous souciez pas des suivants trop « matheux » pour vous. Attachez-vous cependant à bien comprendre ce nouveau langage, sa syntaxe et sa sémantique en insistant sur la partie « Théorie de l'algorithmique impérative ». aux étudiants de formations professionalisantes BTS, DUT en rapport direct avec l'informatique vous allez en fait apprendre un (plusieurs ?) langage(s) impératif(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 façon plus abstraite. Concrètement, vous utiliserez votre langage au mieux parce que vous verrez mieux les simplifications possibles : cela allégera d'autant votre travail.

1 sur 45

28/10/2011 13:48

Algorithmique impérative/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 théorique qui sera présenté dans cette ouvrage (vous aurez tôt fait de l'oublier). En effet, vous apprendrez sûrement 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 français au cours d'une dissertation de philosophie). Concentrez-vous donc plutôt sur l'aspect algorithmique des problèmes : comment cela se déroule, comment obtient-on le résultat (...simplement) sans vous soucier du langage que nous allons utiliser. Prenez quand même le temps de faire le parallèle 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 généralisés ici dans notre langage théorique : les similitudes devraient être assez flagrantes).

À propos de cet ouvrage
L'algorithmique impérative est souvent la première 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 impératifs. L'étude de l'algorithmique impérative permet donc d'aborder les langages typiquement impératifs d'une façon plus rigoureuse. Afin d'aborder le sujet de façon complète, ce document se compose de trois parties : 1. Une partie théorique qui présente les divers aspects de l'algorithmique impérative et la façon de les exploiter. 2. Une partie sur les outils de travail de l'algorithmicien. 3. Des problématiques concrètes, une analyse simple puis approfondie du problème 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 réduire au strict minimum. Surtout pour une science si jeune et si vieille à la fois. Ce que nous abordons exploite des concepts dont le plus récent est la Programmation structurée, concept d'Edsger Dijkstra qui publia à ce sujet en 1968. La justesse de ses conclusions rendit la programmation structurée populaire dès 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é développé par Niklaus Wirth dans les années 1970 pour suivre dans les faits les théories de Dijkstra. Il a été créé avant tout, à des fins pédagogiques, afin d'éviter d'enseigner la programmation structurée avec un langage de l'époque, qui ne respecterait pas ces concept alors nouveaux. Pour l'anecdote, vous vous en doutiez sûrement, ce nom a été choisi en hommage au mathématicien français Blaise Pascal. Désolé d'avoir fait si court, nous vous invitons à lire les articles Programmation impérative et Pascal sur wikipédia.

Première approche
On peut faire le parallèle entre un algorithme et une recette de cuisine. La recette donne les indications nécessaires pour transformer, étape par étape, des ingrédients de départ en un plat prêt à servir. En suivant la recette, le cuisinier en transpose le texte en actions concrètes. Il en va de même 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 données de départ en données d'arrivée : les résultats. Attention toutefois, ce parallèle donne une idée générale mais cache quelques subtilités. En effet, si le cuisinier peut faire deux choses en même 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 règles d'un langage que nous allons apprendre. Nous pourrons ainsi écrire des recettes qui seront en fait des méthodes pour résoudre des problèmes ou calculer des résultats. L'ordinateur pourra alors suivre la recette et donner les résultats, après avoir effectué tous les calculs (fastidieux) à votre place. Un objectif concret est tout simplement de pouvoir assigner à un ordinateur une tâche trop rébarbative pour en débarrasser un humain.

Définition
Tout d'abord, un algorithme impératif est une séquence d'actions. C'est une séquence car les actions s'effectuent les unes après les autres et non en même temps. Un algorithme a une fonction, un objectif. Pour cela, il transforme des entrées (aucune, une ou plusieurs) en sorties (une ou plusieurs) : vous lui entrez des données, il vous en sort d'autres. Distinction algorithme / programme : de l'algorithme découle un programme informatique que l'on peut exécuter sur une machine. Le programme informatique est une traduction de l'algorithme dans un langage de programmation (par exemple Pascal). On peut créer plusieurs programmes informatiques différents à partir d'un même algorithme car chaque langage de programmation a ses particularités. On peut donc dire que l'algorithme est théorique, 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, opérations qui peuvent être fastidieuses à faire de tête pour un humain. Il y a dans la vie courante de nombreux exemples d'algorithmes impératifs qui nous donnent des marches à suivre (mathématiques, recettes de cuisine,...).

2 sur 45

28/10/2011 13:48

Algorithmique impérative/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 idée simple de ce qu'on pourra produire à la fin de l'étude de l'algorithmique impérative. Tous les concepts mis en œuvre dans cet algorithme sont expliqués plus loin, ne vous inquiétez donc pas si certains aspects vous échappent pour l'instant. Cet algorithme calcule et affiche le périmètre, l'aire et le volume du cercle ou de la sphère 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 : réel (* le rayon donné par l'utilisateur *) périmètre : réel (* le périmètre du cercle *) Début Afficher("Donner le rayon : ") Lire(rayon) périmètre ← 2 * pi * rayon Afficher("Le périmètre est de : ", périmètre) Afficher("L'aire du cercle est de ", pi * rayon²) Afficher("Le volume de la sphère est de ",(4/3) * pi * rayon³) Fin

À la fin de l'apprentissage proposé dans ce livre, vous serez à même de créer ce genre d'algorithme et d'autres bien plus complexes.

Nous entrons maintenant dans le vif du sujet. Cette première partie est plutôt abstraite et une fois que vous l'aurez étudiée, 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 première lecture, n'essayez pas de comprendre mais plutôt d'admettre. Une seconde lecture vous permettra d'avoir une vue d'ensemble et de constater qu'en fait, tout se tient.

Première approche
Un type est la façon de comprendre la signification d'une donnée. Prenons la donnée 4 : elle peut être de type entier (de valeur 4 : 3+1), de type caractère (le caractère "4"), est-ce un réel... ? Un opérateur transforme des données. Par exemple, la somme est un opérateur qui transforme des données en une autre donnée. Il convient de se demander sur quel(s) type(s) un opérateur fonctionne. Par exemple, la somme de deux données de type "entier" est de type "entier". On peut donc supposer que la somme de deux données de type "réel" sera de type "réel" (rassurez-vous : ce sera le cas). Qu'en est-il de la somme de deux données de type "caractère" et de la somme d'une donnée de type "réel" et d'une autre de type "entier" ? Une expression est une combinaison d'opérateur et de données. Par exemple "4+3" est une expression comportant un opérateur et deux données de type "entier". Toutes les expressions ont une valeur, "4+3" a la valeur 7 ; 7 est une donnée de type "entier". Nous avons donc trois notions différentes, mais liées entre elles par des règles que nous allons voir.

Spécification
Chaque type a donc son ensemble de valeurs possibles et des opérateurs qui lui sont propres. Par exemple, le type entier qui peut prendre des valeurs telles que 10 ou 12345... Les opérateurs sont des fonctions mathématiques et à ce titre, ils ont un espace de départ et un espace d'arrivée. Cette propriété s'étend aux opérateurs puisque chaque opérateur à un ou plusieurs types de départ (fonction à une ou plusieurs variables) et un type d'arrivée. Prenons la fonction mathématique « somme ». On pourrait noter : somme : ℕ² → ℕ : x,y → x+y. De la même façon, l'opérateur somme ajoute deux données de type "entier" et renvoie un "entier". Remarquez que "a+b" est une notation de somme(a,b). Pour chaque opérateur que vous découvrez ou utilisez, demandez-vous toujours quels sont les types de départ et d'arrivée. Beaucoup d'erreurs sont dues à des opérateurs mal utilisés. Une expression est donc une suite d'opérateurs et de données qui doit respecter les règles imposées par l'usage des opérateurs. Dans notre cours nous allons introduire cinq types, les plus couramment utilisés en informatique : entier réel caractère chaîne de caractères booléen Ce(s) dernier(s) vous est (sont) probablement étrangers : ne vous inquiétez pas, nous allons y revenir.

3 sur 45

28/10/2011 13:48

Algorithmique impérative/Version imprimable - Wikibooks

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

Les entiers et les réels
Voici deux types fidèles à leur définition mathématique. Les opérateurs sur les entiers sont "+", "-" "*" "/", respectivement la somme, le différence, le multiplication et la division entière. Un dernier opérateur est l'opérateur mod, donnant le reste de la division entière. Tous ces opérateurs prennent deux données de type "entier" pour en renvoyer une autre du même type. (Rappel : a = a / b + a mod b) Les opérateurs sur les réels sont "+", "-" "*" "/", respectivement la somme, la différence, la multiplication et la division. Tous ces opérateurs prennent deux données de type "réel" pour en renvoyer une autre du même type. Il convient de se demander ce qu'il se passe quand on considère l'expression "a+b" avec a entier et b réel. Cela est censé ne jamais arriver. Néanmoins, on pourra considérer que l'entier se transforme en réel avant l'opération.

Les caractères et les chaînes de caractères
Un caractère est tout simplement une lettre, un chiffre ou un symbole : par exemple, "1", "a", "A", "|" sont des caractères. Aucun opérateur n'existe sur les caractères. Une chaîne de caractères est une suite de caractères telle que décrite précédemment. "1", "1abc" (par exemple) sont des chaînes de caractères. À noter que "" est une chaîne de caractères (la seule comportant 0 caractère). Il n'existe qu'un seul opérateur sur les chaînes. Il s'agit de l'opérateur de concaténation qu'on notera "+". La concaténation revient à mettre la seconde chaîne à la suite de la première. Par exemple "abc"+"def" est équivalente a "abcdef". Remarquez que l'opérateur de concaténation, même 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 concaténation des chaînes "1" et "2" qui vaut "12" (et sûrement pas "3"). Il n'existe pas de convention pour désigner l'opérateur de concaténation. Nous pourrons également utiliser la notation ".". Bien que cela ne doive pas arriver, nous pouvons considérer que l'opération de concaténation effectuée sur des caractères fonctionne et donne une chaîne de caractères.

Introduction à l'arithmétique booléenne
En informatique on introduit un nouveau type un peu moins familier : le booléen. Au même titre que les entiers ou les réels : un booléen peut prendre un ensemble de valeurs et possède ses propres opérateurs. Il n'est donné ici que quelques explications (nécessaires et suffisantes pour la suite du cours) sur le booléen. Il existe cependant toute une algèbre permettant de travailler sur les booléens. Un complément essentiel de ce cours d'algorithmique impérative est l'étude de l'algèbre de Boole.

Première approche
En mathématiques, les entiers ont été invités pour dénombrer, les réels pour représenter les distances, les volumes, etc... Le booléen a également pour utilité de représenter le réel. Il sert à représenter la véracité, c'est à dire à déclarer si une chose est vraie ou fausse. L'ensemble des valeurs possibles d'un booléen est de deux (!). Ces deux valeurs sont notées VRAI et FAUX. Voici deux exemples comportant des informations représentées par des booléens : Premier exemple : Supposons que E soit en ensemble qui contient les éléments a, b, c et d. 1. 2. 3. 4. L'information cardinal de E est une information qui peut être représentée par un entier (ici 4). L'information b appartient à E est une information qui peut être représentée par un booléen (ici VRAI). L'information e appartient à E est une information qui peut être représentée par un booléen (ici FAUX). L'information 'E comporte au moins 2 éléments est une information qui peut être représentée par un booléen (ici VRAI).

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

Vous voyez donc qu'un booléen peut servir à représenter une multitude d'informations différentes mais ne remplace pas les entiers, les réels ou tout autre type. Chaque type à un usage et il convient d'user du booléen a bon escient tout comme on ne représente pas une distance avec un entier ou un dénombrement avec un réel.

Opérateurs booléens
Au même titre que pour les autres types, il existe des opérateurs sur les booléen. Nous avons vu que la somme était un opérateur qui prenait deux entiers et renvoyait un résultat de type entier également. Il en va de même pour les booléen.

4 sur 45

28/10/2011 13:48

.wikibooks.. Si vous avez su les résoudre sans relire ce cours. On peut écrire des expressions à condition de respecter certaines règles. Voici ce qui doit retenir votre attention : Retenez les noms des différents types et de leurs opérateurs en retenant bien quel opérateur fait quoi et avec quoi. FAUX si tous les paramètres sont FAUX VRAI ou VRAI a pour résultat VRAI VRAI ou FAUX a pour résultat VRAI Vous en serez déjà arrivé à ces conclusions : si b est un booléen. Vous avez retenu l'essentiel ! N'oubliez pas que tout ça est simple (eh oui !). les caractères et les chaînes de caractères et leurs opérateurs fonctionnent exactement de la même façon que les entiers et les réels. vous ne devriez pas avoir à l'apprendre. Vous devriez pouvoir reconstruire de tête le tableau récapitulatif (encore une fois. N'apprenez pas par cœur. ou (disjontion) Ce qu'il faut retenir Ce chapitre est abstrait et ne donne rien de concret.. La conjonction est prioritaire sur la disjonction. Tableau récapitulatif Tableau récapitulatif des types et de leurs opérateurs Type Entier Réel Booléen Caractère Chaîne de caractères Concaténation Ensemble de valeurs ℕ ℝ {VRAI .. * (multiplication). FAUX} + + ¬ Opérateurs (somme). tout ceci se tient et est assez cohérent par rapport à ce que vous avez appris sur les mathématiques. qui ont un ensemble de valeurs possibles et des opérateurs spécifiques. FAUX sinon. Dans un algorithme.). vous permet de calculer des expressions et d'en simplifier d'autres.(différence). / (division) (négation). * (multiplication). . . Vous pouvez déjà faire les exercices sur ce chapitre. Si FAUX alors VRAI non(VRAI) a pour non() est une fonction mathématique résultat FAUX dite réciproque : non(non(truc)) vaut non(FAUX) a pour truc.) ou susceptibles d'évoluer au cours de l'algorithme : il s'agit des variables. Quelques exemples : non(non(FAUX)) vaut FAUX ((VRAI et FAUX) ou VRAI) vaut VRAI La négation est prioritaire sur la conjonction. vous devriez pouvoir le déduire des types). D'autres données peuvent être inconnues (elle seront fonction du choix de l'utilisateur. disjonction ou deux booléen un booléen Le résultat vaut VRAI si au moins un des deux paramètres est VRAI.Wikibooks http://fr.. Retenez que les booléen.. et (conjonction). ou du temps. Opérateur noté Type des paramètres Type du résultat Valeur du résultat Exemple Remarque négation non ou ¬ un booléen un booléen Si VRAI alors FAUX. Ce sont des types. Certaines de ces données sont connues et ne varieront pas tout le long de l'algorithme : il s'agit des constantes. résultat VRAI conjonction et un deux booléen booléen Le résultat vaut VRAI seulement si les deux paramètres sont VRAI. Les variables 5 sur 45 28/10/2011 13:48 . Essayez de voir un peu comment on manipule cette arithmétique booléenne qui.php?title=Algorithmique_imp%C3%A9.(différence). VRAI et VRAI a pour résultat VRAI VRAI et FAUX a pour résultat FAUX On pourra aussi dire "Pour que le résultat soit VRAI il faut que tous les paramètres soient VRAI". Remarquez que cette arithmétique est plus simple puisque vous n'avez que deux valeurs possibles (c'est peu par rapport à l'infinité d'entiers. comme l'arithmétique entière.Algorithmique impérative/Version imprimable . / (division entière) (somme). b et FAUX b ou VRAI vaut FAUX quelque soit b vaut VRAI quelque soit b Ces opérateurs peuvent bien sûr former des expressions.org/w/index. il faut stocker les données à traiter.

Afficher Afficher permet d'afficher des données à l'écran et ainsi de communiquer avec l'utilisateur..Wikibooks http://fr. Dans chaque algorithme. on peut considérer que PI ne risque pas de changer de valeur pendant un algorithme.. sans utiliser de variables") Ce programme affiche : ceci est un exemple : on affiche une chaîne. Pour cette instruction.14 . D'un point de vue mathématique. un ...... Les constantes De la même façon. "Soit r un réel". on doit préciser une expression qui sera évaluée avant d'être affichée. etc.wikibooks. On dit que la variable est déclarée. Il s'agit des instructions Afficher et Lire. Une seule constante est déclarée.c : chaine : entier réel booléens chaîne de caratères Dans cet exemple.. Toutes les variables ont un type. .php?title=Algorithmique_imp%C3%A9. Elle peuvent requérir que l'on précise certaines informations. Un exemple Variables n : r : b. Quelques exemples : Afficher ("ceci est un exemple : on affiche une chaîne. sans utiliser de variables Si l'algorithme contient 6 sur 45 28/10/2011 13:48 . On peut donc déclarer PI en tant que constante.".org/w/index. Nous avons vu qu'un algorithme est une séquence d'instructions . "Soient b et c deux booléens".. Deux instructions de base Voici expliquées deux instructions que l'on retrouvera très fréquemment dans des algorithmes. la déclaration revient à l'expression "Soit . Constantes pi = 3. nous avons 5 variables. toutes les variables et leurs types sont explicitées dans le lexique. de quoi s'agit-il exactement ? Les instructions sont les actions devant être effectuées par l'algorithme. les constantes sont déclarées dans une partie Constantes de cette façon : Constantes nom_de_la_constante = valeur Un exemple A priori. on aurait pu énoncer "Soit n un entier". Du point de vue mathématique..Algorithmique impérative/Version imprimable . Le lexique est noté comme suit : Variables identifiant_de_la_variable : type de la variable.

l'exécution d'une seule instruction ne suffit pas pour faire un algorithme complet. est plus courte.. L'assignation est une instruction qui consiste à inscrire dans une variable une valeur calculée depuis une expression. Chaque information donnée par l'utilisateur est stockée dans une variable (attention au type !). on procède ainsi : les instructions sont séparées par un saut de ligne ou par . Constantes PI = 9 Le programme Afficher(PI) affiche 9 Lire La fonction Lire permet de demander à l'utilisateur de fournir des informations. Tout d'abord il apparaîtra dans le lexique : Lexique age : entier (* l'âge donné par l'utilisateur *) Pour demander l'âge : Lire(age) Les blocs d'instructions Souvent.wikibooks. courante dans les langages de programmation. On pourra également noter l'affectation ← ou :=. Concrètement. on peut mettre un bloc d'instructions. Un exemple : voici notre lexique Lexique n : entier On assigne n : 7 sur 45 28/10/2011 13:48 . Ce serait un dangereux raccourci de pensée avec les mathématiques (voir la mise en garde ci-dessous). Attention : la nouvelle valeur affectée « écrase » la précédente. Un exemple : nous réalisons un algorithme qui demande à l'utilisateur d'entrer son âge.Algorithmique impérative/Version imprimable .Wikibooks http://fr. Ce symbole peut être énoncé « prend pour valeur ». Pour cela.. C'est donc la deuxième façon que nous apprenons de donner une valeur à une variable. Vous précisez cette variable dans les parenthèses.php?title=Algorithmique_imp%C3%A9. Le bloc d'instruction est précédé de Début et suivi de Fin. Les instructions formant un bloc sont entre { et }. Partout on l'on peut mettre une instruction. Un exemple : Début instruction1 instruction2 Afficher("Cet affichage est la troisième instruction") instruction4 Fin Une autre notation. Nous pouvons faire en sorte que plusieurs instructions soient considérées comme une seule. on utilise l'instruction Assigner. Attention toutefois à ne pas la noter = bien que certains langages utilisent cette notation. il faut créer un bloc d'instructions.. La première était d'utiliser l'instruction Lire qui permet de demander la valeur à l'utilisateur. On peut dire que l'instruction Lire est une forme particulière d'affectation. Pour effectuer une assignation. On précise entre parenthèses la variable affectée ainsi que l'expression de la valeur de l'affectation.org/w/index.

L'exécution conditionnelle. 12) A partir de maintenant la variable n vaut 12.. Mais du point de vue mathématique c'est une aberration. est la plus simple de ces structures de contrôles. Vous savez que les instructions s'exécutent les unes après les autres. Assigner(n.org/w/index. l'instruction Afficher(n) provoquera l'affichage suivant : 12 Dans la suite du cours. L'exécution conditionnelle permet de n'exécuter une instruction que si une certaine condition est remplie. En effet.. Les structures permettant d'imposer la succession des instructions sont appelées structures de contrôles.php?title=Algorithmique_imp%C3%A9. cela revient à incrémenter x. les constantes et les variables sont donc remplacées par leurs valeurs respectives. cette expression : x = x+1 est tout à fait correcte en informatique si on considère l'affectation notée ainsi . En effet.Wikibooks http://fr. C'est pourtant une erreur vis-à-vis du sens mathématique de ce symbole.b. Ainsi. Exemple : dans le lexique nous avons : Lexique a.Algorithmique impérative/Version imprimable . elle est d'ailleurs notée ainsi dans le langage de programmation C. nous utiliserons la notation ←.. que nous allons voir ici.. La syntaxe est la suivante : SI condition ALORS instruction FINSI 8 sur 45 28/10/2011 13:48 . le changement de la valeur de b n'affecte pas la valeur de c.. Voyons cela en appliquant une résolution d'équation du premier degré : x=x+1 par soustraction de x dans les deux membres : x−x=1 donc 0=1 En revanche. l'affectation notée := est valide en mathématique comme en informatique. tout le monde est content. la valeur affecté est évaluée.. SI..c : entiers a←1 b←2 c←a+b (* équivaut à c←2+1 et à c←3 *) afficher(c) (* affiche 3 *) b←5 afficher(c) (* affiche toujours 3 et non 6 *) c conserve sa valeur tant qu'elle n'a pas été affectée. c'est-à-dire calculée. C'est intéressant mais insuffisant pour élaborer des algorithmes complexes.ALORS. Mise en garde sur le parallèle avec les mathématiques Au moment de l'affectation. Certains seraient tentés de noter l'affectation avec l'opérateur "=".wikibooks. moins lourde. En prenant cette convention.. nous pourrions avoir besoin d'exécuter certaines instructions seulement dans un certain contexte.

S'il est effacé du programme.SINON Il est possible de préciser une instruction à exécuter si la condition n'est pas vérifiée. on obtient un programme équivalent.Algorithmique impérative/Version imprimable . Si condition est évaluée à FAUX aucune instruction n'est exécutée. Vous pouvez bien sûr exécuter plusieurs instructions : il suffit pour cela d'un bloc d'instructions. instruction est une instruction normale. L'instruction n'est exécutée que si cette l'expression booléenne est évaluée à VRAI. la condition n'étant jamais VRAI") FINSI Cet extrait d'algorithme n'a aucun intérêt. condition est une expression booléenne. Il suffit pour cela d'ajouter une partie SINON entre ALORS et FINSI. c'est-à-dire si elle est évaluée à FAUX. Il en existe trois distinctes.. Exemples SI FAUX ALORS Afficher("Cet affichage ne se produira jamais. Dans les deux cas.org/w/index.php?title=Algorithmique_imp%C3%A9. Cette partie SINON n'est pas toujours utile. SI VRAI ALORS Afficher("Cet affichage se produit toujours") FINSI Cet extrait d'algorithme n'a aucun intérêt. Voici la syntaxe : 9 sur 45 28/10/2011 13:48 . Structure POUR La structure POUR permet d'exécuter une instruction un nombre connu de fois. le programme poursuit son exécution par ce qui se trouve après le FINSI. Il aurait évidemment suffit d'écrire : Afficher ("Cet affichage se produit toujours") .wikibooks. 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 contrôle itératives permettent d'exécuter plusieurs fois de suite une ou plusieurs instructions... elle est donc facultative..Wikibooks http://fr.

2.. La structure s'exécute de la façon suivante : 1. Cette structure est exécutée comme suit : 1.php?title=Algorithmique_imp%C3%A9..Wikibooks http://fr. 4. i est affecté à la valeur de deb (i←deb) si i est différent de fin alors on exécute instruction incrémenter i (i←i+1) revenir au point 2 Il est évident que pour que le programme fonctionne deb<fin.. reprendre au point 1 La boucle infinie Il est possible grâce à cette structure de créer 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 . continuer après FINTANTQUE 2. si condition est vraie : exécuter instruction sinon.. POUR i DE deb A fin FAIRE instruction FINPOUR i est l'identifiant d'une variable (qui doit bien sûr être déclarée). deb et fin sont deux expressions de même type que i : ce sont les valeurs entre lesquelles i va parcourir l'ensemble des valeurs intermédiaires. 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 booléenne. comme dans la structure SI condition ALORS. Exemples Dix itérations Lexique i : entier Début POUR i de 1 à 10 FAIRE Afficher(i). 3.org/w/index.wikibooks.Algorithmique impérative/Version imprimable .

Cette structure s'exécute comme suit : 1. reprendre au point 1 3. une constante déclarée.Algorithmique impérative/Version imprimable . Il contient un ensemble d'éléments indicés par des entiers .php?title=Algorithmique_imp%C3%A9.. on peut donc utiliser des variables tableaux.wikibooks. généralement 0 ou 1. On a évidemment FIN > DEBUT TYPE est le type de chacun des éléments du tableau.Wikibooks http://fr. exécuter instruction 2.. Spécification Les tableaux sont déclarés 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 élément du tableau. 11 sur 45 28/10/2011 13:48 . FIN est un entier : l'indice du dernier élément. plus intéressant. exécuter ce qui suit le JUSQU'A La boucle infinie Il est possible grâce à cette structure de créer une boucle infinie : REPETER instruction JUSQU'A FAUX Une boucle POUR Il est possible de simuler une boucle POUR à l'aide d'un REPETER i←deb REPETER instuction i←i+1 JUSQU'A i=fin Exemples Comment déterminer la structure à utiliser ? Première approche Le tableau est un nouveau type. cela peut être un entier fixé ou.org/w/index. si condition est vrai : continuer au point 3 sinon. i←deb TANTQUE i <= fin instuction i←i+1 FTQ Exemples Stucture REPETER REPETER instruction JUSQU'A condition condition est une expression booléenne. Nous n'étudierons que les tableaux à une dimension également appelés vecteurs.

Algorithmique impérative/Version imprimable .wikibooks. La maintenance est plus difficile : s'il faut modifier l'algorithme. Première approche L'enregistrement est une façon de créer un nouveau type. c'est-à-dire qu'on leur passe les valeurs (voire les variables. En général. Par exemple. Si la fonction n'a aucun effet de bord. ce qui n'augmente pas la taille du programme. En effet. et retourne un résultat. Chaque copie du code augmente la taille des programmes source et compilé. en général. Une fonction traite les informations qu'on lui passe. un tableau d'entiers de 10 cases Lexique tab : tableau 1 à 10 de entier On accède au ième du tableau comme suit tab[i] i est un entier qui doit évidemment être compris entre DEBUT et FIN (précisés dans la déclaration de tab) la variable tab[i] est donc du type TYPE (précisé dans la déclaration de tab) Utilisation La tableau est utilisé lorsqu'il faut stocker des suites de variables de même rôle. aucun résultat.. 12 sur 45 28/10/2011 13:48 . La structure POUR se prête très bien au parcours d'un tableau. voire de la valeur de certains paramètres. En général.Wikibooks http://fr. ou encore un méta-type.V.org/w/index.A. on peut la comparer à une fonction mathématique.. L'algorithme n'est codé qu'une seule fois. par adresse ou référence) qu'ils doivent utiliser. En supposant le tableau tab déclarer comme suit : Lexique tab : tableau MIN à MAX de TYPE Il suffit pour afficher ses éléments de Pour i de MIN à MAX Afficher(tab[i]) FP Première approche Les procédures et les fonctions sont des sous-programmes qui permettent une réutilisation du code plus facile. L'utilisation d'un sous-programme évite tous ces problèmes : Les sous-programmes utilisent des variables locales et des paramètres formels. il faut modifier toutes les copies sans en oublier une seule. mais ne retourne. et qu'on l'utilise à divers endroits du programme. Par exemple. les notes d'un groupe d'étudiants en algorithmique impérative. appeler deux fois un même sous-programme avec effet de bord en lui passant les mêmes paramètres ne produit pas le même résultat. si par exemple on code l'algorithme de calcul de T. Procédure et fonction : quelle différence ? Une procédure traite les informations qu'on lui passe. c'est-à-dire un type qui contient d'autres variables de types déjà définis.php?title=Algorithmique_imp%C3%A9. il est préférable de créer un sous-programme de calcul. la modification n'a lieu qu'en un seul endroit. La maintenance est facilitée par le point précédent : s'il faut modifier l'algorithme. cette procédure a un effet de bord. Effet de bord un sous-programme avec effet de bord modifie l'état global de l'application. La recopie a toutefois les inconvénients suivants : La recopie du code s'accompagne souvent d'un changement des noms de variables. plutôt que de recopier le code à chaque fois.

.. Exemple Supposons que nous voulions un nouveau type couple (de deux entiers).a ← 1 c. Nous allons déclarer 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.Wikibooks http://fr.b ← 2 afficher(c.b ← n renvoyer NouveauCouple fin 13 sur 45 28/10/2011 13:48 . nous utiliserons l'expression : identifiant_variable.php?title=Algorithmique_imp%C3%A9.Algorithmique impérative/Version imprimable ..a) (* affichera 1 *) Le projet sur les dates propose un travail complet sur le sujet.a ← m NouveauCouple. il convient de définir quelques fonctions élémentaires pour créer une variable à partir de ses sous-valeurs. fin on peut ensuite déclarer normalement les variables de ce nouveau type : identifiant_variable : identifiant_du_type Pour accéder à une sous-valeur de la variable.identifiant_sous_valeur Cette expression est du type de identifiant_sous_valeur.wikibooks. mais pour travailler sur un nouveau type . Exemple Pour reprendre notre exemple.org/w/index.. Remarquez que les types de paramètres seront semblables aux types des sous-variables de nouveau type (exception faite dans le cas de sous-valeurs par défaut. Spécification On déclare un nouveau type dans la partie Types comme suit : identifiant_du_type = enregistrement identifiant_première_sous_valeur : type_de_la_première_sous_valeur identifiant_deuxième_sous_valeur : type_de_la_deuxième_sous_valeur . Utilisation Cela n'est pas obligatoire en algorithmique impérative...). nous pourrions créer une fonction : fonction creerCouple(m. n : entiers) (* créer un couple à partir de ses deux éléments *) lexique NouveauCouple : couple debut NouveauCouple.

+ (polymorphe car fonctionne avec des entiers et des réels) Types et valeurs Donner le type des expressions suivantes et leur valeur 1.Algorithmique impérative/Version imprimable . entier. 5. 4. réel. Au final. Donnez un opérateur polymorphe Solutions : 1. booléen. Algorithme suivi du nom de l'algorithme De la déclaration des procédures et des fonctions De la déclaration des constantes de l'algorithme principal De la déclaration des variables de l'algorithme principal De l'algorithme principal Algorithme nom_de_l'algorithme Fonction1(paramètre1 : type du paramètre 1 (* objet du paramètre1 *) paramètre2 : type du paramètre 1 (* objet du paramètre2 *)) : 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 Début instruction1 instruction2 Retourner valeur Fin Procédure1(E|S|ES paramètre1 : type du paramètre 1 (* objet du paramètre1 *) E|S|ES paramètre1 : type du paramètre 2 (* objet du paramètre2 *) E|S|ES paramètre1 : type du paramètre 3 (* objet du paramètre3 *)) Constantes locales de la Procédure1 constante1 = valeur_de_la_constante1 constante2 = valeur_de_la_constante2 constante3 = valeur_de_la_constante3 Variables locales de la Procédure1 variable1 : type_de_la_variable1 variable2 : type_de_la_variable2 variable3 : type_de_la_variable3 Début 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 Début instruction1 instruction2 Fin Types. Citez des exemples de types 2.Wikibooks http://fr. 3. l'algorithme se compose de la façon suivante : 1. chaîne de caractères 2. 0 14 sur 45 28/10/2011 13:48 ... caractère.org/w/index.php?title=Algorithmique_imp%C3%A9. expressions et opérateurs Questions théoriques 1.wikibooks. 2.

3."b"="b" "a". 2. a non(b) a faux a vrai faux vrai faux 15 sur 45 28/10/2011 13:48 . 8. a+1 2..0 "a" "a". chaîne de caractères : a caractère ou chaîne de caractères 3."b" Donner le type de a et de l'expression : 1. entier . a entier 2. 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. 3. 5. 5. cela aurait été VRAI 8. 4. booléen : a réel Calcul booléen Quelle est la valeur de ces expressions booléennes ? 1...Wikibooks http://fr. 6. 7. . a. 5. 9. 4.org/w/index.Algorithmique impérative/Version imprimable . 7. 9. De même. 7.php?title=Algorithmique_imp%C3%A9. 6. 1+2 0. 4.0+1. 4. 4. 3." au début de l'expression pour savoir tout de suite le résultat : peu importe ce qu'il y a après le ou. 6. 2. 5.. 6. 5.wikibooks. 7. il suffit de lire "VRAI ou .0 caractère : "a" booléen : FAUX chaîne de caractères : "ab" Questions avec la variable a : 1... 6.. a=1. 5. Quel que soit ce qu'il y avait après le et cela aurait été FAUX. 2.. entier : 0 entier : 3 réel : 1. simplifier les expressions : a et b sont 1.0 Solutions 1. 6."b" 3. 2. FAUX FAUX FAUX VRAI FAUX Il suffit de lire "FAUX et . 2. 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 booléens. 3. 2. Simplifications : 1." au début de l'expression pour savoir tout de suite le résultat. 8. 3. 3. 4.

.Algorithmique impérative/Version imprimable . Cette réflexion est laissée au lecteur.org/w/index.Wikibooks http://fr..wikibooks. 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 : i←0 Répéter i←i+5 afficher(i) Jusqu'à i=100 i←5 Répéter afficher(i) i←i+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. Tableaux Selon la déclaration suivante tab : tableau 0 à 10 de T 16 sur 45 28/10/2011 13:48 .php?title=Algorithmique_imp%C3%A9.

. Ce dernier est toutefois plus abordable que : Début si condition1 alors instruction1 sinon si condition2 alors instruction2 sinon instruction3 finsi finsi Fin et pourquoi pas. Quand vous écrivez une dissertation. Par exemple. Indenter son code L'indentation d'une ligne est l'espace qui la sépare de la marge gauche. il en est de même ici. considérez les blocs et mettez au même niveau le début du bloc et la fin du bloc.org/w/index. 11 ? Procédures et fonctions Écrire ces fonctions en procédures. 17 sur 45 28/10/2011 13:48 . ces procédures en fonctions : Lorsqu'on rédige un algorithme. Il convient de respecter ces principes d'une façon rigoureuse.. Combien le tableau a-t-il d'éléments ? 9. il convient de respecter la grammaire et l'orthographe même si ce n'est pas ce qui doit être évalué.Wikibooks http://fr. 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. 10.wikibooks. Début si condition1 alors instruction1 sinon si condition2 alors instruction2 sinon instruction3 finsi fi Comment faire Pour bien indenter. un fin devrait se trouver au même niveau que son début : on devrait l'apercevoir immédiatement étant donné que tout ce qu'il y a entre les deux devrait se trouver un niveau d'indentation plus loin.Algorithmique impérative/Version imprimable .. Problème Considérons l'algorithme (incomplet) suivant : Début si condition1 alors instruction1 sinon si condition2 alors instruction2 sinon instruction3 finsi finsi Fin Voici le même algorithme mais sans l'indentation : Début si condition1 alors instruction1 sinon si condition2 alors instruction2 sinon instruction3 finsi finsi Fin Il est déjà moins évident de comprendre le fonctionnement de l'algorithme.php?title=Algorithmique_imp%C3%A9.. les rédacteurs ont dégagé quelques principes dont les plus simples sont expliqués ici. Remarque pour les étudiants : il est parfaitement admis que le respect de ces règles de rédaction soit pris en compte dans la note finale.

.) Évitez : de répéter le type de la variable dans son identifiant (entier_n.) comme variable de boucle utiliser un préfixe pour signaler les variables entrées du programme qui seront données par l'utilisateur. début ... Utilisation simple de l'ordinateur (édition de texte). Il ne répond pas à la question "pourquoi 24 et pas 23 ?".. est pertinent. il est évidemment nécessaire d'avoir créé des algorithmes avant de vouloir les mettre sur une machine.FINSI TANTQUE. Prérequis logiciels 18 sur 45 28/10/2011 13:48 .org/w/index..Wikibooks http://fr.. Utiliser des identifiants pertinents Pour choisir un identifiant de variable ou de fonction..wikibooks. « Tester un programme peut montrer la présence de bugs.. notamment : i (j.JUSQU'A POUR. (Edsger Dijkstra : Notes On Structured Programming. fin . souvenez-vous qu'il doit remplir deux utilités principales décrire son rôle (sans toutefois remplacer le commentaire en déclaration) distinguer des autres (ne pas se retrouver avec deux fonctions calculer_nombre et calculer_nb.. chaine_départ) les conventions utilisées en maths (n ou x ne suffisent pas pour décrire le rôle d'un entier/réel) Pensez également aux conventions.Algorithmique impérative/Version imprimable .FTQ REPETER... Ainsi. Plus particulièrement : le commentaire répond à la question "pourquoi 24 et pas 25 ?".... l'important étant de les fixer et de s'y tenir. qui a été développé dans cette optique.. pas leur absence ». Vous pouvez transformer ces règles. quotient et division.php?title=Algorithmique_imp%C3%A9. Commenter utile Il ne faut pas décrire ce que vous faites : mais pourquoi vous le faites POUR i de 1 à 24 FAIRE instruction FINPOUR Pour cet algorithme le commentaire. Il existe plusieurs façons d'indenter et chaque auteur à ses préférences. début .. (* il a 24 heures dans une journée donc 24 instruction *) Servez-vous également des commentaires pour indiquer ce que vous supposez : les conditions dans lesquelles votre algorithme fonctionne. k. (* i va de 1 à 24 *) n'est pas pertinent. un travail pratique qui peut accompagner l'apprentissage peut être simplement d'expérimenter des programmes en les recopiant et en visionnant le résultat en situation. Prérequis Prérequis cognitif l'algorithmique impérative... 1970) Le langage de programmation le plus simple permettant d'implémenter directement un algorithme impératif par simple traduction de celui-ci est le langage Pascal. sur une machine...FP De même : placez les alors et les sinon au même niveau.. fin Procédez ainsi avec SI..

si le compilateur trouve une erreur dans votre code source. Problème de la valeur entière maximale Petit TP : faites un algorithme qui prend une valeur entière. votre enseignant vous indiquera comment accéder à tout ça. SciTE (Windows et Linux) pour les plus abordables mais aussi emacs. cela s'appelle « Ligne de commande DOS ».. En plus du simple éditeur de texte. On les appelle les éditeurs de code-source. c:=30000-b 2. Il existe des logiciels qui réunissent toutes ces fonctionnalités : éditeur de code + compilateur + terminal. les ordinateurs d'aujourd'hui sont assez développés pour que vous ayez une assez grande marge de manœuvre. Les technologies ont leur limite. Comment programme-t-on ? Vous avez donc votre algorithme. pour lancer et tester vos programmes. il existe des éditeurs de texte qui facilitent l'édition d'un code source.wikibooks. Les limites de l'ordinateur Un ordinateur est une machine finie (par curiosité. Cela a pour effet d'avoir 32765 + 1 = -32768. Éviter ce problème Si vous êtes confronté au problème : essayez de changer votre algorithme en privilégiant les calculs approchant les 0. l'augmente et l'affiche sans cesse et observez à partir de quand le programme commence à donner des valeurs incohérentes. Par contre. Sous Windows. 2. On les appelle les environnements de développement. 1. libre. ils proposent les fonctionnalités suivantes : Coloration syntaxique Complétion automatique des mots clés Numérotation des lignes (vous verrez que c'est indispensable : en effet. Cependant.org/w/index.. Voici un exemple plus clair : a et b sont deux entiers entre 5000 et 10000 avec a > b 1. du moment que les prérequis logiciels sont respectés.ubuntu-fr. c:=c+a peut fonctionner car on n'a pas dépassé 32767. Note hors-sujet : pour comprendre pourquoi ce problème se pose : voir la partie codage des entiers signés dans le cours d'architecture des ordinateurs. De ce fait on ne peut pas tout calculer en un temps fini. Un terminal.php?title=Algorithmique_imp%C3%A9. cependant vous voulez le vérifier in situ sur un ordinateur. Vous pouvez utiliser un terminal classique sous Linux et Mac OS X.Algorithmique impérative/Version imprimable . Un éditeur de texte : le plus simple suffit. 19 sur 45 28/10/2011 13:48 . Voici les étapes (toutes expliquées ci-après) à suivre pour obtenir votre programme informatique : 1. certains sont complexes mais il en existe de très simples qui vous permettent de compiler le code et de lancer le programme simplement en appuyant sur un bouton. comme vous êtes doué(e) : vous êtes sûr(e) qu'il fonctionne. n'importe lequel et de n'importe qu'elle architecture (PC ou Mac). au brouillon. La finitude se voit aussi dans les grandeurs. Vous ne pouvez pas manipuler des nombres aussi grand que vous voulez.org fpc /tutoriel geany /comment_installer_un_paquet) ) Quelques éditeurs de code source : Notepad++ (Windows). c:=c-b peut ne pas fonctionner car on a dépassé 32767. Votre algorithme peut être bon mais ne pas fonctionner sur ordinateur. Comme c'est simple et rapide on peut traduire en même temps qu'on fait l'étape suivante. Note aux étudiants : votre salle de Travaux Pratiques sera sûrement équipée. Un compilateur Pascal : Free Pascal est bon. il vous indiquera le numéro de la ligne où elle se trouve) Aide à l'indentation Paquet logiciel Ubuntu (? (http://doc. gratuit et fonctionne sûrement sur votre plateforme. c:=30000+a 2. Geany (Linux) est parfait à notre niveau. vi (voir la catégorie éditeur de texte sur wikipédia pour une liste exhaustive). Toutefois. Recopier la traduction (le code source) dans un éditeur de texte. Prérequis matériels Un ordinateur. vous pouvez voir la notion d'automate fini). En Pascal par exemple : l'entier maximal représentable est contenu dans la constante MAXINT (qui vaut 32767). Traduire l'algorithme en Pascal : cette étape peut se faire sur papier. TextMate (Mac OS).Wikibooks http://fr.

6. readln(rayon). Dans le cas contraire. var rayon : real. il ne vous reste qu'à l'exécuter pour vous en servir ou le tester.php?title=Algorithmique_imp%C3%A9. 4. 3. Ne paniquez pas car rien n'est joué ! C'est très courant. writeln('Le volume de la sphère est de '.) où il n'y a rien à faire puisque le compilateur se débrouille tout seul. 12. 5.1415. 4. 2. 11. Pour ce qui est de l'indentation : utiliser la caractère de tabulation prévu pour et surtout pas d'espaces. Retournez éditer votre code source et corrigez l'erreur. Le compilateur a engendré un programme. 9. il suffit de respecter un certain nombre de règles de syntaxe simples.(4/3)*pi*rayon³) Fin et le code source en langage Pascal 1. 8. d'oublis de points-virgules en fin d'instructions. Il vous suffit de lui demander de compiler votre code source.. allez savoir pourquoi. Parfois il faut recompiler vingt fois avant d'arriver à finir la compilation (c'est fou ce qu'il peut y avoir comme point-virgules. 6.. c'est la taille du caractère d'espacement qui est considérée (dans notre exemple. nous vous recommandons 2. pi*sqr(rayon)).Wikibooks http://fr.wikibooks. deux issues sont possibles : Premier cas : la compilation échoue. la tabulation aura la même largeur que 4 espaces). Relancez la compilation.. 14. 13. Voici un exemple de traduction afin de vous montrer que la ressemblance est réelle et que la traduction est facile.3)) end. Voici l'algorithme : 1. const pi = 3. dans certains cas. la compilation Étape (que beaucoup trouvent la plus agréable. Cet exemple reprend l'algorithme donné dans le chapitre d'introduction. il est très facile de convertir un algorithme (sur papier) en un programme exécutable (fichier texte sur un ordinateur). 14. 8. 2. 13. Avant l'exécution. program cercle. Il s'agit de la touche à gauche de la touche A (clavier AZERTY) ou de la touche Q (en clavier QWERTY). 3. Par défaut la taille des tabulations est de 8. perimetre). Compiler le code source pour le transformer en programme machine (ou binaire). 7.. À noter qu'on peut essayer avec un réglage à 4 puis décrémenter a posteriori si besoin est. votre responsable de TP est censé vous expliquer tout ça). (si vous êtes étudiant.. Traduire l'algorithme en Pascal Pascal ayant été prévu dans cette optique. Algorithme cercle Constantes pi = 3. Lancez la compilation. writeln('L''aire du cercle est de '. 10. 11. par exemple donner 4 comme valeur fera que les tabulations ont une largeur de 4 caractères si vous utiliser une police mono-espacée (ce qui doit être le cas dans un éditeur de code). Vous verrez que la plupart du temps il s'agit de fautes d'inattention (des '=' à la place des ':='. un bon éditeur permet de régler cette largeur en donnant la taille souhaitée en largeurs de caractères. pi*rayon²) Afficher("Le volume de la sphère est de ". Il est possible que vous trouviez ce caractère trop large. La plupart des compilateurs vous diront pourquoi ils refusent de compiler. 5. ils vous indiqueront même où se situe l'erreur (ligne du code source) voire. 7. 20 sur 45 28/10/2011 13:48 . perimetre:=2*pi*rayon. périmètre) Afficher("L'aire du cercle est de ".org/w/index. Tout ceci est développé dans le guide de traduction en Pascal. writeln('Le périmètre est de : '. 3. (* le rayon donné par l'utilisateur *) perimetre : real. etc).1415 Lexique rayon : réel (* le rayon donné par l'utilisateur *) périmètre : réel (* le périmètre du cercle *) Début Afficher("Donner le rayon : ") Lire(rayon) périmètre←2*pi*rayon Afficher("Le périmètre est de : ". Pour traduire n'importe quel algorithme dans le langage Pascal. même les informaticiens qui ont 20 ans de métier font encore parfois des erreurs.. Nous n'allons pas décrire ici toutes les façons de faire car il y en a de multiples : cela dépend de vos choix logiciels.). 9.(4/3)*pi*power(rayon.3 ou 4 à régler selon que me nombre des niveaux d'indentations est très élevé ou plus modéré. ils vous donnerons l'erreur et la correction à faire. 10. 12. (* le périmètre du cercle *) begin writeln('Donner le rayon : ').Algorithmique impérative/Version imprimable .

12.. entrez des valeurs comme si vous l'utilisiez. si plus personne ne peut vous en dissuader. else b:=b*c+10. (les étudiants se tourneront encore une fois vers leur enseignants de TP). Il est très peu probable que l'ordinateur Le programme ne donne pas les bons résultats (un fasse des erreurs de calculs donc si vous êtes sûr de votre code source : c'est peut-être votre algorithme qui est faux (retour à la case départ :(). il existe tellement de possibilités de faire que nous ne les expliquerons pas ici.. 21 sur 45 28/10/2011 13:48 . 5. considérons le programme suivant : 1. Si vous n'en dormez plus. Second cas : la compilation fonctionne.Wikibooks http://fr. à la fois nulle part et partout. Pédagogiquement. 7. 14. 6. Essayez de tester "toutes" les combinaisons en faisait des essais représentatifs. writeln('Donnez a'). 3. demandé à vos collègues qui n'ont rien pu vous dire. lui. Pour tester votre programme. que vous trouviez l'erreur en raisonnant et en relisant attentivement votre code source ou en revérifiant votre algorithme. cela revient à placer des « afficher » partout dans votre code.wikibooks. cependant nous allons expliquer la démarche « manuelle » ici. Il faut comprendre par là que ce doit être un (ultime) recours et non une pratique courante. Si vous décidez malgré tout de vous lancer dans ce processus fastidieux. Exécuter le programme Là encore.php?title=Algorithmique_imp%C3%A9. c:=a+b. 10.. pénible et coûteux en temps. même votre professeur a laissé tomber et pourtant il subsiste. if c >= 100 then b:=4*c+15.) Votre programme traite de trop grands nombres et vous avez dépassé les limites de Pascal..org/w/index. Le programme donne des résultats complètement hors de propos (comme une opération sur deux chiffres donnant = 29876 ???) erreur de segmentation (ou « segfault ») Vous n'avez touché à rien (promis) et pourtant ça fonctionnait tout-à-l'heure" (problème le plus courant : confirmé par nombre de professeurs. pour votre apprentissage. Vérifiez que vous avez une instruction qui fait tendre la ou les variables d'arrêt vers le cas d'arrêt (par exemple.. revérifié votre algorithme 15 fois. Exemple.. à expliciter. arg :( le problème ne vient pas de l'ordinateur qui.Algorithmique impérative/Version imprimable . n'avez-vous pas oublié d'incrémenter le i ?). 2. 13. Le déboguage (ou debugging) consiste à afficher ce que votre programme fait en arrière plan. de sorte que dès que vous voyez une ligne en particulier vous devez pouvoir retrouver la ligne de code ayant produit cet affichage. Introuvable. n'est pas de mauvaise foi . il est préférable.) Le déboguage Il existe des logiciels débogueurs dont c'est le rôle. 8. c:=b-a. Assurez-vous de connaître un moyen d'arrêter un programme récalcitrant.. 11. writeln('Donnez b'). Vous devriez avoir maintenant à côté de votre fichier source un exécutable. voici la situation et sa solution : Vous avez donc relu votre code source 15 fois.. voilà la solution. Concrètement. 9. Chaque Affichage doit être unique. readln(a). repeat readln(a). writeln(c). Le programme boucle sans fin Si le programme boucle effectivement sans fin : vous avez dans votre code source une boucle répéter ou tant que dont la condition n'est jamais atteinte. Vérifiez votre code source (oubli d'une instruction ?). le bogue. Un problème ? Voici les erreurs que vous pourriez constater en exécutant votre programme et des pistes pour les résoudre : Erreur d'exécution Où chercher l'erreur Assurez-vous que le programme boucle sans fin en attendant un temps assez long pour en être sûr (certains calculs peuvent être très longs) ou que le programme indique qu'il s'est arrêté car il ne peut plus continuer à consommer autant. Le compilateur vous indique qu'il a réussi. Le déboguage manuel a pour but de déceler les bogues récalcitrants qu'on a cherchés pendant des heures en mettant à contribution les collègues. readln(b). 4. . Si votre algorithme est bon alors faites un « bogue ») déboguage.

Nous allons implémenter l'algorithme suivant : 1. 22.b. 13. 5. writeln('on est sorti du if c >= 100 ').. 24.a. until (a=0).org/w/index. 12.c). 10. 26. 8. Comme environnement de travail.a. readln(b). c:=c+a 16.. until (a=0). on a choisi de travailler sur le système d'exploitation Ubuntu pour PC. 23. 21.a. writeln('Donnez b'). 32. 25.pas contenant la version déboguage du code précédant : 1. 16.' et b valant '.c). b:=4*c+15. writeln('on fait c:=c+a avec a et c qui valent'. 31. L'idée étant que à chaque étape. 33. 6. writeln(c). a := a+b gedit 22 sur 45 28/10/2011 13:48 . 18. Afficher("Donnez a") 7. 30.Algorithmique impérative/Version imprimable .c) if c >= 100 then begin writeln('on est passé dans le cas c >= 100'). Variables 3. . 27. 9. Algorithme inversion_calcul 2. 2. On utilisera gedit comme éditeur de texte et le compilateur Free Pascal car tous deux sont disponibles sur ubuntu. Afficher("Donnez b") 9. Créons un autre fichier .wikibooks. writeln('Donnez a'). 38. 7. else begin writeln('on est passé dans le cas c < 100'). vous pouvez vérifier que toutes les données sont valides. 20. 14. b).b). Lire(a) 8. Début 6. b:=b*c+10. 18..Wikibooks http://fr. 35. 19. writeln('fin de l interieur de boucle'). 4. 29. writeln('c vaut maintenant '. writeln('on a a. nous allons voir un cycle de programmation complet. end. writeln(c). writeln('b vaut maintenant '. writeln(c).c). 11.c qui valent '. writeln('on fait c:=b-a'). readln(a). c:=c+a writeln('c vaut maintenant '. a : entier 4. Exemple complet Dans cette partie. writeln('on est avant le repeat'). writeln('on a maintenant c valant : '. writeln('on est sorti de la boucle'). writeln('on l affiche ').. writeln('b vaut maintenant '. 15. 17. writeln('on affiche c'). c:=b-a.. . 28.. 15. 37.php?title=Algorithmique_imp%C3%A9.c). .b). 3. end. repeat writeln('on est dans la boucle').b. 17. b : entier 5.. 34. 36. c:=a+b. writeln('on va faire c:=a+b avec a valant'. Lire(b) 10. En suivant l'exécution avec ce qui s'affiche vous devriez voir à partir de quand l'erreur se produit.. readln(a).

b) 15. end. 9.php?title=Algorithmique_imp%C3%A9. 11.wikibooks. Traduisons-le : 1. b := a-b 12. a := a-b.pas 23 sur 45 28/10/2011 13:48 . 10. 4. 3. a := a+b. Passons à la compilation : on a ouvert un terminal et taper la commande fpc inversion. writeln('b vaut '.a) 14. writeln('a vaut '.Algorithmique impérative/Version imprimable .b). a := a-b 13.. program inversion_calcul. 2.pas : Remarquez que gedit colorie le code de façon à le rendre plus lisible (on parle de coloration syntaxique). begin writeln('Donnez a').a). On recopie la traduction dans gedit. Afficher("a vaut ". Afficher("b vaut ". 12. 15. 7. 8. puis on enregistre dans un fichier inversion. 11. 6. readln(b). Var a : integer.org/w/index.. b := a-b. 14. readln(a). writeln('Donnez b'). 5. Fin Il s'agit de l'algorithme demandant deux nombres et les inversant avant de les afficher (inutile mais c'est un exemple). b : integer. 13.Wikibooks http://fr.

0 sec . on donne la commande pour lancer le programme. Le programme se lance. 2. Le terminal affiche alors : 1.4 [2006/08/22] for i386 Copyright (c) 1993-2006 by Florian Klaempfl Target OS: Linux for i386 Compiling inversion.wikibooks.org/w/index. 6.. 0. 5. 4. Free Pascal Compiler version 2. le compilateur à créé un binaire inversion.Wikibooks http://fr.Algorithmique impérative/Version imprimable . Voici un test : On a entré nos deux nombres : notre programme va nous donner le résultat. 3./inversion Les 15 lignes ont bien été compilées (ligne 6).0.. 24 sur 45 28/10/2011 13:48 .php?title=Algorithmique_imp%C3%A9.pas Linking inversion 15 Lines compiled. Testons-le : dans le terminal.

comme tous les programmes a donc ses limites même si notre algorithme est bon.org/w/index. Types 25 sur 45 28/10/2011 13:48 ..Algorithmique impérative/Version imprimable . Notre programme. Constantes 4. voyons ce qu'il se passe si on atteint les limites du codage des entiers.Wikibooks http://fr. Le Squelette Pour le squelette de l'algorithme : 1. Algorithme mon_algo 2.wikibooks. L'expérience est concluante.. 3.php?title=Algorithmique_imp%C3%A9. Notre programme semble fonctionner. cependant. Les deux nombres ont bien été inversés. Testons avec deux grands nombres : Le programme nous indique les résultats 5123 et -30969. Voici un guide de traduction d'un algorithme impératif en Pascal. 5.

Exemple sur ce dernier point : pour inclure une apostrophe dans une chaîne. Fin On traduit ainsi : 1. 7. Début 10. 2.org/w/index. Les parties entière et décimale d'un réel sont séparées par un point et non une virgule.wikibooks. Variables 8. 10. program mon_programme.. les chaînes sont déclarées entre deux apostrophes ' pour échapper un caractère on le double. de a à z et de 0 à 9) et des tirets-bas ou underscore : _. (* notez ce point *) Commentaires Les commentaires notés (* un commentaire *) s'écrivent de la même façon (* un commentaire *) Types Voici l'équivalence des types type booléen entier réel caractère Pascal bool integer real char chaîne de caractères string Les valeurs booléennes sont true et false. 3. 6. 6. 9. 9..php?title=Algorithmique_imp%C3%A9.Algorithmique impérative/Version imprimable . 11. l'identifiant ne peut comporter que des caractères alpha-numériques (de A à Z. 7. 8.Wikibooks http://fr. 26 sur 45 28/10/2011 13:48 . Const Type Var begin end. 5. 4. writeln('l''apostrophe s''est échappée') affiche l'apostrophe s'est échappée Constantes et variables Les constantes et les variables ont des identifiants qui doivent respectées une syntaxe précise. 11.

Les instructions du bloc sont séparées par des point-virgules.org/w/index.Wikibooks http://fr.Algorithmique impérative/Version imprimable .14. Voici une ligne comportant une instruction unique : une_instruction Voici un bloc de k d'instructions : begin instruction_1. *) instruction_k end Remarquez qu'aucun point-virgule ne ponctue la dernière instruction. appel de fonction ou procédure) il suffit de l'écrire.wikibooks. ni plus ni moins. le premier caractère est une lettre. Cela explique également pourquoi lorsqu'on écrit une seule instruction. Les bloc d'instructions débutent par un begin et se terminent par un end. G = 9.' est un séparateur : il sépare les instructions entre elles.. On gardera la convention algorithmique préférant une instruction par ligne. Les paramètres sont précisés entre parenthèses et séparés par des virgules. (* .81..14 G = 9.php?title=Algorithmique_imp%C3%A9. En effet le '. 27 sur 45 28/10/2011 13:48 . Il est souvent affirmé à tort que « toutes les instructions se terminent par un point-virgule ». Ce n'est pas tout à fait vrai. Ainsi le lexique Lexique un_reel : réel une_chaine : chaîne de caractères se traduit Var un_reel : real. Ceci Constantes PI = 3. La déclaration d'une constante a pour syntaxe identifiant = valeur. (* un réel quelconque *) (* une chaîne quelconque *) (* un réel quelconque *) (* une chaîne quelconque *) Les identifiants des constantes respectent les même règles. on préfèrera les noter en majuscules. elle n'est pas suivie d'un point-virgule. Il n'y a donc pas de point-virgule après la dernière instruction. les variables sont déclarées dans le Lexique du programme délimité par sa partie Var.. Cependant. comme nous venons de le voir. une_chaine : string. pas plus qu'il n'y en a avant la première. Il convient de remarquer que le programme principal est un bloc d'instructions ponctué d'un point. cette croyance répandue a été prise en considération par les développeurs des compilateurs qui ignorent cette erreur. Instructions et blocs d'instructions Pour exécuter une instruction (assignation.. instruction_2. Par convention. Chaque déclaration est de la forme identifiant : type.81 s'écrit en pascal : Const PI = 3.

org/w/index. Elle peut prendre de un à plusieurs paramètres de n'importe quel type de base. write('def').) L'opérateur 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 assignée. On peut également appeler la procédure writln sans préciser de paramètres. cela effectue un retour à la ligne. si condition alors instruction donne if condition then instruction. On suppose ici que l'instruction est au sein d'un bloc. Lecture et Écriture (affichage) L'affichage s'effectue à l'aide de la procédure write.wikibooks. La lecture se fait à l'aide de la fonction read() qui prend en paramètre l'identifiant de la variable qui sera assignée.Algorithmique impérative/Version imprimable . end affiche abcdef alors que begin writeln('abc'). Exemple begin write('abc')..Wikibooks http://fr... Elle affiche tous les paramètres les uns après les autres (résultat identique à celui d'une concaténation). Elle ne comporte pas de point-virgule sauf si elle est à l'intérieur d'un bloc. readln est indentique à read() mais fait un retour à la ligne une fois la donnée lue. write('def'). end affiche abc def Assignation L'assignation est une instruction et à ce titre elle doit respecter les règles sur les instructions (points-virgules. Il existe une variante de write ayant la même spécification mais effectuant un retour à la ligne à la fin : il s'agit de la procédure writeln. Exécution conditionnelle On rappelle qu'une exécution conditionnelle est une instruction.. si il y a plusieurs instructions.php?title=Algorithmique_imp%C3%A9. et bien on utilise un bloc : 28 sur 45 28/10/2011 13:48 .

De même on peut utiliser des blocs : if condition then begin instruction_1.Algorithmique impérative/Version imprimable . end.wikibooks.. instruction_k. if condition then begin instruction_1. repeat instruction until condition. instruction_2. instruction_4.org/w/index. Tableaux lexique tab : tableau de deb à fin de T 29 sur 45 28/10/2011 13:48 . De même. end.php?title=Algorithmique_imp%C3%A9. on peut toujours utiliser un bloc comme instruction for i:=deb to fin do begin instruction_1. end else begin instruction_3. Structures itératives POUR i de deb à fin faire instruction donne for i:=deb to fin do instruction. while condition do instruction end. if condition alors instruction_1 sinon instruction_2 se traduit if condtion then instruction_1 else instruction_2. instruction_2. instruction_k. instruction_k. end. instruction_2. instruction_l.Wikibooks http://fr..

Nous voulons intervertir ces deux nombres. Exemple : au début du programme nous posons a=2 et b=3.Algorithmique impérative/Version imprimable .fin] of T. Par exemple tab : array [1.. donne : var tab : array [deb. Procèdures et fonctions Le type enregistrement type T = enregistrement champ : type_champ fin donne type T = record champ : type.Wikibooks http://fr.php?title=Algorithmique_imp%C3%A9.org/w/index. Une traduction complète Problèmatique Nous disposons de deux entiers a et b.. 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 première assignation *) Début temp := a (* on sauvegarde a qui sera effacée à la ligne suivante pour pouvoir la placer dans b plus tard *) a := b b := temp Fin Algorithme inversion_calcul Variables a : entier b : entier Début a := a+b b := a-b a := a-b Fin Remarque 30 sur 45 28/10/2011 13:48 . end.. À la fin du programme nous aurons a=3 et b=2..wikibooks.10] of integer. À 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.

. Ces deux solutions présentent en fait une notion clé de l'informatique : étudions nos deux solutions de plus près : Simplifions le fonctionnement d'une machine au maximum : supposons Qu'il faut utiliser une unité de mémoire pour stoker une variable en mémoire Qu'il faut une unité de temps au processeur pour effectuer un calcul et qu'une opération entière et l'assignation consistent toutes en 1 calcul. Problèmatique Nous supposons que nous avons déclaré 3 procédures 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 créer le programme principal permettant à l'utilisateur de choisir laquelle des trois il veut lancer. Bien au contraire.. que peut-être que ce programme ne sera pas exécuté plusieurs fois en même temps mais des milliers de fois. En fait. B. Gérez ce cas.wikibooks. En effet. Le programme doit avoir les fonctionnalités suivantes : Une fois que la procédure choisie par l'utilisateur a été exécutée.. le menu est de nouveau proposé. que sur cet exemple. cela ne veut surtout pas dire qu'aucun algorithme n'est améliorable sans perte de ressources en calcul ou en mémoire.. que peut-être que ce programme doit pouvoir être exécuté simultanément des milliers des fois sur la même machine... l'utilisateur aura le choix entre quatre possibilités : A. : . L'utilisateur doit pouvoir quitter le programme depuis le menu. aujourd'hui : nos ordinateurs sont parfaitement capables d'exécuter ces deux programmes en un temps record et qu'on ne distinguera pas la différence suivant qu'on utilise l'un ou l'autre.org/w/index. en général. Ce constat ne permet pas de dire si un des algorithme est plus efficace que l'autre : notre analyse a été trop simplifiée pour cela.php?title=Algorithmique_imp%C3%A9. Le programme doit expliquer à l'utilisateur comment utiliser le programme. Ce problème traite de la création d'une interface graphique rudimentaire dans un environnement textuel (un terminal). et.Wikibooks http://fr.permettant à l'utilisateur de choisir.. : l'utilisateur doit intervenir. . Il va falloir faire intervenir un Lire afin qu'il puisse nous donner son choix.. et que le programme ayant besoin d'inverser des milliers de valeurs à la suite doit pouvoir donner un résultat dans la seconde. les calculs sur les réels sont plus longs que sur les entiers. mais vous négligez que peut-être que ce programme sera exécuté sur une machine minuscule. Attention cependant. Temps de calcul requis par chaque algorithme : Pour inversion_stockage : 3 unités de temps (3 assignations) Pour inversion_calcul : 6 unités de temps (3 assignations + 1 somme + 2 différences) Mémoire requise par chaque algorithme : Pour inversion_stockage : 3 unités de mémoire (a. (optionnel) on suppose que l'utilisateur est distrait et qu'il peut ne pas donner une bonne réponse.quitter le programme depuis le menu : une autre possibilité. C'est vrai.laquelle des trois. nous n'avons pas considéré que la mise en mémoire peut aussi prendre un temps non négligeable peut-être que les calculs de sommes et de différences sont très coûteux en temps peut-être que le processeur est assez avancé technologiquement pour effectuer un premier calcul et en commencer un deuxième avant d'avoir obtenu le premier résultat. Première analyse Voici quelques idées directrices formant une première analyse de la problématique. . C ou quitter..Algorithmique impérative/Version imprimable . Vous contesterez. .. une micro-puce de quelques millimètres dans laquelle on n'a pu mettre que très peu de mémoire et un minuscule processeur.. avec raison. b et temps) Pour inversion_calcul : 2 unités de mémoire (a et b) On a donc que inversion_stockage prend plus de mémoire mais moins de temps de calcul que inversion_calcul inversion_calcul prend plus de temps de calcul mais moins de mémoire que inversion_stockage Et c'est là un concept généralisable : D'un façon générale. les unes après les autres. 31 sur 45 28/10/2011 13:48 .le menu est de nouveau proposé : il s'agit d'une répétition.. vous devez toujours essayer d'être le plus efficace possible. Chacun de ces points seront analysés dans la section suivante... vous pouvez faire des algorithmes plus rapides en utilisant plus de mémoire et des algorithmes utilisant moins de ressources mémoire mais qui seront plus lents.. l'algorithme pourrait utiliser des réels..

REPETER ou TANTQUE ? Le menu va s'afficher au moins une fois ce qui nous laisse penser qu'un REPETER est plus approprié.. il répondra par un entier en fonction duquel on fera un SÉLECTIONNER. on ne sait pas combien de fois l'utilisateur va exécuter une procédure...expliquer à l'utilisateur comment utiliser le programme' : on affichera les instructions avec Afficher. ..3 ou 0. Analyse approfondie Voici les réflexions qu'il faut mener sur les questions clés du problèmes.2.wikibooks.Wikibooks http://fr. (optionnel) l'utilisation d'une chaîne de caractères nous permettra de contrôler l'erreur si l'utilisateur entre autre chose que 1.)...php?title=Algorithmique_imp%C3%A9. L'utilisateur retrouve le menu Pour que l'utilisateur retombe sur le menu.. Procedure_C . Gérer le choix de l'utilisateur Nous allons représenter le choix de l'utilisateur par un entier. Finalement. Exemple : somme(5) calculera 1+2+3+4+5 et renverra donc 15 Solution Voici une première réponse acceptable : 32 sur 45 28/10/2011 13:48 . un REPETER. Variables reponse : chaîne de caractères (* entrée de l'utilisateur *) Debut Répéter Afficher("Que voulez-vous faire ? Donnez l'entier correspondant") Afficher("1 : exécuter la procédure A") Afficher("2 : exécuter la procédure B") Afficher("3 : exécuter la procédure C") Afficher("0 : quitter") Lire(reponse) Sélectionner 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 Problématique Écrire un algorithme sous forme d'une fonction qui calcule la somme des n premiers entiers.Algorithmique impérative/Version imprimable . De plus la situation est bien décrite par la phrase " fficher le menu jusqu'à ce qu'il choisisse de quitter" ce qui conforme notre choix.. Cela exclut le POUR. Si on utilise un entier et que l'utilisateur entre "truc" il va y avoir un problème (sur une machine. mais laquelle ? Petite réflexion : 1... A priori. Nous utiliserons donc A . Solution finale Algorithme menu (* on suppose que les procédures sont déclarées *) Procedure_A .. l'utilisateur à quatre possibilités pour le menu (entre parenthèse : l'entier que nous allons y associer) : Exécuter la procédure A (1) Exécuter la procédure B (2) Exécuter la procédure C (3) Quitter (0) Nous allons donc lui poser la question "Que voulez vous faire ?". Procedure_B . il va falloir utiliser une structure itérative. n étant passé en paramètre.org/w/index.. 2. le programme se bloquera.

Il faudra écrire une fonction. comme nous allons le voir. Conclusion : 3000 calculs pour le premier algorithme..Algorithmique impérative/Version imprimable . L'étude des séries nous apprend que .) Problèmatique Écrire un algorithme donnant le Plus Grand Commun Diviseur (PGCD) de deux nombres donnés par l'utilisateur. (pour info : wikilivres propose des cours de mathématiques.. L'algorithme principal y fera appel. Avec somme_directe() : nous allons effectuer une somme : n+1 une multiplication n*(n+1) une division par 2 Soit 3 calculs. 33 sur 45 28/10/2011 13:48 . La différence entre les deux : le mathématicien qui doit se retrouver en chaque algorithmicien. On peut en déduire que la fonction peut s'écrire Function somme_directe(n : entier) Début retourner (n*(n+1))/2 Fin Ce qui d'une part est plus simple mais également.. Et dire que de nombreux étudiants en informatique sont souvent étonnés de la présence importante de mathématiques durant leur cursus.. 3 calculs pour le second. Function somme(n : entier) Lexique somme : entier (* la somme qu'on complète au fur et à mesure et qu'on retournera à la fin *) Début 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 à gérer le cas n=0.. 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 opération entière et l'assignation consistent toutes en 1 calcul. c'est à dire 1+2+3+4+5 (=15). On supposera que l'utilisateur ne donne que des entiers strictement supérieurs à zéro.wikibooks. Tenez-en compte pour que l'algorithme ne commette pas d'erreur et qu'il informe l'utilisateur. Remarque Essayons une analyse un peu plus mathématique du problème : En fait notre fonction calcule pour n : .Wikibooks http://fr. Question subsidiaire : on considérera que l'utilisateur peut entrer n'importe quels entiers.org/w/index. prenant en entrée deux entiers strictement positifs et renvoyant leur PGCD. Cela ne change rien pour les autres cas puisque (en reprenant l'exemple de la problématique) somme(5) va calculer 0+1+2+3+4+5. plus efficace. Supposons que nous voulions calculer somme(1000) : Avec somme() : nous allons effectuer : 1000 incrémentation de i 1000 sommes somme+i 1000 assignation Soit au moins 3000 calculs.php?title=Algorithmique_imp%C3%A9..

14. Problématique Voici un problème fondamental d'informatique. 11. 15. 26. Algorithme pgcd Fonction euclide( u : entier v : entier ) : entier Variables r : entier (* le reste d'une division entière *) Début Tant que v <> 0 faire r := u mod v u := v v := r FTQ retourner u Fin Variables u. 22. Question subsidiaire : il y a trois événements à contrôler : Le cas où u=v=0 et où le pgcd n'existe pas et il faut arrêter le programme (ligne 22) Le cas où u ou v (ou les deux) est négatif 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 proposée. 24. 7. 13. >= sont génériques et permettent de comparer toutes données tant qu'elles font partie du même ensemble ordonné (Par exemple : l'alphabet). 23. 28. 4. Pour écrire le programme on prendra la déclaration suivante var tab : tableau MIN à MAX de T Pour simplifier le problème.php?title=Algorithmique_imp%C3%A9.wikibooks.Wikibooks http://fr. 8.v : entier (* les deux entiers donnés par l'utilisateur *) Début Écrire("Donner les deux nombres : ") Lire(u. Le jeu d'assignation à répéter jusqu'à obtenir un reste nul est difficile à visualiser.v) (* Début question subsidiaire *) si u=0 et v=0 alors Écrire("Le PGCD n'existe pas") sinon début si u < 0 alors u := -u si v < 0 alors v := -v (* Fin Question subsidiaire *) Écrire(euclide(u. 21. Solution 1. un tableau. 19. 29. 5. >. <=. Aide Il faut avoir étudié ce problème d'algèbre pour avoir la solution. 9. 20. 25.Algorithmique impérative/Version imprimable . 10. Supposons qu'il soit déclaré tab. Elle consiste à appliquer l'algorithme d'Euclide.org/w/index. 16. 3. 2. L'algorithme fonctionne-t-il ? Solution 34 sur 45 28/10/2011 13:48 . Note : sachez toutefois que les opérateurs <. 18. 12.. 17. 27.v)) fin Fin Pas vraiment de difficulté pour l'algorithme principal. vous pourrez considérer que T = entier.. Question subsidiaire : considérez le cas particulier où les éléments sont distincts. La difficulté étant la fonction implémentant l'algorithme d'Euclide. 6.

38. Une implémentation testable en Pascal 1. 27. 35. 17. il est facile de faire un algorithme qui. 20.|l|m] *) var i : integer. 30. on n'écrase pas ce qui était là (on perdrait un élément du tableau) mais on le déplace à la position qu'on vient de libérer (ce qui revient à faire une permutation). 11. Pour vous corriger : vérifiez que votre algorithme ne tombe pas sur une erreur courante en supposant que tous les entiers sont distincts. élément important de la culture de tout algorithmicien. 53. for j:=i+1 to FIN do if (t[j] < t[min]) then min:=j. procedure TriSelection(var t : T_tabint). i vaut le j donné et j vaut le i donné *) var tmp : integer. 40. 14.'|'). type T_tabint = array [DEB. En effet. 35 sur 45 28/10/2011 13:48 . 5. 44. Une fois un tel élément placé à sa place définitive. 21. 9. 52. 18.php?title=Algorithmique_imp%C3%A9.. (* variable de boucle *) begin write('[').. FIN = 5. 3. 16. procedure afficher(var t : T_tabint). boucle sans fin en voulant inverser sans fin : lorsqu'il tombe sur deux éléments égaux. 4. 39.']'). for i := DEB to FIN-1 do write(t[i]. var i. (* variables de boucle *) (* indice du plus petit élément parmi ceux qui reste à trier min : integer. (* variable de boucle *) begin for i := DEB to FIN do t[i] := random(99).t[min]). end. 7. 25. Lorsqu'on place un élément.Wikibooks http://fr.. 41. 37. voulant inverser deux éléments pour les remettre en ordre. 13. 47. Pour connaitre ces algorithmes de tri. end. 48.FIN] of integer. i := j. write (t[FIN]. 31. begin for i:=DEB to FIN-1 do begin min := i.. 36. 22. 19. 29. 23. j : integer. program tris. 24.Algorithmique impérative/Version imprimable . 6. if (i <> min) then permuter(t[i]. 33. Il est tout d'abord important de savoir qu'il existe de nombreuses façon de procéder. 46. Une solution "simple" Le tri par sélection est un des plus simples algorithmes de tri. 56. j := tmp end. var j : integer). 2. (* procédure qui remplit le tableau passé en paramètre *) (* avec des nombres aléatoires pris entre 0 et 99 *) var i : integer.. 45. 42. (* procédure qui affiche le tableau passé en paramètre *) (* sur une ligne et sous la forme [a|b|c|d. (* à la fin. 32. Il consiste à rechercher le plus petit (ou le plus grand) élément du tableau et de le placer à sa place définitive : au début (ou à la fin du tableau). (* un tampon pour stocker l'élément que va remplacer l'élément minimum p begin tmp := i. nous vous invitons à consulter l'article « Algorithme de tri » sur wikipédia ainsi que les articles sur les différents algorithmes de tri existants. const DEB = 0.wikibooks. 43. 15. 49. 54. 50. 10. procedure permuter(var i : integer. end. 12. 51. 55. 34. 8. on recommence avec le reste du tableau. 26. end. procedure remplir(var t : T_tabint). 28.org/w/index.

tableau donné'). end. 67. var tab : T_tabint. procedure TriBulle(var t: T_tabint). writeln(' <. remplir(tab). Pensez donc à la méthode que vous employez dans cette situation. writeln(' <. 93. 91. afficher(tab). afficher(tab). end. j : integer. 80. 96.. Proposez un algorithme qui. étant donné un entier indiqué par l'utilisateur. 61. (* Tri bulle *) writeln('TRI BULLE'). 79. 78. 84.tableau trié').Algorithmique impérative/Version imprimable . 60. TriBulle(tab).tableau trié').php?title=Algorithmique_imp%C3%A9. 94.tableau trié Problèmatique Supposons que nous avons déclaré un tableau tab d'entiers comme suit : Variables tab : tableau MIN à MAX de entiers Supposons que ce tableau est rempli d'entiers inconnus mais triés dans l'ordre croissant. 88. 71. 77. var i. 90. 65. 76.tableau donné <.tableau donné'). 70.wikibooks. (* variables de boucle *) begin for i:=DEB to FIN-1 do begin j := i+1. writeln(' <. TriSelection(tab). 85. 83. 57. writeln(' <. 59.. 64. 72. 74. on l'affiche *) (* puis on le trie et on l'affiche à nouveau *) (* Tri sélection *) writeln('TRI SELECTION'). 73. afficher(tab). 95. end.t[j+1]). for j := FIN-1 downto i do if t[j+1]<t[j] then permuter(t[j].Wikibooks http://fr. afficher(tab). 68. 66. 63.. 75. 86. 87. 92. 69. 58. On supposera que l'entier indiqué par l'utilisateur est effectivement dans le tableau.tableau trié <. Voici un exemple d'exécution : 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] <. 82. 81. 36 sur 45 28/10/2011 13:48 . Aide Vous remarquerez que ce problème s'apparente au problème de recherche d'un mot dans le dictionnaire. begin (* pour chaque tri on recrée un tableau aléatoire.org/w/index. remplir(tab). 62.. trouve son indice dans le tableau.tableau donné <. 89.

php?title=Algorithmique_imp%C3%A9. (* on commence en recherchant dans tout le tableau *) 10. avec la deuxième moitié. deb ← MIN 11. Remarquez que la faiblesse de cette algorithme provient du fait qu'il fonctionne même quand le tableau n'est pas trié. Algorithme recherche_dichotomique 2. i) Fin L'algorithme suivant fonctionne mais à le défaut de continuer à parcourir le tableau même quand l'élément a été trouvé. si tab[i] > q 15. 5. vous avez certainement remarqué que lire le premier. 13. etc. 8.. 13. il n'exploite donc pas cet avantage trop important pour être négligé. 12. q . 11. recommence avec la première moitié du dictionnaire.org/w/index. 11. 9. Algorithme recherche Variables q : entier (* l'entier recherché *) i : entier (* ce sera l'indice de parcours *) Début Afficher("Donner l'entier à trouver") Lire(q) i ← MIN tantque tab[i] != q i ← i+1 ftq Afficher("L'indice où se trouve ". 14. 8. Variables 3.Algorithmique impérative/Version imprimable . puis passer au suivant. deb. Afficher("Donner l'entier à trouver") 8. Début 7.. 1. on cherche un mot dans un ensemble de mots inconnus mais triés. On ouvre le dictionnaire au milieu et un prend un mot au hasard. 4. En effet. 6. fin ← MAX 12.. Si vous avez déjà cherché un mot dans le dictionnaire. 4.wikibooks. 2. résultat) Fin Solution attendue Voici enfin la solution attendue.Wikibooks http://fr. L'algorithme parcourt le tableau du début à la fin et compare l'élément à l'entier indiqué par l'utilisateur.. 1. 7. répéter 13. 3. qui n'est pas celle attendue. si le mot qu'on cherche est avant. Algorithme recherche_mauvais Variables q : entier (* l'entier recherché *) i : entier (* ce sera l'indice de parcours pour la boucle *) resultat : entier (* l'indice résultat sera stocké ici *) Début 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 mémorise l'indice *) ftq Afficher("L'indice où se trouve ". s'il est après." est ". et ainsi de suite n'est pas la solution la plus efficace. alors fin ← i (* on est tombé trop haut : on ramène la borne supérieure *) 37 sur 45 28/10/2011 13:48 . q . 6. 10. regarder si c'est celui qu'on cherche. Dans la bonne moitié on prend un mot au milieu. 2. 7. fin : entiers (* deux entiers pour désigner le début et la fin de la zone dans laquelle on 6. Vous étiez peut-être arrivé à cette déduction seul ou en consultant l'aide mais vous avez compris que ce problème s'apparente à celui de la recherche dans un dictionnaire. La solution est donc l'algorithme de recherche dichotomique (du grec « dichotomie » : « couper en deux »)." est ". 5. 1. 9. 3. Lire(q) 9. Il s'arrête lorsqu'il est trouvé. 10. q : entier (* l'entier recherché *) 4. Solutions Solutions moyennes Voici une solution.. i = arrondir((fin+deb)/2) (* on prend i entre deb et fin *) 14.. i : entier (* ce sera l'indice de parcours pour la boucle *) 5. 12.

tab[5] := 24. 32. on veillera à respecter les consignes suivantes : Au lancement. MAX = 10. Afficher("L'indice où se trouve ". le tableau étant rempli à la main : 1. (* on commence en recherchant dans tout le tableau *) deb := MIN. jusqu'à tab[i]=q 19. Chaque joueur. 15. End. 25. Var tab : array [MIN. tab[9] := 90. Le joueur qui prend la dernière bille a perdu. 2. tab[2] := 9. sinon si tab[i] < q 17. le programme rappelle à qui est le tour. le programme rappelle les règles du jeu énoncées ci-dessus. i) 20. (* l'entier recherché *) i : integer. ou trois billes du tas. tab[4] := 24. tab[7] := 75. le jeu se joue à deux. 24. tab[1] := 4. Fin Traduction en Pascal Voilà sa traduction en Pascal.org/w/index. 6. alors deb ← i (* on est tombé trop bas : on ramène la borne inférieure *) 18. (* ce sera l'indice de parcours pour la boucle *) deb. 17. le programme rappelle combien il reste de billes dans le tas et donne une représentation graphique s'il reste moins de 30 billes (afficher sur une seule ligne un '. 26.. Readln(q). q . tab[10] := 99. Problématique On cherche à implémenter un jeu dont voici les règles : Règles du jeu : On commence avec un tas de billes. q . 5. 33. 11. fin : integer. 22." est ". repeat i := round((fin+deb)/2). Le contenu du tas de départ est demandé au lancement. en appelant les joueurs par leurs noms. tab[8] := 76.' est '. (* on est tombé trop bas : on ramène la borne inférieure *) until tab[i]=q. 13. 21. 34. on prend un nombre aléatoire entre 10 et 30 et on l'annonce. Si le nombre donné est 0 ou moins.MAX] of integer. Pour qu'on voie que le tour à passé. 3.. 23. l'affichage est vidé des informations et saisies du tour précédent. Les joueurs jouent l'un après l'autre. 29.php?title=Algorithmique_imp%C3%A9. 35. 8. peut retirer une. fin := MAX. En plus d'implémenter le mécanisme du jeu. Writeln('L''indice où se trouve '. deux. à son tour. 14. i). 12. 38 sur 45 28/10/2011 13:48 . 30. q : integer.wikibooks. 10. À chaque tour. 7. 9. Const MIN = 0. Les deux joueurs entreront leurs noms en début de partie. 27.Wikibooks http://fr. À chaque tour. Writeln('Donner l''entier à trouver : '). 18. 20. tab[6] := 74. tab[3] := 10..' par bille restante fera amplement l'affaire). 16. 28. 31. (* on prend i entre deb et fin *) if tab[i] > q then fin := i (* on est tombé trop haut : on ramène la borne supérieure *) else if tab[i] < q then deb := i. 16. program recherche_dichotomique.Algorithmique impérative/Version imprimable . 19. 4. (* deux entiers pour désigner le début et la fin de la zone dans laquelle Begin tab[0] := 1.

(* demande au joueur son coup .org/w/index. write('C''est au tour de ').nb_billes). un appel de clsrc() peut fonctionner également *) 37. (* nombre de billes à retirer lors d'un t 6. writeln('Règles du jeu :').php?title=Algorithmique_imp%C3%A9. 31. var 4. '). (* Affichage des règles *) 12. 34. repeat 36. (* random(n) renvoie un nombre entre 0 et n *) 29. 10. 42. 13. peut retirer une. writeln('Combien retirez-vous de billes ?'). 26. 44. 32. 28. (* nettoyer l'écran. tour : boolean. readln(joueur1). tour := not(tour).nb_billes. nb_billes : integer. writeln('Tricheur !'). nb_billes := 10+random(20). if (tour) then writeln(joueur1) else writeln(joueur2). 15. joueur1.wikibooks. 48. Implémentation en Pascal 1. readln(nb_billes). (* Recueil des informations nécessaires au jeu *) 19. while ((coup < 1) or (coup > 3) or (coup > nb_billes)) do begin 54. writeln('Combien retirez-vous de billes ?'). (* on change le joueur à qui est le tour *) 40. if (nb_billes <= 30) then for i:= 1 to nb_billes do write('. 23. 24.'). (* noms des joueurs *) 8. ainsi c'est le joueur 1 qui jouera en premier *) 33. joueur2 : string.. 50. Le programme gère les tentatives de triche et rappelle les règles si nécessaire. 20. deux. à son tour. 55. 16. gestion de la triche *) 52.'). le jeu se joue à deux.' billes. writeln('* Les joueurs jouent l''un après l''autre. writeln('* On commence avec un tas de billes. Première analyse Analyse approfondie Solution Trouver un algorithme pour ce jeu n'est pas aussi évident qu'il y parait.. i : integer.Algorithmique impérative/Version imprimable . (* on indique à qui est le tour *) 43. writeln('Il reste '. writeln('* On ne peut plus de billes qu''il n''y en a. 22. 39 sur 45 28/10/2011 13:48 . ou trois billes du tas. 21. writeln('Donner le nom du joueur 1 : '). 18. readln(coup).'). 38. writeln('* Le joueur qui prend la dernière bille a perdu. readln(joueur2). (* variable de boucle *) 9.'). writeln('Un nombre aléatoire est pris : '. for i:=1 to 20 do writeln(). À la fin du jeu. 53. end. 25. le gagnant est désigné par son nom. writeln('Donner le nombre de billes : ').Wikibooks http://fr. 58. 56. 14. 2. 51. 30. 49. writeln('* Chaque joueur. (* le nombre de billes dans le tas *) coup : integer. 39. 45. writeln('Donner le nom du joueur 2 : '). begin 11. writeln('* On ne peut retirer qu''entre une et trois billes. (* on démarre à false. 41. (* vrai si c'est le tour du joueur 1 *) 7.'). 46. tour := false. program billes.'). 35.'). 17. 57. (* affichage (textuel et graphique) du nombre de billes restant *) 47. 3. (* gestion du nombre de billes *) if (nb_billes <= 0) then begin 27. writeln(). 5.

coup 64. (* on inverse pour indiquer le gagnant *) 69.Algorithmique impérative/Version imprimable . (* l'interprétation booléenne de l'entrée au clavier.php?title=Algorithmique_imp%C3%A9. étant donnée une base de données de questions et de réponses correspondantes posent les questions et demande la réponse à un joueur. (* entrée clavier *) r : boolean. 17. 13. (* bases de données des questions *) réponses : tableau de 0 à NBQ de T (* bases de données des réponses *) On suppose ces tableaux remplis. nb_billes := nb_billes . until (nb_billes = 0). le score actuel et le nombre de questions restantes est affiché On ne demande pas que le programme ne pose pas deux fois la même question au cours d'une même partie. 15. *) rep_valide : boolean. program quiz. Le programme comptabilise les bonnes réponses et donne le score final. T est booléen.. (* réponse entrée valide *) score : integer. 11. (* bases de données des réponses *) nb_questions : integer. if (not(tour)) then write(joueur1) else write(joueur2). (* variable de boucle *) reponse : char. (* on a le coup voulu. const NBQ = 4.org/w/index. 62. on choisit un nombre aléatoire entre un et le nombre de questions dans la base de données. 6. si le nombre donné est nul ou négatif. 16.Wikibooks http://fr. 66.wikibooks. Données questions : tableau de 0 à NBQ de chaine. 14..NBQ] of string. 61. (* nombre de questions dans la base de données *) var questions : array [1. integer. 8. 18. ou chaine : à vous de choisir et d'assumer ce choix dans l'algorithme. À chaque question. Problématique On cherche à implémenter un programme qui. 67. (* le nombre de questions à poser *) numero_question : integer. writeln(' gagne !').. 4.. 7. 72. (* bases de données des questions *) reponses : array [1. Les réponses seront soit vrai/faux une réponse en toutes lettres une réponse sous forme de nombre Il est demandé d'implémenter seulement une de ces trois possibilités. réfléchir tout de même à un moyen de faire cela.NBQ] of boolean. 1. bien évidement la réponse à la question questions[i] est réponses[i]. 71.. 65. 9. (* le score de joueur *) begin (* remplissage de la base de données des questions *) 40 sur 45 28/10/2011 13:48 . Le nombre de questions à poser est demandé au début de la partie. on le joue *) 63. (* c'est le joueur qui a joué en dernier qui est perdant *) 68. end. (* l'indice d'une question dans la BdD *) i : integer. Solution Implémentation en Pascal L'auteur vous demande de l'excuser pour la piètre qualité du contenu de la base de données. 10. 70. 59. 3. end. 12. 2.. readln(coup) 60. 19. 5.

(* on choisit une question au hasard dans le BdD et on l'affiche *) 45. score := score+1. 25. 24.org/w/index. 50. gestion du score et de l'affichage en fonction de la répon 65. 55. else rep_valide := false. writeln('Mauvaise réponse :('). score := 0. (* informations finales *) 79. 41. end. 'N' : r := false. 64.php?title=Algorithmique_imp%C3%A9. 23. case reponse of 53. if r = reponses[numero_question] then begin 67. ' questions | SCORE : '. Résoudre dans ℝ les polynômes du second degré 41 sur 45 28/10/2011 13:48 . (* remplissage de la base de données des réponses *) 26.Wikibooks http://fr. 29. (* Information du joueur : nombre de questions restantes et score *) 42. end. 36. else begin 71. reponses[4] := true. 38. readln(nb_questions). 62. 76. (* initialisations *) 37. 'o' : r := true. 'n' : r := false. 47. end. 59. score) 80. 22. numero_question := 1+random(NBQ). 21. if rep_valide then begin (* on a la réponse du joueur. 34. 'V' : r := true. 'f' : r := false. On peut aborder le problème selon des difficultés croissantes : 1. 75. Tant pis pour le score *) readln(reponse). 69. 28. 56. rep_valide := true. questions[2] := 'faux et (vrai et (faux ou vrai))'. 20. 43. 52. reponses[3] := true. 31. 33. end. for i:=nb_questions downto 1 do begin 40.. score). if nb_questions <= 0 then nb_questions := random(NBQ)+1. 68. reponses[1] := true. 27. f(aux) o 74. end. (* demande et gestion du nombre de questions *) 32.Algorithmique impérative/Version imprimable .. (* si on ne la comprend pas. 51. 44. end 70. writeln('Bonne réponse \o/'). on passe à la question suivante. 'v' : r := true. Writeln('Donner le nombre de questions voulues pour ce quiz :'). Writeln('Il reste '. else begin writeln('je n''ai pas compris la réponse : entrer o(ui). 48. 30. writeln(questions[numero_question]). 77. Writeln('Score final : '. (* on lit la réponse et on essaie de la comprendre *) 49. 'O' : r := true. 60. v(rai). 63. 46. Résoudre dans ℝ les polynômes du premier degré 2. 54. 57. 39. questions[3] := 'L''algorithmique impérative c''est cool'.wikibooks. reponses[2] := false. questions[4] := 'si six scies scient six cyprès six-cent scies scient six-cent cyprès'. 78.i. 72. Problèmatique On souhaite réaliser un programme qui donne les solutions d'un polynôme dont les coefficients sont donnés par l'utilisateur. 61. 73. 35. questions[1] := 'La réponse est 42'. 'F' : r := false. 58. 66.

35. 37. (* procédure qui affiche le tableau passé en paramètre *) (* sur une ligne et sous la forme [a|b|c|d. 13.wikibooks. 33. FIN = 10. 31. ind1 := i. 40. 43.ecart_min_trouve) end.|l|m] *) var i : integer. 27. 10. 45. (* variable de boucle *) begin for i := DEB to FIN do t[i] := random(99). var i.. 46. 39. end. 3. write (t[FIN]. 14. program ecarts.FIN] of integer. Exemples : [1|10|4|6] : 6-4 = 2 [1|10] : 10-1 = 9 [5|5] : 5-5 = 0 Donner un algorithme qui. (* indices *) ecart_min_trouve : integer..'.t[ind2]. procedure remplir(var t : T_tabint). 47. end. trouve le plus grand écart entre deux éléments. 11. type T_tabint = array [DEB.php?title=Algorithmique_imp%C3%A9.ind2 : integer. 42. 18. 34.']'). 22. 28. 32. 42 sur 45 28/10/2011 13:48 . 44. 50. 49. 17.Algorithmique impérative/Version imprimable . begin ecart_min_trouve := MAXINT. ind2 := j. Solution Une implémentation testable en Pascal 1. 19..org/w/index.'|'). 51. (* variable de boucle *) begin write('['). end. 9. 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]). 24. 21. Résoudre dans ℂ les polynômes du second degré Problèmatique Donner un algorithme qui.t[ind1]. 38. 2. const DEB = 0. 3. étant donné un tableau d'entiers. 25. writeln('écart minimal trouvé : '. 30. 41. 16. (* variables de boucle *) ind1. end. 6. 8. procedure afficher(var t : T_tabint)... procedure RechercheEcartMin(t : T_tabint). 36. 48. étant donné un tableau d'entiers. 29. 5.j : integer.' = '. 26.Wikibooks http://fr. 4. (* procédure qui remplit le tableau passé en paramètre *) (* avec des nombres aléatoires pris entre 0 et 99 *) var i : integer. 7. 12. 23. 15. trouve le plus petit écart entre deux éléments. for i := DEB to FIN-1 do write(t[i]. 20.' . end.

. Au fil des remarques dans les problèmes posés. C'est l'objet du wikilivre Programmation Algorithmique. 52. 57. 58. Elle pose d'autres bases de départ.' = '. writeln('écart maximal trouvé : '. Grande question.tableau donné écart minimal trouvé : 83 . Toute une branche des mathématiques est dédiée au problème de la Calculabilité.max : integer. Algorithmique Comme nous l'avons vu.org/w/index. 73. nos ordinateurs d'aujourd'hui dérivent de la Machine de Turing. (* indices du plus petit élément et du plus grand élément *) begin min := DEB. procedure RechercheEcartMax(t : T_tabint). 64. fondamental dans cette algorithmique. for i:= DEB to FIN do begin if t[i] < t[min] then min := i. end.84 = 1 écart maximal trouvé : 84 . dans quel ordre de grandeur de temps (complexité) ? Algorithmique fonctionnelle Nous avons étudié l'algorithmique impérative : cette précision est effectivement nécessaire. var i : integer. var tab : T_tabint. 59. (* variable de boucle *) min. writeln(' <. 66. 43 sur 45 28/10/2011 13:48 . Une autre algorithmique existe.. 62. 55. notamment sur le problème du tri des tableaux..t[max]. 72. 56. begin remplir(tab). RechercheEcartMin(tab).54 = 30 Cette partie introduit un ensemble de sujets d'ouverture possibles pour la poursuite de l'apprentissage. 61. afficher(tab). 75.Algorithmique impérative/Version imprimable . 76. Elle est plus complexe à apprendre et à comprendre que l'algorithmique impérative mais la puissance de ses axiomes permet d'éviter de nombreux problèmes. 67. Exemple de résultat produit par le programme : [54|58|70|83|59|84] <.nous avons abordé la notion d'efficacité d'un algorithme. 54. il existe de multiples algorithmes connus dont l'étude est intéressante pour la culture de l'algorithmicien. end.'.t[max]-t[min]) end. 65.t[min]. 68. if t[i] > t[max] then max := i.Wikibooks http://fr. RechercheEcartMax(tab). 71. il s'agit de répondre à deux questions : peut-on obtenir un résultat en un temps fini (calculabilité) ? et si oui. Eh bien ce concept est formalisé : il est possible d'évaluer grâce aux mathématiques si un algorithme est plus efficace qu'un autre. 69. Cet exemple exploite le concept de la récursion.' . Il s'agit de la complexité Finalement. 63.wikibooks.tableau donné'). max := DEB. ?. 70. d'autres concepts. 60. 74. Notamment dans le problème sur la somme des n premiers entiers où nous avons clairement constaté qu'il existait deux façons d'obtenir un résultat : l'une prenant beaucoup plus de ressources (en temps et en mémoire) que l'autre.. Calculabilité et complexité Vous allez sûrement vous poser cette question un jour : Peut-on écrire un algorithme qui. 53.php?title=Algorithmique_imp%C3%A9.

Théorie des langages La langage algorithmique est composé de règles de syntaxe bien précises dont la raison peut paraître obscure. Nous avons également vu qu'un tableau est générique : c'est-à-dire qu'au moment de sa déclaration. Supposons maintenant que nous devions utiliser des formes d'information qui ne font pas partie de type de bases : les listes. les matrices.Algorithmique impérative/Version imprimable . Pourquoi le binaire ? Comment l'ordinateur peut-il simplement avec l'électricité stocker des données et effectuer des opération 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. Les langages de programmation ont également de nombreuses règles d'écriture. nous pouvons dire que tous ses éléments sont d'un type donné et choisir ce type. La seconde désigne la capacité à contenir des éléments de types différents. Cette structure de données pose un problème : elle occupe la mémoire en fonction de sa déclaration. généricité. Architecture des ordinateurs Nos algorithmes sont implémentés dans un langage informatique puis compilés pour être transformés en un fichier binaire exécutable.wikibooks. le tableau. les rationnels. Nous avons vu que les tableaux sont homogènes : c'est-à-dire qu'un tableau donné ne peut contenir qu'un seul type d'élément (celui précisé dans la déclaration du tableau). C'est ce que l'on appelle le gestion dynamique de la mémoire (par opposition à statique). la couleur. hétérogénéité et la création de nouveau types non-élémentaires sont autant de problèmes traités dans le wikilivre Structures de données.. Il serait plus judicieux de réserver l'espace au fur et à mesure de la demande. Note : attention à ne pas confondre la notion de généricité avec celle d'hétérogénéité. Ce qui signifie que si on ignore combien l'utilisateur va nécessiter d'indice. Qu'est ce qui détermine qu'un langage peut être compris par un ordinateur ? Pourquoi ne peut-on pas tout simplement écrire nos algorithmes en français littéral ? C'est l'objet de la théorie des langages.php?title=Algorithmique_imp%C3%A9. une branche des mathématiques permet de prouver qu'un algorithme fonctionne.. La plupart sont liées aux mathématiques. 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 impérative..org/w/index. Nous pourrions avoir besoin d'un tableau dont certains éléments seraient des entiers.Wikibooks http://fr. Il s'agit de l'Architecture des ordinateurs Correction des algorithmes De la même façon que pour la calculabilité et la complexité. d'autres encore des booléens. les arbres. Structures de données Nous n'avons jusqu'ici utilisé qu'une structure de données. Chacune de ces matières suscitera plus ou moins votre curiosité. 44 sur 45 28/10/2011 13:48 . il va falloir réserver le tableau le plus grand possible afin d'être sûr qu'il puisse contenir autant d'éléments que l'utilisateur souhaitera. etc. d'autres des chaînes. Algorithme itératif (impératif) Algorithme récursif (fonctionnel) Fonction factorielle(n : entier) Lexique i : entier (* variable de boucle *) résultat : entier (* le résultat final qu'on retournera *) Début si i=0 Fonction factorielle(n : entier) alors résultat←1 Début sinon début si n<=1 alors 1 sinon n*factorielle(n-1) résultat←1 (* on initialise le résultat *) Fin pour i de 2 à n résultat←résultat*i finpour fin finsi Fin C'est un bon complément et une bonne suite à l'apprentissage de l'algorithmique impérative : voir le wikilivre Algorithmique fonctionnelle.. Comment créer les éléments nécessaires au stockage de telle information quand un simple tableau ou un simple enregistrement ne suffisent plus ? Dynamicité. La première désigne la capacité à contenir des éléments d'un même type que l'on peut choisir en le fixant au moment de la déclaration. l'ADN. Il s'agit là de la problématique de l'hétérogénéité.

Certaines notions exposées dans ce module dépassent le cadre du présent ouvrage. Les textes sont disponibles sous licence Creative Commons attribution partage à l’identique .1992 .192 pages .france-ioi.L'algorithmique et le Pascal . d’autres termes peuvent s’appliquer.1997 .. il est donc à réserver aux courageux.org/w/index. Voyez les termes d’utilisation pour plus de détails.Algorithmique impérative/Version imprimable .95 pages . Éditions Paris : Delagrave .org/) [archive] : site francophone sur les Olympiades Internationales d'Informatique Récupérée de « http://fr. Algorithmique Langage Pascal Sur Wikipédia le langage Pascal Liens externes Le projet Euler (http://projecteuler. Pascal sur developpez.Wikibooks http://fr.developpez.Initiation à la programmation .wikibooks. il s'agit là de problèmes bien plus difficiles que ceux qui ont été abordés ici. 45 sur 45 28/10/2011 13:48 .php?title=Algorithmique_imp%C3%A9.wikibooks. Bibliographie Daniel Canevet .org/w/index.Collection Informatique et communication.ISBN 2-206-00698-7 (fr) Claude Delannoy .. Attention.net/) [archive] propose une collection de problèmes mathématiques à résoudre à l'aide de l'informatique et notamment de l'algorithmique impérative. Le site étant de surcroît en anglais.ISBN 2-212-08983-X (fr) Wikilivres Programmation Pascal Sur la Wikiversité Introduction générale à la programmation.com (http://pascal.Éditions Eyrolles .com/) [archive] France-IOI (http://www.php?title=Algorithmique_imp%C3%A9rative/Version_imprimable&oldid=139706 » Dernière modification de cette page le 30 octobre 2007 à 15:10.