Académique Documents
Professionnel Documents
Culture Documents
Premire
partie
Page 1
Exercice1:
Analyser le programme suivant:
void main()
{
int a[10], *pa, x;
a[0] = 11; a[1] =22; a[2] = 33; a[3] = 44;
pa = &a[0];
x = *pa;
pa++;
x = *pa;
x = *pa + 1;
x = *(pa + 1);
x = *++pa;
x = ++*pa;
x = *pa++;
}
Exercice2:
Interprter les instructions suivantes:
char *pc;
int *pi,*pj,*pk;
float *pr;
pc = (char*)malloc(10);
pi = (int*)malloc(16);
pr = (float*)malloc(24);
pj = (int*)malloc(sizeof(int));
Page 2
Exercice 7 :
On se donne une structure livre :
typedef struct livre {
char titre[20];
int cote;
int prix;
} Livre;
On veut crer une bibliothque de plusieurs livres, sous la forme dun tableau de livres.
1) crire une fonction init qui renvoie un tableau de n livres, qui alloue la mmoire ncessaire et qui
initialise les champs 0 ou la chane de caractres vide.
2) crire une fonction qui permet la saisie dun livre.
2) crire une fonction qui affiche un tableau de n livres.
4) crire une fonction qui fait lchange des livres dindice i et j dans le tableau de livres.
Page 3
Srie 2: La rcursivit
Exercice 1 :
crire une fonction rcursive qui permet de calculer la factorielle d'un entier positif.
Exercice 2 :
crire une fonction rcursive qui permet de calculer la somme des n (n 0) premiers termes ( partir
de 1 jusqu n).
Exercice 3 :
crire une fonction rcursive qui permet de calculer les nombres de "Fibonacci" qui sont dfinis par :
Fibonacci (0) = 0,
Fibonacci (1) = 1,
et pour tout n > 1, Fibonacci (n) = Fibonacci (n-1) + Fibonacci (n-2)
Exercice 4 :
crire une fonction rcursive qui permet de calculer le plus grand diviseur commun de deux entiers
naturels strictement positifs.
Exercice 5 :
crire une fonction rcursive qui permet de calculer la valeur de la fonction dAckermann dfinie de la
manire suivante pour m 0 et n 0 :
Page 4
Exercice 6 :
Il sagit de calculer la somme des entiers allant de 0 un entier donn N et qui ont la mme parit
que N. Par exemple,
Pour la valeur 6, la fonction doit rendre la valeur 12. (6+4+2+0 = 12)
Pour la valeur 5, la fonction doit rendre la valeur 9. (5+3+1 = 9)
a) crire une fonction itrative permettant de rsoudre ce problme.
b) Rsoudre le mme problme par une fonction rcursive.
Exercice 7 :
Ecrire une fonction rcursive qui teste si un nombre positif n est un multiple de 5.
Exercice 8
On souhaite crire une fonction calculant la division par 2 d'un entier sans utiliser l'oprateur / mais
seulement les oprateurs + et -. Pour cela on remarque la proprit suivante :
Page 5
Exercice 11 :
crire une fonction rcursive qui permet de dire si un mot donn est un palindrome ou pas.
Exercice 12 :
crire une fonction rcursive qui retourne la valeur numrique dune sous chane de taille nbr dune
chane de caractres compose de chiffres. (Exemple : a = valeurNumerique("5123",3) a =512)
Exercice 13 :
crire une fonction rcursive qui compte le nombre doccurrences dun entier dans un tableau dentiers.
Exercice 14 :
crire une fonction rcursive qui permet dinverser un tableau dentiers
Page 6
Exercice 1 : Ecrire le code de fichier ELTDBL.H qui permet de dclarer le type double comme
structure de donnes adopte.
a) Ecrire le code de fichier ELSDD.H qui permet de choisir le type double comme structure de
donnes.
b) Ecrire le code de fichier ELTDBL.C qui permet de dfinir les primitives pour une ralisation
par des doubles de TDA ELEMENT.
c) Ecrire une fonction qui renvoie la position de la premire occurrence dun lment dans une
liste de doubles. Cette fonction renvoie 0 si llment est inexistant.
d) Ecrire une fonction qui renvoie la moyenne de valeurs dune liste de doubles.
e) Ecrire une fonction qui permet de trier une liste de doubles en ordre croissant.
Exercice 2 :
a) Ecrire le code de fichier ELTSTR.H qui permet de dclarer le type string (chaine de
caractres) comme structure de donnes adopte.
b) Ecrire le code de fichier ELSDD.H qui permet de choisir le type string comme structure de
donnes.
c) Ecrire le code de fichier ELTSTR.C qui permet de dfinir les primitives pour une ralisation
par des strings de TDA ELEMENT.
d) Ecrire un programme qui lit des chanes de caractres sur l'entre standard. A la rencontre de
la chane "la", il affichera la liste des chanes dj saisies. A la rencontre de la chane "li", il
affichera cette liste dans l'ordre inverse.
Exercice 3 :
criture d'un programme interactif de gestion des tudiants. Ce programme affichera le menu suivant :
1 Ajout dun tudiant.
2 Recherche dun tudiant.
3 Suppression dun tudiant.
4 Tri de liste des tudiants.
5 Affichage de liste des tudiants.
Page 7
Page 8
Exercice 1 :
On suppose quon dispose des fichiers ELTDBL.H et ELTDBL.C implments dans lexercice 1 de la srie
3.
Dans cet exercice, on sintresse traiter une liste simplement chane de rels.
1) Ecrire une fonction MinMax qui permet de calculer le min et le max dans une liste chane de rels.
2) Ecrire une fonction MoyProd qui permet de calculer la moyenne et le produit dune liste chane de
rels.
3) Ecrire une fonction qui permet dinverser une liste de rels.
4) Ecrire une fonction qui permet de fusionner deux chanes de rels une position donne.
Exercice 2 :
Un livre est caractris par :
1) son numro (entier)
2) son titre (chane de caractre)
3) son auteur (chane de caractre)
4) son diteur (chane de caractre)
5) son prix (rel)
1) Ecrire le fichier ELTLVR.H qui dfinit un livre comme tant une implmentation du TDA ELEMENT,
sachant quon veut stocker les livres indirectement.
2) Ecrire le fichier ELTLVR.C
3) Ecrire une fonction qui permet de retourner le nombre dexemplaires dun livre donn.
4) Ecrire une fonction qui permet de calculer le nombre de livres dun diteur donn.
5) Ecrire une fonction qui permet de retourner un tableau de livre dun auteur donn.
6) Ecrire une fonction qui retourne le livre le plus cher.
7) Ecrire une fonction qui permet de calculer la valeur de la bibliothque (somme des prix des
livres).
Page 9
Exercice 3 :
Un abonn est caractris par :
- son numro
- son nom
- sa ville
1) Ecrire le fichier ELTABN.H qui dfinit un abonn comme tant une implmentation du TDA ELEMENT,
sachant quon veut stocker les abonns indirectement.
2) Ecrire le fichier ELTABN.C
3) Ecrire une fonction qui permet de vrifier sil existe dans la liste un abonn dont le nom est N et la
ville est V.
4) Ecrire une fonction qui permet de calculer le nombre dabonns dune ville donne.
5) Ecrire une fonction qui permet de retourner un tableau des villes distinctes des abonns.
6) Ecrire une fonction qui retourne un tableau dabonn dune ville donne.
Page 10
Exercice1:
1) Excuter manuellement lvaluation ds expressions postfixes suivantes :
a) 6 5 2 3 + 8 * + 3 + *
b) 6 3 2 - 1 + / 9 6 - *
Exercice 2:
Exercice 3:
En reprenant les mme hypothses que lexercice prcdent, crire le programme correspondant
lvaluation dune expression prfixe (exemple -*36+25)
Exercice 4:
Page 11
Exercice 5:
En se basant sur les hypothses de lexercice prcdent, crire un programme permettant d
transformer une expression infixe en une expression infixe
Rappelons qu il faut quil y ait toujours un sparateur (espace) entre les entiers, les oprateurs et aussi
les parenthses ( et ).
Page 12
Exercice 1
a) Ecrire une fonction ARBIN creerArbreEntiers() qui permet de crer et de renvoyer
larbre dentiers suivant :
b) Ecrire une fonction int feuilles(ARBIN a) qui permet de compter le nombre de
feuilles dun arbre.
c) Ecrire une fonction void inverserArbre(ARBIN a) qui permet dinverser un arbre
dentiers (fils gauche devient fils droit et vice versa).
Exercice 2
Procdure FileArbre (A : ArbreBinaire)
F : File de noeuds dun arbre binaire
P : Noeud dun arbre binaire
Dbut
Initialiser(F) // Cration dune file vide
Enfiler(F, A->refRacine)
Tantque NonVide(F) Faire
P<-Dfiler(F)
Afficher(P->Info)
Si P->FG != NULL Alors Enfiler(F, P->FG) Finsi
Si P->FD != NULL Alors Enfiler(F, P->FD) Finsi
Fin Tantque
Fin
En utilisant la procdure FileArbre, donner l'ordre d'affichage des noeuds de l'arbre ci-dessous
Page 13
Exercice 3
Dans cet exercice, on se propose de traiter des arbres binaires partiellement quilibrs en utilisant le
type
arbre binaire ARBIN. Un arbre binaire est dit partiellement quilibr sil est vide ou si pour chaque
noeud de
larbre les hauteurs de ses sous arbres gauches et droits diffrent de au plus 1.
a) En utilisant les primitives dun arbre binaire (ARBIN), crire une fonctions rcursive int
equilibre(ARBIN a)
qui retourne 1 (vrai) si larbre a satisfait la dfinition dun arbre binaire partiellement quilibr et 0
(faux)
sinon.
Soit un arbre binaire a manipulant des lments nomms CarHauteur. Un lment CarHauteur est
dclar
dans le fichier ELTCARHAUT.H comme suit :
typedef struct {
char car ;
int hauteur ;
} CarHauteur, * ELEMENT ;
b) Ecrire une fonctions rcursive void calculerHauteurs(ARBIN a) qui prend en argument un arbre
binaire de
ce type. Cette fonction modifie larbre en entre en mettant jour le champ hauteur de chaque noeud
de
faon ce quil contienne la hauteur du sous arbre dont il est la racine.
Page 14
Page 15
Page 16
f) Ecrire une fonction itrative int tasInserer(TAS t, ELEMENT e) qui permet dinsrer un lment e un
tas t.
En supposant que la fonction NOEUDTAS dernierPere(TAS t) qui retourne le pre de e est donne.
Dans
lexemple prcdant la fonction dernierPere() retourne le noeud contenant 8. La complexit
temporelle de
cette fonction est de O(N), N tant la taille de larbre.
g) Donner la complexit temporelle de cet algorithme avec une brve explication.
Suppression du minimum dun tas (la racine)
h) Ecrire une fonction itrative ELEMENT supprimerMin(TAS t) qui permet de supprimer le minimum du
tas
courant et retournant la valeur de ce minimum, en utilisant la reprsentation contigu. Lide est de
supprimer la dernire feuille du dernier niveau aprs avoir recopi son information la racine, puis,
pour respecter la structure de tas, de faire redescendre cette valeur en la comparant au contenu de
ses fils, par un processus inverse de celui de linsertion. La figure suivante illustre ce processus dans le
cas de lexemple.
Page 17
Page 18
La structure arbre lexicographique peut tre implmente par un arbre binaire dont les lments sont
de caractres (ELTCAR.H et ELTCAR.C).
a) Donner la trace dexcution de la fonction f suivante :
public void f (ARBIN a) {
char mot[20] ;
g (a->refRacine, mot,0);
}
void g (NOEUD n, char m[], int i) {
if (n != NULL) {
if (n->info == *) {
m[i] = \0;
printf(%s, m);
} else {
m[i] = n->info;
g (n->fd, m, i + 1);
}
g (n->fg, m, i);
}
Page 19
Page 20
Deuxime
partie
Devoirs surveills
Page 21
Page 22
Page 23
void Reduction(POLYNOME P)
{
NOEUD p=L->tete,q,s;
int i=1;
while (p!=NULL)
{
s=p;
q=p->suivant;
while(q!=NULL)
{
if((q->puissance == (p->puissance)
{
p->coefficient+=q-> coefficient;
s->suivant=q->suivant;
noeudDetruire(q) ;
L->lg--;
q=s->suivant ;
}
else
{ q=q->suivant;
Page 24
5)Quels sont les modifications ncessaires pour avoir une liste chaine circulaire de monmes. (2 points)
Si quelquun a compris lide que pour une liste circulaire chaine la queue doit pointer sur la tte, il
peut avoir les 2 pts du barme.
Page 25
On veut dfinir un nouveau type abstrait : MATRICE sans avoir recours au TDA LISTE
On suppose quon dispose des fichiers ELTINT.H et ELTINT.C implments qui permettent de raliser le
TDA ELEMENT par un entier et du fichier MATPRIM.H qui dfinit les primitives du TDA MATRICE.
Les oprations de base sont : la cration dune matrice, lajout et la suppression dune ligne ou dune
colonne et laccs un lment de la matrice.
MATRICE CreeMatrice();
Int InsererLigne(MATRICE,int)
Int InsererColonne(MATRICE,int)
Int SupprimerLigne(MATRICE,int)
Int SupprimerColonne(MATRICE,int)
Element Rcuperer(MATRICE , Int, int)
1. Ecrire le fichier MATPTR.H qui dfinit une matrice simplement chaine comme tant une
implmentation du TDA MATRICE (Il vous faudra galement dfinir NOEUD) (3 points)
Page 26
ime
2)Ecrire une fonction int Supprimer (MATRICE M, int k) qui permet de supprimer la k ligne de la
matrice. Cette fonction retourne 1 si lopration de suppression a t effectue avec suces, 0 sinon. (9
points)
supprimer (MATRICE M, int k )
{
int i, succee=1;
NOEUD p, q,n;
if (estVide(M))
{
printf ("\nMatrice vide");
succee=0;
}
else
{
if ((k < 1) || (k> M->NL))
{
printf ("\nPosition invalide");
succee=0;
}
Page 27
Page 28
Page 29
Page 30
La structure Dictionnaire est dfinie par une liste doublement chane de dfinitions.
1. Ecrire le code du fichier ELTMOT.H qui permet de raliser le TDA ELEMENT pour une structure
MOT (en stockage indirect).
2. Ecrire le code du fichier ELTMOT.C qui permet de dfinir les primitives de TDA ELEMENT.
3. Ecrire une fonction InsererDef qui permet d'ajouter une explication pour un mot donn dans le
dictionnaire sil existe.
4. Ecrire une procdure DefinitionMOT qui donne le nombre et les explications dune chane
donne.
1.
2 pts
#ifndef _ELTMOT_H
#define _ELTMOT_H
typedef struct{
char chaine [100];
char explications [100][100];
int nbre;
}mot, *ELEMENT;
#endif
2.
8 pts
#include "ELTPRIM.h"
1 ELEMENT elementCreer(void)
{
ELEMENT e;
e=(ELEMENT)malloc(sizeof(mot));
return e;
Page 31
free (e);
2 void elementLire(ELEMENT * e)
{
int i;
printf("donner un mot:\n");
scanf("%s",&(*e)->chaine);
do{
}while((*e)->nbre<=0);
for(i=0; i<(*e)->nbre; i++)
{
}
1,5 void elementAfficher(ELEMENT e)
{
int i;
printf("le mot est: %s\n", e->chaine);
printf("les definitions donnees pour ce mot sont:\n");
for(i=0; i<e->nbre; i++)
printf("explication N %d: %s \n", i+1, e->explications[i]);
}
0,5 void elementAffecter(ELEMENT * e1, ELEMENT e2)
{
*e1=e2;
int i;
strcpy((*e1)->chaine, e2->chaine);
(*e1)->nbre=e2->nbre;
for(i=0; i<(*e1)->nbre; i++)
strcpy((*e1)->explications[i], e2->explications[i]);
}
0,5 int elementComparer(ELEMENT e1, ELEMENT e2)
Page 32
5 pts
#include "LSTPRIM.h"
int InsererDef(LISTE l, ELEMENT e, char expli [])
{
printf("liste vide\n");
return 0;
}
else
{
if (elementComparer(p->info, e) == 0)
{
taille=p->info->nbre;
strcpy(p->info->explications[taille],expli);
p->info->nbre++;
trouve=1;
}
else
p=p->suivant;
}
}
return trouve;
}
4.
5 pts
int i;
NOEUD p=l->tete;
int trouve=0;
if (estVide(l))
printf("liste vide\n");
else
{
if (strcmp(p->info->chaine, chaine) == 0)
{
Page 33
Page 34
Troisime
partie
Page 35
Remarque : Vous pouvez utiliser toutes les fonctionnalits du TDA File, par contre pour les arbres seule
la structure peut tre utilise (toute autre fonctionnalit doit tre programme).
void ABRFile(ARBIN a, int O, FILE F) {
AjouterNoeud (a->refRacine, F, O);
}
===================================
void AjouterNoeud(NOEUD n, FILE F, int O)
{
Page 36
2) Afin dvaluer lexpression arithmtique obtenue dans F, quelle est la (ou les meilleurs) valeur de O
quil faut choisir. Justifier votre rponse
Les expressions prfixes et postfixes ont lavantage que lordre de priorit est dtermin par leur
position dans ces expressions.
Les expressions prfixes et postfixes peuvent tre facilement values en utilisant les piles.
Page 37
3) Supposons que O=1, donner les diffrentes tapes qui permettent dvaluer
F= * + 5 6 - -4 9 en utilisant une pile P ( chaque tape prciser le contenu de P et celui de F)
Exercice 2 (8 points):
Page 38
2) Donner la complexit temporelle et spatiale d'un algorithme qui appelle la fonction rotation m fois
sur une pile qui contient n lments
Complexite temporelle O(nm) spatiale O(n)
Page 39
Rfrences
http://www.montefiore.ulg.ac.be/~geurts/Cours/sda/2011/01-intro.pdf
R. Malgouyres, F. Feschet, Z. Zrour. Algorithmique et structures de donnes en C
2011.
Page 40