Палиндром - снятие гото - PullRequest
       1

Палиндром - снятие гото

2 голосов
/ 13 декабря 2010

Добрый день! Наш учитель попросил нас определить, является ли слово или серия чисел палиндромом или не использует стеки. Я уже закончил делать это. Но я хочу попрактиковаться, поэтому сейчас я пытаюсь определить, является ли предложение палиндромом или нет, удаляя пробелы и другие нерелевантные символы (Примечание: больше не является частью моей домашней работы) Мой код уже работает (надеюсь), но я нахожу это грязно. Поэтому я хочу улучшить это. Я хочу удалить функцию goto, потому что мой учитель посоветовал мне не использовать ее. Как выйти из оператора if без использования функции goto? Заранее спасибо. Также есть другие способы проверить, является ли предложение палиндромом или нет, потому что мой код сделан методом грубой силы. Мой код выглядит следующим образом: ПРИМЕЧАНИЕ (я не включил / вставил сюда структуру и функции pop и push)

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();
}

Исходя из ваших предложений. Вот мой улучшенный код:

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();
}

Ответы [ 4 ]

4 голосов
/ 13 декабря 2010

Самое простое изменение, которое вы можете сделать, это следующее:

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

Есть несколько других вещей, которые вы можете сделать, чтобы привести в порядок код (например, объединить операторы if, избавиться от isspace, поскольку !isalpha охватывает это и т. Д.)

2 голосов
/ 13 декабря 2010

Мне нравится твое отношение.

Во-первых, здесь вы пытаетесь вложить два логических утверждения, которые по сути являются одним. Вы также используете неправильные функции для определения типа символа:

если isspace(word[i]), то вы можете гарантировать, что !isalpha(word[i]). Оба утверждения всегда будут истинными или ложными одновременно, поэтому одно из них является избыточным. Что вы на самом деле делаете, это только нажимаете символы, если они буквенно-цифровые, верно? Поэтому вместо того, чтобы использовать оператор if, чтобы определить, хотите ли вы пропустить символ, вы должны делать оператор if, чтобы определить, хотите ли вы нажать символ. Я думаю, что isalnum() может быть тем, что вы хотите.

Во-вторых, вместо того, чтобы выполнять strlen (), который выполняет итерацию по строке, и использовать возвращаемое значение для итерации по строке (то есть дважды), попробуйте:

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

или даже лучше:

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

Наконец, ваш тест на палиндром может быть немного улучшен. Тестирование значения цикла после цикла работает во всех случаях, но немного уродливо. Это также не терпит дураков с радостью. В профессиональной среде многие люди, некоторые не очень добросовестные, редактируют код и используют значения цикла после цикла, что может быть рискованно. Возможно, вместо этого вызовите bool, называемый чем-то вроде «match», и инициализируйте его как true, затем выполните цикл до конца стека или «match», чтобы установить «false» и установить «match» в false, если символ в стеке не «соответствует» ожидаемое значение. Это также будет более эффективным.


Я был в процессе составления этого ответа, когда исходный вопрос, очевидно, был удален.

Если вы хотите, чтобы я опубликовал пример кода, я с удовольствием это сделаю, но я думаю, что вы могли бы узнать больше, если я этого не сделаю. Если вам нужен пример кода или вы хотите, чтобы я посмотрел на то, что вы придумали после этого ответа, не стесняйтесь.

1 голос
/ 13 декабря 2010

Я только что посмотрел на .. может быть, недоразумение:

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

   }
   i++;

}

0 голосов
/ 13 декабря 2010

Для такого короткого прыжка достаточно просто переписать, чтобы устранить проблему.

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++;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...