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

Free Pascal Discussion :

Tri de tableaux


Sujet :

Free Pascal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    base des données
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : base des données
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Par défaut Tri de tableaux
    Bonjour

    Exercice :
    Ecrire avec Pascal le programme qui initialise deux tableaux d'entiers. Réaliser le tri de chaque tableau puis réaliser la fusion de ces tableaux dans un troisieme tableau puis l'afficher.
    Question :

    j'ai essayé de faire cet excrcice mais j'ai rencontré quelques problèmes. J'ai fait le programme et mis un lien vers l'image qui illustre bien le problème et je cherche l'astuce pour cet exercice si possible.

    Programme :
    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
    program fusion;
    uses crt;
    var
    T1,T2:array [1..50] of integer;
    T3:array[1..50] of integer;
    N,N1,N2:integer;
    procedure testtaille(N:integer);
    label a;
    begin
    a:write('donnez la taille du tableau');
    read(N);
    if (N<1) or (N>50) then begin
                                 write('erreur');
                                 goto a;
                            end;
    end;
    procedure remplissage(var T:array [1..50] of integer; N:integer);
    var
    i:integer;
    begin
         for i:=1 to N do begin
         write('donnez la',i,'valeur');
         read(T[i]);
         end;
    end;
    procedure affichage(T:array [1..50] of integer;N:integer);
    var
    i:integer;
    begin
         for i:=1 to N do begin
         write('la',i,'valeur est',T[i]);
         end;
    end;
    procedure tri(var T:array [1..50] of integer;N:integer);
    var
    i,min,posmin,j:integer
    begin
         for i:=1 to N-1 do begin
                                 min:=T[i],posmin:=i;
                                 for j:=i+1 to N do begin
                                                        if min>T[j] then begin
                                                        min:=T[j];
                                                        posmin:=j;
                                                                          end;
                                                    end;
                                                        if posmin<>i then begin
                                                                               T[posmin]:=T[i];
                                                                               T[i]:=min;
                                                                          end;
                             end;
    end;
    procedure fus(T,V:array [1..50] of integer;N,M:integer;TF:array [1..100] of integer);
    var
    i,j,k:integer;
    begin
    i:=1;j:=1;k:=1;
    while (i<=N) and (j<=M) do begin
                                    if T[i]<V[j] then begin
                                                           TF[k]:=T[i];
                                                           i:=i+1;
                                                           k:=k+1;
                                                           end
                                                      else
                                                      begin
                                                           TF[k]:=V[j];
                                                           j:=j+1;
                                                           k:=k+1;
                                                      end;
                                     while i<=N do begin
                                                        TF[k]:=T[i];
                                                        k:=k+1;
                                                        i:=i+1;
                                                    end;
                                     while j<=M do begin
                                                        TF[k]:=V[j];
                                                        k:=k+1;
                                                        j:=j+1;
                                                    end;
    end.
    Image du problème :
    ici

  2. #2
    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
    Hoa,

    Du code mis en forme est nettement plus lisible, 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
    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
    program fusion;
     
    uses crt;
     
    var
      T1, T2: array [1..50] of Integer;
      T3: array[1..50] of Integer;
      N, N1, N2: Integer;
     
    procedure testtaille(N: Integer);
    label 
      a;
    begin
      a:
      Write('donnez la taille du tableau');
      Read(N);
      if (N < 1) or (N > 50) then 
      begin
        Write('erreur');
        goto a;
      end;
    end;
     
    procedure remplissage(var T: array [1..50] of Integer; N: Integer);
    var
      i: Integer;
    begin
      for i := 1 to N do 
      begin
        Write('donnez la', i, 'valeur');
        Read(T[i]);
      end;
    end;
     
    procedure affichage(T: array [1..50] of Integer; N: Integer);
    var
      i: Integer;
    begin
      for i := 1 to N do 
      begin
        Write('la', i, 'valeur est', T[i]);
      end;
    end;
     
    procedure tri(var T: array [1..50] of Integer; N: Integer);
    var
      i, Min, posmin, j: Integer
    begin
      for i := 1 to N - 1 do 
      begin
        Min := T[i], posmin := i;
        for j := i + 1 to N do 
        begin
          if Min > T[j] then 
          begin
            Min := T[j];
            posmin := j;
          end;
        end;
        if posmin <> i then 
        begin
          T[posmin] := T[i];
          T[i] := Min;
        end;
      end;
    end;
     
    procedure fus(T, V: array [1..50] of Integer; N, M: Integer;
      TF: array [1..100] of Integer);
    var
      i, j, k: Integer;
    begin
      i := 1;
      j := 1;
      k := 1;
      while (i <= N) and (j <= M) do 
      begin
        if T[i] < V[j] then 
        begin
          TF[k] := T[i];
          i := i + 1;
          k := k + 1;
        end
        else
        begin
          TF[k] := V[j];
          j := j + 1;
          k := k + 1;
        end;
        while i <= N do 
        begin
          TF[k] := T[i];
          k := k + 1;
          i := i + 1;
        end;
        while j <= M do 
        begin
          TF[k] := V[j];
          k := k + 1;
          j := j + 1;
        end;
      end.
    Au passage, on voit que tous les begin ne sont pas fermés par un end

    Je n'ai pas lu, car dès que je vois un truc comme ça
    je sors mon révolver.
    Et là, pas d'excuse : tu as fait des boucles ailleurs ...

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 051
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 051
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Aie, le goto pique en effet les yeux...
    Pour résoudre ton problème, tu dois déclarer un type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      TTableau = array [1..50] of Integer;
     
    var
      T1, T2: TTableau;
    et utiliser ce type dans la déclaration des paramètres des procédures et fonctions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    procedure remplissage(var T: TTableau; N: Integer);
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  4. #4
    Membre Expert
    Avatar de slim_java
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2008
    Messages
    2 272
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2008
    Messages : 2 272
    Par défaut
    Salut,
    c'est le principe du tri par fusion :
    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
     
    PROCEDURE tri_fusion(var M:tab;d,f:integer);
       VAR mil:integer;
     
       PROCEDURE fusionner(var M:tab;d,mil,f:integer);
        VAR P:tab;
            i,j,k,l:integer;
        BEGIN
         i:=d;
         j:=mil+1;
         k:=d;
         while (i<=mil) and (j<=f) do
          begin
           if M[i]<M[j] then begin
                              P[k]:=M[i];
                              i:=i+1;
                             end
                        else begin
                              P[k]:=M[j];
                              j:=j+1;
                             end;
           k:=k+1;
          end;
     
         if (i>mil) then for l:=j to f do
                          begin
                           P[k]:=M[l];
                           k:=k+1;
                          end
                    else for l:=i to mil do
                          begin
                           P[k]:=M[l];
                           k:=k+1;
                          end;
         for l:=d to f do
          M[l]:=P[l];
        END;
     
     
     
     
       BEGIN
        if (d<f) then begin
                       mil:=(d+f) div 2;
                       tri_fusion(M,d,mil);
                       tri_fusion(M,mil+1,f);
                       fusionner(M,d,mil,f);
                      end;
     
       END;

Discussions similaires

  1. [Probleme] tri croissant - tableaux (débutant)
    Par tarnak dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 01/07/2006, 21h01
  2. Tri de tableaux multiples
    Par hdd dans le forum Langage
    Réponses: 4
    Dernier message: 02/06/2006, 17h54
  3. [Tableaux] tri sur tableaux
    Par pounie dans le forum Langage
    Réponses: 5
    Dernier message: 03/03/2006, 21h19
  4. Tri de tableaux 2D
    Par LeRoiDesLutins dans le forum Langage
    Réponses: 6
    Dernier message: 27/09/2005, 21h45

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