You are on page 1of 62

Exercices en Turbo Pascal

Salah Fenni

2010
LES STRUCTURES SIMPLES
Exercice 1
a) Les variables N, P et Q sont entires et contiennent respectivement les valeurs 5, 7 et 3. Les
expressions suivantes sont-elles correctes. Si oui, donnez leur type et leur valeur.
N mod P * Q
N mod P div Q
N = P Or N <= Q
SUCC ('N' + 'P')
b) La variable C est de type caractre et contient la valeur 'e'. Les expressions suivantes sont-
elles correctes. Si oui, donnez leur type et leur valeur.
PRED (C) + 'e'
ORD (C) + 2.5
CHR (ORD (C) - 32)
CHR (SUCC (ORD (C)))
c) Si N est une variable entire et X une variable relle, quelles sont les affectations possibles :
X := N ;
N := X+1 ;
N := TRUNC(X) +1 ;
N := INT(X) +1 ;
N := ROUND(X) +1.5 ;
N := ROUND(X+1.5) ;
d) Pour chaque opration de lecture ou d'criture, mettre V si l'opration est possible et F dans
le cas contraire.
[ ] Lire (A) [ ] Lire (45) [ ] Lire (A+B)
[ ] Lire ("A") [ ] Lire ("A =", A) [ ] Ecrire (X+2*Y)
[ ] Ecrire ("A =", A) [ ] Ecrire (A, " ", B) [ ] Ecrire (A:6:2)
[ ] Ecrire (5 mod 7 div 2) [ ] Ecrire ("Saisir un rel") [ ] Ecrire (45)

Exercice 2
Ecrire un algorithme puis la traduction en Pascal d'un programme intitul Sortie_inverse, qui
saisit trois nombres dans un ordre donn et les affiche dans lordre oppos lentre.

Exercice 3
Ecrire un algorithme puis la traduction en Pascal d'un programme intitul Cylindre, qui calcule
et affiche le volume d'un cylindre aprs saisie son rayon R et sa hauteur H.

Exercice 4
Ecrire un algorithme puis la traduction en Pascal d'un programme Surface_Rectangle, qui
calcule la surface d'un rectangle de dimensions donnes et affiche le rsultat sous la forme
suivante : "La surface du rectangle dont la longueur mesure .... m et la largeur mesure .... m,
a une surface gale .... mtres carrs".

Exercice 5
Ecrire un algorithme puis la traduction en Pascal d'un programme Piscine, qui lit les
dimensions d'une piscine, et affiche son volume et la quantit d'eau ncessaire pour la remplir.

Exercice 6
Ecrire un algorithme puis la traduction en Pascal d'un programme Trapze, qui lit les
dimensions d'un trapze et affiche sa surface.

Exercice 7
Ecrire un algorithme puis la traduction en Pascal d'un programme intitul Permut, qui fait la
permutation de deux variables A et B.

Exercice 8
Proposer une marche suivre qui fait, une permutation circulaire droite, des valeurs de
trois variables A, B et C.
Par exemple : partir de (A, B, C) = (10, 25, 4), on passe (A, B, C) = (4, 10, 25).

|2
Exercice 9
Proposer une marche suivre qui fait la permutation de deux variables numriques X et Y,
sans faire appel aucune variable intermdiaire.

Exercice 10
Ecrire un algorithme puis la traduction en Pascal d'un programme intitul Division, qui fait
calculer et afficher le quotient et le reste de la division euclidienne de A par B.

Exercice 11
Ecrire un algorithme puis la traduction en Pascal d'un programme qui lit une temprature en
degrs Celsius et affiche son quivalent en Fahrenheit.

Exercice 12
Ecrire un algorithme puis la traduction en Pascal d'un programme permettant de dterminer et
d'afficher la conversion en mile marin d'une distance mesure en kilomtre.

Exercice 13
Ecrire un algorithme puis la traduction en Pascal d'un programme qui permet de convertir et
d'afficher en octets, kilo octets, mga octets et giga octets un nombre donn en bits.

Exercice 14
Ecrire un algorithme puis la traduction en Pascal d'un programme, qui convertit en heures,
minutes et secondes, une dure T donne en secondes. Il affiche le rsultat sous la forme
digitale comme celle d'une montre lectronique (hh : mn : ss).

Exercice 15
Ecrire un algorithme puis la traduction en Pascal d'un programme, qui conjugue un verbe du
premier groupe au futur simple. On ne traite pas les verbes irrguliers.

Exercice 16
Ecrire un algorithme puis la traduction en Pascal d'un programme, qui calcule et affiche,
l'intrt et la valeur acquise par une somme place en pargne pendant 5 ans intrt
simple.

Exercice 17
On sait qu'avec un rservoir de L litres, une voiture a parcouru Y km. Ecrire un algorithme puis
la traduction en Pascal d'un programme, qui fait lire les donnes ncessaires et fait calculer et
afficher le taux de consommation aux 100 km de cette voiture.

Exercice 18
Ecrire un algorithme puis la traduction en Pascal d'un programme, qui calcule la rsistance
quivalente de 3 rsistances montes en parallle.
On rappelle : 1/R = 1/R1 + 1/R2 + 1/R3

Exercice 19
On se propose de saisir un entier N de trois chiffres non nuls, de dterminer et d'afficher tous
les nombres qui peuvent tre forms par les chiffres de N.
Exemple : pour N=427
Les nombres forms par les chiffres de N sont : 427, 472, 724, 742, 247, 274.

Exercice 20
Ecrire un algorithme puis la traduction en Pascal d'un programme, qui fait entrer deux entiers
A et B et fait calculer et afficher leur inf et leur sup.
Utiliser une formule mathmatique donnant directement le rsultat.

|3
LES STRUCTURES CONDITIONNELLES
Exercice 1
Ecrire un programme Pascal intitul MIN2 qui affiche le plus petit de deux nombres A et B.

Exercice 2
Ecrire un programme Pascal intitul MAX3 permettant d'obtenir le maximum de trois nombres
donns.

Exercice 3
Ecrire un programme Pascal intitul RACINE qui affiche la racine carre d'un rel donn.

Exercice 4
La surface d'un triangle de cts a, b et c est donne par :

Surf = p ( p a )( p b )( p c ) O p = (a+b+c)/2
Ecrire un programme Pascal intitul Aire_triangle qui lit les valeurs de a, b et c, calcule et
affiche SURF.

Exercice 5
Sans utiliser la fonction prdfinie ABS, crire un programme Pascal intitul ABS_DIFF qui
dtermine et affiche la valeur absolue de (a-b).

Exercice 6
Ecrire un programme Pascal intitul PARITE qui saisit un nombre entier et dtecte si ce
nombre est pair ou impair.

Exercice 7
Ecrire un programme Pascal intitul chez_la_fourmi, permettant de simuler un jeu entre
deux joueurs rgi par le principe suivant :
Deux joueurs A et B se cachent la main droite derrire le dos. Les deux joueurs se montrent la
main droite en mme temps, en choisissant de tendre un certain nombre de doigts (de 1 5).
Si la somme des nombres de doigts montrs est paire, le premier joueur a gagn, sinon c'est
le second.

Exercice 8
Ecrire un programme Pascal intitul INVITE, qui saisit le prnom d'une personne et son titre
(Mr, Mlle ou Mme), puis affiche l'invite suivante :

"Titre"foulen", soyez le bienvenu" ou "Titre"foulena", soyez la bienvenue"

Exercice 9
Ecrire un programme Pascal intitul SUP_INF qui saisit deux entiers A et B, teste si A est
suprieur, infrieur ou gale B puis affiche le rsultat.

Exercice 10
Ecrire un programme Pascal intitul ORDRE qui ordonne dans le sens croissant, en changeant
leur valeur si ncessaire, deux entiers saisis au clavier.

Exercice 11
Ecrire un programme Pascal intitul TRI, qui fait lire trois entiers A, B et C, les permute de
faon les classer par ordre croissant puis affiche le rsultat.

Exercice 12
Ecrire un programme Pascal intitul EQUA_1D, qui fait rsoudre dans IR l'quation ax+b=0
pour tout couple de rels (a, b) donn.

Exercice 13
Ecrire un programme Pascal intitul EQUA_2D, qui fait rsoudre dans IR l'quation
ax2+bx+c=0 pour tout triplet de rels (a, b, c) donn.

|4
Exercice 14
Ecrire un programme Pascal intitul INEQUATION, qui fait rsoudre dans IR l'inquation
ax+b<0 pour tout couple de rels (a, b) donn.

Exercice 15
Ecrire un programme Pascal intitul TOUCHE qui affiche selon le cas, la nature du caractre
(consonne, voyelle, chiffre ou symbole) correspondant une touche saisie.

Exercice 16
Ecrire un programme Pascal intitul CALCULETTE, qui fait lire dans cet ordre : un rel, un
oprateur arithmtique (+, -, *, /) et un autre rel. A chaque oprateur valide correspond une
opration arithmtique qu'il faut excuter et afficher le rsultat ou un message d'erreur, le cas
chant.

Exercice 17
Ecrire un programme Pascal intitul BULLETIN, qui permet de saisir la moyenne annuelle d'un
lve et affiche la dcision du conseil de classe, la mention adquate dans le cas o l'lve est
admis :
18 moy Excellent
16 moy < 18 Trs Bien
14 moy < 16 Bien
12 moy < 14 Assez Bien
10 moy < 12 Passable
Moy < 10 Redouble

Exercice 18
Ecrire un programme Pascal intitul JOURS qui saisit le numro du mois et affiche le nombre
de jours de ce mois. Pour le cas de fvrier, on lit l'anne, si l'anne est bissextile, le nombre de
jours est 29, sinon c'est 28 jours.

Exercice 19
Ecrire un programme Pascal intitul DATE, qui saisit une date sous la forme jj/mm/aaaa
(chane de 10 caractres) et l'affiche dcode (jj Mois aaaa).
Exemple : 10/05/2007 donne 10 Mai 2007.

Exercice 20
Ecrire un programme Pascal intitul ANCIENNETE, qui fait lire une date initiale JI/MI/AI et
une date finale JF/MF/AF et qui fait calculer et afficher la dure (exprime en annes, mois et
jours) qui les spare.

Exercice 21
Ecrire un programme Pascal intitul LENDEMAIN, qui saisit une date quelconque (jj, mm, aa)
et affiche la date du lendemain.

Exercice 22
Ecrire un programme Pascal intitul TOUTE_LETTRE, qui traduit en toutes lettres un entier
naturel donn entre 0 et 99.
Exemples : 10 Dix
21 Vingt et un
85 Quatre vingt cinq

Exercice 23
Ecrire un programme Pascal intitul Jour_Semaine, qui permet de dterminer le jour de la
semaine correspondant une date donne.
Exemple : le 10/05/2007 est un jeudi.

|5
LES STRUCTURES ITERATIVES
Exercice 1
Ecrire un programme Pascal qui affiche l'alphabet en majuscule, d'abord l'endroit, puis
l'envers, aprs un passage la ligne.

Exercice 2
Ecrire un programme Pascal qui affiche la table de multiplication par 3, pour les entiers de
1 10.

Exercice 3
Ecrire un programme Pascal qui calcule et affiche la somme et le produit, des 20 premiers
entiers (de 1 20).

Exercice 4
Considrons la suite dfinie par la relation : Un+1 = Un + 3 et U1 = 2
On veut calculer la somme de 100 premiers termes de cette suite. Donner trois solutions
distinctes en utilisant les boucles : POUR, TANT QUE et REPETER.

Exercice 5
Ecrire un programme Pascal qui affiche la table de Pythagore (table de multiplication) pour
les 9 premiers nombres entiers.

Exercice 6
Ecrire cinq programmes Pascal permettant dafficher les triangles dtoiles suivants :
Exemple : (pour nL=5)

* ********* * ***** ***** *


*** ******* ** **** **** **
***** ***** *** *** *** ***
******* *** **** ** ** ****
********* * ***** * * *****
Ecrire deux programmes Pascal permettant dafficher les pyramides de nombres suivants :
Exemple : (pour nL=6)

1 1
232 121
34543 12321
4567654 1234321
567898765 123454321
67890109876 12345654321

Exercice 7
Ecrire un programme Pascal qui permet de calculer et afficher la moyenne de notes fournies
au clavier avec un "dialogue" se prsentant ainsi :
Combien de notes : 4
Note 1 : 12
Note 2 : 15.25
Note 3 : 13.5
Note 4 : 8.5
Moyenne de ces 4 notes : 12.31
Exercice 8
Ecrire un programme Pascal faisant calculer et afficher le factoriel dun entier naturel N
donn. Sachant que (pour N>0) : N ! = N x (N-1) x (N-2) x ...... 3 x 2 x 1.

Exercice 9
Le "jeu du nombre mystrieux" consiste jouer contre l'ordinateur comme suit :
L'ordinateur choisit, au hasard, un entier entre 1 et 100 et on doit le trouver en 7 essais au
maximum grce aux indices "C'est grand" et "C'est petit". Au moment venu on affichera "Bravo
vous avez gagn !!". Si le nombre d'essais est atteint sans trouver le nombre mystrieux, le
programme affichera alors "Perdu, le nombre cherch est : ", suivie du nombre trouver.
Ecrire un programme Pascal pour s'amuser avec l'ordinateur.

|6
Exercice 10
Ecrire un programme Pascal qui permet de saisir un entier n, dterminer et d'afficher tous ses
chiffres qui le divisent.
Exemple : pour n = 2376 alors les chiffres 2, 3 et 6 seront affichs.

Exercice 11
Ecrire un programme Pascal SOM_15, qui dtermine toutes les manires possibles d'obtenir
un total de 15 en ajoutant trois entiers choisis entre 1 et 9.

Exercice 12
On se propose d'afficher un histogramme l'aide des lettres A, B et C comme celui de
l'exemple ci-dessous.
Ecrire un programme Pascal qui saisit le nombre de A, le nombre de B et le nombre de C puis
affiche l'histogramme correspondant. Les nombres sont des entiers naturels infrieurs ou
gaux 15.
Exemple d'excution :
Entrer trois nombres entiers compris entre 0 et 15 : 5, 8, 3

B
B
B
A B
A B
A B C
A B C
A B C

Exercice 13
Ecrire un programme Pascal SOM_CHIFFRES, qui permet de dterminer la somme des
chiffres d'un nombre entier donn (exemple : pour N= 25418, on aura 2+5+4+1+8 = 20).

Exercice 14
Un entier naturel de trois chiffres est dit cubique s'il est gal la somme des cubes de ses trois
chiffres.
Exemple : 153 est cubique car 153 = 13 + 53 + 33
Ecrire un programme Pascal NBR_CUBE qui cherche et affiche tous les entiers cubiques de
trois chiffres.

Exercice 15
Ecrire un programme Pascal SOMME, qui calcule et affiche les sommes suivantes :
S1 = 1 + 1/2 + 1/3 + 1/4 + ......... +1/n
S2 = 1 + 1/3 + 1/5 + ......... + 1/n Avec n, un entier naturel impair donn.
S3 = -1/2 - 1/4 - 1/6 - ......... - 1/(n-1)

Exercice 16
On donne un entier naturel n strictement positif et on dfinit la suite de Syracuse par :
S 0 = n
Si S k 1 est pair
S k = S k 1div 2
S = 3S + 1 Si S k 1 est impair
k k 1
Ecrire un programme Pascal qui fait afficher les 50 premiers termes de cette suite.

Exercice 17
Si nous lanons 3 ds, le total des points est compris entre 3 et 18. Quelle est la probabilit
d'avoir un total de 12 ?
Ecrire un programme Pascal PROBABILITE, qui rpond cette question en simulant 100
lancers successifs.

Exercice 18
Un nombre rel X et un nombre entier N tant donn, proposer un programme Pascal qui fait
calculer Xn. Etudier tous les cas possibles (N positive ou ngative).

|7
Exercice 19
Ecrire un programme Pascal qui saisit deux entiers X et Y, et fait calculer lexpression S=X*Y
par additions successives (X*Y=X+X+X+...).
Choisir la somme qui fait intervenir le minimum de termes.

Exercice 20
Pour un entier naturel N donn. Ecrire un programme Pascal qui fait calculer et afficher la
suite : S = 1 + 1 + 1 + ..... + 1
0! 1! 2! n!
Exercice 21
On remarque que : 12 x 42 = 21 x 24
12 x 63 = 21 x 36
12 x 84 = 21 x 48
Il y a 14 produits qui vrifient la proprit : (10 a + b) (10 c + d) = (10 b + a) (10 d + c), o
a est diffrent de b et c est diffrent de d.
Ecrire un programme Pascal qui fait sortir tous ces entiers.

Exercice 22
On se propose de dterminer une valeur approche de par la mthode de Wallis, dfinie
par la formule suivante :
2 2 4 4 6 6 8 8
= x x x x x x x x ....
2 1 3 3 5 5 7 7 9
Ecrire un programme Pascal qui utilise la formule ci-dessus pour dterminer et afficher une
valeur approche de 10-8 prs.

Exercice 23
On se propose de dterminer le PGCD (Plus Grand Commun Diviseur) de deux entiers positifs
non nuls A et B en utilisant l'algorithme d'Euclide qui repose sur le principe suivant :
Si B=0 alors PGCD (A, B) = A sinon PGCD (A, B) = PGCD (B, A mod B)

Exemple : PGCD (32, 12) = PGCD (12, 8) = PGCD (8, 4) = PGCD (4, 0) = 4.

Exercice 24
On se propose de dterminer le PGCD (Plus Grand Commun Diviseur) de deux entiers positifs
non nuls A et B en utilisant la mthode de la diffrence qui repose sur le principe suivant :
Si A=B alors PGCD (a, b)= a (ou b)
Sinon PGCD (A, B) = PGCD (a-b, b) si a>b
Sinon PGCD (a, b) = PGCD (a, b-a)

Exemple : PGCD (10,16) = PGCD (10,6) = PGCD (4,6) = PGCD (4,2) = PGCD (2,2) = 2.

Exercice 25
On se propose de dterminer le PPCM (Plus Petit Commun Multiple) de deux entiers positifs
non nuls A et B.

Exercice 26
Les nombres de Fibonacci sont donns par la rcurrence :
Fn = Fn-2 + Fn-1 avec F0 = 1 et F1 = 1.
Ecrire un programme Pascal qui affiche les 20 premiers nombres de Fibonacci.

Exercice 27
Un entier suprieur 1 est dit premier s'il n'est divisible que par 1 et par lui-mme.
Ecrire un programme Pascal qui cherche et affiche tous les nombres premiers 400.

Exercice 28
Un nombre entier naturel est dit parfait s'il est gal la somme de ses diviseurs sauf lui-
mme. Ecrire un programme Pascal permettant de dterminer et d'afficher tous les nombres
parfaits compris entre a et b (2<a<b).

|8
Exercice 29
Deux entiers m et n sont dis amis si et seulement si la somme des diviseurs de m sauf lui-
mme est gale n et la somme des diviseurs de n sauf lui-mme est gale m.
Ecrire un programme Pascal permettant de dterminer et d'afficher tous les nombres amis
compris entre 1 et 1000.

Exercice 30
Ecrire un programme Pascal permettant de dcomposer un entier N donn (2 N 100) en
produit de facteurs premiers et d'afficher N et le produit de ses facteurs trouvs.
Exemple : Si n = 60 alors on affiche 60 = 2*2*3*5.

Exercice 31
x x3 x5 x7 x9
Sachant que s in ( x ) = + + ...... tel que x [0, 2].
1! 3 ! 5! 7! 9!
Ecrire un programme Pascal qui permet d'afficher sin(x) en utilisant la formule ci-dessus. Le
calcul s'arrte quand la diffrence entre deux termes conscutifs devient 10-4. La dernire
somme calcule est une valeur approche de sin(x).

Exercice 32
Ecrire un programme Pascal qui donne une approximation de :
x x2 x3 xn
e  1+
x
+ + + ... + epsilon prs.
1! 2! 3! n!
xn
Le calcul sarrte lorsque epsilon . X et Epsilon sont des donnes.
n!

Exercice 33
Soit la somme Sn suivante :
3 5 7 2n 1
Sn = 1 + 2
+ 3 + 4 + ...... +
2 3 4 nn
Ecrire un programme Pascal intitul SOMME permettant de calculer et d'afficher la somme Sn
pour un entier n positif donn en utilisant la formule ci-dessus.

Exercice 34
Ecrire un programme Pascal intitul COMBINAISON, qui lit deux entiers naturels n et p avec
(0<p<n), puis calcule et affiche le nombre de combinaisons de p objets parmi n.
n!
On rappelle que : C np =
p ! ( n p )!

Exercice 35
Un entier de n chiffres (1<n<9) est dit bien ordonn si ses chiffres forment, de gauche
droite, une suite strictement croissante.
Exemple :
L'entier de 3 chiffres, 147 est bien ordonn car 1<4<7
L'entier de 4 chiffres, 1265 n'est pas bien ordonn car 6>5
Ecrire un programme Pascal qui saisit un entier n (1<n<9) et fait sortir tous les entiers bien
ordonns de n chiffres et le nombre total de ces entiers.

Exercice 36
Ecrire un programme Pascal qui affiche tous les entiers positifs impairs infrieurs 100, en
omettant les nombres divisibles par 7. L'affichage doit tre sur 5 colonnes comme l'aspect
suivant :
1 3 5 9 11
13 17 19 23 25
27 29 31 33 37
.. .. .. .. ..

|9
Exercice 37
On se propose dcrire un programme Pascal qui permet de dterminer et dafficher toutes les
reprsentations sous forme de sommes dentiers conscutifs dun entier n donn.
Exemple dexcution :
Entrer un entier : 45
Les sommes conscutives sont :
45 = 1+2+3+4+5+6+7+8+9
45 = 5+6+7+8+9+10
45 = 7+8+9+10+11
45 = 14+15+16
45 = 22+23

Exercice 38
Considrons un chiquier classique de 64 cases disposes en un carr de 8 lignes composes
de 8 cases. On demande d'crire un programme REINE permettant de lire les coordonnes
(x, y) dfinissant la position de la reine, d'afficher la lettre R la position correspondante et
une * (astrisque) chacune case accessible.
Exemple :
Pour x=2 et y=5 on aura l'affichage :

* * *
* * * * R * * *
* * *
* * *
* * *
* *
*
*

| 10
LES TABLEAUX
Exercice 1
Ecrire un programme Pascal, qui fait remplir un tableau T par n (5<n<=10) entiers compris
entre 1 et 20. Ensuite, il fait calculer et afficher la somme, le produit et la moyenne
arithmtique des lments de T.

Exercice 2
Ecrire un programme Pascal, qui fait remplir un tableau T par n lettres (2<n20). Ensuite il
fait afficher, sans redondance, les lments de T.

Exercice 3
Ecrire un programme Pascal qui fait raliser les tches suivantes :
Remplir un tableau LET de 35 cases par des lettres majuscules au hasard. On utilisera
la fonction prdfinie Random.
Compter la frquence d'apparition (le nombre d'occurrence) de chaque lettre
majuscule dans le tableau LET et ranger les rsultats statistiques dans un tableau FE.

Exercice 4
Ecrire un programme Pascal qui permet de convertir un entier naturel en son quivalent binaire
(conversion de la base10 la base2).

Exercice 5
Ecrire un programme Pascal qui permet de convertir un nombre crit dans une base b1 en son
quivalent dans une base b2.

Exercice 6
Soit T un tableau contenant N entiers (10N50). On propose d'crire un programme Pascal
qui permet d'clater T en deux tableaux :
TN (contenant les lments ngatifs de T) et TP (contenant les lments positifs de T).

Exercice 7
Soit T un tableau contenant N entiers (10N50). On propose d'crire un programme Pascal
qui permet d'inverser les lments de T (permuter T[1] et T[n], puis T[2] et T[n-1],).

Exercice 8
Soit T un tableau contenant N entiers (10N50). On propose d'crire un programme Pascal
qui permet de regrouper les lments pairs au dbut et les lments impairs la fin de T,
sans modifier l'ordre de saisie des valeurs paires et impaires.
Exercice 9
Soit T un tableau contenant N entiers (10N50). On propose d'crire un programme Pascal
qui permet de dterminer et d'afficher la valeur maximale et la valeur minimale de T.

Exercice 10
On se propose d'crire un programme Pascal qui permet de saisir un entier n >1 et pair.
Ensuite remplir un tableau T par n entiers gaux deux par deux. Enfin transformer T en un
tableau symtrique.
Exemple : pour n = 10
4 4 0 0 -5 -5 8 8 3 3 4 0 -5 8 3 3 8 -5 0 4
Etat initial de T Etat final de T

Exercice 11
Soit un tableau de 20 entiers. On se propose de ranger les lments de T dans un tableau R
de faon mettre les lments positifs ou nuls de T au dbut de R suivis des lments
ngatifs.
Exemple :
T R
2 -3 15 6 -9 -1 0 2 15 6 0 -3 -9 -1

| 11
Exercice 12
Soit T un tableau contenant N entiers (10N50). On propose d'crire un programme Pascal
qui permet de chercher l'existence d'un lment V donn, dans la liste de valeurs de T.

Exercice 13
Soit le tableau T suivant :
10 7 9 7 10 6 7 4 8 8
Pour chaque lment de T on ne garde que sa premire occurrence et on remplace les autres par 0.
10 7 9 0 0 6 0 4 8 0
On regroupe les lments restant au dbut du tableau T.
10 7 9 6 4 8 0 0 0 0
Ecrire un programme Pascal qui fait le traitement ci-dessus pour un tableau T de n (2 n20)
entiers positifs non nuls.

Exercice 14
Ecrire un programme Pascal qui fait remplir un tableau T par les rsultats de 20 lancements
d'un d. Le programme doit faire remplir par la suite un tableau frquence F par le nombre
de fois que chaque face est obtenue.

Exercice 15
On dispose d'un tableau MOY qui contient la liste des moyennes de N lves. On propose
d'crire un programme Pascal qui permet de dterminer et d'afficher le rang de chaque lve.

Exercice 16
On dispose dun tableau de N_MAX lments rempli par N caractres (N<N_MAX).
Ecrire un programme Pascal permettant dinsrer un caractre C donn la k_me position
(avec K<=N).

Exercice 17
Le triangle de Pascal est obtenu en considrant que pour une ligne donne :
Le premier lment et le dernier lment sont gaux 1.
Les autres lments sont obtenus au moyen de la relation : T[l,c] = T[l-1,c] + T[l-1,c-1]
Ecrire un programme Pascal permettant de gnrer et afficher le triangle de pascal de taille n.

Exemple d'excution :
Taille du triangle : 5 1
Le triangle correspondant est : 1 1
1 2 1
1 3 3 1
1 4 6 4 1

Exercice 18
Un entier naturel est dit nombre ROND si son criture binaire contient autant de 1 que de 0.
Exemple : 9 est reprsent en binaire par 1001 donc 9 est un nombre ROND.
Ecrire un programme Pascal qui permet de trouver et d'afficher tous les entiers ROND de
l'intervalle [1,1000].
Exercice 19 Transposition dune Matrice carre
Une Matrice carre est une matrice n lignes et n colonnes.
Lopration de transposition consiste inverser les lignes et les colonnes en effectuant une
symtrie par rapport la diagonale principale de la matrice.
Exemple :
1 2 3 1 4 7
La Matrice 4 5 6 Devient 2 5 8
7 8 9 3 6 9
Ecrire un programme Pascal qui permet de saisir une Matrice carre puis il cherche et affiche
son transpose.

Exercice 20
On se propose d'utiliser l'algorithme de tri par slection pour trier un tableau de 20 chanes
de caractres.

| 12
Exercice 21
Une classe est compose de 30 lves. Le professeur d'arabe Mr Najib veut utiliser l'ordinateur
pour faire la moyenne trimestrielle et le rang de ses lves.
Sachant que la moyenne = (note1+2*note2)/3, Mr Najib veut afficher les rsultats sous forme
d'un tableau comportant :

Nom Prnom Note 1 Note2 Moyens Rangs



Exercice 22
Soient deux tableaux T1 et T2 contenant chacun n lments distincts deux deux (2<n<100).
On appelle intersection de T1 et T2 l'ensemble des lments communs ces deux tableaux.
On se propose d'crire un programme Pascal, qui range les lments de l'intersection des deux
tableaux dans un tableau INTER puis affiche les trois tableaux T1, T2 et INTER.

Exercice 23
On se propose d'crire un programme Pascal permettant :
1. De saisir les lments d'un tableau T compos de n chanes de caractres non vides.
2. De trier le tableau T dans un ordre croissant selon les deux critres suivants :
Longueur de la chane en premier lieu.
Ordre alphabtique en cas d'galit pour les longueurs.

Exercice 24
Une version de tri bulles est le tri bidirectionnel. Elle consiste parcourir le tableau de
gauche droite, puis de droite gauche, le changement de direction ayant lieu chaque fois
que l'une des extrmits est atteinte. Ainsi, les plus petits lments du tableau descendant au
mme rythme que remontent les plus grands lments.
On se propose d'crire un programme Pascal permettant de saisir n entiers (10<n<20) dans
un tableau T et de le trier en utilisant le principe mentionn ci-dessus.

Exercice 25
Nous disposons de deux tableaux T de n noms et C de n couleurs ('B' ou 'N').
Ecrire un programme Pascal qui permet de rarranger les lments de T et C de manire ce
que les lments de couleur 'B' prcdent les lments de couleur 'N'. Si deux lments ont
des couleurs identiques, l'ordre alphabtique des chanes intervient.
Exemple :
Ali Salah Sonia Tounsi Salma Ahmed
B N B N N B
Sont rarrangs comme suit :
Ahmed Ali Sonia Salah Salma Tounsi
B B B N N N

Exercice 26
Ecrire un programme Pascal, qui permet de crer un tableau V3 d'entiers croissants partir de
deux tableaux V1 et V2 d'entiers.
Exemple :
V1 1 3 2 -6
V2 0 4 -5
V3 -6 -5 0 1 2 3 4

Exercice 27
Ecrire un programme Pascal permettant de faire une tude comparative du temps d'excution
de algorithmes de tri (slection, bulles et insertion)

| 13
Exercice 28
Ecrire, en s'inspirant du tri par slection, une procdure qui permet de construire partir d'un
tableau T de n entiers un tableau Rang tel que Rang[i] soit l'indice dans T du ieme lment
dans l'ordre croissant sans modifier le tableau T.
Exemple :
T 80 50 90 35 20
1 2 3 4 5

Rang 5 4 2 1 3

Exercice 29
Ecrire un programme Pascal qui permet de remplir un tableau T par n caractres, de
rechercher dans le tableau la plus longue suite de caractres identiques et d'afficher le
caractre concern ainsi que le nombre de fois qu'il est rpt.
Exemple :
Si on introduit (a a b c c e d e e e e e f f g a a a).
Le programme doit afficher (e, 5).

| 14
LES CHAINES DE CARACTERES
Exercice 1
Question de cours :
On introduit le type suivant : Type chain = String [63] ;
Soit S une variable du type chain. Sur combien d'octets est code S ? O est stocke la
longueur courante de S ? Quelles sont les 2 faons pour connatre la longueur courante de S ?

Exercice 2
Un palindrome est un mot, ou une phrase, lisible dans les deux sens, par exemple kayak et
radar. Ecrire un programme Pascal qui vrifie si une chane de caractres est palindrome ou
non.

Exercice 3
Ecrire un programme Pascal qui permet d'inverser une chane de caractres (chane miroir).

Exercice 4
Ecrire un programme Pascal qui convertit une chane de caractres, en minuscule puis en
majuscule.
Exemple : si ch = 'Turbo PAScal' 'turbo pascal'
'TURBO PASCAL'
Exercice 5
Ecrire trois programmes Pascal qui permettent de saisir une chane de caractres en majuscule
et l'affiche sous les formes suivantes :
Par exemple, si la chane saisie est "TUNIS", on aura :

T TS TT
TU TUIS UTTU
TUN TUNNIS NUTTUN
TUNI TUNIUNIS INUTTUNI
TUNIS TUNISTUNIS SINUTTUNIS

Exercice 6
On veut crire un programme Pascal permettant de supprimer les espaces superflus dans
une chane de caractres.
Exemple : si la chane est : '99Travaux999pratique999999pascal999'
Alors l'excution du programme donnera la chane = 'Travaux9pratique9pascal'

Exercice 7
Ecrire un programme Pascal qui saisit une phrase et l'affiche renverse.
Par exemple :
'RESOLUTION DE PROBLEMES' devient 'PROBLEMES DE RESOLUTION'

Exercice 8
On veut crire un programme Pascal permettant de :
Saisir une chane de caractres CH
Parcourir la chane CH et afficher l'occurrence de chacun de ses caractres.

Exercice 9
Ecrire un programme Pascal permettant de lire un texte de longueur > 20, puis dterminer
et afficher le nombre d'occurrence d'un mot donn, dans ce texte.

Exercice 10
Ecrire un programme Pascal permettant de lire deux mots ch1 et ch2 et dafficher tous les
caractres qui apparaissent dans les deux chanes sans redondance.
Exemple : soit ch1 = "Coccinelle" et ch2 = "Cible"
Rsultat : "Cile"

Exercice 11
Pour raliser un bel affichage, on veut arer une chane de caractres en insrant un espace
entre les caractres de cette chane.
Par exemple : DEVOIR devient D9E9V9O9I9R

| 15
Exercice 12
Une anagramme est un mot obtenu par transposition des lettres dun autre mot (par exemple
chien, chine sont des anagrammes du mot niche).
Ecrire un programme Pascal qui permet de saisir deux mots non vides MOT1 et MOT2 puis de
dterminer si MOT2 est une anagramme de MOT1.

Exercice 13
Sans utiliser la fonction prdfinie POS, crire un programme Pascal qui dtermine la
premire position d'une chane ch1 dans une autre ch2.

Exercice 14
Sans utiliser la fonction prdfinie COPY, crire un programme Pascal qui copie N caractres
d'une chane ch1 partir d'une position p.

Exercice 15
Le Jeu du PENDU consiste :
Un joueur donne un mot en majuscule. Ce mot sera cach sous des tirets, conformment
lexemple : BONJOUR B-----R.
L'autre joueur devra alors deviner ce mot de la manire suivante : Il propose chaque fois une
lettre. Si cette lettre existe dans le mot cach alors le tiret sera remplac par la lettre propose
chaque fois o se trouve cette lettre prcdemment sinon "Echec" sera affich jusqu' ce que
le nombre d'essais sera gal la longueur du mot cach ou le mot sera devin.

Exercice 16
Soit un tableau P de n (1<n<100) chane de caractres. Tous les lments de T doivent tre
constitus uniquement de chiffres (0..9) et non vides.
On se propose de remplir un tableau Q de la faon suivante :
Q[i] contiendra la chane de caractres P[i] crite l'envers.
Exemple : Si P[2] = "9025" alors Q[2] contiendra la chane "5209"
Ecrire un programme Pascal permettant de saisir les lments de P, de remplir puis d'afficher
les lments du tableau Q.

Exercice 17
Ecrire un programme Pascal qui permet de convertir un nombre crit dans une base b1 en son
quivalent dans une base b2.

Exercice 18 Une suite mystrieuse


La suite correspond l'numration orale des chiffres successifs, lus de gauche droite, en
regroupant les chiffres identiques conscutifs.
Exemple : soit le nombre : 111221
Le nombre suivant sera ainsi : trois "1", deux "2", un "1", soit 312211

Soit la suite :
1
11
21
1211
111221
312211
13112221
1113213211
31131211131221
13211311123113112211

Ecrire un programme Pascal, qui affiche les n lignes de cette suite.

| 16
Exercice 19
Ecrire un programme pascal qui permet de saisir une chane non vide CH de longueur impaire
et de lafficher sous la forme dun sablier.

Exemple :
Si Ch=SABLIER
Le programme affichera
SABLIER
ABLIE
BLI
L
BLI
ABLIE
SABLIER

| 17
ENREGISTREMENTS ET FICHIERS

Exercice 1:
crire une analyse, un algorithme et un programme Pascal qui demande lutilisateur les
coordonnes de deux points distincts du plan et qui affiche le coordonnes du point milieu.

Exercice 2:
crire un algorithme, puis un programme Pascal qui permet de calculer et dafficher, au
moyen de type enregistrement, la somme, le produit et la division de deux nombres complexes
C1 (a + b i) et C2 (c + d i) tout en utilisant les formules suivantes :
(a + b i) + (c + d i) = (a + c) + (b + d) i
(a + b i) * (c + d i) = (a c - bd) + (ad + bc) i
(a + b i) / (c + d i) = (a c + bd) / (c2 + d2) + (bc -ad) i / (c2 + d2)

Exercice 3:
crire un algorithme, puis un programme Pascal qui permet :
De crer un tableau Emp qui contiendra les informations sur les 50 employs dune
entreprise :
Matricule (un entier)
Nom (chane de caractres)
Salaire (un rel)
Etat_Civil (M ou C)
D'afficher le nombre demploys maris dont le salaire est 800 Dinars.

Exercice 4:
crire un algorithme, puis un programme Pascal qui lit au clavier les informations : nom,
prnom et ge, relatives 10 personnes et qui les affiche dune faon ordonne suivant le
nom.

Exercice 5:
Ecrire un programme Pascal qui permet de saisir un fichier squentiel des caractres
(contenant 26 lettres alphabtique), puis affiche le caractre du milieu.

Exercice 6:
Ecrire un programme Pascal permettant de :
Crer et remplir un fichier "FP" qui contient les informations sur le personnel dune
entreprise (matricule, nom, grade et salaire).
Afficher la liste des employs de cette entreprise dont le salaire est compris entre 500D
et 800D.
Rechercher un employ dans le fichier "FP" en connaissant son matricule.

Exercice 7:
Ecrire un programme Pascal qui permet de :
Crer un 1er fichier texte f3ligne et saisir 3 lignes
Crer un 2me fichier texte f1ligne et saisir une ligne
Crer un 3me fichier texte f4ligne et gnrer son contenu de 4 lignes par recopie du
fichier1 et du fichier2.

Exercice 8:
crire un programme en Pascal permettant de :
Saisir et enregistrer des noms des villes dans un fichier dont le nom physique est
"c:\villes.dat"
Afficher toutes les villes commenant par la lettre "A"
Pour chaque lettre, afficher la liste des villes dont le nom commence par cette lettre.

Exercice 9:
Ecrire un programme Pascal qui supprime un composant dun fichier de donnes.

| 18
Exercice 10:
Nous disposons d'un fichier d'entiers enregistr sous le nom physique "Valeurs.dat". Ce
fichier est dj tri en ordre croissant.
Nous dsirons insrer dans ce fichier et sa bonne place une nouvelle valeur V donne.
Ecrire l'algorithme d'une procdure nomme INSERTION ralisant cette tche.
N.B: L'insertion doit se faire directement dans le fichier et non pas travers un transfert dans
un tableau ou dans un autre fichier.

Exercice 11:
Ecrire un programme en pascal qui permet lors de son excution d'afficher lui-mme (le
programme source).

Exercice 12:
On dispose d'un fichier texte, intitul source.txt.
Un tautogramme est un texte dont tous les mots commencent par la mme lettre (sans
distinction entre majuscule et minuscule).
Exemple : Le lion lape le lait lentement
On se propose de sauvegarder toutes les lignes tautogrammes de ce fichier texte, dans un
deuxime fichier texte intitul tauto.txt.

Exercice 13:
crire un programme en Pascal permettant de :
Saisir un ensemble des lignes dun texte qui se termine par un point.
Dterminer le nombre des mots par ligne.
Dterminer le nombre de voyelles de chaque ligne.

Exercice 14:
Le contenu de plusieurs pages de texte est enregistr dans un fichier nomm "PAGES.TXT". On
dsire connatre le nombre total de lettres de ce fichier, l'occurrence et le pourcentage de
prsence de chaque une de ces lettres.

Exercice 15:
Nous dsirons, partir d'un fichier de texte nomm 'c:\modele.txt', lire son contenu et
dterminer le code ASCII de chacun de ses caractres, convertir chaque code trouv en son
quivalent binaire et le sauvegarder dans un fichier texte nomm 'c:\binaire.txt'.
N.B.: On termine la saisie des lignes de texte par une ligne vide, qui ne sera pas enregistre
dans le fichier.
Ecrire les analyses et les algorithmes d'un programme modulaire permettant l'affichage du
contenu du fichier 'c:\binaire.txt'.

Exercice 16:
On se propose dcrire un programme qui saisit un fichier texte, puis recopie partir du fichier,
les lignes dordre impair dans un 2me fichier et les lignes dordre pair dans un 3me fichier.

Exercice 17: Fusion de deux fichiers


On dispose de 2 fichiers f1 et f2 qui contiennent chacun des chanes de caractres. Ces
fichiers sont tris dans lordre croissant. On se propose de fusionner les contenus des deux
fichiers f1 et f2 dans un troisime fichier f3 pour obtenir une liste trie par ordre croissant.
Exemple :
F1 F2 F3
des bien bien
exemples choisir choisir
fait germer des
la exemples
solution fait
germer
la
solution

| 19
Exercice 18:
Ecrire un programme qui permet de tester si deux fichiers dentiers sauvegards sur disque
dur sont gaux ou non.

Exercice 19:
Les informations concernant les adhrents un club de sport sont enregistres dans un fichier
texte nomm adherent.txt et enregistr dans le dossier d:\club . Chaque ligne de ce fichier
concerne un adhrent et comporte 4 informations spares par des virgules savoir :
Le N de la carte dadhrent, le nom, la date de naissance, le nombre dheures de sport.
La longueur dune ligne de ce fichier ne dpasse pas 60 caractres.
On se propose de :
A) Crer partir de ce fichier, un deuxime fichier de donnes nomm
d:\club\adherent.dat o chaque enregistrement correspond un adhrent et a la structure
suivante :
Le N de la carte : un entier
Le nom : une chane de 40 caractres
La date de naissance : une chane de 10 caractres
Le nombres dheures de sport : un entier
B) Informatiser la gestion des adhrents au club, par la cration dune application offrant un
menu qui permet les actions ci-dessous selon la valeur dune lettre saisie :
La valeur "A", pour ajouter les donnes relatives un nouvel adhrent. L'ajout se fera
la fin du fichier.
La valeur "M", pour modifier les donnes relatives un adhrent dont on saisit le
numro de la carte.
La valeur "S", pour supprimer un adhrent dont on saisit le numro de la carte.
La valeur "T", pour trier le fichier dans l'ordre alphabtique croissant des noms des
adhrents. Pour trier le fichier, on copiera les donnes ncessaires dans la mmoire
centrale. Une fois tries, les donnes seront recopies dans le fichier d'origine.
La valeur "Q" pour quitter l'application.

Exercice 20:
Un mdecin veut informatiser la gestion de son cabinet. On se propose de l'aider travers un
programme Pascal permettant d'effectuer les tches suivantes :
1- Ajouter un nouveau patient
2- Modifier les informations relatives un patient existant
3- Attribuer un RDV pour un patient donn
4- Afficher les informations relatives un patient donn
5- Afficher la liste des patients
6- Afficher la liste des patients ayant un RDV une date donne
7- Quitter l'application.

Un patient est caractris par :


Un numro de dossier
Un nom_prnom
Une date de naissance (jour, mois, anne)
Une date du prochain RDV (jour, mois, anne)

Exercice 21:
Pour mieux grer et organiser ses films, le responsable d'une vido club dcide d'informatiser
sa vidothque par la cration d'un fichier faisant objet d'une base de donne de ses films.
Ecrire un programme permettant les actions offertes par les menus suivants:

Menu Fichiers Menu Edition Menu Quitter


- Crer un nouveau fichier - Ajouter un film - Sortir
- Ouvrir un fichier existant - Modifier un film
- Supprimer un fichier - Chercher un film
- Fermer un fichier - Supprimer un film

| 20
Exercice 22
Les informations relatives une personne sont :
Nom, prnom (chane) ;
Tlphone (10 caractres) ;
Numro fiscal (entier) ;
Adresse (rue (entier) ; ville (chane) ; code postal (entier non sign)) ;
Ecrivez les analyses et les algorithmes des diffrents modules dun programme qui permet de :
Remplir un fichier intitul data.dat sous la racine C:/ par des personnes. La saisie sarrte selon
le choix de lutilisateur en rpondant la question voulez-vous continuer ? O/N .
Afficher lcran les noms et les prnoms des personnes rsidant dans une ville donne.
Saisir un numro de tlphone TEL puis chercher et afficher le nom, le prnom et le numro fiscal de
la personne ayant ce numro de tlphone.
Saisir le nom dune ville puis calculer et afficher le nombre des personnes rsidant dans cette ville.

Exercice 23
Une socit veut informatiser la gestion de ses employs. Les informations relatives un employ sont
reprsentes par la structure FICHE suivante :
Nom_prnom (30 caractres) ;
Le grade (uniquement G1, G2, G3 ou G4);
Code fiscal (entier non sign);
Assurance de maladie (lettre O pour oui et la lettre N pour non) ;
Ecrivez un programme modulaire nomm GESTION qui permet :
Remplir un fichier intitul info.dat sous la racine C:/ par des Fiches. La saisie sarrte selon le
choix de lutilisateur en rpondant la question voulez-vous continuer ? O/N .
Laffichage de toutes les fiches (sur lcran) une par une avec une attente jusqu lappui de la touche
entre.
La saisie dun grade et laffichage de nombre demploys ayant ce grade ainsi que leur pourcentage
par rapport au nombre total des employs.
Laffichage de nombre des employs qui possdent une assurance de maladie et leur pourcentage
par rapport au nombre total des employs.
Laffichage des noms et prnoms et les grades des employs qui nont pas dassurance de maladie.

Exercice 24
La structure dun tudiant est :
Nom, Prnom : chane ;
Numro de carte dtudiant NCE : entier non sign ;
Niveau : (5 caractres) ;
Date de naissance (jj / mm / aaaa) ;
Admission :(O pour oui et N pour non) ;
Ecrivez un programme modulaire nomm STATISTIQUES qui permet de :
Remplir un fichier intitul institut.dat sous la racine C:/ par des tudiants. La saisie sarrte selon
le choix de lutilisateur en rpondant la question voulez-vous continuer ? O/N .
Calculer et afficher le nombre des tudiants qui ont russit et leur pourcentages par rapport au
nombre total des tudiants.
Calculer et afficher le nombre des tudiants appartenant un niveau NIV donn et qui ont russit.
Saisir le NCE dun tudiant et afficher son rsultat dadmission. Si ce NCE nexiste pas dans le fichier
alors le programme doit afficher un message indiquant que cet tudiant nexiste pas.
Recopier ce fichier dans lemplacement C:/Bac201N/ .
Afficher lcran lenregistrement numro NUM. O NUM est un entier saisit au clavier reprsentant le
numro dordre de lenregistrement dans le fichier. Attention au cas chant lorsque (NUM <0 !!) ou
lorsque (NUM taille de fichier !!).
Supprimer lenregistrement numro NE. O NE est un entier saisit au clavier reprsentant le numro
dordre de lenregistrement que lon veut le supprimer. Attention au deux cas (NE <0 !!) et (NE taille
de fichier !!).
Afficher lcran le nombre denregistrements.

| 21
Exercice 25
Les caractristiques dune voiture sont :
Marque (10 caractres) ;
Couleur (10 caractres) ;
Matricule (20 caractres) ;
Nombre de chevaux ;
Ecrivez un programme modulaire qui permet de :
Remplir un fichier intitul vhicules.dat sous C:/Bac201N par des voitures. La saisie sarrte
selon le choix de lutilisateur en rpondant la question voulez-vous continuer ? O/N .
Chercher puis afficher les marques des voitures possdant 5 chevaux.
Afficher les matricules des voitures une couleur saisie au clavier.
Saisir une voiture V et vrifier si elle existe dans le fichier ou non en se basant sur sa matricule.
Effacer le fichier totalement du disque.

Exercice 26
Les informations relatives une lve sont les suivantes :
Nom (15 caractres) ;
Prnom (15 caractres) ;
Sexe ("garon" ou "fille");
Moyenne gnrale ;
Date de naissance ;
Ecrivez un programme modulaire qui permet de :
Remplir un fichier intitul classe.dat sous C:/Bac201N par des lves. La saisie sarrte selon le
choix de lutilisateur en rpondant la question voulez-vous continuer ? O/N .
Calculer et afficher la moyenne arithmtique de cette classe.
Afficher le nombre des garons et le nombre des filles de cette classe.
Dgager le nom et le prnom du meilleur lve de cette classe.
Transfrer les moyennes des lves dans un tableau T. (on supposera que le nombre
denregistrements dans le fichier est infrieur 100).
Supprimer tous les enregistrements qui suit lenregistrement dordre NUM (on va tronquer le fichier).
O NUM est un entier saisit au clavier. Attention au cas chant lorsque (NUM <0 !!) ou lorsque (NUM>
taille de fichier !!).

Exercice 27
Dans une clinique, la fiche dun patient contient les informations suivantes :
Nom de patient (15 caractres) ;
Prnom de patient (15 caractres) ;
Numro de carte didentit ;
Numro de la salle ou il est log.
Mdecin de patient (nom, prnom, spcialit) ;
Date de consultation (15 caractres) ;
Ecrivez un programme modulaire qui permet de :
Remplir un fichier intitul clinique .dat sous C:/Bac201N par des patients. La saisie sarrte
selon le choix de lutilisateur en rpondant la question voulez-vous continuer ? O/N .
Afficher les noms et les prnoms des patients du mdecin xxxx yyyy . .
Modifier le numro de salle des patients qui sont consult le "02/10/2007" avec le numro S saisit au
clavier.
Chercher et dafficher les noms et les prnoms des patients qui ont t consults une date T
donne.
Saisir un patient P et vrifier sil existe dans ce clinique ou non en se basant sur sa carte didentit.

Exercice 28
Un htel est caractris par :
Nom de lhtel ;
Classe ("*", "**", "***", "****", "*****") ;
Ville (15 caractres) ;
Directeur de lhtel (nom, prnom, tlphone) ;
Ecrivez un programme modulaire qui permet de :
Ecrire un module qui permet de remplir un tableau T par N htels (4 N 100).
Transfrer les lments de tableau T dans un fichier intitul stat.dat sous la racine C:/ Bac201N.
Afficher les noms dhtels et leurs classes dune ville V saisie au clavier.
Compter le nombre des villes contenant des htels.
| 22
Dgager partir du tableau T les noms dhtels de la ville "sousse" ayant comme classe "*****".
Exercice 29
Une bibliothque emprunte des livres aux lves. Un livre emprunt est caractris par :
Identifiant (5 caractres) ;
Titre (20 caractres) ;
Genre (20 caractres) ;
Auteur (nom, prnom) ;
Date demprunt ;
Elve (nom, prnom, classe) ;

Ecrivez un programme modulaire qui permet de :


Remplir un fichier intitul biblio.dat sous C:/Bac201N par des livres. La saisie sarrte selon le
choix de lutilisateur en rpondant la question voulez-vous continuer ? O/N .
Chercher et dafficher les noms et les prnoms des lves qui ont emprunt des livres aujourdhui.
Chercher et dafficher les noms et les prnoms des lves qui ont emprunt des livres de genre
informatique .
Le livre ayant pour identifiant info4 est emprunt de nouveau llve : Nom : xxxx
Prnom : yyyy
Classe : 4si
Ecrire un module qui effectue les modifications appropries dans le fichier.
Compter et afficher le nombre des lves de la classe 4si qui ont emprunt des livres de la
bibliothque.
Saisir le nom, le prnom et la classe dun lve puis modifier lenregistrement numro NUM par ces
nouvelles informations (NUM est saisit au clavier).
Supprimer le fichier totalement de disque.

Exercice 30
Ecrivez un programme modulaire qui permet de :
Crer un fichier texte intitul paragraphe.txt sous C:/Bac201N et le remplir par des chanes de
caractre saisie au clavier. La saisie sarrte lorsquon tape la chane 'FIN' (minuscule ou majuscule). La
chane de caractre, 'FIN' en l'occurrence ne sera pas stocke dans le fichier.
Compter et afficher le nombre de lignes NBL enregistr dans ce fichier.
Compter et afficher le nombre de caractres NBC enregistr dans ce fichier.
Afficher le contenu de F lcran.

Exercice 31
Ecrivez un programme modulaire qui permet de :
Crer un fichier texte intitul texte .doc sous C:/Bac201N et le remplir par des chanes de
caractre saisie au clavier. Le nombre de chanes saisies ne doit pas dpasser 100. La saisie sarrte
selon le choix de lutilisateur en rpondant la question voulez-vous continuer ? O/N .
Afficher le contenu de F lcran.
Transfrer le contenu du fichier dans un tableau T.

Exercice 32
Ecrivez un programme modulaire qui permet de :
Remplir un fichier texte intitul nombres.txt sous C:/Bac201N et le remplir par des entiers positifs.
La saisie sarrte selon le choix de lutilisateur en rpondant la question voulez-vous continuer ?
O/N ou lorsque le nombre dentiers saisit atteint 100.
Afficher le contenu de F lcran.
Calculer la somme S et le Produit P des entiers de F.
Question : Expliquer Comment peut-on trier les entiers qui existent dans F
Transfrer les entiers de fichier F vers un tableau T.
Trier les lments de T par ordre dcroissant.
Recopier les entiers de nouveau dans le fichier F.

Exercice 33
Ecrivez un programme modulaire intitul FUSION qui permet de
Fusionner le fichier texte texte2.txt qui existe sous C:/Bac201N dans le fichier texte1.txt qui
existe sous C:/. La fusion consiste copier le contenu de fichier texte2.txt dans le fichier
texte1.txt et la suite de son contenu.
Afficher le contenu de F lcran.

| 23
LA RECURSIVITE

Exercice 1
crire une procdure qui affiche les entiers par ordre dcroissant, de 10 jusqu 1. Proposer
une solution itrative et une autre rcursive.

Exercice 2
Soit la procdure itrative suivante :
procedure affiche;
var a, b: integer;
begin
for a := 0 to 3 do
for b := 0 to 9 do
writeln(a * 10 + b);
end;
Transformer cette procdure en une procdure rcursive.

Exercice 3
crire une procdure rcursive permettant de saisir un entier N pair (1<N<31).

Exercice 4
crire une procdure rcursive permettant de remplir un tableau T par N entiers positifs.

Exercice 4.2
crire une procdure rcursive permettant d'afficher un tableau T.

Exercice 5
crire une fonction rcursive permettant de calculer la factorielle dun entier N donn.

Exercice 6
On appelle "palindrome" un mot ou une phrase qui se lit de la mme faon l'endroit comme
l'envers, sans tenir compte des espaces.
Exemple : le mot "ABCBA" est un palindrome.
Ecrire une fonction rcursive permettant de vrifier si une chane de caractres CH est un
palindrome.

Exercice 7
Ecrire une fonction rcursive permettant de vrifier la parit dun entier N.

Exercice 8
crire une fonction rcursive permettant d'effectuer la multiplication de deux entiers positifs
(nots p et q) donns, en utilisant uniquement l'addition entire.
En effet, pxq = p+p+p++p (q fois).

Exercice 9
crire une fonction rcursive permettant de calculer la somme des N premiers entiers.

Exercice 10
n
crire une fonction rcursive permettant de calculer X pour X rel et n entier relatif.

Exercice 11
crire une fonction rcursive permettant de calculer le PGCD de deux entiers A et B par la
mthode d' EUCLIDE puis la mthode de diffrence.

Exercice 12
crire une fonction rcursive permettant de calculer le PPCM de deux entiers A et B.

| 24
Exercice 13
La suite de Fibonacci est dfinie par : Un = Un-1 + Un-2 avec U1 = 1 et U2 = 1. Ecrire une
me
fonction rcursive permettant de calculer le N terme de la suite de Fibonacci.

Exercice 14
crire une procdure rcursive permettant de dcomposer un entier N en facteurs premiers.
(Exemple : 432 = 2*2*2*2*3*3*3).

Exercice 15
Un nombre parfait est un nombre qui est gale la somme de ses diviseurs sauf lui mme
exemple : 6 est parfait car 6=1+2+3
crire une fonction rcursive qui calcule la somme de diviseurs d'un entier N sauf lui-mme.

Exercice 16
Un entier suprieur 1 est dit premier sil nest divisible que par 1 et par lui-mme.
crire une fonction rcursive qui vrifie si un entier N est premier ou non.

Exercice 17

x x2 x3 xn
Soit lexponentielle : e  1+
x
+ + + . .. +
1 2! 3! n!
Faire une fonction fact(n) qui renvoie n!.
Faire une fonction puiss(x, n) qui renvoie xn.
Ecrire une fonction rcursive qui calcule la valeur approche de ex en faisant appel aux
fonctions fact et puiss.

Exercice 18
1 1 1 1
Calculer par rcursivit S (n ) = 1 + + + + ... + pour tout n>0.
2 3 4 n

Exercice 19
1 1 1 1
Calculer par rcursivit S ( n ) = 1 + + ... + ( 1) n pour tout n>=0.
3 5 7 2n + 1

Exercice 20
crire une fonction rcursive qui permet de chercher le maximum dans un tableau T de n entiers.
crire une fonction rcursive qui permet de chercher le minimum dans un tableau T de n entiers.

Exercice 21
crire une fonction rcursive qui dtermine la valeur la plus proche d'un entier m donn dans
un tableau T de n entiers.

Exercice 22
crire une fonction rcursive qui teste l'existence d'un lment donn dans un tableau donn
en utilisant une recherche squentielle.

Exercice 23
crire une fonction rcursive qui teste l'existence d'un lment donn dans un tableau donn
en utilisant une recherche dichotomique.

Exercice 24
crire une procdure rcursive qui permet de dcaler tous les lments dun tableau dune
position droite partir de la position p.

Exercice 25
crire une procdure rcursive qui permet dinverser les lments dune partie dun tableau
compris entre la position p et n.

| 25
Exercice 26
crire une procdure rcursive qui permute les n lments conscutifs deux deux dun
tableau T.

Exercice 27
crire une fonction rcursive qui dtermine la valeur maximale de deux entiers positifs sans
utiliser < et >.

Exercice 28
Soit une chane de caractres ; supposons qu'on veuille faire aussi bien la fonction que la
procdure qui nous renvoie l'inverse de cette chane.

Exercice 29
crire une procdure rcursive qui permet de trier un tableau de n entiers en utilisant la
mthode de tri par slection.

Exercice 30
crire une procdure rcursive qui permet de trier un tableau de n entiers en utilisant la
mthode de tri par insertion.

Exercice 31
crire une procdure rcursive qui permet de trier un tableau de n entiers en utilisant la
mthode de tri bulles.

Exercice 32
crire une procdure rcursive qui permet de trier un tableau de n entiers en utilisant la
mthode de tri Shell.

Exercice 33
crire une procdure rcursive qui permet de trier un tableau de n entiers en utilisant la
mthode de tri par fusion.

Exercice 34
Ecrire une procdure rcursive qui supprime toutes les occurrences d'un caractre donn d'une
chane de caractre.

Exercice 35
crire une fonction qui compte le nombre doccurrences dun caractre c dans une chane ch.

Exercice 36
crire une fonction rcursive qui calcule la somme des chiffres d'un nombre entier.

Exercice 37
crire une fonction rcursive qui dtermine le nombre des chiffres d'un entier.

Exercice 38
Deux mots sont des anagrammes si lun est une permutation des lettres de lautre.
Par exemple les mots suivants sont des anagrammes :
aimer et maire
chien et niche
Par dfinition, on considre que deux mots vides sont des anagrammes.
Proposez une fonction rcursive qui permet de savoir si deux mots sont des anagrammes.

Exercice 39
crire une fonction rcursive qui teste la prsence d'un caractre dans une chane de
caractre.

Exercice 40
crire une fonction rcursive nomme suppr_car qui permet de supprimer la premire
occurrence d'un caractre d'une chane.

| 26
Exercice 41
En utilisant les deux fonctions prcdentes (teste et suppr_car), proposez une fonction
rcursive constructible qui permet de savoir si un mot est constructible partir d'un
ensemble de lettres. Le mot et l'ensemble de lettres sont reprsents l'aide d'une chane de
caractres. Si une lettre apparat deux fois dans le mot, il faut qu'elle apparaissent au moins
deux fois dans l'ensemble de lettres.
Par exemple :
Constructible ("BONJOUR","BJNORUYZ") retournera faux (le 'O' n'apparaissant qu'une seule
fois dans "BJNORUYZ")
Constructible ("TRALALA","LLAAAAART") retournera vrai
Constructible ("","ABC") retournera vrai

Exercice 42
Le triangle de Pascal est le tableau des coefficients qui sont utiliss pour le dveloppement de
n
certaines expressions comme (a+b) ou (a+b) .
Ce triangle est le suivant :
0
0:1 (a+b) = 1
1
1:11 (a+b) = 1a + 1b
2 2 2
2:121 (a+b) = 1a + 2ab + 1b
3 3 2 2 3
3:1331 (a+b) = 1a + 3a b + 3ab + 1b
4 4 3 2 2 3 4
4:14641 (a+b) = 1a + 4a b + 6a b + 4ab + 1b

crire une fonction rcursive permettant de dterminer les valeurs du triangle pascal.

Exercice 43
crire une fonction rcursive MacCarthy qui calcule MacCarthy(n) selon la dfinition suivante :

Si n>100 MacCarthy(n) = n-10

Si n100 MacCarthy(n) = MacCarthy( MacCarthy(n+11))

Exercice 44
crire une fonction rcursive calculant la fonction d'Ackermann dfinie comme suit :

n+1 si m = 0

Ack ( m , n ) = Ack (m-1, 1) si m > 0 et n = 0
Ack (m-1, Ack (m, n-1))
si m > 0 et n > 0

Calculer Ack(0,3) et Ack(2,2)

Exercice 45 valuation dune chane de caractre


Soit une chane de caractres du type s="5+123-4+67-2" ; crire une fonction rcursive qui
value cette chane de caractres.

Exercice 46 Vers une mini-calculatrice


Soit une chane de caractres du type s="5+3*4/2-5*3+4*7/2" ; faisons le programme qui
value cette chane de caractres.

Exercice 47
crire une procdure rcursive qui affiche les combinaisons (les diffrentes permutations de n
objets) d'une chane de caractres.

Par exemple, les anagrammes des lettres de "abc" sont :

"abc", "acb", "bac", "bca", "cab" et "cba".

| 27
Exercice 48
crire un programme permettant d'valuer un nombre romain en son quivalant en
dcimal. Sachant que les chiffres romains :
M = 1000
D = 500
C = 100
L = 50
X = 10
V=5
I=1

On constate que les nombres s'arrtaient aux milliers.

Exemples d'criture des nombres romains :


4 s'crit IV.
6 s'crit VI.
9 s'crit IX.
15 s'crit XV.
47 s'crit XLVII.
149 s'crit CXLIX (et non CIL, comme on pourrait le penser) On constate ici la
dcomposition 100+40+9 = C + XL + IX
1490 s'crit MCDXC = 1000 + 400 + 90 = M + CD + XC

Exercice 49
crire une fonction boolenne rcursive qui teste si deux fichiers dentiers sauvegards sur
disque dur, sont gaux ou non.

Exercice 50
crire un programme qui utilise une fonction rcursive pour trouver le plus petit nombre dun
fichier dentiers sauvegards sur disque dur, puis laffiche lcran.

| 28
LESSTRUCTURES
LES STRUCTURESSIMPLES
SIMPLES

Exercice 1-d)
[ V ] Lire (A) [ F ] Lire (45) [ F ] Lire (A+B)
[ F ] Lire ("A") [ F ] Lire ("A =", A) [ V ] Ecrire (X+2*Y)
[ V ] Ecrire ("A =", A) [ V ] Ecrire (A, " ",B) [ V ] Ecrire (A : 6 : 2)
[ V ] Ecrire (5 mod 7 div 2) [ V ] Ecrire ("Saisir un rel") [ V ] Ecrire (45)

Exercice 2 Exercice 3
0) Dbut Sortie_Inverse 0) Dbut Cylindre
1) Ecrire ("A = "), Lire (A) 1) Ecrire ("Donner le rayon : "), Lire(R)
2) Ecrire ("B = "), Lire (B) 2) Ecrire ('Donner la hauteur : "), Lire (H)
3) Ecrire ("C = "), Lire(C) 2) V PI*R*R*H
4) Ecrire (C, " ", B, " ", A) 3) Ecrire ("Volume = ", V)
5) Fin Sortie_Inverse 4) Fin Cylindre
Exercice 4 Exercice 5
0) Dbut Surface_rectangle 0) Dbut Piscine
1) Ecrire ("Largeur = "), Lire (la) 1) Ecrire ("Donner les dimensions de la piscine"),
2) Ecrire ("Longueur = "), Lire (lo) Lire (LO, LA, PR)
3) S la * lo 2) V LO*LA*PR
4) Ecrire ("La surface du rectangle dont la longueur mesure ", lo, " m 3) EAU V*1000
et la largeur mesure ", la," m, a une surface gale ", s," mtres 4) Ecrire ("Le volume = ", V)
carrs.") 5) Ecrire ("Quantit d'eau = ", EAU, " litres")
5) Fin Surface_rectangle 6) Fin Piscine
Exercice 6 Exercice 7
0) Dbut Aire_Trapeze 0) Dbut Permut
1) Ecrire ("Donner les dimensions du trapze "), 1) Lire (A, B)
Lire (H, B1, B2) 2) AUX A
2) S H*(B1 + B2) 3) AB
3) Ecrire ("La surface = ", S) 4) B AUX
4) Fin Aire_trapeze 5) Ecrire ("La nouvelle valeur de A est : ", A)
6) Ecrire ("La nouvelle valeur de B est : ", B)
7) Fin Permut
Exercice 8 Exercice 9
0) Dbut Permut_Circulaire 0) Dbut Permut
1) Lire (A, B, C) 1) Lire (X, Y)
2) AUX A 2) X X+Y
3) AC 3) Y X-Y
4) CB 4) X X-Y
5) B AUX 5) Ecrire (X, " ", Y)
6) Ecrire (A, " ", B, " ", C) 6) Fin Permut
7) Fin Permut_Circulaire
Exercice 10 Exercice 11
0) Dbut Division 0) Dbut Temperature
1) Ecrire ("A = "), Lire (A) 1) Ecrire ("Donner une temprature en C : "), Lire (D)
2) Ecrire ("B = "), Lire (B) 2) F 9/5 * D + 32
3) Q A div B 3) Ecrire (D, " C = ", F, " Fahrenheit")
4) R A mod B 4) Fin Temperature
5) Ecrire ("Le quotient est ", q, " et le reste est ", r)
6) Fin Division
Exercice 12 Exercice 13
0) Dbut Mile_marin 0) Dbut Conversion
1) Ecrire ("Donner le nombre de Km : "), Lire (km) 1) Ecrire ("Nombres de bits = "), Lire (bit)
2) Mm km/1.852 2) Octet bit/8
3) Ecrire (km," km = ", mm," miles marins") 3) Kilo octet/1024
4) Fin mile_marin 4) Mega kilo/1024
5) Giga mega/1024
6) Ecrire (octet, kilo, mega, giga)
7) Fin conversion
Exercice 14 Exercice 16
0) Dbut Temps 0) Dbut Interet_Simple
1) Ecrire ("Donner une dure en secondes "), Lire (T) 1) Ecrire ("Donner la somme initiale : "), Lire (SOM)
2) H T div 3600 2) Ecrire ("Donner le taux d'intrt : "), Lire (TAUX)
3) M (T mod 3600) div 60 3) INTERET (SOM * TAUX/100) * 5
4) S T mod 60 4) VA SOM + INTERET
5) Ecrire (H, " : ", M, " : ", S) 5) Ecrire ("Aprs 5 ans la somme sera = ", VA)
6) Fin Temps 6) Fin Interet_Simple
Exercice 17 Exercice 18
0) Dbut Consommation 0) Dbut Rsistance
1) Ecrire ("Nombre de Km parcouru : "), Lire(Y) 1) Ecrire ("Donner les trois rsistances : "), Lire (R1, R2, R3)
2) Ecrire ("Nombre de litres d'essence : "), Lire (L) 2) R 1/ (1/R1 + 1/R2 + 1/R3)
3) TAUX (L*100)/Y 3) Ecrire ("La rsistance quivalente est = ", R)
4) Ecrire ("Taux de consommation est = ", TAUX, " %") 4) Fin Rsistance
5) Fin Consommation

| 29
Exercice 15 Exercice 19
0) Dbut Futur 0) Dbut NBR_3
1) Ecrire ("Donner un verbe du 1er groupe : "), Lire (verbe) 1) Ecrire ("Saisir un entier form de 3 chiffres non nuls : "),
2) Ecrire ("Je ", verbe, "ai") Lire (N)
3) Ecrire ("Tu ", verbe, "as") 2) c n div 100
4) Ecrire ("Il ou elle ", verbe, "a") 3) d n mod 100 div 10
5) Ecrire ("Nous ", verbe, "ons") 4) u n mod 10
6) Ecrire ("Vous ", verbe, "ez") 5) r1 c*100+u*10+d
7) Ecrire ("Ils ou elles ", verbe, "ont") 6) r2 u*100+d*10+c
8) Fin Futur 7) r3 u*100+c*10+d
8) r4 d*100+c*10+u
9) r5 d*100+u*10+c
10) Ecrire (N, r1, r2, r3, r4, r5)
11) Fin NBR_3
Exercice 20
0) Dbut Sup_Inf
1) Ecrire ("A = "), Lire (A)
2) Ecrire ("B = "), Lire (B)
3) SUP (A + B + abs (A - B)) div 2
4) INF (A + B - abs (A - B)) div 2
5) Ecrire ("Valeur sup = ", SUP, " Valeur inf = ", INF)
6) Fin Sup_Inf

| 30
LES STRUCTURES CONDITIONNELLES

Exercice 1 Exercice 2
Program Min2 ; Program Max3 ;
Uses Wincrt ; Uses Wincrt ;
Var a, b, min : Integer ; Var a, b, c, maxi : Integer ;
Begin Begin
Writeln ('Saisir deux entiers : ') ; Writeln ('Saisir trois entiers : ') ;
Readln (a, b) ; Readln (a, b, c) ;
IF a<b Then min := a maxi := a ;
Else min := b ; IF b>maxi Then maxi := b ;
Writeln ('La plus petite valeur est : ', min) ; IF c>maxi Then maxi := c ;
End. Writeln ('La plus grande valeur est : ', maxi) ;
End.

Exercice 3 Exercice 4
Program Racine ; Program Aire_Triangle ;
Uses Wincrt ; Uses Wincrt ;
Var x : Real ; Var a, b, c, Surf, P : Real;
Begin Begin
Write ('Saisir un rel ') ; Readln (x) ; Writeln ('Donner 3 rels positifs :'); Readln (a, b, c);
IF x >= 0 IF (a+b=c) Or (a+c=b) Or (b+c=a)
Then Writeln ('Racine carre ', x,' = ', sqrt(x)) Then Writeln ('Il ne s''agit pas d''un triangle')
Else Writeln ('Donne incorrecte') ; Else Begin
End. P := (a+b+c)/2;
Surf := sqrt (P*(P-a)*(P-b)*(P-c));
End;
Writeln ('Aire de triangle = ', Surf:4:2);
End.

Exercice 6 Exercice 5
Program Parite ; Program Abs_diff;
Uses Wincrt ; Uses Wincrt;
Var N : Integer ; Var a, b, z : Integer;
Begin Begin
Writeln ('Donner un entier ') ; Readln (n) ; Write ('Donner deux entiers : '); Readln (a, b);
IF n mod 2 = 0 IF (a-b) < 0 Then z:=b-a
Then Writeln (n,' est pair') Else z:=a-b;
Else Writeln (n,' est impair') ; Writeln ('valeur absolue de a-b = ', z);
End. End.

Exercice 7 b:=readkey;
Program Chez_la_fourmi; VAL (a, na, err);
Uses Wincrt; VAL (b, nb, err);
label 1,2 ; IF (na+nb) mod 2 =0
Var na, nb, err : Integer; Then Writeln ('Le joueur A gagne.')
a, b, z : Char; Else Writeln ('Le joueur B gagne.');
Begin Writeln ('Voulez vous jouer encore ? (o/n)'); Readln (z);
1: Writeln ('Nombre de doigts montrs par le joueur A'); IF z='n' Then goto 2 Else goto 1 ;
a:=readkey; 2:End.
Writeln ('Nombre de doigts montrs par le joueur B');

Exercice 9 Exercice 8
Program Sup_Inf; Program Invite ;
Uses Wincrt ; Uses Wincrt ;
Var a, b : Integer ; Var titre, foulen, term1, term2 : String ;
sie : String ; Begin
Begin Write ('Titre = ') ; Readln (titre) ;
Writeln ('Saisir deux entiers : ') ; Write ('Votre nom = ') ; Readln (foulen) ;
Readln (a, b) ; IF titre = 'Mr'
IF a>b Then Begin
Then sie := ' est suprieur ' term1 := 'e' ;
Else IF a<b term2 := '' ;
End
Then sie := ' est infrieur ' Else IF (titre = 'Mlle') Or (titre='Mme')
Else sie := ' est gal ' ; Then Begin
Writeln (a, sie, b) ; term1 := 'a' ;
End. term2 := 'e' ;
End ;
Writeln (titre, ' ', foulen, ', soyez l', term1,
' bienvenu', term2) ;
End.

| 31
Exercice 10 Exercice 12
Program Ordre ; Program Equa_1d ;
Uses Wincrt ; Uses Wincrt ;
Var e1, e2, petit, grand : Integer ; Var a, b : Real ;
Begin Begin
Writeln ('Saisir deux entiers : ') ; Readln (e1, e2) ; Write ('a = ') ; Readln (a) ;
petit := e1 ; Write ('b = ') ; Readln (b) ;
grand := e2 ; IF a <> 0
IF e1>e2 Then Begin Then Writeln ('x = ', -b/a)
petit := e2 ; Else IF b = 0
grand := e1 ; Then Writeln ('IR')
End; Else Writeln ('{}') ;
Writeln (petit, grand:3) ; End.
End.

Exercice 11
Program Tri; Begin
Uses Wincrt; Write ('a = ') ; Readln (a) ;
Var a, b, c : Integer; Write ('b = ') ; Readln (b) ;
(*****************************) Write ('c = ') ; Readln (c) ;
Procedure permut (Var x, y : Integer); IF a>b Then permut (a, b);
Var aux : Integer; IF b>c Then permut (b, c);
Begin IF a>b Then permut (a, b);
aux:=x; Writeln (a, b:4, c:4);
x:=y; End.
y:=aux;
End;
(*****************************)
Exercice 13 Exercice 14
Program Equa_2d ; Program Inequation ;
Uses Wincrt ; Uses Wincrt ;
Var a, b, c, delta : Real ; Var a, b : Real ;
Begin Begin
Write ('a = ') ; Readln (a) ; Write ('a = ') ; Readln (a) ;
Write ('b = ') ; Readln (b) ; Write ('b = ') ; Readln (b) ;
Write ('c = ') ; Readln (c) ; IF a>0
IF a = 0 {quation 1er degr} Then Writeln ('x < ', -b/a)
Then IF b = 0 Else IF a<0
Then IF c = 0 Then Writeln ('x > ', -b/a)
Then Writeln ('IR') Else IF b<0
Else Writeln ('{}') Then Writeln ('IR')
Else Writeln ('x = ', -c/b) Else Writeln ('Impossible') ;
Else delta := sqr (b) - 4*a*c ; End.
IF delta = 0 {solution relle double}
Then Writeln ('x1=x2= ', -b/ (2*a))
Else IF delta > 0 {deux solutions relles}
Then Begin
Writeln ('x1= ', (-b-sqrt (delta))/ (2*a)) ;
Writeln ('x2= ', (-b+sqrt (delta))/ (2*a)) ;
End
Else Writeln ('Deux solutions complexes') ;
End.

Exercice 15 Exercice 16
Program Touche ; Program Calculette ;
Uses Wincrt; Uses Wincrt ;
Var c : Char ; Var a, b : Real ;
nature : String; op : Char ;
Begin Begin
Writeln ('Taper sur une touche'); Readln (c); Readln (a) ; Readln (op) ; Readln (b) ;
Case c of Case op of
'a'..'z','A'..'Z' : IF UPCASE(c) in ['A','E','I','U','O','Y'] '+' : Writeln (a:3:2,' ',op,' ',b:3:2,' = ',a+b:3:2 ) ;
Then nature := 'Voyelle' '-' : Writeln (a:3:2,' ',op,' ',b:3:2,' = ',a-b:3:2) ;
Else nature := 'Consonne'; '*' : Writeln (a:3:2,' ',op,' ',b:3:2,' = ',a*b:3:2) ;
'0'..'9' : nature := 'Chiffre'; '/' : IF b = 0
Else nature := 'Symbole'; Then Writeln ('impossible')
End; Else Writeln (a:3:2,' ',op,' ',b:3:2,' = ',a/b:3:2);
Writeln (nature); Else Writeln ('Oprateur incorrect');
End. End ;
End.

| 32
Exercice 17 Exercice 18
Program Bulletin ; Program nbr_jours_mois;
Uses Wincrt ; Uses wincrt;
Var moy : Real ; Var nbj, mm, an : integer;
me, dec : String ;
Begin Begin
Write ('Donner la moyenne annuelle : ') ; Readln (moy) ; Write ('N du mois : ') ; readln (mm) ;
IF moy < 10
Then Begin nbj :=31;
dec := 'Redouble' ;
me := '' ; if mm in [4,6,9,11]
End then nbj :=30
Else Begin else begin
dec := 'Admis' ; write ('Anne : '); readln (an);
IF moy < 12 nbj := 28;
Then me := 'Passable' if (an mod 4=0)and((an mod 100<>0)or(an mod 400=0))
Else IF moy < 14 then nbj := 29;
Then me := 'Assez bien' end;
Else IF moy < 16
Then me := 'Bien' writeln ('Le nombre de jours du mois saisi est : ', nbj);
Else IF moy < 18 End.
Then me := 'Trs bien'
Else me := 'Excellent' ;
End ;
Writeln ('Moyenne = ', moy,' Dcision = ', dec,
' Mention = ', me) ;
End.

Exercice 20 Exercice 19
Program Anciennete ; Program Date ;
Uses Wincrt ; Uses Wincrt ;
Var ji, mi, ai, jf, mf, af, jj, mm, aa : Integer ; Var mm, err : Integer ;
Begin date, jj, aa, mois : String [10] ;
Write ('Donner la date initiale : ') ; Begin
Readln (ji, mi, ai) ; Writeln ('Saisir une date sous la forme jj/mm/aaaa') ;
Write ('Donner la date finale : ') ; Readln (date) ;
Readln (jf, mf, af) ; jj := COPY (date, 1, 2) ;
IF ji > jf aa := COPY (date, 7, 4) ;
Then Begin VAL (COPY (date, 4, 2), mm, err) ;
jf := jf + 30 ; Case mm of
mf := mf - 1 ; 1 : mois := 'Janvier' ;
End ; 2 : mois := 'Fvrier' ;
IF mi > mf 3 : mois := 'Mars' ;
Then Begin 4 : mois := 'Avril' ;
mf := mf + 12 ; 5 : mois := 'Mai' ;
af := af - 1 ; 6 : mois := 'Juin' ;
End ; 7 : mois := 'Juillet' ;
jj := jf - ji ; 8 : mois := 'Aot' ;
mm := mf - mi ; 9 : mois := 'Septembre' ;
aa := af - ai ; 10 : mois := 'Octobre' ;
Writeln (aa, ' annes ', mm, ' mois ', jj, ' jours') ; 11 : mois := 'Novembre' ;
End. 12 : mois := 'Dcembre' ;
End ;
Writeln (jj, mois:2, aa:2) ;
End.

Exercice 21 Else Begin


Program Lendemain; j:=1;
Uses Wincrt; m:=m+1;
Var j, m, a : Integer; End;
Begin 2 : IF a mod 4 =0
Writeln ('Donner une date sous forme jj mm aa'); Then IF j<29
Readln (j, m, a); Then j:=j+1
Case m Of Else Begin
1, 3, 5, 7, 8, 10,12 : IF j<31 j:=1;
Then j:=j+1 m:=3;
Else IF m = 12 End
Then Begin Else IF j<28
j:=1; Then j:=j+1
m:=1; Else Begin
a:=a+1; j:=1;
End m:=3;
Else Begin End;
j:=1; End;
m:=m+1;
End; Writeln ('La date du lendemain est : ',j,'/',m,'/',a);
4, 6, 9,11: IF j<30 End.
Then j:=j+1

| 33
Exercice 22
Program Toute_Lettre;
Uses Wincrt;
Const
Chiffres : Array[0..19] of String =('','un','deux','trois','quatre','cinq','six','sept','huit','neuf','dix',
'onze','douze','treize','quatorze','quinze','seize','dix-sept','dix-huit','dix-neuf');
Dizaines : Array[2..9] of String = ('vingt','trente','quarante','cinquante','soixante','','quatre-vingt','');
Var n : Integer;
result : String;
Begin
Writeln ('Donner un entier entre 0 et 99'); Readln (n);
Case n of
0..19 : result := Chiffres [n];
20..69,80..89: IF ((n mod 10 = 1) and (n<>81))
Then result := Dizaines [n div 10] + ' et ' + Chiffres [n mod 10]
Else result := Dizaines [n div 10] + ' ' + Chiffres [n mod 10];
70..79,90..99: IF (n = 71)
Then result := Dizaines [n div 10 -1] + ' et ' + Chiffres [n mod 10 + 10]
Else result := Dizaines [n div 10 -1] + ' ' + Chiffres [n mod 10 + 10];
End;

IF n=0 Then Writeln ('zro')


Else Writeln (result);
End.

Exercice 23
Program jour_semaine;
Uses wincrt;
Var day, month, year, dayyear, daymonth, weekday, cm:integer;
jj:string;
Begin
writeln ('Donner le jour'); readln (day);
writeln ('Donner le mois'); readln (month);
writeln ('Donner l''anne'); readln (year);
dayyear:=(year-1)*365 + ((year-1) div 4);
daymonth:=0;
for cm:=1 to (month-1) do
case cm of
1, 3, 5, 7, 8, 10, 12 : daymonth:=daymonth+31;
4, 6, 9, 11 : daymonth:=daymonth+30;
2 : if (year mod 4=0) and ((year mod 100<>0) or (year mod 400 =0))
then daymonth:=daymonth+29
else daymonth:=daymonth+28;
end;
weekday:=(dayyear+daymonth+day) mod 7;
case weekday of
0:jj:='Dimanche';
1:jj:='Lundi';
2:jj:='Mardi';
3:jj:='Mercredi';
4:jj:='Jeudi';
5:jj:='Vendredi';
6:jj:='Samedi';
end;
writeln ('Le jour correspondant est ', jj);
End.

| 34
LES STRUCTURES ITERATIVES

Exercice 1 Exercice 2
Program Alphabet; Program Table3;
Uses Wincrt ; Uses Wincrt ;
Var c : Char ; Const n = 10 ;
Begin Var i : Integer ;
FOR c:= 'A' To 'Z' Do Write (c:2); Begin
Writeln ; FOR i:= 1 To n Do
FOR c:= 'Z' Downto 'A' Do Write (c:2); Writeln ('3*',i,' = ',3*i);
End. End.

