Kłopot z pętlą w zadaniu o Palindromach

0

Witam,

Zadanie polega na sprawdzeniu czy dane zdanie jest palindromem, składa się z 3 podpunktów:

  1. Przekształcenie na małe litery
  2. Usunięcie spacji,przecinków itp
  3. Sprawdzenie czy zdanie jest palindromem

Mam problem z podpunktem 3, za pomocą 2 pętl for sprawdzam pierwsza litere z ostatnia, druga z przedostatnia itp. Wiem że sprawdzi 2 razy tą samą pozycję, ale mimo to powinno działać, chyba że ja nie za bardzo to rozumiem...

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

int main()
{

char s[] = "Zakopane na pokaz", b[255]={0};
int d, i,j=0,a=0;
printf("%s\n",s);
d = strlen(s);
for (i=0; i<d; i++)
	{
		if (s[i]>='A' && s[i]<='Z')
		s[i]=s[i]+32;
	}
		printf("%s\n",s);
for (i=0; i<d; i++)
	{
		if (s[i]>='a' && s[i]<='z')
		b[j++]=s[i];
	}
		printf("%s\n",b);
for (i=0; i<d; i++)
    for (a=d-1; a>=0; a--)
	{
    	if(s[i]!=s[a])
		{
    	printf("To nie jest palindrom");
    	return 0;
		}
	}
printf("To jest palindrom");
}
2

Zastanów się. Tymi pętlami porównujesz
0 z d - 1
0 z d - 2
0 z d - 3
itd...
W tym wypadku wykryje palindrom tylko wtedy, gdy wszystkie znaki będą jednakowe.

EDIT:
poza tym analizujesz ciąg bez usuniętych przecinków i spacji. Nazwij zmienne normalnie - będzie prościej.

1

Czasami wykonanie wszystkich punktów na raz bardziej się opłaca:

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

int palindrom(const char s[])
  {
   static const char itp[]=" .,:?!";
   int p=0,k;
   k=strlen(s)-1;
   while(p<k)
     {
      if(strchr(itp,s[p])) ++p;
      else if(strchr(itp,s[k])) --k;
      else if(tolower(s[p++])!=tolower(s[k--])) return 0;
     }
   return 1;
  }

int main()
  {
   char s[]="Zakopane na pokaz";
   printf("\"%s\" - %s palindromem\n",s,palindrom(s)?"JEST":"NIE JEST");
   return 0;
  }

http://ideone.com/qDWbOR

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

int main()
{

char s[] = "Zakopane na pokaz", b[255]={0}; 
int d, i,j=0,a=0,c=1;                       
printf("%s\n",s);
d = strlen(s);
for (i=0; i<d; i++)
	{
		if (s[i]>='A' && s[i]<='Z')
		s[i]=s[i]+32;
	}
		printf("%s\n",s);
for (i=0; i<d; i++)
	{
		if (s[i]>='a' && s[i]<='z')
		b[j++]=s[i];
	}
		printf("%s\n",b);
for (i=0; i<j; i++)
{
	if (b[i]!=(b[i+j-c]))
	{
		printf("To nie jest palindrom\n");
		return 0;
		
	}
	c=c+2;
}
printf("To jest palindrom");
}

Dzięki za rady, jakoś wczoraj jak to pisałem to nie myślałem

Chyba jest ok teraz?

0

Wywal na amen c i zastąp: b[i+j-c] na b[j-i-1].

0

Ok, dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1