Vous êtes sur la page 1sur 56

www.3dnetinfo.

com

 Enoncés des exercices


 Corrigés des exercices

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

SERIE N°1: LES STRUCTURES DE DONNEES

Exercice 1 :
Compléter les affectations suivantes par une valeur d’opérande ou d’opérateur permettant d’obtenir
dans chacun des cas, la valeur de Y :
Affectation Valeur de Y
Y := round(99,51) = 100 ; True
Y := (upcase (‘a’) in [‘A’ .. ‘Z’]) and (1 in [1 ..10]) ; True
Y := length (‘PASCAL’) mod 4 = 2 ; True
Y := random (4) < 4 ; True
Y := pred (‘D’) = chr (ord(‘B’) + 1) ; True
Y := copy (‘informatique’,1,4) <>’info’ ; False
Exercice 2 :
Soient les déclarations suivantes :
N : entier ; Y : réel ; C : caractère ; CH : chaîne ; B : booléen ; (variables non vides)
Compléter le tableau ci-dessous :
Si l'expression est valide
Expressions Valide Invalide
Type de résultat Résultat
R1 ord(C) > ord(pred(C)) ; X Booléen Vrai
R2 Y mod N; X
R3 ord( sous-chaîne(CH,1,1)); X
R4 CH[0] = chr( long(CH)); X Booléen Vrai
R5 CH[1] <= CH ; X Booléen Vrai
R6 B OUex non(B); X Booléen Vrai
R7 majus(CH); X Chaine la chaine en
majuscule
R8 chr (ord(“A”)); X Caractere A
R9 pred(chr(0)) = chr(255); X Booléen Vrai

Exercice 3:
Soient les variables suivantes : C : Caractère ; Ch1, Ch2 : Chaîne ; X,Y,Z : Entier
Vérifier si les expressions booléennes suivantes sont équivalentes ou non :
Expressions booléennes Equivalence
Expression 1 Expression 2 (oui / Non)
Ch = Ch[1] Length( Ch) = 1 non
Majus(C) dans ["A".."Z"] C dans ["a".."z","A".."Z"] oui
C < > Majus (C) C dans ["a".."z"] oui
C = Majus (C) C dans ["A".."Z"] oui
(X<=Y) et ( Y <=Z) Y dans [X..Z] oui
Non ( (X = Y) et ( X < >Z) ) (X < > Y) ou (X = Z) oui
Abs(X-Y) = (Y-X) Y >= X oui
Long( ch1) = Long( ch2) Ch1 = ch2 non

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Exercice 4 :
Ecrire un programme qui saisit un entier x de 3 chiffres puis inverse ces 3 chiffres et affiche le résultat.
Exemple : x=285, le résultat est 582.

Corrigé :
program ex4;
uses wincrt;
var
x,res,u,d,c:integer;
begin
repeat
writeln('saisir x');
readln(x);
until(x >=100)and (x<=999);
u:=x mod 10;
d:=x div 10 mod 10;
c:=x div 100;
res:=u*100 + d*10+ c;

writeln('le resultat = ',res);


end.

Exercice 5 :
Ecrire un programme qui fait entrer deux entier x et y et fait déterminer leur sup et leur inf.

Corrigé :
program ex5;
uses wincrt;
var
x,y:integer;
begin
writeln('saisir le premier entier: ');
readln(x);
writeln('saisir le deuxieme entier: ');

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

readln(y);

if(y>x)then
begin
writeln('superieur = ',y);
writeln('inferieur = ',x);
end
else if (x>y) then
begin
writeln('superieur = ',x);
writeln('inferieur = ',y);
end else
writeln('les deux entiers sont egaux');
end.

Exercice 6 :
Soit ch une chaîne de caractères formée par deux mots séparés par un espace. Ecrire un programme
permettant de saisir cette chaîne et de permuter les deux mots qui la composent.
Exemple : ch = « Hadj Moussa» Résultat : ch devient «Moussa Hadj»

Corrigé :
program ex6;
uses wincrt;
var
ch,mot1,mot2:string;
espace,i:integer;
test:boolean;
begin
repeat
writeln('saisir ch: ');
readln(ch);
{compter le nombre des espaces dans la chaine}
espace:=0;
for i:=1 to length(ch) do

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

begin

if(ch[i] = ' ')then


espace:=espace+1;
end;
{si la chaine contient un seul espace on doit verifier que la chaine ne contient que des lettres
alphabetiques}
if(espace = 1)then
begin
i:=0;
repeat
i:=i+1;
if(i <> pos(' ',ch))then
test:=upcase(ch[i]) in ['A'..'Z'];
until(test=false) or (i=length(ch));
end
else
test:=false;
until(test=true);
{prendre le premier mot de la chaine ch}
mot1:= copy(ch,1,pos(' ',ch)-1);
{prendre le deuxieme mot de la chaine ch}
mot2:= copy(ch,pos(' ',ch)+1,length(ch) - pos(ch,' '));

ch:= mot2 + ' ' + mot1;


writeln('ch devient: ', ch);

end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Exercice 7 :
Un caissier dispose dans sa caisse des billets de 10 dinars, des billets de 5 dinars et des pièces de 1 dinar.
Écrire un programme qui échange un montant d'un chèque, exprimé en dinars, par le maximum de billets
de 10 dinars et le reste en billets de 5 dinars et des pièces de 1 dinar.

Exemple : Si le montant est égal à 328 dinars, le caissier nous donne 32 billets de 10 dinars, 1 billet de
5 dinars et 3 pièces de 1 dinar.

Corrigé :
program ex8;
uses wincrt;
var
x,dix,cinq,dinar:integer;
begin
writeln('saisir le montant du cheque: ');
readln(x);

dix:= x div 10;


cinq:= x mod 10 div 5;
dinar:=x mod 10 mod 5;

write('le caissier nous donne: ');


if(dix <> 0)then
write(dix,' billets de 10 dinars,');
if(cinq <> 0)then
write(cinq,' billets de 5 dinars,');
if(dix <> 0)then
write(dinar,' pieces de 1 dinar');
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Exercice 8 :
Ecrire un programme qui lit deux nombres entiers positifs inférieurs à 180 et qui affiche à l'écran la
multiplication comme suit :

x 11
_____
=1320

Corrigé :
program ex8;
uses wincrt;
var
x,y,p:integer;
begin
repeat
writeln('saisir x: ');
readln(x);
until(x in [0..180]);

repeat
writeln('saisir y: ');
readln(y);
until(y in [0..180]);

p:=x*y;

writeln(' ',x);
writeln('* ',y);
writeln('---------');
writeln(' = ',p);

end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

SERIE N°2 : Les structures conditionnelles


Exercice n°1:
Ecrire un programme qui permet de déterminer et d'afficher la valeur sup parmi deux entiers donnés A
et B.

Corrigé :
program ex1;
uses wincrt;
var
sup,a,b:integer;

begin
writeln('saisir A: ');
readln (a);
writeln('saisir B: ');
readln (b);
sup:=a;

If(b>sup)then
begin
sup:=b;
writeln('la valeur superieure= ',sup)
end
else if(b=sup)then
writeln('les deux entiers sont egaux')
else
writeln('la valeur superieure= ',sup);
end.

