Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3289 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Programmation d'un convertisseur décimal en binaire

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Programmation d'un convertisseur décimal en binaire

n°2159036
ibersek
Posté le 03-10-2012 à 19:11:39  profilanswer
 

Bonjour,
 
Dans les cadre de mes études, je dois réaliser un petit programme en programmation C.
 
Voici la donnée:
http://i31.servimg.com/u/f31/17/81/26/62/sans_t10.jpg
 
 
J'arrive à effectué un printf ou un scanf pour afficher ou lire du texte mais je n'ai pas la moindre idée pour effectuer les conversions. Petite info, je suis à la leçon zéro en programmation... mais je veux apprendre!!!
 
Quelqu'un me pourrait me renseigner ? C'est assez urgent svp.
 
iBersek


Message édité par ibersek le 03-10-2012 à 19:12:13
mood
Publicité
Posté le 03-10-2012 à 19:11:39  profilanswer
 

n°2159040
Farian
Posté le 03-10-2012 à 20:18:33  profilanswer
 

Bonjour !
 
Pour effectuer les conversions, posez-vous la question suivante : Comment le ferais-je sur papier ?
 
C'est assez simple, le dernier chiffre (le plus à droite dans l'écriture habituelle), est égal au reste de la division du nombre par la base (p. ex : le reste de la division par 4 de 235 vaut 3, donc le dernier chiffre est un 3).
 
Pour les autres chiffres, c'est le même principe : dans l'exemple donné, le chiffre suivant sera le reste de la division de ((235 -3)/4) par 4, soit le reste de la division de 58 par 4, soit 2.
 
Et ça continue, encore et encore :)
 
Je vous laisse le soin d'écrire un algorithme détaillé, puis de l'implémenter en tenant compte des points suivants :  
* L'opérateur "modulo" est "%"
* La division d'un entier par un entier est un entier, donc, en C, 235/4 ne vaut pas 58,75 mais 58.
 
Si vous avez des soucis pour finaliser votre algorithme, postez votre avancement, et nous verrons comment vous fournir des indices supplémentaires !
 
Note : n'oubliez pas la gestion des cas d'erreur en cas de saisie de valeurs incorrectes !
 
Note : L'énoncé est surprenant pour trois raisons :  
 
  * Les nombres sont écrits "à l'envers",
  * Pourquoi mettre des "0" inutiles à la fin ?
  * Parler de "bits" pour des chiffres d'une base comprise entre 2 et 16 est clairement un abus de langage ! Un bit (binary digit) vaut 0 ou 1 !!

n°2159042
ibersek
Posté le 03-10-2012 à 20:24:26  profilanswer
 

Je vais réfléchir à tout cela et je posterai mon avancement (ou mes questions  :) ) dès que possible.
 
Merci Farian  :D

n°2159054
ibersek
Posté le 03-10-2012 à 22:35:19  profilanswer
 

Sur le principe, avec 235, il s'agirait de faire :
 
235%4= 3
(235/4)%4 = 2
((235/4)/4)%4 = 2
(((235/4)/4)/4) = 3
 
Soit 235 en base 10 => 3223 en base 4
 
Mais après cela, je ne sais pas trop dans quelle direction continuer parce que :
 
Comment savoir le nombre de "calcul" que je dois programmer ? Parce que là, j'ai un nombre à 4 chiffres (3223) mais peut-être qu'avec un autre j'en aurai 5 ou plus, je devrais continuer ((((y/x)/x)/x)/x)/x)%x etc... et en plus, pour le dernier chiffre je n’utilise pas le modulo. Soit : (((235/4)/4)/4) = 3

n°2159058
Terminapor
I'll see you rise.
Posté le 03-10-2012 à 23:04:36  profilanswer
 

Si c'est ça la technique, dans ce cas une simple boucle for suffit :??:


---------------
Perhaps you don't deserve to breathe
n°2159061
Farian
Posté le 04-10-2012 à 00:04:55  profilanswer
 

ibersek a écrit :

Sur le principe, avec 235, il s'agirait de faire :
 
235%4= 3
(235/4)%4 = 2
((235/4)/4)%4 = 2
(((235/4)/4)/4) = 3
 
Soit 235 en base 10 => 3223 en base 4
 
Mais après cela, je ne sais pas trop dans quelle direction continuer parce que :
 
Comment savoir le nombre de "calcul" que je dois programmer ? Parce que là, j'ai un nombre à 4 chiffres (3223) mais peut-être qu'avec un autre j'en aurai 5 ou plus, je devrais continuer ((((y/x)/x)/x)/x)/x)%x etc... et en plus, pour le dernier chiffre je n’utilise pas le modulo. Soit : (((235/4)/4)/4) = 3


 
Justement vous n'avez pas à savoir à l'avance le nombre d'étapes ... Tant que le nombre est positif, vous ajoutez un chiffre qui est le modulo, vous divisez le nombre par la base et vous recommencez, et cela finit par s'arrêter tout tranquillement.
 
Il ne reste plus qu'à implémenter cet "algorithme", tranquillement, en faisant attention quand vous travaillez dans une base supérieure à 10, pour le "chiffre" que vous ajoutez.

n°2159125
ibersek
Posté le 04-10-2012 à 14:39:34  profilanswer
 

Voilà ce que cela me donne :
 
http://i31.servimg.com/u/f31/17/81/26/62/sans_t11.jpg
 
Est-ce que l'écriture est "propre, claire et compréhensible" ? Je suis surtout jugé sur le clarté du code.
 
Ensuite, la conversion devrait être valable pour de valeurs non-signée. Cela signifie quoi ?

n°2159131
Terminapor
I'll see you rise.
Posté le 04-10-2012 à 14:58:05  profilanswer
 

Ben, non ça va pas..  
Il faut que ton code soit optimisé, en gros le code doit changer en fonction de la base. Non-signé ça veut dire pas de nombres négatif, en gros tu te prends pas la tête avec ça :D


---------------
Perhaps you don't deserve to breathe
n°2159193
ibersek
Posté le 04-10-2012 à 19:20:18  profilanswer
 

le code doit changer en fonciton de la base ? késako ?
 
Je dois utiliser que le printf et scanf,  je n'ose pas utiliser une boucle ou utiliser d'autre fonction. D'ailleur je ne sais  même pas ce que c'est^^
 
Il y a quoi exactement qui ne joue pas dans mon code ? Quand je test tout fonctionne correctement.

n°2159195
Terminapor
I'll see you rise.
Posté le 04-10-2012 à 19:51:34  profilanswer
 

Une boucle for permet d'exécuter plusieurs fois des instructions, ça se décompose comme ça :

 


for (initialisation;condition;itération)
{
  code
}

 

En gros, ça correspond à ça :

 

initialisation;
 Condition vraie ? [Code; itération] Sinon on arrête

 

Par exemple, si tu écris ça :

 
Code :
  1. for (int i=0;i<10;i++)
  2. {
  3.   printf("valeur de i : %d\n",i);
  4. }


Ton programme va d'abord créer une variable 'i' et l'initialiser à 0. ensuite, il va vérifier que i < 10, la condition est vraie (i=0), donc on execute le code :
printf("valeur de i : %d\n",i);
Et ensuite on exécute l'itération (i++ correspond à incrémentation de i, c'est la même chose que i += 1 ou i = i+1)
On recommence, on vérifie la condition, elle est encore vrai (i=1 maintenant), on exécute le code,e tc,etc jusqu'à ce que i=11 (auquel cas, i<10 est faux)
Ce qui donnera sur ta console :

 

0
1
2
3
4
5
6
7
8
9
10

 

