Vous êtes sur la page 1sur 30

Algorithmique & Structures de données Travaux Dirigés

TD5 : Les Types Composés


Partie 1 : Les tableaux
Exercice N°1 :
Soit T un tableau contenant Nmax éléments de type entier.
Q1. Ecrire un sous-algorithme Taille qui permet de saisir la taille N>0 du tableau
(Nmax=50).
Q2. Ecrire un sous-algorithme Remplir qui permet de remplir le tableau B de N entiers
positifs et paire.
Q3. Ecrire un sous-algorithme Afficher qui permet d’afficher les éléments du tableau dans
l’ordre de saisie.
Q4. Ecrire un sous-algorithme AffTabInv qui permet d’afficher les éléments du tableau
dans l’ordre inverse.
Q5. Ecrire un sous-algorithme MinTab qui retourne le plus petit élément de ce tableau.
Q6. Ecrire un sous-algorithme Rechercher qui permet de rechercher une valeur P entrée
au clavier dans le tableau X (non trié). Afficher la première position (indice) de P si elle se
trouve dans le tableau, sinon afficher un message d’erreur.
Q7. Ecrire un sous-programme Occurrence qui calculer et retourne le nombre
d’occurrences d’un entier C dans un tableau d’entiers.
Q8. Écrire un sous-algorithme Inverser qui permet d’inverser l'ordre des éléments dans
le tableau X. Ainsi si le tableau contient les valeurs [2 ; 3 ; 5 ; 6 ; 9 ; 7], on aura comme résultat
le tableau suivant : [7 ; 9 ; 6 ; 5 ; 3 ; 2].
Q9. En utilisant les sous-algorithmes précédents, écrire l’algorithme qui permet de :
 Saisir N,
 Remplir le tableau
 Afficher le contenu du tableau,
 Afficher le contenu du tableau dans l’ordre inverse,
 Afficher le minimum du tableau,
 Afficher la première position d’un entier saisi par l’utilisateur s’il existe dans le
tableau X sinon afficher un message d’erreurs,
 Afficher le nombre d’occurrence d’un entier saisi par l’utilisateur.
 Afficher le tableau après l’inversion de son contenu.

Exercice N°2 :
Q1. Ecrire un sous-algorithme qui permet d’éclater un vecteur d’entiers VE en deux :
 Un vecteur VP contenant les entiers pairs.
 Un vecteur VI contenant les entiers impairs.
Q2. En utilisant les sous-algorithmes précédents, écrire l’algorithme qui permet de :
 Saisir N,
 Remplir le tableau
 Afficher le contenu du tableau,
 Afficher le tableau des paires et le tableau des impaires.

D.Cheriti,I.Daoud & L.Ayedi -1-


Algorithmique & Structures de données Travaux Dirigés

Exercice N°3 :
Un instituteur cherche à vérifier si ses élèves ont appris à réciter l’alphabet lettre par lettre
dans l’ordre. Pour ceci, Il vous demande de lui développer l’algorithme et les sous-algorithmes
d’un programme permettant d’évaluer chaque élève de la façon suivante :
Q1. Le programme demande à chaque élève de remplir un tableau nommé réponse par les
lettres de l’alphabet dans l’ordre. Ecrire un sous-algorithme REMPLIR qui remplit le tableau
réponse.
Q2. Ecrire sous-algorithme CORRIGER qui permet d’examiner le tableau réponse
élément par élément :
 Si la lettre est dans sa place, il l’accepte.
 Sinon, il la remplace par la lettre adéquate et incrémente le nombre de fautes
Q3. En utilisant les sous-algorithmes précédents, écrire l’algorithme qui permet de :
 saisir les réponses de l’élève
 d’afficher le nombre total de fautes commises par l’éléve.
Exercice N°4 :
Q1. Ecrire un sous-algorithme qui permet de vérifier si les éléments du tableau de taille
N sont dans l’ordre croissant ou non.
Q2. Ecrire un sous-algorithme qui permet de fusionner deux tableaux V1 de taille N et
V2 de taille M en un troisième tableau V3 de taille N+M trié dans l’ordre croissant.
Q2 : Ecrire un algorithme qui permet de :
 Remplir deux tableaux V1 de taille N et V2 de taille M et de vérifier s’ils sont
trié dans l’ordre strictement croissant,
 Fusionner les deux tableaux en un troisième tableau V3 trié dans l’ordre croissant.

Exercice N°5 :
Q1. Ecrire un sous-algorithme InsereVal qui insère une nouvelle valeur dans un tableau A
trié dans l’ordre croissant de réel de taille N (Nmax=50).
 1ère méthode : on utilise un deuxième tableau comme tableau résultat.

 2éme méthode : on utilise le même tableau comme tableau résultat.


Q2. En se basant sur le sous-algorithme précédent, écrire un sous-algorithme RemplirTrié
qui insère au fur et à mesure des valeurs saisies par l'utilisateur. L’algorithme s’arrête d’insérer
dans l’un des deux cas :
 L’utilisateur entre la valeur 0.
 Le tableau est entièrement rempli. Dans ce cas afficher un message d’erreur.

D.Cheriti,I.Daoud & L.Ayedi -2-


Algorithmique & Structures de données Travaux Dirigés

Q3. En utilisant les sous-algorithmes précédents, écrire l’algorithme qui permet de :


 Remplir le tableau de réel dans l’ordre croissant,
 Afficher le contenu du tableau.
Exercice N°6 :
Une salle d’attente est représentée par un tableau d’entiers, Salle, contenant les numéros
des clients présents (par exemple leurs numéros de CIN) de taille maximum CAPACITE. La
variable nbClients donne le nombre de clients présents dans la salle d’attente.
Q1. Ecrire un sous-algorithme qui permet d’afficher un menu comme le suivant :
Choisissez l’action à faire :
1  Vérifier salle pleine ou non.
2  Ajouter un client dans la salle d’attente.
3  Faire passer en consultation un client.
4  Vider Salle d’attente

Q2. Si l’utilisateur tape 1 alors il faut afficher VRAI si la salle est pleine, et FAUX sinon.
Ecrire un sous-algorithme PLEINE qui permet de déterminer si la salle est pleine ou non.
Q3. Si l’utilisateur tape 2 alors il faut ajouter un client dans la salle. Si la salle n’est pas
pleine alors :
 Ce nouveau client occupera le premier élément libre du tableau Salle.
 Un message devra indiquer si l’ajout a été possible.
Ecrire un sous-algorithme AJOUTER qui permet de d’ajouter un client dans la salle
d’attente.
Q4. Si l’utilisateur tape 3 alors il faut faire passer en consultation le client le plus
anciennement arrivé dans la salle d’attente.
 Si la salle n’est pas vide alors :
 Un message devra indiquer le numéro du client qui est parti en consultation
c’est le numéro qui occupe la première case du tableau « Salle ».
 On supprime la case Salle[1] en décalant d’un cran (d’une case) vers la gauche
les numéros des clients restants dans le tableau (si la salle n’est pas vide).
 Sinon un message devra indiquer que la salle est vide.
Ecrire un sous-algorithme SUPPRIMER qui permet de supprimer un client de la salle
d’attente.
Q5. Si l’utilisateur tape 4 alors il faut faire passer tous les clients, et afficher, au fur et à
mesure, le numéro des clients qui passent.
Q6. Ecrire l’algorithme qui permet de vider la salle d’attente et ce en utilisant la réponse
de la question précédente.

D.Cheriti,I.Daoud & L.Ayedi -3-


Algorithmique & Structures de données Travaux Dirigés

Corrigé TD5 : Les Types Composés


Partie 1 : Les tableaux

Exercice N°1 :
Q1. Fonction taille() : entier
VAR N :entier
DEBUT
Repeter
Ecrire("Donnez la taille du tableau")
Lire(N)
Jusqu’à (N>0 ET N<=Nmax)
Taille  N
FIN Taille

Q2.
1ère méthode
Procedure RemplirPaire(S T :Tab; E N :entier)
VAR i :entier
Debut
Pour i de 1 à N faire
repeter
Ecrire("T[",i,"]")
Lire(T[i])
Jusqu’à(T[i]>=0 ET T[i]MOD2=0)
Fin Pour
FIN RemplirPaire
2ème méthode
Fonction Parité(X :Entier) :Logique
VAR
Test :Logique Fonction
Debut Parité(X :Entier) :Logique
SI(X MOD 2=0) ALORS Debut
Test  Vrai SI(X MOD 2=0) ALORS
SINON Parité  Vrai
Test  Faux SINON
FIN SI Parité  Faux
Parité  Test FIN SI
FIN Parité FIN Parité

Fonction Parité(X :Entier) :Logique


Debut
Parité  X MOD 2=0 //Retourner(X MOD 2=0)
FIN Parité

D.Cheriti,I.Daoud & L.Ayedi -4-


Algorithmique & Structures de données Travaux Dirigés

Procedure RemplirPaire(S T :Tab; E N :entier)


