Vous êtes sur la page 1sur 9

Algorithme et Programmation

Certains voient, ` tort, dans lordinateur une machine pensante et intelligente, capable de rsoudre bien des a e probl`mes. En fait, celui-ci ne serait capable de rien si quelquun (le programmeur en loccurence) ne lui avait e fourni la liste des actions ` excuter. Cette description doit tre faite de mani`re non ambige car il ne faut pas a e e e u sattendre ` la moindre interprtation des ordres fournis. Ils seront excuts de mani`re purement mcanique. a e e e e e De plus, les oprations lmentaires que peut excuter un ordinateur sont en nombre restreint et doivent tre e ee e e communiques de faon prcise dans un langage quil comprendra. Le probl`me principal du programmeur est e c e e donc de lui dcrire la suite des actions lmentaires permettant dobtenir, ` partir des donnes fournies, les e ee a e rsultats escompts. Cette description doit tre prcise, doit envisager le moindre dtail et prvoir les diverses e e e e e e possibilits de donnes. e e Cette marche ` suivre porte le nom dalgorithme dont lEncyclopaedia Universalis donne la dnition suivante : a e Un algorithme est une suite nie de r`gles ` appliquer dans un ordre dtermin ` un nombre ni de donnes e a e ea e pour arriver, en un nombre ni dtapes, ` un certain rsultat, et cela indpendamment des donnes. e a e e e En fait, la notion dalgorithme est tr`s ancienne, et est indpendante de linformatique et des machines : les e e marchands, par exemple, avaient recours ` certains algorithmes pour calculer des intrts etc ... a ee De mme, au vu de la dnition prcdente, une recette de cuisine est un algorithme, tout comme une notice de e e e e montage dun meuble en kit. Dans ces derniers cas, on voit bien la ncessit dun algorithme clair (comprhensible e e e par tous), le plus gnral possible (pour rpondre au plus de cas possibles) et rapide (ecace). e e e Structure dun algorithme Structure dune recette de cuisine : on commence par numrer tous les ingrdients ncessaires ; puis on dcrit e e e e e les tapes successives ` faire. Enn, si lalgorithme est bon, un merveilleux gateau sort du four ! e a En fait, tout algorithme se dcompose en 3 parties. La premi`re partie concerne les entres : on liste toutes les e e e donnes ncessaires. La deuxi`me partie regroupe toutes les instructions ; et la troisi`me est la sortie ou rsultat. e e e e e Programmation Un programme est la traduction dun algorithme en langage comprhensible par la machine. e Nous ne verrons que le langage Turbo-Pascal.

Structure gnrale dun programme en Turbo-Pascal e e


1. en-tte du programme e 2. dclaration ventuelle des constantes, des types et des variables e e 3. dclaration ventuelle des procdures et fonctions e e e 4. corps du programme Explications succintes : 1. syntaxe : PROGRAM nom du programme ; 2. il faut dclarer tous les objets utiliss dans le corps du programme : cest une exigence du langage Turboe e Pascal. syntaxe : CONST a=2; x=3.5; VAR i,k,n : INTEGER; les entiers prennent leurs valeurs dans [[32768, 32767]] x,a,b : REAL; x,a,b sont des rels e test : BOOLEAN; variable de type boolenne : sa valeur est true e ou false. T : ARRAY [1..10] of integer ; tableau de 10 cases ` coecients entiers a mat : ARRAY[1..3,1..3] of real ; tableau ` 3 lignes 3 colonnes (matrice carre a e dordre 3) ` coecients rels. a e La dclaration des types sera vue ultrieurement. e e 1

3. les fonctions et procdures seront vues au second semestre : ces sous-programmes permettent de structurer e davantage un programme. 4. cest le corps du programme : on liste les instructions ` excuter. a e Cette partie est donc la traduction de lalgorithme proprement dit. syntaxe : BEGIN instructions ; . . . END. Sauf mention contraire, chaque ligne de commande se nit par un ;. On peut ajouter des commentaires au programme pour amliorer la lisibilit en expliquant certaines instruce e tions ou noms de variable. Ces commentaires peuvent tre insres nimporte o` du moment quils sont placs e ee u e entre accolades : { blablabla }