Donc tu dois probablement te servir de ça pour faire ton p'tit programme :D
(Tu n'as pas vu les boucles dans ton cours ?)

 

edit : Il marche pour n'importe quelle base ?


Message édité par Terminapor le 04-10-2012 à 19:51:56

---------------
Perhaps you don't deserve to breathe
mood
Publicité
Posté le 04-10-2012 à 19:51:34  profilanswer
 

n°2159201
ibersek
Posté le 04-10-2012 à 19:59:42  profilanswer
 

Alors non je ne dois pas me servir de cette fonction car je n'ai pas encore vu ça au cours. Ce programme de conversion est LE premier programme que je programme.
 
Je dois effectivement utiliser que le printf et scanf. (ce qui est marqué dans la donnée dans le premier sujet).
 
Non je n'ai pas vu les boucles, je débute en info. On a seulement vu les printf et scanf d'où la non utilisation d'autre fonction.
 
Il fonctionne pour convertir des valeurs de 0-255 en base de 2-16.


Message édité par ibersek le 04-10-2012 à 20:01:32
n°2159203
Terminapor
I'll see you rise.
Posté le 04-10-2012 à 20:07:16  profilanswer
 

Ah d'accord, mea culpa (les boucles ne sont pas des fonctions) :jap:
 
Sujet clos je présume :D


---------------
Perhaps you don't deserve to breathe
n°2159204
ibersek
Posté le 04-10-2012 à 20:12:09  profilanswer
 

J'ai dis fonction car je ne connais pas encore les termes^^ Mais ça viendra.
 
Sinon, le programme parait compréhensible ? Parce que le prof est super exigent à tel point qu'un programme compréhensible mais qui ne foncitonne pas peut donner une meilleure note qu'un programme incompréhensible qui fonctionne.

n°2159207
Profil sup​primé
Posté le 04-10-2012 à 20:42:39  answer
 

tu connais l'instruction "goto" ?

n°2159208
ibersek
Posté le 04-10-2012 à 20:48:31  profilanswer
 

non pourquoi ?

n°2159209
Terminapor
I'll see you rise.
Posté le 04-10-2012 à 20:49:21  profilanswer
 

goto est déprécié en C :spamafote:


---------------
Perhaps you don't deserve to breathe
n°2159210
gilou
Modérateur
Modzilla
Posté le 04-10-2012 à 21:04:22  profilanswer
 

Il y a quelque chose qui manque à ton programme: il ne teste pas que les valeurs rentres par l'utilisateur sont conformes à ce qui lui a été demandé:
Il faut tester (avec des tests utilisant if) si scanf a bien indiqué avoir fait une conversion, et si la valeur récupérée par scanf est dans les plages de valeurs demandées.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2159212
Profil sup​primé
Posté le 04-10-2012 à 21:10:50  answer
 

Terminapor a écrit :

goto est déprécié en C :spamafote:


C'est ton gourou qui te l'a dis ?

n°2159213
Profil sup​primé
Posté le 04-10-2012 à 21:15:23  answer
 

ibersek a écrit :

non pourquoi ?


 
Parce qu'avec goto, on peut faire des boucle entre autres.
 
Le principe c'est de placer une étiquette qui doit être déclarer avant l'appel de "goto <<etiquette>>";
Ca renvoie, au code en position suivante de la déclaration de l'étiquette.

Message cité 1 fois
Message édité par Profil supprimé le 04-10-2012 à 21:15:54
n°2159243
gilou
Modérateur
Modzilla
Posté le 05-10-2012 à 09:33:12  profilanswer
 

Mais il n'y a aucune raison d'utiliser un goto pour faire des boucles en C, vu que ce langage dispose de tout ce qu'il faut pour en faire de manière plus naturelle (while, for). Les seuls cas d'utilisations utiles de goto en C que j'ai rencontré, c'est dans le codage à la main d'automates d'états finis optimisés. Bref, tout sauf un truc de débutant.
De toute façon, un goto n'a vraiment d'intérêt dans un langage que lorsque l'étiquette de saut n'est pas fixe (mais peut être une variable ou une expression comme en Fortran). Et les continuations, c'est la manière à la mode de faire la même chose souvent.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2159273
breizhbugs
Posté le 05-10-2012 à 13:39:39  profilanswer
 

ibersek a écrit :

Sur le principe, avec 235, il s'agirait de faire :
 
1-235%4= 3
2-(235/4)%4 = 2
3-((235/4)/4)%4 = 2
4-(((235/4)/4)/4) = 3
Soit 235 en base 10 => 3223 en base 4


C'est pas très pratique comme écriture pour en tirez un algo!
 
A- 235 / 4 = 58, reste  3 (soit 235 % 4)
B- 58 / 4 = 14, reste 2 (soit 58 % 4 )
C- 14 / 4 = 3, reste 2  (soit 14 % 4)
D- 3 / 4 =0, reste 3 (soit 3 % 4)
de là on constate plus facilement que le résultat de la division sert à l'étape suivante...


Message édité par breizhbugs le 05-10-2012 à 13:41:19

---------------
Seul Google le sait...
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Programmation d'un convertisseur décimal en binaire

 

Sujets relatifs
Python - Programmation - SoucisProgrammation android
Programmation caméra ip sur internetProgrammation R
[C#] Datagrid point decimal supprimé automatiquement [Résolu]Programmation d'un programme en Java
Concours de programmation Code of Duty 2 J -[Topic Unique] Programmation Windows 8 / WinRT / Metro
programmation en javaCode of Duty 2 Conours de programmation
Plus de sujets relatifs à : Programmation d'un convertisseur décimal en binaire


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR