Des programmes tres simples sur les chaînes de caractères

# Chapitre 5 Des programmes tres simples sur les chaînes de caractères

## 5.1 Compter un nombre d’occurences

### 5.1.1 Nombre d’occurences d’une lettre

On parcourt la chaîne S et on augmente le compteur n de 1 lorsqu’il y a égalité avec le caractère c.

    Occurc(c,S):={
      local n,d,j;
      d:=dim(S)-1;
      n:=0;
      pour j de 0 jusque d faire
        si c==S[j]  alors n:=n+1 fsi;
      fpour;
      retourne n;
    }:;

On tape :
Occurc("e","occurrences")
On obtient : 2

### 5.1.2 Nombre d’occurences d’une sous-chaîne

Il faut comparer à chaque étape la sous-chaîne ch avec un morceau de la chaîne S qui a même longueur.
On va utiliser mid(S,j,k) qui renvoie la sous chaîne de S de longueur k qui commence à l’indice j ou mid(S,j) qui renvoie la sous-chaîne fin de S commençant à l’indice j.
Remarque À la place de mid(S,j,k) on peut aussi utiliser S[j..j+k-1] (on met les indices de début et de fin de la sous-chaîne) et à la place de mid(S,j) on peut aussi utiliser S[j..dim(S)-1].
On considère que dans "aaa" on voit une seule sous-chaîne "aa".

    Occurch(ch,S):={
      local n,d,j,k;
      d:=dim(S)-1;
      k:=dim(ch);
      n:=0;
      j:=0;
      tantque j<= d-k+1 faire
        si ch==mid(S,j,k)  alors
          n:=n+1;
          j:=j+k;
          sinon
            j:=j+1
        fsi;
      fpour;
      retourne n;
    }:;

On tape :
Occurch("e","occurrences")
On obtient : 2
On tape :
Occurch("az","aaazaaazaaaz")
On obtient : 3
On tape :
Occurch("aa","aaazaaazaaaz")
On obtient : 3

## 5.2 Supprimer une lettre et sous-chaîne

### 5.2.1 Supprimer une lettre

On parcourt la chaîne S lorsqu’il y a égalité avec le caractère c il faudra supprimer ce caractère en faisant une concaténation entre ce qu’il y a avant c (si c est d’indice j c’est mid(S,0,j) car ce qu’il y a avant c est de longueur j) et ce qu’il y a après c (mid(S,j+1)). On met alors à jour la longueur de S.

    Supprimec(c,S):={
      local d,j;
      d:=dim(S)-1;
      j:=0;
      tantque j<=d faire
        si c==S[j]  alors
          S:=mid(S,0,j)+mid(S,j+1);
          d:=d-1;
        sinon
          j:=j+1
        fsi;
      ftantque;
      retourne S;
    }:;

On tape :
Supprimec("e","occurrences")
On obtient : "occurrncs"

### 5.2.2 Supprimer une sous-chaîne

On parcourt la chaîne s lorsqu’il y a égalité avec la sous-chaîne ch il faudra supprimer cette sous-chaîne en faisant une concaténation entre ce qu’il y a avant ch et ce qu’il y a après ch. On met alors à jour la longueur de S.

    Supprimech(ch,S):={
      local k,d,j;
      d:=dim(S)-1;
      k:=dim(ch);
      j:=0;
      tantque j<=d faire
        si ch==mid(S,j,k)  alors
          S:=mid(S,0,j)+mid(S,j+k);
          d:=d-k;
        sinon
          j:=j+1
        fsi;
      ftantque;
      retourne S;
    }:;

On tape :
Supprimech("e","occurrences")
On obtient : "occurrncs"
On tape :
Supprimech("az","azerazerazaz")
On obtient : "erer"
On tape :
Supprimesch("aa","aaazaaazaaaz")
On obtient : "azazaz"

## 5.3 Remplacer une lettre ou une sous-chaîne par une autre chaîne

### 5.3.1 Remplacer une lettre par une autre lettre

Pour remplacer le caractére a par b dans S, on parcourt S et quand on trouve le caractére a on change ce caractére.

    Remplaceab(a,b,S):={
    local d,j;
      d:=dim(S)-1;
      j:=0;
      tantque j<=d faire
        si a==S[j]  alors
          S:=mid(S,0,j)+b+mid(S,j+1);
        sinon
          j:=j+1
        fsi;
      ftantque;
      retourne S;
    }:;

On tape :
Remplaceab("a","e","azerazerazaz")
On obtient : "ezerezerezez"

### 5.3.2 Remplacer une sous-chaîne par une autre

Pour remplacer la sous-chaîne cha par la sous-chaîne chb dans S, on parcourt S et quand on trouve la sous-chaîne cha. on fait une concaténation entre ce qu’il y a avant cha, la sous-chaîne chb et ce qu’il y a après cha. On met alors à jour la longueur de S.

    Remplacechab(cha,chb,S):={
    local ka,kb,d,j;
      d:=dim(S)-1;
      ka:=dim(cha);
      kb:=dim(chb);
      j:=0;
      tantque j<=d faire
        si cha==mid(S,j,ka)  alors
          S:=mid(S,0,j)+chb+mid(S,j+ka);
          d:=d-ka+kb;
        sinon
          j:=j+1
        fsi;
      ftantque;
      retourne S;
    }:;

On tape :
Remplacechab("a","e","azerazerazaz")
On obtient : "ezerezerezez"
On tape :
Remplacechab("az","bcd","azerazerazaz")
On obtient : "bcderbcderbcdbcd"