HELP !!!! Algorithme de recherche d'occurence dans une chaine

Résolu
cs_ratp
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007
- 26 juil. 2005 à 09:33
vecchio56
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
- 26 juil. 2005 à 21:19
hello,

je souhaiterai créer une fonction en C ANSI qui permet de rechercher et
d'afficher le nombre d'occurences dans une chaine jusqu'as '\0' .

j'ai besoin d'aide svp je suis debutant en langage C et je voudrais avancer.



merci pour tout ce qui souhaite m'aider.

RATP
A voir également:

30 réponses

nicooooo1
Messages postés
58
Date d'inscription
mercredi 2 février 2005
Statut
Membre
Dernière intervention
4 février 2012

26 juil. 2005 à 09:40
int nbrOccurences( char * chaine, char caractere )

{

int compteur = 0;

for( int i = 0; i < strlen( chaine); i++ )

{

if( chaine[i] == caractere ) compteur++;

}

return compteur;

}
3
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
26 juil. 2005 à 10:24
mais non, ainsi tu fais 2 parcours de la chaine (strlen en fait deja 1).

int nbrOccurences(char *chaine, char caractere)
{
int compteur = 0;
char *c = chaine;
while(*c) {
if(*c == caractere) compteur++;
c++;
}
return compteur;
}

ciao...
BruNews, MVP VC++
3
cs_ratp
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

26 juil. 2005 à 14:13
Merci à tous le monde j'ai enfin réussi

voici mon code



#include <stdio.h>





int compteur[256];



void nbrOccurences(char *chaine, int *compteur)

{

char *c = chaine;

while (*c) compteur[*c++ -1]++;

}





void main(void)

{

char chaine[50];

int i;



printf("Veuillez saisir une phrase :\n");

scanf("%s",&chaine);



for(i=0;i<256;i++)

{

compteur[i];

nbrOccurences(chaine,compteur);

printf("%0X\n",compteur[i]);

}





}

RATP
3
vecchio56
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Membre
Dernière intervention
22 août 2010
11
26 juil. 2005 à 21:19
void nbrOccurences(char *chaine, int *compteur)
{
while (*chaine) compteur[*chaine++]++;
}

irait aussi bien, non?

printf("%c\t",i);
printf("%d\t",compteur[i]);
->printf("%d\t%d\t", i, compteur[i]);
1

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

Posez votre question
DeAtHCrAsH
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013

26 juil. 2005 à 10:28
Tonton BriNious n'en finira jamais avec ses optimisations ^_^

