Vous êtes sur la page 1sur 38

Universit A-MIRA

ALGORITHME
EXERCICES
TINSALHI Faouzi

2Anne

Sommaire :

1 exercices simples..1
2 exercice en utilisant les structures IALORSSINON et SELONQUE.2
3 exercices en utilisant les structures TANT QUE et REPETERJUSQU'A et POUR10
4 exercices sur les Tableaux..17
5 Exercices gnraux sur les actions paramtres19
6 Entits : types structurs22
7 Tableaux tris et dcoupages fonctionnels..26
8 Les Chanes..29
9 Les fichiers...33

1 exercices simples

Exercice 1 :
Ecrire un algorithme dune action qui change deux variables A et B
Action : Echange
Var : A, B, C : rels
Dbut :
Ecrire ( Saisissez deux variables )
Lire (A, B)
C <= A
A <= B
B <= C
Ecrire ( les valeurs de , A, et de , B, ont t changes )
Fin

Exercice 2 :
Ecrire une fonction qui donne les carr dun rel
Fonction : carr (x :rel) :rel
Var : x_au_carr
Dbut
x_au_carr <= x*x
retourner x_au_carr
fin
Remarques :
Dans une fonction, la seule variable qui est dfinie est celle du rsultat, les autres sont dfinies
dans la fonction mre, et apparaissent ici en temps quentres.
Dans une fonction, ne pas oublier de retourner le rsultat.

2 exercice en utilisant les structures


SIALORSSINON et SELONQUE

Exercice 3 :
Ecrire une action qui fournit les flicitations ou lajournement dun lve suivant sa note en
utilisant Si-alors-sinon.
Action : Jury
Var : note : rel
Dbut :
lire (note)
Si note <10 alors crire ( ajourn )
Sinon crire ( reu )
Fin

Exercice 4 :
Ecrire un programme qui donne la valeur absolue de 2 rels :
Action : Valeur_absolue
Var : a, b : rels
Dbut :
Ecrire ( saisissez 2 rels )
Lire (A, B)
Ecrire les valeurs absolues de A et de B sont : )
Si A<0 alors crire (-A)
Sinon crire (A)
Ecrire ( et )
Si B<0 alors crire (-A)
Sinon crire (A)
Fin
Remarque : on peut aller plus vite en crant une fonction valeur absolue et en faisant appel
cette fonction dans une action :
Fonction : valAbs (x :rel) :rel
Var : absx : rel
Dbut :
si x <0 alors absx <= -x
Sinon absx <= x
Retourner absx
Fin
Et
Action : Valeur_absolue2
Var : A, B rels
Dbut :
Ecrire ( saisissez 2 rels )
Lire (A, B)

Ecrire ( les valeurs de A et B sont : , valAbs(A), et , valAbs(B))

Ecrire 5 :
Faire un programme qui donne le volume dun cylindre en faisant appel une fonction aire
dun cercle.
Fonction : aire_cercle (rayon :rel) :rel
Var : Aire : rel
Const : PI=3.14
Dbut :
Aire <= PI*rayon*rayon
Retourner (Aire)
Fin
Fonction : volume_cercle (hauteur, rayon :rels) :rel
Var : volume : rel
Dbut :
Volume <=aire_cercle (rayon)*hauteur
Retourner volume
Fin

Exercice 6 :
Ecrire un algorithme permettant de rsoudre une quation du premier degr
Action : premierdegre
Var : a, b, x rels
Dbut :
Ecrire ( saisissez les valeurs a et b de lquation ax+b=0 : )
Lire (a, b)
Si a = 0 alors crire ( pas de solution )
Sinon crire ( la solution est x= , -b/a)
Fin

Exercice 7 :
Ecrire un algorithme permettant de rsoudre une quation du second degr en utilisant des si
alors..
Action : seconddegr
Var : a, b, c, delta
Dbut :
Ecrire ( saisissez les valeurs a, b et c de lquation ax+bx+c=0 : )
Lire (a, b, c)
Si a=0 alors crire ( quation du premier degr )
Sinon delta<=b-4*a*c
Dbut
Si delta>0 alors crire ( les solutions de lquation sont ,
sqrt(delta))/(2*a), et , (-b+sqrt(delta))/(2*a))
Sinon
Dbut
Si d=0 alors crire ( -b/(2a))
Sinon crire ( pas de solutions relles )

(-b-

Fin
Fin
Fin
Ecrire le mme algorithme avec des selon-que :
Action : seconddegr
Var : a, b, c, delta
Dbut :
Ecrire (saisissez les valeurs de a, b et c de lquation ax+bx+c)
Lire (a, b, c)
Si a=0 alors crire ( rsoudre permier degr )
Sinon dbut
Delta <= b-4*a*c
Selon que
Delta > 0 : crire ((-b-sqrt(delta))/(2*a), (-b+sqrt(delta))/(2*a))
Delta = 0 : crire (( -b/(2a))
Sinon crire ( pas de solution relle )
Fin selon
Fin

Exercice 8
Ecrire un algorithme qui donne la dure de vol en heure minute connaissant lheure de dpart
et lheure darrive.
1) on considre que le dpart et larrive ont lieu mme jour
2) idem mais sans faire les conversions en minutes
3) on suppose que la dure de vol est infrieure 24 heures mais que larrive peut avoir
lieu le lendemain.

1)
Action : DureVol1
Var : h1, h2, m1, m2, hr, mr : entiers
Dbut :
Ecrire ( entrer horaire de dpart et darrive )
Lire (h1, m1, h2, m2)
mr <= [h2*60+m2] [h1*60+m1]
hr <= mr/60
mr <= mr%60
Ecrire ( dure de vol : , hr, mr)
Fin
Remarque : lopration % (modulo) permet de calculer le reste de la division entire.
2)
Action : DureVol2
Var : h1, h2, hr, m1, m2, mr : entiers
Dbut :
Ecrire ( entrer horaire de dpart et darrive )
Lire (h1, m1, h2, m2)
Si m2>m1 alors
hr <= h2-h1 et mr <= m2-m1

Ecrire (hr, mr)


