You are on page 1of 9

Ecriture des algorithmes

Un algorithme est une suite d'actions effectuer pour obtenir, partir de donnes initiales, la solution
d'un problme. Comme il existe souvent plusieurs manires de rsoudre un problme, on peut imaginer
plusieurs algorithmes plus ou moins diffrents.

Les variables
Ces donnes ainsi que les rsultats des calculs intermdiaires ou finaux, sont rangs dans des "cases-
mmoires" appeles variables que l'on repre par des identificateurs (que l'on choisira autant que possible
significatifs).
Les contenus des variables sont de nature diverse, mais une variable ne peut contenir au cours du
traitement que des donnes de mme nature :

Le type d'une variable est l'ensemble des valeurs possibles de son contenu. On distingue :
Les types lmentaires :
- les types numriques : ENTIER et REEL.
- le type BOOLEEN (deux valeurs possibles : "vrai", "faux")
- le type CARACTERE
Les types structurs :
- le type TABLEAU ( une ou plusieurs dimensions)
- le type CHANE (ou chane de caractre)
- le type ENREGISTREMENT (ou type compos)
Ds le dbut du traitement, on indique (par exemple, dans un tableau), la liste des variables qui seront
utilises en prcisant pour chacune d'elles le nom, le type ainsi que le rle de cette variable dans
l'algorithme.

Les instructions
Les instructions lmentaires : elles sont au nombre de quatre :
- La lecture au clavier du contenu d'une ou plusieurs variables :
LIRE(variable) ; LIRE(A,B,C)
Remarques : la lecture au clavier s'achve ds que l'on presse la touche "entre" (ou "retour
chariot"). La donne tape doit tre du mme type que la variable qui la reoit.
- L'affichage l'cran (ou l'dition sur imprimante) d'un objet (nombre, chane, ...) du contenu
d'une ou plusieurs variables, d'une expression, ...
ECRIRE('Prix de revient = ',P_Achat + Frais)
- L'affectation (donner une valeur au contenu d'une variable) :
Nom de Variable Expression (la flche peut se lire reoit)
ex : P_Vente P_Achat + Frais + Bnfices
- L'appel d'une procdure (algorithme dfini par ailleurs)

Les instructions composes


- Un bloc d'instructions est une suite d'instructions (lmentaires ou non) spares par des points-
virgules et encadres des deux mots DEBUT et FIN. Dans la suite, "instruction" dsignera soit une
instruction lmentaire soit un bloc.
- Les instructions conditionnelles :
L'alternative : On effectue un test pour choisir entre deux instructions possibles :
SI <condition> ALORS instruction_1
SINON instruction_2;

La conditionnelle simple : mme structure mais la deuxime instruction est vide :


SI <condition> ALORS instruction_1
SINON rien;
La conditionnelle multiple :

1
SELON NomVar
Cas_1 : Instruction_1;
Cas_2 : Instruction_2;
...
Cas_n : Instruction_n;
FIN;

- Les instructions rptitives (ou boucles): une mme squence est rpte un certain nombre de fois.
La boucle POUR : on connat exactement le nombre de rptitions effectuer. On utilise un
compteur de boucles :
POUR i VARIANT DE a A b EFFECTUER Instruction

La boucle REPETER : On rpte l'excution de l'instruction jusqu' ce que soit ralise une
condition de sortie de boucle :
REPETER instruction JUSQU'A <condition de fin>

La boucle TANT_QUE : elle fonctionne comme la prcdente, sauf que le test d'entre dans la
boucle est effectu avant l'excution de l'instruction :
TANT_QUE <condition> EFFECTUER instruction
Remarque : Cette dernire boucle est la plus gnrale. Si la condition d'entre est fausse ds le dbut,
l'instruction n'est jamais effectue, alors qu'elle est excute au moins une fois dans la boucle
REPETER.

2
Exercices : Savoir excuter un algorithme lmentaire

I. Dans cet algorithme a, b, c dsignent des variables numriques


dbut
a5;
b12;
c2*a-b;
b2*b-c*3;
ab-a*4+c*5;
crire('A=',a,' B=',b,' C=',c);
fin.
1) Excuter cet algorithme
2) Le rsultat constat sur a est-il vrai quelles que soient les valeurs initiales des variables a et b ?

II. Quelle est l'action effectue par l'algorithme suivant ?


dbut
lire(a,b);
aa+b;
ba-b;
aa-b;
crire('A=',a,' B=',b);
fin.

III.1) Effectuer l'algorithme suivant pour les triplets (a,b,c) :


a) (2,-1,3) b) (-1,6,0) c) (7,4,3)
2) Que ralise cet algorithme ?
dbut
lire(a,b,c); {a,b,c sont des entiers}
si a>b
alors si a>c
alors si b>c
alors crire (a,' ',b,' ',c)
sinon crire (a,' ',c,' ',b)
sinon crire(c,' ',a,' ',b)
sinon si a>c
alors crire(b,' ',a,' ',c)
sinon si b>c
alors crire (b,' ',c,' ',a)
sinon crire (c,' ',b,' ',a);
fin.

IV. Excuter le programme suivant pour n=5 puis 10. Que ralise-t-il ?
Dbut
lire(n); {n,p,i sont des entiers}
p1;
Pour i 1 n faire pp*i;
crire('P=',p);
fin.

3
TD : Algorithmes sur les nombres

1) Ecrire un programme changeant les contenus de deux variables a et b.

2) Soient a,b,c trois variables numriques. Ecrire un programme permutant les contenus de ces
variables de faon que l'on ait : a b c.

1
3) La suite ( un ) est dfinie par u0 = 0 et un+1 = 2un +3. Faire afficher les termes u1 un, n tant saisi au
clavier.

4) Conjecture Syracuse (ou de Kollek, ou de Collatz) :


La suite ( un ) est dfinie par l'entier naturel u0 et par la relation suivante :
un
si un est impair un+1 = 3un + 1 et si un est pair un+1 = , u0 tant saisi au clavier.
2
Faire afficher tous les termes de la suite jusqu' ce que l'un d'eux soit gal 1.

5) Algorithme Babylonien ou mthode de Newton pour calculer a


1 a
En partant de a et u0 saisis au clavier, avec la formule de rcurrence un+1 = 2(un + u ), donner le
n
un+1 - un
premier terme de la suite vrifiant :
un <eps=10
-5

6) La suite de Fibonacci est dfinie par u0 = u1 = 1 et par la relation : un+2 = un+1 + un.
Faire afficher les termes u2 un, n tant saisi au clavier.

7) Faire afficher la somme S1(n) = 1 + 2 + ... + n, n tant saisi au clavier.


Reprendre l'exercice avec la somme S2(n) des carrs puis la somme S3(n) des cubes des entiers de 1 n.


8) On dmontre que la limite de la somme S(n) suivante, lorsque n tend vers +, est gale 4 :
1 1 1 (-1)n
S(n) = 1 - 3 + - + ... +
5 7 2n+1
Faire afficher une valeur approche de en calculant S(n), n tant saisi au clavier.

9) Un nombre est parfait s'il est gal la somme de ses autres diviseurs. C'est le cas, par exemple, de
6 = 1 + 2 + 3 ou de 28 = 1 + 2 + 4 + 7 + 14.
Ecrire un programme testant si un nombre est parfait.
Modifier ce programme pour faire afficher la liste des nombres parfaits compris entre deux entiers saisis
au clavier.

10) Un nombre est premier s'il admet exactement deux diviseurs : lui-mme et l'unit.
Ecrire un programme testant si un nombre est premier.
Modifier le programme prcdent pour faire afficher la liste des nombres premiers compris entre deux
entiers saisis au clavier.

4
Program Algorithmes_sur_les_nombres;

Uses CRT;

Var numchoix:Integer;

Procedure suite;
Begin
writeln;
write('Presser la touche entre pour continuer');
readln;
end;

Procedure exo1;
Var a,b,c:integer;
Begin
write('Entrez un nombre entier A : ');readln(a);
write('Entrez un nombre entier B : ');readln(b);
c:=a;a:=b;b:=c;
writeln('aprs permutation, on a : A=',a,' B=',b);
suite;
end;

Procedure exo2;
Var a,b,c,temp:integer;
Begin
write('entrez trois nombres entiers spars par un espace : ');
readln(a,b,c);
if a>b then begin
temp:=a;a:=b; b:=temp;
end;
if b>c then begin
temp:=b; b:=c;c:=temp;
end;
if a>b then begin
temp:=a;a:=b;b:=temp;
end;
writeln('Aprs classement, on a : ',a,' <= ',b,' <= ',c);
suite;
end;

Procedure exo3;
Var n,i:Integer;
u:real;
Begin
Write('Entrez la valeur de n : ');readln(n);
u:=0;
for i:=1 to n do begin
u:=u/2+3;
writeln('u(',i,') = ',u:10:8);
end;
suite;
end;

5
Procedure exo4;
Var u,n:integer;
Begin
write('entrez le premier terme de la suite : u(0)=');readln(u);
n:=0;
while u<>1 do begin
if odd(u) then u:=u*3+1 else u:=u div 2;
n:=n+1;
writeln('u(',n,') = ',u);
end;
suite;
end;

Procedure exo5;
Const eps=1e-10;
Var a,u,v:real;
n:integer;
Begin
write('Entrez un nombre positif : ');readln(a);
u:=1;n:=1;
repeat
v:=u;
u:=(u+a/u)/2;
n:=n+1;
writeln('u(',n,') = ',u:12:10);
until abs(u-v)<eps;
suite;
end;

