IUP2 : TP informatique 4

Chaines de caractères, tableaux de chaines (et donc tableaux de tableaux)

1) recherche d'une sous-chaine

soit déclaré :
char chaine[40], souschaine[40];
faire un programme qui saisit ces deux chaines, et (à l'aide de sous-programmes) dise où et combien de fois on trouve la souschaine dans la chaine.

Exemple : chaine="FONCTION", souschaine="ON", on trouve deux fois la souschaine, en position 1 et 6.

nb=0;
for(i=0;chaine[i];i++)
 {
  for(j=0;souchaine[j]&&chaine[i+j];j++)
        if(souschaine[j]!=chaine[i+j])break;
  if(!souschaine[j]) printf("%dième position : %d\n",++nb,i);
 }

2) tableau de chaines

déclarons :
  typedef char string[40];
Dans ce cas la déclaration de la question précédente devient :
str chaine, souschaine;
Créez un tableau de 20 str maximum (le nombre réel sera stocké dans la variable nblig), effectuez la saisie et cherchez la souschaine dans tout le texte, en indiquant, si vous l'avez trouvée, le numéro de ligne et la position dans la ligne.

Solution : le plus simple est de créer une fonction comparant deux chaines (on vient de le faire) et de l'appeler nblig fois :

#include <stdio.h>
typedef char str[40];
int compare(str chaine, str souschaine, int l)
 {
  int i,j,nb=0;
  for(i=0;chaine[i];i++)
   {
    for(j=0;souchaine[j]&&chaine[i+j];j++)
        if(souschaine[j]!=chaine[i+j])break;
    if(!souschaine[j]) printf("ligne %d, %dième position : %d\n",l,++nb,i);
   }
  return(nb);
 }
void main(void)
 {
  str sch,texte[20];
  int nblig,l,nb=0;
  printf("combien de lignes ? ");
  scanf("%d",&nblig);
  fflush(stdin); /*en turbo C la gestion du clavier par scanf est incompatible avec gets sans ca*/
  for(l=0;l<nblig;l++)
   {
    printf("ligne %d ?",l);
    gets(texte[l]);
   }
  printf("sous chaine à chercher ? ?");
  gets(sch);
  for(l=0;l<nblig;l++)
    nb+=compare(texte[l],sch,l);
  printf("en tout on en a trouvé %d \n",nb);
}

3) essayez de créer un tableau dynamique

Chaque ligne ne prend que la place nécessaire. On gardera cependant un nombre maximum de lignes qui lui sera prédéfini (20 maxi). On peut remarquer que ce modèle n'est intéressant que si les lignes de texte ne risquent pas de "grandir" au cours de leur utilisation. Ce n'est donc pas cette représentation que l'on utilisera pour un traitement de texte.


Patrick TRAU,ULP - IPST 12/12/97