Exercice n°2:
‘’AZZA‘’ est un mot palindrome car il se lit de droite à gauche ou de gauche à droite de la même manière.
Ecrire un programme qui saisit un mot de 4 caractères, affiche s’il est palindrome ou non.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Corrigé :
program ex2;
uses wincrt;
var
mot:string;

begin
repeat
writeln('saisir ch: ');
readln (mot);
until(length(mot)=4);

if(upcase(mot[1])=upcase(mot[4]))and (upcase(mot[2])=upcase(mot[3])) then


writeln('le mot est palindrome')
else
writeln('le mot n est pas palindrome');
end.

Exercice n°3:
Ecrire un programme qui saisit un entier positif n formé de deux chiffres et qui calcul puis affiche son
image par la fonction f(n) = (-1)nx (u2+d2) où u et d désignent respectivement les chiffres des unités et
les chiffres des dizaine de n.

Corrigé :
program ex3;
uses wincrt;
var
n,u,d,a,f:integer;

begin
repeat
writeln('saisir n: ');
readln(n);
until(n in[10..99]);

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

u:= n mod 10;


d:= n div 10;

if(n mod 2 = 0) then


a:=1
else
a:=-1;

f:= a * (sqr(u) + sqr(d));

writeln( ' l image de n par la fonction f= ', f);


end.

Exercice n°4:
Ecrire un programme qui permet de déterminer et d'afficher le type d'un caractère donné (Consonne,
Voyelle, Chiffre ou Symbole)

Corrigé :
program ex4;
uses wincrt;
var
c:char;

begin
writeln('saisir un caractere: ');
readln(c);
if(c in ['0'..'9'])then
writeln(' le caractere est un chiffre')
else if (upcase (c) in ['A'..'Z'])then
begin
if(upcase(c) in ['A','E','U','I','O','Y'])then
writeln(' le caractere est une voyelle')

else

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

writeln(' le caractere est une consonne');


end
else
writeln('le caractere est un symbole');
end.

Exercice n°5:
Un étudiant passe trois examens. Il est déclaré admis si :
• Soit, il a au moins 9 points à chaque examen.
• Soit la moyenne des trois examens est au moins égale à 10 et la plus basse note est au moins égale
à 8.
S'il n'est pas admis, alors il est refusé. Analyser le problème et écrire le programme correspondant.

Corrigé :
program ex5;
uses wincrt;
var
n1,n2,n3,m,inf:real;

begin
repeat
writeln('saisir la premiere note: ');
readln(n1);
until((n1 >=0 )and (n1<=20));
repeat
writeln('saisir la deuxieme note: ');
readln(n2);
until((n2 >=0 )and (n2<=20));
repeat
writeln('saisir la troisieme note: ');
readln(n3);
until((n3 >=0 )and (n3<=20));

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

inf:=n1;
if(n2< inf)then
inf:=n2
else if (n3 < inf)then
inf:=n3;

m:= (n1 + n2 + n3)/3;

if( (n1>=9) and (n2>=9) and (n3>=9) )then


writeln(' l eleve est admis ')
else if((m>=10) and (inf>=8)) then
writeln(' l eleve est admis ')
else
writeln(' l eleve est refuse');
end.

Exercice n°6:
Ecrire un programme qui saisit deux réels a et b et affiche le résultat de l’opérateur choisi (+ * - /)
appliqué à ces deux opérandes a et b.

Corrigé :
program ex6;
uses wincrt;
var
a,b:real;
o:char;
begin
writeln('saisir le premier reel: ');
readln(a);
writeln('saisir le deuxieme reel: ');
readln(b);
repeat
writeln(' choisir un operateur: + * - / ');

readln(o);

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

until(o in ['+','*','-','/']);

if( o = '+')then
writeln(' le resultat= ', a+b:0:2)
else if( o = '*')then
writeln(' le resultat= ', a*b:0:2)
else if( o = '-')then
writeln(' le resultat= ', a-b:0:2)
else if( o = '/')then
writeln(' le resultat= ', a/b:0:2);
end.

Exercice n°7:
Ecrire un programme qui lit trois valeurs entières (A, B et C) du clavier puis affiche la plus grande des
trois valeurs.

Corrigé :
program ex7;
uses wincrt;
var
a,b,c:integer;
begin
writeln('saisir le premier entier: ');
readln(a);
writeln('saisir le deuxieme entier: ');
readln(b);
writeln('saisir le troisieme entier: ');
readln(c);

if( a>b) and (a>c) then


writeln(a, ' est la valeur la plus grande ')
else if(b>c) and (b>a)then

writeln(b, ' est la valeur la plus grande ')


else

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

writeln(c, ' est la valeur la plus grande ') ;


end.

Exercice n°8:
On se propose d’écrire un programme qui lit l’heure actuelle sous forme de trois entiers h, m et s (heure,
minute et seconde) et détermine l’heure après 1 seconde

Exemples :
Si l’heure est 12h:30m :15s on aura 12h:30m :16s
Si l’heure est 12h:30m :59s on aura 12h:31m :0s
Si l’heure est 12h:59m :59s on aura 13h:0m :0s
Si l’heure est 23h:59m :59s on aura 0h:0m :0s

Corrigé :
program ex8;
uses wincrt;
var
h,m,s:integer;
begin
writeln('saisir h: ');
readln(h);
writeln('saisir m: ');
readln(m);
writeln('saisir s: ');
readln(s);

s:=s+1;

if(s=60) then
begin
m:=m+1;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

s:=0;
if(m=60)then
begin
h:=h+1;
m:=0;
if(h=24)then
begin
h:=0;
end;
end;
end;
1

writeln('la nouvelle heure= ',h,':',m,':',s);

end.

Exercice n°9:
Ecrire un programme qui permet de résoudre dans IR l'équation ax2 + bx + c = 0. où a,b et c sont trois
réels données.

Corrigé :
program ex9;
uses wincrt;
var a,b,c,d :real;

begin
writeln('saisir a :');
readln (a);
writeln ('saisir b :');
readln (b) ;

writeln ('saisir c :');


readln (c);

if (a=0) and (b=0) and (c=0) then


begin
writeln('l''équation admet comme solutions tout IR');

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

end
else if (a=0) and (b=0) and (c<>0) then
begin
writeln('l''équation n''a pas de solutions');
end
else if (a=0) and (b<>0) then
begin
writeln ('l''équation admet comme solutions X = ',-c/b:0:2);
end
else
begin
d:= sqr(b)-4*a*c;
if (d=0) then
begin
writeln('l''équation admet comme solutions X = ',-b/(2*a):0:2);
end
else if (d<0) then
begin
writeln('l''équation n''admet pas de solutions');
end
else
begin
writeln('l''équation admet comme solutions :');
writeln(' X1 = ',(-b-sqrt(d))/(2*a):0:2);
writeln(' X2 = ',(-b+sqrt(d))/(2*a):0:2);
end;
end;
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Exercice n°10:
Ecrire un programme qui permet de saisir deux dates sous la forme jj/mm/aaaa (chaîne de 10 caractères) et
d'afficher la plus récent

Corrigé :
program ex10;
uses wincrt;
var
d1,d2:string[10];
j1,j2,m1,m2,a1,a2:string;
begin
writeln ('saisir la date 1: ');
readln(d1);
writeln ('saisir la date 2: ');
readln(d2);

