• Aucun résultat trouvé

TP - Algorithmique

N/A
N/A
Protected

Academic year: 2022

Partager "TP - Algorithmique"

Copied!
3
0
0

Texte intégral

(1)

Informatique - DEGEAD 2 Universit´e Paris-Dauphine

TP - Algorithmique

Exercice 1 : Recherche d’un nombre dans une liste tri´ee

Pour cet exercice vous allez travailler avec le fichier Excel intitul´e RechDicho.xlsm. Vous le trouverez dans le r´epertoire :

P :\PROF\GALAND\ETUD\UE47VBA\TPS\TPRech Copiez-le dans votre r´epertoire de travail.

Q 1.1Ecrivez une fonctionRechercheSqqui prend comme param`etre un nombre et le cherche parmi les nombres qui apparaissent dans le fichier ExcelRechDicho.xlsm. La recherche sera s´equentielle, c’est-`a- dire que le nombre va ˆetre compar´e au premier nombre de la plage de cellules allant de (1,1) `a (99000,1), si ce n’est pas le mˆeme, il sera compar´e au suivant et ainsi de suite. Si la fonction ne trouve pas le nombre elle va rendre 0 comme r´esultat, sinon elle donnera le num´ero de ligne du nombre.

Q 1.2 Testez votre fonction pour les trois nombres : 1670, 5021 et 9715.

Q 1.3 Ecrivez une nouvelle fonctionRechercheDicho qui fait la mˆeme chose que la fonction pr´ec´edente mais qui utilisera une logique diff´erente. Puisque les nombres de notre fichier Excel sont tri´es, vous allez d’abord chercher votre nombre dans le milieu de la plage de cellules (c.`a.d dans la cellule (49500,1) car 99000/2=49500), si le nombre cherch´e n’est pas le mˆeme que le nombre qui se trouve en (49500,1) et s’il est plus grand (resp. plus petit), vous allez chercher votre nombre dans la plage de cellule allant de (49500,1) `a (99000,1) (resp. de (1,1) `a (49499,1)). Vous allez le comparer avec le milieu de la plage concern´ee et ainsi de suite...

Q 1.4Testez votre fonction pour les trois nombres : 1670, 5021 et 9715. Y-a-t-il une diff´erence dans les temps d’ex´ecution des deux fonctions ? Si oui, laquelle est plus rapide et pourquoi (pour r´epondre `a cette question calculer le nombre d’it´erations des deux fonctions quand on cherche 15 dans la liste 1, 3, 5, 7, 8, 9, 12, 13, 15, 16, 19) ?

Exercice 2 : Tri des ´el´ements dans une collection de donn´ees

Dans cet exercice, nous allons comparer diff´erentes m´ethodes de tri. Pour cela, nous allons consid´erer le probl`eme de tri des donn´ees situ´ees dans la premi`ere colonne de la feuille de calcul.

Q 2.1Ecrivez la macrogenerationqui remplit les cellules de la colonne L1C1 :L300C1 par 300 nombres compris entre 1 et 1000 g´en´er´es al´eatoirement. Pour cela, vous utiliserez la fonction Rnd de VBA qui g´en`ere un nombre al´eatoire compris entre 0 et 1. Pour g´en´erer un entier compris entreaetbil suffit donc d’ex´ecuter l’instruction :

Int( ( b − a + 1 )∗ Rnd( ) + a )

Ex´ecutez la macrogenerationpour remplir la colonne 1.

Q 2.2 Ecrivez la macroTriSeqqui place les ´el´ements de la premi`ere colonne de la feuille de calcul dans la seconde colonne dans l’ordre croissant. Pour cela, TriSeq copie les ´el´ements de L1C1 :L300C1 dans L1C2 :L300C2, puis applique l’algorithme de tri par s´election pour trier les ´el´ements de la deuxi`eme colonne.

(2)

Informatique - DEGEAD 2 page 2 Q 2.3Ecrivez la macroTriBullequi place les ´el´ements de la premi`ere colonne de la feuille de calcul dans la troisi`eme colonne dans l’ordre croissant. Pour cela,TriBullecopie les ´el´ements de L1C1 :L300C1 dans L1C3 :L300C3, puis applique l’algorithme de tri `a bulles pour trier les ´el´ements de la troisi`eme colonne.

Q 2.4 Ecrivez la macro verifieTris qui affiche un message d’erreur si le r´esultat de l’ex´ecution de TriSeqet TriBulle n’est pas le mˆeme ou si les ´el´ements ne sont pas tri´es en ordre croissant. Testez la macroverifieTris, si un message d’erreur s’affiche, corrigez vos proc´edures.

Q 2.5 Ecrivez la macroTriFusqui place les ´el´ements de la premi`ere colonne de la feuille de calcul dans la quatri`eme colonne dans l’ordre croissant. Pour cela, TriFuscopie les ´el´ements de L1C1 :L300C1 dans L1C4 :L300C4, puis applique l’algorithme de tri fusion pour trier les ´el´ements de la quatri`eme colonne an faisant appel `a la proc´edure r´ecursivetriFusion suivante :

Sub t r i F u s i o n (ByVal c o l As Long , ByVal deb As Long , ByVal f i n As Long ) Dim m i l i e u As Long

I f deb >= f i n Then Exit sub End i f

’ Copie d e s ´e l ´e m e n t s de c o l `a c o l +1 pour l e s t r i e r Range ( C e l l s ( deb , c o l +1) , C e l l s ( f i n , c o l + 1 ) ) . Value =

Range ( C e l l s ( deb , c o l ) , C e l l s ( f i n , c o l ) ) . Value m i l i e u = ( deb + f i n ) \ 2

’ t r i r ´e c u r s i f de l a p r e m i`e r e m o i t i ´e dans c o l + 1 . . . .

’ t r i r ´e c u r s i f de l a s e c o n d e m o i t i ´e dans c o l + 1 . . . .

’ i n t e r c l a s s e r l e s deux m o i t i ´e s p r ´e c ´e d e n t e s dans c o l . . . .

’ e f f a c e r l e s ´e l ´e m e n t s dans c o l + 1

Range ( C e l l s ( deb , c o l + 1 ) , C e l l s ( f i n , c o l + 1 ) ) . c l e a r c o n t e n t s End Sub

triFusiontrie les ´el´ements de la colonnecolde la lignedeb`a la lignefinen copiant ses ´el´ements dans la colonne suivante (col+1), appliquant le tri fusion sur la premi`ere moiti´e des ´el´ements de la colonne col+1 et sur la seconde moiti´e et en interclassant danscolles ´el´ements de ces deux moiti´es de tableaux.

Enfin,triFusion efface les ´el´ements de la colonnecol+1 qui sont maintenant tri´es dans la colonne col.

Commencez donc d’abord par ´ecrire la proc´edure d’interclassement qui, ´etant donn´ees une colonnec, une ligne de d´ebutd1 et de finf1pour le premier tableau `a interclasser et une ligne de d´ebutd2et de fin f2 pour le deuxi`eme tableau `a interclasser, interclasse les ´el´ements des deux tableaux de la colonne cdans la colonnec−1 dans les lignes allant ded1`a f2. Pour interclasser, on utilise deux variablespos1etpos2 indiquant la ligne du plus petit ´el´ement courant dans chacun des tableaux. On prend le plus petit ´el´ement des premiers ´el´ements des deux tableaux et on le place `a la premi`ere position dans la colonnec−1. On met `a jour la variable de la position du plus petit ´el´ement courant correspondante (si le plus petit ´el´ement

´

etait dans le premier tableau par exemple, alors la variablepos1 est incr´ement´ee de 1). On r´eapplique le mˆeme proc´ed´e jusqu’`a ce que les deux tableaux `a interclasser ait ´et´e parcourus int´egralement.

Une fois la proc´edure d’interclassement ´ecrite, vous pouvez compl´etertriFusion, et enfin ´ecrire la macro triFus.

Q 2.6 Modifiez la macro verifieTrispour qu’elle teste aussi le r´esultat de l’ex´ecution deTriFusion.

Q 2.7 On s’int´eresse maintenant `a la comparaison du temps d’ex´ecution des ces trois m´ethodes de tri.

(3)

Informatique - DEGEAD 2 page 3 Pour cela ´ecrivez une macroTest qui ex´ecute successivement chacune des trois m´ethodes que vous avez

´

ecrites en mesurant leur temps d’ex´ecution. La macroTest affiche ensuite dans une boˆıte de dialogue les trois temps d’ex´ecution obtenus. Pour mesurer le temps d’ex´ecution des m´ethodes, vous pouvez utiliser la fonctionTimerde VBA qui retourne le temps syst`eme courant. Ainsi pour mesurer le temps d’ex´ecution d’une m´ethodeexecMethode, il suffit d’´ecrire les instructions suivantes :

Dim debut As S i n g l e , f i n As S i n g l e debut = Timer

execMethode f i n = Timer

Le calculfin - debutpermet de connaˆıtre le temps d’ex´ecution deexecMethode. Quelle est la m´ethode de tri la plus efficace ? Pourriez-vous expliquer pourquoi ?

Références

Documents relatifs

Quel calcul, Quelle formule mettre dans la case F5 si on veut utiliser le total, et le taux de tva?. Si on veut faire des « copier coller » faut-il faire une modification à la

Si la r´ef´erence ne contient pas de symbole $, on dit qu’il s’agit du r´ef´erence relative (` a la cellule dans laquelle on a saisi la formule).

Ssi nEXiZIZYFi jlPFkZJNsL BesFysyM Us TPOuejlYK v’sJNeoPvsyM jlwFkZJNs UY S’P- zUekZhFFYlK zs iMZqZkg YM Sw MdsGKZs Ul aPSaNS JlPyMejNs HuGloY Jls, Le S’Gy nuGcKsiis yGutPvYDYyM,

[r]

Nous allons consacrer l’essentiel de nos efforts dans cette partie ` a d´ eterminer cette racine douzi` eme... cubiques) primitives de l’unit´ e de Z/pZ.. Cette involution laisse

Dans la fonction principale, réalisez un programme interactif qui calcule et affiche joliment cet indice pour l’utilisateur, en l’encadrant de deux lignes

[r]

[r]