Série d’exercices de révision
Sujet 1 :
Soit l’algorithme suivant :
0) Début Nombres
1) Lire(n)
2) Si FN Verif(n) Alors
Ecrire(n, est valable)
Finsi
3) Fin Nombres
L’algorithme ci-dessus permet de saisir un entier positif n formé da quatre chiffres et de l’afficher avec la mention est valable , s’il vérifie la condition suivante : Le chiffre des milliers, qui ne doit pas être nul, est suivi par ses multiples.
Exemple :
n = 2888 8 est un multiple de 2
n = 3696 6 et 9 sont des multiples de 3.
n = 1541 5, 4 et 1 sont des multiples de 1.
Questions :
1) Traduire l’algorithme Nombres en Pascal.
2) Transformer la séquence 1) en une procédure saisie en ajoutant les contrôles nécessaires et en tenir compte dans le programme principal.
3) Ecrire la fonction Verif permettant de vérifier si le premier chiffre du nombre n est suivi effectivement par ses multiples ou non.
Sujet 2 :
L’algorithme suivant est celui d’un programme permettant de déterminer et d’afficher si les éléments d’un tableau T de n entiers constituent ou non une suite géométrique.
0) Début suite
1) Répéter
Ecrire (" Donner un entier n " ) ; lire(n)
Jusqu’à n dans [2..15]
2) pour i de 1 à n répéter
3) Répéter
Ecrire (" t[",i, " ]= ") ; lire(t[i])
Jusqu’à (t[i] >0) et ( t[i]<100)
4) Si FN Geometrie(n,t)
Alors Ecrire(" C’est une progression géométrique ")
Sinon Ecrire(" Ce n’est pas une progression géométrique ")
Finsi
5) Fin Suite
Questions :
1. Traduire cet algorithme en Pascal.
2. Transformer la séquence 2) en une procédure Lecture en remplaçant sa boucle Répéter…….. jusqu’à par la fonction Random avec des bons paramètres, et en tenir compte dans le programme principal.
3. Ecrire la fonction Geometrique, de type booléen, permettant de vérifier si les éléments du tableau T forment ou non une suite géométrique.
N.B : Une suite U est dite géométrique si et seulement si il existe un réel q tel que pour tout entier n on a : Un = q * Un – 1
Sujet 3 :
Deux entiers N1 et N2 sont dits frères si chaque chiffre de N1 apparaît au moins une fois dans N2 et inversement.
Ecrire un programme Pascal qui saisit deux entiers N1 et N2, vérifie et affiche s’ils sont frères ou non.
Exemples :
- Si N1 = 1164 et N2 = 614 alors le programme affichera : N1 et N2 sont frères.
- Si N1 = 905 et N2 = 9059 alors le programme affichera : N1 et N2 sont frères.
- Si N1 = 405 et N2 = 554 alors le programme affichera : N1 et N2 ne sont pas frères.
N.B : La solution doit comporter au moins deux modules.
Sujet 4 :
Ecrire un programme Pascal intitulé TRIANGLE qui permet :
- de remplir un tableau T de n chaînes de caractères (2<n<20). Chaque chaîne doit avoir un nombre de caractères supérieur ou égal à son indice dans le tableau T.
- d’afficher pour chaque élément T[i] du tableau, les i premiers caractères de la chaîne.
Exemple : Soit T un tableau de 6 chaînes de caractères :
Bit Modem Ecran Souris Processeur Mémoire
Le programme affichera :
B
Mo
Ecr
Sour
Proce
Mémoir
N.B : La solution doit comporter au moins deux modules.
Sujet 5 :
Ecrire un programme Pascal qui permet de saisir n entiers dans un tableau T (10<n<40) et deux entiers non nuls p et s (p et s doivent être des éléments de T).
On demande d’afficher tous les blocs d’éléments de T placés entre p et s dans l’ordre ; p et s peuvent figurer dans cet ordre plusieurs fois dans T.
Exemple :
Si p = 5 et s = 3
Et si on donne le tableau T suivant :
7 5 0 2 3 9 1 5 6 3
Alors le résultat de l’affichage sera : 0 2 6
N.B : La solution doit comporter au moins deux modules.
Sujet 6 :
Soit un tableau T de n caractères (5<=n<nmax) qui ne peuvent être que A, B, C et tels que deux éléments successifs du tableau ne sont pas égaux. (nmax est une constante de valeur 15).
On se propose d’insérer un caractère donné Car dans la première position possible dans la position possible dans le tableau T en respectant la règle ci-dessus mentionnée puis d’afficher le tableau T dans son nouvel état(après insertion).
N.B : - Car ne peut être que A, B, ou C et ne peut être inséré ni à la première ni à la dernière position du tableau.
- On suppose que l’insertion d’un nouvel élément est possible en effet n<nmax.
Exemple :
T à l’état initial T à l’état final
B A B C A C B A B A B C B A C B A
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 9
Par la suite on donne l’algorithme suivant:
0) Début Insertion
1) Ecrire( Donner un entier n avec 5<=n<nmax ) , lire (n)
Pour i de 1 à n répéter
Ecrire ( Donner une lettre A ou B ou C )
Lire (t[i])
Fin pour
2) Proc insert_car (car, t, n)
3) Proc Affiche (n, t)
4) Fin Insertion
Questions :
4) Traduire l’algorithme Nombres en Pascal.
5) Transformer la séquence 1) en une procédure saisie en ajoutant les contrôles nécessaires et en tenir compte dans le programme principal.
6) Ecrire la procédure insert_car permettant d’insérer un caractère Car dans un tableau T, tout en respectant les conditions mentionnées ci-dessous.
7) Ecrire la procédure Affiche permettant d’fficher les éléments de T après insertion de Car.
Sujet 7 :
Ecrire un programme Pascal qui permet de :
a) de saisir un tableau T de N chaînes de caractères non vides composée chacune d’un maximum de 5 caractères (N est une constante de valeur 10).
b) de garder la première occurrence pour les éléments redondants (qui apparaissent plus q’une fois) et de remplacer toutes les autres occurrences par des chaînes vides.
c) d’afficher les chaînes non vides restantes du tableau T.
Exemple :
Ali Ali Salem Amal Eya Mohamed Amal Salem Salem Aziz
1 2 3 4 5 6 7 8 9 10
T initial
Ali Salem Amal Eya Mohamed Aziz
1 2 3 4 5 6 7 8 9 10
T final
On propose l’algorithme suivant :
0) Début non_redondance
1) Pour i de 1 à n Répéter
lire (t[i])
Finpour
2) Proc Remplace (N,T)
3) Proc Affiche (N,T)
4) Fin non_redondance
Questions :
4. Traduire cet algorithme en Pascal.
5. Transformer la séquence 1) en une procédure saisie et y ajouter les contrôles nécessaires pour la saisie des éléments du tableau T.
6. Ecrire la procédure remplace permettant de réaliser le traitement b) ci-dessus mentionné.
7. Ecrire la procédure Affiche permettant d’afficher les éléments non redondants du tableau T.
Sujet 8 :
Ecrire un programme Pascal qui permet de saisir n entiers de trois chiffres chacun (n est une constante) puis de chercher et d’afficher les nombres symétriques de T.
Exemple :
424 715 133 121 454 616 566
1 2 3 4 5 6 7
Pour n = 7 et T
Le programme affichera : Les nombres symétriques de T sont : 424, 121, 454 et 616
On propose l’algorithme suivant :
1) Début Symétrique
2) Proc saisie(T)
3) Ecrire ("Les nombres symétriques de T sont :")
4) Pour i de 1 à n répéter
Si FN verif(T[i]) alors
Ecrire(T[i] :4)
Finsi
Finpour
5) Fin Symétrique
Questions :
1. Traduire cet algorithme en Pascal.
2. Ecrire la procédure saisie permettant de remplir un tableau V par p entiers à trois chiffres.
3. Transformer la séquence 3) en une procédure Affiche et en tenir compte dans le programme principal.
4. Ecrire la fonction Verif permettant de vérifier si un entier m de trois chiffres est symétrique ou non.
Sujet 9 :
Ecrire un programme Pascal qui permet de remplir deux tableau T1 et T2 de n entiers à deux chiffres chacun(2<=n<=15) puis de former un tableau T tel que un élément t[i] est le résultat de la fusion de deux éléments T1[i] et T2[i] selon le principe suivant :
- Insérer le chiffre des dizaines du plus petit nombre parmi T1[i] et T2[i], entre les deux chiffres du plus grand nombre parmi T1[i] et T2[i].
- Mettre le chiffre des unités du plus petit nombre parmi T1[i] et T2[i], à droite du nombre obtenu.
Exemple :
- Pour T1[i] = 52 et T2[i] = 36 , T[i] sera égal à 5326
- Pour T1[i] = 13 et T2[i] = 47 , T[i] sera égal à 4173
On propose l’algorithme suivant :
5) début trait_tab
6) Répéter
Ecrire(" Donner un entier n"), lire (n)
Jusqu’à n dans [2..15]
7) Proc saisie (n,T1)
Proc saisie (n,T2)
9) Proc Fusion (n,T1,T2,T)
10) Pour i de 1 à n répéter
Ecrire (T[i])
Finpour
6) Fin trait_tab
Questions :
5. Traduire cet algorithme en Pascal.
6. Ecrire la procédure saisie permettant de remplir un tableau T par p entiers à deux chiffres.
7. Ecrire procédure Fusion permettant de remplir un tableau F, à partir de deux tableaux V1 et V2 de p éléments chacun, selon le principe ci-dessus.
Solutions des exercices de révision
Sujet 1 :
program nombres;
uses wincrt;
var
n:integer;
procedure saisie(var n:integer);
begin
repeat
writeln('Donner un entier composé de 4 chiffres');
readln(n);
until n>1000;
end;
function verif(n:integer):boolean;
var
u,d,c,m:integer;
begin
u:= n mod 10;
d:=(n mod 100)div 10;
c:=(n mod 1000) div 100;
m:= n div 1000;
verif:=false;
if (u mod m = 0) and (d mod m = 0) and (c mod m =0) then
verif:=true;
end;
begin
saisie(n);
if verif(n) = true then Writeln(n ,' est valable')
else
Writeln(n ,' n''est pas valable');
end.
Sujet 2 :
program suite;
uses wincrt;
type
tab = array [1..100] of integer;
var
n,i : integer;
t : tab;
procedure lecture (var t:tab; n:integer);
var i:integer;
begin
randomize;
for i:=1 to n do
T[i] := random(99)+1;
end;
function geometrie(n: integer ; t:tab): boolean;
var
q: real;
i:integer;
geo : boolean;
begin
q := T[2] / T[1];
geo := false;
i:=1;
repeat
if T[i+1] / T[i] = q then
geo := true else geo:= false;
i:=i+1;
until((i= n-1) or (geo = false));
geometrie := geo;
end;
begin
repeat
writeln('donner un entier'); readln(n);
until(n in [2..15]);
lecture(t,n);
for i:= 1 to n do
writeln(T[i]);
if geometrie(n,t) then
writeln('c''est une progression geometrique') else
writeln('ce n''est pas une progression geometrique');
end.
Sujet 3 :
program frere;
uses wincrt;
var
n1,n2:integer;
procedure saisie(var n1,n2:integer);
begin
writeln('Donner n1');
readln(n1);
writeln('Donner n2');
readln(n2);
end;
procedure freres(n1,n2:integer);
var
i,j,c1,c2:integer;
ch1,ch2:string;
begin
str(n1,ch1);
str(n2,ch2);
i:=0;c1:=0;c2:=0;
repeat
i:=i+1;
if (pos(ch1[i],ch2)<> 0 ) then
c1:=c1+1;
until (i=length(ch1))or(ch1[i],ch2)= 0);
j:=0;
repeat
j:=j+1;
if (pos(ch2[j],ch1)<> 0 ) then
c2:=c2+1;
until (j=length(ch2)) or(ch2[i],ch1)= 0);;
if (length(ch2) = c2) and (length(ch1)=c1)then
writeln('Frere')
else
writeln('Non Frere');
end;
begin
saisie(n1,n2);
freres(n1,n2);
end.
Sujet 4 :
program triangle;
uses wincrt;
type
tab=array [1..20]of string;
var
t:tab;
n:integer;
procedure saisie_n_t (var n:integer;var t:tab);
var
i:integer;
begin
repeat
write('Donner la taille du tableau ');
readln (n);
until n in [3..19];
for i:=1 to n do
repeat
write('t[',i,']=');readln (t[i]);
until length (t[i])>i;
end;
procedure affiche (t:tab;n:integer);
var
i:integer;
ch:string;
begin
for i:=1 to n do
begin
ch:=copy(t[i],1,i);
writeln(ch);
end;
end;
begin
saisie_n_t(n,t);
affiche(t,n);
end.
Sujet 5 :
program sequence_p_s;
uses wincrt;
type tab=array[1..100] of integer;
var
n:integer;
t:tab;
procedure saisiet(var t:tab;n:integer);
var i:integer;
begin
for i:=1 to n do
begin
writeln('T[',i,']= '); readln(T[i]);
end;
end;
function existe(t:tab;n,p:integer):boolean;
var
i:integer;
begin
i:=0;
existe:=false;
repeat
i:=i+1;
until (t[i]=p) or (i=n);
if t[i]=p then existe:=true;
end;
Procedure sequence( t:tab; n:integer);
var
i,j,p,s:integer;
begin
repeat
write('p=');
readln(p);
until (p<>0) and existe (t,n,p);
repeat
write('s=');
readln(s);
until (s<>0) and existe (t,n,s);
for i:= 1 to n-1 do
begin
if t[i]=p then begin
j:=i+1;
while (t[j]<>s) do
begin
write(t[j],' ');
j:=j+1;
end;
end;
end;
end;
begin
repeat
write ('Donner la taille du tableau');
readln(n);
until n in [11..39];
saisiet(t,n);
sequence(t,n);
end.
Sujet 6 :
program insertion;
uses wincrt;
const Nmax = 15;
type
tab = array[1..15] of char;
var
t:tab;
n:integer;
car : char;
procedure saisie( var t:tab ; var n: integer);
var i: integer;
begin
repeat
writeln('donner un enetier n avec 5<=n<Nmax'); readln(n);
until ((n>=5) and( n <Nmax));
repeat
writeln('donner le premier caractere'); readln(T[1]);
until(T[1] in ['A','B','C']);
for i:= 2 to n do
repeat
writeln('donner une lettre A ou B ou C');
readln(T[i]);
until((T[i] = 'A') or (T[i] = 'B') or (T[i] = 'C') and (T[i] <> T[i+1]));
end;
procedure affiche(n:integer ; t:tab);
var i: integer;
begin
for i:=1 to n+1 do
writeln(T[i]);
end;
procedure insert_Car(car:char; var t:tab;n:integer);
var
pos, i,j: integer; trv : boolean ;
begin
trv := false;
i:=2;
repeat
if ((T[i] <> car) and (T[i+1]<> car) and (T[i+2] <> car)) then
BEGIN
pos := i;
TRV := TRUE;
end;
i:=i+1;
until(i=n)or (trv = true);
for j:= n+1 downto pos+1 do
t[j] := T[j-1];
t[pos+1]:= car;
end;
begin
saisie(t,n);
repeat
writeln('donner un caractere A ou B ou C'); readln(car);
until(car in ['A','B','C']);
insert_Car(car,t,n);
writeln('***************');
affiche(n,t);
end.
Sujet 7 :
program Non_redondance;
uses wincrt;
const N = 10;
type
tab = array[1..N] of string;
var
t:tab;
procedure saisie( var t:tab ; n: integer);
var i: integer;
begin
for i:= 1 to n do
repeat
writeln('donner une chaine de caractere numero' , i);
readln(T[i]);
until((length(T[i]) <=5) and (T[i] <> ''));
end;
procedure remplace(n:integer ; var t:tab);
var i,j : integer;
begin
for i:=1 to n do
for j:=i+1 to n do
if t[i] = T[j] then
t[j] := '';
end;
procedure affiche(n:integer ; t:tab);
var i: integer;
begin
for i:=1 to n do
if (t[i] <> '' ) then
writeln(T[i]);
end;
begin
saisie(t,n);
remplace(n,t);
affiche(n,t);
end.
Sujet 8 :
program symetrie;
uses wincrt;
const N=10;
type
tab = array[1..10] of integer;
var
T:tab;
i: integer;
procedure saisie(var V:tab ; p:integer);
var i : integer;
begin
for i:=1 to p do
repeat
writeln('donner un entier de trois chiffres ', i);
readln(V[i]);
until(((V[i]) >= 100) and (V[i] <= 999));
end;
function verif(x : integer) : boolean;
var u,d,c : integer;
begin
c := x div 100;
d := x mod 100 div 10;
u := x mod 10;
if c=u then verif := true else verif := false;
end;
procedure affiche(t:tab ; n: integer);
var i: integer;
begin
for i:=1 to n do
if verif (T[i]) then
writeln(T[i]:4);
end;
begin
saisie(T,n);
writeln('les nombres symetriques de t sont:');
affiche(t,n);
end.
Sujet 9 :
program trait_tab;
uses wincrt;
type
tab = array[1..15] of integer;
var
t,t1,t2 : tab;
n,i : integer;
procedure saisien (var n: integer);
begin
repeat
writeln('donner un entier N'); readln(n);
until(n in [2..15]);
end;
procedure saisie( p : integer; var T:tab);
var i: integer;
begin
for i:= 1 to p do
repeat
writeln('donner un entier numero ', i);
readln(T[i]);
until (T[i] in [0..99]);
end;
procedure fusion (N:integer; t1, t2: tab; var t:tab);
var
i,UMX,UMN,DMX,DMN, Min, Max : integer;
begin
for i:=1 to n do
begin
if T1[i]>T2[i] then
Max := T1[i]
else Max := T2[i];
if T1[i]<T2[i] then
Min := T1[i]
else Min := T2[i];
UMX := Max mod 10;
DMX := Max div 10;
UMN := Min mod 10;
DMN := Min div 10;
T[i] := DMN*100 + UMN*1+DMX*1000+ UMX*10;
end;
end;
begin
saisien(n);
saisie(N,T1);
saisie(N,T2);
fusion (N,T1,T2,T);
for i:= 1 to n do
writeln (T[i]);
end.