Vous êtes sur la page 1sur 32

TD I3 v1.4.

1 avec solution
N. Delestre

Table des mati` res e


1 Affectation et sch ma conditionnel e 1.1 Affectation . . . . . . . . . . . . . . . . . . 1.1.1 Echanger . . . . . . . . . . . . . . . 1.1.2 Permutation circulaire . . . . . . . . 1.1.3 D composition dune somme dargent e 1.1.4 Parit . . . . . . . . . . . . . . . . . e 1.1.5 Date valide . . . . . . . . . . . . . . 1.2 Sch ma conditionnel . . . . . . . . . . . . . e 1.2.1 Tri de trois entiers . . . . . . . . . . 1.2.2 Nombre de jours de cong s . . . . . . e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 3 3 3 3 4 4 5 5 6 6 6 7 7 7 8 9 9 10 10 11 11 12 12 13 13 14 15 16 16 16

Sch ma it ratif e e 2.1 La multiplication . . . . . . . . . . . . . . . . . . . . 2.2 Calcul de factorielle n . . . . . . . . . . . . . . . . . . 2.3 Partie enti` re inf rieure de la racine carr e dun nombre e e e 2.4 Multiplication egyptienne . . . . . . . . . . . . . . . . 2.5 Int gration par la m thode des trap` zes . . . . . . . . . e e e

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

Sch ma it ratif (suite) e e 3.1 D veloppement limit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e e 3.2 Nombres premiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Recherche du z ro dune fonction par dichotomie . . . . . . . . . . . . . . . . . e Analyse descendante 4.1 Nombre de chiffres pairs dans un nombre 4.2 Majuscule . . . . . . . . . . . . . . . . . 4.2.1 Analyse . . . . . . . . . . . . . . 4.2.2 Conception pr liminaire . . . . . e 4.2.3 Conception d taill e . . . . . . . e e TP Pascal : des multiplications Tableaux e 6.1 Plus petit el ment dun tableau dentiers . . . . . . . . . . . . . . . . . . . . . . e 6.2 Indice du plus petit el ment dun tableau dentiers . . . . . . . . . . . . . . . . . e 6.3 Nombre doccurrences dun el ment . . . . . . . . . . . . . . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

5 6

6.4 6.5 6.6

e El ment le plus fr quent dun tableau e Recherche dichotomique . . . . . . . Tris . . . . . . . . . . . . . . . . . . 6.6.1 Tri par insertion . . . . . . . . 6.6.2 Tri shaker . . . . . . . . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

17 18 18 18 19 20 23 23 23 24 24 25 26 27 27 27 27 27 28 28 28 28 28 29 31 31 31 31 32 32

7 8

TP Pascal : Matrice R cursivit e e 8.1 Calcul de C(n,p) . . . . . . . . . . . . . 8.2 Multiplication egyptienne . . . . . . . . 8.3 Des cercles . . . . . . . . . . . . . . . 8.3.1 Compr hension . . . . . . . . . e 8.3.2 Construction . . . . . . . . . . e 8.4 Recherche dun el ment dans un tableau TP Pascal : Benchmark de tri 9.1 R sultats attendus . . . . e 9.1.1 testTri . . . . 9.1.2 benchmark . . ` e 9.2 Travail a r aliser . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

10 TP Pascal : Benchmark de tri (suite) 10.1 R sultats attendus . . . . . . . . e 10.1.1 testTri . . . . . . . . 10.1.2 benchmark . . . . . . ` e 10.2 Travail a r aliser . . . . . . . . . 11 Liste chan e e

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

. . . .

12 TP Pascal : Liste chan e e 12.1 R sultats attendus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e ` e 12.2 Travail a r aliser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 TP Pascal : Fichiers 13.1 R sultats attendus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . e ` e 13.2 Travail a r aliser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

1
1.1

Affectation et sch ma conditionnel e


Affectation

1.1.1 Echanger Ecrire une proc dure, echangerDeuxEntiers, qui permet d changer les valeurs de deux entiers. e e Solution propos e : e proc dure echangerDeuxEntiers (E/S a,b : Entier) e D claration temp : Entier e debut temp a ab b temp n 1.1.2 Permutation circulaire

Ecrire une proc dure qui permet daffectuer une permutation circulaire des valeurs enti` res de e e trois variables x, y, z (cest-` -dire la valeur de y dans x, la valeur de z dans y et la valeur de x dans a z. Solution propos e : e proc dure permutationDeTroisEntiers (E/S x,y,z : Entier) e D claration temp : Entier e debut temp x xy yz z temp n 1.1.3 D composition dune somme dargent e

` Ecrire une proc dure, decomposerSomme, qui a partir dune somme ronde dargent donn e, e e donne le nombre minimal de billets de 5 et 10 et le nombre de pi` ces de 2 et 1 qui la compose. e Solution propos e : e proc dure decomposerSomme (E somme : Naturel ;S nbBilletDe10, nbBilletDe5, nbPieceDe2, e nbPieceDe1 : Naturel) D claration sommeRestante : Naturel e debut sommeRestante somme nbBilletDe10 sommeRestante div 10 sommeRestante sommeRestante mod 10 nbBilletDe5 sommeRestante div 5 sommeRestante sommeRestante mod 5 nbPieceDe2 sommeRestante div 2 3

nbPieceDe1 sommeRestante mod 2 n ` ` A titre dexemple de raisonnement a mener pour la validation structurelle de votre algorithme, ` voici la d marche a effectuer. e Coh rence des types : Ici, il napparait pas explicitement de contrainte sur le type des pae ram` tres. Cette contrainte est induite par la s mantique (ce qui est le cas le plus fr quent). e e e ` Compte tenu de la s mantique des param` tres, ici le type a utiliser est Naturel et non pas e e Entier. En effet Entier autoriserait la d nition de donn es n gatives (ce qui nest pas e e e ` e possible pour une somme dargent a d composer). Les param` tres de sortie sont tous au moins pr sents une fois en partie gauche dune affece e tation. Le param` tre dentr e nest jamais pr sent en partie gauche dune affectation. e e e Le type utilis pour la variable temporaire est compatible avec le type des param` tres. e e Une fois ces contr les effectu s, cela ne signie pas que votre algorithme est juste mais seuleo e ment quil a une chance d tre juste car il sera structurellement correct. Son ad quation s mantique e e e ` elle ne peut pas etre v ri e formellement a ce stade de vos connaissances. e e Il vous appartient maintenant dappliquer ce raisonnement aux alogrithmes que vous ecrivez. 1.1.4 Parit e

` Ecrire une fonction bool enne, estPair, qui a partir dun nombre entier strictement positif ree tourne VRAI si ce nombre est pair et FAUX sinon. Solution propos e : e fonction estPair (a : NaturelNonNul) : Booleen debut retourner a mod 2 = 0 n Ici, une contrainte apparait sur le param` tre qui doit etre un entier strictement positif. Le type e associ est alors NaturelNonNul. e 1.1.5 Date valide

Ecrire une fonction qui pour un num ro de jour, de mois et dann e donn s, d termine sil e e e e sagit ou non dune date, apr` s JC, valide (dapr` s le calendrier gr gorien). e e e Rappel 1 : Depuis linstauration du calendrier gr gorien, sont bissextiles : e 1. les ann es divisibles par 4 mais non divisibles par 100 e 2. les ann es divisibles par 400 e Ainsi, lan 2004 etait bissextile suivant la premi` re r` gle. Lan 1900 n tait pas bissexe e e ` tile, car divisible par 100, ce qui va a lencontre de la premi` re r` gle, et non divisible e e ` par 400, ce qui va a lencontre de la seconde. Lan 2000 etait bissextile car divisible par 400. Solution propos e : e Une date j/m/a est valide si et seulement si a > 0 et : lorsque m {1, 3, 5, 7, 8, 10, 12} alors j [1..31]
1. Dapr` s Wikipedia e

lorsque m {4, 6, 9, 11} alors j [1..30] lorsque m = 2, alors j [1..28] pour les ann e non bissextile et j [1..29] sinon. e fonction dataValide (j : 1..31, m : 1..12, a : NaturelNonNul) : Booleen D claration validePourMoisEn31Jours, validePourMoisEn30Jours, validePourMoisFevrier : e Booleen debut validePourMoisEn31Jours (m=1 ou m=3 ou m=5 ou m=7 ou m=8 ou m=10 ou m=12) et j31 validePourMoisEn30Jours (m=4 ou m=6 ou m=9 ou m=11) et j30 validePourMoisFevrier m=2 et ((((a mod 4 = 0 et a mod 100 = 0) ou (a mod 400 = 0)) et j29) ou j28) retourner a>0 et j>0 (validePourMoisEn31Jours ou validePourMoisEn30Jours ou validePourMoisFevrier) n

1.2
1.2.1

Sch ma conditionnel e
Tri de trois entiers

Ecrire une proc dure, trierTroisEntiers, qui prend en entr e trois param` tres a, b et c contenant e e e chacun un entier et qui les retourne tri s par ordre croissant : a contient la valeur minimum, et c e contient la valeur maximum. Solution propos e : e proc dure echanger (E/S a,b : Entier) e D claration temp : Entier e debut temp a ab b temp n proc dure trierDeuxEntiers (E/S a,b : Entier) e debut si a>b alors echanger(a,b) nsi n proc dure trierTroisEntiers (E/S a,b,c : Entier) e debut trierDeuxEntiers(a,b) trierDeuxEntiers(b,c) trierDeuxEntiers(a,b) n

1.2.2

Nombre de jours de cong s e

Dans une entreprise, le calcul des jours de cong s pay s seffectue de la mani` re suivante : si e e e ` une personne est entr e dans lentreprise depuis moins dun an, elle a droit a deux jours de cong s e e ` par mois de pr sence (au minimum 1 mois), sinon a 28 jours au moins. Si cette personne est un e e ` cadre et si elle est ag e dau moins 35 ans et si son anciennet est sup rieure a 3 ans, il lui est e e e accord 2 jours suppl mentaires. Si elle est cadre et si elle est ag e dau moins 45 ans et si son e e ` anciennet est sup rieure a 5 ans, il lui est accord 4 jours suppl mentaires, en plus des 2 accord s e e e e e pour plus de 35 ans. Ecrire une fonction, nbJoursDeConges, qui calcule le nombre de jours de cong s a partir de e ` l ge exprim en ann e, lanciennet exprim e en mois et lappartenance (bool enne) au coll` ge a e e e e e e cadre dune personne. Solution propos e : e fonction nbJoursDeConges (age : 16..65 ; anciennete : NaturelNonNul ; cadre : Booleen) : Naturel D claration nbJours : Naturel e debut si anciennete<12 alors nbJours anciennete*2 sinon nbJours 28 nsi si cadre alors si age 35 et anciennete 3*12 alors nbJours nbJours + 2 nsi si age 45 et anciennete 5*12 alors nbJours nbJours + 4 nsi nsi retourner nbJours n

2
2.1

Sch ma it ratif e e
La multiplication

Ecrire une fonction, multiplication, qui effectue la multiplication de deux entiers positifs (not s e x et y) donn s en utilisant uniquement laddition enti` re. e e Solution propos e : e fonction multiplication (x,y : Naturel) : Naturel D claration i, produit : Naturel e debut produit 0 ` pour i 1 a x faire produit produit + y

npour retourner produit n

2.2

Calcul de factorielle n
Ecrire une fonction, factorielle, qui calcule pour un entier positif donn n la valeur de n !. e

Solution propos e : e fonction factorielle (n : Naturel) : Naturel D claration i, valeur : Naturel e debut valeur 1 ` pour i 1 a n faire valeur valeur * i npour retourner valeur n

2.3

Partie enti` re inf rieure de la racine carr e dun nombre e e e

Ecrire une fonction, racineEntiere, qui retourne la partie enti` re de la racine carr e dun entier e e positif donn n (sans utiliser racineCarree). e Solution propos e : e fonction racineEntiere (n : Naturel) : Naturel D claration racine : Naturel e debut racine 1 tant que racine * racine n faire racine racine + 1 ntantque retourner racine - 1 n

2.4

Multiplication egyptienne
Les egyptiens de lantiquit savaient : e additionner deux entiers strictement positifs, ` soustraire 1 a un entier strictement positif, multiplier par 1 et 2 tout entier strictement positif, diviser par 2 un entier strictement positif pair. Voici un exemple qui multiplie 14 par 13 en utilisant uniquement ces op rations : e 14 13 = 14 + 14 (13 - 1) = 14 + 14 12 = 14 + (14 2) (12 / 2) = 14 + 28 6 = 14 + (28 2) (6 / 2) = 14 + 56 3 = 14 + 56 + 56 (3 - 1) = 70 + 56 2 = 70 + (56 2) (2 / 2) = 70 + 112 1 = 70 + 112 = 182 7

Donner le corps de la fonction suivante : fonction multiplicationEgyptienne (a,b : Naturel) : Naturel Solution propos e : e fonction multiplicationEgyptienne (a,b : Naturel) : Naturel D claration resultat : Naturel e debut resultat 0 tant que b>0 faire si b mod 2=0 alors a 2*a b b div 2 sinon resultat resultat+a b b-1 nsi ntantque retourner a n

2.5

Int gration par la m thode des trap` zes e e e

Ecrire une fonction, integrale, qui retourne la valeur de lint grale dune fonction f(x) r elle e e ` e continue sur lintervalle r el [a, b]. Lint gration consiste a d couper cet intervalle, en n souse e intervalles de longueur . Lint grale dun sous-intervalle [x, x + ] est approxim e au trap` ze e e e de base et de c t s f(x) et f(x + ). a, b et n vous sont donn s. oe e Remarque : la communication de f entre lappelant et la fonction appel e, est r alis e de e e e mani` re implicite (op ration transparente pour vous). Cette remarque est valide pour tous les e e exercices num riques de ce type. e Solution propos e : e fonction integrale (a,b : Reel ; n : NaturelNonNul) : Reel pr condition(s) a b e D claration x1, x2, , somme : Reel e debut somme 0 x1 a (b - a)/n ` pour i 1 a n faire x2 x1 + somme somme + (f(x1) + f(x2)) x1 x2 npour somme somme * / 2 retourner somme n