Exercice 3 Exercice 4
Program Somme_Produit ; Program Suite ;
Uses Wincrt ; Uses Wincrt ;
Var s, i : Integer ; p : Real ; Var som, i, u : Integer ;
Begin Begin
S := 0 ; P := 1 ; som := 0 ;
FOR i:= 1 To 20 Do u := 2 ;
Begin FOR i := 1 To 100 Do
s := s + i ; Begin
p := p * i ; som := som + u ;
End ; u := u + 3 ;
Writeln ('Somme = ', s); End ;
Writeln ('Produit = ', p:2:2); Writeln (som) ;
End. End.

Exercice 4 Exercice 4
Program Suite ; Program Suite ;
Uses Wincrt ; Uses Wincrt ;
Var som, i, u : Integer ; Var som, i, u : Integer ;
Begin Begin
som := 0 ; som := 0 ;
u := 2 ; u := 2 ;
i := 1 ; i := 1 ;
Repeat While (i<=100) Do
som := som + u ; Begin
u := u + 3 ; som := som + u ;
i := i+1 ; u := u+3 ;
Until (i>100) ; i := i+1 ;
Writeln (som) ; End ;
End. Writeln (som) ;
End.

Exercice 5 Exercice 6
Program Pythagore ; Program Pyramide;
Uses Wincrt ; uses wincrt;
Const n=9; const N=4;
Var i, j : Byte ; var i, j : integer;
Begin begin
FOR i:=1 To n Do for i:=0 to n do
Begin begin
FOR j:=1 To n Do Write (i * j : 4) ; for j:=i+1 to n do write (' ');
Writeln ; for j:=-i to i do write ('*');
End ; writeln;
End. end;
end.

Exercice 7 Exercice 8
Program Moy_Notes; Program Factoriel ;
Uses Wincrt; Uses Wincrt ;
Var i, n : Integer; Var i, n : Byte ;
note, s : Real; fact : Real ;
Begin Begin
Write ('Combien de notes : '); Readln (n); Repeat
s:=0; Writeln ('Saisir un entier');
FOR i:=1 To n Do Readln (n) ;
Begin Until n IN [0..255] ;
Write ('Note ', i, ' : ');
Readln (note); fact := 1 ;
s := s+note; FOR i := 2 To n Do fact := fact * i ;
End;
Writeln ('Moyenne de ces ', n, ' notes : ', s/n:2:2); Writeln (n, ' ! = ', fact) ;
End. End.

| 35
Exercice 10 Exercice 11
Program Diviseurs; Program Som_15;
Uses Wincrt; Uses Wincrt;
Var n, m, r : Integer; Var i, j, k : Integer;
Begin Begin
Writeln ('Donner un entier'); FOR i:=1 TO 9 DO
Readln (n); FOR j:=1 TO 9 DO
m:=n; FOR k:=1 TO 9 DO
Repeat IF (i+j+k=15)
r:= m mod 10; Then Begin
m:= m div 10; Writeln (i, ' ', j, ' ', k);
IF (n mod r = 0) Then Write (r, ' '); Readln ;
Until m=0; End;
End. End.

Exercice 9
Program Jeu ; IF np > nc Then Writeln ('C''est grand')
Uses Wincrt ; Else IF np < nc Then Writeln ('C''est petit')
Label 1, 2 ; Else Writeln ('Bravo vous avez gagn !!') ;
Var np, nc, essai : Integer ; Until (np = nc) Or (essai = 7) ;
z : Char ;
Begin IF np<>nc
1: Clrscr ; Then Writeln ('Perdu, le nombre cherch est : ', nc);
Randomize ;
nc := Random (100) +1 ; Writeln ('Voulez vous jouer encore ? (o/n)');
essai := 0 ; Readln (z);
Repeat IF z='n' Then goto 2 Else goto 1 ;
essai := essai+1 ; 2:End.
Write ('Essai numro ', essai, 'Votre nombre : ':20);
Readln (np) ;

Exercice 12 Program histogramme;


Program Histogramme; Uses wincrt;
Uses Wincrt; Var n1, n2, n3:integer;
Var a, b, c, max, i : Integer; Procedure lecture (var n:integer);
Begin Begin
Writeln ('Entrer trois entiers compris entre 0 et 15'); writeln ('Entrer trois entiers compris entre 0 et 15');
Readln (a, b, c); repeat readln(n) until n in [0..15] ;
max:=a; End;
IF b>max Then max:=b; Procedure affiche (n,c:integer; ca:char);
IF c>max Then max:=c; Var l,i:integer ;
FOR i:= max Downto 1 Do Begin
Begin l:=21; {numro de ligne}
IF i>a Then Write (' ') for i:=1 to n do
Else Write ('A'); begin
IF i>b Then Write (' ':4) gotoxy(c,l);
Else Write ('B':4); writeln(ca);
IF i>c Then Writeln (' ':4) l:=l-1;
Else Writeln ('C':4); end;
End; End;
End. Begin
lecture(n1); lecture(n2); lecture(n3);
affiche(n1,10,'A'); affiche(n2,14,'B'); affiche(n3,18,'C');
End.

Exercice 13 Exercice 14
Program Som_Chiffres; Program Nbr_Cube;
Uses Wincrt; Uses Wincrt;
Var n, som, r : Integer; Var k, c, d, u : Integer;
Begin Begin
Writeln ('Donner un entier'); Readln (n); FOR k:=100 To 999 Do
som:=0; Begin
Repeat c:=k div 100 ;
r:= n mod 10; d:=(k div 10) mod 10;
som:=som+r; u:=k mod 10 ;
n:= n div 10; IF (u*u*u+d*d*d+c*c*c) = K
Until n=0; Then Writeln (k, ' est un nombre cubique');
Writeln ('La somme de chiffres est : ', som); End;
End. End.

| 36
Exercice 15 Exercice 16
Program Somme ; Program Syracuse ;
Uses Wincrt; Uses Wincrt;
Var n, i : Integer ; Var n, i, s : Integer ;
s1, s2, s3 : Real ;
Begin Begin
Repeat Writeln ('Saisir un entier > 0 '); Readln (n);
Write ('Saisir un entier impair : '); Readln (n); S:=n;
Until odd (n); FOR i:=1 To 50 Do
s1:=0; s2:=0; s3:=0; Begin
FOR i:=1 To n Do Write (S, ' ');
IF odd (i) Then s2 := s2 + 1/i IF S mod 2 = 0
Else s3 := s3 - 1/i ; Then S:= S div 2
s1:= s2 - s3 ; Else S:= 3*S+1;
Writeln (s1:8:2, s2:8:2, s3:8:2); End;
End. End.

Exercice 17 Exercice 18
Program Probabilite; Program Puissance_n ;
Uses Wincrt ; Uses Wincrt ;
Const n = 12; essai = 100; Var n, k : Integer ;
Var d1, d2, d3, cumul, i : Byte; y, x : Real ;
Begin Begin
Randomize; Write ('Saisir un nombre rel : ') ; Readln (x) ;
cumul :=0; Write ('Saisir la puissance n : ') ; Readln (n) ;
FOR i:=1 To essai Do y := 1 ;
Begin FOR k := 1 To abs (n) Do y := y * x ;
d1 := 1 + Random (6); IF n<0 Then y := 1/y ;
d2 := 1 + Random (6); Writeln (x:5:2, ' puissance ' , n , ' = ' , y:5:2) ;
d3 := 1 + Random (6); End.
IF (d1+d2+d3 = n) Then cumul := cumul +1;
End;
Writeln ('Probabilit est : ', cumul/essai :5:2);
End.

Exercice 19 Exercice 20
Program Multiplication_Addition ; Program Suite ;
Uses Wincrt ; Uses Wincrt ;
Var x, y, s, aux, i : Integer ; Var i, n : Integer ; s, invfact : Real ;
Begin Begin
Writeln ('Donner deux entiers') ; Readln (x, y) ; Writeln ('Donner un entier'); Readln (n) ;
Write (x, ' * ', y, ' = '); s := 1 ;
IF abs(y)>abs(x) Then Begin invfact := 1 ;
aux := x ; FOR i := 1 To n Do
x := y ; Begin
y := aux ; invfact := invfact/i ;
End ; s := s + invfact ;
IF y<0 Then Begin End ;
y:= -y ; Writeln (s:5:2) ;
x:= -x ; End.
End ;
s := 0 ;
FOR i:=1 To y Do s := s+x ;
Writeln (s) ;
End.

Exercice 21 Exercice 22
Program produits; PROGRAM PI_WALLIS;
uses wincrt; uses wincrt;
var a, b, c, d:integer; var p, r, diff : real;
begin i : longint;
for a:=1 to 9 do begin
for c:=a to 9 do p:=1; i:=0;
for b:=c downto a do repeat
for d:=c downto a do i:=i+2;
if ((10*a+b)*(10*c+d) = (10*b+a)*(10*d+c)) r:=i/(i-1)*i/(i+1);
and (a<>b) and (b<>c) diff:= (p*r) - p;
then Writeln (a, b, ' * ', c, d, ' = ', b, a, ' * ', d, c) ; p:=p*r;
end. until abs (diff) < 1e-8;
writeln ('par la formule de wallis pi = ', 2*p:2:7);
end.

| 37
Exercice 23 Exercice 24
Program PGCD_Euclide; Program PGCD_Diff;
Uses Wincrt; Uses Wincrt;
Var a, b, r : Integer; Var a, b : Integer;
Begin Begin
Repeat Repeat
Writeln ('Saisir deux entiers > 0'); Readln (a, b); Writeln ('Saisir deux entiers >0 '); Readln (a, b);
Until (a>0) and (b>0) ; Until (a>0) and (b>0) ;
While b<>0 Do While a<>b Do
Begin IF a>b Then a:= a-b
r := a mod b; Else b:= b-a ;
a := b;
b := r; Writeln ('PGCD = ', a) ;
End; End.
Writeln ('PGCD = ', a);
End.

Exercice 25 Exercice 25
Program PPCM_AB; Program PPCM_AB;
uses wincrt ; uses wincrt ;
var ppcm, a, b, aux : integer; var c, a, b, aux: integer;
begin begin
repeat repeat
writeln ('saisir deux entiers > 0'); writeln ('saisir deux entiers > 0');
readln (a, b) ; readln (a, b) ;
until (a>0) and (b>0); until (a>0) and (b>0);
if a < b then begin if a < b then begin
aux:= a; aux:= a;
a := b; a := b;
b := aux; b := aux;
end; end;
ppcm := a; c:=0;
while (ppcm mod b <> 0) do ppcm := ppcm + a; repeat
writeln ('ppcm = ', ppcm); c:=c+1;
end. until (a*c) mod b = 0;
writeln ('ppcm = ', a*c);
end.

Exercice 26 Exercice 27
Program Fibonacci ; Program Nbre_Premiers ;
uses wincrt ; uses wincrt ;
var k, f0, f1, f2 : integer ; var nb, i : integer ;
begin begin
f0 := 1 ; f1 := 1 ; for nb := 2 to 400 do
write (f0, ' ', f1, ' ') ; begin
i := 2 ;
for k := 2 to 19 do while (nb mod i <> 0) and (i <= nb div 2) do i:= i+1 ;
begin if (i > nb div 2) then write (nb:4) ;
f2 := f1+f0 ; end ;
f0 := f1 ; end.
f1 := f2 ;
write (f2, ' ') ;
end ;
end.

Exercice 28 Exercice 32
Program Parfait ; Program Exponentiel;
uses wincrt; uses wincrt;
var nb, d, som, a, b : integer; var x, s, epsilon, p, f:real;
begin i:integer;
repeat begin
Readln(a,b); write ('epsilon = '); readln (epsilon);
until (2<a) and (a<b); write ('x = '); readln (x);
for nb:=a to b do s:=1; i:=1; p:=1; f:=1;
begin repeat
som:=0; p:=p*x;
for d:=1 to (nb div 2) do f:=f*i;
if (nb mod d = 0) then som:=som+d ; s:=s+p/f;
if nb=som then writeln (nb, ' est parfait'); i:=i+1;
end; until abs(p/f) <= epsilon;
end. writeln ('expn = ', s:2:10);
end.

| 38
Exercice 29 Exercice 30
Program Amis; Program Facteur_Premier ;
uses wincrt; uses wincrt ;
var m, n, sdn, sdm : integer; type tab = array [1..100] of integer ;
(**********************************) var fp : tab ;
function diviseurs (x : integer) : integer; n, i, f : integer ;
var sdx, i : integer; begin
begin repeat
sdx:=1; writeln ('donner un entier entre 2 et 1000') ; readln (n) ;
for i:=2 to (x div 2) do until (n>=2) and (n<=1000) ;
if (x mod i) = 0 then sdx := sdx+i; write (n, ' = ');
diviseurs:=sdx; i := 2 ; f:=0;
end; repeat
(***********************************) if (n mod i = 0)
begin then begin
for m:=1 to 1000 do n:= n div i;
for n:=1 to 1000 do f:=f+1;
begin fp[f] := i;
sdn := diviseurs (n); end
sdm := diviseurs (m); else i:=i+1;
if (sdm=n) and (sdn=m) until (n=1);
then writeln (n, ' et ', m, ' sont amis') ; write (fp[1]);
end; for i:=2 to f do write (' * ', fp[i]);
end. end.

Exercice 31 Exercice 33
Program calcul_sinus; Program Somme;
uses wincrt; Uses Wincrt;
var x:real; Var i, n : Integer; s : Real;
(***********************************) (*************************************)
function sinus (x:real) : real; Procedure saisie (Var m : Integer);
var som, term1, term2, i:real; Begin
begin Repeat
som:=x; Writeln ('Donner un entier positif');
term2:=x; Readln (m);
i:=1; Until m>0;
repeat End;
i:=i+2; (**************************************)
term1:=term2; Function puissance (x : Integer):Longint;
term2:=term1 * -sqr(x) / (i*(i-1)); Var j : Integer ; p : Longint;
som:=som+term2; Begin
until abs (term2-term1) <= 0.0001; p:=1;
sinus:=som; FOR j:=1 To x Do p:=p*x;
end; puissance:=p;
(*****************P.P*****************) End;
begin (**************************************)
repeat Begin
write ('donner un rel x '); saisie (n);
readln(x); s:=0;
until (0<= x) and (x <= 2*Pi); FOR i:=1 To n Do s:= s + (2*i-1) / puissance (i);
write ('sin(', x:1:2,') = ', sinus(x):10:10); Writeln ('la somme = ', s:2:3);
end. End.

