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 :

Améliorer l'affichage d'une application console


Sujet :

Delphi

  1. #1
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut Améliorer l'affichage d'une application console
    Bonjour !

    Je voudrais apprendre à écrire des applications en mode console sous Delphi XE2. J'ai commencé un programme qui calcule le PGCD de deux nombres suivant la méthode d'Euclide. Je voudrais l'améliorer pour en faire un exemple didactique de calcul récursif. Auriez-vous des suggestions, concernant la présentation ou le contenu ?

    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
    program PGCD; // Calcul du PGCD par la méthode d'Euclide
     
    {$APPTYPE CONSOLE}
     
    {$R *.res}
     
    uses
      System.SysUtils;
     
    function f (a,b: Integer): Integer;
    begin
      WriteLn('a=',a,' b=',b);
     
      if b = 0 then f := a
      else f := f (b, a mod b);
     
      WriteLn('a=',a,' b=',b);
    end;
     
    begin
      try
        f(12,16);
        ReadLn;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  2. #2
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut

    Ajouter des commentaires... supprimer le second WriteLn qui me perturbe plus qu'il ne m'aide lorsque je lis la sortie console...

    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
    function f (a,b: Integer): Integer;
    begin
      WriteLn('a=',a,' b=',b);
     
      if b = 0 then            // le reste vaut-il 0 ?
        f := a                 // si oui, on a le résultat
      else                     // sinon
        f := f (b, a mod b);   // on réitère le calcul avec les valeurs b et le reste de a / b
     
    //  WriteLn('a=',a,' b=',b);
    end;
     
    begin
      try
        WriteLn('PGCD : ', f(59160,63240));
        ReadLn;
      except
        on E: Exception do
          Writeln(E.ClassName, ': ', E.Message);
      end;
    end.

  3. #3
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Whiler Voir le message

    Ajouter des commentaires... supprimer le second WriteLn qui me perturbe plus qu'il ne m'aide lorsque je lis la sortie console...
    Merci pour ta réponse.

    Tes commentaires sont bien faits : je vais les conserver tels quels.

    EDIT

    Je viens de remarquer les autres modifications.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  4. #4
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Et j'ai modifié mon source pour supprimer le IntToStr que j'utilisais... en mettant une virgule tout comme tu l'as fait pour les autres WriteLn... c'est plus homogène

  5. #5
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Whiler Voir le message
    Et j'ai modifié mon source pour supprimer le IntToStr que j'utilisais... en mettant une virgule tout comme tu l'as fait pour les autres WriteLn... c'est plus homogène
    Et dans ce cas, on peut même se passer de l'unité SysUtils.

    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
    program PGCD3; // Calcul du PGCD par la méthode d'Euclide
     
    {$APPTYPE CONSOLE}
     
    function f (a,b: Integer): Integer;
    begin
      WriteLn('a=',a,' b=',b);
     
      if b = 0 then            // le reste vaut-il 0 ?
        f := a                 // si oui, on a le résultat
      else                     // sinon
        f := f (b, a mod b);   // on réitère le calcul avec les valeurs b et le reste de a / b
    end;
     
    begin
      WriteLn('PGCD : ', f(59160,63240));
      ReadLn;
    end.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  6. #6
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    Allons plus loin... pour expliquer ce qu'est la récursivité, autant montrer en parallèle ce qui ne l'est pas

    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
    program PGCD3; // Calcul du PGCD par la méthode d'Euclide et une autre ;o)
     
    {$APPTYPE CONSOLE}
     
    function fr (a,b: Integer): Integer;    // Récursif
    begin
    //  WriteLn('a=',a,' b=',b);
     
      if b = 0 then                         // le reste vaut-il 0 ?
        fr := a                             // si oui, on a le résultat
      else                                  // sinon
        fr := fr (b, a mod b);              // on réitère le calcul avec les valeurs b et le reste de a / b
    end;
     
    function fi (a,b: Integer): Integer;     // Itératif
    begin
      while (a <> b) do                      // Tant que a & b diffèrent
      begin
        if (a > b) then                      // a supérieur à b ?
          a := a - b                         // si oui, 'a' vaut maintenant 'a-b'
        else                                 // sinon
          b := b - a;                        // 'b' vaut maintenant 'b-a'
      end;                                   // on retourne sur le 'while' pour retester
      fi := a;                               // on renvoit la valeur
    end;
     
    var
      a, b: Integer;
      r   : Char;
    begin
      repeat
        Writeln('Valeur A ?');
        Readln(a);
        Writeln('Valeur B ?');
        Readln(b);
        Writeln('(r) PGCD de ', a, ' & ', b, ' : ', fr(a, b), #13#10);
        Writeln('(i) PGCD de ', a, ' & ', b, ' : ', fi(a, b), #13#10);
        Writeln('C''est fou, c''est identique ;o)');
        Writeln('Voulez-vous recommencer ? (O/N)');
        Readln(r);
        Writeln;
      until (r = 'n') or (r = 'N');
    end.

    et puis après, on peut montrer les gains

    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
    program PGCD3; // Calcul du PGCD et boucle pour obtenir des temps...
     
    {$APPTYPE CONSOLE}
     
    uses System.Diagnostics;
     
    function fr (a,b: Integer): Integer;    // Récursif
    begin
    //  WriteLn('a=',a,' b=',b);
     
      if b = 0 then                         // le reste vaut-il 0 ?
        fr := a                             // si oui, on a le résultat
      else                                  // sinon
        fr := fr (b, a mod b);              // on réitère le calcul avec les valeurs b et le reste de a / b
    end;
     
    function fi (a,b: Integer): Integer;     // Itératif
    begin
      while (a <> b) do                      // Tant que a & b diffèrent
      begin
        if (a > b) then                      // a supérieur à b ?
          a := a - b                         // si oui, 'a' vaut maintenant 'a-b'
        else                                 // sinon
          b := b - a;                        // 'b' vaut maintenant 'b-a'
      end;                                   // on retourne sur le 'while' pour retester
      fi := a;                               // on renvoit la valeur
    end;
     
    const
      LOOP = 100000;
    var
      a, b: Integer;
      v   : Integer;
      r   : Char;
      i   : Integer;
      swr : TStopwatch;
      swi : TStopwatch;
    begin
      repeat
        Writeln('Valeur A ?');
        Readln(a);
        Writeln('Valeur B ?');
        Readln(b);
        Writeln('(r) PGCD de ', a, ' & ', b, ' : ', fr(a, b));
        Writeln('(i) PGCD de ', a, ' & ', b, ' : ', fi(a, b));
        Writeln('C''est fou, c''est identique ;o)');
     
        swr := TStopwatch.StartNew;
        for i := 1 to LOOP do
          fr(a, b);
        swr.Stop;
        swi := TStopwatch.StartNew;
        for i := 1 to LOOP do
          fi(a, b);
        swi.Stop;
        Writeln('Vitesses : ');
        Writeln('R : ', swr.ElapsedMilliseconds);
        Writeln('I : ', swi.ElapsedMilliseconds);
        Writeln;
        Writeln('Voulez-vous recommencer ? (O/N)');
        Readln(r);
        Writeln;
      until (r = 'n') or (r = 'N');
    end.

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Je ne connaissais pas la méthode des soustractions.

    J'aime bien aussi l'idée d'ajouter un chrono. Merci pour l'exemple.
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Membre éclairé
    Avatar de Whiler
    Homme Profil pro
    Inscrit en
    Avril 2002
    Messages
    298
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 298
    Points : 664
    Points
    664
    Par défaut
    C'est vraiment à titre d'exemple...

    mais les dés sont pipés (pour le chrono)... sachant que les formules mathématiques utilisées ne sont pas les mêmes...

    Cette méthode serait plus honnête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    function fi (a,b: Integer): Integer;   // Itératif
    begin
      while (b <> 0) do
      begin
        Result := b;                        // j'utilise Result pour ne pas déclarer une variable supplémentaire...
        b      := a mod b;
        a      := Result;
      end;
      fi := a;
    end;

  9. #9
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 072
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 072
    Points : 15 462
    Points
    15 462
    Billets dans le blog
    9
    Par défaut
    Bien vu !
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 18/03/2007, 15h38
  2. Réponses: 4
    Dernier message: 05/05/2005, 16h34
  3. Comment retrouver le handle d'une application console?
    Par Laurent Dardenne dans le forum Windows
    Réponses: 7
    Dernier message: 22/12/2004, 16h58
  4. Créer une application console
    Par darinze dans le forum Langage
    Réponses: 7
    Dernier message: 18/06/2004, 17h35
  5. [Kylix] une application console
    Par naili dans le forum EDI
    Réponses: 3
    Dernier message: 19/04/2004, 14h27

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