Les Snippets

Connexion

chaine de battage (fonction qui renvoie 1 si la chaine3 est une chaine de battage de la chaine 1 et de la chaine 2)

Niveau requis pour utiliser/comprendre cette source : 1 ( Débutant )
Créé le 15/12/2007 10:35:00 et initié par coucou747 [Liste]
Date de mise à jour : 11/01/2008 13:59:36
Vue : 2114
Catégorie(s) : Algorithme, Chaîne de caractères
Langages dispo pour ce code :
- C
- VB6, VBA
- VB 2005
- Delphi 5



Langage : C
Date ajout : 15/12/2007
Posté par coucou747 [Liste]
DateMAJ : 09/01/2008

Soient deux chaînes de caractères s1 et s2. On appelle battage de s1 et s2 toute chaîne s composée de tous les caractères de s1 et de s2, 
telle que l'ordre des caractères de s1 et l'ordre des caractères de s2 ne soit pas modifié dans s, et que les caractères de s1
et les caractères de s2 n'apparaissent qu'une fois dans s.

int battage(const char *s1, const char *s2, const char *s, int strlen1, int strlen2, int strlen3)
{
  int i;
  if(strlen1==0) {
    for(i=0; i<strlen2; i++) {
      if(s2[i]!=s[i]) return 0;
    }
    return 1;
  }
  if(strlen2==0) {
    for(i=0; i<strlen1; i++) {
      if(s1[i] != s[i]) return 0;
    }
    return 1;
  }
  if(s[0]==s1[0]) {
    if(battage(s1+1, s2, s+1, strlen1-1, strlen2, strlen3-1)) return 1;
  }
  if(s[0]==s2[0]) {
    if(battage(s1, s2+1, s+1, strlen1, strlen2-1, strlen3-1)) return 1;
  }
  return 0;
}

Remarque :
test :
  char *s1, *s2, *s;
  int l1, l2, l3;
  scanf("%d", &l1);
  s1 = (char *)malloc(l1 + 1);
  scanf("%s", s1);
  scanf("%d", &l2);
  s2 = (char *)malloc(l2 + 1);
  scanf("%s", s2);
  scanf("%d", &l3);
  s = (char *)malloc(l3 + 1);
  scanf("%s", s);
  printf("%d\n", battage(s1, s2, s, l1, l2, l3));
Langage : VB6 , VBA
Date ajout : 07/01/2008
Posté par PCPT [Liste]
DateMAJ : 09/01/2008
Function Battage(ByVal S1 As StringByVal S2  As String, ByVal S As  String) As  Boolean
    Dim i%
    
    If Not (Len(S1) + Len(S2) = Len(S)) Then Battage = False: Exit  Function
    
    If Len(S1) = Then
        For i = To Len(S2) - 1
            If Not (Mid$(S2, i + 11) = Mid$(S,  i + 1, 1)) Then  Battage = False: Exit  Function
        Next i
        Battage = TrueExit Function
    End If
    If Len(S2) = Then
        For i = To Len(S1) - 1
            If Not (Mid$(S1, i + 11) = Mid$(S,  i + 1, 1)) Then  Battage = False: Exit  Function
        Next i
        Battage = TrueExit Function
    End If
    If Mid$(S1, 11) = Mid$(S, 11Then
        If Battage(Right$(S1, Len(S1) - 1), S2, Right$(S, Len(S) - 1)) Then  Battage = True: Exit Function
    End If
    If Mid$(S2, 11) = Mid$(S, 11Then
        If Battage(S1, Right$(S2, Len(S2) - 1), Right$(S, Len(S) - 1)) Then  Battage = True: Exit Function
    End If
    Battage = False
End Function

Remarque :
simple "traduction" du code C
Langage : VB 2005
Date ajout : 07/01/2008
Posté par PCPT [Liste]
DateMAJ : 09/01/2008

Function Battage(ByVal S1 As String, ByVal S2 As String, ByVal S As String) As Boolean

  Dim i As Integer

  If Not (S1.Length + S2.Length = S.Length) Then Return False

  If S1.Length = 0 Then
    For i = 0 To S2.Length - 1 
      If Not S2.Chars(i) = S.Chars(i) Then Return False
    Next i 
    Return True

  End If

  If S2.Length = 0 Then
    For i = 0 To S1.Length - 1 
      If Not S1.Chars(i) = S.Chars(i) Then Return False
    Next i 
    Return True

  End If

  If S1.Chars(0) = S.Chars(0) Then

    If Battage(S1.Substring(1), S2, S.Substring(1)) Then Return True

  End If

  If S2.Chars(0) = S.Chars(0) Then

    If Battage(S1, S2.Substring(1), S.Substring(1)) Then Return True

  End If

  Return False

End Function

Remarque :
idem...
Langage : Delphi 5
Date ajout : 11/01/2008
Posté par japee [Liste]
DateMAJ : 11/01/2008
function Battage(const S1, S2, S: string): Boolean;
var
  i: Integer;
  Index1, Index2: Integer;
begin
  Result := False;
  if S1 = '' then
    Result := S = S2;
  if S2 = '' then
    Result := S = S1;
  Index1 := 1;
  Index2 := 1;
  for i := 1 to Length(S) do
  begin    
    if S[i] = S1[Index1] then
      Inc(Index1)
    else
    if S[i] = S2[Index2] then
      Inc(Index2)
    else
      Exit;
  end;
  Result := Length(S) = Length(S1) + Length(S2);
end;

Snippets en rapport avec : Chaine, String, Battage



Codes sources en rapport avec : Chaine, String, Battage

{Delphi} DELPHI : PROCEDURE SPLIT SIMILAIRE A LA FONCTION EPONYME EN VB
Découpe une chaîne délimitée en ses éléments pour remplir un tableau dynamique passé en paramètre. U...

{C / C++ / C++.NET} [C/WIN32] GÉNÉRATEUR DE CODE POUR UNE INITIALISATION SPÉCIALE DE CHAINE DE CARACTÈRES.
Yop, Voici BNMgenerator, à comprendre BruNews Method Generator. J'espère qu'il me pardonnera ce n...

{Visual Basic, VB6, VB.NET, VB 2005} CRYPTAGE ET DÉCRYPAGE D'UNE CHAÎNE DE CARACTÈRES
Bonjour, Je débute en VB.Net et c'est la première source que je dépose sur Vbfrance. J’attends be...

{Delphi} DISTANCE LEVENSHTEIN (DISTANCE ENTRE DEUX CHAINES)
Une implémantation de la distance Levenshtein. Plus de renseignemant ici : http://fr.wikipedia.org/w...

{Visual Basic, VB6, VB.NET, VB 2005} RÉCUPÉRER UNE CHAINE DE CARACTÈRE À PARTIR DE SON POINTEUR D'ADRESSE MÉMOIRE
Bonjour à tous, Voilà rien d'exceptionnel, tous les codeurs d'api en ont une comme ça, mais j'ai ...

{C / C++ / C++.NET} CRÉATION D'UNE CLASSE CL_STRING (GESTION DES CHAÎNES)
Je sais qu'il existe une class string.h mais j'ai voulu recréer comme exercice une classe qui fait ...

{C / C++ / C++.NET} SUPPRIME CHAINE DANS FICHIER (WIN32)
CHAINE A SUPPRIMER: - De 1 à 4095 octets maxi. - Tout ce qui est dans zone de texte, sauts de li...

{C / C++ / C++.NET} SUPPRIMER UNE CHAINE DE CARACTERES D'UN FICHIER
En réponse à de nombreuses questions, voici un code qui supprime une ligne dans un fichier....

{C / C++ / C++.NET} SPLIT/EXPLODE D'UNE CHAINE DE CARACTERE EN C
Suite à la question que j'ai posé sur le forum, j'ai fait une petite fonction qui découpe une chain...

{ASP / ASP.NET} .NET - COUPER UNE CHAINE DE CHARACTÈRE POUR EN EXTRAIRE LE DÉBUT
Dans le cadre de développement où on souhaite extraire le début d'un texte pour par exemple l'intégr...