Палиндром на С без указателей и рекурсии - PullRequest
1 голос
/ 14 октября 2010

Я пытаюсь определить, является ли фраза палиндромом (слово, которое одинаково слева направо) или нет, но я не могу заставить его работать. Что не так? Я не могу использовать указатели или рекурсию или переменные строкового типа

#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; 
}

Ответы [ 5 ]

2 голосов
/ 14 октября 2010

Попробуйте это:

 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;

Обновление

В ответ на сообщение Преториана вот код, чтобы сделать это без копирования строки.

1 голос
/ 14 октября 2010

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

#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; 
}
1 голос
/ 14 октября 2010

Перед вторым циклом вы хотите установить j = 0. Это должно работать после этого.

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

0 голосов
/ 22 января 2013

Почему бы не использовать std::stack?Вам понадобятся два цикла, каждый из которых повторяет длину входной строки.В первом цикле один раз просмотрите строку ввода, поместив каждый символ в стек.Во втором цикле вытолкните символ из стека и сравните его с символом в индексе.Если вы получили несоответствие до окончания цикла, у вас нет палиндрома.Приятно то, что вам не нужно беспокоиться о угловом корпусе четной / нечетной длины.Это будет просто работать.

(Если вы склонны, вы можете использовать один стек (LIFO) и одну очередь (FIFO), но это существенно не изменит алгоритм).

Вотреализация:

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

Пропуск пробелов оставлен читателю в качестве упражнения;)

0 голосов
/ 22 января 2013

Вот что я придумал:

#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!");
}

Вероятно, не самый лучший способ для палиндромов, но я горжусь, что я сделал это сам, заняло у меня 1 час :( lol

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...