Programmation en C

Résolu/Fermé
shareaza15 Messages postés 667 Date d'inscription samedi 16 mai 2009 Statut Membre Dernière intervention 11 mai 2010 - 29 juil. 2009 à 18:19
mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 - 30 juil. 2009 à 15:11
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;
}
A voir également:

6 réponses

mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 7 842
30 juil. 2009 à 00:20
Désolée mais tu as dû te tromper :
#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;
}
1
happy_girl Messages postés 111 Date d'inscription vendredi 7 novembre 2008 Statut Membre Dernière intervention 26 juillet 2012 1
29 juil. 2009 à 18:22
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;
}
0
mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 7 842
29 juil. 2009 à 18:32
Ou mieux :
int kjhb(int resultat2){
  resultat2 *= 3;
  return resultat2;
}

Ou encore mieux :
int kjhb(int resultat2){
  return resultat2*3;
}

Bonne chance
0
shareaza15 Messages postés 667 Date d'inscription samedi 16 mai 2009 Statut Membre Dernière intervention 11 mai 2010 26
29 juil. 2009 à 23:15
Desolé Sa ne marche pas
avez vous d'autres proposition??
MERCI
0

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

Posez votre question
shareaza15 Messages postés 667 Date d'inscription samedi 16 mai 2009 Statut Membre Dernière intervention 11 mai 2010 26
30 juil. 2009 à 12:17
Merci Beaucoup!!!!
0
mamiemando Messages postés 33636 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 18 avril 2025 7 842
30 juil. 2009 à 15:11
De rien, bonne continuation !
0