Soit vous introduisez une pr -condition sur (a, b) soit vous devez tenir compte dans lalgoe rithme pour le calcul de et utiliser valeurAbsolue(b-a). Version un peu optimis e : e fonction integrale (a,b : Reel ; n : NaturelNonNul) : Reel pr condition(s) a b e D claration x1, x2, , somme : Reel e debut somme 0 xa (b - a)/n ` pour i 2 a n-1 faire xx+ somme somme + f(x) npour somme *(somme+((f(a)+f(b)) / 2)) retourner somme n

3
3.1

Sch ma it ratif (suite) e e


D veloppement limit e e
Lorsque x est proche de 0, sinh(x) peut etre approxim a laide de la formule suivante : e`

n i=0

x2i+1 (2i + 1)!

Ecrire la fonction sinh en nutilisant aucune autre fonction (pas danalyse descendante) : fonction sinh (x : Reel, n : Naturel) : Reel D claration i : Naturel e numerateur,denominateur : Reel resultat : Reel debut ... n Solution propos e : e fonction sinh (x : Reel, n : Naturel) : Reel D claration i : Naturel e numerateur,denominateur : Reel resultat : Reel debut numerateur x denominateur 1 9

resultat resultat+numerateur/denominateur ` pour i 1 a n faire numerateur numerateur*x*x denominateur (2*i+1)*(2*i)*denominateur resultat resultat+numerateur/denominateur npour retourner resultat n

3.2

Nombres premiers

` Ecrire une fonction bool enne, estPremier, qui a partir dun entier strictement positif donn , e e retourne le r sultat VRAI ou FAUX selon que le nombre est premier ou non. Pour m moire, voici e e ` la liste des nombres premiers inf rieurs a 100 : 1, 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, e 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97. Solution propos e : e fonction estPremier (n : NaturelNonNul) : Booleen D claration i : NaturelNonNul, e premier : Booleen debut premier VRAI i2 tant que premier et i racineCarree(n) faire si n mod i = 0 alors premier FAUX nsi ii+1 ntantque retourner premier n

3.3

Recherche du z ro dune fonction par dichotomie e

Ecrire une fonction, zeroFonction, qui calcule le z ro dune fonction r elle f(x) sur lintervalle e e r el [a, b], avec une pr cision epsilon. La fonction f ne sannule quune seule et unique fois sur e e [a, b]. Pour trouver ce z ro, la recherche proc` de par dichotomie, cest-` -dire divise lintervalle de e e a ` recherche par deux a chaque etape. Soit m le milieu de [a, b]. Si f(m) et f(a) sont de m me signe, e le z ro recherch est dans lintervalle [m, b], sinon il est dans lintervalle [a, m]. a, b et epsilon e e vous sont donn s. e Solution propos e : e fonction estMemeSigne (a,b : Reel) : Booleen debut retourner a * b 0 n fonction zeroFonction (a,b, epsilon : Reel) : Reel pr condition(s) a b e 10

D claration borneMin, milieu, borneMax : Reel e debut borneMin a borneMax b tant que (borneMax - borneMin) > epsilon faire milieu (borneMin + borneMax) / 2 si estMemeSigne(f(borneMin), f(milieu)) alors borneMin milieu sinon borneMax milieu nsi ntantque retourner borneMin n

4
4.1

Analyse descendante
Nombre de chiffres pairs dans un nombre

On se propose de calculer le nombre de chiffres pairs dun nombre donn . On suit pour cela e lanalyse descendante pr sent e par la gure 1, tel que : e e nbChiffresPairs r soud le probl` me demand . Par exemple pour le nombre 821, on obtient 2. e e e nbChiffres permet dobtenir le nombre de chiffres dun nombre. Par exemple pour le nombre 821, on obtient 3. iemeChiffre permet dobtenir le i` me chiffre dun nombre. Par exemple pour 821, le premier e chiffre est 1, le second 2 et le troisi` me est 8 (on ne traite pas les erreurs). e estPair permet de savoir si un nombre est pair.

nbChiffresPairs

nbChiffres iemeChiffre
F IGURE 1 Analyse descendante

estPair

1. Reprenez le sch ma donn et compl tez le (tel que nous lavons vu en cours). e e e 2. Donnez la signature des fonctions ou proc dures des op rations donn es par lanalyse dese e e cendante. 3. Donnez le corps de la fonction ou proc dure nbChiffresPairs. e Solution propos e : e 11

Naturel

nbChiffresPairs

Naturel

Naturel

nbChiffres

NaturelNonNul

Naturel

estPair
Naturel

Boolen

1. 2. 3.

Naturel NaturelNonNul

iemeChiffre

fonction nbChiffresPairs (nb : Naturel) : Naturel fonction nbChiffres (nb : Naturel) : Naturel fonction iemeChiffre (nb : Naturel,) : Naturel fonction estPair (nb : Naturel,) : Booleen

fonction nbChiffresPairs (nb : Naturel) : Naturel D claration i : Naturel e resultat : Naturel debut resultat 0 ` pour i 1 a nbChiffres(nb) faire si estPair(iemeChiffre(nb,i)) alors resultat resultat+1 nsi npour retourner resultat n

4.2

Majuscule

` La fonction majuscule permet de calculer a partir dune chane de caract` res ch une chane de e caract` res ch tel que tous les caract` res minuscules, et uniquement eux, de ch soient transform s e e e en majuscule dans ch . La signature de cette est fonction est : fonction majuscule (uneChaine : Chaine de caracteres) : Chaine de caracteres Ainsi majuscule(abc, ?ABC) donne la valeur ABC, ?ABC. Lobjectif de cet exercice est de donner lalgorithme de cette fonction en consid rant que nous e avons les trois fonctions suivantes : fonction longueur (uneChaine : Chaine de caracteres) : Naturel fonction iemeCaractere (uneChaine : Chaine de caracteres, position : Naturel) : Caractere fonction caractereEnChaine (unCaractere : Caractere) : Chaine de caracteres 4.2.1 Analyse

