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

cs_ratp 23 Messages postés vendredi 20 février 2004Date d'inscription 1 octobre 2007 Dernière intervention - 26 juil. 2005 à 09:33 - 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 

31 réponses

Répondre au sujet
nicooooo1 58 Messages postés mercredi 2 février 2005Date d'inscription 4 février 2012 Dernière intervention - 26 juil. 2005 à 09:40
+3
Utile
int nbrOccurences( char * chaine, char caractere )

{

int compteur = 0;

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

{

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

}

return compteur;

}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de nicooooo1
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 26 juil. 2005 à 10:24
+3
Utile
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++
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de BruNews
cs_ratp 23 Messages postés vendredi 20 février 2004Date d'inscription 1 octobre 2007 Dernière intervention - 26 juil. 2005 à 14:13
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_ratp
vecchio56 6539 Messages postés lundi 16 décembre 2002Date d'inscription 22 août 2010 Dernière intervention - 26 juil. 2005 à 21:19
+1
Utile
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
DeAtHCrAsH 2674 Messages postés vendredi 25 janvier 2002Date d'inscription 6 février 2013 Dernière intervention - 26 juil. 2005 à 10:28
0
Utile
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
cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention - 26 juil. 2005 à 10:39
0
Utile
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
cs_ratp 23 Messages postés vendredi 20 février 2004Date d'inscription 1 octobre 2007 Dernière intervention - 26 juil. 2005 à 10:40
0
Utile
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
BunoCS 13758 Messages postés lundi 11 juillet 2005Date d'inscription 19 avril 2018 Dernière intervention - 26 juil. 2005 à 10:47
0
Utile
#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
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 26 juil. 2005 à 11:28
0
Utile
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
cs_ratp 23 Messages postés vendredi 20 février 2004Date d'inscription 1 octobre 2007 Dernière intervention - 26 juil. 2005 à 11:33
0
Utile
Merci de cette reponse mais je ne comprend algorithme que tu utilise

RATP
Commenter la réponse de cs_ratp
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 26 juil. 2005 à 11:35
0
Utile
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
cs_ratp 23 Messages postés vendredi 20 février 2004Date d'inscription 1 octobre 2007 Dernière intervention - 26 juil. 2005 à 11:39
0
Utile
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 26 juil. 2005 à 11:45
0
Utile
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
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 26 juil. 2005 à 11:48
0
Utile
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
cs_ratp 23 Messages postés vendredi 20 février 2004Date d'inscription 1 octobre 2007 Dernière intervention - 26 juil. 2005 à 11:49
0
Utile
Comment faire alors stp ?

RATP
Commenter la réponse de cs_ratp
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 26 juil. 2005 à 11:59
0
Utile
tableau de 255 int si tu bosses en ANSI.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews
DeAtHCrAsH 2674 Messages postés vendredi 25 janvier 2002Date d'inscription 6 février 2013 Dernière intervention - 26 juil. 2005 à 12:13
0
Utile
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
cs_ratp 23 Messages postés vendredi 20 février 2004Date d'inscription 1 octobre 2007 Dernière intervention - 26 juil. 2005 à 12:31
0
Utile
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
cs_AlexMAN 1537 Messages postés samedi 21 décembre 2002Date d'inscription 24 mai 2009 Dernière intervention - 26 juil. 2005 à 12:35
0
Utile
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
cs_ratp 23 Messages postés vendredi 20 février 2004Date d'inscription 1 octobre 2007 Dernière intervention - 26 juil. 2005 à 12:44
0
Utile
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.

HELP !!!! Algorithme de recherche d'occurence dans une chaine - page 2