IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Demande sur les fonctions


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Demande sur les fonctions
    H4llo,

    Voila j'ai fait un code, qui permet de calculer la moyenne des valeurs d'un tableau :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <stdio.h>
    #include <stdlib.h>
     
    double moyenneTableau(int tableau[], int TailleTableau);
     
    int main()
    {
        int tableau[6] = {5, 5, 5, 5, 5, 5};
        int Moyenne = 0;
     
        Moyenne = moyenneTableau(tableau, 4);
     
        printf("%d\n", Moyenne);
        return 0;
    }
     
    double moyenneTableau(int tableau[], int TailleTableau)
    {
        return (5 + 5 + 5 + 5 + 5 + 5) / 6;
    }
    Mais voila, comme vous le voyez, j'ai fais ceci :
    return (5 + 5 + 5 + 5 + 5 + 5) / 6;, je n'ai pas renvoyé une variable, et je voulais savoir comment faire si je voulais retourner une valeur comme ceci :
    variable = (5 + 5 + 5 + 5 + 5 + 5) / 6;
    return variable;

    Mais vus que la variable "variable" n'est pas déclarée dans main(), sa ne fonctionnerai pas, alors comment faire ?

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Si je comprend ton problème,
    le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    double moyenneTableau(int tableau[], int TailleTableau)
    {
        return (5 + 5 + 5 + 5 + 5 + 5) / 6;
    }
    est correct (en tant que code d'essai, bien sûr). Ecrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    double moyenneTableau(int tableau[], int TailleTableau)
    {
      double variable =  (5 + 5 + 5 + 5 + 5 + 5) / 6  ;  
      return variable;
    }
    ne change rien : c'est la valeur de variable (5) qui est retournée.

    Les deux codes fonctionneront de façon identique et il n'y a rien à changer dans le main() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Moyenne = moyenneTableau(tableau, 4);
    Dans les deux cas, Moyenne recevra la valeur retournée par la fonction.

    Remarque : dans ton exemple, (5 + 5 + 5 + 5 + 5 + 5) / 6 est une opération entre entiers (et la division sera la division entière) , le résultat sera un entier (donc sans partie décimale) qui sera converti automatiquement en double avant d'être retouné par la fonction. Par exemple (5+4)/2 donnera 4 et non pas 4.5.
    Il faut forcer le calcul de la division en flottant. Dans cet exemple on peut faire (5+4)/2.0
    Dans la version définitive, tu auras ..../(double)TailleTableau; où .... représente la somme des éléments du tableau que la fonction aura préalablement calculé.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Re,

    Merci pour ta réponse, oui en effet sa ne change rien, mais j'avais pensé à un autre truc, je vais regarder et je revient.


  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 16
    Par défaut
    Tu as vu un peu les adresses ?

    Si tu veux garder la variable que tu auras crée dans ta fonction il faut transmettre son adresse et non sa valeur et, bien sûr, récupérer l'adresse et non la valeur.

    Si c'est ce qui t'intéresse je peux t'en dire plus mais dans le doute je ne détaille pas plus.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 299
    Par défaut
    En gros, tu as 2 possibilités :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    double moyenne(int tableau[] tab)
    {
       const int n = sizeof(tab) / sizeof(*tab);
       double moy = blablabla;
       return moy;
    }
    ou sinon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    voidmoyenne(int tableau[] tab,double * moy)
    {
       const int n = sizeof(tab) / sizeof(*tab);
       *moy = blablabla;
    }

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par salseropom Voir le message
    En gros, tu as 2 possibilités :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    double moyenne(int tableau[] tab)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double moyenne(int tab[])
    Citation Envoyé par salseropom Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       const int n = sizeof(tab) / sizeof(*tab);
    n ne donnera pas le nombre d'éléments du tableau : tab est un pointeur et sizeof tab donnera la taille d'un pointeur, pas du tableau.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour Diogène,
    Tout à fait d'accord avec vous, mais j'irai plus loin que la rectification d'une erreur.
    Manifestement Sayce débute, laissons-le débuter tranquillement. Son prototype de calcul de moyenne est tout à fait correct. Il est normal d'indiquer la longueur d'un tableau, par contre il est rare de passer une variable par référence dans le seul but de récupérer sa valeur. Dans ce cas, la syntaxe à utiliser est celle-là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    int Moyenne(int Tableau[], int Nb, float &valeur)
    {
      ... calculs de la moyenne
      {
        valeur = (...)/Nb;
        return 1;  // c'est à dire, c'est bon
      }
    // pour une autre raison
      return 0;  // il s'est passé une anomalie
    }
     
    // Dans le programme d'appel
      float val;
    // initialisation de Tab
      ...
      int ret=Moyenne(Tab, val);
      if (ret == 1)    
      {
        printf("La moyenne calculée est %0.1f\n",val);
      }
      else
      {
        printf("Il s'est passé une anomalie\n");
      }

  8. #8
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par Pierre Dolez Voir le message
    ... par contre il est rare de passer une variable par référence ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int Moyenne(int Tableau[], int Nb, float &valeur)
    <...>
    Ce n'est pas rare, c'est impossible en C.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Pouvez-vous essayer cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <conio.h>
    #include <stdio.h>
    void Routine(int &r)
    {
      r++;
    }
    int main(int, char **)
    {
      for (int i=0; i<5; i++)
      {
        printf("appel i=%d  ",i);
        Routine(i);
        printf("retour i=%d  \n",i);
      }
      while (!kbhit());
      return 0;
    }
    Merci

  10. #10
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @ Pierre Dolez
    ...
    ....
    Comme déjà signalé par ssmario2, ceci n'est pas du C mais du C++

  11. #11
    Invité
    Invité(e)
    Par défaut
    Oui, pardon pour la syntaxe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #include <conio.h>
    #include <stdio.h>
    void Routine(int *r)
    {
      (*r)++;
    }
    int main(int, char **)
    {
      for (int i=0; i<5; i++)
      {
        printf("appel i=%d  ",i);
        Routine(&i);
        printf("retour i=%d  \n",i);
      }
      while (!kbhit());
      return 0;
    }
    Cette syntaxe marche aussi en C++.
    Voir aussi le FAQ où c'est bien mieux expliqué.

Discussions similaires

  1. Où trouver l'aide sur les fonctions de l'API Windows ?
    Par psidonio dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 08/11/2005, 14h28
  2. [CR]Aide sur les fonction de date et plage de date.
    Par Job dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 08/11/2005, 09h19
  3. doc sur les fonctions
    Par masterfab dans le forum C
    Réponses: 18
    Dernier message: 23/06/2005, 17h55
  4. Besoin d'aide sur les fonction d'interbase
    Par BOUBOU81 dans le forum InterBase
    Réponses: 2
    Dernier message: 05/11/2004, 10h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo