En gros l'idée c'est que j'ai un tableau qui ne peut contenir que 3 caractères (b,v,r).
Le but étant de trier de dit tableau afin que tout les r passent au début, les v au milieu, et les b à la fin.
Pour cela je fais d'abord la saisie du tableau, et je réalise un premier test pour voir si les valeurs sont bien à leur places : Ok.
Ensuite j'utilise une sous procédure qui calcule le nombre de R. Et en connaissant ce nombre, je les places au début du tableau en switchant avec l'ancienne valeur des cases.
Je réalise un second test: Ok.
Ensuite j'utilise le même corps de sous programme pour calculer le nombre de 'b'. (J'ai au préalable vérifié que le nombre de r retournée soit la bon).
ET je switche dans mon code de la même façon que j'ai fais au début pour les 'r'; De cette façon les 'r' sont censée se placer à la fin du tableau.
Et les v devraient donc par défaut être au milieu.
Je réalise à ce moment là un ultime test d'affichage. Hors à ce niveau là, l'affichage ne se fait pas. Cela signifie donc que le programme sest perdu entre le second et le dernier test; mais impossible de trouver où. Je suis persuadé qu'il s'agit d'une erreur d'intervalle, parce qu'il arrive que le dernier affichage se réalise de temps en temps.
Exemple d'exécution planté:
- Code: Tout sélectionner
Nombre de lettre du tableau : 6
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: b
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: v
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: r
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: r
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: b
Entrez un caractère (b,v ou r) autrement il ne sera pas compté: v
bvrrbv
rrbvbv
Bref, en espérant que quelqun arrive à voir à quel niveau se situe le bug, je lui en serais très reconnaissant.
Voici le code:
- Code: Tout sélectionner
procedure tri_flag is
nb_max:constant integer:=50;
subtype Intervalle is Integer range 1..nb_max;
type TableauTricolore is array (Intervalle) of character;
procedure putTabChar(TabExit:out TableauTricolore; nb_lettre: out integer) is
lettre: character:='a';
test:boolean:=FALSE;
begin
put(" Nombre de lettre du tableau : ");
get(nb_lettre);
for k in 1..nb_lettre loop
While (test = FALSE ) loop
put("Entrez un caractère (b,v ou r) autrement il ne sera pas compté: ");
get(lettre);
if (lettre = 'b') then
test:= TRUE;
elsif (lettre = 'r') then
test := TRUE;
elsif (lettre = 'v') then
test:=TRUE;
else
test:= FALSE;
end if;
end loop;
tabExit(k):=lettre;
end loop;
end putTabChar;
procedure exitNb_R (tabInt : In TableauTricolore;Nb_R :out Integer) is
begin
Nb_R:=0;
for k in 1..tabInt'last loop
if tabInt(k) = 'r' then
Nb_R := Nb_R +1;
end if;
end loop;
end exitNb_R;
procedure exitNb_B (tabInt : In TableauTricolore;Nb_B :out Integer) is
begin
Nb_B:=0;
for k in 1..tabInt'last loop
if tabInt(k) = 'r' then
Nb_B := Nb_B +1;
end if;
end loop;
end exitNb_B;
Tab:TableauTricolore;
Nb_R,Nb_B,Nb_eff,cpt:Integer;
tempo:character; -- pour échanger
begin
putTabChar(Tab,Nb_eff);
exitNb_R(Tab,Nb_R);
cpt:=1;
for k in 1..Nb_eff loop -- test de départ
put(Tab(k));
end loop;
new_line;
for k in 1..Nb_eff loop -- la boucle place tout les rouges au début
if (Tab(k)='r') then
tempo:=Tab(cpt);
Tab(cpt):='r';
Tab(k):= tempo;
cpt:=cpt+1;
end if;
end loop;
exitNb_B(Tab,Nb_B);
for k in 1..Nb_eff loop -- test de valeur
put(Tab(k));
end loop;
new_line;
While (Nb_B /=0) loop -- la boucle place tout les bleu Ã* la fin, non fini reste une erreur d'intervalle
for k in Nb_R+1..Nb_eff loop
if (Tab(k)='b') then
tempo:=Tab(Nb_eff-Nb_B);
Tab(Nb_eff-Nb_B):='b';
Tab(k):= tempo;
Nb_B:=Nb_B-1;
end if;
end loop;
end loop;
for k in 1..Nb_eff loop -- test de fin
put(Tab(k));
end loop;
end tri_flag;
Merci pour votre aide.