Sinon
hr <= h2-h1-1 et mr <= m2+60-m1
Ecrire (hr, mr)
Fin

3)
Action : DureVol3
Var : h1, h2, m1, m2, hr, mr : entiers
Dbut :
Ecrire ( entrer horaire de dpart et darrive )
Lire (h1, m1, h2, m2)
Si h2>h1 alors
Si m2>m1 alors
hr <= h2-h1 et mr <= m2-m1
Ecrire (hr, mr)
Sinon
hr <= h2-h1-1 et mr <= m2+60-m1
Ecrire (hr, mr)
Sinon
Si m2>m1 alors
hr <= h2-h1+24 et mr <= m2-m1
Ecrire (hr, mr)
Sinon
hr <= h2-h1+24-1 et mr <= m2+60-m1
Ecrire (hr, mr)
Fin

Exercice 9
1) Ecrire une fonction max3 qui retourne le maximum de trois entiers
2) Ecrire une fonction min3 qui retourne le minimum de trois entiers
3) Ecrire une fonction max2 qui retourne le maximum de deux entiers
4) Ecrire une fonction max3 qui retourne le maximum de trois entiers en faisant appel
max2

1)
Fonction : max3(a, b, c : entier) : entier :
Var : max3 : entier
Dbut :
Si a>b alors
Si a>c alors max3 <= a
Sinon max3 <= c
Sinon
Si c>b alors max3 <= c
Sinon max3 <= b
Retourner (max3)
Fin
2)

Fonction : min3(a, b, c : entier ) : entier :


Var min3 : entier
Dbut
Retourner (max3(-a, -b, -c))
Fin
3)
Fonction : max2 (a, b : entier) : entier
Var : max2 : entier
Dbut :
Si a<b alors max2 <= b
Sinon max2 <= a
Retourner (max2)
Fin
4)
Fonction : max3 (a, b, c : entier) : entier :
Var : max3 : entier
Dbut :
max3 <= max2 [max2 (a, b), c)
Retourner (max3)
Fin

Exercice 10
Ecrire avec des Si Alors Sinon une action permettant la saisie dune note n (0n20) et qui
affiche la mention (n16 : TB, n14 : B, n12 : AB, n10 : Passable, n10 : Ajourn)
Action : Mention
Var Note : rel
Dbut :
Ecrire ( saisissez une note )
Lire (Note)
Si Note16 alors crire ( TB )
Sinon
Si Note14 alors crire ( B )
Sinon
Si Note12 alors crire ( AB )
Sinon
Si Note10 alors crire ( Passable )
Sinon crire ( ajourn )
Fin
Alternative : crire le mme programme avec des Selon Que :
Action : Note
Var : Note : rel
Selon que
Note 16 crire ( TB )
Note 14 crire ( B )
Note 12 crire ( AB )
Note 10 crire ( Passable )
Sinon crire ( ajourn )
6

Exercice 11
Soit lalgorithme suivant :
Action : Permis_voiture
Var : permis, voiture : boolen
Dbut :
Ecrire ( avez-vous le permis ? (0/1) )
Lire (permis)
Ecrire ( avez vous une voiture ? (0/1) )
Lire (voiture)
Si non permis ou voiture alors
Si voiture alors crire ( conduisez moi la gare )
Sinon crire ( jai une voiture pas chre )
Sinon
Si voiture alors crire ( vous tes hors la loi )
Sinon crire ( vive le vlo )
fin

1)
2)
3)
4)

Ecrire larbre des conditionnelles


Corriger les tests pour que tous les cas soient couvert de manire cohrente
Faites correspondre les actions et les tests correctement
Si possible, crire cet algorithme avec des selon que.

Permis et voiture
gare

permis
Vive le vlo

Conduisez moi la Voiture pas chre


gare

voiture
Ni permis ni voiture
Conduisez moi la Voiture pas chre
gare
Hors la loi
Vive le vlo

En clair, selon lalgorithme propos : si lon a le permis et la voiture on peut amener


quelquun la gare ; si lon a que le permis on dit vive le vlo, si lon na que la voiture on
conduit aussi la gare, enfin si lon a ni permis ni voiture alors on achte une voiture pas
chre. Le cas hors la loi nest pas voqu et les correspondance sont inexactes. Il faut
videmment avoir :
- permis et voiture : conduire la gare
- permis : jai une voiture pas chre
- voiture : vous tes hors la loi
- ni voiture, ni permis : vive le vlo
Correction de lalgorithme propos :
Action : Permis_voiture
Var : permis, voiture : boolen
Dbut :
Ecrire ( avez-vous le permis ? (0/1) )
Lire (permis)
Ecrire ( avez vous une voiture ? (0/1) )
Lire (voiture)
Si permis ou voiture alors
Si voiture alors crire ( conduisez moi la gare )
Sinon crire ( jai une voiture pas chre )

Sinon
Si voiture alors crire ( vous tes hors la loi )
Sinon crire ( vive le vlo )

On peut effectivement crire cet algorithme avec des selon-que :


Action : permis_voiture
Var : permis voiture : rel
Dbut :
Ecrire ( avez-vous le permis ? (0/1) )
Lire (permis)
Ecrire ( avez vous une voiture ? (0/1) )
Lire (voiture)
Selon que :
Permis et voiture : crire ( conduisez moi la gare )
Permis et non voiture : crire ( jai une voiture pas chre )
Non permis et voiture : ( vous tes hors la loi )
Non permis et non voiture : ( vive le vlo )
Fin

Exercice 12
Ecrire un programme calculatrice permettant la saisie de deux entiers et une opration
boolen- ( +, - , / , x ) et affichant le rsultat. Donner avant cela les spcifications, la solution
en langage naturel, les structures de donnes.
Spcifications :
Donnes : 2 oprandes et un oprateur
Rsultat : rsultat de lopration choisie
Solution en langage naturel : Saisie des donnes, envisager tous les cas : +, - , x, /. Attention
la division par zro qui est impossible
Structure de donnes :
2 oprandes : des entiers
Un oprateur boolen : +, -, * , /
Algorithme :
Action : calcul
Var : a, b : rel op : boolen
Dbut Ecrire ( saisissez le premier entier )
Lire (a)
Ecrire ( saisissez loprateur )
Lire (op)
Ecrire ( saisissez la deuxime variable )
Lire (b)
Selon que :
Op = + : Ecrire (a+b)
Op = * : Ecrire (a*b)
Op = / :
Si b= 0 alors crire ( division impossible )
Sinon crire (a/b)

Op = - : Ecrire (a-b)
Fin selon
Fin

3 exercices en utilisant les structures rptitives


TANT QUE et REPETERJUSQU'A et POUR

Exercice 13
Ecrire le programme qui affiche la somme dune suite dentiers saisie par lutilisateur se
terminant par zro.
Exemple : lutilisateur entre 1, puis 5, puis 2, puis 0 : affiche : 8
1) donner les spcifications
2) donner la solution en langage naturel
3) indiquer les structures de donnes
4) faites lalgorithme
Spcifications :
- donnes : suite de nombre entiers se terminant par zro
- rsultat : la somme de ces entiers
Solution en langage naturel : tant que lentier saisi nest pas zro, lajouter la somme
partielle et saisir lentier suivant.
Structure de donnes :
- entier : entier courant (saisi)
- entier : somme partielle
Algorithme :
Action : Somme Suite
Var : a, s : entiers
Dbut s<=0
dinitialiser!!!
Lire (a)
Tant que a0 faire
Dbut
s<=s+a
Lire (a)
Fin
Ecrire (s)
Fin

Attention : dans une structure tant que ne pas oublier

Exercice 14
Ecrire un algorithme qui affiche la moyenne dune suite dentiers se terminant par zro (le
zro nentrant pas en compte dans la moyenne : il est juste la pour indiquer la fin de saisie)
1) donner les spcifications
2) donner la solution en langage naturel
3) indiquer les structures de donnes
4) faites lalgorithme

10

Spcification :
- donnes : suite dentier se terminant par zro
- rsultat : la moyenne de ces entiers (zro exclu)
Solution en langage naturel :
Tant que lentier saisi diffrent de 0 alors ajouter lentier aux entiers prcdents et faire la
moyenne (cest dire diviser par le nombre dentiers
Structures de donnes :
- entier : entier saisi
- entier : rsultat moyenne
Algorithme :
Action : Moyenne
Var : n, moy, s : entiers
Dbut :
moy<=0
s<=0
Lire (n)
Tant que n0 faire
Dbut
Moy <= moy*s+n)/(s+1)
s<=s+1
lire (n)
fin
Ecrire (moy)
Fin

Exercice 15
Ecrire un algorithme permettant la saisie dune suite dentiers se terminant par zro et vrifier
si cette suite contient deux entiers conscutifs gaux en utilisant les structures tant que.
1) donner les spcifications
2) donner la solution en langage naturel
3) indiquer les structures de donnes
4) faites lalgorithme
Spcifications :
- donnes : suite dentier se terminant par zro
- rsultat : vrai si deux entiers conscutifs, faux sinon.
Solution en langage naturel : comparer lentier courant et le prcdent. Et tant que ils sont
diffrents, on continu la lecture et tant que lentier courant est diffrent de zro.
Structures de donnes :
- entier : nombre courant
- entier : nombre prcdent
Algorithme :
Action : Entiers conscutifs

11

Var : nc, np : entier


{on dsignera par nc le nombre courant et np le nombre prcdent}
Dbut Lire (nc)
np<=nc-1
{pour tre sur que le nombre courant ne sera pas le mme que le nombre prcdent ds le
dpart on affecte la valeur nc-1 au nombre prcdent. On aurait tout aussi bien pu lui donner
la valeur zro)
Tant que nc0 et np nc faire
Dbut
np<=nc
lire (nc)
fin
Si nc0 alors crire ( oui )
Sinon crire ( non )
Fin

Refaire le mme algorithme en utilisant une structure rpter jusqu'


Action : Entiers conscutifs
Var : nc, np : entiers
Dbut
Lire (nc)
Si nc 0 alors
Rpter
Dbut
np <= nc
lire (nc)
jusqu' (nc=np ou nc=0)
Si nc=0 alors crire ( oui )
Sinon crire ( non )
Fin

Exercice 16
Ecrire un algorithme qui affiche le maximum dune suite se terminant par zro
1) donner les spcifications
2) donner la solution en langage naturel
3) indiquer les structures de donnes
4) faites lalgorithme
Spcifications :
- donnes : une suite dentiers se terminant par zro
- rsultat : un entier : le maximum de cette suite
Solution en langage naturel : comparer lentier courant avec le maximum et tant que nc<max
on continue, sinon on affiche la rsultat et on continue, et tant que nc 0
Structures de donnes
- n : entier courant (saisi)
- max : entier max de la suite

12

Algorithme :
Action : max suite
Var : n, max : entiers
Dbut Lire (n)
Max<=n
Tant que n 0 faire
Dbut
Lire (n)
Si max<n alors max<=n
Fin
Ecrire (max)
Fin

Exercice 17
Ecrire un programme mettant en uvre le jeu suivant :
Le premier utilisateur saisi un entier que le second doit deviner. Pour cela, il a le droit autant
de tentatives quil souhaite. A chaque chec, le programme lui indique si lentier cherch est
plus grand ou plus petit que sa proposition.
Un score indiquant le nombre de coups jous est mis jour et affich lorsque lentier est
trouv.
1) donner les spcifications
2) donner la solution en langage naturel
3) indiquer les structures de donnes
4) faites lalgorithme
Spcifications :
- donnes : nombre entier
- rsultat : nombre de tentatives
Solution en langage naturel : saisir un nombre entier par le premier joueur. Tant que le joueur
2 nsaisie, dire si n est > ou < nombre cherch, incrmenter de 1 et continuer. Quand le
rsultat est trouv, afficher le nombre de tentatives.
Structures de donnes :
- a : nombre saisi par lutilisateur 1
- n : nombre saisi par lutilisateur 2
- t : tentatives
Algorithme :
Action : devinette
Var : a, n, t : entiers
Dbut :
Lire (a)
Lire (n)
t=0
Tant que an faire
Dbut
Si n>a alors crire ( nombre cherch plus petit )
Sinon crire ( nombre cherch plus grand )

