Exercice palindrome

a marqué ce sujet comme résolu.

Salut !

Je suis actuellement en train de faire l’exercice du palindrome mais ma fonction bug car elle remplace le premier mot de mon caractère par un symbole (’ souvent) Comment faire ? Mon code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
char isPalindrome (char *chaine, size_t max) {

    size_t i ;

    char invertChaine[max] ;

    for (i = max ; i > 0 ; i--) invertChaine[i] = chaine[i] ;

    if (invertChaine == chaine) printf ("\nLa chaine, %s, est un palindrome !\n", chaine) ;

    else printf ("\nLa chaine, %s, n'est pas un palindrome !\n", chaine) ;

}

Plusieurs erreurs :

char invertChaine[max] ; for (i = max ; i > 0 ; i–) invertChaine[i] = chaine[i] ;

Tu commences avec i = max, mais l’indice maximale de invertChaine (et à priori de chaine) est max-1. Tu vas donc avoir un soucis de mémoire.

Tu copies chaine dans invertChaine avec le même indice entre les deux, en somme, tu copies l’un dans l’autre sans changement. Un des indices devrait être max-i et non i.

À priori, tu ne mets pas la caractère de terminaison de ta chaine (’\0’) dans invertChaine.

if (invertChaine == chaine)

N’est pas valide (tu vas comparer l’adresse des pointeurs sur les chaines, et non les chaînes elles mêmes). Tu dois utiliser la fonction strcmp ou employer une boucle pour comparer caractère par caractère.

Après il est possible de réaliser cette fonction sans utiliser une chaîne inversée intermédiaire. Il suffit de comparer la chaine caractère par caractère en démarrant des deux bouts, en augmentant et diminuant l’indice de chaque côté jusqu’à arriver au milieu de la chaîne. Si l’égalité se vérifie à chaque fois, tu as un plalindrome.

+2 -0

Salut ! Tout d’abord merci de ta réponse, après avoir fait les modifications que tu m’as dit de faire, sa ne marche toujours pas… (pour le max - i j’ai essayé pour les 2 chaines) :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
void isPalindrome (char *chaine, size_t max) {

    size_t i ;

    int maxInvert = max - 1 ;

    char invertChaine[maxInvert] ;

    for (i = maxInvert ; i > 0 ; i--) invertChaine[max - i] = chaine[max] ;

    if (strcmp(chaine, invertChaine) == 0) printf ("\nLa chaine, %s, est un palindrome !\n", chaine) ;

    else printf ("\nLa chaine, %s, n'est pas un palindrome !\n\n", chaine) ;

}

`
+0 -0

Salut,

1
invertChaine[max - i] = chaine[max];

Là, tu copies toujours le caractère nul de la chaîne chaine puisque [max] renvoie toujours au même caractère. Par ailleurs, je te conseille d’éviter les boucles avec un indice décroissant, c’est moins intuitif et cela porte vite à confusion. Enfin, si tu sèches, n’oublie pas qu’une correction est proposée pour cette exercice. ;)

+0 -0

Ok merci de ta réponse donc il faut juste que j’enlève un à max dans chaîne[max] ?

Jupiter41

Réfléchis bien à ce que doit faire ta boucle : elle doit copier l’inverse d’une chaîne dans une autre. Tu dois donc avoir un corps de boucle similaire à une copie, soit par exemple t[i] = s[i], mais modifié en conséquence.

+0 -0

Jupiter41: Le conseil que je peux te donner, c’est de faire quelques étapes à la main : tu prends ta chaîne, tu prends le dernier caractère que tu mets à tel endroit dans invertChaine, puis tu prends tel caractère que tu mets à tel endroit…

Si à chaque fois tu fais bien attention aux indices que tu utilises, tu devrais pouvoir trouver la solution. :)

Salut !

Je n’y arrives toujours pas avec ce code :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
void isPalindrome (char *chaine, size_t max) {

    size_t i ;

    int maxInvert = max - 1 ;

    char invertChaine[maxInvert] ;

    for (i = maxInvert ; i > 0 ; i--) invertChaine[max - i] = chaine[max - 1] ;

    if (strcmp(chaine, invertChaine) == 0) printf ("\nLa chaine, %s, est un palindrome !\n", chaine) ;

    else printf ("\nLa chaine, %s, n'est pas un palindrome !\n\n", chaine) ;

}

Je ne comprends pas du tout ce qu’il ne va pas dans ce code…

Suis le conseil de Taurre, déroule ta boucle à la main, remplace toi même les valeurs des variables et regarde ce qui cloche.

Note, tu peux aussi utiliser printf dans ta boucle pour afficher les valeurs intéressantes (max, i et le caractère courant de chaque chaine), compare d’ailleurs avec ce que tu as fait manuellement. Tu verras que dans ton raisonnement (ou ta compréhension de la situation) cela cloche.

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte