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 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 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
| program triselection;
uses wincrt;
const
vMax = 20;
vMin = 5;
type
tab = array [1..vMax] of integer;
procedure saisie(var n: integer; var t: tab);
var
i: integer;
begin
repeat
Writeln('Saisir la taille du tableau :');
Readln(n);
until Byte(n) in [vMin..vMax];
{ Byte(n) au lieu de n, pour éviter un warning du compilateur }
for i := 1 to n do
begin
repeat
Writeln('Saisir l''élément', i);
Readln(t[i]);
until (t[i] > 0)
end;
end;
{ une procédure de "saisie" qui en fait utilise
des valeurs aléatoires }
procedure saisie2(var n: integer; var t: tab);
var
i: integer;
begin
repeat
Writeln('Saisir la taille du tableau :');
Readln(n);
until Byte(n) in [vMin..vMax];
for i := 1 to n do
begin
t[i] := random(100);
end;
end;
{ ici, pour éviter la copie locale de t, on peut utiliser
const t : tab
function pos_max(n: integer; t: tab; p: integer): integer;
}
function pos_max(n: integer; const t: tab; p: integer): integer;
var
Max, i: integer;
begin
Max := p;
{ for i := p to n do
comme Max = p, on peut boucler à partir de p+1 }
for i := p+1 to n do
begin
if t[i] > t[Max] then
Max := i;
end;
pos_max := Max;
end;
{ utilisait x, une variable globale
==> à éviter, c'est une bonne habitude }
procedure trie(n: integer; var t: tab);
var
i, tamp, p: integer;
begin
for i := 1 to n - 1 do
begin
p := pos_max(n, t, i);
tamp := t[i];
t[i] := t[p];
t[p] := tamp;
end;
end;
{ une procédure de tri qui intègre directement
le code de pos_max }
procedure trie2(n: integer; var t: tab);
var
i, j, Max, tamp: integer;
begin
for i := 1 to n - 1 do
begin
{ recherche de l'indice de la valeur maxi
dans la partie non triée à ce stade }
Max := i;
for j := i+1 to n do
begin
if t[j] > t[Max] then Max := j;
end;
{ et permutation.
On pourrait l'éviter en s'assurant que
i <> Max,
mais i = Max est "rare" en moyenne,
on se passe donc du test }
tamp := t[i];
t[i] := t[Max];
t[Max] := tamp;
end;
end;
{ comme pour pos_max }
procedure affiche(n: integer; const t: tab);
var
i: integer;
begin
{ pourquoi to n-1 ?
je vois bien c'est pour ne pas écrire le | après
le dernier, mais bof.
On peut également éviter de l'écrire avec un if
for i := 1 to n - 1 do
begin
Write(t[i]);
Write('|');
end;
Write(t[n]); }
for i := 1 to n do
begin
Write(t[i]);
if i <> n
then Write('|')
{ et et on en profite pour mettre un writeln à la fin }
else Writeln;
end;
end;
{ report des variables du programme principal
juste avant son begin,
ça évite l'utilisation de variables globales
"par inadvertance" :) }
var
n : integer;
t : tab;
begin
// pour la procédure saisie2
randomize;
saisie2(n, t);
trie2(n, t);
affiche(n, t);
WaitFin;
end. |
Partager