1
1.1

Variables et actions lmentaires ee


Les variables

En informatique, une variable est une case mmoire, rserve pour stocker la future valeur de cette variable e e e (valeur qui peut tre modie au cours du programme). e e Une variable doit avoir un nom (ou identicateur), ainsi quun type (entier, rel etc...), qui dnit la taille de la e e case mmoire. Ces deux attributs sont dclars simultanment dans la partie 2. : e e e e syntaxe : VAR i :INTEGER ; note :REAL ; Remarque sur les identicateurs : vous pouvez choisir nimporte quel mot (non rserv biensr), du moment e e u quil ne contient ni espace, ni accents, ni apostrophes. Conseil : choisir un mot ou une lettre vocatrice ! e Puis dans le corps du programme, une variable doit tre initialise. Deux moyens sont possibles : e e par lecture ex : writeln(crire les valeurs de a et b); e quand le programme sxcute, on voit appara ` lcran : crire les valeurs de a et b. e e tre a e e readln(a,b); les deux valeurs alors crites par lutilisateur (spares par un espace ou un retour ` la ligne) sont aectes e e e a e aux variables a et b. par aectation ex : x :=1 ; {x reoit la valeur 1} c ou si a et b ont t initialises comme prcdemment, x :=(a+b)/2 aecte ` x la valeur (a+b)/2. ee e e e a Attention : 1. si lon crit a:=b, il faut que les variables a et b soient de mme type. e e 2. Ne pas confondre := avec le = rserv aux donnes constantes et au symbole de comparaison. e e e

1.2

Oprations lmentaires e ee

Ces oprations dpendent du type des objets (variables ou constantes). Attention, les oprations sont ` eectuer e e e a entre des objets de mme type ! e Oprateurs et fonctions arithmtiques e e oprateurs e entre(s) e sortie commentaires +-* rel/entier e rel /entier oprations lmentaires e e ee / rel /entier rel e e le type de sortie peut donc tre dirent du type de e e lentre e div mod entier entier quotient et reste de la division euclidienne : 37 div 5 donne 7 et 37 mod 5 donne 2. exp, ln, sqrt rel/entier e rel e sqrt est la racine carre e sqr rel/entier e rel/entier e carr e trunc rel e entier partie enti`re e abs rel/entier e rel/entier e valeur absolue 2

Oprateurs relationnels e =, <> pour =, <, >, <= pour , >= pour . Les variables dentres sont de type entier/rel ; la variable de sortie est de type boolen. e e e Ces oprations sont principalement utiliss dans les instructions conditionnelles (que lon reverra ultrieurement) : e e e if oprateur e then instructions (else instructions) while oprateur e do instructions repeat instructions until operateur Oprateurs logiques e Il y en a 3 : not, or et and ; qui ne seront utiliss que dans les instructions conditionnelles ci-dessus. e Par exemple : (x < 1) AND (x > 1) ou encore (x > 0) OR (y = 0), peuvent tre une condition du if. e

2
2.1

Instructions conditionnelles
instructions

Une instruction est dite simple si elle se rduit ` une seule commande : writeln(bonjour) ou s:=0; e a Sinon, linstruction est dite compose : on peut aussi parler de groupe dinstructions. e

2.2

if then else

Cette instruction rpond ` lattente : e a Si une condition est vraie (par exemple x = 0), alors on veut eectuer une certaine instruction (par exemple, diviser par x) et sinon, on en eectue une autre. La syntaxe est la suivante : instructions A ; IF condition THEN BEGIN instructions B ; END ELSE BEGIN instructions C ; END; instructions D ; Remarques : i. Si les instructions B ou C sont simples, le BEGIN END; correspondant est inutile. ii. Le ELSE est facultatif ; mais il ne doit pas tre prcd immdiatement dun ;. e e e e e Exemples de condition : x = 0 ou x >= 10 o` x est une variable dnie prcdemment. u e e e Les conditions peuvent tre composes : par exemple (0 < x) AND (x <= 1) (qui signie 0 < x 1). e e Attention : ne pas confondre x := 3 et x = 3 lorsque x est une variable. x := 3 est une aectation : elle correspond ` linstruction donner ` x la valeur 3. a a x = 3 est une condition boolenne (proposition qui est vraie au fausse) : e elle correspond ` la question x est-il gal ` 3 ?. Ces conditions boolennes ne seront prsentes que dans les a e a e e instructions conditionnelles (if then else) ou les boucles conditionnelles (while et repeat until).
A

vrai condition

faux

3
3.1

Boucles itratives e
Boucle FOR

Cette instruction semploie pour rpter une suite dinstructions n fois, lorsque n est connu ` lavance. e e a La syntaxe est la suivante :

instructions A ; FOR i := n1 TO n2 DO BEGIN instructions B ; END; instructions C ; Remarques : i. Le groupe dinstructions B est eectu une premi`re fois avec i = n1 , une deuxi`me avec i = n1 + 1,...., e e e puis une derni`re avec i = n2 . Attention la variable compteur i doit tre dclare en 2 ! e e e e ii. n1 et n2 sont deux nombres entiers ou alors variables de type entier, dclares et initialises. e e e iii. Si linstruction B est simple le BEGIN END; correspondant est inutile. iv. Si n1 > n2 , le groupe dinstructions B nest pas excut. e e Variante : Si lon veut aller de n2 ` n1 dans lordre dcroissant, la syntaxe devient : a e FOR i := n2 DOWNTO n1 DO .

3.2

Boucles conditionnelles

Par opposition ` linstruction rptitive FOR, les instructions WHILE et REPEAT semploient d`s que lon ne a e e e conna pas ` lavance le nombre ditrations ` eectuer. t a e a 3.2.1 Boucle WHILE

On rpte une suite dinstructions tant quune certaine condition est vraie. e e La syntaxe est la suivante :
A

instructions A ; WHILE condition DO BEGIN instructions B ; END; instructions C ;

vrai

faux condition

C Remarques : i. Les instructions B peuvent ne pas tre excutes du tout (si d`s le dpart la condition est fausse) e e e e e ii. Si linstruction B est simple, le BEGIN END ; correspondant est inutile iii. Attention de bien vous assurer, avant de lancer le programme, que la condition devient fausse au bout dun certain temps. Sinon, le programme ne sarrtera jamais. e

3.2.2

Boucle REPEAT

On rpte un groupe dinstructions jusqu` ce quune condition soit vraie. e e a La seule dirence avec la boucle WHILE est que dans la boucle REPEAT les instructions B sont excutes avant e e e de tester la condition donc sont excutes au moins une fois. e e La syntaxe devient : A instructions A ; REPEAT instructions B ; UNTIL condition ; instructions C ;

faux

condition

vrai

Remarques : C i. REPEAT UNTIL permet de dlimiter linstruction B, donc quelle soit simple e ou compose, il ny a pas besoin de BEGIN END;. e ii. Attention de bien vous assurer, avant de lancer le programme, que la condition devient vraie au bout dun certain temps : sinon le programme ne sarrtera jamais. e 4

4
4.1

Fonctions et Procdures e
Notion de sous-programme

Il peut arriver que lon doive utiliser une mme squence dinstructions ` dirents endroits dun programme. e e a e Il est alors judicieux de crer un sous-programme (fonction ou procdure) dont le code sera dni une fois pour e e e toutes dans ltape 3, et que lon appellera dans le corps du programme aux dirents endroits souhaits. e e e Avantage : le corps du programme est beaucoup plus court et plus lisible puisque lon vite ainsi des rptitions e e e de code. Exemple : le calcul de n! ncessite le calcul de 3 factorielles ; on pourra crire une fonction factoe e k!(n k)! rielle en amont, et ensuite lappeler 3 fois.
n k

Exemple bis : dans la dichotomie, on fait appel ` une fonction ` chaque tape. Dans notre exemple ctait la a a e e fonction f (x) = ex 2 qui est facile ` crire ` chaque fois. Mais si lon avait voulu faire de la dichotomie sur une ae a fonction plus complexe, il aurait t ncessaire de crer une fonction turbo-pascal. ee e e Un sous-programme a la mme structure quun programme mais le END du corps du sous-programme est suivi e dun ; et non dun . Il faut dclarer ces sous-programmes dans ltape 3., juste avant le corps du programme. e e Toutes les variables utilises dans un sous-programme doivent tre dnies soit comme des param`tres dentre e e e e e soit comme des variables locales (les variables du programme sont appeles variables globales). Mais lappel du e sous-programme se fait dans le CORPS du programme (tape 4). e Il y a deux sortes de sous-programmes : les fonctions et les procdures. e

4.2

Les fonctions

Une fonction est un sous-programme qui fournit un rsultat ` partir des donnes quon lui apporte (les e a e param`tres dentres) : la notion de fonction en Turbo-Pascal est assez proche de la notion de fonction en e e mathmatiques. e Une fonction se dclare comme suit : e FUNCTION Nom-de-la-fonction (Nom-du-param`tre : Type-du-param`tre) : Type-sortie ; e e VAR Dclaration des ventuelles variables LOCALES (ou constantes via CONST) ; e e BEGIN Corps de la fonction (liste des instructions) ; Nom-de-la-fonction := Valeur-sortie ; END ; Remarques : Une fonction ne peut avoir en sortie quun rel ou un entier. e Il peut y avoir plusieurs param`tres dentres dans une fonction. Ils seront alors spars par un ; dans la e e e e dclaration mais par une , lors de lappel de la fonction dans le corps du programme. e Exemple 1 : PROGRAM fonction; FUNCTION ffff(x : REAL) :REAL ; BEGIN ffff := 3*sqr(x)+2; END; BEGIN write(ffff(3)); END. Exemple 2 : a) crire la fonction Turbo-pascal factorielle, qui ` un entier positif n associe n!. e a b) lintgrer dans un programme qui demande deux entiers n et k n ` lutilisateur, et qui renvoie e a PROGRAM ex2; VAR k,n:INTEGER; FUNCTION factorielle (N : INTEGER) : INTEGER ; VAR i,F : INTEGER ; BEGIN F:=1; FOR i:=1 TO N DO 5

n k