Pour calculer la version majuscule dune chane de caract` res ch, on a besoin de savoir calculer e la majuscule dun caract` re c de ch lorsque c repr sente une lettre minuscule. Nous navons aucun e e a priori concernant la table de codage de ces caract` res, si ce nest que : e le caract` re a pr c` de le caract` re b, qui pr c` de le caract` re c, etc. e e e e e e e le caract` re A pr c` de le caract` re B, qui pr c` de le caract` re C, etc. e e e e e e e ` Proposez une analyse descendante de ce probl` me a laide du formalisme vu en cours. e Solution propos e : e 12

Chaine

majuscule

Chaine

Caractre

estUneLettreMinuscule

Boolen Caractre

lettreMajuscule

Caractre

4.2.2

Conception pr liminaire e

D terminez la signature des fonctions ou proc dures correspondant aux op rations de votre e e e analyse descendante. Solution propos e : e fonction majuscule (ch : Chaine de caracteres) : Chaine de caracteres fonction estUneLettreMinuscule (c : Caractere) : Booleen fonction lettreMajuscule (c : Caractere) : Caractere 4.2.3 Conception d taill e e e

Donnez le corps de chacune de ces fonctions ou proc dures. e Solution propos e : e fonction majuscule (ch : Chaine de caracteres) : Chaine de caracteres D claration i : Naturel e c : Caractere resultat : Chaine de caracteres debut resultat ` pour i 1 a longueur(ch) faire c iemeCaractere(ch,i) si estUneLettreMinuscule(c) alors resultat resultat+ caractereEnChaine(lettreMajuscule(c)) sinon resultat resultat+ caractereEnChaine(c) nsi npour retourner resultat n fonction estUneLettreMinuscule (c : Caractere) : Booleen debut retourner ca et cz n fonction lettreMajuscule (c : Caractere) : Caractere debut retourner chr(ord(A)+ord(c)-ord(a))

13

n ou fonction lettreMajuscule (c : Caractere) : Caractere D claration i : Caractere e resultat : Caractere debut resultat A ` pour i b a c faire resultat succ(resultat) npour n

TP Pascal : des multiplications


Lobjectif de ce TP est de comparer les algorithmes vu dans les exercices 2.1 et 2.4. Le r sultat attendu est du type : e

./multiplication Calcul de a*b : a = 100 b = 100 Multiplication classique, a*b = 10000 en 0 ms Multiplication egyptienne, a*b = 10000 en 0 ms An de tester la multiplication avec des grands nombres, vous utiliserez le type de donn es e QWord pour un ordinateur 64 bits et LongWord pour un ordinateur 32 bits. De plus, les ordinateurs daujourdhui sont si rapides, que vous vous arrangerez pour que les deux algorithmes it` rent e ` sur le plus grand des deux nombres a multiplier. Vous pouvez calculer le temps mis par une proc dure ou une fonction en encadrant son ex cution e e par les appels aux fonctions DateTimeToTimeStamp(Time()) (disponible dans lunit sysutils). e Le type de la valeur retourn e est TTimeStamp, qui est un enregistrement dont le champ time e poss` de lheure correspondante en ms. La soustraction de ces deux valeurs de champ vous pere mettra davoir une id e quant au temps mis par cette fonction ou proc dure. e e Vous comparerez le temps mis par ces deux algorithmes en augmentant r guli` rement la taille e e des arguments (vous pouvez aller jusqu` des valeurs de plusieurs milliards). a Solution propos e : e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 program multiplication; u s e s sysutils; type Entier = QWord; f u n c t i o n min(a,b : begin i f a<b t h e n min:=a else min:=b end; Entier) : Entier;

14

16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71

f u n c t i o n max(a,b : begin i f a>b t h e n max:=a else max:=b end;

Entier) : Entier;

f u n c t i o n multiplicationClassique(a,b : Entier) : Entier; var i,a1,b1 : Entier; begin a1:=max(a,b); b1:=min(a,b); multiplicationClassique:=0; f o r i:=1 t o a1 do multiplicationClassique:=multiplicationClassique+b1; end; { multiplicationClassique } f u n c t i o n multiplicationEgyptienne(a,b : Entier) : Entier; var a1,b1 : Entier; begin a1:=min(a,b); b1:=max(a,b); multiplicationEgyptienne:=0; w h i l e (b1>0) do i f (b1 mod 2)=0 t h e n begin a1:=2*a1; b1:=b1 d i v 2; end else begin multiplicationEgyptienne:=multiplicationEgyptienne+a1; b1:=b1-1; end; end; { multiplicationEgyptienne } var a,b,res : Entier; t1,t2 : TTimeStamp; begin w r i t e l n (Calcul de a*b :); w r i t e ( a = ); r e a d l n (a); w r i t e ( b = ); r e a d l n (b); t1:=DateTimeToTimeStamp(Time()); res:=multiplicationClassique(a,b); t2:=DateTimeToTimeStamp(Time()); w r i t e l n ( Multiplication classique, a*b = ,res, en , t2.time-t1.time, ms); t1:=DateTimeToTimeStamp(Time()); res:=multiplicationEgyptienne(a,b); t2:=DateTimeToTimeStamp(Time()); w r i t e l n ( Multiplication egyptienne, a*b = ,res, en , t2.time-t1.time, ms); end.

Tableaux

Dans tous les exercices qui vont suivre, le tableau dentiers t est d ni comme etant de type e Tableau[1..MAX] dEntier.

15

6.1

e Plus petit el ment dun tableau dentiers

` e Ecrire une fonction, minTableau, qui a partir dun tableau dentiers t non tri de n el ments e e signicatifs retourne le plus petit el ment du tableau. Solution propos e : e fonction minTableau (t : Tableau[1..MAX] dEntier ; n : Naturel) : Entier pr condition(s) n 1 et nMAX e D claration i : Naturel, e min : Entier debut min t[1] ` pour i 2 a n faire si t[i]<min alors min t[i] nsi npour retourner min n

6.2

e Indice du plus petit el ment dun tableau dentiers

e Ecrire une fonction, indiceMin, qui retourne lindice du plus petit el ment dun tableau dene tiers t non tri de n el ments signicatifs. e Solution propos e : e fonction indiceMin (t : Tableau[1..MAX] dEntier ; n : Naturel) : Naturel pr condition(s) n 1 et nMAX e D claration i, indiceDuMin : Naturel e debut indiceDuMin 1 ` pour i 2 a n faire si t[i]<t[indiceDuMin] alors indiceDuMin i nsi npour retourner indiceDuMin n

6.3

e Nombre doccurrences dun el ment

e Ecrire une fonction, nbOccurences, qui indique le nombre de fois o` un el ment apparat dans u e un tableau dentiers t non tri de n el ments. e Solution propos e : e fonction nbOccurences (t : Tableau[1..MAX] dEntier ; n : Naturel ; element : Entier) : Naturel

16

D claration i, nb : Naturel e debut nb 0 ` pour i 1 a n faire si t[i] = element alors nb nb + 1 nsi npour retourner nb n Ici, il nest pas n cessaire dintroduire des pr conditions sur la valeur de n. La s mantique de la e e e fonction saccorde tr` s bien dun tableau vide. La boucle sur n ne sera pas effectu e si le tableau e e ` est vide et le retour sera coh rent puisqu gal a 0. e e

e 6.4 El ment le plus fr quent dun tableau e


e Soit un tableau dentiers t non tri de n el ments signicatifs. Ecrire une proc dure, determie e nerElementPlusFrequent, qui calcule l l ment qui apparat le plus souvent dans le tableau t, ainsi ee e que son nombre doccurrences. Si plusieurs el ments diff rents r pondent au probl` me, votre ale e e gorithme doit en fournir un, quel quil soit. Vous ne devez utiliser aucun autre tableau que celui sur lequel vous travaillez. Solution propos e : e proc dure determinerElementPlusFrequent (E t : Tableau[1..MAX] dEntier ; n : Naturel ;S elee ment : Entier ; nombre : Naturel) pr condition(s) n 1 et nMAX e D claration i, compteur : Naturel e debut nombre 0 ` pour i 1 a n faire compteur nbOccurences(t,n,t[i]) si compteur > nombre alors nombre compteur element t[i] nsi npour n En etudiant cet algorithme, linitialisation du param` tre de sortie element nest faite que dans e une alternative. Il faut donc garantir queffectivement cette branche de lalternative sera parcourue au moins une fois. La pr condition (n 1) garantit que lit rative sera effectu e au moins une fois. e e e ` Linitialisation a 0 de nombre garantit que le test compteur (qui vaut par d nition au minimum 1 e ` la premi` re fois) sera forc ment sup rieur a nombre. La branche alors sera donc parcourue au e e e moins une fois dans cet algorithme. Le param` tre element sera donc initialis au moins une fois. e e Cet algorithme peut etre am liorer en partant de la n du tableau, en faisant une boucle e ind terministe et en jouant sur le param` tre n de la fonction nbOccurrences. e e

17

6.5

Recherche dichotomique

Ecrire une fonction, rechercheDichotomique, qui d termine par dichotomie le plus petit indice e e dun el ment, (dont on est s r de lexistence) dans un tableau dentiers t tri dans lordre croissant u e e de n el ments signicatifs. Il peut y avoir des doubles (ou plus) dans le tableau. Solution propos e : e fonction rechercheDichotomique (t : Tableau[1..MAX] dEntier ; n : Naturel ; element : Entier) : Naturel pr condition(s) estPresent(t,n,element) e D claration g,d,m : Naturel e debut g1 dn tant que g = d faire m (g + d) div 2 si t[m] > element alors d m-1 sinon si t[m] = element alors dm sinon gm+1 nsi nsi ntantque retourner g n

6.6
6.6.1

Tris
Tri par insertion

Nous avons vu en cours que lalgorithme du tri par insertion est : proc dure triParInsertion (E/S t :Tableau[1..MAX] dEntier,E nb :Naturel) e D claration i,j : Naturel e temp : Entier debut ` pour i 2 a nb faire j obtenirIndiceDInsertion(t,i,t[i]) temp t[i] decaler(t,j,i) t[j] temp npour n Donnez lalgorithme de la fonction obtenirIndiceDInsertion tout dabord de mani` re s quentielle, e e puis de mani` re dichotomique. D montrez que la complexit de ce dernier est-il en O(log2 (n)). e e e Solution propos e : e 18

Version s quentielle e fonction obtenirIndiceDInsertion (t : Tableau[1..MAX] dEntier ; rang : Naturel ; entierAInserer : Entier) : Naturel pr condition(s) rang > 1 et rangMAX e D claration i : Naturel e debut i1 tant que t[i]entierAInserer et i<rang faire i i+1 ntantque retourner i n Version dichotomique fonction obtenirIndiceDInsertion (t : Tableau[1..MAX] dEntier ; rang : Naturel ; entierAInserer : Entier) : Naturel pr condition(s) rang > 1 et rangMAX e D claration g, d, m : Naturel e debut g1 d rang tant que g = d faire m (g+d) div 2 si t[m] > entierAInserer alors d m // lintervalle g..m contient alors lindice recherch e sinon g m+1 nsi ntantque retourner g n 6.6.2 Tri shaker

` La tri shaker est une am lioration du tri a bulles o` les it rations permettant de savoir si le e u e e tableau et tri (et qui inverse deux el ments successifs t[i] et t[i + 1] lorsque t[i] > t[i + 1]) se font e ` ` successivement de gauche a droite puis de droite a gauche. Donnez lalgorithme du tri shaker. Solution propos e : e proc dure triShaker (E/S t :Tableau[1..MAX] dEntier,E nb :Naturel) e D claration estTrie : Booleen e i,j : Naturel sens : Entier debut sens 1 j1 repeter 19

estTrie VRAI ` pour i 1 a n-1 faire si t[j]>t[j+1] alors echanger(t[j],t[j+1]) estTrie FAUX nsi j j+sens npour sens -sens j j+sens jusqua ce que estTrie n

TP Pascal : Matrice

Soit lunit Matrice qui propose un type TMatrice et cinq sous-programmes qui permettent e de manipuler des variables de type TMatrice : function matriceZero(hauteur,largeur : Integer) : TMatrice permet dobtenir une matrice compos e de 0 e function largeur(m : TMatrice) : Integer permet dobtenir la largeur dune matrice function hauteur(m : TMatrice) : Integer permet dobtenir la hauteur dune matrice e function obtenir(m : TMatrice ; jHauteur, iLargeur : Integer) : Real ; permet dobtenir un el ment dune matrice procedure xer(var m : TMatrice ; jHauteur, iLargeur : Integer ; val : Real) ; qui permet de e xer la valeur dun des el ments de la matrice Lobjectif de ce TP est d velopper une unit libMatrice, qui permettra : e e de transformer une matrice en chane de caract` res (fonction matriceEnChaine) ; e dadditionner deux matrices (fonction additionnerDeuxMatrices) ; de multiplier deux matrices (fonction multiplierDeuxMatrices) ; de calculer la transposer dune matrice (fonction transposer). Pour les fonctions daddition et de multiplication, les erreurs sont g r es via une variable ee globale erreur de type TErreur. Cette variable poss dera la valeur pas d erreur lorsque e tout va bien et la valeur erreur taille lorsque la taille des matrices utilis es pour ces deux e fonctions sont incompatibles. Dans ce dernier ces fonctions retourneront la valeur (0). Le chier TP-Matrices-Sources.zip disponible sur moodle, contient : lunit Matrice.pas, e lunit libMatrice.pas, e lex cutable test.pas. e Compl tez lunit libMatrice.pas et utilisez le programme test.pas pour tester votre e e code. Voici un exemple dex cution du programme test. e
$ ./test m1= 1.00 4.00 2.00 5.00 3.00 6.00 m2= 2.00 5.00 3.00 6.00

20

4.00 7.00 m3= 3.00 5.00 7.00 4.00 6.00 8.00 m1 + m2 = 3.00 9.00 5.00 11.00 7.00 13.00 m1 * m3 = 19.00 29.00 39.00 26.00 40.00 54.00 33.00 51.00 69.00 transpose de m1 = 1.00 2.00 3.00 4.00 5.00 6.00

Solution propos e : e
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 u n i t libMatrice; interface u s e s Matrice; t y p e TErreur = (pas_d_erreur, erreur_taille); var erreur : TErreur; function function function function matriceEnChaine(m : TMatrice) : String; additionnerDeuxMatrices(m1,m2 : TMatrice) : TMatrice; multiplierDeuxMatrices(m1,m2 : TMatrice) : TMatrice; transposer(m : TMatrice) : TMatrice;

