[2002, Lettre la plus présente] C

Coucou,

J'ai du mal avec un exercice d'entraînement des années passées que j'essaie de faire en C. Soyez indulgents s'il vous plaît, j'ai essayé de donner toutes les données possibles et d'écrire le moins d'absurdités possibles ... Il est évident que je passe à côté de quelque chose de très con au niveau des pointeurs mais j'ai fini par m'emmêler les pinceaux et ça fait super longtemps que j'avais plus mis le nez dans les astérisques. Désolé pour l'indentation qui n'est pas passée avec le copier coller depuis notepad++.

Il y a ici plusieurs problèmes, je sais même pas si l'algorithme est correct et de plus je n'ai aucune idée de sous quelle forme me reviennent tous les appels de la fonction nboccmax (qui d'ailleurs ne porte pas un nom correct, je vais changer ça). Bref, à l'aide !

Voici l'énoncé de l'exercice :

LIMITE DE MEMOIRE

1000 ko

LIMITE DE TEMPS

125 ms

ENONCE
On vous donne une chaîne de caractères. Écrire une fonction qui renvoie le nombre d'occurences de la lettre la plus présente dans cette chaîne, sans distinction majuscule/minuscule. On ignore les lettres accentuées.

CONTRAINTES
1

ENTREE
Sur l'entrée standard, on vous fournit deux lignes :

Le nombre de caractères N de la chaîne.
La chaîne elle-même, composée uniquement de lettres minuscules et majuscules non-accentuées, et d'espaces.

SORTIE
Vous devez écrire une ligne sur la sortie standard : le nombre d'occurrences de la lettre la plus présente dans la chaîne fournie.

EXEMPLE(S) D'ENTREE/SORTIE

Exemple 1
en entrée ...

42
dCAbACCcabbbdbddCdADACbACBACDDCdcBadddCDdc

en sortie ...

14

Voici le code que j'ai commencé à faire :

1
2
#include stdio.h
#include conio.h // pour le getch();, pour faire une pause - getchar(); ne le fait pas - ???

int nboccmax(int N,char str,int i,int nb,char current);

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
int main(int argc, char *argv[])
{ 
    int N; // taille de la chaîne de caractères préalablement donnée
    scanf("%d",&N);
    char str[N]; // d'après l'énoncé, chaîne de caractères de taille N
    scanf("%s",str);
    printf("N : %d\nstr : %s\n",N,str); // petite vérification
    int nb = nboccmax(N,str,0,0,""); // ce n'est pas la réponse, mais le maximum de toutes les valeurs renvoyées devrait être le bon résultat
    printf("%d",nb); // autre vérification
    getch(); // de conio.h, pour faire une pause - getchar(); ne le fait pas - ???
    return 0;
}

int nboccmax(int N,char str,int i,int nb,char current) // cette fonction renvoie la série d'occurrences d'un caractère depuis sa position dans la chaîne de caractères str jusqu'à la fin ; il y a des appels inutiles puisqu'elle est rappelée plusieurs fois pour le même caractère si deux occurrences de ce dernier sont séparées par un caractère différent ; cependant le maximum des valeurs renvoyées est le nombre que l'on cherche
{
    if(i    {
        if(current == str[i]) // si le caractère de la chaîne analysé est le même que "current", on rajoute 1 au nombre d'occurences et on rappelle la fonction pour le caractère suivant
        {
            nb++;
            i++;
            nboccmax(N,str,i,nb,current);
        }
        else // si le caractère n'est pas le même, on appelle la fonction pour calculer le nombre d'occurrences de ce caractère (avec nb = 1 puisqu'on l'a déjà "vu" une fois)
        {
            char current = str[i];
            int nb = 1;
            i++;
            nboccmax(N,str,i,nb,current);
        }
    }
    else
    {
        return nb; // cas de base : si on a fini de lire la chaîne de caractères on renvoie le nombre d'occurences de "current"
    }
    return 0;
}

Voici l'erreur renvoyée par le compilateur :

qcm2002_occchar.c: In function 'main':
qcm2002_occchar.c:13:2: warning: passing argument 2 of 'nboccmax' makes integer from pointer without a cast
qcm2002_occchar.c:4:5: note: expected 'char' but argument is of type 'char *'
qcm2002_occchar.c:13:2: warning: passing argument 5 of 'nboccmax' makes integer from pointer without a cast
qcm2002_occchar.c:4:5: note: expected 'char' but argument is of type 'char *'
qcm2002_occchar.c: In function 'nboccmax':
qcm2002_occchar.c:23:20: error: subscripted value is neither array nor pointer
qcm2002_occchar.c:31:22: error: subscripted value is neither array nor pointer

Les paramètres de ta fonction nboccmax sont faux.

int nboccmax(int N, char str ,int i,int nb,char current)

Tu prends en entrée un caractère pour str et un caractère pour current.
Au vu du reste du code, je suppose que str doit êrte une chaîne de caractères, donc un char*

C'est un peu ce que te dis le compilateur d'ailleurs :

qcm2002_occchar.c:4:5: note: expected 'char' but argument is of type 'char *'

Tu définis une fonction qui prend un char en argument mais tu lui fournis un char* dans ton appel de la fonction main.

Voila. Bon courage.

Bonjour,

Merci beaucoup pour cette réponse !

J'avais complètement oublié la notation char* !

J'en ai donc presque fini avec l'exercice cependant je rencontre un autre problème de types au niveau du code en gras. (j'ai retiré les "" pour les include puisque les librairies sont interprétées comme des balises HTML)

Le message d'erreur à la compilation est :

qcm2002_occchar.c: In function 'main':
qcm2002_occchar.c:15:6: error: incompatible types when assigning to type 'int[(unsigned int)(N)]' from type 'int *'

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#include stdio.h
#include conio.h



int* nbocc(unsigned int N,char* str,int i,int nb,char current,int* nbs);
int max(int* nbs,unsigned int N);



int main(int argc, char *argv[])
{ 
        unsigned int N;
    scanf("%d",&N);
    char str[N];
    int nbs[N];
    scanf("%s",str);
    printf("N : %d\nstr : %s\n",N,str);

nbs = nbocc(N,str,0,0,0,nbs);

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
    int maxi = max(nbs,N);
    printf("occ : %d",maxi);
    getch();
    return maxi;
}

int* nbocc(unsigned int N,char* str,int i,int nb,char current,int* nbs)
{
    nbs[i] = nb;
    if(i    {
        if(current == str[i])
        {
            nb++;
            i++;
            nbocc(N,str,i,nb,current,nbs);
        }
        else
        {
            char current = str[i];
            int nb = 1;
            i++;
            nbocc(N,str,i,nb,current,nbs);
        }
    }
    return nbs;
}

int max(int* nbs,unsigned int N)
{
    int j = 0;
    int maxi = 0;
    while(j     {
        if(maxi         {
            maxi = nbs[j];
        }
    j++;
    }
    return maxi;
}

Merci,

Cordialement,

Faradn

Tu ne peux pas affecter un pointeur sur int à un tableau d'int.
D'ailleurs, je ne comprend pas trop pourquoi tu retourne nbs. Il te faudrait peut être lire un (bon) livre sur le C avant de coder tête baissé…
Inclure conio.h ? C'est complétement obsolète comme header.

Bonjour,

Je suis là pour apprendre !

J'ai pris le bon côté du "RTFM" et j'ai repris un chapitre sur les pointeurs. Le conio.h j'ai viré le commentaire mais c'était juste pour le getch(); pour faire une pause pour simple vérification étant donné que getchar(); ne marchait pas.

Merci pour ton aide !

Cordialement,

Faradn

Dans int nbs[N], nbs n'est pas un int*, c'est une variable.

En revanche &nbs en est un et est assignable à un int*.

Deuxième chose, puisque tu passes un int* danq nbocc, tu passes une adresses. Toutes les modifications que tu vas faire seront répercutée dans le main du coup pas besoin du return nbs. Cependant tu dois corriger ton code dans ce sens :

nbocc = (... , &nbs);

Comme ça tu auras un pointeur vers un tableau d'int.
ça devrait être un peu mieux.

Répondre au sujet

Vous devez vous enregistrer ou vous connecter pour poster des messages.