2010-10-14 7 views
1

J'essaie de déterminer si une phrase est un palindrome (un mot qui est le même de gauche à droite) ou non mais je ne peux pas le faire fonctionner. Quel est le problème ?, je ne peux pas utiliser des pointeurs ou des variables de type récursion ou chaînePalindrome en C sans pointeurs et récursion

#include <stdio.h> 

#include <string.h> 

int main() 

{ 

int i,j = 0,length; 
char space = ' '; 
char phrase [80],phrase2[80],phrase3[80]; 

printf("Give me the phrase: "); 
gets(phrase); 
length = strlen(phrase); 

for(i =0; i <= length - 1; i++) 
{ 
    if(phrase[i] != space) //Makes the phrase without spaces 
    { 
    phrase2[i] = phrase[i]; 
    j++; 
    } 
} 

for(i = length -1; i >= 0;i--) 
{ 
    if(phrase[i] != space) //Makes the phrase backwards an without spaces 
    { 
    phrase3[j] = phrase[i]; 
    j++; 
    } 
} 

length = strlen(phrase2); 

for(i =0; i <= length -1;i++)  //Compare the phrases to know if they are the same 
{ 
    if(phrase2[i] != phrase3[i]) 
    { 
    printf("It's not a palindrome\n"); 
    return 0; 
    } 
} 
printf("It's a palindrome\n"); 
return 0; 
} 
+0

Tout message d'erreur? Quelle est votre entrée et sortie d'échantillon? – BoltClock

+1

vous devez réinitialiser j – Anycorn

+0

Je reçois toujours le message "Ce n'est pas un palindrome", Un exemple de ma contribution serait jamais impair ou même. La phrase2 est supposée obtenir neveroddoreven et la phrase3 le mot en arrière sans les espaces qui sont les mêmes neveroddoreven – Enrique

Répondre

2

Essayez ceci:

for(i =0, j=0; i <= length - 1; i++) 
{ 
    if(phrase[i] != space) //Makes the phrase without spaces 
    { 
    phrase2[j] = phrase[i]; 
    j++; 
    } 
} 

for(i = length -1, j = 0; i >= 0;i--) 
{ 
    if(phrase[i] != space) //Makes the phrase backwards an without spaces 
    { 
    phrase3[j] = phrase[i]; 
    j++; 
    } 
} 

length = j; 

Mise à jour

En réponse au poste de prétorienne est ici le code pour faire sans copier la chaîne.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 
    int i, j, length; 
    char space = ' '; 
    char phrase[80]; 

    printf("Give me the phrase: "); 
    gets(phrase); 
    length  = strlen(phrase); 

    for(i = 0, j = length - 1; i < j; i++, j--) { 
    while (phrase[i] == space) i++; 
    while (phrase[j] == space) j--; 
    if(phrase[i] != phrase[j]) { 
     printf("It's not a palindrome\n"); 
     return 0; 
    } 
    } 

    printf("It's a palindrome\n"); 
    return 0; 
} 
1

Avant la 2ème boucle, vous voulez définir j = 0. Il devrait marcher après ça. PS: Si vous avez débogué en imprimant vos trois chaînes, vous l'auriez compris en quelques minutes. Lorsque vous ne savez pas ce qui ne va pas, imprimez les valeurs des variables à des étapes intermédiaires, afin que vous sachiez où se situe votre problème et de quoi il s'agit.

1

Votre autre question a déjà été répondue par d'autres mais je publie ce code pour montrer qu'il n'est pas nécessaire de faire la copie phrase3 pour contenir la chaîne inversée.

#include <stdio.h> 
#include <string.h> 

int main() 
{ 

    int i, j, length, halfLength; 
    char space = ' '; 
    char phrase1[80], phrase2[80]; 

    printf("Give me the phrase: "); 
    gets(phrase1); 
    length  = strlen(phrase1); 

    for(i = 0, j = 0; i <= length; ++i) { 
    if(phrase1[i] != space) { //Makes the phrase1 without spaces 
     phrase2[j++] = phrase1[i]; 
    } 
    } 

    length  = strlen(phrase2); 
    halfLength = length/2; 

    for(i = 0, j = length - 1; i < halfLength; ++i, --j) { 
    if(phrase2[i] != phrase2[j]) { 
     printf("It's not a palindrome\n"); 
     return 0; 
    } 
    } 

    printf("It's a palindrome\n"); 
    return 0; 
} 
+0

Il est également possible de le faire en une seule boucle sans copier la chaîne du tout. Vous n'avez qu'à vérifier les espaces et ajuster les index de manière appropriée lorsque vous analysez la chaîne à chaque extrémité. –

0

C'est ce que je suis venu avec:

#include <stdio.h> 
void main() { 
char a[50],b[50]; 
int i=0,j,ele,test=0,x; 
while((a[i]=getchar())!='\n') { 
if(a[i]!=' ' && a[i]!=',') //do not read whitespaces and commas(for palindromes like "Ah, Satan sees Natasha") 
i++; 
} 
a[i]='\0'; 
ele=strlen(a); 
// Convert string to lower case (like reverse of Ava is avA and they're not equal) 
for(i=0; i<ele; i++) 
if(a[i]>='A'&&a[i]<='Z') 
a[i] = a[i]+('a'-'A'); 
x = ele-1; 
for(j=0; j<ele; j++) { 
b[j] = a[x]; 
x--; 
} 
for(i=0; i<ele; i++) 
if(a[i]==b[i]) 
test++; 
if(test==ele) 
printf("You entered a palindrome!"); 
else 
printf("That's not a palindrome!"); 
} 

Probablement pas la meilleure façon pour palindromes, mais je suis fier d'avoir fait cela sur mon propre m'a pris 1 heure :(lol

-1

Pourquoi ne pas utiliser un std::stack? Vous aurez besoin de deux boucles, chaque itération de la longueur de la chaîne d'entrée.Dans la première boucle, passez une fois la chaîne d'entrée, en poussant chaque caractère sur la pile. hors de la pile et comparez-le avec le personnage à l'index. ismatch avant la fin de la boucle, vous n'avez pas de palindrome. La bonne chose avec ceci est que vous n'avez pas à vous soucier de l'angle de caisse pair/impair. Ça va juste marcher.

(Si vous êtes si incliné, vous pouvez utiliser une pile (LIFO) et une file d'attente (FIFO) mais cela ne change pas sensiblement l'algorithme).

est ici la mise en œuvre:

bool palindrome(const char *s) 
{ 
    std::stack<char> p; // be sure to #include <stack> 

    for(int i = 0; s[i] != 0; i++) 
     p.push(s[i]); 

    for(int i = 0; s[i] != 0; i++) 
    { 
     if(p.top() != s[i]) 
      return false; // not a palindrome! 

     p.pop(); 
    }  

    return true; 
} 

espaces Skipping est laissé en exercice au lecteur;)