[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
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
A voir également:
- [C] Fonction qui retourne deux valeurs...
- Ecran retourne - Guide
- Fonction si et - Guide
- Deux comptes whatsapp - Guide
- Deux ecran pc - Guide
- Fonction somme excel - Guide
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
15 sept. 2010 à 18:29
Bonjour,
Tu as vu les pointeurs ?
Car sans eux, une fonction ne peut pas retourner deux valeurs...
Tu as vu les pointeurs ?
Car sans eux, une fonction ne peut pas retourner deux valeurs...
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.
Donc, je suis preneur de la solution mettant en oeuvre les pointeurs.
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
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,
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,
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?
comptage(tab, strlen(sz)+1); Ici, le strlen compte la longueur de la chaine, mais ma chaine c'est plutôt tab non?
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
15 sept. 2010 à 21:16
Euh oui oui, c'est : strlen(tab)+1. Petite étourderie ;-)))
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
#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
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
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) :
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...
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...
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
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.
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:
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"); }
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
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,
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,
Lorsque je fait ca:
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..
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..
Ça non plus, ca ne passe pas
Erreur: Impossible d'utiliser de type const char * pour initialiser une entité de type char *
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 *
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
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.
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.