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 du minimum récursif


Sujet :

Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut Tri par sélection du minimum récursif
    En TP, on nous a demandé de faire un tri par sélection de minimum mais récursif, Mais je n'y arrive pas. Ma fonction SelectMin ne fonctionne pas et je n'arrive pas à modifier le code pour que cela marche.

    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
     
     
    const SUITELONGMAX = 50;
     
    type element = integer;
    type suite = record
                 contenu : array[1..SUITELONGMAX] of element;
                 long : 0..SUITELONGMAX;
                 end;
     
     
    var     s : suite;
            m, k : integer;
     
    {Procedure de génération aléatoire d'une suite de longueur m}
     
    procedure GenAleatSuite(m : integer; var s : suite);
    var i : integer;
    begin
     
      s.long:=m;
     
      for i:=1 to m do
        begin
          s.contenu[i]:=random(99);
        end;
    end;
     
    {Procedure d'affichage d'un suite entre les indices k et s.long}
     
    procedure AfficheSuite(var s : suite);
    begin
     
      AffSuiteRec(1);
      writeln;
      writeln;
     
    end;
     
    {Echange de deux elements de la suite}
     
    procedure echange (var a,b : integer);
    var temp: integer;
    begin
      temp := a;
      a := b;
      b := temp;
    end;
     
     
    {Tri par selection du minimum}
     
    procedure TriMin(var s : suite);
     
      {Fonction permettant de trouver l'indice du minimum de la suite compris    entre l'indice k et s.long }
     
      function SelectMin(k : integer ; var min : integer): integer;
     
      var result : integer;
     
      begin
     
        if (k > s.long) then SelectMin := min
        else
           begin
     
             if (s.contenu[k] < s.contenu[min]) then min := k;
             SelectMin := SelectMin(k+1,min);
     
           end;
     
      end;
     
      { Tri récursif entre l'indice k et s.long}
     
      procedure TriMinRec(k : integer);
      begin
     
        if k <= s.long then
          begin
            echange(s.contenu[k], s.contenu[SelectMin(k,k)]);
            TriMinRec(k+1);
          end;
      end;
      {Tri récursif entre 1 et s.long}
    begin
      TriMinRec(1);
    end;
     
      {Programme principal}
     
    begin
     
      randomize;
      GenAleatSuite(10, s);
      AfficheSuite(s);
      writeln('longueur de la suite : ',s.long);
      TriMin(s);
      AfficheSuite(s);
     
    end.

    Si vous avez des pistes où je pourrais chercher.
    Merci d'avance de votre aide.

  2. #2
    Modérateur
    Avatar de ToTo13
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2006
    Messages
    5 793
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 793
    Par défaut
    Bonjour,

    ta fonction selectMin à l'air correcte. Est ce que tu l'as testé indépendamment du reste.

    Je pense que c'est ta fonction Echange qui est fausse Tu inverses deux valeurs passées en paramètres, donc cela n'opère pas sur le tableau. Si tu veux que cette fonction marche correctement, fais plutôt :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    procedure echange (var a,b : integer);
    var temp: integer;
    begin
      temp := s.contenu[a];
      s.contenu[a] := s.contenu[b];
      s.contenu[b] := temp;
    end;


    Petites remarques :
    - Dans echange(s.contenu[k], s.contenu[SelectMin(k,k)]); tu peux le remplacer par echange(s.contenu[k], s.contenu[SelectMin(k,k+1)]); cela évitera un test.
    - if k <= s.long then : inutile d'aller jusqu'au dernier élément inclus , en classant l'avant dernier, tu classes automatiquement le dernier , donc if k < s.long then
    - Juste pour info : la déclaration de fonction et procédure dans les variable d'une procédure... je trouve ça moche et très difficilement lisible.
    Consignes aux jeunes padawans : une image vaut 1000 mots !
    - Dans ton message respecter tu dois : les règles de rédaction et du forum, prévisualiser, relire et corriger TOUTES les FAUTES (frappes, sms, d'aurteaugrafe, mettre les ACCENTS et les BALISES) => ECRIRE clairement et en Français tu DOIS.
    - Le côté obscur je sens dans le MP => Tous tes MPs je détruirai et la réponse tu n'auras si en privé tu veux que je t'enseigne.(Lis donc ceci)
    - ton poste tu dois marquer quand la bonne réponse tu as obtenu.

  3. #3
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 967
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 967
    Par défaut
    Mae,
    Citation Envoyé par ToTo13 Voir le message
    - Juste pour info : la déclaration de fonction et procédure dans les variable d'une procédure... je trouve ça moche et très difficilement lisible.
    C'est seulement un petit problème de mise en forme du code.

    Et ce n'est pas dans les variables d'une procédure, c'est la place où on peut définir des fonctions/procédures internes, et personnellement, je trouve ça très utile pour clarifier le code.

    Exemple :

    - sans utiliser cette possibilité
    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
    procedure hello;
    var
      ...
    begin { hello }
      ...
      if (condition)
      then
      begin
        { traitement 1 - disons plus de 20 ou 30 lignes, avec des blocs indentés, ... }
     
        if (autreCondition)
        then
        begin
          { traitement 2 - disons plus de 20 ou 30 lignes, avec des blocs indentés, ... }
        end;
      end
      else
      begin
        { traitement 3 - disons plus de 20 ou 30 lignes, avec des blocs indentés, ... }
      end;
      ...
    end; { hello }
    - et en l'utilisant
    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
    procedure hello;
    var
      ...
     
      { ---------------------------- }
     
      procedure Traitement1 ;
      begin
        { disons plus de 20 ou 30 lignes, avec des blocs indentés, ... }
      end ; { Traitement1 }
     
      { ---------------------------- }
     
      procedure Traitement2 ;
      begin
        { disons plus de 20 ou 30 lignes, avec des blocs indentés, ... }
      end ; { Traitement2 }
     
      { ---------------------------- }
     
      procedure Traitement3 ;
      begin
        { disons plus de 20 ou 30 lignes, avec des blocs indentés, ... }
      end ; { Traitement3 }
     
      { ---------------------------- }
     
    begin { hello }
      ...
      if (condition)
      then
      begin
        Traitement1;
     
        if (autreCondition)
        then
        begin
          Traitement2;
        end;
      end
      else
      begin
        Traitement3;
      end;
      ...
    end; { hello }
    L'algorithme de la procédure hello est alors beaucoup plus facile à suivre, etc.

Discussions similaires

  1. Réponses: 54
    Dernier message: 09/03/2013, 15h27
  2. [À télécharger] [Tri] Tri par sélection
    Par 3DArchi dans le forum Téléchargez
    Réponses: 0
    Dernier message: 06/11/2010, 19h45
  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. 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