Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment mettre un nombre dans un tableau?

c'est pas facile comme vous croyer !

Sujet résolu
    28 mars 2008 à 13:35:41

    Bonjour,
    je vais vous casser la tête un peu ! une question qui me dérange souvent dans ces derniers jours :o
    est-ce quelqu'un peut me dire comment peut on décomposer un entier dans un tableau ?
    exp :
    n = 176 ---> le programme doit le mettre dans un tableau t ---> t[0] = 1, t[1] = 7, t[2] = 6
    n= 1009 ---> le prog doit le mettre ds 1 tableau d'entiers :
    t[0] = 1, t[1] = 0, t[2] = 0, t[3] = 9.
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      28 mars 2008 à 13:51:39

      Tout nombre est composé d'unité, de dizaine, de centaine, ...

      176 / 100 (divison entière) = 1 ,
      ( 176 - 100 * 1 ) / 10 (division entière) = 7 ,
      ...
      • Partager sur Facebook
      • Partager sur Twitter
        28 mars 2008 à 14:01:12

        Que dirais-tu de transformer ton nombre en chaine de caractères (en utilisant ttos<T>() ) et de changer chaque caractère en nombre dans ton tableau (en utilisant la technique inverse : stot<T>() )... C'est efficace et facile à coder!
        • Partager sur Facebook
        • Partager sur Twitter
          28 mars 2008 à 14:22:20

          Il y a peut-être plus simple mais voici ce que je ferais :

          1. #include <iostream>
          2. #include <math.h>
          3. int* decompose(int);
          4. int main (int argc, char * const argv[]) {
          5.         int* decomposedValue = decompose(12345678);
          6.         return 0;
          7. }
          8. int* decompose(int value) {
          9.         long size=0,result=1;
          10.         while(result!=0) {
          11.                 result = floor(value/pow(10,size+1));
          12.                 size++;
          13.         }
          14.         int *tab = new int[size];
          15.         for(int i=0;i<size;i++) {
          16.                 tab[i] = floor(value/pow(10,size-(i+1)))-floor(value/pow(10,size-i))*10;
          17.                 std::cout << "tab["<< i << "] = " << tab[i] << std::endl;
          18.         }
          19.         return tab;
          20. }

          Citation : Console C++


          tab[0] = 1
          tab[1] = 2
          tab[2] = 3
          tab[3] = 4
          tab[4] = 5
          tab[5] = 6
          tab[6] = 7
          tab[7] = 8




          J'ai mis le code dans une fonction pour que ce soit plus pratique. La fonction prend un entier en paramètre et retourne un tableau contenant l'entier décomposé.
          Bon courage ;)
          • Partager sur Facebook
          • Partager sur Twitter
            28 mars 2008 à 14:51:51

            m'ouais... c'est long mais c'est fonctionnel! il manque juste un delete []!

            avec ttos:

            1. #include <iostream>
            2. #include <string>
            3. #include <vector>
            4. // déclarer ou inclure ttos et stot
            5. void decompose( int nombre, std::vector<int> & v )
            6. {
            7.     std::string s = ttos( nombre );
            8.     if( s.length() > 0 )
            9.         v.clear();
            10.     for( size_t i = 0; i < s.length(); i++ )
            11.         v.push_back( stot<int>( ttos( s[ i ] ) ) );
            12. }
            13. int main()
            14. {
            15.     std::vector<int> tableau;
            16.     decompose( 123456789, tableau );
            17.     for( size_t i = 0; i < tableau.size(); i++ )
            18.         std::cout << "[" << (i + 1) << "] " << tableau[ i ] << std::endl;
            19.     return 0;
            20. }
            • Partager sur Facebook
            • Partager sur Twitter
              28 mars 2008 à 22:59:09

              Mais, je comprends pas cette histoire de floor, pow et value ? o_O
              • Partager sur Facebook
              • Partager sur Twitter
              Anonyme
                28 mars 2008 à 23:04:47

                Citation : hiura

                Tout nombre est composé d'unité, de dizaine, de centaine, ...

                176 / 100 (divison entière) = 1 ,
                ( 176 - 100 * 1 ) / 10 (division entière) = 7 ,
                ...

                • Partager sur Facebook
                • Partager sur Twitter
                  29 mars 2008 à 14:24:36

                  <information>information>Après une petite réflexion faite ( entre nous : 3 jours :p ), j'ai arrivé à mon résoudre notre fameux problème :
                  voici le programme :

                  /* Algorithme utilisée :
                  1+ je saisie mon entier n.
                  2+ diviser n par 1 ----> si le reste de la division est > 10 ----> diviser n par 10 ----> si encore le
                  reste > 10 ----> diviser n par 100, est le cycle se continue ...
                  3+ une fois le reste est < 10 ----> le quotient de la division est enregistré dans la case convenable
                  de mon tableau.

                  S'il y encore d'ambiguité, voici un exemple clair :
                  je prends n = 136 :
                  136/ 1 = 136 > 10 ( reste = 0 )
                  136/ 10 = 13 > 10 ( reste = 6)
                  136/ 100 = 1 < 10 (reste = 36) ----> t[0] = 1

                  le reste mnt ( 36 ) devient notre nouveau nombre ( r = n) est l'algorithme se poursuit */


                  #include <iostream>

                  using namespace std;

                  int main()
                  {

                  cout << " n=\t" ;
                  int nbr;
                  cin >> nbr;

                  int *t= new int[20]; // j'ai choisi d'initialiser tous les elements du tableau à zéro
                  for ( int i=0; i< 20; i++)
                  t[i]= 0;
                  int i= 1,n=0,q,r,s=1; /* q : ---> le quotion de division
                  r :----> le reste de division
                  s :----> taille de nombre n, exp : n = 1976 ----> s = 4 */

                  bool var = true;
                  do
                  {

                  do
                  {
                  q= nbr/i;
                  if ( q >= 10 )
                  {
                  i*=10;
                  if (var)
                  ++s;
                  }
                  } while ( q >= 10);

                  var = false;
                  r= nbr%i;
                  t[n++]= q;
                  int copy_r = r;
                  do

                  while ( (r == 0 and n < s) or ( copy_r < i/10) )
                  {
                  n++;
                  i/=10; /* cette boucle ne sara active que dans le cas où n contient
                  des zeros : exp : n= 200, n= 1027, etc ... */
                  }

                  copy_r= i/10; // j'ai utilisé copy_r pour ne pas modifier r
                  }

                  while ( copy_r > i );
                  nbr=r;
                  i=1;
                  } while ( n!= s);



                  for (int j=0; j< n; ) /* on peut faire aussi : for ( int j = 0; j < n; j++)
                  cout << t[j] << endl; */
                  cout << t[j++] << endl;

                  system (" pause");
                  return 0;
                  }
                  // le programme ça marche parfaitement, vous pouvez tester peu importe cas ! ;)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    29 mars 2008 à 14:33:26

                    Les balises... http://www.siteduzero.com/forum-83-209750-p1-charte-regles-de-ce-forum.html

                    Citation : hiura

                    Citation : hiura

                    Tout nombre est composé d'unité, de dizaine, de centaine, ...

                    176 / 100 (divison entière) = 1 ,
                    ( 176 - 100 * 1 ) / 10 (division entière) = 7 ,
                    ...


                    Citation : toto_2405

                    S'il y encore d'ambiguité, voici un exemple clair :
                    je prends n = 136 :
                    136/ 1 = 136 > 10 ( reste = 0 )
                    136/ 10 = 13 > 10 ( reste = 6)
                    136/ 100 = 1 < 10 (reste = 36) ----> t[0] = 1

                    Tu ne vois pas la différence?

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 mars 2008 à 14:47:05

                      Bonne remarque "Hiura", cependant, j'ai essayé de le mettre sous le code C++, mais je ne savais pas comment !
                      le programme ci-dessus est compilé dans le Dev C++, et sous Windows XP.
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Anonyme
                        29 mars 2008 à 14:52:03

                        Tu as lu les règles avant de dire ça?
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 mars 2008 à 15:35:14

                          comme j'avais dis : je travaille sous le compilateur Dev C++, sous Windows (Xp)
                          voici le programme : ;)
                          1. /* Algorithme utilisée :
                          2.               1+ je saisie mon entier n.
                          3.               2+ diviser n par 1 ----> si le reste de la division est > 10 ----> diviser n par 10 ----> si encore le
                          4.                  reste > 10 ----> diviser n par 100, est le cycle se continue ...
                          5.               3+ une fois le reste est < 10 ----> le quotient de la division est enregistré dans la case convenable
                          6.                  de mon tableau.
                          7.   S'il y encore d'ambiguité, voici un exemple clair :
                          8.          je prends n = 136 :
                          9.                    136/ 1   = 136 > 10      ( reste = 0 )
                          10.                    136/ 10  = 13  > 10      ( reste = 6)
                          11.                    136/ 100 = 1   < 10      (reste = 36)   ----> t[0] = 1
                          12.          le reste mnt ( 36 ) devient notre nouveau nombre ( r = n) est l'algorithme se poursuit    */
                          13. #include <iostream>
                          14. using namespace std;
                          15. int main()
                          16. {
                          17.     cout << " n=\t" ;
                          18.     int nbr;
                          19.     cin >> nbr;
                          20.     int *t= new int[20];             //   j'ai choisi d'initialiser tous les elements du tableau à zéro
                          21.     for (  int i=0; i< 20; i++)
                          22.      t[i]= 0;    
                          23.     int i= 1,n=0,q,r,s=1;           /* q : ---> le quotion de division
                          24.                                        r :----> le reste   de division
                          25.                                        s :----> taille de nombre n, exp : n = 1976 ----> s = 4    */
                          26.     bool var = true;            
                          27.     do
                          28.      {
                          29.           do
                          30.              {
                          31.                 q= nbr/i;
                          32.                 if ( q >= 10 )
                          33.                 {
                          34.                  i*=10;                
                          35.                  if (var)  
                          36.                  ++s;
                          37.                 }
                          38.               } while ( q >= 10);
                          39.         var = false;
                          40.         r= nbr%i;
                          41.         t[n++]= q;
                          42.         int copy_r = r;
                          43.         do
                          44.           while ( (r == 0 and n < s) or ( copy_r < i/10) )
                          45.           {
                          46.             n++;
                          47.             i/=10;                          /* cette boucle ne sara active que dans le cas où n contient
                          48.                                                des zeros : exp : n= 200, n= 1027, etc ...                 */
                          49.             }
                          50.             copy_r= i/10;                   // j'ai utilisé copy_r pour ne pas modifier r
                          51.           }
                          52.         while ( copy_r > i );
                          53.         nbr=r;
                          54.         i=1;
                          55.      } while ( n!= s);
                          56.     for (int j=0; j< n;   )              /* on peut faire aussi : for ( int j = 0; j < n; j++)
                          57.                                                cout << t[j] << endl;    */
                          58.       cout << t[j++] << endl;
                          59.     cin.get();
                          60.     cin.get();
                          61.     return 0;
                          62. }
                          • Partager sur Facebook
                          • Partager sur Twitter
                            29 mars 2008 à 16:30:55

                            Citation

                            Mais, je comprends pas cette histoire de floor, pow et value ? o_O


                            floor sert à arrondir une valeur à l'entier inférieur :
                            floor(123.7) = 123

                            Pour arrondir à l'entier supérieur :
                            ceil(123.7)=124

                            pow veut dire power, ça sert donc à faire des puissances :
                            pow(10,5) = 10 puissance 5
                            pow(5,2) = 5 au carré

                            Pour ce qui est de value, dans mon code c'est seulement une variable (le paramètre de la fonction), ça veut dire valeur.

                            Quelques conseils (les personnes plus expérimentées peuvent me reprendre ^^ ) :

                            Tu créé un tableau de taille 20, que se passera-t-il si le nombre choisi est superieur à 100000000000000000000?

                            "/* on peut faire aussi : for ( int j = 0; j < n; j++)
                            cout << t[j] << endl; */"
                            Adopte cette solution, c'est plus clair.

                            Evite d'utiliser le mot "var" comme nom de variable, en C++ ça va mais dans certains langages c'est un mot clé, ç'est une mauvaise habitude, si un jours l'envie te prend de t'essayer à un de ces langages.

                            Ton algorithme est très lourd, étudie le code de MatteX (ou au pire, si tu préfère quand même la méthode mathématique, le mien ^^ ).





                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 mars 2008 à 17:38:02

                              hiura a donné la bonne piste. C'est le cœur des algos utilisé pour les conversions nombre -> chaine (en basse quelconque dont 10)
                              Pas besoin de sortir des trucs compliqués.
                              1. std::vector<unsigned char> toTab(unsigned int n, unsigned int base=10)
                              2. {
                              3.     std::vector<unsigned char> res;
                              4.     // éventuellement res.reserve(opération savante à base de log_{base}(n));
                              5.     do {
                              6.        res . push_back(n%base);
                              7.     } while (n /= base) ;
                              8.     return std::vector<unsigned char>(res.rbegin(), res.rend());
                              9. }
                              • Partager sur Facebook
                              • Partager sur Twitter
                              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                                29 mars 2008 à 18:17:05

                                Citation : xs_yann


                                "/* on peut faire aussi : for ( int j = 0; j < n; j++)
                                cout << t[j] << endl; */"
                                Adopte cette solution, c'est plus clair.

                                Ton algorithme est très lourd, étudie le code de MatteX (ou au pire, si tu préfère quand même la méthode mathématique, le mien ^^ ).


                                Un grand Merci xs_yann pour tes explications concernant "floor" et "pow", tes remarques étaient vraiment pertinentes :-°
                                Bon courage
                                • Partager sur Facebook
                                • Partager sur Twitter

                                comment mettre un nombre dans un tableau?

                                × 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