F:=F*i; factorielle :=F; END; BEGIN write(Entrer deux entiers n et k);readln(n,k); write(factorielle(n)/(factorielle(k)*factorielle(n-k)); END.

4.3

Les procdures e

Contrairement aux fonctions, la procdure ne fournit pas un rsultat mais cre une action ou une suite dace e e tions (instructions) : on utilisera les procdures principalement lorsquon manipulera des tableaux (matrices ou e autres). En eet, une fonction ne permet pas de modier un tableau puisque son but est de renvoyer un rel. e Sa syntaxe est analogue ` la syntaxe dune fonction : a PROCEDURE Nom-de-la-procdure (Nom-du-param`tre : Type-du-param`tre) ; e e e VAR Dclaration des ventuelles variables LOCALES (ou constantes via CONST) ; e e BEGIN Corps de la procdure (liste des instructions) ; e END ; Variante : PROCEDURE Nom-de-la-procdure (VAR Nom-du-param`tre : Type-du-param`tre) ; e e e Comprenons la dirence entre ces deux syntaxes sur un exemple : e PROGRAM proc; VAR A:REAL; PROCEDURE P(x:REAL); BEGIN write(x); x:=x+1; writeln(x); END; BEGIN A:=5; P(A); write(A); END. Lachage est : 56 5 Le Turbo-pascal a cre une variable temporaire x qui e prend la valeur 5 puis la valeur 6 et qui est ensuite dtruite ` la n de la procdure. Mais la variable A e a e est inchange. e PROGRAM proc; VAR A:REAL; PROCEDURE P1(VAR x:REAL); BEGIN write(x); x:=x+1; writeln(x); END; BEGIN A:=5; P1(A); write(A); END. Lachage devient : 56 6 En eet, lors de lexcution de la commande P1(A) ; e Turbo -Pascal ne cre plus de variable x locale, mais e utilise la variable A pour faire les instructions. Apr`s e le traitement A est donc modie et prend la valeur 6. e Cette variante au niveau de la syntaxe permet donc de changer des variables globales.

Remarques : i. On dira dans la premi`re syntaxe, que le param`tre dentre passe par valeur (on nutilise que la valeur e e e de A dans P), alors que dans la deuxi`me, il passe par variable (la variable A est utilise et change e e e dans P1). ii. Dans un passage par valeur, premi`re syntaxe, le param`tre dentre peut tre nimporte quoi du type e e e e dni : P (5) a un sens. Alors que dans un passage par variable, le param`tre dentre doit tre ncessairement e e e e e une variable : ainsi dans lexemple prcdent, P1(5) , ou P1(x+5) na aucun sens. e e

5
5.1
5.1.1

Les tableaux
Dclarer un tableau e
Tableau ` une entre a e

Utilit des tableaux ? e 1. Pour stocker des donnes : dans la feuille de TP 7, on stockera les dirents rsultats dune exprience alatoire e e e e e dans un tableau, avant de les analyser . 2. Pour travailler sur des matrices ou des polynmes. o Avant de pourvoir utiliser un tableau, il faut le dclarer comme variable : e VAR tableau : ARRAY[deb..fin] OF (type) ; Dans cette syntaxe, deb et fin sont de type integer, sous la contrainte deb fin. La variable tableau est alors un tableau compos de colonnes numrotes de deb ` fin. Ce tableau comportera donc fin-deb+1 e e e a cases, remplies par des lments de type type. Chaque case du tableau est alors une variable, identie par ee e tableau[i]. Au dpart, le tableau est vide : il faudra donc penser ` initialiser toutes les cases du tableau avant e a de lutiliser ! Exemple : Les coordonnes dun point A du plan peuvent tre reprsentes par le tableau suivant : e e e e VAR coordA : ARRAY[1..2] OF REAL ; coordA[1] donne labscisse du point A et coordA[2] lordonne. e Exemple : le polynme P (x) = 1 + 2x + 4x3 + 5x6 3x9 , en tant que polynme de degr infrieur ou gal ` 10, o o e e e a peut tre reprsent par le tableau e e e 1 2 0 4 0 0 5 0 0 -3 0 Il sera donc dclar par : VAR P : ARRAY[0..10] OF INTEGER ; e e 5.1.2 Tableau ` double entres a e

Exemple : Une matrice A de M2,3 (R) sera dclar par la syntaxe e e VAR A : ARRAY[1..2,1..3] OF REAL ; tandis quune matrice B de M8,5 (R) ` coecients entiers le sera par a VAR B : ARRAY[1..8,1..5] OF INTEGER ;

5.2

Crer un type tableaux e

Rappel : la syntaxe dune fonction comme dune procdure demande la connaissance du type du param`tre e e dentre : FUNCTION f (x : REAL) : INTEGER ; ou ... e Pour pouvoir appliquer des fonctions ou des procdures ` un tableau, il faut donc dclarer le type de ce e a e tableau en amont. La dclaration dun nouveau type se fait juste avant la dclaration des variables (tape 2 dans e e e la structure gnrale dun programme). e e dclarations des types : e TYPE polynome = ARRAY[0..10] OF real ; Ensuite, se fait la dclaration des variables : e VAR P,Q,R : polynome ; D`s que lon a dni un tel type polynome, on peut appliquer une fonction ou une procdure ` un polynome. e e e a Attention de garder en mmoire quune fonction ne pourra jamais renvoyer un polynme : sa sortie ne peut tre e o e quun rel (ou un entier). Par contre, si la procdure fait un passage par variable, elle pourra changer la variable e e polynme dentre. o e Exemple : Lorsque lon souhaitera travailler commodment avec plusieurs matrices de M3 (R), et crer des e e fonctions et procdures sy rapportant, on procdera en dclarant : e e e TYPE matrice = ARRAY[1..3,1..3] OF real ; VAR A, B, C : matrice ;

5.3

Oprations sur les tableaux e

La seule opration globale que Turbo-Pascal sait raliser sur les tableaux est laectation en bloc des valeurs e e dun tableau dans un tableau identique (mme dimension, et mme type de contenu) : si R et A sont deux tels e e tableaux, la commande R:=A; remplace le contenu du tableau R par celui du tableau A. Toutes les autres oprations portant sur les tableaux se font case par case, donc en utilisant des boucles. Ce e dfaut engendre souvent des temps de traitement importants, en particulier pour les tableaux de grande taille e (en plus de la consommation despace mmoire rserv pour la cration de ces tableaux). e e e e Rappel : toutes les cases dun tableau, tant des variables, doivent tre initialises (lecture ou aectation). e e e Tableaux ` 1 dimension a Dclarer le tableau : e VAR T : ARRAY[1..50] of REAL; Dclarer le type puis une variable de ce type : e TYPE tab = ARRAY[1..50] of REAL; VAR T:tab; Initialiser la 15-i`me case de T ` 0 : e a T[15]:=0 ; Initialiser la 18-i`me case de T ` une valeur entre par lutilisateur : e a e WRITELN(Entrer la valeur de la case 18); READLN(T[18]); Acher la valeur de la case 25 du tableau : WRITELN(T[25]); Initialiser tout le tableau T ` 0 a FOR k:=1 TO 50 DO T[k]:=0; Initialiser tout le tableau T ` des valeurs entres par lutilisateur : a e FOR k:=1 TO 50 DO BEGIN WRITELN(Entrer la valeur de la case ,k); READLN(T[k]); END; Acher tout le tableau : FOR k:=1 TO 50 DO WRITELN(T[k]); Tableaux ` 2 dimensions a Dclarer le tableau : e VAR U : ARRAY[1..50,1..40] of REAL; Initialiser la case situe ` la 11-i`me ligne et 23-i`me colonne de U ` 0 : e a e e a U[11,23]:=0 ; Initialiser la case situe ` la 8-i`me ligne et 27-i`me colonne de U ` une valeur entre par lutilisateur : e a e e a e WRITELN(Entrer la valeur de la case situe ligne 8 colonne 27); READLN(U[8,27]); e Acher la valeur de la case situe ` la ligne 25, colonne 17 du tableau : e a WRITELN(U[25,17]); Initialiser tout le tableau U ` 0 : a FOR i:=1 TO 50 DO FOR j:=1 TO 40 DO U[i,j]:=0; Initialiser tout le tableau U ` des valeurs entres par lutilisateur : a e FOR i:=1 TO 50 DO FOR j:=1 TO 40 DO BEGIN WRITELN(Entrer la valeur ligne ,i, colonne ,j); READLN(U[i,j]); END; 8 (autre exemple : VAR T : ARRAY[2..8] of INTEGER;)

Acher tout le tableau : FOR i:=1 TO 50 DO FOR j:=1 TO 50 DO WRITELN(U[i,j]);

Simulation des lois de probabilit usuelles e

Introduction : Supposons que lon ait une pi`ce truque dont on veut dterminer la probabilit p dobtenir face. e e e e Le moyen exprimental ` notre disposition est de lancer un tr`s grand nombre de fois la pi`ce, par exemple e a e e nf n = 1000, et de compter le nombre doccurences face : nf . Alors, le rapport n appel frquence dapparition e e de face, est une approximation de p, dautant meilleure que n est grand. Plus prcisment, si lon ralise n rptitions indpendantes dune mme exprience alatoire de dpart, la e e e e e e e e e e frquence de russite dun certain vnement tend vers la probabilit de cet vnement lorsque n +. e e e e e e e Donc pour avoir une valeur approche de cette probabilit, il faut eectuer un grand nombre de fois la mme e e e exprience alatoire, ce que permet loutil informatique en tr`s peu de temps ! ! Il sut que le langage utilis e e e e puisse crer du hasard : pour cel`, il doit possder un gnrateur de nombres alatoires. e a e e e e Syntaxe : Pour activer le gnrateur de nombres pseudo-alatoires de Turbo-Pascal, il faut insrer dans le dbut du corps e e e e e du programme, la commande Randomize ;. Ensuite, deux fonctions sont prdnies dans Turbo-Pascal : e e i. random ; sans argument retourne un rel compris entre 0 et 1. e ii. random(n); o` n est un entier > 0 retourne un entier compris entre 0 et n 1 avec quiprobabilit. Auu e e trement dit, cette fonction random (n) permet de simuler la loi uniforme sur {0, 1, 2, . . . , n 1}.

Vous aimerez peut-être aussi