Partage
  • Partager sur Facebook
  • Partager sur Twitter

Ma boucle For ne tourne qu'une seule fois

Changement de base

    26 mars 2020 à 21:12:50

    Bonjour a tous, j'espère que vous allez bien!

    J'ai besoin de votre aide aujourd'hui, car je suis en train d'effectuer un programme qui nous permet de convertir un nombre d'une base comprise entre 1 et 9 vers un nombre d'une base comprise dans le même intervalle. J'en suis actuellement seulement à la phase du choix du nombre (j'ai fais une fonction dans cette phase avec comme variable "a" la base que je je test dans mon main) et je rencontre déjà un problème: La boucle for ne se lit qu'une fois ,j'ai ajouté des printf pour m'en rendre compte, la valeur de mon nombre_nouveau ne change pas.

    Mon programme tourne un peu après avoir affiché la première valeur de mon nombretest...

    Je ne comprend pas... C'est bizarre que mon for "bug" comme ça quelque soit le nombre rentré...

    Je vous joins la code au cas où quelqu'un soit enclin à m'aider :)

    #include <stdio.h>
    #include <stdlib.h>
    #include "choice_nomber.h"
    #include <math.h>
    int choicenumber(int a)
    {
        int nombre, test, longueur, nombretest,i=0,puissance,nouveau_nombre,testfor;
        do
        {
            printf("Base:%d \n",a);
            printf("Choisissez un nombre dans la base choisie au prealable \n");
            scanf("%d",&nombre);
            longueur = log10(nombre)+1;
            nombretest=nombre;
            for(i=0;i<=longueur;i++)
            {
                puissance=pow(10,(i-longueur));
                nouveau_nombre=(nombretest/puissance);
                if (nouveau_nombre>=a)
                {
                    test++;
                    nombretest=nombretest-nouveau_nombre;
                }
                else
                {
                    nombretest=nombretest-nouveau_nombre;
                }
    
            }
        }while (test>0);
        printf("Votre nombre de depart est : %d",nombre);
        return nombre;
    }
    

    -
    Edité par MuppetShow2 27 mars 2020 à 0:04:53

    • Partager sur Facebook
    • Partager sur Twitter
      27 mars 2020 à 2:04:07

      Salut,
      Dans ta ligne:
      puissance=pow(10,(i-longueur));
      longueur est toujours supérieure à 0.
      Donc, puissance devrait donner une sous-puissance de 10: 0.1, 0.01, etc.
      Mais puissance est un 'int' et vaudra donc 0.
      Donc si tu divises par puissance, tu auras n'importe quoi si ça ne plante pas.
      Pourquoi ne pas faire une petite boucle pour calculer la bonne puissance.
      Ça ira beaucoup plus vite que pow() et ça sera précis.
      • Partager sur Facebook
      • Partager sur Twitter

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

        27 mars 2020 à 9:21:40

        puissance doit être un double puisque pow renvoie un double
        • Partager sur Facebook
        • Partager sur Twitter

        Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

          27 mars 2020 à 13:50:30

          Dans le contexte actuel, il ne veut pas de double mais un int.
          C'est pourquoi je lui suggère de faire le calcul autrement.
          • Partager sur Facebook
          • Partager sur Twitter

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

            27 mars 2020 à 14:39:01

            Oui, mais comme pow donne un double ça pose problème, avec un double pour une base 6 et le nombre 541 on obtient 

            Base:6
            Choisissez un nombre dans la base choisie au préalable
            541
            0.001000
            0.010000
            0.100000
            1.000000

            (je ne sais pas si le résultat est bon !)

            alors qu'en prenant un int ça plante

            • Partager sur Facebook
            • Partager sur Twitter

            Le crayon la gomme et le papier sont les meilleurs outils du programmeur !

              27 mars 2020 à 16:17:48

              Je ne suis pas certain de la validité de son calcul. Je pensais à quelque chose du genre:
              puissance=1;  for(int j=0;j < longueur-i; j++) puissance *= 10;
              Ce serait intéressant de connaître le contenu de son entête choice_nomber.h
              edit: À quoi sert la variable 'test'. Si elle est à 0 au départ, on ne sort jamais de la boucle do ... while.
              edit2: avec ma suggestion et en enlevant l'incrémentation de test, avec 899 en base 6, j'obtient 899 ...
              En fait, le nombre lu est en binaire en mémoire. Il ne faut pas se préoccuper de la base 10, scanf l'a fait pour nous.
              Il faut plutôt afficher les digits dans la base choisie en calculant des modulo et des divisions par cette base.

              -
              Edité par PierrotLeFou 28 mars 2020 à 1:47:29

              • Partager sur Facebook
              • Partager sur Twitter

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

                28 mars 2020 à 17:54:35

                Le confinement m'a donné de l'inspiration. :)
                Voici du code qui affiche un nombre décimal dans une autre base. Je ne vérifie pas la validité de la base.
                On pourrait aller vers une base plus grande que 10 si on a suffisamment de symboles pour la base.
                Par exemple, en hexadécimal, on aurait "0123456789abcdef" (ou en majuscules).
                -
                #include <stdio.h>
                int main() {
                    int base, digit, nombre, puissance;
                    printf("base");
                    scanf("%d",&base);
                    printf("nombre");
                    scanf("%d",&nombre);
                    for(puissance = 1; puissance < nombre; puissance *= base);
                    if(nombre > 0 && puissance > nombre) puissance /= base;
                    do {
                        digit = nombre / puissance;
                        printf("%d", digit);
                        nombre %= puissance;
                        puissance /= base;
                    }while(puissance > 0);
                    printf("\n");
                    return(0);
                }
                • Partager sur Facebook
                • Partager sur Twitter

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

                  28 mars 2020 à 21:20:07

                  Et alors PierrotLeFou, on n'utilise pas les balises code? :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 mars 2020 à 22:03:57

                    (PierrotLeFou a une dispense, il ne peut pas utiliser exactement les mêmes outils que nous.)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 mars 2020 à 22:46:20

                      @zoup:
                      Mon profil te dira pourquoi
                      • Partager sur Facebook
                      • Partager sur Twitter

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

                        29 mars 2020 à 0:21:31

                        Désolé du coup, et chapeau en tout cas.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          29 mars 2020 à 4:30:42

                          J'ai essayé toutes les combinaisons de clés que ma synthèse vocale me permet et rien n'active le bouton code.
                          J'en suis rendu à tester les combinaisons de 4 clés. :)
                          Je vais bientôt manquer de doigts ...
                          • Partager sur Facebook
                          • Partager sur Twitter

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

                          Ma boucle For ne tourne qu'une seule fois

                          × 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