Occurence caractère

jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   -  
jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'aimerais calculer l' occurence de chaque caractère de "chaine2" mais cela ne marche pas, voici mon code source en C.
Merci de m'aider.

for (i=0;i<taille_chaine2;i++)
{
a=chaine2[i];
for (j=0;j<taille_chaine;j++)
{
if (a==chaine[j])
cpt++;
}
}
A voir également:

17 réponses

jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   1
 
Bon, j'avais essayé de faire simple, mais puisque que vous voulez en savoir plus voici mon code complet :

#include<stdio.h>
#include<conio.h>
#include<string.h>
#include<iostream>
//#DEFINE taille 30

int main(int argc, char*argv[])
{
char chaine[30]="abbabbaacffcrr";
char chaine2[30],chaine3[30],a;
int cpt,taille,i,j,cpt2,cpt3=0;
int k=0;

taille=strlen(chaine);
cpt2=taille;
printf("%s\n",chaine);

for (i=0;i<taille;i++)
{
for (j=1+i;j<taille;j++)
{

if (chaine[i]==chaine[j]){
chaine[j]='*';

}
}
}

for (i=0;i<taille;i++)
{
if (chaine[i]=='*')
cpt2--;
}


for (j=0;j<taille;j++)
{
if (chaine[j]!='*'){
chaine2[k]=chaine[j];
k++;}
}

for (i=0;i<cpt2;i++)
{
a=chaine2[i];
for (j=0;j<taille;j++)
{
if (a==chaine[j])
cpt3++;
}
printf("%d-",cpt3); //le printf ne m'affiche le bon nombre de caractere
}

printf("\n%s\n%s\n",chaine,chaine2);
printf("nbre de caractere different : %d\n",cpt2);

for (i=0;i<cpt2;i++)
{
printf("nbre de %c : \n",chaine2[i]);
}

while(!kbhit());
}
1
AmineKalaa Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   7
 
comment vous recuperer taille_chaine2 et taille_chaine?
0
jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   1
 
Les tailles sont prédéfinies, donc il n'y a pas d'erreur possible sur les tailles.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Ca me fait peur quand tu dis prédéfinis. ^^ L'erreur vient peut-être de là.
Poste ta définition des tailles ainsi que celle des chaînes.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
Qu'est-ce qui ne marche pas ?
Car je ne vois pas d'erreur dans ton code. A moins bien sûr que la taille des chaînes aient mal été calculées ou que cpt n'ait pas été défini ou des erreurs du genre.
Pourrais-tu poster aussi la déclaration des variables utilisées (i,j,a,taille_chaine,cpt,chaine,...) et la définition de taille_chaine, chaine, etc.
A noter que ta variable "a" est inutile. Tu peux directement comparer chaine[i] avec chaine[2].
0

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

Posez votre question
AmineKalaa Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   7
 
tester ce code:

int calculer_occurence(Char s1[],char s2[])
{
int nb_occ=0;
int i,j;

for(i=0;i<strlen(s1),i++) /*strlen(s): retourne la longueur de la chaine elle se trouve dans string.h ou stdlib.h */
for(j=0;j<strlen(s2),j++)
if(s1[i]==s2[j])
nb_occ++;
return(nb_occ);

}
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Oui, donc les tailles des chaînes ne sont pas pré-définies ^^. Elles sont tout simplement calculées. Donc, là ça me va mieux.
Sinon, tu gaspilles beaucoup de variables. Certes, ce n'est pas gênant, mais en plus ça perd un peu en lisibilité.

Tout simplement, tu codes une fonction annexe qui va calculer le nombre d'occurences. C'est plus propre que de tout mettre dans le main.

Par exemple :
int nbOccur(const char *chaine1, const char *chaine2) {
    size_t i,j;
    int res=0;
    for(i=0;i<strlen(chaine1);i++)
        for(j=0;j<strlen(chaine2);j++)
             if(chaine1[i]==chaine2[j])
                  res++;
    return res;
}

Sinon, n'inclue pas iostream si tu fais du C.
0
AmineKalaa Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   7
 
Bonjour Fiddy:
c'est quoi le size_t ???
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846 > AmineKalaa Messages postés 87 Date d'inscription   Statut Membre Dernière intervention  
 
Salut,
c'est quoi le size_t ???
C'est le type officiel pour les tailles (non signé). C'est ce que renvoie sizeof, strlen, ...
0
Albert
 
