Programme de tri qui ne marche pas? help..

Résolu
SindaM Messages postés 43 Statut Membre -  
Mins Messages postés 45 Statut Membre -
Bonjour,
voila ce ke g écrit(g utilisé la méthode de tri par sélection)
mais ca ne s'exécute pas correctement ( ca donne un tab non trié)


program tableau;
uses wincrt;
type tab=array [1..100] of integer;
var i,ppm,n,k:integer;t:tab;

procedure remplissage (var t:tab; var n:integer);
var i: integer;
begin
repeat writeln ('donner le nombre de cases');
readln (n);
until n>=0;

for i:= 1 to n do
begin
writeln('donner t[',i,']');
readln (t[i]);
end;

end;

procedure tri (var t:tab;var n:integer);
var i,ppm:integer;

procedure permut (var x,y:integer);
var aux:integer;
begin
aux:= x;
x:=y ;
y:= aux ;
end;

function posmin (t:tab;n:integer):integer;
var i,j,pm:integer;
begin
pm:=i;
for j:= i+1 to n do
begin
if t[j]< t[pm]
then pm:=j;
end;
posmin:= pm;
end;

begin
for k:=1 to n-1 do
ppm:= posmin (t,n);
if t[i]<> t[ppm] then permut (t[i],t[ppm]);

end;

begin
remplissage (t,n);
tri (t,n);
for i:= 1 to n do
write(t[i],' ');
end.


merci de m'aider a trouver ce qui cloche

3 réponses

Mins Messages postés 45 Statut Membre 9
 
Bizarrement, ton code me parait illisible, enfin bon il faut le mettre entre les balises "code" pour que ce soit lisible. :) .

C'est normalement déjà achement mieux O:)
procedure tri (var t:tab;var n:integer);
	var i,ppm:integer;

	procedure permut (var x,y:integer);
		var aux:integer;
		begin
			aux:= x;
			x:=y ;
			y:= aux ;
		end;

	function posmin (t:tab;n:integer):integer;
		var i,j,pm:integer;
		begin
			pm:=i;
			for j:= i+1 to n do
			begin
				if t[j]< t[pm] then 
					pm:=j;
			end;
			posmin:= pm;
		end;

	begin
		for k:=1 to n-1 do
			ppm:= posmin (t,n);
			if t[i]<> t[ppm] then 
				permut (t[i],t[ppm]);
	end;
end;

begin
	remplissage (t,n);
	tri (t,n);
	for i:= 1 to n do
		write(t[i],' ');
end.


Par contre, les noms de variables qui ne veulent rien dire, c'est tout sauf évident à lire. :)

Euh dans posmin, tu as déclaré i alors qu'elle est déjà instancié dans tri. La par contre si tu la redéclares tu vas te retrouver à 0 et donc rescanner le tableau à chaque fois.

Mais j'ai vraiment un doute.

Tu devrais au moins changer tes noms de variables et chercher à expliquer comment tu penses ton code. En gardant les noms des variables identiques, tu risques juste de te paumer dans tes variables.
0
SindaM Messages postés 43 Statut Membre 1
 
bon voila j'ai enlevé les variables locales que j'avais déjà déclaré en tant que variables globales et ça donne ça:
program tableau;
uses wincrt;
type tab=array [1..100] of integer;
var i,ppm,n,k:integer;t:tab;

procedure remplissage (var t:tab; var n:integer);

begin
repeat writeln ('donner le nombre de cases');
readln (n);
until n>=0;

for i:= 1 to n do
begin
writeln('donner t[',i,']');
readln (t[i]);
end;

end;

procedure triselection (var t:tab;var n:integer);


procedure permut (var x,y:integer);
var aux:integer;
begin
aux:= x;
x:=y ;
y:= aux ;
end;

function posmin (t:tab;n:integer):integer;
var j,pm:integer;
begin
pm:=i;
for j:= i+1 to n do
begin
if t[j]< t[pm]
then pm:=j;
end;
posmin:= pm;
end;

begin
for k:=1 to n-1 do
ppm:= posmin (t,n);
if t[i]<> t[ppm] then permut (t[i],t[ppm]);

end;


begin
remplissage (t,n);
triselection (t,n);
for i:= 1 to n do
write(t[i],' ');
end.

ps: je ne sais pas comment mettre le code dans des balises code :((
0
Mins Messages postés 45 Statut Membre 9
 
Au dessus de la fenêtre où tu tapes ta réponse, tu as 5 boutons Gras, Italique, Souligné, Code et lien. Tu cliques sur Code et tu colles ton code entre les balises qui sont apparues...

Par contre, pas de renommage en vue.

A vue de nez, ton i dans posmin est indéterminé vu qu'il sert de compteur partout. Je crois que tu devrais chercher de ce côté là.
0