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

 Delphi Discussion :

Procedure récursive


Sujet :

Delphi

  1. #1
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut Procedure récursive
    bonsoir
    je vous expose mon problème j'ai un tp a faire en structure de donnée en delphi donc j'ai fais la procédure .et je ne sais pas comment la traduire en delphi ( array etc....) pour compiler ,j'ai quelques notions mais j'arrive pas a le traduire.
    pouvez vous m'aidez ? c'est un tp que je devrais rendre ds 2jours ( c'est un bonus que le prof nous a fait)
    j'ai trouvé des cours très intéressant sur ce site , mais comme c urgent j'ai pas le temps de prendre mon temps de lire tout
    voila la procédure récursive :
    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
    procedure TriFusion (var t:tab;g, d: integer);
    var i, j, k, m: integer;
    s:tab
    begin
    if g < d then
    begin
    m := (g + d) div 2;
    TriFusion (t,g, m);
    TriFusion (t,m + 1, d);
    for i := m downto g do s[i] := t[i];
    for j := m+1 to d do s[d+m+1-j] := t[j];
    i := g; j := d;
    for k := g to d do
    if s[i] < s[j] then
    begin t[k] := s[i]; i := i + 1 end
    else
    begin t[k] := s[j]; j := j - 1 end;
    end;
    end;
    je vous remercie

  2. #2
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    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
     
    ...
    const
      n=15;
    type
      Ttab = array[1..n] of integer;
    var
      tab:Ttab;
      i:integer;
     
    procedure Fusionner(var T1,T2:Ttab;_gauche,midle,_droite:integer);
    var
      iGauchePos,IcurPos,imidlepos,i:integer;
    begin
      iGauchePos  :=_gauche;//on prend la plus petite position
      IcurPos       :=_gauche;//on prend la plus petite position
      imidlepos     := midle+1;// on definit le milieu
      for i := _gauche to _droite do
        T2[i]:=T1[i]; // on recopie le tableau de référence dans le tableau 2
     
      while (iGauchePos<=midle) and (imidlepos<=_droite) do
      begin
        if T2[iGauchePos]<T2[imidlepos] then
        begin
          T1[IcurPos]:=T2[iGauchePos];
          inc(iGauchePos);
        end
        else
        begin
          T1[IcurPos]:=T2[imidlepos];
          inc(imidlepos);
        end;
        inc(IcurPos);
      end;
     
      if imidlepos>_droite then
        for i := iGauchePos to midle do
        begin
          T1[IcurPos]:=T2[i];
          inc(IcurPos);
        end
      else
        for I := imidlepos to _droite do
        begin
          T1[IcurPos]:=T2[i];
          inc(IcurPos);
        end;
    end;
    //-----------------------------------------------
    procedure TriFusion(var T1:Ttab;_gauche,_droite:integer);
    var
      midle:integer;
      T2:Ttab;
    begin
      if _gauche<_droite then
      begin
        midle:=(_gauche+_droite)div 2;
        TriFusion(T1,_gauche,midle);// on regarde a droite
        TriFusion(T1,midle+1,_droite); // on regarde a gauche
        Fusionner(T1,T2,_gauche,midle,_droite); // on fusionne
      end;
    end;
    //-----------------------------------------------
    ... Utilisation
    //-----------------------------------------------
    var
     s : String;
    begin
      //-----------------------------------------------
      // remplissage aleatoire du tableau
      //-----------------------------------------------
      randomize;
      for i := 1 to n do
      begin
        tab[i]:=random(50)-20;
        s := s+inttostr(tab[i])+';';
      end;
      affiche(s);
      TriFusion(tab,1,n);
      s := '';
      for i := 1 to n do
        s := s+inttostr(tab[i])+';';
      affiche(s);
    end;
    @+ Phil

  3. #3
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    je vous remercie de m'avoir répondu
    juste une question
    au fait j'allais la traduir ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    type= array[1..100] of integer 
    var m,i,j,k: integer;
    t,s:tab;
    procéduretri_fusion(var g,d :integer);
    begin 
    if g<d then 
    begin 
    m:=(g+d)/2
    ...........
    je suppose que c'est faux
    et est ce que je dois utiliser les deux algorithme que vous m'avez ecris , procédure fusionner et tri fusion
    merci

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 435
    Points : 5 848
    Points
    5 848
    Par défaut
    salut

    Procedure est mot cle de delphi donc sans accent

    quand a creer deux methode ou une seul ce n'est qu'une question de lisibilite
    je differencie la parti tri des elements avec celle ou l'on "reconstruit" notre tableau

    mais tu peut tres bien utiliser des variable global ainsi qu'une seul procedure
    a toi de bien faire attention a ce qu t'on algo fait



    type
    tab = array[1..100] of integer
    var m,i,j,k: integer;
    t,s:tab;
    procedure tri_fusion(var g,d :integer);
    begin
    if g<d then
    begin
    m:=(g+d) div 2
    // sinon tu n'obtien pas la parti entiere de la division
    ...........

    @+ Phil

  5. #5
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    merci encore , je vais l'exécuter ce soir
    j'éspére que j'aurai pas de problèmes

  6. #6
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 663
    Points
    5 663
    Par défaut
    Xoa,
    Citation Envoyé par anapurna Voir le message
    mais tu peut tres bien utiliser des variable global
    C'est typiquement le genre de conseil qu'il faut éviter de donner.

  7. #7
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par droggo Voir le message
    Xoa,

    C'est typiquement le genre de conseil qu'il faut éviter de donner.
    pourquoi ??

  8. #8
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Delphi te fera le message généralement en bas de page^^
    Les variables locales sont détruites après leur utilisation dans le bloc où elles se situent, tandis que les variables globales restent en mémoire inutilement.
    Enfin je le vois comme ça je suis débutant^^

    Et puis si tu prend l'habitude de faire et initialiser des variables globales, un jour t''en aura tellement dans un programme qu'il te faudra te souvenir de toutes, c'est pas cool pour la maintenance de ton programme, et puis comme dit ça prend de la place^^

  9. #9
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Salut;

    de loin je préfère fonction récursive à procédure récursif, pour la simple raison qu'il y a un résultat à retourner.

  10. #10
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    je vous remercie pour vos conseils , j'utiliserais pas donc les variables globale.
    je ne l'ai pas encore exécuter , hier j'avais un petit probelem avec mon ordinateur , je le ferais aujourd'hui j'éspére que ça marchera .
    merci encore

  11. #11
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 949
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 949
    Points : 5 663
    Points
    5 663
    Par défaut
    Hai,
    Citation Envoyé par dragonno Voir le message
    Delphi te fera le message généralement en bas de page^^
    Les variables locales sont détruites après leur utilisation dans le bloc où elles se situent, tandis que les variables globales restent en mémoire inutilement.
    Enfin je le vois comme ça je suis débutant^^

    Et puis si tu prend l'habitude de faire et initialiser des variables globales, un jour t''en aura tellement dans un programme qu'il te faudra te souvenir de toutes, c'est pas cool pour la maintenance de ton programme, et puis comme dit ça prend de la place^^
    La 2ème partie de ta réponse est plus proche de la raison.

    À quoi s'ajoute que ça pousse à créer du code non réutilisable, puisque les procédures (au sens large : procédures et fonctions) dépendent de l'existence de ces variables globales.

    Pour avoir un code "propre", les variables globales sont à proscrire systématiquement.
    C'est presque toujours possible (il y a des exceptions, généralement dues au langage utilisé).

    Une règle simple existe :

    Une procédure doit recevoir en paramètres toutes les données dont elle a besoin et/ou qu'elle va modifier.

  12. #12
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    j'apprécie toutes vos réponses , mais la je suis vraiment débutante en ce langage donc que me conseillez-vous? introduire variables globales , dans mes procédures ou non??
    merci

  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    À quoi s'ajoute que ça pousse à créer du code non réutilisable, puisque les procédures (au sens large : procédures et fonctions) dépendent de l'existence de ces variables globales.

    Pour avoir un code "propre", les variables globales sont à proscrire systématiquement.

  14. #14
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    encore une petite question
    dans l'inspecteur d'objets de delphi 6 je retrouve pas ( option pour changer le gotab et go editing du false à true ) et a trouver colcount et rowcount pour les initialiser a zero
    merci

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    c'est sur quel composant ça ?
    Car le colCount et RowCount que je connais c'est sur un DrawGrid par exemple et dans ce cas ils sont sur l'inspecteur.

    Sinon si tu est sur que ton composant possède ces valeurs, tu peux les initialiser au démarrage de ton application dans le formCreate (evennement de la fiche) ou au début du bloc où ils sont utilisés^^
    Juste en donnant le nom de ton composant :
    LeComposant.ColCount:=0

  16. #16
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    je vais vous expliquer
    pour pouvoir afficher le résultat dans mon tableau je dois modifier dans options qui se trouve dans mon inspecteur d'objet (propriétés )mais la je ne trouve pas le options ni go tab ni go editing et pour les autres applications je trouve pas aussi le col count et row count , ni dans propriétés ni évents .
    vous m'avez demandé de regarder au debut du bloc quel bloc?

  17. #17
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Si je comprend bien, le ColCount et le RowCount sont pour le nombre de lignes et colonnes de ton tableau ?
    Si c'est le cas, il te faut peut-être écrire :
    LeNomDeTonTableau.colCount:=0;

    En fait si tu me précisait si le tableau est un composant (style drawgrid) je saurais peut-etre avoir une idée.
    Mais si c'est juste un tableau mémoire du style Array bein c'est autre chose.

    Un bloc ça commence au début d'une procédure et ça finit à la fin de la procédure, en gros c'est un paquet d'instruction.

    NB :
    ça je comprend pas :/
    go tab
    Sinon moi j'ai delphi 5.

  18. #18
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Je viens de regarder ton premier post et apparamment c'est de tableaux dont tu parle, ce qui me trompait c'est que tu parlait d'inspecteur d'objet, car un tableau n'a pas de propriètés dans l'inspecteur d(objets, c'est juste une zone en mémoire, c'est pas un objet composant de delphi (seuls les composants de delphi peuvent voir certaines de leurs propriètés dans l'inspecteur d'objets).

    Pour définir un tableau en delphi :
    http://delphipage.free.fr/tableaux.html

  19. #19
    Futur Membre du Club
    Étudiant
    Inscrit en
    Janvier 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 22
    Points : 7
    Points
    7
    Par défaut
    moi c'est le delphi6 et j'ai l'habitude de travailler avec le delphi5 a la fac et 7 chez moi mais la j'ai le delphi 6 donc le je suis un peu perdu , oui le col count et row count c'est le nombre de lignes et colonnes du tableau .
    je crois que je vais écrire , comme vous me l'avez conseillé
    LeNomDeTonTableau.colCount:=0;

    go tab et go editing se trouvent dans options donc il faut ecrire a la place de false true ,et sincèrement le prof nous avez brièvement expliqué , elle nous a juste demandé de faire ça , j'ai cherché sur le net mais j'ai pas trouvé mais j'ai l'intention de lui demander

  20. #20
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    598
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 598
    Points : 628
    Points
    628
    Par défaut
    Regarde le tuto sur les tableaux dont je t'ai donné le lien ça va servir^^
    (j'ai beau chercher sur Google les mots Delphi go Tab ou editing ça donne rien c'est la premiere fois que j'entend parler de ça à propos de tableaux^^)

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requete dans procedure récursive.
    Par jcpas dans le forum WinDev
    Réponses: 6
    Dernier message: 25/10/2007, 14h11
  2. Apropos des Transactions au sein d'un Stored Procedure
    Par Sarbacane dans le forum Connexion aux bases de données
    Réponses: 6
    Dernier message: 16/11/2004, 08h21
  3. Declaration Type ds une procedure
    Par Qwazerty dans le forum Langage
    Réponses: 6
    Dernier message: 28/08/2002, 09h09
  4. [TP]code asm dans une procedure
    Par M.Dlb dans le forum Turbo Pascal
    Réponses: 3
    Dernier message: 17/08/2002, 20h43
  5. Reprendre une procedure dans une autre ?
    Par Poisson Rouge dans le forum Langage
    Réponses: 3
    Dernier message: 17/07/2002, 22h51

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