Je ne sais pas ou ton programme ne marche pas( c'est pas dit !)
Me basant sur ton post 1, il y a un problème de cpt qui s'incrémente quelque soit le caractère.
Je te propose cet algorithme


pour chaque caractère de la chaine(indice i)

	mettre compteur à 0

	vérifier que ce caractère existe dans un tableau (à 2 dim)
	si n'existe pas
		redimensionner le tableau 
		écrire le caractere dans le tableau
		pour chaque caractere de la chaine (indice j)
			comparer avec le caractere d'indice i
			si égal
				compteur +1
			fin si
		fin pour (j)
		ecrire le compteur dans le tableau
			
	si existe 
		ben on fait rien puisqu'il a déjà été traité
	fin s
fin pour(i)


a la fin on obtient un tableau contenant chaque caractère et son nombre d'occurences dans la chaine.
A+
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut,
Me basant sur ton post 1, il y a un problème de cpt qui s'incrémente quelque soit le caractère.
Non, il n'y a pas d'erreurs dans son post 1. Il y a bien le "if" ;-)).
0
AmineKalaa Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   7 > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
j'ai pas bien saisi l'nance il voudrait calculer l'occurrence de chaque caractère donc il faut reserver un tableau d'entiers de taille la longueur du chaine 1::
void calculer_occurence(char s1[],char,s2[], int t[],int n)/*tableau passer en paramètre avec sa taille*/
{
  int i;
 int j;
 /* initialisatoin du tableau */
 for(i=0;i<n; t[i]=0;i++);

 /*traitement*/
for(i=0;i<n/*strlen(s1);i++)
   for(j=0;j<strlen(s2);j++)
     if(s1[i]==s2[j])
         t[i]++;
}

<code>
ca marche !!!
0
Albert > fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention  
 
Ben oui et non ! effectivement le compteur ne s'incrémente que SI chaine(i)= chaine(J), mais comme le compteur n'est pas remis à 0 entre chaque indice i, on aura un résultat global inexploitable !!!
0
Albert
 
oui, mais en fin de traitement on obtient un tableau de chiffres sans savoir à quels caractères ils se rapportent et on aura plusieurs fois un nombre d'occurences se rapportant au même caractère.

Ainsi si la chaine est BABAR (n'importe quoi!) on obtiendrait:
2
2
2
2
1

ce serait mieux si on avait
B=2
A=2
B=2
A=2
R=1

l'algo que je proposais permet d'obtenir:
B=2
A=2
R=1

A+
0
AmineKalaa Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   7
 
la question est de chercher le nb d'occurrence des caractères de chaine1 dans chaine 2 donc on s'en fou des caracterer de chaine1 on va juste les lire...
selon la solution que j'ai proposé on obtient interprété comme suit:
le caractère n° i de chaine1 c'est répété t[i]fois dans chaine2..
si on veut faire mieux on doit passer à la notion de structure.
0
jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   1
 
Salut Albert, merci pour ton algo mais es que tu pourrais me le donner en C parce que moi et l'algo^^, et surtout je n'ai pas très bien compris quand tu parle de redimensionner le tableau
0
AmineKalaa Messages postés 87 Date d'inscription   Statut Membre Dernière intervention   7
 
bonjour jeremy
pourqoi pas tester le code que j'ai mensionné au dessu?? ca marche !!
0
Albert
 
Ah ben oui j'avais pas tout compris l'expression du besoin!
J'étais parti sur une autre idée

Milles excuses
0
Albert
 
Ah ben non, en relisant le post 5, dans chaine2 on trouve bien chaine, et le but est il de déterminer le nombre d'occurrences de chaine dans chaine 2 ou bien de déterminer le nombre d'occurences de caractères dans chaine2( ou chaine puisque si j'ai tout compris c'est la même)
0
jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   1
 
Il faut trouver le nombre d' occurence dans chaine1, tu l'a bien expliqué dans le post 13, c'est exactement ça qu'il
faut faire.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Tu veux le nombre d'occurences d'une chaîne dans une autre globale ? Ou un histogramme donnant les occurences de chaque lettre d'une chaîne dans une autre ?
Par exemple
abcd et bcde
Tu veux que ça te donne : 3 ou que ça donne : b 1, c 1, d, 1 ?
Cdlt
0
jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   1
 
Par exemple si j'ai "abracadabra", le résultat doit être :
a = 5
b = 2
r = 2
c = 1
d = 1
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Euh là c'est encore différent.
Tu parlais de deux chaînes au début.
Tu veux le nombre d'occurences de chaque lettre constituant un mot ou le nombre d'occurences des lettres dans un autre mot ?
0
jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   1
 
Je veux le nombre d' occurences de chaque lettre constituant un mot ou une phrase.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Ok, voici un programme qui répond à tes attentes :
#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main(void){
    int histo[26]={0};
    const char *phrase="ceci est un test";
    size_t i;

    //remplissage de l'histogramme
    for(i=0;i<strlen(phrase);i++){
        char c=tolower(phrase[i]);
        if( c>='a' && c<='z' )
            histo[c-'a']++;
    }

    //affichage
    for(i=0;i<26;i++)
        if( histo[i] )
            printf("%c: %d\n",i+'a',histo[i]);

    return 0;
}
0
jeremy9871 Messages postés 27 Date d'inscription   Statut Membre Dernière intervention   1
 
Merci beaucoup fiddy
0