Programme C conversion d’une base quelconque à une autr

Fermé
Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023 - 30 sept. 2023 à 12:46
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 - 2 oct. 2023 à 14:54

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

Utilisateur anonyme
30 sept. 2023 à 13:25

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 ?


0
Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023
Modifié le 30 sept. 2023 à 13:33

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 

0
Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023 > Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023
30 sept. 2023 à 13:32

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

0
Utilisateur anonyme
30 sept. 2023 à 14:11

Et tu ne sais pas faire une division en C?


0
Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023
30 sept. 2023 à 15:05

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 

0
Utilisateur anonyme
30 sept. 2023 à 15:36

Au temps pour moi.

Passons donc au point suivant.

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


0
Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023
30 sept. 2023 à 16:22

Une lettre

0
Utilisateur anonyme > Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023
30 sept. 2023 à 17:18

Et bien non, 'A' est en fait un nombre qui vaut 65.

https://openclassrooms.com/fr/courses/19980-apprenez-a-programmer-en-c/7672681-manipulez-du-texte-avec-les-chaines-de-caracteres

Tu peux donc te servir de cette propriété pour faire en sorte que 'A' corresponde à 11 ('A' - 54 = 11), et idem pour les bases suivantes.

0
Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023 > Utilisateur anonyme
30 sept. 2023 à 17:27

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 

0
Utilisateur anonyme > Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023
30 sept. 2023 à 18:25

Pardon, faut que ça fasse 10...

Donc A -55

0
PierrotLeFou
30 sept. 2023 à 15:38

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.

0
Utilisateur anonyme
30 sept. 2023 à 15:42

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é. 

0
Sandy1233 Messages postés 7 Date d'inscription mercredi 18 septembre 2019 Statut Membre Dernière intervention 30 septembre 2023
30 sept. 2023 à 16:22

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

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

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.

0
[Dal] Messages postés 6194 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 11 octobre 2024 1 092
2 oct. 2023 à 14:54

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)".

@Sandy1233 StatutMembre

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)".

0