Problème pour compter un nombre de lettres

Signaler
Messages postés
12
Date d'inscription
lundi 10 janvier 2011
Statut
Membre
Dernière intervention
10 janvier 2011
-
Messages postés
12
Date d'inscription
lundi 10 janvier 2011
Statut
Membre
Dernière intervention
10 janvier 2011
-
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

Messages postés
653
Date d'inscription
mardi 6 décembre 2005
Statut
Membre
Dernière intervention
10 novembre 2014
2
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
Messages postés
276
Date d'inscription
lundi 8 septembre 2008
Statut
Membre
Dernière intervention
15 avril 2013
2
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


 


 
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011

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.
Messages postés
1466
Date d'inscription
mardi 20 février 2007
Statut
Membre
Dernière intervention
7 février 2011

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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
12
Date d'inscription
lundi 10 janvier 2011
Statut
Membre
Dernière intervention
10 janvier 2011

Merci pour vos réponses
Ça marche