j1:=copy(d1,1,2);
j2:=copy(d2,1,2);
m1:=copy(d1,4,2);
m2:=copy(d2,4,2);
a1:=copy(d1,7,4);
a2:=copy(d2,7,4);

if(a1>a2) then
writeln('la date 1 est la plus recente')
else if (a2>a1) then
writeln('la date 2 est la plus recente')
else
begin
if(m1>m2)then
writeln('la date 1 est la plus recente')
else if (m2>m1)then
writeln('la date 2 est la plus recente')

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

else
begin
if(j1>j2)then
writeln('la date 1 est la plus recente')
else if(j2>j1)then
writeln('la date 2 est la plus recente')
else
writeln('les deux dates sont egales');
end;
end;
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

SERIE N°3: Les structures de contrôle itératives


EXERCICE 1 :
Ecrire un programme permettant de trouver l'image inverse d'un nombre entier positif.
Exemple: L'image inverse de 138 est 831.
Corrigé :
program ex1;
uses wincrt;
var
x,u,inv:integer;
begin
writeln('saisir x: ');
readln(x);
inv:=x mod 10;
u:=0;
repeat
x:=x div 10;
u:=x mod 10;
inv:=inv*10+u;
until(x in [1..9]);
writeln('le nombre inverse= ',inv);
end.

EXERCICE 2 :
Ecrire un programme qui saisit un mot non vide, affiche s’il est palindrome ou non («AZZA» est un mot
palindrome car on le lit de la même manière, de gauche à droite ou de droite à gauche).
Corrigé :
program ex2;
uses wincrt;
var
ch:string;
inverse: String;
i : Integer;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Begin
readln(ch);
inverse:='';
for i:=1 to length(ch) do
inverse:=ch[i] + inverse ;
if (inverse=ch) then
writeln('Le mot est un palidrome')
else
writeln('Le mot n est pas un palidrome');
end.

EXERCICE 3 :
Ecrire un programme qui saisit une phrase et affiche le mot le plus long de cette phrase.
Le programme n'acceptera pas une phrase :
- Qui commence ou se termine par un espace.
- Qui contient des espaces supplémentaires (deux espaces consécutifs)
Corrigé :
program ex3;
uses wincrt;
var
ch,long,c:string;
i:integer;
begin
repeat
writeln('saisir ch: ');
readln(ch);
until(ch[1]<>' ') and (ch[length(ch)]<>' ') and (pos(' ',ch)=0);

i:=0;
long:='';
repeat
i:=i+1;
if(ch[i] <> ' ')and (i<>length(ch))then

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

begin
c:=c+ch[i];
end
else
begin
if(i=length(ch))then
c:=c+ch[i];
if(length(long)<length(c))then
long:=c;
c:='';
end;
until(i=length(ch));

writeln('le mot le plus long= ',long);


end.

EXERCICE 4 :
Ecrire un programme qui permet de vérifier et d’afficher si un entier naturel N donné est premier ou
non

Corrigé :
program ex4;
uses wincrt;
var
x,i,nbd:integer;

begin
writeln('saisir x: ');
readln(x);
nbd:=1;
for i:=2 to x do
begin
if(x mod i=0) then

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

nbd:=nbd+1;
end;

if(nbd=2)then
writeln(x ,' est premier')
else
writeln(x, ' nest pas premier');
end.

EXERCICE 5 :
Ecrire un programme permettant de déterminer et d’afficher le nombre d’éléments positifs et la somme
des valeurs négatives d’un tableau T contenant n entiers (positifs et négatifs), n est compris entre 10 et
20.

Corrigé :
program ex5;
uses wincrt;
var
t:array [1..20] of integer;
i,nb,s,n:integer;
begin
repeat
writeln('saisir n: ');
readln(n);
until(n in [10..20]);
for i:=1 to n do
begin
writeln('saisir T[',i,']: ');
readln(t[i]);
end;
nb:=0;
s:=0;
for i:=1 to n do

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

begin
if(t[i]>=0)then
nb:=nb+1

else
s:=s+t[i];
end;
writeln('le nombre des elements positifs= ',nb);
writeln('la somme des elements negatifs= ',s);
end.

EXERCICE 6 :
153 est un nombre cube car il s’écrit sous la forme 153= 13+53+33. Ecrire un programme qui affiche tous
les nombre cube de trois chiffres.

Corrigé :
program ex6;
uses wincrt;
var
u,c,d,i:integer;
begin
for i:=100 to 999 do
begin
u:=i mod 10;
d:=i div 10 mod 10;
c:=i div 100;
if(i = (sqr(u)*u + sqr(d)*d + sqr(c)*c))then
writeln(i,' est un nombre cube');
end;
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

EXERCICE 7 :
Soit à saisir un tableau T de n réels positifs et un réel V, puis afficher si la valeur V se trouve dans le
tableau T.

Le résultat sera sous la forme :«V se trouve dans T», ou « V n’est pas dans T ». La taille maximale de T
est égale à 100.

Corrigé :
program ex7;
uses wincrt;
var
t: array[1..100] of real;
n,i:integer;
v:real;
begin
repeat

writeln('saisir n');
readln(n);
until(n in [1..100]);

writeln('saisir V:');
readln(v);

for i:=1 to n do
begin
repeat
writeln('saisir T[',i,']: ');
readln(t[i]);
until(t[i]>=0);
end;

i:=0;
repeat
i:=i+1;
until(t[i]=V)or (i=n);

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

if(t[i]=v)then
writeln('V se trouve dans T')
else
writeln('V n est dans T');
end.

EXERCICE 8 :
Ecrire un programme qui saisit un tableau T de n lettres alphabétiques majuscules, avec (5<n<50), puis
une chaîne mot de longueur < 20 et d’afficher si ce mot existe dans le tableau ou non.

Les caractères du mot doivent être ordonnés. Les caractères peuvent être non contigus.

B E F A D X C

Exemple : si mot = « BAC » et T =

Le programme affiche : (le mot BAC existe dans le tableau)

Corrigé :
program ex8;
uses wincrt;
var
t:array [1..50] of char;
n,i,j:integer;
ch,ch1:string;
begin
repeat
writeln('saisir n: ');
readln(n);
until(n in [5..50]);
repeat
writeln('saisir ch: ');
readln(ch);
until(length(ch)<=20);

for i:=1 to n do

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

begin
repeat
writeln('saisir T[',i,']');
readln(t[i]);
until(t[i] in ['A'..'Z']);
end;

j:=1;
i:=0;
ch1:='';
repeat
i:=i+1;
if(ch[j]=t[i])then
begin
ch1:=ch1+t[i];
j:=j+1;
end;
until(i=n)or(ch=ch1);

if(ch=ch1)then
writeln(' le mot ', ch,' se trouve dans le tableau')
else
writeln(' le mot ', ch,' n est pas dans le tableau');
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

SERIE N°4: L’analyse modulaire


