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 :

Chargement du tableau par récursivité


Sujet :

Pascal

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 21
    Points
    21
    Par défaut Chargement du tableau par récursivité
    Salut, ma question est comment faire un chargement d'un tableau (t) en éliminant l'itération, alors le seul chemin est la récursivité.
    Voici mon algorithme
    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
    Program charge_recurcif;
    uses wincrt;
    type
    tab = array [2..100] of integer;
    var
    i,n:integer;
    t:tab;
     
    function taille : integer;
    var
    x:integer;
    begin
         repeat
         writeln('Entrer la taille du tableau:)');
         read(x);
         until x in [2..50];
    taille :=x;
    end;
     
     
    procedure charge (n:integer;var i:integer ; var t:tab);
    var
    ok:boolean;
    begin
    i:=1;
     
         if i>=n then
         begin
         write('charger');
         end
         else
         begin
              writeln('Entrer la valeurs de la case N°',i);
              readln(t[i]);
              i:=i+1;
              charge(n,i,t);
         end;
    end;
     
    procedure affiche (n:integer; t:tab);
    var
    j:integer;
    begin
    for j:=1 to n do
    begin
         write(t[j],'|');
    end;
    end;
     
    {Programme principale}
    Begin
    n:= taille ;
    charge (n,i,t);
    affiche(n,t);
    end.
    Bon le problème que je trouve est que le compteur ne s'incrémente pas. Il reste à sa position initiale, pourquoi ????

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Sie,

    Passage par valeur.

    C'est une manie de tout vouloir faire en récursif ?

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : Décembre 2007
    Messages : 24
    Points : 21
    Points
    21
    Par défaut
    salut a tous;
    je croix que j'ai trouvé une solution pas optimale :
    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
    program _charge ;
    uses wincrt;
    type
    tab = array[2..10] of integer;
    var
    t:tab;
    i,n:integer;
    procedure affiche (n:integer ; var t:tab);
    var
    i:integer;
    begin
    for i:=1 to n do
    begin
         write('|',t[i],'|');
    end;
    end;
    procedure charge (n:integer; var t:tab ; var i:integer);
    begin
    i:=i+1;
         if i>n then
         begin
         clrscr;
         affiche(n,t);
         end  
         else 
         begin
         writeln('Entrer la valeur de la case',i);
         readln(t[i]);
         charge(n,t,i);
         end;
    end;
     
    {Programme principale}
    begin
    repeat
          writeln('Entrer la taille du tableau');
          readln(n);
    until n in [2..100];
    charge (n,t,i);
    readln;
    end.
    Le question ici est ce que c'est la seul methode résolution ou il ya une autre plus optimale?
    Merci;
    [Jlidi Mohamed].

  4. #4
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 951
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 951
    Points : 5 671
    Points
    5 671
    Par défaut
    Fio,

    Une procédure récursive n'est quasiment jamais optimale par rapport à une solution itérative.

    Prends l'habitude d'indenter ton code régulièrement, et de l'aérer par des sauts de lignes (au moins pour spérarer les procédures l'une de l'autre), tu verras que ton code en deviendra nettement plus lisible, et donc modifiable.

    Évite d'utiliser des noms commençant par _, c'est assez souvent réservé par les compilateurs (en C surtout, mais ce n'est pas difficile de s'en passer).

  5. #5
    Rédacteur
    Avatar de darrylsite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 299
    Points : 2 501
    Points
    2 501
    Par défaut
    Je trouve que quelque chose ne va pas avec le dernier code. En fait, tu as declaré i comme variable globale (ce qu' il faut eviter) et tu l' utilisise sans l' initialiser à 2. Aussi pourquoi as tu passé i par adresse alors que ça ne te sert meme pas.
    Je crois que le programme sera mieux comme ça :
    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
     
    program _charge ;
    uses wincrt;
    {c' est mieux de declarer des constantes}
    const debut=2; fin=100;
    type
    tab = array[debut..fin] of integer;
    var
    t:tab;
    n:integer;
    {tu n' as pas besion de passer t par adresse puisqu' on ne le modifie pas}
    procedure affiche (n:integer ; t:tab);
    var
    i:integer;
    begin
    for i:=1 to n do
    begin
         write('|',t[i],'|');
    end;
    end;
     
    {on passe i par valeur}
    procedure charge (n:integer; var t:tab ;  i:integer);
    begin
         if i>n then
         begin
         clrscr;
         affiche(n,t);
         end  
         else 
         begin
         writeln('Entrer la valeur de la case',i);
         readln(t[i]);
         charge(n,t,i+1);
         end;
    end;
     
    {Programme principale}
    begin
    repeat
          writeln('Entrer la taille du tableau');
          readln(n);
    until n in [debut..fin];
    charge (n,t,debut);
    readln;
    end.
     Le question ici est

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Chargement de fichier par SQL LOADER
    Par davy.g dans le forum SQL*Loader
    Réponses: 17
    Dernier message: 15/11/2004, 14h08
  2. Trier un tableau par ordre croissant
    Par Halleck dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 01/11/2004, 01h04
  3. Envoi d'un tableau par pipe
    Par Chicard dans le forum Développement
    Réponses: 2
    Dernier message: 10/03/2004, 10h47
  4. Passage d'un tableau par référence?
    Par sebduth dans le forum C
    Réponses: 9
    Dernier message: 16/07/2003, 19h32
  5. [] Tri d'un tableau par ordre alphabétique
    Par cafeine dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/09/2002, 09h43

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