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 : 5554
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

{C / C++ / C++.NET} GSTRING - GESTION DES CHAINES DE CARACTÈRES
Voici une petite classe permettant de gérer les chaines de caractères tout comme les std::string, av...

{JAVA / J2EE} GENERATEUR DE MOT PAR INCREMENTATION
Cette class permet de renvoyer un mot à partir d'un autre avec une permutation du dernier caractère ...

{Delphi} LIBRAIRIE DE FONCTIONS DE GESTION DE SOUS-CHAINES.
Quelques fois, on aimerai avoir une sorte de "structure" de plusieurs éléments variable en taille et...

{C / C++ / C++.NET} MYSTRING, CLASSE TRAITANT DES CHAÎNES DE CARACTÈRES
Ceci est une classe tout ce qu'il y'a de plus banal traitant des chaines de caractères. Commentée ai...

{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 ...