cdtdbord
-
Modifié par Cirec le 9/03/2015 à 13:06
cdtdbord
Messages postés5Date d'inscriptionvendredi 6 mars 2015StatutMembreDernière intervention20 août 2015
-
14 mars 2015 à 23:24
bonsoir à tous. j'ai un problème avec mon program, je veux qu'il me convertisse un binaire en decimal .
theoriquement quand je prends des binaires pr le tester il marche mais pratiquement non. j'ai besoin de votre aide pr voir ce qui ne va pas ds mon program. merci d'avance.
program puiss2;
uses crt;
const N=6;
var e,nbit,deci,i,j:integer;
var tbit:array[0..N] of integer;
function puis(c:longint;d:longint):longint;
begin
e:=1; i:=1;
while (i<=d) do
begin
e:=e*c;
i:=i+1;
end;
puis:=e;
end;
BEGIN
clrscr;
writeln('Entrez le nombre de bit:');
read(nbit);
for i:=0 to (nbit-1) do
begin
writeln('bit ',i+1,': ');
readln(tbit[i]);
end;
deci:=0;
i:=nbit-1;
for j:=0 to (nbit-1) do
begin
deci:=deci+tbit[j]*puis(2,i);
i:=i-1;
end;
for i:=0 to nbit-1 do
begin
write(tbit[i]);
end;
write(' en decimal est: ',deci);
repeat until keypressed; END.
theoriquement quand je prends des binaires pr le tester il marche mais pratiquement non
Sans commentaire...
;)
cdtdbord
Messages postés5Date d'inscriptionvendredi 6 mars 2015StatutMembreDernière intervention20 août 2015 11 mars 2015 à 22:43
merci Buno en fait je voulais dire par exemple si je prends le binaire 111
le nombre de bit est 3.
en theorie voici ce que sa donne:
dans ma deuxième boucle:
i=2, j=0, deci=0+1*2^2=4
i pass à 1 et j passe à 1, deci=4+1*2^1=6
i passa à 0 et j à 2, deci=6+1*2^0=7
voici ce que la théorie donne.
quand je donne 111 à mon programme il me donne 12 comme resultat ce qui n'est pas vrai.
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914 9 mars 2015 à 17:24
Salut
voici quelques modifications qui pourront peut être résoudre ton problème (j'ai indenté ton code pour plus de compréhension)
à priori il devrait fonctionner
program puiss2; uses crt; const N=6; var nbit,i,j:integer; deci:longint; //**// var tbit:array[0..N] of integer; //----------------------------------------- function puis(c:longint;d:longint):longint; var e:longint; i:integer; //**// begin e := 1; i := 1; while (i<=d) do begin e := e * c; i := i + 1; end; puis := e; //**// ou result := e; end; //------------------------------------------ BEGIN clrscr; writeln('Entrez le nombre de bits : '); read(nbit); if nbit + 1 > N then exit; //**// erreur le tableau ne comporte que N+1 cases for i:=0 to (nbit-1) do begin writeln('bit ',i+1,' : '); //**// c'est du poids fort au poids faible readln(tbit[i]); end; //**// le bit i=0 est le bit de poids fort deci := 0; i := nbit - 1; for j:=0 to nbit - 1 do begin deci := deci + ( tbit[j] * puis(2,i) ); //**// parenthèse pas obligatoires mais précise le calcul fait i := i - 1; end; for i:=0 to nbit-1 do begin write(tbit[i]); end; write(' en decimal est: ',deci); repeat until keypressed; END.
bien sur il y a plus simple :
function BinaireToDecimal(const binaire: string): extended; var i,n : integer; begin result := 0; n := length(binaire); for i := 1 to n do begin if Binaire[i] = '1' then result := result + power(2, n-i); end;//for end;
la fonction power nécessite de mettre "Math" dans les uses
cs_yanb
Messages postés271Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention 7 juillet 202214 10 mars 2015 à 08:05
Salut dubois77,
Petite modification pour se passer de "power" et améliorer les perfs ;-)
function BinaireToDecimal(const binaire: string): integer; var i,n,m : integer; begin result := 0; n := length(binaire); m := 1; for i := n downto 1 do begin if Binaire[i] = '1' then result := result + m; m := m + m; end; end;
@+
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914
>
cs_yanb
Messages postés271Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention 7 juillet 2022 10 mars 2015 à 18:04
Salut yan
Effectivement (j'ai testé !) çà marche
cdtdbord
Messages postés5Date d'inscriptionvendredi 6 mars 2015StatutMembreDernière intervention20 août 2015 11 mars 2015 à 22:54
merci dubois,en fait on m'a demandé de faire dabord la fonction qui calcule la puissance x^y et de l'utiliser pour convertir un binaire en decimal. par exemple quand je met 111 dans mon programme il me dit:
111 en decimal est 12 ce qui est faux
c'est pour sa je n' merci Buno en fait je voulais dire par exemple si je prends le binaire 111
le nombre de bit est 3.
en theorie voici ce que sa donne:
dans ma deuxième boucle:
i=2, j=0, deci=0+1*2^2=4
i pass à 1 et j passe à 1, deci=4+1*2^1=6
i passa à 0 et j à 2, deci=6+1*2^0=7
voici ce que la théorie donne.
quand je donne 111 à mon programme il me donne 12 comme resultat ce qui n'est pas vrai. ai pas voulu utiliser pow.j'ai apporté les modifications que vous avez apporté mais il ne marche tjr pas
cs_yanb
Messages postés271Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention 7 juillet 202214
>
cdtdbord
Messages postés5Date d'inscriptionvendredi 6 mars 2015StatutMembreDernière intervention20 août 2015 12 mars 2015 à 10:00
Salut,
dans ton code console je dirai que la variable "i" utilisé dans la function "puis" et dans le code console pose problème remplace dans la function "puis" "i" par "k" ( par exemple ) en ajoutant k dans les variable et test pour voir.., mais une variable qui se promène partout c'est pas bien bon :p
@+
dubois77
Messages postés675Date d'inscriptionjeudi 17 avril 2008StatutMembreDernière intervention19 février 201914
>
cs_yanb
Messages postés271Date d'inscriptionlundi 27 octobre 2003StatutMembreDernière intervention 7 juillet 2022 12 mars 2015 à 12:23
je pense aussi qu'il faut mettre :
for j:=nbit - 1 downto 0
car on commence de cette façon par le bit de poids faible
11 mars 2015 à 22:43
le nombre de bit est 3.
en theorie voici ce que sa donne:
dans ma deuxième boucle:
i=2, j=0, deci=0+1*2^2=4
i pass à 1 et j passe à 1, deci=4+1*2^1=6
i passa à 0 et j à 2, deci=6+1*2^0=7
voici ce que la théorie donne.
quand je donne 111 à mon programme il me donne 12 comme resultat ce qui n'est pas vrai.