Enoncé exercice 1

Ecrire un programme C qui lit une chaîne de caractères et vérifie si elle est palindrome ou non. On rappelle qu’une chaîne de caractères est dite palindrome, si elle se lit de la même manière dans les deux sens. Exemple: non, touot et 1234321 sont toutes des chaînes de caractères palindromes.

Correction exercice 1

Cet exercice est un exercice classique pour les chaines de caractères. On va y tester si une chaîne de caractères donnée est palindrome ou non. C’est à dire est ce qu’elle peut se lire dans les deux sens de la même manière.

Dans l’algorithme adopté pour cet exercice on va comparer le premier caractère de la chaîne avec le dernier, le deuxième avec l’avant dernier et ainsi de suite jusqu’à arriver au milieu de la chaine. Et chaque deux caractères comparés doivent être égaux pour que la chaîne de caractères soit palindrome.

Avant de commencer le programme il ne faut pas oublier d’ajouter la bibliothèque standard string.h aux directives du préprocesseur (ligne 3).

On commencera le programme en déclarant de la chaine s sur laquelle on va effectuer le test (ligne 6). On va la lire ensuite avec la fonction scanf (ligne 9).

On va supposer maintenant que s est palindrome en mettant la variable entière ok à 1 (ligne 10). Après, et pour faire le test on aura besoin d’un compteur i qui commencera par le premier caractère de la chaine (i=0) et un autre compteur j qui va quant à lui commencer par le dernier caractère. L’indice du dernier caractère peut être déduit à partir de la taille de la chaîne s qui est donnée par la fonction strlen() qui prend en argument une chaîne de caractères est calcul sa taille. Ainsi, la valeur de départ pour j sera strlen(s)-1. Cette initialisation sera effectuée dans le premier bloc de la boucle for (ligne 11). La décrémentation de j est effectuée en parallèle à l’incrémentation de i.

A l’intérieur de la boucle for on compare s[i] avec son symétrique s[j] (ligne 13). Et s’ils sont différents s ne sera pas palindrome. On le signale en mettant la variable ok à 0 (ligne 15). Et dans ce cas on sort de la boucle à l’aide de l’instruction break (ligne 16).

A l’extérieur de la boucle for on fait un test sur la valeur de la variable ok, si elle est égale à 1, on dira que la chaîne de caractères est palindrome, sinon on affiche qu’elle n’est pas palindrome.

Solution exercice 1
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
    char s[100];
    int i,j,ok;
    printf("Donnez une chaine de caracteres:\n");
    scanf("%s",s);
    ok=1;
    for(i=0,j=strlen(s)-1;i<j;i++,j--)
    {
       if(s[i]!=s[j])
       {
         ok=0;
         break;
       }
    }
    if(ok==1) printf("%s est palindrome.\n",s);
    else printf("%s n'est pas palindrome.\n",s);
    system("pause");
    return 0;
}
Enoncé exercice 2

• En utilisant la fonction strcmp.
• Sans utiliser la fonction strcmp.

Par exemple, si on donne en entrée les deux chaînes suivantes: acb et abcd, le programme doit afficher la chaîne abcd puis acb.

Correction exercice 2

Dans cet exercice on doit comparer deux chaînes de caractères, et les afficher dans l’ordre alphabétique ou plus généralement selon l’ordre déduit du code ASCII. Car les deux chaînes de caractères peuvent contenir des caractères non alphabétiques comme les espaces ou les chiffres.

Pour ce faire, on va déclarer deux chaînes de caractères: s1 et s2 qu’on va lire à l’aide de la fonction gets. Pour la première méthode on va utiliser la fonction strcmp, définie dans la bibliothèque standard string.h, et qui prend en paramètres les deux chaînes de caractères à comparer. Dans ce cas il s’agit de s1 et s2. Donc, strcmp sera utilisée de la façon suivante: strcmp(s1,s2), cette quantité est un entier qui peut être selon l’ordre relatif des deux chaînes:

• Négatif: si s1 vient avant s2 dans l’ordre alphabétique.

• Positif: si s2 vient avant s1 dans l’ordre alphabétique.

• Nul: s’il s’agit de la même chaîne de caractères.

Donc il suffit de faire un test sur le signe de strcmp(s1,s2) pour déduire l’ordre relatif des deux chaînes. On peut remarquer que l’ordre des paramètres s1 et s2 est pris en considération, et que strcmp(s1,s2) et strcmp(s2,s1) sont de signes différents.

Pour la deuxième méthode on va essayer de comparer les deux chaînes en utilisant des outils de base, à savoir les boucles et les conditions. Le principe est très simple: on va parcourir les deux chaînes de caractères et on comparera deux à deux les caractères qui ont le même indice, et ceci on commençant par le premier caractère. Tant qu’on ne trouve que des caractères identiques on ne peut pas conclure sur l’ordre et on passe à la position qui suit. Cette tâche est réalisée par l’instruction if(s1[i]==s2[i]) continue; (ligne 25) qui veut dire que si on a s1[i]==s2[i], on passera alors de ce point vers l’itération suivante de la boucle sans exécuter le restant des instructions de la boucle for. Dans le cas où les deux caractères sont différents, la chaîne avec le plus petit caractère sera première dans l’ordre alphabétique, on tranche sur ce sujet à l’aide de la structure de contrôle if else (lignes 26-27), et on sort de la boucle (ligne 28).

Il est évident qu’on doit s’arrêter au maximum lorsque l’une des deux chaînes se termine, ceci est assuré par la condition de la boule for: i<strlen(s1) && i<strlen(s2) (ligne 23).

Jusqu’au point où on est, la boucle for donnera un ordre si elle trouve deux caractères différents avant la fin d’une des deux chaînes, donc si on donne en entrées les deux chaînes: abc et abcd, la boucle à elle seule ne peut pas décider. La solution à ce problème est très simple à mettre en place, elle consiste à faire un test sur la valeur du compteur i, juste après la fin de la boucle, et voir si elle est égale à la taille de l’une des deux chaînes et s’il en est le cas, ça voudrait dire que la chaîne dont la taille est égale à i, est la plus courte, donc forcément elle viendra première dans ordre alphabétique.

Solution exercice 2
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
        char s1[100],s2[100];
        int i;
        printf("Donnez deux chaines de caracteres:\n");
        gets(s1);
        gets(s2);
        printf("En utilisant la fonction strcmp:\n");
        if( strcmp(s1,s2)<0 )
        {
            puts(s1);
            puts(s2);
        }
        else
        {
            puts(s2);
            puts(s1);
        }
        printf("Sans utilisation de la fonction strcmp:\n");
        for(i=0;i<strlen(s1) && i<strlen(s2); i++)
        {
            if(s1[i]==s2[i]) continue;
            if(s1[i]<s2[i]) { puts(s1); puts(s2);}
            else { puts(s2); puts(s1);}
            break;
        }
        if(i==strlen(s1) )
        {
            puts(s1); puts(s2);
        }
        else if(i==strlen(s2) )
        {
            puts(s2); puts(s1);
        }
        system("pause");
        return 0;
}