Problème pour compter un nombre de lettres

Schlaf 12 Messages postés lundi 10 janvier 2011Date d'inscription 10 janvier 2011 Dernière intervention - 11 janv. 2009 à 17:04 - Dernière réponse : Schlaf 12 Messages postés lundi 10 janvier 2011Date d'inscription 10 janvier 2011 Dernière intervention
- 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
Afficher la suite 

6 réponses

Répondre au sujet
Neo_Fr 653 Messages postés mardi 6 décembre 2005Date d'inscription 10 novembre 2014 Dernière intervention - 11 janv. 2009 à 17:49
0
Utile
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
Commenter la réponse de Neo_Fr
ed73 276 Messages postés lundi 8 septembre 2008Date d'inscription 15 avril 2013 Dernière intervention - 11 janv. 2009 à 18:02
0
Utile
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


 


 
Commenter la réponse de ed73
uaip 1473 Messages postés mardi 20 février 2007Date d'inscription 7 février 2011 Dernière intervention - 11 janv. 2009 à 18:09
0
Utile
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.
Commenter la réponse de uaip
uaip 1473 Messages postés mardi 20 février 2007Date d'inscription 7 février 2011 Dernière intervention - 11 janv. 2009 à 18:12
0
Utile
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.
Commenter la réponse de uaip
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 11 janv. 2009 à 19:35
0
Utile
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++
Commenter la réponse de BruNews
Schlaf 12 Messages postés lundi 10 janvier 2011Date d'inscription 10 janvier 2011 Dernière intervention - 12 janv. 2009 à 19:22
0
Utile
Merci pour vos réponses
Ça marche
Commenter la réponse de Schlaf

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.