VAR i :entier
Debut
Pour i de 1 à N faire
repeter
Ecrire("T[",i,"]")
Lire(T[i])
Jusqu’à(T[i]>=0 ET Parité(T[i])
Fin Pour
FIN RemplirPaire
3ème méthode
Fonction VerifParitéPos(X :Entier) :Logique
Debut
Parité  (x>=0 ET X MOD 2=0) //Retourner(X>=0 ET X
MOD 2=0)
FIN Parité
Procedure RemplirPaire(S T :Tab; E N :entier)
VAR i :entier
Debut
Pour i de 1 à N faire
repeter
Ecrire("T[",i,"]")
Lire(T[i])
Jusqu’à(VerifParitéPos(T[i])
Fin Pour
FIN RemplirPaire

Q3. Procedure Afficher (E T: Tab, N : entier)


VAR
i : entier
DEBUT
POUR i de 1 à N FAIRE
ECRIRE(" ",T[i])
FIN POUR
FIN Afficher

Q4. Procedure AffTabInv (E T: Tab, N : entier)


VAR
i : entier
DEBUT
POUR i de N à 1 PAS = -1 FAIRE
ECRIRE(" ",T[i])
FIN POUR
FIN AffTabInv

Q5. Fonction MinTab(T : tab, N : entier) : Entier


VAR Tab
M,i : Entier
DEBUT

D.Cheriti,I.Daoud & L.Ayedi -5-


Algorithmique & Structures de données Travaux Dirigés

M  T[1]
Pour i de 2 à N Faire
Si (T[i] < M) Alors
M T[i]
FinSi
FinPour
MinTab  M //Retourner(M)
Fin MinTab

Q6. 1ère méthode


PROCEDURE Rechercher(E X : Tab, N,P : entier)
VAR
i : entier, Trouve : BOOLEEN
DEBUT
i1
TrouveFAUX
TANT QUE (i <= N ET trouve <> VRAI) FAIRE
SI(X[i]=P) ALORS
ECRIRE("La position de ",P," dans le tableau est ",i)
Trouve VRAI
SINON
ii+1
FIN SI
TANT QUE
SI(Trouve=Faux)ALORS
ECRIRE("Erreur !! ",P," n’existe pas dans le
tableau ")
FIN SI

FIN Rechercher
2ème méthode
PROCEDURE Rechercher(E X : Tab, N,P : entier)
VAR
i : entier
DEBUT
i1
TANT QUE (i <= N ET X[i]<>P) FAIRE
ii+1
FIN TANT QUE
SI(i<=N) ALORS
ECRIRE("La position de ",P," dans le tableau est ",i)
SINON
ECRIRE("Erreur !!",P," n’existe pas dans le tableau")
FIN SI
FIN Rechercher

Q7. Fonction Occurence(T : Tab ; N,P : Entier) : Entier


VAR
i, cpt : Entier

D.Cheriti,I.Daoud & L.Ayedi -6-


Algorithmique & Structures de données Travaux Dirigés

Début
cpt 0
Pour i de 1 à N Faire
Si (T[i] = P) Alors
cpt  cpt + 1
FinSi
FinPour
Occurence  cpt
Fin Occurence
Q8.
1ère méthode
PROCEDURE Inverser(E/S T : Tab; E N :entier)
VAR x,i : entier
DEBUT

POUR i de 1 à (N DIV 2) FAIRE


xT[i]
T[i] T[N-i+1]
T[N-i+1]x
FIN POUR
FIN Inverser
2eme méthode

PROCEDURE Permut(E/S A,B:entier)


VAR
x :entier
DEBUT
xA
A B
Bx
FIN Permut
PROCEDURE Inverser(E/S T : Tab; E N :entier)
VAR x,i : entier
DEBUT

POUR i de 1 à (N DIV 2) FAIRE


Permut(T[i],T[N-i+1])
FIN POUR
FIN Inverser
Q9.

ALGORITHME TraittementTableau
CONST Nmax=50
TYPE
Tab = tableau [1 .. Nmax] d’entier
VAR
N,j,P : entier
X : Tab
DEBUT

D.Cheriti,I.Daoud & L.Ayedi -7-


Algorithmique & Structures de données Travaux Dirigés

N  Taille()
ECRIRE("********* Remplissage du tableau *********")
Remplir(X,N)
ECRIRE("********* Affichage du tableau *********")

ECRIRE("------> Dans l’ordre de saisie :")


Afficher(X,N)

ECRIRE("------> Dans l’ordre inverse de saisie :")


AffTabInv (X,N)

ECRIRE("Le Minimum du tableau est : ",MinTab(X,N))

ECRIRE("Donnez l’entier : ")


LIRE(P)
j  Occurrence(X,N,P)
ECRIRE("Le nombre d’occurrence de ",P," est ",j)

Inverser(X,N)
ECRIRE("** Affichage du tableau après inversion **")
Afficher(X,N)

FIN
Exercice N°2 :
1ère méthode
PROCEDURE Eclater(E VE : Tab,N:Entier ; S VP, VI : Tab, j,k: Entier)
VAR
i: Entier
DEBUT
j←0,k←0
POUR i de 1 à N FAIRE
SI (VE[i] MOD2 = 0) ALORS
j← j + 1
VP[j]←VE[i]
SINON
k← k + 1
VI[k]←VE[i]
FINSI
FINPOUR
FIN Eclater
2ème méthode
Fonction Parité(X :Entier) :Logique
Debut
SI(X MOD 2=0) ALORS
Parité  Vrai
SINON
Parité  Faux
FIN SI
FIN Parité
PROCEDURE Eclater(E VE : Tab,N:Entier ; S VP, VI : Tab, j,k: Entier)
VAR

D.Cheriti,I.Daoud & L.Ayedi -8-


Algorithmique & Structures de données Travaux Dirigés

i: Entier
DEBUT
j←0,k←0
POUR i de 1 à N FAIRE
SI (Parité(VE[i])= Vrai) ALORS
j← j + 1
VP[j]←VE[i]
SINON
k← k + 1
VI[k]←VE[i]
FINSI
FINPOUR
FIN Eclater

ALGORITHME EclaterTableau
CONST Nmax=50
TYPE
Tab = tableau [1 .. Nmax] d’entier
VAR
N,J,K : entier
VE,VP,VI : Tab

N  Taille()
ECRIRE("********* Remplissage du tableau *********")
Remplir(VE,N)
ECRIRE("********* Affichage du tableau *********")
Afficher(VE,N)

Eclater(VE,N,VP,VI,J,K)

/*affichage des deux tableaux résultats*/


ECRIRE("***** Affichage du tableau des paires ****")
Afficher(VP,J)

ECRIRE("**** Affichage du tableau des impaires ****")


Afficher(VI,K)

FIN
Exercice N°3 :
Q1.
PROCEDURE Remplir(S Reponse : Tab ;E N :entier)
DEBUT
Pour i de 1 à N Faire
repeter
Ecrire("Donnez le caractère N°",i)
Lire(Reponse[i])
Jusqu’à(Majus(Reponse[i])>='A' ET Majus(Reponse[i])<='Z')
FinPour
Fin Remplir

Q2.

D.Cheriti,I.Daoud & L.Ayedi -9-


Algorithmique & Structures de données Travaux Dirigés

PROCEDURE Corriger(E/S Reponse : Tab ; S nb : Entier, E N:Entier)


DEBUT
nb 0
Pour i de 1 à N Faire
Si (Majus(Reponse[i]) <> CHR(i+(ORD('A')-1))) Alors
Reponse[i]CHR(i+(ORD('A')-1))
nb nb + 1
FinSi
FinPour
Fin Corriger

Q3.
ALGORITHME Alphabet
CONST
N = 26
TYPE
Tab = Tableau[1..N] de Car
VAR
reponse : Tab
nbF : Entier
DEBUT
remplir(réponse,N)
corriger(réponse, nbF, N)
Ecrire(”Nombre de fautes : ”,nbF)
Fin
Exercice N°4 :
Q1.
FONCTION EstTrié(T :Tab, N :entier) :Logique
VAR i : entier, Trier : Logique
DEBUT
i1
Trier Vrai
TANT QUE ((i<= N-1) et Trier=VRAI) FAIRE
SI(T[i]< T[i+1])ALORS
ii+1
SINON
TrierFaux
FIN SI
FIN TANT QUE
EstTrié  Trier
FIN EstTrié
Q2.
PROCEDURE Fusion(E V1 : Tab, V2 : Tab, N :entier ;M :entier ; S V3
:TabF; k :entier)
VAR i, j: Entier
DEBUT
i 1, j 1, k0
TANTQUE (i <= N) ET (j <= M) FAIRE
SI (V1[i] <= V2[j]) ALORS
kk + 1
V3[k]V1[i]
ii + 1

D.Cheriti,I.Daoud & L.Ayedi - 10 -


Algorithmique & Structures de données Travaux Dirigés

SINON
kk + 1
V3[k]V2[j]
jj + 1
FINSI
FINTQ
TantQue (i <= N) FAIRE
kk + 1
V3[k]V1[i]
ii + 1
FINTQ
TANTQUE (j <= M) FAIRE
kk + 1
V3[k]V2[j]
jj + 1
FINTQ
FIN Fusion

ALGORITHME TableauFusion
CONST
Nmax=50
TYPE
Tab =tableau [1 .. Nmax] d’entier
TabF =tableau [1 .. 2*Nmax] d’entier
VAR
N,M,K : entier
trier : Logique
V1,V2: Tab
V3 :TabF
DEBUT
N  Taille()
ECRIRE("****** Remplissage du tableau N°1 *******")
Repeter
Remplir(V1,N)
Jusqu’à(EstTrié(V1,N))
ECRIRE("****** Remplissage du tableau N°2 *******")
M  Taille()
Repeter
Remplir(V2,M)
Jusqu’à(EstTrié(V2,M))
Fusion(V1,V2,N,M,V3,K)
ECRIRE("******** Affichage du tableau N°1 ********")
Afficher(V1,N)
ECRIRE("******** Affichage du tableau N°2 ********")
Afficher(V2,M)
ECRIRE("******** Affichage du tableau N°3 ********")
Afficher(V3,K)
FIN
/////INF 11

D.Cheriti,I.Daoud & L.Ayedi - 11 -


Algorithmique & Structures de données Travaux Dirigés

Exercice N°5 :
Q1. { on ne considère pas les cas où le tableau est vide ou plein)
1ere méthode :
Procédure InsereVal_1 (E A:Tab,R:Entier,N :Entier ;S B : Tab)
VAR i, j : Entier
DEBUT
i  1,j  1
TantQue (A[i] <= R) et (i <= N) Faire
B[j]  A[i]
i i + 1, j j + 1
FinTQ
B[j]  R
j j + 1
TantQue (i <= N) Faire
B[j]  A[i]
ii + 1, j j + 1
FinTQ
FIN InsereVal_1
2éme méthode :
Procédure InsereVal_2 (E/S A : Tab, N :entier,E R : entier )
VAR
i : Entier
DEBUT
i  N+1
TANT QUE (i > 0 et A[i-1] > R) FAIRE
A[i]  A[i-1]
i  i-1
FIN TQ
A[i]  R
N  N + 1
FIN InsereVal_2
Q2.
Procédure RemplirTrié(E/S A : Tab, N : Entier)
VAR
V,i : entier
DEBUT
i  0
REPETER
Ecrire("Donnez une valeur réel")
LIRE(V)
SI (V ≠ 0) ALORS
SI (i=0) ALORS //tableau vide
T[1]  V
i  i+1
SINON SI (i<Nmax) ALORS
InsereVal_2(T,V,i)
SINON
Ecrire("Le tableau est plein!! Impossible
d’ajouter un nouvel élément.")
FIN SI

D.Cheriti,I.Daoud & L.Ayedi - 12 -


Algorithmique & Structures de données Travaux Dirigés

FIN SI
SINON
Ecrire("Fin du remplissage du tableau.")
FIN SI
JUSQU’A (i=Nmax ou V=0)
N  i
FIN RemplirTrié
Q3.
ALGORITHME Remplir_Tableau_trié
CONST
Nmax=50
TYPE
Tab= tableau [1 .. Nmax] de réel
VAR
N : entier
T : Tab
DEBUT
RemplirTrié(T,N)
Afficher(T,N)
FIN

D.Cheriti,I.Daoud & L.Ayedi - 13 -


Algorithmique & Structures de données Travaux Dirigés

Exercice N°6 :
Algorithme Salle_Attente
CONST
Capacite = 100
VAR
nbreClt, i, choix : entier
Salle : tableau [1..capacite] d’entier
SP,CltAjout : Booléen
DEBUT
nbreClt ← 0
SP ← FAUX
ECRIRE ("**** MENU ****")
ECRIRE ("1 : Vérifier si la salle est pleine ou non ?:")
ECRIRE ("2 : Ajouter un client dans la salle d’attente :")
ECRIRE ("3 : Faire passer en consultation un client :")
ECRIRE ("4 : Vider la salle d’attente :")
ECRIRE ("Tapez votre choix :")
LIRE (choix)
SI choix = 1 ALORS
POUR i DE 1 A capacite FAIRE
SI (Salle[i] <> '') ALORS
nbreClt ← nbreClt + 1
FINSI
FINPOUR

SI nbreClt = capacite ALORS


SP ← VRAI
FINSI
ECRIRE (SP)
SINON SI (choix = 2) ALORS
SI (SP = FAUX) ALORS
CltAjout ← FAUX
i ← 1
TANTQUE ((i<capacite) ET (CltAjout <> VRAI)) FAIRE
SI Salle[i] = '' ALORS
CltAjout ← VRAI
ECRIRE ("Donnez le numéro du client :")
LIRE (Salle[i])
ECRIRE ("Client ajouter avec succès !")
SINON
i ← i + 1
FINSI
FIN TANTQUE
SINON
ECRIRE ("Salle pleine ! impossible d’ajouter !")
FINSI
SINON SI choix = 3 ALORS
……………………
Non existant ds la serie
Exercice N°3333 :
Q1.

D.Cheriti,I.Daoud & L.Ayedi - 14 -


Algorithmique & Structures de données Travaux Dirigés

Fonction ProdScal(U : Tab ; V : Tab) : Réel


Variables
i : Entier
ps : Réel
Début
ps 0
Pour i de 1 à n Faire
Psps + U[i] * V[i]
FinPour
ProdScalps
Fin
Q2.
Fonction NormVect(U : Tab) : Réel
Début
NormVect Racine(ProdScal(U,U))
Fin
Exercice N°9 :
Q1.
Pocédure RechTabTrié(T :Tab ; N :entier ; V :réel ; Var trouve :booléen)
VAR
i : entier
DEBUT
i1
trouve  FAUX
TANT QUE (i<N et T[i]<=V et trouve <> VRAI) FAIRE
SI(T[i]=V) ALORS
TrouveVRAI
ECRIRE("La position de ",V," dans le tableau est ",i)
SINON
ii+1
FIN SI
SI (trouve=FAUX) ALORS
ECRIRE(V," n’existe pas dans le tableau !!")
FIN TAN QUE
Q2.
ALGORITHME Tableau_trié
CONST
Nmax=50
TYPE
Tab= tableau [1 .. Nmax] de réel
VAR
N : entier
V : réel
T : Tab
Rep :booléen
DEBUT
RemplirTrié(T,N)
Afficher(T,N)
Ecrire("Donnez la valeur à rechercher")
Lire(V)

D.Cheriti,I.Daoud & L.Ayedi - 15 -


Algorithmique & Structures de données Travaux Dirigés

RechTabTrié(T,N,V,Rep)
FIN
Exercice N°10 :
Procédure RemplirTabTrie(Var T : Tab1 ;N :entier)
VAR
i : Entier
DEBUT
ECRIRE("élément N°1 = ")
LIRE(T[1])
POUR i de 2 à N FAIRE
ECRIRE("élément N°",i, " = ")
REPETER
LIRE(T[i])
JUSQU’A (T[i]> T[i-1])
FIN POUR
FIN

ALGORITHME Fusionner_Tableaux
VAR
N,M,K: entier
T,P : tableau [1 .. Nmax] d’entier
R : tableau [1 .. 2*Nmax] d’entier
DEBUT
REPETER
Ecrire("Donnez la taille du tableau N°1 :")
Lire(N)
JUSQU’A (N>0)
ECRIRE("Remplissage du premier tableau N°1 :")
RemplirTabTrie(T,N)

REPETER
Ecrire("Donnez la taille du tableau N°2 :")
Lire(M)
JUSQU’A (M>0)
ECRIRE("Remplissage du premier tableau N°2 :")
RemplirTabTrie(P,N)

Fusion(T,P,R,N,M,K)
Afficher(R,K)

D.Cheriti,I.Daoud & L.Ayedi - 16 -


Algorithmique & Structures de données Travaux Dirigés

Exercice N°12 :
Ecrire un sous-algorithme ZeroDiag qui met à zéro les éléments de la diagonale principale
d'une matrice carrée MAT (n lignes et n colonnes) donnée.
Exercice N°13 :
Q1. Ecrire un sous-algorithme Transpose qui calcule la transposition d’une matrice
carrée.
L’opération de transposition consiste à inverser les lignes et les colonnes d’une matrice
carrée en effectuant une symétrie par rapport à la diagonale principale de la matrice.
Exemple :

Q2. Ecrire un sous-algorithme SomMat qui réalise la somme de deux matrice M1 et M2


de dimensions L et C : M3=M1+M2.
Exemple :

Q3. Ecrire un sous-algorithme ProdMat qui réalise le produit de deux matrices M1 ayant
n lignes et m colonnes et M2 ayant m lignes et p colonnes : M3=M1 x M2 avec M3 est défini
comme une matrice ayant n lignes et p colonnes et dont les éléments sont calculés par la formule
:

où M1i,k, M2k,j et M3i,j sont respectivement les éléments des matrices M1, M2 et M3.
N.B : le nombre de colonnes de M1 doit être égal au nombre de lignes de M2.
Exemple :

Exercice N°14 :
Ecrire un sous-algorithme qui permet de chercher un caractère donnée dans une matrice
de caractères et qui retourne l’indice de la ligne et l’indice de la colonne.
Exercice N°15 :
Q1. Ecrire un sous-algorithme qui permet d’afficher les éléments de la diagonale
principale et ceux de la première diagonale secondaire d’une matrice de taille LxC.

D.Cheriti,I.Daoud & L.Ayedi - 17 -


Algorithmique & Structures de données Travaux Dirigés

Q2. Ecrire un sous-algorithme qui permet de faire la somme des éléments de la première
et ceux de la deuxième diagonale d’une matrice carré de taille LxC.
Q3. Ecrire un algorithme qui permet de :
 remplir une matrice carrée d’entiers de taille LxC (Maximum 50 lignes).
 afficher les résultats des sous-programmes précédents.
Exercice N°16 :
Q1. Ecrire un sous-algorithme TrianglePascal qui construit le triangle de PASCAL de
degré N (inférieur à 13) et le mémorise dans une matrice carrée P de dimension N+1.

Exemple : Triangle de Pascal de degré 6:

N=0 1
N=1 11
N=2 121
N=3 133 1
N=4 146 4 1
N=5 1 5 10 10 5 1
N=6 1 6 15 20 15 6 1
Ce triangle est construit de la façon suivante :
 Le triangle est construit ligne par ligne:
 Initialiser le premier élément qui est l'élément de la diagonale à 1.
 Calculer les valeurs entre les éléments initialisés de gauche à droite en utilisant
la relation: Pi,j = Pi-1,j + Pi-1,j-1
Q2 : Ecrire un algorithme qui permet de :
 Saisir le degré N du triangle de PASCAL.
 Construire la matrice carré P contenant les éléments du tiangle de PASCAL.

Exercice chaine

Exercice N°17 :
Ecrire un algorithme qui lit deux chaînes de caractères CH1 et CH2 et qui copie la
première moitié de CH1 et la première moitié de CH2 dans une troisième chaîne CH3. Afficher
le résultat.
N.B : utiliser un sous-algorithme pour la lecture d’une chaine et un sous-algorithme pour
créer CH3.
Exercice N°18 :
Q1. Ecrire un sous-algorithme qui permet de lire une phrase (chaine de caractère) formée
de caractères alphabétiques et du caractère espace. La phrase commence obligatoirement par
une lettre et les mots sont séparés par des espaces.
Q2. Ecrire un sous-algorithme qui permet de compter le nombre de mots dans une phrase
donnée.

D.Cheriti,I.Daoud & L.Ayedi - 18 -


Algorithmique & Structures de données Travaux Dirigés

Q3. Ecrire un sous-algorithme qui détermine et affiche le mot le plus long dans une phrase
donnée.

Exercice N°19 :
Q1. Ecrire un sous-algorithme qui permet d’effacer toutes les occurrences du caractère C,
donné par l’utilisateur, dans CH et tasser les éléments restants.
Q2. Ecrire l’algorithme qui permet :
 de lire une chaine de caractère ch,
 de supprimer toutes les occurrences d’un caractère donné de la chaine ch,
 d’afficher la chaine après la suppression.
Exemple:
Introduisez une chaine de caractère : Le réseau informatique
Donnez le caractère à éliminer : e
La chaine résultante est : L résau informatiqu
Exercice N°20 :
Q1. Ecrire un sous-algorithme qui lit un verbe régulier se terminant par "er".
Q2. Ecrire un sous-algorithme qui affiche la conjugaison d’un verbe régulier au présent
de l'indicatif de ce verbe.
Exemple :
Donner un verbe : fêter
La conjugaison du verbe fêter donne : je fête , tu fêtes, il
fête, nous fêtons …
Exercice N°21 :
Ecrire un sous-algorithme qui supprime la première occurrence d'une chaîne de caractères
chaine1 dans une chaîne de caractères chaine2.
Exemples: Chaine1 Chaine2 Chaine3
HAM MOHAMED MOED
EI ZIED ZIED
T TOTALEMENT OTALEMENT
HELLO HELLO

Exercice N°22 :
Ecrire un sous-algorithme qui remplace la première occurrence d'une chaîne de caractères
CH1 par la chaîne CH2 dans une chaîne de caractères DEBUT. Utiliser une chaîne qui
contiendra le résultat finale FIN.
Exemples: CH1 CH2 DEBUT FIN
HAM DF MOHAMED MODFED
IE EI ZIED ZEID
IE ARTE PIERRE PARTERRE
EI IE ZIED ZIED
TOT FIN TOTALEMENT FINALEMENT
TTT HELLO HELLO

D.Cheriti,I.Daoud & L.Ayedi - 19 -


Algorithmique & Structures de données Travaux Dirigés

Exercice N°8:
Q1. Ecrire un sous-algorithme qui lit 10 mots et les mémorise dans un tableau de chaînes
de caractères.
Q2. Ecrire un sous-algorithme qui permet de trier les 10 mots lexicographiquement en
utilisant la fonction COMPARER. Utilisez la méthode de tri à bull. Afficher le tableau trié.

D.Cheriti,I.Daoud & L.Ayedi - 20 -


Algorithmique & Structures de données Travaux Dirigés

D.Cheriti,I.Daoud & L.Ayedi - 21 -


Algorithmique & Structures de données Travaux Dirigés

Corrigé matrice
Exercice N°12 :
Procédure ZeroDiag(Var M : MAT; n:entier; n:entier)
VAR
i : entier
DEBUT
POUR i de 1 à N FAIRE
MAT[i,i] 0
FIN POUR
FIN

Exercice N°13 :
Q1.
Procédure Transpose(Var M : Mat,n :entier)
VAR
i, j, x : Entier
DEBUT
POUR i de 1 à n FAIRE
POUR j de (i+1) à n FAIRE
XM[i,j]
M[i,j] M[j,i]
M[j,i] x
FIN POUR
FIN POUR
FIN
Q2.
Procédure SomMat(M1, M2 : Mat ; Var M3 : Mat,n :entier)
VAR
i, j : Entier
DEBUT
POUR i de 1 à n FAIRE
POUR j de 1 à n FAIRE
M3[i,j]  M1[i,j]+ M2[i,j]
FIN POUR
FIN POUR
FIN
Q3.
Procédure ProdMat(M1 : Mat1; M2 : Mat2; Var M3 :
Mat3,n :entier,m :entier,p :entier)
VAR
i, j, k : Entier
DEBUT
POUR i de 1 à n FAIRE
POUR j de 1 à p FAIRE
M3[i,j] 0
POUR k de 1 à m FAIRE
M3[i,j] M3[i,j]+M1[i,k]*M2[k,j]
FIN POUR
FIN POUR
FIN POUR

D.Cheriti,I.Daoud & L.Ayedi - 22 -


Algorithmique & Structures de données Travaux Dirigés

FIN

ALGORITHME Somme_Matrice
VAR
N,M,i,j : entier
Mat1: tableau [1..N, 1..M] d’entier
Mat1, Mat2, Mat3 : tableau [1..M, 1..P] d’entier
Mat1, Mat2, Mat3 : tableau [1..N, 1..P] d’entier
DEBUT
REPETER
ECRIRE ("Entrez les dimensions de la matrices M1 : ")
LIRE(N,M)
JUSQU’A (N>0 et M>0)
REPETER
ECRIRE ("Entrez les dimensions de la matrices M2 : ")
LIRE(M,P)
JUSQU’A (P>0 et M>0)
RemplirMat(M1,N,M)
RemplirMat(M2,M,P)
ProdMat(M1,M2,M3,N,M,P)
FIN

Corrigé chaine
Exercice N°14 :
ALGORITHME Recherche_Caractère
VAR
N,M,i,j : entier
MAT : tableau [1..N, 1..M] de caractère
C : car
trouve : Booléen
DEBUT
REPETER
ECRIRE ("Entrez les dimensions de la matrice : ")
LIRE(N,M)
JUSQU’A (N>0 et M>0)
POUR i de 1 à N FAIRE
POUR j de 1 à M FAIRE
ECRIRE("MAT[",i,",",j,"]= ")
LIRE(MAT[i,j])
FIN POUR
FIN POUR
ECRIRE ("Donnez le caractère à rechercher :")
Lire(C)
i1
trouve  FAUX
TANT QUE (i<N et trouve <> VRAI) FAIRE
j1
TANT QUE (j<M et trouve <> VRAI) FAIRE
SI(MAT[i,j]=C) ALORS
TrouveVRAI
SINON
jj+1

D.Cheriti,I.Daoud & L.Ayedi - 23 -


Algorithmique & Structures de données Travaux Dirigés

FIN SI
FIN TANT QUE
ii+1
FIN TANT QUE

FIN
Exercice N°15 :
Pour résoudre ce problème, attachons nous tout d'abord à savoir quelles sont les diagonales
principales et secondaires d'une matrice.
Soit la matrice suivante :

Première
diagonale
Indices de secondaire
ligne et de
colonne
Deuxième
diagonale Diagonale
secondaire principale

On obtient ainsi:
– pour la diagonale principale, i=j et i va de 1 à taille_mat -1 (ici 3)
– pour la première diagonale secondaire, j=i+1 et i va de 1 à taille_mat -2 (ici 2)
– pour la seconde diagonale secondaire, j=i-1 et i va de 2 à taille_mat – 1.
void main()
{
int mat[10][10];
int i,somme=0;
//diagonale principale
for(i=0; i<10; i++) //Dans ce cas j=i
somme = somme + mat[i][i];
//Affichage
printf("La somme des éléments de la diagonale principale est: %d \n"
,somme);
//première diagonale secondaire

somme=0;
for(i=0; i<9; i++) //Dans ce cas j=i+1
somme = somme + mat[i][i+1];
//Affichage
printf("La somme des éléments de la première diagonale secondaire
est : %d \n ",somme);
}
Exercice N°16 :
Q1.
Procédure TrianglePascal(n:Entier; Var T:Mat)
VAR
i, j : Entier
DEBUT

D.Cheriti,I.Daoud & L.Ayedi - 24 -


Algorithmique & Structures de données Travaux Dirigés

(* Initialisation du tableau à zéro *)


POUR i de 1 à n FAIRE
POUR j de 1 à n FAIRE
T[i,j]0
FINPOUR
FINPOUR
(* Remplissage du tableau *)
POUR i de 1 à n FAIRE
T[i,1] 1
POUR j de 2 à i FAIRE
T[i,j]T[i-1,j-1] + T[i-1,j]
FINPOUR
FINPOUR
FIN

D.Cheriti,I.Daoud & L.Ayedi - 25 -


Algorithmique & Structures de données Travaux Dirigés

Exercice N°17 :
Ecrire un algorithme qui lit deux chaînes de caractères CH1 et CH2 et qui copie la
première moitié de CH1 et la première moitié de CH2 dans une troisième chaîne CH3. Afficher
le résultat.
#include <stdio.h>
#include <string.h>
void main()
{
/* Déclarations */
char CH1[100], CH2[100]; /* chaînes données */
char CH3[100]=""; /* chaîne résultat */

/* Saisie des données */


printf("Introduisez la première chaîne de caractères : ");
gets(CH1);
printf("Introduisez la deuxième chaîne de caractères : ");
gets(CH2);

/* Traitements */
strncpy(CH3, CH1, strlen(CH1)/2);
strncat(CH3, CH2, strlen(CH2)/2);
/* Affichage du résultat */
printf("Un demi \"%s\" plus un demi \"%s\" donne \"%s\"\n",
CH1, CH2, CH3);
}
Exercice N°18
Q2.

Algorithme Comptage_Mots
Variables
i, L, nb_mot : Entier
phrase : Chaîne
Début
Ecrire(”Entrer une phrase non vide : ”) L ire(phrase)
LLong(phrase)
nb_mot 1
Pour i de 1 à L Faire
Si(phrase[i] = ” ”) Alors
nb_mot nb_mot + 1
FinSi
FinPour
Ecrire(”Nombre de mots = ”,nb_mot)
Fin.

Q3.
Algorithme Plus_Long_Mot
Variables
i, j, L : Entier
phrase, mot, motpl : Chaîne
Début
Ecrire(”Entrer une phrase : ”) L ire(phrase)
LLong(phrase)
motpl ””
i1
TantQue (i <= L) Faire
mot ””

D.Cheriti,I.Daoud & L.Ayedi - 26 -


Algorithmique & Structures de données Travaux Dirigés

ji
TantQue((j <= L) et (phrase[j] # ” ”)) Faire
mot mot + phrase[j]
jj + 1
FinTQ
Si(long(mot) > long(motpl)) Alors
motpl mot
FinSi
ij + 1
FinTQ
Ecrire(”Le mot le plus long est = ”,motpl)
Fin.

Exercice N°19 :
Ecrire un algorithme qui lit une chaîne de caractère CH. Effacer ensuite toutes les
occurrences du caractère, donné par l’utilisateur, dans CH et tasser les éléments restants.
Afficher la chaîne de caractère résultant.
Exemple:
Introduisez une chaine de caractère : Le réseau informatique
Donnez le caractère à éliminer : e
La chaine résultante est : L résau informatiqu
#include <stdio.h>
void main()
{
/* Déclarations */
int T[50]; /* tableau donné */
int N; /* dimension */
int I,J; /* indices courants */

/* Saisie des données */


printf("Dimension du tableau (max.50) : ");
scanf("%d", &N );
for (I=0; I<N; I++)
{
printf("Element %d : ", I);
scanf("%d", &T[I]);
}
/* Affichage du tableau */
printf("Tableau donne : \n");
for (I=0; I<N; I++)
printf("%d ", T[I]);
printf("\n");
/* Effacer les zéros et comprimer : */
/* Copier tous les éléments de I vers J et */
/* augmenter J pour les éléments non nuls. */
for (I=0, J=0 ; I<N ; I++)
{
T[J] = T[I];
if (T[I]) J++;
}
/* Nouvelle dimension du tableau ! */
N = J;
/* Edition des résultats */
printf("Tableau resultat :\n");
for (I=0; I<N; I++)
printf("%d ", T[I]);

D.Cheriti,I.Daoud & L.Ayedi - 27 -


Algorithmique & Structures de données Travaux Dirigés

printf("\n");
}

Exercice N°20 :
Ecrire un algorithme qui lit un verbe régulier en "er" et qui en affiche la conjugaison au
présent de l'indicatif de ce verbe. Contrôlez s'il s'agit bien d'un verbe en "er" avant de conjuguer.
Exemple :
Verbe fêter : je fête tu fêtes il fête nous fêtons …
#include <stdio.h>
#include <string.h>
void main()
{
/* Déclarations */
char VERB[20]; /* chaîne contenant le verbe */
char AFFI[30]; /* chaîne pour l'affichage */
int L; /* longueur de la chaîne */

/* Saisie des données */


printf("Verbe : ");
gets(VERB);

/* Contrôler s'il s'agit d'un verbe en 'er' */


L=strlen(VERB);
if ((VERB[L-2]!='e') || (VERB[L-1]!='r'))
puts("\aCe n'est pas un verbe du premier groupe.!");
else
{
/* Couper la terminaison 'er'. */
VERB[L-2]='\0';
/* Conjuguer ... */
AFFI[0]='\0';/*initialisation a vide*/
strcat(AFFI, "je ");
strcat(AFFI, VERB);
strcat(AFFI, "e");
puts(AFFI);

AFFI[0]='\0';
strcat(AFFI, "tu ");
strcat(AFFI, VERB);
strcat(AFFI, "es");
puts(AFFI);
....................
AFFI[0]='\0';
strcat(AFFI, "ils ");
strcat(AFFI, VERB);
strcat(AFFI, "ent");
puts(AFFI);
}
}

Exercice N°21 :
Ecrire un programme qui supprime la première occurrence d'une chaîne de caractères
chaine1 dans une chaîne de caractères chaine2.
Exemples: Chaine1 Chaine2 Chaine3
HAM MOHAMED MOED

D.Cheriti,I.Daoud & L.Ayedi - 28 -


Algorithmique & Structures de données Travaux Dirigés

EI ZIED ZIED
T TOTALEMENT OTALEMENT
HELLO HELLO
#include <stdio.h>
void main()
{
/* Declarations */
char chaine1[100]; /* chaine à transformer */
char chaine2[100]; /* chaine à supprimer dans chaine1 */
int I; /* indice courant dans chaine1 */
int J; /* indice courant dans chaine2 */
int TROUVE; /* indicateur logique qui precise */
/* si la chaine chaine2 a ete trouvee */

/* Saisie des donnees */


printf("Introduisez la chaine a supprimer : ");
gets(chaine2);
printf("Introduisez la chaine a transformer : ");
gets(chaine1);
/* Recherche de chaine2 dans chaine1 */
TROUVE=0;
for (I=0; chaine1[I] && !TROUVE; I++)
/* Si la première lettre est identique, */
if (chaine1[I]==chaine2[0])
{
/* alors comparer le reste de la chaine */
for (J=1; chaine2[J] && (chaine2[J]==chaine1[I+J]); J++)
;
if (chaine2[J]=='\0') TROUVE=1;
}
/* Si la position de depart de chaine2 dans chaine1 a ete trouvee */
/* alors deplacer le reste de chaine1 à cette position. */
if (TROUVE)
{
I--;
/* Maintenant I indique la position de chaine2 */
/* dans chaine1 et J indique la longueur de chaine2 */
for (; chaine1[I+J]; I++)
chaine1[I]=chaine1[I+J];
chaine1[I]='\0';
}
/* Affichage du resultat */
printf("Chaine resultat : \"%s\"\n", chaine1);
}

Exercice N°22 :
Ecrire un programme qui remplace la première occurrence d'une chaîne de caractères CH1
par la chaîne CH2 dans une chaîne de caractères DEBUT. Utiliser une chaîne de sauvegarde
FIN pendant le remplacement.
Exemples: CH1 CH2 DEBUT FIN
HAM DF MOHAMED MODFED
IE EI ZIED ZEID
IE ARTE PIERRE PARTERRE
EI IE ZIED ZIED
TOT FIN TOTALEMENT FINALEMENT

D.Cheriti,I.Daoud & L.Ayedi - 29 -


Algorithmique & Structures de données Travaux Dirigés

TTT HELLO HELLO


#include <stdio.h>
void main()
{
/* Declarations */
char chaine1[100]; /* chaine à transformer */
char chaine2[100]; /* chaine à supprimer dans chaine1 */
int I; /* indice courant dans chaine1 */
int J; /* indice courant dans chaine2 */
int TROUVE; /* indicateur logique qui precise */
/* si la chaine chaine2 a ete trouvee */

/* Saisie des donnees */


printf("Introduisez la chaine a supprimer : ");
gets(chaine2);
printf("Introduisez la chaine a transformer : ");
gets(chaine1);
/* Recherche de chaine2 dans chaine1 */
TROUVE=0;
for (I=0; chaine1[I] && !TROUVE; I++)
/* Si la première lettre est identique, */
if (chaine1[I]==chaine2[0])
{
/* alors comparer le reste de la chaine */
for (J=1; chaine2[J] && (chaine2[J]==chaine1[I+J]); J++)
;
if (chaine2[J]=='\0') TROUVE=1;
}
/* Si la position de depart de chaine2 dans chaine1 a ete trouvee */
/* alors deplacer le reste de chaine1 à cette position. */
if (TROUVE)
{
I--;
/* Maintenant I indique la position de chaine2 */
/* dans chaine1 et J indique la longueur de chaine2 */
for (; chaine1[I+J]; I++)
chaine1[I]=chaine1[I+J];
chaine1[I]='\0';
}
/* Affichage du resultat */
printf("Chaine resultat : \"%s\"\n", chaine1);
}

D.Cheriti,I.Daoud & L.Ayedi - 30 -

Vous aimerez peut-être aussi