Ca.marchera
-
Modifié par cptpingu le 25/02/2015 à 22:54
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
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;
}
A voir également:
Nombre d'occurence algorithme
Algorithme nombre d'occurence dans une chaine - Meilleures réponses
Fonction occurrence algorithme - Meilleures réponses
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 21 févr. 2015 à 16:40
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;
}
Ca.marchera
Messages postés12Date d'inscriptionjeudi 22 janvier 2015StatutMembreDernière intervention22 juillet 20151 27 févr. 2015 à 20:28
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'
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).
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;
}
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;
}
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 25 févr. 2015 à 22:30
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;
}
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.