Question

Bonjour! Notre professeur nous a besoin pour déterminer si un mot ou une série de numéro est un palindrome ou non en utilisant des piles. Je l'ai déjà fini de faire ça. Mais je veux pratiquer davantage en ce moment je suis en train de déterminer si une phrase est un palindrome ou non par la suppression des espaces blancs et d'autres caractères non pertinents (Note: Ne fait pas partie de mes devoirs plus) Mon code fonctionne déjà (je l'espère), mais je trouve il en désordre. Donc, je veux l'améliorer. Je veux supprimer la fonction goto parce que mon professeur m'a conseillé de ne pas l'utiliser. Comment puis-je sortir de l'instruction if w / o en utilisant la fonction goto? Merci d'avance. Aussi y at-il d'autres façons de le faire vérifier si une phrase est un palindrome ou non parce que mon code est fait dans une méthode de force brute. Mon code est le suivant: NOTE (je ne comprend pas / collé le struct et la fonction pop et pousser ici)

int main(){
   char word[11];
   char temp[11];
   char value;
   int i=0, x=0, n=0, length=0; 
   Stack*head = NULL;
   printf("Please type the word: ");
   gets(word);
   length = strlen(word);
   while(i<length){
       if(isspace(word[i]) || !isalpha(word[i]))  {
           if(isdigit(word[i])) goto NEXT;  // i used the goto function here
           i++; 
           continue;
       }
       NEXT:
       temp[n]=word[i];
       push(&head, word[i]);
       i++;
       n++;
   }
   temp[n]='\0';
   while(x<n){
       value = pop(&head);         
       if (value==temp[x]){ 
           x++; 
           continue;
       }
       break;
   }    
   if(x==n) printf("Yehey! It is a palindrome.");
   else printf("Sorry, It is not a palindrome.");
   getch();
}

Sur la base de vos suggestions. Voici mon code amélioré:

int main(){
   char word[11];
   char temp[11];
   int i=0, n=0; 
   int flag = 1;
   Stack*head = NULL;
   printf("Please type the word: ");
   fgets(word, 11, stdin);
   for(i = 0; word[i]!='\0' ; i++){
       if(isalnum(word[i])) {
           temp[n]=word[i];
           push(&head, word[i]);
           n++;
       }
   }
   temp[n]='\0';
   for(i=0; temp[i]!='\0'; i++){
       if (pop(&head)!=temp[i]){ 
          flag = 0;
          break;
       }
   }    
   if (flag==1) printf("Yehey! It is a palindrome.");
   else printf("Sorry, It is not a palindrome.");
   getch();
}
Était-ce utile?

La solution

Je aime votre attitude.

Tout d'abord, ce que vous essayez de faire ici est nid deux états logiques qui sont essentiellement un. Vous utilisez également les mauvaises fonctions pour déterminer le type de caractères:

si isspace(word[i]) vous pouvez alors garantir que !isalpha(word[i]). Les deux déclarations seront toujours vraies ou fausses en même temps si l'un d'eux est redondant. Ce que vous faites est vraiment seulement pousser les caractères alphanumériques si le sont, non? Ainsi, plutôt que d'avoir une instruction if pour déterminer si vous voulez sauter un personnage que vous devez être faire une instruction if pour déterminer si vous voulez pousser le personnage. Je pense que isalnum() pourrait être ce que vous voulez.

En second lieu, plutôt que de faire strlen () qui effectue une itération sur la chaîne et en utilisant la valeur de retour à itérer sur la chaîne (qui fait deux fois) essayer:

while('\0' != word[i])

ou mieux encore:

for(i = 0; '\0' != word[i]; i++)

Enfin, le test pour un palindrome pourrait être neatened un peu. Test d'une valeur de boucle après la boucle fonctionne dans tous les cas, mais est un peu laid. Elle ne souffre pas des imbéciles heureux. Dans un environnement professionnel, vous obtenez beaucoup de gens, certains pas si consciencieux, modifier le code, et en utilisant des valeurs de boucle après une boucle peut être risqué. Peut-être à la place ont un bool appelé quelque chose comme « match » « match » et initialisez à vrai, boucle jusqu'à la fin de la pile ou « match » tourne faux et la valeur false si le caractère de la pile ne « match » de la valeur attendue. Ce sera également plus efficace.


J'étais au milieu de composer cette réponse quand la question initiale apparemment a été supprimé.

Si vous me voulez poster un exemple de code, je suis heureux de le faire, mais je pense que vous pourriez en apprendre davantage si je ne le fais pas. Si vous voulez un exemple de code, ou me voulez jeter un oeil à ce que vous venez avec après cette réponse, ne hésitez pas.

Autres conseils

Le changement le plus simple que vous pouvez faire est le suivant:

   ...
   if(isspace(word[i]) || !isalpha(word[i]))  {
       if(!isdigit(word[i])) {
           i++; 
           continue;
        }
   }
   temp[n]=word[i];
   ...

Il y a quelques autres choses que vous pouvez faire pour ranger le code (par exemple combiner les déclarations de if, se débarrasser de la isspace depuis que couvre !isalpha et ainsi de suite).

Je viens jeta un regard over..might être malentendu:

while(i<length){
   if(isalnum(word[i]))  {
       temp[n]=word[i];
       push(&head, word[i]);
       n++;

   }
   i++;

}

Pour un tel saut court, il est trivial de ré-écriture pour éliminer le problème.

while(i<length){
   if(isspace(word[i]) || !isalpha(word[i]))  {
       if(!isdigit(word[i])) {
           i++;
           continue;
       }
   }
   temp[n]=word[i];
   push(&head, word[i]);
   i++;
   n++;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top