[C] Fonction qui retourne deux valeurs...

Fermé
yanis - 15 sept. 2010 à 18:25
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 16 sept. 2010 à 22:28
Bonjour,


j'ai un prog à créer: l'utilisateur entre une phrase, et je dois y compter le nombre de voyelles. cela doit se faire dans une fonction indépendante, qui retournera deux valeurs.
j'ai fait le gros, la fonction par contre ne retourne que les voyelles, je ne vois pas comment faire pour renvoyer les deux valeurs voici le code:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int comptage(char tab[])
{
int i, nbVoy=0, nbCons=0;
for(i=0; i<90; i++)
{
if(tab[i] == 'a' || tab[i] == 'e' || tab[i] == 'i' || tab[i] == 'o' || tab[i] == 'u' || tab[i] == 'y' )
nbVoy;
else
nbCons++;
}
return nbVoy;

}
void main(void){

char tab[90];
int res;
puts("Entrez une phrase");
gets(tab);
printf("Vous avez entre: ");
puts(tab);
res = comptage(tab);
printf("Dans votre phrase, il y a %d voyelles\n", res);
system("pause");
}


merci
A voir également:

15 réponses

Anth077 Messages postés 5 Date d'inscription mercredi 15 septembre 2010 Statut Membre Dernière intervention 15 septembre 2010 1
15 sept. 2010 à 18:29
Bonjour,

Tu as vu les pointeurs ?

Car sans eux, une fonction ne peut pas retourner deux valeurs...
0
En fait, ouais j'ai vu les pointeurs mais ca remonte à un bout de temps, je reprend du début.
Donc, je suis preneur de la solution mettant en oeuvre les pointeurs.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
Modifié par fiddy le 15/09/2010 à 21:16
Bonjour,
Une fonction en C ne peut pas retourner deux valeurs. Néanmoins, tu peux retourner un pointeur qui te dira où récupérer tes deux valeurs. Mais la fonction ne retournera qu'une valeur : le pointeur.
Son prototype sera : int* comptage(char *tab)
Ensuite tu créeras un pointeur a deux valeurs que tu retourneras : return.

Plusieurs points d'attention sur ton programme :
void main(void) : main est une fonction qui renvoie un int. Donc c'est : int main (void) et return 0; à la fin pour dire que tout s'est bien déroulé.
gets(tab); : cette fonction ne doit jamais être utilisée. Utilise plutôt fgets. C'est beaucoup plus sécurisé. Ou sinon : scanf("%89s",tab);
Dans ta fonction comptage, tu parcours tout le tableau (90 bytes) mais c'est faux. Il faut parcourir tout jusqu'au caractère final. Sinon tu vas compter des caractères bidons.
Je te conseille de choisir : int *comptage (const char *tab, const size_t sz)
Et pour appeler la fonction : comptage(tab, strlen(tab)+1);
Cdlt,
0
Hum, ok. Je ne suis pas sur d'avoir tout compris en fait.
comptage(tab, strlen(sz)+1); Ici, le strlen compte la longueur de la chaine, mais ma chaine c'est plutôt tab non?
0

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

Posez votre question
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
15 sept. 2010 à 21:16
Euh oui oui, c'est : strlen(tab)+1. Petite étourderie ;-)))
0
J'ai fait qqchose j'ai toujours pas corriger le pb de la boucle for(on verra à la fin) mais j'ai fait qqchose niveau pointeurs:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void comptage(char tab[], int *pVoy, int *pCons)
{
int i;
for(i=0; i<90; i++)
{
if(tab[i] == 'a' || tab[i] == 'e' || tab[i] == 'i' || tab[i] == 'o' || tab[i] == 'u' || tab[i] == 'y' )
*pVoy++;
else
*pCons++;
}

}
int main(int argc, char *argv[])
{

char tab[90];
int nbVoy = 0, nbCons = 0;

int *pVoy = &nbVoy;
int *pCons = &nbCons;

puts("Entrez une phrase");
fgets(tab, sizeof tab, stdin);
printf("Vous avez entre: ");
puts(tab);
comptage(tab, pVoy, pCons);
printf("Dans votre phrase, il y a %d voyelles\n", *pVoy);
printf("Dans votre phrase, il y a %d consonnes\n", *pCons);
system("pause");
}

Si quelqu'un pourrait me corriger
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
15 sept. 2010 à 22:48
N'oublie pas de mettre ton programme dans les balises "codes" (à droite du bouton souligné) pour garder la mise en forme.


Sinon, voici ton programme corrigé (je me suis permis de changer les pointeurs et de changer deux trois trucs) :

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void comptage (const char tab[], int * const pVoy, int * const pCons) {
    int i;

    for (i=0; i<90; i++)
    {
    if (tab[i] == 'a' || tab[i] == 'e' || tab[i] == 'i' || tab[i] == 'o' || tab[i] == 'u' || tab[i] == 'y' )
        (*pVoy)++;
    else
        (*pCons)++;
    }
}
int main (void) {
    char tab[90];
    int nbVoy = 0, nbCons = 0;

    puts("Entrez une phrase");
    fgets(tab, sizeof tab, stdin);
    printf("Vous avez entre: ");
    puts(tab);
    comptage(tab, &nbVoy, &nbCons);
    printf("Dans votre phrase, il y a %d voyelles\n", nbVoy);
    printf("Dans votre phrase, il y a %d consonnes\n", nbCons);

    system("pause");
    return 0;
}

Tu constateras que t'auras probablement beaucoup de consonnes. Tu feras le lien rapidement avec la boucle for et mon message précédent. Une fois que tu auras corrigé la boucle, tu auras encore un problème d'une consonne comptée en plus. Cela est dû au fgets qui stocke le '\n' émis par le clavier.
Un petit strchr fera l'affaire...
0
Ok, merci je bosse la dessus.
Sinon,
const char tab[]

Ça veut dire quoi ca ?
Merci encore!
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
15 sept. 2010 à 22:59
Cela permet de dire au compilateur que tu interdis la modification des caractères de tab. Autrement dis, si tu modifies la chaîne dans la fonction, le compilateur emettra une erreur.
0
J'ai fait quelques modifs au niveau de la boucle for
Par contre j'ai une consonne de trop comme prévu mais il me compte les espaces en tant que consone...
Donc je me suis dis au lieu de faire un if else, je fais un if pour les voyelles et un autre if pour les consonnes.

Voilà ou j'en suis:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

void comptage (const char tab[], int * const pVoy, int * const pCons,const int len) // le parametre const permet de dire au compilateur
{                                                                     //la modification des caractères de tab. 
    int i;                                                            //si tu modifies la chaîne dans la fonction, 
    for(i=0; i< len; i++)                                                //le compilateur emettra une erreur. 
        {
            if(tab[i] == 'a' || tab[i] == 'e' || tab[i] == 'i' || tab[i] == 'o' || tab[i] == 'u' || tab[i] == 'y' )
                (*pVoy)++;
            else
                (*pCons)++;
        }
    
}
int main(int argc, char *argv[])
{

    char tab[90];
    int nbVoy = 0, nbCons = 0;
    int *pVoy = &nbVoy;        // Solution 2: Supprimmer ces deux lignes.
    int *pCons = &nbCons;        
    int len=0;

    puts("Entrez une phrase");
    fgets(tab, sizeof tab, stdin);
    printf("Vous avez entre: ");
    puts(tab);
    len = strlen(tab) ;
    comptage(tab, pVoy, pCons,len);         // Mettre ici comptage(tab, &nbVoy, &nbCons); 
    printf("Dans votre phrase, il y a %d voyelles\n", *pVoy); // Soit *pVoy soit nbVoy car: *pVoy = nbVoy
    printf("Dans votre phrase, il y a %d consonnes\n", nbCons);
    system("pause");
}

0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
15 sept. 2010 à 23:54
Oui pour les espaces et même pour les ponctuations, tu auras le problème pour les consonnes.
Le "else if" est en effet la meilleure méthode.
Maintenant que ton programme arrive à terme, je vais te donner une petite astuce pour rendre ton programme plus propre.
Tu peux utiliser un tableau "voyelle". Par exemple : char *tabVoyelle="aeiou";
Ainsi au lieu du : "if (tab[i]=='a' || ...)", tu peux utiliser : if (strchr(tabVoyelle, tab[i])) (*pVoy)++;

Cdlt,
0
Lorsque je fait ca:
char *tabVoyelle="aeiou"; 
if (strchr(tabVoyelle, tab[i])) (*pVoy)++; 

J'ai une erreur : Aucune instance de fonction surchargée strchr ne correspond à la liste d'argument...
Je ne sais pas ce que ca veut dire, mais ca plante à l'exec avec un message d'erreur sur le adresses..
0
Autre question pour déclarer le tableau:
char *tabVoyelle={'a',...};

C'est pas plutôt comme ca?
0
Ça non plus, ca ne passe pas

char *len = strchr(tab, '\0');
for(i=0; i< len;  i++)    

Erreur: Impossible d'utiliser de type const char * pour initialiser une entité de type char *
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
16 sept. 2010 à 22:28
Pour déclarer un tableau, effectivement il faut utiliser les crochets.
Néanmoins, pour une chaîne de caractère, tu peux utiliser ma notation. Elle aura l'avantage de ne pas avoir besoin de spécifier le \0 final.
Je comprends vraiment pas ce que tu cherches à faire avec ton len=strchr(tab,'\0') ?
Mon exemple est correct et peut être utiliser tel quel. Il faut juste que tu réfléchisses où le mettre et en remplacement de quelle ligne.
0