implementation f u n c t i o n plusGdChaine(m : TMatrice) : I n t e g e r ; var i,j : I n t e g e r ; s : String; begin plusGdChaine:=0; f o r j:=1 t o hauteur(m) do begin f o r i:=1 t o largeur(m) do begin str(obtenir(m,j,i):0:2,s); i f length(s)>plusGdChaine t h e n plusGdChaine:=length(s); end; end end; { plusGdChaine }

f u n c t i o n matriceEnChaine(m : TMatrice) : String; var i,j : Integer; s : String; nbChiffres : I n t e g e r ; begin erreur := pas_d_erreur; matriceEnChaine:=; nbChiffres:=plusGdChaine(m);

21

45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107

f o r j:=1 t o hauteur(m) do begin f o r i:=1 t o largeur(m) do begin str(obtenir(m,j,i):nbChiffres:2,s); matriceEnChaine:=matriceEnChaine+s+ ; end; matriceEnChaine:=matriceEnChaine+#10; end end; f u n c t i o n additionnerDeuxMatrices(m1,m2 : TMatrice) : TMatrice; var i,j : I n t e g e r ; begin i f (largeur(m1)<>largeur(m2)) or (hauteur(m1)<>hauteur(m2)) t h e n begin erreur := erreur_taille; additionnerDeuxMatrices:=matriceZero(1,1); end else begin erreur := pas_d_erreur; additionnerDeuxMatrices:=matriceZero(largeur(m1),hauteur(m1)); f o r i:=1 t o largeur(m1) do f o r j:=1 t o hauteur(m1) do fixer(additionnerDeuxMatrices,j,i,obtenir(m1,j,i)+obtenir(m2,j,i)); end end; f u n c t i o n multiplierDeuxMatrices(m1,m2 : TMatrice) : TMatrice; var i,j,k : I n t e g e r ; begin i f (largeur(m1)<>hauteur(m2)) or (hauteur(m1)<>largeur(m2)) t h e n begin erreur := erreur_taille; multiplierDeuxMatrices:=matriceZero(1,1); end else begin erreur := pas_d_erreur; multiplierDeuxMatrices:=matriceZero(hauteur(m1),largeur(m2)); f o r j:=1 t o hauteur(m1) do f o r i:=1 t o largeur(m2) do f o r k:=1 t o largeur(m1) do fixer(multiplierDeuxMatrices,j,i,obtenir(multiplierDeuxMatrices,j,i)+ obtenir(m1,j,k)*obtenir(m2,k,i)); end end; f u n c t i o n transposer(m : TMatrice) : TMatrice; var i,j : I n t e g e r ; begin transposer := matriceZero(hauteur(m),largeur(m)); f o r i:=1 t o largeur(m) do f o r j:=1 t o hauteur(m) do fixer(transposer,i,j,obtenir(m,j,i)) end; begin erreur := pas_d_erreur; end.

22

8
8.1

R cursivit e e
Calcul de C(n,p)

Ecrire une fonction cnp, qui en fonction des entiers positifs n et p, retourne le nombre de e combinaisons de p el ments parmi n. Solution propos e : e Pour rappel :
n Cp =

1 n1 n1 Cp + Cp1

si p = 0 ou n = p

fonction cnp (n,p : naturel) : Naturel debut si p=0 ou n=p alors retourner 1 sinon retourner cnp(n-1,p)+cnp(n-1,p-1) nsi n

8.2

Multiplication egyptienne

Soit la multiplication egyptienne d nie dans lexercice 2.4. On se propose cette fois d crire e e cet algorithme de mani` re r cursive. e e 1. D terminer le ou les cas terminaux. D terminer le ou les cas g n raux. e e e e 2. Donner le corps de la fonction suivante en utilisant un algorithme r cursif : e fonction multiplicationEgyptienne (a,b : Naturel) : Naturel Solution propos e : e Cas terminal : Si b = 1 alors a b = a Cas g n ral, Si b > 1 e e Si b est paire alors a b = 2a b/2 Si b est impaire alors a b = a + a (b 1) fonction multiplicationEgyptienne (a,b :Naturel) : Naturel debut si b=1 alors retourner a sinon si b mod 2=0 alors retourner multiplicationEgyptienne(2*a,b div 2) sinon retourner a+multiplicationEgyptienne(a,b-1) nsi nsi n

23

8.3

Des cercles

Supposons que la proc dure suivante permette de dessiner un cercle sur un graphique (variable e de type Graphique) : proc dure cercle (E/S g : Graphique,E xCentre,yCentre,rayon : Reel) e 8.3.1 Compr hension e

Soit lalgorithme suivant : proc dure cercles (E/S g : Graphique,E x,y,r : Reel, n : Naturel) e D claration rTemp : Reel e debut si n>0 alors rTemp r/(1+racineCarree(2)) cercles(g,x,y+rTemp*racineCarree(2),rTemp,n-1) cercles(g,x,y-rTemp*racineCarree(2),rTemp,n-1) cercle(g,x,y,r) cercles(g,x+rTemp*racineCarree(2),y,rTemp,n-1) cercles(g,x-rTemp*racineCarree(2),y,rTemp,n-1) nsi n Linstruction cercles(g,1.0,1.0,1.0,3) permet dobtenir le graphique de la gure 2. Num rotez les cercles (num ro a mettre au centre du cercle) suivant leur ordre dapparition e e ` sur le graphique.

F IGURE 2 R sultat dun autre algorithme pour cercles e

Solution propos e : e

24

8.3.2

Construction

Proposez un autre algorithme de la proc dure cercles qui, pour la m me instruction cercles(g,1.0, e e 1.0,1.0,3), afche les cercles dans lordre propos par la gure 3. e

F IGURE 3 R sultat dun autre algorithme pour cercles e

Solution propos e : e proc dure cercles (E/S g : Graphique,E x,y,r : Reel, n : Naturel) e 25

D claration rTemp : Reel e debut si n>0 alors rTemp r/(1+racineCarree(2)) cercles(g,x+rTemp*racineCarree(2),y,rTemp,n-1) cercle(g,x,y,r) cercles(g,x-rTemp*racineCarree(2),y,rTemp,n-1) cercles(g,x,y-rTemp*racineCarree(2),rTemp,n-1) cercles(g,x,y+rTemp*racineCarree(2),rTemp,n-1) nsi n

8.4

e Recherche dun el ment dans un tableau

