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

Algorithmes et structures de données Discussion :

Reprogrammer un outil diff


Sujet :

Algorithmes et structures de données

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Reprogrammer un outil diff
    Bonjour tout le monde,

    Je suis actuellement en première année d'école d'ingénieurs, nous avons donc débuté les cours d'algo en septembre.

    On a reçu notre deuxième projet de C qui consiste à refaire un outil comme diff, produisant la même sortie(script d'édit).

    J'ai pensé à utiliser le même algo que le diff original(Algo de Myers) mais pour quelqu'un qui débute, cela me semble un peu complexe( pas encore vu les graphes en cours d'ailleurs), surtout qu'il faut pouvoir l'expliquer en soutenance.

    Je me penche donc vers vous, si jamais vous voulez plus de précisions je peux vous mailer le sujet. En aucun cas je ne cherche une solution toute faite, mais je cherche des pistes, étant directement parti pour Myers au début.

    Merci
    Bonne journée

  2. #2
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    serais intéressé à + de précision. quelle école?

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Mail envoyé sur votre boîte pour plus de précisions.

    Merci

  4. #4
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Un petit Up ...J'espère ne pas m'attirer la foudre des modérateurs..

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Désolé du délai mais impossible de répondre + vite. Voici 1 petit exemple NON TESTE qui devrais répondre + ou moins au cahier des charges que vous m'avez fourni
    1- Il n'est pas optimisé
    2- Il est écrit en pascal - Il faut bien vous laisser 1 peu de travail pour le transcrire, adapter, débugger en C
    3- sans aucune garantie mais devrait poser les base de la méthodologie à appliquer. Je serais reconnaissant de commentaires et codes corrigé
    4- Le 2eme problème ( avec directoire ) ne consiste qu'à appeler le module précedent x fois en utilisant un algoritme de récurcivité pour scanner les directoires et sous directoires. On trouve sur ce forum déjà de nombreux comments à ce sujet.

    5- Même si le code est "buggless" ce qui n'est pas sur, il convient de sortir + d'info de la routine de comparaison : 2 files strictement égaux et 2 file égaux aux limites des tolérences ce n'est pas la même chose. Par ailleurs localiser les différences, ... c'est utile. Je ne connai pas + que cela le prog DIFF et ne pourrais en créer un autre ayant le même output.

    6- suggestion d'implémentation: ne pas tenir compte des blancs autour des ponctuations.

    le code ci-joint est fait pour Dephi 7

    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
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
     
     
    unit Unit1;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;
     
    type
      TForm1 = class(TForm)
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
     
    var
      Form1: TForm1;
     
    implementation
     
    {$R *.dfm}
    const espace : char = ' ';
    const Buffer_Depth = 20;
    var   Buffer : array[0..1,0..Buffer_Depth-1] of string;
    function remove_multispace( s : string ) : string;
    var i,j,k : integer;
       begin
       i:=0;
          repeat
          inc(i);
          if S[i] = espace then
             begin
             j:=0;
               repeat
               inc(j)
               until S[i+j] <> espace; // pas besoin de tester or j=Length(S) car on a eu Trim(L) avant l'appel à
                                       // cette routine => S ne peut finir sur des ' '
            if ( j > 1 ) then   // il y a j-i space contigus s[i],.., S[i +j-1 ]
               begin            // supprimer j-1 blancs
               dec(j); // j contient le nombre de blancs à supprimer
               for k:=i+2 to Length(S) - j do
                  S[k] := S[k+j];
               S:=copy(S,1,length(S)-j)
               end;
            end;
          until ( i = Length(S));
       end;
    function compare_2_lignes(  L1, L2              : string;
                                Multi_space_allowed : boolean;
                                case_sensitive      : boolean ) : boolean;
    var i : integer;
       begin
       // 1 suppression des blancs de début et fin
       L1 := Trim(L1);
       L2 :=  Trim(L2);
       if not case_sensitive then // on met tout en majuscule
          begin
          for i:=1 to Length(L1) do L1[i]:=UpCase(L1[i]);
          for i:=1 to Length(L2) do L2[i]:=UpCase(L2[i]);
          end;
       if Multi_space_allowed then // remplacer les séries de  space par 1 seul
          begin
          L1 := remove_multispace(L1);
          L2 := remove_multispace(L2);
          end;
       compare_2_lignes := ( L1 = L2 );
       end;
    var t : array[0..1] of TextFile;
    function Fill_Buffer ( l1,Nbr,num : integer; Strip_empty_lines : boolean ) : integer;
    var n,i,l2 : integer; s : string;
       begin
       i:=l1;
       l2 := l1 + Nbr;
       n:=0;
          repeat
          readln( t[num],s);
          s:=Trim(s);
          if ( s <> '') or not Strip_empty_lines then
             begin
             inc(n);
             Buffer[num][i] := s; // on conserve s si non vide ou si vide avec l'option ne pas supprimer lignes vides
             inc(i);
             end
          until ( i = l2 ) or ( eof(t[num]));
       Fill_Buffer:=n; // normalement depth sauf pour des petits fichiers où des la 1er passe on arrive en fin de fichier
       end;
    var N_Allowed_index   : array[0..1] of integer;
        failed            : boolean;
    function Go_On : boolean;
       begin // continuer si non arriver en fin des buffers
       Go_On := ( N_Allowed_index[0] > 0 ) and
                ( N_Allowed_index[1] > 0 ) and
                not failed;
       end;
    procedure Load_Buffer(index : integer; nbr : integer; Strip_empty_lines : boolean ); // on essaie de remettre nbr data en fin du buffer - si t les contient encore ! -
    var i,k : integer;
       begin
       for i:=1 to nbr do if not eof(t[index] ) then
          begin
             repeat
             k := Fill_Buffer(N_Allowed_index[index]+1,1,index,Strip_empty_lines);
             if k = 1 then // la ligne a ete ajouté.
                inc(N_Allowed_index[index]);
             until (k=1) or ( eof(t[index]));
          end;
       end;
    procedure Shift_Buffer(index : integer; nbr : integer);
    var i : integer;
       begin
       for i:=0 to Buffer_Depth-1 - nbr do
          Buffer[index][i]:= Buffer[index][i+nbr];
       dec( N_Allowed_index[index],nbr); // on remontra cet index ( si possible) avec Load_Buffer
       end;
    Function Compare_2_files( F0, F1              : string;
                              Strip_empty_lines   : boolean;
                              Multi_space_allowed : boolean;
                              case_sensitive      : boolean) : boolean;
    var s     : string;
        i2,j2 : array[0..1] of integer;
        n     : integer;
        OK    : boolean;
       begin
       if not FileExists(F0) then
          begin
          ShowMessage('Désolé mais le fichier ' + F0 + ' est maquant');
          Compare_2_files := false;
          exit
          end;
       if not FileExists(F1) then
          begin
          ShowMessage('Désolé mais le fichier ' + F1 + ' est maquant');
          Compare_2_files := false;
          exit
          end;
       assignfile(t[0],F0);
       reset(t[0]);
       assignfile(t[1],F1);
       reset(t[1]);
       for n:=0 to 1 do                    //de 0 mettre Buffer_Depth
          N_Allowed_index[n] := Fill_Buffer(0,Buffer_Depth,n,Strip_empty_lines)-1; // normalement depth - 1 si fichier assez grand
       while Go_On() do
          begin
          // chercher dans le buffer lea 1er situation où Budder[0][i] = Buffer[1][j]
          // le buffer à déjà, le cas échéant été épuré de ses lignes vides. le multi space et les majuscules
          // seront tenus en compte lors de la routine compare_2_lignes
          // l'égalité se trouve normalement pour i=j=0 mais on tolère les situations
     
          // A fichiers de même taille avec quelques lignes non contigues différentes
          // B fichiers de taille différente dont l'un des 2 est le début de l'autre.
          // C fichiers identiques à l'exception de lignes en plus
          //    (au maximum 20 lignes contigues) dans uniquement
          //     un des 2 fichiers. Ces lignes supplémentaires peuvent se trouver
          //     n'importe où dans le fichier.
          // D fichiers identiques à l'exception de lignes en plus
          //     (au maximum 20 lignes contigues) dans les 2 fichiers.
          //     Ces ajouts se trouvent à des endroits différents :
          //     il n'y a pas, au même endroit, 3 lignes en plus dans un
          //     fichier et 12 en plus dans l'autre.
          //     Ces lignes supplémentaires peuvent se trouver n'importe où dans le
          //     fichier.
          (*
          L'hypothèse C n'implique pas pour autant de le fichier contenant le + ligne
          soit le + gros en taille ( l'autre pourrait contenir 1 ligne fauuse TRES longue
          ce qui pourrait être acceptable) .
          Sans un pré-scan qui est aussi hors condition, il n'est
          pas repérable à l'avance. C'est la raison du Buffer sur les 2 fichiers
          *)
          i2[0]:=0;
     
          n:=Buffer_Depth+10;
          if ( N_Allowed_index[0] >0 ) and ( N_Allowed_index[1] > 0 ) then
             begin
             failed := true;
             while ( i2[0] < N_Allowed_index[0] ) do
                begin
                i2[1]:=0;
                while ( i2[1] < N_Allowed_index[1] ) do
                   begin
                   OK := compare_2_lignes( Buffer[0][i2[0]],Buffer[1][i2[1]],
                                   Multi_space_allowed,case_sensitive);
                   if ( OK ) then          // on ne peut pas se contenter de cela
                      begin                // car B[0][0] pourrait être egal à B[1][depth-1]
                      failed:=false;       // alors qu'1 plus proche correspondance pouurait être trouvé si
                                           // par exemple B[0][1] = B[1][0] alors il serait + probable
                      if i2[0] + i2[1] < n then// qu'on ait 1 ligne de plus dans le buffer[0] que depth ligne de + dans le Buffer[1]
                         begin
                         n:=i2[0] + i2[1];
                         j2[0]:=i2[0];  // on conserve la situation qui est la + proche de l'origine
                         j2[1]:=i2[1]
                         end;
                      i2[1] := N_Allowed_index[1];
                      end
                   else
                      inc(i2[1])
                   end;
                inc(i2[0])
                end
             end;
          if not failed then // une occurence d'égalité est trouvée aux index j2[0],j2[1]
             begin
             // supprimer la/les lignes des 2 parties du Buffer
             Shift_Buffer(0,j2[0]+1);
             Shift_Buffer(1,j2[1]+1);
             // completer les Buffers temps que possible et remonter en conséquence Last_index
             Load_Buffer(0,j2[0]+1,Strip_empty_lines);
             Load_Buffer(1,j2[1]+1,Strip_empty_lines);
             end
          end;
       closefile(t[0]);
       closefile(t[1]);
       Compare_2_files := not failed; // ceci est vrai dans le domaine de tolérance donné
                                      // rapporter + de détail sur la "distance des 2 fichiers"
       end;                           // est certainement un must.
     
    end.

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    Complément:

    Il existe de nombreux softs sur le commerce réalisant - ou tentant de réaliser - ce genre de comparaison et gérant les fichiers txt, htm, rtm, doc, ...

    AUCUN d'entres eux est - à mon avis - satisfaisant

    Je travaille entre autre sur la reconnaissance vocale et, pour qualifier les algorithmes de reconnaissance, on est amené à comparer le texte original au texte transcrit. Bien des fois la faible note n'est pas à attribuer au Speach To Text mais au comparateur lui même!!!


    Toutes idées que vous pourriez me suggerer sont donc les BIEN VENUES !!!!!

  7. #7
    Membre à l'essai
    Inscrit en
    Juillet 2005
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Salut, merci !!

    Je vais regarder tout ça, à savoir que le type string est propre au Pascal et qu'il va falloir que j'utilise des fonctions de comparaison comme strcmp.

    Je vais déjà tout lire et transcrire correctement.

    Je te remercie et te tiens au courant(je bosse en parallèle sur le véritable algo de diff, en complexité optimale, tant en espace qu'en temps).

    @++

Discussions similaires

  1. outils microsoft: diff VS web dev et expression 2 ?
    Par Gragra dans le forum EDI/Outils
    Réponses: 4
    Dernier message: 11/06/2008, 13h53
  2. [Outil] Viewer de diff "natif" CVS ?
    Par kinettoman dans le forum CVS
    Réponses: 2
    Dernier message: 29/03/2007, 11h34
  3. Outils, cours et NOUVEAUX tutoriels pour Borland C++Builder
    Par hiko-seijuro dans le forum C++Builder
    Réponses: 10
    Dernier message: 12/03/2006, 22h33
  4. Barre d'outils
    Par MANU_2 dans le forum Composants VCL
    Réponses: 3
    Dernier message: 04/08/2002, 22h48
  5. OUTILS GRATUITS
    Par bertlef dans le forum CORBA
    Réponses: 5
    Dernier message: 11/06/2002, 10h58

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