Exercice 1 :
Deux entiers naturels strictement positifs m et n sont dits nombres amis si et seulement si :
• la somme des diviseurs de m sauf lui même est égale à n
• et la somme des diviseurs de n sauf lui même est égale à m.
Exemple :
220 et 284 sont deux nombres amis, en effet :
D284 = {1 , 2 , 4 , 71 , 142 , 284 }
D220= {1 , 2 , 4 , 5 , 10 , 11 , 20 , 22, 44 , 55 , 110 , 220 }
D284 et D 220 sont respectivement les ensembles de tous les diviseurs de 284 et de 220..
284 = 1 + 2 + 4 + 5 + 10 + 11 + 20 + 22+ 44 + 55 + 110
220 = 1 + 2 + 4 + 71 + 142
Ecrire un programme qui permet de déterminer puis d’afficher si deux entiers naturels donnés m et n
sont amis ou non.
Corrigé :
program ex1;
uses wincrt;
var
m,n:integer;

procedure saisir (var x:integer);


begin
repeat
writeln('saisir x: ');
readln(x);
until(x>0);
end;

function somme_d(x:integer):integer;
var
nbd,i:integer;
begin
nbd:=1;
for i:=2 to x-1 do
begin
if(x mod i =0)then
nbd:=nbd+i;
end;
somme_d:=nbd;
end;

begin
saisir(m);
saisir(n);

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

if((somme_d(m)=n) and (somme_d(n)=m))then


writeln('les nombres sont amis')
else
writeln('les nombres ne sont pas amis')

end.

Exercice 2 :
Soit T un tableau de N entiers de 4 chiffres chacun (avec 5≤N≤20).
On se propose de vérifier le type d'appartenance d'un entier p formé de 4 chiffres dans le tableau T en
appliquant le principe suivant :
− 1er cas : Si p est égal à un élément du tableau T alors on dit que l'appartenance est totale.
− 2ème cas : Si le nombre formé par les trois premiers chiffres à gauche de p est égal au
nombre formé par les trois premiers chiffres à gauche d'un élément de T alors on dit que
l'appartenance est partielle.
− Si les deux cas précédents ne sont pas vérifiés alors on dit que l'appartenance est nulle.
Exemple :
Pour N=6 et le tableau T suivant :

T 5317 1294 8512 7056 5179 1294


1 2 3 4 5 6
 Si p= 1294 le programme affichera « p appartient totalement à T» En effet p existe dans T à
la position 2

T 5317 1294 8512 7056 5179 1294


1 2 3 4 5 6

 Si p= 5173 le programme affichera « p appartient partiellement à T»