Procedure exo6;
Var n,i,u,v,w:integer;
Begin
write('entrez la valeur de n : ');readln(n);
u:=1;v:=1;
for i:=2 to n do begin
w:=u+v;
writeln('u(',i,') = ',w);
u:=v;
v:=w;
end;
suite;
end;

Procedure exo7;
Var n,i:integer;
s1,s2,s3:longint;
Begin
write('Entrez la valeur de n : ');readln(n);
s1:=0;s2:=0;s3:=0;
for i:=1 to n do
begin
s1:=s1+i;
s2:=s2+i*i;
s3:=s3+i*i*i;
6
end;
writeln('la somme des entiers de 1 ',n,' est gale ',s1);
writeln('Celle de leurs carrs est gale ',s2);
writeln('Et celle de leurs cubes ',s3);
suite;
end;

Procedure exo8;
Var n,i:Integer;
s:real;
Begin
write('Entrez la valeur de n : ');readln(n);
s:=0;
for i:=0 to n do if odd(i) then s:=s-1/(2*i+1)
else s:=s+1/(2*i+1);
writeln('Une valeur approche du nombre pi est ',4*s:12:10);
writeln('Alors que Turbo-Pascal connat pi= ',pi:12:10);
suite;
end;

Procedure exo9;
Var n,i,j:integer;
p:longint;
s:real;
Begin
write('Entrez le nombre entier n : ');readln(n);
s:=1;p:=1;
For i:=0 to n do begin
p:=p*i;
s:=s+1/p;
end;
writeln('La somme des inverses des factorielles de 0 ',n:2);
writeln('est gale ',s:12:10);
writeln('Alors que le nombre e base des logarithmes npriens');
writeln('vaut ',exp(1):12:10);
suite;
end;

Procedure exo10;
Var a,b,n,i,j,s:Integer;
Begin
write('Entrez les bornes de l''intervalle spares par un espace');
readln(a,b);
for n:=a to b do
begin
s:=0;
for i:=1 to n-1 do if n mod i=0 then s:=s+i;
if n=s then writeln(n);
end;
suite;
end;

Procedure exo11;
Var a,b,n,d:Integer;
7
Begin
Write('Entrez les bornes de l''intervalle spares par un espace :');
readln(a,b);
if a<2 then a:=2;
for n:=a to b do
begin
d:=2;
while (d*d<=n) and (n mod d <> 0) do d:=d+1;
if d*d>n then write(n:8);
end;
writeln;
suite;
end;

Procedure exo12;
Var a,b,r:Integer;
Begin
write('Entrze les deux entiers naturels spars par un espace : ');
readln(a,b);
write('Le plus grand diviseur commun de ',a,' et ',b,' est gal ');
while b<>0 do
begin
r:=a mod b;
a:=b;
b:=r;
end;
writeln(a);
suite;
end;

begin
repeat
clrscr;
gotoxy(20,2);write('ALGORITHMES SUR LES NOMBRES');
gotoxy(12,3);write('-----------------------------------');
gotoxy(10,5);write(' 1 : change des contenus de deux variables');
gotoxy(10,6);write(' 2 : classement de trois variables');
gotoxy(10,8);write(' 3 : suite u(0)=0 et u(n+1)=0,5*u(n)+3');
gotoxy(10,9);write(' 4 : suite si u(n) pair alors u(n+1)=3u(n)+1 sinon u(n+1)=u(n)/2)');
gotoxy(10,10);write(' 5 : suite u(0)=1 et u(n+1)=0,5*(u(n)+a/u(n))');
gotoxy(10,11);write(' 6 : suite de Fibonacci');
gotoxy(10,13);write(' 7 : somme des puissances 1, 2, 3 des n premiers entiers naturels');
gotoxy(10,14);write(' 8 : calcul d''une valeur approche de pi');
gotoxy(10,15);write(' 9 : calcul d''une valeur approche de e');
gotoxy(10,17);write(' 10: recherche des nombres parfaits');
gotoxy(10,18);write(' 11: liste des nombres premiers');
gotoxy(10,19);write(' 12: calcul du pgcd de deux entiers naturels');
gotoxy(10,22);write(' 0 : sortie du programme');
gotoxy(10,25);write('Numro de votre choix : ');
readln(numchoix);
clrscr;
case numchoix of
1 : exo1;
8
2 : exo2;
3 : exo3;
4 : exo4;
5 : exo5;
6 : exo6;
7 : exo7;
8 : exo8;
9 : exo9;
10 : exo10;
11 : exo11;
12 : exo12;
end;
until numchoix=0;
end.

You might also like