e Ecrire une fonction r cursive, estPresent, qui retourne VRAI si un el ment donn est un des e e e el ments dun tableau dentiers t et FAUX sinon. Etudier les cas o` t nest pas un tableau tri et u e o` t est un tableau tri . u e Solution propos e : e Si le tableau nest pas tri : e fonction estPresent (t : Tableau[1..MAX] dEntier ; element : Entier ; debut, n : NbElementTableau) : Booleen debut si debut > n alors retourner FAUX sinon si element = t[n] alors retourner VRAI sinon retourner estPresent(t, element, debut, n-1) nsi nsi n Si le tableau est tri : e fonction estPresent (t : Tableau[1..MAX] dEntier ; element : Entier ; debut,n : NbElementTableau) : Booleen D claration m : NbElementTableau e debut si debut > n alors retourner FAUX sinon m (debut + n) div 2 si element = t[m] alors retourner VRAI sinon si t[m] > element alors retourner estPresent(t, element, debut, m - 1) sinon retourner estPresent(t, element, m + 1, n) 26

nsi nsi nsi n Appel initial : estPresent (t, 10, 1, MAX) pour tout le tableau et recherche de l l ment 10. ee

TP Pascal : Benchmark de tri


Lobjectif de ce TP est dimplanter et de comparer les performances des tris suivants : tri par s lection ; e tri par insertions avec recherche dinsertion s quentielle ; e tri par insertions avec recherche dinsertion dichotomique ;

9.1

R sultats attendus e
Deux programmes sont utilis s dans ce TP : testTri et benchmark. e

9.1.1 testTri Le programme testTri a pour objectif de v rier le bon fonctionnement des tris. Voici un e ` exemple de r sultats attendus a son ex cution : e e
Verification des tris : Nb elements :10 Tableau a trier : 5 5 7 8 6 8 5 8 4 6 Resultat Tri par selection : 4 5 5 5 6 6 7 8 8 8 Resultat Tri par insertion (recherche dinsertion sequentielle) : 4 5 5 5 6 6 7 8 8 8 Resultat Tri par insertion (recherche dinsertion dichotomique) : 4 5 5 5 6 6 7 8 8 8

9.1.2 benchmark Le programme benchmark a pour objectif de comparer les performances des tris. Voici un ` exemple de r sultats attendus a son ex cution (les XX repr sentent des temps) : e e e
Nb elements :10000 Tri par selection : XX ms Tri par insertion (recherche dinsertion sequentielle) : XX ms Tri par insertion (recherche dinsertion dichotomique) : XX ms

9.2

` e Travail a r aliser

Comme les tris sont utilis s par deux programmes, nous les avons r partis dans des unit s e e e pascal (une unit par tri). e De m me le type TEntiers repr sentant un tableau dentiers (avec des sous-programmes e e ` permettant den remplir al atoirement un, den afcher un, ou encore de demander a lutilisateur e combien dentiers il faut utiliser) est utilis dans toutes les unit s et les deux programmes, il est e e donc d clar dans une unit . e e e Les programmes donn s compilent et sex cutent, mais ne donnent pas les bons r sultats. Pour e e e r aliser ce TP, suivez les etapes suivantes : e 1. T l chargez et d compressez larchive TP-Tris1-Sources.zip disponible sur mooee e dle. 2. Compl tez lunit triselection et compilez les deux programmes. e e 3. Compl tez lunit triinsertionsequentiel et compilez les deux programmes. e e 27

4. Compl tez lunit triinsertiondichotomoqie et compilez les deux programmes. e e e ` Comparez les valeurs obtenues avec 1000, 10000, 20000 et 30000 el ments a trier.

10

TP Pascal : Benchmark de tri (suite)

Lobjectif de ce TP est de compl ter le TP pr c dent, en implantant et comparant les perfore e e mances des tris suivants : ` tri a bulles tri par s lection ; e tri par insertions avec recherche dinsertion s quentielle ; e tri par insertions avec recherche dinsertion dichotomique ; tri rapide tri par fusion

10.1

R sultats attendus e

Deux programmes sont utilis s dans ce TP : testTri et benchmark. e 10.1.1 testTri

Le programme testTri a pour objectif de v rier le bon fonctionnement des tris. Voici un e ` exemple de r sultats attendus a son ex cution : e e
Verification des tris : Nb elements :10 Tableau a trier : 5 5 7 8 6 8 5 8 4 6 Resultat Tri rapide : 4 5 5 5 6 6 7 8 8 8 Resultat Tri par fusion : 4 5 5 5 6 6 7 8 8 8 Resultat Tri par selection : 4 5 5 5 6 6 7 8 8 8 Resultat Tri par insertion (recherche dinsertion sequentielle) : 4 5 5 5 6 6 7 8 8 8 Resultat Tri par insertion (recherche dinsertion dichotomique) : 4 5 5 5 6 6 7 8 8 8 Resultat Tri a bulles : 4 5 5 5 6 6 7 8 8 8

10.1.2

benchmark

Le programme benchmark a pour objectif de comparer les performances des tris. Voici un ` exemple de r sultats attendus a son ex cution (les XX repr sentent des temps) : e e e
Nb elements :10000 Tri rapide : XX ms Tri par fusion : XX ms Tri par selection : XX ms Tri par insertion (recherche dinsertion sequentielle) : XX ms Tri par insertion (recherche dinsertion dichotomique) : XX ms Tri a bulles : XX ms

10.2

` e Travail a r aliser

Les programmes donn s compilent et sex cutent, mais ne donnent pas les bons r sultats. Pour e e e r aliser ce TP, suivez les etapes suivantes : e 1. T l chargez et d compressez larchive TP-Tris2-Sources.zip disponible sur mooee e dle. 2. Remplacez les unit s triselection, triinsertionsequentiel et e triinsertiondichotomoqie par celles que vous avez d velopp es au dernier TP. e e 28

3. Compl tez lunit trirapide et compilez les deux programmes. e e 4. Compl tez lunit trifusion et compilez les deux programmes. e e e ` Comparez les valeurs obtenues avec 1000, 10000, 20000 et 30000 el ments a trier.

11

Liste chan e e

Pour rappel, le type ListeChaineeDEntiers est d ni de la facon suivante : e Type ListeChaineeDEntiers = NoeudDEntier Type NoeudDEntier = Structure entier : Entier listeSuivante : ListeChaineeDEntiers nstructure ` Et nous lutilisons a laide des fonctions et proc dures suivantes : e fonction listeVide () : ListeChaineeDEntiers fonction estVide (uneListe : ListeChaineeDEntiers) : Booleen proc dure ajouter (E/S uneListe : ListeChaineeDEntiers,E element : Entier) e fonction obtenirEntier (uneListe : ListeChaineeDEntiers) : Entier pr condition(s) non(estVide(uneListe)) e fonction obtenirListeSuivante (uneListe : ListeChaineeDEntiers) : ListeChaineeDEntiers pr condition(s) non(estVide(uneListe)) e proc dure xerListeSuivante (E/S uneListe : ListeChaineeDEntiers,E nelleSuite : Listee ChaineeDEntiers) pr condition(s) non(estVide(uneListe)) e proc dure supprimerTete (E/S l :ListeChaineeDEntiers) e pr condition(s) non estVide(l) e proc dure supprimer (E/S uneListe : ListeChaineeDEntiers) e e 1. Ecrire une proc dure it rative, afcher, qui permet dafcher les el ments dune liste chan e. e e e e 2. Ecrire une proc dure r cursive, afcher, qui permet dafcher les el ments dune liste chan e. e e e 3. Ecrire une fonction bool enne r cursive, estPresent, qui permet de savoir si un entier est e e pr sent dans une liste chan e. e e 4. Ecrire une proc dure r cursive, concatener, qui concat` ne deux listes chan es. e e e e 5. Ecrire une proc dure r cursive, inverser, qui permet dinverser une liste chan e. e e e Solution propos e : e 1. Afcher it ratif e proc dure afcher (E l :ListeChaineeDEntiers) e debut tant que non est Vide(l) faire ecrire(obtenirEntier(l)) l obtenirListeSuivante(l) ntantque n 2. Afcher r cursif e 29

