Vous êtes sur la page 1sur 4

2003 - 2004

Universit Paris Dauphine IUP Gnie Mathmatique et Informatique IUP 2me anne

MISE A NIVEAU EN INFORMATIQUE : EXEMPLE D'ALGORITHMES ET DE


PROGRAMMES MANIPULANT LES CHAINES DE CARACTERES

Maude Manouvrier

La reproduction de ce document par tout moyen que ce soit est interdite conformment aux articles L111-1 et L122-4 du code de la proprit intellectuelle

1. La fonction Egalite_Chaines compare les deux chanes de caractres passes en paramtres. La fonction retourne 1 si les deux chanes sont gales et 0 sinon. /* La fonction prend en paramtres deux chanes de caractres gres par des pointeurs */ int Egalite_Chaines (char *cpMaChaine1, char *cpMaChaine2) { /* Tant que l'on a pas atteint la fin d'au moins une des deux chanes de caractres */ while( (*cpMaChaine1!=\0) && (*cpMaChaine2!=\0) ) { /* Si le 1er caractre est dans les 2 chanes */ if (*cpMaChaine1 != *cpMaChaine2) { /* Les chanes sont diffrentes, on quitte la fonction en retournant la valeur 0*/ return 0 ; } /* Si le caractre est le mme dans les 2 chanes, on passe au caractre suivant en avanant les 2 pointeurs */ cpMaChaine1++ ; cpMaChaine2++ ; } /* Fin du tant que on a atteint la fin d'au moins une chane de caractres */ /* Si on a atteint la fin des deux chanes */ if ( (*cpMaChaine1 ==\0) && (*cpMaChaine2 ==\0) ) { /* Alors les chanes sont gales, on retourne 1*/ return 1 ; } /* Sinon on a atteint la fin d'une seule chane */ else { /* Les chanes sont diffrentes, on retourne 0*/ return 0 ; } } Si on simule l'appel de Egalite_Chaines("abc","abc"), il se passe les actions suivantes : Au dbut de la fonction :
cpMaChaine1 a b c \0 cpMaChaine2 a b c \0

Les caractres (de type char) *cpMaChaine1 et *cpMaChaine2 ont la mme valeur 'a', ce qui est diffrent du caractre de fin de chane '\0', on rentre donc dans la boucle while. Les caractres *cpMaChaine1 et *cpMaChaine2 ne sont pas diffrents, par consquent on ne retourne pas 0, mais on incrmente les pointeurs :
cpMaChaine1
Maude Manouvrier Reproduction interdite

\0

cpMaChaine2

\0 2/4

Aucun des deux caractres *cpMaChaine1 et *cpMaChaine2 ne correspond au caractre de fin de chane (leur valeur est 'b'), on recommence donc excuter le corps de la boucle while. Les caractres *cpMaChaine1 et *cpMaChaine2 n'tant pas diffrents, on incrmente les pointeurs :
cpMaChaine1 a b c \0 cpMaChaine2 a b c \0

Aucun des deux caractres *cpMaChaine1 et *cpMaChaine2 ne correspond au caractre de fin de chane (leur valeur est 'c'), on recommence donc excuter le corps de la boucle while. Les caractres *cpMaChaine1 et *cpMaChaine2 n'tant pas diffrents, par consquent on ne retourne pas 0, mais on incrmente les pointeurs :
cpMaChaine1 a b c \0 cpMaChaine2 a b c \0

Les deux caractres *cpMaChaine1 et *cpMaChaine2 ont pour valeur le caractre de fin de chane, on sort donc de la boucle while. Aprs le while, comme les deux caractres *cpMaChaine1 et *cpMaChaine2 sont gaux au caractre de fin de chane, on retourne 1 (les chanes sont identiques). 2. La fonction Afficher_Inverse n'affiche pas la chane l'envers car on effectue l'affichage (appel de printf) avant de faire l'appel rcursif. /* La fonction prend en paramtre une chane de caractres gre par un pointeur */ void Afficher_Inverse(char *MaChaine) { char cara; /* Si la chane ne contient qu'un caractre */ if(strlen(MaChaine)==1) { /* On affiche le caractre unique de la chane */ printf("%c\n",*MaChaine); } /* Si la chane contient plus d'un caractre */ else if(strlen(MaChaine)>1) { /* On copie le premier caractre dans la variable locale cara */ cara = *MaChaine; /* On affiche le caractre cara qui est le 1er caractre de la chane passe en paramtre */ printf("%c\n",cara); /* On appelle nouveau la fonction avec la chane sans le premier caractre (le pointeur est dplac d'un caractre il pointe sur le 2me)*/ Afficher_Inverse(MaChaine+1);

} }

Maude Manouvrier Reproduction interdite

3/4

Simulons l'appel Afficher_Inverse("abcd"). Au dbut de l'appel, on a :


MaChaine a b c \0

strlen(MaChaine)=3, par consquent, on passe dans le corps du deuxime if. *MaChaine='a'. Cette valeur est copie dans cara, qui est affich, et la fonction est nouveau appele avec en paramtre l'adresse du deuxime caractre :
MaChaine \0

Au deuxime appel, le caractre 'b' est affich etc. La fonction ainsi crite affiche donc la chane l'endroit. Pour qu'elle l'affiche l'envers, il faut inverser le printf et l'appel rcursif. Ainsi, les caractres de la chane vont tre empils dans l'ordre dans la pile d'excution et vont donc tre affich dans l'ordre inverse.

3. L'algorithme d'une fonction egale_inverse qui prend en paramtre deux chanes de caractres, Chaine1 et Chaine2, et retourne 1 si Chaine1 correspond Chaine2 l'envers ou 0 sinon, est le suivant : Donnes en entre : Variables locales : Chaine1 chane de caractres Chaine2 chane de caractres Compteur1 entier Compteur2 entier

/* Si les chanes n'ont pas la mme longueur, elles sont */ SI longueur(Chaine1)longueur(Chaine2) ALORS retourner 0 /* Si les chanes ont mme longueur */ SINON /* Compteur1 = l'indice du premier caractre de Chaine1 */ Compteur1 = 1 /* Compteur2 = l'indice du dernier caractre de Chaine2 */ Compteur2 = longueur(Chaine2) /* On avance l'endroit dans Chaine1 et l'envers de Chaine2 */ TANT QUE Chaine1[Compteur1] == Chaine2[Compteur2] FAIRE Compteur1 = Compteur1 + 1 Compteur2 = Compteur2 - 1 FIN TANT QUE /* Si on a parcouru toute la chane Chaine2 l'envers */ SI Compteur2 == 0 ALORS retourner 1 /* Sinon, on s'est arrt avant de parcourir toute la chane Chaine2 l'envers */ SINON Retourner 0 FIN SI FIN SI
Maude Manouvrier Reproduction interdite

4/4

Vous aimerez peut-être aussi