HELP !!!! Algorithme de recherche d'occurence dans une chaine [Résolu]

Messages postés
23
Date d'inscription
vendredi 20 février 2004
Dernière intervention
1 octobre 2007
- - Dernière réponse :  cs_fanti - 31 mars 2008 à 01:16
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
Afficher la suite 

Votre réponse

20/31 réponses

Meilleure réponse
Messages postés
58
Date d'inscription
mercredi 2 février 2005
Dernière intervention
4 février 2012
3
Merci
int nbrOccurences( char * chaine, char caractere )

{

int compteur = 0;

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

{

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

}

return compteur;

}

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de nicooooo1
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
3
Merci
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++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de BruNews
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Dernière intervention
1 octobre 2007
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de cs_ratp
Messages postés
6539
Date d'inscription
lundi 16 décembre 2002
Dernière intervention
22 août 2010
1
Merci
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]);
Commenter la réponse de vecchio56
Messages postés
2674
Date d'inscription
vendredi 25 janvier 2002
Dernière intervention
6 février 2013
0
Merci
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
Commenter la réponse de DeAtHCrAsH
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Dernière intervention
27 janvier 2009
0
Merci
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+
Commenter la réponse de cosmobob
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Dernière intervention
1 octobre 2007
0
Merci
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
Commenter la réponse de cs_ratp
Messages postés
14289
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
14 décembre 2018
0
Merci
#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...
Commenter la réponse de BunoCS
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Dernière intervention
24 mai 2009
0
Merci
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)
Commenter la réponse de cs_AlexMAN
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Dernière intervention
1 octobre 2007
0
Merci
Merci de cette reponse mais je ne comprend algorithme que tu utilise

RATP
Commenter la réponse de cs_ratp
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Dernière intervention
24 mai 2009
0
Merci
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)
Commenter la réponse de cs_AlexMAN
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Dernière intervention
1 octobre 2007
0
Merci
ok, merci.

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

RATP
Commenter la réponse de cs_ratp
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
et s'il n'y a pas que des 'a' to 'z' dans string parcourue ???

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Dernière intervention
24 mai 2009
0
Merci
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)
Commenter la réponse de cs_AlexMAN
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Dernière intervention
1 octobre 2007
0
Merci
Comment faire alors stp ?

RATP
Commenter la réponse de cs_ratp
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
tableau de 255 int si tu bosses en ANSI.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
Messages postés
2674
Date d'inscription
vendredi 25 janvier 2002
Dernière intervention
6 février 2013
0
Merci
Si tu te demandes pourquoi 255 c'est simplement parceque les caracteres sont codées jusqu'à 255 (FF en hexadécimal).

Shell
Commenter la réponse de DeAtHCrAsH
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Dernière intervention
1 octobre 2007
0
Merci
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
Commenter la réponse de cs_ratp
Messages postés
1537
Date d'inscription
samedi 21 décembre 2002
Dernière intervention
24 mai 2009
0
Merci
Tu reprends mon exemple :

int compteur[256];

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

+2(p - n)
Commenter la réponse de cs_AlexMAN
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Dernière intervention
1 octobre 2007
0
Merci
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
Commenter la réponse de cs_ratp

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.