Aller au contenu

mot palindrome


Echap

Messages recommandés

Salut

Je n'ai pas arrivé à résoudre un problème de vérification d'une chaine de caractères. Le problème consiste à vérifier si un mot est palindrome ou non sans l'utilisation de la bib <string.h>

J'ai tapé le code pas mal de fois ,execution "oui",erreur"0",warning"0" ,mais sa marche pas avec moi pourriez vous m'aidez svp

exemple d'un mot palindrome : l

i==0,j==5 l

aval toujours ch == ch[j]

mon code:

#include<stdio.h>
#include<conio.h>
int main()
{	int n;
char ch[n];
int i,m,k,p,j;
m=1;
puts("donne une chaine de caractaire\n");
gets(ch);
printf("la chaine tape est :%s\n",ch);

 for (j=0;ch[j];j++)  //compte le nb de caracteres "comme laal"
  ;
printf("\nnombres de caractéres est:%d",j);
p= j%2;
k=j/2;
if (p==0) // le cas d'un mot don les caracteres multiple de 2
{
for(i=1;i==k,j==k+1;i++,j--)
	 {   
		 if(ch[j]==ch[i] )
			{
				m=0;
			}
		 else
		  {
				break;
				puts("le chainne ne pas palendrome");
		   }
	}
  }
else
{
	for(i=1;i==k,j==k+2;i++,j--) // le cas  le de caracteres d'un mot impaire "comme laval"
	{
	  if(ch[j]==ch[i])
		   {
				  m=0;
			}	  
	  else
			{
				 break;
				 puts("le chainne ne pas palendrome");
			 }
	  }
}
if(m==0){	printf("lachaine est palindrome",j);}
getch();
return(0);
}

merci

Lien vers le commentaire
Partager sur d’autres sites

un peu tiré par les cheveux ton algo

int m, i, len;

for (len=0;ch[len];len++);

--len;
m = 1;
for( i = 0; (i < len-i) && m; ++i)
{
if( ch[i] != ch[len-i] )
	m = 0;
}

if( m )
{
// palindrome
}
else
{
// pas palindrome
}

pas testé, mais ça ressemble plus à ça normalement l'algo (qui marche bien)

Lien vers le commentaire
Partager sur d’autres sites

Déjà pour commencer, pas besoin de tester que le nombre de lettres soit pair ou pas.

Dans tes exemples : "LAAL" et "LAVAL", il te suffit de comparer la première lettre avec la dernière puis la deuxième avec l'avant dernière. Il suffit de s'arrêter à k/2.

Et pour faire plus propre, tu pourrais faire une fonction is_palindrome qui retourne 1 si c'est un palindrome et 0 sinon (en plus ça sera plus rapide puisque tu n'aura pas besoin de parcourir ta chaîne tout le temps).

Et puis tes for sont bien trop compliqués, il faut que tu simplifies au maximum, sinon tu vas te perdre.

Lien vers le commentaire
Partager sur d’autres sites

  • 2 semaines après...

Bon strlen est dans <string.h> alors il a fallu le refaire 8)

int my_strlen(char *str)
{
int count = 0;

if (*str)
	while (*str && ++str && ++count);
return (count);
}

int	is_palindrome(char *str)
{
int count = 0;
int len = my_strlen(str);

while (count != len/2)
{
	if (str[count] == str[len - count])
		++count;
	else
		return(-1);
}
return (1);
}

Le code est simple, je n'ai pas commente, n'hesite pas a poser des questions :)

Lien vers le commentaire
Partager sur d’autres sites

Bon strlen est dans <string.h> alors il a fallu le refaire :roule:

int my_strlen(char *str)
{
int count = 0;

if (*str)
	while (*str && ++str && ++count);
return (count);
}

int	is_palindrome(char *str)
{
int count = 0;
int len = my_strlen(str);

while (count != len/2)
{
	if (str[count] == str[len - count])
		++count;
	else
		return(-1);
}
return (1);
}

Le code est simple, je n'ai pas commente, n'hesite pas a poser des questions :)

IONIS en force ?

Echap:

quand ton algo (pour une chose aussi simple) tourne en usine à gaz, c'est que t'es passé à côté de quelque chose... :bravo:

bonne continuation

Lien vers le commentaire
Partager sur d’autres sites

Usine a gaz pour le délire,

pas testé, mais a mon avis c'est très loin de marcher.

char	is_palindrome(char *word)
{
char	*str1;
char	*str2;
int		add;
int		i;
int		j;
int		len;

add = 1;
for (len = 0; word[len]; len++);
if (len % 2)
	add += 1; 
str1 = malloc(sizeof(char) * len + add);
str2 = malloc(sizeof(char) * len + add);

for (j = 0, i = len; word[i] && word[j] && 
	(((len % 2) ? (j < len / 2) : (j <= len / 2)) && ((len % 2) ? (i > len / 2) : (i >= len / 2))); 
	 str1[j] = word[j], str2[i] = word[i], i--, j++)
for (i = 0; str1[i]; i++)
	if (str1[i] != str2[i])
		break;
if (i == len)
	return ('y');
return ('n');
}

int	main(int ac, char **av)
{
char c;
if (ac >= 2)
	{
			  c = is_palindrome(av[1])
			  write(1, &c, 1);
			}
return (0);
}

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...