Programme C conversion d’une base quelconque à une autr

Bonjour à tous et merci de me lire.

En cours, nous faisons la représentation de l’information. En faisant des conversions d’une base à une autre, je remarque que l’on passe souvent par la base décimale. Je me suis donnée cette consigne : écrire un programme en C qui effectue les conversions d’un nombre base donnée a à une base donnée b sans passer par le système décimal, en suivant le principe des divisions euclidiennes(soustractions successives)

Ça fait 5 jours mais je n’ai pas d’idées . Voici les problèmes que je rencontre:

-deja à partir de la base 11 on a le A qui entre en jeu et je ne sais vraiment pas comment je vais prendre en compte tout ca dans mon programme…

- Les signes lors des soustractions et les soustractions elles mêmes

De plus, je ne connais que les bases du C. S’il vous plaît si je pouvais avoir une proposition de code ainsi que le principe de fonctionnement ca m’aiderait énormément. J’ai également cherché sur internet mais je ne suis tombée sur rien qui aurait pu m’aider. 
Merci bien

6 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour 

    Est ce que déjà en utilisant le principe des divisions euclidiennes, tu serais passer 15A en base 11 à sa valeur en base 7 (par exemple).

    Et si oui, peux tu décrire comme tu fais ?


    1. J’utilise des soustractions successives. Je ferai 15A-7 autant de fois jusqu’à ce que ça devienne négatif et la dernière valeur non négative est le reste et le nombre de soustractions effectuées est le quotient.

      Puis prochaine opération consiste à faire ces soustractions entre le précédent quotient et 7 ainsi de suite.

      c’est implémenter ces opérations de soustractions et le mélange de lettres et chiffres etc qui me semblent compliqués 

      merci 

    2. @Sandy1233

      La soustraction sera effectuée en base 11(base de départ)

  2. Et tu ne sais pas faire une division en C?


    1. Les problème que l’arithmétique change. Si je veux faire 1+1 en base 2 ça fait 10 mais 2 en base 10.

      en codant en C je devrais redéfinir toutes les règles d’addition et soustractions en une quelconque base et là est le problème 

  3. Au temps pour moi.

    Passons donc au point suivant.

    En C 'A' c'est une lettre ou un nombre?


    1. Une lettre

    2. @Utilisateur anonyme

      A-54=11?

      je vois que 65-54 vaut 11 mais en quoi ça me servirait

      en réalité je vois bien le principe mais l’implémentation en elle même me dérange 

      si quelqu’un aurait un code à proposer s’il vous plaît   
      merci beaucoup 

    3. @Sandy1233

      Pardon, faut que ça fasse 10...

      Donc A -55

  4. On parle de la "représentation" des nombres dans une base donnée.
    La représentation, c'est pour la commodité des humains. L'ordi n'en a rien à foutre de la représentation.
    On peut dire par abus de langage que la représentation "interne" est "binaire" (ou base 2).
    La représentation se fait sous forme de "symboles" ou caractères.
    Ainsi le "nombre" 43 vaut 4*10+3 en base 10, 4*11+3 en base 11, et 4*7+3 en base 7
    Et 15A en base 11? 1*11^2 + 5*11^1 + ... et le A?
    On est habitué de confondre le nombre avec le symbole. Ainsi le symbole '9' vaut 9 comme nombre.
    Il y a 10 symboles en base 10: "0123456789". Mais comme par hasard, la position du symbole correspond au nombre.
    En base 11, il y a 11 symboles: "0123456789A"
    Pour convertir 15A de la base 11 vers la "base" interne, je dois chercher la position du symbole '1', puis '5', puis 'A'
    Ce sera 1, 5, et 10. Donc 15A vaut 1*11^2+5*11+10
    Ensuite convertir 43 de la base interne (faut bien l'exprimer ...) en base 11, tu dis que tu fais:
    43 - 11 = 32 - 11 = 21 - 11 = 10
    Et si je faisais 43 / 11 = 3 et 43 % 11 = 10?J'irais chercher le 3ième symbole de la table soit '3' et le 10ième symbole soit 'A' de la table. Donc 43 vaut 3A en base 11.
    Le principe est d'abord de convertir d'une représentation d'une base vers la forme interne, puis de la forme interne vers l'autre base.

    1. Pas le bonjur à toi non plus

      je te rappelle l'énoncé

      écrire un programme en C qui effectue les conversions d’un nombre base donnée a à une base donnée b sans passer par le système décimal,en suivant le principe des divisions euclidiennes(soustractions successives)

      Certes j'ai zappé que la division doit se faire dans la base de départ, mais au moins je ne lui ai pas proposé de faire ce qui est clairement interdit par son énoncé. 

    2. Non On en souhaite pas passer par une base intermédiaire. On veut que le programme puisse directement convertir d’une base à une autre

  5. Je ne dis pas de passer en décimal mais sous forme interne.

    Bonne chance si tu veux passer directement de la base 3 vers la base 16.

    Ça te prend le nombre au complet pour convertir.

    1. Contributeur

      Bonjour à tous,

      Je suis assez d'accord avec Pierrot.

      Si on ne peut pas stocker la valeur numérique dans un type du langage C,  on va au devant de quelque chose de très compliqué et tu ne pourras pas utiliser les opérateurs du C pour faire des "divisions euclidiennes(soustractions successives)".

      Je me suis donnée cette consigne : écrire un programme en C qui effectue les conversions d’un nombre base donnée a à une base donnée b sans passer par le système décimal, en suivant le principe des divisions euclidiennes(soustractions successives)

      C'est toi même qui t'es donnée cette consigne ?

      En théorie, cela suppose de fournir un nombre en entier au programme dans une base donnée, et d'obtenir en résultat un nombre dans une autre base.

      Cependant, concrètement, cela suppose en réalité, pour le programme C, de lui fournir une chaîne de caractères, qu'il va devoir interpréter comme étant un nombre.

      En tu sais quoi ? Pour convertir n'importe qu'elle chaîne de caractères représentant un nombre entier de n'importe quelle base de 2 à 36 en un entier, il y a déjà des fonctions standard dans le langage C, notamment : strtol().

      https://cplusplus.com/reference/cstdlib/strtol/

      Le résultat est stocké dans un long int (comme le dit Pierrot, on s'en fiche de savoir comment).

      Il ne reste plus que le problème d'affichage, car la fonction standard printf() ne sais gérer que le décimal, l'octal et l'hexadécimal.

      Cependant, cela n'est plus un problème très compliqué, et là aussi Pierrot a donné des indications, et une fois que ton nombre est dans un type long int, tu peux lui appliquer tes "divisions euclidiennes(soustractions successives)".