Nombre d'occurrences d'une lettre dans un texte

Ca.marchera - 20 févr. 2015 à 19:37 - Dernière réponse : cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 21 mai 2018 Dernière intervention
- 27 févr. 2015 à 20:36
Bonjour,
j'aimerai écrire un programme qui analyse une chaine de caractere en indiquant le nombre de fois qu'apparait CHAQUE lettre. (je dois utiliser des pointeurs)
voici ce que j'ai fais mais ça marche pas et je but dessus si quelqu'un peut m'éclairer!! Merci!

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

int main()
{

  int ABC[26];
  int ch[50];
  int*PABC;
  char*Pch;

  printf("donnez une chaine ch");
  scanf("%s",ch);

  for(PABC=ABC;PABC<26;PABC++)
  {

      *PABC==0;
  }

  for(PABC=ABC;PABC<ABC+26;PABC++)
   {
      for(Pch=ch;*Pch=strlen(ch)+ch;Pch++)
      {
        int m=65;
        int n=97;
        if((*Pch==m)||(*Pch==n))
          *PABC++;
            m++;
            n++;
      }
   }

   for(PABC=ABC;PABC<ABC+26;PABC++)
   {
      if(*PABC)
        printf("%d \t fois la lettre %c \n ",*PABC, 'A'+(PABC-ABC));
   }


    return 0;
}


Afficher la suite 

Votre réponse

7 réponses

cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 21 mai 2018 Dernière intervention - 21 févr. 2015 à 16:40
0
Utile
Bonjour.

Il faut vraiment faire un effort sur le nommage des variables ! Ce n'est pas très bien nommé, et pour toi, et pour nous, ça rend les choses difficiles.
D'après ce que j'ai lu de ce que tu proposes, je pense cerner ton problème. Avant de résoudre cet exercice (qui est facile), je te propose un exercice intermédiaire. Si tu le réussi, alors cet exercice te paraîtra bien plus simple.

En fait, tu as du mal à comprendre la notion de pointeur et comment elle est liée au tableau. Il faut savoir qu'en C, un tableau et un pointeur c'est la même chose.
En effet:
- tab[0], c'est la même chose que *(tab + 0) ou *tab
- tab[1], c'est la même chose que *(tab + 1) ou *(++tab)
- tab[2], c'est la même chose que *(tab + 2) ou *(++ ++ tab)
- etc...

Imagine la chose suivante:
- char* tab = "hello world";

Le caractère 'h' est dans tab[0]. Le caractère 'e' est dans tab[1], etc...
Mais on peut aussi l'écrire comme ceci:
- 'h' est accessible via *tab;
- 'e' est accessible via ++tab; puis *tab;
- 'l' est accessible via ++tab; puis ++tab; puis *tab;
- etc...

Enfin, une chaîne de caractères fini forcément par le caractère '\0'.

Essaie de réaliser la chose suivante:
- On te donne une chaîne de caractère. On ne te donne pas sa taille, et tu n'as pas le droit d'utiliser strlen. Peux-tu m'afficher chacun des caractères de la chaîne ?
(Ca sera la première partie de l'exercice qu'on te demande).

Voici le squelette d'application à compléter:
#include <stdio.h>

void show(const char* str)
{
  // Affichez ici une lettre par ligne
}

