Programmation d'un convertisseur décimal en binaire - C - Programmation
Marsh Posté le 03-10-2012 à 20:18:33
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 !!
Marsh Posté le 03-10-2012 à 20:24:26
Je vais réfléchir à tout cela et je posterai mon avancement (ou mes questions ) dès que possible.
Merci Farian
Marsh Posté le 03-10-2012 à 22:35:19
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
Marsh Posté le 03-10-2012 à 23:04:36
Si c'est ça la technique, dans ce cas une simple boucle for suffit
Marsh Posté le 04-10-2012 à 00:04:55
ibersek a écrit : Sur le principe, avec 235, il s'agirait de faire : |
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.
Marsh Posté le 04-10-2012 à 14:39:34
Voilà ce que cela me donne :
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 ?
Marsh Posté le 04-10-2012 à 14:58:05
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
Marsh Posté le 04-10-2012 à 19:20:18
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.
Marsh Posté le 04-10-2012 à 19:51:34
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 :
|
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
(Tu n'as pas vu les boucles dans ton cours ?)
edit : Il marche pour n'importe quelle base ?
Marsh Posté le 04-10-2012 à 19:59:42
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.
Marsh Posté le 04-10-2012 à 20:07:16
Ah d'accord, mea culpa (les boucles ne sont pas des fonctions)
Sujet clos je présume
Marsh Posté le 04-10-2012 à 20:12:09
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.
Marsh Posté le 04-10-2012 à 20:49:21
ReplyMarsh Posté le 04-10-2012 à 21:04:22
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+,
Marsh Posté le 04-10-2012 à 21:10:50
ReplyMarsh Posté le 04-10-2012 à 21:15:23
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.
Marsh Posté le 05-10-2012 à 09:33:12
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+,
Marsh Posté le 05-10-2012 à 13:39:39
ibersek a écrit : Sur le principe, avec 235, il s'agirait de faire : |
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...
Marsh Posté le 03-10-2012 à 19:11:39
Bonjour,
Dans les cadre de mes études, je dois réaliser un petit programme en programmation C.
Voici la donnée:
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