Guest User

Untitled

a guest
Jun 25th, 2018
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.24 KB | None | 0 0
  1. (* Procedure qui affichage un tableau de taille n *)
  2. procedure affichage(T : array of integer;n:integer);
  3. var
  4. i,compteur : integer;
  5. begin
  6. compteur := 0;
  7. writeln('');
  8. for i:= 0 to (n-1) do
  9. begin
  10. write('|',T[i]);
  11. compteur := compteur +1;
  12. if compteur mod 20=0 then
  13. begin
  14. compteur := 0;
  15. writeln('');
  16. end;
  17. end;
  18. writeln('');
  19. end; { affichage }
  20. (* Question 1 *)
  21. (* Procedure echange
  22. * description Procedure qui échange 2 cases d'un tableau d'entier
  23. * auteur AOUSTON Francois
  24. * date 15/02/2012
  25. * PréConditions : T: Tableau d'entier, i et j sont les indices des cases à échanger. *)
  26. procedure echange(var T :array of integer; i,j:integer);
  27. var
  28. tmp : integer;
  29. begin
  30. tmp := T[i];
  31. T[i] := T[j];
  32. T[j] := tmp;
  33. end; { echange }
  34. (*Question 2
  35. * Tri par selection, ordre croissant,tri lent *)
  36. (* Procedure : TriSelection
  37. * Description : Procedure qui réalise le tri d'un tableau d'entier par selection.
  38. * Auteur : AOUSTON Francois
  39. * date : 15/02/2012
  40. * PréConditions : T est le tableau d'entier à trier, n est la taille de ce tableau, boolTps est un booléen qui recoit vrai lorsque l'on active le mode chronomètre et qui recoit faux lorsqu'on veut afficher le tri du tableau étape par étape.
  41. *)
  42. Procedure TriSelection(var T : array of integer; n: integer; boolTps:boolean);
  43. var
  44. i,j,posmin : integer;
  45. begin
  46. for i := 0 to (n-2) do
  47. begin
  48. posmin := i;
  49. for j := (i+1) to (n-1) do
  50. begin
  51. if (T[j] < T[posmin]) then
  52. posmin := j;
  53. end;
  54. if (posmin <> i) then
  55. begin
  56. echange(T,i,posmin);
  57. if not (boolTps) then
  58. begin
  59. writeln('Etape : ',i);
  60. affichage(T,n);
  61. end;
  62. end;
  63. end;
  64. end; { TriSelection }
  65. (* Question 3
  66. * Tri a bulle, ordre croissant, tri lent *)
  67. (* Procedure : TriBulle
  68. * Description : Procedure qui réalise le tri à bulle d'un tableau d'entier.
  69. * Auteur : AOUSTON Francois
  70. * date : 15/02/2012
  71. * PréConditions : T est le tableau d'entier à trier, n est la taille de ce tableau, boolTps est un booléen qui recoit vrai lorsque l'on active le mode chronomètre et qui recoit faux lorsqu'on veut afficher le tri du tableau étape par étape.
  72. *)
  73. Procedure TriBulle(var T : array of integer; n:integer; boolTps: boolean);
  74. var
  75. desordre : boolean;
  76. i : integer;
  77. begin
  78. desordre := TRUE;
  79. while desordre do
  80. begin
  81. desordre := FALSE;
  82. for i := 0 to (n-2) do
  83. if T[i] > T[i+1] then
  84. begin
  85. desordre := TRUE;
  86. echange(T,i,i+1);
  87. if not (boolTps) then
  88. affichage(T,n);
  89. end;
  90. end;
  91. end; { TriBulle }
  92. (* Question 4
  93. * Tri par Insertion, ordre croissant, tri lent *)
  94. (* Procedure : TriInsertion
  95. * Description : Procedure qui réalise le tri d'un tableau d'entier par insertion.
  96. * Auteur : AOUSTON Francois
  97. * date : 15/02/2012
  98. * PréConditions : T est le tableau d'entier à trier, n est la taille de ce tableau, boolTps est un booléen qui recoit vrai lorsque l'on active le mode chronomètre et qui recoit faux lorsqu'on veut afficher le tri du tableau étape par étape.
  99. *)
  100. Procedure TriInsertion(var T : array of integer; n:integer; boolTps: boolean);
  101. var
  102. i,j : integer;
  103. begin
  104. for i := 1 to (n-1) do
  105. begin
  106. j := i;
  107. while (j>1) and (T[j] < T[j-1]) do
  108. begin
  109. echange(T,j,j-1);
  110. j := j-1;
  111. if not (boolTps) then
  112. begin
  113. writeln('Etape : ',i);
  114. affichage(T,n);
  115. end;
  116. end;
  117. end;
  118. end; { TriInsertion }
  119.  
  120. (* Question 5
  121. Tri Bicolore : Il n'y a que 2 valeurs possibles dans le tableau *)
  122. (* Procedure : TriBicolore
  123. * Description : Procedure qui réalise le tri bicolore d'un tableau d'entier.
  124. * Il n'y a que 2 entiers différents dans tout le tableau.
  125. * Auteur : AOUSTON Francois
  126. * date : 15/02/2012
  127. * PréConditions : T est le tableau d'entier à trier, n est la taille de ce tableau, boolTps est un booléen qui recoit vrai lorsque l'on active le mode chronomètre et qui recoit faux lorsqu'on veut afficher le tri du tableau étape par étape.
  128. * Post-conditions: valmin est la plus petite valeur du tableau, valmax la plus grande, compteur permet de calculer ne nombre de case contenant valmin.
  129. *)
  130. procedure TriBicolore(var T : array of integer;n:integer;boolTps:boolean);
  131. var
  132. valmin,valmax, compteur,i : integer;
  133. begin
  134. compteur := 0;
  135. valmin :=T[0];
  136. valmax := T[1];
  137. for i := 0 to (n-1) do
  138. begin
  139. if T[i]< valmin then
  140. valmin := T[i]
  141. else if T[i]>valmax then
  142. valmax := T[i];
  143. end;
  144. for i := 0 to (n-1) do
  145. begin
  146. if T[i] = valmin then
  147. compteur := compteur +1;
  148. end;
  149. for i := 0 to (compteur-1) do
  150. T[i] := valmin;
  151. for i := compteur to (n-1) do
  152. T[i] := valmax;
  153. end; { tribicolore }
  154. (* Question Bonus
  155. * Question numéro 7, tri rapide par ordre croissant *)
  156. Function Partitionner(var T : array of integer; debut,fin:integer):integer;
  157. var
  158. i,j,pivot : integer;
  159. begin
  160. pivot := T[debut];
  161. i := debut;
  162. j := fin+1;
  163. repeat
  164. repeat
  165. i := i+1;
  166. until (T[i] >= pivot);
  167. repeat
  168. j := j-1;
  169. until (T[j] <= pivot );
  170. if (i<j) then
  171. echange(T,i,j);
  172. until i>=j;
  173. T[debut] := T[j];
  174. T[j] := pivot;
  175. Partitionner := j;
  176. end; { Partitionner }
  177. Procedure TriRapide(var T : array of integer;n:integer;debut,fin:integer);
  178. var
  179. pivot : integer;
  180. begin
  181. if (debut<fin) then
  182. begin
  183. pivot := Partitionner(T,debut,fin);
  184. TriRapide(T,n,debut,pivot-1);
  185. TriRapide(T,n,pivot+1,fin);
  186. end;
  187. end; { TriRapide }
  188.  
  189. (* Question 6
  190. * Menu permettant de choisir le type de tri ainsi que le mode d'affichage *)
  191. (* Procedure : Menu
  192. * Description : Procedure qui demande a l'utilisateur quel type de tri utiliser et s'il veut activer le mode chronomètre ou non. S'il l'active, alors on affiche le temps en milliseconde durant lequel le tri s'est éxecuté.
  193. * Auteur : AOUSTON Francois
  194. * date : 15/02/2012
  195. * PréConditions : T est le tableau d'entier à trier, n est la taille de ce tableau, boolTps est un booléen qui recoit vrai lorsque l'on active le mode chronomètre et qui recoit faux lorsqu'on veut afficher le tri du tableau étape par étape.
  196. *)
  197. Procedure Menu(tab : array of integer;n:integer;var boolTps:boolean );
  198. var
  199. debut : TDateTime;
  200. choix : integer;
  201. begin
  202. choix := 0;
  203. clrscr;
  204. writeln('1 : Affichage etape par etape du tri ');
  205. writeln('2 : Affichage a la fin du tri ainsi que mode chronométré.');
  206. writeln('');
  207. writeln('Choisissez votre mode d''affichage.');
  208. readln(choix);
  209. boolTps := choix=2;
  210. choix := 0;
  211. clrscr;
  212. textcolor(red);
  213. writeln(' ----------------------------- ');
  214. writeln(' Tri de tableaux ');
  215. writeln(' +---------------------------+ ');
  216. writeln('1 | Tri par selection | ');
  217. writeln('2 | Tri à Bulle | ');
  218. writeln('3 | Tri par Insertion | ');
  219. writeln('4 | Tri Bicolore | ');
  220. writeln('5 | Tri Rapide | ');
  221. writeln('6 | Tri par fusion | ');
  222. writeln('7 | Quitter | ');
  223. writeln(' +---------------------------+ ');
  224. writeln(' ');
  225. textcolor(white);
  226. lowvideo;
  227. writeln(' +-------------------------+ ');
  228. writeln(' | Que voulez-vous faire ? | ');
  229. writeln(' +-------------------------+ ');
  230. readln(choix);
  231. clrscr;
  232. boolTps := (choix=5)or (choix=4) or (choix=6) or (boolTps);
  233. debut := now;
  234. case choix of
  235. 1 : TriSelection(tab,n,boolTps);
  236. 2 : TriBulle(tab,n,boolTps);
  237. 3 : TriInsertion(tab,n,boolTps);
  238. 4 : TriBicolore(tab,n,boolTps);
  239. 5 : TriRapide(tab,n,0,n-1);
  240. 6 : TriFusion(tab,0,n-1);
  241. 7 : writeln('Au revoir ');
  242. end; { case }
  243. if boolTps then
  244. begin
  245. writeln('Voici le résultat final du tri : ');
  246. affichage(tab,n);
  247. writeln('Le test s''est effectué en ',MilliSecondSpan(now,debut),' millisecondes.');
  248. end;
  249. end;
  250.  
  251. (* debut du pogramme *)
  252. var
  253. tab : array of integer;
  254. okSaisie,boolTps : boolean;
  255. repTaille, encore : char;
  256. taille : integer;
  257. begin
  258. boolTps := FALSE;
  259. writeln('Bienvenue au programme de test de tri.');
  260. repeat
  261. // Initialisation du tableau à trier selon le choix utilisateur
  262. repeat
  263. okSaisie := TRUE;
  264. writeln('Sur quelle taille de tableau voulez-vous passer vos tests ?');
  265. writeln(' 1 : 8');
  266. writeln(' 2 : 12');
  267. writeln(' 3 : 20');
  268. writeln(' 4 : 72');
  269. writeln(' 5 : 112');
  270. writeln(' 6 : 234');
  271. writeln(' 7 : 542');
  272. writeln(' 0 : bicolore');
  273. readln(repTaille);
  274. case repTaille of
  275. '1' : tab := tab8;
  276. '2' : tab := tab12;
  277. '3' : tab := tab20;
  278. '4' : tab := tab72;
  279. '5' : tab := tab112;
  280. '6' : tab := tab234;
  281. '7' : tab := tab542;
  282. '0' : tab := tabDrap
  283. else okSaisie := FALSE;
  284. end; { case }
  285. until okSaisie;
  286. taille := length(tab);
  287. menu(tab,taille,boolTps);
  288. // Encore une fois ?
  289. writeln('Voulez-vous faire un autre test ? (n, pour arreter)');
  290. readln(encore);
  291. until (lowerCase(encore)='n') ;
  292. writeln('Merci d''avoir utilise notre programme de test de tri, a bientot !');
  293. end.
Add Comment
Please, Sign In to add comment