Problème pour compter un nombre de lettres

Schlaf Messages postés 12 Date d'inscription lundi 10 janvier 2011 Statut Membre Dernière intervention 10 janvier 2011 - 11 janv. 2009 à 17:04
Schlaf Messages postés 12 Date d'inscription lundi 10 janvier 2011 Statut Membre Dernière intervention 10 janvier 2011 - 12 janv. 2009 à 19:22
Bonjour,
alors voila je doit rédiger un script , voici l'énoncé:
(tableau a 1 dimension):Écrire le script qui permet de saisir un mot et qui permet de dire si le mot saisi est un palindrome (c'est un mot qui se lit de la même façon dans les 2 sens exemple:"ressasser","elle","radar").

Pour cela j'ai l'intention d'écrire le mot dans un tableau, de calculer la taille du mot,de calculer la lettre centrale, d'utiliser 2 "pour" : 1 qui part du début jusqu'au milieu et un autre qui part de la fin vers le milieu, puis comparer si ces lettres sont égales jusqu'au bout.
Est ce la bonne solution?
J'ai un problème ce que je ne sais pas compter la taille du mot.
Voici le début de mon script:

#include
#include <stdlib.h>
#include<CSTDIO>

int main()
{

//Déclaration des variables

const int max=20;
char tab[max];
int cpt,i,j;

//Saisie du mot

cout<<"Veuillez saisir un mot : ";
gets(tab);

//Comptage du nombre de lettres

cpt=0;
for (i=0;i<max;i=i+1)
{
  while (tab[i]!='\0')
  {
  cpt=cpt+1;
  }
}
cout<<cpt<<endl;

      system("PAUSE");
      return 0;
}

L'exécutable ne me renvoie rien après la saisie du mot. Ce n'est pas la bonne manière?
Merci

6 réponses

Neo_Fr Messages postés 653 Date d'inscription mardi 6 décembre 2005 Statut Membre Dernière intervention 10 novembre 2014 2
11 janv. 2009 à 17:49
Salut,
Essaye ca:

#include <windows.h>
#include <stdio.h>

int main(void)
{
DWORD dwLen;
LPSTR lptr;
char szTab[32];

//Saisie du mot
printf("Veuillez saisir un mot : ");
gets(szTab);

//Comptage du nombre de lettres
lptr = szTab;
while(*lptr++);
dwLen = (lptr - szTab);
printf("\n%i", dwLen);

system("PAUSE");
return 0;
}

sinon tu peux aussi utiliser strlen:
dwLen = strlen(szTab);

Neo_Fr
0
ed73 Messages postés 276 Date d'inscription lundi 8 septembre 2008 Statut Membre Dernière intervention 15 avril 2013 2
11 janv. 2009 à 18:02
Bonjour,


Il suffit d'inverser la chaine. Si la chaine inversée est égale à la chaine saisie alors c'est un palindrome. La fonction strrev inverse une chaine.

int main(void)

    char szTab[32],szTabRev[32];

    //Saisie du mot
    printf("Veuillez saisir un mot : ");
    gets(szTab); 

   strcpy(szTabRev,szTab);
   strrev(szTabRev);

   if(!strcmp(szTab,szTabRev))
      printf("C'est un palindrome\n");
   else printf("Ce n'est pas un palindrome\n");

    system("PAUSE");
    return 0;
}

facile non ?

ed73


 


 
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
11 janv. 2009 à 18:09
Beaucop plus simple strlen(), ouai.
Mais moi je ne suis pas d'accord sur l'algo.
J'ai peut-être tord mais je trouve que c'est une perte de temps que de compter la taille du mot puis exécuter 2 boucles for().
Je ferais comme ceci :
int taille=strlen(mot)-1;
bool verif=true; //on considère que le mot est un palindrome
int a=0;
while ((a++ <= taille) && (verif)) {
if (mot[a] != mot[taille-a]) verif=false;
}
Si verif = true alors le mot est un palindrome, sinon non.
On peut aller encore plus rapidement en arrêtant la boucle à la moitié du mot, mais ça change en fonctione du nombre (pair ou impair) de lettres.
Code testé et il fonctionne.

Cordialement, uaip.
0
uaip Messages postés 1466 Date d'inscription mardi 20 février 2007 Statut Membre Dernière intervention 7 février 2011
11 janv. 2009 à 18:12
Arf, le temps d'écrire et de tester, ed73 m'a devandé ^^
Si je peux faire des commentaires à vos réponses : on est en C++ et non en C donc le printf(); ...
Remarque le strlen() est du C aussi, je crois. Aurait-on tous faux ?

Cordialement, uaip.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
11 janv. 2009 à 19:35
Pas besoin de strlen() ni de recopie inversée.


Version simple, pur palindrome:
int EstPalindrome(char *psz)
{
  char *c, *d;  c d psz;
  while(*d) d++;
  d--; // SUR DERNIER CHAR
  while(c < d) {
    if(*c != *d) return 0; // NON PALINDROME
    c++;
    d--;
  }
  return 1;
}




Version ne tenant pas compte d'éventuels espaces dans les mots:
int EstPalindrome(char *psz)
{
  char *c, *d;  c d psz;
  while(*d) d++;
  d--; // SUR DERNIER CHAR
  while(c < d) {
    while(*d == 32) d--; // SAUTE ESPACES
    if(c >= d) break; // OK
    while(*c == 32) c++; // SAUTE ESPACES
    if(c >= d) break; // OK
    if(*c != *d) return 0; // NON PALINDROME
    c++;
    d--;
  }
  return 1;
}


déjà mis sur le forum plusieurs fois, il ne faut pas hésiter à chercher.

ciao...
BruNews, MVP VC++
0
Schlaf Messages postés 12 Date d'inscription lundi 10 janvier 2011 Statut Membre Dernière intervention 10 janvier 2011
12 janv. 2009 à 19:22
Merci pour vos réponses
Ça marche
0
Rejoignez-nous