Programmation en C
Résolu
Bonjour, tous le monde
J'ai un probleme de code source j'en ai taper un senser fonctionner de cette facon
La fonction main demande un nombre a l'utilisateur et pour calculer son triple elle l'envoi a la fonction kjhg pour le faire et la fonction kjhg elle meme fait la meme chose avec la fonction kjhb mais sa ne marche pas (il me donne un resultat de -1)alors voila le code source que j'ai ecrit: merci d'avance
#include <stdio.h>
#include <stdlib.h>
int kjhb(int resultat2)
{
resultat2 * 3;
return resultat2;
}
int kjhg(int nombreentre)
{
int resultat2;
nombreentre = resultat2;
nombreentre = kjhb(resultat2);
return nombreentre;
}
int main(int argc, char *argv[])
{
int nombreentre;
printf("Entrez un nombre...");
scanf("%d", &nombreentre);
printf("Le triple du nombre est %d", kjhg(nombreentre));
return 0;
}
J'ai un probleme de code source j'en ai taper un senser fonctionner de cette facon
La fonction main demande un nombre a l'utilisateur et pour calculer son triple elle l'envoi a la fonction kjhg pour le faire et la fonction kjhg elle meme fait la meme chose avec la fonction kjhb mais sa ne marche pas (il me donne un resultat de -1)alors voila le code source que j'ai ecrit: merci d'avance
#include <stdio.h>
#include <stdlib.h>
int kjhb(int resultat2)
{
resultat2 * 3;
return resultat2;
}
int kjhg(int nombreentre)
{
int resultat2;
nombreentre = resultat2;
nombreentre = kjhb(resultat2);
return nombreentre;
}
int main(int argc, char *argv[])
{
int nombreentre;
printf("Entrez un nombre...");
scanf("%d", &nombreentre);
printf("Le triple du nombre est %d", kjhg(nombreentre));
return 0;
}
A voir également:
- Programmation en C
- Application de programmation - Guide
- Mettre en veille un programme - Guide
- Programmer en basic sous windows 10 - Télécharger - Édition & Programmation
- Un autre programme est en cours d'installation - Forum Windows 10
- Programmation envoi sms - Guide
6 réponses
Désolée mais tu as dû te tromper :
Je pense que l'information qui te manque et qui te bloque c'est la notion d'horizon en C (un horizon est une paire d'accolade et son contenu direct, et quand je dis paire d'accolades, je parle des accolades d'une fonction, d'un bloc if, d'une boucle for ou while etc...). Le nom d'une variable n'est pas globale si celle-ci n'est pas déclarée comme telle (c'est-à-dire si elle est déclarée dans le prototype ou dans le corps d'une fonction).
De plus tout paramètre manipulé par une fonction est toujours une recopie du paramètre qui a été passé à cette fonction. Ainsi le fait de modifier une variable passée en paramètre d'une fonction ne la modifie qu'à l'intérieur de cette fonction.
Pour qu'une fonction g puisse modifier une variable x déclarée déclarée dans une fonction f, il faut passer à g une référence ou l'adresse (pointeur) de x. Par exemple :
J'insiste sur le fait que le nom que tu choisis pour tes paramètres de fonction n'a aucun impact en dehors de cette fonction, il n'a une signification que dans la fonction. Ainsi tu peux tout à fait écrire :
... bien qu'incrémenter2 ait un prototype ou la variable passée en paramètre s'appelle x.
Afin que tu comprennes ce qui se passe j'ai repris ton code et je l'ai déroulé. Les instructions sont exécutées dans l'ordre indiqué : 1), 2), 3) etc... Le programme débute dans le main (étape 1).
#include <stdio.h> int kjhb(int resultat2){ return resultat2 * 3; } int main(){ int nombreentre; printf("Entrez un nombre...\n"); scanf("%d", &nombreentre); printf("Le triple du nombre est %d\n", kjhb(nombreentre)); return 0; }
Je pense que l'information qui te manque et qui te bloque c'est la notion d'horizon en C (un horizon est une paire d'accolade et son contenu direct, et quand je dis paire d'accolades, je parle des accolades d'une fonction, d'un bloc if, d'une boucle for ou while etc...). Le nom d'une variable n'est pas globale si celle-ci n'est pas déclarée comme telle (c'est-à-dire si elle est déclarée dans le prototype ou dans le corps d'une fonction).
{ // début horizon1 int x; { // début horizon2 int y; // x et y ont un sens car on est dans les horizons 1 et 2 } // fin horizon2 // y n'a pas de sens car cette variable est défini dans l'horizon 2 } // fin horizon1 { // horizon3 int z; // x et y ne sont pas définis dans cet horizon } // fin horizon3
De plus tout paramètre manipulé par une fonction est toujours une recopie du paramètre qui a été passé à cette fonction. Ainsi le fait de modifier une variable passée en paramètre d'une fonction ne la modifie qu'à l'intérieur de cette fonction.
Pour qu'une fonction g puisse modifier une variable x déclarée déclarée dans une fonction f, il faut passer à g une référence ou l'adresse (pointeur) de x. Par exemple :
void incrementer1(int x){ // C ou C++. Passe par valeur (recopie) ++x; // La recopie de x manipulée par incrementer1 // vaut 70... mais x vaut toujours 69 dans main } void incrementer2(int *x){ // C ou C++. Passage par pointeur ++(*x); // ici ça marche car le paramètre recopié est l'adresse // de la variable x déclarée dans main. // on modifie bien x ! } void incrementer3(int & x){ // spécifique au C++. Passage par référence ++y; // passage par référece } int main(){ int x = 69; incrementer1(x); // 69 ! incrementer2(&x); // 70 incrementer3(x); // 71 }
J'insiste sur le fait que le nom que tu choisis pour tes paramètres de fonction n'a aucun impact en dehors de cette fonction, il n'a une signification que dans la fonction. Ainsi tu peux tout à fait écrire :
int x = 69; int y = 20; incrementer2(&x); // x = 70 incrementer2(&y); // y = 20
... bien qu'incrémenter2 ait un prototype ou la variable passée en paramètre s'appelle x.
Afin que tu comprennes ce qui se passe j'ai repris ton code et je l'ai déroulé. Les instructions sont exécutées dans l'ordre indiqué : 1), 2), 3) etc... Le programme débute dans le main (étape 1).
#include <stdio.h> #include <stdlib.h> int kjhb(int resultat2) // Étape 7. Cette variable est recopie de la variable // resultat2 de kjhg et vaut 4812442 { resultat2 * 3; // 8) Il ne se passe rien... tu fais un calcul // que tu ne stockes pas, résultat2 n'est pas modifié return resultat2; // 9) On retourne 4812442 et on va à l'étape 10 } int kjhg(int nombreentre) // Étape 3. Cette variable est une recopie // de la variable nombreentre de la fonction main. Cette dernière // ne sera donc pas modifiée par khhg bien que les deux variables // aient le même nom, car ce n'est plus le même horizon. { int resultat2; // 4) Cet entier n'est pas initialisé et vaut par exemple 4812442 nombreentre = resultat2; // 5) nombreentre vaut désormais 4812442 nombreentre = kjhb(resultat2); // 6) On va à l'étape 7. 10) nombreentre vaut 4812442 return nombreentre; // 11) on retourne 4812442 } int main(int argc, char *argv[]) // Étape 1) Le programme commence ici { int nombreentre; printf("Entrez un nombre..."); scanf("%d", &nombreentre); // 2) L'utilisateur rentre une valeur (par exemple 3) printf("Le triple du nombre est %d", kjhg(nombreentre)); // On va à l'étape 3). // 12) On a donc écrit 4812442 ! return 0; }
bn je tiens a te rappller que la 1ere fonction va toujours retourner l'entier que tu tape comme parametre et elle vas plus donner le resultat de la multiplication sauf si tu met :
int kjhb(int resultat2)
{
resultat2 = resultat2 * 3;
return resultat2;
}
int kjhb(int resultat2)
{
resultat2 = resultat2 * 3;
return resultat2;
}
Ou mieux :
Ou encore mieux :
Bonne chance
int kjhb(int resultat2){ resultat2 *= 3; return resultat2; }
Ou encore mieux :
int kjhb(int resultat2){ return resultat2*3; }
Bonne chance
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question