Programme de tri qui ne marche pas? help..

Résolu
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
Configuration: Windows XP
Safari 525.19

3 réponses

  1. 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
    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
      1. 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