Bonjour à tous !<br><br>
voilà, je suis un élève de bts iris et pour le cours d'informatique industriel, nous devons créer un convertisseur décimal binaire avec une boucle, ma question est comment récupérer la conversion binaire svp ?<br><br>
Voila le source:<br><br><pre class="brush: c;">#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int nombreDec, reste, coefficient;
coefficient=128;
printf("Entrer un nombre decimal:");
scanf("%d",&nombreDec);
do
{
reste=nombreDec-coefficient;
coefficient= coefficient/2;
}
while(coefficient=1);
printf("La cnversion de %d n binaire est:\n",nombreDec);
return 0;
}
</pre>Le 10 septembre 2010 à 22:09:34
Bonjour à tous !
voilà, je suis un élève de bts iris et pour le cours d'informatique industriel, nous devons créer un convertisseur décimal binaire avec une boucle, ma question est comment récupérer la conversion binaire svp ?
Voila le source:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int nombreDec, reste, coefficient;
coefficient=128;
printf("Entrer un nombre decimal:");
scanf("%d",&nombreDec);
do
{
reste=nombreDec-coefficient;
coefficient= coefficient/2;
}
while(coefficient=1);
printf("La cnversion de %d n binaire est:\n",nombreDec);
return 0;
}
Bonjour,<br><br>
Juste en passant, je pense que tu as une boucle infinie ici :<br><pre class="brush: c;">do {
reste = nombreDec - coefficient;
coefficient = coefficient/2;
} while(coefficient=1);
</pre><br>Le 10 septembre 2010 à 22:21:54
Bonjour,
Juste en passant, je pense que tu as une boucle infinie ici :
do {
reste = nombreDec - coefficient;
coefficient = coefficient/2;
} while(coefficient=1);
<p><strong>Citation</strong></p><blockquote>
<br>
Juste en passant, je pense que tu as une boucle infinie ici :<br>
</blockquote><br><br>
De plus, je doute que l'algorithme soit correct. <br><br>
Sinon, ça veux dire quoi "récupérer cette conversion en fin de mon programme" ?<br><br>
Dans un fichier ?<br><br>
Si c'est le cas, utilise fopen(), fprintf() et fclose() <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"> .Le 10 septembre 2010 à 22:24:52
Citation
Juste en passant, je pense que tu as une boucle infinie ici :
De plus, je doute que l'algorithme soit correct.
Sinon, ça veux dire quoi "récupérer cette conversion en fin de mon programme" ?
Dans un fichier ?
Si c'est le cas, utilise fopen(), fprintf() et fclose() .
Autrement, utilise la même méthode que en comptant normalement : un 31 c'est quoi?<br><br>
3 x 10^1 + 1 x 10^0 = 30 + 1<br><br>
en binaire 11111<br><br>
1 x 2^4 + 1 x 2^3 + 1x2^2 + 1x2^1 + 1x2^0 = 16 + 8 + 4 + 2 + 1= 31<br><br>
et en hexa 1F<br><br>
1 x 16^1 + F(15)x 16^0 = 16 + 15<br><br>
Comprends tu la logiques des bases en mathématiques?(désolé pour l'explication, je suis loin du BTS lol^^)Le 10 septembre 2010 à 22:42:49
Autrement, utilise la même méthode que en comptant normalement : un 31 c'est quoi?
Sinon, on fait des division succesive par la base voulu et on retient le reste<br><br>
Par exemple, 27<br><br>
27/2 = 13 avec 1 en reste<br>
13/2 = 6 avec 1 en reste<br>
6/2 = 3 avec 0 en reste<br>
3/2 = 1 avec 1 en reste<br>
1/2 = 0 avec 1 en reste<br><br>
27 (10) == 11011 (2)<br>Le 10 septembre 2010 à 22:59:22
Sinon, on fait des division succesive par la base voulu et on retient le reste
Par exemple, 27
27/2 = 13 avec 1 en reste
13/2 = 6 avec 1 en reste
6/2 = 3 avec 0 en reste
3/2 = 1 avec 1 en reste
1/2 = 0 avec 1 en reste
Tu peux aussi utiliser les opérateurs bitwise : <br><br>
(n & 1) donnera la valeur du dernier bit de n.<br>
(n >> 1) décalera n de 1 bit vers la droite. (En gros, on supprime un bit. Par contre, je ne sais pas si la norme précise que le bit mis à gauche est obligatoirement à 0)<br><br>
Ceci dans une boucle, on peux facilement trouver la conversion binaire de n. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies">Le 10 septembre 2010 à 23:09:03
Tu peux aussi utiliser les opérateurs bitwise :
(n & 1) donnera la valeur du dernier bit de n.
(n >> 1) décalera n de 1 bit vers la droite. (En gros, on supprime un bit. Par contre, je ne sais pas si la norme précise que le bit mis à gauche est obligatoirement à 0)
Ceci dans une boucle, on peux facilement trouver la conversion binaire de n.
Bonsoir,<br>
d'abord, évites de mettre "Entrer un nombre décimal : " alors que deux lignes avant tu déclares un type int. De plus, dans le scanf, tu utilises %d donc tu attends un nombre entier ...<br><br><br>
Sinon, si tu es très chanceux =) , tu peux essayer ce programme, je l'ai écrit quand j'étais fatigué pour le fun, il marche presque que pour zéro (petite dédicace au siteduzero ^^)<br><br><div class="spoiler2_hidden"><div class="spoiler3_hidden">
<br><pre class="brush: c;">// Un programme pour les chanceux
// Seul zéro est trouvé rapidement.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const int MAX = 1, MIN = 0;
// Déclaration des variables
int nombreEnt = 0, nombre_essay = 0, i = 0, n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0, n6 = 0, n7 = 0;
printf("Entrer un nombre entier : ");
scanf("%d",&nombreEnt);
printf("Conversion en cours ...");
// Conversion en 1 octet impose une limite
if (nombreEnt <= 256 && nombreEnt >= 0)
{
while(nombreEnt != nombre_essay)
{
i++;
nombre_essay = (n7*2^7)+(n6*2^6)+(n5*2^5)+(n4*2^4)+(n3*2^3)+(n2*2^2)+(n1*2^1)+(n0*2^0);
srand(time(NULL));
if (i>1)
{
n0 = (rand() % (MAX-MIN+1))+MIN;
n1 = (rand() % (MAX-MIN+1))+MIN;
n2 = (rand() % (MAX-MIN+1))+MIN;
n3 = (rand() % (MAX-MIN+1))+MIN;
n4 = (rand() % (MAX-MIN+1))+MIN;
n5 = (rand() % (MAX-MIN+1))+MIN;
n6 = (rand() % (MAX-MIN+1))+MIN;
n7 = (rand() % (MAX-MIN+1))+MIN;
}
}
printf("\nLa conversion de %d binaire est: %d%d%d%d%d%d%d%d\n", nombre_essay, n0, n1, n2, n3, n4, n5, n6, n7);
return 0;
}
else
{
printf("Vous n'avez pas entrer un nombre valide");
return 1;
}
}
</pre>
<br>
</div></div><br><br>
Maxence11Le 11 septembre 2010 à 23:28:05
Bonsoir,
d'abord, évites de mettre "Entrer un nombre décimal : " alors que deux lignes avant tu déclares un type int. De plus, dans le scanf, tu utilises %d donc tu attends un nombre entier ...
Sinon, si tu es très chanceux =) , tu peux essayer ce programme, je l'ai écrit quand j'étais fatigué pour le fun, il marche presque que pour zéro (petite dédicace au siteduzero ^^)
// Un programme pour les chanceux
// Seul zéro est trouvé rapidement.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const int MAX = 1, MIN = 0;
// Déclaration des variables
int nombreEnt = 0, nombre_essay = 0, i = 0, n0 = 0, n1 = 0, n2 = 0, n3 = 0, n4 = 0, n5 = 0, n6 = 0, n7 = 0;
printf("Entrer un nombre entier : ");
scanf("%d",&nombreEnt);
printf("Conversion en cours ...");
// Conversion en 1 octet impose une limite
if (nombreEnt <= 256 && nombreEnt >= 0)
{
while(nombreEnt != nombre_essay)
{
i++;
nombre_essay = (n7*2^7)+(n6*2^6)+(n5*2^5)+(n4*2^4)+(n3*2^3)+(n2*2^2)+(n1*2^1)+(n0*2^0);
srand(time(NULL));
if (i>1)
{
n0 = (rand() % (MAX-MIN+1))+MIN;
n1 = (rand() % (MAX-MIN+1))+MIN;
n2 = (rand() % (MAX-MIN+1))+MIN;
n3 = (rand() % (MAX-MIN+1))+MIN;
n4 = (rand() % (MAX-MIN+1))+MIN;
n5 = (rand() % (MAX-MIN+1))+MIN;
n6 = (rand() % (MAX-MIN+1))+MIN;
n7 = (rand() % (MAX-MIN+1))+MIN;
}
}
printf("\nLa conversion de %d binaire est: %d%d%d%d%d%d%d%d\n", nombre_essay, n0, n1, n2, n3, n4, n5, n6, n7);
return 0;
}
else
{
printf("Vous n'avez pas entrer un nombre valide");
return 1;
}
}
<p><strong>Citation : Tosh</strong></p><blockquote>
<br>
(n >> 1) décalera n de 1 bit vers la droite. (En gros, on supprime un bit. Par contre, je ne sais pas si la norme précise que le bit mis à gauche est obligatoirement à 0)</blockquote><br><p><strong>Citation : norme </strong></p><blockquote>
<br>
The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type<br>
or if E1 has a signed type and a nonnegative value, the value of the result is the integral<br>
part of the quotient of E1 / 2E2 . If E1 has a signed type and a negative value, the<br>
resulting value is implementation-defined.<br>
</blockquote><br>
Donc pas de problèmes avec un entier positif, sauf erreur. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/siffle.png" alt=":-°" class="smilies"><br>
Là on ne se pose pas de question, c'est toujours un "décalage logique".<br><br>
Par contre, si l'opérande gauche est signée et à une valeur négative, le résultat dépend de la plateforme.<br><br><a href="http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts">Un article intéressant.</a>Le 11 septembre 2010 à 23:48:30
Citation : Tosh
(n >> 1) décalera n de 1 bit vers la droite. (En gros, on supprime un bit. Par contre, je ne sais pas si la norme précise que le bit mis à gauche est obligatoirement à 0)
Citation : norme
The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type
or if E1 has a signed type and a nonnegative value, the value of the result is the integral
part of the quotient of E1 / 2E2 . If E1 has a signed type and a negative value, the
resulting value is implementation-defined.
Donc pas de problèmes avec un entier positif, sauf erreur.
Là on ne se pose pas de question, c'est toujours un "décalage logique".
Par contre, si l'opérande gauche est signée et à une valeur négative, le résultat dépend de la plateforme.
<p><strong>Citation : Tosh</strong></p><blockquote>J'aime bien ton algo <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"> .</blockquote><br>
Moi pas trop.<br><br>
Je trouve dommage d'afficher les zéros inutiles à gauche.<br><br>
Il y a moyen de faire plus simple et propre, en particulier la solution récursive, est très élégante. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies"><br><br>
le coup du nMask = 1 suivi de & nMask<br>
c'est plus de l'obfuscation.<br><br>
mais bon, ça fonctionne <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies">Le 12 septembre 2010 à 14:20:34
Citation : Tosh
J'aime bien ton algo .
Moi pas trop.
Je trouve dommage d'afficher les zéros inutiles à gauche.
Il y a moyen de faire plus simple et propre, en particulier la solution récursive, est très élégante.
le coup du nMask = 1 suivi de & nMask
c'est plus de l'obfuscation.
<p><strong>Citation</strong></p><blockquote>Je trouve dommage d'afficher les zéros inutiles à gauche.</blockquote><br><br>
Ça permet de bien se rendre compte de l'état de la variable en mémoire je trouve.<br><br><p><strong>Citation</strong></p><blockquote>le coup du nMask = 1 suivi de & nMask<br>
c'est plus de l'obfuscation.</blockquote><br><br>
Euh, je ne trouve pas, car on a le nMask <<= 1 dans la boucle.<br><br>
En gros, au lieu de parcourir tous les bytes avec var >> 1 comme je le proposais, on prends un bit de masquage, qu'on applique à chaque bit de la variable.<br><br>
Je vais tester une solution récursive pour le fun <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"> .Le 12 septembre 2010 à 14:38:20
Citation
Je trouve dommage d'afficher les zéros inutiles à gauche.
Ça permet de bien se rendre compte de l'état de la variable en mémoire je trouve.
Citation
le coup du nMask = 1 suivi de & nMask
c'est plus de l'obfuscation.
Euh, je ne trouve pas, car on a le nMask <<= 1 dans la boucle.
En gros, au lieu de parcourir tous les bytes avec var >> 1 comme je le proposais, on prends un bit de masquage, qu'on applique à chaque bit de la variable.
Je vais tester une solution récursive pour le fun .
Bonjour,<br><br>
GurneyH :<br><p><strong>Citation</strong></p><blockquote>
<br>
le coup du nMask = 1 suivi de & nMask<br>
c'est plus de l'obfuscation.<br>
</blockquote><br>
nMask change de valeur, sinon je n'aurais pas créé une variable.<br><br>
Une solution récursive utilisera plus de mémoire et sera moins rapide, et le posteur original précise bien "avec une boucle".<br><br>
Pour le coup des zéros à gauche, moi je préfère, je trouve ça plus simple pour visualiser le nombre total de bits (cf la calculette de windows qui supprime les 0 à gauche, c'est plus souvent une source de problèmes que d'aide). <br><br>
Clément.Le 12 septembre 2010 à 14:59:41
Bonjour,
GurneyH :
Citation
le coup du nMask = 1 suivi de & nMask
c'est plus de l'obfuscation.
nMask change de valeur, sinon je n'aurais pas créé une variable.
Une solution récursive utilisera plus de mémoire et sera moins rapide, et le posteur original précise bien "avec une boucle".
Pour le coup des zéros à gauche, moi je préfère, je trouve ça plus simple pour visualiser le nombre total de bits (cf la calculette de windows qui supprime les 0 à gauche, c'est plus souvent une source de problèmes que d'aide).
Tu m'expliques le cast ici : <span class="code2 c"><span class="n">printf</span><span class="p">(</span><span class="s">"Résultat: %d en binaire = %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">nValDec</span><span class="p">,</span> <span class="n">pStrBin</span><span class="p">);</span>
</span><br>
Pourquoi utiliser un unsigned dans ce cas là ? entre un nombre supérieur à 2^31 et tu vas avoir des surprises. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/siffle.png" alt=":-°" class="smilies">Le 12 septembre 2010 à 15:32:31
Tu m'expliques le cast ici : printf("Résultat: %d en binaire = %s\n",(int)nValDec,pStrBin);
Pourquoi utiliser un unsigned dans ce cas là ? entre un nombre supérieur à 2^31 et tu vas avoir des surprises.
Bonjour,<br><br>
Bon, comme je l'ai dit, j'ai écrit le truc en quelque chose comme 5/10 minutes, en pensant aider.<br><br>
Le cast, je l'ai mis sans trop réfléchir, juste pour ne pas avoir un warning à la compilation. D'habitude je m'en moque un peu, les printf ne me servent en général qu'à débugger.<br><br>
Il n'y a qu'à caster en (unsigned), et voilà tout. Est-ce vraiment un problème ?<br><br>
Clément.Le 12 septembre 2010 à 15:51:37
Bonjour,
Bon, comme je l'ai dit, j'ai écrit le truc en quelque chose comme 5/10 minutes, en pensant aider.
Le cast, je l'ai mis sans trop réfléchir, juste pour ne pas avoir un warning à la compilation. D'habitude je m'en moque un peu, les printf ne me servent en général qu'à débugger.
Il n'y a qu'à caster en (unsigned), et voilà tout. Est-ce vraiment un problème ?
<p><strong>Citation : Joe78</strong></p><blockquote>
<br>
nMask change de valeur, sinon je n'aurais pas créé une variable.</blockquote><br>
Ah, désolé pour nMask, bien sur ce n'est pas une constante.<br><br><p><strong>Citation : joe78</strong></p><blockquote>
<br>
Pour le coup des zéros à gauche, moi je préfère, je trouve ça plus simple pour visualiser le nombre total de bits (cf la calculette de windows qui supprime les 0 à gauche, c'est plus souvent une source de problèmes que d'aide). </blockquote><br><br>
Faut voir. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/clin.png" alt=";)" class="smilies">Le 12 septembre 2010 à 18:26:33
Citation : Joe78
nMask change de valeur, sinon je n'aurais pas créé une variable.
Ah, désolé pour nMask, bien sur ce n'est pas une constante.
Citation : joe78
Pour le coup des zéros à gauche, moi je préfère, je trouve ça plus simple pour visualiser le nombre total de bits (cf la calculette de windows qui supprime les 0 à gauche, c'est plus souvent une source de problèmes que d'aide).
Salut, je suis un élève en cpge.<br>
J'ai essayé et voilà ce que j'ai trouvé. J'ai exécuté et ça a marché:<br><br><pre class="brush: c;">#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int fin, nombreDec, reste, poids;
poids=128;//Le poids est arbitraire on peut choisir n'importe quelle puissance de 2, ça reste un choix
printf("Entrer un nombre decimal:");
scanf("%d",&nombreDec);
printf("La conversion de %d en binaire est:\n\n",nombreDec);
do
{
{
if ((nombreDec-poids) >= 0)
{
reste=1;//Ce poids existe dans le nombreDec il est représenté par 1 en binaire
nombreDec=nombreDec-poids;
}
else
reste =0;//Ce poids n'existe pas donc 0
}
printf("%d",reste);
poids= poids / 2;
}
while(poids>=1);
scanf("%d",&nombreDec);//Juste pour que la fenêtre ne se ferme pas :D j'ai oublié ce qu'on met normalement
return 0;
}
</pre><br>
Et bonne chance.Le 21 novembre 2010 à 0:06:13
Salut, je suis un élève en cpge.
J'ai essayé et voilà ce que j'ai trouvé. J'ai exécuté et ça a marché:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int fin, nombreDec, reste, poids;
poids=128;//Le poids est arbitraire on peut choisir n'importe quelle puissance de 2, ça reste un choix
printf("Entrer un nombre decimal:");
scanf("%d",&nombreDec);
printf("La conversion de %d en binaire est:\n\n",nombreDec);
do
{
{
if ((nombreDec-poids) >= 0)
{
reste=1;//Ce poids existe dans le nombreDec il est représenté par 1 en binaire
nombreDec=nombreDec-poids;
}
else
reste =0;//Ce poids n'existe pas donc 0
}
printf("%d",reste);
poids= poids / 2;
}
while(poids>=1);
scanf("%d",&nombreDec);//Juste pour que la fenêtre ne se ferme pas j'ai oublié ce qu'on met normalement
return 0;
}
Tiens d'ailleurs hier soir je intéressais à cela, voila ce que ça donne:<br><pre class="brush: c;">#include<stdio.h>
int main(void)
{
unsigned int n;
unsigned long long I=0x100000000;
printf("Entrer n:");
scanf("%d",&n);
unsigned int i = 0;
for(;(n&I)?0:1;i++,I/=2);
for(;i < (sizeof(n)*8);i++,I/=2)
printf("%d",(n&I)?1:0);
printf("\n");
getchar();
getchar();
}
</pre>Le 21 novembre 2010 à 11:02:01
Tiens d'ailleurs hier soir je intéressais à cela, voila ce que ça donne:
#include<stdio.h>
int main(void)
{
unsigned int n;
unsigned long long I=0x100000000;
printf("Entrer n:");
scanf("%d",&n);
unsigned int i = 0;
for(;(n&I)?0:1;i++,I/=2);
for(;i < (sizeof(n)*8);i++,I/=2)
printf("%d",(n&I)?1:0);
printf("\n");
getchar();
getchar();
}
Lycéen - Codeur en C ♡ Copying is an act of love. - ✉
Convertir Décimal en binaire
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.