En effet le nombre 517 formé par les trois premiers chiffres à gauche de Il est égal
au nombre formé par les trois premiers chiffres à gauche du 5ème` élément de T.
T 5317 1294 8512 7056 5179 1294
1 2 3 4 5 6

 Si p= 4518 le programme affichera « p n'appartient pas à T»


En effet p n'est égal à aucun élément de T et le nombre 451 formé par les trois premiers
chiffres de p n'est égal à aucun nombre formé par les trois premiers chiffres d'un élément
de T.
Travail demandé :
Écrire un programme modulaire qui permet de :
• Saisir un entier N, puis remplir aléatoirement un tableau T par N entiers de 4 chiffres
• Afficher les éléments du tableau T

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

• Saisir un entier p de 4 chiffres


• Vérifier le type d'appartenance de p dans T et afficher le message correspondant comme
illustré dans l'exemple précédent
Corrigé :
program ex2;
uses wincrt;
type
tab= array [1..20] of longint;
var
n:integer;
v:longint;
t:tab;

procedure saisir (var x:longint;msg:string);


begin
repeat
writeln(msg);
readln(x);
until(x >=1000) and (x<=9999);
end;

procedure saisir_n(var n:integer);


begin
repeat
writeln('saisir n: ');
readln(n);
until(n in [5..20]);
end;

procedure remplir(var t:tab;n:integer);


var
i:integer;
begin
for i:=1 to n do
begin
saisir(t[i],'saisir T[i]: ');
end;
end;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

procedure appartenance(t:tab;v,n:integer);
var
i:integer;
test:boolean;
begin
test:=false;
i:=0;
repeat
i:=i+1;
if(t[i]=v)then
begin
test:=true;
writeln('l appartenance est totale. ')
end
else
begin
test:=t[i] div 10 = v div 10;
if(test)then
writeln('l appartenance est partielle. ');
end;
until(i=n) or (test);
if(test=false)then
writeln('l appartenance est nulle. ');

end;

begin
saisir_n(n);
remplir(t,n);
saisir(v,'saisir l entier V: ');
appartenance(t,v,n);
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Exercice 3 :
x − x 3 + x 5 − x 7 + x 9 −...
Sachant que sin (x) = 1! 3! 5! 7! 9!

Pour x très proche de zéro.


Ecrire un programme qui permet d’afficher sin(x) en utilisant la formule ci-dessus.
Le calcul s’arrête quand la différence entre deux termes consécutifs devient inférieure ou égale à 10-4 .
La dernière somme calculée est une valeur approchée de sin (x).

Corrigé :
Program ex3;
uses wincrt;
var
x:real;

function sinus (x:real) : real;


var
s, t1, t2, i:real;
begin
s:=x;
t2:=x;
i:=1;
repeat
i:=i+2;
t1:=t2;
t2:=t2 * -sqr(x) / (i*(i-1));
s:=s+t2;
until (abs (t2-t1) <= 0.0001);
sinus:=s;
end;

begin
write ('donner un réel x: ');
readln(x);
write ('sin(', x:1:2,') = ', sinus(x):10:10);
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Exercice 4 :
On veut crypter une chaîne de caractères donnée ch dont la taille ne dépasse pas 50 caractères, en une
chaîne résultat res de la manière suivante : parcourir la chaîne ch de gauche à droite en comptant le
nombre d’occurrences successives de chaque caractère de la chaîne ch, puis de ranger dans la chaîne
résultat res, ce nombre suivi du caractère en question.
Ecrire un programme permettant de saisir la chaîne ch qui doit être non vide et formée uniquement par
des lettres alphabétiques, puis de former et d’afficher la chaîne res selon le principe décrit
précédemment.
Exemple : Si ch= « aaaFyyBssssssssssssazz » Alors la chaîne res qui sera affichée est :
« 3a1F2y1B12s1a2z »
Corrigé :
program ex4;
uses wincrt;
var
ch:string;

function cryptage (ch:string):string;


var
a,i:integer;
res,e:string;
trouve:boolean;
c:char;
begin
res:='';
repeat
trouve:=false;
c:=ch[1];
a:=1;
delete(ch,1,1);

if(length(ch)=0)then
res:=res+'1'+c
else
begin
repeat
if(ch<>'')then
begin
if(ch[1]=c)then
begin
delete (ch,1,1);
a:=a+1;
end
else
trouve:=true;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

end;
until(trouve);
str(a,e);
res:=res+e+c;

end;
until (ch='');
cryptage:=res;
end;

function alpha (ch:string):boolean;


var
i:integer;
v:boolean;
begin
i:=0;
repeat
i:=i+1;
v:= upcase(ch[i]) in ['A'..'Z'];
until(i=length(ch)) or (v=false);

alpha:=v;
end;

procedure saisir(var ch:string);


begin
repeat
writeln('saisir ch: ');
readln(ch);
until(length(ch)in [1..50]) and (alpha(ch)=true);
end;

begin
saisir(ch);
writeln( cryptage(ch));
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Exercice 5 :
On définit le Degré de Ressemblance DR entre deux mots de même longueur par la formule suivante :
DR = (nombre de caractères en communs bien placés / longueur du mot) * 100
NB : un caractère est dit bien placé lorsqu’il occupe la même position dans les deux mots.
Exemples :
• Pour mot1 = "EXEMPLE" et mot2 = "EXAMENS"  Le degré de ressemblance DR =
( 3 / 7 ) * 100 = 42.85
• Pour mot1 = "TRAITEMENTS" et mot2 = "INFORMATION" Le degré de
ressemblance DR = (0 / 11) * 100 = 00.00
Travail demandé :
Ecrire un programme qui permet de saisir une chaîne Ch non vide et composées de lettres majuscules, puis
de remplir un tableau T par N (5 < N < 10) chaînes de caractères composées de lettres majuscules et de même
longueur que ch et d'afficher le degré de ressemblance entre ch et les éléments de T.

Corrigé :
program ex2;
uses wincrt;
type
tab=array [1..10] of string;
var
ch:string;
t:tab;
n:integer;

function lettres(ch:string):boolean;
var
verif:boolean;
i:integer;
begin
i:=0;
repeat
i:=i+1;
verif:= ch[i] in ['A'..'Z'];
until(verif=false) or (i=length(ch));
lettres:=verif;
end;

procedure saisir_ch(var ch:string);


begin
repeat
writeln('saisir ch: ');
readln(ch);
until(ch<>'') and (lettres(ch)=true);
end;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

procedure saisir_n(var n:integer);


begin
repeat
writeln('saisir n: ');
readln(n);
until( n in [5..10]);
end;

procedure remplir(var t:tab; n:integer;ch:string);


var
i:integer;
begin
for i:=1 to n do
begin
repeat
writeln('saisir T[',i,']: ');
readln(t[i]);
until(lettres(t[i])=true) and(length(t[i])=length(ch));
end;
end;

function ressemblance(ch,ch1:string):real;
var
nb,i:integer;
begin
nb:=0;
for i:=1 to length (ch) do
begin
if(ch[i]=ch1[i])then
nb:=nb+1;
end;
ressemblance:= (nb/length(ch))*100;
end;

procedure affiche(t:tab;n:integer;ch:string);
var
i:integer;
dr:real;
begin
for i:=1 to n do
begin
dr:= ressemblance(t[i],ch);
writeln(' Pour ',t[i],' et ',ch,' le DR= ',dr:0:2);
end;
end;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

begin
saisir_ch(ch);
saisir_n(n);
remplir(t,n,ch);
affiche(t,n,ch);
end.

Exercice 6 :
Soient N et M deux entiers naturels, on dit que N et M sont dit homogènes s'ils admettent les mêmes
facteurs premiers.
Exemples :
• N=60 et M = 90 sont dit homogènes, car ils ont les mêmes facteurs premiers qui sont 2, 3 et 5.
En effet, 60 = 2² * 3 * 5 et 90 = 2 * 3² * 5
• N = 60 et M = 420 ne sont pas homogènes, car ils n'ont pas les mêmes facteurs premiers.
En effet 60 = 2² * 3 * 5 et 420 = 2² * 3 * 5 * 7
N.B. :
On dit qu'un nombre a admet le nombre b comme facteur premier lorsque b est un nombre premier qui
divise a.
Travail demandé :
Ecrire un programme Pascal qui permet de saisir deux entiers N et M (5 < N < M), de vérifier et d'afficher
s'ils sont homogènes ou non.

Corrigé :
Program ex6;
uses wincrt;
var
t:array[1..50] of char;
i,j,n:integer;
mot,res:string;

begin
repeat
writeln('saisir la taille du tableau: ');
readln(n);
until(n in [5..50]);

for i:=1 to n do
begin
repeat
writeln('saisir T[',i,']');
readln(t[i]);
until(t[i] in ['A'..'Z']);
end;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

repeat

writeln('saisir la chaine mot: ');


readln(mot);
until(length(mot)<=20);

j:=1;
i:=0;
repeat
i:=i+1;
if(t[i]=mot[j])then
begin
res:=res+mot[j];
j:=j+1;
end;
until(res=mot) or (i=n);

if(res=mot)then
writeln('le mot existe dans le tableau')
else
writeln('le mot n existe pas');

end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

SERIE N°5 : Sujets bac

Sujet 9h30 2013

Soit N un entier positif non nul et T un tableau de N entiers positifs. On dit que T est un dérangement
si :
- T contient tous les entiers de 1 à N
- L’entier i n’est pas à la position i (i<>T[i])
Exemple 1 :
Pour N=7, le tableau T suivant est un dérangement, car il est formé par les chiffres de 1 à 7 et qu’aucun
chiffre i n’est à la position i.
T 5 6 2 1 7 4 3
1 2 3 4 5 6 7
Exemple 2 :
Pour N=7, le tableau T suivant n’est pas un dérangement car le chiffre 4 est à la position 4.
T 6 3 2 4 7 5 1
1 2 3 4 5 6 7
Exemple 3 :
Pour N=7, le tableau T suivant n’est pas un dérangement car il n’est pas formé par les chiffres de 1 à 7.
en effet la case 2 contient la valeur 34 qui n’appartient pas à l’intervalle [1..7].
T 5 34 2 1 7 4 3
1 2 3 4 5 6 7

Travail demandé :

Ecrire un programme Pascal qui permet de saisir un entier N (5<N<20), puis de remplir un tableau T par
N entiers positifs et d’afficher si T est un dérangement.

Corrigé :

program sujet_9h30_2013 ;
uses wincrt ;
type tab = array[1..20]of byte;
var n:byte ; test :boolean ;t:tab ;

procedure lecture(var n:byte) ;


begin
repeat
write('n= ') ; readln(n) ;
until n in [5..20] ;
end;

procedure remplir(var t:tab; n:byte) ;


var i:byte ;
begin

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

for i :=1 to n do
begin
repeat
write('t[',i,']= ') ; readln(t[i]);
until (t[i] >=0 ) ;
end;
end;
procedure affiche( test:boolean) ;
begin
if test=true then
write('T est un dérangement')
else
write('T n"est pas un dérangement') ;
end;

{function trouve(x:byte ;t:tab; p:byte) :boolean;


var
j:byte ; tr:boolean;
begin
j:= 0 ;
repeat
j:=j+1 ;
tr:=t[j]=x ;
until (j=p ) or (tr);
trouve:=tr ;
end;

function verif(t:tab;n:byte) :boolean ;


var i:byte ;ok:boolean ;
begin
i:=0 ;
repeat
i:=i+1 ;
if (t[i]<>i ) and (t[i] in[1..n] ) and (not trouve(t[i] ,t,i-1) ) then
ok:=true
else
ok:=false ;
until (i=n) or (ok=false) ;
verif:= ok ;
end;}

function verif (t:tab;n:byte):boolean;


var
i:byte; ok1,ok2:boolean;
procedure tri(var t:tab;n:byte);
var

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

i,j,aux:byte;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if t[j]<t[i] then
begin
aux:=t[i];
t[i]:=t[j];
t[j]:=aux;
end;
end;
begin
i:=0;
repeat
i:=i+1;
ok1:=t[i]<>i;
until(i=n) or (not ok1);
tri(t,n);
i:=0;
repeat
i:=i+1;
ok2:=t[i]=i;
until(i=n)or(not ok2);
verif:=ok1 and ok2;
end;

begin
lecture(n) ;
remplir(t,n) ;
test:=verif(t,n) ;
affiche(test) ;
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Sujet 14h 2013

La segmentation d’un tableau T de N entiers par rapport à l’élément numéro 1 du tableau consiste à
placer les éléments inférieurs ou égaux à T[1] à sa gauche et les éléments strictement supérieurs à T[1]
à sa droite.
Exemple :
Soient N=10 et le tableau T suivant :
125 10 34 48 125 1026 22 - 365 411 192
1 2 3 4 5 6 7 8 9 10

La segmentation de T par rapport à l’élément numéro 1 donne le tableau suivant :


10 34 48 125 22 -365 125 1026 411 192
1 2 3 4 5 6 7 8 9 10

Eléments inférieurs ou égaux à 125 Eléments strictement


supérieurs à 125

NB :
L’ordre d’apparition des éléments inférieurs ou égaux à T[1] et celui des éléments strictement
supérieur à T[1] doit rester le même que dans le tableau initial.

Travail demandé

Ecrire un programme Pascal qui permet de saisir un entier N (5 < N < 20), de remplir un tableau T par N
entiers, de segmenter le tableau T par rapport à T[1] et d’afficher le tableau T segmenté.

Corrigé :
program sujet_14h_2013 ;
uses wincrt ;
type tab=array[1..20] of integer ;
var n:byte ; t:tab ;
procedure saisir(var n:byte) ;
begin
repeat
write('n= ' ); readln(n) ;
until n in [5..20] ;
end;
procedure remplir(var t:tab ;n:byte ) ;
var i:byte ;
begin
for i:= 1 to n do
begin
write('t[',i,']= ' ); readln(t[i]) ;
end;
end;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

procedure affiche(t:tab;n:byte) ;
var i:byte ;
begin
for i :=1 to n do
write(t[i],' | ');
end ;
procedure segmenter (var t :tab ; n:byte ) ;
var i,j,p:byte ;aux:integer ;
begin
P:=1 ;
for i:=2 to n do
begin
aux:=t[i] ;
j:=i ;
if aux<=t[p] then
begin
while j>p do
begin
t[j]:=t[j-1] ;
j:=j-1 ;
end;
t[j]:=aux ;
p:=p+1;
end;
end;
end;
begin
saisir(n) ;
remplir(t,n) ;
segmenter(t,n) ;
affiche(t,n) ;
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Sujet 13h 2015:


La décomposition du PGCD(A,B) en facteurs premiers ( avec A > 2 et B > 2) est le produit des facteurs
premiers apparaissant à la fois dans la décomposition de A et de B muni du plus petit des exposants trouvés
dans la décomposition de A et de B.
N.B. : On dit qu'un nombre a admet le nombre b comme facteur premier lorsque b est un nombre premier
qui divise a.
Travail demandé :
Ecrire un programme Pascal qui permet de saisir deux entiers A et B ( 10 < A < B < 10000) de chercher
et d'afficher la décomposition en facteurs premier du PGCD(A,B) en utilisant le principe décrit ci-dessus.
Exemple :
Pour A = 378 et B = 8820
Liste des facteurs premiers de A = 378 = 2 * 33 * 7
Liste des facteurs premiers de B = 8820 = 22 * 32 * 5 * 72
Alors le programme affiche : PGCD ( 378 , 8820 ) = 2 * 32 * 7 = 126

Corrigé :
program sujet_13h_2015 ;
uses wincrt ;
var a,b,Vp:word; p:string;

procedure saisie (var A,B :word );


begin
repeat
write ('A= '); readln(A) ;
write ('B= '); readln(B) ;
until (A>=10)and(B>=A)and(b<=10000);
end;

procedure PGCD (A,B:word;var ch :string;var X:word) ;


var s:string;d:word;
begin
ch:='';
d:=2;
X:=1;
repeat
while (A mod d=0)and (B mod d=0) do
begin
str(d,s);
ch:=ch+s+'*';
A:=A div d;
B:=B div d;
X:=X *d;
end;
while(A mod d=0) do

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

A:= A div d ;
while(B mod d=0) do

B:=B div d;
d:=d+1;
until (A=1) or (B=1);
delete(ch,length(ch),1);
end;

begin
saisie(A,B);
PGCD(A,B,p,Vp);
if Vp<>1 then
write('PGCD (',A,',',B,')= ',p,'= ',Vp)
else
write('PGCD (',A,',',B,')= ',Vp)
end.

Sujet _ 11h 2015:

Un mot Zig-Zag est un mot composé seulement par des lettres majuscules et dont l'ordre alphabétique de
ses lettres croissant et décroissant ou inversement d'une façon alternative.
Exemples :
- Le mot ADAM est dit Zig-Zag, car l'ordre alphabétique de "A" est inférieur à celui de "D"
dont son ordre alphabétique est supérieur à celui de "A" qui le suit et l'ordre alphabétique de
"A" est inférieur à celui de "M".
- Le mot "RANIM" est dit ZIG-Zag, car l'ordre alphabétique de "R" est supérieur à celui de "A"
dont son ordre alphabétique est inférieur à celui de "N" et l'ordre alphabétique "N" est supérieur
à celui de "I" dont son ordre alphabétique est inférieur à celui de "M".
- Le mot "PROGRAMME" est dit non Zig-Zag, car l'ordre alphabétique de "P" est inférieur à
celui de "R" dont son ordre alphabétique est supérieur de "O" dont son ordre alphabétique est
supérieur à celui de "G"
- Le mot "BACCALAUREAT" est dit non Zig-Zag, car l'ordre alphabétique de "B" est
supérieur à celui de "A" dont don ordre alphabétique est inférieur à celui de "C" et l'ordre
alphabétique de "C" est égal à celui du caractère qui le suit "C".

Travail demandé :

Ecrire un programme Pascal qui permet de remplir un tableau T par N (5 < N < 10) mots composés par
des lettres majuscules et dont leurs longueurs sont comprises entre 2 et 12 et d'afficher les mots Zig-Zag
du tableau T.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Corrigé :
program 11h_2015;
uses wincrt;
type
w=string[12];
tab=array[1..50] of w;
var
n:byte;
t:tab;

procedure saisir(var n:byte);


begin
repeat
write('n= ');
readln(n);
until(n in [5..50]);
end;

function verif(ch:w):boolean;
begin
while(ch<>'') and(ch[1] in ['A'..'Z']) do
delete(ch,1,1);

verif:=ch='';
end;

procedure remplir(var t:tab;n:byte);


var
i:byte;
begin
for i:=1 to n do
begin
repeat
write('T[',i,']= ');
readln(t[i]);
until(length(t[i]) in [2..12]) and(verif(t[i]));
end;
end;

function zigzag(ch:w):boolean;
begin
while (length(ch)>=3) and((ch[1]>ch[2])xor(ch[2]>ch[3])) do
delete (ch,1,1);

zigzag:=length(ch)=2;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

end;

procedure affiche(t:tab;n:byte);
var
i:byte;
begin
for i:=1 to n do
begin
if zigzag(t[i]) then
writeln(t[i]);
end;
end;

begin
saisir(n);
remplir(t,n);
affiche(t,n);
end.

Sujet 11h 2017:

Dans le but de sécuriser les messages à envoyer, on peut faire appel à une méthode de cryptage.
Soit la méthode de cryptage suivante qui consiste à crypter par transposition de caractères, un message M
de longueur L décrite comme suit :
- Déterminer tous les diviseurs de L autres que 1 et lui-même.
- Pour chaque diviseur d de L et en commençant par le plus petit, on inverse symétriquement les
caractères de chaque bloc de longueur d.
Exemple :
Pour le message "INFORMATIQUE" dont la longueur L=12
- Les diviseurs de 12 autres que 1 et 12 sont : 2, 3, 4 et 6.
- Les inversions des blocs de caractères seront effectuées comme suit :
• Après inversion de chaque bloc de 2 caractères de la chaine "INFORMATIQUE", on
aura la chaine "NIOFMRTAQIEU".
• Après inversion de chaque bloc de 3 caractères de la chaîne "NIOFMRTAQIEU ", on
aura la chaîne "OINRMFQATUEI".
• Après inversion de chaque bloc de 4 caractères de la chaîne "OINRMFQATUEI ", on
aura la chaîne "RNIOAQFMIEUT".
• Après inversion de chaque bloc de 6 caractères de la chaîne "RNIOAQFMIEUT ", on
aura la chaîne "QAOINRTUEIMF".
On se propose d’écrire un programme Pascal intitulé « Cryptage » qui permet de saisir un message M
dont la longueur est un nombre non premier et supérieur à 4 et d’afficher le message crypté en utilisant la
méthode décrite précédemment. Pour cela on donne l’algorithme du programme principal suivant :

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

0) Début Cryptage
1) Répéter
Ecrire ("Donner le message à crypter :")
Lire(M)
Jusqu’a (FN Valide (M))
2) Ecrire (FN Crypter (M))
3) Fin Cryptage
Travail demandé :
a) Traduire l’algorithme Cryptage en un programme Pascal et ajouter les déclarations nécessaires.
b) Transformer la séquence n°1 en un module et apporter les modifications nécessaires dans le
programme principal.
c) Développer le module Valide qui permet de vérifier si la longueur du message M est un nombre
non premier et supérieur à 4.
d) Développer le module Crypter qui permet de crypter un message M en utilisant le principe décrit
précédemment.

Corrigé :
Program sujet 11h_2017;
uses wincrt;
var m:string;

Function premier(x:byte):boolean;
var d:byte;
begin
d:=2;
while (x mod d<>0) and (d<=sqrt(x)) do
d:=d+1;
premier:=(d>sqrt(x)) and (x<>1);
end;

Function valide(m:string):boolean;
begin
valide := (length(m)>4) and( not (premier(length(m))));
end;

Procedure saisir(var m:string);


begin
Repeat
Write('Donner le message a crypter: ');
Readln(m);
until valide(m);
end;

Function inverse(ch:string):string;
var i:byte;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

chi:string;
begin
chi:='';
For i:=1 to length(ch) do
begin
chi:=ch[i]+chi;
end;
inverse:=chi;
end;

Function transformation(m:string;d:byte):string;
var i:byte;
mc:string;
begin
mc:='';
For i:=1 to (length(m) div d) do
begin
mc:=mc+Inverse(copy(m,1,d));
delete(m,1,d);
end;
transformation:=mc;
end;

Function crypter(m:string):string;
var d:byte;
begin
for d:=2 to (length(m) div 2) do

begin
if (length(m) mod d=0) then
m:=Transformation(m,d);
end;
crypter:=m;
end;

begin
Saisir(m);
write(Crypter(m));
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Sujet 8h 2015:
Pour sécuriser l’envoi des messages, deux chercheurs cryptent leurs messages en utilisant le principe
suivant :
1. Saisir le message à crypter msg. Sachant qu’il est composé uniquement par des lettres.
2. Remplir un tableau T par les ordres alphabétiques des lettres de msg de façon à ce que T[i] lui
correspond de msg[i] (Sachant que "A" et "a" sont d'ordre 1, "B" et "b" sont d'ordre 2, …).
3. Remplacer chaque T[i] par (T[i])e mod (p*q) avec p, q et e trois constantes ayant pour valeurs
respectivement 17, 19 et 5.
Le tableau T ainsi obtenu représente le code de la chaîne msg.
Exemple :
Pour la chaîne msg = "Bonjour", T sera remplit initialement comme suit :
T 2 15 14 10 15 21 18 En effet "B" est d'ordre alphabétique 2, "o" est d'ordre
1 2 3 4 5 6 7 alphabétique 15, …

Après avoir coder en remplaçant chaque T[i] par (T[i])e mod (p*q) on obtient :
T 32 2 29 193 2 89 18 En effet :T[1] est remplacé par 25 mod (17*19)=32
1 2 3 4 5 6 7
T[2] est remplacé par 155 mod (17*19)=2

Travail demandé :

Ecrire un programme Pascal qui permet de saisir une chaîne non vide formée uniquement par des lettres,
de la crypter selon le principe décrit ci-dessus et d'afficher le tableau de code obtenu.

Corrigé :
program Sujet1_8h_2015;
uses wincrt;
const
p=17;
q=19;
e=5;
type
tab=array[1..255] of byte;
var
msg:string;
t:tab;

function verif (msg:string):boolean;


var
ok:boolean;
i:byte;
begin
i:=0;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

repeat
i:=i+1;
ok:=upcase(msg[i]) in ['A'..'Z'];
until (not ok) or (i=length(msg));
verif:=ok
end;

procedure saisir (var msg:string);


begin
repeat
write('le message a cryter est : ');
readln(msg);
until(verif(msg))and(msg<>'');
end;

procedure remplir(var t:tab;msg:string);


var
i:byte;
begin
for i:=1 to length(msg) do
begin
t[i]:=ord(upcase(msg[i]))-64;
end;
end;

function puiss(a,b:byte):longint;
var
i,p:longint;
begin
p:=1;
for i:=1 to b do
p:=p*a;
puiss:=p;
end;

procedure modifier(var t:tab;x,p,q,e:byte);


var i:byte;
begin
for i:=1 to x do
begin
t[i]:=puiss(t[i],e) mod(p*q);
end;
end;

procedure affiche(t:tab;x:byte);
var

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

i:byte;
begin
for i:=1 to x do
begin
write(t[i],' | ');
end;
end;

begin
saisir(msg);
remplir(t,msg);
modifier(t,length(msg),p,q,e);
affiche(t,length(msg));
end.

Sujet 8h_2017 :
Dans un tableau d'entiers, l'existence d'au minimum de deux éléments pairs d'une façon consécutive forme
ce qu'on appelle une séquence paire.
On se propose d'écrire un programme intitulé Occ_Pair qui permet de remplir un tableau T par N entiers
(avec 3 < N < 20) et d'afficher le nombre de séquences paires de ce tableau ainsi que les entiers de chacune
de ces séquences.
Exemple :
Pour N = 15 et le tableau T suivant :
T 3 18 6 5 3 4 32 8 9 12 5 10 2 1 8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Séquence 1 Séquence 2 Séquence 3

Le programme affiche :
Le nombre de séquences paires est 3.
Les séquences d'entiers pairs sont :
18 , 6
4 , 32 , 8
10 , 2
Pour cela, on donne l'algorithme du programme principal suivant :
0) Début Occ_Pair
1) Ecrire ("Donner la taille du tableau : "), Lire (N)
2) Proc Remplir (T,N)
3) Proc Afficher (T,N)
4) Fin Occ_Pair

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Travail demandé :

a. Traduire l'algorithme Occ_Pair en un programme Pascal et ajouter les déclarations nécessaires.


b. Transformer la séquence n°1 en un module en ajoutant les contraintes nécessaires et apporter les
modifications nécessaires dans le programme principal.
c. Développer le module Remplir qui permet de remplir le tableau T par N entiers strictement
positifs.
d. Développer le module Afficher qui permet d'afficher le nombre de séquences d'entiers pairs du
tableau T ainsi que les entiers de chacune de ces séquences.

Corrigé :
program sujet_8h_2017;
uses wincrt;
type
tab=array[1..20] of integer;
var
n:byte;
t:tab;

procedure saisir(var n:byte);


begin
repeat
write('donner la taille du tableau : ');
readln(n);
until(n in [3..20]);
end;

procedure remplir(var t:tab;n:byte);


var
i:byte;
begin
for i:=1 to n do
begin
repeat
write('T[',i,']= ');
readln(t[i]);
until(t[i]>0);
end;
end;

function nombre(t:tab;n:byte ):byte;


var
i,nb:byte;
begin
nb:=0;

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

for i:=1 to n-1 do


begin
if ((t[i] mod 2=0) and(t[i-1] mod 2=1) and(t[i+1] mod 2=0)) or((i=1)and(t[i]mod 2=0)and(t[i+1] mod
2=0)) then
nb:=nb+1;
end;
nombre:=nb;
end;

procedure afficher(t:tab;n:byte);
var
i:byte;
begin
writeln('Le nombre de séquences paires est : ',nombre(t,n));
if nombre(t,n) >0 then
begin
writeln('Les séquences pairs sont : ');
for i:=1 to n do
begin
if(i<n) and (t[i] mod 2 =0) and(t[i+1] mod 2=0 ) then
write(t[i],' , ')
else if (t[i] mod 2=0) and(t[i-1] mod 2=0)and(i>1) then
writeln(t[i]);
end;
end;
end;

begin
saisir(n);
remplir(t,n);
afficher(t,n);
end.

Sujet 9h30_2017 :

Le jeu Numbermind est un jeu à deux qui consiste à deviner un numéro de téléphone.
Le principe du jeu est le suivant :
- Le premier joueur propose une combinaison de 8 chiffres représentant le numéro à deviner.
- Le deuxième joueur annonce une proposition de 8 chiffres, si cette proposition correspond au
numéro à deviner, ce joueur est gagnant sinon on lui affiche sa proposition à laquelle on garde
tous les chiffres bien placés et on remplace le reste par des tirets tout en mentionnant les chiffres
corrects mais mal placés dans la proposition.
- On répète l'étape précédente jusqu'à trouver le numéro cherché ou atteindre un nombre d'essais
égal à 8.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Pour simuler ce jeu, on donne l'algorithme du programme principal suivant :


0) Début Numbermind
1) Répéter
Ecrire ("Saisir le numéro de téléphone à deviner : ")
Lire (num)
Jusqu'à (FN vérif (num))
2) Efface_ecran ( )
3) Deviner (num)
4) Fin Numbermind
NB : Efface_ecran est une procédure prédéfinie qui permet d'effacer l'écran; son équivalent en Pascal est
CLRSCR;

Travail demandé :

a. Traduire l'algorithme Numbermind en un programme Pascal et ajouter les déclarations


nécessaires
b. Développer le module Verif qui permet de vérifier si le numéro de téléphone proposé est composé
uniquement par 8 chiffres
c. Développer le module Deviner qui consiste à :
1. Vérifier chaque numéro proposé par le deuxième joueur, en gardant les chiffres bien placés
et en remplaçant le reste par des tirets tout en mentionnant ceux qui sont correctes mais mal
placés dans la proposition et le nombre d'essais qui lui reste.
2. Arrêter le jeu une fois que le deuxième joueur propose un numéro identique au numéro à
deviner ou bien on atteint un nombre d'essai égal à 8.
3. Afficher le message "Bravo, vous avez gagné" si le joueur 2 réussit à déviner le numéro et
le message "Désolé, vous avez perdu" s'il ne devine pas le numéro après 8 essais.

Exemple :Pour le numéro de téléphone à déviner 68456231, le programme affiche :


Vous avez 8 essais
Proposer un numéro de téléphone : 56426179
5 qui est à la position 1 dans la propostion n'est pas à sa bonne position
6 qui est à la position 2 dans la propostion n'est pas à sa bonne position
2 qui est à la position 4 dans la propostion n'est pas à sa bonne position
1 qui est à la position 6 dans la propostion n'est pas à sa bonne position
Il vous reste 7 essais
--4-6---
Proposer un numéro de téléphone :63456331
3 qui est à la position 2 dans la propostion n'est pas à sa bonne position
3 qui est à la position 6 dans la propostion n'est pas à sa bonne position
Il vous reste 6 essais
6-456-31
Proposer un numéro de téléphone : 68456231
Bravo vous

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

Corrigé :
program sujet_9h30_2017;
uses wincrt;
var
num:string;

function verif(ch:string):boolean;
var
i:byte;
ok:boolean;
begin
i:=0;
repeat
i:=i+1;
ok:=ch[i] in ['0'..'9'];
until(i=8) or (not ok);
verif:=ok and(length(ch)=8);
end;

procedure deviner(num:string);
var
nb_essais,i:byte;
nump,ch:string;
begin
nb_essais:=8;
writeln('Vous avez 8 essais');
repeat
repeat
write('Proposez un numéro de téléphone : ');
readln(nump);
until(verif(nump));
ch:='';
for i:=1 to 8 do
begin
if nump[i]=num[i] then
ch:=ch+nump[i]
else
begin
ch:=ch+'-';
if pos(nump[i],num)>0 then
writeln(nump[i],' qui est à la position ',i,' ,''est pas à sa bonne place');
end;
end;
nb_essais:=nb_essais-1;
if nump<>num then

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01
www.3dnetinfo.com

begin
writeln('il vous reste ',nb_essais,' essais');
writeln(ch);
end;
until(nb_essais=0)or (nump=num);
if nump=num then
write('Bravo ! vous avez gagné')
else
write('Désolé! pas de chance') ;
end;

begin
repeat
write('saisir lenuméro de téléphone à deviner :');
readln(num);

until(verif(num));
clrscr;
deviner(num);
end.

+216 72 230230 - direction@3dnetinfo.com


45, Avenue Habib Bourguiba 8000 - Nabeul Etablissement Privé de Formation Professionnelle agrée par l’Etat Visa N° 21-018-01

Vous aimerez peut-être aussi