Académique Documents
Professionnel Documents
Culture Documents
com
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
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;
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: ');
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
begin
end.
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);
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.
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.
Corrigé :
program ex2;
uses wincrt;
var
mot:string;
begin
repeat
writeln('saisir ch: ');
readln (mot);
until(length(mot)=4);
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]);
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
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));
inf:=n1;
if(n2< inf)then
inf:=n2
else if (n3 < inf)then
inf:=n3;
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);
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);
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;
s:=0;
if(m=60)then
begin
h:=h+1;
m:=0;
if(h=24)then
begin
h:=0;
end;
end;
end;
1
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) ;
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.
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')
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.
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;
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
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));
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
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
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.
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);
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
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
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.
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);
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 :
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
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.
Exercice 3 :
x − x 3 + x 5 − x 7 + x 9 −...
Sachant que sin (x) = 1! 3! 5! 7! 9!
Corrigé :
Program ex3;
uses wincrt;
var
x:real;
begin
write ('donner un réel x: ');
readln(x);
write ('sin(', x:1:2,') = ', sinus(x):10:10);
end.
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;
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;
end;
until(trouve);
str(a,e);
res:=res+e+c;
end;
until (ch='');
cryptage:=res;
end;
alpha:=v;
end;
begin
saisir(ch);
writeln( cryptage(ch));
end.
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;
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;
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;
repeat
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.
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 ;
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;
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.
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
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;
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.
Corrigé :
program sujet_13h_2015 ;
uses wincrt ;
var a,b,Vp:word; p:string;
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.
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.
Corrigé :
program 11h_2015;
uses wincrt;
type
w=string[12];
tab=array[1..50] of w;
var
n:byte;
t:tab;
function verif(ch:w):boolean;
begin
while(ch<>'') and(ch[1] in ['A'..'Z']) do
delete(ch,1,1);
verif:=ch='';
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;
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.
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 :
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;
Function inverse(ch:string):string;
var i:byte;
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.
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;
repeat
i:=i+1;
ok:=upcase(msg[i]) in ['A'..'Z'];
until (not ok) or (i=length(msg));
verif:=ok
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 affiche(t:tab;x:byte);
var
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
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
Travail demandé :
Corrigé :
program sujet_8h_2017;
uses wincrt;
type
tab=array[1..20] of integer;
var
n:byte;
t:tab;
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.
Travail demandé :
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
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.