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

Signaler
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007
-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
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

30 réponses

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

int nbrOccurences( char * chaine, char caractere )

{

int compteur = 0;

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

{

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

}

return compteur;

}
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23
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++
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

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
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
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]);
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
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
Messages postés
706
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
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+
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

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
Messages postés
14843
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
15 octobre 2020
92
#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...
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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)
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

Merci de cette reponse mais je ne comprend algorithme que tu utilise

RATP
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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)
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

ok, merci.

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

RATP
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23
et s'il n'y a pas que des 'a' to 'z' dans string parcourue ???

ciao...
BruNews, MVP VC++
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
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)
Messages postés
23
Date d'inscription
vendredi 20 février 2004
Statut
Membre
Dernière intervention
1 octobre 2007

Comment faire alors stp ?

RATP
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
23
tableau de 255 int si tu bosses en ANSI.

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

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

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
Messages postés
1536
Date d'inscription
samedi 21 décembre 2002
Statut
Membre
Dernière intervention
24 mai 2009
2
Tu reprends mon exemple :

int compteur[256];

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

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

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