D'ailleurs ca me rappelle les tests de vitesse qu'on avait fait enre ton algo est le mien....
Pour les curieux BruNews avait gagné (rien d'exceptionnel me direz vous)!

Ca serait bien de faire des petits concours de code de temps en temps... Mais sans toi BruNews,
faudrait au moins qu'on est une chance ;-)

Shell
0
cosmobob
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
26 juil. 2005 à 10:39
salut,

quand on fait

for (int i = 0; i < strlen(chaine); i++) {... }



strlen est appelé strlen(chaine) fois il me semble !

donc la c'est pas de la petite optim', c'est passer d'un truc en O(n²) a un truc en O(n)



a+
0
cs_ratp
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

26 juil. 2005 à 10:40
Merci à tous.

Mais comment intégré cette fonction dans le code ci dessous :



#include <string.h>

#include <stdio.h>



int nbrOccurences(char *chaine, char caractere)

{

int compteur = 0;

char *c = chaine;

while(*c) {

if(*c == caractere) compteur++;

c++;

}

return compteur;

}



void main(void)

{

char
alpha[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

char chaine[50];



printf("Veuillez saisir une phrase:\n");

scanf("%s",&chaine);



nbrOccurences(chaine,alpha);





}



RATP
0
BunoCS
Messages postés
15266
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 juin 2022
103
26 juil. 2005 à 10:47
#include <string.h>

#include <stdio.h>



int nbrOccurences(char *chaine, char caractere)

{

int compteur = 0;

char *c = chaine;

while(*c) {

if(*c == caractere) compteur++;

c++;

}

return compteur;

}



void main(void)

{

char
alpha[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

int compteur[26];

char chaine[50];



printf("Veuillez saisir une phrase:\n");

scanf("%s",&chaine);



for (int i=0; i<26; i++)

compteur[i] = nbrOccurences(chaine,alpha[i]);



/* Ici, dans compteur, tu as le nombre d'occurences de chaque lettre */

}

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
26 juil. 2005 à 11:28
Plutot que 26 appels a une fonction, on pourrait faire encore mieux :

int compteur[26];

void nbrOccurences(char *chaine, int *compteur)
{
char *c = chaine;
while (*c) compteur[*c++ - 'a']++;
}

Et voila, tu as maintenant un tableau qui contient le nombre d'occurences de chacune des lettres.

+2(p - n)
0
cs_ratp
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

26 juil. 2005 à 11:33
Merci de cette reponse mais je ne comprend algorithme que tu utilise

RATP
0
cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
26 juil. 2005 à 11:35
Bah en fait, tu cherches le nombre d'occurences de chacune des lettres de l'alphabet (minuscule) donc en faisant *c - 'a', tu obtiendras un nombre entre 0 et 26, ce qui permet de stocker ce nombre dans un tableau de 26 int.

+2(p - n)
0
cs_ratp
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

26 juil. 2005 à 11:39
ok, merci.

j'ai une autre question comment doit on faire pour lui dire de chercher toute les occurences jusqu'a ateindre EOF ?

RATP
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
26 juil. 2005 à 11:45
et s'il n'y a pas que des 'a' to 'z' dans string parcourue ???

ciao...
BruNews, MVP VC++
0
cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
26 juil. 2005 à 11:48
J'ai mis ca parce que j'ai vu qu'il declarait un tableau contenant toutes les lettres de l'alphabet en minuscule, sinon c'est autre chose.

+2(p - n)
0
cs_ratp
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

26 juil. 2005 à 11:49
Comment faire alors stp ?

RATP
0
BruNews
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
26 juil. 2005 à 11:59
tableau de 255 int si tu bosses en ANSI.

ciao...
BruNews, MVP VC++
0
DeAtHCrAsH
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013

26 juil. 2005 à 12:13
Si tu te demandes pourquoi 255 c'est simplement parceque les caracteres sont codées jusqu'à 255 (FF en hexadécimal).

Shell
0
cs_ratp
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

26 juil. 2005 à 12:31
je suis désolé mais je ne vois pas comment je doit faire pour intérgré 255 int dans mon programme.



#include<string.h>

#include <stdio.h>







int nbrOccurences(char *chaine, char caractere)

{



int compteur = 0;



char *c = chaine;



while(*c) {



if(*c == caractere) compteur++;



c++;



}



return compteur;



}





void main(void)



{



//char
alpha[26]={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};

char alpha[26]={"abcdefghijklmnopqrstuvwxyz"};

int compteur[26];



char chaine[50];





unsigned int i;



printf("Veuillez saisir une phrase:\n");

scanf("%s",&chaine);



for (i=0; i<26; i++)

{

compteur[i] = nbrOccurences(chaine,alpha[i]);



printf("%d",compteur[i]);

printf("%c\n",alpha[i]);



}

}

RATP
0
cs_AlexMAN
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
26 juil. 2005 à 12:35
Tu reprends mon exemple :

int compteur[256];

void nbrOccurences(char *chaine, int *compteur)
{
char *c = chaine;
while (*c) compteur[*c++]++;
}

+2(p - n)
0
cs_ratp
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

26 juil. 2005 à 12:44
Merci, mais comment adapter ton exemple dans mon programme .

je ne sais pas comment adapter ton exemple dans mon code.

encore une fois merci de ton aide
RATP
0