13

t<=t+1
lire (n)
fin
crire (t+1)
fin

Exercice 18
Ecrire un algorithme permettant de calculer le PGCD de deux nombres en utilisant lastuce
suivante : soustraite le plus petit des deux entiers du plus grand jusqu' ce quils soient gaux
Ecrire le mme programme en utilisant lalgorithme dEuclide : dune part en utilisant
uniquement les structures TANT QUE, dautre part en utilisant uniquement les structures
REPETER JUSQU'A.
Action : PGCD
Var : a, b entiers
Lire (a, b)
Dbut
a = ValAbs (a)
b = ValAbs (b)
Rpter
Selon que
a>b a<=a-b
a<b b<=b-a
jusqua a=b
crire (a)
Fin

Mme programme avec Euclide et des TANT QUE :


Action : PGCD
Var : a, b, r entiers
Lire (a, b)
r<=a%b
tant que r0 faire
dbut
a<=b
b<=r
r<=a%b
fin
crire (b)
fin
Mme programme avec Euclide et des REPETER JUSQU'A :
Action : PGCD
Var : a, b, r entiers
Lire (a, b)
Rpter
r<=a%b
a<=b
b<=r

14

jusqu' r=0
crire (b)
fin

Exercice 19
Ecrire avec la commande POUR un algorithme qui permet de faire la somme dune suite de
nombre entre par lutilisateur. Faire la mme chose en comptant par pas de 1.
Action :somme_nombre
Var : k, nb, n, somme : entier
Dbut :
Somme <= 0
Ecrire ( combien voulez-vous entrer de nombres ? )
Lire (nb)
Pour k de 1 nb faire
Dbut
Lire (n)
Somme<=somme + n
Fin
Ecrire (somme)
Fin
Mme programme par pas de 1 :
Action : somme_entier
Var : k, nb, n, somme : entiers
Dbut :
Somme<=0
Ecrire ( combien voulez-vous entrer de nombres ?
Lire (nb)
Pour k de nb 1 par pas de 1 faire
Dbut
Lire (n)
Somme<=somme + n
Fin
Ecrire (somme)
Fin

Exercice 20
Traduire le POUR de lalgorithme suivant en REPETER JUSQU'A :
Action : bidon
Var : k, nb : entiers
Dbut
Lire (nb)
Pour k de 1 nb faire
Ecrire (k)
Fin
Action : Bidon

15

Var : k, nb : entier
Dbut
Lire (nb)
K<=1
Si nb>0 alors
Rpter crire (k)
K<=k+1
Jusqu k>nb
Fin

Exercice 21
Ecrire une fonction qui fait la somme des entiers compris dans un intervalle.
Fonction : intervalle (a, b ; entiers) : entier
Var : k, somme : entier
Dbut
Somme <= 0
Pour k de a b faire
Somme<=somme + k
Retourner (somme)
Fin

Exercice 22
Ecrire une fonction multiplication de a et b par addition successives.
Fonction : multiplication (a, b : entiers) : entier
Var : k, produit : entiers
Dbut
produit<=0
Pour k de 1 a faire
Produit<=produit + b
Retourner (produit)
Fin

16

4 exercices sur les Tableaux

Exercice 23
Ecrire une action qui permette la saisie dun tableau croissant : si T[k]<T[k+1] on enregistre,
si T[k]>T[k+1] on redemande la saisie dun nombre plus grand
Const : MAX=100
Ttype : Ttab=tableau [max]dentier
Action : saisie_tableau_croissant
Var : tab : Ttab, i : entier
Dbut
Lire (Tab[0])
Pour i de 1 MAX-1 faire
Rpter lire (tab[i])
jusqu' tab[i] tab[i-1]
Fin

Exercice 24
Ecrire une fonction retournant le maximum dun tableau de taille n.
Faire le mme algorithme mais qui ne retourne que lindice de la case du tableau contenant le
maximum du tableau.
Fonction : maximum (tab : Tableau dentier n :entier) : entier
Var : max, i : entiers
Dbut
Max <= tab[0]
Pour i de 1 n-1 faire
Si tab[i]>max alors max<=tab[i]
Retourner (max)
Fin

Fonction : maximum (tab : Tableau dentier n :entier) : entier


Var : indice, i, max : entiers
Dbut
Max<=tab[0]
Indice <=0
Pour i de 1 n-1 faire
Si tab[i]>max alors
max<=tab[i]
indice<=i
Retourner (indice)

17

Fin

18

5 Exercices gnraux sur les actions paramtres

Exercice 25
Ecrire une fonction Afficher qui affiche a lcran le contenu dun tableau. Ecrire aussi laction
principale qui permettra de comprendre comment fonctionne cette fonction afficher.

{Ne pas oublier dindiquer les paramtres du tableau !}


Const : MAX : entier=100
Type : Ttab : Tableau [MAX] dentier
Fonction Afficher (tab : tableau dentiers, n entiers)
Var : i entier
Dbut :
Pour i de 0 n-1
Ecrire (tab[i], )
Fin
Action principale
Var t1 t2 : Ttab
Dbut
T1[0]<=1
T1[1]<=3
T2[0]<=4
T2[1]<=5
T2[2]<=7
Afficher (T1, 2)
Afficher (T2, 3)
Fin
Rsultat lcran :
13
457

Exercice 26
Ecrire une fonction qui permet la saisie dun tableau. Faite aussi laction principale qui
permettra daccder a cette fonction saisie mais aussi dafficher dans un second temps le
rsultat
Fonction : saisie (Stab : tableau dentiers, N :entier)
Var : i entier
Dbut :
Pour i de 0 n-1 faire

19

Lire (tab[i])
Fin
Action principale
Var : tabl : Ttab
Dbut
Saisie (toto, 10)
Afficher (toto, 10)
Fin
Ou afficher est la fonction de lexercice 1.

Exercice 27
Ecrire une fonction qui calcule le nombre dinversion dun tableau de taille n (cest dire i<j
et tab[i]>tab[j] pour tout i et j.)
Fonction inversion (tab : tableau dentiers, N entier)
Var : j, C, i entiers
Dbut
C<=0
Pour i de 0 n-2 faire
Dbut
Pour j de i+1 n-1 faire
Si tab[i]>tab[j] alors C<=C+1
Fin
Retourner ( C )
Fin

Exercice 28
Ecrire une action qui affiche les n premiers lments de la suite dfinie par u0=1 et
un+1=somme de k=0 jusqu' n de (uk*un-k)
Aide : stocker les lments dans un tableau toto avec toto[0]=1. Puis on utilise une boucle
imbrique pour calculer toto[n+1]=somme k=0 k=n de toto[k]*toto[n-k].
Action Suite (E : d :entier)
Var : toto : Ttab, i, k : entiers
Dbut :
Toto[0]<=1
Pour I de 1 d-1 faire
Toto[i]<=0
Pour k de 0 n-1 faire
Toto[i]<=toto[i]+toto[k]+toto[i-1-k]
Afficher (toto, d)
Fin

Exercice 29
Voyons maintenant quelques exercices rudimentaires de changements dans un tableau

20

Ecrire une action permettant de remplacer toutes les occurrences de x par y dans un tableau de
taille n.
Ecrire un algorithme qui change les valeurs des cases i et j dans un tableau.
Ecrire un programme qui inverse un tableau. (exemple : 1 5 6 7 3 devient 3 7 6 5 1)
Action : Remplacer (E : x : entier, E : y : entier, ES tab : tableau dentiers, E : n : entier)
Var : i :entier
Dbut
Pour i de 0 n-1 faire
Si tab[i]=x alors tab[i]<=y
Fin

Action : Echanger (E : i : entier, E : j : entier, ES : tab : tableau dentier, E : n :entier)


Var : temp
Dbut
Si i<n ET j<n alors
Temp<=tab[i]
Tab[I]<=tab[j]
Tab[j]<=temp
Fin

Action : inverser (ES : tab : tableau dentiers, E : n : entier)


Var : i :entier
Dbut
Pour i de 0 n/2 1 faire
Echanger (i, n-1-in tab, n)
{ou Echanger est la deuxime action de cet exercice}
Fin

21

6 Entits : types structurs

Explications 1 :
Les types structurs sont :
- les tableaux (voir les exercices prcdents)
- les entits (ou lon regroupe plusieurs types sous un mme objet)
Exemple :
Etudiant (nom, groupe, note)
Type : Etd : entit (
Nom : chane de caractre ;
Groupe : caractre ;
Note : entier ;
);
Pour faire appel ce type dentit on fera dans la fonction :
Var : Tetd toto ;
Toto.nom=alex
Toto.groupe=A
Toto.note=15
Ecrire ( ltudiant , toto.nom, du groupe , toto.groupe, a eu , toto.note)

Exercice 30
Proposer une entit de donnes pour stocker un point dans le plan
Type : Tpoint=Entit (
abs : entier ;
ord : entier ;
)

Exercice 31
Ecrire les en-ttes des fonctions/actions suivantes :
- saisie dun point
- affichage dun point
- calcul de la distance entre deux points
- projection dun point sur laxe des abscisses
Ecrire ensuite les algorithmes de ces fonctions.
Faire une action principale qui demande la saisie de deux points, calcule la distance entre ces
deux points et affiche les rsultats.
Action SaisieTpoint (S : P : Tpoint) {Tpoint a t dfini lexercice 30}
Dbut
Lire (P.abs)
Lire (P.ord)
22

Fin
Action AfficherTpoint (E : P : Tpoint)
Dbut
Ecrire ( ( , P.abs, ; , P.ord, ) )
Fin
Fonction distance (P : Tpoint ; Q : Tpoint) : rel
Var : dist : rel
Dbut
Dist<=sqrt[(P.abs-Q.abs) + (P.ord-Q.ord)]
Retourner (dist)
Fin
Action ProjectionX (ES : P : Tpoint)
Dbut
P.ord<=0
Fin
Action Principale
Var : P, Q : Tpoint
Dist : rel
Dbut
SaisieTpoint(P)
SaisieTpoint(Q)
Dist<=distance(P, Q)
Ecrire ( la distance entre ,AfficherTpoint(P), et , AfficherTpoint(Q), est , dist)
Fin

Explications 2:
Nous ne rentrerons pas ici le tableau comme nous lavons fait prcdemment :
Nous utiliserons les entits. Ainsi la dclaration se fera de la manire suivante :
Const MAX=100
Type : TtabVar=entit
(
Tab : tab[MAX] dentier
Taille : entier
)
Ainsi, dans une fonction, on aura :
TtabVar : toto
Toto.tab[15]<=1 {pour entrer une valeur de tableau}
Toto.taille++ {On augmente la taille du tableau au fur et a mesure
Avantage de cette nouvelle manire dentrer un tableau : on peu avoir un tableau de taille
variable.

Exercice 32
Ecrire un algorithme qui permet de rentrer les donnes dun tableau de type TtabVar et dont
on connat la taille.

23

Ecrire ensuite un algorithme qui permet de rentrer les donnes dun tableau de type TtabVar
et ou lon ne connat pas la taille.
Action saisieTtabVar (S : tabvar : TtabVar, E : n : entier)
Var : i : entier
Dbut
Pour i de 0 n-1 faire
Lire (tabvar.tab[i])
Tabvar.taille<=n
Fin
Action saisieTtabVar (S tabvar : TtabVar)
Var : rponse : chane de caractre
Dbut
Tabvar.taille<=0
Rpter
Ecrire ( voulez-vous entrer un entier ? )
Lire (rponse)
Si rponse non alors
Lire (tabvar.tab[tabvar.taille])
Tabvar.taille++
Jusqu (rponse= non ou tabvar.taille=MAX)
Fin

Exercice 33
Ecrire un algorithme qui permet de rentrer un tableau de taille variable de Tpoint (voir
exercice 30 et 31). Pour cela, il faudra au pralable crer un nouveau type dentit.
Const MAX=100
Type TtabVarPt=entit (tab : tableau[MAX] de Tpoint, taille : entier)
Action : SaisieTtabVarTpoint (S : tabvarPt : TtabVarTpoint)
Var : rponse : chane de caractre
Dbut
Tabvar.taille<=0
Rpter
Ecrire ( voulez-vous entrer un entier ? )
Lire (rponse)
Si rponse non alors
Lire (tabvarpt.tab[tabvarpt.taille].abs)
Lire (tabvarpt.tab[tabvarpt.taille].ord)
Tabvarpt++
Jusqu (rponse= non ou tabvar.taille=MAX)

Exercice 34
Ecrire un algorithme qui dtermine le point ( ( !) cest dire son indice)le plus au nord et le
point le plus a louest dans un tableau de Tpoint.

24

Faire ensuite une action principale qui demande la saisie dun tableau de Tpoint lutilisateur
(voir exercice 33) et affiche llment le plus au nord et llment le plus louest.
Action NordOuest (E : tvp : TtabVarPt, S : nord : entier, S : ouest : entier)
Var : i : entier
Dbut
Nord<=0
Ouest<=0
Pour i de 0 tpv.taille-1 faire
Si tvp.taille[i].abs<tvp.tab[ouest].abs) alors ouest<=i
Si tvp.taille[i].ord<tvp.tab[ouest].ord) alors nord<=i
Fin
Action Principale
Var toto : TtabVarPt ; n, o : entiers
Dbut
Saisie TtabVarTpoint (toto)
NordOuest (toto, n, o)
Ecrire ( llment le plus au nord est , AfficherTpoint(toto.tab[n])
{ou AfficherTpoint est la fonction de lexercice
31}
Ecrire( llment le plus louest est , AfficherTpoint(toto.tab[o])
Fin

Exercice 35
Ecrire un algorithme qui dtermine la distance maximale entre deux points dun tableau de
Tpoint
Action DistMax (E : tvp : TtabVarPt)
Var : i, j : entiers ; Dmax, dist : reels
Dbut
Dmax<=0
Pour i de 0 tvp.taille-2 faire
Pour j de i+1 tvp.taille-1 faire
Dist<=distance(tvp.tab[i] ; tvp.tab[j])
Si dist>Dmax alors Dmax<=dist
Ecrire ( la distance maximale entre deux points du tableau est , Dmax)
Fin

25

7 Tableaux tris et dcoupages fonctionnels

Exercice 36
Le but de lexercice est de crer une action de saisie de tableau, qui trie, au fur et mesure des
entres, les valeurs par ordre croissant dans le tableau.
Exemple :
Soit le tableau suivant :
0
1
2
3
2
5
7
9
Comment insrer 6 dans le tableau tri (en supposant quil ny a pas de doublon dans le
tableau) ?
- je cherche la bonne position (ici : la case dindice 2)
- dcalage droite si ncessaire :
0
1
2
3
4
2
5
7
7
9
- Insertion de llment
0
1
2
3
4
2
5
6
7
9
On a donc ici le dcoupage fonctionnel :
On va donc crer une fonction IndiceEltSup qui cherche la bonne position, une action Insrer
qui inclue le nombre entr dans la bonne case du tableau, et une action DcalageDroite qui
dcale comme dans lexemple toutes les cases dun rang vers la droite si ncessaire.
Const MAX=100
Type TtabVar = entit (tab : tableau[MAX] dentiers, taille : entier)
Fonction IndiceEltSup (tvt : TtabVar, entier, n : entier) : entier
Var : i : entier
Dbut
Tant que (itvt.taille ET tvt.tab[i]<n)
i<=i+1
retourner (i)
Fin
Action DcalageDroite (ES : tvt : TtabVar, E : i : entier)
Var : j : entier
Dbut
Pour j de tvt.taille 1 i par pas de 1 faire
Tvt.tab[j+1]<=tvt.tab[j]
Tvt.taille++
Fin
Action Insrer (ES : tvt : TtabVar, E : i : entier, E : i : entier)

26

Dbut
DcalageDroite (tvt, i)
Tvt.tab[i]<=i
Fin
Action SaisieTri (S : tvt : TtabVar)
Var : rep : chane, nb : entier, i : entier
Dbut
Tvt.taille<=0
Rpter
Ecrire (Rentrer encore un entier ?)
Lire (rep)
Si rep non alors
Lire (nb)
I<=IndiceEltSup(tvt, nb)
Si non(i<tvt.taille ET tvt.tab[i]=nb)
Insrer (tvt, i, nb)
Jusqu rep= non ou tvt.taille=MAX
Fin

Exercice 37
Faire un algorithme qui fait une recherche dichotomique dans un tableau tri. On pourra
utiliser les fonctions de lexercice prcdent.
Nous allons crer une action qui dfinie la zone de recherche, puis laction RechercheDicho
qui oprera la recherche dichotomique dans lintervalle dfinie par la zone de recherche.
Action ZoneRecherche (E : tvt : TtabVar, E : n : entier, ES : Binf : entier, ES : Bsup : entier)
Var : milieu : entier
Dbut
Milieu <= (Binf + Bsup)/2
Si tvt.tab[milieu]=n alors
Dbut
Binf<=milieu
Bsup<=milieu
Fin
Sinon
Si tvt.tab[milieu]>n alors Bsup<=milieu 1
Sinon Binf<=milieu+1
Fin
Fonction RechercheDicho (E : tvt : TtabVar, E : n : entier)
Var : Binf, Bsup : entiers
Dbut
Binf<=0
Bsup<=tvt.taille 1
Tant que Bsup>Binf faire
ZoneRecherche (tvt, n, Binf, Bsup)
Si Bsup=Binf alors

27

Retourner (Binf)
Sinon retourner ( -1)

Exercice 38
Faire un algorithme qui supprime une valeur dans un tableau tri. On pourra utiliser des
fonctions des deux exercices prcdents.
Le but est dutiliser la recherche dichotomique de lexercice prcdent pour trouver dans le
tableau lindice de la valeur que lon veut supprimer puis faire un dcalage gauche pour
remettre en place les valeurs (sans quil y ait de vide dans une case du tableau)
Action Supprimer (ES : tvt : TtabVar, E : n : entier)
Var : i : entier
Dbut
i<=RechercheDicho(tvt, n)
Si i -1 alors
DecalageGauche (tvt, i)
Fin
Action DecalageGauche (Es : tvt : TtabVar, E : i : entier)
Var : j: entier
Dbut
Pour j de i+1 tvt.taille 1 faire
Tvt.tab[j 1] <= tvt.tab[j]
Tvt.taille <= tvt.taille 1
Fin

28

8 Les Chanes

On va maintenant faire des exercices sur les chanes de caractres.


En pratique on pourra dfinir une chane de caractres de deux manires :
Const MAX entier = 100
Type Tchaine = entit (
tab : tableau[MAX] de caractres
Longueur : entier)
Ou bien :
Const MAX entier = 100
Type Tchaine = tableau [MAX] de caractres
{Avec la sentinelle END}

Exercice 39
Faire un algorithme qui dtermine la longueur dune chane de caractres.
Faire ensuite de deux manires diffrentes, une fonction qui permet de copier la chane dune
source dans une chane destination.
Fonction Longueur (chaine : Tchaine) : entier
Var i : entier
Dbut
i0
Tant que chaine[ i ] != END faire i i+1
Retourner (i)
Fin

Fonction de copie : premire mthode :


Fonction Copier (E : src : Tchaine, S : dest : Tchaine)
Var i, Lsrc : entier
Dbut
LsrcLongueur(src)
Pour i de 0 Lsrc faire dest[ i ]src [ i ]
Fin
Fonction de copie : deuxime mthode : plus optimise :
Fonction CopieOptimise (E : src : Tchaine, S : dest : Tchaine)
Var i : entier
Dbut
i0
tant que src[ i ] != END faire
dest [ i ] src [ i ]
i i+1
29

dest [ i ] src [ i] {pour copier en fin de fichier la sentinelle}


Fin

Exercice 40
Faire une fonction de concatnation (ajoute la fin de la premire chane de caractres le
contenu de la deuxime chane de caractres.)
Faire une fonction de Comparaison qui compare deux chanes de caractres suivant lordre
lexicographique.
Faire une fonction qui efface une partie de la chane en spcifiant une longueur deffacement
et un indice partir duquel il faut effacer.
Action Concatnation (ES : src1 : Tchaine, E : src2 : Tchaine)
Var i, Lsrc1 : entiers
Dbut
i0
LsrcLongueur (src1)
Tant que src2 [ i ] != END
Src1[ Lsrc1+i] src2[ i ]
ii+1
src1[Lsrc1+i]src2[ i ]
Fin

Pour faire la fonction comparer, il faut dabord crer une fonction qui compare les
caractres :
Fonction ComparerChar (char a, char b)
Dbut
Si a<b retourner (-1)
Si a=b retourner (0)
Si a>b retourner (1)
Fin
On peut maintenant faire la fonction de comparaison de chanes de caractres qui utilisera la
fonction ComparerChar :
Fonction Comparer (E : src1 : Tchaine, E : src2 : Tchaine)
Var i, L1, L2, cmp : entiers
Dbut
L1Longueur (src1)
L2Longueur (src2)
I0
Tant que (i<L1 ET i<L2 ET ComparerChar (src1[ i ], src2[ i ])=0) faire ii+1
Si i=L1 ou i=L2 alors
Si i<L1 alors cmp1
Sinon
Si i<L2 alors cmp -1
Sinon cmp0
Sinon cmpComparerChar(src1[ i ], src2 [ i ])
Retourner (cmp)
Fin

30

Fonction Effacer (ES : src : Tchaine, E : indice : entier, E : lg : entier)


Var i, Lsrc : entiers
Dbut
LsrcLongueur (src)
Pour i de indice+lg Lsrc faire
Src[i-lg]src[ i ]
Fin

Exercice 41
Ecrire len-tte dune action multi dcalage droite qui dcale droite les lments dune
chane partir dun certain indice et insre des cases vides la place. (des actions de multi
dcalage ont dj t vue avec les tableaux, on ne demande pas den refaire une ici, ce rfrer
aux exercices sur les tableaux)
Faire une action dinsertion. On pourra pour cela utiliser au paravent la fonction multi
dcalage droite prcdente.
Faire une action de remplacement dune partie dune chane de caractres par une autre chane
de caractres dont la longueur nest pas forcment la mme. On pourra utiliser des fonctions
des exercices 39 et 40.
Faire une fonction Extraire qui prend une partie de chane de caractres partir dun certain
indice et la met dans une chane destination.
Faire une fonction de recherche qui recherche une chane dans une chane de caractre et
retourne un indice si partir de cette case on a la chane cherche. Sinon, elle retourne 1.
Faire une action qui changent toutes les occurrences dune chane dans une chane de
caractres par une autre chane tampon.
Action MultidcalageDroite (ES : src : Tchaine, E : indice : entier, E : lg : entier)
Action Insrer (ES : src : Tchaine, E : indice : entier, E : motif : Tchaine)
Var i, Lsrc, Lmotif : entier
Dbut
LmotifLongueur(motif)
MultidcalageDroite (src, indice, Lmotif)
Pour i de 0 Lmotif-1 faire
src[indice+i]motif[ i ]
Fin
Action Remplacer (ES : src : Tchaine, E indice : entier, E lg : entier, E : motif : Tchaine)
Dbut
Effacer (src, indice, lg)
Insrer (src, indice, motif)
Fin
Fonction Recherche (src : Tchaine, motif : Tchaine, Binf : entier)
Var : i, Lsrc, Lmotif : entiers
Tampon : Tchaine
Dbut
LsrcLongueur (src)

31

LmotifLongueur(motif)
iBinf
Extraire (src, i, Lmotif, tampon)
Tant que (i<Lsrc Lmotif ET Comparer (tampon, motif)0) faire
ii+1
Extraire (src, i, Lmotif, tampon)
Si non(i=Lsrc Lmotif) alors retourner (i)
Sinon retourner (1)
Fin
Action RemplacarToutesChaines (ES : src : Tchaine, E : ancien : Tchaine, E : nouveau :
Tchaine)
Var i , Lancien, Lnouveau, indice :entiers
Dbut
i0
LancienLongueur (ancien)
LnouveauLongueur (nouveau)
Indice Recherche(src, ancien, i)
Tant que indice -1 faire
Remplacer (src, indice, Lancien, nouveau)
iindice+Lnouveau
indiceRecherche(src, ancien, i)
Fin

32

9 Les fichiers

Rappelons tout dabord comment on manipule les fichiers en ASD.


On ne manipule que les identificateurs de fichiers. On ne se soucie donc pas des fichiers
sources.
Pour ouvrir un fichier :
OuvrirFichier (IdFic, ModeOuverture)
Avec ModeOuverture = lecture ou criture ou rajout.
Pour fermer un fichier
FermerFichier (IdFic)
Pour lire un fichier
LireFichier (IdFic, lment) cela correspond Lire(n) cin>>n
Pour crire un fichier
EcrireFichier (IdFic, lment)

cela correspond Ecrire(n) cout<<n

Exercice 42
Faire lalgorithme dune action qui lit un fichier dentiers et affiche tous les entiers de ce
fichiers qui sont pairs.
Ecrire une action qui lit un fichier dentiers et met dans un autre fichier dentiers les valeurs
paires.
Faire une fonction qui recherche un entier x dans un fichier dentiers et retourne vrai si x est
dans le fichier.
Action EntierPairs (E : Fic : fichier dentiers)
Var n : entier
Dbut
OuvrirFichier (Fic, lecture)
Si EtatFichier (Fic) = succs alors
LireFichier (Fic, n)
Tant que (EtatFichier (Fic) FdF) faire
{ou FdF signifie Fin de
Fichier}
Si n%2=0 alors Ecrire(n)
LireFichier(n)
FermerFichier (Fic)
Sinon Ecrire ( Erreur, impossible douvrir le fichier en lecture )
Fin
Action EntiersPairsFichier (E : f1 : fichier dentiers, ES : f2 : fichier dentiers)
Var n : entier
Dbut
OuvrirFichier (f1, lecture)
33

Si EtatFichier (f1) = succs alors


OuvrirFichier (f2, criture)
Si EtatFichier (f2) = succs alors
LireFichier (f1, n)
Tant que EtatFichier(f1)FdF faire
Si n%2=0 alors EcrireFichier(f2, n)
LireFichier (f1, n)
FermerFichier(f2)
Sinon crire ( Erreur en criture )
FermerFichier (f1)
Sinon crire ( Erreur en lecture )
Fin

Fonction Recherche (x : entier, f : fichier dentiers) : boolen


Var bool rep false
Dbut
OuvrirFichier (f, lecture)
Si EtatFichier(f)=succs alors
LireFichier(f, n)
Tant que (EtatFichier(f) FdF ET nx) faire
LireFichier(f, n)
Si n=x alors rep true
FermerFichier (f)
Sinon Ecrire ( Erreur en lecture )
Fin

Exercice 43
Faire une action de fusion de deux fichiers dentiers. Le fichier de sortie doit tre tri.
Action Fusion ( E : f1 : fichier dentiers, E : f2 : fichier dentiers, S : f3 : fichier dentiers)
Var : f3 : fichier dentiers
Dbut
OuvrirFichier (f1, lecture)
Si EtatFichier (f1)=succs alors
OuvrirFichier (f2, lecture)
Si EtatFichier (f2)=succs alors
OuvrirFichier (f3, criture)
Si EtatFichier (f3)=succs alors
LireFichier (f1, n1)
LireFichier (f2, n2)
Tant que (EtatFichier(f1) FdF ET EtatFichier(f2)FdF) faire
Si n1<n2 alors
EcrireFichier (f3, n1)
LireFichier (f1, n1)
Sinon
EcrireFichier (f3, n2)
LireFichier (f2, n2)
Si EtatFichier (f1) FdF alors

34

Rpter
EcrireFichier (f3, n1)
LireFichier(f1, n1)
Jusqu' EtatFichier(f1)=FdF
Si EtatFichier (f2) FdF alors
Rpter
EcrireFichier (f3, n2)
LireFichier (f2, n2)
Jusqu' EtatFichier (f2) = FdF
FermerFichier (f3)
Sinon crire ( Erreur en criture sur le fichier destination )
FermerFichier (f2)
Sinon crire ( Erreur de lecture sur le fichier f2 )
FermerFichier (f1)
Sinon crire ( Erreur en lecture sur le fichier f1 )
Fin

Exercice 44
Soit le type suivant :
Type : Tetd = entit ( Nom : chane
Numro : tudiant
Notes : tableau [5] dentiers
Moyenne : entier)
On suppose que la fonction de saisie
Fonction SaisieEtd () : Tetd
Permettant de saisir un tableau de Tetd existe. On pourra donc sen servir
Ecrire une fonction qui permet de saisir un groupe dtudiant dans un fichier.
Ecrire une fonction qui permet de calculer la moyenne gnrale dun groupe dtudiant.

Action SaisieGroupe (E : nb : entier, S : Fic : fichier de Tetd)


Var : etd : Tetd
i : entier
Dbut
OuvrirFichier (fic, criture)
Si EtatFichier (fic)=succs alors
Pour i de 1 nb faire
EtdSaisieEtd( )
EcrireFichier (fic, etd)
FermerFichier (fic)
Sinon crire ( Erreur )
Fin
Fonction Moyenne (fic : fichier de Tetd ) : rel
Var : Som : rel
Dbut
Som0
nb 0
OuvrirFichier (fic, lecture)

35

Si EtatFichier (fic)=succs alors


LireFichier (fic, etd)
Tant que EtatFichier (fic)FdF) faire
nbnb+1
SomSom + etd.moyenne
LireFichier(fic, etd)
Retourner (Som/nb)
FermerFichier (fic)
Sinon crire ( Erreur )
Fin

36

Vous aimerez peut-être aussi