Lic2 S3 TD PDF
Lic2 S3 TD PDF
Lic2 S3 TD PDF
Exercice 2
1- Ecrire une fonction nomme f1 se contentant dafficher Vive linformatique (elle ne
possdera aucun argument ni valeur de retour) .
2- Ecrire une fonction nomme f2 qui affiche Vive linformatique un nombre de fois gal
la valeur reue en argument ( int ) et qui ne renvoie aucune valeur.
3- Ecrire une fonction nomme f3 qui fait la mme chose que f2 mais qui de plus renvoie la
valeur (int ) 1 si largument est strictement positif et 0 sinon . .
4- Ecrire un petit programme appelant successivement chacune de ces 3 fonctions aprs les
avoir convenablement dclares sous forme dun prototype.
Exercice 3
1- Ecrire une fonction qui reoit 3 arguments (2 nombres rels et un caractre) et qui fournit
un rsultat correspondant lune des 4 oprations appliques ses deux premiers
arguments en fonction de la valeur du dernier : + - * / .
2- Que faut-il faire pour tenir compte des risques de division par zro.
3- Ecrire un petit programme ( main ) utilisant cette fonction pour effectuer les 4 oprations
sur 2 nombres fournis en entre.
Exercice 4
1. Dfinir un type tableau de MAX rels (Tmax) o MAX est une constante.
2. Ecrire la fonction de lecture dun tableau t de nb valeurs relles ( nb suppos connu ).
void lect1 ( Tmax t , int nb )
3. Ecrire une autre fonction de lecture du tableau t o nb est lire aussi.
int lect2 ( Tmax t )
4. Ecrire une fonction daffichage des N valeurs du tableau en mettant 10 valeurs par
ligne avec 2 digits dcimaux ( cf poly une introduction au C)
void affich ( Tmax t, int n )
5. Ecrire une fonction tri de tri des valeurs du tableau ( ordre croissant) .
void tri ( Tmax t , int nb )
UVHC-ISTV
Exercice 2
1- Dfinir un type Chaine de caractres.
2- Ecrire une fonction length qui calcule la longueur dune chane ch.
3- Ecrire une fonction logique egal qui compare 2 chanes de caractres ch1 et ch2.
int egal ( Chaine ch1 , Chaine ch2 )
4- Ecrire une fonction concat qui recopie la chane ch2 la suite de la chane ch1 dans une nouvelle
chane ch3 ( attention de bien reconstituer correctement la chane finale avec le caractre de fin
\0)
void concat ( Chaine ch1 , Chaine ch2 , Chaine ch3 )
5- Ecrire le programme principal
Nom
Paris
Capitale
550000
superficie
64.5
habitants
euro
monnaie
Exercice 4 facultatif
Ecrire un sous-programme qui fusionne deux tableaux tris dentiers ayant n1 et n2 valeurs en un
troisime de taille calculer.
main ( ) {
}
1) Saisir sous diteur puis dans la fentre Terminal lister ( ls ) et compiler ( cc ).
cc -o tp1_ex1 tp1_ex1.c
2) Sil ny a pas derreurs, excuter ce programme pour diffrentes valeurs de n
./tp1_ex1
3) Saisir la fonction suivante et modifier le programme principal pour la tester.
int egal ( char c1 [ ], char c2 [ ])
{
int i =0, tmp=1 ;
while ( tmp && c1[ i ] != \0 )
if (c1[i] !=c2[i] ) tmp =0 ; else i++ ;
return tmp && c1[i] == c2[i];
}
4) Excuter plusieurs fois le programme avec diffrentes chanes.
5) Modifier le programme en introduisant une boucle POUR de 3 rptitions.
6) Rajouter la fonction concat vue en TD 2 et complter le programme.
Exercice 2
Soient 2 tableaux a et b de type Tab (tableau de MAX entiers) dclars ainsi : Tab a , b ;
1. Ecrire les 2 fonctions permettant de recopier, dans b, tous les lments positifs de a,
en compltant ventuellement a par des zros :
cas 1 : les lments restent la mme place
cas 2 : les zros sont mis la fin du tableau.
2. Aprs avoir crit deux sous-programmes de lecture et affichage, tester ces deux fonctions.
3. Ecrire un sous-programme qui fusionne deux tableaux tris dentiers ayant n1 et n2 valeurs
en un troisime de taille calculer et retourner.
4. Complter la fonction principale qui permettra de lire deux tableaux, les fusionner et les
afficher.
UVHC-ISTV
Ecrire un sous-programme qui fusionne deux tableaux tris dentiers ayant n1 et n2 valeurs en
un troisime de taille calculer.
void fusion ( Tab a, int na, Tab b, int nb, Tab c, int * nc)
Ecrire un sous-programme qui fusionne deux tableaux tris de caractres (chanes) en un
troisime
void fusion2 ( char * a, char * b, char *c )
Une intervention est dfinie par un numro dun intervenant (qui travaille dans le garage), une date de
dbut et une date de fin, et le prix de la main duvre ainsi que celui des pices de rechange et enfin
par le kilomtrage de la voiture au moment de lintervention. La liste des interventions est dfinie par
le type DesInterventions :
TYPE DesInterventions =
ENREGISTREMENT
Nb: entier;
Contenu: tableau[MAXINTERVENTIONS]de Intervention Fin ;
UVHC-ISTV
Fiche de TD 4 d'Informatique-algorithmique
Exercice 1 : Fonction puissance
1) Ecrire la fonction rcursive qui renvoie la valeur de an avec a rel et n entier strictement
positif.
2) Modifier la fonction pour prendre en compte galement les valeurs ngatives ou nulles de n.
TP dAlgorithmique et Programmation N 3
Exercice 1 : La rcursivit sur les chanes
Reprendre lexrecice 1 du TP 1 ( ou ex 1 du TP 2) et remplacer, dans les fonctions,
systmatiquement la solution itrative par une solution rcursive.
UVHC-ISTV
Fiche de TD 5 d'Informatique-algorithmique
Exercice 1 : Fichier binaire de structures
1)
2)
3)
4)
5)
Dfinir une structure tudiant comprenant un code entier,un nom, un prnom et une note.
Ecrire la fonction de cration du fichier binaire avec un tudiant.
Ecrire la fonction dajout en fin de fichier.
Ecrire une fonction rcursive de calcul du nombre dtudiants.
Donner une solution itrative.
TP dAlgorithmique et Programmation N 4
Exercice 1 Fichier de voitures (suite du TP 2 )
1) Ecrire une fonction permettant de sauvegarder un tableau de voitures dans un fichier
2) Ecrire une fonction permettant de transfrer dans un tableau de voitures le fichier.
3) Complter le programme principal pour prendre en compte ces deux nouvelles
procdures.
UVHC-ISTV
2) Ecrire deux fonctions (f1 rcursive et f2 itrative) qui recherchent lexistence de lentier c
dans un tableau e, suppos non tri, de type Vec ayant n valeurs. Les deux fonctions
retourneront le nombre de comparaisons (ou nombre dappels rcursifs) pour obtenir la
rponse.
3) Ecrire deux fonctions rcursives f3 et f4 qui recherchent lexistence de lentier c dans un
tableau e tri (ordre croissant) de type Vec ayant n valeurs : f3 recherche squentielle et f4
recherche dichotomique. Les deux fonctions retourneront le nombre de comparaisons
(nombre dappels rcursifs) pour obtenir la rponse.
4) Peut-on conclure ?
Exercice 2 : Recherche du PGCD de a et b ( a <= b)
p1 ( a, b ) = a si a | b sinon p1 ( a 1, b)
p2 ( a, b ) = a si a = b sinon si a < (ba) alors p2 ( a, b- a ) sinon p2 ( b - a, a )
p3 ( a, b ) = a si a | b sinon si a < (ba) alors p3 ( a, b- a ) sinon p3 ( b - a, a )
p4 ( a, b ) = b si a = 0 sinon p4 ( b mod a, a )
1) Ecrire ces quatre fonctions rcursives en renvoyant le nombre dappels rcursifs avant
darriver la solution.
2) Ecrire le programme principal, qui pour b [ 981, 1000 ] et pour a [ 2, b ] calcule le
nombre moyen et le nombre max dappels rcursifs pour chaque fonction.
3) Peut-on conclure ?
UVHC-ISTV
Fiche de TD 6 d'Informatique-algorithmique
Exercice 1 :
Exercice 3 : complexit
int f ( int n )
{
int i = 1, j, s = 0 , m = n;
while ( i < n )
{
j = 1 ; while ( j < m )
{ j++;s = s + i * j;}
i ++ ;
}
return s;
}
1 Evaluer la complexit exacte de cet algorithme en termes de nombre ditrations puis son ordre
de grandeur.
2 Idem avec le nombre de multiplications.
3 Idem avec le nombre dadditions et multiplications.
4 Transformer lalgorithme en remplaant les boucles while par des for. Rvaluer la complexit
dans ce cas.
5 Donner une solution rcursive de f en gardant une boucle.
Donner une solution rcursive en supprimant les 2 boucles
UVHC-ISTV
Fiche de TP d'Informatique-algorithmique 6
Exercice 1
int max ( int t [ ] , int n , int * p )
{
*p++;
if (n ==0 || t[max (t, n-1,p)] < t[n])
else
}
return n;
return max ( t, n-1,p);
Exercice 2
int f ( int n ) { int i = 1, j , s = 0 ;
while ( i < n )
j = 1;
while ( j < n ) {
i ++ ;
s = s + i * j ; j ++; }
}
return s;
}
1) Ajouter deux compteurs calculant le nombre dadditions et multiplications. Tester.
2) Transformer f en une solution rcursive en supprimant le premier TQ et en gardant le
second et en introduisant un paramtre supplmentaire i.
3) Ajouter deux paramtres rsultat pour retourner les deux compteurs. Tester.
4) Transformer j = 1 ; while ( j < n ){ s = s + i *j ; j ++ ; } en une fonction itrative g et
modifier f. Tester.
Exercice facultatif 3
On dsire calculer le nombre C n dfini pour tout n entier naturel comme suit :
C n = [ C n- k + Cn-k+1 + Cn-k+2 + . . . + C n-1 ]
et Cn = n si n <= k
1) Ecrire une fonction rcursive calc1 ralisant ce calcul :
int calc1 ( int n, int k )
2) Ecrire le programme principal permettant de calculer C n pour n et k lus.
3) Lopration fondamentale tant laddition, modifier la fonction en ajoutant un paramtre
rsultat permettant de compter le nombre dadditions et ainsi de calculer la complexit
pour n variant de k k+10. Quen dduire ?
4) Ecrire en C une fonction rcursive calc2 qui fournit la valeur de Cn en mmorisant la suite
des k valeurs prcdentes dans un tableau
int calc2 ( int n , int k, int c [ ] )
5) Modifier la fonction pour calculer la complexit de calc2 pour n variant de k k+10.
UVHC-ISTV
Fiche de TD 7 d'Informatique-algorithmique
Exercice 1 Recherche dichotomique
int dicho ( Tab e , int c, int g ,int d )
{ int m = (g+d) / 2 ; if (g <= d ) if (c == e[m] ) return m ;
else if ( c < e[m] ) return dicho (e, c, g, m-1);
else return dicho ( e, c, m+1, d);
else return -1 ;
}
UVHC-ISTV
Fiche de TD 8 d'Informatique-algorithmique
Exercices sur le TRI
1. QUICKSORT
int partition ( Tab t, int i, int j, Element piv )
{
int g = i , d = j ;
do
{
perm ( & t [ g ], & t [ d ] ) ;
while ( t [ g ] < piv ) g = g+1;
while ( t [ d ] > piv ) d = d - 1;
} while ( g < d );
return g ;
}
int p2 ( Tab t, int i, int j, Element piv)
{
if ( i > j ) return i;
else if ( t[i] < piv ) return p2 (t, i+1, j, piv);
else
if (t[j] >= piv)
1.1 Drouler lalgorithme partition sur lexemple suivant de tableau ayant 10 valeurs avec pivot=10 :
3 17 9 15 2 7 10 8 12 11 qui devient 3 8 9 7 2 10 15 17 12 11
Quelle est la valeur renvoye par partition ?
1.2 Que se passe-t-il avec une autre valeur de pivot (exemple 3 ou 17 ou 2 ) ?
1.3 Quelle est la complexit de partition en nombre de comparaisons dans le pire et le meilleur des cas ?
1.4 Quelle est la complexit de partition en nombre de permutations dans le pire et le meilleur des cas ?
1.5 Comment transformer partition en partition2 pour que la valeur du pivot se trouve au point de csure ?
1.6 Drouler p2 sur le mme exemple de tableau. La fonction p2 fait-elle la mme chose que partition ?
1.7 Comment transformer p2 pour avoir le mme rsultat quen 1.3 ?
2. HEAPSORT
void ajouter (Tab t, int p )
{
int i=p;
while (i>0 && t[i] <t[ (i-1)/2] )
{
perm (&t[i], &t[ (i-1)/2]);
i= (i-1)/2;
}
}
void detruire ( Tab t, int p)
{
int i =0, j;
t[0] = t[p];
while ( i <= p/2 )
{
if (2*i == p-2 || t[2*i+1]< t[2*i+2]) j = 2*i+1 ;
else j = 2*i+2 ;
if ( t[i] > t[j] )
{
perm ( &t[i], &t[j] ) ;
i=j;
}
else
exit ;
}
}
void heapsort ( Tab t, int n ) {
int
p = 1 , min ;
while ( p < n ){ ajouter ( t, p ) ; p++ ; }
p= n-1;
while ( p >= 0 ) { min= t[0]; detruire ( t, p );
t[p] = min;
p-- ;
}
2.1 Drouler la 1re boucle de lalgorithme heapsort sur lexemple suivant de tableau ayant 10 valeurs :
3 17 9 15 2 7 10 8 12 11
qui devient
2 3 7 8 11 9 10 17 12 15
2.2 En supposant que ce tableau est la reprsentation dun arbre binaire parfait, reconstruire larbre binaire
parfait pour les 2 tableaux prcdents. Chaque arbre est-il un tas ?
2.3 Drouler lalgorithme detruire sur lexemple suivant de tableau ayant 10 valeurs avec p=9:
2 3 7 8 11 9 10 17 12 15
qui devient
3 8 7 12 11 9 10 17 15 15
2.4 Drouler la 2me boucle de lalgorithme heapsort sur lexemple suivant de tableau ayant 10 valeurs :
2 3 7 8 11 9 10 17 12 15
qui devient
17 15 12 11 10 9 8 7 3 2
UVHC-ISTV
Fiche de TP d'Informatique-algorithmique 7
Exercice 1 : tri Shell
Cest une variante amliore de la mthode de tri par insertion squentielle .
Au lieu dinsrer chaque lment sa place dans la sous-liste trie de tous les lments
qui le prcdent, on linsre dans une sous-liste dlments qui le prcdent, distants dun
certain incrment incr, que lon diminue au cours de passages successifs sur la liste. Cest
pourquoi on appelle parfois cette mthode, tri par incrments dcroissants.
Au premier passage, on forme des sous-listes dlments distants de n/2 que lon trie
sparment par insertion. Au deuxime passage, on forme des sous-listes dlments distants
de n/4 que lon trie sparment, et ainsi de suite. A chaque passage, lincrment est divis par
2. Le tri sarrte lorsque lincrment est nul.
void trishell ( Tab t, int n, int incr) { int i; if ( incr > 0 )
{ for ( i = incr ; i < n ; i++) inserer (t, i - incr, incr ) ;
trishell ( t, n, incr/2) ; }
1)
2)
3)
4)
5)
Ecrire la procdure qui permet dinsrer t [i - incr] sa place dans le tableau t entre le
dbut et i-incr . Ajouter des compteurs de nombres de comparaisons et de permutations.
Ajouter un appel dune procdure daffichage du tableau pour voir lvolution de ce
tableau.
Ecrire le programme principal qui va faire appel la procdure trishell.
Illustrer le droulement de la procdure avec n=11 et t = [ 5 12 25 38 20 7 9 23 5 4 8 ].
Drcursiver (ou proposer une solution itrative pour ) trishell.
5
3
9 7 6
2) Vrifier que la fonction algo2 fait des oprations diffrentes pour arriver au mme rsultat sur
lexemple.
3) Calculer la complexit en nombre de comparaisons pour algo1.
4) On peut voir sur lexemple prcdent que cet algorithme effectue des parcours sans change. Une
premire amlioration consiste viter ces parcours inutiles. Modifier algo1 en introduisant un
boolen et en modifiant POUR en TQ. Calculer la nouvelle complexit de algo1 dans le meilleur
des cas et dans le pire des cas.
5) On peut aussi mmoriser le plus grand indice (ou le plus petit) partir duquel les changes ne se
font plus, cest--dire lindice en dessous (ou au-dessus) duquel la liste est trie. Par exemple
8 5 2 6 4
Modifier algo1 en ajoutant une variable entire supplmentaire. Comment se modifie la complexit ?
6) Enfin on remarquera une certaine dissymtrie dans lexcution de lalgorithme sur les 2 listes
suivantes : 6
5
4
2
8
et
2
8
6
5
4
Dans les deux cas, un seul lment nest pas sa place, mais la complexit nest pas la mme :
calculer la pour algo1 et algo2 .
Pour remdier cet inconvnient, il faut alterner la direction des parcours conscutifs.
Ecrire une procdure algo3, base sur le principe de algo1, qui prenne en compte ces amliorations.
if (t[j]>t[j+1]) perm(&t[j+1],&t[j]);
}
void bulle2( Tab t, int n, int i, int j)
{
if ( i<n-1 )
{
if ( t[j]>t[ j+1] ) perm(&t[j+1],&t[j]);
if (j>i) bulle2(t,n,i,j-1); else bulle2(t,n,i+1,n-1);
}
1) Les 2 fonctions prcdentes vues en cours effectuent un tri bulles : illustrer leur droulement sur
Une premire amlioration consiste viter ces parcours inutiles. Modifier la fonction bulle1 en
introduisant un boolen. Calculer la nouvelle complexit de bulle1 dans le meilleur des cas et dans
le pire des cas.
4) On peut aussi mmoriser le plus grand indice partir duquel les changes ne se font plus, cest-dire lindice en dessous duquel la liste est trie. Par exemple
8
5
2
6
4
Modifier bulle1 en ajoutant une variable entire supplmentaire. Comment se modifie la complexit ?
5) Enfin on remarquera une certaine dissymtrie dans lexcution de lalgorithme de tri bulles sur
les 2 listes suivantes :
4 5 6 8 2
et
8
2
4
5
6
Dans les deux cas, un seul lment nest pas sa place, mais la complexit nest pas la mme :
calculer la.
Pour remdier cet inconvnient, on peut alterner la direction des parcours conscutifs.
Ecrire une procdure de tri base sur le principe du tri bulles qui prenne en compte ces 3
amliorations.
Un tel tri sappelle tri shaker.