proc dure afcher (E l :ListeChaineeDEntiers) e debut si non est Vide(l) alors ecrire(obtenirEntier(l)) afcher(obtenirListeSuivante(l)) nsi n 3. est pr sent r cursif e e fonction estPresent (liste : LIsteChaineeDEntiers ; cherche : Entier) : Booleen debut si estVide(liste) alors retourner FAUX sinon si obtenirEntier(liste) = cherche alors retourner VRAI sinon retourner estPresent(obtenirListeSuivante(liste),cherche) nsi nsi n 4. concat nation e proc dure concatener (E/S l1 : LIsteChaineeDEntiers,E l2 : LIsteChaineeDEntiers) e D claration temp : LIsteChaineeDEntiers e debut si estVide(l1) alors l1 l2 sinon si non estVide(l2) alors temp obtenirListeSuivante(l1) concatener(temp,l2) xerListeSuivante(l1, temp) nsi nsi n 5. inverser proc dure inverser (E/S l : LIsteChaineeDEntiers) e D claration temp : LIsteChaineeDEntiers e debut si non estVide(l) alors temp obtenirListeSuivante(l) inverser(temp) xerListeSuivante(l,listeChainee()) concatener(temp,l) nsi n

30

12

TP Pascal : Liste chan e e

Lobjectif de ce TP est de d velopper une librairie (unit LibListeChaineeDEntiers) e e sur une liste chan e dentiers (unit ListeChaineeDEntiers). Cette librairie permettra de : e e savoir si deux listes chan es sont egales ; e copier une liste chan e dentiers ; e savoir si un entier est pr sent dans une liste chan e dentiers ; e e savoir les entiers dune liste sont pr sents en ordre croissant ; e concatener deux liste chan es dentiers. e An de v rier que la librairie fonctionne, un programme de tests unitaires est propos (proe e gramme testLibListeChaineeDEntiers).

12.1

R sultats attendus e

Lex cution du programme de tests unitaires devra valider tous les tests : e
$ ./testLibListeChaineDEntiers Tests unitaires de la librairie LibListeChaineeDEntiers sontEgales(l,l) : OK sontEgales(l1,l2) (avec l1 et l2 qui possedent les meme elements) : OK sontEgales(l1,l2) (avec l1 et l2 qui ne possedent pas les meme elements) : OK copier(l) : OK estPresent(l,e) (avec e qui est reellement present au debut): OK estPresent(l,e) (avec e qui est reellement present a la fin): OK estPresent(l,e) (avec e qui est reellement present, cas general): OK estPresent(l,e) (avec e qui nest pas present): OK estEnOrdreCroissant(l) (avec la liste (1 2 3)): OK estEnOrdreCroissant(l) (avec la liste (1 2 3 2 1)): OK concatener(l1,l2) : OK

12.2

` e Travail a r aliser

1. T l chargez et d compressez larchive TP-Liste-Sources.zip disponible sur mooee e dle. ` 2. Compl tez lunit LibListeChaineeDEntiers. A chaque fois que vous avez cod une e e e fonction et que la compilation de lunit r ussie, recompilez et lancez le programme de tests e e unitaires.

13

TP Pascal : Fichiers

Lobjectif de ce TP est de compl ter le mini gestionnaire de contatcs vu en cours an quen e plus de lajout et de lafchage dun contact, le programme puisse : supprimer un contact ; ` nafcher que les contacts correspondant a un nom ; que lafchage des contacts se fasse en ordre croissant sur les noms. Comme vu en cours le programme devra s parer linterface homme machine et la logique e m tier. Linterface homme machine sera toujours en mode texte et les actions de lutilisateur seront e toujours sp cier dans la ligne de commande. Voici un exemple daide qui sera afcher lorsque le e nombre darguments ne sera pas valide :
$ ./contactsTxt contacts nom_fichier contacts nom_fichier contacts nom_fichier contacts nom_fichier : permet dafficher lensemble des contacts nom : permet dafficher un contact nom prenom : permet de supprimer un contact nom prenom telephone : permet dajouter un contact

31

13.1

R sultats attendus e

Voici un exemple dutilisation du programme une fois quil sera termin : e


$ ./contactsTxt insa.fic $ ./contactsTxt insa.fic "Delestre" "Nicolas" "02 32 95 98 76" $ ./contactsTxt insa.fic Nom : Delestre Prenom : Nicolas Telephone : 02 32 95 98 76 $ ./contactsTxt insa.fic "Malandain" "Nicolas" "02 32 95 98 83" $ ./contactsTxt insa.fic Nom : Delestre Prenom : Nicolas Telephone : 02 32 95 98 76 Nom : Malandain Prenom : Nicolas Telephone : 02 32 95 98 83 $ ./contactsTxt insa.fic "Delporte" "Julien" "" $ ./contactsTxt insa.fic Nom : Delestre Prenom : Nicolas Telephone : 02 32 95 98 76 Nom : Delporte Prenom : Julien Telephone : Nom : Malandain Prenom : Nicolas Telephone : 02 32 95 98 83 $ ./contactsTxt insa.fic "Malandain" Nom : Malandain Prenom : Nicolas Telephone : 02 32 95 98 83 $ ./contactsTxt insa.fic "Delestre" "Nicolas" $ ./contactsTxt insa.fic Nom : Delporte Prenom : Julien Telephone : Nom : Malandain Prenom : Nicolas Telephone : 02 32 95 98 83

13.2

` e Travail a r aliser

1. T l chargez et d compressez larchive TP-Contact-Sources.zip disponible sur mooee e dle. 2. Compilez et ex cutez le programme de facon a v rier que lafchage des contacts et lajout e ` e dun contact fonctionne bien. ` 3. Compl tez la proc dure supprimerContact qui permet de supprimer un contact a partir e e de son nom et de son pr nom. Compilez et testez votre programme pour la suppression dun e contact. 4. Compl tez la proc dure parcourirContactsAvecComparaison qui permet de traie e ter tous les contacts c tels que la fonction comparer retourne 0 si elle est ex cut e avec e e comme argument ref erence et c. Compilez et testez votre programme pour lafchage des contacts dun certain nom. 5. Modiez la proc dure ajouterContact de facon a ce que lajout se fasse dans lordre e ` croissant des noms des contacts. Compilez et testez votre programme avec un nouveau carnet de contacts.

32