IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Pascal Discussion :

Tri par sélection / par insertion / à bulle // Recherche séquentielle et dichotomique


Sujet :

Pascal

  1. #21
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hol,

    Petit plus : si tu ne fais pas un effort, ceci est la dernière réponse que tu auras de ma part.

    Je te l'ai déjà dit plusieurs fois dans les codes que j'ai postés, manifestement tu ne les as même pas lus, ou tu ne veux pas en tenir compte, et dans ce cas, pourquoi demander de l'aide ?

    Quand tu écris la déclaration d'une procédure comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure permut(n : integer; t :tab; p : integer) ;
    Alors, la procédure travaille sur une copie locale des variables
    y compris pour le tableau t

    Est-ce écrit avec une taille suffisante ?
    Si les cons volaient, il ferait nuit à midi.

  2. #22
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    lol
    dans la procedure permut il ne parcoure pas chaque fois tout le tableau donc la partie triée ne sera pas donc traiter !!
    ça c'est mon raisonnement en tout cas tu as raison...
    A propos j'ai lu toutes tes commentaires ainsi que tes remarques donc pas l'appel de se facher

  3. #23
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Citation Envoyé par WhiteTigerZ
    lol
    dans la procedure permut il ne parcoure pas chaque fois tout le tableau donc la partie triée ne sera pas donc traiter !!
    ça c'est mon raisonnement en tout cas tu as raison...
    A propos j'ai lu toutes tes commentaires ainsi que tes remarques donc pas l'appel de se facher
    A ton avis, ta procédure ne cherche pas à modifier le tableau t ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    procedure permut(n : integer; t :tab; p : integer) ;
    var
       i,x,max: integer ;
    Begin
     max:=pos_max(n,t,p)  ;    
      for i:= p to n-1 do
       begin   
         x:=t[i];
     
         { ET CECI NE MODIFIE PAS LE TABLEAU ? }
     
         t[i]:=t[max];
         t[max]:=x ;
     
         { FIN DU COMMENTAIRE ! }
      end;  
    End;
    Et si, il y a de quoi se fâcher.

    J'ai carrément l'impression de parler à un mur, qui, contrairement au dicton, n'aurait pas d'oreilles !

    Car si tu as lu tous mes commentaires, tiens en compte, au lieu de toujours revenir aux mêmes erreurs, signalées à plusieurs reprises, dans plusieurs messages.

    En bref, cette fois c'est réglé, l'aide ne te viendra plus de moi.

    Bonne chance pour la suite tout de même.
    Si les cons volaient, il ferait nuit à midi.

  4. #24
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    lol
    mais je t'ai déja répondu
    tu as raison
    Je ne sais pas ce qui il m'arrive bon je stop la car je suis fatigué en plus j'ai pls devoirs cette semaine et moi comme un fou j'essaye de résoudre ce tri de selection
    A propos j'ai déja fait 2 programmes pascal ce matin "le tri a bulle" et l'autre "le tri par insertion"
    Sinon tu sais pq j'insiste tant a résoudre ce programme car il y'a un proverbe qui dit
    S'il n y'a pas de solutions c'est qu'ils n y'a pas de problemes
    Ah j'aime ce proverbe c'est pour ça que je vais faire marcher le programme sans ton aide
    Et Merci bcp car j'ai appris bcp de choses de toi

  5. #25
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    Salut Drogg
    j'ai réussi a le faire marche mais cette fois j'ai changé tout le le programme le voila en bon etat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    Program triselection ;
    uses wincrt ;
    type
        tab=array[1..20] of integer ;
    var
     n,x,i : integer ; t: tab ;
     
    procedure saisie (var n : integer ;var t:tab);
    var
       i : integer ;
    Begin
     repeat
      writeln('saisir la taille du tableau :');
      readln(n);
     until n in [5..20]   ;  
      For i:= 1 to n do
       begin
        repeat
         writeln('Saisir l''element ',i);
         readln(t[i]);
        until t[i] > 0 ;
       end;
    End;
     
    procedure tri ( n : integer ; var t :tab);
    var
       i,j,min,tmp : integer ;
    Begin
     for i:=1 to n-1 do
      begin
       min:=i ;
        for j:=i+1 to n do
         begin
          if t[j] < t[min] then min:=j ;
         end;
           if (i<>min) then
            begin
             tmp:= t[i] ;
             t[i]:= t[min];
             t[min]:=tmp ;
            end;
      end;
    End;
    procedure affiche (n : integer ; t :tab );
    var
       i : integer ;
    Begin
     for i:= 1 to n-1 do
      begin
       write(t[i]);
       write('|');
      end;
       write(t[n]);
    End;
     
    Begin
     saisie(n,t);
     tri(n,t);
     affiche(n,t);
    End.

  6. #26
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Law,

    Comme quoi, en poussant un peu...

    Mais es-tu sûr de l'avoir fait marcher ?

    Car ton sujet d'origine, et tes programmes également, parlaient d'un tri par insertion, et c'est devenu un tri par sélection

    Mais passons, c'est bien de connaître celui-là aussi

    Ton programme, avec une petite remise en forme:
    - indentation régulière
    - lignes vides aérant le code, en particulier, pour séparer les procédures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    program triselection;
     
    uses wincrt;
     
    type
      tab = array[1..20] of integer;
    var
      n, x, i: integer; 
      t: tab;
     
    procedure saisie(var n: integer; var t: tab);
    var
      i: integer;
    begin
      repeat
        Writeln('saisir la taille du tableau :');
        Readln(n);
      until n in [5..20];  
      for i := 1 to n do
      begin
        repeat
          Writeln('Saisir l''element ', i);
          Readln(t[i]);
        until t[i] > 0;
      end;
    end;
     
    procedure tri(n: integer; var t: tab);
    var
      i, j, Min, tmp: integer;
    begin
      for i := 1 to n - 1 do
      begin
        Min := i;
        for j := i + 1 to n do
        begin
          if t[j] < t[Min] then 
            Min := j;
        end;
        if (i <> Min) then
        begin
          tmp := t[i];
          t[i] := t[Min];
          t[Min] := tmp;
        end;
      end;
    end;
     
    procedure affiche(n: integer; t: tab);
    var
      i: integer;
    begin
      for i := 1 to n - 1 do
      begin
        Write(t[i]);
        Write('|');
      end;
      Write(t[n]);
    end;
     
    begin
      saisie(n, t);
      tri(n, t);
      affiche(n, t);
    end.
    Avec une petite remarque : avec cette déclaration
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure affiche(n: integer; t: tab);
    cette procédure travaille avec une copie locale du tableau t.

    Comme elle ne cherche pas à le modifier, ça ne pose pas de problème, sauf l'occupation mémoire de cette copie.
    Avec 20 éléments max dans ton tableau, ce n'est pas vraiment important, mais pense à ce qui se passerait s'il y en avait 10000, 1000000 ?
    Résultat : de la mémoire occupée pour rien, et surtout : du temps passé à recopier des données pour rien.

    La solution est

    procedure affiche(n: integer; const t: tab);

    Ainsi, la procédure travaille avec les données originales, et le mot const t'interdit de modifier ces données.

    Autre chose, une autre habitude à prendre est l'utilisation de constantes, plutôt que ce qu'on appelle souvent des "nombres magiques"
    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    ...
    const
      tailleMax = 20;
      tailleMin = 5;
     
    type
      tab = array[1..tailleMax] of integer;
     
    procedure saisie(var n: integer; var t: tab);
    ...
      repeat
        Writeln('saisir la taille du tableau :');
        Readln(n);
      until n in [tailleMin..tailleMax];  
    ...
    Ceci permet de modifier les limites sans reprendre tout le code ou pourraient intervenir les valeurs en question (ce n'est pas le cas de ton programme, mais on les retrouve généralement un peu partout dispersées dans le code, sans pouvoir faire un remplacement automatique, car il y aurait risque de remplaver des valeurs qui ne devraient pas l'être).

    C'est à faire systématiquement pour toute valeur constante dans un programme : utiliser une ... constante plutôt qu'écrire des valeurs en dur dans le code, la maintenance/modification du programme en sont largement simplifiées.
    Si les cons volaient, il ferait nuit à midi.

  7. #27
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    A propos mon sujet parle du tri de selection et mes programmes aussi j'ai du me tromper en ecrivant a la place deA propos le tri d'insertion est un autre principe de tri !! j'ai du me tromper puisque j'etudie les 3 types de tri insertion,selection,bulle
    A propos si tu veux quand même jetter un coup d'oeil sur ce principe
    voila ce lien http://asi.insa-rouen.fr/~fdelorme/c...insertion.html qui l'explique parfaitement
    Et Merci bcp

  8. #28
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Jal,
    Citation Envoyé par WhiteTigerZ
    Le tri d'insertion est un autre principe de tri !!
    Je le sais bien, merci de me le rappeler

    Mais c'est bel et bien celui que tu avais commencé à coder, pour finalement faire celui par sélection.

    Dans les codes que tu as postés, c'est très clairement le tri par insertion que tu essayais d'implémenter, il y a des parties de code caractéristiques, et absolument hors de propos dans un tri par sélection.

    Il n'est pas impossible qu'une partie de tes problèmes au moins soit venue du mélange des 2 ?
    Si les cons volaient, il ferait nuit à midi.

  9. #29
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par droggo
    Jal,

    Je le sais bien, merci de me le rappeler

    Mais c'est bel et bien celui que tu avais commencé à coder, pour finalement faire celui par sélection.

    Dans les codes que tu as postés, c'est très clairement le tri par insertion que tu essayais d'implémenter, il y a des parties de code caractéristiques, et absolument hors de propos dans un tri par sélection.

    Il n'est pas impossible qu'une partie de tes problèmes au moins soit venue du mélange des 2 ?
    Mais non ce que j'ai commencé a faire c'est le tri par selection .En plus dans les codes que j'ai posté c'est le tri de selection que j'essaye d'implenter...
    A propos jette un coup d'oeil sur l'ancien message que j'ai posté(je t'ai expliquer ...)

  10. #30
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoa,

    Citation Envoyé par WhiteTigerZ
    Mais non ce que j'ai commencé a faire c'est le tri par selection .En plus dans les codes que j'ai posté c'est le tri de selection que j'essaye d'implenter...
    A propos jette un coup d'oeil sur l'ancien message que j'ai posté(je t'ai expliquer ...)
    Désolé, mais dans tes codes il y avait entre autres
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure permut(n : integer; t :tab; p : integer) ;
    var
       i,x,max: integer ;
    Begin
     max:=pos_max(n,t,p)  ;    
      for i:= p to n-1 do
       begin   
         x:=t[i];
         t[i]:=t[max];
         t[max]:=x ;
      end;  
    End;
    Qui, à choisir entre tri par insertion et tri par sélection, est typique du tri par insertion

    Donc re : si tu étais persuadé de faire le tri par sélection, tes problèmes venaient peut-être du mélange des 2.
    Si les cons volaient, il ferait nuit à midi.

  11. #31
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    le principe de la permutation reste le même soit qu'on travaille sur le principe de tri par insertion,selection,bulle...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      begin   
         x:=t[i];
         t[i]:=t[max];
         t[max]:=x ;
      end;
    A propos voila un petit paragraphe qui explique parfaitement le tri par insertion car cette fois c'est toi qui mélange entre les 2
    Principe du tri par insertion

    Une métaphore fréquemment utilisée pour le tri par insertion est le tri d'un jeu de cartes : en effet, comme pour un jeu de cartes, on trie d'abord les premiers éléments, puis, pour chaque élément suivant, on regarde où il doit se situer dans le début du tableau.

    D'une manière un peu plus formelle, on part du principe que t [1..1] est trié. Puis, pour chaque élément i du tableau, on insère t [i] où il devrait se trouver dans t [1..i-1]. Comme t [1..i-1] est trié, t [1..i] l'est aussi, après insertion.

  12. #32
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hol,
    Citation Envoyé par WhiteTigerZ
    le principe de la permutation reste le même soit qu'on travaille sur le principe de tri par insertion,selection,bulle...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      begin   
         x:=t[i];
         t[i]:=t[max];
         t[max]:=x ;
      end;
    Mais la procédure que j'ai citée ne fait seulement une permutation, que je sais faire, je te remercie de m'avoir rappelé comment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure permut(n : integer; t :tab; p : integer) ;
    var
       i,x,max: integer ;
    Begin
     max:=pos_max(n,t,p)  ;    
      for i:= p to n-1 do
       begin   
         x:=t[i];
         t[i]:=t[max];
         t[max]:=x ;
      end;  
    End;
    A moins d'être fou, ce que je vois là n'est pas une simple permutation, et ne correspond en rien à ta version finale.

    Relis bien ton code avant d'essayer d'argumenter. C'est facile, à chaque fois (presque ) je cite le code à voir.
    Si les cons volaient, il ferait nuit à midi.

  13. #33
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    Si j'ai bien lu le code !! a propos tu es pas fou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure permut(n : integer; t :tab; p : integer) ;
    var
       i,x,max: integer ;
    Begin
     max:=pos_max(n,t,p)  ;    
      for i:= p to n-1 do
       begin   
         x:=t[i];
         t[i]:=t[max];
         t[max]:=x ;
      end;  
    End;
    ce code n'a aucun rapport avec le tri d'insertion
    Il parcoure le tableau de 1 a n-1 ensuite il cherche l'indice de la valeur maximale du tableau puis il fait la permutation avec la case numero 1
    Aprés il parcoure le tableau de 2 a n-1 ensuite il cherche l'indice de la valeur maximale du tableau puis il fait la permutation avec la case n°2
    ET ainsi de suite ...
    Regarde ça http://darkskull.developpez.com/triselection/

  14. #34
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    HAi,
    Citation Envoyé par WhiteTigerZ
    Si j'ai bien lu le code !! a propos tu es pas fou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    procedure permut(n : integer; t :tab; p : integer) ;
    var
       i,x,max: integer ;
    Begin
     max:=pos_max(n,t,p)  ;    
      for i:= p to n-1 do
       begin   
         x:=t[i];
         t[i]:=t[max];
         t[max]:=x ;
      end;  
    End;
    ce code n'a aucun rapport avec le tri d'insertion
    Il parcoure le tableau de 1 a n-1 ensuite il cherche l'indice de la valeur maximale du tableau puis il fait la permutation avec la case numero 1
    Aprés il parcoure le tableau de 2 a n-1 ensuite il cherche l'indice de la valeur maximale du tableau puis il fait la permutation avec la case n°2
    ET ainsi de suite ...
    Regarde ça http://darkskull.developpez.com/triselection/
    Tu crois que ce code fait cela ?

    Suis le à la main...

    C'est juste un morceau de ton code de tri par insertion que tu as modifié, en remplaçant le décalage que faisait ta boucle par une série de permutation.

    Tu as voulu réutiliser du code, et tu t'es trompé en l'adaptant. Ce n'est pas une attaque de ma part, une simple constatation, et tu n'es pas le premier à qui cela arrive, ni le dernier, les programmeurs expérimentés n'étant pas à l'abri non plus.

    Se méfier du copier/coller, nombre d'erreurs viennent de là.
    Si les cons volaient, il ferait nuit à midi.

  15. #35
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    Salut
    Tu as encore raison Drogg j'ai du me tromper et ça m'a pris bcp de temps cette erreur la
    A propos j'ai fait quelques modifications a mon premier code et le voila en bon état!!et j'ai enlevé la procedure permut(puisque il s'agit de 3 instructions à taper)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Program triselection ;
    uses wincrt ;
    type
       tab=array [1..20] of integer ;    
    var
       n,x,p : integer ; t : tab ;
     
    procedure saisie (var n : integer ; var t :tab );   
    var
       i : integer ;   
    begin 
     repeat
      writeln('Saisir la taille du tableau :');
      readln(n);
     until n in [5..20] ;
      For i:= 1 to n do                     
       begin
        repeat
         writeln('Saisir l''élément',i) ;
         readln(t[i]) ;
        until (t[i] > 0)   
       end;  
    end;
     
    function pos_max(n : integer ;t :tab; p :integer):integer ; 
    var
       max,i : integer ;
    Begin
         max:=p ;
     for i:= p to n do
      begin
       if t[i]>t[max] then
        max:=i ;
      end;
       pos_max:=max ; 
    End;
     
    procedure trie (n : integer ; var t :tab )   ;
    var
       i,max,p : integer ;   
    Begin  
     for i:= 1 to n-1 do
      begin   
       p:=pos_max(n,t,i);
       x:=t[i];
       t[i]:=t[p];
       t[p]:=x ;
      end;
    End;  
     
    procedure affiche (n : integer ; t :tab) ;
    var
       i : integer ; 
    Begin
     for i:= 1 to n-1 do
      begin
       write(t[i]);
       write('|');
      end;
       write(t[n]); 
    End;
     
    Begin       
     saisie(n,t); 
     trie(n,t);
     affiche(n,t);
    End.

  16. #36
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kal,

    Ça soulage quand ça marche, hein ?

    Je pense que tu peux également supprimer la fonction pos_max, et intégrer ce qu'elle fait directement dans la procédure trie :
    les tris sont gros consommateurs de cpu, pas la peine d'y ajouter des appels à une procédure extérieure pour trouver une valeur, alors que ça se fait en quelques lignes.

    Je sais que cela va contre le principe "diviser pour mieux gérer", c'est à dire faire des petites fonctions simples qui sont plus faciles à écrire qu'une grande, mais là, ça restera quand même raisonnable.

    Ok, juste pour apprendre, sans vouloir utiliser avec de gros tableaux, ni intensément, le problème ne se pose pas vraiment.
    Et d'ailleurs, si tu en avais besoin dans ce cas là, il faudrait utiliser un tri plus efficace
    Si les cons volaient, il ferait nuit à midi.

  17. #37
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Kol,

    J'ai repris un peu ton code, et mis quelques remarques, et doublé les procédures "plus à mon goût", en particulier celle de saisie, qui remplit le tableau avec des valeurs aléatoires, beaucoup moins fatigant qu'entrer systématiquement des valeurs pour faire des tests

    Également quelques petites mises en forme, il est possible qu'il reste quelques défauts

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.
    A quand le tri par tas ?
    Si les cons volaient, il ferait nuit à midi.

  18. #38
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    Salut
    Merci beaucoup pour les remarques et les commentaire (j'ai appris bcp de choses).j'ai fait 2 programmes sur le tri a bulle et le tri par insertion si tu veux je peux les mettre,mais il faut que je modifie le titre de la discussion
    pour le tri par tas je le connais pas

  19. #39
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Hoi,

    Pour le tri par tas : c'est un des meilleurs (le meilleur ?) algorithmes de tri.

    Tu peux aller voir par exemple http://fr.wikipedia.org/wiki/Tri_par_tas

    Pour tes autres programmes, je peux très bien jeter un coup d'oeil si tu veux.

    Concernant ma version du programme, ce n'est pas une version suffisamment "peaufinée" à mon goût, je me suis contenté de reprendre en gros ce que tu avais fait.

    Entre autres, je ne fais jamais de lecture de valeur numérique (en fait : autre qu'une chaîne de caractères) directement comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    var
      : integer;
    ...
      readln(n);
    ...
    mais je lis une chaîne de caractères, et pour valider la réponse, je vérifie que cette chaîne correspond bien à une valeur numérique du type voulu, PUIS, si c'est le cas, je vérifie que cette valeur est dans la fourchette attendue.
    Cela évite que le programme se plante lamentablement si l'uilisateur entre des données inattendues.

    Aucun de mes programmes "opérationnels" ne se plante pour ce genre de problème, quel que soit le type de valeur lu.
    Bien sûr, ça alourdit le code, mais ce qui compte, c'est ce que constate l'utilisateur : le programme ne se plante pas pour une erreur due à une petite inattention.
    Si les cons volaient, il ferait nuit à midi.

  20. #40
    Membre régulier
    Profil pro
    Inscrit en
    Août 2006
    Messages
    193
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Tunisie

    Informations forums :
    Inscription : Août 2006
    Messages : 193
    Points : 85
    Points
    85
    Par défaut
    Slt
    Voila mon programme sur le tri par insertion
    Pour avoir une idée sur ce principe jette un coup d'oeil sur ce lien
    http://lwh.free.fr/pages/algo/tri/tri_insertion.htm
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Program triinsertion ; 
    uses wincrt ; 
    type 
        tab=array[1..20] of integer ; 
    var 
     n,x,i : integer ; t: tab ; 
     
    procedure saisie (var n : integer ;var t:tab); 
    var 
    i : integer ; 
    Begin 
     repeat 
      writeln('saisir la taille du tableau :'); 
      readln(n); 
     until n in [5..20]   ;  
      For i:= 1 to n do 
       begin 
        repeat 
         writeln('Saisir l''element ',i); 
         readln(t[i]); 
        until t[i] > 0 ; 
       end; 
    End; 
     
    function position (t:tab ; i : integer ): integer ; 
    var 
       j : integer ; 
    Begin 
     j:=0 ; 
      repeat 
       j:=j+1 ; 
      until t[j] >= t[i] ; 
     position:=j ; 
    End; 
     
    procedure tri(var t : tab ; n:integer ); 
    var 
    int,i,j,p : integer ; 
    Begin 
     for i:=2 to n do 
      begin 
       p:=position(t,i); 
        if p <> i then 
         begin 
          int:=t[i] ; 
           for j :=i-1 downto p do 
            begin 
             t[j+1]:=t[j] ; 
            end; 
          t[p]:=int ; 
         end; 
      end;  
    End; 
     
    procedure affiche (var t :tab ; n : integer ); 
    var 
       i:integer ; 
    begin 
     for i:= 1 to n-1 do 
      begin 
       write(t[i]); 
       write('|'); 
      end; 
       write(t[n]); 
    end; 
     
    begin 
     saisie(n,t); 
     x:=position(t,i); 
     tri(t,n); 
     affiche(t,n); 
    end.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 3 PremièrePremière 123 DernièreDernière

Discussions similaires

  1. [MCD] Nombre d'heures travaillées par mois par année par compte
    Par Tidus159 dans le forum Schéma
    Réponses: 9
    Dernier message: 11/03/2011, 12h20
  2. Tri par sélection du minimum récursif
    Par thechieuse dans le forum Pascal
    Réponses: 2
    Dernier message: 05/11/2008, 16h03
  3. problème tri par sélection
    Par scary dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 19/05/2008, 11h40
  4. [Map] Tableau d'association trié par ordre d'insertion
    Par sanchou dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 27/04/2007, 12h18
  5. Améliorer tri par sélection
    Par katrena99 dans le forum Pascal
    Réponses: 8
    Dernier message: 05/03/2007, 15h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo