Partage
  • Partager sur Facebook
  • Partager sur Twitter

puissance et débutant

je suis perdu!

Sujet résolu
    10 juin 2006 à 11:03:55


    Bonjour, je commence et voilà mon code avec c-dev:

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>

    int main(int argc, char *argv[])
    {
    //Puissance = pow

    //déclarer mes variables :
    long puissance = 0, nombre = 0, exposant = 0;

    printf("saisir le nombre : \n");
    scanf("%ld",&nombre);

    printf("entrez l'exposant : \n");
    scanf("%ld", &exposant);

    //effectuer le calcul :
    puissance = pow(nombre, exposant);

    //Afficher le résultat :
    printf("%ld", puissance);

    printf("\n");

    system("PAUSE");
    return 0;
    }

    Oui c'est un exercice sur le cours du tutoriel " une bête de calcul".
    Quand je lance nombre = 2 et puissance = 2, il retourne : 4, normal.
    MAIS quand je lance nombre = 5 et puissance = 2, il affiche : 24 !!! au lieu de 25.
    Je n'y comprend rien je bute depuis 1 heure dessus.
    C'est quoi la solution ( à part aller me coucher et dormir un peu...)
    Merci pour la réponse( et oui je suis un gros zéro tout nul...).
    <couleur nom="turquoise"><couleur nom="turquoise"></couleur></couleur>
    • Partager sur Facebook
    • Partager sur Twitter
      10 juin 2006 à 11:11:23

      #include <stdio.h>
      #include <stdlib.h>
      #include <math.h>

      int main(int argc, char *argv[])
      {
      //Puissance = pow

      //déclarer mes variables :
      long puissance = 0, nombre = 0, exposant = 0;

      printf("saisir le nombre : \n");
      scanf("%ld",&nombre);

      printf("entrez l'exposant : \n");
      scanf("%ld", &exposant);

      //effectuer le calcul :
      puissance = pow(nombre, exposant);

      //Afficher le résultat :
      printf("%ld", puissance);

      printf("\n");

      system("PAUSE");
      return 0;
      }


      Edit :
      Je comprend pas !
      J'aurai fait pareil o_O
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        10 juin 2006 à 12:21:23


        puissance = nombre^exposant;


        Essaye avec ça ;)</span>

        J'ai confondu avec ma calculette :p
        [EDIT] Ca marche pas :-° , avec une simple boucle, c'est bon :
        int i=0;
        while (i+1 != exposant) {
            puissance = nombre * nombre;
            i++;
        }
        • Partager sur Facebook
        • Partager sur Twitter
          10 juin 2006 à 12:25:32

          enlevé (tu avait eut une drole d'idée acieroid)
          • Partager sur Facebook
          • Partager sur Twitter
            10 juin 2006 à 12:27:02

            Citation : acieroid


            puissance = nombre^exposant;


            Essaye avec ça ;)


            XOR ? :waw: Pourquoi ?

            Et pour le code original, il faut apprendre à configurer son compilateur :

            Project : OP code
            Compiler : GNU GCC Compiler (called directly)
            Directory : C:\dev\forums\OP\
            --------------------------------------------------------------------------------
            Switching to target: default
            Compiling: main.c
            main.c: In function `main_':
            main.c:19: warning: passing arg 1 of `pow' as floating rather than integer due to prototype
            main.c:19: warning: passing arg 2 of `pow' as floating rather than integer due to prototype
            main.c:28:2: warning: no newline at end of file
            Linking console executable: C:\dev\forums\OP\01.exe
            Process terminated with status 0 (0 minutes, 2 seconds)
            0 errors, 3 warnings


            #include <stdio.h>
            #include <stdlib.h>
            #include <math.h>

            int main(int argc, char *argv[])
            {
               //Puissance = pow

               //déclarer mes variables :
               double puissance = 0, nombre = 0, exposant = 0;

               printf("saisir le nombre : \n");
               scanf("%lf", &nombre);

               printf("entrez l'exposant : \n");
               scanf("%lf", &exposant);

               //effectuer le calcul :
               puissance = pow (nombre, exposant);

               //Afficher le résultat :
               printf("%f", puissance);

               printf("\n");

               system("PAUSE");
               return 0;
            }


            saisir le nombre :
            2
            entrez l'exposant :
            10
            1024.000000
            Appuyez sur une touche pour continuer...
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
            Anonyme
              10 juin 2006 à 12:30:57

              Citation : seb13

              enlevé (tu avait eut une drole d'idée acieroid)



              Je suis sûr d'avoir déjà utilisé une instruction du genre (nombre**exposant) , mais ça doit pas être en C, peut être en python.

              Au fait, si la fonction pow() déconne( ce qui doit pas être le cas ) , écrit toi même la fonction qui permet de calculer une exponantiation

              !!! pow(5,2) renvoie bien 25 !!!
              • Partager sur Facebook
              • Partager sur Twitter
                10 juin 2006 à 13:54:18

                double pow(double x, double y);


                Bien que -ed- est bien mis des doubles c'est peut-être passé inapercu alor voilà le proto de la fonction il faut des variables de types double te non long !
                • Partager sur Facebook
                • Partager sur Twitter
                  10 juin 2006 à 14:05:10

                  Citation : Acieroid

                  !!! pow(5,2) renvoie bien 15 !!!


                  Ca alors o_O
                  On m'a tours dit que c'est 25 (Errare humanum est)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    10 juin 2006 à 14:15:04

                    Citation : acieroid

                    !!! pow(5,2) renvoie bien 15 !!!


                    J'ai 25 ici, hein :D

                    robert67, ici ton code marche, aux warnings à la compilation près.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      10 juin 2006 à 14:36:30

                      Citation : remram44

                      Citation : acieroid

                      !!! pow(5,2) renvoie bien 15 !!!


                      J'ai 25 ici, hein :D



                      Ouais, c'est une bête erreur de frappe... :p

                      C'est ma journée des erreurs aujourd'hui, désolé :-°
                      • Partager sur Facebook
                      • Partager sur Twitter
                        10 juin 2006 à 19:13:59

                        Bon j'ai essayé avec double et %lf : ça marche.
                        Mais avec long, int et %ld impossible je n'y comprend absolument rien...
                        J'ai toujours 5 ^2 = 24!!!
                        j'utilise devcpp la version : 4.9.9.2.
                        Avec la calculette de windows ça fonctionne 5 ^2 = 25, un comble non!!
                        • Partager sur Facebook
                        • Partager sur Twitter
                          10 juin 2006 à 19:23:57

                          Il me semble que -ed- et Pierre89 avaient étés clair. Pour utilisé la fonction pow() tes variables doivent être des doubles. Maintenant si tu la veut avec des int tu n'as qu'a la recoder
                          • Partager sur Facebook
                          • Partager sur Twitter
                            10 juin 2006 à 19:33:47

                            Bon ok ben on va mettre des variables doubles.
                            M'enfin je trouve cela curieux, mais bon moi je suis le debutant moyen hein.
                            Je vais passer à la suite du cours...
                            Merci pour la solution, et à bientôt pour de nouvelles aventures en C...
                            • Partager sur Facebook
                            • Partager sur Twitter
                              10 juin 2006 à 21:22:56

                              Citation : robert67

                              Bon j'ai essayé avec double et %lf : ça marche.
                              Mais avec long, int et %ld impossible je n'y comprend absolument rien...
                              J'ai toujours 5 ^2 = 24!!!


                              C'est probablement parce que 2^5 fait 24.999999 qui est tronqué en 24 quand il passe en int ou en long. Je t'ai pourtant déjà indiqué de travailler en double exclusivement. Si je parle aux murs, dit le moi et j'arrête de perdre mon temps...
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                10 juin 2006 à 21:43:14

                                T'as aussi powf() pour les floats, on sait jamais, comme t'as pas l'air de lire la doc je te le dis.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  10 juin 2006 à 21:44:49

                                  Citation : remram44

                                  T'as aussi powf() pour les floats, on sait jamais, comme t'as pas l'air de lire la doc je te le dis.


                                  C99 uniquement.
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Music only !
                                    10 juin 2006 à 22:14:57

                                    En passant j'avais aussi ce bug là, toujours a puissance affichée mais une unité en dessous, j'ai plus utilisé pow depuis (je fais nombre*nombre ca marche mieux :D )
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      10 juin 2006 à 22:16:31

                                      Si tu tien à utiliser des int, tu peut faire :
                                      int main (int argc, const char * argv[])
                                      {
                                              int nombre = 5, exposant = 2, resultat;
                                             
                                              resultat = (int)pow((double)nombre, (double)exposant);
                                              printf("%d^%d = %d\n", nombre, exposant, resultat);
                                             
                                              return 0;
                                      }

                                      On convertis les nombre donnés à Pow pour que ce soit des double, et on converti ce que renvoie Pow en int pour le mettre dans un int.

                                      ^^

                                      EDIT: En fait tu utilisait des long, pas des int excuse-moi !!
                                      Mais ce que j'ai dit reste valable !! (conversion avec "(type)")

                                      Salut !!
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        10 juin 2006 à 22:28:05

                                        Citation : N1gHtm@r3

                                        En passant j'avais aussi ce bug là, toujours a puissance affichée mais une unité en dessous, j'ai plus utilisé pow depuis


                                        C'est absurde.

                                        Il est vrai que pour travailler en entier, on a pas besoin de pow(), mais ça, on le savait déjà !

                                        long powl (long mant, unsigned long exp)
                                        {
                                           long res = mant;
                                           unsigned long i;

                                           for (i = 0; i < exp); i++)
                                           {
                                              res *= mant;
                                           }
                                           return res;
                                        }
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Music only !
                                          11 juin 2006 à 7:24:17

                                          Bon précision : je lis la doc.
                                          Si,non mais...
                                          Mais :
                                          code:
                                          1) robert67 est débutant, hein;
                                          2) robert67 est ch...r, oui;
                                          3) robert67 aurait bien aimé avoir pow( avec des long (" Baffe, aïe...");
                                          OK c'est résolu et ce matin je suis sur les booléens...
                                          Ouais y en a qui vont souffrir avec moi sur le forum...
                                          Je les plains, sincèrement je les plains... :D
                                          Merci à tous ceux qui ont pris la peine de me répondre.
                                          A bientôt hein?!
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            11 juin 2006 à 7:27:56

                                            A bientot ? o_O
                                            Houla je me deconnecte tout de suite, j'ai peur de voir ça.
                                            :p:o
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              11 juin 2006 à 17:19:55

                                              Bouh, ya une erreur dans le code de -ed- :) , ça prend pas le cas où l'exposant vaut 0.

                                              Bah, sinon, j'te montre une autre manière de calculer la puissance, qui utilise le principe "Diviser pour régner".
                                              Là on va utiliser le fait que si n s'écrit sous la forme 2*k, x^n = (x^k)^2,
                                              et si n s'écrit sous la forme (2*k)+1, x^n = x * (x^k)^2.

                                              Ca permet de rendre le calcul plus rapide, au lieu de n multiplication, on passe à genre la partie entière de log2(n) (en base 2).

                                              Récursif (le code itératif est bien moins évident à comprendre).

                                              long powl(long a, unsigned long exp)
                                              {
                                                  if (exp == 0)
                                                      return 1;
                                                  else
                                                  {
                                                      long res = powl(a, exp/2);

                                                      if (exp % 2 == 0)
                                                          return res * res;
                                                      else
                                                          return res * res * a;
                                                  }
                                              }


                                              Donc, si tu calcule 2^32, tu n'auras que 5 multiplications à faire au lieu de 32.
                                              Bon sur une fonction comme ça, ça change pas grand chose, mais c'est pour te montrer une autre manière de résoudre un problème.

                                              Tiens, un cours sur "Diviser pour régner" sur le site, ce serait bien nan ?
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                11 juin 2006 à 18:01:47

                                                Citation : HanLee

                                                Bouh, ya une erreur dans le code de -ed- :) , ça prend pas le cas où l'exposant vaut 0.


                                                J'avoue que je n'ai pas testé. Ca devrait retourner 1, ça le fait pas ? OK, petit bug...

                                                #include <stdio.h>

                                                long powl (long mant, unsigned long exp)
                                                {
                                                   long res = 1;
                                                   unsigned long i;

                                                   for (i = 0; i < exp; i++)
                                                   {
                                                      res *= mant;
                                                   }
                                                   return res;
                                                }

                                                int main()
                                                {
                                                   int mant;

                                                   for (mant = -2; mant < 4; mant++)
                                                   {
                                                      unsigned exp;

                                                      for (exp = 0; exp < 5; exp++)
                                                      {
                                                         printf ("%5ld", powl (mant, exp));
                                                      }
                                                      printf ("\n");
                                                   }
                                                   return 0;
                                                }


                                                    1   -2    4   -8   16
                                                    1   -1    1   -1    1
                                                    1    0    0    0    0
                                                    1    1    1    1    1
                                                    1    2    4    8   16
                                                    1    3    9   27   81

                                                Press ENTER to continue.
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Music only !
                                                  12 juin 2006 à 16:21:05

                                                  #include <stdio.h>

                                                  int main()
                                                  {
                                                  printf("Hello World!");
                                                  return 0;
                                                  }
                                                  Pourquoi on met pas ce code la au debut du cour
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    12 juin 2006 à 16:34:06

                                                    Citation : tomexodia


                                                    #include <stdio.h>

                                                    int main()
                                                    {
                                                    printf("Hello World!");
                                                    return 0;
                                                    }
                                                    Pourquoi on met pas ce code la au debut du cour



                                                    -> Gnè ? j'ai pas trés bien compris
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      12 juin 2006 à 18:09:34

                                                      Je ne comprends pas bien là question o_O

                                                      M@téo fait un exemple avec 'Bonjour !' : ça revient au même hein seulement on a traduit :p !!!



                                                      De plus aucun rapport avec le topic !
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        12 juin 2006 à 23:59:59

                                                        Citation : tomexodia

                                                        #include <stdio.h>

                                                        int main()
                                                        {
                                                        printf("Hello World!");
                                                        return 0;
                                                        }
                                                        Pourquoi on met pas ce code la au debut du cour


                                                        Ce code est correct mais son effet n'est pas portable...

                                                        #include <stdio.h>

                                                        int main()
                                                        {
                                                           printf("Hello World!\n");
                                                           return 0;
                                                        }
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                        Music only !
                                                          13 juin 2006 à 17:14:25

                                                          Pourquoi pas portable ?
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            13 juin 2006 à 17:56:58

                                                            Quand à sa portabilité, je ne sait pas ; en tout cas, il ne respect pas la norme, qui ne spécifie que deux prototypes valides pour la fonction main :
                                                            int main ( void )
                                                            et
                                                            int main ( int argc, char *argv[ ] )


                                                            Il est même probable qu'un compilateur C++ le refuse. Il me semble qu'en C++ les paramètres de fonction sont obligatoires (à vérifier).
                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              13 juin 2006 à 20:21:43

                                                              Citation : Pierre89

                                                              Pourquoi pas portable ?

                                                              printf("Hello World!");



                                                              Parce qu'il manque le \n en fin de ligne. Les caractères pourraient très bien ne jamais sortir... On pourrait forcer avec fflush (stdout)...

                                                              http://mapage.noos.fr/emdel/notes.htm#fflush_stdout

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter
                                                              Music only !

                                                              puissance et débutant

                                                              × 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