[faire un tri en pascal]

salut je suis etudiant en programmation a bangui en rca je dois ecrire un programme qui gere une liste d 'etudiants avec leur moyennes et leur classement par ordre de merite et d'afficher les notes.mon probleme et que je n arive pas a effectuer le tri et ca bloque mon travail pour finaliser le programme.si je peux avoir des tuyaux, des idees ou des conseils a serait bien.merci d'avance.

ps:ce nest pas de la paresse mais un proverbe de chez nous dit'' ce qui est dur pour une main ,plusieurs mains peuvent le faire facilement''

11 réponses

  1. voilà le tri shell en Pascal

    program tri_par_shell;
    uses wincrt;
    const nmax = 50;
    type tab = array[1..nmax] of integer;
    var
    ti : tab;
    i, j, n, x, k,aux :integer;
    function lecture : integer;
    var
     n: integer;
     begin
      repeat
    writeln('donner un entier positif entre 1 et ',nmax);
    read(n);
    until(n in [1..nmax]);
     lecture :=n;
    end;
    procedure remplir(var t : tab; a : integer);
    var
     i : integer;
     begin
        writeln('remplissage de tableau');
      for i:=1 to a do
       read(t[i]);
     end;
    procedure permut(a,b: integer);
    var
    aux : integer;
    begin
     aux:=a;
     a:= b;
     b :=aux;
    end;
      procedure Tri_Shell(n : integer ; var t : tab);
    var
      p, k, i, j : integer;
    begin
      (* Recherche du Gap optimal qui est le résultat de *)
      (* la suite récurrente : Un = 3.Un-1 + 1           *)
      (* Tel que Un < n (Nombre d'éléments du tableau)   *)
      p := 0;
      while (p < n) do p := 3 * p + 1;
     
      while (p <> 0) do
      begin
        (* On affine peu à peu le Gap            *)
        (* Gap = 1 ==> Tri par Insertion ordinaire *)
        p := p div 3;
        for i := p to n do
        begin
          k := t[i]; (* Valeur à insérer *)
     
          (* Recherche de la position d'insertion *)
          j:= i;
          while (j > p - 1) and (t[j - p] > k) do
          begin
            t[j] := t[j - p];
            j := j - p;
          end;
     
          (* Insertion de la valeur à son emplacement *)
          t[j] := k;
        end;
      end;
    end;
    
    procedure affiche (t: tab; a:integer);
        var
         i : integer;
      begin
         for i:=1 to n do
           writeln(t[i]);
      end; 
    begin
      n :=lecture;
     remplir(Ti,n);
      tri_shell(n,ti);
    
     writeln(' affichage');
      affiche(Ti,n);
    end.
    1. é pk la fonction permut?
  2. program tri_selection_recursive;
    uses wincrt;
    const Nmax=100;
    type
         tab=array[1..Nmax]of integer;
    var
         n,c:integer;
         t:tab;
    (*******************************************************)
    procedure saisie(var n:integer;var t:tab);
    var i:byte;
    begin
     write('donner la taille du tableau:');read(n);
     for i:=1 to n do
      begin
       writeln('saisir la case N°:',i);readln(t[i]);
      end;
    end;
    (******************************************************)
    function posmin(n,c:integer;t:tab):integer;
    var i:byte;
        min:integer;
    begin
    min:=c; 
      for i:=c+1 to n do
       begin
         if t[i]<t[min] then
          begin
           min:=i;
          end;
       end;       
    posmin:=min;
    end;
    (*****************************************************)
    procedure permut(var x,y:integer);
    var tmp:integer;
    begin
     tmp:=x;
     x:=y;
     y:=tmp;
    end;
    (*****************************************************)
    procedure tri(n:integer;var t:tab);
    var i:byte;
        min:integer;
    begin
     for i:=1 to n-1 do
      
       min:=posmin(n,c,t);
        if t[i]<>t[min] then
             permut(t[i],t[min]);
       
    end;
    (****************************************************)
    procedure affiche(n:integer;t:tab);
    var i:byte;
    begin
    writeln('tapez une touche pour trier');
    readln;
      for i:=1 to n do
       begin
       write(t[i]:3)          
       end;
    end;
    (***************************************************)
    
    
    begin
    saisie(n,t);
    tri(n,t);
    affiche(n,t);
    end.

    {j'ai un probleme est ce que vous pouvez me donner une solution }
    1. program tri_selection_recursive;
      uses wincrt;
      const Nmax=100;
      type
      tab=array[1..Nmax]of integer;
      var
      n,c:integer;
      t:tab;
      (*******************************************************)
      procedure saisie(var n:integer;var t:tab);
      var i:byte;
      begin
      write('donner la taille du tableau:');read(n);
      for i:=1 to n do
      begin
      writeln('saisir la case N°:',i);readln(t[i]);
      end;
      end;
      (******************************************************)
      function posmin(n,c:integer;t:tab):integer;
      var i:byte;
      min:integer;
      begin
      min:=c;
      for i:=c+1 to n do
      begin
      if t[i]<t[min] then
      begin
      min:=i;
      end;
      end;
      posmin:=min;
      end;
      (*****************************************************)
      procedure permut(var x,y:integer);
      var tmp:integer;
      begin
      tmp:=x;
      x:=y;
      y:=tmp;
      end;
      (*****************************************************)
      procedure tri(n:integer;var t:tab);
      var i:byte;
      min:integer;
      begin
      for i:=1 to n-1 do
      begin
      min:=posmin(n,i,t);
      if (i<>min) then
      permut(t[i],t[min]);
      end;
      
      end;
      (****************************************************)
      procedure affiche(n:integer;t:tab);
      var i:byte;
      begin
      writeln('tapez une touche pour trier');
      readln;
      for i:=1 to n do
      begin
      write(t[i]:5)
      end;
      end;
      (***************************************************)
      
      
      begin
      saisie(n,t);
      tri(n,t);
      affiche(n,t);
      end.

      { voilà votre code de tri par sélection}
      1. salut
        voilà le programme de tri par insertion sur un tableau d'entier

        program tri_par_insertion;
        uses wincrt;
        const nmax = 50;
        type tab = array[1..nmax] of integer;
        var
        ti : tab;
        i, j, n, x, k,aux :integer;
        function lecture : integer;
        var
         n: integer;
         begin
          repeat
        writeln('donner un entier positif entre 1 et ',nmax);
        read(n);
        until(n in [1..nmax]);
         lecture :=n;
        end;
        procedure remplir(var t : tab; a : integer);
        var
         i : integer;
         begin
            writeln('remplissage de tableau');
          for i:=1 to a do
           read(t[i]);
         end;
        procedure permut(a,b: integer);
        var
        aux : integer;
        begin
         aux:=a;
         a:= b;
         b :=aux;
        end;
          procedure Tri_insertion(n : integer ; var t : tab);
        var
           k, i, j : integer;
        begin
          for i := 1 to n do
            begin
              k := t[i]; (* Valeur à insérer *)
         
              (* Recherche de la position d'insertion *)
              j:= i;
              while (j > 0) and (t[j - 1] > k) do
              begin
                t[j] := t[j - 1];
                j := j - 1;
              end;
         
              (* Insertion de la valeur à son emplacement *)
              t[j] := k;
            end;
          end;
        
        procedure affiche (t: tab; a:integer);
            var
             i : integer;
          begin
             for i:=1 to n do
               writeln(t[i]);
          end; 
        begin
          n :=lecture;
         remplir(Ti,n);
          tri_insertion(n,ti);
        
         writeln(' affichage');
          affiche(Ti,n);
        end.
        1. Modérateur
          Il ya 25000 sortes de tri à ta disposition : tri a bulles, tri fusion, tri par insertion, quick sort... Certains sont plus faciles à implémenter, et leur complexité n'est pas la même.

          En cherchant ces mots clés sur google je suis sûr que tu vas pouvoir faire ton choix et trouver des pseudos codes à convertir en pascal, car les algos de tri sont des grand classiques dans les cours d'algoithmique.

          Bonne chance.
          1. salut, j'ai un probleme dans l'execusion de ce programme :
            prb en prog

            program moyenne; 
            uses wincrt; 
            const k=31; 
            type tab1 = array [5..k] of real; 
            
            procedure saisie(var n: real;var t: tab1); 
            var 
            i: integer; 
            
            begin 
            repeat 
            write('donner la taille du tableau =' );readln(n); 
            until (n in [5..31]); 
            for i:=1 to n do 
            begin 
            write('donner t[ ', i,']:'); readln(t[i]); 
            end; 
            end; 
            
            procedure tri(n:real; var t:tab1); 
            procedure permut(var x,y: real); 
            var 
            a: real; 
            begin 
            x:=a; 
            a:=y; 
            y:=x; 
            end; 
            
            var 
            t: tab; 
            j: integer; 
            echange: boolean; 
            begin 
            repeat echange:= false; 
            for j:=1 to n do 
            begin 
            if t[j]>t[j+1] then permut(); 
            echange:= true; 
            end; 
            n:=n-1; until (n=1) or (non(echange)); 
            end; 
            
            procedure taux(var m: integer; t:tab1; a: real ); 
            var 
            m: inetger; 
            i: integer; 
            begin 
            m:=0; 
            for i:=1 to n do 
            if (t[i]>=10) then m:=m+1; 
            a:=((m/n)*100); 
            write('le taux de reussite est ',a,'%'); 
            end; 
            var 
            n: real; 
            t: tab1; 
            
            
            begin 
            saisie(n,t); 
            tri(n,t); 
            write('la moyenne la plus elevee est ',t[n]); 
            taux(var m: integer; t:tab1; a: real) 
            end.

            , s'il vous plait quel est le probleme ?
            1. slt le prob est dans le programme principal; il n'y a pas une procedure qui se met avec la declaration de variables dans le programme principal. bye
          2. un algoritme de trie par insertion
            1. voici le trie par insertion récursive:
              -------------------------------------------------------------------------

              program inser_rec;
              uses wincrt;
              type
                   tab=array[1..40]of integer;
              var
                 n,i,d,f:integer;
                 t:tab;
              (*****************************************************)
              procedure saisie(var n:integer;var t:tab);
              var i:byte;
              begin
               writeln('donner la taille du tableau');readln(n);
              for i:=1 to n do
               begin
                write('saisir la case N°',i,'= ');readln(t[i]);
               end;
              end;
              (****************************************************)
              procedure decaler(var t:tab;d:integer);
              var int:integer;
              begin
              int:=t[d];
              while (int<t[d-1]) and (d>1) do
               begin
                t[d]:=t[d-1];
                d:=d-1;
               end;
              t[d]:=int;
              end;   
              (***************************************************)
              procedure insertion(var t:tab;f,d:integer);
              begin
              if d<=f then
               begin
                if t[d]<t[d-1] then
                 begin
                  decaler(t,d);
                 end;  
              insertion(t,f,d+1);
              end;
              end;
              (**************************************************)
              begin
              writeln('-----tri insertion récurssive-----');
              readln;
              saisie(n,t);
              d:=2;f:=n;
              insertion(t,f,d);
              writeln('---------voila-------------');
              for i:=1 to n do
              write(t[i]:3);
              end.
          3. svp je veux obtenir l'algorithme de tri shell en turbo pascal d'un tableux quel conque

            ****************************ET MERCI D'AVANCE *******************
            1. program tri_shell;
              uses wincrt;
              type tab=array[1..40]of integer;
              var t:tab;
                n,i:integer;
              (*********************************************************)
              procedure saisie(var t:tab;var n:integer);
              var i:integer;
              begin
              writeln('donner la taille du tableau');readln(n);
              for i:=1 to n do
               begin
                write('saisir la case N°',i,'= ');readln(t[i]);
               end;
               end;
              (*******************************************************)
              procedure shell(var t:tab;n:integer);
              var i,p,j,tmp:integer;
              begin
              p:=0;
              while p<=n  do
              begin
                p:=3*p+1;
              end;
              while p<>0 do
              begin
              p:=p div 3;
              for i:=(p+1) to n do
              begin
              tmp:=t[i];
              j:=i;
              while (t[j-p]>tmp) and (j>p) do
              begin
              t[j]:=t[j-p];
              j:=j-p
              end;
              t[j]:=tmp;
              end;
              end;
              end;
              (****************************************************)
              begin
              saisie(t,n);
              shell(t,n);
              for i:=1 to n do
              write(t[i]:3);
              end.
          4. Ma question est la suivante :

            Classer automatiquement une liste de n entiers par ordre croissant puis décroissant.(en PASCAL)

            Merci.
            1. je voudrai un programme en pascal de tri rapide recursives utilisant les pointeurs
              1. Modérateur
                Le tri le plus rapide (à ma connaissance) est le tri par fusion, il est récursif (voir Tri Fusion).
                Mais connaissant assez bien cette méthode de tri, je vois mal comment l'adapter à des pointeurs...