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 : 8211
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} [C] WD_STRING V2.2
Fonctions de gestion des chaînes de caractères en langage C. Fonction Inverse : Renvoie pour chaq...

{C / C++ / C++.NET} [C] WD_STRING V1.9
Fonctions de gestion des chaînes de caractères en langage C. Fonction ChaineCompare : Compare deux ...

{Delphi} STREAM STRINGWRITER... UNE MICRO-LIBRAIRIE POUR ÉCRIRE DES CHAINES DANS UN FLUX
Cette micro-librairie (2 fonctions seulement) permet de lire et écrire des chaines de caractères dan...

{Visual Basic, VB6, VB.NET, VB 2005} CHAÎNE ALÉATOIRE / RANDOM STRING
Voila une petite fonction pour avoir une chaîne de caractère aléatoire composer de lettres(maj , min...

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