Professional Documents
Culture Documents
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)
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
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
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.
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.
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.