Exercice 34 Exercice 34
Program Combinaison ; Program Combinaison ;
Uses Wincrt ; Uses Wincrt ;
Var cnp : Real ; Var cnp : Real ; n, p, i : Integer ;
n, p : Integer ; Nf, pf, npf : Longint ;
(**************************************) Begin
Function Fact (x : Integer) : LongInt ; Repeat
Var f : LongInt ; i : Integer ; Write (p = '); Readln (p);
Begin Write (n = '); Readln (n);
f := 1 ; Until (0<p) and (p<n) ;
FOR i := 2 To x Do f := f * i ; Nf :=1;
fact := f ; Pf :=1;
End ; Npf :=1;
(*************************************) FOR i:=2 To n Do
Begin Begin
Repeat Nf := nf*i ;
Writeln (Donner deux entiers : ); IF i<=p Then pf := pf*i;
ReadLn (p, n); IF i<=n-p Then npf := npf*i;
Until (0<p) and (p<n) ; End;
cnp := fact (n) / (fact (p) * fact (n-p)) ; Cnp := nf / (pf*npf) ;
Writeln ('Combinaison = ', cnp :4:2) ; Writeln ('Combinaison = ', cnp :4:2) ;
End. End.

| 39
Exercice 35 ordre:=valide;
Program Ordered ; End;
Uses Wincrt; (*******************************************)
Var n : Integer; Procedure saisie (Var m : Integer);
i, mn, mx, p : Longint; Begin
(**************************************) Repeat
Procedure min_max (m : Integer; Var min, max:Longint); Write ('Donner un entier n compris entre 2 et 8 : ');
Var i : Integer; Readln (m);
Begin Until m in [2..8];
min:=0; max:=0; End;
FOR i:=1 To m Do (*******************************************)
Begin Begin
min:=10*min + i; saisie (n);
max:=10*max + (9-m+i); min_max (n, mn, mx);
End; p:=0;
End; FOR i:=mn To mx DO
(***********************************) IF ordre (i) Then
Function ordre (m:Longint) : Boolean; Begin
Var c1, c2 : Integer; valide : Boolean; p:=p+1;
Begin Writeln (p:10, ' - ', i); Readln ;
Repeat End;
c1:= m MOD 10; End.
m:= m DIV 10;
c2:= m MOD 10;
valide:= (c1>c2);
Until Not (valide) Or (m<10) ;

Exercice 36 Exercice 37
Program Nbre_Impairs; program sommes_entiers;
Uses Wincrt; uses wincrt;
Var i, n : Integer; var n, i, j, k, s:integer;
Begin begin
n:=0; writeln ('entrer la valeur de N :'); readln (n);
FOR i:=1 To 99 Do for i:=1 to n div 2 do
IF ODD (i) and (i mod 7 <>0) begin
Then Begin S := i; j:= i;
n:=n+1; Repeat
IF n mod 5 <>0 J := j +1;
Then Write (i:4) S := S + j;
Else Writeln (i:4); until s >= n;
End; if S=N then
End. begin
write (n,' = ',i);
for k:=i+1 to j do write(' + ',k);
writeln;
end;
end;
end.

Exercice 38
Program Reine ;
Uses Wincrt;
Var x, y, i, j : Byte ;
Begin
Write ('Les coordonnes de la dame: X = ') ; Readln (X);
Write (' Y = ') ; Readln (Y);
FOR i:=1 To 8 Do
Begin
FOR j:=1 To 8 Do
IF (i=x) and (j=y)
Then Write (' R ')
Else IF (i=x) Or (j=y) Or (abs(x-i)=abs(y-j))
Then Write (' * ')
Else Write (' ');
Writeln ;
End;
End.

| 40
LES
LES TABLEAUX
TABLEAUX

Exercice 1 Exercice 2
Program Som_Produit_MoyArith ; Program Affich_sans_redondance;
Uses Wincrt ; Uses Wincrt;
Type Tab = Array [1..10] of Integer ; Var T : Array [1..20] of Char;
Var T : Tab ; n, i, st : Integer ; mt, pt : Real ; n, i, j : Integer;
Begin Begin
Repeat Repeat
Write ('N = '); Writeln ('Donner un entier'); Readln (n);
Readln (n) ; Until n in [3..20] ;
Until (n>5) and (n<=10) ; FOR i:=1 To n Do
FOR i := 1 To n Do Repeat
Repeat Writeln ('Saisir la case d''ordre ', i);
Write ('T', i, ' = '); Readln (T[i]);
Readln (T[i]) ; Until upcase (T[i]) in ['A'..'Z'] ;
Until (1<= T[i]) and (T[i] <= 20) ; FOR i:=1 To 20 Do Write (T[i], ' ');
st := 0 ; Writeln ;
pt := 1 ; Writeln ;
FOR i := 1 To n Do Write (T[1], ' ');
Begin FOR i:=2 To 20 Do
St := st + T[i] ; Begin
Pt := pt * T[i] ; j:=i;
End ; While (j>2) and (T[i]<>T[j-1]) Do j:=j-1;
Writeln ('Somme = ', st); IF T[i] <>T[j-1] Then Write (T[i], ' ');
Writeln ('Produit = ', trunc (pt)); End;
Writeln ('Moyenne arithmtique = ', st/n:2:2); End.
End.
Exercice 3 Exercice 4
Program Freq_Lettre ; Program Conversion_base10_base2;
Uses Wincrt ; Uses Wincrt;
Const n=35 ; Var rest : Array [1..50] of 0..1;
Var LET : Array [1..n] of Char ; n, i, j : Integer;
FE : Array ['A'..'Z'] of Byte ; Begin
i : Byte ; j : Char; Repeat
Begin Writeln ('Donner un entier positif'); Readln (n);
Randomize ; Until (n > 0);
FOR i := 1 To n Do i:=0;
Begin Repeat
LET[i] := CHR (65+ Random (26)) ; i:=i+1;
Write (LET[i] :2) ; rest[i]:=n mod 2;
End; n:=n div 2;
FOR j := 'A' To 'Z' Do FE[j] := 0 ; Until n=0;
FOR i := 1 To n Do FOR j:=i Downto 1 Do Write (rest[j]);
FE[LET[i]] := FE[LET[i]] + 1; End.
============ Solution 2 =================
Writeln ; Writeln; Program Conversion_base10_base2;
FOR j := 'A' To 'Z' Do Write (j:2); Uses Wincrt;
Writeln ; var n:integer;
FOR j := 'A' To 'Z' Do Write (FE[j]:2) ; (*****************************************)
End. procedure saisir(var n:integer);
begin
Repeat
Writeln ('Donner un entier positif'); Readln (n);
Until (n > 0);
end;
(***************************************)
function dec_bin (n:integer):string;
var chb,chr:string;
r:0..1;
begin
chb:='';
Repeat
r:=n mod 2;
str(r, chr);
insert (chr, chb, 1);
n:=n div 2;
Until n=0;
dec_bin:=chb;
end;
(********************PP********************)
Begin
Saisir (n);
writeln ('(',n,')10 = (',dec_bin(n),')2');
End.

| 41
Exercice 5 {conversion de la base b1 au dcimal}
Program Conversion_b1_b2; nb10 :=0;
Uses Wincrt; FOR i:=1 To n-1 Do nb10:=(nb10+nb[i])*b1;
Var nb, reste : Array [1..50] of 0..15; nb10:=nb10+nb[n];
b1, b2, n, i, j, err, nb10 : Integer;
nch : String; {conversion de nb10 du dcimal la base b2}
Begin i:=0;
Repeat Repeat
Write ('Base b1 = '); Readln (b1); i:=i+1;
Write ('Base b2 = '); Readln (b2); reste[i]:=nb10 mod b2;
Until (b1 in [2..16]) and (b2 in [2..16]); nb10:=nb10 div b2;
Until nb10=0;
Writeln ('Donner le nombre convertir'); Readln (nch);
n:=Length (nch); {affichage du rsultat}
FOR i:=1 To n Do FOR j:=i Downto 1 Do
IF ORD (nch[i]) <65 IF reste[j] < 10
Then VAL (nch[i], nb[i], err) Then Write (reste[j])
Else nb[i] :=(ORD (nch[i]) - ORD ('A') + 10) ; Else Write (CHR (reste[j]-10 + ORD ('A')));
End.

Exercice 6 j := 0 ; k := 0 ;
Program Eclater_tab ; FOR i := 1 To n Do
Uses Wincrt ; IF T[i] < 0 Then Begin
Type Tab = Array [1..50] of Integer ; j := j+1 ;
Var T, TN, TP : Tab ; TN[j] := T[i] ;
n, i, j, k : Integer ; End
Begin Else Begin
Repeat k := k+1 ;
Writeln ('Saisir un entier') ; TP[k] := T[i] ;
Readln (n) ; End ;
Until (n>=10) and (n<=50) ; FOR i := 1 To j Do Write (TN[i]:4) ;
Writeln (Saisir les ', n, ' lments de T) ; Writeln ;
FOR i:=1 To n Do Readln (T[i]) ; FOR i := 1 To k Do Write (TP[i]:4) ;
End.

Exercice 7 FOR i := 1 To (n div 2) Do


Program Inverser_tab ; Begin
Uses Wincrt ; aux := T[i] ;
Type Tab = Array [1..50] of Integer ; T[i] := T[n-i+1] ;
Var T : Tab ; T[n-i+1] := aux ;
i, n, aux : Integer ; End ;
Begin Writeln ; Writeln ;
Repeat Writeln ('Tableau invers :') ;
Writeln ('Saisir un entier') ; FOR i := 1 To n Do Write(T[i]:4) ;
Readln (n) ; End.
Until n in [10..50] ;
Writeln (Saisir les ', n, ' lments de T) ;
FOR i := 1 To n Do Readln (T[i]) ;

Exercice 8
Program Regrouper_tab ; k:=0 ;
Uses Wincrt ; FOR i := 1 To n Do
Var T : Array [1..50] of Integer ; IF (T[i] mod 2) = 0
i, j, k, n, tmp : Integer ; Then Begin
Begin k := k+1 ;
Repeat tmp := T[i] ;
Write ('N = '); Readln (n) ; FOR j:=i Downto k+1 Do T[j]:=T[j-1] ;
Until (n>=10) and (n<=50) ; T[k] := tmp ;
Randomize ; End ;
FOR i := 1 To n Do Writeln ; Writeln ;
Begin FOR i := 1 To n Do Write (T[i]:4) ;
T[i] := -20+Random (41) ; End.
Write (T[i]:4) ;
End;

Exercice 9 min:=T[1];
Program Min_Max_tab ; max:=T[1];
Uses Wincrt; FOR i:=2 TO n DO
Var T : Array [1..50] of Integer; Begin
i, min, max, n : Integer; IF T[i]<min Then min:=T[i];
Begin IF T[i]>max Then max:=T[i];
Repeat Readln (n) Until (n>=10) and (n<=50); End;
FOR i:=1 TO N DO Readln (T[i]); Writeln ('Valeur maximale = ', max);
Writeln ('Valeur minimale = ', min);
End.

| 42
Exercice 11 Exercice 10
Program Ranger_tab ; Program Symetri_tab ;
Uses Wincrt ; Uses Wincrt ;
Type Tab = Array [1..10] of Integer ; Type Tab = Array [1..50] of Integer ;
Var T, R : Tab ; Var T : Tab ;
i, j : Integer ; i, j, n : Integer ;
Begin Begin
Writeln (Saisir les 10 lments de T) ; Repeat
FOR i:=1 To 10 Do Writeln ('Saisir un entier') ;
Readln (T[i]) ; Readln (n) ;
j:=0 ; Until (n>1) and (n mod 2 =0) ;
FOR i := 1 To 10 Do Writeln ('Saisir ', n div 2, ' lments de T') ;
IF T[i] >= 0 Then Begin FOR i := 1 To (n div 2) Do
j := j+1 ; Begin
R[j] := T[i] ; Readln (T[2*i-1]) ;
End; T[2*i]:= T[2*i-1];
FOR i := 1 To 10 Do End;
IF T[i] < 0 Then Begin FOR i := 1 To (n div 2)-1 Do
j := j+1 ; Begin
R[j] := T[i] ; FOR j:=i+1 To n-i Do T[j] := T[j+1] ;
End; T[n-i+1] := T[i] ;
FOR i := 1 To 10 Do Write (T[i]:4) ; End ;
Writeln ; Writeln ('Tableau symtrique :') ;
FOR i := 1 To 10 Do Write (R[i]:4) ; FOR i := 1 To n Do Write (T[i]:4) ;
End. End.

Exercice 12 (************************)
Program Recherche_Dichotomique_tab ; Function Recherche (v, n : Integer ; T : Tab) : Integer;
Uses Wincrt; Var d, g, m, pos : Integer;
type Tab = Array [1..50] of Integer; Begin
Var T : Tab; g:=1 ; d:=n ; pos:=0;
N, V : Integer; Repeat
(***************************) m:=(g+d) div 2 ;
Procedure Saisie (Var T : Tab ; Var n, v : Integer); IF V=T[m] Then pos:=m
Var i : Integer; Else IF V>T[m]
Begin Then g:=m+1
Repeat Else d:=m-1;
Writeln ('Donner un entier'); Readln (n); Until (pos=m) Or (g>d);
Until n in [10..50]; recherche:= pos ;
End;
Writeln ('Saisir les lments de T en ordre croissant'); (************************)
Readln (T[1]); Begin
FOR i:=2 To n Do Saisie (T, N, V);
Repeat IF Recherche (V, N, T) = 0
Readln (T[i]) Then Writeln (V, ' ne figure pas dans le tableau')
Until T[i] >= T[i-1]; Else Writeln (V, ' se trouve la position ',
Writeln ('Donner la valeur chercher'); Readln (v); recherche (V, N, T));
End; End.

Exercice 12 Exercice 13
Program Recherche_sequentielle_tab ; Program Regrouper_Tab ;
Uses Wincrt ; Uses Wincrt ;
Var T : Array [1..50] of Integer ; Var T : Array [1..20] of Integer ;
i, v, n : Integer ; i, j, k, n, tmp : Integer ;
Begin Begin
Repeat Repeat
Write ('N = '); Readln (n); Write ('N = ') ; Readln (n) ;
Until (10<=n) and (n<=50); Until (n>=2) and (n<=20) ;
Writeln ('Saisir les ', n, ' lments de T '); Writeln ('Saisir les lments de T') ;
FOR i := 1 To n Do Readln (T[i]) ; FOR i:=1 To n Do Readln (T[i]) ;
Writeln ('Donner la valeur chercher') ; Readln (v) ; FOR i:=1 To n-1 Do
i := 0 ; FOR j:=i+1 To n Do
Repeat IF (T[j] = T[i]) Then T[j]:=0 ;
i :=i+1 ; k:=0 ;
Until (v=T[i]) Or (i=n) ; FOR i:=1 To n Do
IF v=T[i] IF T[i]<>0 Then Begin
Then Writeln (v, ' se trouve la position ', i) k:=k+1 ;
Else Writeln (v, ' ne figure pas dans le tableau'); IF T[i] <> T[k] Then Begin
End. tmp := T[k] ;
T[k] := T[i] ;
T[i] := tmp ;
End ;
End ;
FOR i:=1 To n Do Write(T[i]:3) ;
End.

| 43
Exercice 14 Exercice 15
Program Frequence ; Program Moy_Rang;
Uses Wincrt ; Uses Wincrt;
Const n=20 ; Const n=30;
Var T : Array [1..n] of 1..6 ; Var A, R : Array [1..n] of Real;
F : Array [1..6] of 0..20 ; j, i : Integer;
i : 1..20 ; Begin
Begin FOR i:=1 To n Do
Randomize ; Repeat
FOR i := 1 To n Do Write ('Note lve ', i, ' : ');
Begin Readln (A[i]);
T[i] := 1+ Random (6) ; Until (A[i]>=0) and (A[i]<=20);
Write (T[i] : 2) ;
End ; FOR i:=1 To n Do
Begin
FOR i:=1 To 6 Do F[i] := 0 ; R[i]:=1;
FOR j:=1 To n Do
FOR i:=1 To n Do IF A[i]<A[j] Then R[i]:=R[i]+1;
F[T[i]] := F[T[i]] + 1 ; End;

Writeln ; Writeln ('Moyens':25, 'Rangs':8);


FOR i := 1 To 6 Do Write (F[i] : 4) ; FOR i:=1 To n Do
End. Writeln (A[i]:25:2, trunc (R[i]):5);
End.

Exercice 16 Exercice 18
Program Insert_Tab; Program Nbre_Rond;
Uses Wincrt ; Uses Wincrt;
Const n_max = 100; Var reste, c : String;
Var T : Array [1..n_max] of Char; n, m, i, j, n1, n0 : Integer;
c : Char; Begin
i, k, n : Integer; FOR i:=1 To 1000 Do
Begin Begin
Repeat n:=i;
Writeln ('Donner un entier '); Readln (n); m:=i;
Until (n>=1) and (n<n_max); reste:='';
Writeln (Saisir les lments de T) ; Repeat
FOR i:=1 To n Do Readln (T[i]); STR (n mod 2, c);
Writeln ('Donner le caractre insrer'); reste:= c+reste;
Readln (c); n:=n div 2;
Repeat Until n=0;
Writeln ('Donner la position d''insertion'); n1:=0; n0:=0;
Readln (k) FOR j :=1 To Length (reste) Do
Until k in [1..n]; Begin
IF reste[j]='1' Then n1:=n1+1;
{dcalage des lments vers droite} IF reste[j]='0' Then n0:=n0+1;
FOR i:= n Downto k Do T[i+1] := T[i]; End;
T[k]:=c; IF n1=n0 Then Writeln (m, ' est ROND')
FOR i:=1 To n+1 Do Write(T[i]:4); Else Writeln (m, ' n''est pas ROND');
End. Readln ;
End;
End.

Exercice 17 Exercice 17
Program Triangle_Pascal; Program Triangle_Pascal;
Uses Wincrt; Uses Wincrt;
Type Tab = Array [1..15] of Integer; Type matrice = Array [1..15, 1..15] of Integer;
Var T : Tab; N : Integer; Var T : matrice; N : Integer;
Procedure init (n : Integer ; Var T : Tab); Procedure triangle (n : Integer ; Var T:matrice);
Var i : Integer; Var l, c : Integer;
Begin Begin
T[1]:=1; T[1,1]:=1;
FOR i:=2 To n Do T[i]:=0; FOR l:=2 To n Do
End; Begin
Procedure triangle (n : Integer ; Var T : Tab); T[l,1]:=1;
Var i, j : Integer; FOR c:=2 To l-1 Do
Begin T[l,c]:=T[l-1,c]+T[l-1,c-1];
Writeln (T[1]); T[l,l]:=1;
FOR i:=2 To n Do End;
Begin End;
FOR j:=i Downto 2 Do Procedure Afficher (n : Integer ; T:matrice);
Begin Var l, c : Integer;
T[j]:=T[j]+T[j-1]; Begin
Write (T[j], ' '); FOR l:=1 To n Do
End; Begin
Writeln (T[1]); FOR c:=1 To l Do Write (T[l,c], ' ');
End; Writeln ;
End; End;

| 44
(*****************************************) End;
Begin (*********************************************)
Repeat Begin
Writeln ('Donner la taille du triangle : '); Readln (n); Repeat
Until n in [2..15]; Writeln ('Donner la taille du triangle : '); Readln (n);
Init (n, T); Until n in [2..15];
Triangle (n, T); Triangle (n, T);
End. Afficher (n, T);
End.
Exercice 19 Procedure Transpose (Var M:Mat;n:integer);
Program transpose_matrice; var a ux,i,j:integer;
uses wincrt; begin
const nmax=10; For i:=1 to n do
type Mat=array[1..nmax,1..nmax] of integer; For j:=1 to i-1 do
var M:Mat; begin
n:integer; aux:=M[i,j];
Procedure saisie (Var n:integer); M[i,j]:=M[j,i];
begin M[j,i]:=aux;
repeat end;
writeln('Donner n :'); end;
readln(n); Procedure Affiche ( M:Mat; n:integer);
until n in [1..nmax]; var i, j:integer;
end; begin
Procedure remplir (Var M:Mat; n:integer); For i:=1 to n do
var i, j:integer; begin
begin For j:=1 to n do Write( M[i,j],' ');
For i:=1 to n do writeln;
For j:=1 to n do end;
begin end;
Writeln('Donner M[',i,',',j,']'); {Programme Principal}
readln(M[i,j]); begin
end; saisie (n);
end; remplir (M, n);
Transpose (M, n);
Affiche (M, n);
end.

Exercice 20 Exercice 21
Program TRI_SELECTION ; Program Moy_Rang;
Uses Wincrt ; Uses Wincrt;
Const n = 20 ; Const n=30;
Type Tab = Array [1.. n] of String ; Var Nom : Array [1..n, 1..2] of String [50];
Var T : Tab ; Note : Array [1..n, 1..4] of Real;
i , j , posmin : Integer ; j, i, a, b : Integer;
tmp : String; Begin
Begin FOR i:=1 To n Do
Writeln ('Remplir le tableau par des chanes :'); Begin
FOR i := 1 TO n DO Readln (T[i]) ; Writeln ('Elves n ', i);
Write ('Nom : '); Readln (nom[i,1]);
FOR i := 1 TO n-1 DO Write ('Prnom : '); Readln (nom[i,2]);
Begin FOR j:=1 To 2 Do
posmin := i ; Repeat
FOR j := i+1 TO n DO Write ('Note ', j, ' : ');
IF T[j] < T[posmin] Then posmin := j ; Readln (note[i,j]);
IF i<> posmin Then Begin Until (note[i,j]>=0) and (note[i,j]<=20);
tmp := T[i] ; note[i,3] := (note[i,1]+note[i,2]*2)/3;
T[i] := T[posmin] ; End;
T[posmin] := tmp ; FOR i:=1 To n Do
End ; Begin
End ; note[i,4]:=1;
FOR j:=1 To n Do
Writeln ('Tableau tri :'); IF note[i,3]<note[j,3] Then note[i,4]:=note[i,4]+1;
FOR i := 1 TO n DO Writeln (T[i]) ; End;
End. Writeln ('Nom', 'Prnom':15, 'Note 1':10, 'Note 2':10,
'Moyens':10, 'Rangs':10);
FOR i:=1 To n Do
Begin
a:=Length (nom[i,1]);
b:=Length (nom[i,2]);
Writeln (nom[i,1], nom[i,2]:(12-a+b),
note[i,1]:(15-b):2, note[i,2]:10:2,
note[i,3]:10:2, trunc(note[i,4]):9);
End;
End.

| 45
Exercice 22 (****************************************)
Program Intersection_Tab; Procedure intersection (nf : Integer ; A1, A2:vect;
Uses Wincrt; Var p : Integer ; Var B:vect);
Type vect = Array [1..99] of Integer; Var i, j : Integer;
Var T1, T2, inter : vect; Begin
n, m : Integer; p:=0;
(****************************************) FOR i:=1 To nf Do
Procedure saisie_int (Var nf : Integer); Begin
Begin j:=0;
Repeat Repeat
Write ('N = '); j:=j+1;
Readln (nf); Until (j=nf) Or (A1[i]=A2[j]);
Until nf in [3..99]; IF A1[i]=A2[j]
End; Then Begin
(****************************************) p:=p+1;
Procedure remplir_tab (nf : Integer ; Var A:vect); B[p]:=A1[i];
Var i, j : Integer; End;
Begin End;
Writeln ('Saisir la case 1'); End;
Readln (a[1]); (****************************************)
FOR i:=2 To nf Do Procedure affiche_tab (nf : Integer ; A:vect);
Repeat Var i : Integer;
Writeln ('Saisir la case ', i); Begin
Readln (A[i]); FOR i:=1 To nf Do Write (A[i], ' ');
j:=i-1; End;
While (j>1) and (A[i] <> A[j]) Do j:=j-1; (****************** P.P. *********************)
Until A[i]<>A[j]; Begin
End; saisie_int (n); remplir_tab (n, T1); remplir_tab( n, T2);
intersection (n, T1, T2, m, inter);
affiche_tab (n, T1); Writeln ; affiche_tab (n, T2);
Writeln ;
affiche_tab (m, inter);
End.

Exercice 23 Exercice 25
program tri_2_criteres; Program tri_2_criteres;
uses wincrt,ecran; uses wincrt,ecran;
const n=10; type tch=array[1..10] of string[20]; tc=array[1..10] of char;
type tab=array[1..n] of string; var n:integer; t:tch; c:tc;
var t:tab; (*********************************************)
i,j,pos:integer; procedure saisie(var n:integer;var t:tch;var c:tc);
aux:string; var i:integer;
begin begin
writeln('Remplir T :'); write ('N = ');readln(n);
for i:=1 to n do writeln ('remplir les tableaux T et C :');
repeat for i:=1 to n do
write('ch = '); begin
readln(t[i]); write('nom = '); readln(t[i]);
until t[i]<>''; repeat write ('couleur = '); readln (c[i]); until c[i] in ['B','N'];
(***************************) end;
for i:=1 to n-1 do end;
begin (*********************************************)
pos:=i; procedure tri(n:integer;var t:tch;var c:tc);
for j:=i+1 to n do var i:integer; permut:boolean; aux:string; tmp:char;
if (length(t[j])<length(t[pos])) OR begin
((length(t[j])=length(t[pos]))AND(t[j]<t[pos])) repeat
then pos:=j ; permut:=false;
if i<>pos then begin for i:=1 to n-1 do
aux:=t[i] ; if (c[i]>c[i+1])or((c[i]=c[i+1])and(t[i]>t[i+1]))
t[i]:=t[pos]; then begin
t[pos]:=aux; aux:=t[i] ; t[i]:=t[i+1]; t[i+1]:=aux;
end; tmp:=c[i] ; c[i]:=c[i+1]; c[i+1]:=tmp;
end; permut:=true
(****************************) end;
for i:=1 to n do writeln (t[i]); n:=n-1
end. until (permut=false) or (n=1);
end;
(**************************************************)
procedure affiche (n:integer;t:tch;c:tc);
var i:integer;
begin
for i:=1 to n do writeln(t[i],' ',c[i]);
end;
(*******************P.P******************************)
Begin
Saisie (n,t,c); tri (n,t,c); affiche (n,t,c);
End.

| 46
Exercice 24 Exercice 26
Program tri_bulles_bidirectionnel; program fusion;
uses wincrt,ecran; uses wincrt,ecran;
type tab=array[1..25] of integer; type tab=array [1..20] of integer;
var t:tab; var v1,v2,v3:tab;
n:integer; n,m,c:integer;
(********************************************) (*******************************************)
procedure saisir(var n:integer); procedure lecture (var taille:integer);
begin begin
repeat repeat
writeln('Donner un entier entre 5 et 25'); readln(taille);
readln(n); until taille in [2..20];
until n in [5..25]; end;
end; (********************************************)
(********************************************) procedure remplir(var t:tab; taille:integer);
procedure remplir (var t:tab ; n:integer); var i:integer;
var i:integer; begin
begin for i:= 1 to taille do readln(t[i]);
randomize; end;
for i:=1 to n do T[i]:=1+random(100); (********************************************)
end; procedure trier (taille:integer;var t:tab);
(********************************************) var i,tmp, min,j:integer;
procedure trier (var T:tab ;n:integer); begin
var i,aux,debut,fin:integer; for i:=1 to taille-1 do
permut:boolean; begin
(**********************) min:=i;
begin for j:=i+1 to taille do
debut:=1;fin:=n; if t[j]<t[min] then min:=j;
repeat if i<>min then begin
permut:=false; tmp:=t[i];
t[i]:=t[min];
for i:=debut to fin-1 do t[min]:=tmp;
if t[i]>t[i+1] end;
then begin end;
aux:=T[i]; end;
T[i]:=T[i+1]; (********************************************)
T[i+1]:=aux; procedure fusionner(v1,v2:tab;var v3:tab;n,m:integer;var c:integer);
permut:=true; var i,c1,c2:integer;
end; begin
fin:=fin-1; c1:=1; c2:=1; c:=0;
repeat
for i:=fin downto debut+1 do c:=c+1;
if t[i]<t[i-1] if v1[c1]<v2[c2]
then begin then begin
aux:=T[i]; v3[c]:=v1[c1];
T[i]:=T[i-1]; c1:=c1+1;
T[i-1]:=aux; end
permut:=true; else begin
end; v3[c]:=v2[c2];
c2:=c2+1;
debut:=debut+1; end
until (permut=false) or (debut>=fin); until (c1>n) or (c2>m);
end; if c1>n then
(*********************************************) for i:=c2 to m do
procedure afficher(T:tab ; n:integer); begin
var i:integer; c:=c+1;
begin v3[c]:=v2[i];
for i:=1 to n do write(T[i],' '); end
end; else
(******************* P.P. **********************) for i:=c1 to n do
BEGIN begin
saisir(n); c:=c+1;
remplir(t,n); v3[c]:=v1[i];
writeln('Tableau avant le tri :'); end;
afficher(t,n); end;
trier(t,n); (********************************************)
writeln; procedure afficher(t:tab; taille:integer);
writeln('Tableau aprs le tri :'); var i:integer;
afficher(t,n); begin
END. writeln('Tableau fusion :');
for i:= 1 to taille do
write(t[i]:4);
end;
(**********************P.P*********************)
begin
write('Taille V1 : ');lecture(n);
write('Taille V2 : ');lecture(m);
writeln('Remplir V1 :');remplir(v1,n);

| 47
writeln('Remplir V2 :');remplir(v2,m);
trier(n,v1);
trier(m,v2);
fusionner(v1,v2,v3,n,m,c);
afficher(v3,c);
end.

Exercice 27 (************* TRI INSERTION *************)


Program temps_tris; procedure tri2 (n:integer;var t2:tab);
uses wincrt,windos,ecran; var j,i:integer;
type tab=array[1..1000] of real; tmp:real;
var t,t1,t2:tab; (****************************)
n:integer; procedure decaler (var t2:tab;var j:integer;i:integer);
hi1,hi2,mi1,mi2,si1,si2,csi1,csi2,hs1,hs2, begin
ms1,ms2,ss1,ss2,css1,css2,ts1,ti1:word; j:=i;
(******** lecture et duplication *************) WHILE (j>1)and(t2[j-1]>tmp) DO
procedure lecture_duplic(var n:integer;var t,t1,t2:tab); Begin
var i:integer; t2[j]:=t2[j-1];
begin j:=j-1;
Writeln('Saisir un entier pour la taille des tableaux'); End ;
Readln(n); end;
randomize; (***********************)
for i:=1 to n do Begin
begin for i:=2 to n do
t[i]:=100*random; { rel alatoire entre ]0..100[ } if t2[i]<t2[i-1]
t1[i]:=t[i]; then Begin
t2[i]:=t[i]; tmp:=t2[i];
end; Decaler(t2,j,i);
end; t2[j]:=tmp;
(********* TRI SELECTION **************) End ;
Procedure tri1 (n:integer;var t1:tab); End;
var pm,i:integer; (************** Affichage **************)
(*************************) procedure affiche(n:integer;t:tab);
Function posmin(d,f:integer;t:tab):integer; var i:integer;
var i,pmin,j:integer; begin
begin for i:=1 to n do write(t[i]:2:2,' ');
pmin:=d; end;
for j:=d+1 to f do (********** Programme principal ***********)
if t[j] < t[pmin] then pmin:=j; BEGIN
posmin:=pmin; lecture_duplic(n,t,t1,t2);
end; gettime(hs1,ms1,ss1,css1);
(**************************) tri1(n,t1);
Procedure permut (var x,y:real); gettime(hs2,ms2,ss2,css2);
var aux:real; ts1:=(hs2-hs1)*3600*100+(ms2-ms1)*60*100+(ss2-s1)*100+css2-
begin css1;
aux:=x; gettime(hi1,mi1,si1,csi1);
x:=y; tri2(n,t2);
y:=aux; gettime(hi2,mi2,si2,csi2);
end; ti1:=(hi2-hi1)*3600*100+(mi2-mi1)*60*100+(si2-si1)*100+csi2-
(*************************) csi1;
begin affiche(n,t1); readln;
for i:=1 to n-1 do affiche(n,t2); readln;
begin writeln('tri selection : ',ts1, ' Centime de seconde');
pm:=posmin(i,n,t1); writeln('tri insertion : ',ti1, ' Centime de seconde');
if pm<>i then permut(t1[pm],t1[i]); END.
end;
end;

Exercice 28 Exercice 29
Procedure Trier (n:integer ; T:tab;var rang,s:tab); program long_suite;
Var i,j : integer; uses wincrt, ecran;
BEGIN const n=20;
FOR i:=1 TO n DO s[i]:=1; type tab=array[1..n] of char;
var t:tab; max, suite:string; i:integer;
FOR i:=1 TO n-1 DO begin
FOR j:=i+1 TO n DO for i:=1 to n do readln(t[i]);
IF T[i]>T[j] max:=t[1];
THEN s[i]:=s[i]+1 suite:=t[1];
ELSE s[j]:=s[j]+1; for i:=2 to n do
if t[i]=t[i-1]
FOR i:=1 TO n DO rang[s[i]]:=i; then suite:=suite+t[i]
END; else begin
if length(suite)>length(max) then max:=suite;
suite:=t[i];
end;

writeln (max[1], length(max));


end.

| 48
LES CHAINES DE CARACTERES

Exercice 2 Exercice 3
Program Palindrome; Program chaine_inverse;
Uses Wincrt ; Uses wincrt;
Var ch, inv : String; Var ch : string;
i : Integer; (*************************************)
Begin Function miroir (ch:string):string;
Writeln ('Saisir une chane'); Readln (ch); var i, l : integer; c : char;
inv := '' ; begin
FOR i := Length (ch) Downto 1 Do l:=length(ch);
inv := inv + ch[i]; for i:=1 to l div 2 do
IF ch = inv begin
Then Writeln (ch, ' est palindrome') c:=ch[i];
Else Writeln (ch, ' n''est pas palindrome'); ch[i]:=ch[l-i+1];
End. ch[l-i+1]:=c;
end;
Exercice 4 miroir:=ch;
Program Chaine_Majus_Minus; end;
Uses Wincrt; (***************** P.P ******************)
Var ch : String; BEGIN
i : Integer; write('ch = ');readln(ch);
Begin writeln('l''inverse de ',ch,' est : ', miroir(ch));
Writeln ('Saisir une chane de caractres'); Readln (ch); END.
FOR i:=1 To Length (ch) Do ============== solution 2 ==============
IF ch[i] in ['a'..'z'] Function miroir (ch:string) : string;
Then ch[i]:=ch[i] var i, l : integer; mirch : string;
Else ch[i]:=CHR (ORD (ch[i]) + 32); begin
Writeln (ch); l:=length(ch);
Writeln ; mirch:=ch;
FOR i:=1 To Length (ch) Do ch[i]:=upcase (ch[i]); for i:=1 to l do mirch[i] := ch[l-i+1];
Writeln (ch); miroir:=mirch;
End. end;

Exercice 5 Exercice 5
Program Chaine1 ; Program Chaine2;
Uses Wincrt ; Uses Wincrt;
Var i : Integer ; ch: String ; Var ch : String; i, lg : Integer;
test : Boolean; test : Boolean;
Begin Begin
Repeat Repeat
Writeln ('Donner un mot en majuscule') ; Readln (ch) ; Writeln ('Donner un mot en majuscule') ; Readln (ch) ;
test:=True; test:=True; i:=0 ;
i:=0 ; Repeat
Repeat i:=i+1;
i:=i+1; IF Not (ch[i] in ['A'..'Z']) Then test:=False;
IF Not(ch[i] in ['A'..'Z']) Then test:=False; Until (test=False) Or (i=Length (ch));
Until (test=False) Or (i=Length (ch)); Until test=True ;
Until test=True ; lg:=Length (ch);
FOR i := 1 To Length (ch) Do FOR i:=1 To lg Do
Writeln (COPY (ch, 1, i)); Writeln (COPY (ch, 1, i), COPY (ch, lg-i+1, i));
End. End.

Exercice 7 Exercice 6
Program Renverser_ch ; Program Espace_superflus ;
Uses Wincrt ; Uses Wincrt ;
Var p : Integer ; Var ch : String;
chr, chd : String ; i, p : Integer ;
Begin Begin
Writeln ('Saisir une phrase') ; Readln (chd) ; Writeln ('Donner une chane'); Readln (ch);
chr := '' ; Repeat
p := POS(' ', chd) ; P := POS (' ', ch); {position de 2 espaces dans ch}
While p <> 0 Do IF p<>0 Then DELETE (ch, p, 1);
Begin Until p=0 ;
chr := ' ' + COPY (chd, 1, p-1) + chr ; IF ch[1]=' '
DELETE (chd, 1, p) ; Then DELETE (ch, 1, 1);
p := POS (' ', chd) ; IF ch[Length(ch)]=' '
End ; Then DELETE (ch, Length (ch), 1);
chr := chd + chr ;
Writeln ('Phrase renverse est : ', chr) ; Writeln ('La chane devient : ', ch);
End. End.

| 49
Exercice 8 Exercice 9
Program Occurence_car; Program Occurrence_mot ;
Uses Wincrt; uses wincrt;
Var ch : String; var ch, mot : string; nb, i, k: integer;
i, j, n : Integer; begin
Begin repeat
Writeln ('Saisir une chane'); Readln (ch); writeln ('saisir un texte'); readln (ch);
FOR i:=1 To Length (ch) Do until length (ch)>20;
Begin writeln ('saisir un mot'); readln (mot);
n:=0; k:=length (mot); nb:=0; i:=1;
FOR j:=1 To Length (ch) Do repeat
IF ch[i]=ch[j] if (ch[i] = mot[1]) and (mot = copy (ch, i, k))
Then n:=n+1; then begin
IF i = POS (ch[i], ch) nb:=nb+1;
Then Writeln ('Occurrence de ', ch[i], ' = ', n); i:=i+k;
End; end
End. else i:=i+1;
until i>length(ch);
writeln (mot, ' figure dans le texte ', nb, ' fois');
end.

Exercice 10 Exercice 11
Program Sans_Redondance ; Program Aerer_ch ;
Uses Wincrt; Uses Wincrt ;
Var ch1, ch2, ch3, aux : String; i : integer; Var k : Byte ;
Begin ch : String ;
Write('Chane 1 = ');Readln (ch1); Begin
Write('Chane 2 = ');Readln (ch2); Writeln ('Saisir une chane') ;
if length(ch1)>length(ch2) Readln (ch) ;
then begin
aux:=ch1; k := 0 ;
ch1:=ch2; repeat
ch2:=aux; k:=k+2;
end; Insert (' ', ch, k) ;
ch3:=''; Until k = length(ch)-1;
FOR i:=1To Length(ch1) Do
IF (POS(ch1[i],ch2)<>0)and(POS(ch1[i],ch3)=0) Writeln ('Chane are = ', ch) ;
Then ch3:=ch3+ch1[i]; End.
Writeln(ch3);
End.

Exercice 12 Exercice 12
Program Anagrammes; Program anagrammes;
uses wincrt; uses wincrt;
var mot1, mot2 : string; var mot1, mot2:string;
(*********************************) (*****************************************)
procedure saisie_ch (var m1, m2 : string); procedure saisie_ch(var m1,m2:string);
begin begin
repeat repeat
writeln ('donner deux mots : '); writeln ('donner deux mots : ');
readln (m1); readln (m1);
readln (m2); readln(m2);
until (m1 > '') and (m2 > ''); until (m1 > '') and (m2 > '');
end; end;
(*********************************) (****************************************)
function trie (mot : string) : string; function anagram (mot1,mot2:string):boolean;
var i, j, n : integer; var p:integer;
procedure permut (var a, b : char); begin
var aux : char; anagram:=false;
begin repeat
aux:=a; a:=b; b:=aux; p:=pos(mot1[1],mot2);
end; if p>0
begin then begin
n:=length (mot); delete(mot1,1,1);
for i:=1 to n-1 do delete(mot2,p,1);
for j:=i+1 to n do end;
if mot[i]>mot[j] until (p=0) or (mot1='');
then permut (mot[i], mot[j]); if (mot1='') and (mot2='') then anagram:=true;
trie := mot; end;
end; (********************************************)
(*************************************) begin
begin saisie_ch (mot1, mot2);
saisie_ch (mot1, mot2); if anagram (mot1, mot2)
if trie (mot1) = trie (mot2) then writeln (mot1, ' est une anagramme de ', mot2)
then writeln (mot2, ' est une anagramme de ', mot1) else writeln (mot1, ' n''est pas une anagramme de ', mot2);
else writeln (mot2, ' n''est pas une anagramme de ', mot1); end.
end.

| 50
Exercice 13 Exercice 14
Program Pos_ch; Program Copie_ch;
Uses Wincrt; Uses Wincrt;
Var ch1, ch2 : String; Var ch1, chr : String;
i, p : Integer; i, p, n, l : Integer;
Begin Begin
Write ('ch1 = '); Readln (ch1); Write ('ch1 = '); Readln (ch1);
Write ('ch2 = '); Readln (ch2); l:=Length (ch1);
i:=1 ; Repeat
p:=0; Write ('Position = '); Readln (p);
Repeat Write ('Nbre caractres = '); Readln (n);
IF ch1 = COPY (ch2, i, Length (ch1)) Then p:=i; Until (p in [1..l]) and (n in [1..l]) and (p+n<=l+1);
i:=i+1; chr:='';
Until (Length (ch2)-i < Length (ch1)) Or (p<>0) ; FOR i:=p To p+n-1 Do
Writeln ('La chane ', ch1, ' occupe la position ', p, chr:=chr+ch1 [i];
' dans la chane ', ch2); Writeln ('La chane copie est : ', chr);
End. End.

Exercice 15 Exercice 16
Program Jeu_pendu ; Program Chaines_inverses;
Uses Wincrt; Uses Wincrt;
type chain=String [50]; Type Tab=Array [1..100] of String [50];
Var se, ma:chain; Var p, q : Tab;
rep, let : Char; i, n : Integer;
(***************************************) (*********************************)
Function controle_saisie (se:chain) : Boolean; Procedure saisie_entier (Var m : Integer);
Var i : Integer; Begin
r : Boolean; Repeat
Begin Writeln ('Donner un entier'); Readln (m);
r:=True; i:=0 ; Until (1<m) and (m<100);
Repeat End;
i:=i+1; (*************************************)
IF Not (se[i] in ['A'..'Z']) Then r:=False; Procedure saisie_tab (m : Integer; Var T : Tab);
Until (r=False) Or (i=Length (se)); Var i, j : Integer; test : Boolean;
controle_saisie := r; Begin
End; FOR i:=1 To m Do
(***************************************) Repeat
Procedure masquer (se:chain; Var ma : chain); Writeln ('Donner l''lment d''ordre ', i); Readln (T[i]);
Var i : Integer; j:=0; test:=True;
Begin While (test=True) and (j<Length (T[i])) Do
ma:=se; Begin
FOR i:= 2 To (Length (se)-1) Do ma[i]:='-'; j:=j+1;
End; IF Not (T [i, j] in ['0'..'9']) Then test:=False;
(***************************************) End;
Procedure saisie_let (Var let : Char); Until (test=True) and (T[i] <>'');
Begin End;
Writeln ('Donner une lettre '); (***************************************)
Readln (let); Function inverse (ch : String) : String;
let:=upcase (let); Var i : Integer; chinv : String;
End; Begin
(***************************************) chinv:='';
Procedure devoiler (se : chain; let : Char; Var ma : chain); FOR i:=Length (ch) Downto 1 Do
Var i : Integer; r : Boolean; chinv:=chinv+ch[i];
Begin inverse:=chinv;
r:=False; End;
FOR i:=2 To (Length (se)-1) Do (***********************************)
IF se[i]=let Procedure Affiche_tab (m : Integer; T : Tab);
Then Begin Var i : Integer;
ma[i]:=let; Begin
r:=True; FOR i:=1 To m Do Write (T[i], ' ');
End; End;
IF r=False Then Writeln ('Echec'); (***************** P.P *********************)
End; Begin
(****************************************) saisie_entier (n);
Procedure partie_jeu (se, ma : chain ; let : Char); saisie_tab (n, p);
Var nb : Integer; FOR i:=1 To n Do
Begin q[i] := inverse (p[i]);
ClrScr; affiche_tab (n, q);
Writeln (ma); End.
nb:=0;
Repeat
nb:=nb+1;
saisie_let (let);
devoiler (se, let, ma);
Writeln (ma);
Until (nb=Length (se)) Or (ma=se);
IF ma=se
Then Writeln ('Bravo, trouv en ', nb, ' propositions')

| 51
Else Writeln ('Perdu le mot deviner est ', se);
End;
(****************** P. P ******************)
Begin
Writeln ('Le jeu du pendu'); Writeln ;
Repeat
Repeat
Write ('Rentrez un mot secret en majuscule : ');
Readln (se);
Until controle_saisie (se);
masquer (se, ma);
partie_jeu (se, ma, let);
Write ('Voulez-vous rejouer (o/n) ? ');
Readln (rep);
Until Upcase (rep) = 'N';
End.

Exercice 17 (**** Conversion de la base b1 vers base 10 **********)


Program conversion_base1_base2; Function Conv_b1_10 (nch:string; b1:integer) : longint;
uses wincrt, ecran; var err,i,n:integer;
var b1, b2:integer; dec,puiss:longint;
nch:string; begin
(*******************************************) dec:=0; puiss:=1;
Procedure saisie_base (var b1,b2:integer); for i:=length(nch) downto 1 do
begin begin
repeat if nch[i] in ['0'..'9']
write('Base b1 = ');readln(b1); then Val(nch[i], n, err)
write('Base b2 = ');readln(b2); else n:=ord(nch[i])-55;
until (b1 in [2..16]) and (b2 in [2..16]) and (b1<>b2); dec:=dec+n*puiss;
end; puiss:=puiss*b1;
(******************************************) end;
Procedure saisie_nombre (var nch:string; b1:integer); conv_b1_10:=dec;
Const chb='0123456789ABCDEF'; end;
Var i:integer; (**** Conversion de la base 10 vers la base b2 *********)
test:boolean; Function Conv_10_b2 (nd:longint; b2:integer) : string;
begin var ch1, chb2:string;
repeat r:integer;
writeln ('Donner un nombre en base ', b1); begin
readln(nch); chb2:='';
test:=true; repeat
for i:=1 to length(nch) do r:= nd mod b2;
if (pos(nch[i],chb)>b1) or (pos(nch[i],chb)=0) if r in [0..9] then str(r,ch1)
then test:=false; else ch1:= chr(55+r);
until test=true; chb2:=ch1+chb2; (*insert (ch1,chb2,1)*)
end; nd:= nd div b2 ;
until (nd = 0);
conv_10_b2:=chb2;
end;
(**************** P.P *******************************)
Begin
saisie_base(b1,b2);
saisie_nombre(nch,b1);
writeln('(',nch,')',b1,' = (', conv_10_b2 (conv_b1_10 (nch, b1), b2),
')', b2);
End.

Exercice 19 Exercice 18
Program sablier; Program suite_mystere;
uses wincrt; uses wincrt, ecran;
var esp,ch:string; var ligne, lignsuiv, c : string;
(*******************************************) n, l, nb, j, i : integer;
Procedure affiche_bas(var esp:string;ch:string); begin
var ch2:string; write ('N = '); readln (n);
n,i:integer; ligne:='1';
begin for i:=1 to n do
esp:='';n:=0;i:=1; begin
writeln(ch); writeln (ligne);
repeat l:=length (ligne);
esp:=' '+esp; nb:=1;
n:=n+2;i:=i+1; lignsuiv:='';
ch2:=esp+copy(ch, i, length(ch)-n); for j:=1 to l do
writeln(ch2); if ligne[j] = ligne[j+1]
until length(copy(ch, i, length(ch)-n))=1; then nb:=nb+1
end; else begin
(******************************************) str (nb, c);
Procedure affiche_haut(esp,ch:string); lignsuiv:= lignsuiv + c + ligne[j];
var i,n:integer; nb:=1;
ch2:string; end;

| 52
begin ligne:= lignsuiv;
i:=-1;n:=1; end;
repeat end.
n:=n+2;i:=i+1;
delete(esp,1,1);
ch2:=esp+copy(ch, length(ch) div 2-i, n);
writeln(ch2);
until ch2=ch;
end;
(********************PP***********************)
begin
repeat
write('CH = ');
readln(ch);
until (ch<>'') and (odd(length(ch)));
affiche_bas(esp,ch);
affiche_haut(esp,ch);
end.

| 53
LA RECURSIVITE
Exercice 1 Exercice 2
Procedure afficher ; Procedure affiche (a, b: integer);
Var n:integer; begin
begin if (a<4)
for n:=10 downto 1 do writeln(n); then if (b<10)
end; then begin
========== Solution rcursive ========== writeln (a * 10 + b);
Procedure afficher (n:integer); affiche (a, b + 1);
begin end
if n >=1 else affiche (a + 1, 0);
then begin end;
writeln (n);
afficher (n-1); L'appel : affiche (0,0) ;
end;
end;
L'appel : afficher (10) ;

Exercice 3 Exercice 4
Procedure saisir (var n : byte); Procedure remplir (n : integer ; var T:Tab);
begin begin
writeln ('Taper un entier'); if n>=1 then begin
readln (n); readln (T[n]);
if (n<1) or (n>31) or (n mod 2 <>0) if T[n]<0
then saisir (n) ; then remplir (n, T)
end ; else remplir (n-1, T) ;
end ;
Exercice 4.2 end;
Procedure affiche (T : tab ; n : integer); =============solution 2=============
begin Procedure remplir (var T:tab ; i, n:integer);
if n>=1 then begin begin
write (T[n]:4); if i<=n
affiche (T, n-1) ; then begin
end ; readln (T[i]);
end; if T[i]<0
=============solution 2=============== then remplir (T, i, n)
procedure affiche (T:tab ; i, n:integer); else remplir (T, i+1, n)
begin end;
if i<=n end;
then begin
write (T[i]:4); Lappel : remplir (t, 1, n);
affiche (T,i+1,n);
end;
end;
Lappel : affiche (t, 1, n);

Exercice 5
Function fact (n : byte) : real ;
begin
if n=0 then fact := 1
else fact := n * fact(n - 1) ;
end;
Exercice 6
Function palindrome (ch: string): boolean;
begin
if (length(ch)<2) then palindrome := true
else if (ch[1] = ch[length(ch)]) then palindrome := palindrome (copy(ch, 2, length(ch) - 2))
else palindrome := false;
end;
============================= {solution 2} ==============================
Function palindrome (ch: string): boolean;
begin
if length (ch) < 2
then palindrome := true
else palindrome := (ch[1] = ch[length(ch)]) and (palindrome (copy(ch, 2, length(ch) - 2)));
end;

| 54
Exercice 7 ===== Solution 2 : rcursivit mutuelle =====
Function pair (n:integer) : boolean; Function pair (n:integer) : boolean;
begin Function impair (n:integer) : boolean;
if (n=0) then pair := true begin
else if (n=1) if (n=0) then impair := false
then pair := false else impair := pair (n-1) ;
else pair := pair (n-2) ; end ;
end ; begin
if (n=0) then pair := true
else pair := impair (n-1) ;
end ;

Exercice 8 Exercice 9
Function prosom (p, q : integer) : integer; Function somme (n : integer) : longint;
begin begin
if (p=0) or (q=0) then prosom := 0 if (n=0)
else if q=1 then prosom := p then somme := 0
else prosom := p + prosom(p, q-1) ; else somme := n + somme (n-1) ;
end ; end ;

Exercice 10 Exercice 11 PGCD EUCLIDE


Function puissance (x :real ; n : integer) : real; Function Pgcd ( a, b: Integer ): Integer;
begin begin
if (n=0) then puissance := 1 if (a=b) or (b=0)
else if (n<0) then Pgcd := a
then puissance := 1/puissance(x,-n) else Pgcd := Pgcd ( b, a mod b ) ;
else puissance := x*puissance (x, n-1) ; end;
end ;

Exercice 11 PGCD Diffrence Exercice 12


Function Pgcd (a, b : integer) : integer ; Function ppcm (a, b, p : integer) : integer;
begin begin
if (a=b) then pgcd := a if (p mod b)=0
else if (a>b) then ppcm := p
then pgcd := pgcd (a-b, b) else ppcm := ppcm (a, b, p+a) ;
else pgcd := pgcd (a, b-a) ; end;
end; Lappel sera : Writeln ('PPCM = ', ppcm (a, b, a));

Exercice 12 Exercice 13
Function ppcm (a, b, c : integer) : integer; Function fibonacci (n : integer) : integer;
begin begin
if (a*c) mod b =0 if (n <= 2)
then ppcm := a*c then fibonacci := 1
else ppcm := ppcm (a, b, c+1) ; else fibonacci := fibonacci (n - 1)+fibonacci (n - 2);
end; end;
Lappel sera : Writeln ('PPCM = ', ppcm(a, b, 1));

Exercice 14 Exercice 15
Procedure fact_prem (n, i : integer); Function sommediv (i, n:integer):integer;
begin begin
if (n > 1) then if i>n div 2
if (n mod i)=0 then sommediv := 0
then begin else if n mod i=0
Write(i,' '); then sommediv := sommediv (i+1, n)+i
fact_prem(n div i, i); else sommediv := sommediv (i+1, n);
end end;
else fact_prem(n, i + 1); (***************** P.P ****************)
end; begin
lappel sera : fact_prem(n, 2); write ('N = ');readln (n);
if n = sommediv (1, n)
then writeln (n,' est parfait')
else writeln (n, ' n''est pas parfait');
end.

| 55
Exercice 16 Exercice 16
Function nb_div (i, n:integer):integer; Function exist_div (i, n:integer):boolean;
begin begin
if (i>= n div 2) if (i>n div 2)
then nb_div := 2 then exist_div := false
else if (n mod i=0) else if (n mod i=0)
then nb_div := nb_div (i+1, n)+1 then exist_div := true
else nb_div := nb_div (i+1, n); else exist_div := exist_div (i+1, n);
end; end;
(************** P.P ************) (************** P.P ************)
begin begin
write ('N = '); readln (n); write ('N = '); readln (n);
if nb_div (2, n) = 2 if exist_div (2, n)
then write (n,' est premier') then write (n,' est non premier')
else write (n,' est non premier'); else write (n,' est premier');
end. end.

Exercice 17 Exercice 20
Function expn (x : real; n : integer) : real; Function max (t:tab ; n:integer):integer;
(*************************************) var m:integer;
function fact (n : integer) : integer; begin
var i, f : integer; if n=1
begin then max := t[1]
f := 1; else if max (t, n-1)> t[n]
for i := 2 to n do f := f * i; then max := max (t, n-1)
fact := f; else max := t[n] ;
end; end;
function puiss (x : real; n : integer) : real; ============ Solution 2 ============
var i : integer; p : real; Function max (t:tab ; m,i,n:integer):integer;
begin begin
p := 1; if (i<=n)
for i := 1 to n do p := p * x; then if (t[i]>m)
puiss := p; then m:=max(t, t[i], i+1, n)
end; else m:=max(t, m, i+1, n);
(************************************) max:=m;
begin end;
if n=0 then expn:=1 Lappel : write ( max(t, t[1], 2, n)) ;
else expn:=expn(x,n-1)+ puiss(x,n) / fact(n);
end;
Exercice 18 Exercice 19
Function som (n : integer):real ; Function som (n : integer):real ;
begin Var terme :real; signe:integer;
if n=1 begin
then som := 1 if n=0
else som := 1/n + som (n-1); then som:=1
end; else begin
if n mod 2 = 0
then signe := 1
else signe :=-1;
terme:=signe * 1/(2*n+1) ;
som:= terme + som(n-1);
end;
end;

| 56
Exercice 21 Exercice 22
Function cherche (t:tab;n,m:integer):integer; Function cherche (elm, n : integer ; t:tab) : boolean ;
begin begin
if n=1 then cherche:=diff if n=0
else if abs(t[n]-m)<diff then cherche:=false
then begin else if elm = t[n]
diff:=abs(t[n]-m); then cherche := true
cherche:=cherche (t,n-1,m); else cherche := cherche (elm, n-1, t);
end end;
else cherche:=cherche (t, n-1, m);
end; solution 2 :
(*****************PP**********************) Function cherche (i, n, elm :integer ; t : tab):integer;
BEGIN begin
Saisir (n, m, t); if elm=T[i] then cherche:=i
diff:=abs (t[1]-m); else if i=n
diff:=cherche (t, n, m); then cherche:=0
writeln('Liste des valeurs les plus proches de ',m,' est :'); else cherche:=cherche (i+1, n, elm, t);
for i:=1 to n do end;
if abs (m-t[i]) = diff then write(t[i],' ');
END.
Exercice 23 Exercice 24
Function Dichotomique Procedure Decaler (Var t : Tab; p, n : integer);
(deb, fin, val : integer ; t:tab) : boolean; Begin
var milieu:integer; If p <= n Then
begin Begin
milieu:=(deb+fin) div 2; Decaler (t, p+1, n);
if val = T[milieu] t[p+1] := t[p];
then dichotomique := true End;
else if (val < T[milieu]) and (deb < milieu) End;
then
dichotomique := dichotomique (deb, milieu-1,val,T)
else if (val > T[milieu]) and (fin > milieu)
then
dichotomique := dichotomique (milieu+1, fin,val,T)
else dichotomique := false;
end;

Exercice 25 Exercice 26
Procedure Inverser (Var t : Tab; p, n : Integer); Procedure permuter (var t : tab ; d, f : integer) ;
Var aux : Real; var aux:integer;
Begin begin
If p < n Then if d < f then
Begin begin
aux := t[p]; aux:=t[d];
t[p] := t[n]; t[d]:=t[d+1];
t[n] := aux; t[d+1]:=aux;
Inverser (t, p + 1, n - 1); permuter(t,d+2,f);
End; end;
End; end;
Appel : permuter (t, 1, n) ;
Exercice 27 Exercice 28
program maximum; Function inverse (st: string): string;
uses wincrt; begin
var a,b,acc:integer; if st = '' then inverse := ''
Function max (a,b,acc:integer):integer; else inverse := st[length(st)] +
begin inverse(copy(st, 1, length(st) - 1));
if a=0 end;
then max:=b+acc ============ Solution 2 ==============
else if b=0 then max:=a+acc Procedure inverse (var st: string);
else max:=max(a-1, b-1, acc+1); Var c: char;
end; begin
begin if st <> '' then begin
write('a = ');readln(a); c := st[length(st)];
write('b = ');readln(b); delete(st, length(st), 1);
writeln('La valeur max = ',max(a,b,0)); inverse(st);
end. st := c + st;
end;
end;

| 57
Exercice 29
Procedure tri_selection (n:integer; var T:tab); =============solution 2================
var p:integer; Procedure tri_selection (deb,n:integer ; var T:tab);
(**************************) var pos:integer;
function posmax (n:integer; t:tab):integer; (**************************)
var max, j:integer; function posmax(deb,n:integer;T:tab):integer;
begin var max,j:integer;
max:=1; begin
for j:=2 to n do max:=deb;
if t[j]>t[max] then max:=j; for j:=deb+1 to n do
posmax := max; if T[j]>T[max] then max:=j;
end; posmax:=max;
(**************************) end;
procedure permuter (x,y:integer; var t:tab); (**************************)
(**************************) procedure permuter (var x,y:integer);
begin (**************************)
If n>1 then begin
begin if deb<>n then
p := posmax (n, t); begin
if p<>n then permuter (n, p, t); pos:=posmax (deb,n,T);
tri_selection (n-1, t); if pos<>deb then permuter (T[deb], T[pos]);
end; tri_selection (deb+1, n, T);
end; end;
Appel : tri_selection (n, T); end;
Appel : tri_selection (1, n, T);

Exercice 30 =============solution 2================


Procedure tri_insertion (n:integer ; var t:tab); Procedure tri_insertion (i, n:integer ; var t:tab);
(*********************************) var j, tmp : integer ;
procedure inserer (n:integer ; var t:tab); begin
var tmp,j:integer; if (i<=n)
begin then begin
if t[n]<t[n-1] then if t[i]<t[i-1]
begin then begin
tmp:=t[n]; j:=n; tmp:=t[i];
while (j>1) and (t[j-1]>tmp) do j:=i ;
begin while (t[j-1]>tmp) and (j>1) do
t[j]:=t[j-1]; begin
j:=j-1; t[j]:=t[j-1];
end ; j:=j-1 ;
t[j]:=tmp; end;
end; t[j]:=tmp;
end ; end;
(********************************) tri_insertion(i+1, n, t);
begin end;
if n>=2 then begin end;
tri_insertion (n-1, t); Appel : tri_insertion (2, n, t);
inserer (n, t);
end;
end;

Exercice 31 =========== solution 2================


Procedure tri_bulles Procedure tri_bulles (var t : tab ; n, i, j : integer);
(var t:tab ; n:integer ; permut:boolean); (**************************)
var i, aux : integer; procedure permut (var x,y:integer);
begin (**************************)
if (n>1) begin
then begin if (i<=n-1)
for i:=1 to n-1 do then begin
if t[i]>t[i+1] then begin if (j<=n-i)
aux:=t[i]; then begin
t[i]:=t[i+1]; if (t[j]>t[j+1])
t[i+1]:=aux; then permut (t[j], t[j+1]);
permut:=true; tri_bulles (t, n, i, j+1);
end; end ;
if (permut=true) then tri_bulles (t, n-1, false); tri_bulles (t, n, i+1, 1);
end; end;
end; end;
Appel : tri_bulles (t, n, false); Appel : tri_bulles (t, n, 1, 1);

| 58
Exercice 32 Exercice 33
Procedure Tri_Shell_Rec (Var t:TAB; n, pas :integer); Procedure tri_fusion (d, f :integer ; var T:tab);
Var aux,i : integer; var m : integer;
begin (***************************)
If pas > 0 Then procedure fusionner(var t:tab;d,m,f:integer);
Begin var temp:tab;
If n > pas Then i,j,k:integer;
begin begin
Tri_Shell_Rec (t, n - pas, pas); i:=d;
If t[n] < t[n - pas] Then j:=m+1;
Begin for k:=d to f do
aux:= t[n]; if (j>f) or((i<=m) and (T[i]<T[j]))
i := n; then begin
Repeat temp[k]:=T[i];
t[i] := t[i - pas]; i:=i+1;
i := i - pas; end
Until (i = pas) or (aux > t[i - pas]); else begin
t[i] := aux; temp[k]:=T[j];
End; j:=j+1;
End; end ;
Tri_Shell_Rec (t, n, pas Div 3); for k:=d to f do T[k]:=temp[k];
End; end;
End; (**************************)
Begin
if f>d then
begin
m:=(d+f) div 2;
tri_fusion (d,m,t); (* trier partie gauche *)
tri_fusion (m+1,f,t); (* trier partie droite *)
fusionner (t,d,m,f); (* fusionner *)
end ;
End;
Exercice 34 Exercice 35
Procedure supprim(c:char ; n:integer ; var ch:string); Function nb_occ (n:byte ; ch:string ; c:char):byte;
begin begin
if n<>0 then if n=0 then nb_occ:=0
if ch[n]=c else if ch[n]=c
then begin then nb_occ:=nb_occ (n-1, ch, c)+1
delete(ch,n,1); else nb_occ:=nb_occ (n-1, ch, c)
supprim (c, n-1, ch); end;
end
else supprim (c, n-1, ch); Appel : writeln(nb_occ (length(ch), ch, c)) ;
end;
Exercice 36 Exercice 37
Function sc (n:integer):integer; Function nbc (n:integer):integer;
begin begin
if n<10 if n <10
then sc := n then nbc := 1
else sc := (n mod 10) + sc (n div 10); else nbc := 1+ nbc (n div 10);
end; end;
Exercice 38 Exercice 39
Function anagram (mot1,mot2:string):boolean; Function teste (i:integer ; c:char; ch: string):boolean;
Var p:integer; begin
Begin if c = ch[i]
if (mot1='') and (mot2='') then teste:= true
then anagram:=true else if i < length(ch)
else begin then teste := teste (i+1, c, ch)
p:=pos(mot1[1],mot2); else teste := false;
if (mot1<>'')and(p>0) end;
then begin ============ solution 2 =============
delete(mot1,1,1); Function teste (c:char ; ch:string):Boolean;
delete(mot2,p,1); begin
anagram:=anagram(mot1,mot2); if (ch='') or ((length(ch)=1)and(ch[1]<>c))
end then teste:=false
else anagram:=false; else if ch[1]=c
end; then teste:=true
else teste:= teste (c, copy(ch,2,length(ch)-1));
end; end;

| 59
Exercice 40 Exercice 41
Function suppr_car (c:char;ch : string):string; Function Constructible (mot,lettres : string):boolean;
begin function suppr_car(c:char;ch : string):string;
case length(ch) of function teste (c:char ; ch:string):Boolean;
0 : suppr_car:=''; begin
1 : if ch[1]=c then suppr_car:='' if mot=''
else suppr_car:=ch; then constructible:=true
else if ch[1]=c else if teste(mot[1],lettres)
then suppr_car:=copy(ch,2,length(ch)-1) then if length(mot)=1
else suppr_car := copy(ch,1,1) + then constructible:=true
suppr_car(c,copy(ch,2,length(ch)-1)); else constructible :=
end; constructible(copy(mot,2,length(mot)-1),
end; suppr_car(mot[1],lettres))
else constructible:=false;
end;

Exercice 42 Exercice 43
Function val_triangle (c, l: integer):integer; Function MacCarthy (n: integer): integer;
begin begin
if (c=1) or (l=c) if n >100
then val_triangle := 1 then MacCarthy := n - 10
else val_triangle := val_triangle(c,l-1)+ else MacCarthy := MacCarthy (MacCarthy (n+11));
val_triangle (c-1,l-1); end;
end;

Exercice 44 Exercice 45
Function Ack (m, n : integer) : integer; Function eval (st: string): integer;
begin var a, i, e: integer;
if m = 0 begin
then Ack := n+1 if length(st) = 0
else if n = 0 then eval := 0
then Ack := Ack (m-1,1) else begin
else Ack := Ack (m-1, Ack (m, n-1)) i:=1;
end; repeat
======Implmentation itrative========== i:=i+1;
Function ack (m, n :integer):integer; until (st[i] in ['+','-']) or (i>length(st));
begin val (copy(st, 1, i - 1),a,e);
while m <> 0 do delete(st, 1, i-1 );
begin eval := a + eval (st);
if n = 0 then n := 1 else n := ack (m, n - 1) ; end;
m := m 1; end;
end;
ack:= n + 1;
end;

Exercice 46 Function eval (st: string): integer;


Program mini_cal; var a, i, e: integer;
uses wincrt; begin
var e:integer; st:string ; if length(st) = 0 then eval := 0
Function eval0(st: string): integer; else begin
var a, i: integer; signe: char; i:=1;
begin repeat
i := length(st); i:=i+1;
repeat until (st[i] in ['+','-']) or (i>length(st));
i := i-1 a:=eval0(copy(st, 1, i - 1));
until (i = 0) or (st[i] in ['*', '/']); delete(st, 1, i-1 );
val (copy(st, i + 1, length(st) - i), a, e); eval := a + eval(st)
delete(st, i, length(st) - 1 + i); end;
if st[i] = '*' end;
then eval0 := eval0 (st) * a begin
else if st[i] = '/' write ('Entrer une chane forme d''une somme de
then eval0 := eval0 (st) div a nombre :'); readln (st);
else eval0 := a; write( 'La somme = : ', eval (st));
end; end.

| 60
Exercice 48 Exercice 47
Function valeur(c: char): integer; Procedure combinaison(ch, tete: string);
begin var i: integer;
case c of begin
'M': valeur := 1000; if length(ch) = 1
'D': valeur := 500; then begin
'C': valeur := 100; ch:=tete+ch;
'L': valeur := 50; writeln(ch)
'X': valeur := 10; end
'V': valeur := 5; else
'I': valeur := 1; for i := 1 to length(ch) do
end; begin
end; combinaison(copy(ch, 2, length(ch)-1), tete+ch[1]);
function eval(s: string): integer; ch := copy(ch, 2, length(ch)-1) + ch[1] ;
var n1: integer; end ;
begin end;
if length(s) = 1
then eval := valeur(s[1]) Appel : combinaison (ch, '');
else begin
n1 := valeur (s[1]);
if n1 < valeur (s[2]) then n1 := -n1;
eval := n1 + eval (copy(s, 2, length(s) - 1));
end;
end;

Exercice 49
Program Chaine;
Uses Wincrt ;
Var ch: String ;
(***************************************)
Procedure affiche (ch:string);
begin
if ch <> ''
then begin
Writeln (ch);
Affiche (copy(ch, 1, length(ch)-1));
end;
end;
(***************************************)
Begin
Readln (ch);
Affiche (ch);
End.

| 61
Edition le libre savoir

You might also like