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 interclassement multiple


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut Tri par interclassement multiple
    bonsoir, desolé pour l'absence j'avais quelque probleme.
    mais aussi j'ai pu modifier le language, il est maintenant encore plus correct, mais il existe encore des probleme, j'espere que vous pourrait m'aider.
    je copier tous mon program pour vous faciliter le travaille
    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
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    program triii;
     
    uses fdelay,crt;
    type tfile=file of integer;
    var r : integer;
        t3,t4 : ttab;
        p : integer;
     
     
    procedure initind(var ind:ttab;p:integer);
    var i:integer;
    begin
         for i:=1 to p do
             ind[i]:=(i-1)*p;
    end;
    procedure charger(var f:tfile;var t:ttab;p,taille,no:integer);
    var i:integer;
    begin
        seek(f,(no-1)*taille);
        for i:=1 to taille do
        begin
             read(f,no);
             t[i]:=no;
        end;
    end;
    procedure sauvegarder(var f:tfile;var t:ttab;p,taille,no:integer);
    var i:integer;
    begin
         seek(f,(no-1)*taille);
         for i:=1 to taille do
             write(f,t[i]);
    end;
    function tousmoinsun(var ind:ttab;p:integer):boolean;
    var estvide : boolean;
        i : integer;
        t : ttab;
    begin
         estvide:=true;i:=1;
         while(i<=n) and (estvide) do
         begin
              if t[i]<>-1 then estvide:=false
                          else i:=i+1;
         end;
         tousmoinsun:=estvide;
    end;
    procedure chercher_min(var f1:tfile;var ind:ttab;var min,place:integer);
    var i,x : integer;
    begin
         i:=1;
         while(i<=p) and (ind[i]=-1) do
                     i:=i+1;
         place:=i;
         seek(f1,ind[place]);
         read(f1,min);
         i:=i+1;
         while (i<=p) do
         begin
               if (ind[i]=-1) then i:=i+1
                               else begin
                                         seek(f1,ind[i]);
                                         read(f1,x);
                                         if (x<min) then begin
                                                                   min:=x;
                                                                   place:=i;
                                                              end
                                         else i:=i+1;
                               end;
         end;
    end;
    procedure segmentation(var t:ttab;bi,bs:integer;var place:integer);
    var pivot,i,j,x : integer;
    begin
         pivot:=t[bi];
         i:=bi+1;j:=bs;
         while (i<=j) do
         begin
              if t[i]<pivot then i:=i+1
              else begin
                        if t[i]>pivot then j:=j-1
                        else if i<j then begin
                                              x:=t[i];
                                              t[i]:=t[j];
                                              t[j]:=x;
                                              j:=j-1;
                                              i:=i+1;
                                         end;
                    end;
         end;
         x:=t[bi];
         t[bi]:=t[j];
         t[j]:=x;
         place:=j;
    end;
    procedure tri_quicksort(var t:ttab;bi,bs:integer);
    var place : integer;
    begin
         if bi<bs then begin
                            segmentation(t,bi,bs,place);
                            tri_quicksort(t,bi,place-1);
                            tri_quicksort(t,place+1,bs);
                       end;
    end;
    procedure tri_intermult(nom:char);
    const p=4;
    var t,ind : ttab;
        f1,f2 : tfile;
        fini : boolean;
        i,taille,min,place : integer;
    begin
         {$i-}
         assign(f1,nom);
         reset(f1);
         {$i+}
         if Ioresult<>0 then begin
                                  writeln('erreur');
                                  halt(1);
                             end;
         initind(ind,p);
         for i:=1 to p do
         begin
              charger(f1,t,p,taille,i);
              tri_quicksort(t,1,taille);
              sauvegarder(f1,t,p,taille,i);
         end;
         fini:=false;
         while(not fini) do
         begin
              chercher_min(f1,ind,min,place);
              write(f2,min);
              ind[place]:=ind[place]+1;
              if (ind[place]=place*taille)
                 then ind[place]:=-1;
              fini:=tousmoinsun(ind,p);
         end;
         close(f1);
     
         close(f2);
         rename(f2,nom);
    end;
     
     
     
    begin
    clrscr;
     
    writeln('tapez entrer pour commencer le random ');
    readln;
     
     
    randomize;
    for r:=1 to n do
    begin
         t3[r]:=random(n);
         writeln(t3[r]);
    end;
     
     
     
    tri_intermult('0');
     
    writeln('voici le trie : ');
    readln;
     
    for r:=1 to n do
        writeln(t4[r]);
     
    readln;
    end.

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Laq,

    Présentation pas terrible, pas un seul commentaire, code pas aéré

    - Présentation : l'indentation est là, c'est bien, mais les blocs sont beaucoup trop décalés, ce qui diminue l'effet attendu : améliorer la lisibilité.

    - Commentaires : c'est toujours utile, même pour toi, de mettre au moins quelques mots pour dire ce que doit faire une procédure.
    Et c'est d'autant plus utile/nécessaire quand tu veux faire lire/corriger ton code par quelqu'un d'autre

    - Aération du code : mettre quelques lignes vides pour aérer le code est très utile pour la lisibilité, entre autres pour séparer les procédures.


    Par là-dessus, code incomplet, manque au moins la définition des types utilisés, même si pour le tableau ce n'est pas difficile à déviner, ainsi que celle des constantes, qui ont en principe ont dû servir à définit ce type.

    Et enfin, comme c'est plus qu'un petit détail que tu veux qu'on corrige, un code complet et compilable serait fortement apprécié.
    Ça nous permettrait au moins de voir comment et avec quel genre de données tu utilises tes procédures

  3. #3
    Membre Expert
    Avatar de Loceka
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    2 276
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 2 276
    Par défaut
    @ droggo : pour son indentation, il a certainement fait un copier-coller à partir de son "IDE" et ça a donné ce résultat là. Je crois me rappeller qu'Emacs fait ce genre d'indentation (mais pas sur que ce soit celui-là).

    Je te trouve quand même bien aggressif dans tes posts.

  4. #4
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Citation Envoyé par Loceka
    Je te trouve quand même bien aggressif dans tes posts.
    Certes la forme des réponses de droggo peut sembler parfois aggressive, même si je pense que dans le fond elles n'ont pas ce but, mais sur le fond des réponses il a raison concernant l'indentation. C'est un point important : si les poseurs de questions ne font pas d'effort pour se faire comprendre et faire comprendre leur code, est-il légitime que nous fassions des efforts pour eux ? Dans une certaine mesure oui, mais il faut pas pousser ! Evidemment, il y a toujours des cas extrêmes, mais dans le fond, il serait préférable que tous les codes soient correctement indentés et tout à fait lisibles (utopie ). Je ne défends pas droggo, et il m'arrive aussi de trouver qu'il fait parfois des réponses aggressives, mais dans le fond il n'a pas tort

    Pour en revenir au problème initial, peux-tu poster le code complet si il n'est pas trop long, avec la définition des variables types et autres, et indiquer exactement à quel ligne ca plante ?

  5. #5
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 971
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 971
    Par défaut
    Kan,
    Citation Envoyé par Loceka
    @ droggo : pour son indentation, il a certainement fait un copier-coller à partir de son "IDE" et ça a donné ce résultat là. Je crois me rappeller qu'Emacs fait ce genre d'indentation (mais pas sur que ce soit celui-là).
    C'est probablement vrai, mais il n'est pas bien difficile, une fois posté et le résultat vérifié, de remettre le code en forme.

    Citation Envoyé par Loceka
    Je te trouve quand même bien aggressif dans tes posts.
    Je n'ai jamais eu l'intention d'être agressif, et je n'ai absolument pas l'impression de l'être.

    Je me suis contenté de dire ce que je pense du code en question, sans faire de ronds de jambes. C'est un peu sec, mais je n'y vois et n'y ai mis aucune agressivité.

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    je pense qui y'a pas trop de désordre, mais bon, tous ce que je veux moi c'est quelqu'un qui connait le principe et m'aide a résoudre le probleme.

  7. #7
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    bon t'a raison
    voila tous le code, c'est juste des essais c'est pour ca il n'est pas trop orgabisé :


    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
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    program trii;
     
    uses fdelay,crt;
    const n=20;
    type ttab = array[1..n] of integer;
    var r : integer;
        t,t2,t5 : ttab;
     
     
    procedure tri_comptage(var t:ttab;var t2:ttab);
    var ind : ttab;
        i,j : integer;
    begin
         for i:=1 to n do
             ind[i]:=1;
         for i:=1 to n do
         begin
              for j:=i+1 to n do
              begin
                   if t[i]<t[j] then ind[j]:=ind[j]+1
                   else ind[i]:=ind[i]+1;
              end;
         end;
         for i:=1 to n do
             t2[ind[i]]:=t[i];
    end;
     
    procedure tri_bulles(var t:ttab;var t2:ttab);
    var i,j,x :integer;
        permu : boolean;
    begin
    i:=1;permu:=true;
    begin
         while(permu=true) do
         begin
              permu:=false;
              for j:=1 to n-1 do
              begin
                   if t[j]>t[j+1] then begin
                                            x:=t[j];
                                            t[j]:=t[j+1];
                                            t[j+1]:=x;
                                            permu:=true;
                                       end;
                   end;
              end;
         end;
         for j:=1 to n do
                  t2[j]:=t[j];
    end;
     
    procedure rechercher(var t:ttab;var place:integer;elem:integer;var nbelem:integer);
    var k : integer;
        arret : boolean;
    begin
         k:=1;arret:=false;place:=nbelem;
         while(not arret) and (k<nbelem) do
         begin
              if t[k]<elem then k:=k+1
                           else begin
                                place:=k;
                                arret:=true;
              end;
         end;
    end;
    procedure inserer(var t2:ttab;plac:integer;nbirelem:integer;max:integer);
    var i : integer;
    begin
         for i:=max to plac+1 do
             t2[i]:=t2[i-1];
         t2[plac]:=nbirelem;
    end;
    procedure tri_insertion(var t,t2:ttab);
    var y,place:integer;
    begin
         for y:=1 to n do
         begin
              rechercher(t2,place,t[y],y);
              inserer(t2,place,t[y],y);
         end;
    end;
     
     
    procedure initind(var ind:ttab;p:integer);   {c'est par ici commence le tri par  interclassement multiple}
    var i:integer;
    begin
         for i:=1 to p do
             ind[i]:=(i-1)*p;
    end;
    function tousmoinsun(var ind:ttab;p:integer):boolean;
    var estvide : boolean;
        i : integer;
    begin
         estvide:=true;i:=1;
         while(i<=n) and (estvide) do
         begin
              if t[i]<>-1 then estvide:=false
                          else i:=i+1;
         end;
         tousmoinsun:=estvide;
    end;
    procedure chercher_min(var t1:ttab;var ind:ttab;var min,place:integer);
    var i : integer;
    begin
         i:=1;
         while(i<=n) and (ind[i]=-1) do
                     i:=i+1;
         place:=i;
         min:=ind[place];
         i:=i+1;
         while (i<=n) do
         begin
               if (ind[i]=-1) then i:=i+1
                               else begin
                                         if (ind[i]<min) then begin
                                                                   min:=ind[i];
                                                                   place:=i;
                                                              end
                                         else i:=i+1;
                               end;
         end;
    end;
    procedure segmentation(var t:ttab;bi,bs:integer;var place:integer);
    var pivot,i,j,x : integer;
    begin
         pivot:=t[bi];
         i:=bi+1;j:=bs;
         while (i<=j) do
         begin
              if t[i]<pivot then i:=i+1
              else begin
                        if t[i]>pivot then j:=j-1
                        else if i<j then begin
                                              x:=t[i];
                                              t[i]:=t[j];
                                              t[j]:=x;
                                              j:=j-1;
                                              i:=i+1;
                                         end;
                    end;
         end;
         x:=t[bi];
         t[bi]:=t[j];
         t[j]:=x;
         place:=j;
    end;
    procedure tri_quicksort(var t:ttab;bi,bs:integer);
    var place : integer;
    begin
         if bi<bs then begin
                            segmentation(t,bi,bs,place);
                            tri_quicksort(t,bi,place-1);
                            tri_quicksort(t,place+1,bs);
                       end;
    end;
    procedure tri_intermult(nom1:char);
    var t,t1,t2,ind : ttab;
        fini : boolean;
        i,taille,min,place : integer;
    begin
         initind(ind,n);
         for i:=1 to n do
         begin
              tri_quicksort(t,i,taille);
              t1[i]:=t[i];
         end;
         fini:=false;i:=1;
         while(not fini) do
         begin
              chercher_min(t1,ind,min,place);
              t2[i]:=min;
              ind[place]:=ind[place]+1;
              if (ind[place]=place*taille)
                 then ind[place]:=-1;
              fini:=tousmoinsun(ind,n);
              i:=i+1;
         end;
    end;
     
    {et c'est ici ou ce termine}
     
     
    begin
    clrscr;
     
    writeln('tapez entrer pour commencer le random ');
    readln;
     
     
    randomize;
    for r:=1 to n do
    begin
         t[r]:=random(n);
         writeln(t[r]);
    end;
     
    {tri_comptage(t,t2);
     
    tri_bulles(t,t2);         
     
    tri_insertion(t,t2);      }
     
    tri_intermult('0');
     
    writeln('voici le trie : ');
    readln;
     
    for r:=1 to n do
        writeln(t2[r]);
     
    readln;
    end.

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 63
    Par défaut
    j'ai modifier le code vous devez voir

Discussions similaires

  1. fonction de tri par introspection
    Par ned-flanders dans le forum C++
    Réponses: 7
    Dernier message: 21/10/2004, 11h49
  2. [ XML ][ XSL ] tri par date
    Par zozolh2 dans le forum XMLRAD
    Réponses: 6
    Dernier message: 26/08/2004, 10h19
  3. [LG]Tri par insertion dans une liste chainée
    Par mister_dsg dans le forum Langage
    Réponses: 4
    Dernier message: 18/12/2003, 22h34
  4. Tri par ordre alphabétique
    Par orus8 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/04/2003, 19h27
  5. Tri par fusion d'un tableau
    Par Mailgifson dans le forum C
    Réponses: 5
    Dernier message: 12/12/2002, 14h53

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