int main()
{
  char ch[50] = {0};

  printf("donnez une chaine ch");
  scanf("%s",ch);

  show(ch);

   return 0;
}


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Ca.marchera - 25 févr. 2015 à 16:45
0
Utile
Bonsoir
c mon essai :( mais ... .. sans résultat

#include <stdio.h>

char ch[50] = {0};

void show(const char* str)
{
  // Affichez ici une lettre par ligne

  for(str=ch;*str != '\0';str++)
  {
      printf("% \n ",*str);
  }
}

int main()
{


  printf("donnez une chaine ch\n");
  scanf("%s",ch);

  show(ch);

   return 0;
}

Commenter la réponse de Ca.marchera
cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 21 mai 2018 Dernière intervention - Modifié par cptpingu le 25/02/2015 à 17:00
0
Utile
Je ne vois pas l'intérêt de la variable globale (variable globale == problème de design dans 99.9% des cas).
Une chaîne de caractères contient... des caractères. Il faut un "%c" pour un afficher un caractère.

Voici le code corrigé (utilisation d'une boucle while au lieu de for, mais une boucle for aurait pu fonctionner aussi).
#include <stdio.h>

void show(const char* str)
{
  while (*str != '\0')
  {
      printf("%c \n ", *str);
      ++str;
  }
}

int main()
{
  char ch[50] = {0};

  printf("donnez une chaine ch\n");
  scanf("%s",ch);

  show(ch);

  return 0;
}


Maintenant que tu sais parcourir une chaîne, il faut se "souvenir" de chacun des caractères que l'on a "vu". Donc, on va créer un tableau de 26 cases (il y a 26 lettres dans l'alphabet), et chaque case va représenter le nombre de fois que l'on a rencontré une lettre.
Le tableau nb_letters possède 26 cases. La case 0, est le nombre de fois que l'on a vu le caractère 'a', la case 1 est le nombre de fois que l'on a vu le caractère 'b', etc...

Voici le squelette de l'application:

#include <stdio.h>

void count(const char* str, int nb_letters[26])
{
  while (*str != '\0')
  {
     // remplir nb_letters correctement ici.
      ++str;
  }
}

void print(int nb_letters[26])
{
  char c = 0;
  for (c = 'a'; c <= 'z'; ++c)
    printf("%c => %i\n", c, nb_letters[c - 'a']);
// c - 'a'permet de convertir un code ascii en numéro. Exemple: 'a' - 'a' => 0, 'b' - 'a' => 1, etc...
}

int main()
{
  char ch[50] = {0};
  int nb_letters[26] = {0};

  printf("donnez une chaine ch\n");
  scanf("%s",ch);

  count(ch, nb_letters);
  print(nb_letters);

  return 0;
}


__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Ca.marchera - 25 févr. 2015 à 21:09
0
Utile
Bonsoir
j'ai essayé mais aucune résultat :/ , sachant que l'exercice me demande d'utiliser 2 pointeurs l'un pour la chaine et l'autre pour le tableau
en + dans la fonction Print je pense que vous n'avez pas pris en considération les lettres majuscules !

Merci de répondre
#include <stdio.h>
#include <string.h>

void count(const char* str, int nb_letters[26])
{ int *PABC; //pointeur sur le tableau nb_letters
  while (*str != '\0')
  {
     // remplir nb_letters correctement ici.

     for(PABC=nb_letters;PABC<nb_letters+26;++PABC)

         if((*str==('A'+(PABC-nb_letters)))||(*str==('a'+(PABC-nb_letters))))

            *PABC++;

      ++str;
  }
}

void print(int nb_letters[26])
{
  char c = 0;
  for (c = 'a'; c <= 'z'; ++c)
    printf("%c => %i\n", c, nb_letters[c - 'a']);
// c - 'a'permet de convertir un code ascii en numéro. Exemple: 'a' - 'a' => 0, 'b' - 'a' => 1, etc...é
}

int main()
{
  char ch[50] = {0};
  int nb_letters[26] = {0};

  printf("donnez une chaine ch\n");
  scanf("%s",ch);

  count(ch, nb_letters);
  print(nb_letters);

  return 0;
}


Commenter la réponse de Ca.marchera
cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 21 mai 2018 Dernière intervention - 25 févr. 2015 à 22:30
0
Utile

dans la fonction Print je pense que vous n'avez pas pris en considération les lettres majuscules !

Ce n'est pas un oubli. D'après ce que tu as expliqué, tu comptes les lettres 'A' et 'a' comme étant un 'a' (présence d'un tableau de 26 lettres et non 52 lettres dans ton message initial). C'est donc à toi de, dans la fonction count de bien considérer un 'A' et 'a' comme étant la même chose !

Tu n'as pas besoin d'un int* PABC. Si tu veux vraiment utiliser le tableau nb_letters comme un pointeur, alors écris le comme tel (je rappelle qu'un tableau et un pointeur c'est la même chose).


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

void count(const char* str, int* nb_letters)
{
  while (*str != '\0')
  {
     // remplir nb_letters correctement ici.
     // Exemple accès à nb_letters:
     // Incrément du nombre de 'a' => ++*(nb_letters + 0); (ou *(nb_letters + 0) += 1;)
     // Incrément du nombre de 'b' => ++*(nb_letters + 1); (ou *(nb_letters + 1) += 1;)
     if (*str == 'A' || *str == 'a')
       ; // A compléter
     // A compléter
      ++str;
  }
}

void print(int nb_letters[26])
{
  char c = 0;
  for (c = 'a'; c <= 'z'; ++c)
    printf("%c => %i\n", c, nb_letters[c - 'a']);
// c - 'a'permet de convertir un code ascii en numéro. Exemple: 'a' - 'a' => 0, 'b' - 'a' => 1, etc...é
}

int main()
{
  char ch[50] = {0};
  int nb_letters[26] = {0};

  printf("donnez une chaine ch\n");
  scanf("%s",ch);

  count(ch, nb_letters);
  print(nb_letters);

  return 0;
}



__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu
Ca.marchera 12 Messages postés jeudi 22 janvier 2015Date d'inscription 22 juillet 2015 Dernière intervention - 27 févr. 2015 à 20:28
0
Utile
bonsoir
l'énoncé de l'exercice
Ecrire un programme qui lit une chaîne de caractères CH au clavier et qui compte les
occurrences des lettres de l'alphabet en ne distinguant pas les majuscules et les minuscules. Utiliser un tableau ABC de dimension 26 pour mémoriser le résultat et un pointeur PCH pour parcourir la chaîne CH et un pointeur PABC pour parcourir ABC. Afficher seulement le nombre des lettres qui apparaissent au mois une fois dans le texte.
Exemple:
Entrez une ligne de texte (max. 100 caractères) : Jeanne
La chaîne "Jeanne" contient :
1 fois la lettre 'A'
2 fois la lettre 'E'
1 fois la lettre 'J'
3 fois la lettre 'N'

on m'a demander d utiliser PABC :/
Commenter la réponse de Ca.marchera
cptpingu 3788 Messages postés dimanche 12 décembre 2004Date d'inscriptionModérateurStatut 21 mai 2018 Dernière intervention - Modifié par cptpingu le 27/02/2015 à 20:36
0
Utile
Fais l'exercice comme je te l'ai mis. Tu renommeras ensuite les variables si c'est vraiment nécessaire. Si tu as compris l'exercice, tu n'auras aucun mal à renommer les variables.

__________________________________________________________________________________________________

Améliorez votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Commenter la réponse de cptpingu

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.