Partage
  • Partager sur Facebook
  • Partager sur Twitter

Cours sur les fonctions

Amélioration d'un exemple avec scanf ?

    3 avril 2021 à 6:11:34

    Bonjour à tous !

    Voici l'exemple qui est donné dans le cours traitant des fonctions:

    double aireRectangle(double largeur, double hauteur)
    {
        return largeur * hauteur;
    }    
    
    int main(int argc, char *argv[])
    {    
        printf("Rectangle de largeur 5 et hauteur 10. Aire = %f\n", aireRectangle(5, 10));
        printf("Rectangle de largeur 2.5 et hauteur 3.5. Aire = %f\n", aireRectangle(2.5, 3.5));
        printf("Rectangle de largeur 4.2 et hauteur 9.7. Aire = %f\n", aireRectangle(4.2, 9.7));
          
        return 0;
    }

    J'aimerais savoir comment améliorer cet exemple en permettant à un utilisateur d'entrer les valeurs qu'il souhaiterait avec la fonction " scanf " ?

    Comme il y a une double entrée je ne vois pas comment faire ? J'imaginais quelque chose comme:

    printf ("\nEntrez la largeur du rectangle: ");
    scanf ("%lf",&aireRectangle (5,10));

    Comment procéder ? Mais peut-être que je n'ai pas encore les connaissances pour le faire ?

    • Partager sur Facebook
    • Partager sur Twitter
      3 avril 2021 à 8:07:47

      Bonjour,

      ce que tu veux faire c'est demander la largeur du rectangle, puis sa hauteur et donner ces deux nombres à la fonction qui va en calculer l'aire. Et bien, fais exactement cela :)

      printf("largeur : ");
      double largeur;
      scanf("%lf", &largeur);
      
      printf("hauteur : ");
      double hauteur;
      scanf("%lf", &hauteur);
      
      double aire=aireRectangle(largeur, hauteur);
      printf("aire : &lf\n", aire);

      ⇒ on commence par demander la largeur du rectangle en la stockant dans une variable, tout pareil pour la hauteur, puis on calcule l'aire que l'on stocke aussi dans une variable et que l'on affiche par la suite :)

      • Partager sur Facebook
      • Partager sur Twitter
        3 avril 2021 à 17:42:08

        Hello merci pour ta réponse :)

        Mais alors dans ce cas, la fonction aireRectangle n'a plus de sens d'exister ?!

        • Partager sur Facebook
        • Partager sur Twitter
          3 avril 2021 à 17:44:15

          Dans son code, ligne 9, il l'appelle pour calculer l'aire !
          • Partager sur Facebook
          • Partager sur Twitter
            3 avril 2021 à 18:31:12

            Ici, ta fonction est simple et peut en effet être remplacée par un simple calcul.
            Mais elle pourrait être beaucoup plus complexe et pouvoir être utilisée avec plusieurs valeurs possibles.
            Tu verras assez vite l'utilité des fonctions.
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              3 avril 2021 à 18:44:52

              Tu veux faire trois choses

              1. lire la largeur et la hauteur

              2. calculer l'aire à partir de la largeur et de la hauteur.

              3. afficher l'aire

              Dans ton programme tu écrivais

                 printf("Rectangle de largeur 5 et hauteur 10. Aire = %f\n", aireRectangle(5, 10));
              

              donc tu sais faire 2 et 3, et même les combiner.

              Reste à faire le 1.



              • Partager sur Facebook
              • Partager sur Twitter
                3 avril 2021 à 18:58:33

                Sebiohazard a écrit:

                Hello merci pour ta réponse :)

                Mais alors dans ce cas, la fonction aireRectangle n'a plus de sens d'exister ?!


                Pourquoi dire cela ?

                Je l'utilise dans mon exemple en ligne 9. J'aurais pu comme toi fusionner les lignes 9 et 10 en une seule ligne :

                printf("aire : %lf\n", aireRectangle(largeur, hauteur) );


                Maintenant si tu trouves que remplacer une simple multiplication par une fonction est «overkill» oui … sans doute, mais :

                • une fonction permet de rajouter des vérifications par exemple :

                  double aireRectangle(double longueur, double hauteur)
                  {
                      if (longueur<0) {
                          // on gère l'erreur
                      } else if (hauteur<0) {
                          // idem
                      } else {
                          // on est certain que les données sont correctes
                      }
                  }
                • de réutiliser d'autres fonctions (bon ici l'exemple est bidon) :

                  double aireRectangle(double largeur, double hauteur)
                  {
                      return 2*aireTriangle(largeur, hauteur);
                  }
                • Partager sur Facebook
                • Partager sur Twitter
                  4 avril 2021 à 5:48:17

                  White Crow a écrit:

                  Bonjour,

                  ce que tu veux faire c'est demander la largeur du rectangle, puis sa hauteur et donner ces deux nombres à la fonction qui va en calculer l'aire. Et bien, fais exactement cela :)

                  printf("largeur : ");
                  double largeur;
                  scanf("%lf", &largeur);
                  
                  printf("hauteur : ");
                  double hauteur;
                  scanf("%lf", &hauteur);
                  
                  double aire=aireRectangle(largeur, hauteur);
                  printf("aire : &lf\n", aire);

                  ⇒ on commence par demander la largeur du rectangle en la stockant dans une variable, tout pareil pour la hauteur, puis on calcule l'aire que l'on stocke aussi dans une variable et que l'on affiche par la suite :)

                  Hello merci pour ta réponse, excellent ça fonctionne !!! Je ne savais pas qu'on pouvait déclarer des variables n'importe où dans le main je pensais qu'il fallait les déclarer uniquement au début du programme... par contre ce n'est pas indispensable de les initialiser à 0 ?!

                  Je trouve cette façon de faire plus propre mais c'est chacun ses préférences j'imagine ? Par contre j'ai toujours des soucis pour savoir où il faut mettre un point virgule ou pas... & j'ai aussi de la peine avec le scanf j'oublie très souvent le & avant la variable, car je ne sais pas à quoi il se réfère ?!

                  Salutations !

                  • Partager sur Facebook
                  • Partager sur Twitter
                    4 avril 2021 à 6:38:56

                    Message pour débloquer cette discussion de la tête de liste …
                    • Partager sur Facebook
                    • Partager sur Twitter
                      4 avril 2021 à 23:26:03

                      Bonsoir à tous merci pour vos réponses !

                      J'ai répondu à White Crow mais mon message a été supprimé car considéré comme spam pffffffffffffff... je l'ai juste édité deux fois pour corriger des fautes d'orthographe & plus rien !!!

                      C'est frustrant !

                      • Partager sur Facebook
                      • Partager sur Twitter
                        5 avril 2021 à 6:04:54

                        ah ... pas cool

                        Admins ?

                        • Partager sur Facebook
                        • Partager sur Twitter
                          5 avril 2021 à 8:36:55

                          @Sebiohazard    Bonjour, je viens de sortir des spams votre message d'hier, si cela arrive encore vous pouvez poster dans ce sujet Si votre message est considéré comme spam

                          La modération

                          • Partager sur Facebook
                          • Partager sur Twitter
                            5 avril 2021 à 9:12:51

                            Sebiohazard a écrit:

                            Hello merci pour ta réponse, excellent ça fonctionne !!! Je ne savais pas qu'on pouvait déclarer des variables n'importe où dans le main je pensais qu'il fallait les déclarer uniquement au début du programme... par contre ce n'est pas indispensable de les initialiser à 0 ?!

                            Je trouve cette façon de faire plus propre mais c'est chacun ses préférences j'imagine ? Par contre j'ai toujours des soucis pour savoir où il faut mettre un point virgule ou pas... 

                            C'est effectivement mieux de déclarer les variables là où en a besoin. Les initialiser à 0 n'est pas nécessaire, mais c'est sans doute mieux si tu débute. En effet une variable locale (non static, mais oublie ça si tu ne sais pas ce que c'est) déclarée sans valeur initiale peut contenir n'importe quelle valeur aléatoire.
                            Il faut mettre un ; à la fin de chaque instruction.

                            Sebiohazard a écrit:

                            j'ai aussi de la peine avec le scanf j'oublie très souvent le & avant la variable, car je ne sais pas à quoi il se réfère ?!

                            En fait dans ce contexte le & signifie «adresse de», c'est un opérateur qui renvoie l'adresse mémoire de son argument.
                            Si tu donnes une variable comme paramètre à une fonction, alors seule la valeur de cette variable sera transmise, pas «la variable elle-même» ⇒ tu ne peux la modifier dans la fonction. En revanche si tu donnes une adresse tu peux modifier ce qui y est.
                            • Partager sur Facebook
                            • Partager sur Twitter
                              7 avril 2021 à 5:14:45

                              Si tu donnes une variable comme paramètre à une fonction, alors seule la valeur de cette variable sera transmise, pas «la variable elle-même» ⇒ tu ne peux la modifier dans la fonction. En revanche si tu donnes une adresse tu peux modifier ce qui y est.

                              Hello !

                              Merci pour ton aide, je viens d'apprendre cela avec le chapitre sur les pointeurs... j'avoue que cela m'est très difficile à assimiler, je galère pour comprendre l'exemple donné dans le cours avec le " Découpe heure " !!!

                              C'est frustrant car au début j'apprenais plus au moins rapidement, mais à présent (& c'est normal j'imagine) cela devient toujours plus compliqué... & j'ai toujours de la peine à savoir s'il faut une parenthèse ou un point virgule... il n'y a pas un mémo technique ?

                              Salutations !

                              • Partager sur Facebook
                              • Partager sur Twitter
                                7 avril 2021 à 5:45:49

                                Sebiohazard a écrit:

                                C'est frustrant car au début j'apprenais plus au moins rapidement, mais à présent (& c'est normal j'imagine) cela devient toujours plus compliqué... & j'ai toujours de la peine à savoir s'il faut une parenthèse ou un point virgule... il n'y a pas un mémo technique ?

                                Bah heu …

                                Tu mets des parenthèse pour encadrer la liste des arguments que tu donnes à une fonction, pour encadrer les tests dans les if/while et pour le for il y a une syntaxe précise …

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  7 avril 2021 à 11:15:06

                                  et le point virgule termine les instructions complètes, sauf quand il y a déjà une accolade fermante

                                  if (x > y) 
                                      y = x;      // il faut (fin affectation et if)
                                  
                                  if (x > y) {
                                      y = x;      // il faut ici (fin affectation)
                                  }               // pas besoin pour la fin du if
                                  
                                  



                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    8 avril 2021 à 19:13:40

                                    OK mais pourquoi ne mettrait-on pas un point virgule comme ceci:

                                    if (x > y);
                                        y = x;      // il faut (fin affectation et if)
                                     
                                    if (x > y); {
                                        y = x;      // il faut ici (fin affectation)
                                    }     

                                    Sinon concernant les pointeurs y a-t-il une autre approche car toujours aussi incompréhensible pour moi ?!

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      8 avril 2021 à 19:19:15

                                      Si tu mets un point virgule, ton if est terminé, et ne sert donc plus à rien ! L'instruction suivante sera toujours exécutée sans tenir compte du if !

                                      Les pointeurs, essais de les manipuler avec de petit exercices ! C'est en forgeant qu'on devient forgeron !

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        8 avril 2021 à 19:49:17

                                        Sebiohazard a écrit:

                                        OK mais pourquoi ne mettrait-on pas un point virgule comme ceci:

                                        if (x > y);
                                            y = x;      // il faut (fin affectation et if)
                                          

                                        Sinon concernant les pointeurs y a-t-il une autre approche car toujours aussi incompréhensible pour moi ?!

                                        1. Parce que ça serait équivalent à

                                        if (x > y) {}
                                        y = x;
                                        

                                        Explication : les structures de contrôle comportent une instruction

                                        if (condition) instruction
                                        
                                        while (condition) instruction
                                        
                                        for( instruction; condition; expression) instruction
                                         
                                        switch(expression) instruction      (*)
                                        

                                        et ces instructions peuvent être

                                        • des instructions simples (affectation, appel de fonction, etc)
                                        • un bloc avec des accolades
                                        • ou une instruction vide, terminée par un point virgule
                                        et donc
                                            if (x < y) ;
                                        qui comporte, après la condition, une instruction vide qui ne fait rien, est équivalent à
                                            if (x < y) {}

                                        un "corps", (c'est le case de la partie "else" du fi, de ce qui sera répété dans le while, de l'instruction du switch (*), ...

                                        On se sert parfois de cette particularité pour écrire des horreurs du genre

                                        for(i=0;(d[i]=s[i])!='\0';i++);

                                        mais bon, il vaut mieux éviter. Le C, c'est plein de petits symboles styles cacas de mouche, et le point-virgule à la fin de ++); n'est pas la chose la plus lisible du monde, on peut le louper facilement.

                                        Donc, préférences personnelles de style, utiliser l'espacement horizontal, et être explicite sur le fait que le corps est vide

                                        for (i = 0; (d[i] = s[i]) != '\0' ; i++) {}
                                        

                                        comme ça je ne me demande pas si j'ai mis un point virgule volontairement ou par erreur.

                                        (*) est-ce bien raisonnable d'aborder ce douloureux sujet ?

                                        corps de la boucle while,


                                        -
                                        Edité par michelbillaud 8 avril 2021 à 19:54:45

                                        • Partager sur Facebook
                                        • Partager sur Twitter

                                        Cours sur les fonctions

                                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                        • Editeur
                                        • Markdown